/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.desktop.filters; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.gephi.desktop.filters.library.FiltersExplorer; import org.gephi.desktop.filters.query.QueryExplorer; import org.gephi.filters.api.FilterController; import org.gephi.filters.api.FilterModel; import org.gephi.filters.api.Query; import org.gephi.ui.utils.UIUtils; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.explorer.ExplorerManager; import org.openide.util.Lookup; import org.openide.util.NbBundle; /** * * @author Mathieu Bastian */ public class FiltersPanel extends javax.swing.JPanel implements ExplorerManager.Provider, ChangeListener { private ExplorerManager manager = new ExplorerManager(); //Models private FilterModel filterModel; private FilterUIModel uiModel; //Components private FilterPanelPanel filterPanelPanel; private QueryExplorer queriesExplorer; private QueriesPanel queriesPanel; public FiltersPanel() { initComponents(); //Toolbar Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N toolbar.setBorder(b); if (UIUtils.isAquaLookAndFeel()) { toolbar.setBackground(UIManager.getColor("NbExplorerView.background")); setBackground(UIManager.getColor("NbExplorerView.background")); } //Components queriesPanel = new QueriesPanel(); southPanel.add(queriesPanel, BorderLayout.CENTER); filterPanelPanel = new FilterPanelPanel(); filtersUIPanel.add(filterPanelPanel); initEvents(); } private void initEvents() { resetButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); for (Query query : filterModel.getQueries()) { controller.remove(query); } uiModel.setSelectedQuery(null); controller.selectVisible(null); controller.filterVisible(null); ((FiltersExplorer) libraryTree).setup(manager, filterModel, uiModel); } }); filterButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //selectButton.setSelected(false); if (uiModel.getSelectedQuery() != null && filterButton.isSelected()) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.filterVisible(uiModel.getSelectedRoot()); } else { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.filterVisible(null); } } }); selectButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //filterButton.setSelected(false); if (uiModel.getSelectedQuery() != null && selectButton.isSelected()) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.selectVisible(uiModel.getSelectedRoot()); } else { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.selectVisible(null); } } }); exportColumnButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (uiModel.getSelectedQuery() != null) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); NotifyDescriptor.InputLine question = new NotifyDescriptor.InputLine( NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportColumn.input"), NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportColumn.input.title")); if (DialogDisplayer.getDefault().notify(question) == NotifyDescriptor.OK_OPTION) { String input = question.getInputText(); if (input != null && !input.isEmpty()) { controller.exportToColumn(input, uiModel.getSelectedRoot()); } } } } }); exportWorkspaceButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (uiModel.getSelectedQuery() != null) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.exportToNewWorkspace(uiModel.getSelectedRoot()); } } }); exportLabelVisible.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (uiModel.getSelectedQuery() != null) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.exportToLabelVisible(uiModel.getSelectedRoot()); } } }); /*autoRefreshButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (filterModel.isAutoRefresh() != autoRefreshButton.isSelected()) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.setAutoRefresh(autoRefreshButton.isSelected()); } } });*/ updateEnabled(false); } public void refreshModel(FilterModel filterModel, FilterUIModel uiModel) { //System.out.println("refresh filter model thread=" + Thread.currentThread().getName()); this.filterModel = filterModel; this.uiModel = uiModel; //Unsetup unsetup(); filterPanelPanel.unsetup(); queriesExplorer.unsetup(); //Setup setup(); ((FiltersExplorer) libraryTree).setup(manager, filterModel, uiModel); queriesExplorer.setup(queriesPanel.manager, filterModel, uiModel); filterPanelPanel.setup(uiModel); updateEnabled(filterModel != null); updateControls(); } private class QueriesPanel extends JPanel implements ExplorerManager.Provider { private ExplorerManager manager = new ExplorerManager(); public QueriesPanel() { super(new BorderLayout()); queriesExplorer = new QueryExplorer(); add(queriesExplorer, BorderLayout.CENTER); } public ExplorerManager getExplorerManager() { return manager; } } private void updateEnabled(final boolean enabled) { SwingUtilities.invokeLater(new Runnable() { public void run() { resetButton.setEnabled(enabled); selectButton.setEnabled(enabled); filterButton.setEnabled(enabled); /*autoRefreshButton.setEnabled(enabled);*/ exportColumnButton.setEnabled(enabled && uiModel.getSelectedQuery() != null && filterModel.getCurrentQuery() != null); exportWorkspaceButton.setEnabled(enabled && uiModel.getSelectedQuery() != null && filterModel.getCurrentQuery() != null); exportLabelVisible.setEnabled(enabled && uiModel.getSelectedQuery() != null && filterModel.getCurrentQuery() != null); } }); } private void updateControls() { SwingUtilities.invokeLater(new Runnable() { public void run() { if (filterModel != null) { filterButton.setSelected(filterModel.isFiltering()); selectButton.setSelected(filterModel.isSelecting()); /*autoRefreshButton.setSelected(filterModel.isAutoRefresh());*/ } else { filterButton.setSelected(false); selectButton.setSelected(false); /*autoRefreshButton.setSelected(false);*/ } } }); } public void stateChanged(ChangeEvent e) { if (e.getSource() instanceof FilterUIModel) { if (uiModel.getSelectedQuery() != null && filterButton.isSelected()) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.filterVisible(uiModel.getSelectedRoot()); } else if (uiModel.getSelectedQuery() != null && selectButton.isSelected()) { FilterController controller = Lookup.getDefault().lookup(FilterController.class); controller.selectVisible(uiModel.getSelectedRoot()); } } updateControls(); updateEnabled(true); } private void unsetup() { if (filterModel != null) { filterModel.removeChangeListener(this); } if (uiModel != null) { uiModel.removeChangeListener(this); } } private void setup() { if (filterModel != null) { filterModel.addChangeListener(this); } if (uiModel != null) { uiModel.addChangeListener(this); } } /** 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; toolbar = new javax.swing.JToolBar(); resetButton = new javax.swing.JButton(); separator = new javax.swing.JToolBar.Separator(); exportColumnButton = new javax.swing.JButton(); exportWorkspaceButton = new javax.swing.JButton(); exportLabelVisible = new javax.swing.JButton(); splitPane = new javax.swing.JSplitPane(); libraryTree = new FiltersExplorer(); southPanel = new javax.swing.JPanel(); filtersUIPanel = new javax.swing.JPanel(); southToolbar = new javax.swing.JToolBar(); buttonsPanel = new javax.swing.JPanel(); selectButton = new javax.swing.JToggleButton(); filterButton = new javax.swing.JToggleButton(); setLayout(new java.awt.GridBagLayout()); toolbar.setFloatable(false); toolbar.setRollover(true); resetButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.resetButton.text")); // NOI18N resetButton.setFocusable(false); resetButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); resetButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolbar.add(resetButton); toolbar.add(separator); exportColumnButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/filters/resources/table_export.png"))); // NOI18N exportColumnButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportColumnButton.text")); // NOI18N exportColumnButton.setToolTipText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportColumnButton.toolTipText")); // NOI18N exportColumnButton.setFocusable(false); exportColumnButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); exportColumnButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolbar.add(exportColumnButton); exportWorkspaceButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/filters/resources/workspace_export.png"))); // NOI18N exportWorkspaceButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportWorkspaceButton.text")); // NOI18N exportWorkspaceButton.setToolTipText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportWorkspaceButton.toolTipText")); // NOI18N exportWorkspaceButton.setFocusable(false); exportWorkspaceButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); exportWorkspaceButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolbar.add(exportWorkspaceButton); exportLabelVisible.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/filters/resources/labelvisible_export.png"))); // NOI18N exportLabelVisible.setToolTipText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.exportLabelVisible.toolTipText")); // NOI18N exportLabelVisible.setFocusable(false); exportLabelVisible.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); exportLabelVisible.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); toolbar.add(exportLabelVisible); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.weightx = 1.0; add(toolbar, gridBagConstraints); splitPane.setBorder(null); splitPane.setDividerLocation(260); splitPane.setDividerSize(3); splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); libraryTree.setBorder(null); splitPane.setLeftComponent(libraryTree); southPanel.setLayout(new java.awt.BorderLayout()); splitPane.setRightComponent(southPanel); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(splitPane, gridBagConstraints); filtersUIPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 1, 5); add(filtersUIPanel, gridBagConstraints); southToolbar.setFloatable(false); southToolbar.setRollover(true); southToolbar.setOpaque(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 5, 0, 0); add(southToolbar, gridBagConstraints); buttonsPanel.setOpaque(false); buttonsPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 4, 4)); selectButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/filters/resources/select.png"))); // NOI18N selectButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.selectButton.text")); // NOI18N selectButton.setMargin(new java.awt.Insets(2, 7, 2, 14)); buttonsPanel.add(selectButton); filterButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/filters/resources/filter.png"))); // NOI18N filterButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filterButton.text")); // NOI18N filterButton.setMargin(new java.awt.Insets(2, 7, 2, 14)); buttonsPanel.add(filterButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; add(buttonsPanel, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel buttonsPanel; private javax.swing.JButton exportColumnButton; private javax.swing.JButton exportLabelVisible; private javax.swing.JButton exportWorkspaceButton; private javax.swing.JToggleButton filterButton; private javax.swing.JPanel filtersUIPanel; private javax.swing.JScrollPane libraryTree; private javax.swing.JButton resetButton; private javax.swing.JToggleButton selectButton; private javax.swing.JToolBar.Separator separator; private javax.swing.JPanel southPanel; private javax.swing.JToolBar southToolbar; private javax.swing.JSplitPane splitPane; private javax.swing.JToolBar toolbar; // End of variables declaration//GEN-END:variables public ExplorerManager getExplorerManager() { return manager; } }