Thread: [Squirrel-sql-commits] sql12/plugins/graph/src/net/sourceforge/squirrel_sql/plugins/graph AddTableLi
A Java SQL client for any JDBC compliant database
Brought to you by:
colbell,
gerdwagner
Update of /cvsroot/squirrel-sql/sql12/plugins/graph/src/net/sourceforge/squirrel_sql/plugins/graph In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14107/plugins/graph/src/net/sourceforge/squirrel_sql/plugins/graph Added Files: AddTableListener.java AddToGraphAction.java ColumnInfo.java ColumnSortListener.java ConnectionPoints.java ConstraintData.java ConstraintGraph.java ConstraintView.java ConstraintViewListener.java GraphComponent.java GraphController.java GraphDesktopController.java GraphDesktopListener.java GraphDesktopPane.java GraphLine.java GraphMainPanelTab.java GraphPlugin.java GraphSelectionDialog.java GraphSelectionDialogController.java TableFrame.java TableFrameController.java TableFrameControllerListener.java TableToolTipProvider.java graph.properties Log Message: New plugin --- NEW FILE: TableFrame.java --- package net.sourceforge.squirrel_sql.plugins.graph; import org.w3c.dom.css.CSS2Properties; import javax.swing.*; import javax.swing.plaf.basic.BasicInternalFrameUI; import javax.swing.plaf.basic.BasicInternalFrameTitlePane; import javax.swing.plaf.basic.BasicGraphicsUtils; import javax.swing.plaf.UIResource; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.TableFrameXmlBean; public class TableFrame extends JInternalFrame { JTextArea txtColums; JScrollPane scrollPane; private MyUI _myUI; private TableToolTipProvider _toolTipProvider; public TableFrame(String tableName, TableFrameXmlBean xmlBean, TableToolTipProvider toolTipProvider) { _toolTipProvider = toolTipProvider; txtColums = new JTextArea() { public String getToolTipText(MouseEvent event) { return _toolTipProvider.getToolTipText(event); } }; txtColums.setToolTipText("Just to make getToolTiptext() to be called"); scrollPane = new JScrollPane(txtColums); getContentPane().add(scrollPane); txtColums.setEditable(false); setMaximizable(false); setClosable(true); setIconifiable(false); setTitle(tableName); setBackground(new Color(255,255,204)); setResizable(true); txtColums.setBackground(new Color(255,255,204)); setFrameIcon(null); _myUI = new MyUI(this); setUI(_myUI); if(null != xmlBean) { Rectangle r = new Rectangle(); r.x = xmlBean.getX(); r.y = xmlBean.getY(); r.width = xmlBean.getWidht(); r.height = xmlBean.getHeight(); setBounds(r); } } public TableFrame.MyTitlePaneUI getTitlePane() { return _myUI.getTitlePane(); } public TableFrameXmlBean getXmlBean() { TableFrameXmlBean ret = new TableFrameXmlBean(); Rectangle bounds = getBounds(); ret.setX(bounds.x); ret.setY(bounds.y); ret.setWidht(bounds.width); ret.setHeight(bounds.height); return ret; } class MyUI extends BasicInternalFrameUI { public MyUI(JInternalFrame frame) { super(frame); } protected JComponent createNorthPane(JInternalFrame w) { titlePane = new MyTitlePaneUI(w); return titlePane; } public TableFrame.MyTitlePaneUI getTitlePane() { return (MyTitlePaneUI) _myUI.titlePane; } } class MyTitlePaneUI extends BasicInternalFrameTitlePane { public MyTitlePaneUI(JInternalFrame f) { super(f); } protected void installDefaults() { super.installDefaults(); selectedTextColor = Color.black; notSelectedTextColor = Color.black; //setFont(new Font("Tahoma", Font.BOLD, 11)); setFont(new Font(getFont().getFontName(), Font.BOLD, getFont().getSize())); } protected void paintTitleBackground(Graphics g) { g.setColor(new Color(255,255,220)); g.fillRect(0, 0, getWidth(), getHeight()); } /** * This removes the system menu * @return */ protected JMenuBar createSystemMenuBar() { menuBar = new JMenuBar() { public void setSize(int width, int height) { super.setSize(0,0); } public void setBounds(int x, int y, int width, int height) { super.setBounds(0, 0, 0, 0); } }; menuBar.setBorderPainted(false); menuBar.setSize(0,0); menuBar.setBounds(0,0,0,0); return menuBar; } } } --- NEW FILE: GraphMainPanelTab.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.client.session.mainpanel.BaseMainPanelTab; import net.sourceforge.squirrel_sql.fw.gui.ScrollableDesktopPane; import javax.swing.*; import java.awt.*; public class GraphMainPanelTab extends BaseMainPanelTab { private GraphDesktopController _desktopController; private String _title = "New table graph"; public GraphMainPanelTab(GraphDesktopController desktopController) { _desktopController = desktopController; } protected void refreshComponent() { _desktopController.repaint(); } public String getTitle() { return _title; } public String getHint() { return "Right click table in object tree to add to graph"; } public Component getComponent() { return _desktopController.getScrollPane(); } public void setTitle(String title) { _title = title; } } --- NEW FILE: ColumnInfo.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ColumnInfoXmlBean; public class ColumnInfo extends Object { private String _columnName; private String _columnType; private int _columnSize; private boolean _nullable; private int _index; private String _importedFromTable; private String _importedColumn; private String _toString; private String _constraintName; private boolean _isPrimaryKey; public ColumnInfo(String columnName, String columnType, int columnSize, boolean nullable) { _columnName = columnName; _columnType = columnType; _columnSize = columnSize; _nullable = nullable; _toString = _columnName + " " + _columnType + "(" + _columnSize + ") " + (_nullable? "NULL": "NOT NULL"); } public ColumnInfo(ColumnInfoXmlBean xmlBean) { this(xmlBean.getColumnName(), xmlBean.getColumnType(), xmlBean.getColumnSize(), xmlBean.isNullable()); _index = xmlBean.getIndex(); if(xmlBean.isPrimaryKey()) { markPrimaryKey(); } if(null != xmlBean.getImportedFromTable()) { setImportData(xmlBean.getImportedFromTable(), xmlBean.getImportedColumn(), xmlBean.getConstraintName()); } } public ColumnInfoXmlBean getXmlBean() { ColumnInfoXmlBean ret = new ColumnInfoXmlBean(); ret.setColumnName(_columnName); ret.setColumnType(_columnType); ret.setColumnSize(_columnSize); ret.setNullable(_nullable); ret.setIndex(_index); ret.setImportedFromTable(_importedFromTable); ret.setImportedColumn(_importedColumn); ret.setConstraintName(_constraintName); ret.setPrimaryKey(_isPrimaryKey); return ret; } public String toString() { return _toString; } public String getName() { return _columnName; } public void setImportData(String importedFromTable, String importedColumn, String constraintName) { _importedFromTable = importedFromTable; _importedColumn = importedColumn; _constraintName = constraintName; _toString += " (FK)"; } public boolean isImportedFrom(String tableName) { return tableName.equals(_importedFromTable); } public String getConstraintName() { return _constraintName; } public int getIndex() { return _index; } public String getImportedColumnName() { return _importedColumn; } public void markPrimaryKey() { _isPrimaryKey = true; _toString += " (PK)"; } public boolean isPrimaryKey() { return _isPrimaryKey; } public void setIndex(int index) { _index = index; } public String getConstraintToolTipText() { if(null == _importedFromTable) { return null; } return _importedFromTable + "." + _importedColumn + " (" + _constraintName + ")"; } public String getImportedTableName() { return _importedFromTable; } } --- NEW FILE: ConstraintGraph.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ConstraintGraphXmlBean; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.FoldingPointXmlBean; import java.awt.*; import java.util.Vector; import java.util.Arrays; public class ConstraintGraph { private GraphLine[] _fkStubLines; private GraphLine[] _pkStubLines; private Point _fkGatherPoint; private Point _pkGatherPoint; private Vector _foldingPoints = new Vector(); private GraphLine _hitConnectLine; private boolean _isHitOnConnectLine; private Point _hitFoldingPoint; public ConstraintGraph() { } public ConstraintGraph(ConstraintGraphXmlBean constraintGraphXmlBean) { for (int i = 0; i < constraintGraphXmlBean.getFoldingPointXmlBeans().length; i++) { Point p = new Point(); p.x = constraintGraphXmlBean.getFoldingPointXmlBeans()[i].getX(); p.y = constraintGraphXmlBean.getFoldingPointXmlBeans()[i].getY(); _foldingPoints.add(p); } } public ConstraintGraphXmlBean getXmlBean() { ConstraintGraphXmlBean ret = new ConstraintGraphXmlBean(); FoldingPointXmlBean[] foldPointXmlBeans = new FoldingPointXmlBean[_foldingPoints.size()]; for (int i = 0; i < _foldingPoints.size(); i++) { Point point = (Point) _foldingPoints.elementAt(i); foldPointXmlBeans[i] = new FoldingPointXmlBean(); foldPointXmlBeans[i].setX(point.x); foldPointXmlBeans[i].setY(point.y); } ret.setFoldingPointXmlBeans(foldPointXmlBeans); return ret; } public void setFkStubLines(GraphLine[] fkStubLines) { _fkStubLines = fkStubLines; } public void setPkStubLines(GraphLine[] pkStubLines) { _pkStubLines = pkStubLines; } public void setFkGatherPoint(Point fkGatherPoint) { _fkGatherPoint = fkGatherPoint; } public void setPkGatherPoint(Point pkGatherPoint) { _pkGatherPoint = pkGatherPoint; } public GraphLine[] getAllLines() { Vector ret = new Vector(); ret.addAll(Arrays.asList(_fkStubLines)); ret.addAll(Arrays.asList(getConnectLines())); ret.addAll(Arrays.asList(_pkStubLines)); return (GraphLine[]) ret.toArray(new GraphLine[ret.size()]); } public GraphLine[] getConnectLines() { if(0 == _foldingPoints.size()) { return new GraphLine[]{new GraphLine(_fkGatherPoint, _pkGatherPoint)}; } GraphLine[] ret = new GraphLine[_foldingPoints.size() + 1]; ret[0] = new GraphLine(_fkGatherPoint, (Point) _foldingPoints.get(0)); for (int i = 0; i < _foldingPoints.size() - 1; i++) { ret[i + 1] = new GraphLine((Point) _foldingPoints.get(i), (Point) _foldingPoints.get(i+1)); } ret[ret.length -1] = new GraphLine((Point) _foldingPoints.lastElement(), _pkGatherPoint); return ret; } public void setHitConnectLine(GraphLine line) { _hitConnectLine = line; _isHitOnConnectLine = true; } public void addFoldingPointToHitConnectLine(Point lastPopupClickPoint) { if(_fkGatherPoint.equals(_hitConnectLine.beg)) { _foldingPoints.insertElementAt(lastPopupClickPoint, 0); return; } for (int i = 0; i < _foldingPoints.size() - 1; i++) { if(_hitConnectLine.beg.equals(_foldingPoints.get(i))) { _foldingPoints.insertElementAt(lastPopupClickPoint, i+1); return; } } _foldingPoints.add(lastPopupClickPoint); } public Vector getFoldingPoints() { return _foldingPoints; } public void setHitFoldingPoint(Point foldingPoint) { _isHitOnConnectLine = false; _hitFoldingPoint = foldingPoint; } public boolean isHitOnConnectLine() { return _isHitOnConnectLine; } public void removeHitFoldingPoint() { _foldingPoints.remove(_hitFoldingPoint); } public void moveLastHitFoldingPointTo(Point point) { _foldingPoints.indexOf(_hitFoldingPoint); _foldingPoints.set(_foldingPoints.indexOf(_hitFoldingPoint), point); _hitFoldingPoint = point; } public void removeAllFoldingPoints() { _foldingPoints.clear(); } public Point getFirstFoldingPoint() { if(0 == _foldingPoints.size()) { return null; } else { return (Point) _foldingPoints.get(0); } } public Point getLastFoldingPoint() { if(0 == _foldingPoints.size()) { return null; } else { return (Point) _foldingPoints.get(_foldingPoints.size()-1); } } } --- NEW FILE: TableFrameControllerListener.java --- package net.sourceforge.squirrel_sql.plugins.graph; public interface TableFrameControllerListener { void closed(TableFrameController tfc); } --- NEW FILE: AddToGraphAction.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.client.action.SquirrelAction; import net.sourceforge.squirrel_sql.client.session.action.ISessionAction; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.client.session.mainpanel.objecttree.ObjectTreeNode; import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.fw.util.Resources; import net.sourceforge.squirrel_sql.fw.sql.DatabaseObjectType; import java.awt.event.ActionEvent; import java.awt.*; import java.util.Vector; public class AddToGraphAction extends SquirrelAction implements ISessionAction { /** * Current session. */ protected ISession _session; /** * Current plugin. */ protected final GraphPlugin _plugin; public AddToGraphAction(IApplication app, Resources rsrc, GraphPlugin plugin) { super(app, rsrc); _plugin = plugin; } public void actionPerformed(ActionEvent evt) { if (_session != null) { ObjectTreeNode[] selectedNodes = _session.getSessionSheet().getObjectTreePanel().getSelectedNodes(); Point[] refCascadeIndent = new Point[1]; GraphController toAddTo = null; for (int i = 0; i < selectedNodes.length; i++) { if (selectedNodes[i].getDatabaseObjectType() == DatabaseObjectType.TABLE) ; { if (null == toAddTo) { GraphController[] controllers = _plugin.getGraphControllers(_session); if (0 == controllers.length) { toAddTo = _plugin.createNewGraphControllerForSession(_session); } else { GraphSelectionDialogController dlg = new GraphSelectionDialogController(controllers, _session.getApplication().getMainFrame()); dlg.doModal(); if(false == dlg.isOK()) { return; } if(null == dlg.getSelectedController()) { toAddTo = _plugin.createNewGraphControllerForSession(_session); } else { toAddTo = dlg.getSelectedController(); } } } toAddTo.addTable(selectedNodes[i], refCascadeIndent); } } } } /** * Set the current session. * * @param session The current session. */ public void setSession(ISession session) { _session = session; } } --- NEW FILE: TableToolTipProvider.java --- package net.sourceforge.squirrel_sql.plugins.graph; import java.awt.event.MouseEvent; public interface TableToolTipProvider { String getToolTipText(MouseEvent event); } --- NEW FILE: ConstraintView.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ConstraintViewXmlBean; import javax.swing.*; import javax.swing.plaf.basic.BasicInternalFrameUI; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.util.Vector; public class ConstraintView implements GraphComponent { private GraphDesktopController _desktopController; private boolean _isSelected; private JPopupMenu _connectLinePopup; private JPopupMenu _foldingPointPopUp; private JMenuItem _mnuAddFoldingPoint; private JMenuItem _mnuShowDDL; private JMenuItem _mnuScriptDDL; private JMenuItem _mnuRemoveFoldingPoint; private Point _lastPopupClickPoint; private ConstraintGraph _constraintGraph = new ConstraintGraph(); private ConstraintData _constraintData; public static final int STUB_LENGTH = 20; private ISession _session; private TableFrameController _pkFramePointingTo; private ConstraintViewListener _constraintViewListener; public ConstraintView(ConstraintData constraintData, GraphDesktopController desktopController, ISession session) { _constraintData = constraintData; _desktopController = desktopController; _session = session; createPopup(); } public ConstraintView(ConstraintViewXmlBean constraintViewXmlBean, GraphDesktopController desktopController, ISession session) { _desktopController = desktopController; _session = session; _constraintData = new ConstraintData(constraintViewXmlBean.getConstraintDataXmlBean()); _constraintGraph = new ConstraintGraph(constraintViewXmlBean.getConstraintGraphXmlBean()); createPopup(); } public ConstraintViewXmlBean getXmlBean() { ConstraintViewXmlBean ret = new ConstraintViewXmlBean(); ret.setConstraintDataXmlBean(_constraintData.getXmlBean()); ret.setConstraintGraphXmlBean(_constraintGraph.getXmlBean()); return ret; } private void createPopup() { _connectLinePopup = new JPopupMenu(); _mnuAddFoldingPoint = new JMenuItem("add folding point"); _mnuAddFoldingPoint.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onAddFoldingPoint(); } }); _connectLinePopup.add(_mnuAddFoldingPoint); _mnuShowDDL = new JMenuItem("show DDL"); _mnuShowDDL.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onShowDDL(); } }); _connectLinePopup.add(_mnuShowDDL); _mnuScriptDDL = new JMenuItem("script DDL"); _mnuScriptDDL.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onScriptDDL(); } }); _connectLinePopup.add(_mnuScriptDDL); _foldingPointPopUp = new JPopupMenu(); _mnuRemoveFoldingPoint = new JMenuItem("remove folding point"); _mnuRemoveFoldingPoint.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onRemoveFoldingPoint(); } }); _foldingPointPopUp.add(_mnuRemoveFoldingPoint); } private void onRemoveFoldingPoint() { _constraintGraph.removeHitFoldingPoint(); _desktopController.repaint(); } private void onScriptDDL() { String[] lines = _constraintData.getDDL(); StringBuffer sb = new StringBuffer(); sb.append('\n'); for (int i = 0; i < lines.length; i++) { sb.append(lines[i]).append('\n'); } _session.getSessionSheet().getSQLEntryPanel().appendText(sb.toString()); } private void onShowDDL() { final String[] lines = _constraintData.getDDL(); final JInternalFrame ddlFrame = new JInternalFrame(_constraintData.getTitle(), true, true); StringBuffer sb = new StringBuffer(); sb.append(lines[0]); for (int i = 1; i < lines.length; i++) { sb.append('\n').append(lines[i]); } final JTextPane txtDDL = new JTextPane(); txtDDL.setText(sb.toString()); txtDDL.setEditable(false); ddlFrame.getContentPane().add(new JScrollPane(txtDDL)); _desktopController.addFrame(ddlFrame); ddlFrame.setBounds(_lastPopupClickPoint.x, _lastPopupClickPoint.y, 20, 20); ddlFrame.setVisible(true); SwingUtilities.invokeLater(new Runnable() { public void run() { recalculateDDLFrameSize(ddlFrame, txtDDL, lines); } }); } private void recalculateDDLFrameSize(JInternalFrame ddlFrame, JTextPane txtDDL, String[] lines) { FontMetrics fm = txtDDL.getFontMetrics(txtDDL.getFont()); int txtHeight = fm.getHeight() * lines.length; int txtWidht = 0; for (int i = 0; i < lines.length; i++) { txtWidht = Math.max(txtWidht, fm.stringWidth(lines[i])); } BasicInternalFrameUI ui = (BasicInternalFrameUI) ddlFrame.getUI(); int titleHeight = ui.getNorthPane().getHeight(); ddlFrame.setSize(txtWidht + 20, txtHeight + titleHeight + 20); } private void onAddFoldingPoint() { _constraintGraph.addFoldingPointToHitConnectLine(_lastPopupClickPoint); _desktopController.repaint(); } public void setConnectionPoints(ConnectionPoints fkPoints, ConnectionPoints pkPoints, TableFrameController pkFramePointingTo, ConstraintViewListener constraintViewListener) { _pkFramePointingTo = pkFramePointingTo; _constraintViewListener = constraintViewListener; int fkCenterY = getCenterY(fkPoints.points); int pkCenterY = getCenterY(pkPoints.points); int signFkStub = fkPoints.pointsAreLeftOfWindow ? -1:1; int signPkStub = pkPoints.pointsAreLeftOfWindow ? -1:1;; Point fkGatherPoint = new Point(fkPoints.points[0].x + signFkStub*STUB_LENGTH, fkCenterY); Point pkGatherPoint = new Point(pkPoints.points[0].x + signPkStub*STUB_LENGTH, pkCenterY); GraphLine[] fkStubLines = new GraphLine[fkPoints.points.length]; for (int i = 0; i < fkPoints.points.length; i++) { fkStubLines[i] = new GraphLine(fkPoints.points[i], fkGatherPoint); } _constraintGraph.setFkStubLines(fkStubLines); GraphLine[] pkStubLines = new GraphLine[pkPoints.points.length]; for (int i = 0; i < pkPoints.points.length; i++) { pkStubLines[i] = new GraphLine(pkPoints.points[i], pkGatherPoint); } _constraintGraph.setPkStubLines(pkStubLines); _constraintGraph.setFkGatherPoint(fkGatherPoint); _constraintGraph.setPkGatherPoint(pkGatherPoint); } public void paint(Graphics g) { GraphLine[] lines = _constraintGraph.getAllLines(); for (int i = 0; i < lines.length; i++) { drawLine(g, lines[i]); } Vector foldingPoints = _constraintGraph.getFoldingPoints(); for (int i = 0; i < foldingPoints.size(); i++) { drawFoldingPoint(g, (Point) foldingPoints.get(i)); } } private void drawFoldingPoint(Graphics g, Point fp) { int rad = 4; if (_isSelected) { rad = 5; } g.fillOval(fp.x - rad, fp.y -rad, 2*rad, 2*rad); } private void drawLine(Graphics g, GraphLine line) { if (_isSelected) { g.fillPolygon(createPolygon(line.beg.x, line.beg.y, line.end.x, line.end.y, 1)); } else { g.drawLine(line.beg.x, line.beg.y, line.end.x, line.end.y); } } public Polygon createPolygon(int x1, int y1, int x2, int y2, int halfThickness) { Polygon ret = new Polygon(); if (x1 < x2 && y1 < y2) { ret.addPoint(x1 + halfThickness, y1 - halfThickness); ret.addPoint(x1 - halfThickness, y1 + halfThickness); ret.addPoint(x2 - halfThickness, y2 + halfThickness); ret.addPoint(x2 + halfThickness, y2 - halfThickness); } else if (x1 > x2 && y1 > y2) { ret.addPoint(x1 - halfThickness, y1 + halfThickness); ret.addPoint(x1 + halfThickness, y1 - halfThickness); ret.addPoint(x2 + halfThickness, y2 - halfThickness); ret.addPoint(x2 - halfThickness, y2 + halfThickness); } else { ret.addPoint(x1 + halfThickness, y1 + halfThickness); ret.addPoint(x1 - halfThickness, y1 - halfThickness); ret.addPoint(x2 - halfThickness, y2 - halfThickness); ret.addPoint(x2 + halfThickness, y2 + halfThickness); } //System.out.println("("+ x1 + ", " + y1 + ") - (" + x2 + ", " + y2 +")"); return ret; } private int getCenterY(Point[] points) { int ret = 0; for (int i = 0; i < points.length; i++) { ret += points[i].y; } return ret / points.length; } public boolean hitMe(MouseEvent e) { Vector foldingPoints = _constraintGraph.getFoldingPoints(); int hitDist = 8; for (int i = 0; i < foldingPoints.size(); i++) { Point foldingPoint = (Point) foldingPoints.get(i); if( Math.abs(e.getPoint().x - foldingPoint.x) < hitDist && Math.abs(e.getPoint().y - foldingPoint.y) < hitDist ) { _constraintGraph.setHitFoldingPoint(foldingPoint); return true; } } GraphLine[] lines = _constraintGraph.getConnectLines(); for (int i = 0; i < lines.length; i++) { Polygon pg = createPolygon(lines[i].beg.x, lines[i].beg.y, lines[i].end.x, lines[i].end.y, 3); if (pg.contains(e.getPoint())) { _constraintGraph.setHitConnectLine(lines[i]); return true; } } return false; } public void setSelected(boolean b) { _isSelected = b; _desktopController.repaint(); } public boolean isSelected() { return _isSelected; } public void setDesktopController(GraphDesktopController desktopController) { _desktopController = desktopController; if(null == desktopController) { _constraintGraph.removeAllFoldingPoints(); } } public boolean equals(Object obj) { if (obj instanceof ConstraintView) { return ((ConstraintView) obj)._constraintData.equals(_constraintData); } else { return false; } } public int hashCode() { return _constraintData.hashCode(); } public ConstraintData getData() { return _constraintData; } public void mouseClicked(MouseEvent e) { } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { _lastPopupClickPoint = new Point(e.getX(), e.getY()); if(_constraintGraph.isHitOnConnectLine()) { _connectLinePopup.show(e.getComponent(), e.getX(), e.getY()); } else // hit is on folding point { _foldingPointPopUp.show(e.getComponent(), e.getX(), e.getY()); } } } public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseDragged(MouseEvent e) { if(false == _constraintGraph.isHitOnConnectLine()) { // hit is on folding point _constraintGraph.moveLastHitFoldingPointTo(e.getPoint()); _constraintViewListener.foldingPointMoved(this); } } public Point getFirstFoldingPoint() { return _constraintGraph.getFirstFoldingPoint(); } public Point getLastFoldingPoint() { return _constraintGraph.getLastFoldingPoint(); } public TableFrameController getPkFramePointingTo() { return _pkFramePointingTo; } public void replaceCopiedColsByReferences(ColumnInfo[] colInfos) { _constraintData.replaceCopiedColsByReferences(colInfos); } } --- NEW FILE: ConstraintData.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ConstraintDataXmlBean; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ColumnInfoXmlBean; import java.awt.*; import java.awt.event.MouseEvent; import java.util.Arrays; import java.util.Vector; public class ConstraintData { private String _pkTableName; private String _fkTableName; private String _constraintName; private ColumnInfo[] _columnInfos = new ColumnInfo[0]; public ConstraintData(String pkTableName, String fkTableName, String constraintName) { _pkTableName = pkTableName; _fkTableName = fkTableName; _constraintName = constraintName; } public ConstraintData(ConstraintDataXmlBean constraintDataXmlBean) { _pkTableName = constraintDataXmlBean.getPkTableName(); _fkTableName = constraintDataXmlBean.getFkTableName(); _constraintName = constraintDataXmlBean.getConstraintName(); _columnInfos = new ColumnInfo[constraintDataXmlBean.getColumnInfoXmlBeans().length]; for (int i = 0; i < _columnInfos.length; i++) { _columnInfos[i] = new ColumnInfo(constraintDataXmlBean.getColumnInfoXmlBeans()[i]); } } public ConstraintDataXmlBean getXmlBean() { ConstraintDataXmlBean ret = new ConstraintDataXmlBean(); ret.setPkTableName(_pkTableName); ret.setFkTableName(_fkTableName); ret.setConstraintName(_constraintName); ColumnInfoXmlBean[] colInfoXmlBeans = new ColumnInfoXmlBean[_columnInfos.length]; for (int i = 0; i < _columnInfos.length; i++) { colInfoXmlBeans[i] = _columnInfos[i].getXmlBean(); } ret.setColumnInfoXmlBeans(colInfoXmlBeans); return ret; } public void addColumnInfo(ColumnInfo colInfo) { Vector buf = new Vector(); buf.addAll(Arrays.asList(_columnInfos)); buf.add(colInfo); _columnInfos = (ColumnInfo[]) buf.toArray(new ColumnInfo[buf.size()]); } public String getPkTableName() { return _pkTableName; } public ColumnInfo[] getColumnInfos() { return _columnInfos; } public String getTitle() { return _fkTableName + "." + _constraintName; } public String[] getDDL() { Vector ret = new Vector(); ret.add("ALTER TABLE " + _fkTableName); ret.add("ADD CONSTRAINT " + _constraintName); if(_columnInfos.length == 1) { StringBuffer sb = new StringBuffer(); sb.append("FOREIGN KEY (").append(_columnInfos[0].getName()); for (int i = 1; i < _columnInfos.length; i++) { sb.append(",").append(_columnInfos[i].getName()); } sb.append(")"); ret.add(sb.toString()); sb.setLength(0); sb.append("REFERENCES ").append(_pkTableName).append("("); sb.append(_columnInfos[0].getImportedColumnName()); for (int i = 1; i < _columnInfos.length; i++) { sb.append(",").append(_columnInfos[i].getImportedColumnName()); } sb.append(")"); ret.add(sb.toString()); } else { ret.add("FOREIGN KEY"); ret.add("("); for (int i = 0; i < _columnInfos.length; i++) { if(i < _columnInfos.length -1) { ret.add(" " + _columnInfos[i].getName() + ","); } else { ret.add(" " + _columnInfos[i].getName()); } } ret.add(")"); ret.add("REFERENCES " + _pkTableName); ret.add("("); for (int i = 0; i < _columnInfos.length; i++) { if(i < _columnInfos.length -1) { ret.add(" " + _columnInfos[i].getImportedColumnName() + ","); } else { ret.add(" " + _columnInfos[i].getImportedColumnName()); } } ret.add(")"); } return (String[]) ret.toArray(new String[ret.size()]); } public void replaceCopiedColsByReferences(ColumnInfo[] colInfoRefs) { for (int i = 0; i < colInfoRefs.length; i++) { for (int j = 0; j < _columnInfos.length; j++) { if(colInfoRefs[i].getName().equals(_columnInfos[j].getName())) { _columnInfos[j] = colInfoRefs[i]; break; } } } } } --- NEW FILE: GraphDesktopController.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.client.session.ISession; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; public class GraphDesktopController { private GraphDesktopPane _desktopPane; private JScrollPane _scrollPane; private ConstraintView _lastPressedConstraintView; private JPopupMenu _popUp; private JMenuItem _mnuSaveGraph; private JMenuItem _mnuRenameGraph; private JMenuItem _mnuRemoveGraph; private GraphDesktopListener _listener; private ISession _session; public GraphDesktopController(GraphDesktopListener listener, ISession session) { _listener = listener; _session = session; _desktopPane = new GraphDesktopPane(); _desktopPane.setBackground(Color.white); _scrollPane = new JScrollPane(_desktopPane); _desktopPane.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { onMouseClicked(e); } public void mousePressed(MouseEvent e) { onMousePressed(e); } public void mouseReleased(MouseEvent e) { onMouseReleased(e); } }); _desktopPane.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { onMouseDragged(e); } }); createPopUp(); } private void createPopUp() { _popUp = new JPopupMenu(); _mnuSaveGraph = new JMenuItem("Save graph"); _mnuSaveGraph.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onSaveGraph(); } }); _mnuRenameGraph= new JMenuItem("Rename graph"); _mnuRenameGraph.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onRenameGraph(); } }); _mnuRemoveGraph= new JMenuItem("Remove graph"); _mnuRemoveGraph.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onRemoveGraph(); } }); _popUp.add(_mnuSaveGraph); _popUp.add(_mnuRenameGraph); _popUp.add(_mnuRemoveGraph); } private void onRemoveGraph() { int res = JOptionPane.showConfirmDialog(_session.getApplication().getMainFrame(), "Do you really wish to delete this graph?"); if(res == JOptionPane.YES_OPTION) { _listener.removeRequest(); } } private void onRenameGraph() { String newName = JOptionPane.showInputDialog(_session.getApplication().getMainFrame(), "Please enter a new name"); if(null != newName && 0 != newName.trim().length()) { _listener.renameRequest(newName); } } private void onSaveGraph() { _listener.saveGraphRequested(); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { _popUp.show(e.getComponent(), e.getX(), e.getY()); } } /** * It's called put because it adds unique, like a Hashtable. */ public void putConstraintViews(ConstraintView[] constraintViews) { _desktopPane.putGraphComponents(constraintViews); for (int i = 0; i < constraintViews.length; i++) { constraintViews[i].setDesktopController(this); } } public void removeConstraintViews(ConstraintView[] constraintViews) { _desktopPane.removeGraphComponents(constraintViews); for (int i = 0; i < constraintViews.length; i++) { constraintViews[i].setDesktopController(null); } } private void refreshSelection(ConstraintView hitOne, boolean allowDeselect) { if(allowDeselect) { hitOne.setSelected(!hitOne.isSelected()); } else if(false == hitOne.isSelected()) { hitOne.setSelected(true); } Vector graphComponents = _desktopPane.getGraphComponents(); for (int i = 0; i < graphComponents.size(); i++) { ConstraintView constraintView = (ConstraintView) graphComponents.elementAt(i); if(false == constraintView.equals(hitOne)) { constraintView.setSelected(false); } } } public void onMouseReleased(final MouseEvent e) { _lastPressedConstraintView = null; ConstraintView hitOne = findHit(e); if(null != hitOne) { hitOne.mouseReleased(e); } else { maybeShowPopup(e); } } public void onMousePressed(final MouseEvent e) { final ConstraintView hitOne = findHit(e); if(null != hitOne) { _lastPressedConstraintView = hitOne; if(InputEvent.BUTTON3_MASK == e.getModifiers()) { refreshSelection(hitOne, false); SwingUtilities.invokeLater(new Runnable() { public void run() { hitOne.mousePressed(e); } }); } else { hitOne.mousePressed(e); } } else { maybeShowPopup(e); } } public void onMouseClicked(final MouseEvent e) { final ConstraintView hitOne = findHit(e); if(null != hitOne) { refreshSelection(hitOne, InputEvent.BUTTON1_MASK == e.getModifiers() ); SwingUtilities.invokeLater(new Runnable() { public void run() { hitOne.mouseClicked(e); } }); } } private void onMouseDragged(MouseEvent e) { if(null != _lastPressedConstraintView) { _lastPressedConstraintView.mouseDragged(e); } } private ConstraintView findHit(MouseEvent e) { Vector graphComponents = _desktopPane.getGraphComponents(); for (int i = 0; i < graphComponents.size(); i++) { ConstraintView constraintView = (ConstraintView) graphComponents.elementAt(i); if(constraintView.hitMe(e)) { return constraintView; } } return null; } public void repaint() { _desktopPane.repaint(); } public Component getScrollPane() { return _scrollPane; } public void addFrame(JInternalFrame frame) { _desktopPane.add(frame); } public GraphDesktopPane getDesktopPane() { return _desktopPane; } } --- NEW FILE: GraphComponent.java --- package net.sourceforge.squirrel_sql.plugins.graph; import java.awt.*; public interface GraphComponent { void paint(Graphics g); } --- NEW FILE: ColumnSortListener.java --- package net.sourceforge.squirrel_sql.plugins.graph; public interface ColumnSortListener { void columnOrderChanged(); } --- NEW FILE: GraphPlugin.java --- package net.sourceforge.squirrel_sql.plugins.graph; /* * Copyright (C) 2004 Gerd Wagner * * 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 any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * 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. */ import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.client.action.ActionCollection; import net.sourceforge.squirrel_sql.client.plugin.DefaultSessionPlugin; import net.sourceforge.squirrel_sql.client.plugin.PluginException; import net.sourceforge.squirrel_sql.client.plugin.PluginResources; import net.sourceforge.squirrel_sql.client.session.IObjectTreeAPI; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.fw.sql.DatabaseObjectType; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.GraphXmlSerializer; import javax.swing.*; import java.net.URLClassLoader; import java.util.Hashtable; import java.util.Vector; import java.util.Arrays; /** * The SQL Script plugin class. */ public class GraphPlugin extends DefaultSessionPlugin { private Hashtable _grapControllersBySessionID = new Hashtable(); private interface IMenuResourceKeys { String GRAPH = "graph"; } /** * Logger for this class. */ private static ILogger s_log = LoggerController.createLogger(GraphPlugin.class); private PluginResources _resources; private URLClassLoader m_userScriptClassLoader; /** * Return the internal name of this plugin. * * @return the internal name of this plugin. */ public String getInternalName() { return "graph"; } /** * Return the descriptive name of this plugin. * * @return the descriptive name of this plugin. */ public String getDescriptiveName() { return "Table graph"; } /** * Returns the current version of this plugin. * * @return the current version of this plugin. */ public String getVersion() { return "0.01"; } /** * Returns the authors name. * * @return the authors name. */ public String getAuthor() { return "Gerd Wagner"; } /** * Returns the name of the change log for the plugin. This should * be a text or HTML file residing in the <TT>getPluginAppSettingsFolder</TT> * directory. * * @return the changelog file name or <TT>null</TT> if plugin doesn't have * a change log. */ public String getChangeLogFileName() { return "changes.txt"; } /** * Returns the name of the Help file for the plugin. This should * be a text or HTML file residing in the <TT>getPluginAppSettingsFolder</TT> * directory. * * @return the Help file name or <TT>null</TT> if plugin doesn't have * a help file. */ public String getHelpFileName() { return "readme.txt"; } /** * Returns the name of the Licence file for the plugin. This should * be a text or HTML file residing in the <TT>getPluginAppSettingsFolder</TT> * directory. * * @return the Licence file name or <TT>null</TT> if plugin doesn't have * a licence file. */ public String getLicenceFileName() { return "licence.txt"; } /** * Initialize this plugin. */ public synchronized void initialize() throws PluginException { super.initialize(); IApplication app = getApplication(); _resources = new PluginResources( "net.sourceforge.squirrel_sql.plugins.graph.graph", this); ActionCollection coll = app.getActionCollection(); coll.add(new AddToGraphAction(app, _resources, this)); } /** * Application is shutting down so save data. */ public void unload() { super.unload(); } /** * Called when a session started. Add commands to popup menu * in object tree. * * @param session The session that is starting. * @return <TT>true</TT> to indicate that this plugin is * applicable to passed session. */ public boolean sessionStarted(ISession session) { ActionCollection coll = getApplication().getActionCollection(); IObjectTreeAPI api = session.getObjectTreeAPI(this); api.addToPopup(DatabaseObjectType.TABLE, coll.get(AddToGraphAction.class)); GraphXmlSerializer[] serializers = GraphXmlSerializer.getGraphXmSerializers(this, session); GraphController[] controllers = new GraphController[serializers.length]; for (int i = 0; i < controllers.length; i++) { controllers[i] = new GraphController(session, this, serializers[i]); } _grapControllersBySessionID.put(session.getIdentifier(), controllers); return true; } public void sessionEnding(ISession session) { GraphController[] controllers = (GraphController[]) _grapControllersBySessionID.remove(session.getIdentifier()); // for (int i = 0; i < controllers.length; i++) // { // controllers[i].saveGraph(); // } } public GraphController[] getGraphControllers(ISession session) { return (GraphController[])_grapControllersBySessionID.get(session.getIdentifier()); } public String patchName(String name, ISession session) { int postfix = 0; if("Objects".equals(name)) { ++postfix; } if("SQL".equals(name)) { ++postfix; } GraphController[] controllers = (GraphController[]) _grapControllersBySessionID.get(session.getIdentifier()); while(true) { boolean incremented = false; for (int i = 0; i < controllers.length; i++) { if(0 == postfix) { if(controllers[i].getTitle().equals(name)) { ++postfix; incremented = true; } } else { if(controllers[i].getTitle().equals(name + "_" + postfix)) { ++postfix; incremented = true; } } } if(false == incremented) { break; } } if(0 == postfix) { return name; } else { return name + "_" + postfix; } } public GraphController createNewGraphControllerForSession(ISession session) { GraphController[] controllers = (GraphController[]) _grapControllersBySessionID.get(session.getIdentifier()); Vector v = new Vector(); if(null != controllers) { v.addAll(Arrays.asList(controllers)); } GraphController ret = new GraphController(session, this, null); v.add(ret); controllers = (GraphController[]) v.toArray(new GraphController[v.size()]); _grapControllersBySessionID.put(session.getIdentifier(), controllers); return ret; } public void removeGraphController(GraphController toRemove, ISession session) { GraphController[] controllers = (GraphController[]) _grapControllersBySessionID.get(session.getIdentifier()); Vector v = new Vector(); for (int i = 0; i < controllers.length; i++) { if(false == controllers[i].equals(toRemove)) { v.add(controllers[i]); } } controllers = (GraphController[]) v.toArray(new GraphController[v.size()]); _grapControllersBySessionID.put(session.getIdentifier(), controllers); } } --- NEW FILE: ConnectionPoints.java --- package net.sourceforge.squirrel_sql.plugins.graph; import java.awt.*; public class ConnectionPoints { Point[] points; boolean pointsAreLeftOfWindow; } --- NEW FILE: GraphLine.java --- package net.sourceforge.squirrel_sql.plugins.graph; import java.awt.*; public class GraphLine { public Point beg; public Point end; public GraphLine(Point begin, Point end) { this.beg = begin; this.end = end; } } --- NEW FILE: graph.properties --- ############################ # sqlplugin.properties ######## # Path to images. Should be terminated with a forward slash. ######## path.images=/net/sourceforge/squirrel_sql/plugins/graph/images/ ######## # Configuration information for Actions. ######## action.net.sourceforge.squirrel_sql.plugins.graph.AddToGraphAction.image= action.net.sourceforge.squirrel_sql.plugins.graph.AddToGraphAction.name=Add to graph action.net.sourceforge.squirrel_sql.plugins.graph.AddToGraphAction.tooltip=Add to graph ######## # Menus. ######## menu.graph.title=User Scripts menu.graph.mnemonic=U ######## # Menu items. ######## menuitem.net.sourceforge.squirrel_sql.plugins.graph.AddToGraphAction.accelerator= menuitem.net.sourceforge.squirrel_sql.plugins.graph.AddToGraphAction.mnemonic= --- NEW FILE: TableFrameController.java --- package net.sourceforge.squirrel_sql.plugins.graph; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ColumnInfoXmlBean; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.ConstraintViewXmlBean; import net.sourceforge.squirrel_sql.plugins.graph.xmlbeans.TableFrameControllerXmlBean; import javax.swing.*; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; import java.awt.*; import java.awt.event.*; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; public class TableFrameController { //////////////////////////////////////// // Serialized attributes private String _schema; private String _catalog; private String _tableName; private TableFrame _frame; private ColumnInfo[] _colInfos; private ConstraintView[] _constraintViews; private String[] _tablesExportedTo; // /////////////////////////////////////////// private ISession _session; private Rectangle _startSize; private GraphDesktopController _desktopController; private Vector _listeners = new Vector(); private Vector _openFramesConnectedToMe = new Vector(); private Hashtable _compListenersToOtherFramesByFrameCtrlr = new Hashtable(); private Hashtable _scrollListenersToOtherFramesByFrameCtrlr = new Hashtable(); private Hashtable _columnSortListenersToOtherFramesByFrameCtrlr = new Hashtable(); private Vector _mySortListeners = new Vector(); private JPopupMenu _popUp; private JMenuItem _mnuAddTableForForeignKey; private JMenuItem _mnuAddChildTables; private JMenuItem _mnuAddParentTables; private JMenuItem _mnuAddAllRelatedTables; private JCheckBoxMenuItem _mnuOrderByName; private JCheckBoxMenuItem _mnuPksAndConstraintsOnTop; private JCheckBoxMenuItem _mnuDbOrder; private AddTableListener _addTablelListener; private ConstraintViewListener _constraintViewListener; private int _columnOrder = ORDER_DB; private static final int ORDER_DB = 0; private static final int ORDER_NAME = 1; private static final int ORDER_PK_CONSTRAINT = 2; private ColumnInfo[] _orderedColumnInfos; private static final String MNU_PROP_COLUMN_INFO = "MNU_PROP_COLUMN_INFO"; public TableFrameController(ISession session, GraphDesktopController paintManager, AddTableListener listener, String tableName, TableFrameControllerXmlBean xmlBean) { try { _session = session; _desktopController = paintManager; _addTablelListener = listener; TableToolTipProvider toolTipProvider = new TableToolTipProvider() { public String getToolTipText(MouseEvent event) { return onGetToolTipText(event); } }; Hashtable constaintInfosByConstraintName = new Hashtable(); if(null == xmlBean) { _tableName = tableName; _frame = new TableFrame(_tableName, null, toolTipProvider); DatabaseMetaData metaData = _session.getSQLConnection().getConnection().getMetaData(); _catalog = _session.getSQLConnection().getCatalog(); ResultSet res; _schema = null; Vector colInfosBuf = new Vector(); res = metaData.getColumns(_catalog, null, _tableName, null); while(res.next()) { _schema = res.getString("TABLE_SCHEM"); String columnName = res.getString("COLUMN_NAME"); String columnType = res.getString("TYPE_NAME"); int columnSize = res.getInt("COLUMN_SIZE"); boolean nullable = "YES".equals(res.getString("IS_NULLABLE")); ColumnInfo colInfo = new ColumnInfo(columnName, columnType, columnSize, nullable); colInfosBuf.add(colInfo); } _colInfos = (ColumnInfo[]) colInfosBuf.toArray(new ColumnInfo[colInfosBuf.size()]); res = metaData.getPrimaryKeys(_catalog, _schema, _tableName); while(res.next()) { for (int i = 0; i < _colInfos.length; i++) { if(_colInfos[i].getName().equals(res.getString("COLUMN_NAME"))) { _colInfos[i].markPrimaryKey(); } } } res = metaData.getImportedKeys(_catalog, _schema, _tableName); while(res.next()) { ColumnInfo colInfo = findColumnInfo(res.getString("FKCOLUMN_NAME")); colInfo.setImportData(res.getString("PKTABLE_NAME"), res.getString("PKCOLUMN_NAME"), res.getString("FK_NAME")); ConstraintData constraintData = (ConstraintData) constaintInfosByConstraintName.get(res.getString("FK_NAME")); if(null == constraintData) { constraintData = new ConstraintData(res.getString("PKTABLE_NAME"), _tableName, res.getString("FK_NAME")); constaintInfosByConstraintName.put(res.getString("FK_NAME"), constraintData); } constraintData.addColumnInfo(colInfo); } ConstraintData[] buf = (ConstraintData[]) constaintInfosByConstraintName.values().toArray(new ConstraintData[0]); _constraintViews = new ConstraintView[buf.length]; for (int i = 0; i < buf.length; i++) { _constraintViews[i] = new ConstraintView(buf[i], _desktopController, _session); } } else { _tableName = xmlBean.getTablename(); _frame = new TableFrame(_tableName, xmlBean.getTableFrameXmlBean(), toolTipProvider); _catalog = xmlBean.getCatalog(); _schema = xmlBean.getSchema(); _columnOrder = xmlBean.getColumOrder(); _colInfos = new ColumnInfo[xmlBean.getColumnIfoXmlBeans().length]; for (int i = 0; i < _colInfos.length; i++) { _colInfos[i] = new ColumnInfo(xmlBean.getColumnIfoXmlBeans()[i]); } _constraintViews = new ConstraintView[xmlBean.getConstraintViewXmlBeans().length]; for (int i = 0; i < _constraintViews.length; i++) { _constraintViews[i] = new ConstraintView(xmlBean.getConstraintViewXmlBeans()[i], _desktopController, _session); _constraintViews[i].replaceCopiedColsByReferences(_colInfos); } } _constraintViewListener = new ConstraintViewListener() { public void foldingPointMoved(ConstraintView source) { onFoldingPointMoved(source); } }; _frame.addInternalFrameListener(new InternalFrameAdapter() { public void internalFrameClosing(InternalFrameEvent e) { onClose(); } }); _frame.addComponentListener(new ComponentAdapter() { public void componentMoved(ComponentEvent e) { recalculateAllConnections(); } public void componentResized(ComponentEvent e) { recalculateAllConnections(); } public void componentShown(ComponentEvent e) { recalculateAllConnections(); } }); _frame.scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { recalculateAllConnections(); } }); createPopUp(); orderColumns(); } catch (SQLException e) { throw new RuntimeException(e); } } private String onGetToolTipText(MouseEvent event) { ColumnInfo ci = getColumnInfoForPoint(event.getPoint()); if(null == ci) { return null; } return ci.getConstraintToolTipText(); } private ColumnInfo getColumnInfoForPoint(Point point) { FontMetrics fm = _frame.txtColums.getGraphics().getFontMetrics(_frame.txtColums.getFont()); for (int i = 0; i < _colInfos.length; i++) { int unscrolledHeight = _colInfos[i].getIndex() * fm.getHeight(); if(unscrolledHeight <= point.y && point.y <= unscrolledHeight + fm.getHeight()) { return _colInfos[i]; } } return null; } public TableFrameControllerXmlBean getXmlBean() { TableFrameControllerXmlBean ret = new TableFrameControllerXmlBean(); ret.setSchema(_schema); ret.setCatalog(_catalog); ret.setTablename(_tableName); ret.setTableFrameXmlBean(_frame.getXmlBean()); ret.setColumOrder(_columnOrder); ColumnInfoXmlBean[] colXmlBeans = new ColumnInfoXmlBean[_colInfos.length]; for (int i = 0; i < _colInfos.length; i++) { colXmlBeans[i] = _colInfos[i].getXmlBean(); } ret.setColumnIfoXmlBeans(colXmlBeans); ConstraintViewXmlBean[] constViewXmlBeans = new ConstraintViewXmlBean[_constraintViews.length]; for (int i = 0; i < _constraintViews.length; i++) { constViewXmlBeans[i] =_constraintViews[i].getXmlBean(); } ret.setConstraintViewXmlBeans(constViewXmlBeans); ret.setTablesExportedTo(_tablesExportedTo); return ret; } private void createPopUp() { _popUp = new JPopupMenu(); _mnuAddTableForForeignKey = new JMenuItem(); _mnuAddTableForForeignKey.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onAddTableForForeignKey((ColumnInfo)_mnuAddTableForForeignKey.getClientProperty(MNU_PROP_COLUMN_INFO)); } }); _mnuAddChildTables = new JMenuItem("Add child tables"); _mnuAddChildTables.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onAddChildTables(); } }); _mnuAddParentTables = new JMenuItem("Add parent tables"); _mnuAddParentTables.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onAddParentTables(); } }); _mnuAddAllRelatedTables = new JMenuItem("Add all related tables"); _mnuAddAllRelatedTables.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ... [truncated message content] |