/*
* FM2SQL.java -- Main program Filemaker to SQL Converter
* Copyright (C) 2003 Robert Gordesch (rogo@mpiwg-berlin.mpg.de)
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version. Please read license.txt for the full details. A copy of
* the GPL may be found at http://www.gnu.org/copyleft/lgpl.html You should
* have received a copy of the GNU General Public License along with this
* program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA Created on 15.09.2003 by
* rogo
*/
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.InputEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintStream;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.util.Collections;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
/**
*
*
*
FileMaker Test (JDBC Database Driver Test)
* Main class :
* contains the main Frame, all event handlers etc
*
* The Database access is made over DBBean class
* all other classes are just for the visualization of the data
* @version 0.3( first stable release)
* @author rogo
*
*/
public class FM2SQL extends JFrame implements ActionListener, TableModelListener
{
private JMenuItem delimiterItem;
private JCheckBoxMenuItem convertItem;
private JCheckBoxMenuItem appendItem;
private JCheckBoxMenuItem updateItem;
private JCheckBoxMenuItem deleteItem;
private JCheckBoxMenuItem useNormanToUnicodeMapper;
int mode = -1;
final static int STATUS_INDEX = 0;
final static int NAME_INDEX = 1;
final static int ID_INDEX = 2;
final static int SELECT_INDEX = 3;
final static int CREATE_INDEX = 4;
final static int LAYOUT_INDEX = 5;
/**
* The database Bean instance.
*
*/
DBBean bean;
/**
* The database destination Bean instance.
*
*/
DBBean destBean;
/**
* tList - Tablenames to choose from
*/
JList tList = new JList(new String[] { "no database", "connection", "" });
JList tListDest = new JList(new String[] { "no database connection", "", "" });
/**
* sourceUrl - Database URL ComboBox
*/
JComboBox sourceURLBox;
/**
* destUrlBox - Database URL ComboBox
*/
JComboBox destURLBox;
TableComponent table, tC;
Vector tables = new Vector();
Vector layouts = new Vector();
JPanel listPanel;
JPanel topPanel,topPanel2, contentPanel;
JScrollPane paneDest;
FM2SQL fm = this;
boolean noDBUpdate = false;
boolean noUserUpdate = false;
int id = 0;
static boolean debug = false;
/**
* The result window used for query results
*/
MultiResultWindow window;
/**
* The result window used for query results
*/
MultiResultWindow windowDest;
static FM2SQL fmInstance;
static String url = "jdbc:fmpro:http://141.14.237.42";
JButton showTables = new JButton(), showTables1 = new JButton();
JButton convert = new JButton();
JButton dropTables = new JButton();
int oldWidth = 0, oldHeight = 0;
boolean resize = true;
static FileWriter logFile;
String delimiter = "";
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
JFileChooser configExportFileChooser;
JFileChooser configImportFileChooser;
/**
* 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.equals("Delimiter"))
{
new DelimiterDialog(fmInstance).setVisible(true);
//delimiter = JOptionPane.showInputDialog(fmInstance,"Enter delimiter String",delimiter);
}
if (command == "Convert Mode")
{
System.out.println("Convert Mode selected");
convert.setText("Convert Tables");
convert.setActionCommand("Convert Tables");
convert.setToolTipText("Normal table conversion existing table will be deleted");
mode = Convert.DataBase.CONVERT_MODE;
}
if (command == "Append Mode")
{
System.out.println("Append Mode selected");
convert.setText("Append Tables");
convert.setActionCommand("Append Tables");
convert.setToolTipText("Appends data to an existing table");
mode = Convert.DataBase.APPEND_MODE;
}
if (command == "Update Mode")
{
System.out.println("Update Mode selected");
convert.setText("Update Tables");
convert.setActionCommand("Update Tables");
convert.setToolTipText("Updates data that has been changed in source");
mode = Convert.DataBase.UPDATE_MODE;
}
if (command == "Delete Mode")
{
System.out.println("Delete Mode selected");
convert.setText("Delete Tables");
convert.setActionCommand("Delete Tables");
convert.setToolTipText("Deletes data that has been deleted in source");
mode = Convert.DataBase.DELETE_MODE;
}
if(command.equals("use NormanToUnicodeMapper"))
{
if(bean!=null) bean.setUseNormanToUnicodeMapper(useNormanToUnicodeMapper.isSelected());
}
//writing config
if (command.equals("save XML Config"))
{
if (configExportFileChooser == null)
{
configExportFileChooser = new JFileChooser();
configExportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
configExportFileChooser.setFileFilter(new XMLFilter());
configExportFileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
configExportFileChooser.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e2)
{
System.out.println(e2.getActionCommand());
if (!e2.getActionCommand().toString().equals("ApproveSelection"))
return;
Thread thread = new Thread()
{
public void run()
{
File configFile = configExportFileChooser.getSelectedFile();
writeConfig(configFile.toString());
}
};
thread.start();
}
});
}
configExportFileChooser.rescanCurrentDirectory();
configExportFileChooser.showDialog(fmInstance, " Save ");
}
if (command.equals("open XML Config"))
{
if (configImportFileChooser == null)
{
configImportFileChooser = new JFileChooser();
configImportFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
configImportFileChooser.setFileFilter(new XMLFilter());
configImportFileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
configImportFileChooser.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e2)
{
System.out.println(e2.getActionCommand());
if (!e2.getActionCommand().toString().equals("ApproveSelection"))
return;
Thread thread = new Thread()
{
public void run()
{
File configFile = configImportFileChooser.getSelectedFile();
readXMLConfig(configFile.toString());
}
};
thread.start();
}
});
}
configImportFileChooser.rescanCurrentDirectory();
configImportFileChooser.showDialog(fmInstance, " Open ");
}
if (command.equals("Convert Tables")||command.equals("Append Tables"))
{
Thread thread = new Thread()
{
public void run()
{
setEnabled(false);
convert();
setEnabled(true);
}
};
thread.start();
}
if (command.equals("Update Tables"))
{
Thread thread = new Thread()
{
public void run()
{
setEnabled(false);
update();
setEnabled(true);
}
};
thread.start();
}
if (command.equals("Delete Tables"))
{
Thread thread = new Thread()
{
public void run()
{
setEnabled(false);
delete();
setEnabled(true);
}
};
thread.start();
}
if (command.equals("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);
}
}
public void delete()
{
Vector vectors[] = getListFromTable();
Convert.user = bean.user;
Convert.passwd = bean.passwd;
Convert.userDest = destBean.user;
Convert.passwdDest = destBean.passwd;
try
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
fmInstance.setEnabled(false);
Convert.delete(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1], vectors[2], vectors[3],vectors[4], mode);
destBean.setConnection((String) destURLBox.getSelectedItem());
DefaultListModel model = new DefaultListModel();
tables = destBean.getTableNames();
for (int j = 0; j < tables.size(); ++j)
model.addElement(tables.get(j));
if (debug)
System.out.println("hallo" + tables + " ");
tListDest.setModel(model);
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} catch (Exception e4)
{
ByteArrayOutputStream b = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(b);
e4.printStackTrace(stream);
showErrorDialog(b.toString(), "Delete of table failed");
fmInstance.setEnabled(true);
}
}
/**
* Copys the content of source to destination and makes new table if necessary
*/
public void convert()
{
Vector vectors[] = getListFromTable();
Convert.user = bean.user;
Convert.passwd = bean.passwd;
Convert.userDest = destBean.user;
Convert.passwdDest = destBean.passwd;
try
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
fmInstance.setEnabled(false);
Convert.convert(bean.url, destURLBox.getSelectedItem().toString(), vectors[0], vectors[1],vectors[2],vectors[3],vectors[4],mode,delimiter);
destBean.setConnection((String) destURLBox.getSelectedItem());
DefaultListModel model = new DefaultListModel();
tables = destBean.getTableNames();
for (int j = 0; j < tables.size(); ++j)
model.addElement(tables.get(j));
if (debug)
System.out.println("hallo" + tables + " ");
tListDest.setModel(model);
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} catch (Exception e4)
{
ByteArrayOutputStream b = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(b);
e4.printStackTrace(stream);
showErrorDialog(b.toString(), "Conversion of table failed");
fmInstance.setEnabled(true);
}
}
public void writeConfig(String file)
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
fmInstance.setEnabled(false);
Vector vectors[] = getListFromTable();
if(convertItem.isSelected()) mode = Convert.DataBase.CONVERT_MODE;
else
if(appendItem.isSelected()) mode = Convert.DataBase.APPEND_MODE;
else
if(updateItem.isSelected()) mode = Convert.DataBase.UPDATE_MODE;
else
if(deleteItem.isSelected()) mode = Convert.DataBase.DELETE_MODE;
// TODO add id vector in table and write it out
Convert.DataBase source = new Convert.DataBase(bean,vectors[0],vectors[1],vectors[2],vectors[3],vectors[4],mode);
Convert.DataBase destination = new Convert.DataBase(destBean,new Vector(),new Vector(),new Vector(),new Vector(),new Vector(),-1);
source.delimiter =delimiter;
source.useNormanToUnicodeMapper=useNormanToUnicodeMapper.isSelected();
try
{
Convert.writeConfig(file,source,destination);
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
fmInstance.setEnabled(true);
} catch (Exception e)
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
fmInstance.setEnabled(true);
ByteArrayOutputStream b = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(b);
e.printStackTrace(stream);
showErrorDialog(b.toString(), "Error while writing xml config !");
}
}
public void readXMLConfig(String file)
{
try
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
fmInstance.setEnabled(false);
Vector databases = Convert.getXMLConfig(file);
Convert.DataBase destBase = (Convert.DataBase) databases.lastElement();
//destBase.bean.getConnection();
noUserUpdate = true;
destBean=destBase.bean;
Object destObj =destBean.url;
((DefaultComboBoxModel) destURLBox.getModel()).removeElement(destObj);
((DefaultComboBoxModel) destURLBox.getModel()).insertElementAt(destObj,0);
destURLBox.setSelectedItem(destObj);
databases.remove(destBase);
for (Iterator iter = databases.iterator(); iter.hasNext();)
{
Convert.DataBase database = (Convert.DataBase) iter.next();
if (database.mode == Convert.DataBase.CONVERT_MODE)
{
convertItem.doClick();
} else if (database.mode == Convert.DataBase.APPEND_MODE)
{
appendItem.doClick();
} else if (database.mode == Convert.DataBase.UPDATE_MODE)
{
updateItem.doClick();
} else if (database.mode == Convert.DataBase.DELETE_MODE)
{
deleteItem.doClick();
}
delimiter=database.delimiter;
database.bean.getConnection();
bean = database.bean;
if(bean.isUseNormanToUnicodeMapper()) useNormanToUnicodeMapper.setSelected(true);
Object obj =bean.url;
((DefaultComboBoxModel) sourceURLBox.getModel()).removeElement(obj);
((DefaultComboBoxModel) sourceURLBox.getModel()).insertElementAt(obj,0);
sourceURLBox.setSelectedItem(obj);
fillTable();
Vector tables=database.bean.getTableNames();
Collections.sort(tables,String.CASE_INSENSITIVE_ORDER);
int[] indices = new int[database.tables.size()];
for (int i =0;i 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,NAME_INDEX).toString();
String layout = (model.getValueAt(row,LAYOUT_INDEX)!=null) ?((JComboBox)model.getValueAt(row,LAYOUT_INDEX)).getSelectedItem().toString():"";
String query = model.getValueAt(row,SELECT_INDEX).toString();
String create = model.getValueAt(row,CREATE_INDEX).toString();
String id = (model.getValueAt(row,ID_INDEX)!=null) ?((JComboBox)model.getValueAt(row,ID_INDEX)).getSelectedItem().toString():"";
System.out.println("table" +table+" layout "+layout+" query "+query);
if(!create.equals(""))
{
Object[] options = { "Yes","No"};
int option=showDialog("Create Statement not empty! Do you want to overwrite?","create statement",options );
if(option==0)
model.setValueAt(createStatement(table,destBean,layout,query),row,CREATE_INDEX);
}
if (columnName.equals("Layouts"))
{
bean.makeQuery("select * from"+bean.getQC()+table+bean.getQC()+" layout "+bean.getQC()+layout+bean.getQC(),1);
Vector idVec = bean.getColumnNames();
if (idVec == null)
idVec = new Vector();
idVec.add(0, "");
JComboBox box = ((JComboBox) model.getValueAt(row, ID_INDEX));
box.setModel(new DefaultComboBoxModel(idVec));
box.setSelectedItem(id);
tC.tableModel.fireTableCellUpdated(row,ID_INDEX);
}
}
/* Statement stm = bean.getConnection().createStatement();
// stm.executeUpdate("DELETE FROM \""+fm.tables.get(0)+"\" WHERE \"erstellt von\"='rogo') ");
if (idVal == "")
stm.executeUpdate("INSERT INTO " + DBBean.quoteChar + box.getSelectedItem() + DBBean.quoteChar + " (" + DBBean.quoteChar + columnName + DBBean.quoteChar + ") VALUES ('" + value + "') ");
else
stm.executeUpdate(
"UPDATE " + DBBean.quoteChar + box.getSelectedItem() + DBBean.quoteChar + " SET " + DBBean.quoteChar + columnName + DBBean.quoteChar + "='" + value + "' WHERE ID='" + idVal + "' ");
*/
} catch (Exception e2)
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
ByteArrayOutputStream b = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(b);
e2.printStackTrace(stream);
showErrorDialog(b.toString(), "Error while updating table !");
}
}
}
/**
* initialize the menubar
*/
private void setMenu()
{
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("File");
menu.setMnemonic('F');
JMenuItem item = new JMenuItem("open XML Config");
item.setToolTipText("opens a XML config file for batch conversion");
item.setMnemonic('i');
item.setAccelerator(KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK));
item.addActionListener(fm);
menu.add(item);
item = new JMenuItem("save XML Config");
item.setToolTipText("saves the current selections in an XML config file for batch conversion");
item.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_DOWN_MASK));
item.setMnemonic('x');
item.addActionListener(fm);
menu.add(item);
item = new JMenuItem("Quit");
item.setMnemonic('Q');
item.setToolTipText("Quits the application");
item.setAccelerator(KeyStroke.getKeyStroke('Q',InputEvent.CTRL_DOWN_MASK));
item.addActionListener(fm);
menu.add(item);
menubar.add(menu);
menu = new JMenu("Options");
menu.setMnemonic('O');
ButtonGroup bgrp = new ButtonGroup();
convertItem = new JCheckBoxMenuItem("Convert Mode");
convertItem.setToolTipText("Normal table conversion existing table will be deleted");
convertItem.addActionListener(fm);
bgrp.add(convertItem);
menu.add(convertItem);
menubar.add(menu);
appendItem = new JCheckBoxMenuItem("Append Mode");
appendItem.setToolTipText("Appends data to an existing table");
appendItem.addActionListener(fm);
bgrp.add(appendItem);
menu.add(appendItem);
menubar.add(menu);
updateItem = new JCheckBoxMenuItem("Update Mode");
updateItem.setToolTipText("Updates data in an existing table");
updateItem.addActionListener(fm);
bgrp.add(updateItem);
menu.add(updateItem);
deleteItem = new JCheckBoxMenuItem("Delete Mode");
deleteItem.setToolTipText("Deletes data in an existing table \n that has been deleted in source table");
deleteItem.addActionListener(fm);
bgrp.add(deleteItem);
menu.add(deleteItem);
useNormanToUnicodeMapper = new JCheckBoxMenuItem("use NormanToUnicodeMapper");
useNormanToUnicodeMapper.setToolTipText("maps characters in norman encoding to unicode characters");
useNormanToUnicodeMapper.addActionListener(fm);
menu.add(useNormanToUnicodeMapper);
menubar.add(menu);
item = new JMenuItem("show Driver features");
item.setToolTipText("shows the features of the selected driver");
item.addActionListener(fm);
menu.add(item);
menubar.add(menu);
delimiterItem = new JMenuItem("Delimiter");
delimiterItem.setToolTipText("Delimiter for FM Arrayfields");
delimiterItem.addActionListener(fm);
menu.add(delimiterItem);
menubar.add(menu);
// item.addActionListener(fm);
// menu.add(item);
menubar.add(menu);
menu.setBackground(fm.getBackground());
menubar.setBackground(fm.getBackground());
convertItem.doClick();
setJMenuBar(menubar);
}
/**
* open the log file (index.html)
*/
public static void openLog() throws Exception
{
StringBuffer buff = new StringBuffer();
buff.append("");
buff.append("");
buff.append("\n");
buff.append("FileMaker Test");
buff.append("\n");
buff.append("\n");
buff.append("\n");
buff.append("\n");
buff.append("\n");
buff.append("FileMaker Test");
buff.append("
\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("");
logFile.write(entry + "");
logFile.write("
\n
\n");
logFile.flush();
}
/**
* closes the log file invoked then the application closes
*/
public static void closeLog() throws Exception
{
logFile.write("\n");
logFile.write("\n");
logFile.close();
}
public static void showErrorDialog(String message, String title)
{
JDialog dialog = new JDialog(fmInstance);
dialog.setTitle(title);
JTextArea text = new JTextArea();
JScrollPane scroller = new JScrollPane(text);
dialog.getContentPane().add(scroller);
text.append(message);
dialog.setSize(600, 300);
dialog.setLocationRelativeTo(fmInstance);
dialog.show();
//JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE);
}
public static class ProgressDialog extends JDialog
{
JLabel table = new JLabel(" ");
JLabel status = new JLabel(" ");
JLabel title = new JLabel(" ");
JPanel content = new JPanel();
JPanel titlePanel = new JPanel();
JPanel labelPanel = new JPanel();
JPanel statusPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JProgressBar progress = new JProgressBar();
JButton cancel = new JButton("Cancel");
Thread thread;
DBBean bean;
public ProgressDialog(JFrame frame,DBBean bean)
{
super(frame);
this.bean = bean;
content = new JPanel(true);
//content.setBorder(BorderFactory.createRaisedBevelBorder());
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
title = new JLabel("Progress of conversion");
title.setHorizontalTextPosition(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);
try
{
ProgressDialog.this.bean.getConnection().close();
} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
thread.stop();
}
});
pack();
}
}
public static class DelimiterDialog extends JDialog
{
JLabel table = new JLabel(" ");
JLabel status = new JLabel(" ");
JLabel title = new JLabel(" ");
JPanel content = new JPanel();
JPanel titlePanel = new JPanel();
JPanel delimiterPanel = new JPanel();
JPanel buttonPanel = new JPanel();
JTextField delimiter = new JTextField(10);
JButton cancel = new JButton("Cancel");
JButton ok = new JButton("Ok");
Thread thread;
public DelimiterDialog(JFrame frame)
{
super(frame);
setTitle("Delimiter Editor");
setModal(true);
content = new JPanel(true);
delimiter.setText(fmInstance.delimiter);
ActionListener al = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
fmInstance.delimiter=parseDelimiter(delimiter.getText());
setVisible(false);
}
};
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
cancel.doClick();
}
});
//delimiter.setText(fmInstance.delimiter);
delimiter.addActionListener(al);
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
title = new JLabel("Enter Delimiter ");
title.setHorizontalTextPosition(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(new JLabel(""));
content.add(delimiterPanel);
content.add(buttonPanel);
content.add(Box.createRigidArea(new java.awt.Dimension(0, 15)));
delimiterPanel.add(new JLabel("Delimiter: "));
delimiterPanel.add(delimiter);
getContentPane().add(titlePanel, "North");
getContentPane().add(content, "Center");
ok.addActionListener(al);
cancel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
fmInstance.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
fmInstance.setEnabled(true);
setVisible(false);
// thread.stop();
}
});
pack();
setLocationRelativeTo(fmInstance);
}
public String parseDelimiter(Object o)
{
String str = o.toString();
StringBuffer sbuff = new StringBuffer();
int length = str.length();
for(int i = 0;i