File:  [Repository] / FM2SQL / Attic / FM2SQL.java
Revision 1.24: download - view: text, annotated - select for diffs - revision graph
Wed Mar 3 12:14:47 2004 UTC (20 years, 3 months ago) by rogo
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

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.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.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 JCheckBoxMenuItem convertItem;
  private JCheckBoxMenuItem appendItem;
  private JCheckBoxMenuItem updateItem;
  private JCheckBoxMenuItem deleteItem;
  
  int mode = -1;
  final static int ID_INDEX = 1;
  final static int SELECT_INDEX = 2;
  final static int CREATE_INDEX = 3;
  final static int LAYOUT_INDEX = 4;
  
  
 
  /**
  * 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;
 
  /**
   * 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" });
    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)
      {
        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 == "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; 
    }

   //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("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"))
   {
     fmInstance.dispose();
     System.exit(0);
  
   }
   
  }
	/**
	 * 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);
    }

  }
  /**
   * 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;
    // 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;
    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.setSelected(true);
          convert.setText("Convert Tables");
          convert.setActionCommand("Convert Tables");
          mode = Convert.DataBase.CONVERT_MODE;
        } else if (database.mode == Convert.DataBase.APPEND_MODE)
        {
          appendItem.setSelected(true);
          convert.setText("Append Tables");
          convert.setActionCommand("Append Tables");
          mode = Convert.DataBase.APPEND_MODE;
        } else if (database.mode == Convert.DataBase.UPDATE_MODE)
        {
          updateItem.setSelected(true);
          convert.setText("Update Tables");
          convert.setActionCommand("Update Tables");
          mode = Convert.DataBase.UPDATE_MODE;
        }
        delimiter=database.delimiter;
        database.bean.getConnection();
           
        bean = database.bean;
        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) ((JComboBox)comboBox).setSelectedItem(database.layouts.get(i));  
          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]);
         
       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);
    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 = getListFromTable();
    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() == e.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,0).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(),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);
          }
       
        }
/*        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');
   
    item = new JMenuItem("show Driver features");
		item.setToolTipText("shows the features of the selected driver");
    item.addActionListener(fm);
    menu.add(item);
    menubar.add(menu);

    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);

		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;
    public ProgressDialog(JFrame frame)
    {
      super(frame);
      content = new JPanel(true);
      //content.setBorder(BorderFactory.createRaisedBevelBorder());
      content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
      title = new JLabel("Progress of conversion");
      title.setHorizontalTextPosition(title.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);
          thread.stop();
        }
      });
      pack();

    }

  }
  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(title.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;
    Vector tableNames = bean.getTableNames();
    Collections.sort(tableNames, String.CASE_INSENSITIVE_ORDER);
    Vector[] data = new Vector[2];
    data[1] = new Vector(5);
    data[1].setSize(5); 
    data[1].set(0," 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();
      }
      
      idVec = bean.getColumnNames(); 
      if(idVec==null) idVec=new Vector();
      idVec.add(0,"");
      Vector dataRow = new Vector(5);
      
      dataRow.setSize(5);
      dataRow.set(0,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.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();
    int[] rows = tC.table.getSelectedRows();
    for (int i = 0; i < rows.length; i++)
    {
      //System.out.println(tC.tableModel.getValueAt(rows[i],1));
      vec[0].add(tC.tableModel.getValueAt(rows[i], 0));
      JComboBox box = ((JComboBox) tC.tableModel.getValueAt(rows[i], LAYOUT_INDEX));
      String layoutName = (box != null) ? box.getSelectedItem().toString() : "";
      
      String idName = ((JComboBox)tC.tableModel.getValueAt(rows[i], ID_INDEX)).getSelectedItem().toString();
      vec[1].add(layoutName);
      vec[2].add(tC.tableModel.getValueAt(rows[i],SELECT_INDEX ).toString());
      vec[3].add(tC.tableModel.getValueAt(rows[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
  {
    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>