File:  [Repository] / FM2SQL / src / FM2SQL.java
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Fri Jan 21 11:27:03 2005 UTC (19 years, 4 months ago) by rogo
Branches: MAIN
CVS tags: HEAD
moved java src to src folder

/*
 * FM2SQL.java -- Main program Filemaker to SQL Converter 
 * Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de) 
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.  Please read license.txt for the full details. A copy of
 * the GPL may be found at http://www.gnu.org/copyleft/lgpl.html  You should
 * have received a copy of the GNU General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA  Created on 15.09.2003 by
 * rogo  
 */

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.InputEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintStream;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.util.Collections;
import java.util.Iterator;
import java.util.Vector;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
/**
 * 
 * <br>
 * <h2>FileMaker Test (JDBC Database Driver Test)</h2>
 * Main class : contains the main Frame, all event handlers etc <br>
 * The Database access is made over DBBean class all other classes are just for
 * the visualization of the data
 * 
 * @version 0.3( first stable release)
 * @author rogo
 *  
 */
public class FM2SQL extends JFrame implements ActionListener, TableModelListener
{
	private JMenuItem delimiterItem;
	private JCheckBoxMenuItem convertItem;
	private JCheckBoxMenuItem appendItem;
	private JCheckBoxMenuItem updateItem;
	private JCheckBoxMenuItem deleteItem;
	private JCheckBoxMenuItem useNormanToUnicodeMapper;
	int mode = -1;
	final static int STATUS_INDEX = 0;
	final static int NAME_INDEX = 1;
	final static int ID_INDEX = 2;
	final static int SELECT_INDEX = 3;
	final static int CREATE_INDEX = 4;
	final static int LAYOUT_INDEX = 5;

	/**
	 * The database Bean instance.
	 *  
	 */
	DBBean bean;
	/**
	 * The database destination Bean instance.
	 *  
	 */
	DBBean destBean;

	/**
	 * tList - Tablenames to choose from
	 */

	JList tList = new JList(new String[]
	{"no database", "connection", ""});
	JList tListDest = new JList(new String[]
	{"no database connection", "", ""});

	/**
	 * sourceUrl - Database URL ComboBox
	 */
	JComboBox sourceURLBox;
	/**
	 * destUrlBox - Database URL ComboBox
	 */
	JComboBox destURLBox;

	TableComponent table, tC;
	Vector tables = new Vector();
	Vector layouts = new Vector();
	JPanel listPanel;
	JPanel topPanel, topPanel2, contentPanel;
	JScrollPane paneDest;
	FM2SQL fm = this;
	boolean noDBUpdate = false;
	boolean noUserUpdate = false;
	int id = 0;
	static boolean debug = false;
	/**
	 * The result window used for query results
	 */
	MultiResultWindow window;
	/**
	 * The result window used for query results
	 */
	MultiResultWindow windowDest;

	static FM2SQL fmInstance;
	static String url = "jdbc:fmpro:http://141.14.237.42";
	JButton showTables = new JButton(), showTables1 = new JButton();
	JButton convert = new JButton();
	JButton dropTables = new JButton();

	int oldWidth = 0, oldHeight = 0;
	boolean resize = true;
	static FileWriter logFile;
	String delimiter = "";

	Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
	JFileChooser configExportFileChooser;
	JFileChooser configImportFileChooser;
	private JCheckBoxMenuItem synchronizeItem;

	/**
	 * tries to connect to database specified in url-Variable. initializes all GUI
	 * components, then fails throws an exception
	 *  
	 */
	public FM2SQL() throws Exception
	{

		initializeGUI();
	}
	public void initializeGUI() throws Exception
	{
		Image local = getToolkit().getImage(FM2SQL.class.getResource("icons/fm.jpg"));
		if (local != null)
			;
		setIconImage(local);
		bean = new DBBean();
		destBean = new DBBean();
		sourceURLBox = new JComboBox(new String[]
		{"jdbc:fmpro:http://141.14.237.74:8050", "jdbc:fmpro:http://localhost", "jdbc:postgresql://foxridge/test", "jdbc:sequelink://r583-3:2399"});
		sourceURLBox.setEditable(true);
		sourceURLBox.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		destURLBox = new JComboBox(new String[]
		{"jdbc:postgresql://foxridge/test", "jdbc:postgresql://erebos/test1"});
		destURLBox.setEditable(true);
		destURLBox.addActionListener(this);
		destURLBox.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		table = new TableComponent();
		//box = new JComboBox(tables);
		// box.addActionListener(this);
		// box2.addActionListener(this);
		sourceURLBox.addActionListener(this);

		contentPanel = new JPanel();
		contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));

		sourceURLBox.setMinimumSize(new Dimension(450, 25));
		sourceURLBox.setMaximumSize(new Dimension(550, 25));
		sourceURLBox.setPreferredSize(new Dimension(450, 25));
		destURLBox.setMinimumSize(new Dimension(450, 25));
		destURLBox.setMaximumSize(new Dimension(550, 25));
		destURLBox.setPreferredSize(new Dimension(450, 25));
		paneDest = new JScrollPane(tListDest);
		// tListDest.setPreferredSize(paneDest.getPreferredSize());
		// paneDest.setPreferredSize(new Dimension(350, 365));
		Dimension dim = paneDest.getPreferredSize();
		paneDest.setMinimumSize(dim);
		//paneDest.setMaximumSize(new Dimension(dim.width + 50, dim.height + 50));

		tC = new TableComponent();
		tC.sizeToFit(450, 250);
		tC.tableModel.addTableModelListener(this);
		JPanel destPanel = new JPanel();
		destPanel.setLayout(new java.awt.GridBagLayout());

		listPanel = new JPanel();
		listPanel.setLayout(new java.awt.GridBagLayout());
		java.awt.GridBagConstraints gbc = new java.awt.GridBagConstraints();
		JScrollPane pane = new JScrollPane(tList);
		tC.tableScroller.setPreferredSize(new Dimension(450, 365));
		//tC.table.revalidate();
		tC.tableScroller.setMinimumSize(new Dimension(450, 250));
		// tC.tableScroller.setMaximumSize(tC.tableScroller.getPreferredSize());
		topPanel = new JPanel();
		topPanel.setLayout(new GridBagLayout());
		topPanel2 = new JPanel();
		topPanel2.setLayout(new GridBagLayout());

		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.weightx = 0.1;
		gbc.weighty = 0.1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.insets = new Insets(2, 2, 5, 5);
		gbc.ipadx = 1;
		gbc.ipady = 1;

		gbc.anchor = GridBagConstraints.WEST;
		listPanel.add(topPanel, gbc);
		destPanel.add(topPanel2, gbc);

		topPanel.add(new JLabel("Choose src database: ", JLabel.CENTER), gbc);
		topPanel2.add(new JLabel("Choose dest database : ", JLabel.CENTER), gbc);

		gbc.anchor = GridBagConstraints.NORTHWEST;
		gbc.gridy = 1;
		topPanel.add(sourceURLBox, gbc);

		topPanel2.add(destURLBox, gbc);

		//gbc.gridx=GridBagConstraints.RELATIVE;
		//dataBasePanel.add(new JLabel(" select Tables to Convert ", JLabel.LEFT));
		gbc.gridy = 1;
		gbc.anchor = GridBagConstraints.SOUTHWEST;

		listPanel.add(new JLabel(" select Tables to Convert  ", JLabel.LEFT), gbc);
		destPanel.add(new JLabel("  Tables in database  ", JLabel.LEFT), gbc);

		//  gbc.anchor = GridBagConstraints.WEST;
		gbc.gridy = 2;
		gbc.gridx = 0;
		// gbc.weightx = 0.0;
		//dataBasePanel.add(tC);
		gbc.anchor = GridBagConstraints.NORTHWEST;
		gbc.gridheight = 1;
		gbc.fill = GridBagConstraints.BOTH;
		listPanel.add(tC.tableScroller, gbc);
		// gbc.fill = GridBagConstraints.VERTICAL;
		destPanel.add(paneDest, gbc);
		showTables1 = new JButton("show Tables");
		showTables1.setActionCommand("show Tables source");
		//  gbc.anchor = GridBagConstraints.NORTH;
		//  gbc.weightx = 0.0;
		gbc.fill = GridBagConstraints.NONE;
		gbc.gridheight = 1;

		gbc.gridx = 0;
		gbc.gridy = 2;
		// topPanel.add(showTables1, gbc);
		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
		buttonPanel.setMinimumSize(new Dimension(380, 30));
		convert = new JButton("Convert Tables");
		showTables = new JButton("show Tables");
		dropTables = new JButton("drop Tables");
		//   System.out.println(convert.getPreferredSize());
		showTables.setMinimumSize(convert.getPreferredSize());
		dropTables.setMinimumSize(convert.getPreferredSize());
		showTables.setMaximumSize(convert.getPreferredSize());
		dropTables.setMaximumSize(convert.getPreferredSize());
		showTables.setPreferredSize(convert.getPreferredSize());
		dropTables.setPreferredSize(convert.getPreferredSize());

		showTables.addActionListener(fm);
		showTables1.addActionListener(fm);

		buttonPanel.add(showTables);
		buttonPanel.add(convert);
		convert.addActionListener(fm);
		dropTables.addActionListener(fm);
		buttonPanel.add(dropTables);

		JPanel buttonPanelSrc = new JPanel();
		buttonPanelSrc.setLayout(new BoxLayout(buttonPanelSrc, BoxLayout.X_AXIS));
		buttonPanelSrc.setMinimumSize(new Dimension(200, 30));
		buttonPanelSrc.add(showTables1);

		topPanel.add(buttonPanelSrc, gbc);
		topPanel2.add(buttonPanel, gbc);

		// gbc.anchor = GridBagConstraints.WEST;
		//   gbc.gridy = 1;
		//   gbc.gridx = 2;
		//   gbc.weightx = 0.2;

		// gbc.gridx = 3;
		//  gbc.anchor = GridBagConstraints.NORTHWEST;
		//  gbc.gridy = 1;
		// gbc.weightx = 1.0;
		//listPanel.add(buttonPanel, gbc);
		JSplitPane splitter = new JSplitPane();
		splitter.setTopComponent(listPanel);
		splitter.setBottomComponent(destPanel);

		// contentPanel.add(dataBasePanel);
		//   contentPanel.add(listPanel);
		listPanel.setMaximumSize(new Dimension(660, 750));
		listPanel.setMinimumSize(new Dimension(660, 250));
		listPanel.setPreferredSize(new Dimension(480, 500));
		paneDest.setPreferredSize(new Dimension(250, 285));

		getContentPane().add(splitter, "Center");
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				bean.closeAllConnections();
				destBean.closeAllConnections();
				System.exit(0);
			}
		});
		addComponentListener(new ComponentAdapter()
		{
			public void componentResized(ComponentEvent e)
			{

				if (oldWidth != getWidth() || oldHeight != getHeight())
				{
					//table.sizeToFit(getWidth(), getHeight());

					Dimension dim = table.table.getPreferredSize();
					int size = contentPanel.getPreferredSize().height + new JScrollBar().getPreferredSize().height + new JMenuBar().getPreferredSize().height + 10;

					table.tableScroller.setPreferredSize(new Dimension(getWidth() - 15, getHeight() - size));
					Dimension d2 = table.tableScroller.getPreferredSize();

					oldWidth = getWidth();
					oldHeight = getHeight();

					table.setPreferredSize(new Dimension(d2.width + 15, d2.height + 5));
					table.table.revalidate();
					table.tableScroller.revalidate();
					table.revalidate();
					if (getHeight() > table.table.getPreferredSize().height + (2 * size))
						setSize(getWidth(), table.table.getPreferredSize().height + 2 * size);
					// System.out.println("size" + size);
				}
				//   listPanel.setMaximumSize(new Dimension(getPreferredSize().width - 5,
				// 550));
				//   listPanel.setMinimumSize(new Dimension(getPreferredSize().width - 5,
				// 200));
				//    listPanel.setPreferredSize(new Dimension(getPreferredSize().width -
				// 5, 370));
				tC.tableScroller.revalidate();
				Dimension dim = getSize();
				tC.tableScroller.setMinimumSize(new Dimension(dim.width - 400, dim.height - topPanel.getPreferredSize().height - 100));
				tC.tableScroller.setMaximumSize(getSize());
				tC.tableScroller.setPreferredSize(tC.tableScroller.getMinimumSize());

				paneDest.setMinimumSize(new Dimension(400, dim.height - topPanel2.getPreferredSize().height - 100));
				paneDest.setMaximumSize(tC.tableScroller.getMaximumSize());
				paneDest.setPreferredSize(new Dimension(400, dim.height - topPanel2.getPreferredSize().height - 100));

				paneDest.validate();
				// tC.tableScroller.setPreferredSize(getSize());
				// @TODO new sizeToFit method for listPanel table!!!
				tC.sizeToFit(getWidth(), getHeight());
				((JPanel) getContentPane()).revalidate();
				repaint();
				setTitle("Filemaker 2 SQL Conversion Tool ");

			}
		});

		setMenu();
		//setSize(800, 600);
		pack();
		setLocation((screenSize.width - getWidth()) / 2, (screenSize.height - getHeight()) / 2);
		//setVisible(true);
		validate();

		// repaint();

	}

	/**
	 *  
	 */
	public static void main(String[] args)
	{
		try
		{
			System.setErr(System.out);
			//         Properties prop = System.getProperties();
			// Enumeration enum= prop.keys();
			//  while(enum.hasMoreElements())
			//System.out.println(enum.nextElement());

			if (System.getProperty("os.name").startsWith("W"))
				// javax.swing.UIManager.setLookAndFeel(
				//    new com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
				javax.swing.UIManager.put("Table.focusCellHighlightBorder", new javax.swing.border.LineBorder(java.awt.Color.black));
			javax.swing.UIManager.put("Table.focusCellBackground", new java.awt.Color(227, 227, 227, 127));

			fmInstance = new FM2SQL();
			fmInstance.table.tableModel.addTableModelListener(fmInstance);
			fmInstance.setVisible(true);
			/*
			 * if (!new File("./html").exists()) new File("./html").mkdirs(); logFile =
			 * new FileWriter("./html/index.html"); openLog();
			 */
		}
		catch (Exception e)
		{
			JOptionPane pane = new JOptionPane(e.getMessage() + "  \n URL: " + url, JOptionPane.ERROR_MESSAGE);

			JDialog dialog = pane.createDialog(null, " Exception occured while connecting");
			e.printStackTrace();
			dialog.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			});
			dialog.addComponentListener(new ComponentAdapter()
			{

				public void componentHidden(ComponentEvent e)
				{

					System.exit(0);
				}
			});
			dialog.show();
		}
	}
	public void actionPerformed(ActionEvent e)
	{
		String command = e.getActionCommand();
		if (debug)
			System.out.println("command " + command);
		if (command == "comboBoxEdited")
		{
			Object src = e.getSource();
			if (src == sourceURLBox)
			{
				if (debug)
					System.out.println("hey" + sourceURLBox.getSelectedItem());
				Object insObj = sourceURLBox.getSelectedItem();
				((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(insObj);

				((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(insObj, 0);
				sourceURLBox.setSelectedItem(insObj);
			}
			else if (src == destURLBox)
			{
				if (debug)
					System.out.println("hey" + destURLBox.getSelectedItem());
				//((DefaultComboBoxModel)
				// box4.getModel()).insertElementAt(box4.getSelectedItem(), 0);
				try
				{
					String selected = (String) destURLBox.getSelectedItem();
					destBean.setConnection(selected);
					Vector catalogs = destBean.getCatalogs();
					Vector urls = new Vector();
					for (int i = 0; i < catalogs.size(); ++i)
					{
						urls.add(destBean.url.substring(0, destBean.url.lastIndexOf("/") + 1) + catalogs.get(i));
					}
					destURLBox.setModel(new DefaultComboBoxModel(urls));
					destURLBox.setSelectedItem(selected);
				}
				catch (Exception e5)
				{
				}
			}
		}
		if (command == "comboBoxChanged")
		{
			try
			{
				//System.out.println("hallo " + (e.getSource() == box3));

				Object src = e.getSource();
				if (src == sourceURLBox && !noUserUpdate)
				{
					Thread thread = new Thread()
					{
						public void run()
						{

							try
							{
								PasswordDialog dialog = new PasswordDialog(fmInstance, bean);
								dialog.setLocationRelativeTo(sourceURLBox);
								dialog.thread = Thread.currentThread();
								fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
								fmInstance.setEnabled(false);
								dialog.setVisible(true);
								String url = sourceURLBox.getSelectedItem().toString();
								bean.url = (url != null) ? url : bean.url;
								bean.connection = null;
								bean.getConnection();
								tables = bean.getTableNames();
								fillTable();
								fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								fmInstance.setEnabled(true);
								//  System.out.println("hallo" + tables + " ");
							}
							catch (Exception e5)
							{
								ByteArrayOutputStream b = new ByteArrayOutputStream();
								PrintStream stream = new PrintStream(b);
								e5.printStackTrace(stream);
								fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								fmInstance.setEnabled(true);
								Vector header = new Vector();
								header.add("no database");
								header.add("connection");
								Vector rows = new Vector();
								//rows.add(header);
								noDBUpdate = true;
								tC.tableModel.setDataVector(rows, header);
								tC.tableModel.setRowCount(20);
								tC.revalidate();
								tC.tableModel.fireTableDataChanged();
								noDBUpdate = false;
								showErrorDialog(b.toString(), "Error occured !");
							}
						}
					};
					thread.start();
				}
				else if (src == destURLBox && !noUserUpdate)
				{
					Thread thread = new Thread()
					{
						public void run()
						{

							try
							{

								PasswordDialog dialog = new PasswordDialog(fmInstance, destBean);
								dialog.setLocationRelativeTo(destURLBox);
								dialog.thread = Thread.currentThread();
								fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
								fmInstance.setEnabled(false);
								dialog.setVisible(true);
								destBean.setConnection((String) destURLBox.getSelectedItem());
								DefaultListModel model = new DefaultListModel();
								Vector tables = destBean.getTableNames();
								for (int j = 0; j < tables.size(); ++j)
									model.addElement(tables.get(j));
								//  System.out.println("hallo" + tables + " ");
								tListDest.setModel(model);
								//  System.out.println("hallo" + tables + " ");
								fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								fmInstance.setEnabled(true);
							}
							catch (Exception e5)
							{
								ByteArrayOutputStream b = new ByteArrayOutputStream();
								PrintStream stream = new PrintStream(b);
								e5.printStackTrace(stream);
								fmInstance.setEnabled(true);
								fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
								DefaultListModel model = new DefaultListModel();
								model.addElement("no database connection");
								tListDest.setModel(model);

								showErrorDialog(b.toString(), "Error occured !");
							}
						}
					};
					thread.start();

				}
				setTitle("Filemaker 2 SQL Conversion Tool ");
				// pack();

			}
			catch (Exception e4)
			{
				ByteArrayOutputStream b = new ByteArrayOutputStream();
				PrintStream stream = new PrintStream(b);
				e4.printStackTrace(stream);
				showErrorDialog(b.toString(), "Open of table failed");

			}
		}
		if (command == "show Driver features")
		{
			ResultWindow result = new ResultWindow(this);
			try
			{
				Vector[] vecs = bean.TestDB(bean.getConnection().getMetaData());
				result.updateResult(vecs[0], vecs[1]);
				// result.pack();
				result.title = "Database features";
				result.setVisible(true);
				String name = result.writeResult();
			}
			catch (Exception e2)
			{
			}
		}
		if (command.equals("Delimiter"))
		{
			new DelimiterDialog(fmInstance).setVisible(true);
			//delimiter = JOptionPane.showInputDialog(fmInstance,"Enter delimiter
			// String",delimiter);

		}

		if (command == "Convert Mode")
		{
			System.out.println("Convert Mode selected");
			convert.setText("Convert Tables");
			convert.setActionCommand("Convert Tables");
			convert.setToolTipText("Normal table conversion  existing table will be deleted");
			mode = Convert.DataBase.CONVERT_MODE;
		}
		if (command == "Append Mode")
		{
			System.out.println("Append Mode selected");
			convert.setText("Append Tables");
			convert.setActionCommand("Append Tables");
			convert.setToolTipText("Appends data to an existing table");

			mode = Convert.DataBase.APPEND_MODE;
		}
		if (command == "Update Mode")
		{
			System.out.println("Update Mode selected");
			convert.setText("Update Tables");
			convert.setActionCommand("Update Tables");
			convert.setToolTipText("Updates data that has been changed in source");
			mode = Convert.DataBase.UPDATE_MODE;
		}
		if (command == "Delete Mode")
		{
			System.out.println("Delete Mode selected");
			convert.setText("Delete Tables");
			convert.setActionCommand("Delete Tables");
			convert.setToolTipText("Deletes data that has been deleted in source");
			mode = Convert.DataBase.DELETE_MODE;
		}
		if (command == "Synchronize Mode")
		{
			System.out.println("Synchronize Mode selected");
			convert.setText("Synchronize Tables");
			convert.setActionCommand("Synchronize Tables");
			convert.setToolTipText("Synchronize data with destination table");
			mode = Convert.DataBase.SYNCHRONIZE_MODE;
		}

		if (command.equals("use NormanToUnicodeMapper"))
		{
			if (bean != null)
				bean.setUseNormanToUnicodeMapper(useNormanToUnicodeMapper.isSelected());
		}
		//writing config
		if (command.equals("save XML Config"))
		{
			if (configExportFileChooser == null)
			{
				configExportFileChooser = new JFileChooser();
				configExportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
				configExportFileChooser.setFileFilter(new XMLFilter());
				configExportFileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
				configExportFileChooser.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e2)
					{
						System.out.println(e2.getActionCommand());
						if (!e2.getActionCommand().toString().equals("ApproveSelection"))
							return;

						Thread thread = new Thread()
						{
							public void run()
							{
								File configFile = configExportFileChooser.getSelectedFile();
								writeConfig(configFile.toString());

							}
						};
						thread.start();

					}
				});
			}
			configExportFileChooser.rescanCurrentDirectory();
			configExportFileChooser.showDialog(fmInstance, " Save ");

		}
		if (command.equals("open XML Config"))
		{
			if (configImportFileChooser == null)
			{
				configImportFileChooser = new JFileChooser();
				configImportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
				configImportFileChooser.setFileFilter(new XMLFilter());
				configImportFileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
				configImportFileChooser.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e2)
					{
						System.out.println(e2.getActionCommand());
						if (!e2.getActionCommand().toString().equals("ApproveSelection"))
							return;

						Thread thread = new Thread()
						{
							public void run()
							{
								File configFile = configImportFileChooser.getSelectedFile();
								readXMLConfig(configFile.toString());

							}
						};
						thread.start();

					}
				});
			}
			configImportFileChooser.rescanCurrentDirectory();
			configImportFileChooser.showDialog(fmInstance, " Open ");

		}

		if (command.equals("Convert Tables") || command.equals("Append Tables"))
		{

			Thread thread = new Thread()
			{
				public void run()
				{
					setEnabled(false);
					convert();
					setEnabled(true);
				}

			};
			thread.start();
		}
		if (command.equals("Update Tables"))
		{

			Thread thread = new Thread()
			{
				public void run()
				{
					setEnabled(false);
					update();
					setEnabled(true);
				}

			};
			thread.start();
		}
		if (command.equals("Delete Tables"))
		{

			Thread thread = new Thread()
			{
				public void run()
				{
					setEnabled(false);
					delete();
					setEnabled(true);
				}

			};
			thread.start();
		}
		if (command.equals("Synchronize Tables"))
		{

			Thread thread = new Thread()
			{
				public void run()
				{
					setEnabled(false);
					synchronize();
					setEnabled(true);
				}

			};
			thread.start();
		}

		if (command.equals("show Tables"))
		{
			Thread thread = new Thread()
			{
				public void run()
				{
					fmInstance.setEnabled(false);
					boolean visible = showTable(1);
					window.validate();
					window.setVisible(visible);
					fmInstance.setEnabled(true);

				}
			};
			thread.start();
			//  System.out.println("hello");

		}
		if (command.equals("show Tables source"))
		{
			Thread thread = new Thread()
			{
				public void run()
				{
					fmInstance.setEnabled(false);
					boolean visible = showTable(0);
					window.validate();
					window.setVisible(visible);
					fmInstance.setEnabled(true);
				}
			};
			thread.start();
			//		System.out.println("hello"+thread);

		}

		if (command.equals("drop Tables"))
		{
			Thread thread = new Thread()
			{
				public void run()
				{
					dropTable();
				}
			};
			thread.start();
		}
		if (command.equals("Quit"))
		{
			bean.closeAllConnections();
			destBean.closeAllConnections();
			fmInstance.dispose();
			System.exit(0);

		}

	}
	/**
	 *  
	 */
	protected void synchronize()
	{
		Vector vectors[] = getListFromTable();
		Convert.user = bean.user;
		Convert.passwd = bean.passwd;
		Convert.userDest = destBean.user;
		Convert.passwdDest = destBean.passwd;
		try
		{

			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			fmInstance.setEnabled(false);
			// TODO indexList vector weiter reichen
			Convert.synchronize(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], mode, delimiter, new Vector());

			destBean.setConnection((String) destURLBox.getSelectedItem());
			DefaultListModel model = new DefaultListModel();
			tables = destBean.getTableNames();
			for (int j = 0; j < tables.size(); ++j)
				model.addElement(tables.get(j));
			if (debug)
				System.out.println("hallo" + tables + " ");
			tListDest.setModel(model);
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
		catch (Exception e4)
		{
			ByteArrayOutputStream b = new ByteArrayOutputStream();
			PrintStream stream = new PrintStream(b);
			e4.printStackTrace(stream);
			showErrorDialog(b.toString(), "Synchronize of table failed");
			fmInstance.setEnabled(true);
		}

	}
	/**
	 * Updates the content of source to destination and makes new table if
	 * necessary
	 */

	public void update()
	{
		Vector vectors[] = getListFromTable();
		Convert.user = bean.user;
		Convert.passwd = bean.passwd;
		Convert.userDest = destBean.user;
		Convert.passwdDest = destBean.passwd;
		try
		{

			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			fmInstance.setEnabled(false);
			Convert.update(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], mode);

			destBean.setConnection((String) destURLBox.getSelectedItem());
			DefaultListModel model = new DefaultListModel();
			tables = destBean.getTableNames();
			for (int j = 0; j < tables.size(); ++j)
				model.addElement(tables.get(j));
			if (debug)
				System.out.println("hallo" + tables + " ");
			tListDest.setModel(model);
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
		catch (Exception e4)
		{
			ByteArrayOutputStream b = new ByteArrayOutputStream();
			PrintStream stream = new PrintStream(b);
			e4.printStackTrace(stream);
			showErrorDialog(b.toString(), "Update of table failed");
			fmInstance.setEnabled(true);
		}

	}
	public void delete()
	{
		Vector vectors[] = getListFromTable();
		Convert.user = bean.user;
		Convert.passwd = bean.passwd;
		Convert.userDest = destBean.user;
		Convert.passwdDest = destBean.passwd;
		try
		{

			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			fmInstance.setEnabled(false);
			Convert.delete(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], mode);

			destBean.setConnection((String) destURLBox.getSelectedItem());
			DefaultListModel model = new DefaultListModel();
			tables = destBean.getTableNames();
			for (int j = 0; j < tables.size(); ++j)
				model.addElement(tables.get(j));
			if (debug)
				System.out.println("hallo" + tables + " ");
			tListDest.setModel(model);
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
		catch (Exception e4)
		{
			ByteArrayOutputStream b = new ByteArrayOutputStream();
			PrintStream stream = new PrintStream(b);
			e4.printStackTrace(stream);
			showErrorDialog(b.toString(), "Delete of table failed");
			fmInstance.setEnabled(true);
		}

	}

	/**
	 * Copys the content of source to destination and makes new table if necessary
	 */
	public void convert()
	{

		Vector vectors[] = getListFromTable();
		Convert.user = bean.user;
		Convert.passwd = bean.passwd;
		Convert.userDest = destBean.user;
		Convert.passwdDest = destBean.passwd;
		try
		{
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			fmInstance.setEnabled(false);
			Convert.convert(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], mode, delimiter);
			destBean.setConnection((String) destURLBox.getSelectedItem());
			DefaultListModel model = new DefaultListModel();
			tables = destBean.getTableNames();
			for (int j = 0; j < tables.size(); ++j)
				model.addElement(tables.get(j));
			if (debug)
				System.out.println("hallo" + tables + " ");
			tListDest.setModel(model);
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
		catch (Exception e4)
		{
			ByteArrayOutputStream b = new ByteArrayOutputStream();
			PrintStream stream = new PrintStream(b);
			e4.printStackTrace(stream);
			showErrorDialog(b.toString(), "Conversion of table failed");
			fmInstance.setEnabled(true);
		}
	}
	public void writeConfig(String file)
	{
		fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		fmInstance.setEnabled(false);

		Vector vectors[] = getListFromTable();
		if (convertItem.isSelected())
			mode = Convert.DataBase.CONVERT_MODE;
		else if (appendItem.isSelected())
			mode = Convert.DataBase.APPEND_MODE;
		else if (updateItem.isSelected())
			mode = Convert.DataBase.UPDATE_MODE;
		else if (deleteItem.isSelected())
			mode = Convert.DataBase.DELETE_MODE;
		else if (synchronizeItem.isSelected())
			mode = Convert.DataBase.SYNCHRONIZE_MODE;

		// TODO add id vector in table and write it out
		Convert.DataBase source = new Convert.DataBase(bean, vectors[0], vectors[1], vectors[2], vectors[3], vectors[4], mode);
		Convert.DataBase destination = new Convert.DataBase(destBean, new Vector(), new Vector(), new Vector(), new Vector(), new Vector(), -1);
		source.delimiter = delimiter;
		source.useNormanToUnicodeMapper = useNormanToUnicodeMapper.isSelected();
		try
		{
			Convert.writeConfig(file, source, destination);
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			fmInstance.setEnabled(true);

		}
		catch (Exception e)
		{
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			fmInstance.setEnabled(true);

			ByteArrayOutputStream b = new ByteArrayOutputStream();
			PrintStream stream = new PrintStream(b);
			e.printStackTrace(stream);
			showErrorDialog(b.toString(), "Error while writing xml config  !");
		}

	}
	public void readXMLConfig(String file)
	{

		try
		{
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			fmInstance.setEnabled(false);
			Vector databases = Convert.getXMLConfig(file);
			Convert.DataBase destBase = (Convert.DataBase) databases.lastElement();
			//destBase.bean.getConnection();
			noUserUpdate = true;
			destBean = destBase.bean;
			Object destObj = destBean.url;
			((DefaultComboBoxModel) destURLBox.getModel()).removeElement(destObj);
			((DefaultComboBoxModel) destURLBox.getModel()).insertElementAt(destObj, 0);
			destURLBox.setSelectedItem(destObj);
			databases.remove(destBase);
			for (Iterator iter = databases.iterator(); iter.hasNext();)
			{
				Convert.DataBase database = (Convert.DataBase) iter.next();

				if (database.mode == Convert.DataBase.CONVERT_MODE)
				{
					convertItem.doClick();
				}
				else if (database.mode == Convert.DataBase.APPEND_MODE)
				{
					appendItem.doClick();
				}
				else if (database.mode == Convert.DataBase.UPDATE_MODE)
				{
					updateItem.doClick();
				}
				else if (database.mode == Convert.DataBase.DELETE_MODE)
				{
					deleteItem.doClick();
				}
				else if (database.mode == Convert.DataBase.SYNCHRONIZE_MODE)
				{
					synchronizeItem.doClick();
				}

				delimiter = database.delimiter;
				database.bean.getConnection();

				bean = database.bean;
				if (bean.isUseNormanToUnicodeMapper())
					useNormanToUnicodeMapper.setSelected(true);
				Object obj = bean.url;
				((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(obj);
				((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(obj, 0);
				sourceURLBox.setSelectedItem(obj);
				fillTable();
				Vector tables = database.bean.getTableNames();
				Collections.sort(tables, String.CASE_INSENSITIVE_ORDER);
				int[] indices = new int[database.tables.size()];
				for (int i = 0; i < database.tables.size(); ++i)
				{
					String table = (String) database.tables.get(i);
					int index = tables.indexOf(table);
					if (index < 0)
						throw new RuntimeException("Error table \"" + table + "\" does no longer exist\n at server " + bean.url + "\n or you mispelled the tablename.");
					noDBUpdate = true;
					tC.tableModel.setValueAt(new TableComponent.SQLCommand(database.selects.get(i).toString()), index, SELECT_INDEX);

					String create = database.creates.get(i).toString();
					tC.tableModel.setValueAt(new TableComponent.SQLCommand(create.equals("") ? create : "           " + create), index, CREATE_INDEX);
					// tC.tableModel.setValueAt(new
					// TableComponent.SQLCommand(bean.ids.get(i).toString()),index,ID_INDEX);

					Object comboBox = tC.tableModel.getValueAt(index, LAYOUT_INDEX);
					Object idcomboBox = tC.tableModel.getValueAt(index, ID_INDEX);

					indices[i] = index;
					if (comboBox != null)
					{
						String layout = database.layouts.get(i).toString();
						((JComboBox) comboBox).setSelectedItem(layout);
						if (layout != "")
						{
							bean.makeQuery("select * from" + bean.getQC() + table + bean.getQC() + " layout " + bean.getQC() + layout + bean.getQC(), 1);

							Vector idVec = bean.getColumnNames();
							if (idVec == null)
								idVec = new Vector();
							idVec.add(0, "");
							((JComboBox) idcomboBox).setModel(new DefaultComboBoxModel(idVec));
						}

					}
					if (idcomboBox != null)
						((JComboBox) idcomboBox).setSelectedItem(bean.ids.get(i));
					tC.tableModel.fireTableDataChanged();
					noDBUpdate = false;
					noUserUpdate = false;

				}
				// add Selections
				ListSelectionModel lm = tC.table.getSelectionModel();
				for (int i = 0; i < indices.length; ++i)
				{
					lm.addSelectionInterval(indices[i], indices[i]);
					tC.tableModel.setValueAt(Boolean.TRUE, indices[i], STATUS_INDEX);
				}
				destBean.getConnection();

				DefaultListModel model = new DefaultListModel();
				tables = destBean.getTableNames();
				for (int j = 0; j < tables.size(); ++j)
					model.addElement(tables.get(j));
				//  System.out.println("hallo" + tables + " ");
				tListDest.setModel(model);
				fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
				fmInstance.setEnabled(true);

			}

		}
		catch (Exception e)
		{
			noUserUpdate = false;
			noDBUpdate = false;
			fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			fmInstance.setEnabled(true);

			ByteArrayOutputStream b = new ByteArrayOutputStream();
			PrintStream stream = new PrintStream(b);
			e.printStackTrace(stream);
			showErrorDialog(b.toString(), "Error while reading xml config  !");
		}

	}
	public boolean showTable(int list)
	{
		ProgressDialog dialog = new ProgressDialog(fm, bean);
		dialog.setTitle("Preparing tables to be displayed");
		dialog.thread = Thread.currentThread();
		dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		String query = new String();
		Object[] objs = tListDest.getSelectedValues();
		Vector[] vectors = (list == 0) ? getListFromTable() : null;
		Vector tables = (list == 0) ? vectors[0] : new Vector();
		if (list > 0)
			for (int i = 0; i < objs.length; ++i)
			{
				if (debug)
					System.out.println(objs[i]);
				tables.add(objs[i]);
			}
		if (window != null)
			window.dispose();
		if (windowDest != null)
			windowDest.dispose();

		window = new MultiResultWindow(fm);
		if (list > 0)
		{
			windowDest = new MultiResultWindow(fm);
			window = windowDest;
		}
		dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x + (FM2SQL.fmInstance.getWidth() - 500) / 2, FM2SQL.fmInstance.getLocationOnScreen().y + (FM2SQL.fmInstance.getHeight() - 250) / 2);
		dialog.setSize(500, 250);
		if (!tables.isEmpty())
			dialog.show();
		dialog.title.setText("Preparing tables to be diplayed");
		for (int i = 0; i < tables.size(); ++i)
		{
			dialog.table.setText("Getting table " + tables.get(i));
			dialog.status.setText("Table " + (i + 1) + " of " + tables.size());

			if (list == 0)
				query = "select * from " + bean.getQC() + tables.get(i).toString() + bean.getQC();
			else
				query = "select * from " + destBean.getQC() + tables.get(i).toString() + destBean.getQC();
			if (list == 0)
				query = vectors[2].get(i).toString();
			if (list == 0 && vectors[1].get(i) != null)
				if (vectors[1].get(i).toString() != "")
				{
					String layout = " layout " + bean.getQC() + vectors[1].get(i).toString() + bean.getQC();
					String name = tables.get(i).toString();
					StringBuffer queryLayout = new StringBuffer(query);
					queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
					query = queryLayout.toString();
				}
			if (debug)
				showErrorDialog("query in show tables is " + query, "Hello");
			window.title = " Table ;-) " + (String) tables.get(i);
			//    break;
			//  } else
			//    window.title = "Error! - No valid tablename found";

			try
			{
				if ((query.toLowerCase().indexOf("insert") >= 0) || (query.toLowerCase().indexOf("delete") >= 0) || (query.toLowerCase().indexOf("alter") >= 0) || (query.toLowerCase().indexOf("update") >= 0))
				{
					Statement stm = (list > 0) ? destBean.getConnection().createStatement() : bean.getConnection().createStatement();
					stm.executeUpdate(query);
					Vector vec = new Vector();
					Vector vec2 = new Vector();
					Vector vec3 = new Vector();
					vec2.add(query);
					vec3.add(vec2);
					vec.add("Insert, update, etc done! No results available");
					// vec.add("no Results were produced");

					window.updateResult(vec3, vec);
					//window.pack();
					//  window.setVisible(true);

				}
				else
				{
					Vector[] vecs = (list > 0) ? destBean.getQueryData(query, dialog, 50) : bean.getQueryData(query, dialog, 50);
					if (vecs[1].isEmpty())
						throw new Exception("Wrong columnname or Empty Layout");
					window.updateResult(vecs[0], vecs[1]);

					//window.pack();
					//String name = window.writeResult();
					//appendLog(window.title, name);
				}

				//window.setVisible(true);

			}
			catch (Exception e)
			{
				System.out.println("Exception occured");
				e.printStackTrace();
				Vector vec = new Vector();
				Vector vec2 = new Vector();
				Vector vec3 = new Vector();
				vec2.add(e.getMessage());
				vec3.add(vec2);
				vec.add("Exception occured! No results available");
				//vec.add("no Results were produced");

				window.updateResult(vec3, vec);
				//window.pack();
				// window.setVisible(true);
				fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

			}
		} // to for
		window.pack();
		window.setSize(700, 600);

		window.oldTabCount = 10000;
		dialog.dispose();
		fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

		return !tables.isEmpty();

	}

	public void dropTable()
	{
		String query = new String();
		Object[] objs = tListDest.getSelectedValues();
		Vector tables = new Vector();
		for (int i = 0; i < objs.length; ++i)
		{
			System.out.println(objs[i]);
			tables.add(objs[i]);
		}

		for (int i = 0; i < tables.size(); ++i)
		{

			query = "drop table " + destBean.getQC() + tables.get(i) + destBean.getQC();

			try
			{
				Statement stm = destBean.getConnection().createStatement();
				stm.executeUpdate(query);
			}
			catch (Exception e)
			{
				ByteArrayOutputStream b = new ByteArrayOutputStream();
				PrintStream stream = new PrintStream(b);
				e.printStackTrace(stream);
				showErrorDialog(b.toString(), "Open of table failed");

			}
		} // to for
		try
		{
			destBean.setConnection((String) destURLBox.getSelectedItem());
			DefaultListModel model = new DefaultListModel();
			tables = destBean.getTableNames();
			for (int j = 0; j < tables.size(); ++j)
				model.addElement(tables.get(j));
			System.out.println("hallo" + tables + " ");
			tListDest.setModel(model);
		}
		catch (Exception e4)
		{
		}

	}
	/**
	 * invoked then the user changes the table or the tableModel changes
	 */
	public void tableChanged(TableModelEvent e)
	{
		//  if (e.getType() == e.INSERT)
		//System.out.println("Insert done");
		// if (e.getType() == e.UPDATE)
		// System.out.println("Update done");
		//if (e.getType() == e.DELETE)
		// System.out.println("Delete done");
		if (e.getType() == TableModelEvent.UPDATE && !noDBUpdate)
		{
			int row = e.getFirstRow(), col = e.getColumn();
			System.out.println("Got in " + row + " " + col);
			TableModel model = (TableModel) e.getSource();
			String columnName = model.getColumnName(col);
			Object test = model.getValueAt(row, col);
			String idVal = (test == null) ? "" : test.toString();
			String value = (test == null) ? "" : test.toString();
			;

			System.out.println("Got in " + columnName + " " + idVal);
			try
			{
				if (columnName.equals("select") || columnName.equals("Layouts"))
				{
					String table = model.getValueAt(row, NAME_INDEX).toString();
					String layout = (model.getValueAt(row, LAYOUT_INDEX) != null) ? ((JComboBox) model.getValueAt(row, LAYOUT_INDEX)).getSelectedItem().toString() : "";
					String query = model.getValueAt(row, SELECT_INDEX).toString();
					String create = model.getValueAt(row, CREATE_INDEX).toString();
					String id = (model.getValueAt(row, ID_INDEX) != null) ? ((JComboBox) model.getValueAt(row, ID_INDEX)).getSelectedItem().toString() : "";

					System.out.println("table" + table + " layout " + layout + " query " + query);
					if (!create.equals(""))
					{
						Object[] options =
						{"Yes", "No"};
						int option = showDialog("Create Statement not empty! Do you want to overwrite?", "create statement", options);
						if (option == 0)
							model.setValueAt(createStatement(table, destBean, layout, query), row, CREATE_INDEX);
					}
					if (columnName.equals("Layouts"))
					{

						bean.makeQuery("select * from" + bean.getQC() + table + bean.getQC() + " layout " + bean.getQC() + layout + bean.getQC(), 1);

						Vector idVec = bean.getColumnNames();
						if (idVec == null)
							idVec = new Vector();
						idVec.add(0, "");
						JComboBox box = ((JComboBox) model.getValueAt(row, ID_INDEX));
						box.setModel(new DefaultComboBoxModel(idVec));
						box.setSelectedItem(id);

						tC.tableModel.fireTableCellUpdated(row, ID_INDEX);
					}

				}
				/*
				 * Statement stm = bean.getConnection().createStatement(); //
				 * stm.executeUpdate("DELETE FROM \""+fm.tables.get(0)+"\" WHERE
				 * \"erstellt von\"='rogo') ");
				 * 
				 * if (idVal == "") stm.executeUpdate("INSERT INTO " + DBBean.quoteChar +
				 * box.getSelectedItem() + DBBean.quoteChar + " (" + DBBean.quoteChar +
				 * columnName + DBBean.quoteChar + ") VALUES ('" + value + "') "); else
				 * stm.executeUpdate( "UPDATE " + DBBean.quoteChar +
				 * box.getSelectedItem() + DBBean.quoteChar + " SET " + DBBean.quoteChar +
				 * columnName + DBBean.quoteChar + "='" + value + "' WHERE ID='" + idVal + "'
				 * ");
				 */
			}
			catch (Exception e2)
			{
				fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
				ByteArrayOutputStream b = new ByteArrayOutputStream();
				PrintStream stream = new PrintStream(b);
				e2.printStackTrace(stream);
				showErrorDialog(b.toString(), "Error while updating table  !");
			}
		}
	}

	/**
	 * initialize the menubar
	 */
	private void setMenu()
	{
		JMenuBar menubar = new JMenuBar();
		JMenu menu = new JMenu("File");
		menu.setMnemonic('F');
		JMenuItem item = new JMenuItem("open XML Config");
		item.setToolTipText("opens a XML config file for batch conversion");
		item.setMnemonic('i');
		item.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_DOWN_MASK));

		item.addActionListener(fm);
		menu.add(item);
		item = new JMenuItem("save XML Config");
		item.setToolTipText("saves the current selections in an XML config file for batch conversion");
		item.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_DOWN_MASK));
		item.setMnemonic('x');

		item.addActionListener(fm);
		menu.add(item);
		item = new JMenuItem("Quit");
		item.setMnemonic('Q');
		item.setToolTipText("Quits the application");
		item.setAccelerator(KeyStroke.getKeyStroke('Q', InputEvent.CTRL_DOWN_MASK));
		item.addActionListener(fm);
		menu.add(item);

		menubar.add(menu);
		menu = new JMenu("Options");
		menu.setMnemonic('O');

		ButtonGroup bgrp = new ButtonGroup();
		convertItem = new JCheckBoxMenuItem("Convert Mode");
		convertItem.setToolTipText("Normal table conversion  existing table will be deleted");
		convertItem.addActionListener(fm);

		bgrp.add(convertItem);

		menu.add(convertItem);
		menubar.add(menu);

		appendItem = new JCheckBoxMenuItem("Append Mode");
		appendItem.setToolTipText("Appends data to an existing table");
		appendItem.addActionListener(fm);

		bgrp.add(appendItem);

		menu.add(appendItem);
		menubar.add(menu);

		updateItem = new JCheckBoxMenuItem("Update Mode");
		updateItem.setToolTipText("Updates data in an existing table");
		updateItem.addActionListener(fm);

		bgrp.add(updateItem);

		menu.add(updateItem);
		deleteItem = new JCheckBoxMenuItem("Delete Mode");
		deleteItem.setToolTipText("Deletes data in an existing table \n that has been deleted in source table");
		deleteItem.addActionListener(fm);

		bgrp.add(deleteItem);

		menu.add(deleteItem);
		synchronizeItem = new JCheckBoxMenuItem("Synchronize Mode");
		synchronizeItem.setToolTipText("Synchronizes data with an existing table \n Data wich has been added or removed will be deleted or addded to the destination table. The rest will be updated");
		synchronizeItem.addActionListener(fm);

		bgrp.add(synchronizeItem);

		menu.add(synchronizeItem);
		useNormanToUnicodeMapper = new JCheckBoxMenuItem("use NormanToUnicodeMapper");
		useNormanToUnicodeMapper.setToolTipText("maps characters in norman encoding to unicode characters");
		useNormanToUnicodeMapper.addActionListener(fm);
		menu.add(useNormanToUnicodeMapper);

		menubar.add(menu);
		item = new JMenuItem("show Driver features");
		item.setToolTipText("shows the features of the selected driver");
		item.addActionListener(fm);
		menu.add(item);
		menubar.add(menu);
		delimiterItem = new JMenuItem("Delimiter");
		delimiterItem.setToolTipText("Delimiter for FM Arrayfields");
		delimiterItem.addActionListener(fm);
		menu.add(delimiterItem);
		menubar.add(menu);

		//   item.addActionListener(fm);
		//    menu.add(item);

		menubar.add(menu);

		menu.setBackground(fm.getBackground());
		menubar.setBackground(fm.getBackground());
		convertItem.doClick();
		setJMenuBar(menubar);
	}
	/**
	 * open the log file (index.html)
	 */

	public static void openLog() throws Exception
	{

		StringBuffer buff = new StringBuffer();
		buff.append("<html>");
		buff.append("<head>");
		buff.append("\n<title>");
		buff.append("FileMaker Test");
		buff.append("</title>\n");
		buff.append("</head>\n");

		buff.append("<body>\n");
		buff.append("<center>\n");
		buff.append("\n<h3>");
		buff.append("FileMaker Test");
		buff.append("</h3>\n");

		logFile.write(TableComponent.convertUml(buff).toString());
		logFile.flush();
	}
	/**
	 * Append one entry to the log file(index.html)
	 */
	public static void appendLog(String entry, String name) throws Exception
	{
		logFile.write("<a href=\"./" + name.substring(name.lastIndexOf("/") + 1) + "\">");
		logFile.write(entry + "</a>");
		logFile.write("<br>\n<br>\n");
		logFile.flush();
	}
	/**
	 * closes the log file invoked then the application closes
	 */
	public static void closeLog() throws Exception
	{
		logFile.write("\n</body>");
		logFile.write("\n</html>");

		logFile.close();
	}
	public static void showErrorDialog(String message, String title)
	{
		JDialog dialog = new JDialog(fmInstance);
		dialog.setTitle(title);
		JTextArea text = new JTextArea();
		JScrollPane scroller = new JScrollPane(text);
		dialog.getContentPane().add(scroller);
		text.append(message);
		dialog.setSize(600, 300);
		dialog.setLocationRelativeTo(fmInstance);
		dialog.show();
		//JOptionPane.showMessageDialog(null, message, title,
		// JOptionPane.ERROR_MESSAGE);
	}
	public static class ProgressDialog extends JDialog
	{
		JLabel table = new JLabel("    ");
		JLabel status = new JLabel("    ");
		JLabel title = new JLabel("     ");
		JPanel content = new JPanel();
		JPanel titlePanel = new JPanel();
		JPanel labelPanel = new JPanel();
		JPanel statusPanel = new JPanel();
		JPanel buttonPanel = new JPanel();

		JProgressBar progress = new JProgressBar();
		JButton cancel = new JButton("Cancel");
		Thread thread;
		DBBean bean;
		public ProgressDialog(JFrame frame, DBBean bean)
		{
			super(frame);
			this.bean = bean;

			content = new JPanel(true);
			//content.setBorder(BorderFactory.createRaisedBevelBorder());
			content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
			title = new JLabel("Progress of conversion");
			title.setHorizontalTextPosition(SwingConstants.CENTER);
			titlePanel.add(title);
			buttonPanel.add(cancel);
			// content.add(titlePanel);
			content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
			content.add(labelPanel);
			content.add(new JLabel(""));
			content.add(progress);
			content.add(statusPanel);
			content.add(buttonPanel);
			content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
			labelPanel.add(table);
			statusPanel.add(status);
			getContentPane().add(titlePanel, "North");
			getContentPane().add(content, "Center");
			this.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					cancel.doClick();
				}
			});

			cancel.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
					fmInstance.setEnabled(true);
					setVisible(false);
					try
					{
						ProgressDialog.this.bean.getConnection().close();
					}
					catch (SQLException e1)
					{
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					catch (Exception e1)
					{
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					thread.stop();
				}
			});
			pack();

		}

	}
	public static class DelimiterDialog extends JDialog
	{
		JLabel table = new JLabel("    ");
		JLabel status = new JLabel("    ");
		JLabel title = new JLabel("     ");
		JPanel content = new JPanel();
		JPanel titlePanel = new JPanel();
		JPanel delimiterPanel = new JPanel();
		JPanel buttonPanel = new JPanel();
		JTextField delimiter = new JTextField(10);

		JButton cancel = new JButton("Cancel");
		JButton ok = new JButton("Ok");
		Thread thread;
		public DelimiterDialog(JFrame frame)
		{
			super(frame);
			setTitle("Delimiter Editor");
			setModal(true);
			content = new JPanel(true);
			delimiter.setText(fmInstance.delimiter);
			ActionListener al = new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					fmInstance.delimiter = parseDelimiter(delimiter.getText());
					setVisible(false);
				}

			};
			this.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					cancel.doClick();
				}
			});

			//delimiter.setText(fmInstance.delimiter);
			delimiter.addActionListener(al);
			content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
			title = new JLabel("Enter Delimiter ");
			title.setHorizontalTextPosition(SwingConstants.CENTER);
			titlePanel.add(title);
			buttonPanel.add(ok);
			buttonPanel.add(cancel);
			content.add(titlePanel);
			content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));

			content.add(new JLabel(""));
			content.add(delimiterPanel);
			content.add(buttonPanel);
			content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));

			delimiterPanel.add(new JLabel("Delimiter:  "));
			delimiterPanel.add(delimiter);
			getContentPane().add(titlePanel, "North");
			getContentPane().add(content, "Center");
			ok.addActionListener(al);
			cancel.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
					fmInstance.setEnabled(true);
					setVisible(false);
					//	thread.stop();
				}

			});
			pack();
			setLocationRelativeTo(fmInstance);
		}
		public String parseDelimiter(Object o)
		{
			String str = o.toString();
			StringBuffer sbuff = new StringBuffer();
			int length = str.length();
			for (int i = 0; i < length; ++i)
			{

				if (str.charAt(i) == '\\')
				{
					System.out.println(str.charAt(i));
					if (str.charAt(i + 1) == 'r')
					{
						sbuff.append("\r");
					}
					if (str.charAt(i + 1) == 't')
					{
						sbuff.append("\t");
					}
					if (str.charAt(i + 1) == 'n')
					{
						sbuff.append("\n");
					}
					if (str.charAt(i + 1) == '\\')
					{
						sbuff.append("\\");
					}

					if (i < length - 1)
						++i;

				}
				else
					sbuff.append(str.charAt(i));
			}

			return sbuff.toString();
		}
	}

	public static class PasswordDialog extends JDialog
	{
		JLabel table = new JLabel("    ");
		JLabel status = new JLabel("    ");
		JLabel title = new JLabel("     ");
		JPanel content = new JPanel();
		JPanel titlePanel = new JPanel();
		JPanel userPanel = new JPanel();
		JPanel passwordPanel = new JPanel();
		JPanel buttonPanel = new JPanel();
		JTextField user = new JTextField(10);
		JTextField passwd = new JPasswordField(10);

		JButton cancel = new JButton("Cancel");
		JButton ok = new JButton("Ok");
		DBBean bean = null;
		Thread thread;
		public PasswordDialog(JFrame frame, DBBean localBean)
		{
			super(frame);
			setTitle("PasswordDialog");
			setModal(true);
			content = new JPanel(true);
			this.bean = localBean;
			//content.setBorder(BorderFactory.createRaisedBevelBorder());
			ActionListener al = new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					bean.setUserAndPasswd(user.getText(), passwd.getText());
					setVisible(false);
				}

			};
			this.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					cancel.doClick();
				}
			});

			user.setText(localBean.user);
			passwd.setText(localBean.passwd);
			user.addActionListener(al);
			passwd.addActionListener(al);
			content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
			title = new JLabel("Enter user and password ");
			title.setHorizontalTextPosition(SwingConstants.CENTER);
			titlePanel.add(title);
			buttonPanel.add(ok);
			buttonPanel.add(cancel);
			content.add(titlePanel);
			content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
			// content.add(labelPanel);
			content.add(new JLabel(""));
			content.add(userPanel);
			content.add(passwordPanel);
			content.add(buttonPanel);
			content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
			//labelPanel.add(table);
			userPanel.add(new JLabel("Username:  "));
			userPanel.add(user);
			passwordPanel.add(new JLabel("Password:  "));
			passwordPanel.add(passwd);
			passwd.setPreferredSize(user.getPreferredSize());
			passwd.setMinimumSize(passwd.getPreferredSize());
			passwd.setMaximumSize(passwd.getPreferredSize());
			passwd.setSize(passwd.getPreferredSize());
			getContentPane().add(titlePanel, "North");
			getContentPane().add(content, "Center");
			ok.addActionListener(al);
			cancel.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
					fmInstance.setEnabled(true);
					setVisible(false);
					thread.stop();
				}

			});
			pack();

		}

	}
	public void fillTable()
	{
		noDBUpdate = true;
		bean.setUseNormanToUnicodeMapper(useNormanToUnicodeMapper.isSelected());
		Vector tableNames = bean.getTableNames();
		Collections.sort(tableNames, String.CASE_INSENSITIVE_ORDER);
		Vector[] data = new Vector[2];
		data[1] = new Vector(6);
		data[1].setSize(6);
		data[1].set(STATUS_INDEX, " ");
		data[1].set(NAME_INDEX, " source Tablename  ");
		data[1].set(LAYOUT_INDEX, "Layouts");
		data[1].set(SELECT_INDEX, "select");
		data[1].set(CREATE_INDEX, "create");
		data[1].set(ID_INDEX, " id ");
		data[0] = new Vector();
		for (int i = 0; i < tableNames.size(); i++)
		{
			String name = tableNames.get(i).toString();
			Vector layouts = new Vector();
			Vector idVec = new Vector();

			try
			{
				bean.makeQuery("select * from" + bean.getQC() + name + bean.getQC(), 1);
				layouts = bean.getLayoutNames(name);
			}
			catch (SQLException e)
			{
				layouts = new Vector();
			}
			catch (Exception e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			idVec = bean.getColumnNames();
			if (idVec == null)
				idVec = new Vector();
			idVec.add(0, "");
			Vector dataRow = new Vector(6);

			dataRow.setSize(6);
			dataRow.set(STATUS_INDEX, Boolean.FALSE);
			dataRow.set(NAME_INDEX, name);

			dataRow.set(SELECT_INDEX, new TableComponent.SQLCommand("select * from " + bean.getQC() + name + bean.getQC()));
			if (!layouts.isEmpty())
				dataRow.set(LAYOUT_INDEX, new JComboBox(layouts));
			else
				dataRow.set(LAYOUT_INDEX, null);

			// create row
			dataRow.set(CREATE_INDEX, new TableComponent.SQLCommand(""));
			// id row
			dataRow.set(ID_INDEX, new TableComponent.IDComboBox(idVec));//new
			// TableComponent.SQLCommand(""));
			bean.ids.add("");
			data[0].add(dataRow);

			//System.out.println(dataRow);
		}

		tC.booleanRenderer.renderFalseEmpty = true;
		tC.tableModel.setDataVector(data[0], data[1]);
		//@TODO new sizeToFit method needed
		//tC.sizeToFit(450, 250);
		Dimension dim = listPanel.getPreferredSize();
		tC.sizeToFit(dim.width, dim.height);
		tC.revalidate();
		tC.tableModel.fireTableDataChanged();
		noDBUpdate = false;

	}
	public Vector[] getListFromTable()
	{
		Vector[] vec = new Vector[5];
		vec[0] = new Vector();
		vec[1] = new Vector();
		vec[2] = new Vector();
		vec[3] = new Vector();
		vec[4] = new Vector();
		for (int i = 0; i < tC.tableModel.getRowCount(); ++i)
		{
		}
		int[] rows = tC.table.getSelectedRows();
		for (int i = 0; i < tC.tableModel.getRowCount(); i++)
		{
			if (((Boolean) tC.tableModel.getValueAt(i, STATUS_INDEX)) == Boolean.FALSE)
			{
				System.out.println("skipped row " + i);
				continue;
			}

			//System.out.println(tC.tableModel.getValueAt(rows[i],1));
			vec[0].add(tC.tableModel.getValueAt(i, NAME_INDEX));
			JComboBox box = ((JComboBox) tC.tableModel.getValueAt(i, LAYOUT_INDEX));
			String layoutName = (box != null) ? box.getSelectedItem().toString() : "";

			String idName = ((JComboBox) tC.tableModel.getValueAt(i, ID_INDEX)).getSelectedItem().toString();
			vec[1].add(layoutName);
			vec[2].add(tC.tableModel.getValueAt(i, SELECT_INDEX).toString());
			vec[3].add(tC.tableModel.getValueAt(i, CREATE_INDEX).toString());
			vec[4].add(idName);

		}
		return vec;
	}
	public void setEnabled(boolean state)
	{
		showTables.setEnabled(state);
		showTables1.setEnabled(state);
		convert.setEnabled(state);
		dropTables.setEnabled(state);
		sourceURLBox.setEnabled(state);
		destURLBox.setEnabled(state);

	}
	public TableComponent.SQLCommand createStatement(String table, DBBean beanDest, String layout, String query) throws SQLException, ParseException, Exception
	{
		fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

		if (beanDest.url.equals(""))
			beanDest.url = destURLBox.getSelectedItem().toString();
		StringBuffer command = new StringBuffer(50);
		command.append("\n           CREATE TABLE ");
		command.append(beanDest.getQC());
		command.append(Convert.convertText(table));
		command.append(beanDest.getQC());
		command.append("\n             ( ");
		String type = null;
		// String query = "select * from " + bean.getQC() +table + bean.getQC();
		if (!layout.equals(""))
		{
			layout = " layout " + bean.getQC() + layout + bean.getQC();
			StringBuffer queryLayout = new StringBuffer(query);
			queryLayout.insert(queryLayout.indexOf(table) + table.length() + 1, " " + layout);
			query = queryLayout.toString();
			System.out.println("added layout  " + query);

		}
		Vector[] result = bean.getQueryData(query, 1);
		for (int i = 0; i < result[1].size() - 1; ++i)
		{
			type = bean.metaData.getColumnTypeName(i + 1);
			//   System.out.println(i+" "+result[1].get(i)+" "+type);
			type = (type.equals("NUMBER")) ? "INT4" : type;
			type = (type.equals("CONTAINER")) ? "TEXT" : type;
			type = type.toUpperCase();
			if (i == 0)
				command.append(beanDest.getQC() + Convert.convertText((String) result[1].get(i)) + beanDest.getQC() + " " + type + ", ");
			else
				command.append("               " + beanDest.getQC() + Convert.convertText((String) result[1].get(i)) + beanDest.getQC() + " " + type + ", ");
			command.append("\n");
		}
		type = bean.metaData.getColumnTypeName(result[1].size());
		type = (type.equals("NUMBER")) ? "INT4" : type;
		type = (type.equals("CONTAINER")) ? "TEXT" : type;
		type = type.toUpperCase();
		command.append("               " + beanDest.getQC() + Convert.convertText((String) result[1].get(result[1].size() - 1)) + beanDest.getQC() + " " + type);
		command.append("\n             )\n");
		fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

		return new TableComponent.SQLCommand(command.toString());
	}
	static class XMLFilter extends javax.swing.filechooser.FileFilter
	{
		public boolean accept(java.io.File file)
		{
			if (file.getName().toLowerCase().endsWith(".xml") || file.isDirectory())
				return true;
			else
				return false;
		}
		public String getDescription()
		{
			return "Batch Convert XML File";
		}

	}
	public static int showDialog(String message, String title, Object[] options)
	{
		int option = JOptionPane.showOptionDialog(null, message, title, JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
		return option;

	}

}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>