Java tutorial
/* * Copyright (c) 2008, SQL Power Group Inc. * * This file is part of Power*Architect. * * Power*Architect 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 3 of the License, or * (at your option) any later version. * * Power*Architect 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, see <http://www.gnu.org/licenses/>. */ package ca.sqlpower.architect.swingui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import org.apache.log4j.Logger; import ca.sqlpower.architect.profile.ColumnProfileResult; import ca.sqlpower.architect.profile.ProfileManager; import ca.sqlpower.architect.profile.TableProfileResult; import ca.sqlpower.architect.swingui.table.ProfileTableModel; import ca.sqlpower.sqlobject.SQLColumn; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.debug.FormDebugPanel; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * Let the user choose a column for profiling and display the Profile results */ public class ProfilePanel extends JPanel { static Logger logger = Logger.getLogger(ProfilePanel.class); private final ProfileTableModel profileTableModel; private JComboBox tableSelector; private JList columnSelector; private JPanel controlsArea; private ProfileGraphPanel displayPanel; private final ProfileManager pm; private final JProgressBar progressBar = new JProgressBar(); private JTabbedPane tabPane; private ProfileTableModel tableModel; private TableModelListener listener = new TableModelListener() { public void tableChanged(TableModelEvent e) { resetTableSelectorModel(); } }; public ProfilePanel(ProfileTableModel profileTableModel, ProfileManager pm) { this.profileTableModel = profileTableModel; this.pm = pm; displayPanel = new ProfileGraphPanel(this, 0); setup(); } private void setup() { progressBar.setVisible(false); FormLayout controlsLayout = new FormLayout("4dlu,fill:min(150dlu;default):grow, 4dlu", // columns "default, 4dlu, fill:min(200dlu;default):grow,4dlu,default"); // rows CellConstraints cc = new CellConstraints(); setLayout(new BorderLayout()); controlsArea = logger.isDebugEnabled() ? new FormDebugPanel(controlsLayout) : new JPanel(controlsLayout); controlsArea.setLayout(new BoxLayout(controlsArea, BoxLayout.Y_AXIS)); tableSelector = new JComboBox(); tableSelector.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { TableProfileResult tpr = (TableProfileResult) value; StringBuffer buf = new StringBuffer(); if (tpr != null) { buf.append(tpr.getProfiledObject().getName()); buf.append(" ("); DateFormat df = DateFormat.getDateTimeInstance(); buf.append(df.format(new Date(tpr.getCreateStartTime()))); buf.append(")"); } else { buf.append("All"); } return super.getListCellRendererComponent(list, buf.toString(), index, isSelected, cellHasFocus); } }); tableSelector.addActionListener(new ActionListener() { /* * Called when the user selects a table; displays its profile (fast) */ public void actionPerformed(ActionEvent e) { final TableProfileResult tpr = (TableProfileResult) tableSelector.getSelectedItem(); try { List<SQLColumn> columns = new ArrayList<SQLColumn>(); if (tpr == null) { for (TableProfileResult tableProfile : tableModel.getTableResultsToScan()) { for (ColumnProfileResult cpr : tableProfile.getColumnProfileResults()) { columns.add(cpr.getProfiledObject()); } } } else { for (ColumnProfileResult cpr : tpr.getColumnProfileResults()) { SQLColumn column = cpr.getProfiledObject(); columns.add(column); } } SQLColumn selectedColumn = null; if (columnSelector.getSelectedIndex() >= 0) { selectedColumn = (SQLColumn) columnSelector.getSelectedValues()[0]; } columnSelector.setModel(new DefaultComboBoxModel(columns.toArray())); if (columns.size() > 0) { if (selectedColumn != null && columns.contains(selectedColumn)) { columnSelector.setSelectedValue(selectedColumn, true); } else { columnSelector.setSelectedIndex(0); } } } catch (Exception ex) { ASUtils.showExceptionDialogNoReport(ProfilePanel.this, "Error in profile", ex); } } }); columnSelector = new JList(); // TODO maybe someday we can allow the user to compare profiles by removing this... columnSelector.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); columnSelector.addListSelectionListener(new ListSelectionListener() { /* * Called when the user selects a column; gets its profile (fast) */ public void valueChanged(ListSelectionEvent e) { SQLColumn col = (SQLColumn) columnSelector.getSelectedValue(); if (col == null) { logger.debug("Null selection in columnSelector.ListSelectionListener"); return; } for (final ColumnProfileResult pr : tableModel.getResultList()) { SQLColumn column = (SQLColumn) pr.getProfiledObject(); if (col == column) { displayPanel.displayProfile((ColumnProfileResult) pr); break; } } } }); PanelBuilder pb = new PanelBuilder(controlsLayout, controlsArea); pb.setDefaultDialogBorder(); pb.add(tableSelector, cc.xy(2, 1)); pb.add(new JScrollPane(columnSelector), cc.xy(2, 3)); pb.add(progressBar, cc.xy(2, 5)); this.add(controlsArea, BorderLayout.WEST); this.add(displayPanel.getDisplayArea(), BorderLayout.CENTER); } public JList getColumnSelector() { return columnSelector; } public void setColumnSelector(JList columnSelector) { this.columnSelector = columnSelector; } public JComboBox getTableSelector() { return tableSelector; } public void setTableSelector(JComboBox tableSelector) { this.tableSelector = tableSelector; } public JTabbedPane getTabPane() { return tabPane; } public void setTabPane(JTabbedPane tabPane) { this.tabPane = tabPane; } public ProfileTableModel getTableModel() { return tableModel; } public void setTableModel(ProfileTableModel tableModel) { if (this.tableModel != null) { this.tableModel.removeTableModelListener(listener); } this.tableModel = tableModel; if (this.tableModel != null) { this.tableModel.addTableModelListener(listener); } resetTableSelectorModel(); } public void resetTableSelectorModel() { List<TableProfileResult> tableResults = new ArrayList<TableProfileResult>(); TableProfileResult selectedResult = null; if (tableSelector.getSelectedIndex() >= 0) { selectedResult = (TableProfileResult) tableSelector.getSelectedObjects()[0]; } tableResults.add(null); for (TableProfileResult pr : profileTableModel.getTableResultsToScan()) { tableResults.add(pr); } tableSelector.setModel(new DefaultComboBoxModel(tableResults.toArray())); if (tableSelector.getModel().getSize() > 0) { if (selectedResult != null && tableResults.contains(selectedResult)) { tableSelector.setSelectedItem(selectedResult); } else { tableSelector.setSelectedIndex(0); } } } public ProfileManager getProfileManager() { return pm; } public void close() { displayPanel.close(); } }