File:  [Repository] / FM2SQL / src / FM2SQL.java
Revision 1.7: download - view: text, annotated - select for diffs - revision graph
Tue Sep 6 10:53:16 2005 UTC (18 years, 8 months ago) by rogo
Branches: MAIN
CVS tags: HEAD
new version

minor bug fixes

/*
 * 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.4( first stable release)
 * @author rogo
 * 
 */
public class FM2SQL extends JFrame implements ActionListener, TableModelListener
{
  private JMenuItem delimiterItem;
  private JCheckBoxMenuItem convertItem;
  private JCheckBoxMenuItem convertTempItem;
  private JCheckBoxMenuItem appendItem;
  private JCheckBoxMenuItem updateItem;
  private JCheckBoxMenuItem deleteItem;
  private JCheckBoxMenuItem useNormanToUnicodeMapper;
  private JMenuItem aboutBox;
  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" });
    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 enume = prop.keys();
      //			Enumeration enum2 = prop.elements();
      //
      //			while (enume.hasMoreElements())
      //				System.out.println(enume.nextElement() + " " + enum2.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);

    } 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.setVisible(true);
    }
  }

  public void actionPerformed(ActionEvent e)
  {
    String command = e.getActionCommand();
    if (debug)
      System.out.println("command " + command);
    if (command.equals(aboutBox.getText()))
    {
      JOptionPane.showMessageDialog(fmInstance, Convert.versionID, "About FM2SQL",
          JOptionPane.INFORMATION_MESSAGE);
    }

    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 == "Convert Temp Mode")
    {
      System.out.println("Convert Temp Mode selected");
      convert.setText("Convert Tables(Temp)");
      convert.setActionCommand("Convert Tables");
      convert.setToolTipText("Temporary table conversion  existing table will be renamed to tablename_actDate_actTime");
      mode = Convert.DataBase.CONVERT_TEMP_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(), null);

      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;
    if (convertTempItem.isSelected())
      mode = Convert.DataBase.CONVERT_TEMP_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);
      StringBuffer sb = Convert.readXMLFile(file);
      Vector databases = Convert.getXMLConfig(sb);
      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();
        }
        if (database.mode == Convert.DataBase.CONVERT_TEMP_MODE)
        {
          convertTempItem.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.setVisible(true);
    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);
    convertTempItem = new JCheckBoxMenuItem("Convert Temp Mode");
    convertTempItem.setToolTipText("Temporaty table conversion  existing table will be saved as tablename_actDate_actTime");
    convertTempItem.addActionListener(fm);

    bgrp.add(convertTempItem);

    menu.add(convertTempItem);
    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 = new JMenu("About");
    menu.setMnemonic('A');
    aboutBox = new JMenuItem("about FM2SQL");
    aboutBox.addActionListener(fm);
    menu.add(aboutBox);
    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.setVisible(true);
    // 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>