/*
* Copyright (C) 2014 by Array Systems Computing Inc. http://www.array.ca
*
* This program 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.
* This program 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 org.esa.s1tbx.dat.toolviews.Projects;
import org.esa.snap.ui.UIUtils;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.awt.*;
import java.util.List;
import java.util.Observer;
/**
* The tool window which displays the current project
*/
@TopComponent.Description(
preferredID = "ProjectsToolView",
iconBase = "org/esa/s1tbx/dat/icons/project-view.png",
persistenceType = TopComponent.PERSISTENCE_ALWAYS //todo define
)
@TopComponent.Registration(
mode = "explorer",
openAtStartup = false,
position = 4
)
@ActionID(category = "Window", id = "org.esa.s1tbx.dat.toolviews.Projects.ProjectsToolView")
@ActionReferences({
@ActionReference(path = "Menu/View/Tool Windows", position = 10),
@ActionReference(path = "Toolbars/Projects", position = 10)
})
@TopComponent.OpenActionRegistration(
displayName = "#CTL_ProjectsToolView_Name",
preferredID = "ProjectsToolView"
)
@NbBundle.Messages({
"CTL_ProjectsToolView_Name=View Projects",
"CTL_ProjectsToolView_HelpId=projects"
})
public class ProjectsToolView extends TopComponent implements Observer {
private ProjectTree projectTree;
private DefaultMutableTreeNode rootNode;
private final Project project = Project.instance();
public ProjectsToolView() {
setDisplayName("Projects");
setLayout(new BorderLayout(4, 4));
setBorder(new EmptyBorder(4, 4, 4, 4));
add(createControl(), BorderLayout.CENTER);
}
public JComponent createControl() {
Project.instance().addObserver(this);
final JScrollPane prjScrollPane = new JScrollPane(createTree());
prjScrollPane.setPreferredSize(new Dimension(320, 480));
prjScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
prjScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
prjScrollPane.setBorder(null);
prjScrollPane.setViewportBorder(null);
//final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
//splitPane.add(prjScrollPane);
return prjScrollPane;
}
private ProjectTree createTree() {
rootNode = new DefaultMutableTreeNode("");
projectTree = new ProjectTree(false);//rootNode);
projectTree.populateTree(rootNode);
projectTree.setRootVisible(false);
projectTree.setShowsRootHandles(true);
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) projectTree.getCellRenderer();
renderer.setLeafIcon(UIUtils.loadImageIcon("/org/esa/s1tbx/resources/images/icons/RsBandAsSwath16.gif"));
renderer.setClosedIcon(UIUtils.loadImageIcon("/org/esa/s1tbx/resources/images/icons/RsGroupClosed16.gif"));
renderer.setOpenIcon(UIUtils.loadImageIcon("/org/esa/s1tbx/resources/images/icons/RsGroupOpen16.gif"));
return projectTree;
}
private static void PopulateNode(List<ProjectSubFolder> subFolders, DefaultMutableTreeNode treeNode) {
for (ProjectSubFolder folder : subFolders) {
final DefaultMutableTreeNode folderNode = new DefaultMutableTreeNode(folder);
treeNode.add(folderNode);
final List<ProjectFile> fileList = folder.getFileList();
for (ProjectFile file : fileList) {
final DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode(file);
folderNode.add(fileNode);
}
final List<ProjectSubFolder> moreFolders = folder.getSubFolders();
if (!moreFolders.isEmpty()) {
PopulateNode(moreFolders, folderNode);
}
}
}
/**
* Implements the functionality of Observer participant of Observer Design Pattern to define a one-to-many
* dependency between a Subject object and any number of Observer objects so that when the
* Subject object changes state, all its Observer objects are notified and updated automatically.
* <p>
* Defines an updating interface for objects that should be notified of changes in a subject.
*
* @param subject The Observerable subject
* @param data optional data
*/
public void update(java.util.Observable subject, java.lang.Object data) {
rootNode.removeAllChildren();
final ProjectSubFolder projectFolders = project.getProjectSubFolders();
if (projectFolders == null) {
projectTree.setRootVisible(false);
projectTree.populateTree(rootNode);
} else {
rootNode.setUserObject(project.getProjectSubFolders());
projectTree.setRootVisible(true);
final List<ProjectSubFolder> subFolders = project.getProjectSubFolders().getSubFolders();
PopulateNode(subFolders, rootNode);
projectTree.populateTree(rootNode);
}
}
}