/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.gui; import net.codjo.gui.model.TableReferenceComparator; import net.codjo.gui.renderer.DBFieldNameRenderer; import net.codjo.gui.renderer.FieldNameRenderer; import net.codjo.gui.toolkit.util.ErrorDialog; import net.codjo.model.Table; import net.codjo.persistent.Reference; import net.codjo.utils.ConnectionManager; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeSelectionModel; /** * Explorateur de tables BD. * * @version $Revision: 1.8 $ */ public class ExplorerTableWindow extends javax.swing.JInternalFrame { private static List listTable; private static JTextArea textArea = new JTextArea(); private InternalListener listener = new InternalListener(); private JPanel choix = new JPanel(); private JComboBox comboChoice = new JComboBox(); private String displayFilter = "physique"; private TableReferenceComparator comparator = new TableReferenceComparator(TableReferenceComparator.COMPARE_BY_DB_TABLE_NAME); BorderLayout borderLayout1 = new BorderLayout(); private JTree tree = null; /** * Constructor for the AdministrationWindow object * * @throws Exception Description of Exception */ public ExplorerTableWindow() throws Exception { super("Explorateur des tables", true, true, false, true); listTable = Dependency.getTableHome().getAllObjects(); Collections.sort(listTable, comparator); tree = new JTree(createNodes(displayFilter)); jbInit(); comboChoice.addActionListener(listener); pack(); } /** * Init GUI. construit le tree avec la valeur "physique" par defaut * * @throws Exception Description of Exception */ private void jbInit() throws Exception { comboChoice.addItem("Par Nom Physique"); comboChoice.addItem("Par Nom Logique"); treeConstructor("physique"); } /** * Construit le tree de navigation avec un parametre d'affichage * * @param choixAffiche Description of the Parameter * * @throws Exception Description of the Exception */ private void treeConstructor(String choixAffiche) throws Exception { final String variable = choixAffiche; Border border1 = BorderFactory.createEtchedBorder(Color.white, new Color(134, 134, 134)); TitledBorder titledBorder1 = new TitledBorder(border1, "Type d'affichage"); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.putClientProperty("JTree.lineStyle", "Angled"); tree.setShowsRootHandles(true); tree.setCellRenderer(new ExplorerTableRenderer()); //Enable tool tips. ToolTipManager.sharedInstance().registerComponent(tree); setFrameIcon(UIManager.getIcon("dbExplorer.FreeTable")); this.setEnabled(true); this.setPreferredSize(new Dimension(340, 630)); //Create the scroll pane and add the tree to it. JScrollPane scrollPane = new JScrollPane(tree); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //Create a text field. textArea.setEditable(false); //Add to a split pane. JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, textArea); splitPane.setOneTouchExpandable(true); splitPane.setDividerSize(10); splitPane.setDividerLocation(510); JPanel panel = new JPanel(new BorderLayout()); choix.setBorder(titledBorder1); choix.setLayout(borderLayout1); panel.add(splitPane, BorderLayout.CENTER); panel.add(choix, BorderLayout.NORTH); choix.add(comboChoice, BorderLayout.CENTER); this.getContentPane().add(panel, null); setContentPane(panel); tree.addMouseListener(getMouseListener(variable)); // rafraichit l'affichage! this.setSize(this.getSize()); } private MouseListener getMouseListener(final String variable) { return new java.awt.event.MouseAdapter() { /** * Affiche les caracteristiques du champ ou de la table s�lectionn� par * un click. * * @param evt Evenement de la souris. */ public void mousePressed(MouseEvent evt) { DefaultMutableTreeNode nodeInfo = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); int selRow = tree.getRowForLocation(evt.getX(), evt.getY()); if (selRow != -1) { if (evt.getClickCount() == 1) { if (nodeInfo.isLeaf()) { try { if ("logique".equals(variable)) { textArea.setText("Nom Logique : " + nodeInfo.getUserObject().toString() + '\n' + "Nom Physique : " + findDBFieldName(findDBTableName( nodeInfo.getParent().toString()), (String)nodeInfo.getUserObject() .toString())); } else { textArea.setText("Nom physique : " + nodeInfo.getUserObject().toString() + '\n' + "Nom logique : " + findFieldName( nodeInfo.getParent().toString(), nodeInfo.getUserObject().toString())); } } catch (Exception es) { ErrorDialog.show(ExplorerTableWindow.this, "Erreur SQL", es); } } else { try { if ("logique".equals(variable)) { textArea.setText("Nom Logique : " + nodeInfo.getUserObject().toString() + '\n' + "Nom Physique : " + findDBTableName( nodeInfo.getUserObject().toString())); } else { textArea.setText("Nom physique : " + nodeInfo.getUserObject().toString() + '\n' + "Nom logique : " + findTableName( nodeInfo.getUserObject().toString())); } } catch (Exception pe) { ErrorDialog.show(ExplorerTableWindow.this, "Erreur de Persistence", pe); } } } } } }; } /** * Description of the Method * * @param tableDisplayFilter Description of the Parameter * * @return Description of the Return Value * * @throws Exception Description of the Exception */ private DefaultMutableTreeNode createNodes(String tableDisplayFilter) throws Exception { DefaultMutableTreeNode top = new DefaultMutableTreeNode("Liste des tables"); Connection con = null; ConnectionManager connectManager = null; String dBTableName; String dBFieldName = ""; Map labelMap = null; try { connectManager = Dependency.getConnectionManager(); con = connectManager.getConnection(); //Boucle sur les tables for (int cptTable = 0; cptTable < listTable.size(); cptTable++) { Table table = (Table)((Reference)listTable.get(cptTable)).getObject(); // pour ne pas prendre en compte les tables tempo if (!table.getDBTableName().startsWith("#")) { if ("logique".equals(tableDisplayFilter)) { dBTableName = table.getTableName(); labelMap = findFieldLabel(table.getDBTableName(), con); } else { dBTableName = table.getDBTableName(); } DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode(dBTableName); top.add(tableNode); List fieldList = new ArrayList(table.getAllColumns().keySet()); Collections.sort(fieldList); for (int cptField = 0; cptField < fieldList.size(); cptField++) { String dbname = (String)fieldList.get(cptField); if ("logique".equals(tableDisplayFilter)) { try { // dBFieldName = findFieldLabel(table.getDBTableName(), (String) fieldList.get(cptField)); if (labelMap.containsKey(dbname)) { dBFieldName = (String)labelMap.get(dbname); } else { dBFieldName = dbname; } } catch (Exception ex) { ex.printStackTrace(); } } else { dBFieldName = dbname; } tableNode.add(new DefaultMutableTreeNode(dBFieldName)); } } } } catch (Exception ex) { //Pb de parametrage de l'affichage des tables ex.printStackTrace(); } finally { connectManager.releaseConnection(con); } return top; } /** * Retourne le nom logique (label) d'une table. * * @param dbTableName Nom physique de la table. * * @return Le nom logique de la table. * * @throws Exception Description of the Exception */ private static String findTableName(String dbTableName) throws Exception { String tableName = ""; String dbTabName; int cpt = 0; do { dbTabName = ((Table)((Reference)listTable.get(cpt)).getObject()).getDBTableName(); if (dbTabName.equals(dbTableName)) { tableName = ((Table)((Reference)listTable.get(cpt)).getObject()).getTableName(); } cpt++; } while ((!dbTabName.equals(dbTableName)) && (cpt < listTable.size())); return tableName; } /** * Cherche le nom physique d'une Table * * @param tableName Description of the Parameter * * @return Description of the Return Value * * @throws Exception Description of the Exception */ private static String findDBTableName(String tableName) throws Exception { String dbtableName = ""; String tabName; int cpt = 0; do { tabName = ((Table)((Reference)listTable.get(cpt)).getObject()).getTableName(); if (tabName.equals(tableName)) { dbtableName = ((Table)((Reference)listTable.get(cpt)).getObject()).getDBTableName(); } cpt++; } while ((!tabName.equals(tableName)) && (cpt < listTable.size())); return dbtableName; } /** * Cherche le nom logique d'un champ * * @param dbTableName Description of the Parameter * @param dbFieldName Description of the Parameter * * @return Description of the Return Value * * @throws SQLException Description of the Exception */ private String findFieldName(String dbTableName, String dbFieldName) throws SQLException { Connection con = null; String fieldName = ""; Statement stmt = null; Map traductTable = FieldNameRenderer.loadTraducTable(Dependency.getConnectionManager(), dbTableName); try { if (traductTable.containsKey(dbFieldName)) { fieldName = (String)traductTable.get(dbFieldName); } else { fieldName = dbFieldName; } } finally { Dependency.getConnectionManager().releaseConnection(con, stmt); } return fieldName; } /** * Cherche le nom physique d'un champ * * @param dbTableName Description of the Parameter * @param fieldName Description of the Parameter * * @return Description of the Return Value * * @throws SQLException Description of the Exception */ private String findDBFieldName(String dbTableName, String fieldName) throws SQLException { Connection con = null; String dbfieldName = ""; Statement stmt = null; Map traductTable = DBFieldNameRenderer.loadDBName(Dependency.getConnectionManager(), dbTableName); try { if (traductTable.containsKey(fieldName)) { dbfieldName = (String)traductTable.get(fieldName); } else { dbfieldName = fieldName; } } finally { Dependency.getConnectionManager().releaseConnection(con, stmt); } return dbfieldName; } /** * Retourne les noms logiques pour la construction de l'arbre * * @param dbTableName Description of the Parameter * @param con Description of the Parameter * * @return Description of the Return Value * * @throws SQLException Description of the Exception */ private Map findFieldLabel(String dbTableName, Connection con) throws SQLException { Statement stmt = null; Map fieldMap = new HashMap(); stmt = con.createStatement(); String query = "select DB_FIELD_NAME,FIELD_LABEL from PM_FIELD_LABEL " + " where DB_TABLE_NAME='" + dbTableName + "'"; ResultSet rs = stmt.executeQuery(query); while (rs.next()) { fieldMap.put(rs.getString("DB_FIELD_NAME"), rs.getString("FIELD_LABEL")); } return fieldMap; } /** * Renderer pour les tables de l'arbre (feuille). * * @author $Author: acharif $ * @version $Revision: 1.8 $ */ private static class ExplorerTableRenderer extends DefaultTreeCellRenderer { private Icon freeTable; /** * Constructor for the MyRenderer object */ ExplorerTableRenderer() { freeTable = UIManager.getIcon("dbExplorer.FreeTable"); } /** * Gets the TreeCellRendererComponent attribute of the MyRenderer object * * @param tree - * @param value - * @param sel - * @param expanded - * @param leaf - * @param row - * @param hasFocus - * * @return The TreeCellRendererComponent value */ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); if (leaf) { try { setIcon(freeTable); setToolTipText(node.getUserObject().toString()); } catch (Exception ex) { ex.printStackTrace(); } } else { try { setToolTipText(findTableName(node.getUserObject().toString())); } catch (Exception pe) { ErrorDialog.show(null, "Erreur de Persistence", pe); } } return this; } } /** * Listner sur le comboBox qui affecte la variable displayFilter � logique ou physique et reconstruit le * tree. * * @author BCHIR */ class InternalListener implements ActionListener { /** * Description of the Method * * @param parm1 Description of the Parameter */ public void actionPerformed(ActionEvent parm1) { String comboValue = (String)comboChoice.getSelectedItem(); try { if ("Par Nom Logique".equals(comboValue)) { Collections.sort(listTable, new TableReferenceComparator( TableReferenceComparator.COMPARE_BY_TABLE_NAME)); tree = new JTree(createNodes("logique")); treeConstructor("logique"); } else { Collections.sort(listTable, new TableReferenceComparator( TableReferenceComparator.COMPARE_BY_DB_TABLE_NAME)); tree = new JTree(createNodes("physique")); treeConstructor("physique"); } } catch (Exception pe) { ErrorDialog.show(null, "Erreur de Persistence", pe); } } } }