/* * Copyright 2013 Serdar. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.fub.maps.project.plugins.tasks.map; import de.fub.maps.project.aggregator.filetype.AggregatorDataObject; import de.fub.maps.project.models.Aggregator; import de.fub.utilsmodule.components.CustomOutlineView; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.beans.PropertyVetoException; import java.util.List; import javax.swing.Action; import javax.swing.ListSelectionModel; import org.openide.explorer.ExplorerManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; import org.openide.loaders.DataObjectNotFoundException; import org.openide.nodes.AbstractNode; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.openide.util.Exceptions; import org.openide.util.WeakListeners; /** * * @author Serdar */ public class AggregatorChooserPanel extends javax.swing.JPanel implements ExplorerManager.Provider, PropertyChangeListener { public static final String PROP_NAME_PANEL_CLOSED = "panelClosed"; private static final long serialVersionUID = 1L; private final ExplorerManager explorerManager = new ExplorerManager(); private final AggregatorDataObjectPropertyEditor propertyEditor; private boolean panelActive = false; private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); private DataObject selectedAggregatorDataObject = null; /** * Creates new form AggregatorChooserPanel */ public AggregatorChooserPanel(AggregatorDataObjectPropertyEditor propertyEditor) { assert propertyEditor != null; initComponents(); this.propertyEditor = propertyEditor; init(); } private void init() { outlineView1.getOutline().setRootVisible(false); outlineView1.getOutline().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); explorerManager.setRootContext(new AbstractNode(Children.create(new NodeFactory(), true))); Object value = propertyEditor.getValue(); if (value instanceof AggregatorDataObject) { selectAggregator(((AggregatorDataObject) value)); } explorerManager.addPropertyChangeListener(WeakListeners.propertyChange(AggregatorChooserPanel.this, explorerManager)); } private void selectAggregator(AggregatorDataObject aggregatorDataObject) { selectedAggregatorDataObject = aggregatorDataObject; Children children = explorerManager.getRootContext().getChildren(); for (Node node : children.getNodes(true)) { Aggregator aggregator = node.getLookup().lookup(Aggregator.class); if (aggregator != null) { aggregator.getDataObject().equals(aggregatorDataObject); try { explorerManager.setSelectedNodes(new Node[]{node}); } catch (PropertyVetoException ex) { Exceptions.printStackTrace(ex); } } } } @Override public void addNotify() { super.addNotify(); panelActive = true; } @Override public void removeNotify() { Object oldValue = this.panelActive; panelActive = false; pcs.firePropertyChange(PROP_NAME_PANEL_CLOSED, oldValue, panelActive); super.removeNotify(); } public DataObject getSelectedAggregatorDataObject() { return selectedAggregatorDataObject; } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { super.addPropertyChangeListener(listener); pcs.addPropertyChangeListener(listener); } @Override public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { super.addPropertyChangeListener(propertyName, listener); pcs.addPropertyChangeListener(propertyName, listener); } @Override public void removePropertyChangeListener(PropertyChangeListener listener) { super.removePropertyChangeListener(listener); pcs.removePropertyChangeListener(listener); } @Override public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { super.removePropertyChangeListener(propertyName, listener); pcs.removePropertyChangeListener(propertyName, listener); } /** * 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() { outlineView1 = new CustomOutlineView("Aggregators"); setLayout(new java.awt.BorderLayout()); outlineView1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204))); add(outlineView1, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private org.openide.explorer.view.OutlineView outlineView1; // End of variables declaration//GEN-END:variables @Override public ExplorerManager getExplorerManager() { return explorerManager; } @Override public void propertyChange(PropertyChangeEvent evt) { if (ExplorerManager.PROP_SELECTED_NODES.equals(evt.getPropertyName()) && panelActive) { Node[] selectedNodes = getExplorerManager().getSelectedNodes(); if (selectedNodes.length == 1) { selectedAggregatorDataObject = selectedNodes[0].getLookup().lookup(DataObject.class); } else { selectedAggregatorDataObject = null; } } } private static class NodeFactory extends ChildFactory<AggregatorDataObject> { public NodeFactory() { } @Override protected boolean createKeys(List<AggregatorDataObject> toPopulate) { FileObject aggregatorTemplates = FileUtil.getConfigFile("Templates/Aggregators"); if (aggregatorTemplates != null) { for (FileObject childFileObject : aggregatorTemplates.getChildren()) { try { DataObject childDataObject = DataObject.find(childFileObject); if (childDataObject instanceof AggregatorDataObject) { toPopulate.add(((AggregatorDataObject) childDataObject)); } } catch (DataObjectNotFoundException ex) { Exceptions.printStackTrace(ex); } } } return true; } @Override protected Node createNodeForKey(AggregatorDataObject dataObject) { return new AggregatorFilterNode(dataObject.getNodeDelegate()); } } private static class AggregatorFilterNode extends FilterNode { public AggregatorFilterNode(Node original) { super(original, org.openide.nodes.Children.LEAF); } @Override public PropertySet[] getPropertySets() { return new PropertySet[0]; } @Override public Action[] getActions(boolean context) { return new Action[0]; } } }