/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui.tree;
import Sirius.navigator.method.*;
import Sirius.navigator.plugin.PluginRegistry;
import Sirius.navigator.resource.*;
import Sirius.navigator.ui.ComponentRegistry;
import Sirius.navigator.ui.tree.postfilter.PostFilterGUI;
import org.apache.log4j.Logger;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.util.Collection;
import java.util.Collections;
import javax.swing.*;
import javax.swing.event.*;
import de.cismet.tools.gui.JPopupMenuButton;
/**
* DOCUMENT ME!
*
* @author pascal
* @version $Revision$, $Date$
*/
public class SearchResultsTreePanel extends JPanel implements ResultNodeListener {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(SearchResultsTreePanel.class);
//~ Instance fields --------------------------------------------------------
private final SearchResultsTree searchResultsTree;
private final JToolBar toolBar;
private JButton removeButton;
private JButton clearButton;
private JCheckBox showDirectlyInMap;
private JCheckBox showDirectlyInRenderer;
private JToggleButton tbnSort;
private JSplitPane splitPane;
private JPanel treePanel;
private JPanel postFilterPanel;
private JTabbedPane tabFilters = new JTabbedPane();
private JToggleButton tbnFilteredResults;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new SearchResultsTreePanel object.
*
* @param searchResultsTree DOCUMENT ME!
*/
public SearchResultsTreePanel(final SearchResultsTree searchResultsTree) {
this(searchResultsTree, false);
}
/**
* Creates a new SearchResultsTreePanel object.
*
* @param searchResultsTree DOCUMENT ME!
* @param advancedLayout DOCUMENT ME!
*/
public SearchResultsTreePanel(final SearchResultsTree searchResultsTree, final boolean advancedLayout) {
super(new BorderLayout());
this.searchResultsTree = searchResultsTree;
this.toolBar = new JToolBar(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.toolbar.name"), // NOI18N
JToolBar.HORIZONTAL);
this.toolBar.setRollover(advancedLayout);
this.toolBar.setFloatable(advancedLayout);
this.init();
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
private void init() {
this.createDefaultButtons();
if (searchResultsTree instanceof PostfilterEnabledSearchResultsTree) {
treePanel = new JPanel(new BorderLayout());
postFilterPanel = new JPanel(new BorderLayout());
splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, treePanel, postFilterPanel);
treePanel.add(toolBar, BorderLayout.SOUTH);
treePanel.add(new JScrollPane(searchResultsTree), BorderLayout.CENTER);
this.add(splitPane, BorderLayout.CENTER);
postFilterPanel.add(tabFilters);
searchResultsTree.addResultNodeListener(this);
} else {
this.add(toolBar, BorderLayout.SOUTH);
this.add(new JScrollPane(searchResultsTree), BorderLayout.CENTER);
}
this.setButtonsEnabled();
final ButtonEnablingListener buttonEnablingListener = new ButtonEnablingListener();
this.searchResultsTree.addTreeSelectionListener(buttonEnablingListener);
this.searchResultsTree.addPropertyChangeListener("browse", buttonEnablingListener); // NOI18N
this.addComponentListener(new ComponentEventForwarder());
}
/**
* DOCUMENT ME!
*/
private void createDefaultButtons() {
final ResourceManager resources = ResourceManager.getManager();
final ActionListener toolBarListener = new ToolBarListener();
tbnFilteredResults = new JToggleButton(resources.getIcon("funnel.png"));
tbnFilteredResults.setEnabled(false);
tbnSort = new JToggleButton(resources.getIcon("sort_ascending_16.png"));
tbnSort.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.tbnSort.tooltip"));
tbnSort.setMargin(new Insets(4, 4, 4, 4));
tbnSort.setActionCommand("sort");
tbnSort.addActionListener(toolBarListener);
toolBar.add(tbnSort);
removeButton = new JButton(resources.getIcon("remove24.gif")); // NOI18N
removeButton.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.removeButton.tooltip")); // NOI18N
removeButton.setActionCommand("remove"); // NOI18N
removeButton.setMargin(new Insets(4, 4, 4, 4));
removeButton.addActionListener(toolBarListener);
toolBar.add(removeButton);
// toolBar.addSeparator();
clearButton = new JButton(resources.getIcon("delete24.gif")); // NOI18N
clearButton.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.clearButton.tooltip")); // NOI18N
clearButton.setActionCommand("clear"); // NOI18N
clearButton.setMargin(new Insets(4, 4, 4, 4));
clearButton.addActionListener(toolBarListener);
toolBar.add(clearButton);
showDirectlyInMap = new JCheckBox();
showDirectlyInMap.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
searchResultsTree.setSyncWithMap(showDirectlyInMap.isSelected());
}
});
showDirectlyInMap.setSelected(false);
toolBar.add(showDirectlyInMap);
final JLabel showDirectlyInMapLabel = new JLabel(resources.getIcon("map.png")); // NOI18N
showDirectlyInMapLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() > 1) {
searchResultsTree.syncWithMap(true);
if (searchResultsTree.isSyncWithRenderer()) {
// Because in this case the map is not brought to front by default
PluginRegistry.getRegistry()
.getPluginDescriptor("cismap")
.getUIDescriptor("cismap")
.getView()
.makeVisible();
}
}
}
});
showDirectlyInMapLabel.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.showDirectInMapLabel.tooltipText")); // NOI18N
toolBar.add(showDirectlyInMapLabel);
showDirectlyInRenderer = new JCheckBox();
showDirectlyInRenderer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
searchResultsTree.setSyncWithRenderer(showDirectlyInRenderer.isSelected());
}
});
showDirectlyInRenderer.setSelected(false);
toolBar.add(showDirectlyInRenderer);
final JLabel showDirectlyInRendererLabel = new JLabel(new javax.swing.ImageIcon(
getClass().getResource("/Sirius/navigator/resource/imgx/descriptionpane_icon.gif"))); // NOI18N
showDirectlyInRendererLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() > 1) {
searchResultsTree.syncWithRenderer(true);
if (searchResultsTree.isSyncWithMap()) {
// Because in this case the renderer is not brought to front by default
ComponentRegistry.getRegistry()
.getGUIContainer()
.select(ComponentRegistry.DESCRIPTION_PANE);
}
}
}
});
showDirectlyInRendererLabel.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.showDirectInRendererLabel.tooltipText")); // NOI18N
toolBar.add(showDirectlyInRendererLabel);
if (isPostFiltersEnabled()) {
// Postfilterpecific Buttons
// tbnResetFilteredResults.setToolTipText(org.openide.util.NbBundle.getMessage(
// SearchResultsTreePanel.class,
// "SearchResultsTreePanel.tbnSort.tooltip"));
tbnFilteredResults.setMargin(new Insets(4, 4, 4, 4));
tbnFilteredResults.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (!tbnFilteredResults.isSelected()) {
((PostfilterEnabledSearchResultsTree)getSearchResultsTree()).clearFilter();
}
}
});
toolBar.add(Box.createHorizontalGlue());
toolBar.add(tbnFilteredResults);
}
}
@Override
public void resultNodesChanged() {
final Collection resultNodes = Collections.unmodifiableCollection(searchResultsTree.resultNodes);
Component tabFiltersVisComp = tabFilters.getSelectedComponent();
tbnFilteredResults.setSelected(false);
tbnFilteredResults.setEnabled(false);
tabFilters.setVisible(true);
final java.util.List<PostFilterGUI> availablePostFilterGUIs =
((PostfilterEnabledSearchResultsTree)searchResultsTree).getAvailablePostFilterGUIs();
if (LOG.isDebugEnabled()) {
LOG.debug("initializing " + availablePostFilterGUIs.size() + " PostFilterGUIs");
}
for (final PostFilterGUI pfg : availablePostFilterGUIs) {
if (pfg.canHandle(resultNodes)) {
pfg.initializeFilter(Collections.unmodifiableCollection(resultNodes));
final Component pfgGUI = pfg.getGUI();
tabFilters.add(pfg.getTitle(), pfgGUI);
if (pfg.getIcon() != null) {
tabFilters.setIconAt(tabFilters.indexOfComponent(pfg.getGUI()), pfg.getIcon());
}
if (pfg.isSelected()) {
tabFiltersVisComp = pfgGUI;
}
pfg.addPostFilterListener((PostfilterEnabledSearchResultsTree)searchResultsTree);
} else {
pfg.removePostFilterListener((PostfilterEnabledSearchResultsTree)searchResultsTree);
tabFilters.remove(pfg.getGUI());
}
}
try {
if (tabFiltersVisComp != null) {
tabFilters.setSelectedComponent(tabFiltersVisComp);
}
} catch (Exception skip) {
LOG.error(skip.getMessage(), skip);
}
if (LOG.isDebugEnabled()) {
LOG.debug(tabFilters.getComponents().length + " post filter GUIs of "
+ availablePostFilterGUIs.size() + " post filters enabled and initialized");
}
}
@Override
public void resultNodesFiltered() {
tbnFilteredResults.setSelected(((PostfilterEnabledSearchResultsTree)searchResultsTree).isFiltered());
tbnFilteredResults.setEnabled(((PostfilterEnabledSearchResultsTree)searchResultsTree).isFiltered());
final Collection resultNodes = Collections.unmodifiableCollection(searchResultsTree.resultNodes);
if (LOG.isDebugEnabled()) {
LOG.debug("adjusting " + tabFilters.getComponents() + " PostFilterGUIs");
}
for (final Component c : tabFilters.getComponents()) {
if (c instanceof PostFilterGUI) {
((PostFilterGUI)c).adjustFilter(resultNodes);
}
}
}
@Override
public void resultNodesCleared() {
tabFilters.setVisible(false);
}
/**
* The functionality of the buttons hidden with this method is broken. Therefore that functionality needs to be
* fixed before the items can become visible again.
*
* @param button menuItem
*/
private void doNotShowThisButtonAsItsFunctionalityIsBroken(final JButton button) {
button.setVisible(false);
}
/**
* DOCUMENT ME!
*/
public void setButtonsEnabled() {
tbnSort.setEnabled(!searchResultsTree.isEmpty());
removeButton.setEnabled(!searchResultsTree.isEmpty() && (searchResultsTree.getSelectedNodeCount() > 0));
clearButton.setEnabled(!searchResultsTree.isEmpty());
// saveAllButton.setEnabled(!searchResultsTree.isEmpty());
// saveAllButton.setEnabled(true);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isPostFiltersEnabled() {
return (searchResultsTree instanceof PostfilterEnabledSearchResultsTree);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public JToolBar getToolBar() {
return this.toolBar;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public SearchResultsTree getSearchResultsTree() {
return this.searchResultsTree;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class ComponentEventForwarder extends ComponentAdapter {
//~ Methods ------------------------------------------------------------
/**
* Invoked when the component has been made invisible.
*
* @param e DOCUMENT ME!
*/
@Override
public void componentHidden(final ComponentEvent e) {
searchResultsTree.dispatchEvent(e);
}
/**
* Invoked when the component has been made visible.
*
* @param e DOCUMENT ME!
*/
@Override
public void componentShown(final ComponentEvent e) {
searchResultsTree.dispatchEvent(e);
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class ToolBarListener implements ActionListener {
//~ Methods ------------------------------------------------------------
/**
* Invoked when an action occurs.
*
* @param e DOCUMENT ME!
*/
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getActionCommand().equals("remove")) // NOI18N
{
searchResultsTree.removeSelectedResultNodes();
} else if (e.getActionCommand().equals("clear")) // NOI18N
{
searchResultsTree.clear();
} else if (e.getActionCommand().equals("save")) // NOI18N
{
// logger.warn("command 'save' not implemented");
} else if (e.getActionCommand().equals("saveall")) // NOI18N
{
MethodManager.getManager().showQueryResultProfileManager();
} else if (e.getActionCommand().equals("sort")) {
if (tbnSort.isSelected()) {
tbnSort.setIcon(ResourceManager.getManager().getIcon("sort_descending_16.png"));
tbnSort.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.tbnSort.selected.tooltip"));
} else {
tbnSort.setIcon(ResourceManager.getManager().getIcon("sort_ascending_16.png"));
tbnSort.setToolTipText(org.openide.util.NbBundle.getMessage(
SearchResultsTreePanel.class,
"SearchResultsTreePanel.tbnSort.tooltip"));
}
searchResultsTree.sort(!tbnSort.isSelected());
}
SearchResultsTreePanel.this.setButtonsEnabled();
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class ButtonEnablingListener implements PropertyChangeListener, TreeSelectionListener {
//~ Methods ------------------------------------------------------------
/**
* This method gets called when a bound property is changed.
*
* @param e evt A PropertyChangeEvent object describing the event source and the property that has changed.
*/
@Override
public void propertyChange(final PropertyChangeEvent e) {
SearchResultsTreePanel.this.setButtonsEnabled();
}
/**
* Called whenever the value of the selection changes.
*
* @param e the event that characterizes the change.
*/
@Override
public void valueChanged(final TreeSelectionEvent e) {
SearchResultsTreePanel.this.setButtonsEnabled();
}
}
}