/*
* Copyright 2007 - 2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.jailer.ui.databrowser;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.io.PrintWriter;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JToggleButton;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import net.sf.jailer.ExecutionContext;
import net.sf.jailer.configuration.Configuration;
import net.sf.jailer.database.BasicDataSource;
import net.sf.jailer.database.Session;
import net.sf.jailer.datamodel.Association;
import net.sf.jailer.datamodel.DataModel;
import net.sf.jailer.datamodel.Table;
import net.sf.jailer.modelbuilder.ModelBuilder;
import net.sf.jailer.ui.About;
import net.sf.jailer.ui.AnalyseOptionsDialog;
import net.sf.jailer.ui.AssociationListUI;
import net.sf.jailer.ui.AssociationListUI.AssociationModel;
import net.sf.jailer.ui.AssociationListUI.DefaultAssociationModel;
import net.sf.jailer.ui.BrowserLauncher;
import net.sf.jailer.ui.CommandLineInstance;
import net.sf.jailer.ui.DataModelEditor;
import net.sf.jailer.ui.DataModelManager;
import net.sf.jailer.ui.DataModelManagerDialog;
import net.sf.jailer.ui.DbConnectionDialog;
import net.sf.jailer.ui.DbConnectionDialog.ConnectionInfo;
import net.sf.jailer.ui.ImportDialog;
import net.sf.jailer.ui.UIUtil;
import net.sf.jailer.ui.databrowser.Desktop.LayoutMode;
import net.sf.jailer.ui.databrowser.Desktop.RowBrowser;
/**
* Data Browser Frame.
*
* @author Ralf Wisser
*/
@SuppressWarnings("serial")
public class DataBrowser extends javax.swing.JFrame {
/**
* The desktop.
*/
Desktop desktop;
/**
* Icon for the frame.
*/
private ImageIcon jailerIcon = null;
/**
* The {@link DataModel}.
*/
private final Reference<DataModel> datamodel;
/**
* The DB connection dialog.
*/
private DbConnectionDialog dbConnectionDialog;
/**
* Session.
*/
private Session session;
/**
* The border browser.
*/
private final AssociationListUI borderBrowser;
/**
* The execution context.
*/
private final ExecutionContext executionContext;
/**
* Constructor.
*
* @param datamodel
* the {@link DataModel}
* @param root
* table to start browsing with
* @param condition
* initial condition
* @param dbConnectionDialog
* DB-connection dialog
*/
public DataBrowser(DataModel datamodel, Table root, String condition, DbConnectionDialog dbConnectionDialog, boolean embedded, final ExecutionContext executionContext) throws Exception {
this.executionContext = executionContext;
this.datamodel = new Reference<DataModel>(datamodel);
this.dbConnectionDialog = dbConnectionDialog != null ? new DbConnectionDialog(this, dbConnectionDialog, DataBrowserContext.getAppName()) : null;
this.borderBrowser = new AssociationListUI("Resolve", "Resolve selected Associations", true) {
@Override
protected void applyAction(Collection<AssociationModel> selection) {
resolveSelection(selection);
}
};
if (embedded) {
DataBrowserContext.setSupportsDataModelUpdates(false);
}
initComponents();
if (jScrollPane1.getVerticalScrollBar() != null) {
jScrollPane1.getVerticalScrollBar().setUnitIncrement(16);
}
if (jScrollPane1.getHorizontalScrollBar() != null) {
jScrollPane1.getHorizontalScrollBar().setUnitIncrement(16);
}
hiddenPanel.setVisible(false);
borderBrowserPanel.add(borderBrowser, java.awt.BorderLayout.CENTER);
GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.weightx = 0;
gridBagConstraints.weighty = 0;
jPanel4.add(new JPanel() {
@Override
public Dimension getMinimumSize() {
return new Dimension(1, 300);
}
private static final long serialVersionUID = -947582621664272477L;
}, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.weightx = 0;
gridBagConstraints.weighty = 0;
borderBrowserTitledPanel.add(new JPanel() {
@Override
public Dimension getMinimumSize() {
return new Dimension(1, 180);
}
private static final long serialVersionUID = -947582621664272477L;
}, gridBagConstraints);
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setOpenIcon(null);
renderer.setLeafIcon(null);
renderer.setClosedIcon(null);
navigationTree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("")));
navigationTree.setCellRenderer(renderer);
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(thumbnailLayoutRadioButtonMenuItem);
buttonGroup.add(tinyLayoutRadioButtonMenuItem);
buttonGroup.add(smallLayoutRadioButtonMenuItem);
buttonGroup.add(mediumLayoutRadioButtonMenuItem);
buttonGroup.add(largeLayoutRadioButtonMenuItem);
mediumLayoutRadioButtonMenuItem.setSelected(true);
setTitle(DataBrowserContext.getAppName(false));
if (embedded) {
menuTools.setVisible(false);
}
if (DataBrowserContext.isStandAlone()) {
aboutMenuItem.setText("About " + DataBrowserContext.getAppName(true));
}
// L&F can no longer be changed
jSeparator6.setVisible(false);
view.setVisible(false);
try {
for (final LookAndFeelInfo lfInfo : UIManager.getInstalledLookAndFeels()) {
JMenuItem mItem = new JMenuItem();
mItem.setText(lfInfo.getName());
view.add(mItem);
mItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
setPLAF(lfInfo.getClassName());
}
});
}
} catch (Throwable t) {
}
try {
setIconImage((jailerIcon = new ImageIcon(getClass().getResource("/net/sf/jailer/ui/resource/jailer.png"))).getImage());
} catch (Throwable t) {
try {
setIconImage((jailerIcon = new ImageIcon(getClass().getResource("/net/sf/jailer/ui/resource/jailer.gif"))).getImage());
} catch (Throwable t2) {
}
}
jailerIcon.setImage(jailerIcon.getImage().getScaledInstance(16, 16, Image.SCALE_SMOOTH));
if (dbConnectionDialog != null) {
createSession(dbConnectionDialog);
}
desktop = new Desktop(this.datamodel, jailerIcon, session, this, dbConnectionDialog) {
@Override
public void openSchemaAnalyzer() {
updateDataModel();
}
@Override
protected void updateMenu(boolean hasTableBrowser, boolean hasIFrame) {
storeSessionItem.setEnabled(hasIFrame);
exportDataMenuItem.setEnabled(hasTableBrowser);
createExtractionModelMenuItem.setEnabled(hasTableBrowser);
updateIFramesBar();
super.updateMenu(hasTableBrowser, hasIFrame);
}
@Override
protected void updateMenu(LayoutMode layoutMode) {
if (layoutMode == Desktop.LayoutMode.TINY) {
tinyLayoutRadioButtonMenuItem.setSelected(true);
} else if (layoutMode == Desktop.LayoutMode.SMALL) {
smallLayoutRadioButtonMenuItem.setSelected(true);
} else if (layoutMode == Desktop.LayoutMode.MEDIUM) {
mediumLayoutRadioButtonMenuItem.setSelected(true);
} else if (layoutMode == Desktop.LayoutMode.LARGE) {
largeLayoutRadioButtonMenuItem.setSelected(true);
} else if (layoutMode == Desktop.LayoutMode.THUMBNAIL) {
thumbnailLayoutRadioButtonMenuItem.setSelected(true);
}
}
@Override
protected DataBrowser openNewDataBrowser() {
try {
return DataBrowser.openNewDataBrowser(DataBrowser.this.datamodel.get(), dbConnectionDialog, false, executionContext);
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
return null;
}
}
};
jScrollPane1.setViewportView(desktop);
addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
// desktop.stop();
}
@Override
public void windowClosed(WindowEvent e) {
desktop.stop();
UIUtil.checkTermination();
}
@Override
public void windowActivated(WindowEvent e) {
}
});
MouseInputAdapter mia = new MouseInputAdapter() {
int m_XDifference, m_YDifference;
Container c;
public void mouseDragged(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
return;
}
c = desktop.getParent();
if (c instanceof JViewport) {
JViewport jv = (JViewport) c;
Point p = jv.getViewPosition();
int newX = p.x - (e.getX() - m_XDifference);
int newY = p.y - (e.getY() - m_YDifference);
int maxX = desktop.getWidth() - jv.getWidth();
int maxY = desktop.getHeight() - jv.getHeight();
if (newX < 0)
newX = 0;
if (newX > maxX)
newX = maxX;
if (newY < 0)
newY = 0;
if (newY > maxY)
newY = maxY;
jv.setViewPosition(new Point(newX, newY));
}
}
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
return;
}
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
m_XDifference = e.getX();
m_YDifference = e.getY();
}
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
return;
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON3) {
return;
}
JPopupMenu popup = new JPopupMenu();
JMenuItem i = new JMenuItem("Arrange Layout");
popup.add(i);
i.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
layoutMenuItemActionPerformed(e);
}
});
ButtonGroup group = new ButtonGroup();
popup.add(new JSeparator());
i = new JRadioButtonMenuItem("Thumbnail Layout");
i.setSelected(desktop.layoutMode == LayoutMode.THUMBNAIL);
group.add(i);
popup.add(i);
i.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
thumbnailLayoutRadioButtonMenuItemActionPerformed(e);
}
});
i = new JRadioButtonMenuItem("Tiny Layout");
i.setSelected(desktop.layoutMode == LayoutMode.TINY);
group.add(i);
popup.add(i);
i.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tinyLayoutRadioButtonMenuItemActionPerformed(e);
}
});
i = new JRadioButtonMenuItem("Small Layout");
i.setSelected(desktop.layoutMode == LayoutMode.SMALL);
group.add(i);
popup.add(i);
i.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
smallLayoutRadioButtonMenuItemActionPerformed(e);
}
});
i = new JRadioButtonMenuItem("Medium Layout");
i.setSelected(desktop.layoutMode == LayoutMode.MEDIUM);
group.add(i);
popup.add(i);
i.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mediumLayoutRadioButtonMenuItemActionPerformed(e);
}
});
i = new JRadioButtonMenuItem("Large Layout");
i.setSelected(desktop.layoutMode == LayoutMode.LARGE);
group.add(i);
popup.add(i);
i.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
largeLayoutRadioButtonMenuItemActionPerformed(e);
}
});
popup.show(desktop, e.getX(), e.getY());
}
};
desktop.addMouseMotionListener(mia);
desktop.addMouseListener(mia);
setLocation(60, 50);
setSize(900, 640);
if (root != null) {
desktop.addTableBrowser(null, 0, root, null, condition, null, null, true);
}
schemaNamePanel.addMouseListener(new java.awt.event.MouseAdapter() {
private boolean in = false;
@Override
public void mousePressed(MouseEvent e) {
desktop.openSchemaMappingDialog(false);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
in = true;
updateBorder();
}
public void mouseExited(java.awt.event.MouseEvent evt) {
in = false;
updateBorder();
}
private void updateBorder() {
schemaNamePanel.setBorder(new javax.swing.border.SoftBevelBorder(in ? javax.swing.border.BevelBorder.LOWERED
: javax.swing.border.BevelBorder.RAISED));
}
});
updateStatusBar();
}
private void createSession(DbConnectionDialog dbConnectionDialog) throws Exception {
ConnectionInfo connection = dbConnectionDialog.currentConnection;
BasicDataSource dataSource = new BasicDataSource(connection.driverClass, connection.url, connection.user, connection.password, 0, dbConnectionDialog.currentJarURLs());
session = new Session(dataSource, dataSource.dbms);
List<String> args = new ArrayList<String>();
dbConnectionDialog.addDbArgs(args);
session.setCliArguments(args);
session.setPassword(dbConnectionDialog.getPassword());
}
protected void setConnection(DbConnectionDialog dbConnectionDialog) throws Exception {
if (dbConnectionDialog != null) {
dbConnectionDialog = new DbConnectionDialog(this, dbConnectionDialog, DataBrowserContext.getAppName());
}
this.dbConnectionDialog = dbConnectionDialog;
desktop.dbConnectionDialog = dbConnectionDialog;
if (dbConnectionDialog != null) {
ConnectionInfo connection = dbConnectionDialog.currentConnection;
if (connection != null) {
desktop.openSchemaMappingDialog(true);
createSession(dbConnectionDialog);
desktop.session = session;
updateStatusBar();
if (desktop != null) {
desktop.updateMenu();
for (RowBrowser rb : desktop.getBrowsers()) {
rb.browserContentPane.session = session;
rb.browserContentPane.rows.clear();
}
for (RowBrowser rb : desktop.getRootBrowsers(false)) {
rb.browserContentPane.reloadRows();
}
}
}
}
}
public void updateStatusBar() {
final int MAX_LENGTH = 50;
ConnectionInfo connection = dbConnectionDialog != null ? dbConnectionDialog.currentConnection : null;
String dburl = connection != null ? (connection.url) : " ";
connectivityState.setToolTipText(dburl);
dburl = connection != null ? (connection.user + "@" + connection.alias) : " ";
if (dburl.length() > MAX_LENGTH) {
dburl = dburl.substring(0, MAX_LENGTH - 3) + "...";
}
connectivityState.setText(dburl);
DataModel dataModel = datamodel != null ? datamodel.get() : null;
String modelname = "Data Model \"" + (dataModel == null ? DataModel.DEFAULT_NAME : dataModel.getName()) + "\"";
String lastMod = dataModel == null ? "" : dataModel.getLastModifiedAsString();
if (lastMod.length() > 0) {
lastMod = " (" + lastMod + ")";
}
modelName.setText(modelname);
modelName.setToolTipText(modelname + lastMod);
String modelpath = executionContext.getQualifiedDatamodelFolder();
try {
modelpath = new File(modelpath).getAbsolutePath();
} catch (Throwable t) {
// use default modelpath
}
modelpath += File.separator;
modelPath.setToolTipText(modelpath);
if (modelpath.length() > MAX_LENGTH + 4) {
modelpath = modelpath.substring(0, MAX_LENGTH / 2) + "..." + modelpath.substring(modelpath.length() - MAX_LENGTH / 2);
}
modelPath.setText(modelpath);
String nonDefaultSchema = null;
if (desktop.schemaMapping != null) {
for (Map.Entry<String, String> e : desktop.schemaMapping.entrySet()) {
if (!e.getKey().equalsIgnoreCase(e.getValue())) {
nonDefaultSchema = e.getValue();
break;
}
}
}
schemaNamePanel.setVisible(nonDefaultSchema != null);
if (nonDefaultSchema != null) {
if (nonDefaultSchema.equals("")) {
schemaName.setText("Default Schema");
} else {
schemaName.setText("Schema " + nonDefaultSchema + "");
}
// schemaName.setToolTipText(schemaName.getText());
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed"
// <editor-fold defaultstate="collapsed"
// <editor-fold defaultstate="collapsed"
// <editor-fold defaultstate="collapsed"
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel1 = new javax.swing.JPanel();
jPanel11 = new javax.swing.JPanel();
legende1 = new javax.swing.JPanel();
modelName = new javax.swing.JLabel();
modelPath = new javax.swing.JLabel();
legende = new javax.swing.JPanel();
dependsOn = new javax.swing.JLabel();
hasDependent = new javax.swing.JLabel();
associatedWith = new javax.swing.JLabel();
ignored = new javax.swing.JLabel();
schemaNamePanel = new javax.swing.JPanel();
schemaName = new javax.swing.JLabel();
legende2 = new javax.swing.JPanel();
connectivityState = new javax.swing.JLabel();
jPanel2 = new javax.swing.JPanel();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel3 = new javax.swing.JPanel();
jSplitPane2 = new javax.swing.JSplitPane();
jPanel4 = new javax.swing.JPanel();
navigationTreeScrollPane = new javax.swing.JScrollPane();
navigationTree = new javax.swing.JTree();
jLabel2 = new javax.swing.JLabel();
borderBrowserTitledPanel = new javax.swing.JPanel();
titleLabel = new javax.swing.JLabel();
borderBrowserPanel = new javax.swing.JPanel();
jPanel5 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jInternalFrame1 = new javax.swing.JInternalFrame();
jLabel1 = new javax.swing.JLabel();
hiddenPanel = new javax.swing.JPanel();
menuBar = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenuItem3 = new javax.swing.JMenuItem();
jSeparator4 = new javax.swing.JPopupMenu.Separator();
storeSessionItem = new javax.swing.JMenuItem();
restoreSessionItem = new javax.swing.JMenuItem();
jSeparator2 = new javax.swing.JPopupMenu.Separator();
reconnectMenuItem = new javax.swing.JMenuItem();
jSeparator7 = new javax.swing.JPopupMenu.Separator();
cloaseAllMenuItem = new javax.swing.JMenuItem();
jSeparator3 = new javax.swing.JPopupMenu.Separator();
schemaMappingMenuItem = new javax.swing.JMenuItem();
menuTools = new javax.swing.JMenu();
analyseMenuItem = new javax.swing.JMenuItem();
dataModelEditorjMenuItem = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
exportDataMenuItem = new javax.swing.JMenuItem();
dataImport = new javax.swing.JMenuItem();
jSeparator8 = new javax.swing.JPopupMenu.Separator();
createExtractionModelMenuItem = new javax.swing.JMenuItem();
menuWindow = new javax.swing.JMenu();
layoutMenuItem = new javax.swing.JMenuItem();
jSeparator5 = new javax.swing.JPopupMenu.Separator();
thumbnailLayoutRadioButtonMenuItem = new javax.swing.JRadioButtonMenuItem();
tinyLayoutRadioButtonMenuItem = new javax.swing.JRadioButtonMenuItem();
smallLayoutRadioButtonMenuItem = new javax.swing.JRadioButtonMenuItem();
mediumLayoutRadioButtonMenuItem = new javax.swing.JRadioButtonMenuItem();
largeLayoutRadioButtonMenuItem = new javax.swing.JRadioButtonMenuItem();
jSeparator1 = new javax.swing.JPopupMenu.Separator();
newWindowMenuItem = new javax.swing.JMenuItem();
jSeparator6 = new javax.swing.JPopupMenu.Separator();
view = new javax.swing.JMenu();
helpMenu = new javax.swing.JMenu();
jMenuItem4 = new javax.swing.JMenuItem();
helpForum = new javax.swing.JMenuItem();
aboutMenuItem = new javax.swing.JMenuItem();
jPanel1.setLayout(new java.awt.GridBagLayout());
jPanel11.setLayout(new java.awt.GridBagLayout());
legende1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
legende1.setLayout(new java.awt.GridBagLayout());
modelName.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
modelName.setText("Data Model \"Demo\"");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 8, 0, 12);
legende1.add(modelName, gridBagConstraints);
modelPath.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
modelPath.setForeground(java.awt.Color.gray);
modelPath.setText("/home/jailer/datamodel/");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
legende1.add(modelPath, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2);
jPanel11.add(legende1, gridBagConstraints);
legende.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
legende.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0));
dependsOn.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
dependsOn.setForeground(new java.awt.Color(170, 0, 0));
dependsOn.setText(" depends on (has parent) ");
legende.add(dependsOn);
hasDependent.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
hasDependent.setForeground(new java.awt.Color(0, 112, 0));
hasDependent.setText(" has dependent (has child) ");
legende.add(hasDependent);
associatedWith.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
associatedWith.setForeground(new java.awt.Color(0, 100, 255));
associatedWith.setText(" associated with");
legende.add(associatedWith);
ignored.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
ignored.setForeground(new java.awt.Color(153, 153, 153));
ignored.setText(" disabled ");
legende.add(ignored);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2);
jPanel11.add(legende, gridBagConstraints);
schemaNamePanel.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
schemaNamePanel.setLayout(new java.awt.GridBagLayout());
schemaName.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
schemaName.setText("Schema");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 8, 0, 12);
schemaNamePanel.add(schemaName, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2);
jPanel11.add(schemaNamePanel, gridBagConstraints);
legende2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
legende2.setLayout(new java.awt.GridBagLayout());
connectivityState.setFont(new java.awt.Font("Dialog", 0, 12)); // NOI18N
connectivityState.setText("offline");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 8, 0, 6);
legende2.add(connectivityState, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4);
jPanel11.add(legende2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
jPanel1.add(jPanel11, gridBagConstraints);
jPanel2.setLayout(new java.awt.GridBagLayout());
jSplitPane1.setDividerLocation(340);
jSplitPane1.setContinuousLayout(true);
jSplitPane1.setOneTouchExpandable(true);
jPanel3.setLayout(new java.awt.GridBagLayout());
jSplitPane2.setDividerLocation(350);
jSplitPane2.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane2.setResizeWeight(1.0);
jSplitPane2.setContinuousLayout(true);
jSplitPane2.setOneTouchExpandable(true);
jPanel4.setLayout(new java.awt.GridBagLayout());
navigationTree.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
navigationTreeMouseClicked(evt);
}
});
navigationTreeScrollPane.setViewportView(navigationTree);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel4.add(navigationTreeScrollPane, gridBagConstraints);
jLabel2.setText(" Navigation Tree");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(4, 0, 0, 0);
jPanel4.add(jLabel2, gridBagConstraints);
jSplitPane2.setLeftComponent(jPanel4);
borderBrowserTitledPanel.setLayout(new java.awt.GridBagLayout());
titleLabel.setText(" ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
borderBrowserTitledPanel.add(titleLabel, gridBagConstraints);
borderBrowserPanel.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
borderBrowserTitledPanel.add(borderBrowserPanel, gridBagConstraints);
jSplitPane2.setRightComponent(borderBrowserTitledPanel);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel3.add(jSplitPane2, gridBagConstraints);
jSplitPane1.setLeftComponent(jPanel3);
jPanel5.setLayout(new java.awt.BorderLayout());
jScrollPane1.setAutoscrolls(true);
jScrollPane1.setWheelScrollingEnabled(false);
jScrollPane1.addMouseWheelListener(new java.awt.event.MouseWheelListener() {
public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
jScrollPane1MouseWheelMoved(evt);
}
});
jInternalFrame1.setVisible(true);
jLabel1.setText("jLabel1");
jInternalFrame1.getContentPane().add(jLabel1, java.awt.BorderLayout.CENTER);
jScrollPane1.setViewportView(jInternalFrame1);
jPanel5.add(jScrollPane1, java.awt.BorderLayout.CENTER);
hiddenPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Hidden"));
hiddenPanel.setLayout(new java.awt.GridBagLayout());
jPanel5.add(hiddenPanel, java.awt.BorderLayout.SOUTH);
jSplitPane1.setRightComponent(jPanel5);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel2.add(jSplitPane1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel1.add(jPanel2, gridBagConstraints);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
jMenu1.setText("File");
jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem1.setText("New Table Browser");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem3.setText("New SQL Browser");
jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem3ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem3);
jMenu1.add(jSeparator4);
storeSessionItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
storeSessionItem.setText("Store Layout");
storeSessionItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
storeSessionItemActionPerformed(evt);
}
});
jMenu1.add(storeSessionItem);
restoreSessionItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
restoreSessionItem.setText("Restore Layout");
restoreSessionItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
restoreSessionItemActionPerformed(evt);
}
});
jMenu1.add(restoreSessionItem);
jMenu1.add(jSeparator2);
reconnectMenuItem.setText("Reconnect...");
reconnectMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
reconnectMenuItemActionPerformed(evt);
}
});
jMenu1.add(reconnectMenuItem);
jMenu1.add(jSeparator7);
cloaseAllMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
cloaseAllMenuItem.setText("Close All");
cloaseAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cloaseAllMenuItemActionPerformed(evt);
}
});
jMenu1.add(cloaseAllMenuItem);
jMenu1.add(jSeparator3);
schemaMappingMenuItem.setText("Schema Mapping");
schemaMappingMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
schemaMappingMenuItemActionPerformed(evt);
}
});
jMenu1.add(schemaMappingMenuItem);
menuBar.add(jMenu1);
menuTools.setText("DataModel");
analyseMenuItem.setText("Analyse Database");
analyseMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
analyseMenuItemActionPerformed(evt);
}
});
menuTools.add(analyseMenuItem);
dataModelEditorjMenuItem.setText("Data Model Editor");
dataModelEditorjMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
dataModelEditorjMenuItemActionPerformed(evt);
}
});
menuTools.add(dataModelEditorjMenuItem);
menuBar.add(menuTools);
jMenu2.setText("Tools");
exportDataMenuItem.setText("Export Data");
exportDataMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exportDataMenuItemActionPerformed(evt);
}
});
jMenu2.add(exportDataMenuItem);
dataImport.setLabel("Import SQL Data");
dataImport.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
dataImportActionPerformed(evt);
}
});
jMenu2.add(dataImport);
jMenu2.add(jSeparator8);
createExtractionModelMenuItem.setText("Create Extraction Model");
createExtractionModelMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
createExtractionModelMenuItemActionPerformed(evt);
}
});
jMenu2.add(createExtractionModelMenuItem);
menuBar.add(jMenu2);
menuWindow.setText("Window");
layoutMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.CTRL_MASK));
layoutMenuItem.setText("Arrange Layout");
layoutMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
layoutMenuItemActionPerformed(evt);
}
});
menuWindow.add(layoutMenuItem);
menuWindow.add(jSeparator5);
thumbnailLayoutRadioButtonMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_0, java.awt.event.InputEvent.CTRL_MASK));
thumbnailLayoutRadioButtonMenuItem.setText("Thumbnail Layout");
thumbnailLayoutRadioButtonMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
thumbnailLayoutRadioButtonMenuItemActionPerformed(evt);
}
});
menuWindow.add(thumbnailLayoutRadioButtonMenuItem);
tinyLayoutRadioButtonMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_1, java.awt.event.InputEvent.CTRL_MASK));
tinyLayoutRadioButtonMenuItem.setText("Tiny Layout");
tinyLayoutRadioButtonMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tinyLayoutRadioButtonMenuItemActionPerformed(evt);
}
});
menuWindow.add(tinyLayoutRadioButtonMenuItem);
smallLayoutRadioButtonMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_2, java.awt.event.InputEvent.CTRL_MASK));
smallLayoutRadioButtonMenuItem.setText("Small Layout");
smallLayoutRadioButtonMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
smallLayoutRadioButtonMenuItemActionPerformed(evt);
}
});
menuWindow.add(smallLayoutRadioButtonMenuItem);
mediumLayoutRadioButtonMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_3, java.awt.event.InputEvent.CTRL_MASK));
mediumLayoutRadioButtonMenuItem.setText("Medium Layout");
mediumLayoutRadioButtonMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mediumLayoutRadioButtonMenuItemActionPerformed(evt);
}
});
menuWindow.add(mediumLayoutRadioButtonMenuItem);
largeLayoutRadioButtonMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_4, java.awt.event.InputEvent.CTRL_MASK));
largeLayoutRadioButtonMenuItem.setText("Large Layout");
largeLayoutRadioButtonMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
largeLayoutRadioButtonMenuItemActionPerformed(evt);
}
});
menuWindow.add(largeLayoutRadioButtonMenuItem);
menuWindow.add(jSeparator1);
newWindowMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
newWindowMenuItem.setText("New Window");
newWindowMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
newWindowMenuItemActionPerformed(evt);
}
});
menuWindow.add(newWindowMenuItem);
menuWindow.add(jSeparator6);
view.setText("Look&Feel");
menuWindow.add(view);
menuBar.add(menuWindow);
helpMenu.setText("Help");
jMenuItem4.setText("Manual");
jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem4ActionPerformed(evt);
}
});
helpMenu.add(jMenuItem4);
helpForum.setText("Forum");
helpForum.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpForumActionPerformed(evt);
}
});
helpMenu.add(helpForum);
aboutMenuItem.setText("About Jailer");
aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
aboutMenuItemActionPerformed(evt);
}
});
helpMenu.add(aboutMenuItem);
menuBar.add(helpMenu);
setJMenuBar(menuBar);
pack();
}// </editor-fold>//GEN-END:initComponents
private void exportDataMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportDataMenuItemActionPerformed
desktop.createExtractionModel(true);
}//GEN-LAST:event_exportDataMenuItemActionPerformed
private void dataImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataImportActionPerformed
try {
String sqlFile = UIUtil.choseFile(null, ".", "Data Import", ".sql", this, false, true);
if (sqlFile != null) {
DbConnectionDialog dcd = new DbConnectionDialog(this, dbConnectionDialog, DataBrowserContext.getAppName());
if (dcd.connect("Data Import")) {
List<String> args = new ArrayList<String>();
args.add("import");
args.add(sqlFile);
dcd.addDbArgs(args);
ImportDialog importDialog = new ImportDialog(this, sqlFile, args, dbConnectionDialog.getPassword(), true);
if (importDialog.isOk) {
UIUtil.runJailer(this, args, false, true, false, false, null, dcd.getPassword(), null, null, false, true, false);
if (desktop != null) {
desktop.updateMenu();
for (RowBrowser rb : desktop.getBrowsers()) {
rb.browserContentPane.session = session;
rb.browserContentPane.rows.clear();
}
for (RowBrowser rb : desktop.getRootBrowsers(false)) {
rb.browserContentPane.reloadRows();
}
}
}
}
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}//GEN-LAST:event_dataImportActionPerformed
private void newWindowMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_newWindowMenuItemActionPerformed
try {
openNewDataBrowser(datamodel.get(), dbConnectionDialog, false, executionContext);
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}// GEN-LAST:event_newWindowMenuItemActionPerformed
private void reconnectMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_reconnectMenuItemActionPerformed
synchronized (this) {
if (dbConnectionDialog.connect("Reconnect")) {
try {
setConnection(dbConnectionDialog);
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}
}
}// GEN-LAST:event_reconnectMenuItemActionPerformed
private void thumbnailLayoutRadioButtonMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_thumbnailLayoutRadioButtonMenuItemActionPerformed
desktop.rescaleLayout(Desktop.LayoutMode.THUMBNAIL, null);
wheelzoomTip();
}// GEN-LAST:event_thumbnailLayoutRadioButtonMenuItemActionPerformed
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem1ActionPerformed
openNewTableBrowser(false);
}// GEN-LAST:event_jMenuItem1ActionPerformed
private void cloaseAllMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_cloaseAllMenuItemActionPerformed
desktop.closeAll();
}// GEN-LAST:event_cloaseAllMenuItemActionPerformed
private void schemaMappingMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_schemaMappingMenuItemActionPerformed
desktop.openSchemaMappingDialog(false);
}// GEN-LAST:event_schemaMappingMenuItemActionPerformed
private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem3ActionPerformed
desktop.addTableBrowser(null, 0, null, null, "", null, null, true);
}// GEN-LAST:event_jMenuItem3ActionPerformed
private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem4ActionPerformed
try {
if (DataBrowserContext.isStandAlone()) {
BrowserLauncher.openURL(new URI("http://dbeauty.sourceforge.net"));
} else {
BrowserLauncher.openURL(new URI("http://jailer.sourceforge.net/doc/data-browsing.html"));
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}// GEN-LAST:event_jMenuItem4ActionPerformed
private void createExtractionModelMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_createExtractionModelMenuItemActionPerformed
desktop.createExtractionModel(false);
}// GEN-LAST:event_createExtractionModelMenuItemActionPerformed
private void storeSessionItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_storeSessionItemActionPerformed
desktop.storeSession();
}// GEN-LAST:event_storeSessionItemActionPerformed
private void restoreSessionItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_restoreSessionItemActionPerformed
desktop.restoreSession(null);
}// GEN-LAST:event_restoreSessionItemActionPerformed
private void tinyLayoutRadioButtonMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_tinyLayoutRadioButtonMenuItemActionPerformed
desktop.rescaleLayout(Desktop.LayoutMode.TINY, null);
wheelzoomTip();
}// GEN-LAST:event_tinyLayoutRadioButtonMenuItemActionPerformed
private void wheelzoomTip() {
TipDialog.showTip(this, "WHEELZOOM", "While holding down the Ctrl-key you can use the mouse-wheel to zoom in or out.");
}
private void smallLayoutRadioButtonMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_smallLayoutRadioButtonMenuItemActionPerformed
desktop.rescaleLayout(Desktop.LayoutMode.SMALL, null);
wheelzoomTip();
}// GEN-LAST:event_smallLayoutRadioButtonMenuItemActionPerformed
private void mediumLayoutRadioButtonMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_mediumLayoutRadioButtonMenuItemActionPerformed
desktop.rescaleLayout(Desktop.LayoutMode.MEDIUM, null);
wheelzoomTip();
}// GEN-LAST:event_mediumLayoutRadioButtonMenuItemActionPerformed
private void largeLayoutRadioButtonMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_largeLayoutRadioButtonMenuItemActionPerformed
desktop.rescaleLayout(Desktop.LayoutMode.LARGE, null);
wheelzoomTip();
}// GEN-LAST:event_largeLayoutRadioButtonMenuItemActionPerformed
private void navigationTreeMouseClicked(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_navigationTreeMouseClicked
if (evt.getButton() == MouseEvent.BUTTON3) {
if (evt.getClickCount() == 1) {
TreePath node = navigationTree.getPathForLocation(evt.getX(), evt.getY());
if (node == null) {
for (int x = navigationTree.getWidth(); x > 0; x -= 32) {
node = navigationTree.getPathForLocation(x, evt.getY());
if (node != null) {
break;
}
}
}
if (node != null) {
Object sel = node.getLastPathComponent();
if (sel instanceof DefaultMutableTreeNode) {
Object selNode = ((DefaultMutableTreeNode) sel).getUserObject();
RowBrowser rowBrowser = null;
int row = 0;
if (selNode instanceof TreeNodeForRowBrowser) {
rowBrowser = ((TreeNodeForRowBrowser) selNode).rowBrowser;
row = ((TreeNodeForRowBrowser) selNode).rowIndex;
}
if (rowBrowser != null) {
navigationTree.setSelectionRow(row);
JPopupMenu popup = rowBrowser.browserContentPane.createPopupMenu(null, -1, 0, 0, false);
JPopupMenu popup2 = rowBrowser.browserContentPane.createSqlPopupMenu(null, -1, 0, 0, true);
popup.add(new JSeparator());
for (Component c : popup2.getComponents()) {
popup.add(c);
}
UIUtil.fit(popup);
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}
}
}
}// GEN-LAST:event_navigationTreeMouseClicked
private void layoutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_layoutMenuItemActionPerformed
arrangeLayout();
}// GEN-LAST:event_layoutMenuItemActionPerformed
public void arrangeLayout() {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
desktop.layoutBrowser();
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
private void jScrollPane1MouseWheelMoved(java.awt.event.MouseWheelEvent evt) {// GEN-FIRST:event_jScrollPane1MouseWheelMoved
desktop.onMouseWheelMoved(evt);
desktop.onMouseWheelMoved(evt, jScrollPane1);
}// GEN-LAST:event_jScrollPane1MouseWheelMoved
private void openNewTableBrowser(boolean offerAlternatives) {
new NewTableBrowser(this, datamodel.get(), offerAlternatives) {
@Override
void openTableBrowser(String tableName) {
desktop.addTableBrowser(null, 0, datamodel.get().getTableByDisplayName(tableName), null, "", null, null, true);
}
@Override
void openDatabaseAnalyzer() {
updateDataModel();
}
@Override
void restoreSession() {
desktop.restoreSession(null);
}
};
}
private void helpForumActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_helpForumActionPerformed
try {
if (DataBrowserContext.isStandAlone()) {
BrowserLauncher.openURL(new URI("https://sourceforge.net/apps/phpbb/dbeauty/index.php"));
} else {
BrowserLauncher.openURL(new URI("https://sourceforge.net/forum/?group_id=197260"));
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}// GEN-LAST:event_helpForumActionPerformed
private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem4ActionPerformed
About about = new About(this, true);
about.setTitle(DataBrowserContext.getAppName(false));
if (DataBrowserContext.isStandAlone()) {
about.homeTextField.setText("http://dbeauty.sourceforge.net");
about.forumTextField.setText("https://sourceforge.net/apps/phpbb/dbeauty/index.php");
about.nameLabel.setText(DataBrowserContext.getAppName(false));
}
about.pack();
about.setLocation(getLocation().x + (getSize().width - about.getPreferredSize().width) / 2,
getLocation().y + (getSize().height - about.getPreferredSize().height) / 2);
about.setVisible(true);
}// GEN-LAST:event_jMenuItem4ActionPerformed
private void analyseMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_analyseMenuItemActionPerformed
updateDataModel();
}// GEN-LAST:event_analyseMenuItemActionPerformed
private void dataModelEditorjMenuItemActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_dataModelEditorjMenuItemActionPerformed
openDataModelEditor();
}// GEN-LAST:event_dataModelEditorjMenuItemActionPerformed
/**
* File in which plaf-setting is stored.
*/
private static final String PLAFSETTING = ".plaf2.ui";
/**
* @param args
* the command line arguments
*/
public static void main(final String args[]) {
// turn off logging for prefuse library
try {
Logger.getLogger("prefuse").setLevel(Level.OFF);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
CommandLineInstance.init(args);
} catch (Exception e) {
UIUtil.showException(null, "Illegal arguments", e);
return;
}
final ExecutionContext executionContext = CommandLineInstance.getExecutionContext();
try {
System.setProperty("db2.jcc.charsetDecoderEncoder", "3");
} catch (Exception e) {
}
try {
// create initial data-model files
File file = new File(DataModel.getDatamodelFolder(CommandLineInstance.getExecutionContext()));
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
UIUtil.initSyntaxKit();
try {
try {
// L&F can no longer be changed
// File plafSetting = new File(PLAFSETTING);
String plaf;
// if (!plafSetting.exists()) {
plaf = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
// } else {
// BufferedReader in = new BufferedReader(new FileReader(plafSetting));
// plaf = in.readLine();
// in.close();
// }
UIManager.setLookAndFeel(plaf);
} catch (Exception x) {
}
// try {
// initInterceptingEventQueue();
// } catch (Exception x) {
// }
DataModelManagerDialog dataModelManagerDialog = new DataModelManagerDialog(DataBrowserContext.getAppName(true)
+ " - Relational Data Browser") {
@Override
protected void onSelect() {
try {
final DataModel datamodel;
datamodel = new DataModel(CommandLineInstance.getExecutionContext());
openNewDataBrowser(datamodel, null, true, executionContext);
} catch (Exception e) {
UIUtil.showException(null, "Error", e);
}
}
private static final long serialVersionUID = 1L;
};
ToolTipManager.sharedInstance().setInitialDelay(400);
ToolTipManager.sharedInstance().setDismissDelay(20000);
dataModelManagerDialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private static DataBrowser openNewDataBrowser(DataModel datamodel, DbConnectionDialog dbConnectionDialog, boolean maximize, ExecutionContext executionContext) throws Exception {
boolean silent = dbConnectionDialog != null;
DataBrowser dataBrowser = new DataBrowser(datamodel, null, "", null, false, executionContext);
dataBrowser.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// if (maximize) {
// dataBrowser.setExtendedState(JFrame.MAXIMIZED_BOTH);
// }
dataBrowser.setVisible(true);
if (dbConnectionDialog == null) {
dbConnectionDialog = new DbConnectionDialog(dataBrowser, DataBrowserContext.getAppName(), null);
} else {
dbConnectionDialog = new DbConnectionDialog(dataBrowser, dbConnectionDialog, DataBrowserContext.getAppName());
}
if (DataBrowserContext.isStandAlone()) {
dbConnectionDialog.setJdbcHelpURL("http://dbeauty.sourceforge.net/jdbc.html");
}
if (dbConnectionDialog.isConnected || dbConnectionDialog.connect(DataBrowserContext.getAppName(true))) {
dataBrowser.setConnection(dbConnectionDialog);
dataBrowser.askForDataModel();
dataBrowser.desktop.openSchemaMappingDialog(true);
dataBrowser.updateStatusBar();
if (!silent) {
dataBrowser.openNewTableBrowser(true);
}
} else {
if (dbConnectionDialog.isConnected) {
dataBrowser.setConnection(dbConnectionDialog);
}
for (int i = 0; i < dataBrowser.menuBar.getMenuCount(); ++i) {
JMenu menu = dataBrowser.menuBar.getMenu(i);
if (menu != dataBrowser.helpMenu) {
for (int j = 0; j < menu.getItemCount(); ++j) {
JMenuItem item = menu.getItem(j);
if (item != null) {
item.setEnabled(false);
}
}
}
}
}
return dataBrowser;
}
/**
* Opens the data model editor.
*/
private void openDataModelEditor() {
try {
String modelname = datamodel == null || datamodel.get() == null ? DataModel.DEFAULT_NAME : datamodel.get().getName();
DataModelEditor dataModelEditor = new DataModelEditor(this, false, false, null, null, null, modelname, null);
dataModelEditor.setVisible(true);
desktop.reloadDataModel(desktop.schemaMapping);
updateStatusBar();
askForDataModel();
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}
private void updateDataModel() {
try {
List<String> args = new ArrayList<String>();
args.add("build-model-wo-merge");
dbConnectionDialog.addDbArgs(args);
AnalyseOptionsDialog analyseOptionsDialog = new AnalyseOptionsDialog(this, datamodel == null ? null : datamodel.get());
boolean[] isDefaultSchema = new boolean[1];
String[] defaultSchema = new String[1];
List<String> schemas;
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
schemas = dbConnectionDialog.getDBSchemas(defaultSchema);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
if (analyseOptionsDialog.edit(schemas, defaultSchema[0], isDefaultSchema, dbConnectionDialog.currentConnection.user)) {
String schema = analyseOptionsDialog.getSelectedSchema();
if (schema != null) {
args.add("-schema");
args.add(schema);
}
if (!isDefaultSchema[0]) {
args.add("-qualifyNames");
}
analyseOptionsDialog.appendAnalyseCLIOptions(args);
ModelBuilder.assocFilter = analyseOptionsDialog.getAssociationLineFilter();
if (DataBrowserContext.isStandAlone()) {
UIUtil.disableWarnings = true;
}
if (UIUtil.runJailer(this, args, false, true, false, true, null, dbConnectionDialog.getPassword(), null, null, false, true, false)) {
ModelBuilder.assocFilter = null;
String modelname = datamodel == null || datamodel.get() == null ? DataModel.DEFAULT_NAME : datamodel.get().getName();
DataModelEditor dataModelEditor = new DataModelEditor(this, true, analyseOptionsDialog.isRemoving(), null,
analyseOptionsDialog.getTableLineFilter(), analyseOptionsDialog.getAssociationLineFilter(), modelname,
schema == null ? dbConnectionDialog.getName() : schema);
if (dataModelEditor.dataModelHasChanged()) {
dataModelEditor.setVisible(true);
}
desktop.reloadDataModel(desktop.schemaMapping);
updateStatusBar();
askForDataModel();
}
} else {
askForDataModel();
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
} finally {
ModelBuilder.assocFilter = null;
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem aboutMenuItem;
private javax.swing.JMenuItem analyseMenuItem;
private javax.swing.JLabel associatedWith;
private javax.swing.JPanel borderBrowserPanel;
private javax.swing.JPanel borderBrowserTitledPanel;
private javax.swing.JMenuItem cloaseAllMenuItem;
public javax.swing.JLabel connectivityState;
private javax.swing.JMenuItem createExtractionModelMenuItem;
private javax.swing.JMenuItem dataImport;
private javax.swing.JMenuItem dataModelEditorjMenuItem;
private javax.swing.JLabel dependsOn;
private javax.swing.JMenuItem exportDataMenuItem;
private javax.swing.JLabel hasDependent;
private javax.swing.JMenuItem helpForum;
private javax.swing.JMenu helpMenu;
private javax.swing.JPanel hiddenPanel;
private javax.swing.JLabel ignored;
private javax.swing.JInternalFrame jInternalFrame1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel11;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPopupMenu.Separator jSeparator1;
private javax.swing.JPopupMenu.Separator jSeparator2;
private javax.swing.JPopupMenu.Separator jSeparator3;
private javax.swing.JPopupMenu.Separator jSeparator4;
private javax.swing.JPopupMenu.Separator jSeparator5;
private javax.swing.JPopupMenu.Separator jSeparator6;
private javax.swing.JPopupMenu.Separator jSeparator7;
private javax.swing.JPopupMenu.Separator jSeparator8;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JSplitPane jSplitPane2;
private javax.swing.JRadioButtonMenuItem largeLayoutRadioButtonMenuItem;
private javax.swing.JMenuItem layoutMenuItem;
private javax.swing.JPanel legende;
private javax.swing.JPanel legende1;
private javax.swing.JPanel legende2;
private javax.swing.JRadioButtonMenuItem mediumLayoutRadioButtonMenuItem;
private javax.swing.JMenuBar menuBar;
private javax.swing.JMenu menuTools;
private javax.swing.JMenu menuWindow;
private javax.swing.JLabel modelName;
private javax.swing.JLabel modelPath;
private javax.swing.JTree navigationTree;
private javax.swing.JScrollPane navigationTreeScrollPane;
private javax.swing.JMenuItem newWindowMenuItem;
private javax.swing.JMenuItem reconnectMenuItem;
private javax.swing.JMenuItem restoreSessionItem;
private javax.swing.JMenuItem schemaMappingMenuItem;
private javax.swing.JLabel schemaName;
private javax.swing.JPanel schemaNamePanel;
private javax.swing.JRadioButtonMenuItem smallLayoutRadioButtonMenuItem;
private javax.swing.JMenuItem storeSessionItem;
private javax.swing.JRadioButtonMenuItem thumbnailLayoutRadioButtonMenuItem;
private javax.swing.JRadioButtonMenuItem tinyLayoutRadioButtonMenuItem;
private javax.swing.JLabel titleLabel;
private javax.swing.JMenu view;
// End of variables declaration//GEN-END:variables
/**
* Sets Look&Feel.
*
* @param plaf
* the l&f
*/
private void setPLAF(String plaf) {
try {
UIManager.setLookAndFeel(plaf);
SwingUtilities.updateComponentTreeUI(this);
try {
File file = new File(PLAFSETTING);
file.delete();
} catch (Exception e) {
}
try {
File plafSetting = new File(PLAFSETTING);
PrintWriter out = new PrintWriter(plafSetting);
out.println(plaf);
out.close();
} catch (Exception x) {
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
private void askForDataModel() {
try {
if (datamodel.get().getTables().isEmpty()) {
switch (JOptionPane.showOptionDialog(this, "Data model \"" + DataModelManager.getModelDetails(DataModelManager.getCurrentModelSubfolder()).a
+ "\" is empty.", DataBrowserContext.getAppName(true), JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, new Object[] {
"Analyze Database", "Data Model Editor" }, null)) {
case 0:
updateDataModel();
break;
case 1:
openDataModelEditor();
break;
}
} else if (!new File(DataModel.getColumnsFile(CommandLineInstance.getExecutionContext())).exists()) {
switch (JOptionPane.showOptionDialog(this, "No column definition found.", DataBrowserContext.getAppName(true), JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE, null, new Object[] { "Analyze Database", "Data Model Editor" }, null)) {
case 0:
updateDataModel();
break;
case 1:
openDataModelEditor();
break;
}
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
}
}
private void updateIFramesBar() {
updateNavigationTree();
updateBorderBrowser();
updateHiddenPanel();
// iFramesPanel is obsolete
return;
}
private void updateHiddenPanel() {
if (desktop == null) {
return;
}
hiddenPanel.removeAll();
hiddenPanel.setVisible(false);
int num = desktop.getAllFrames().length;
if (num == 0) {
jPanel1.revalidate();
return;
}
int COLUMNS = 7;
int y = 1;
GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = y;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = GridBagConstraints.WEST;
gridBagConstraints.weightx = 1;
JPanel iFramesRowPanel = new JPanel();
iFramesRowPanel.setLayout(new GridBagLayout());
hiddenPanel.add(iFramesRowPanel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = COLUMNS + 2;
gridBagConstraints.gridy = y;
gridBagConstraints.weightx = 1;
iFramesRowPanel.add(new JLabel(" "), gridBagConstraints);
int x = 1;
boolean visible = false;
for (final RowBrowser rb : desktop.getBrowsers()) {
if (!rb.isHidden()) {
continue;
}
visible = true;
if (++x > COLUMNS) {
x = 1;
++y;
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = y;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = GridBagConstraints.WEST;
gridBagConstraints.weightx = 1;
iFramesRowPanel = new JPanel();
iFramesRowPanel.setLayout(new GridBagLayout());
hiddenPanel.add(iFramesRowPanel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = COLUMNS + 2;
gridBagConstraints.gridy = y;
gridBagConstraints.weightx = 1;
iFramesRowPanel.add(new JLabel(" "), gridBagConstraints);
}
final JToggleButton toggleButton = new JToggleButton();
toggleButton.setText(rb.internalFrame.getTitle());
toggleButton.setSelected(false);
toggleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
toggleButton.setSelected(true);
rb.setHidden(false);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = x;
gridBagConstraints.gridy = y;
iFramesRowPanel.add(toggleButton, gridBagConstraints);
hiddenPanel.setVisible(visible);
}
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new Insets(0, 0, 4, 0);
jPanel1.revalidate();
}
private static final class BrowserAssociationModel extends DefaultAssociationModel {
private final RowBrowser rowBrowser;
public BrowserAssociationModel(RowBrowser rowBrowser, Association association) {
super(association);
this.rowBrowser = rowBrowser;
}
@Override
public String getSourceName() {
return rowBrowser.internalFrame.getTitle();
}
@Override
public boolean equals(Object other) {
if (other instanceof BrowserAssociationModel) {
BrowserAssociationModel otherModel = (BrowserAssociationModel) other;
return rowBrowser == otherModel.rowBrowser && association == otherModel.association;
}
return false;
}
@Override
public int hashCode() {
return rowBrowser.hashCode() + 3 * association.hashCode();
}
public RowBrowser getRowBrowser() {
return rowBrowser;
}
public Association getAssociation() {
return association;
}
}
private boolean disableBorderBrowserUpdates = false;
private void updateBorderBrowser() {
if (disableBorderBrowserUpdates) {
return;
}
try {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Collection<AssociationModel> model = new ArrayList<AssociationModel>();
if (desktop != null) {
titleLabel.setText(" Related Rows");
List<RowBrowser> allChildren = new ArrayList<RowBrowser>();
for (RowBrowser rb : desktop.getBrowsers()) {
if (rb.internalFrame == desktop.getSelectedFrame() && !rb.isHidden()) {
allChildren.add(rb);
allChildren.addAll(collectChildren(rb));
titleLabel.setText(" Related Rows of Subtree " + rb.internalFrame.getTitle());
break;
}
}
for (RowBrowser rb : allChildren) {
if (rb.browserContentPane.table != null) {
Set<Association> associations = new HashSet<Association>(rb.browserContentPane.table.associations);
for (RowBrowser c : desktop.getChildBrowsers(rb, false)) {
if (c.browserContentPane.association != null) {
associations.remove(c.browserContentPane.association);
}
}
if (rb.browserContentPane.association != null && rb.parent != null) {
if (allChildren.contains(rb.parent)) {
associations.remove(rb.browserContentPane.association.reversalAssociation);
}
}
for (Association association : associations) {
model.add(new BrowserAssociationModel(rb, association));
}
}
}
}
borderBrowser.setModel(model);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
protected void resolveSelection(Collection<AssociationModel> selection) {
try {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
disableBorderBrowserUpdates = true;
JInternalFrame currentSelection = desktop.getSelectedFrame();
for (AssociationModel a : selection) {
BrowserAssociationModel associationModel = (BrowserAssociationModel) a;
desktop.addTableBrowser(associationModel.getRowBrowser(), -1, associationModel.getAssociation().destination, associationModel.getAssociation(),
"", null, null, true);
}
if (currentSelection != null) {
try {
currentSelection.setSelected(true);
} catch (PropertyVetoException e) {
// ignore
}
}
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
disableBorderBrowserUpdates = false;
updateBorderBrowser();
}
}
private List<RowBrowser> collectChildren(RowBrowser rb) {
List<RowBrowser> result = new ArrayList<Desktop.RowBrowser>();
for (RowBrowser c : desktop.getChildBrowsers(rb, true)) {
result.add(c);
}
for (RowBrowser c : desktop.getChildBrowsers(rb, true)) {
result.addAll(collectChildren(c));
}
return result;
}
private Map<JInternalFrame, TreeNodeForRowBrowser> treeNodeByIFrame = new HashMap<JInternalFrame, DataBrowser.TreeNodeForRowBrowser>();
private TreeSelectionListener navigationTreeListener = null;
private class TreeNodeForRowBrowser {
public final RowBrowser rowBrowser;
public final int rowIndex;
private final String title;
public TreeNodeForRowBrowser(RowBrowser rowBrowser, int rowIndex) {
this.rowBrowser = rowBrowser;
this.rowIndex = rowIndex;
this.title = " " + rowBrowser.internalFrame.getTitle() + " ";
treeNodeByIFrame.put(rowBrowser.internalFrame, this);
}
public String toString() {
return title;
}
}
private void updateNavigationTree() {
if (navigationTreeListener != null) {
navigationTree.getSelectionModel().removeTreeSelectionListener(navigationTreeListener);
}
ConnectionInfo connection = dbConnectionDialog != null ? dbConnectionDialog.currentConnection : null;
DefaultMutableTreeNode root = new DefaultMutableTreeNode(connection != null ? " " + connection.alias : " ");
treeNodeByIFrame.clear();
int[] count = new int[1];
count[0] = 1;
if (desktop != null) {
for (RowBrowser rb : desktop.getRootBrowsers(true)) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(new TreeNodeForRowBrowser(rb, count[0]++));
root.add(node);
addChildNodes(node, rb, count);
}
}
DefaultTreeModel treeModel = new DefaultTreeModel(root);
navigationTree.setModel(treeModel);
for (int i = 0; i < count[0]; ++i) {
navigationTree.expandRow(i);
}
JInternalFrame activeFrame = desktop != null ? desktop.getSelectedFrame() : null;
if (activeFrame != null) {
TreeNodeForRowBrowser node = treeNodeByIFrame.get(activeFrame);
if (node != null) {
navigationTree.setSelectionRow(node.rowIndex);
Rectangle bounds = navigationTree.getRowBounds(node.rowIndex);
navigationTree.scrollRectToVisible(new Rectangle(bounds.x, bounds.y, 1, bounds.height));
}
}
navigationTreeListener = new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
if (e.getPath() != null) {
Object lastPathComponent = e.getPath().getLastPathComponent();
if (lastPathComponent != null && lastPathComponent instanceof DefaultMutableTreeNode) {
Object userObject = ((DefaultMutableTreeNode) lastPathComponent).getUserObject();
if (userObject instanceof TreeNodeForRowBrowser) {
try {
JInternalFrame iFrame = ((TreeNodeForRowBrowser) userObject).rowBrowser.internalFrame;
desktop.scrollToCenter(iFrame);
iFrame.setSelected(true);
iFrame.grabFocus();
} catch (PropertyVetoException e1) {
// ignore
}
return;
} else {
openNewTableBrowser(false);
}
}
}
updateNavigationTree();
}
};
navigationTree.getSelectionModel().addTreeSelectionListener(navigationTreeListener);
}
private void addChildNodes(DefaultMutableTreeNode node, RowBrowser browser, int[] count) {
for (RowBrowser rb : desktop.getChildBrowsers(browser, true)) {
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(new TreeNodeForRowBrowser(rb, count[0]++));
node.add(childNode);
addChildNodes(childNode, rb, count);
}
}
public JScrollPane getDesktopScrollPane() {
return jScrollPane1;
}
// /**
// * Keys form weak set of component to intercept mouse events to.
// */
// private static final java.util.Map<Component, Void> componentsWithDisabledWheelScrollingWithCntrl = new java.util.WeakHashMap<Component, Void>();
//
// /**
// * Install event queue. Note, we can only do this once per 'app context'.
// */
// private static void initInterceptingEventQueue() {
// EventQueue eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue();
// eventQueue.push(new EventQueue() {
// @Override
// public void dispatchEvent(java.awt.AWTEvent awtEvent) {
// if (awtEvent instanceof MouseWheelEvent) {
// MouseWheelEvent event = (MouseWheelEvent) awtEvent;
// if (event.isControlDown()) {
// Object source = event.getSource();
// if (source instanceof Component) {
// // (If we were interested in heavyweights,
// // we would also check parents here.)
// if (isIntercept((Component) source, event.getX(), event.getY())) {
// // Swallow.
// return;
// }
// }
// }
// }
// // Dispatch as normal.
// super.dispatchEvent(awtEvent);
// }
// });
// }
//
// /**
// * Indicates whether event at location in component should be intercepted.
// *
// * @param component
// * event source
// * @param x
// * x position of event in {@code component} coordinates
// * @param y
// * y position of event in {@code component} coordinates
// */
// private static boolean isIntercept(Component component, int x, int y) {
// if (componentsWithDisabledWheelScrollingWithCntrl.containsKey(component)) {
// return true;
// }
// if (!(component instanceof Container)) {
// return false;
// }
// Container container = (Container) component;
// int num = container.getComponentCount();
// // Lightweight components should be on the bottom.
// for (boolean lightweight : new boolean[] { false, true }) {
// for (int ct = 0; ct < num; ++ct) {
// Component child = container.getComponent(ct);
// if (lightweight == child.isLightweight() && child.isVisible()) {
// int childX = x - child.getX();
// int childY = y - child.getY();
// if (child.contains(childX, childY)) {
// // Recurse to child.
// return isIntercept(child, childX, childY);
// }
// }
// }
// }
// // No kids yet.
// return false;
// }
//
// /**
// * Intercept mouse events to component, and components descendants. It is
// * assumed that the component does not contain heavyweights.
// */
// public static void disableWheelScrollingWithCntrl(Component component) {
// componentsWithDisabledWheelScrollingWithCntrl.put(component, (Void) null);
// }
}