/* * Copyright 2011 Uwe Krueger. * * 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 com.mandelsoft.mand.tool; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import javax.swing.JFrame; import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreePath; import com.mandelsoft.mand.scan.MandelScanner; import com.mandelsoft.mand.util.FileMandelListFolderTree; import com.mandelsoft.mand.util.MandelListFolder; import com.mandelsoft.mand.util.MandelListFolderTree; import com.mandelsoft.swing.GBC; import com.mandelsoft.swing.GBCPanel; /** * * @author Uwe Krüger */ public class MandelListFolderBrowserPanel extends GBCPanel { static public boolean debug=false; private ModelChangedListener listener; private MandelListFolderBrowserModel model; private MandelListFolderPanel fpanel; private MandelListPanel lpanel; private boolean extmodel; public MandelListFolderBrowserPanel(String header, MandelListFolderTree ftree, MandelScanner scanner) { this(header,new DefaultMandelListFolderTreeModel(ftree,scanner),scanner); } public MandelListFolderBrowserPanel(String header, MandelListFolderTreeModel model, MandelScanner scanner) { this(header, new MandelListFolderBrowserModel(model),scanner); extmodel=false; } public MandelListFolderBrowserPanel(String header, MandelListFolderBrowserModel model, MandelScanner scanner) { this.model=model; extmodel=true; fpanel=new MandelListFolderPanel(model,scanner); fpanel.addActionListener(new ListSelectionListener()); listener=new ModelChangedListener(); lpanel=new MandelListPanel(model.getRoot().getName(), model.getActiveListModel(),null); //Add the scroll panes to a split pane. JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitPane.setResizeWeight(0.5); splitPane.setLeftComponent(fpanel); splitPane.setRightComponent(lpanel); add(splitPane,GBC(0,0,GBC.BOTH)); handleModifiable(model.isModifiable()); //add(folders); } @Override protected void panelBound() { super.panelBound(); System.out.println("setup tree listener"); model.addTreeModelListener(listener); model.addPropertyChangeListener(listener); } @Override protected void panelUnbound() { super.panelUnbound(); System.out.println("cleanup tree listener"); model.removeTreeModelListener(listener); model.removePropertyChangeListener(listener); if (!extmodel) model.setFolderTreeModel(null); } public boolean isModifiable() { return model.isModifiable(); } public void setModifiable(boolean modifiable) { handleModifiable(modifiable); model.setModifiable(modifiable); } protected void handleModifiable(boolean b) { System.out.println("handle browser panel modifiable "+b); fpanel.setModifiable(b); if (b) { lpanel.setModifiable(model.getActiveListModel().isModifiable()); } else { lpanel.setModifiable(b); } } public void setRootVisible(boolean b) { fpanel.setRootVisible(b); } ///////////////////////////////////////////////////////////////////////// private String folderSpec(Object o) { MandelListFolder f=(MandelListFolder)o; return f.toString(); } private class ListSelectionListener implements ActionListener { private void dump(String msg, TreePath p) { if (debug) { System.out.println(msg+":"); while (p!=null) { System.out.println(" "+folderSpec(p.getLastPathComponent())); p=p.getParentPath(); } } } public void actionPerformed(ActionEvent e) { System.out.println("selection event"); TreePath p=fpanel.getSelectedPath(); if (p!=null && ((MandelListFolder)p.getLastPathComponent()).getMandelList()!=null) { dump("active path",p); model.setActivePath(p); } } } ///////////////////////////////////////////////////////////////////////// private class ModelChangedListener implements TreeModelListener, PropertyChangeListener { private void dump(String msg, TreeModelEvent e) { if (debug) { System.out.println(msg+":"); Object[] oa=e.getPath(); for (Object o:oa) { System.out.println(" "+folderSpec(o)); } oa=e.getChildren(); if (oa!=null&&oa.length>0) { System.out.println(" children:"); for (Object o:oa) { System.out.println(" "+folderSpec(o)); } } } } public void treeNodesChanged(TreeModelEvent e) { // MandelListFolder f; // Object[] children=e.getChildren(); // f=(MandelListFolder)e.getTreePath().getLastPathComponent(); // dump("tree node changed",e); // System.out.println("tree nodes changed"); // if (model.getParentPath(e, model.getActivePath())!=null) { // lpanel.setTitle(model.getActivePathName()); // } } public void treeNodesInserted(TreeModelEvent e) { dump("tree node inserted",e); } public void treeNodesRemoved(TreeModelEvent e) { MandelListFolder l,f; dump("tree node removed",e); f=model.getActiveFolder(); if (f!=null) { l=(MandelListFolder)e.getTreePath().getLastPathComponent(); while (f!=null) { if (f==l) { // update active path model.setActivePath( MandelListFolderTreeModelSupport.getPathToRoot(model.getActiveFolder())); break; } else { f=f.getParent(); } } } } public void treeStructureChanged(TreeModelEvent e) { dump("tree structure",e); } public void propertyChange(PropertyChangeEvent evt) { String prop=evt.getPropertyName(); if (prop.equals(MandelListFolderBrowserModel.PROP_MODIFIABLE)) { handleModifiable((Boolean)evt.getNewValue()); } else if (prop.equals(MandelListFolderBrowserModel.PROP_ACTIVE_NAME)) { System.out.println("set active name "+model.getActivePathName()); lpanel.setTitle(model.getActivePathName()); } else if (prop.equals(MandelListFolderBrowserModel.PROP_ACTIVE_FOLDER)) { System.out.println("set active list model"); lpanel.setModel(model.getActiveListModel()); fpanel.setActiveFolder(model.getActiveFolder()); revalidate(); } } } ///////////////////////////////////////////////////////////// // test ///////////////////////////////////////////////////////////// static class TestFrame extends JFrame { TestFrame(MandelListFolderTree folder) { MandelListFolderBrowserPanel panel=new MandelListFolderBrowserPanel( "Test", folder, null); add(panel); panel.setModifiable(true); pack(); this.setMinimumSize(this.getSize()); } TestFrame(MandelListFolderTreeModel model) { MandelListFolderBrowserPanel panel=new MandelListFolderBrowserPanel( "Test", model, null); add(panel); pack(); this.setMinimumSize(this.getSize()); } } public static void main(String[] args) { File file = new File(args[0]); FileMandelListFolderTree f=new FileMandelListFolderTree(file); final MandelListFolderTreeModel m1=new DefaultMandelListFolderTreeModel(f,null); m1.setModifiable(true); final MandelListFolderTreeModel m2=ComposedMandelListFolderTreeModel.createDemo(f); m2.setModifiable(true); System.out.println("folder setup done"); SwingUtilities.invokeLater(new Runnable() { public void run() { create(JFrame.DISPOSE_ON_CLOSE); create(JFrame.EXIT_ON_CLOSE); } private void create(int mode) { JFrame frame=new TestFrame(m2); frame.setDefaultCloseOperation( mode); frame.setVisible(true); } }); } }