File:  [Repository] / FM2SQL / src / FM2SQL.java
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Tue Apr 19 10:49:05 2005 UTC (19 years, 2 months ago) by rogo
Branches: MAIN
CVS tags: HEAD
bug fixed concerning not internalized strings

    1: /*
    2:  * FM2SQL.java -- Main program Filemaker to SQL Converter 
    3:  * Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de) 
    4:  * This program is free software; you can redistribute it and/or modify it
    5:  * under the terms of the GNU General Public License as published by the Free
    6:  * Software Foundation; either version 2 of the License, or (at your option)
    7:  * any later version.  Please read license.txt for the full details. A copy of
    8:  * the GPL may be found at http://www.gnu.org/copyleft/lgpl.html  You should
    9:  * have received a copy of the GNU General Public License along with this
   10:  * program; if not, write to the Free Software Foundation, Inc., 59 Temple
   11:  * Place, Suite 330, Boston, MA 02111-1307 USA  Created on 15.09.2003 by
   12:  * rogo  
   13:  */
   14: 
   15: import java.awt.Cursor;
   16: import java.awt.Dimension;
   17: import java.awt.Font;
   18: import java.awt.GridBagConstraints;
   19: import java.awt.GridBagLayout;
   20: import java.awt.Image;
   21: import java.awt.Insets;
   22: import java.awt.event.ActionEvent;
   23: import java.awt.event.ActionListener;
   24: import java.awt.event.ComponentAdapter;
   25: import java.awt.event.ComponentEvent;
   26: import java.awt.event.InputEvent;
   27: import java.awt.event.WindowAdapter;
   28: import java.awt.event.WindowEvent;
   29: import java.io.ByteArrayOutputStream;
   30: import java.io.File;
   31: import java.io.FileWriter;
   32: import java.io.PrintStream;
   33: import java.sql.SQLException;
   34: import java.sql.Statement;
   35: import java.text.ParseException;
   36: import java.util.Collections;
   37: import java.util.Iterator;
   38: import java.util.Vector;
   39: 
   40: import javax.swing.Box;
   41: import javax.swing.BoxLayout;
   42: import javax.swing.ButtonGroup;
   43: import javax.swing.DefaultComboBoxModel;
   44: import javax.swing.DefaultListModel;
   45: import javax.swing.JButton;
   46: import javax.swing.JCheckBoxMenuItem;
   47: import javax.swing.JComboBox;
   48: import javax.swing.JDialog;
   49: import javax.swing.JFileChooser;
   50: import javax.swing.JFrame;
   51: import javax.swing.JLabel;
   52: import javax.swing.JList;
   53: import javax.swing.JMenu;
   54: import javax.swing.JMenuBar;
   55: import javax.swing.JMenuItem;
   56: import javax.swing.JOptionPane;
   57: import javax.swing.JPanel;
   58: import javax.swing.JPasswordField;
   59: import javax.swing.JProgressBar;
   60: import javax.swing.JScrollBar;
   61: import javax.swing.JScrollPane;
   62: import javax.swing.JSplitPane;
   63: import javax.swing.JTextArea;
   64: import javax.swing.JTextField;
   65: import javax.swing.KeyStroke;
   66: import javax.swing.ListSelectionModel;
   67: import javax.swing.SwingConstants;
   68: import javax.swing.event.TableModelEvent;
   69: import javax.swing.event.TableModelListener;
   70: import javax.swing.table.TableModel;
   71: 
   72: /**
   73:  * 
   74:  * <br>
   75:  * <h2>FileMaker Test (JDBC Database Driver Test)</h2>
   76:  * Main class : contains the main Frame, all event handlers etc <br>
   77:  * The Database access is made over DBBean class all other classes are just for
   78:  * the visualization of the data
   79:  * 
   80:  * @version 0.3( first stable release)
   81:  * @author rogo
   82:  * 
   83:  */
   84: public class FM2SQL extends JFrame implements ActionListener, TableModelListener
   85: {
   86:   private JMenuItem delimiterItem;
   87:   private JCheckBoxMenuItem convertItem;
   88:   private JCheckBoxMenuItem appendItem;
   89:   private JCheckBoxMenuItem updateItem;
   90:   private JCheckBoxMenuItem deleteItem;
   91:   private JCheckBoxMenuItem useNormanToUnicodeMapper;
   92:   private JMenuItem aboutBox;
   93:   int mode = -1;
   94:   final static int STATUS_INDEX = 0;
   95:   final static int NAME_INDEX = 1;
   96:   final static int ID_INDEX = 2;
   97:   final static int SELECT_INDEX = 3;
   98:   final static int CREATE_INDEX = 4;
   99:   final static int LAYOUT_INDEX = 5;
  100: 
  101:   /**
  102:    * The database Bean instance.
  103:    * 
  104:    */
  105:   DBBean bean;
  106:   /**
  107:    * The database destination Bean instance.
  108:    * 
  109:    */
  110:   DBBean destBean;
  111: 
  112:   /**
  113:    * tList - Tablenames to choose from
  114:    */
  115: 
  116:   JList tList = new JList(new String[]
  117:   { "no database", "connection", "" });
  118:   JList tListDest = new JList(new String[]
  119:   { "no database connection", "", "" });
  120: 
  121:   /**
  122:    * sourceUrl - Database URL ComboBox
  123:    */
  124:   JComboBox sourceURLBox;
  125:   /**
  126:    * destUrlBox - Database URL ComboBox
  127:    */
  128:   JComboBox destURLBox;
  129: 
  130:   TableComponent table, tC;
  131:   Vector tables = new Vector();
  132:   Vector layouts = new Vector();
  133:   JPanel listPanel;
  134:   JPanel topPanel, topPanel2, contentPanel;
  135:   JScrollPane paneDest;
  136:   FM2SQL fm = this;
  137:   boolean noDBUpdate = false;
  138:   boolean noUserUpdate = false;
  139:   int id = 0;
  140:   static boolean debug = false;
  141:   /**
  142:    * The result window used for query results
  143:    */
  144:   MultiResultWindow window;
  145:   /**
  146:    * The result window used for query results
  147:    */
  148:   MultiResultWindow windowDest;
  149: 
  150:   static FM2SQL fmInstance;
  151:   static String url = "jdbc:fmpro:http://141.14.237.42";
  152:   JButton showTables = new JButton(), showTables1 = new JButton();
  153:   JButton convert = new JButton();
  154:   JButton dropTables = new JButton();
  155: 
  156:   int oldWidth = 0, oldHeight = 0;
  157:   boolean resize = true;
  158:   static FileWriter logFile;
  159:   String delimiter = "";
  160: 
  161:   Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
  162:   JFileChooser configExportFileChooser;
  163:   JFileChooser configImportFileChooser;
  164:   private JCheckBoxMenuItem synchronizeItem;
  165: 
  166:   /**
  167:    * tries to connect to database specified in url-Variable. initializes all GUI
  168:    * components, then fails throws an exception
  169:    * 
  170:    */
  171:   public FM2SQL() throws Exception
  172:   {
  173: 
  174:     initializeGUI();
  175:   }
  176: 
  177:   public void initializeGUI() throws Exception
  178:   {
  179:     Image local = getToolkit().getImage(FM2SQL.class.getResource("icons/fm.jpg"));
  180:     if (local != null)
  181:       ;
  182:     setIconImage(local);
  183:     bean = new DBBean();
  184:     destBean = new DBBean();
  185:     sourceURLBox = new JComboBox(new String[]
  186:     { "jdbc:fmpro:http://141.14.237.74:8050", "jdbc:fmpro:http://localhost",
  187:         "jdbc:postgresql://foxridge/test", "jdbc:sequelink://r583-3:2399" });
  188:     sourceURLBox.setEditable(true);
  189:     sourceURLBox.setFont(new Font("Times New Roman", Font.PLAIN, 14));
  190:     destURLBox = new JComboBox(new String[]
  191:     { "jdbc:postgresql://foxridge/test" });
  192:     destURLBox.setEditable(true);
  193:     destURLBox.addActionListener(this);
  194:     destURLBox.setFont(new Font("Times New Roman", Font.PLAIN, 14));
  195:     table = new TableComponent();
  196:     // box = new JComboBox(tables);
  197:     // box.addActionListener(this);
  198:     // box2.addActionListener(this);
  199:     sourceURLBox.addActionListener(this);
  200: 
  201:     contentPanel = new JPanel();
  202:     contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
  203: 
  204:     sourceURLBox.setMinimumSize(new Dimension(450, 25));
  205:     sourceURLBox.setMaximumSize(new Dimension(550, 25));
  206:     sourceURLBox.setPreferredSize(new Dimension(450, 25));
  207:     destURLBox.setMinimumSize(new Dimension(450, 25));
  208:     destURLBox.setMaximumSize(new Dimension(550, 25));
  209:     destURLBox.setPreferredSize(new Dimension(450, 25));
  210:     paneDest = new JScrollPane(tListDest);
  211:     // tListDest.setPreferredSize(paneDest.getPreferredSize());
  212:     // paneDest.setPreferredSize(new Dimension(350, 365));
  213:     Dimension dim = paneDest.getPreferredSize();
  214:     paneDest.setMinimumSize(dim);
  215:     // paneDest.setMaximumSize(new Dimension(dim.width + 50, dim.height + 50));
  216: 
  217:     tC = new TableComponent();
  218:     tC.sizeToFit(450, 250);
  219:     tC.tableModel.addTableModelListener(this);
  220:     JPanel destPanel = new JPanel();
  221:     destPanel.setLayout(new java.awt.GridBagLayout());
  222: 
  223:     listPanel = new JPanel();
  224:     listPanel.setLayout(new java.awt.GridBagLayout());
  225:     java.awt.GridBagConstraints gbc = new java.awt.GridBagConstraints();
  226:     JScrollPane pane = new JScrollPane(tList);
  227:     tC.tableScroller.setPreferredSize(new Dimension(450, 365));
  228:     // tC.table.revalidate();
  229:     tC.tableScroller.setMinimumSize(new Dimension(450, 250));
  230:     // tC.tableScroller.setMaximumSize(tC.tableScroller.getPreferredSize());
  231:     topPanel = new JPanel();
  232:     topPanel.setLayout(new GridBagLayout());
  233:     topPanel2 = new JPanel();
  234:     topPanel2.setLayout(new GridBagLayout());
  235: 
  236:     gbc.gridx = 0;
  237:     gbc.gridy = 0;
  238:     gbc.weightx = 0.1;
  239:     gbc.weighty = 0.1;
  240:     gbc.gridwidth = 1;
  241:     gbc.gridheight = 1;
  242:     gbc.insets = new Insets(2, 2, 5, 5);
  243:     gbc.ipadx = 1;
  244:     gbc.ipady = 1;
  245: 
  246:     gbc.anchor = GridBagConstraints.WEST;
  247:     listPanel.add(topPanel, gbc);
  248:     destPanel.add(topPanel2, gbc);
  249: 
  250:     topPanel.add(new JLabel("Choose src database: ", JLabel.CENTER), gbc);
  251:     topPanel2.add(new JLabel("Choose dest database : ", JLabel.CENTER), gbc);
  252: 
  253:     gbc.anchor = GridBagConstraints.NORTHWEST;
  254:     gbc.gridy = 1;
  255:     topPanel.add(sourceURLBox, gbc);
  256: 
  257:     topPanel2.add(destURLBox, gbc);
  258: 
  259:     // gbc.gridx=GridBagConstraints.RELATIVE;
  260:     // dataBasePanel.add(new JLabel(" select Tables to Convert ", JLabel.LEFT));
  261:     gbc.gridy = 1;
  262:     gbc.anchor = GridBagConstraints.SOUTHWEST;
  263: 
  264:     listPanel.add(new JLabel(" select Tables to Convert  ", JLabel.LEFT), gbc);
  265:     destPanel.add(new JLabel("  Tables in database  ", JLabel.LEFT), gbc);
  266: 
  267:     // gbc.anchor = GridBagConstraints.WEST;
  268:     gbc.gridy = 2;
  269:     gbc.gridx = 0;
  270:     // gbc.weightx = 0.0;
  271:     // dataBasePanel.add(tC);
  272:     gbc.anchor = GridBagConstraints.NORTHWEST;
  273:     gbc.gridheight = 1;
  274:     gbc.fill = GridBagConstraints.BOTH;
  275:     listPanel.add(tC.tableScroller, gbc);
  276:     // gbc.fill = GridBagConstraints.VERTICAL;
  277:     destPanel.add(paneDest, gbc);
  278:     showTables1 = new JButton("show Tables");
  279:     showTables1.setActionCommand("show Tables source");
  280:     // gbc.anchor = GridBagConstraints.NORTH;
  281:     // gbc.weightx = 0.0;
  282:     gbc.fill = GridBagConstraints.NONE;
  283:     gbc.gridheight = 1;
  284: 
  285:     gbc.gridx = 0;
  286:     gbc.gridy = 2;
  287:     // topPanel.add(showTables1, gbc);
  288:     JPanel buttonPanel = new JPanel();
  289:     buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
  290:     buttonPanel.setMinimumSize(new Dimension(380, 30));
  291:     convert = new JButton("Convert Tables");
  292:     showTables = new JButton("show Tables");
  293:     dropTables = new JButton("drop Tables");
  294:     // System.out.println(convert.getPreferredSize());
  295:     showTables.setMinimumSize(convert.getPreferredSize());
  296:     dropTables.setMinimumSize(convert.getPreferredSize());
  297:     showTables.setMaximumSize(convert.getPreferredSize());
  298:     dropTables.setMaximumSize(convert.getPreferredSize());
  299:     showTables.setPreferredSize(convert.getPreferredSize());
  300:     dropTables.setPreferredSize(convert.getPreferredSize());
  301: 
  302:     showTables.addActionListener(fm);
  303:     showTables1.addActionListener(fm);
  304: 
  305:     buttonPanel.add(showTables);
  306:     buttonPanel.add(convert);
  307:     convert.addActionListener(fm);
  308:     dropTables.addActionListener(fm);
  309:     buttonPanel.add(dropTables);
  310: 
  311:     JPanel buttonPanelSrc = new JPanel();
  312:     buttonPanelSrc.setLayout(new BoxLayout(buttonPanelSrc, BoxLayout.X_AXIS));
  313:     buttonPanelSrc.setMinimumSize(new Dimension(200, 30));
  314:     buttonPanelSrc.add(showTables1);
  315: 
  316:     topPanel.add(buttonPanelSrc, gbc);
  317:     topPanel2.add(buttonPanel, gbc);
  318: 
  319:     // gbc.anchor = GridBagConstraints.WEST;
  320:     // gbc.gridy = 1;
  321:     // gbc.gridx = 2;
  322:     // gbc.weightx = 0.2;
  323: 
  324:     // gbc.gridx = 3;
  325:     // gbc.anchor = GridBagConstraints.NORTHWEST;
  326:     // gbc.gridy = 1;
  327:     // gbc.weightx = 1.0;
  328:     // listPanel.add(buttonPanel, gbc);
  329:     JSplitPane splitter = new JSplitPane();
  330:     splitter.setTopComponent(listPanel);
  331:     splitter.setBottomComponent(destPanel);
  332: 
  333:     // contentPanel.add(dataBasePanel);
  334:     // contentPanel.add(listPanel);
  335:     listPanel.setMaximumSize(new Dimension(660, 750));
  336:     listPanel.setMinimumSize(new Dimension(660, 250));
  337:     listPanel.setPreferredSize(new Dimension(480, 500));
  338:     paneDest.setPreferredSize(new Dimension(250, 285));
  339: 
  340:     getContentPane().add(splitter, "Center");
  341:     this.addWindowListener(new WindowAdapter() {
  342:       public void windowClosing(WindowEvent e)
  343:       {
  344:         bean.closeAllConnections();
  345:         destBean.closeAllConnections();
  346:         System.exit(0);
  347:       }
  348:     });
  349:     addComponentListener(new ComponentAdapter() {
  350:       public void componentResized(ComponentEvent e)
  351:       {
  352: 
  353:         if (oldWidth != getWidth() || oldHeight != getHeight())
  354:         {
  355:           // table.sizeToFit(getWidth(), getHeight());
  356: 
  357:           Dimension dim = table.table.getPreferredSize();
  358:           int size = contentPanel.getPreferredSize().height
  359:               + new JScrollBar().getPreferredSize().height
  360:               + new JMenuBar().getPreferredSize().height + 10;
  361: 
  362:           table.tableScroller.setPreferredSize(new Dimension(getWidth() - 15, getHeight() - size));
  363:           Dimension d2 = table.tableScroller.getPreferredSize();
  364: 
  365:           oldWidth = getWidth();
  366:           oldHeight = getHeight();
  367: 
  368:           table.setPreferredSize(new Dimension(d2.width + 15, d2.height + 5));
  369:           table.table.revalidate();
  370:           table.tableScroller.revalidate();
  371:           table.revalidate();
  372:           if (getHeight() > table.table.getPreferredSize().height + (2 * size))
  373:             setSize(getWidth(), table.table.getPreferredSize().height + 2 * size);
  374:           // System.out.println("size" + size);
  375:         }
  376:         // listPanel.setMaximumSize(new Dimension(getPreferredSize().width - 5,
  377:         // 550));
  378:         // listPanel.setMinimumSize(new Dimension(getPreferredSize().width - 5,
  379:         // 200));
  380:         // listPanel.setPreferredSize(new Dimension(getPreferredSize().width -
  381:         // 5, 370));
  382:         tC.tableScroller.revalidate();
  383:         Dimension dim = getSize();
  384:         tC.tableScroller.setMinimumSize(new Dimension(dim.width - 400, dim.height
  385:             - topPanel.getPreferredSize().height - 100));
  386:         tC.tableScroller.setMaximumSize(getSize());
  387:         tC.tableScroller.setPreferredSize(tC.tableScroller.getMinimumSize());
  388: 
  389:         paneDest.setMinimumSize(new Dimension(400, dim.height - topPanel2.getPreferredSize().height
  390:             - 100));
  391:         paneDest.setMaximumSize(tC.tableScroller.getMaximumSize());
  392:         paneDest.setPreferredSize(new Dimension(400, dim.height
  393:             - topPanel2.getPreferredSize().height - 100));
  394: 
  395:         paneDest.validate();
  396:         // tC.tableScroller.setPreferredSize(getSize());
  397:         // @TODO new sizeToFit method for listPanel table!!!
  398:         tC.sizeToFit(getWidth(), getHeight());
  399:         ((JPanel) getContentPane()).revalidate();
  400:         repaint();
  401:         setTitle("Filemaker 2 SQL Conversion Tool ");
  402: 
  403:       }
  404:     });
  405: 
  406:     setMenu();
  407:     // setSize(800, 600);
  408:     pack();
  409:     setLocation((screenSize.width - getWidth()) / 2, (screenSize.height - getHeight()) / 2);
  410:     // setVisible(true);
  411:     validate();
  412: 
  413:     // repaint();
  414: 
  415:   }
  416: 
  417:   /**
  418:    * 
  419:    */
  420:   public static void main(String[] args)
  421:   {
  422:     try
  423:     {
  424:       System.setErr(System.out);
  425:       //			Properties prop = System.getProperties();
  426:       //			Enumeration enume = prop.keys();
  427:       //			Enumeration enum2 = prop.elements();
  428:       //
  429:       //			while (enume.hasMoreElements())
  430:       //				System.out.println(enume.nextElement() + " " + enum2.nextElement());
  431:       //
  432:       if (System.getProperty("os.name").startsWith("W"))
  433:         javax.swing.UIManager
  434:             .setLookAndFeel(new com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
  435:       javax.swing.UIManager.put("Table.focusCellHighlightBorder",
  436:           new javax.swing.border.LineBorder(java.awt.Color.black));
  437:       javax.swing.UIManager
  438:           .put("Table.focusCellBackground", new java.awt.Color(227, 227, 227, 127));
  439: 
  440:       fmInstance = new FM2SQL();
  441:       fmInstance.table.tableModel.addTableModelListener(fmInstance);
  442:       fmInstance.setVisible(true);
  443: 
  444:     } catch (Exception e)
  445:     {
  446:       JOptionPane pane = new JOptionPane(e.getMessage() + "  \n URL: " + url,
  447:           JOptionPane.ERROR_MESSAGE);
  448: 
  449:       JDialog dialog = pane.createDialog(null, " Exception occured while connecting");
  450:       e.printStackTrace();
  451:       dialog.addWindowListener(new WindowAdapter() {
  452:         public void windowClosing(WindowEvent e)
  453:         {
  454:           System.exit(0);
  455:         }
  456:       });
  457:       dialog.addComponentListener(new ComponentAdapter() {
  458: 
  459:         public void componentHidden(ComponentEvent e)
  460:         {
  461: 
  462:           System.exit(0);
  463:         }
  464:       });
  465:       dialog.setVisible(true);
  466:     }
  467:   }
  468: 
  469:   public void actionPerformed(ActionEvent e)
  470:   {
  471:     String command = e.getActionCommand();
  472:     if (debug)
  473:       System.out.println("command " + command);
  474:     if (command.equals(aboutBox.getText()))
  475:     {
  476:       JOptionPane.showMessageDialog(fmInstance,Convert.versionID, "About FM2SQL",JOptionPane.INFORMATION_MESSAGE);
  477:     }
  478: 
  479:     if (command == "comboBoxEdited")
  480:     {
  481:       Object src = e.getSource();
  482:       if (src == sourceURLBox)
  483:       {
  484:         if (debug)
  485:           System.out.println("hey" + sourceURLBox.getSelectedItem());
  486:         Object insObj = sourceURLBox.getSelectedItem();
  487:         ((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(insObj);
  488: 
  489:         ((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(insObj, 0);
  490:         sourceURLBox.setSelectedItem(insObj);
  491:       } else if (src == destURLBox)
  492:       {
  493:         if (debug)
  494:           System.out.println("hey" + destURLBox.getSelectedItem());
  495:         // ((DefaultComboBoxModel)
  496:         // box4.getModel()).insertElementAt(box4.getSelectedItem(), 0);
  497:         try
  498:         {
  499:           String selected = (String) destURLBox.getSelectedItem();
  500:           destBean.setConnection(selected);
  501:           Vector catalogs = destBean.getCatalogs();
  502:           Vector urls = new Vector();
  503:           for (int i = 0; i < catalogs.size(); ++i)
  504:           {
  505:             urls
  506:                 .add(destBean.url.substring(0, destBean.url.lastIndexOf("/") + 1) + catalogs.get(i));
  507:           }
  508:           destURLBox.setModel(new DefaultComboBoxModel(urls));
  509:           destURLBox.setSelectedItem(selected);
  510:         } catch (Exception e5)
  511:         {
  512:         }
  513:       }
  514:     }
  515:     if (command == "comboBoxChanged")
  516:     {
  517:       try
  518:       {
  519:         // System.out.println("hallo " + (e.getSource() == box3));
  520:         Object src = e.getSource();
  521:         if (src == sourceURLBox && !noUserUpdate)
  522:         {
  523:           Thread thread = new Thread() {
  524:             public void run()
  525:             {
  526: 
  527:               try
  528:               {
  529:                 PasswordDialog dialog = new PasswordDialog(fmInstance, bean);
  530:                 dialog.setLocationRelativeTo(sourceURLBox);
  531:                 dialog.thread = Thread.currentThread();
  532:                 fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  533:                 fmInstance.setEnabled(false);
  534:                 dialog.setVisible(true);
  535:                 String url = sourceURLBox.getSelectedItem().toString();
  536:                 bean.url = (url != null) ? url : bean.url;
  537:                 bean.connection = null;
  538:                 bean.getConnection();
  539:                 tables = bean.getTableNames();
  540:                 fillTable();
  541:                 fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  542:                 fmInstance.setEnabled(true);
  543:                 // System.out.println("hallo" + tables + " ");
  544:               } catch (Exception e5)
  545:               {
  546:                 ByteArrayOutputStream b = new ByteArrayOutputStream();
  547:                 PrintStream stream = new PrintStream(b);
  548:                 e5.printStackTrace(stream);
  549:                 fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  550:                 fmInstance.setEnabled(true);
  551:                 Vector header = new Vector();
  552:                 header.add("no database");
  553:                 header.add("connection");
  554:                 Vector rows = new Vector();
  555:                 // rows.add(header);
  556:                 noDBUpdate = true;
  557:                 tC.tableModel.setDataVector(rows, header);
  558:                 tC.tableModel.setRowCount(20);
  559:                 tC.revalidate();
  560:                 tC.tableModel.fireTableDataChanged();
  561:                 noDBUpdate = false;
  562:                 showErrorDialog(b.toString(), "Error occured !");
  563:               }
  564:             }
  565:           };
  566:           thread.start();
  567:         } else if (src == destURLBox && !noUserUpdate)
  568:         {
  569:           Thread thread = new Thread() {
  570:             public void run()
  571:             {
  572: 
  573:               try
  574:               {
  575: 
  576:                 PasswordDialog dialog = new PasswordDialog(fmInstance, destBean);
  577:                 dialog.setLocationRelativeTo(destURLBox);
  578:                 dialog.thread = Thread.currentThread();
  579:                 fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  580:                 fmInstance.setEnabled(false);
  581:                 dialog.setVisible(true);
  582:                 destBean.setConnection((String) destURLBox.getSelectedItem());
  583:                 DefaultListModel model = new DefaultListModel();
  584:                 Vector tables = destBean.getTableNames();
  585:                 for (int j = 0; j < tables.size(); ++j)
  586:                   model.addElement(tables.get(j));
  587:                 // System.out.println("hallo" + tables + " ");
  588:                 tListDest.setModel(model);
  589:                 // System.out.println("hallo" + tables + " ");
  590:                 fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  591:                 fmInstance.setEnabled(true);
  592:               } catch (Exception e5)
  593:               {
  594:                 ByteArrayOutputStream b = new ByteArrayOutputStream();
  595:                 PrintStream stream = new PrintStream(b);
  596:                 e5.printStackTrace(stream);
  597:                 fmInstance.setEnabled(true);
  598:                 fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  599:                 DefaultListModel model = new DefaultListModel();
  600:                 model.addElement("no database connection");
  601:                 tListDest.setModel(model);
  602: 
  603:                 showErrorDialog(b.toString(), "Error occured !");
  604:               }
  605:             }
  606:           };
  607:           thread.start();
  608: 
  609:         }
  610:         setTitle("Filemaker 2 SQL Conversion Tool ");
  611:         // pack();
  612: 
  613:       } catch (Exception e4)
  614:       {
  615:         ByteArrayOutputStream b = new ByteArrayOutputStream();
  616:         PrintStream stream = new PrintStream(b);
  617:         e4.printStackTrace(stream);
  618:         showErrorDialog(b.toString(), "Open of table failed");
  619: 
  620:       }
  621:     }
  622:     if (command == "show Driver features")
  623:     {
  624:       ResultWindow result = new ResultWindow(this);
  625:       try
  626:       {
  627:         Vector[] vecs = bean.TestDB(bean.getConnection().getMetaData());
  628:         result.updateResult(vecs[0], vecs[1]);
  629:         // result.pack();
  630:         result.title = "Database features";
  631:         result.setVisible(true);
  632:         String name = result.writeResult();
  633:       } catch (Exception e2)
  634:       {
  635:       }
  636:     }
  637:     if (command.equals("Delimiter"))
  638:     {
  639:       new DelimiterDialog(fmInstance).setVisible(true);
  640:       // delimiter = JOptionPane.showInputDialog(fmInstance,"Enter delimiter
  641:       // String",delimiter);
  642: 
  643:     }
  644: 
  645:     if (command == "Convert Mode")
  646:     {
  647:       System.out.println("Convert Mode selected");
  648:       convert.setText("Convert Tables");
  649:       convert.setActionCommand("Convert Tables");
  650:       convert.setToolTipText("Normal table conversion  existing table will be deleted");
  651:       mode = Convert.DataBase.CONVERT_MODE;
  652:     }
  653:     if (command == "Append Mode")
  654:     {
  655:       System.out.println("Append Mode selected");
  656:       convert.setText("Append Tables");
  657:       convert.setActionCommand("Append Tables");
  658:       convert.setToolTipText("Appends data to an existing table");
  659: 
  660:       mode = Convert.DataBase.APPEND_MODE;
  661:     }
  662:     if (command == "Update Mode")
  663:     {
  664:       System.out.println("Update Mode selected");
  665:       convert.setText("Update Tables");
  666:       convert.setActionCommand("Update Tables");
  667:       convert.setToolTipText("Updates data that has been changed in source");
  668:       mode = Convert.DataBase.UPDATE_MODE;
  669:     }
  670:     if (command == "Delete Mode")
  671:     {
  672:       System.out.println("Delete Mode selected");
  673:       convert.setText("Delete Tables");
  674:       convert.setActionCommand("Delete Tables");
  675:       convert.setToolTipText("Deletes data that has been deleted in source");
  676:       mode = Convert.DataBase.DELETE_MODE;
  677:     }
  678:     if (command == "Synchronize Mode")
  679:     {
  680:       System.out.println("Synchronize Mode selected");
  681:       convert.setText("Synchronize Tables");
  682:       convert.setActionCommand("Synchronize Tables");
  683:       convert.setToolTipText("Synchronize data with destination table");
  684:       mode = Convert.DataBase.SYNCHRONIZE_MODE;
  685:     }
  686: 
  687:     if (command.equals("use NormanToUnicodeMapper"))
  688:     {
  689:       if (bean != null)
  690:         bean.setUseNormanToUnicodeMapper(useNormanToUnicodeMapper.isSelected());
  691:     }
  692:     // writing config
  693:     if (command.equals("save XML Config"))
  694:     {
  695:       if (configExportFileChooser == null)
  696:       {
  697:         configExportFileChooser = new JFileChooser();
  698:         configExportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
  699:         configExportFileChooser.setFileFilter(new XMLFilter());
  700:         configExportFileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
  701:         configExportFileChooser.addActionListener(new ActionListener() {
  702:           public void actionPerformed(ActionEvent e2)
  703:           {
  704:             System.out.println(e2.getActionCommand());
  705:             if (!e2.getActionCommand().toString().equals("ApproveSelection"))
  706:               return;
  707: 
  708:             Thread thread = new Thread() {
  709:               public void run()
  710:               {
  711:                 File configFile = configExportFileChooser.getSelectedFile();
  712:                 writeConfig(configFile.toString());
  713: 
  714:               }
  715:             };
  716:             thread.start();
  717: 
  718:           }
  719:         });
  720:       }
  721:       configExportFileChooser.rescanCurrentDirectory();
  722:       configExportFileChooser.showDialog(fmInstance, " Save ");
  723: 
  724:     }
  725:     if (command.equals("open XML Config"))
  726:     {
  727:       if (configImportFileChooser == null)
  728:       {
  729:         configImportFileChooser = new JFileChooser();
  730:         configImportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
  731:         configImportFileChooser.setFileFilter(new XMLFilter());
  732:         configImportFileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
  733:         configImportFileChooser.addActionListener(new ActionListener() {
  734:           public void actionPerformed(ActionEvent e2)
  735:           {
  736:             System.out.println(e2.getActionCommand());
  737:             if (!e2.getActionCommand().toString().equals("ApproveSelection"))
  738:               return;
  739: 
  740:             Thread thread = new Thread() {
  741:               public void run()
  742:               {
  743:                 File configFile = configImportFileChooser.getSelectedFile();
  744:                 readXMLConfig(configFile.toString());
  745: 
  746:               }
  747:             };
  748:             thread.start();
  749: 
  750:           }
  751:         });
  752:       }
  753:       configImportFileChooser.rescanCurrentDirectory();
  754:       configImportFileChooser.showDialog(fmInstance, " Open ");
  755: 
  756:     }
  757: 
  758:     if (command.equals("Convert Tables") || command.equals("Append Tables"))
  759:     {
  760: 
  761:       Thread thread = new Thread() {
  762:         public void run()
  763:         {
  764:           setEnabled(false);
  765:           convert();
  766:           setEnabled(true);
  767:         }
  768: 
  769:       };
  770:       thread.start();
  771:     }
  772:     if (command.equals("Update Tables"))
  773:     {
  774: 
  775:       Thread thread = new Thread() {
  776:         public void run()
  777:         {
  778:           setEnabled(false);
  779:           update();
  780:           setEnabled(true);
  781:         }
  782: 
  783:       };
  784:       thread.start();
  785:     }
  786:     if (command.equals("Delete Tables"))
  787:     {
  788: 
  789:       Thread thread = new Thread() {
  790:         public void run()
  791:         {
  792:           setEnabled(false);
  793:           delete();
  794:           setEnabled(true);
  795:         }
  796: 
  797:       };
  798:       thread.start();
  799:     }
  800:     if (command.equals("Synchronize Tables"))
  801:     {
  802: 
  803:       Thread thread = new Thread() {
  804:         public void run()
  805:         {
  806:           setEnabled(false);
  807:           synchronize();
  808:           setEnabled(true);
  809:         }
  810: 
  811:       };
  812:       thread.start();
  813:     }
  814: 
  815:     if (command.equals("show Tables"))
  816:     {
  817:       Thread thread = new Thread() {
  818:         public void run()
  819:         {
  820:           fmInstance.setEnabled(false);
  821:           boolean visible = showTable(1);
  822:           window.validate();
  823:           window.setVisible(visible);
  824:           fmInstance.setEnabled(true);
  825: 
  826:         }
  827:       };
  828:       thread.start();
  829:       // System.out.println("hello");
  830: 
  831:     }
  832:     if (command.equals("show Tables source"))
  833:     {
  834:       Thread thread = new Thread() {
  835:         public void run()
  836:         {
  837:           fmInstance.setEnabled(false);
  838:           boolean visible = showTable(0);
  839:           window.validate();
  840:           window.setVisible(visible);
  841:           fmInstance.setEnabled(true);
  842:         }
  843:       };
  844:       thread.start();
  845:       // System.out.println("hello"+thread);
  846: 
  847:     }
  848: 
  849:     if (command.equals("drop Tables"))
  850:     {
  851:       Thread thread = new Thread() {
  852:         public void run()
  853:         {
  854:           dropTable();
  855:         }
  856:       };
  857:       thread.start();
  858:     }
  859:     if (command.equals("Quit"))
  860:     {
  861:       bean.closeAllConnections();
  862:       destBean.closeAllConnections();
  863:       fmInstance.dispose();
  864:       System.exit(0);
  865: 
  866:     }
  867: 
  868:   }
  869: 
  870:   /**
  871:    * 
  872:    */
  873:   protected void synchronize()
  874:   {
  875:     Vector vectors[] = getListFromTable();
  876:     Convert.user = bean.user;
  877:     Convert.passwd = bean.passwd;
  878:     Convert.userDest = destBean.user;
  879:     Convert.passwdDest = destBean.passwd;
  880:     try
  881:     {
  882: 
  883:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  884:       fmInstance.setEnabled(false);
  885:       // TODO indexList vector weiter reichen
  886:       Convert.synchronize(bean.url, destURLBox.getSelectedItem().toString(), vectors[0],
  887:           vectors[1], vectors[2], vectors[3], vectors[4], mode, delimiter, new Vector());
  888: 
  889:       destBean.setConnection((String) destURLBox.getSelectedItem());
  890:       DefaultListModel model = new DefaultListModel();
  891:       tables = destBean.getTableNames();
  892:       for (int j = 0; j < tables.size(); ++j)
  893:         model.addElement(tables.get(j));
  894:       if (debug)
  895:         System.out.println("hallo" + tables + " ");
  896:       tListDest.setModel(model);
  897:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  898:     } catch (Exception e4)
  899:     {
  900:       ByteArrayOutputStream b = new ByteArrayOutputStream();
  901:       PrintStream stream = new PrintStream(b);
  902:       e4.printStackTrace(stream);
  903:       showErrorDialog(b.toString(), "Synchronize of table failed");
  904:       fmInstance.setEnabled(true);
  905:     }
  906: 
  907:   }
  908: 
  909:   /**
  910:    * Updates the content of source to destination and makes new table if
  911:    * necessary
  912:    */
  913: 
  914:   public void update()
  915:   {
  916:     Vector vectors[] = getListFromTable();
  917:     Convert.user = bean.user;
  918:     Convert.passwd = bean.passwd;
  919:     Convert.userDest = destBean.user;
  920:     Convert.passwdDest = destBean.passwd;
  921:     try
  922:     {
  923: 
  924:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  925:       fmInstance.setEnabled(false);
  926:       Convert.update(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1],
  927:           vectors[2], vectors[3], vectors[4], mode);
  928: 
  929:       destBean.setConnection((String) destURLBox.getSelectedItem());
  930:       DefaultListModel model = new DefaultListModel();
  931:       tables = destBean.getTableNames();
  932:       for (int j = 0; j < tables.size(); ++j)
  933:         model.addElement(tables.get(j));
  934:       if (debug)
  935:         System.out.println("hallo" + tables + " ");
  936:       tListDest.setModel(model);
  937:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  938:     } catch (Exception e4)
  939:     {
  940:       ByteArrayOutputStream b = new ByteArrayOutputStream();
  941:       PrintStream stream = new PrintStream(b);
  942:       e4.printStackTrace(stream);
  943:       showErrorDialog(b.toString(), "Update of table failed");
  944:       fmInstance.setEnabled(true);
  945:     }
  946: 
  947:   }
  948: 
  949:   public void delete()
  950:   {
  951:     Vector vectors[] = getListFromTable();
  952:     Convert.user = bean.user;
  953:     Convert.passwd = bean.passwd;
  954:     Convert.userDest = destBean.user;
  955:     Convert.passwdDest = destBean.passwd;
  956:     try
  957:     {
  958: 
  959:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  960:       fmInstance.setEnabled(false);
  961:       Convert.delete(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1],
  962:           vectors[2], vectors[3], vectors[4], mode);
  963: 
  964:       destBean.setConnection((String) destURLBox.getSelectedItem());
  965:       DefaultListModel model = new DefaultListModel();
  966:       tables = destBean.getTableNames();
  967:       for (int j = 0; j < tables.size(); ++j)
  968:         model.addElement(tables.get(j));
  969:       if (debug)
  970:         System.out.println("hallo" + tables + " ");
  971:       tListDest.setModel(model);
  972:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  973:     } catch (Exception e4)
  974:     {
  975:       ByteArrayOutputStream b = new ByteArrayOutputStream();
  976:       PrintStream stream = new PrintStream(b);
  977:       e4.printStackTrace(stream);
  978:       showErrorDialog(b.toString(), "Delete of table failed");
  979:       fmInstance.setEnabled(true);
  980:     }
  981: 
  982:   }
  983: 
  984:   /**
  985:    * Copys the content of source to destination and makes new table if necessary
  986:    */
  987:   public void convert()
  988:   {
  989: 
  990:     Vector vectors[] = getListFromTable();
  991:     Convert.user = bean.user;
  992:     Convert.passwd = bean.passwd;
  993:     Convert.userDest = destBean.user;
  994:     Convert.passwdDest = destBean.passwd;
  995:     try
  996:     {
  997:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  998:       fmInstance.setEnabled(false);
  999:       Convert.convert(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1],
 1000:           vectors[2], vectors[3], vectors[4], mode, delimiter);
 1001:       destBean.setConnection((String) destURLBox.getSelectedItem());
 1002:       DefaultListModel model = new DefaultListModel();
 1003:       tables = destBean.getTableNames();
 1004:       for (int j = 0; j < tables.size(); ++j)
 1005:         model.addElement(tables.get(j));
 1006:       if (debug)
 1007:         System.out.println("hallo" + tables + " ");
 1008:       tListDest.setModel(model);
 1009:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1010:     } catch (Exception e4)
 1011:     {
 1012:       ByteArrayOutputStream b = new ByteArrayOutputStream();
 1013:       PrintStream stream = new PrintStream(b);
 1014:       e4.printStackTrace(stream);
 1015:       showErrorDialog(b.toString(), "Conversion of table failed");
 1016:       fmInstance.setEnabled(true);
 1017:     }
 1018:   }
 1019: 
 1020:   public void writeConfig(String file)
 1021:   {
 1022:     fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 1023:     fmInstance.setEnabled(false);
 1024: 
 1025:     Vector vectors[] = getListFromTable();
 1026:     if (convertItem.isSelected())
 1027:       mode = Convert.DataBase.CONVERT_MODE;
 1028:     else if (appendItem.isSelected())
 1029:       mode = Convert.DataBase.APPEND_MODE;
 1030:     else if (updateItem.isSelected())
 1031:       mode = Convert.DataBase.UPDATE_MODE;
 1032:     else if (deleteItem.isSelected())
 1033:       mode = Convert.DataBase.DELETE_MODE;
 1034:     else if (synchronizeItem.isSelected())
 1035:       mode = Convert.DataBase.SYNCHRONIZE_MODE;
 1036: 
 1037:     // TODO add id vector in table and write it out
 1038:     Convert.DataBase source = new Convert.DataBase(bean, vectors[0], vectors[1], vectors[2],
 1039:         vectors[3], vectors[4], mode);
 1040:     Convert.DataBase destination = new Convert.DataBase(destBean, new Vector(), new Vector(),
 1041:         new Vector(), new Vector(), new Vector(), -1);
 1042:     source.delimiter = delimiter;
 1043:     source.useNormanToUnicodeMapper = useNormanToUnicodeMapper.isSelected();
 1044:     try
 1045:     {
 1046:       Convert.writeConfig(file, source, destination);
 1047:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1048:       fmInstance.setEnabled(true);
 1049: 
 1050:     } catch (Exception e)
 1051:     {
 1052:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1053:       fmInstance.setEnabled(true);
 1054: 
 1055:       ByteArrayOutputStream b = new ByteArrayOutputStream();
 1056:       PrintStream stream = new PrintStream(b);
 1057:       e.printStackTrace(stream);
 1058:       showErrorDialog(b.toString(), "Error while writing xml config  !");
 1059:     }
 1060: 
 1061:   }
 1062: 
 1063:   public void readXMLConfig(String file)
 1064:   {
 1065: 
 1066:     try
 1067:     {
 1068:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 1069:       fmInstance.setEnabled(false);
 1070:       StringBuffer sb = Convert.readXMLFile(file);
 1071:       Vector databases = Convert.getXMLConfig(sb);
 1072:       Convert.DataBase destBase = (Convert.DataBase) databases.lastElement();
 1073:       // destBase.bean.getConnection();
 1074:       noUserUpdate = true;
 1075:       destBean = destBase.bean;
 1076:       Object destObj = destBean.url;
 1077:       ((DefaultComboBoxModel) destURLBox.getModel()).removeElement(destObj);
 1078:       ((DefaultComboBoxModel) destURLBox.getModel()).insertElementAt(destObj, 0);
 1079:       destURLBox.setSelectedItem(destObj);
 1080:       databases.remove(destBase);
 1081:       for (Iterator iter = databases.iterator(); iter.hasNext();)
 1082:       {
 1083:         Convert.DataBase database = (Convert.DataBase) iter.next();
 1084: 
 1085:         if (database.mode == Convert.DataBase.CONVERT_MODE)
 1086:         {
 1087:           convertItem.doClick();
 1088:         } else if (database.mode == Convert.DataBase.APPEND_MODE)
 1089:         {
 1090:           appendItem.doClick();
 1091:         } else if (database.mode == Convert.DataBase.UPDATE_MODE)
 1092:         {
 1093:           updateItem.doClick();
 1094:         } else if (database.mode == Convert.DataBase.DELETE_MODE)
 1095:         {
 1096:           deleteItem.doClick();
 1097:         } else if (database.mode == Convert.DataBase.SYNCHRONIZE_MODE)
 1098:         {
 1099:           synchronizeItem.doClick();
 1100:         }
 1101: 
 1102:         delimiter = database.delimiter;
 1103:         database.bean.getConnection();
 1104: 
 1105:         bean = database.bean;
 1106:         if (bean.isUseNormanToUnicodeMapper())
 1107:           useNormanToUnicodeMapper.setSelected(true);
 1108:         Object obj = bean.url;
 1109:         ((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(obj);
 1110:         ((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(obj, 0);
 1111:         sourceURLBox.setSelectedItem(obj);
 1112:         fillTable();
 1113:         Vector tables = database.bean.getTableNames();
 1114:         Collections.sort(tables, String.CASE_INSENSITIVE_ORDER);
 1115:         int[] indices = new int[database.tables.size()];
 1116:         for (int i = 0; i < database.tables.size(); ++i)
 1117:         {
 1118:           String table = (String) database.tables.get(i);
 1119:           int index = tables.indexOf(table);
 1120:           if (index < 0)
 1121:             throw new RuntimeException("Error table \"" + table
 1122:                 + "\" does no longer exist\n at server " + bean.url
 1123:                 + "\n or you mispelled the tablename.");
 1124:           noDBUpdate = true;
 1125:           tC.tableModel.setValueAt(
 1126:               new TableComponent.SQLCommand(database.selects.get(i).toString()), index,
 1127:               SELECT_INDEX);
 1128: 
 1129:           String create = database.creates.get(i).toString();
 1130:           tC.tableModel.setValueAt(new TableComponent.SQLCommand(create.equals("") ? create
 1131:               : "           " + create), index, CREATE_INDEX);
 1132:           // tC.tableModel.setValueAt(new
 1133:           // TableComponent.SQLCommand(bean.ids.get(i).toString()),index,ID_INDEX);
 1134: 
 1135:           Object comboBox = tC.tableModel.getValueAt(index, LAYOUT_INDEX);
 1136:           Object idcomboBox = tC.tableModel.getValueAt(index, ID_INDEX);
 1137: 
 1138:           indices[i] = index;
 1139:           if (comboBox != null)
 1140:           {
 1141:             String layout = database.layouts.get(i).toString();
 1142:             ((JComboBox) comboBox).setSelectedItem(layout);
 1143:             if (layout != "")
 1144:             {
 1145:               bean.makeQuery("select * from" + bean.getQC() + table + bean.getQC() + " layout "
 1146:                   + bean.getQC() + layout + bean.getQC(), 1);
 1147: 
 1148:               Vector idVec = bean.getColumnNames();
 1149:               if (idVec == null)
 1150:                 idVec = new Vector();
 1151:               idVec.add(0, "");
 1152:               ((JComboBox) idcomboBox).setModel(new DefaultComboBoxModel(idVec));
 1153:             }
 1154: 
 1155:           }
 1156:           if (idcomboBox != null)
 1157:             ((JComboBox) idcomboBox).setSelectedItem(bean.ids.get(i));
 1158:           tC.tableModel.fireTableDataChanged();
 1159:           noDBUpdate = false;
 1160:           noUserUpdate = false;
 1161: 
 1162:         }
 1163:         // add Selections
 1164:         ListSelectionModel lm = tC.table.getSelectionModel();
 1165:         for (int i = 0; i < indices.length; ++i)
 1166:         {
 1167:           lm.addSelectionInterval(indices[i], indices[i]);
 1168:           tC.tableModel.setValueAt(Boolean.TRUE, indices[i], STATUS_INDEX);
 1169:         }
 1170:         destBean.getConnection();
 1171: 
 1172:         DefaultListModel model = new DefaultListModel();
 1173:         tables = destBean.getTableNames();
 1174:         for (int j = 0; j < tables.size(); ++j)
 1175:           model.addElement(tables.get(j));
 1176:         // System.out.println("hallo" + tables + " ");
 1177:         tListDest.setModel(model);
 1178:         fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1179:         fmInstance.setEnabled(true);
 1180: 
 1181:       }
 1182: 
 1183:     } catch (Exception e)
 1184:     {
 1185:       noUserUpdate = false;
 1186:       noDBUpdate = false;
 1187:       fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1188:       fmInstance.setEnabled(true);
 1189: 
 1190:       ByteArrayOutputStream b = new ByteArrayOutputStream();
 1191:       PrintStream stream = new PrintStream(b);
 1192:       e.printStackTrace(stream);
 1193:       showErrorDialog(b.toString(), "Error while reading xml config  !");
 1194:     }
 1195: 
 1196:   }
 1197: 
 1198:   public boolean showTable(int list)
 1199:   {
 1200:     ProgressDialog dialog = new ProgressDialog(fm, bean);
 1201:     dialog.setTitle("Preparing tables to be displayed");
 1202:     dialog.thread = Thread.currentThread();
 1203:     dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 1204:     fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 1205:     String query = new String();
 1206:     Object[] objs = tListDest.getSelectedValues();
 1207:     Vector[] vectors = (list == 0) ? getListFromTable() : null;
 1208:     Vector tables = (list == 0) ? vectors[0] : new Vector();
 1209:     if (list > 0)
 1210:       for (int i = 0; i < objs.length; ++i)
 1211:       {
 1212:         if (debug)
 1213:           System.out.println(objs[i]);
 1214:         tables.add(objs[i]);
 1215:       }
 1216:     if (window != null)
 1217:       window.dispose();
 1218:     if (windowDest != null)
 1219:       windowDest.dispose();
 1220: 
 1221:     window = new MultiResultWindow(fm);
 1222:     if (list > 0)
 1223:     {
 1224:       windowDest = new MultiResultWindow(fm);
 1225:       window = windowDest;
 1226:     }
 1227:     dialog.setLocation(FM2SQL.fmInstance.getLocationOnScreen().x
 1228:         + (FM2SQL.fmInstance.getWidth() - 500) / 2, FM2SQL.fmInstance.getLocationOnScreen().y
 1229:         + (FM2SQL.fmInstance.getHeight() - 250) / 2);
 1230:     dialog.setSize(500, 250);
 1231:     if (!tables.isEmpty())
 1232:       dialog.setVisible(true);
 1233:     dialog.title.setText("Preparing tables to be diplayed");
 1234:     for (int i = 0; i < tables.size(); ++i)
 1235:     {
 1236:       dialog.table.setText("Getting table " + tables.get(i));
 1237:       dialog.status.setText("Table " + (i + 1) + " of " + tables.size());
 1238: 
 1239:       if (list == 0)
 1240:         query = "select * from " + bean.getQC() + tables.get(i).toString() + bean.getQC();
 1241:       else
 1242:         query = "select * from " + destBean.getQC() + tables.get(i).toString() + destBean.getQC();
 1243:       if (list == 0)
 1244:         query = vectors[2].get(i).toString();
 1245:       if (list == 0 && vectors[1].get(i) != null)
 1246:         if (vectors[1].get(i).toString() != "")
 1247:         {
 1248:           String layout = " layout " + bean.getQC() + vectors[1].get(i).toString() + bean.getQC();
 1249:           String name = tables.get(i).toString();
 1250:           StringBuffer queryLayout = new StringBuffer(query);
 1251:           queryLayout.insert(queryLayout.indexOf(name) + name.length() + 1, " " + layout);
 1252:           query = queryLayout.toString();
 1253:         }
 1254:       if (debug)
 1255:         showErrorDialog("query in show tables is " + query, "Hello");
 1256:       window.title = " Table ;-) " + (String) tables.get(i);
 1257:       // break;
 1258:       // } else
 1259:       // window.title = "Error! - No valid tablename found";
 1260: 
 1261:       try
 1262:       {
 1263:         if ((query.toLowerCase().indexOf("insert") >= 0)
 1264:             || (query.toLowerCase().indexOf("delete") >= 0)
 1265:             || (query.toLowerCase().indexOf("alter") >= 0)
 1266:             || (query.toLowerCase().indexOf("update") >= 0))
 1267:         {
 1268:           Statement stm = (list > 0) ? destBean.getConnection().createStatement() : bean
 1269:               .getConnection().createStatement();
 1270:           stm.executeUpdate(query);
 1271:           Vector vec = new Vector();
 1272:           Vector vec2 = new Vector();
 1273:           Vector vec3 = new Vector();
 1274:           vec2.add(query);
 1275:           vec3.add(vec2);
 1276:           vec.add("Insert, update, etc done! No results available");
 1277:           // vec.add("no Results were produced");
 1278: 
 1279:           window.updateResult(vec3, vec);
 1280:           // window.pack();
 1281:           // window.setVisible(true);
 1282: 
 1283:         } else
 1284:         {
 1285:           Vector[] vecs = (list > 0) ? destBean.getQueryData(query, dialog, 50) : bean
 1286:               .getQueryData(query, dialog, 50);
 1287:           if (vecs[1].isEmpty())
 1288:             throw new Exception("Wrong columnname or Empty Layout");
 1289:           window.updateResult(vecs[0], vecs[1]);
 1290: 
 1291:           // window.pack();
 1292:           // String name = window.writeResult();
 1293:           // appendLog(window.title, name);
 1294:         }
 1295: 
 1296:         // window.setVisible(true);
 1297: 
 1298:       } catch (Exception e)
 1299:       {
 1300:         System.out.println("Exception occured");
 1301:         e.printStackTrace();
 1302:         Vector vec = new Vector();
 1303:         Vector vec2 = new Vector();
 1304:         Vector vec3 = new Vector();
 1305:         vec2.add(e.getMessage());
 1306:         vec3.add(vec2);
 1307:         vec.add("Exception occured! No results available");
 1308:         // vec.add("no Results were produced");
 1309: 
 1310:         window.updateResult(vec3, vec);
 1311:         // window.pack();
 1312:         // window.setVisible(true);
 1313:         fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1314: 
 1315:       }
 1316:     } // to for
 1317:     window.pack();
 1318:     window.setSize(700, 600);
 1319: 
 1320:     window.oldTabCount = 10000;
 1321:     dialog.dispose();
 1322:     fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1323: 
 1324:     return !tables.isEmpty();
 1325: 
 1326:   }
 1327: 
 1328:   public void dropTable()
 1329:   {
 1330:     String query = new String();
 1331:     Object[] objs = tListDest.getSelectedValues();
 1332:     Vector tables = new Vector();
 1333:     for (int i = 0; i < objs.length; ++i)
 1334:     {
 1335:       System.out.println(objs[i]);
 1336:       tables.add(objs[i]);
 1337:     }
 1338: 
 1339:     for (int i = 0; i < tables.size(); ++i)
 1340:     {
 1341: 
 1342:       query = "drop table " + destBean.getQC() + tables.get(i) + destBean.getQC();
 1343: 
 1344:       try
 1345:       {
 1346:         Statement stm = destBean.getConnection().createStatement();
 1347:         stm.executeUpdate(query);
 1348:       } catch (Exception e)
 1349:       {
 1350:         ByteArrayOutputStream b = new ByteArrayOutputStream();
 1351:         PrintStream stream = new PrintStream(b);
 1352:         e.printStackTrace(stream);
 1353:         showErrorDialog(b.toString(), "Open of table failed");
 1354: 
 1355:       }
 1356:     } // to for
 1357:     try
 1358:     {
 1359:       destBean.setConnection((String) destURLBox.getSelectedItem());
 1360:       DefaultListModel model = new DefaultListModel();
 1361:       tables = destBean.getTableNames();
 1362:       for (int j = 0; j < tables.size(); ++j)
 1363:         model.addElement(tables.get(j));
 1364:       System.out.println("hallo" + tables + " ");
 1365:       tListDest.setModel(model);
 1366:     } catch (Exception e4)
 1367:     {
 1368:     }
 1369: 
 1370:   }
 1371: 
 1372:   /**
 1373:    * invoked then the user changes the table or the tableModel changes
 1374:    */
 1375:   public void tableChanged(TableModelEvent e)
 1376:   {
 1377:     // if (e.getType() == e.INSERT)
 1378:     // System.out.println("Insert done");
 1379:     // if (e.getType() == e.UPDATE)
 1380:     // System.out.println("Update done");
 1381:     // if (e.getType() == e.DELETE)
 1382:     // System.out.println("Delete done");
 1383:     if (e.getType() == TableModelEvent.UPDATE && !noDBUpdate)
 1384:     {
 1385:       int row = e.getFirstRow(), col = e.getColumn();
 1386:       System.out.println("Got in " + row + " " + col);
 1387:       TableModel model = (TableModel) e.getSource();
 1388:       String columnName = model.getColumnName(col);
 1389:       Object test = model.getValueAt(row, col);
 1390:       String idVal = (test == null) ? "" : test.toString();
 1391:       String value = (test == null) ? "" : test.toString();
 1392:       ;
 1393: 
 1394:       System.out.println("Got in " + columnName + " " + idVal);
 1395:       try
 1396:       {
 1397:         if (columnName.equals("select") || columnName.equals("Layouts"))
 1398:         {
 1399:           String table = model.getValueAt(row, NAME_INDEX).toString();
 1400:           String layout = (model.getValueAt(row, LAYOUT_INDEX) != null) ? ((JComboBox) model
 1401:               .getValueAt(row, LAYOUT_INDEX)).getSelectedItem().toString() : "";
 1402:           String query = model.getValueAt(row, SELECT_INDEX).toString();
 1403:           String create = model.getValueAt(row, CREATE_INDEX).toString();
 1404:           String id = (model.getValueAt(row, ID_INDEX) != null) ? ((JComboBox) model.getValueAt(
 1405:               row, ID_INDEX)).getSelectedItem().toString() : "";
 1406: 
 1407:           System.out.println("table" + table + " layout " + layout + " query " + query);
 1408:           if (!create.equals(""))
 1409:           {
 1410:             Object[] options =
 1411:             { "Yes", "No" };
 1412:             int option = showDialog("Create Statement not empty! Do you want to overwrite?",
 1413:                 "create statement", options);
 1414:             if (option == 0)
 1415:               model.setValueAt(createStatement(table, destBean, layout, query), row, CREATE_INDEX);
 1416:           }
 1417:           if (columnName.equals("Layouts"))
 1418:           {
 1419: 
 1420:             bean.makeQuery("select * from" + bean.getQC() + table + bean.getQC() + " layout "
 1421:                 + bean.getQC() + layout + bean.getQC(), 1);
 1422: 
 1423:             Vector idVec = bean.getColumnNames();
 1424:             if (idVec == null)
 1425:               idVec = new Vector();
 1426:             idVec.add(0, "");
 1427:             JComboBox box = ((JComboBox) model.getValueAt(row, ID_INDEX));
 1428:             box.setModel(new DefaultComboBoxModel(idVec));
 1429:             box.setSelectedItem(id);
 1430: 
 1431:             tC.tableModel.fireTableCellUpdated(row, ID_INDEX);
 1432:           }
 1433: 
 1434:         }
 1435:         /*
 1436:          * Statement stm = bean.getConnection().createStatement(); //
 1437:          * stm.executeUpdate("DELETE FROM \""+fm.tables.get(0)+"\" WHERE
 1438:          * \"erstellt von\"='rogo') ");
 1439:          * 
 1440:          * if (idVal == "") stm.executeUpdate("INSERT INTO " + DBBean.quoteChar +
 1441:          * box.getSelectedItem() + DBBean.quoteChar + " (" + DBBean.quoteChar +
 1442:          * columnName + DBBean.quoteChar + ") VALUES ('" + value + "') "); else
 1443:          * stm.executeUpdate( "UPDATE " + DBBean.quoteChar +
 1444:          * box.getSelectedItem() + DBBean.quoteChar + " SET " + DBBean.quoteChar +
 1445:          * columnName + DBBean.quoteChar + "='" + value + "' WHERE ID='" + idVal + "'
 1446:          * ");
 1447:          */
 1448:       } catch (Exception e2)
 1449:       {
 1450:         fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1451:         ByteArrayOutputStream b = new ByteArrayOutputStream();
 1452:         PrintStream stream = new PrintStream(b);
 1453:         e2.printStackTrace(stream);
 1454:         showErrorDialog(b.toString(), "Error while updating table  !");
 1455:       }
 1456:     }
 1457:   }
 1458: 
 1459:   /**
 1460:    * initialize the menubar
 1461:    */
 1462:   private void setMenu()
 1463:   {
 1464:     JMenuBar menubar = new JMenuBar();
 1465:     JMenu menu = new JMenu("File");
 1466:     menu.setMnemonic('F');
 1467:     JMenuItem item = new JMenuItem("open XML Config");
 1468:     item.setToolTipText("opens a XML config file for batch conversion");
 1469:     item.setMnemonic('i');
 1470:     item.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_DOWN_MASK));
 1471: 
 1472:     item.addActionListener(fm);
 1473:     menu.add(item);
 1474:     item = new JMenuItem("save XML Config");
 1475:     item.setToolTipText("saves the current selections in an XML config file for batch conversion");
 1476:     item.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_DOWN_MASK));
 1477:     item.setMnemonic('x');
 1478: 
 1479:     item.addActionListener(fm);
 1480:     menu.add(item);
 1481:     item = new JMenuItem("Quit");
 1482:     item.setMnemonic('Q');
 1483:     item.setToolTipText("Quits the application");
 1484:     item.setAccelerator(KeyStroke.getKeyStroke('Q', InputEvent.CTRL_DOWN_MASK));
 1485:     item.addActionListener(fm);
 1486:     menu.add(item);
 1487: 
 1488:     menubar.add(menu);
 1489:     menu = new JMenu("Options");
 1490:     menu.setMnemonic('O');
 1491: 
 1492:     ButtonGroup bgrp = new ButtonGroup();
 1493:     convertItem = new JCheckBoxMenuItem("Convert Mode");
 1494:     convertItem.setToolTipText("Normal table conversion  existing table will be deleted");
 1495:     convertItem.addActionListener(fm);
 1496: 
 1497:     bgrp.add(convertItem);
 1498: 
 1499:     menu.add(convertItem);
 1500:     menubar.add(menu);
 1501: 
 1502:     appendItem = new JCheckBoxMenuItem("Append Mode");
 1503:     appendItem.setToolTipText("Appends data to an existing table");
 1504:     appendItem.addActionListener(fm);
 1505: 
 1506:     bgrp.add(appendItem);
 1507: 
 1508:     menu.add(appendItem);
 1509:     menubar.add(menu);
 1510: 
 1511:     updateItem = new JCheckBoxMenuItem("Update Mode");
 1512:     updateItem.setToolTipText("Updates data in an existing table");
 1513:     updateItem.addActionListener(fm);
 1514: 
 1515:     bgrp.add(updateItem);
 1516: 
 1517:     menu.add(updateItem);
 1518:     deleteItem = new JCheckBoxMenuItem("Delete Mode");
 1519:     deleteItem
 1520:         .setToolTipText("Deletes data in an existing table \n that has been deleted in source table");
 1521:     deleteItem.addActionListener(fm);
 1522: 
 1523:     bgrp.add(deleteItem);
 1524: 
 1525:     menu.add(deleteItem);
 1526:     synchronizeItem = new JCheckBoxMenuItem("Synchronize Mode");
 1527:     synchronizeItem
 1528:         .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");
 1529:     synchronizeItem.addActionListener(fm);
 1530: 
 1531:     bgrp.add(synchronizeItem);
 1532: 
 1533:     menu.add(synchronizeItem);
 1534:     useNormanToUnicodeMapper = new JCheckBoxMenuItem("use NormanToUnicodeMapper");
 1535:     useNormanToUnicodeMapper
 1536:         .setToolTipText("maps characters in norman encoding to unicode characters");
 1537:     useNormanToUnicodeMapper.addActionListener(fm);
 1538:     menu.add(useNormanToUnicodeMapper);
 1539: 
 1540:     menubar.add(menu);
 1541:     item = new JMenuItem("show Driver features");
 1542:     item.setToolTipText("shows the features of the selected driver");
 1543:     item.addActionListener(fm);
 1544:     menu.add(item);
 1545:     menubar.add(menu);
 1546:     delimiterItem = new JMenuItem("Delimiter");
 1547:     delimiterItem.setToolTipText("Delimiter for FM Arrayfields");
 1548:     delimiterItem.addActionListener(fm);
 1549:     menu.add(delimiterItem);
 1550:     menubar.add(menu);
 1551: 
 1552:     // item.addActionListener(fm);
 1553:     // menu.add(item);
 1554: 
 1555:     menubar.add(menu);
 1556: 
 1557:     menu = new JMenu("About");
 1558:     menu.setMnemonic('A');
 1559:     aboutBox = new JMenuItem("about FM2SQL");
 1560:     aboutBox.addActionListener(fm);
 1561:     menu.add(aboutBox);
 1562:     menubar.add(menu);
 1563: 
 1564:     menu.setBackground(fm.getBackground());
 1565:     menubar.setBackground(fm.getBackground());
 1566:     convertItem.doClick();
 1567: 
 1568:     setJMenuBar(menubar);
 1569:   }
 1570: 
 1571:   /**
 1572:    * open the log file (index.html)
 1573:    */
 1574: 
 1575:   public static void openLog() throws Exception
 1576:   {
 1577: 
 1578:     StringBuffer buff = new StringBuffer();
 1579:     buff.append("<html>");
 1580:     buff.append("<head>");
 1581:     buff.append("\n<title>");
 1582:     buff.append("FileMaker Test");
 1583:     buff.append("</title>\n");
 1584:     buff.append("</head>\n");
 1585: 
 1586:     buff.append("<body>\n");
 1587:     buff.append("<center>\n");
 1588:     buff.append("\n<h3>");
 1589:     buff.append("FileMaker Test");
 1590:     buff.append("</h3>\n");
 1591: 
 1592:     logFile.write(TableComponent.convertUml(buff).toString());
 1593:     logFile.flush();
 1594:   }
 1595: 
 1596:   /**
 1597:    * Append one entry to the log file(index.html)
 1598:    */
 1599:   public static void appendLog(String entry, String name) throws Exception
 1600:   {
 1601:     logFile.write("<a href=\"./" + name.substring(name.lastIndexOf("/") + 1) + "\">");
 1602:     logFile.write(entry + "</a>");
 1603:     logFile.write("<br>\n<br>\n");
 1604:     logFile.flush();
 1605:   }
 1606: 
 1607:   /**
 1608:    * closes the log file invoked then the application closes
 1609:    */
 1610:   public static void closeLog() throws Exception
 1611:   {
 1612:     logFile.write("\n</body>");
 1613:     logFile.write("\n</html>");
 1614: 
 1615:     logFile.close();
 1616:   }
 1617: 
 1618:   public static void showErrorDialog(String message, String title)
 1619:   {
 1620:     JDialog dialog = new JDialog(fmInstance);
 1621:     dialog.setTitle(title);
 1622:     JTextArea text = new JTextArea();
 1623:     JScrollPane scroller = new JScrollPane(text);
 1624:     dialog.getContentPane().add(scroller);
 1625:     text.append(message);
 1626:     dialog.setSize(600, 300);
 1627:     dialog.setLocationRelativeTo(fmInstance);
 1628:     dialog.setVisible(true);
 1629:     // JOptionPane.showMessageDialog(null, message, title,
 1630:     // JOptionPane.ERROR_MESSAGE);
 1631:   }
 1632: 
 1633:   public static class ProgressDialog extends JDialog
 1634:   {
 1635:     JLabel table = new JLabel("    ");
 1636:     JLabel status = new JLabel("    ");
 1637:     JLabel title = new JLabel("     ");
 1638:     JPanel content = new JPanel();
 1639:     JPanel titlePanel = new JPanel();
 1640:     JPanel labelPanel = new JPanel();
 1641:     JPanel statusPanel = new JPanel();
 1642:     JPanel buttonPanel = new JPanel();
 1643: 
 1644:     JProgressBar progress = new JProgressBar();
 1645:     JButton cancel = new JButton("Cancel");
 1646:     Thread thread;
 1647:     DBBean bean;
 1648: 
 1649:     public ProgressDialog(JFrame frame, DBBean bean)
 1650:     {
 1651:       super(frame);
 1652:       this.bean = bean;
 1653: 
 1654:       content = new JPanel(true);
 1655:       // content.setBorder(BorderFactory.createRaisedBevelBorder());
 1656:       content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
 1657:       title = new JLabel("Progress of conversion");
 1658:       title.setHorizontalTextPosition(SwingConstants.CENTER);
 1659:       titlePanel.add(title);
 1660:       buttonPanel.add(cancel);
 1661:       // content.add(titlePanel);
 1662:       content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
 1663:       content.add(labelPanel);
 1664:       content.add(new JLabel(""));
 1665:       content.add(progress);
 1666:       content.add(statusPanel);
 1667:       content.add(buttonPanel);
 1668:       content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
 1669:       labelPanel.add(table);
 1670:       statusPanel.add(status);
 1671:       getContentPane().add(titlePanel, "North");
 1672:       getContentPane().add(content, "Center");
 1673:       this.addWindowListener(new WindowAdapter() {
 1674:         public void windowClosing(WindowEvent e)
 1675:         {
 1676:           cancel.doClick();
 1677:         }
 1678:       });
 1679: 
 1680:       cancel.addActionListener(new ActionListener() {
 1681:         public void actionPerformed(ActionEvent e)
 1682:         {
 1683:           fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1684:           fmInstance.setEnabled(true);
 1685:           setVisible(false);
 1686:           try
 1687:           {
 1688:             ProgressDialog.this.bean.getConnection().close();
 1689:           } catch (SQLException e1)
 1690:           {
 1691:             // TODO Auto-generated catch block
 1692:             e1.printStackTrace();
 1693:           } catch (Exception e1)
 1694:           {
 1695:             // TODO Auto-generated catch block
 1696:             e1.printStackTrace();
 1697:           }
 1698:           thread.stop();
 1699:         }
 1700:       });
 1701:       pack();
 1702: 
 1703:     }
 1704: 
 1705:   }
 1706: 
 1707:   public static class DelimiterDialog extends JDialog
 1708:   {
 1709:     JLabel table = new JLabel("    ");
 1710:     JLabel status = new JLabel("    ");
 1711:     JLabel title = new JLabel("     ");
 1712:     JPanel content = new JPanel();
 1713:     JPanel titlePanel = new JPanel();
 1714:     JPanel delimiterPanel = new JPanel();
 1715:     JPanel buttonPanel = new JPanel();
 1716:     JTextField delimiter = new JTextField(10);
 1717: 
 1718:     JButton cancel = new JButton("Cancel");
 1719:     JButton ok = new JButton("Ok");
 1720:     Thread thread;
 1721: 
 1722:     public DelimiterDialog(JFrame frame)
 1723:     {
 1724:       super(frame);
 1725:       setTitle("Delimiter Editor");
 1726:       setModal(true);
 1727:       content = new JPanel(true);
 1728:       delimiter.setText(fmInstance.delimiter);
 1729:       ActionListener al = new ActionListener() {
 1730:         public void actionPerformed(ActionEvent e)
 1731:         {
 1732:           fmInstance.delimiter = parseDelimiter(delimiter.getText());
 1733:           setVisible(false);
 1734:         }
 1735: 
 1736:       };
 1737:       this.addWindowListener(new WindowAdapter() {
 1738:         public void windowClosing(WindowEvent e)
 1739:         {
 1740:           cancel.doClick();
 1741:         }
 1742:       });
 1743: 
 1744:       // delimiter.setText(fmInstance.delimiter);
 1745:       delimiter.addActionListener(al);
 1746:       content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
 1747:       title = new JLabel("Enter Delimiter ");
 1748:       title.setHorizontalTextPosition(SwingConstants.CENTER);
 1749:       titlePanel.add(title);
 1750:       buttonPanel.add(ok);
 1751:       buttonPanel.add(cancel);
 1752:       content.add(titlePanel);
 1753:       content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
 1754: 
 1755:       content.add(new JLabel(""));
 1756:       content.add(delimiterPanel);
 1757:       content.add(buttonPanel);
 1758:       content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
 1759: 
 1760:       delimiterPanel.add(new JLabel("Delimiter:  "));
 1761:       delimiterPanel.add(delimiter);
 1762:       getContentPane().add(titlePanel, "North");
 1763:       getContentPane().add(content, "Center");
 1764:       ok.addActionListener(al);
 1765:       cancel.addActionListener(new ActionListener() {
 1766:         public void actionPerformed(ActionEvent e)
 1767:         {
 1768:           fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1769:           fmInstance.setEnabled(true);
 1770:           setVisible(false);
 1771:           // thread.stop();
 1772:         }
 1773: 
 1774:       });
 1775:       pack();
 1776:       setLocationRelativeTo(fmInstance);
 1777:     }
 1778: 
 1779:     public String parseDelimiter(Object o)
 1780:     {
 1781:       String str = o.toString();
 1782:       StringBuffer sbuff = new StringBuffer();
 1783:       int length = str.length();
 1784:       for (int i = 0; i < length; ++i)
 1785:       {
 1786: 
 1787:         if (str.charAt(i) == '\\')
 1788:         {
 1789:           System.out.println(str.charAt(i));
 1790:           if (str.charAt(i + 1) == 'r')
 1791:           {
 1792:             sbuff.append("\r");
 1793:           }
 1794:           if (str.charAt(i + 1) == 't')
 1795:           {
 1796:             sbuff.append("\t");
 1797:           }
 1798:           if (str.charAt(i + 1) == 'n')
 1799:           {
 1800:             sbuff.append("\n");
 1801:           }
 1802:           if (str.charAt(i + 1) == '\\')
 1803:           {
 1804:             sbuff.append("\\");
 1805:           }
 1806: 
 1807:           if (i < length - 1)
 1808:             ++i;
 1809: 
 1810:         } else
 1811:           sbuff.append(str.charAt(i));
 1812:       }
 1813: 
 1814:       return sbuff.toString();
 1815:     }
 1816:   }
 1817: 
 1818:   public static class PasswordDialog extends JDialog
 1819:   {
 1820:     JLabel table = new JLabel("    ");
 1821:     JLabel status = new JLabel("    ");
 1822:     JLabel title = new JLabel("     ");
 1823:     JPanel content = new JPanel();
 1824:     JPanel titlePanel = new JPanel();
 1825:     JPanel userPanel = new JPanel();
 1826:     JPanel passwordPanel = new JPanel();
 1827:     JPanel buttonPanel = new JPanel();
 1828:     JTextField user = new JTextField(10);
 1829:     JTextField passwd = new JPasswordField(10);
 1830: 
 1831:     JButton cancel = new JButton("Cancel");
 1832:     JButton ok = new JButton("Ok");
 1833:     DBBean bean = null;
 1834:     Thread thread;
 1835: 
 1836:     public PasswordDialog(JFrame frame, DBBean localBean)
 1837:     {
 1838:       super(frame);
 1839:       setTitle("PasswordDialog");
 1840:       setModal(true);
 1841:       content = new JPanel(true);
 1842:       this.bean = localBean;
 1843:       // content.setBorder(BorderFactory.createRaisedBevelBorder());
 1844:       ActionListener al = new ActionListener() {
 1845:         public void actionPerformed(ActionEvent e)
 1846:         {
 1847:           bean.setUserAndPasswd(user.getText(), passwd.getText());
 1848:           setVisible(false);
 1849:         }
 1850: 
 1851:       };
 1852:       this.addWindowListener(new WindowAdapter() {
 1853:         public void windowClosing(WindowEvent e)
 1854:         {
 1855:           cancel.doClick();
 1856:         }
 1857:       });
 1858: 
 1859:       user.setText(localBean.user);
 1860:       passwd.setText(localBean.passwd);
 1861:       user.addActionListener(al);
 1862:       passwd.addActionListener(al);
 1863:       content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
 1864:       title = new JLabel("Enter user and password ");
 1865:       title.setHorizontalTextPosition(SwingConstants.CENTER);
 1866:       titlePanel.add(title);
 1867:       buttonPanel.add(ok);
 1868:       buttonPanel.add(cancel);
 1869:       content.add(titlePanel);
 1870:       content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
 1871:       // content.add(labelPanel);
 1872:       content.add(new JLabel(""));
 1873:       content.add(userPanel);
 1874:       content.add(passwordPanel);
 1875:       content.add(buttonPanel);
 1876:       content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
 1877:       // labelPanel.add(table);
 1878:       userPanel.add(new JLabel("Username:  "));
 1879:       userPanel.add(user);
 1880:       passwordPanel.add(new JLabel("Password:  "));
 1881:       passwordPanel.add(passwd);
 1882:       passwd.setPreferredSize(user.getPreferredSize());
 1883:       passwd.setMinimumSize(passwd.getPreferredSize());
 1884:       passwd.setMaximumSize(passwd.getPreferredSize());
 1885:       passwd.setSize(passwd.getPreferredSize());
 1886:       getContentPane().add(titlePanel, "North");
 1887:       getContentPane().add(content, "Center");
 1888:       ok.addActionListener(al);
 1889:       cancel.addActionListener(new ActionListener() {
 1890:         public void actionPerformed(ActionEvent e)
 1891:         {
 1892:           fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 1893:           fmInstance.setEnabled(true);
 1894:           setVisible(false);
 1895:           thread.stop();
 1896:         }
 1897: 
 1898:       });
 1899:       pack();
 1900: 
 1901:     }
 1902: 
 1903:   }
 1904: 
 1905:   public void fillTable()
 1906:   {
 1907:     noDBUpdate = true;
 1908:     bean.setUseNormanToUnicodeMapper(useNormanToUnicodeMapper.isSelected());
 1909:     Vector tableNames = bean.getTableNames();
 1910:     Collections.sort(tableNames, String.CASE_INSENSITIVE_ORDER);
 1911:     Vector[] data = new Vector[2];
 1912:     data[1] = new Vector(6);
 1913:     data[1].setSize(6);
 1914:     data[1].set(STATUS_INDEX, " ");
 1915:     data[1].set(NAME_INDEX, " source Tablename  ");
 1916:     data[1].set(LAYOUT_INDEX, "Layouts");
 1917:     data[1].set(SELECT_INDEX, "select");
 1918:     data[1].set(CREATE_INDEX, "create");
 1919:     data[1].set(ID_INDEX, " id ");
 1920:     data[0] = new Vector();
 1921:     for (int i = 0; i < tableNames.size(); i++)
 1922:     {
 1923:       String name = tableNames.get(i).toString();
 1924:       Vector layouts = new Vector();
 1925:       Vector idVec = new Vector();
 1926: 
 1927:       try
 1928:       {
 1929:         bean.makeQuery("select * from" + bean.getQC() + name + bean.getQC(), 1);
 1930:         layouts = bean.getLayoutNames(name);
 1931:       } catch (SQLException e)
 1932:       {
 1933:         layouts = new Vector();
 1934:       } catch (Exception e)
 1935:       {
 1936:         // TODO Auto-generated catch block
 1937:         e.printStackTrace();
 1938:       }
 1939: 
 1940:       idVec = bean.getColumnNames();
 1941:       if (idVec == null)
 1942:         idVec = new Vector();
 1943:       idVec.add(0, "");
 1944:       Vector dataRow = new Vector(6);
 1945: 
 1946:       dataRow.setSize(6);
 1947:       dataRow.set(STATUS_INDEX, Boolean.FALSE);
 1948:       dataRow.set(NAME_INDEX, name);
 1949: 
 1950:       dataRow.set(SELECT_INDEX, new TableComponent.SQLCommand("select * from " + bean.getQC()
 1951:           + name + bean.getQC()));
 1952:       if (!layouts.isEmpty())
 1953:         dataRow.set(LAYOUT_INDEX, new JComboBox(layouts));
 1954:       else
 1955:         dataRow.set(LAYOUT_INDEX, null);
 1956: 
 1957:       // create row
 1958:       dataRow.set(CREATE_INDEX, new TableComponent.SQLCommand(""));
 1959:       // id row
 1960:       dataRow.set(ID_INDEX, new TableComponent.IDComboBox(idVec));// new
 1961:       // TableComponent.SQLCommand(""));
 1962:       bean.ids.add("");
 1963:       data[0].add(dataRow);
 1964: 
 1965:       // System.out.println(dataRow);
 1966:     }
 1967: 
 1968:     tC.booleanRenderer.renderFalseEmpty = true;
 1969:     tC.tableModel.setDataVector(data[0], data[1]);
 1970:     // @TODO new sizeToFit method needed
 1971:     // tC.sizeToFit(450, 250);
 1972:     Dimension dim = listPanel.getPreferredSize();
 1973:     tC.sizeToFit(dim.width, dim.height);
 1974:     tC.revalidate();
 1975:     tC.tableModel.fireTableDataChanged();
 1976:     noDBUpdate = false;
 1977: 
 1978:   }
 1979: 
 1980:   public Vector[] getListFromTable()
 1981:   {
 1982:     Vector[] vec = new Vector[5];
 1983:     vec[0] = new Vector();
 1984:     vec[1] = new Vector();
 1985:     vec[2] = new Vector();
 1986:     vec[3] = new Vector();
 1987:     vec[4] = new Vector();
 1988:     for (int i = 0; i < tC.tableModel.getRowCount(); ++i)
 1989:     {
 1990:     }
 1991:     int[] rows = tC.table.getSelectedRows();
 1992:     for (int i = 0; i < tC.tableModel.getRowCount(); i++)
 1993:     {
 1994:       if (((Boolean) tC.tableModel.getValueAt(i, STATUS_INDEX)) == Boolean.FALSE)
 1995:       {
 1996:         System.out.println("skipped row " + i);
 1997:         continue;
 1998:       }
 1999: 
 2000:       // System.out.println(tC.tableModel.getValueAt(rows[i],1));
 2001:       vec[0].add(tC.tableModel.getValueAt(i, NAME_INDEX));
 2002:       JComboBox box = ((JComboBox) tC.tableModel.getValueAt(i, LAYOUT_INDEX));
 2003:       String layoutName = (box != null) ? box.getSelectedItem().toString() : "";
 2004: 
 2005:       String idName = ((JComboBox) tC.tableModel.getValueAt(i, ID_INDEX)).getSelectedItem()
 2006:           .toString();
 2007:       vec[1].add(layoutName);
 2008:       vec[2].add(tC.tableModel.getValueAt(i, SELECT_INDEX).toString());
 2009:       vec[3].add(tC.tableModel.getValueAt(i, CREATE_INDEX).toString());
 2010:       vec[4].add(idName);
 2011: 
 2012:     }
 2013:     return vec;
 2014:   }
 2015: 
 2016:   public void setEnabled(boolean state)
 2017:   {
 2018:     showTables.setEnabled(state);
 2019:     showTables1.setEnabled(state);
 2020:     convert.setEnabled(state);
 2021:     dropTables.setEnabled(state);
 2022:     sourceURLBox.setEnabled(state);
 2023:     destURLBox.setEnabled(state);
 2024: 
 2025:   }
 2026: 
 2027:   public TableComponent.SQLCommand createStatement(String table, DBBean beanDest, String layout,
 2028:       String query) throws SQLException, ParseException, Exception
 2029:   {
 2030:     fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 2031: 
 2032:     if (beanDest.url.equals(""))
 2033:       beanDest.url = destURLBox.getSelectedItem().toString();
 2034:     StringBuffer command = new StringBuffer(50);
 2035:     command.append("\n           CREATE TABLE ");
 2036:     command.append(beanDest.getQC());
 2037:     command.append(Convert.convertText(table));
 2038:     command.append(beanDest.getQC());
 2039:     command.append("\n             ( ");
 2040:     String type = null;
 2041:     // String query = "select * from " + bean.getQC() +table + bean.getQC();
 2042:     if (!layout.equals(""))
 2043:     {
 2044:       layout = " layout " + bean.getQC() + layout + bean.getQC();
 2045:       StringBuffer queryLayout = new StringBuffer(query);
 2046:       queryLayout.insert(queryLayout.indexOf(table) + table.length() + 1, " " + layout);
 2047:       query = queryLayout.toString();
 2048:       System.out.println("added layout  " + query);
 2049: 
 2050:     }
 2051:     Vector[] result = bean.getQueryData(query, 1);
 2052:     for (int i = 0; i < result[1].size() - 1; ++i)
 2053:     {
 2054:       type = bean.metaData.getColumnTypeName(i + 1);
 2055:       // System.out.println(i+" "+result[1].get(i)+" "+type);
 2056:       type = (type.equals("NUMBER")) ? "INT4" : type;
 2057:       type = (type.equals("CONTAINER")) ? "TEXT" : type;
 2058:       type = type.toUpperCase();
 2059:       if (i == 0)
 2060:         command.append(beanDest.getQC() + Convert.convertText((String) result[1].get(i))
 2061:             + beanDest.getQC() + " " + type + ", ");
 2062:       else
 2063:         command
 2064:             .append("               " + beanDest.getQC()
 2065:                 + Convert.convertText((String) result[1].get(i)) + beanDest.getQC() + " " + type
 2066:                 + ", ");
 2067:       command.append("\n");
 2068:     }
 2069:     type = bean.metaData.getColumnTypeName(result[1].size());
 2070:     type = (type.equals("NUMBER")) ? "INT4" : type;
 2071:     type = (type.equals("CONTAINER")) ? "TEXT" : type;
 2072:     type = type.toUpperCase();
 2073:     command.append("               " + beanDest.getQC()
 2074:         + Convert.convertText((String) result[1].get(result[1].size() - 1)) + beanDest.getQC()
 2075:         + " " + type);
 2076:     command.append("\n             )\n");
 2077:     fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 2078: 
 2079:     return new TableComponent.SQLCommand(command.toString());
 2080:   }
 2081: 
 2082:   static class XMLFilter extends javax.swing.filechooser.FileFilter
 2083:   {
 2084:     public boolean accept(java.io.File file)
 2085:     {
 2086:       if (file.getName().toLowerCase().endsWith(".xml") || file.isDirectory())
 2087:         return true;
 2088:       else
 2089:         return false;
 2090:     }
 2091: 
 2092:     public String getDescription()
 2093:     {
 2094:       return "Batch Convert XML File";
 2095:     }
 2096: 
 2097:   }
 2098: 
 2099:   public static int showDialog(String message, String title, Object[] options)
 2100:   {
 2101:     int option = JOptionPane.showOptionDialog(null, message, title, JOptionPane.DEFAULT_OPTION,
 2102:         JOptionPane.WARNING_MESSAGE, null, options, options[0]);
 2103:     return option;
 2104: 
 2105:   }
 2106: 
 2107: }

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