/*
* 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.aggregator.actions.wizards.aggregator;
import de.fub.maps.project.aggregator.filetype.AggregatorDataObject;
import de.fub.maps.project.aggregator.xml.AggregatorDescriptor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.List;
import javax.swing.Action;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.xml.bind.JAXBException;
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.NbBundle;
import org.openide.util.WeakListeners;
import org.openide.util.lookup.Lookups;
public final class AggregatorVisualPanel2 extends JPanel implements ExplorerManager.Provider, PropertyChangeListener {
private static final long serialVersionUID = 1L;
private final ExplorerManager explorerManager = new ExplorerManager();
/**
* Creates new form AggregatorVisualPanel2
*/
public AggregatorVisualPanel2() {
initComponents();
outlineView1.getOutline().setRootVisible(false);
outlineView1.getOutline().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
explorerManager.setRootContext(new AbstractNode(Children.create(new TemplateNodeFactory(), true)));
explorerManager.addPropertyChangeListener(WeakListeners.propertyChange(AggregatorVisualPanel2.this, explorerManager));
}
@NbBundle.Messages("CLT_Choose_Template=Choose Template")
@Override
public String getName() {
return Bundle.CLT_Choose_Template();
}
/**
* 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
outlineView1 = new org.openide.explorer.view.OutlineView("Templates");
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
templateDescription = new javax.swing.JTextArea();
setMinimumSize(new java.awt.Dimension(400, 300));
setPreferredSize(new java.awt.Dimension(400, 300));
setLayout(new java.awt.BorderLayout());
outlineView1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)));
outlineView1.setPreferredSize(new java.awt.Dimension(200, 400));
add(outlineView1, java.awt.BorderLayout.CENTER);
jPanel1.setMinimumSize(new java.awt.Dimension(200, 0));
jPanel1.setPreferredSize(new java.awt.Dimension(200, 407));
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AggregatorVisualPanel2.class, "AggregatorVisualPanel2.jLabel1.text")); // NOI18N
templateDescription.setEditable(false);
templateDescription.setColumns(20);
templateDescription.setRows(5);
jScrollPane1.setViewportView(templateDescription);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE))
);
add(jPanel1, java.awt.BorderLayout.EAST);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private org.openide.explorer.view.OutlineView outlineView1;
private javax.swing.JTextArea templateDescription;
// End of variables declaration//GEN-END:variables
@Override
public ExplorerManager getExplorerManager() {
return explorerManager;
}
@NbBundle.Messages("CLT_No_Description_Available=No description available.")
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (ExplorerManager.PROP_SELECTED_NODES.equals(evt.getPropertyName())) {
Node[] selectedNodes = getExplorerManager().getSelectedNodes();
if (selectedNodes.length == 1) {
Node node = selectedNodes[0];
DataObject dataObject = node.getLookup().lookup(DataObject.class);
if (dataObject instanceof AggregatorDataObject) {
AggregatorDataObject aggregatorDataObject = (AggregatorDataObject) dataObject;
try {
AggregatorDescriptor aggregator = aggregatorDataObject.getAggregatorDescriptor();
String description = aggregator.getDescription();
if (description != null) {
templateDescription.setText(description);
} else {
templateDescription.setText(Bundle.CLT_No_Description_Available());
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
} catch (JAXBException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}
}
private static class TemplateNodeFactory extends ChildFactory<DataObject> {
public TemplateNodeFactory() {
}
@Override
protected boolean createKeys(List<DataObject> toPopulate) {
FileObject templateFolder = FileUtil.getConfigFile("Templates/Aggregators");
if (templateFolder != null) {
for (FileObject child : templateFolder.getChildren()) {
try {
DataObject dataObject = DataObject.find(child);
if (dataObject instanceof AggregatorDataObject) {
toPopulate.add(dataObject);
}
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
}
}
return true;
}
@Override
protected Node createNodeForKey(DataObject dataObject) {
return new FileObjectWrapperNode(dataObject);
}
}
static class FileObjectWrapperNode extends FilterNode {
public FileObjectWrapperNode(DataObject dataObject) {
super(dataObject.getNodeDelegate(), Children.LEAF, Lookups.singleton(dataObject));
}
@Override
public Action[] getActions(boolean context) {
return new Action[0];
}
@Override
public boolean equals(Object o) {
if (o instanceof FileObjectWrapperNode) {
FileObjectWrapperNode fileNode = (FileObjectWrapperNode) o;
return fileNode.getOriginal().equals(getOriginal());
}
return false;
}
@Override
public int hashCode() {
return getOriginal().hashCode();
}
}
}