/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.gui; import net.codjo.gui.toolkit.util.ErrorDialog; import net.codjo.model.Table; import net.codjo.utils.GuiUtil; import net.codjo.utils.sql.GenericTable; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JDesktopPane; import javax.swing.JPanel; import javax.swing.JScrollPane; 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.TreeSelectionModel; /** * Explorateur de tables BD. * * @version $Revision: 1.4 $ */ public class ExplorerDataWindow extends javax.swing.JInternalFrame { private static final String EMPTY_STRING = ""; JPanel filterPanel = new JPanel(); Border border1; TitledBorder titledBorder1; JPanel explorerPanel = new JPanel(); BorderLayout borderLayout1 = new BorderLayout(); GridBagLayout gridBagLayout1 = new GridBagLayout(); BorderLayout borderLayout2 = new BorderLayout(); private JDesktopPane gexPane; private List filters; private ExplorerTreeBuilder explorer; private ExplorerRecordAccessFilter recordAccessFilter; private ToolBarBuilder toolBarBuilder; /** * Constructeur. * * @param dp Le destopPane. * @param filters Liste des filtres d'affichage. * @param exp L'explorateur permettant de r�cup�rer le JTree sp�cifique � l'application. * @param recordFilter Filtre sur la visibilit� des enregistrements des tables partag�es entre plusieurs * applications (si non renseign� on prend par d�faut le DefaultExplorerRecordAccessFilter * qui renvoie une chaine vide comme clause where obligatoire). * @param toolBar Le constructeur de la toolBar. * * @throws IllegalArgumentException TODO */ public ExplorerDataWindow(JDesktopPane dp, List filters, ExplorerTreeBuilder exp, ExplorerRecordAccessFilter recordFilter, ToolBarBuilder toolBar) { super("Explorateur des donn�es", true, true, false, true); if (dp == null || filters == null || toolBar == null) { throw new IllegalArgumentException("Un parametre n'est pas renseign� !"); } this.gexPane = dp; this.filters = filters; toolBarBuilder = toolBar; explorer = exp; if (recordFilter != null) { recordAccessFilter = recordFilter; } else { recordAccessFilter = new DefaultExplorerRecordAccessFilter(); } initFilters(); jbInit(); pack(); } /** * Affiche la table choisie par un double-click en tenant compte des filtres d'affichage. * * @param table Table � afficher. */ public void execute(Table table) { try { GenericTable geneTable = new GenericTable(table, true, buildWhereClause(table)); TableViewWindow tvw = new TableViewWindow(gexPane, geneTable, buildWhereClause(table), toolBarBuilder); gexPane.add(tvw); GuiUtil.centerWindow(tvw); tvw.setVisible(true); try { tvw.setSelected(true); } catch (java.beans.PropertyVetoException ex) { ex.printStackTrace(); } } catch (Exception es) { ErrorDialog.show(ExplorerDataWindow.this, "Impossible d'afficher la table", es); es.printStackTrace(); } } /** * Construit la clause where pour le filtrage des donn�es de la table. * * @param table La Table � afficher. * * @return La String de la clause where. */ private String buildWhereClause(Table table) { String whereClause = EMPTY_STRING; if (filters != null) { String filterClause; for (int i = 0; i < filters.size(); i++) { if (table.containsColumn( ((ExplorerFilter)filters.get(i)).getFilterColumnName())) { filterClause = ((ExplorerFilter)filters.get(i)).getWhereClause(); if (!filterClause.equals(EMPTY_STRING)) { if (whereClause.equals(EMPTY_STRING)) { whereClause += " where " + table.getDBTableName() + "." + filterClause; } else { whereClause += " and " + table.getDBTableName() + "." + filterClause; } } } } } whereClause += buildMandatoryWhereClause(whereClause, table); return whereClause; } /** * Initialise les filtres d'affichage des tables. Cette m�thode ajoute les filtres (Jlabel + JComponent) * dans le filterPanel. */ private void initFilters() { filterPanel.setLayout(gridBagLayout1); int gridy; gridy = 0; for (int i = 0; i < filters.size(); i++) { filterPanel.add(((ExplorerFilter)filters.get(i)).getLabel(), new GridBagConstraints(0, gridy, 2, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0)); filterPanel.add(((ExplorerFilter)filters.get(i)).getComponent(), new GridBagConstraints(1, gridy, 2, 1, 1.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 80, 5, 5), 0, 0)); gridy++; } } /** * Init GUI. */ private void jbInit() { final JTree tree = explorer.getTree(); border1 = BorderFactory.createEtchedBorder(Color.white, new Color(134, 134, 134)); titledBorder1 = new TitledBorder(border1, "Filtres d'affichage"); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.putClientProperty("JTree.lineStyle", "Angled"); tree.setShowsRootHandles(true); //Enable tool tips. ToolTipManager.sharedInstance().registerComponent(tree); //Create the scroll pane and add the tree to it. setFrameIcon(UIManager.getIcon("DataExplorer.open")); this.setPreferredSize(new Dimension(325, 600)); this.getContentPane().setBackground(Color.lightGray); this.getContentPane().setLayout(borderLayout2); MouseListener ml = new java.awt.event.MouseAdapter() { /** * Determine la table s�lectionn�e par un double 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() == 2) { Table table = (Table)nodeInfo.getUserObject(); execute(table); } } } }; tree.addMouseListener(ml); filterPanel.setBorder(titledBorder1); explorerPanel.setLayout(borderLayout1); JScrollPane treeView = new JScrollPane(tree); this.getContentPane().add(explorerPanel, BorderLayout.CENTER); explorerPanel.add(treeView, BorderLayout.CENTER); this.getContentPane().add(filterPanel, BorderLayout.NORTH); } /** * Construit (si elle existe) la clause where obligatoire pour le filtrage des donn�es des tables * partag�es entre plusieurs applcations. * * @param whereClause La clause where initiale (filtres de l'explorateur). * @param table La table. * * @return La clause where initiale + la clause where obligatoire. */ private String buildMandatoryWhereClause(String whereClause, Table table) { String mandatoryWhereClause = EMPTY_STRING; if (recordAccessFilter != null) { String clause = recordAccessFilter.getMandatoryWhereClause(table); if (!clause.equals(EMPTY_STRING)) { if (whereClause.equals(EMPTY_STRING)) { mandatoryWhereClause = " where " + clause; } else { mandatoryWhereClause = " and " + clause; } } } return mandatoryWhereClause; } }