From: <va...@us...> - 2007-04-15 01:45:14
|
Revision: 9433 http://svn.sourceforge.net/jedit/?rev=9433&view=rev Author: vanza Date: 2007-04-14 18:45:09 -0700 (Sat, 14 Apr 2007) Log Message: ----------- - use WeakHashMaps where it makes sense to avoid leaks - do some clean up in the flat trees when unloading projects - clean up some code in the filtered tree class Modified Paths: -------------- plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFileListModel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFilteredModel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTWorkingFileListModel.java Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-04-14 23:23:16 UTC (rev 9432) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-04-15 01:45:09 UTC (rev 9433) @@ -21,8 +21,9 @@ - fix NPE in ProjectManager.removeProject() - fix deadlock when creating new project - fix working file list not being updated + - add code to avoid some memory leaks in the flat trees. + - use WeakHashMaps where it makes sense to avoid leaks. - Version 2.1.3.6: [marcelo vanzin] - don't ignore errors when ProjectManager is starting up; that way, Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-04-14 23:23:16 UTC (rev 9432) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-04-15 01:45:09 UTC (rev 9433) @@ -28,7 +28,9 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.WeakHashMap; import java.awt.BorderLayout; import java.awt.Component; @@ -136,7 +138,7 @@ private static final ProjectViewerConfig config = ProjectViewerConfig.getInstance(); // Mapping from View to ViewerEntry - private static final HashMap viewers = new HashMap(); + private static final Map viewers = new WeakHashMap(); private static final HashMap listeners = new HashMap(); private static final ArrayList actions = new ArrayList(); @@ -1222,6 +1224,14 @@ && (active == null || !active.contains(p.getName()))) { pm.unloadProject(p); + if (fileTree != null) { + ((VPTFileListModel)fileTree.getModel()) + .cleanup(p); + } + if (workingFileTree != null) { + ((VPTWorkingFileListModel)workingFileTree.getModel()) + .cleanup(p); + } } } } //}}} @@ -1602,15 +1612,18 @@ the EditPane was changed, and focus the file corresponding to the buffer on the EditPane on the PV tree. */ private void handleViewUpdateMessage(ViewUpdate vu) { - if (vu.getView() == view) { - if (vu.getWhat() == ViewUpdate.EDIT_PANE_CHANGED) { - PVActions.focusActiveBuffer(view, treeRoot); - } else if (vu.getWhat() == ViewUpdate.CLOSED) { + if (vu.getView() == view && + vu.getWhat() == ViewUpdate.EDIT_PANE_CHANGED) + { + PVActions.focusActiveBuffer(view, treeRoot); + } + if (vu.getWhat() == ViewUpdate.CLOSED) { + if (vu.getView() == view) { config.setLastNode(treeRoot); unload(); - viewers.remove(view); removeHierarchyListener(this); } + viewers.remove(vu.getView()); } }//}}} Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFileListModel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFileListModel.java 2007-04-14 23:23:16 UTC (rev 9432) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFileListModel.java 2007-04-15 01:45:09 UTC (rev 9433) @@ -194,5 +194,10 @@ fireTreeNodesChanged(n, getPathToRoot(n), null, null); } //}}} + //{{{ cleanup(VPTProject) + public void cleanup(VPTProject p) { + fileLists.remove(p); + } //}}} + } Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFilteredModel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFilteredModel.java 2007-04-14 23:23:16 UTC (rev 9432) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFilteredModel.java 2007-04-15 01:45:09 UTC (rev 9433) @@ -62,7 +62,6 @@ //{{{ Private members private static final String SEPARATOR = "/"; private Map cache = new HashMap(); - // private List filterList = new ArrayList(); //}}} //{{{ +VPTFilteredModel(VPTNode) : <init> @@ -73,11 +72,6 @@ */ public VPTFilteredModel(VPTNode rootNode) { super(rootNode, true); - // filterList.add(new VPTFilterData("java", Pattern.compile(".*\\.java"))); - // filterList.add(new VPTFilterData("html", Pattern.compile(".*\\.html"))); - // filterList.add(new VPTFilterData("xml", Pattern.compile(".*\\.xml"))); - // filterList.add(new VPTFilterData("c", Pattern.compile(".*\\.c"))); - // filterList.add(new VPTFilterData("other", Pattern.compile(".*"))); } //}}} @@ -263,20 +257,18 @@ super(new java.io.File(filterData.getName())); this.filterData = filterData; Iterator it = openableNodeList.iterator(); - //org.gjt.sp.util.Log.log(org.gjt.sp.util.Log.DEBUG, VPTFilteredModel.class,"+++ .191: openableNodeList size = "+openableNodeList.size()); while (it.hasNext()) { VPTNode node = (VPTNode)it.next(); - //org.gjt.sp.util.Log.log(org.gjt.sp.util.Log.DEBUG, VPTFilteredModel.class,"+++ .199: node.getName() = "+node.getName()); if (filterData.getPattern().matcher(node.getName()).matches()) { - // pattern matched: add to list of this node add(node); } } sortFiles(); + // remove from openableNodeList - it =files.iterator(); + it = files.iterator(); while (it.hasNext()) openableNodeList.remove(it.next()); @@ -293,8 +285,7 @@ } //}}} //{{{ -sortFiles() : void - private void sortFiles() - { + private void sortFiles() { Collections.sort(files); } //}}} Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTWorkingFileListModel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTWorkingFileListModel.java 2007-04-14 23:23:16 UTC (rev 9432) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTWorkingFileListModel.java 2007-04-15 01:45:09 UTC (rev 9433) @@ -287,5 +287,10 @@ fireTreeNodesChanged(n, getPathToRoot(n), null, null); } //}}} + //{{{ cleanup(VPTProject) + public void cleanup(VPTProject p) { + fileLists.remove(p); + } //}}} + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2007-05-13 20:49:08
|
Revision: 9532 http://svn.sourceforge.net/jedit/?rev=9532&view=rev Author: vanza Date: 2007-05-13 13:49:07 -0700 (Sun, 13 May 2007) Log Message: ----------- - bump version number, Java and jEdit requirements for PV 3.0 work. - refactor the tree handling code into some new classes. - get rid of lots of deprecation warnings. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/build.xml plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/PVActions.java plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/action/SearchAction.java plugins/ProjectViewer/trunk/projectviewer/config/AppLauncher.java plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java plugins/ProjectViewer/trunk/projectviewer/importer/GlobFilter.java plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java plugins/ProjectViewer/trunk/projectviewer/importer/ReImporter.java plugins/ProjectViewer/trunk/projectviewer/importer/RootImporter.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTCompactModel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFileListModel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFilterData.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFilteredModel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTWorkingFileListModel.java Added Paths: ----------- plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreeModel.java plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTFoldersTreeModel.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2007-05-13 20:49:07 UTC (rev 9532) @@ -3,15 +3,15 @@ #{{{ Plugin properties plugin.projectviewer.ProjectPlugin.name=Project Viewer plugin.projectviewer.ProjectPlugin.author=Marcelo Vanzin, Matthew Payne, Stefan Kost, Calvin Yu, Kevin Burton -plugin.projectviewer.ProjectPlugin.version=2.1.3.7 +plugin.projectviewer.ProjectPlugin.version=2.9.0.0 plugin.projectviewer.ProjectPlugin.docs=index.html plugin.projectviewer.ProjectPlugin.activate=defer plugin.projectviewer.ProjectPlugin.description=The ProjectViewer plugin provides an interface \ for managing a "project", i.e. a related group of \ source files. -plugin.projectviewer.ProjectPlugin.depend.0=jedit 04.02.99.00 -plugin.projectviewer.ProjectPlugin.depend.1=jdk 1.4 +plugin.projectviewer.ProjectPlugin.depend.0=jedit 04.03.10.00 +plugin.projectviewer.ProjectPlugin.depend.1=jdk 1.5 plugin.projectviewer.ProjectPlugin.depend.2=plugin CommonControlsPlugin 0.9.4 plugin.projectviewer.ProjectPlugin.depend.3=optional plugin errorlist.ErrorListPlugin 1.3.1 @@ -156,6 +156,9 @@ projectviewer.folderstab=Folders projectviewer.filestab=Files projectviewer.workingfilestab=Working Files +projectviewer.compacttab=Compact +projectviewer.filteredtab=Filtered + projectviewer.archive_filter=Archive files projectviewer.create_project=Create Project projectviewer.all_projects=All Projects Modified: plugins/ProjectViewer/trunk/build.xml =================================================================== --- plugins/ProjectViewer/trunk/build.xml 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/build.xml 2007-05-13 20:49:07 UTC (rev 9532) @@ -9,8 +9,8 @@ <property name="javadoc.packagenames" value="projectviewer.*" /> <property name="plugin.dependencies" value="ErrorList,InfoViewer" /> <property name="dist.target" value="dist.complete" /> - <property name="compiler.source" value="1.4" /> - <property name="compiler.target" value="1.4" /> + <property name="compiler.source" value="1.5" /> + <property name="compiler.target" value="1.5" /> <import file="${build.support}/plugin-build.xml" /> Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-05-13 20:49:07 UTC (rev 9532) @@ -16,6 +16,15 @@ * CHANGELOG version: $Id$ */ +Version 3.0.0: + [marcelo vanzin] + - Bump requirements: jEdit 4.3, Java 5 + - Refactor the tree handling code into its own class, to try to + simplify the ProjectViewer class. + + +================================================================================ + Version 2.1.3.7: [marcelo vanzin] - fix NPE in ProjectManager.removeProject() Modified: plugins/ProjectViewer/trunk/projectviewer/PVActions.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/PVActions.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/PVActions.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -242,7 +242,7 @@ //{{{ +_newFile(View)_ : void public static void newFile(View v) { - ProjectViewer pv = ProjectViewer.getProjectViewer(v); + ProjectViewer pv = ProjectViewer.getViewer(v); if (pv == null) return; Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -40,14 +40,6 @@ import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; -import java.awt.dnd.DragSource; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureListener; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; - import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -64,7 +56,6 @@ import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; -import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.DefaultMutableTreeNode; @@ -81,7 +72,6 @@ import org.gjt.sp.jedit.browser.VFSBrowser; import org.gjt.sp.jedit.gui.DefaultFocusComponent; -import org.gjt.sp.jedit.gui.DockableWindowManager; import org.gjt.sp.jedit.msg.BufferUpdate; import org.gjt.sp.jedit.msg.DynamicMenuChanged; import org.gjt.sp.jedit.msg.EditorExitRequested; @@ -101,13 +91,7 @@ import projectviewer.vpt.VPTNode; import projectviewer.vpt.VPTRoot; import projectviewer.vpt.VPTProject; -import projectviewer.vpt.VPTContextMenu; -import projectviewer.vpt.VPTCellRenderer; -import projectviewer.vpt.VPTFileListModel; -import projectviewer.vpt.VPTFilteredModel; -import projectviewer.vpt.VPTSelectionListener; -import projectviewer.vpt.VPTWorkingFileListModel; -import projectviewer.vpt.VPTCompactModel; +import projectviewer.vpt.ProjectTreePanel; import projectviewer.event.ProjectViewerEvent; import projectviewer.event.ProjectViewerListener; @@ -120,7 +104,6 @@ import projectviewer.action.NodeRemoverAction; import projectviewer.action.NodeRenamerAction; import projectviewer.action.OldStyleAddFileAction; -import projectviewer.action.UpAction; import projectviewer.config.ProjectViewerConfig; import projectviewer.importer.NewFileImporter; //}}} @@ -135,12 +118,11 @@ implements HierarchyListener, DefaultFocusComponent, EBComponent { //{{{ Static members + private static final ProjectViewerConfig config; + private static final Map<View,ViewerEntry> viewers; + private static final List<Action> actions; - private static final ProjectViewerConfig config = ProjectViewerConfig.getInstance(); - // Mapping from View to ViewerEntry - private static final Map viewers = new WeakHashMap(); private static final HashMap listeners = new HashMap(); - private static final ArrayList actions = new ArrayList(); //{{{ Static Initialization /** @@ -149,6 +131,9 @@ */ static { // Default toolbar actions + config = ProjectViewerConfig.getInstance(); + viewers = new WeakHashMap<View,ViewerEntry>(); + actions = new ArrayList<Action>(); actions.add(new EditProjectAction()); actions.add(new ExpandAllAction()); actions.add(new CollapseAllAction()); @@ -220,9 +205,7 @@ */ public static ProjectViewer getViewer(View view) { ViewerEntry ve = (ViewerEntry) viewers.get(view); - if (ve != null) - return ve.dockable; - return null; + return (ve != null) ? ve.dockable : null; } //}}} //{{{ Event Handling @@ -458,31 +441,11 @@ * Notify all project viewer instances of a change in a node's structure. */ public static void nodeStructureChanged(VPTNode node) { - VPTNode.findProjectFor(node); - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v == null) - continue; - if (v.treeRoot.isNodeDescendant(node)) { - if (v.folderTree != null) { - ((DefaultTreeModel)v.folderTree.getModel()).nodeStructureChanged(node); - } - if (v.fileTree != null) { - ((DefaultTreeModel)v.fileTree.getModel()).nodeStructureChanged(node); - } - - if (v.workingFileTree != null) { - ((DefaultTreeModel)v.workingFileTree.getModel()).nodeStructureChanged(node); - } - - if (v.compactTree != null) { - ((DefaultTreeModel)v.compactTree.getModel()).nodeStructureChanged(node); - } - - if (v.filteredTree != null) { - ((DefaultTreeModel)v.filteredTree.getModel()).nodeStructureChanged(node); - } + for (ViewerEntry ve : viewers.values()) { + if (ve.dockable != null + && ve.dockable.getRoot().isNodeDescendant(node)) + { + ve.dockable.getTreePanel().nodeStructureChanged(node); } } } //}}} @@ -490,36 +453,16 @@ //{{{ +_nodeChanged(VPTNode)_ : void /** Notify all project viewer instances of a change in a node. */ public static void nodeChanged(VPTNode node) { - if (node == null) return; - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v == null) - continue; - if (v.treeRoot.isNodeDescendant(node)) { - if (v.folderTree != null) { - ((DefaultTreeModel)v.folderTree.getModel()).nodeChanged(node); - } - if (node.canOpen() || node.isProject() || node.isGroup()) { - if (v.fileTree != null) { - ((DefaultTreeModel)v.fileTree.getModel()).nodeChanged(node); - } - - if (v.workingFileTree != null) { - ((DefaultTreeModel)v.workingFileTree.getModel()).nodeChanged(node); - } - - if (v.compactTree != null) { - ((DefaultTreeModel)v.compactTree.getModel()).nodeChanged(node); - } - - if (v.filteredTree != null) { - ((DefaultTreeModel)v.filteredTree.getModel()).nodeChanged(node); - } - } - if (node == v.treeRoot && v.pList != null) { + for (ViewerEntry ve : viewers.values()) { + if (ve.dockable != null + && ve.dockable.getRoot().isNodeDescendant(node)) + { + ve.dockable.getTreePanel().nodeChanged(node); + if (node == ve.dockable.getRoot() + && ve.dockable.pList != null) + { // force a refresh of the "selected node" of the "combo" - v.pList.setSelectedNode(node); + ve.dockable.pList.setSelectedNode(node); } } } @@ -533,37 +476,16 @@ */ public static void insertNodeInto(VPTNode child, VPTNode parent) { int idx = parent.findIndexForChild(child); + int[] indexes = new int[] { idx }; + parent.insert(child, idx); - int[] ind = new int[] { idx }; - - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v == null || !v.getRoot().isNodeDescendant(parent)) - continue; - if (v.folderTree != null) { - ((DefaultTreeModel)v.folderTree.getModel()) - .nodesWereInserted(parent, ind); + for (ViewerEntry ve : viewers.values() ) { + if (ve.dockable != null + && ve.dockable.getRoot().isNodeDescendant(parent)) + { + ve.dockable.getTreePanel().nodesWereInserted(parent, indexes); } - if (v.compactTree != null) { - ((DefaultTreeModel)v.compactTree.getModel()) - .nodesWereInserted(parent, ind); - } - if (v.filteredTree != null) { - ((DefaultTreeModel)v.filteredTree.getModel()) - .nodesWereInserted(parent, ind); - } - if (child.isProject() || child.isGroup()) { - if (v.fileTree != null) { - ((DefaultTreeModel)v.fileTree.getModel()) - .nodeStructureChanged(parent); - } - if (v.workingFileTree != null) { - ((DefaultTreeModel)v.workingFileTree.getModel()) - .nodeStructureChanged(parent); - } - } } } //}}} @@ -573,23 +495,11 @@ * a node's structure. */ public static void nodeStructureChangedFlat(VPTNode node) { - if (config.getShowFilesTree() || config.getShowWorkingFilesTree()) { - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v == null) - continue; - if (v.treeRoot.isNodeDescendant(node)) { - if (v.fileTree != null) { - ((DefaultTreeModel)v.fileTree.getModel()) - .nodeStructureChanged(node); - } - - if (v.workingFileTree != null) { - ((DefaultTreeModel)v.workingFileTree.getModel()) - .nodeStructureChanged(node); - } - } + for (ViewerEntry ve : viewers.values() ) { + if (ve.dockable != null + && ve.dockable.getRoot().isNodeDescendant(node)) + { + ve.dockable.getTreePanel().flatStructureChanged(node); } } } //}}} @@ -602,38 +512,17 @@ public static void removeNodeFromParent(VPTNode child) { VPTNode parent = (VPTNode) child.getParent(); int index = parent.getIndex(child); - parent.remove(index); - - Object[] removed = new Object[] { child }; int[] idx = new int[] { index }; + Object[] removed = new Object[] { child }; - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v == null || !v.getRoot().isNodeDescendant(parent)) - continue; - if (v.folderTree != null) { - ((DefaultTreeModel)v.folderTree.getModel()) - .nodesWereRemoved(parent, idx, removed); + parent.remove(index); + + for (ViewerEntry ve : viewers.values() ) { + if (ve.dockable != null + && ve.dockable.getRoot().isNodeDescendant(parent)) + { + ve.dockable.getTreePanel().nodesWereRemoved(parent, idx, removed); } - if (v.compactTree != null) { - ((DefaultTreeModel)v.compactTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - if (v.filteredTree != null) { - ((DefaultTreeModel)v.filteredTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - if (child.isProject() || child.isGroup()) { - if (v.fileTree != null) { - ((DefaultTreeModel)v.fileTree.getModel()) - .nodeStructureChanged(parent); - } - if (v.workingFileTree != null) { - ((DefaultTreeModel)v.workingFileTree.getModel()) - .nodeStructureChanged(parent); - } - } } } //}}} @@ -645,51 +534,23 @@ public static void projectRemoved(Object src, VPTProject p) { VPTNode parent = (VPTNode) p.getParent(); int index = parent.getIndex(p); + int[] idx = new int[] { index }; + Object[] removed = new Object[] { p }; + parent.remove(index); - if (config.getShowFoldersTree() || config.getShowFilesTree() - || config.getShowWorkingFilesTree() || config.getShowCompactTree() - || config.getShowFilteredTree()) - { + for (ViewerEntry ve : viewers.values() ) { + if (ve.dockable == null) { + continue; + } - Object[] removed = new Object[] { p }; - int[] idx = new int[] { index }; + if (p == ve.dockable.getRoot()) { + ve.dockable.setRootNode(VPTRoot.getInstance()); + continue; + } - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v == null) - continue; - if (p == v.treeRoot) { - v.setRootNode(VPTRoot.getInstance()); - continue; - } - if (v.treeRoot.isNodeDescendant(parent)) { - if (v.folderTree != null) { - ((DefaultTreeModel)v.folderTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - - if (v.fileTree != null) { - ((DefaultTreeModel)v.fileTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - - if (v.workingFileTree != null) { - ((DefaultTreeModel)v.workingFileTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - - if (v.compactTree != null) { - ((DefaultTreeModel)v.compactTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - - if (v.filteredTree != null) { - ((DefaultTreeModel)v.filteredTree.getModel()) - .nodesWereRemoved(parent, idx, removed); - } - } + if (ve.dockable.getRoot().isNodeDescendant(parent)) { + ve.dockable.getTreePanel().nodesWereRemoved(parent, idx, removed); } } fireProjectRemoved(src, p); @@ -697,12 +558,6 @@ //}}} - public static ProjectViewer getProjectViewer(View view) { - ViewerEntry entry = (ViewerEntry) viewers.get(view); - if (entry != null) return entry.dockable; - else return null; - } - //{{{ +_setActiveNode(View, VPTNode)_ : void /** * Sets the current active node for the view. If a viewer is @@ -790,8 +645,7 @@ private static void modifyViewTitle(final View view, final VPTNode info) { // (info == null) might happen during jEdit startup. if (info != null - && config.getShowProjectInTitle() - && config.isJEdit43()) + && config.getShowProjectInTitle()) { view.updateTitle(); StringBuffer title = new StringBuffer(view.getTitle()); @@ -832,15 +686,7 @@ //{{{ Constants - private final static String FOLDERS_TAB_TITLE = "projectviewer.folderstab"; - private final static String FILES_TAB_TITLE = "projectviewer.filestab"; - private final static String WORKING_FILES_TAB_TITLE = "projectviewer.workingfilestab"; - private final static String COMPACT_TAB_TITLE = "projectviewer.compacttab"; - private final static String FILTERED_TAB_TITLE = "projectviewer.filteredtab"; - private final static String TREE_STATE_PROP = "projectviewer.folder_tree_state"; - private final static char NOT_EXPANDED = '0'; - private final static char EXPANDED = '1'; //}}} @@ -848,30 +694,15 @@ private View view; private HashSet dontAsk; - private JTree folderTree; - private JScrollPane folderTreeScroller; - private JTree fileTree; - private JScrollPane fileTreeScroller; - private JTree workingFileTree; - private JScrollPane workingFileTreeScroller; - private JTree compactTree; - private JScrollPane compactTreeScroller; - private JTree filteredTree; - private JScrollPane filteredTreeScroller; private JToolBar toolBar; private JPanel topPane; - private JTabbedPane treePane; + private ProjectTreePanel treePanel; private ProjectComboBox pList; private VPTNode treeRoot; - private VPTContextMenu vcm; - private VPTSelectionListener vsl; private ConfigChangeListener ccl; - private TreeDragListener tdl; - private DragSource dragSource; - private boolean isChangingBuffers; private boolean isClosingProject; private volatile boolean isLoadingProject; @@ -896,18 +727,11 @@ setLayout(new BorderLayout()); view = aView; - vcm = new VPTContextMenu(this); - vsl = new VPTSelectionListener(this); treeRoot = VPTRoot.getInstance(); isLoadingProject = false; addHierarchyListener(this); - // drag support - tdl = new TreeDragListener(); - dragSource = new DragSource(); - - // GUI buildGUI(); ccl = new ConfigChangeListener(); @@ -937,27 +761,6 @@ //{{{ Private methods - //{{{ -createTree(TreeModel) : JTree - /** Creates a new tree to be added to the viewer. */ - private JTree createTree(TreeModel model, boolean useTooltips) { - JTree tree = new PVTree(model); - tree.setCellRenderer(new VPTCellRenderer(useTooltips)); - if (useTooltips) { - ToolTipManager.sharedInstance().registerComponent(tree); - } - - // don't change order! - tree.addMouseListener(vsl); - tree.addMouseListener(vcm); - tree.addTreeSelectionListener(vsl); - - // drag support - dragSource.createDefaultDragGestureRecognizer(tree, - DnDConstants.ACTION_COPY, tdl); - - return tree; - } //}}} - //{{{ -populateToolBar() : void /** Loads the toolbar. */ private void populateToolBar() { @@ -974,7 +777,7 @@ //{{{ -buildGUI() : void /** Builds the viewer GUI. */ private void buildGUI() { - treePane = new JTabbedPane(); + treePanel = new ProjectTreePanel(this); topPane = new JPanel(new BorderLayout()); @@ -987,8 +790,9 @@ topPane.add(BorderLayout.CENTER, box); - showTrees(); + treePanel.loadGUI(); showToolBar(config.getShowToolBar()); + add(BorderLayout.CENTER, treePanel); add(BorderLayout.NORTH, topPane); } //}}} @@ -1058,7 +862,7 @@ } // saves the folder tree state - String state = getFolderTreeState(p); + String state = treePanel.getFolderTreeState(p); if (state != null) { p.setProperty(TREE_STATE_PROP, state); } else { @@ -1086,101 +890,18 @@ // loads tree state from the project, if saved final String state = p.getProperty(TREE_STATE_PROP); - if (state != null && folderTree != null) { + if (state != null && treePanel.getFolderTree() != null) { SwingUtilities.invokeLater( new Runnable() { - //{{{ +run() : void public void run() { - setFolderTreeState(p, state); - } //}}} + treePanel.setFolderTreeState(p, state); + } } ); } setChangingBuffers(false); } //}}} - //{{{ -showTrees() : void - /** - * Loads the trees (folders, files, working files) into the view, deciding - * what to show according to the configuration of the plugin - */ - private void showTrees() { - treePane.removeAll(); - - // Folders tree - if (config.getShowFoldersTree()) { - if(folderTree == null) { - folderTree = createTree(new DefaultTreeModel(treeRoot, true), false); - folderTreeScroller = new JScrollPane(folderTree); - } - treePane.addTab(jEdit.getProperty(FOLDERS_TAB_TITLE), folderTreeScroller); - } else if (folderTree != null) { - folderTree = null; - folderTreeScroller = null; - } - - // Files tree - if (config.getShowFilesTree()) { - if(fileTree == null) { - fileTree = createTree(new VPTFileListModel(treeRoot), true); - fileTreeScroller = new JScrollPane(fileTree); - } - treePane.addTab(jEdit.getProperty(FILES_TAB_TITLE), fileTreeScroller); - } else if (fileTree != null) { - fileTree = null; - fileTreeScroller = null; - } - - // Working files tree - if (config.getShowWorkingFilesTree()) { - if(workingFileTree == null) { - VPTWorkingFileListModel model = new VPTWorkingFileListModel(treeRoot); - workingFileTree = createTree(model, true); - workingFileTreeScroller = new JScrollPane(workingFileTree); - } - treePane.addTab(jEdit.getProperty(WORKING_FILES_TAB_TITLE), workingFileTreeScroller); - } else if (workingFileTree != null) { - workingFileTree = null; - workingFileTreeScroller = null; - } - - // compact tree - if (config.getShowCompactTree()) { - if(compactTree == null) { - VPTCompactModel model = new VPTCompactModel(treeRoot); - compactTree = createTree(model, false); - compactTreeScroller = new JScrollPane(compactTree); - } - treePane.addTab(jEdit.getProperty(COMPACT_TAB_TITLE,"Compact"), compactTreeScroller); - } else { - compactTree = null; - compactTreeScroller = null; - } - - // filtered tree - if (config.getShowFilteredTree()) { - if(filteredTree == null) { - VPTFilteredModel model = new VPTFilteredModel(treeRoot); - filteredTree = createTree(model, true); - filteredTreeScroller = new JScrollPane(filteredTree); - } - treePane.addTab(jEdit.getProperty(FILTERED_TAB_TITLE,"Filtered"), filteredTreeScroller); - } else { - filteredTree = null; - filteredTreeScroller = null; - } - - if (treePane.getTabCount() == 0) { - remove(treePane); - } else if (treePane.getTabCount() == 1) { - remove(treePane); - add(BorderLayout.CENTER,treePane.getComponentAt(0)); - } else { - add(BorderLayout.CENTER,treePane); - treePane.setSelectedIndex(0); - } - }//}}} - //{{{ -showToolBar(boolean) : void /** Shows/Hides the toolbar. */ private void showToolBar(boolean flag) { @@ -1224,14 +945,7 @@ && (active == null || !active.contains(p.getName()))) { pm.unloadProject(p); - if (fileTree != null) { - ((VPTFileListModel)fileTree.getModel()) - .cleanup(p); - } - if (workingFileTree != null) { - ((VPTWorkingFileListModel)workingFileTree.getModel()) - .cleanup(p); - } + getTreePanel().projectClosed(p); } } } //}}} @@ -1296,7 +1010,6 @@ view.getStatus().setMessageAndClear(message); } //}}} - //{{{ +getSelectedNode() : VPTNode /** Returns the currently selected node in the tree. */ public VPTNode getSelectedNode() { @@ -1338,39 +1051,7 @@ //{{{ +getCurrentTree() : JTree /** Returns the currently active tree. */ public JTree getCurrentTree() { - if (treePane.getTabCount() > 0) { - switch(treePane.getSelectedIndex()) { - case 0: - if (folderTree != null) return folderTree; - if (fileTree != null) return fileTree; - if (workingFileTree != null) return workingFileTree; - if (compactTree != null) return compactTree; - if (filteredTree != null) return filteredTree; - case 1: - if (fileTree != null) return fileTree; - if (workingFileTree != null) return workingFileTree; - if (compactTree != null) return compactTree; - if (filteredTree != null) return filteredTree; - case 2: - if (workingFileTree != null) return workingFileTree; - if (compactTree != null) return compactTree; - if (filteredTree != null) return filteredTree; - case 3: - if (compactTree != null) return compactTree; - if (filteredTree != null) return filteredTree; - case 4: - if (filteredTree != null) return filteredTree; - default: - return null; - } - } else { - if (folderTree != null) return folderTree; - if (fileTree != null) return fileTree; - if (workingFileTree != null) return workingFileTree; - if (compactTree != null) return compactTree; - if (filteredTree != null) return filteredTree; - return null; - } + return treePanel.getCurrentTree(); } //}}} //{{{ +getView() : View @@ -1436,16 +1117,7 @@ } treeRoot = n; - if (folderTree != null) - ((DefaultTreeModel)folderTree.getModel()).setRoot(treeRoot); - if (fileTree != null) - ((DefaultTreeModel)fileTree.getModel()).setRoot(treeRoot); - if (workingFileTree != null) - ((DefaultTreeModel)workingFileTree.getModel()).setRoot(treeRoot); - if (compactTree != null) - ((DefaultTreeModel)compactTree.getModel()).setRoot(treeRoot); - if (filteredTree != null) - ((DefaultTreeModel)filteredTree.getModel()).setRoot(treeRoot); + treePanel.setRoot(treeRoot); dontAsk = null; ProjectManager.getInstance().fireDynamicMenuChange(); @@ -1475,13 +1147,8 @@ //{{{ +setEnabled(boolean) : void /** Enables or disables the viewer GUI. */ public void setEnabled(boolean flag) { - treePane.setEnabled(flag); + treePanel.setEnabled(flag); pList.setEnabled(flag); - if (folderTree != null) folderTree.setEnabled(flag); - if (fileTree != null) fileTree.setEnabled(flag); - if (workingFileTree != null) workingFileTree.setEnabled(flag); - if (compactTree != null) compactTree.setEnabled(flag); - if (filteredTree != null) filteredTree.setEnabled(flag); if (toolBar != null) { Component[] buttons = toolBar.getComponents(); for (int i = 0; i < buttons.length; i++) @@ -1490,68 +1157,6 @@ super.setEnabled(flag); } //}}} - //{{{ +getFolderTreeState(VPTNode) : String - /** - * Returns a String representing the state of the folder tree. - * - * @see #setFolderTreeState(VPTNode, String) - * @return The state of the tree, starting at the given node, or - * null if the folderTree is not visible. - */ - public String getFolderTreeState(VPTNode node) { - if (folderTree != null) { - DefaultTreeModel model = (DefaultTreeModel) folderTree.getModel(); - int start = folderTree.getRowForPath(new TreePath(model.getPathToRoot(node))); - if (start >= 0) { - StringBuffer state = new StringBuffer(); - if(folderTree.isExpanded(start)) { - for(int i = start; i < folderTree.getRowCount(); i++) { - VPTNode n = (VPTNode) folderTree.getPathForRow(i) - .getLastPathComponent(); - if (!node.isNodeDescendant(n)) - break; - if (folderTree.isExpanded(i)) { - state.append(EXPANDED); - } else { - state.append(NOT_EXPANDED); - } - } - } - return state.toString(); - } - } - return null; - } //}}} - - //{{{ +setFolderTreeState(VPTNode, String) : void - /** - * Sets the folder tree state from the given String. - * - * @see #getFolderTreeState(VPTNode) - */ - public void setFolderTreeState(VPTNode node, String state) { - if (folderTree != null && state != null) { - DefaultTreeModel model = (DefaultTreeModel) folderTree.getModel(); - int start = folderTree.getRowForPath(new TreePath(model.getPathToRoot(node))); - for(int i = 0; i < state.length(); i++) { - int row = start + i; - if (row >= folderTree.getRowCount()) - break; - - TreePath path = folderTree.getPathForRow(row); - if (path == null) - return; - VPTNode n = (VPTNode) path.getLastPathComponent(); - if (!node.isNodeDescendant(n)) - break; - - if (state.charAt(i) == EXPANDED) { - folderTree.expandRow(row); - } - } - } - } //}}} - //{{{ +setChangingBuffers(boolean) : void /** * Method intended for use by classes that manage clicks on the @@ -1566,6 +1171,11 @@ isChangingBuffers = flag; } //}}} + public ProjectTreePanel getTreePanel() + { + return treePanel; + } + //}}} //{{{ Message handling @@ -1709,14 +1319,10 @@ if (where != null && where.isProject()) { VPTNode f = ((VPTProject)where).getChildNode(bu.getBuffer().getPath()); if (f != null) { - if (workingFileTree != null) { - if (bu.getWhat() == BufferUpdate.CLOSED) { - ((VPTWorkingFileListModel)workingFileTree.getModel()) - .removeOpenFile(f.getNodePath()); - } else if (bu.getWhat() == BufferUpdate.LOADED) { - ((VPTWorkingFileListModel)workingFileTree.getModel()) - .addOpenFile(f.getNodePath()); - } + if (bu.getWhat() == BufferUpdate.CLOSED) { + getTreePanel().projectFileClosed(f); + } else if (bu.getWhat() == BufferUpdate.LOADED) { + getTreePanel().projectFileOpened(f); } if (!isClosingProject && bu.getWhat() == BufferUpdate.CLOSED) { @@ -1778,10 +1384,8 @@ public void propertyChange(PropertyChangeEvent evt) { // Toolbar show/hide. if (evt.getPropertyName().equals(ProjectViewerConfig.SHOW_TOOLBAR_OPT)) { - showToolBar( ((Boolean)evt.getNewValue()).booleanValue() && - (folderTree != null || fileTree != null - || workingFileTree != null || compactTree != null - || filteredTree != null) ); + showToolBar(((Boolean)evt.getNewValue()).booleanValue() + && treePanel.getTreeCount() > 0); return; } @@ -1796,10 +1400,10 @@ if (evt.getPropertyName().equals(ProjectViewerConfig.CASE_INSENSITIVE_SORT_OPT)) { treeRoot.sortChildren(true); - String state = getFolderTreeState(treeRoot); + String state = treePanel.getFolderTreeState(treeRoot); nodeStructureChanged(treeRoot); nodeStructureChangedFlat(treeRoot); - setFolderTreeState(treeRoot, state); + treePanel.setFolderTreeState(treeRoot, state); repaint(); return; } @@ -1824,7 +1428,7 @@ * or more of the trees has changed. */ public void run() { - showTrees(); + treePanel.loadGUI(); showToolBar(config.getShowToolBar()); willRun = false; }//}}} @@ -1894,192 +1498,6 @@ } //}}} - //{{{ -class PVTree - /** Listens for key events in the trees. */ - private class PVTree extends JTree { - - //{{{ +PVTree(TreeModel) : <init> - public PVTree(TreeModel model) { - super(model); - } //}}} - - //{{{ +processKeyEvent(KeyEvent) : void - public void processKeyEvent(KeyEvent e) { - if (e.getID() == KeyEvent.KEY_PRESSED) { - switch (e.getKeyCode()) { - case KeyEvent.VK_ESCAPE: - DockableWindowManager dwm = view.getDockableWindowManager(); - dwm.hideDockableWindow(ProjectPlugin.NAME); - e.consume(); - break; - case KeyEvent.VK_ENTER: - TreePath[] paths = getSelectionPaths(); - for (int i = 0; i < paths.length; i++) { - VPTNode n = (VPTNode) paths[i].getLastPathComponent(); - if (n.isFile()) { - n.open(); - } - } - e.consume(); - break; - case KeyEvent.VK_BACK_SPACE: - e.consume(); - UpAction up = new UpAction(); - up.setViewer(ProjectViewer.this); - up.actionPerformed(null); - break; - case KeyEvent.VK_DELETE: - e.consume(); - NodeRemoverAction nra = new NodeRemoverAction(true); - nra.setViewer(ProjectViewer.this); - nra.actionPerformed(null); - break; - case KeyEvent.VK_F5: - e.consume(); - EditAction ea = jEdit.getAction("projectviewer_wrapper_reimport"); - ea.invoke(view); - break; - case KeyEvent.VK_F2: - e.consume(); - NodeRenamerAction ra = new NodeRenamerAction(); - ra.setViewer(ProjectViewer.this); - ra.actionPerformed(null); - break; - default: - super.processKeyEvent(e); - } - } - else { super.processKeyEvent(e); } - } //}}} - - //{{{ +expandPath(TreePath) : void - /** - * If trying to expand unloaded projects, load them before expansion - * occurs. - */ - public void expandPath(TreePath path) { - VPTNode n = (VPTNode) path.getLastPathComponent(); - if (n.isProject() - && !ProjectManager.getInstance().isLoaded(n.getName())) { - - synchronized (n) { - if (!ProjectManager.getInstance().isLoaded(n.getName())) { - setStatus(jEdit.getProperty("projectviewer.loading_project", - new Object[] { n.getName() } )); - ProjectManager.getInstance().getProject(n.getName()); - } - } - } - super.expandPath(path); - - if (n.isProject() || n.isGroup()) { - if (folderTree != null && folderTree != this) - ((PVTree)folderTree).expand(path); - if (fileTree != null && fileTree != this) - ((PVTree)fileTree).expand(path); - if (workingFileTree != null && workingFileTree != this) - ((PVTree)workingFileTree).expand(path); - if (compactTree != null && compactTree != this) - ((PVTree)compactTree).expand(path); - if (filteredTree != null && filteredTree != this) - ((PVTree)filteredTree).expand(path); - } - - } //}}} - - //{{{ +collapsePath(TreePath) : void - /** Keeps trees syncd w.r.t. projects and groups. */ - public void collapsePath(TreePath path) { - super.collapsePath(path); - VPTNode n = (VPTNode) path.getLastPathComponent(); - if (n.isProject() || n.isGroup()) { - if (folderTree != null && folderTree != this) - ((PVTree)folderTree).collapse(path); - if (fileTree != null && fileTree != this) - ((PVTree)fileTree).collapse(path); - if (workingFileTree != null && workingFileTree != this) - ((PVTree)workingFileTree).collapse(path); - if (compactTree != null && compactTree != this) - ((PVTree)compactTree).collapse(path); - if (filteredTree != null && filteredTree != this) - ((PVTree)filteredTree).collapse(path); - } - } //}}} - - //{{{ -expand(TreePath) : void - /** - * Used internally to bypass the overridden "expandPath()" method and - * keep the different trees synced w.r.t. projects and groups. - */ - private void expand(TreePath path) { - super.expandPath(path); - } //}}} - - //{{{ -collapse(TreePath) : void - /** - * Used internally to bypass the overridden "expandPath()" method and - * keep the different trees synced w.r.t. projects and groups. - */ - private void collapse(TreePath path) { - super.collapsePath(path); - } //}}} - - } //}}} - - //{{{ -class TreeDragListener - /** - * Implements a DragGestureListener for the trees, that will detect when - * the user tries to drag a file to somewhere. Other kinds of nodes will - * be ignored. - */ - private class TreeDragListener implements DragGestureListener { - - //{{{ +dragGestureRecognized(DragGestureEvent) : void - public void dragGestureRecognized(DragGestureEvent dge) { - JTree tree = getCurrentTree(); - TreePath path = tree.getPathForLocation( (int) dge.getDragOrigin().getX(), - (int) dge.getDragOrigin().getY()); - - if (path != null) { - VPTNode n = (VPTNode) path.getLastPathComponent(); - if (n.isFile()) { - dge.startDrag(DragSource.DefaultCopyDrop, - new FileListTransferable((VPTFile)n)); - } - } - } //}}} - - } //}}} - - //{{{ -class _FileListTransferable_ - /** A transferable for a file. */ - private static class FileListTransferable extends LinkedList implements Transferable { - - //{{{ +FileListTransferable(VPTFile) : <init> - public FileListTransferable(VPTFile file) { - super.add(file.getFile()); - } //}}} - - //{{{ +getTransferData(DataFlavor) : Object - public Object getTransferData(DataFlavor flavor) { - if (flavor == DataFlavor.javaFileListFlavor) { - return this; - } - return null; - } //}}} - - //{{{ +getTransferDataFlavors() : DataFlavor[] - public DataFlavor[] getTransferDataFlavors() { - return new DataFlavor[] { DataFlavor.javaFileListFlavor }; - } //}}} - - //{{{ +isDataFlavorSupported(DataFlavor) : boolean - public boolean isDataFlavorSupported(DataFlavor flavor) { - return (flavor == DataFlavor.javaFileListFlavor); - } //}}} - - } //}}} - //{{{ -class _ViewerEntry_ /** * Holds information about what's active on what view, to allow active @@ -2109,50 +1527,21 @@ //{{{ -handleErrorSourceUpdateMessage(ErrorSourceUpdate) : void /** Handles a ErrorSourceUpdate EditBus message. */ private void handleErrorSourceUpdateMessage(ErrorSourceUpdate esu) { - //Log.log(Log.DEBUG, this, "ErrorSourceUpdate received :["+esu.getWhat()+"]["+esu.getErrorSource().getName()+"]"); - if ( esu.getWhat() == ErrorSourceUpdate.ERROR_ADDED || - esu.getWhat() == ErrorSourceUpdate.ERROR_REMOVED) { + if (esu.getWhat() == ErrorSourceUpdate.ERROR_ADDED + || esu.getWhat() == ErrorSourceUpdate.ERROR_REMOVED) + { VPTProject p = (VPTProject) treeRoot; ErrorSource.Error error = esu.getError(); VPTNode f = p.getChildNode(error.getFilePath()); - if ( f != null ) { - //Log.log(Log.DEBUG, this, "ErrorSourceUpdate for :["+error.getFilePath()+"]"); - if (folderTree != null) { - ((DefaultTreeModel)folderTree.getModel()).nodeChanged(f); - } - if (fileTree != null) { - ((DefaultTreeModel)fileTree.getModel()).nodeChanged(f); - } - if (workingFileTree != null) { - ((VPTWorkingFileListModel)workingFileTree.getModel()).nodeChanged(f); - } - if (compactTree != null) { - ((DefaultTreeModel)compactTree.getModel()).nodeChanged(f); - } - if (filteredTree != null) { - ((DefaultTreeModel)filteredTree.getModel()).nodeChanged(f); - } + if (f != null) { + treePanel.nodeChanged(f); } } if (esu.getWhat() == ErrorSourceUpdate.ERROR_SOURCE_ADDED - || esu.getWhat() == ErrorSourceUpdate.ERROR_SOURCE_REMOVED - || esu.getWhat() == ErrorSourceUpdate.ERRORS_CLEARED) { - - if (folderTree != null) { - folderTree.repaint(); - } - if (fileTree != null) { - fileTree.repaint(); - } - if (workingFileTree != null) { - workingFileTree.repaint(); - } - if (compactTree != null) { - compactTree.repaint(); - } - if (filteredTree != null) { - filteredTree.repaint(); - } + || esu.getWhat() == ErrorSourceUpdate.ERROR_SOURCE_REMOVED + || esu.getWhat() == ErrorSourceUpdate.ERRORS_CLEARED) + { + treePanel.repaint(); } }//}}} Modified: plugins/ProjectViewer/trunk/projectviewer/action/SearchAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/SearchAction.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/action/SearchAction.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -43,6 +43,7 @@ import org.gjt.sp.jedit.search.SearchAndReplace; import org.gjt.sp.util.Log; +import org.gjt.sp.util.StandardUtilities; import projectviewer.ProjectManager; import projectviewer.ProjectViewer; @@ -141,8 +142,7 @@ public NodeFileSet(VPTNode node) { super(null, "*", true); this.node = node; - this.skipBinary = jEdit.getBooleanProperty("search.skipBinary.toggle", false) - && ProjectViewerConfig.getInstance().hasBinaryFileCheck(); + this.skipBinary = jEdit.getBooleanProperty("search.skipBinary.toggle", false); } //}}} @@ -157,7 +157,7 @@ protected String[] _getFiles(Component comp) { String filter = getFileFilter(); if (filter != null && filter.length() > 0 && !filter.equals("*")) { - pFilter = Pattern.compile(MiscUtilities.globToRE(filter)); + pFilter = Pattern.compile(StandardUtilities.globToRE(filter)); } HashSet fileset = new HashSet(); @@ -190,18 +190,15 @@ if (skipBinary) { InputStream is = null; - Reader r = null; try { is = new FileInputStream(n.getNodePath()); - r = MiscUtilities.autodetect(is, null); - if (MiscUtilities.isBinary(r)) { + if (MiscUtilities.isBinary(is)) { continue; } } catch (IOException ioe) { Log.log(Log.ERROR, this, ioe); continue; } finally { - if (r != null) try { r.close(); } catch (Exception ex) { } if (is != null) try { is.close(); } catch (Exception ex) { } } } Modified: plugins/ProjectViewer/trunk/projectviewer/config/AppLauncher.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/AppLauncher.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/config/AppLauncher.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -38,11 +38,12 @@ import javax.swing.JFileChooser; import javax.swing.JOptionPane; -import org.gjt.sp.util.Log; import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.MiscUtilities; import org.gjt.sp.jedit.io.VFSManager; +import org.gjt.sp.util.Log; +import org.gjt.sp.util.StandardUtilities; + import common.gui.ModalJFileChooser; import projectviewer.ProjectPlugin; @@ -346,7 +347,7 @@ //{{{ +ComparableRE(String) : <init> public ComparablePattern(String glob) { - this.pattern = Pattern.compile(MiscUtilities.globToRE(glob)); + this.pattern = Pattern.compile(StandardUtilities.globToRE(glob)); this.glob = glob; } //}}} Modified: plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -24,6 +24,7 @@ //{{{ Imports import java.util.Collections; +import java.util.Comparator; import java.util.Vector; import java.util.StringTokenizer; @@ -54,11 +55,12 @@ import org.gjt.sp.jedit.ActionSet; import org.gjt.sp.jedit.EditAction; import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.MiscUtilities; import org.gjt.sp.jedit.gui.EnhancedDialog; import org.gjt.sp.jedit.gui.RolloverButton; import org.gjt.sp.jedit.AbstractOptionPane; +import org.gjt.sp.util.StandardUtilities; + import common.gui.OkCancelButtons; import projectviewer.vpt.VPTContextMenu; @@ -152,7 +154,7 @@ showUserFirst = new JCheckBox(jEdit.getProperty("options.projectviewer.contextmenu.userfirst")); showUserFirst.setSelected(jEdit.getBooleanProperty("projectviewer.contextmenu.userfirst")); buttons.add(showUserFirst); - + buttons.add(Box.createHorizontalStrut(6)); buttons.add(Box.createGlue()); @@ -161,11 +163,11 @@ } //}}} //{{{ MenuItemCompare class - static class MenuItemCompare implements MiscUtilities.Compare + static class MenuItemCompare implements Comparator { public int compare(Object obj1, Object obj2) { - return MiscUtilities.compareStrings( + return StandardUtilities.compareStrings( ((MenuItem)obj1).label, ((MenuItem)obj2).label, true); @@ -411,7 +413,7 @@ action.getName(),label)); } - Collections.sort(listModel,new ContextOptionPane.MenuItemCompare()); + Collections.sort(listModel, new ContextOptionPane.MenuItemCompare()); list.setListData(listModel); } //}}} Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -33,11 +33,12 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import org.gjt.sp.util.Log; import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.MiscUtilities; import org.gjt.sp.jedit.OperatingSystem; +import org.gjt.sp.util.Log; +import org.gjt.sp.util.StandardUtilities; + import projectviewer.ProjectManager; import projectviewer.ProjectPlugin; import projectviewer.vpt.VPTNode; @@ -337,7 +338,7 @@ // check if import settings mods were applied (version: PV 2.1.0) if (lastInitVersion == null || - MiscUtilities.compareStrings(lastInitVersion, + StandardUtilities.compareStrings(lastInitVersion, "2.1.0", true) < 0) { updateImportSettings(props); } @@ -348,7 +349,7 @@ // this avoids messing up the configuration for those people // that were using the beta. if (lastInitVersion == null || - MiscUtilities.compareStrings(lastInitVersion, + StandardUtilities.compareStrings(lastInitVersion, "2.1.0.1", true) < 0) { updateAppLauncherSettings(props); } @@ -356,7 +357,7 @@ // checks for incremental updates to import settings String thisVersion = jEdit.getProperty("plugin.projectviewer.ProjectPlugin.version"); if (lastInitVersion == null || - MiscUtilities.compareStrings(lastInitVersion, + StandardUtilities.compareStrings(lastInitVersion, thisVersion, true) < 0) { Properties importProps = loadDefaultImportProps(); // check again, since we may have had IO problems. @@ -745,21 +746,6 @@ return (jEdit.getPlugin(ERRORLIST_PLUGIN) != null); } //}}} - //{{{ isJEdit43() - public boolean isJEdit43() { - return jEdit.getBuild().startsWith("04.03"); - } //}}} - - /** - * Checks whether jEdit has the methods to do binary file check, - * which was added in 4.3pre5. - * - * @since PV 2.3.1.6 - */ - public boolean hasBinaryFileCheck() { - return (MiscUtilities.compareVersions(jEdit.getBuild(), "04.03.05.00") >= 0); - } - //}}} //{{{ Private Methods @@ -860,7 +846,7 @@ */ private boolean needUpdate(String updateVersion) { return (lastInitVersion == null - || MiscUtilities.compareStrings(lastInitVersion, updateVersion, true) < 0); + || StandardUtilities.compareStrings(lastInitVersion, updateVersion, true) < 0); } /** Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -198,11 +198,9 @@ useSystemIcons.setSelected(config.getUseSystemIcons()); addComponent(useSystemIcons); - if (config.isJEdit43()) { - showProjectInTitle = new JCheckBox(jEdit.getProperty("projectviewer.options.show_project_in_title")); - showProjectInTitle.setSelected(config.getShowProjectInTitle()); - addComponent(showProjectInTitle); - } + showProjectInTitle = new JCheckBox(jEdit.getProperty("projectviewer.options.show_project_in_title")); + showProjectInTitle.setSelected(config.getShowProjectInTitle()); + addComponent(showProjectInTitle); caseInsensitiveSort = new JCheckBox(jEdit.getProperty("projectviewer.options.case_insensitive_sort")); caseInsensitiveSort.setSelected(config.getCaseInsensitiveSort()); @@ -271,9 +269,7 @@ config.setShowFilteredTree(showFilteredTree.isSelected()); config.setUseSystemIcons(useSystemIcons.isSelected()); - if (config.isJEdit43()) { - config.setShowProjectInTitle(showProjectInTitle.isSelected()); - } + config.setShowProjectInTitle(showProjectInTitle.isSelected()); config.setCaseInsensitiveSort(caseInsensitiveSort.isSelected()); config.setFollowCurrentBuffer(followCurrentBuffer.isSelected()); Modified: plugins/ProjectViewer/trunk/projectviewer/importer/GlobFilter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/GlobFilter.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/importer/GlobFilter.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -26,7 +26,7 @@ import java.util.regex.PatternSyntaxException; import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.MiscUtilities; +import org.gjt.sp.util.StandardUtilities; import org.gjt.sp.jedit.io.VFS; import org.gjt.sp.jedit.io.VFSManager; @@ -117,10 +117,10 @@ while (globs.hasMoreTokens()) { String token = globs.nextToken(); if (token.startsWith("!")) { - fNeg.append(MiscUtilities.globToRE(token.substring(1))); + fNeg.append(StandardUtilities.globToRE(token.substring(1))); fNeg.append("|"); } else { - fPos.append(MiscUtilities.globToRE(token)); + fPos.append(StandardUtilities.globToRE(token)); fPos.append("|"); } } @@ -133,7 +133,7 @@ globs = new StringTokenizer(dirGlobs); StringBuffer dirs = new StringBuffer(); while (globs.hasMoreTokens()) { - dirs.append(MiscUtilities.globToRE(globs.nextToken())); + dirs.append(StandardUtilities.globToRE(globs.nextToken())); dirs.append("|"); } if (dirs.length() > 0) Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -425,7 +425,7 @@ //{{{ +run() : void public void run() { ProjectViewer.nodeStructureChanged(node); - viewer.setFolderTreeState(node, state); + viewer.getTreePanel().setFolderTreeState(node, state); } //}}} } //}}} Modified: plugins/ProjectViewer/trunk/projectviewer/importer/ReImporter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/ReImporter.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/importer/ReImporter.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -92,7 +92,7 @@ id.show(); if (id.isApproved()) { - String state = viewer.getFolderTreeState(selected); + String state = viewer.getTreePanel().getFolderTreeState(selected); fnf = id.getImportFilter(); reimportDirectory((VPTDirectory)selected, id.getFlattenFilePaths()); postAction = new NodeStructureChange(selected, state); Modified: plugins/ProjectViewer/trunk/projectviewer/importer/RootImporter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/RootImporter.java 2007-05-12 17:37:30 UTC (rev 9531) +++ plugins/ProjectViewer/trunk/projectviewer/importer/RootImporter.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -102,7 +102,7 @@ String state = null; if (viewer != null) { - state = viewer.getFolderTreeState(project); + state = viewer.getTreePanel().getFolderTreeState(project); } if (clean) { Added: plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreeModel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreeModel.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreeModel.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -0,0 +1,85 @@ +/* + * :tabSize=4:indentSize=4:noTabs=true: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.vpt; + +import javax.swing.tree.DefaultTreeModel; + +/** + * A tree model that defines a few methods used internally by + * ProjectViewer. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public abstract class ProjectTreeModel extends DefaultTreeModel +{ + + protected ProjectTreeModel(VPTNode root) + { + super(root, true); + } + + + /** + * Returns the name of the tree, to be shown in the tabbed + * pane GUI. The name can also be a key for a jEdit property. + */ + protected abstract String getName(); + + /** + * Returns whether this model shows files in a nin-hierarchical + * ("flat") manner. "Flat" trees receive a few different + * notifications than non-flat ones: basically, they don't get + * notifications for changes in directories - rather, they are + * notified of a change in the project's structure instead. + */ + protected boolean isFlat() + { + return false; + } + + + /** + * Called when a project's file is opened in jEdit. + */ + protected void fileOpened(VPTNode file) + { + + } + + /** + * Called when a project's file is opened in jEdit. + */ + protected void fileClosed(VPTNode file) + { + + } + + + /** + * Called when a project had been closed. + */ + protected void projectClosed(VPTProject p) + { + + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreeModel.java ___________________________________________________________________ Name: svn:keywords + Id Added: plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java 2007-05-13 20:49:07 UTC (rev 9532) @@ -0,0 +1,612 @@ +/* + * :tabSize=4:indentSize=4:noTabs=true: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.vpt; + +//{{{ Imports +import java.awt.BorderLayout; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; + +import java.awt.dnd.DragSource; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; + +import java.awt.event.KeyEvent; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTree; +import javax.swing.ToolTipManager; + +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.gui.DockableWindowManager; + +import projectviewer.ProjectManager; +import projectviewer.ProjectPlugin; +import projectviewer.ProjectViewer; + +import projectviewer.action.Action; +import projectviewer.action.NodeRemoverAction; +import projectviewer.action.NodeRenamerAction; +import projectviewer.action.ReimportAction; +import projectviewer.action.UpAction; + +import projectviewer.config.ProjectViewerConfig; +//}}} + +/** + * A panel that contains the several trees for showing project data. + * Also provider methods for managing and interacting with the + * trees. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public class ProjectTreePanel extends JPanel +{ + + //{{{ Constants + private final static char NOT_EXPANDED = '0'; + private final static char EXPANDED = '1'; + + private final static ProjectViewerConfig config = ProjectViewerConfig.getInstance(); + //}}} + + private JTabbedPane treePane; + private JTree folderTree; + private List<PVTree> trees; + + private ProjectViewer viewer; + + private VPTContextMenu contextMenu; + private VPTSelectionListener selectionListener; + + private DragSource dragSource; + private TreeDragListener dragListener; + + + public ProjectTreePanel(ProjectViewer viewer) + { + super(new BorderLayout()); + this.viewer = viewer; + + trees = new ArrayList(); + contextMenu = new VPTContextMenu(viewer); + selectionListener = new VPTSelectionListener(viewer); + + dragListener = new TreeDragListener(); + dragSource = new DragSource(); + } + + + /** + * Returns the currently active tree. + */ + public JTree getCurrentTree() + { + return (trees.size() == 0) ? null + : trees.get(treePane.getSelectedIndex()); + } + + + /** + * Removes all trees from the panel. + */ + public void removeAll() + { + setRoot(null); + trees.clear(); + folderTree = null; + super.removeAll(); + } + + + /** + * Loads the trees (folders, files, working files) into the view, + * deciding what to show according to the configuration of the + * plugin. + */ + public void loadGUI() + { + JScrollPane scroller; + removeAll(); + + if (config.getShowFoldersTree()) { + folderTree = createTree(new VPTFoldersTreeModel(viewer.getRoot()), + false); + } + + if (config.getShowFilesTree()) { + createTree(new VPTFileListModel(viewer.getRoot()), + true); + } + + if (config.getShowWorkingFilesTree()) { + createTree(new VPTWorkingFileListModel(viewer.getRoot()), + true); + } + + if (config.getShowCompactTree()) { + createTree(new VPTCompactModel(viewer.getRoot()), ... [truncated message content] |
From: <va...@us...> - 2007-07-03 06:54:02
|
Revision: 9910 http://svn.sourceforge.net/jedit/?rev=9910&view=rev Author: vanza Date: 2007-07-02 23:53:59 -0700 (Mon, 02 Jul 2007) Log Message: ----------- Change the event notification system to use the EditBus instead of using a listener-based approach. This way PV doesn't need to keep track of which plugins provider listeners. Modified Paths: -------------- plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/action/EditGroupAction.java plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java plugins/ProjectViewer/trunk/projectviewer/action/MoveNodeAction.java plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java plugins/ProjectViewer/trunk/projectviewer/event/package.html plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTSelectionListener.java plugins/ProjectViewer/trunk/pvdebug/PVDebugPlugin.java plugins/ProjectViewer/trunk/pvdebug/PVDebugPlugin.props Added Paths: ----------- plugins/ProjectViewer/trunk/projectviewer/event/ProjectUpdate.java plugins/ProjectViewer/trunk/projectviewer/event/StructureUpdate.java plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java Removed Paths: ------------- plugins/ProjectViewer/trunk/projectviewer/event/ProjectAdapter.java plugins/ProjectViewer/trunk/projectviewer/event/ProjectEvent.java plugins/ProjectViewer/trunk/projectviewer/event/ProjectListener.java plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerAdapter.java plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerEvent.java plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerListener.java plugins/ProjectViewer/trunk/pvdebug/ProjectEventDumper.java plugins/ProjectViewer/trunk/pvdebug/ProjectViewerEventDumper.java Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-03 06:53:59 UTC (rev 9910) @@ -21,6 +21,9 @@ - Bump requirements: jEdit 4.3, Java 5 - Refactor the tree handling code into its own class, to try to simplify the ProjectViewer class. + - Get rid of the old listener-based event notification system, + reorganize the events into newer classes, and use the EditBus + to send events. ================================================================================ Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -56,13 +56,13 @@ import common.threads.WorkerThreadPool; import common.threads.WorkRequest; +import projectviewer.event.StructureUpdate; import projectviewer.vpt.VPTFilterData; import projectviewer.vpt.VPTGroup; import projectviewer.vpt.VPTNode; import projectviewer.vpt.VPTRoot; import projectviewer.vpt.VPTProject; import projectviewer.config.ProjectViewerConfig; -import projectviewer.event.ProjectListener; import projectviewer.persist.OldConfigLoader; import projectviewer.persist.ProjectPersistenceManager; //}}} @@ -312,8 +312,10 @@ if (e == null) return; projects.remove(p.getName()); - ProjectViewer.projectRemoved(this, p); + ProjectViewer.projectRemoved(p); + StructureUpdate.send(p, StructureUpdate.Type.PROJECT_REMOVED); + if (e.fileName != null) { new File(ProjectPlugin.getResourcePath("projects/" + e.fileName)).delete(); // project list changed, save "global" data. @@ -343,7 +345,9 @@ } //}}} //{{{ +addProject(VPTProject, VPTGroup) : void - /** Adds a project to the list. */ + /** + * Adds a project to the list. + */ public void addProject(VPTProject p, VPTGroup parent) { Entry e = new Entry(); e.project = p; @@ -352,7 +356,8 @@ ProjectViewer.insertNodeInto(p, parent); ProjectViewer.nodeStructureChangedFlat(parent); - ProjectViewer.fireProjectAdded(this, p); + + StructureUpdate.send(p, StructureUpdate.Type.PROJECT_ADDED); fireDynamicMenuChange(); nodeActions.addAction(new VPTNodeActivateAction(p)); @@ -388,10 +393,6 @@ } else { Log.log(Log.WARNING, this, "Shouldn't reach this statement!"); } - // Adds the listeners to the project - for (Iterator i = listeners.iterator(); i.hasNext(); ) { - e.project.addProjectListener((ProjectListener)i.next()); - } } } } @@ -437,11 +438,6 @@ public void unloadProject(VPTProject p) { Entry e = (Entry) projects.get(p.getName()); saveProject(e.project, true); - // remove the project's listeners - for (Iterator i = listeners.iterator(); i.hasNext(); ) { - e.project.removeProjectListener((ProjectListener)i.next()); - } - // remove all other things e.project.removeAllChildren(); e.project.getProperties().clear(); e.project.clearOpenFiles(); @@ -474,49 +470,6 @@ ProjectViewer.nodeStructureChanged(ProjectViewer.getActiveNode(jEdit.getActiveView())); } //}}} - //{{{ +addProjectListeners(PluginJAR) : void - /** - * Adds the plugin's declared project listeners to the list of project - * listeners to be added to a project when it's activated. - */ - public void addProjectListeners(PluginJAR jar) { - if (jar.getPlugin() == null) return; - String list = jEdit.getProperty("plugin.projectviewer." + - jar.getPlugin().getClassName() + ".prj-listeners"); - Collection aList = PVActions.listToObjectCollection(list, jar, ProjectListener.class); - if (aList != null && aList.size() > 0) { - listeners.addAll(aList); - // Add the listeners to loaded projects - if (projects.size() > 0) - for (Iterator i = projects.values().iterator(); i.hasNext(); ) { - Entry e = (Entry) i.next(); - if (e.isLoaded) { - for (Iterator j = aList.iterator(); j.hasNext(); ) { - e.project.addProjectListener((ProjectListener)j.next()); - } - } - } - } - } //}}} - - //{{{ +removeProjectListeners(PluginJAR) : void - /** - * Removes the project listeners of the given plugin from the list, and - * from any active project in ProjectViewer. - */ - public void removeProjectListeners(PluginJAR jar) { - Collection toRemove = PVActions.prune(listeners, jar); - if (toRemove != null) - for (Iterator i = projects.values().iterator(); i.hasNext(); ) { - Entry e = (Entry) i.next(); - if (e.isLoaded) { - for (Iterator j = toRemove.iterator(); j.hasNext(); ) { - e.project.removeProjectListener((ProjectListener)j.next()); - } - } - } - } //}}} - //{{{ #unloadProjectProperties() : void /** * Called when a plugin is unloaded so that object properties are Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -191,19 +191,9 @@ private void checkPluginUpdate(PluginUpdate msg) { if (msg.getWhat() == PluginUpdate.LOADED) { try { - ProjectViewer.addProjectViewerListeners(msg.getPluginJAR(), null); - ProjectManager.getInstance().addProjectListeners(msg.getPluginJAR()); ProjectViewer.addToolbarActions(msg.getPluginJAR()); VPTContextMenu.registerActions(msg.getPluginJAR()); ProjectPersistenceManager.loadNodeHandlers(msg.getPluginJAR()); - - View[] v = jEdit.getViews(); - for (int i = 0; i < v.length; i++) { - if (ProjectViewer.getViewer(v[i]) != null) { - ProjectViewer.addProjectViewerListeners(msg.getPluginJAR(), v[i]); - } - } - } catch (Exception e) { Log.log(Log.WARNING, this, "Error loading PV extension, error follows."); Log.log(Log.ERROR, this, e); @@ -215,8 +205,6 @@ Log.log(Log.ERROR, this, eiie); } } else if (msg.getWhat() == PluginUpdate.UNLOADED) { - ProjectViewer.removeProjectViewerListeners(msg.getPluginJAR()); - ProjectManager.getInstance().removeProjectListeners(msg.getPluginJAR()); ProjectManager.getInstance().unloadProjectProperties(); ProjectViewer.removeToolbarActions(msg.getPluginJAR()); VPTContextMenu.unregisterActions(msg.getPluginJAR()); Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -84,6 +84,9 @@ import errorlist.ErrorSource; import errorlist.ErrorSourceUpdate; +import projectviewer.event.StructureUpdate; +import projectviewer.event.ViewerUpdate; + import projectviewer.gui.ProjectComboBox; import projectviewer.vpt.VPTFile; @@ -93,9 +96,6 @@ import projectviewer.vpt.VPTProject; import projectviewer.vpt.ProjectTreePanel; -import projectviewer.event.ProjectViewerEvent; -import projectviewer.event.ProjectViewerListener; - import projectviewer.action.Action; import projectviewer.action.ExpandAllAction; import projectviewer.action.CollapseAllAction; @@ -122,8 +122,6 @@ private static final Map<View,ViewerEntry> viewers; private static final List<Action> actions; - private static final HashMap listeners = new HashMap(); - //{{{ Static Initialization /** * Initializes the default actions, and gets the PV plugins from the list @@ -208,232 +206,6 @@ return (ve != null) ? ve.dockable : null; } //}}} - //{{{ Event Handling - - //{{{ +_addProjectViewerListener(ProjectViewerListener, View)_ : void - /** - * Add a listener for the instance of project viewer of the given - * view. If the given view is null, the listener will be called from - * all instances. - * - * <p>Additionally, for listeners that are registered for all views, a - * ProjectViewerEvent is fired when a different view is selected.</p> - * - * @param lstnr The listener to add. - * @param view The view that the lstnr is attached to, or <code>null</code> - * if the listener wants to be called from all views. - */ - public static void addProjectViewerListener(ProjectViewerListener lstnr, View view) { - ArrayList lst = (ArrayList) listeners.get(view); - if (lst == null) { - lst = new ArrayList(); - listeners.put(view, lst); - } - lst.add(lstnr); - } //}}} - - //{{{ +_removeProjectViewerListener(ProjectViewerListener, View)_ : void - /** - * Remove the listener from the list of listeners for the given view. As - * with the {@link #addProjectViewerListener(ProjectViewerListener, View) add} - * method, <code>view</code> can be <code>null</code>. - */ - public static void removeProjectViewerListener(ProjectViewerListener lstnr, View view) { - ArrayList lst = (ArrayList) listeners.get(view); - if (lst != null) { - lst.remove(lstnr); - } - } //}}} - - //{{{ +_fireProjectLoaded(Object, VPTProject, View)_ : void - /** - * Fires an event for the loading of a project. Notify all the listeners - * registered for the given view and listeners registered for all - * views. - * - * <p>If the view provided is null, only the listeners registered for the - * null View will receive the event.</p> - * - * @param src The viewer that generated the change, or null. - * @param p The activated project. - * @param v The view where the change occured, or null. - */ - public static void fireProjectLoaded(final Object src, - final VPTProject p, - final View v) - { - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - Object mySrc = (src != null) ? src : v; - ProjectViewerEvent evt = new ProjectViewerEvent(mySrc, - getViewer(v), - p); - - Set listeners = getAllListeners(v); - for (Iterator i = listeners.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).projectLoaded(evt); - } - } - } - ); - } //}}} - - //{{{ +_fireGroupActivated(VPTGroup, View)_ : void - /** - * Fires an event for the loading of a group. Notify all the listeners - * registered for the given view and listeners registered for all - * views. - * - * <p>If the view provided is null, only the listeners registered for the - * null View will receive the event.</p> - * - * @param grp The activated group. - * @param v The view where the change occured, or null. - */ - public static void fireGroupActivated(final VPTGroup grp, final View v) { - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - ProjectViewer viewer = getViewer(v); - ProjectViewerEvent evt = new ProjectViewerEvent(grp, viewer); - Set listeners = getAllListeners(v); - for (Iterator i = listeners.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).groupActivated(evt); - } - } - } - ); - } //}}} - - //{{{ +_fireNodeSelected(ProjectViewer, VPTNode)_ : void - public static void fireNodeSelected(ProjectViewer src, VPTNode node) { - View v = jEdit.getActiveView(); - ProjectViewerEvent evt = new ProjectViewerEvent(node, src); - Set listeners = getAllListeners(v); - for (Iterator i = listeners.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).nodeSelected(evt); - } - } //}}} - - //{{{ +_fireProjectAdded(Object, VPTProject)_ : void - /** - * Fires a "project added" event. All listeners, regardless of the view, are - * notified of this event. - */ - public static void fireProjectAdded(Object src, VPTProject p) { - Set notify = getAllListeners(null); - ProjectViewerEvent evt = new ProjectViewerEvent(src, p); - for (Iterator i = notify.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).projectAdded(evt); - } - } //}}} - - //{{{ +_fireProjectRemoved(Object, VPTProject)_ : void - /** - * Fires a "project removed" event. All listeners, regardless of the view, are - * notified of this event. - */ - public static void fireProjectRemoved(Object src, VPTProject p) { - Set notify = getAllListeners(null); - ProjectViewerEvent evt = new ProjectViewerEvent(src, p); - for (Iterator i = notify.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).projectRemoved(evt); - } - } //}}} - - //{{{ +_removeProjectViewerListeners(PluginJAR)_ : void - /** - * Removes the listeners loaded by the given plugin from the listener - * list. Meant to be called when said plugin is unloaded by jEdit. - */ - public static void removeProjectViewerListeners(PluginJAR jar) { - for (Iterator i = listeners.values().iterator(); i.hasNext();) { - PVActions.prune((Collection) i.next(), jar); - } - } //}}} - - //{{{ +_addProjectViewerListeners(PluginJAR, View)_ : void - /** - * Adds to the list of listeners for the given view the listeners that - * have been declared by the given plugin using properties. For global - * listeners, "view" should be null. - */ - public static void addProjectViewerListeners(PluginJAR jar, View view) { - if (jar.getPlugin() == null) return; - String list; - if (view == null) { - list = jEdit.getProperty("plugin.projectviewer." + - jar.getPlugin().getClassName() + ".global-pv-listeners"); - } else { - list = jEdit.getProperty("plugin.projectviewer." + - jar.getPlugin().getClassName() + ".pv-listeners"); - } - - Collection aList = PVActions.listToObjectCollection(list, jar, ProjectViewerListener.class); - if (aList != null && aList.size() > 0) { - ArrayList existing = (ArrayList) listeners.get(view); - if (existing == null) { - listeners.put(view, aList); - } else { - existing.addAll(aList); - } - } - } //}}} - - //{{{ +_fireNodeMovedEvent(VPTNode, VPTGroup)_ : void - public static void fireNodeMovedEvent(VPTNode moved, VPTGroup oldParent) { - Set notify = getAllListeners(null); - ProjectViewerEvent pve = new ProjectViewerEvent(moved, oldParent); - for (Iterator i = notify.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).nodeMoved(pve); - } - - } //}}} - - //{{{ +_fireGroupAddedEvent(VPTGroup)_ : void - public static void fireGroupAddedEvent(VPTGroup group) { - Set notify = getAllListeners(null); - ProjectViewerEvent pve = new ProjectViewerEvent(group); - for (Iterator i = notify.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).groupAdded(pve); - } - } //}}} - - //{{{ +_fireGroupRemovedEvent(VPTGroup)_ : void - public static void fireGroupRemovedEvent(VPTGroup group) { - Set notify = getAllListeners(null); - ProjectViewerEvent pve = new ProjectViewerEvent(group); - for (Iterator i = notify.iterator(); i.hasNext(); ) { - ((ProjectViewerListener)i.next()).groupRemoved(pve); - } - } //}}} - - //{{{ -_getAllListeners(View)_ : Set - /** - * Returns a set of all registered ProjectViewerListeners. If a view - * is provided, return only the listeners registered to that view, plus - * the listeners registered globaly. - */ - private static Set getAllListeners(View v) { - HashSet all = new HashSet(); - if (v == null) { - for (Iterator i = listeners.values().iterator(); i.hasNext(); ) { - all.addAll((ArrayList)i.next()); - } - } else { - Object o = listeners.get(v); - if (o != null) - all.addAll((ArrayList)o); - o = listeners.get(null); - if (o != null) - all.addAll((ArrayList)o); - } - return all; - } //}}} - - //}}} - //{{{ Tree Changes Broadcast Methods //{{{ +_nodeStructureChanged(VPTNode)_ : void @@ -530,8 +302,10 @@ /** * Notify all "flat trees" in any project viewer instances of a change in * a node's structure. Then, rebuild the project combo boxes. + * + * @since PV 3.0.0 */ - public static void projectRemoved(Object src, VPTProject p) { + public static void projectRemoved(VPTProject p) { VPTNode parent = (VPTNode) p.getParent(); int index = parent.getIndex(p); int[] idx = new int[] { index }; @@ -553,7 +327,6 @@ ve.dockable.getTreePanel().nodesWereRemoved(parent, idx, removed); } } - fireProjectRemoved(src, p); } //}}} //}}} @@ -589,20 +362,19 @@ } if (ve.dockable == null) { - // Fires events if the dockable is not available - // (setRootNode() fires events when the dockable is available) - if (n.isProject()) { - fireProjectLoaded(ProjectViewer.class, (VPTProject) n, aView); - } else { - fireGroupActivated((VPTGroup)n, aView); - } - // Loads projects if not yet loaded if (n.isProject() && !ProjectManager.getInstance().isLoaded(n.getName())) { ProjectManager.getInstance().getProject(n.getName()); } - } else { + + // Fires events if the dockable is not available + // (setRootNode() fires events when the dockable is available) + ViewerUpdate upd = new ViewerUpdate(aView, + n, + ViewerUpdate.Type.PROJECT_LOADED); + EditBus.send(upd); + } else if (!ve.dockable.isLoadingProject) { ve.dockable.setRootNode(n); } @@ -737,13 +509,6 @@ ccl = new ConfigChangeListener(); config.addPropertyChangeListener(ccl); - // Loads the listeners from plugins that register listeners using global - // properties instead of calling the addProjectViewerListener() method. - EditPlugin[] plugins = jEdit.getPlugins(); - for (int i = 0; i < plugins.length; i++) { - addProjectViewerListeners(plugins[i].getPluginJAR(), view); - } - // Register the dockable window in the viewer list ViewerEntry ve = (ViewerEntry) viewers.get(aView); if (ve == null) { @@ -1106,12 +871,12 @@ } openProject(p); if (ve.node != p) { - fireProjectLoaded(this, p, view); + sendUpdate(p, ViewerUpdate.Type.PROJECT_LOADED); ve.node = p; } } else if (n.isGroup()){ if (ve.node != n) { - fireGroupActivated((VPTGroup)n, view); + sendUpdate(n, ViewerUpdate.Type.GROUP_ACTIVATED); ve.node = n; } } @@ -1176,6 +941,17 @@ return treePanel; } + /** + * Sends a project viewer update message with the given data. + * + * @since PV 3.0.0 + */ + public void sendUpdate(VPTNode n, ViewerUpdate.Type type) + { + ViewerUpdate update = new ViewerUpdate(this, n, type); + EditBus.send(update); + } + //}}} //{{{ Message handling Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditGroupAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditGroupAction.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditGroupAction.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -33,6 +33,7 @@ import projectviewer.ProjectViewer; import projectviewer.ProjectManager; +import projectviewer.event.StructureUpdate; import projectviewer.vpt.VPTGroup; import projectviewer.vpt.VPTNode; //}}} @@ -55,7 +56,7 @@ //{{{ +EditGroupAction(boolean) : <init> public EditGroupAction(boolean add) { this(add, null, null); - } //}}} + } //}}} //{{{ +EditGroupAction(boolean, VPTGroup) : <init> public EditGroupAction(boolean add, VPTGroup parent, Component gui) { @@ -101,8 +102,7 @@ JTree tree = viewer.getCurrentTree(); TreePath path = new TreePath(((DefaultTreeModel)tree.getModel()).getPathToRoot(newGroup)); tree.expandPath(path); - - ProjectViewer.fireGroupAddedEvent(newGroup); + StructureUpdate.send(newGroup, StructureUpdate.Type.GROUP_ADDED); } } else { String name = getGroupName(grp.getName()); Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -31,6 +31,8 @@ import projectviewer.ProjectViewer; import projectviewer.ProjectManager; +import projectviewer.event.StructureUpdate; + import projectviewer.vpt.VPTGroup; import projectviewer.vpt.VPTNode; import projectviewer.vpt.VPTProject; @@ -185,7 +187,7 @@ ProjectViewer.removeNodeFromParent(proj); ProjectViewer.insertNodeInto(proj, parent); ProjectManager.getInstance().saveProjectList(); - ProjectViewer.fireNodeMovedEvent(proj, oldParent); + StructureUpdate.send(proj, oldParent); } else if (notify) { ProjectViewer.nodeChanged(proj); } Modified: plugins/ProjectViewer/trunk/projectviewer/action/MoveNodeAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/MoveNodeAction.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/action/MoveNodeAction.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -32,6 +32,7 @@ import projectviewer.ProjectManager; import projectviewer.ProjectViewer; +import projectviewer.event.StructureUpdate; import projectviewer.gui.GroupMenu; import projectviewer.vpt.VPTGroup; @@ -84,8 +85,7 @@ TreePath path = new TreePath(((DefaultTreeModel)tree.getModel()).getPathToRoot(toMove)); tree.expandPath(path); - // fire event - ProjectViewer.fireNodeMovedEvent(toMove, oldParent); + StructureUpdate.send(toMove, oldParent); } //}}} //{{{ prepareForNode(VPTNode) method Modified: plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -19,11 +19,13 @@ package projectviewer.action; //{{{ Imports +import java.util.ArrayList; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.ArrayList; -import java.util.Enumeration; +import java.util.List; +import java.util.Map; import java.awt.event.ActionEvent; @@ -38,6 +40,8 @@ import projectviewer.ProjectViewer; import projectviewer.ProjectManager; +import projectviewer.event.StructureUpdate; + import projectviewer.vpt.VPTDirectory; import projectviewer.vpt.VPTFile; import projectviewer.vpt.VPTGroup; @@ -73,7 +77,7 @@ } //}}} //{{{ Instance variables - private HashMap removedFiles; + private Map<VPTProject, List<VPTFile>> removedFiles; private HashSet changed; private boolean delete; //}}} @@ -128,14 +132,9 @@ } if (removedFiles != null) - for (Iterator i = removedFiles.keySet().iterator(); i.hasNext(); ) { - VPTProject p = (VPTProject) i.next(); - ArrayList lst = (ArrayList) removedFiles.get(p); - if (lst.size() == 1) { - p.fireFileRemoved((VPTFile)lst.get(0)); - } else { - p.fireFilesChanged(null, lst); - } + for (VPTProject p : removedFiles.keySet()) { + List<VPTFile> lst = (List<VPTFile>) removedFiles.get(p); + p.fireFilesChanged(null, lst); } // cleanup @@ -318,7 +317,7 @@ ); } else { ProjectViewer.removeNodeFromParent(o); - ProjectViewer.fireGroupRemovedEvent((VPTGroup)o); + StructureUpdate.send(o, StructureUpdate.Type.GROUP_REMOVED); } } else { VPTProject project = VPTNode.findProjectFor(o); @@ -369,15 +368,15 @@ //{{{ -addRemovedFile(VPTFile) : void private void addRemovedFile(VPTFile f) { VPTProject p = VPTProject.findProjectFor(f); - if (p.hasListeners()) { - if (removedFiles == null) removedFiles = new HashMap(); - ArrayList lst = (ArrayList) removedFiles.get(p); - if (lst == null) { - lst = new ArrayList(); - removedFiles.put(p, lst); - } - lst.add(f); + if (removedFiles == null) { + removedFiles = new HashMap<VPTProject, List<VPTFile>>(); } + List<VPTFile> lst = removedFiles.get(p); + if (lst == null) { + lst = new ArrayList<VPTFile>(); + removedFiles.put(p, lst); + } + lst.add(f); } //}}} } Deleted: plugins/ProjectViewer/trunk/projectviewer/event/ProjectAdapter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectAdapter.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectAdapter.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,71 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.event; - -/** - * Default implementation of the listener interface that does nothing when - * the methods are called. - * - * @author Marcelo Vanzin - * @version $Id$ - */ -public class ProjectAdapter implements ProjectListener { - - /** - * Method called when a single file has been added to a project. The event - * object will contain a reference to the file, returned by the - * {@link ProjectEvent#getAddedFile() getFile()} method. - * - * @param pe The project event. - */ - public void fileAdded(ProjectEvent pe) { } - - /** - * Method called when several files have been added to a project. The event - * object will contain the list of files, returned by the - * {@link ProjectEvent#getAddedFiles() getFiles()} method. - * - * @param pe The project event. - */ - public void filesAdded(ProjectEvent pe) { } - - /** - * Method called when a single file has been removed from a project. - * - * @param pe The project event. - */ - public void fileRemoved(ProjectEvent pe) { } - - /** - * Method called when more than one file have been removed from a project. - * - * @param pe The project event. - */ - public void filesRemoved(ProjectEvent pe) { } - - /** - * Method called when project properties (such as name and root) have - * changed. - * - * @param pe The project event. - */ - public void propertiesChanged(ProjectEvent pe) { } - -} - Deleted: plugins/ProjectViewer/trunk/projectviewer/event/ProjectEvent.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectEvent.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectEvent.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,99 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.event; - -//{{{ Imports - -import java.util.ArrayList; -import java.util.EventObject; -import projectviewer.vpt.VPTFile; -import projectviewer.vpt.VPTProject; -//}}} - -/** - * A project event. - * - * @author Marcelo Vanzin - * @version $Id$ - */ -public final class ProjectEvent extends EventObject { - - //{{{ Private Members - private VPTProject src; - private ArrayList addedFiles; - private ArrayList removedFiles; - private VPTFile file; - private boolean added; - //}}} - - //{{{ Constructor - - public ProjectEvent(VPTProject p, ArrayList added, ArrayList removed) { - super(p); - this.src = p; - this.addedFiles = added; - this.removedFiles = removed; - } - - public ProjectEvent(VPTProject p, VPTFile file, boolean added) { - super(p); - this.src = p; - this.file = file; - this.added = added; - } - - public ProjectEvent(VPTProject p) { - super(p); - this.src = p; - } - - //}}} - - //{{{ getProject() method - /** Returns the project. */ - public VPTProject getProject() { - return src; - } //}}} - - //{{{ getAddedFiles() method - /** Returns the list of files added (null if single file or no file(s) added). */ - public ArrayList getAddedFiles() { - return addedFiles; - } //}}} - - //{{{ getAddedFile() method - /** Returns the added file (null if multiple files or no file(s) added). */ - public VPTFile getAddedFile() { - return (added) ? file : null; - } //}}} - - //{{{ getRemovedFiles() - /** Returns the list of removed files (null if no file(s) were removed). */ - public ArrayList getRemovedFiles() { - return removedFiles; - } //}}} - - //{{{ getRemovedFile() - /** Returns the removed file (null if multiple files, or no file(s) were removed). */ - public VPTFile getRemovedFile() { - return (added) ? null : file; - } //}}} - -} - Deleted: plugins/ProjectViewer/trunk/projectviewer/event/ProjectListener.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectListener.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectListener.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,74 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.event; - -import java.util.EventListener; - -/** - * A project listener. - * - * @author Marcelo Vanzin - * @version $Id$ - */ -public interface ProjectListener extends EventListener { - - /** - * Method called when a single file has been added to a project. The event - * object will contain a reference to the file, returned by the - * {@link ProjectEvent#getAddedFile() getAddedFile()} method. - * - * @param pe The project event. - */ - public void fileAdded(ProjectEvent pe); - - /** - * Method called when several files have been added to a project. The event - * object will contain the list of files, returned by the - * {@link ProjectEvent#getAddedFiles() getAddedFiles()} method. - * - * @param pe The project event. - */ - public void filesAdded(ProjectEvent pe); - - /** - * Method called when a single file has been removed from a project. - * - * @param pe The project event. - */ - public void fileRemoved(ProjectEvent pe); - - /** - * Method called when more than one file have been removed from a project. - * - * @param pe The project event. - */ - public void filesRemoved(ProjectEvent pe); - - /** - * Method called when project properties (such as name and root) have - * changed. Properties may actually not have changed at all - this event - * will be fired whenever the user opens the "Project Options" dialog and - * clicks "OK". - * - * @param pe The project event. - */ - public void propertiesChanged(ProjectEvent pe); - -} - Added: plugins/ProjectViewer/trunk/projectviewer/event/ProjectUpdate.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectUpdate.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectUpdate.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -0,0 +1,93 @@ +/* + * :tabSize=4:indentSize=4:noTabs=true: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.event; + +import java.util.List; +import org.gjt.sp.jedit.EBMessage; +import projectviewer.vpt.VPTFile; +import projectviewer.vpt.VPTProject; + +/** + * A project update message sent on the Edit Bus. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public final class ProjectUpdate extends EBMessage +{ + + public static enum Type + { + /** Update for when files have been added to a project. */ + FILES_CHANGED, + + /** Update for when the project's properties have changed. */ + PROPERTIES_CHANGED; + } + + private final Type type; + private final List<VPTFile> added; + private final List<VPTFile> removed; + + /** Construct a new message with type FILES_CHANGED. */ + public ProjectUpdate(VPTProject p, + List<VPTFile> added, + List<VPTFile> removed) + { + super(p); + this.added = added; + this.removed = removed; + this.type = Type.FILES_CHANGED; + } + + /** Construct a new message with type PROPERTIES_CHANGED. */ + public ProjectUpdate(VPTProject p) { + super(p); + this.type = Type.PROPERTIES_CHANGED; + this.added = null; + this.removed = null; + } + + /** @return The affected project. */ + public VPTProject getProject() + { + return (VPTProject) getSource(); + } + + /** @return The event type of this message. */ + public Type getType() + { + return type; + } + + /** @return The list of added files (may be null). */ + public List<VPTFile> getAddedFiles() + { + return added; + } + + /** @return The list of removed files (may be null). */ + public List<VPTFile> getRemovedFiles() + { + return removed; + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/event/ProjectUpdate.java ___________________________________________________________________ Name: svn:keywords + Id Deleted: plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerAdapter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerAdapter.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerAdapter.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,79 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.event; - -/** - * Default implementation of the ProjectViewerListener. The methods do nothing - * when invoked. - * - * @author Marcelo Vanzin - * @version $Id$ - */ -public class ProjectViewerAdapter implements ProjectViewerListener { - - /** Notifies the changing of the active project. */ - public void projectLoaded(ProjectViewerEvent evt) { } - - /** Notifies the creation of a project. */ - public void projectAdded(ProjectViewerEvent evt) { } - - /** Notifies the removal of a project. */ - public void projectRemoved(ProjectViewerEvent evt) { } - - /** - * Notifies the addition of a group. - * - * @since PV 2.1.0 - */ - public void groupAdded(ProjectViewerEvent evt) { } - - /** - * Notifies the removal of a group. - * - * @since PV 2.1.0 - */ - public void groupRemoved(ProjectViewerEvent evt) { } - - /** - * Notifies that a group has been activated. - * - * @since PV 2.1.0 - */ - public void groupActivated(ProjectViewerEvent evt) { } - - /** - * Notifies that a project or group has been moved to another group. - * - * @since PV 2.1.0 - */ - public void nodeMoved(ProjectViewerEvent evt) { } - - /** - * Notifies that a node has been selected (clicked on) in the ProjectViewer tree - * - * @since PV 2.1.0.92 - */ - public void nodeSelected(ProjectViewerEvent evt) - { - // TODO Auto-generated method stub - - } - -} - Deleted: plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerEvent.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerEvent.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerEvent.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,153 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.event; - -import java.util.EventObject; - -import projectviewer.ProjectViewer; -import projectviewer.vpt.VPTGroup; -import projectviewer.vpt.VPTNode; -import projectviewer.vpt.VPTProject; - -/** - * A project viewer event. - * - * @author Dale Anson, Marcelo Vanzin - * @version $Id$ - */ -public final class ProjectViewerEvent extends EventObject { - - //{{{ Private Members - private VPTGroup oldParent; - private VPTProject project; - - private ProjectViewer viewer; - //}}} - - - /** @return the node selected when this event was fired. */ - public VPTNode getNode() { - try { - return (VPTNode) getSource(); - } - catch (Exception e) {return null; } - } - - public ProjectViewerEvent(VPTNode n, ProjectViewer v) { - super(n); - viewer = v; - } - - - /** - * Create a new <code>ProjectViewerEvent</code>. - * - * @param src the project viewer instance that fired the event. - * @param prj the project loaded (null if "All Projects"). - */ - public ProjectViewerEvent(ProjectViewer src, VPTProject prj) { - this(src, src, prj); - } - - /** - * Create a new <code>ProjectViewerEvent</code>. - * - * @param src the project viewer instance that fired the event. - * @param prj the project loaded (null if "All Projects"). - */ - public ProjectViewerEvent(Object src, VPTProject prj) { - this(src, (src instanceof ProjectViewer) ? (ProjectViewer) src : null, prj); - } - - /** - * Create a new <code>ProjectViewerEvent</code>. - * - * @param src the project viewer instance that fired the event. - * @param prj the project loaded (null if "All Projects"). - */ - public ProjectViewerEvent(Object src, ProjectViewer viewer, VPTProject prj) { - super(src); - this.viewer = viewer; - project = prj; - } - - /** - * Constructs an event to notify listeners that a node was moved to - * another group. - * - * @since PV 2.1.0 - */ - public ProjectViewerEvent(VPTNode src, VPTGroup oldParent) { - super(src); - this.oldParent = oldParent; - } - - /** - * Constructs and event to notify the listeners of the addition or - * removal of a group. - * - * @since PV 2.1.0 - */ - public ProjectViewerEvent(VPTGroup group) { - super(group); - } - - /** - * Constructs and event to notify the listeners of the activation of - * a group in the given view. - * - * @since PV 2.1.0 - */ - public ProjectViewerEvent(VPTGroup group, ProjectViewer viewer) { - super(group); - this.viewer = viewer; - } - - /** - * Returns the {@link ProjectViewer}. - * - * @return The viewer where the event occurred. - */ - public ProjectViewer getProjectViewer() { - return viewer; - } - - /** - * Returns the {@link VPTProject Project}. It is important to noticed that - * this value can be <code>null</code>, which means that the "All Projects" - * mode has been activated. - * - * @return The activated project, or null if "All Projects" was chosen. - */ - public VPTProject getProject() { - return project; - } - - /** - * When firing a noveMoved() event, returns the old parent of the - * affected node (which can be retrieved by getSource()). - * - * @since PV 2.1.0 - */ - public VPTGroup getOldParent() { - return oldParent; - } - -} - Deleted: plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerListener.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerListener.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/ProjectViewerListener.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,80 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.event; - -import java.util.EventListener; - -/** - * A listener for {@link ProjectViewerEvent}s. - * - * - * - * @author Dale Anson, Marcelo Vanzin - * @version $Id$ - * - * - */ -public interface ProjectViewerListener extends EventListener { - - /** - * Notifies that a node has been selected (clicked on) in the ProjectViewer tree - * - * @since PV 2.1.0.92 - */ - public void nodeSelected(ProjectViewerEvent evt); - - /** Notifies the changing of the active project. */ - public void projectLoaded(ProjectViewerEvent evt); - - /** Notifies the creation of a project. */ - public void projectAdded(ProjectViewerEvent evt); - - /** Notifies the removal of a project. */ - public void projectRemoved(ProjectViewerEvent evt); - - /** - * Notifies the addition of a group. - * - * @since PV 2.1.0 - */ - public void groupAdded(ProjectViewerEvent evt); - - /** - * Notifies the removal of a group. - * - * @since PV 2.1.0 - */ - public void groupRemoved(ProjectViewerEvent evt); - - /** - * Notifies that a group has been activated, or selected. - * - * @since PV 2.1.0 - */ - public void groupActivated(ProjectViewerEvent evt); - - /** - * Notifies that a project or group has been moved to another group. - * - * @since PV 2.1.0 - */ - public void nodeMoved(ProjectViewerEvent evt); - -} - Added: plugins/ProjectViewer/trunk/projectviewer/event/StructureUpdate.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/StructureUpdate.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/event/StructureUpdate.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -0,0 +1,105 @@ +/* + * :tabSize=4:indentSize=4:noTabs=true: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.event; + +import org.gjt.sp.jedit.EBMessage; +import org.gjt.sp.jedit.EditBus; + +import projectviewer.vpt.VPTGroup; +import projectviewer.vpt.VPTNode; + +/** + * An update message describing some change in the data kept by + * the plugin. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public final class StructureUpdate extends EBMessage +{ + + public static enum Type + { + /** Notifies the creation of a project. */ + PROJECT_ADDED, + + /** Notifies the removal of a project. */ + PROJECT_REMOVED, + + /** Notifies the addition of a group. */ + GROUP_ADDED, + + /** Notifies the removal of a group. */ + GROUP_REMOVED, + + /** Notifies that a project or group has been moved to another group. */ + NODE_MOVED; + } + + public static void send(VPTNode node, Type type) + { + EditBus.send(new StructureUpdate(node, type)); + } + + public static void send(VPTNode node, VPTGroup parent) + { + EditBus.send(new StructureUpdate(node, parent)); + } + + private final Type type; + private final VPTGroup parent; + + /** Constructs a new update with the given type. */ + private StructureUpdate(VPTNode node, Type type) + { + super(node); + assert (type != Type.NODE_MOVED) : "Use the other constructor."; + this.type = type; + this.parent = null; + } + + /** Constructs a new NODE_MOVED update message. */ + private StructureUpdate(VPTNode node, VPTGroup parent) + { + super(node); + this.type = Type.NODE_MOVED; + this.parent = parent; + } + + /** @return The event type of this message. */ + public Type getType() + { + return type; + } + + /** @return The affected node. */ + public VPTNode getNode() + { + return (VPTNode) getSource(); + } + + /** @return The old parent, if type is NODE_MOVED. */ + public VPTGroup getOldParent() + { + return parent; + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/event/StructureUpdate.java ___________________________________________________________________ Name: svn:keywords + Id Added: plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -0,0 +1,136 @@ +/* + * :tabSize=4:indentSize=4:noTabs=true: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.event; + +import org.gjt.sp.jedit.EBMessage; +import org.gjt.sp.jedit.View; + +import projectviewer.ProjectViewer; +import projectviewer.vpt.VPTGroup; +import projectviewer.vpt.VPTNode; + +/** + * A project viewer update message sent on the Edit Bus. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public final class ViewerUpdate extends EBMessage +{ + + public static enum Type + { + /** Notifies that a node has been selected. */ + NODE_SELECTED, + + /** Notifies the changing of the active project. */ + PROJECT_LOADED, + + /** Notifies that a group has been activated, or selected. */ + GROUP_ACTIVATED, + } + + private final boolean isViewer; + private final VPTNode node; + private final VPTGroup oldParent; + private final Type type; + + /** + * Construct a new message with the given type and no associated + * viewer. {@link #getViewer()} might still return a viewer, if + * the dockable for the view is activated. + */ + public ViewerUpdate(View v, + VPTNode n, + Type type) + { + super(v); + this.node = n; + this.type = type; + this.oldParent = null; + this.isViewer = false; + } + + /** + * Construct a new message with the given type and an associated + * viewer. + */ + public ViewerUpdate(ProjectViewer v, + VPTNode n, + Type type) + { + super(v); + this.node = n; + this.type = type; + this.oldParent = null; + this.isViewer = true; + } + + /** @return The event type of this message. */ + public Type getType() + { + return type; + } + + /** + * Returns the {@link ProjectViewer}. This may be null if the + * dockable hasn't been activated yet. + */ + public ProjectViewer getViewer() + { + if (isViewer) { + return (ProjectViewer) getSource(); + } else { + return ProjectViewer.getViewer((View)getSource()); + } + } + + /** + * Returns the view where the event occurred. + */ + public View getView() + { + if (isViewer) { + return ((ProjectViewer)getSource()).getView(); + } else { + return (View) getSource(); + } + } + + /** + * Returns the node affected by the event being notified. The + * node can be null, a project or a group. + */ + public VPTNode getNode() + { + return node; + } + + /** + * When firing a NODE_MOVED message, returns the old parent of the + * affected node (which can be retrieved by getSource()). + */ + public VPTGroup getOldParent() + { + return oldParent; + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java ___________________________________________________________________ Name: svn:keywords + Id Modified: plugins/ProjectViewer/trunk/projectviewer/event/package.html =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/package.html 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/event/package.html 2007-07-03 06:53:59 UTC (rev 9910) @@ -1,76 +1,20 @@ <body><h3>Event Handling.</h3> -<p>The Project Viewer plugin provides a different interface for each open jEdit -view, so the user can work with different projects in different views. This is -useful for PV's purposes, but some plugins may not benefit from such a dependence.</p> +<p>As of ProjectViewer 3.0, events are sent using jEdit's EditBus. There +are three kinds of event:</p> -<p>For this reason, the event notification provided by PV can be used by either -kind of plugins. The -{@link projectviewer.ProjectViewer#addProjectViewerListener(ProjectViewerListener,View) - addProjectViewerListener()} in class -{@link projectviewer.ProjectViewer ProjectViewer} provides a way for both types of -plugin to register for PV events.</p> - -<p>To register listeners for an EditPlugin-derived class called <i>className</i> using the new API, create the following properties:</p> - <ul> - <li>plugin.projectviewer.<i>className</i>.global-pv-listeners:<br> - the list of classes that provide {@link projectviewer.event.ProjectViewerListener - ProjectViewerListener}s for ProjectViewer that will listen to all PV-related events, regardless of the view where they happen.</li> - <li>plugin.projectviewer.<i>className</i>.pv-listeners:<br> - list of classes that provide {@link projectviewer.event.ProjectViewerListener - ProjectViewerListener}s for specific views where ProjectViewer is being - used. One object of each class will be instantiated for each view.</li> -</ul> +<li>{@link projectviewer.event.ProjectUpdate}: project-specific events, +which deal with changes in the project's internal data</li> +<li>{@link projectviewer.event.ViewerUpdate}: GUI updates, which deal +with changes in the plugin's user interface.</li> -<p>Event notification works differently for plugins that rely on jEdit's views -and for those that do not. For plugins that are view-dependent (which means, -generally, that there is an instance of some class for each open jEdit view, -just like the ProjectViewer class), these events are only fired when a project -is loaded into that particular instance of PV in that view. Changes in other -views will not fire any events for that listener.</p> +<li>{@link projectviewer.event.StructureUpdate}: changes in the +organization of projects and groups managed by the plugin.</li> -<p>For plugins that do not take into account the current active view, events are -fired more oftenly. Any event being fired in any view will be sent to these -listeners. Also, when the current view is changed (i.e., the user starts working -on another view), an event is fired saying that the project currently active in -that view has been activated.</p> - -<p>These events can be very useful for plugins that want integration with some -aspect of a project. For example, a plugin may want to display information about -some build file for the project, so each time a project is changed the information -displayed changes. Or maybe the plugin can use different properties for different -projects. For more complex interaction with the ProjectViewer plugin, please -read the other documentation linked at the beginning of this document.</p> - -<h3>Project Events</h3> - -<p>Plugins may register themselves to receive notification about changes to a project -instead of changes in the state of the ProjectViewer. To accomplish this, -the plugin class itself should implement the {@link projectviewer.event.ProjectListener -ProjectListener} interface, and register the listener in the project class. -</p> - -<p> -The pre-4.2 way of doing this was by calling the {@link projectviewer.vpt.VPTProject#addProjectListener(ProjectListener) -addProjectListener()} method. Then, it was up to the plugin to detect project changes -and add/remove the listeners.</p> - -<p>To register project listeners using the new API, create the following -property:</p> - -<ul> - <li>plugin.projectviewer.<i>className</i>.prj-listeners:<br> - list of classes that provide {@link projectviewer.event.ProjectListener - ProjectListener}s to add to active projects. Only one instance of each - class will be created, and this instance may be added to many projects at - the same time (in multiple views, for instance). ProjectViewer will take - care of adding the listener to newly loaded projects and remove them from - projects being deactivated.</li> </ul> </body> - Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-07-03 06:08:23 UTC (rev 9909) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-07-03 06:53:59 UTC (rev 9910) @@ -318,9 +318,7 @@ importNode(n); } ProjectViewer.nodeStructureChangedFlat(project); - if (fireEvent && project.hasListeners()) { - fireProjectEvent(); - } + fireProjectEvent(); } }); } else if (fireEvent) { @@ -353,15 +351,15 @@... [truncated message content] |
From: <va...@us...> - 2007-07-08 00:59:26
|
Revision: 9946 http://svn.sourceforge.net/jedit/?rev=9946&view=rev Author: vanza Date: 2007-07-07 17:59:18 -0700 (Sat, 07 Jul 2007) Log Message: ----------- - remove the toolbar from the PV gui, and all code related to handling the toolbar. Modified Paths: -------------- plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/action/Action.java plugins/ProjectViewer/trunk/projectviewer/action/CollapseAllAction.java plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java plugins/ProjectViewer/trunk/projectviewer/action/ExpandAllAction.java plugins/ProjectViewer/trunk/projectviewer/action/OpenWithEncodingAction.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java Removed Paths: ------------- plugins/ProjectViewer/trunk/projectviewer/action/OldStyleAddFileAction.java Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-08 00:59:18 UTC (rev 9946) @@ -28,9 +28,9 @@ This will be used for all extensions except option panes, since those work differently inside jEdit and we'd like to reuse as much code from the core as possible. + - Remove the toolbar from the PV GUI. - ================================================================================ Version 2.1.3.7: Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -48,7 +48,6 @@ import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.JPanel; -import javax.swing.JToolBar; import javax.swing.JCheckBox; import javax.swing.JOptionPane; import javax.swing.JScrollPane; @@ -103,7 +102,6 @@ import projectviewer.action.FileImportAction; import projectviewer.action.NodeRemoverAction; import projectviewer.action.NodeRenamerAction; -import projectviewer.action.OldStyleAddFileAction; import projectviewer.config.ProjectViewerConfig; import projectviewer.importer.NewFileImporter; //}}} @@ -120,23 +118,11 @@ //{{{ Static members private static final ProjectViewerConfig config; private static final Map<View,ViewerEntry> viewers; - private static final List<Action> actions; - //{{{ Static Initialization - /** - * Initializes the default actions, and gets the PV plugins from the list - * of active jEdit plugins. - */ static { - // Default toolbar actions config = ProjectViewerConfig.getInstance(); - viewers = new WeakHashMap<View,ViewerEntry>(); - actions = new ArrayList<Action>(); - actions.add(new EditProjectAction()); - actions.add(new ExpandAllAction()); - actions.add(new CollapseAllAction()); - actions.add(new OldStyleAddFileAction()); - } //}}} + viewers = new HashMap<View,ViewerEntry>(); + } //{{{ +_getViewer(View)_ : ProjectViewer /** @@ -408,8 +394,6 @@ private View view; private HashSet dontAsk; - private JToolBar toolBar; - private JPanel topPane; private ProjectTreePanel treePanel; private ProjectComboBox pList; @@ -468,40 +452,14 @@ //{{{ Private methods - //{{{ -populateToolBar() : void - /** Loads the toolbar. */ - private void populateToolBar() { - toolBar.removeAll(); - for (Iterator i = actions.iterator(); i.hasNext(); ) { - Action a = (Action) i.next(); - a = (Action) a.clone(); - a.setViewer(this); - toolBar.add(a.getButton()); - } - toolBar.repaint(); - } //}}} - //{{{ -buildGUI() : void /** Builds the viewer GUI. */ private void buildGUI() { - treePanel = new ProjectTreePanel(this); - - topPane = new JPanel(new BorderLayout()); - pList = new ProjectComboBox(view); - - Box box = new Box(BoxLayout.Y_AXIS); - box.add(Box.createGlue()); - box.add(pList); - box.add(Box.createGlue()); - - topPane.add(BorderLayout.CENTER, box); - + treePanel = new ProjectTreePanel(this); treePanel.loadGUI(); - showToolBar(config.getShowToolBar()); add(BorderLayout.CENTER, treePanel); - add(BorderLayout.NORTH, topPane); - + add(BorderLayout.NORTH, pList); } //}}} //{{{ -closeGroup(VPTGroup, VPTNode, boolean) : void @@ -609,23 +567,6 @@ setChangingBuffers(false); } //}}} - //{{{ -showToolBar(boolean) : void - /** Shows/Hides the toolbar. */ - private void showToolBar(boolean flag) { - if (toolBar != null) { - topPane.remove(toolBar); - toolBar.removeAll(); - toolBar = null; - } - - if (flag) { - toolBar = new JToolBar(); - toolBar.setFloatable(false); - populateToolBar(); - topPane.add(BorderLayout.EAST, toolBar); - } - } //}}} - //{{{ -unloadInactiveProjects(VPTNode) : void /** Checks if some of the projects that are loaded can be unloaded. */ private void unloadInactiveProjects(VPTNode newRoot) { @@ -856,11 +797,6 @@ public void setEnabled(boolean flag) { treePanel.setEnabled(flag); pList.setEnabled(flag); - if (toolBar != null) { - Component[] buttons = toolBar.getComponents(); - for (int i = 0; i < buttons.length; i++) - buttons[i].setEnabled(flag); - } super.setEnabled(flag); } //}}} @@ -1095,18 +1031,11 @@ //{{{ +propertyChange(PropertyChangeEvent) : void /** Listens for property change events in the plugin's configuration. - * Shows/Hides the toolbar and the trees, according to the user's wish. + * Shows/Hides the trees, according to the user's wish. * * @param evt Description of Parameter */ public void propertyChange(PropertyChangeEvent evt) { - // Toolbar show/hide. - if (evt.getPropertyName().equals(ProjectViewerConfig.SHOW_TOOLBAR_OPT)) { - showToolBar(((Boolean)evt.getNewValue()).booleanValue() - && treePanel.getTreeCount() > 0); - return; - } - if (evt.getPropertyName().equals(ProjectViewerConfig.ASK_IMPORT_OPT)) { int opt = ((Integer)evt.getNewValue()).intValue(); if (opt == ProjectViewerConfig.ASK_NEVER || @@ -1154,7 +1083,6 @@ */ public void run() { treePanel.loadGUI(); - showToolBar(config.getShowToolBar()); willRun = false; }//}}} Modified: plugins/ProjectViewer/trunk/projectviewer/action/Action.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/Action.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/action/Action.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -28,7 +28,6 @@ import org.gjt.sp.util.Log; import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.gui.RolloverButton; import projectviewer.ProjectViewer; import projectviewer.vpt.VPTNode; @@ -36,7 +35,7 @@ /** * An action defines an action to be taken when the user presses some menu - * item in the tree's context menu or a button on the toolbar. + * item in the tree's context menu. * * @author Marcelo Vanzin * @version $Id$ @@ -46,7 +45,6 @@ //{{{ Instance variables protected ProjectViewer viewer; - protected RolloverButton tbButton; protected JComponent cmItem; protected String action; @@ -96,16 +94,6 @@ }//}}} - //{{{ +getIcon() : Icon - /** - * Returns the icon to be shown on the toolbar button. The default - * implementation returns "null" so that actions that will only be - * used in the context menu don't need to implement this. - */ - public Icon getIcon() { - return null; - } //}}} - //{{{ +getMenuItem() : JComponent /** * Returns the menu item that triggers this action. This returns a @@ -131,23 +119,6 @@ return cmItem; } //}}} - //{{{ +getButton() : RolloverButton - /** Returns the toolbar button that triggers this action. */ - public RolloverButton getButton() { - if (tbButton == null) { - Icon i = getIcon(); - if (i != null) { - tbButton = new RolloverButton(getIcon()); - } else { - tbButton = new RolloverButton(); - tbButton.setText(getText()); - } - tbButton.setToolTipText(getText()); - tbButton.addActionListener(this); - } - return tbButton; - } //}}} - //{{{ +clone() : Object /** Clones the current action, returning a copy of it. */ public Object clone() { Modified: plugins/ProjectViewer/trunk/projectviewer/action/CollapseAllAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/CollapseAllAction.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/action/CollapseAllAction.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -50,12 +50,6 @@ return jEdit.getProperty("projectviewer.action.collapse_all"); } //}}} - //{{{ +getIcon() : Icon - /** Returns the icon for the action. */ - public Icon getIcon() { - return GUIUtilities.loadIcon("ZoomOut.png"); - } //}}} - //{{{ +actionPerformed(ActionEvent) : void /** Creates a new project. */ public void actionPerformed(ActionEvent e) { Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -82,16 +82,6 @@ return jEdit.getProperty("projectviewer.action.a_e_project"); } //}}} - //{{{ getIcon() method - /** - * Returns the icon to be shown on the toolbar button. The default - * implementation returns "null" so that actions that will only be - * used in the context menu don't need to implement this. - */ - public Icon getIcon() { - return GUIUtilities.loadIcon("Drive.png"); - } //}}} - //{{{ actionPerformed(ActionEvent) method /** Creates a new project. */ public void actionPerformed(ActionEvent e) { Modified: plugins/ProjectViewer/trunk/projectviewer/action/ExpandAllAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/ExpandAllAction.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/action/ExpandAllAction.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -50,12 +50,6 @@ return jEdit.getProperty("projectviewer.action.expand_all"); } //}}} - //{{{ +getIcon() : Icon - /** Returns the icon for the action. */ - public Icon getIcon() { - return GUIUtilities.loadIcon("ZoomIn.png"); - } //}}} - //{{{ +actionPerformed(ActionEvent) : void /** Creates a new project. */ public void actionPerformed(ActionEvent e) { Deleted: plugins/ProjectViewer/trunk/projectviewer/action/OldStyleAddFileAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/OldStyleAddFileAction.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/action/OldStyleAddFileAction.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -1,70 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.action; - -//{{{ Imports -import java.awt.event.ActionEvent; - -import javax.swing.Icon; - -import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.GUIUtilities; - -import projectviewer.vpt.VPTNode; -import projectviewer.importer.OldStyleFileImporter; -//}}} - -/** - * Imports files in the style of the old version of the plugin. For more - * details, see the importer class. This is a toolbar action, so prepareNode() - * is not overridden. - * - * @author Marcelo Vanzin - * @version $Id$ - * @see projectviewer.importer.OldStyleFileImporter - */ -public class OldStyleAddFileAction extends Action { - - //{{{ getText() method - /** Returns the text to be shown on the button and/or menu item. */ - public String getText() { - return jEdit.getProperty("projectviewer.action.old_importer"); - } //}}} - - //{{{ getIcon() method - /** Returns the icon to be shown. */ - public Icon getIcon() { - return GUIUtilities.loadIcon("New.png"); - } //}}} - - //{{{ actionPerformed(ActionEvent) method - /** Creates a new project. */ - public void actionPerformed(ActionEvent e) { - VPTNode node = viewer.getSelectedNode(); - if (node == null) { - node = (VPTNode) viewer.getRoot(); - } - if (node.isRoot()) - return; - - new OldStyleFileImporter(node, viewer).doImport(); - } //}}} - -} - Modified: plugins/ProjectViewer/trunk/projectviewer/action/OpenWithEncodingAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/OpenWithEncodingAction.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/action/OpenWithEncodingAction.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -57,7 +57,7 @@ public JComponent getMenuItem() { if (cmItem == null) { JMenu item = new JMenu(getText()); - String[] encodings = MiscUtilities.getEncodings(); + String[] encodings = MiscUtilities.getEncodings(false); if (encodings != null) for (int i = 0; i < encodings.length; i++) { Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -50,11 +50,10 @@ * * <p>Note about property changing events: currently, these events are only * generated for the properties regarding the ProjectViewer GUI (that is, - * SHOW_TOOLBAR_OPT, SHOW_FOLDERS_OPT, SHOW_FILES_OPT, SHOW_WFILES_OPT, - * USER_CONTEXT_MENU and USER_MENU_FIRST).If the change of another - * property needs to be notified to someone, please include the call to - * the appropriate "firePropertyChanged" method is the setter methods - * of the property.</p> + * SHOW_FOLDERS_OPT, SHOW_FILES_OPT, SHOW_WFILES_OPT, USER_CONTEXT_MENU + * and USER_MENU_FIRST).If the change of another property needs to be + * notified to someone, please include the call to the appropriate + * "firePropertyChanged" method is the setter methods of the property.</p> * * <p>Also of note is that these events are for internal ProjectViewer use * and are not meant to be used by other plugins interfacing with PV.</p> @@ -92,7 +91,6 @@ public static final String SHOW_FILES_OPT = "projectviewer.show_files_tree"; public static final String SHOW_FILTERED_OPT = "projectviewer.show_filtered_tree"; public static final String SHOW_FOLDERS_OPT = "projectviewer.show_folder_tree"; - public static final String SHOW_TOOLBAR_OPT = "projectviewer.show_toolbar"; public static final String SHOW_WFILES_OPT = "projectviewer.show_working_files_tree"; public static final String USER_MENU_FIRST = "projectviewer.contextmenu.userfirst"; @@ -125,7 +123,6 @@ private boolean followCurrentBuffer = true; private int askImport = ASK_ONCE; - private boolean showToolBar = true; private boolean showFoldersTree = true; private boolean showFilesTree = true; private boolean showWorkingFilesTree = true; @@ -197,12 +194,6 @@ setDeleteNotFoundFiles("true".equalsIgnoreCase(tmp)); } - // show_toolbar - tmp = props.getProperty(SHOW_TOOLBAR_OPT); - if (tmp != null) { - setShowToolBar("true".equalsIgnoreCase(tmp)); - } - // show_folders_tree tmp = props.getProperty(SHOW_FOLDERS_OPT); if (tmp != null) { @@ -421,12 +412,6 @@ this.browserPath = newBrowserPath; } - public void setShowToolBar(boolean newShowToolBar) { - boolean old = this.showToolBar; - this.showToolBar = newShowToolBar; - firePropertyChanged(SHOW_TOOLBAR_OPT, old, newShowToolBar); - } - public void setShowFoldersTree(boolean newShowFoldersTree) { boolean old = this.showFoldersTree; this.showFoldersTree = newShowFoldersTree; @@ -489,11 +474,6 @@ return browserPath; } - - public boolean getShowToolBar() { - return showToolBar; - } - public boolean getShowFoldersTree() { return showFoldersTree; } @@ -691,7 +671,6 @@ props.setProperty(CASE_INSENSITIVE_SORT_OPT, String.valueOf(caseInsensitiveSort)); props.setProperty(FOLLOW_BUFFER_OPT, String.valueOf(followCurrentBuffer)); - props.setProperty(SHOW_TOOLBAR_OPT, String.valueOf(showToolBar)); props.setProperty(SHOW_FOLDERS_OPT, String.valueOf(showFoldersTree)); props.setProperty(SHOW_FILES_OPT, String.valueOf(showFilesTree)); props.setProperty(SHOW_WFILES_OPT, String.valueOf(showWorkingFilesTree)); Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java 2007-07-08 00:39:35 UTC (rev 9945) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerOptionsPane.java 2007-07-08 00:59:18 UTC (rev 9946) @@ -65,7 +65,6 @@ private JRadioButton askOnce; private JRadioButton askNever; - private JCheckBox showToolBar; private JCheckBox showFoldersTree; private JCheckBox showFilesTree; private JCheckBox showWorkingFilesTree; @@ -169,10 +168,6 @@ //{{{ gui options addSeparator("options.projectviewer.gui-opt.label"); - showToolBar = new JCheckBox(jEdit.getProperty("projectviewer.options.show_toolbar")); - showToolBar.setSelected(config.getShowToolBar()); - addComponent(showToolBar); - showFoldersTree = new JCheckBox(jEdit.getProperty("projectviewer.options.show_folders")); showFoldersTree.setSelected(config.getShowFoldersTree()); addComponent(showFoldersTree); @@ -261,7 +256,6 @@ config.setRememberOpen(rememberOpen.isSelected()); config.setDeleteNotFoundFiles(deleteNotFoundFiles.isSelected()); - config.setShowToolBar(showToolBar.isSelected()); config.setShowFoldersTree(showFoldersTree.isSelected()); config.setShowFilesTree(showFilesTree.isSelected()); config.setShowWorkingFilesTree(showWorkingFilesTree.isSelected()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2007-07-08 22:25:49
|
Revision: 9970 http://svn.sourceforge.net/jedit/?rev=9970&view=rev Author: vanza Date: 2007-07-08 15:25:47 -0700 (Sun, 08 Jul 2007) Log Message: ----------- - remove support for object properties in projects. Plugins can still store serialized data, but they have to handle it themselves, since having PV take care of that can cause ClassCastExceptions due to class loader confusion. Modified Paths: -------------- plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java plugins/ProjectViewer/trunk/projectviewer/config/package.html plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java plugins/ProjectViewer/trunk/projectviewer/persist/PropertyNodeHandler.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java Removed Paths: ------------- plugins/ProjectViewer/trunk/projectviewer/persist/DeferredProperty.java Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-08 22:25:47 UTC (rev 9970) @@ -29,6 +29,11 @@ since those work differently inside jEdit and we'd like to reuse as much code from the core as possible. - Remove the toolbar from the PV GUI. + - Object properties in projects are not supported anymore. The + original idea was to save work when serializing / deserializing + config data from other plugins, but having PV do that causes + PV to hold references to other plugins' classes, and that + can cause ClassCastExceptions if a plugin is reloaded. ================================================================================ Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -470,24 +470,6 @@ ProjectViewer.nodeStructureChanged(ProjectViewer.getActiveNode(jEdit.getActiveView())); } //}}} - //{{{ #unloadProjectProperties() : void - /** - * Called when a plugin is unloaded so that object properties are - * serialized, avoiding ClassCastExceptions later. - */ - protected void unloadProjectProperties() { - for (Iterator i = projects.values().iterator(); i.hasNext(); ) { - Entry e = (Entry) i.next(); - if (e.isLoaded) { - synchronized (e) { - if (e.isLoaded) { - e.project.unloadProperties(); - } - } - } - } - } //}}} - //{{{ +fireDynamicMenuChange() : void public void fireDynamicMenuChange() { DynamicMenuChanged msg = new DynamicMenuChanged("plugin.projectviewer.ProjectPlugin.menu"); Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -133,16 +133,11 @@ } boolean add = forceNew | (proj == null); + VPTGroup oldParent = (proj != null) ? ((VPTGroup) proj.getParent()) + : null; proj = ProjectOptions.run(proj, parent, lookupPath); if (proj != null) { - boolean newParent = false; - if (proj.getObjectProperty("projectviewer.new-parent") != null) { - parent = (VPTGroup) proj.getObjectProperty("projectviewer.new-parent"); - proj.removeProperty("projectviewer.new-parent"); - newParent = true; - } - if (add) { ProjectManager.getInstance().addProject(proj, parent); ProjectViewer.setActiveNode(jEdit.getActiveView(), proj); @@ -172,10 +167,11 @@ notify = viewer.getRoot().isNodeDescendant(proj); } - if (newParent) { - VPTGroup oldParent = (VPTGroup) proj.getParent(); + if (proj.getParent() != oldParent) { + VPTGroup newParent = (VPTGroup) proj.getParent(); + proj.setParent(oldParent); ProjectViewer.removeNodeFromParent(proj); - ProjectViewer.insertNodeInto(proj, parent); + ProjectViewer.insertNodeInto(proj, newParent); ProjectManager.getInstance().saveProjectList(); StructureUpdate.send(proj, oldParent); } else if (notify) { Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -146,8 +146,8 @@ Point p = chooseGroup.getLocation(); groupPopupMenu.show(this, (int) p.getX(), (int) p.getY() + chooseGroup.getHeight()); } else if (ae.getSource() instanceof VPTGroup) { - project.setProperty("projectviewer.new-parent", ae.getSource()); - chooseGroup.setText(((VPTGroup)ae.getSource()).getName()); + project.setParent((VPTGroup) ae.getSource()); + chooseGroup.setText(((VPTGroup) ae.getSource()).getName()); groupPopupMenu.setVisible(false); } @@ -288,10 +288,8 @@ projURLRoot.setToolTipText(jEdit.getProperty("projectviewer.project.options.url_root.tooltip")); if (project.getURL() != null) { projURLRoot.setText(project.getURL()); - projURLRoot.setToolTipText(project.getURL()); } else { projURLRoot.setText(DEFAULT_URL); - projURLRoot.setToolTipText(DEFAULT_URL); } gc.weightx = 1; Modified: plugins/ProjectViewer/trunk/projectviewer/config/package.html =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/package.html 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/config/package.html 2007-07-08 22:25:47 UTC (rev 9970) @@ -44,69 +44,8 @@ "property" based configuration style, just like jEdit provides by <tt>jEdit.getProperty()</tt>, or in the same style of the <tt>java.util.Properties</tt> class. </p> -<p>By having your option pane query a method for properties (instead of -hardcoding <tt>jEdit.getProperty()</tt> calls inside your methods), you need only -to extend the option pane class and make the <tt>getProperty()</tt> method query -the project instead. For example:</p> +<p>For easier serialization of configuration data, take a look at the +{@link org.gjt.sp.util.PropertiesBean} class shipped with jEdit.</p> -<pre><code> - - -class MyOptionPane extends AbstractOptionPane { - - // implementation... - - void myMethod() { - //... - String s = getProperty("property"); - } - - String getColor(String s) { - return jEdit.getProperty(s); - } -} - -class MyProjectOptionPane extends MyOptionPane { - VPTProject p; - - public MyProjectOptionPane() { - p = ProjectOptions.getProject(); - config = (MyConfig) p.getObjectProperty( - "<i>optionPaneName</i>.config"); - } - - String getColor(String s) { - return p.getProperty("color").toString(); - } -} -</code></pre> - -<p>So, virtually all the code is reused, just by creating a method for the -actual getting and setting of properties.</p> - -<h3> Obtaining properties for the current project </h3> - - -<p>A second option is to use a <tt>java.util.Properties</tt> object to get/set properties -in the option pane. If called when the jEdit options dialog is shown, the method -<tt>jEdit.getProperties()</tt> return such an object. If called from the ProjectViewer's -project option dialog, the VPTProject instance also provides a -{@link projectviewer.vpt.VPTProject#getProperties() getProperties()} -method.</p> - -<h3> Obtaining the proejct-specific properties </h3> - -<p> From other locations of the code, you will want to get or set the values that are associated with the current project. </p> - -<pre> -public static P4Config getProjectConfig(View v) { - VPTProject proj = ProjectViewer.getActiveProject(v); - try { - return (proj != null) - ? (P4Config) proj.getObjectProperty(P4Config.KEY) - : null; -</pre> - - </body> Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -365,19 +365,16 @@ //{{{ #saveImportFilterStatus(VPTProject, ImportDialog) : void protected void saveImportFilterStatus(VPTProject project, ImportDialog dlg) { project.setProperty("projectviewer.import.filteridx", - new Integer(dlg.getImportFilterIndex())); + String.valueOf(dlg.getImportFilterIndex())); } //}}} //{{{ #loadImportFilterStatus(VPTProject, ImportDialog) : void protected void loadImportFilterStatus(VPTProject project, ImportDialog dlg) { - Object idx = project.getObjectProperty("projectviewer.import.filteridx"); - if (idx != null) { - if (idx instanceof Integer) { - dlg.setImportFilterIndex(((Integer)idx).intValue()); - } else { - Log.log(Log.WARNING, this, "someone overwrote a PV project property..."); - project.removeProperty("projectviewer.import.filteridx"); - } + try { + int idx = Integer.parseInt(project.getProperty("projectviewer.import.filteridx")); + dlg.setImportFilterIndex(idx); + } catch (NumberFormatException nfe) { + project.removeProperty("projectviewer.import.filteridx"); } } //}}} Deleted: plugins/ProjectViewer/trunk/projectviewer/persist/DeferredProperty.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/persist/DeferredProperty.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/persist/DeferredProperty.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -1,86 +0,0 @@ -/* - * :tabSize=4:indentSize=4:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * 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 2 - * of the License, or 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package projectviewer.persist; - -//{{{ Imports -import java.io.ObjectInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.gjt.sp.util.Log; - -import projectviewer.PVActions; -//}}} - -/** - * Defers the loading of a property until it's requested. This avoids - * ClassCastExceptions and ClassNotFoundErrors when loading PV, since - * the plugins that set "object" properties might not be available. - * - * <p>Since in a perfect world only the plugin that set the property - * will try to load it, the implementing class of the serialized object - * will most probably be available when the property is requested from - * the project.</p> - * - * <p>This requires special treatment in VPTProject.</p> - * - * @author Marcelo Vanzin - * @version $Id$ - * @since PV 2.1.2 - */ -public class DeferredProperty { - - private String data; - private String name; - - public DeferredProperty(String data, String name) { - this.data = data; - this.name = name; - } - - /** - * Returns the original string with the serialized object. This will - * be null if the object was instantiated. - */ - protected String getData() { - return this.data; - } - - /** - * Tries to load the object represented by the serialized data; - * returns the object, or "this" if loading failed. An error message - * is logged to the activity log in the latter case. - */ - public Object getValue() { - try { - byte[] bytes = PVActions.decodeBase64(data); - ObjectInputStream ois = new ObjectInputStream( new ByteArrayInputStream(bytes) ); - return ois.readObject(); - } catch (Exception e) { - Log.log(Log.ERROR, this, "Error loading property of name " + name - + " : " + e.getClass().getName() - + " : " + e.getMessage()); - Log.log(Log.ERROR, this, e); - } - return this; - } - -} - Modified: plugins/ProjectViewer/trunk/projectviewer/persist/PropertyNodeHandler.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/persist/PropertyNodeHandler.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/persist/PropertyNodeHandler.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -40,7 +40,6 @@ private final static String NODE_NAME = "property"; private final static String PROP_NAME_ATTR = "name"; private final static String PROP_VALUE_ATTR = "value"; - private final static String PROP_DATA_ATTR = "data"; /** * Returns the name of the nodes that should be delegated to this handler @@ -81,11 +80,6 @@ String name = attrs.getValue(PROP_NAME_ATTR); if (attrs.getValue(PROP_VALUE_ATTR) != null) { project.setProperty(name, attrs.getValue(PROP_VALUE_ATTR)); - } else { - String data = attrs.getValue(PROP_DATA_ATTR); - if (data != null) { - project.setProperty(name, new DeferredProperty(data, name)); - } } return null; } @@ -105,15 +99,7 @@ if (value != null) { startElement(out); writeAttr(PROP_NAME_ATTR, name, out); - - if (value instanceof String) { - writeAttr(PROP_VALUE_ATTR, (String) value, out); - } else if (value instanceof DeferredProperty) { - writeAttr(PROP_DATA_ATTR, ((DeferredProperty)value).getData(), out); - } else { - String serialized = PVActions.serialize(value); - writeAttr(PROP_DATA_ATTR, serialized, out); - } + writeAttr(PROP_VALUE_ATTR, (String) value, out); out.write(" />\n"); } } Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java 2007-07-08 21:46:54 UTC (rev 9969) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java 2007-07-08 22:25:47 UTC (rev 9970) @@ -38,7 +38,6 @@ import projectviewer.PVActions; import projectviewer.ProjectViewer; import projectviewer.event.ProjectUpdate; -import projectviewer.persist.DeferredProperty; //}}} /** @@ -53,10 +52,7 @@ */ public class VPTProject extends VPTNode { - //{{{ Constants - private final static Icon projectIcon = GUIUtilities.loadIcon("DriveSmall.png"); - private final static String FILTER_LIST_PROP = "projectviewer.project.filter_list"; - //}}} + private final static Icon projectIcon = GUIUtilities.loadIcon("DriveSmall.png"); //{{{ Attributes @@ -77,7 +73,7 @@ openableNodes = new HashMap<String,VPTNode>(); openFiles = new ArrayList(); properties = new Properties(); - filterList = null; + filterList = Collections.EMPTY_LIST; } //}}} @@ -119,21 +115,9 @@ //{{{ +getProperty(String) : String /** Returns the property stored for the given key, as a String. */ public String getProperty(String property) { - Object o = properties.get(property); - return (o != null) ? o.toString() : null; + return properties.getProperty(property); } //}}} - //{{{ +getObjectProperty(String) : Object - /** Returns the property stored for the given key. */ - public Object getObjectProperty(String property) { - Object val = properties.get(property); - if (val instanceof DeferredProperty) { - val = ((DeferredProperty)val).getValue(); - properties.put(property, val); - } - return val; - } //}}} - //{{{ +setProperty(String, String) : String /** * Sets a property. @@ -141,23 +125,9 @@ * @return The old value for the property (can be null). */ public String setProperty(String name, String value) { - Object old = properties.get(name); - properties.put(name, value); - return (old != null) ? old.toString() : null; + return (String) properties.setProperty(name, value); } //}}} - //{{{ +setProperty(String, Object) : Object - /** - * Sets a property. - * - * @return The old value for the property (can be null). - */ - public Object setProperty(String name, Object value) { - Object old = properties.get(name); - properties.put(name, value); - return old; - } //}}} - //{{{ +getPropertyNames() : Set /** Returns a set containing all property names for this project. */ public Set getPropertyNames() { @@ -306,28 +276,6 @@ } } //}}} - //{{{ +unloadProperties() : void - /** - * This method will take all properties that are not Strings and - * serialize them into "DeferredProperty" instances. This is meant - * to be called internally by ProjectViewer and, while it wouldn't - * cause any problems, there's not much point in other plugins - * trying to call this method. - * - * @since PV 2.1.2 - */ - public void unloadProperties() { - for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) { - Object key = i.next(); - Object val = properties.get(key); - if ( !(val instanceof String) && !(val instanceof DeferredProperty) ) { - String serialized = PVActions.serialize(val); - val = new DeferredProperty(serialized, (String) key); - properties.put(key, val); - } - } - } //}}} - //{{{ +addFilter(VPTFilterData) : void /** * @@ -344,12 +292,8 @@ * @since PV 2.2.2.0 */ public void setFilterList(List filterList) { - if (filterList != null && !filterList.isEmpty()) { - setProperty(FILTER_LIST_PROP, filterList); - } else { - removeProperty(FILTER_LIST_PROP); - } - ProjectViewer.nodeStructureChanged(ProjectViewer.getActiveNode(jEdit.getActiveView())); + this.filterList = filterList; + ProjectViewer.nodeStructureChanged(this); } //}}} //{{{ +getFilterList() : List @@ -360,9 +304,6 @@ * @since PV 2.2.2.0 */ public List getFilterList() { - List filterList = (List) getObjectProperty(FILTER_LIST_PROP); - if (filterList == null) - return java.util.Collections.EMPTY_LIST; return filterList; } //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2007-08-02 18:23:49
|
Revision: 10289 http://jedit.svn.sourceforge.net/jedit/?rev=10289&view=rev Author: ezust Date: 2007-08-02 11:23:45 -0700 (Thu, 02 Aug 2007) Log Message: ----------- Made source object the View for the nodeselect event. Modified Paths: -------------- plugins/ProjectViewer/trunk/docs/users-guide.xml plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java Modified: plugins/ProjectViewer/trunk/docs/users-guide.xml =================================================================== --- plugins/ProjectViewer/trunk/docs/users-guide.xml 2007-08-02 18:22:25 UTC (rev 10288) +++ plugins/ProjectViewer/trunk/docs/users-guide.xml 2007-08-02 18:23:45 UTC (rev 10289) @@ -1,13 +1,11 @@ <?xml version="1.0"?> +<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation='http://www.docbook.org/xsd/4.4/docbook.xsd' > <!-- ProjectViewer plugin user's guide --> <!-- (C) 2001,2002,2003 Marcelo Vanzin, Stefan Kost --> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" - "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> <!-- jEdit buffer-local properties: --> <!-- :indentSize=2:noTabs=true:folding=sidekick: --> -<book> - <bookinfo> <title>ProjectViewer plugin</title> <authorgroup> Modified: plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java 2007-08-02 18:22:25 UTC (rev 10288) +++ plugins/ProjectViewer/trunk/projectviewer/event/ViewerUpdate.java 2007-08-02 18:23:45 UTC (rev 10289) @@ -76,7 +76,7 @@ VPTNode n, Type type) { - super(v, n); + super(v.getView(), n); this.type = type; this.path = n.getNodePath(); this.oldParent = null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2007-11-09 22:20:11
|
Revision: 11010 http://jedit.svn.sourceforge.net/jedit/?rev=11010&view=rev Author: ezust Date: 2007-11-09 14:20:07 -0800 (Fri, 09 Nov 2007) Log Message: ----------- Updated for pre12. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/event/NodeSelectionUpdate.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2007-11-09 22:06:28 UTC (rev 11009) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2007-11-09 22:20:07 UTC (rev 11010) @@ -10,7 +10,7 @@ for managing a "project", i.e. a related group of \ source files. -plugin.projectviewer.ProjectPlugin.depend.0=jedit 04.03.11.00 +plugin.projectviewer.ProjectPlugin.depend.0=jedit 04.03.12.00 plugin.projectviewer.ProjectPlugin.depend.1=jdk 1.5 plugin.projectviewer.ProjectPlugin.depend.2=plugin CommonControlsPlugin 0.9.4 Modified: plugins/ProjectViewer/trunk/projectviewer/event/NodeSelectionUpdate.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/event/NodeSelectionUpdate.java 2007-11-09 22:06:28 UTC (rev 11009) +++ plugins/ProjectViewer/trunk/projectviewer/event/NodeSelectionUpdate.java 2007-11-09 22:20:07 UTC (rev 11010) @@ -45,7 +45,7 @@ public NodeSelectionUpdate(ProjectViewer v, VPTNode n) { - super(v.getView(), n.getNodePath()); + super(v.getView(), n.getNodePath(), n.isDirectory()); this.viewer = v; this.node = n; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2007-12-17 06:38:44
|
Revision: 11414 http://jedit.svn.sourceforge.net/jedit/?rev=11414&view=rev Author: vanza Date: 2007-12-16 22:38:42 -0800 (Sun, 16 Dec 2007) Log Message: ----------- - use the new abstract context option pane class in jEdit. - bump jEdit version requirement. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2007-12-17 06:37:29 UTC (rev 11413) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2007-12-17 06:38:42 UTC (rev 11414) @@ -10,7 +10,7 @@ for managing a "project", i.e. a related group of \ source files. -plugin.projectviewer.ProjectPlugin.depend.0=jedit 04.03.12.00 +plugin.projectviewer.ProjectPlugin.depend.0=jedit 04.03.13.00 plugin.projectviewer.ProjectPlugin.depend.1=jdk 1.5 plugin.projectviewer.ProjectPlugin.depend.2=plugin CommonControlsPlugin 0.9.4 Modified: plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java 2007-12-17 06:37:29 UTC (rev 11413) +++ plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java 2007-12-17 06:38:42 UTC (rev 11414) @@ -2,8 +2,7 @@ * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * - * ContextOptionPane.java - Context menu options panel - * Copyright (C) 2000, 2001 Slava Pestov + * Copyright (C) 2007 Marcelo Vanzin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,418 +21,46 @@ package projectviewer.config; -//{{{ Imports -import java.util.Collections; -import java.util.Comparator; -import java.util.Vector; -import java.util.StringTokenizer; - -import java.awt.Component; -import java.awt.GridLayout; -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.Box; -import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.BoxLayout; -import javax.swing.JComboBox; -import javax.swing.ButtonGroup; -import javax.swing.JScrollPane; -import javax.swing.JRadioButton; -import javax.swing.DefaultListModel; -import javax.swing.ListSelectionModel; -import javax.swing.border.EmptyBorder; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.ActionSet; -import org.gjt.sp.jedit.EditAction; -import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.gui.EnhancedDialog; -import org.gjt.sp.jedit.gui.RolloverButton; -import org.gjt.sp.jedit.AbstractOptionPane; +import org.gjt.sp.jedit.gui.AbstractContextOptionPane; -import org.gjt.sp.util.StandardUtilities; - -import common.gui.OkCancelButtons; -//}}} - /** - * Right-click context menu editor. Slightly modified for ProjectViewer. + * ProjectViewer context menu editor. * - * @author Slava Pestov * @author Marcelo Vanzin * @version $Id$ */ -public class ContextOptionPane extends AbstractOptionPane { +public class ContextOptionPane extends AbstractContextOptionPane +{ - //{{{ Private Members - private DefaultListModel listModel; - private JList list; - private JButton add; - private JButton remove; - private JButton moveUp, moveDown; JCheckBox showUserFirst; - //}}} - //{{{ Constructor - public ContextOptionPane(String name) { - super(name); + public ContextOptionPane(String name) + { + super(name, jEdit.getProperty("projectviewer.options.context.caption")); } - //}}} - //{{{ _init() method protected void _init() { - setLayout(new BorderLayout()); - - JLabel caption = new JLabel(jEdit.getProperty( - "projectviewer.options.context.caption")); - add(BorderLayout.NORTH,caption); - - String contextMenu = ProjectViewerConfig.getInstance().getUserContextMenu(); - listModel = new DefaultListModel(); - if (contextMenu != null) { - StringTokenizer st = new StringTokenizer(contextMenu); - while(st.hasMoreTokens()) - { - String actionName = (String)st.nextToken(); - if(actionName.equals("-")) - listModel.addElement(new ContextOptionPane.MenuItem("-","-")); - else - { - EditAction action = jEdit.getAction(actionName); - if(action == null) - continue; - String label = action.getLabel(); - if(label == null) - continue; - listModel.addElement(new ContextOptionPane.MenuItem(actionName,label)); - } - } - } - - list = new JList(listModel); - list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - list.addListSelectionListener(new ListHandler()); - - add(BorderLayout.CENTER,new JScrollPane(list)); - - JPanel buttons = new JPanel(); - buttons.setBorder(new EmptyBorder(3,0,0,0)); - buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS)); - ActionHandler actionHandler = new ActionHandler(); - add = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); - add.setToolTipText(jEdit.getProperty("options.context.add")); - add.addActionListener(actionHandler); - buttons.add(add); - buttons.add(Box.createHorizontalStrut(6)); - remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); - remove.setToolTipText(jEdit.getProperty("options.context.remove")); - remove.addActionListener(actionHandler); - buttons.add(remove); - buttons.add(Box.createHorizontalStrut(6)); - moveUp = new RolloverButton(GUIUtilities.loadIcon("ArrowU.png")); - moveUp.setToolTipText(jEdit.getProperty("options.context.moveUp")); - moveUp.addActionListener(actionHandler); - buttons.add(moveUp); - - moveDown = new RolloverButton(GUIUtilities.loadIcon("ArrowD.png")); - moveDown.setToolTipText(jEdit.getProperty("options.context.moveDown")); - moveDown.addActionListener(actionHandler); - buttons.add(moveDown); - + super._init(); showUserFirst = new JCheckBox(jEdit.getProperty("options.projectviewer.contextmenu.userfirst")); showUserFirst.setSelected(ProjectViewerConfig.getInstance().getUserMenuFirst()); - buttons.add(showUserFirst); + addButton(showUserFirst); + } - buttons.add(Box.createHorizontalStrut(6)); - buttons.add(Box.createGlue()); + /** Returns PV's context menu. */ + protected String getContextMenu() + { + return ProjectViewerConfig.getInstance().getUserContextMenu(); + } - updateButtons(); - add(BorderLayout.SOUTH,buttons); - } //}}} - - //{{{ MenuItemCompare class - static class MenuItemCompare implements Comparator - { - public int compare(Object obj1, Object obj2) - { - return StandardUtilities.compareStrings( - ((MenuItem)obj1).label, - ((MenuItem)obj2).label, - true); - } - } //}}} - - //{{{ _save() method - protected void _save() - { - StringBuffer buf = new StringBuffer(); - for(int i = 0; i < listModel.getSize(); i++) - { - if(i != 0) - buf.append(' '); - buf.append(((MenuItem)listModel.elementAt(i)).actionName); - } - ProjectViewerConfig.getInstance().setUserContextMenu(buf.toString()); + /** Saves PV's context menu. */ + protected void saveContextMenu(String menu) + { + ProjectViewerConfig.getInstance().setUserContextMenu(menu); ProjectViewerConfig.getInstance().setUserMenuFirst(showUserFirst.isSelected()); - } //}}} + } - //{{{ updateButtons() method - private void updateButtons() - { - int index = list.getSelectedIndex(); - remove.setEnabled(index != -1 && listModel.getSize() != 0); - moveUp.setEnabled(index > 0); - moveDown.setEnabled(index != -1 && index != listModel.getSize() - 1); - } //}}} - - //{{{ MenuItem class - static class MenuItem - { - String actionName; - String label; - - MenuItem(String actionName, String label) - { - this.actionName = actionName; - this.label = GUIUtilities.prettifyMenuLabel(label); - } - - public String toString() - { - return label; - } - } //}}} - - //{{{ ActionHandler class - class ActionHandler implements ActionListener - { - public void actionPerformed(ActionEvent evt) - { - Object source = evt.getSource(); - - if(source == add) - { - ContextAddDialog dialog = new ContextAddDialog( - ContextOptionPane.this); - String selection = dialog.getSelection(); - if(selection == null) - return; - - int index = list.getSelectedIndex(); - if(index == -1) - index = listModel.getSize(); - else - index++; - - MenuItem menuItem; - if(selection.equals("-")) - menuItem = new ContextOptionPane.MenuItem("-","-"); - else - { - menuItem = new ContextOptionPane.MenuItem(selection, - jEdit.getAction(selection) - .getLabel()); - } - - listModel.insertElementAt(menuItem,index); - list.setSelectedIndex(index); - list.ensureIndexIsVisible(index); - } - else if(source == remove) - { - int index = list.getSelectedIndex(); - listModel.removeElementAt(index); - updateButtons(); - } - else if(source == moveUp) - { - int index = list.getSelectedIndex(); - Object selected = list.getSelectedValue(); - listModel.removeElementAt(index); - listModel.insertElementAt(selected,index-1); - list.setSelectedIndex(index-1); - list.ensureIndexIsVisible(index - 1); - } - else if(source == moveDown) - { - int index = list.getSelectedIndex(); - Object selected = list.getSelectedValue(); - listModel.removeElementAt(index); - listModel.insertElementAt(selected,index+1); - list.setSelectedIndex(index+1); - list.ensureIndexIsVisible(index+1); - } - } - } //}}} - - //{{{ ListHandler class - class ListHandler implements ListSelectionListener - { - public void valueChanged(ListSelectionEvent evt) - { - updateButtons(); - } - } //}}} } -class ContextAddDialog extends EnhancedDialog -{ - - //{{{ Private Members - private boolean isOK; - private JRadioButton separator, action; - private JComboBox combo; - private JList list; - private JButton ok, cancel; - //}}} - - //{{{ Constructor - public ContextAddDialog(Component comp) - { - super(GUIUtilities.getParentDialog(comp), - jEdit.getProperty("options.context.add.title"), - true); - - JPanel content = new JPanel(new BorderLayout()); - content.setBorder(new EmptyBorder(12,12,12,12)); - setContentPane(content); - - ActionHandler actionHandler = new ActionHandler(); - ButtonGroup grp = new ButtonGroup(); - - JPanel typePanel = new JPanel(new GridLayout(3,1,6,6)); - typePanel.setBorder(new EmptyBorder(0,0,6,0)); - typePanel.add(new JLabel( - jEdit.getProperty("options.context.add.caption"))); - - separator = new JRadioButton(jEdit.getProperty("options.context" - + ".add.separator")); - separator.addActionListener(actionHandler); - grp.add(separator); - typePanel.add(separator); - - action = new JRadioButton(jEdit.getProperty("options.context" - + ".add.action")); - action.addActionListener(actionHandler); - grp.add(action); - action.setSelected(true); - typePanel.add(action); - - content.add(BorderLayout.NORTH,typePanel); - - JPanel actionPanel = new JPanel(new BorderLayout(6,6)); - - ActionSet[] actionsList = jEdit.getActionSets(); - Vector vec = new Vector(actionsList.length); - for(int i = 0; i < actionsList.length; i++) - { - ActionSet actionSet = actionsList[i]; - if(actionSet.getActionCount() != 0) - vec.addElement(actionSet); - } - combo = new JComboBox(vec); - combo.addActionListener(actionHandler); - actionPanel.add(BorderLayout.NORTH,combo); - - list = new JList(); - list.setVisibleRowCount(8); - list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - actionPanel.add(BorderLayout.CENTER,new JScrollPane(list)); - - content.add(BorderLayout.CENTER,actionPanel); - content.add(BorderLayout.SOUTH, new OkCancelButtons(this)); - updateList(); - - pack(); - setLocationRelativeTo(GUIUtilities.getParentDialog(comp)); - setVisible(true); - } //}}} - - //{{{ ok() method - public void ok() - { - isOK = true; - dispose(); - } //}}} - - //{{{ cancel() method - public void cancel() - { - dispose(); - } //}}} - - //{{{ getSelection() method - public String getSelection() - { - if(!isOK) - return null; - - if(separator.isSelected()) - return "-"; - else if(action.isSelected()) - { - Object selected = list.getSelectedValue(); - if (selected != null) { - return ((ContextOptionPane.MenuItem)selected).actionName; - } else { - return null; - } - } - else - throw new InternalError(); - } //}}} - - //{{{ updateList() method - private void updateList() - { - ActionSet actionSet = (ActionSet)combo.getSelectedItem(); - EditAction[] actions = actionSet.getActions(); - Vector listModel = new Vector(actions.length); - - for(int i = 0; i < actions.length; i++) - { - EditAction action = actions[i]; - String label = action.getLabel(); - if(label == null) - continue; - - listModel.addElement(new ContextOptionPane.MenuItem( - action.getName(),label)); - } - - Collections.sort(listModel, new ContextOptionPane.MenuItemCompare()); - - list.setListData(listModel); - } //}}} - - //{{{ ActionHandler class - class ActionHandler implements ActionListener - { - public void actionPerformed(ActionEvent evt) - { - Object source = evt.getSource(); - if(source instanceof JRadioButton) - { - combo.setEnabled(action.isSelected()); - list.setEnabled(action.isSelected()); - } - if(source == ok) - ok(); - else if(source == cancel) - cancel(); - else if(source == combo) - updateList(); - } - } //}}} - -} - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2008-05-11 23:29:26
|
Revision: 12637 http://jedit.svn.sourceforge.net/jedit/?rev=12637&view=rev Author: vanza Date: 2008-05-11 16:29:24 -0700 (Sun, 11 May 2008) Log Message: ----------- Store PV's settings in the "plugin home" directory. Also, try to move old config directory to new location. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2008-05-11 21:19:42 UTC (rev 12636) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2008-05-11 23:29:24 UTC (rev 12637) @@ -6,6 +6,7 @@ plugin.projectviewer.ProjectPlugin.version=2.9.0.0 plugin.projectviewer.ProjectPlugin.docs=index.html plugin.projectviewer.ProjectPlugin.activate=defer +plugin.projectviewer.ProjectPlugin.usePluginHome=true plugin.projectviewer.ProjectPlugin.description=The ProjectViewer plugin provides an interface \ for managing a "project", i.e. a related group of \ source files. Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java 2008-05-11 21:19:42 UTC (rev 12636) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java 2008-05-11 23:29:24 UTC (rev 12637) @@ -61,10 +61,9 @@ public final class ProjectPlugin extends EBPlugin { //{{{ Static Members - public final static String NAME = "projectviewer"; + private static File CONFIG_DIR; + private static ProjectViewerConfig config; - private final static ProjectViewerConfig config = ProjectViewerConfig.getInstance(); - //{{{ +_getResourceAsStream(String)_ : InputStream /** * Returns an input stream to the specified resource, or <code>null</code> @@ -108,10 +107,7 @@ * @return The absolute path to the resource. */ public static String getResourcePath(String path) { - return jEdit.getSettingsDirectory() - + File.separator + NAME - + File.separator + path; - + return new File(CONFIG_DIR, path).getAbsolutePath(); } //}}} //}}} @@ -119,13 +115,31 @@ //{{{ +start() : void /** Start the plugin. */ public void start() { - File f = new File(getResourcePath("projects/null")); - if (!f.getParentFile().exists()) { - if (!f.getParentFile().mkdirs()) { + /* + * First, try to see if the new config directory exists. + * If it doesn't, try to move the old config directory to + * the new location. + */ + File configDir = getPluginHome(); + if (!configDir.isDirectory()) { + File oldConfig = new File(jEdit.getSettingsDirectory(), + "projectviewer"); + if (oldConfig.isDirectory()) { + if (!configDir.getParentFile().mkdirs()) { + Log.log(Log.WARNING, this, "Cannot create plugin home dir."); + configDir = oldConfig; + } else if (!oldConfig.renameTo(configDir)) { + Log.log(Log.WARNING, this, "Cannot move config directory."); + configDir = oldConfig; + } + } else if (!configDir.mkdirs()) { Log.log(Log.ERROR, this, "Cannot create config directory; ProjectViewer will not function properly."); } } + CONFIG_DIR = configDir; + config = ProjectViewerConfig.getInstance(); + /* * set up a task to check any available extensions after * jEdit is done loading. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2008-05-12 00:55:24
|
Revision: 12638 http://jedit.svn.sourceforge.net/jedit/?rev=12638&view=rev Author: vanza Date: 2008-05-11 17:55:22 -0700 (Sun, 11 May 2008) Log Message: ----------- . Add new import option to keep the file system's directory layout when importing. . Fix import dialog not switching to the requested directory when importing. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/gui/ImportDialog.java plugins/ProjectViewer/trunk/projectviewer/importer/FileImporter.java plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2008-05-11 23:29:24 UTC (rev 12637) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2008-05-12 00:55:22 UTC (rev 12638) @@ -212,6 +212,8 @@ projectviewer.import-dlg.file_filter=File filter for importing: projectviewer.import-dlg.file_globs=Files to include (globs): projectviewer.import-dlg.flatten_paths=Flatten file paths +projectviewer.import-dlg.keep_tree=Keep Project Tree +projectviewer.import-dlg.keep_tree.tooltip=Add files and all parent directories following the project's directory layout. projectviewer.import-dlg.options=Import options projectviewer.import-dlg.traverse_dirs=Traverse directories Modified: plugins/ProjectViewer/trunk/projectviewer/gui/ImportDialog.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/gui/ImportDialog.java 2008-05-11 23:29:24 UTC (rev 12637) +++ plugins/ProjectViewer/trunk/projectviewer/gui/ImportDialog.java 2008-05-12 00:55:22 UTC (rev 12638) @@ -98,6 +98,7 @@ private JCheckBox flatten; private JCheckBox newNode; private JCheckBox traverse; + private JCheckBox keepTree; private JComboBox filters; private VFSBrowser chooser; @@ -159,11 +160,20 @@ gbl.setConstraints(flatten, gbc); options.add(flatten); + gbc.gridwidth = GridBagConstraints.REMAINDER; + keepTree = new JCheckBox(jEdit.getProperty("projectviewer.import-dlg.keep_tree")); + keepTree.setToolTipText(jEdit.getProperty("projectviewer.import-dlg.keep_tree.tooltip")); + keepTree.addActionListener(this); + keepTree.setSelected(true); + gbl.setConstraints(keepTree, gbc); + options.add(keepTree); + gbc.gridwidth = GridBagConstraints.RELATIVE; gbc.fill = GridBagConstraints.NONE; gbc.weightx = 0.0; newNode = new JCheckBox(jEdit.getProperty("projectviewer.import-dlg.crate_new")); newNode.addActionListener(this); + newNode.setEnabled(!keepTree.isSelected()); gbl.setConstraints(newNode, gbc); options.add(newNode); @@ -171,6 +181,7 @@ gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 2.0; newNodeName = new JTextField(); + newNodeName.setEnabled(false); gbl.setConstraints(newNodeName, gbc); options.add(newNodeName); @@ -280,6 +291,11 @@ : null; } //}}} + public boolean getKeepTree() + { + return keepTree.isSelected(); + } + //{{{ +getImportFilter() : VFSFileFilter public VFSFileFilter getImportFilter() { if (filters.getSelectedItem() instanceof ImporterFileFilter) { @@ -305,7 +321,8 @@ ok(); } else { flatten.setEnabled(traverse.isSelected()); - newNodeName.setEnabled(newNode.isSelected()); + newNode.setEnabled(!keepTree.isSelected()); + newNodeName.setEnabled(newNode.isEnabled() && newNode.isSelected()); if (ae != null && ae.getSource() == newNode && newNodeName.isEnabled()) newNodeName.requestFocus(); @@ -368,7 +385,7 @@ //{{{ -internalShow() : void private void internalShow() { if (showChooser && chooser == null) { - String initPath; + final String initPath; if (selected != null && selected.isDirectory() && VFSHelper.pathExists(((VPTDirectory)selected).getURL())) { @@ -385,8 +402,14 @@ for (VFSFileFilter f : ffilters) { chooser.addVFSFileFilter(f); } - // chooser.setFilenameFilter(npff); + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + chooser.setDirectory(initPath); + } + } + ); getContentPane().add(BorderLayout.CENTER, chooser); } Modified: plugins/ProjectViewer/trunk/projectviewer/importer/FileImporter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/FileImporter.java 2008-05-11 23:29:24 UTC (rev 12637) +++ plugins/ProjectViewer/trunk/projectviewer/importer/FileImporter.java 2008-05-12 00:55:22 UTC (rev 12638) @@ -99,7 +99,8 @@ VPTNode where = null; VPTNode root = selected; - if (id.getNewNodeName() != null) { + boolean keepTree = id.getKeepTree(); + if (!keepTree && id.getNewNodeName() != null) { VFS vfs = VFSManager.getVFSForPath(selected.getNodePath()); String newDir = vfs.constructPath(selected.getNodePath(), id.getNewNodeName()); @@ -116,25 +117,38 @@ VFSFileFilter fnf = id.getImportFilter(); for (VFSFile file : chosen) { VPTNode node = null; - if (!VFSHelper.pathExists(file.getPath())) { - node = findDirectory(file.getPath(), root, true); - } else if (file.getType() == VFSFile.DIRECTORY) { - node = findDirectory(file.getPath(), root, true); - if (id.getTraverseDirectories()) { + if (keepTree && + file.getPath().startsWith(project.getRootPath())) + { + node = constructPath(project, + file.getPath(), + lst); + if (node.isFile()) { + registerFile((VPTFile) node); + } else if (id.getTraverseDirectories()) { addTree(node, fnf, id.getFlattenFilePaths()); } - } else if (findDirectory(file.getPath(), root, false) == null) { - node = new VPTFile(file.getPath()); - registerFile((VPTFile) node); - fileCount++; - } + } else { + if (!VFSHelper.pathExists(file.getPath())) { + node = findDirectory(file.getPath(), root, true); + } else if (file.getType() == VFSFile.DIRECTORY) { + node = findDirectory(file.getPath(), root, true); + if (id.getTraverseDirectories()) { + addTree(node, fnf, id.getFlattenFilePaths()); + } + } else if (findDirectory(file.getPath(), root, false) == null) { + node = new VPTFile(file.getPath()); + registerFile((VPTFile) node); + fileCount++; + } - if (node != null && node.getParent() == null) { - if (where == null) { - lst.add(node); - } else { - where.add(node); - where.sortChildren(); + if (node != null && node.getParent() == null) { + if (where == null) { + lst.add(node); + } else { + where.add(node); + where.sortChildren(); + } } } } Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2008-05-11 23:29:24 UTC (rev 12637) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2008-05-12 00:55:22 UTC (rev 12638) @@ -209,7 +209,7 @@ } //}}} /** - * Creates a subtree starting a the given root, going down to the + * Creates a subtree starting at the given root, going down to the * given path, updating the given list of added nodes as necessary. * * @param root Root node where to start constructing the path. @@ -233,23 +233,26 @@ assert path.startsWith(root.getNodePath()) : "Path not under root!"; + if (path.endsWith(File.separator)) { + path = path.substring(0, path.length() - File.separator.length()); + } + dirs = new Stack<String>(); vfs = VFSManager.getVFSForPath(path); rootPath = root.getNodePath(); isFile = (VFSHelper.getFile(path).getType() == VFSFile.FILE); - /* - * VFS.getParentOfPath() returns paths with a trailing slash... - * BTW, it's interesting that it uses "File.separatorChar" - * when all this is supposed to be URL-based. - */ - if (!rootPath.endsWith(File.separator)) { - rootPath += File.separator; - } - while (!path.equals(rootPath)) { dirs.push(path); path = vfs.getParentOfPath(path); + /* + * VFS.getParentOfPath() returns paths with a trailing slash... + * BTW, it's interesting that it uses "File.separatorChar" + * when all this is supposed to be URL-based. + */ + if (path.endsWith(File.separator)) { + path = path.substring(0, path.length() - File.separator.length()); + } } while (!dirs.isEmpty()) { Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java 2008-05-11 23:29:24 UTC (rev 12637) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java 2008-05-12 00:55:22 UTC (rev 12638) @@ -442,7 +442,7 @@ case KeyEvent.VK_ESCAPE: DockableWindowManager dwm = viewer.getView().getDockableWindowManager(); - dwm.hideDockableWindow(ProjectPlugin.NAME); + dwm.hideDockableWindow("projectviewer"); e.consume(); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2008-05-16 06:21:33
|
Revision: 12668 http://jedit.svn.sourceforge.net/jedit/?rev=12668&view=rev Author: vanza Date: 2008-05-15 23:21:27 -0700 (Thu, 15 May 2008) Log Message: ----------- SF Feat. Req. #1936520 Add a node properties dialog. As usual, the dialog is extensible, so other plugins can easily add their own widgets. The UI currently is teh suck, but maybe someone with better UI skills can help out... Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/actions.xml plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java Added Paths: ----------- plugins/ProjectViewer/trunk/projectviewer/action/NodePropertiesAction.java plugins/ProjectViewer/trunk/projectviewer/gui/GeneralNodeProperties.java plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertiesDialog.java plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertyProvider.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2008-05-16 06:05:13 UTC (rev 12667) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2008-05-16 06:21:27 UTC (rev 12668) @@ -54,6 +54,7 @@ projectviewer_wrapper_expand_all.label=Expand All Nodes projectviewer_wrapper_collapse_all.label=Collapse All Nodes projectviewer_wrapper_openwith.label=Open with External Application +projectviewer_wrapper_nodepropeties.label=Node Properties projectviewer_wrapper_reimport.label=Re-import files on Project/Directory projectviewer_wrapper_goup.label=Go up @@ -183,6 +184,9 @@ projectviewer.error.project_str=project projectviewer.error.project_list_str=project list +projectviewer.node_properties_dlg.title=Node Properties: {0} +projectviewer.node_properties_dlg.close=Close + projectviewer.action.rename.cannot_rename.message=Changing the physical name of this node is not supported. projectviewer.action.rename.cannot_rename.title=Cannot rename @@ -235,6 +239,7 @@ projectviewer.action.remove_project=Remove project projectviewer.action.remove_multiple=Remove nodes projectviewer.action.delete=Delete from disk (DEL) +projectviewer.action.nodeproperties=Node Properties projectviewer.action.rename=Rename (F2) projectviewer.action.a_e_project=Add/Edit Project projectviewer.action.add_project=Add Project @@ -300,6 +305,18 @@ projectviewer.acrion.search.error=Cannot search in selected node or no node selected. #}}} +#{{{ Node properties dialog +projectviewer.action.properties.general.title=General +projectviewer.action.properties.general.root_path=Root: +projectviewer.action.properties.general.proj_url=Web root: +projectviewer.action.properties.general.file_count=File count: +projectviewer.action.properties.general.location=Location: +projectviewer.action.properties.general.size=Size: +projectviewer.action.properties.general.unknown=(Unknown) +projectviewer.action.properties.general.calculate=Calculate +projectviewer.action.properties.general.modified=Last modified: +#}}} + #{{{ Confirmation messages projectviewer.remove.confirm_file_del=Do you really want to delete the selected file from disk? projectviewer.remove.confirm_dir_del=Do you really want to recursively delete the selected directory from disk? Modified: plugins/ProjectViewer/trunk/actions.xml =================================================================== --- plugins/ProjectViewer/trunk/actions.xml 2008-05-16 06:05:13 UTC (rev 12667) +++ plugins/ProjectViewer/trunk/actions.xml 2008-05-16 06:21:27 UTC (rev 12668) @@ -169,6 +169,13 @@ </CODE> </ACTION> + <ACTION NAME="projectviewer_wrapper_nodepropeties"> + <CODE> + projectviewer.PVActions.pvActionWrapper( + new projectviewer.action.NodePropertiesAction(), view, false); + </CODE> + </ACTION> + <ACTION NAME="projectviewer_wrapper_reimport"> <CODE> projectviewer.PVActions.pvActionWrapper( Added: plugins/ProjectViewer/trunk/projectviewer/action/NodePropertiesAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/NodePropertiesAction.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/action/NodePropertiesAction.java 2008-05-16 06:21:27 UTC (rev 12668) @@ -0,0 +1,59 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.action; + +import java.awt.event.ActionEvent; + +import org.gjt.sp.jedit.jEdit; + +import projectviewer.gui.NodePropertiesDialog; +import projectviewer.vpt.VPTNode; + +/** + * Shows a dialog with properties for the selected node. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public class NodePropertiesAction extends Action +{ + + public String getText() { + return jEdit.getProperty("projectviewer.action.nodeproperties"); + } + + /** Disable action for multiple selection. */ + public void prepareForNode(VPTNode node) + { + cmItem.setVisible(node != null); + } + + /** Shows the property dialog. */ + public void actionPerformed(ActionEvent e) + { + NodePropertiesDialog dlg; + + dlg = new NodePropertiesDialog(viewer.getSelectedNode(), + viewer); + dlg.setVisible(true); + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/action/NodePropertiesAction.java ___________________________________________________________________ Name: svn:keywords + Id Added: plugins/ProjectViewer/trunk/projectviewer/gui/GeneralNodeProperties.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/gui/GeneralNodeProperties.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/gui/GeneralNodeProperties.java 2008-05-16 06:21:27 UTC (rev 12668) @@ -0,0 +1,239 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.gui; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.text.DecimalFormat; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.io.VFS; +import org.gjt.sp.jedit.io.VFSFile; +import org.gjt.sp.jedit.io.VFSManager; + +import org.gjt.sp.util.Log; + +import projectviewer.VFSHelper; +import projectviewer.vpt.VPTDirectory; +import projectviewer.vpt.VPTFile; +import projectviewer.vpt.VPTNode; +import projectviewer.vpt.VPTProject; + +/** + * Node property provider that shows basic information about projects + * and VFS nodes. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +class GeneralNodeProperties implements NodePropertyProvider +{ + + public boolean isNodeSupported(VPTNode node) + { + return node.isProject() || node.isFile() || node.isDirectory(); + } + + + public String getTitle() + { + return getProperty("title"); + } + + + public Component getComponent(VPTNode node) + { + return new NodePropertiesPane(node); + } + + + private static String getProperty(String name) + { + return jEdit.getProperty("projectviewer.action.properties.general." + name); + } + + + private static class NodePropertiesPane extends JPanel + implements ActionListener + { + private final GridBagLayout gbl; + private final GridBagConstraints gbc; + + public NodePropertiesPane(VPTNode node) + { + DecimalFormat fmt = new DecimalFormat("#,###"); + gbl = new GridBagLayout(); + gbc = new GridBagConstraints(); + + setLayout(gbl); + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.WEST; + gbc.weightx = 0.0; + + /* Top pane: icon and node name. */ + JLabel nodeIcon = new JLabel(node.getIcon(false)); + nodeIcon.setMinimumSize(new java.awt.Dimension(64, 64)); + nodeIcon.setPreferredSize(new java.awt.Dimension(64, 64)); + _add(nodeIcon, 1); + + JLabel nodeName = new JLabel(node.getName()); + _add(nodeName, GridBagConstraints.REMAINDER); + + /* Horizontal rule separating top pane. */ + JSeparator sep = new JSeparator(); + _add(sep, GridBagConstraints.REMAINDER); + + /* Node-specific information. */ + if (node.isProject()) { + VPTProject p = (VPTProject) node; + JLabel text; + + /* Root path. */ + text = new JLabel(getProperty("root_path")); + _add(text, 1); + + text = new JLabel(p.getRootPath()); + _add(text, GridBagConstraints.REMAINDER); + + /* Web root. */ + if (p.getURL() != null) { + text = new JLabel(getProperty("proj_url")); + _add(text, 1); + + text = new JLabel(p.getURL()); + _add(text, GridBagConstraints.REMAINDER); + } + + /* File count. */ + text = new JLabel(getProperty("file_count")); + _add(text, 1); + + text = new JLabel(fmt.format(p.getOpenableNodes().size())); + _add(text, GridBagConstraints.REMAINDER); + } else { + JLabel text; + VFSFile f; + + try { + f = VFSHelper.getFile(node.getNodePath()); + } catch (java.io.IOException ioe) { + Log.log(Log.WARNING, this, ioe); + f = null; + } + + /* Location. */ + text = new JLabel(getProperty("location")); + _add(text, 1); + + text = new JLabel(node.getNodePath()); + _add(text, GridBagConstraints.REMAINDER); + + /* + * Size. For directories, it's only calculated + * when requested. + */ + text = new JLabel(getProperty("size")); + _add(text, 1); + + if (node.isFile()) { + if (f != null) { + text = new JLabel(formatSize(fmt, f.getLength())); + } else { + text = new JLabel(getProperty("unknown")); + } + _add(text, GridBagConstraints.REMAINDER); + } else { + JButton calc; + + text = new JLabel(getProperty("unknown")); + gbc.gridwidth = 1; + gbc.weightx = 3.0; + gbl.setConstraints(text, gbc); + add(text); + + calc = new JButton(getProperty("calculate")); + calc.addActionListener(this); + calc.setEnabled(f != null); + _add(calc, GridBagConstraints.REMAINDER); + } + + /* Modification time. */ + if (f != null) { + String lastMod = f.getExtendedAttribute(VFS.EA_MODIFIED); + if (lastMod == null) { + lastMod = getProperty("unknown"); + } + + text = new JLabel(getProperty("modified")); + _add(text, 1); + + text = new JLabel(lastMod); + _add(text, GridBagConstraints.REMAINDER); + } + + } + + /* Vertical filler. */ + gbc.fill = GridBagConstraints.BOTH; + gbc.weighty = 3.0; + _add(javax.swing.Box.createGlue(), GridBagConstraints.REMAINDER); + } + + + /** Calculate the size of the directory being shown. */ + public void actionPerformed(ActionEvent ae) + { + /* TODO. */ + } + + + private void _add(Component c, int width) + { + gbc.gridwidth = width; + gbc.weightx = (width == GridBagConstraints.REMAINDER) ? 2.0 : 1.0; + gbl.setConstraints(c, gbc); + add(c); + } + + + private String formatSize(DecimalFormat fmt, long size) + { + if (size < 1024L) { + return fmt.format(size) + " B"; + } else if (size < 1024L * 1024L) { + return fmt.format(size / 1024) + " kB"; + } else { + return fmt.format(size / 1024 / 1024) + " MB"; + } + } + } +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/gui/GeneralNodeProperties.java ___________________________________________________________________ Name: svn:keywords + Id Added: plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertiesDialog.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertiesDialog.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertiesDialog.java 2008-05-16 06:21:27 UTC (rev 12668) @@ -0,0 +1,145 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.gui; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.util.LinkedList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JOptionPane; +import javax.swing.JTabbedPane; + +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.gui.EnhancedDialog; + +import projectviewer.config.ExtensionManager; +import projectviewer.vpt.VPTNode; + +/** + * A dialog that shows a tabbed pane with information about the + * selected node. PV provides a default properties pane that shows + * available information about the VFS node (URL, size, etc). + * + * Other plugins can extend the dialog by providing implementations + * of "NodePropertyProvider" through the jEdit services mechanism. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public class NodePropertiesDialog extends EnhancedDialog + implements ActionListener +{ + + private VPTNode node; + + public NodePropertiesDialog(VPTNode node, + Component parent) + { + super(JOptionPane.getFrameForComponent(parent), + jEdit.getProperty("projectviewer.node_properties_dlg.title", + new Object[] { node.getName() }), + true); + this.node = node; + + /* Load the providers into the tab pane. */ + List<Object> exts = ExtensionManager.getInstance() + .loadExtensions(NodePropertyProvider.class); + NodePropertyProvider general = new GeneralNodeProperties(); + JTabbedPane tabs = new JTabbedPane(); + + if (general.isNodeSupported(node)) { + tabs.add(general.getTitle(), new ProviderWrapper(general)); + } + if (exts != null) { + for (Object o : exts) { + NodePropertyProvider npp = (NodePropertyProvider) o; + if (npp.isNodeSupported(node)) { + tabs.add(npp.getTitle(), new ProviderWrapper(npp)); + } + } + } + + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(BorderLayout.CENTER, tabs); + + /* Add the "close" button. */ + JPanel closePanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + JButton closeBtn = new JButton(jEdit.getProperty("projectviewer.node_properties_dlg.close")); + closeBtn.addActionListener(this); + closePanel.add(closeBtn); + getContentPane().add(BorderLayout.SOUTH, closePanel); + + pack(); + GUIUtilities.loadGeometry(this, getClass().getName()); + } + + + public void ok() + { + GUIUtilities.saveGeometry(this, getClass().getName()); + dispose(); + } + + + public void cancel() + { + ok(); + } + + + public void actionPerformed(ActionEvent ae) + { + ok(); + } + + /** Wrapper for a provider, to only instantiate the UI when needed. */ + private class ProviderWrapper extends JPanel + { + private boolean instantiated; + private NodePropertyProvider provider; + + public ProviderWrapper(NodePropertyProvider provider) + { + super(new BorderLayout()); + this.instantiated = false; + this.provider = provider; + } + + public void setVisible(boolean visible) + { + if (visible && !instantiated) { + add(BorderLayout.CENTER, provider.getComponent(node)); + } + super.setVisible(visible); + } + + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertiesDialog.java ___________________________________________________________________ Name: svn:keywords + Id Added: plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertyProvider.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertyProvider.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertyProvider.java 2008-05-16 06:21:27 UTC (rev 12668) @@ -0,0 +1,69 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.gui; + +import java.awt.Component; +import org.gjt.sp.jedit.gui.EnhancedDialog; +import projectviewer.vpt.VPTNode; + +/** + * Defines the interface for providing custom properties about a node. + * When showing the node properties dialog, a new tab will be created + * for each available provider. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public interface NodePropertyProvider +{ + + /** + * Returns whether this provider can show information for the + * given node. If the node is not supported, no tab for this + * provides is created in the UI. + * + * @param node The node. + * + * @return Whether a tab should be shown for this provider. + */ + public boolean isNodeSupported(VPTNode node); + + + /** + * Returns the title of the tab containing this provider's + * information. + */ + public String getTitle(); + + + /** + * Returns the component containing the UI for the properties + * of the given node. This method is only called when the + * provider's tab is activated by the user, and is only called + * once for each invocation of the dialog. + * + * @param node The node. + * + * @return A UI component to be shown in the properties dialog. + */ + public Component getComponent(VPTNode node); + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/gui/NodePropertyProvider.java ___________________________________________________________________ Name: svn:keywords + Id Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java 2008-05-16 06:05:13 UTC (rev 12667) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java 2008-05-16 06:21:27 UTC (rev 12668) @@ -44,6 +44,7 @@ import projectviewer.action.EditGroupAction; import projectviewer.action.EditProjectAction; import projectviewer.action.MoveNodeAction; +import projectviewer.action.NodePropertiesAction; import projectviewer.action.NodeRemoverAction; import projectviewer.action.NodeRenamerAction; import projectviewer.action.OpenWithAppAction; @@ -97,6 +98,7 @@ addAction(new OpenWithEncodingAction(), false); addAction(new SearchAction(), false); addAction(new ArchiveAction(), false); + addAction(new NodePropertiesAction(), false); /* Separator for the list of external actions added to the menu. */ ActionSeparator sep = new ActionSeparator(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2008-07-02 05:09:51
|
Revision: 12994 http://jedit.svn.sourceforge.net/jedit/?rev=12994&view=rev Author: vanza Date: 2008-07-01 22:09:49 -0700 (Tue, 01 Jul 2008) Log Message: ----------- . Add configuration option pane and minimal infrastructure for an auto-reimport task for project. Actual implementation still TODO. . Rework some of the ImportUtils APIs to be more generic. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java plugins/ProjectViewer/trunk/projectviewer/importer/ImportUtils.java plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java Added Paths: ----------- plugins/ProjectViewer/trunk/projectviewer/config/AutoReimportPane.java plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2008-07-02 05:07:07 UTC (rev 12993) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2008-07-02 05:09:49 UTC (rev 12994) @@ -350,3 +350,18 @@ projectviewer.groupmenu.create_group=New group here #}}} +#{{{ Auto-reimport options +options.projectviewer.auto_reimport_props.label=Auto Reimport + +projectviewer.project.auto_reimport.enable=Enable automatic re-import +projectviewer.project.auto_reimport.period=Period (minutes): +projectviewer.project.auto_reimport.period.tooltip=How often (in minutes) to re-scan the project (0 = never). +projectviewer.project.auto_reimport.current_dirs=Only re-scan current directories. +projectviewer.project.auto_reimport.current_dirs.tooltip=Do not add any new directories to the project, just new files in existing directories. +projectviewer.project.auto_reimport.filter=Filter: +projectviewer.project.auto_reimport.file_glob=Files to import: +projectviewer.project.auto_reimport.file_glob.tooltip=Use standard globs to define filters; prepend with ! to not import files that match the glob. +projectviewer.project.auto_reimport.dir_glob=Directories to ignore: +projectviewer.project.auto_reimport.period_error=Invalid value for re-import period. +#}}} + Added: plugins/ProjectViewer/trunk/projectviewer/config/AutoReimportPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/AutoReimportPane.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/config/AutoReimportPane.java 2008-07-02 05:09:49 UTC (rev 12994) @@ -0,0 +1,194 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.config; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.util.List; + +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JTextField; + +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.util.Log; + +import projectviewer.gui.OptionPaneBase; + +import projectviewer.importer.AutoReimporter; +import projectviewer.importer.GlobFilter; +import projectviewer.importer.ImportUtils; +import projectviewer.importer.ImporterFileFilter; + +import projectviewer.vpt.VPTProject; + + +/** + * A dialog for configuring the auto-reimport feature for a project. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +class AutoReimportPane extends OptionPaneBase + implements ActionListener +{ + + AutoReimportPane(VPTProject p) + { + super("projectviewer.auto_reimport_props", + "projectviewer.project.auto_reimport"); + this.project = p; + this.options = new AutoReimporter.Options(); + } + + + /** Load the GUI components of the pane. */ + protected void _init() + { + List<ImporterFileFilter> flist = ImportUtils.getFilters(); + + options.load(project.getProperties(), flist); + + // Is reimporting enabled? + enable = addCheckBox("enable", options.getPeriod() > 0); + enable.addActionListener(this); + + // Reimport period. + period = new JTextField(String.valueOf(options.getPeriod())); + period.setEnabled(enable.isSelected()); + addComponent(period, "period"); + + // Only current directories? + currentDirs = addCheckBox("current_dirs", options.getCurrentOnly()); + currentDirs.setEnabled(enable.isSelected()); + + // Filters. + filters = new JComboBox(); + filters.setEnabled(enable.isSelected()); + if (flist != null && flist.size() > 0) { + for (Object o : flist) { + filters.addItem(o); + } + } + filters.addItem(jEdit.getProperty("projectviewer.import.filter.custom")); + filters.addActionListener(this); + addComponent(filters, "filter"); + + // Custom filter file and directory globs. + fileGlobs = new JTextField(); + fileGlobs.setEnabled(false); + + dirGlobs = new JTextField(); + dirGlobs.setEnabled(false); + + ImporterFileFilter filter = options._getFilter(); + if (filter != null) { + if (filter instanceof GlobFilter && + ((GlobFilter)filter).isCustom()) { + GlobFilter gf = (GlobFilter) filter; + fileGlobs.setText(gf.getFileGlobs()); + dirGlobs.setText(gf.getDirectoryGlobs()); + fileGlobs.setEnabled(enable.isSelected()); + dirGlobs.setEnabled(enable.isSelected()); + filters.setSelectedIndex(filters.getItemCount() - 1); + } else { + filters.setSelectedItem(filter); + } + } + + addComponent(fileGlobs, "file_glob"); + addComponent(dirGlobs, "dir_glob"); + } + + + /** Saves the configuration to the project. */ + protected void _save() { + long pval = 0; + + if (enable.isSelected()) { + try { + pval = Long.parseLong(period.getText()); + } catch (NumberFormatException nfe) { + Log.log(Log.WARNING, this, + "Invalid auto import period: " + period.getText()); + } + } + + if (pval > 0) { + ImporterFileFilter filter; + if (filters.getSelectedIndex() == filters.getItemCount() - 1) { + filter = new GlobFilter(fileGlobs.getText(), + dirGlobs.getText()); + } else { + filter = (ImporterFileFilter) filters.getSelectedItem(); + } + + options._setFilter(filter); + options.setPeriod(pval); + options.setCurrentOnly(currentDirs.isSelected()); + options.save(project.getProperties()); + } else { + options.clean(project.getProperties()); + } + } + + + /** Keeps the field states in sync. */ + public void actionPerformed(ActionEvent ae) + { + if (ae.getSource() == enable) { + period.setEnabled(enable.isSelected()); + currentDirs.setEnabled(enable.isSelected()); + filters.setEnabled(enable.isSelected()); + if (enable.isSelected()) { + boolean custom = (filters.getSelectedItem() instanceof String); + fileGlobs.setEnabled(custom); + dirGlobs.setEnabled(custom); + } else { + fileGlobs.setEnabled(false); + dirGlobs.setEnabled(false); + } + } + + if (ae.getSource() == filters) { + boolean custom = (filters.getSelectedItem() instanceof String); + fileGlobs.setEnabled(custom); + dirGlobs.setEnabled(custom); + + if (custom) { + fileGlobs.requestFocus(); + } + } + } + + + /* Fields. */ + private VPTProject project; + private AutoReimporter.Options options; + + private JCheckBox enable; + private JTextField period; + private JCheckBox currentDirs; + private JComboBox filters; + private JTextField fileGlobs; + private JTextField dirGlobs; + +} Property changes on: plugins/ProjectViewer/trunk/projectviewer/config/AutoReimportPane.java ___________________________________________________________________ Name: svn:keywords + Id Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java 2008-07-02 05:07:07 UTC (rev 12993) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java 2008-07-02 05:09:49 UTC (rev 12994) @@ -199,6 +199,7 @@ pOptPane = new ProjectPropertiesPane(p, isNew, lookupPath); addOptionPane(pOptPane); + addOptionPane(new AutoReimportPane(p)); addOptionPane(new ProjectFilterPane()); EditPlugin[] eplugins = jEdit.getPlugins(); Added: plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java 2008-07-02 05:09:49 UTC (rev 12994) @@ -0,0 +1,225 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.importer; + +import java.util.List; +import java.util.Properties; +import java.util.Timer; +import java.util.TimerTask; + +import org.gjt.sp.util.PropertiesBean; + +import projectviewer.vpt.VPTProject; + + +/** + * A timer task for triggering auto-reimport of projects. + * + * @author Marcelo Vanzin + * @version $Id$ + * @since PV 3.0.0 + */ +public class AutoReimporter extends TimerTask +{ + + /* Config keys. */ + private static final String AR_ROOT = "projectviewer.auto_reimport"; + public static final String AR_CFG_PERIOD = AR_ROOT + ".period"; + public static final String AR_CFG_CURR_ONLY = AR_ROOT + ".current_dirs"; + + + /** + * Static constructor. Loads the configuration options from the + * given object, and if auto-reimport is enabled, create a new + * timer task and register it with the given timer. + * + * @param p The affected project. + * @param timer Where to add the task. + * + * @return The auto-reimport task (null if not created). + */ + public static AutoReimporter create(VPTProject p, + Timer timer) + { + assert (p != null) : "No project provided."; + assert (timer != null) : "No timer provided."; + + Options o = new Options(); + o.load(p.getProperties()); + + if (o.getPeriod() > 0) { + AutoReimporter ar = new AutoReimporter(p, o); + timer.schedule(ar, + o.getPeriod() * 1000 * 60, + o.getPeriod() * 1000 * 60); + return ar; + } + + return null; + } + + + /** Performs the re-import of the project's files. */ + public void run() + { + System.err.println("AutoReimporter.run(): not implemented!"); + } + + + /** Private constructor. */ + private AutoReimporter(VPTProject p, + Options o) + { + this.project = p; + this.options = o; + } + + + /* Fields. */ + private final VPTProject project; + private final Options options; + + + /** Class that encapsulates the auto-reimport options. */ + public static class Options extends PropertiesBean + { + + public Options() + { + super(AR_ROOT); + } + + + /** Set the periodicity of the auto-reimport, in minutes. */ + public void setPeriod(long p) + { + this.period = p; + } + + + /** Returns the periodicity of reimports, in minutes. */ + public long getPeriod() + { + return period; + } + + + /** + * Sets whether the auto-reimport will only check existing + * directories in the project. Any new directories found + * during the scan will be ignored. + */ + public void setCurrentOnly(boolean b) + { + this.currentDirsOnly = b; + } + + + /** Returns whether to only look at current directories. */ + public boolean getCurrentOnly() + { + return currentDirsOnly; + } + + + /** + * Sets the filter to use during reimport. The underscore is + * to avoid the super class to treat it as a java bean property. + */ + public void _setFilter(ImporterFileFilter filter) + { + this.filter = filter; + } + + + /** + * Returns the file filter to use during reimport. The + * underscore is to avoid the super class to treat it as + * a java bean property. + */ + public ImporterFileFilter _getFilter() + { + return filter; + } + + + /** + * Saves the information, including the filter info. + * + * @param p Properties object. + */ + public void save(Properties p) + { + ImportUtils.saveFilter(p, filter, AR_ROOT); + super.save(p); + } + + + /** + * Loads the information, including the filter info. + * + * @param p Properties object. + */ + public void load(Properties p) + { + load(p, ImportUtils.getFilters()); + } + + + /** + * Loads the information, using the given list of filters as + * a base for the filter search. + * + * @param p Properties object. + * @param filters List of ImporterFileFilter. + */ + public void load(Properties p, + List<ImporterFileFilter> filters) + { + assert (filters != null) : "no filters provided"; + + if (filters == null) { + filters = ImportUtils.getFilters(); + } + filter = ImportUtils.loadFilter(p, filters, AR_ROOT); + super.load(p); + } + + + /** + * Cleans the config options related to this object. + * + * @param p Properties object. + */ + public void clean(Properties p) + { + super.clean(p); + ImportUtils.cleanConfig(p, AR_ROOT); + } + + + /* Fields. */ + private long period; + private boolean currentDirsOnly; + private ImporterFileFilter filter; + + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java ___________________________________________________________________ Name: svn:keywords + Id Modified: plugins/ProjectViewer/trunk/projectviewer/importer/ImportUtils.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/ImportUtils.java 2008-07-02 05:07:07 UTC (rev 12993) +++ plugins/ProjectViewer/trunk/projectviewer/importer/ImportUtils.java 2008-07-02 05:09:49 UTC (rev 12994) @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Properties; import projectviewer.config.ExtensionManager; import projectviewer.vpt.VPTProject; @@ -69,32 +70,32 @@ * Saves the configuration about the selected filter to the * project. * - * @param project Where to save the config. + * @param p Properties object. * @param filter The filter instance. * @param propRoot Root of the configuration property names. */ - public static void saveFilter(VPTProject project, + public static void saveFilter(Properties p, ImporterFileFilter filter, String propRoot) { - assert (project != null) : "Project is null!"; + assert (p != null) : "No properties object!"; assert (filter != null) : "Filter is null!"; assert (propRoot != null) : "Prop root is null!"; - project.setProperty(propRoot + FILTER_CFG_KEY, filter.getId()); + p.setProperty(propRoot + FILTER_CFG_KEY, filter.getId()); if (filter instanceof GlobFilter && ((GlobFilter)filter).isCustom()) { GlobFilter gf = (GlobFilter) filter; /* * If using a custom GlobFilter, save both the filter ID and * the configuration of the filter. */ - project.setProperty(propRoot + FILTER_CFG_FILES_GLOB, + p.setProperty(propRoot + FILTER_CFG_FILES_GLOB, gf.getFileGlobs()); - project.setProperty(propRoot + FILTER_CFG_DIRS_GLOB, + p.setProperty(propRoot + FILTER_CFG_DIRS_GLOB, gf.getDirectoryGlobs()); } else { - project.removeProperty(propRoot + FILTER_CFG_FILES_GLOB); - project.removeProperty(propRoot + FILTER_CFG_DIRS_GLOB); + p.remove(propRoot + FILTER_CFG_FILES_GLOB); + p.remove(propRoot + FILTER_CFG_DIRS_GLOB); } } @@ -103,25 +104,25 @@ * Loads the filter information from the project, and tries to * identify a matching filter in the given list. * - * @param project Where to get the config data. + * @param p Properties object. * @param filters List of filters to search. * @param propRoot Root of the configuration property names. * * @return The filter that matches the project config, or null * if not found. */ - public static ImporterFileFilter loadFilter(VPTProject project, + public static ImporterFileFilter loadFilter(Properties p, List<ImporterFileFilter> filters, String propRoot) { ImporterFileFilter filter = null; - assert (project != null) : "Project is null!"; + assert (p != null) : "No properties object!"; assert (filters != null) : "No filters provided!"; assert (propRoot != null) : "Prop root is null!"; /* Try the new configuration first. */ - String filterId = project.getProperty(propRoot + FILTER_CFG_KEY); + String filterId = p.getProperty(propRoot + FILTER_CFG_KEY); if (filterId != null) { for (ImporterFileFilter f : filters) { if (filterId.equals(f.getId())) { @@ -134,8 +135,8 @@ /* Found filter. Still need to check if it's a custom glob filter. */ if ((filter != null && filter instanceof GlobFilter) || GlobFilter.class.getName().equals(filterId)) { - String fileGlobs = project.getProperty(propRoot + FILTER_CFG_FILES_GLOB); - String dirGlobs = project.getProperty(propRoot + FILTER_CFG_DIRS_GLOB); + String fileGlobs = p.getProperty(propRoot + FILTER_CFG_FILES_GLOB); + String dirGlobs = p.getProperty(propRoot + FILTER_CFG_DIRS_GLOB); if (fileGlobs != null && dirGlobs != null) { filter = new GlobFilter(fileGlobs, dirGlobs); @@ -145,13 +146,13 @@ /* Try old style config if all else fails. */ if (filter == null) { try { - int idx = Integer.parseInt(project.getProperty(propRoot + ".filteridx")); + int idx = Integer.parseInt(p.getProperty(propRoot + ".filteridx")); if (idx < filters.size()) { filter = filters.get(idx); } - project.removeProperty(propRoot + ".filteridx"); + p.remove(propRoot + ".filteridx"); } catch (NumberFormatException nfe) { - project.removeProperty(propRoot + ".filteridx"); + p.remove(propRoot + ".filteridx"); } } @@ -159,6 +160,21 @@ } + /** + * Cleans the configuration related to filters from the given object. + * + * @param p Properties object. + * @param propRoot Root of the configuration property names. + */ + public static void cleanConfig(Properties p, + String propRoot) + { + p.remove(propRoot + FILTER_CFG_KEY); + p.remove(propRoot + FILTER_CFG_FILES_GLOB); + p.remove(propRoot + FILTER_CFG_DIRS_GLOB); + } + + /** Non-instantiable. */ private ImportUtils() { Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2008-07-02 05:07:07 UTC (rev 12993) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2008-07-02 05:09:49 UTC (rev 12994) @@ -409,7 +409,7 @@ protected void saveImportFilterStatus(VPTProject project, ImportDialog dlg) { - ImportUtils.saveFilter(project, + ImportUtils.saveFilter(project.getProperties(), dlg.getImportFilter(), "projectviewer.import"); } @@ -419,7 +419,7 @@ ImportDialog dlg) { ImporterFileFilter filter = - ImportUtils.loadFilter(project, + ImportUtils.loadFilter(project.getProperties(), dlg.getFileFilters(), "projectviewer.import"); if (filter != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2008-07-07 01:40:30
|
Revision: 13015 http://jedit.svn.sourceforge.net/jedit/?rev=13015&view=rev Author: vanza Date: 2008-07-06 18:40:27 -0700 (Sun, 06 Jul 2008) Log Message: ----------- Add a rudimentary, opt-in locking mechanism for projects. Since some time consuming tasks may execute in separate threads, and may not be triggered by the user, it's good to have a way to say "this project is being modified, try the action again later". Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2008-07-07 01:40:27 UTC (rev 13015) @@ -183,6 +183,7 @@ projectviewer.error.save.title=Error saving {0} projectviewer.error.project_str=project projectviewer.error.project_list_str=project list +projectviewer.error.project_locked=Project is currently locked; try action later. projectviewer.node_properties_dlg.title=Node Properties: {0} projectviewer.node_properties_dlg.close=Close Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2008-07-07 01:40:27 UTC (rev 13015) @@ -756,7 +756,13 @@ // close old project if (treeRoot != null && !n.isNodeDescendant(treeRoot)) { if (treeRoot.isProject()) { - closeProject((VPTProject) treeRoot, false); + VPTProject p = (VPTProject) treeRoot; + if (p.tryLock()) { + closeProject(p, false); + p.unlock(); + } else { + setStatus(jEdit.getProperty("projectviewer.error.project_locked")); + } } else { closeGroup((VPTGroup)treeRoot, n, false); } Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2008-07-07 01:40:27 UTC (rev 13015) @@ -89,6 +89,7 @@ String lookupPath = null; VPTProject proj = null; + VPTProject lockedProj = null; String oldName = null; String oldRoot = null; @@ -132,9 +133,15 @@ } } - boolean add = forceNew | (proj == null); + boolean add = forceNew || (proj == null); VPTGroup oldParent = (proj != null) ? ((VPTGroup) proj.getParent()) : null; + + if (!add && !proj.tryLock()) { + viewer.setStatus(jEdit.getProperty("projectviewer.error.project_locked")); + return; + } + lockedProj = proj; proj = ProjectOptions.run(proj, parent, lookupPath); if (proj != null) { @@ -142,6 +149,7 @@ ProjectManager.getInstance().addProject(proj, parent); ProjectViewer.setActiveNode(jEdit.getActiveView(), proj); RootImporter ipi = new RootImporter(proj, null, viewer, jEdit.getActiveView()); + ipi.setLockProject(false); ipi.doImport(); } else { if (!proj.getName().equals(oldName)) { @@ -157,6 +165,7 @@ } else { ipi = new RootImporter(proj, null, viewer, jEdit.getActiveView()); } + ipi.setLockProject(false); ipi.doImport(); } ProjectManager.getInstance().saveProject(proj); @@ -182,6 +191,9 @@ } } + if (lockedProj != null) { + lockedProj.unlock(); + } } //}}} //{{{ prepareForNode(VPTNode) method Modified: plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/projectviewer/action/NodeRemoverAction.java 2008-07-07 01:40:27 UTC (rev 13015) @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.awt.event.ActionEvent; @@ -78,7 +79,7 @@ //{{{ Instance variables private Map<VPTProject, List<VPTFile>> removedFiles; - private HashSet changed; + private Set<VPTNode> changed; private boolean delete; //}}} @@ -92,8 +93,11 @@ //{{{ +actionPerformed(ActionEvent) : void /** Try to remove nodes from the project, asking when necessary. */ public void actionPerformed(ActionEvent e) { + int idx = 0; JTree tree = viewer.getCurrentTree(); - changed = new HashSet(); + List<VPTProject> projects = new ArrayList<VPTProject>(); + List<VPTNode> nodes = new ArrayList<VPTNode>(); + changed = new HashSet<VPTNode>(); switch (tree.getSelectionCount()) { case 0: @@ -102,39 +106,67 @@ case 1: { // Single selection! - remove((VPTNode)tree.getLastSelectedPathComponent(), true); + nodes.add((VPTNode)tree.getLastSelectedPathComponent()); break; } - default: { + default: + // Any other thing == multiple selection if (confirmAction(MULTI)) { - // Any other thing == multiple selection - ArrayList sel = getSelectedArtifacts(tree.getSelectionPaths()); - for (Iterator i = sel.iterator(); i.hasNext(); ) { - remove((VPTNode) i.next(), false); - } + getSelectedArtifacts(tree.getSelectionPaths(), nodes); } - } } - ArrayList projects = new ArrayList(); - for (Iterator i = changed.iterator(); i.hasNext(); ) { - VPTNode next = (VPTNode) i.next(); - if (next.isRoot()) { - ProjectViewer.nodeStructureChangedFlat(next); - } else { - VPTProject p = VPTNode.findProjectFor(next); + // Find all projets related to the nodes being removed. + for (VPTNode n : nodes) { + if (!n.isGroup()) { + VPTProject p = VPTNode.findProjectFor(n); if (!projects.contains(p)) { - ProjectViewer.nodeStructureChangedFlat(p); projects.add(p); } } } - if (removedFiles != null) - for (VPTProject p : removedFiles.keySet()) { - List<VPTFile> lst = (List<VPTFile>) removedFiles.get(p); - p.fireFilesChanged(null, lst); + try { + // First, make sure we have the locks for all project + // being modified. + for (idx = 0; idx < projects.size(); idx++) { + if (!projects.get(idx).tryLock()) { + throw new IllegalStateException(); + } + } + + // Remove the nodes. + for (VPTNode n : nodes) { + remove(n, nodes.size() == 1); + } + + // Notify changes. + List<VPTProject> notified = new ArrayList<VPTProject>(); + for (VPTNode n : changed) { + if (n.isGroup()) { + ProjectViewer.nodeStructureChangedFlat(n); + } else { + VPTProject p = VPTNode.findProjectFor(n); + if (!notified.contains(p)) { + ProjectViewer.nodeStructureChangedFlat(p); + notified.add(p); + } + } + } + + if (removedFiles != null) + for (VPTProject p : removedFiles.keySet()) { + List<VPTFile> lst = removedFiles.get(p); + p.fireFilesChanged(null, lst); + } + } catch (IllegalStateException ise) { + viewer.setStatus(jEdit.getProperty("projectviewer.error.project_locked")); + } finally { + // Unlock the projects that were locked. + for (; idx > 0; idx--) { + projects.get(idx - 1).unlock(); + } } // cleanup @@ -199,15 +231,16 @@ } } //}}} - //{{{ -getSelectedArtifacts(TreePath[]) : ArrayList + /** * Receives a collection of TreePath objects and returns the underlying * objects selected, removing a child when its parent has also been * selected. */ - private ArrayList getSelectedArtifacts(TreePath[] paths) { + private void getSelectedArtifacts(TreePath[] paths, + List<VPTNode> nodes) + { TreePath last = null; - ArrayList objs = new ArrayList(); for (int i = 0; i < paths.length; i++) { if (last != null && !last.isDescendant(paths[i])) { @@ -216,12 +249,11 @@ if (last == null) { last = paths[i]; - objs.add(paths[i].getLastPathComponent()); + nodes.add((VPTNode) paths[i].getLastPathComponent()); } } + } - return objs; - } //}}} //{{{ -confirmAction(int) : boolean /** Modified: plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/projectviewer/importer/AutoReimporter.java 2008-07-07 01:40:27 UTC (rev 13015) @@ -43,8 +43,6 @@ /* Config keys. */ private static final String AR_ROOT = "projectviewer.auto_reimport"; - public static final String AR_CFG_PERIOD = AR_ROOT + ".period"; - public static final String AR_CFG_CURR_ONLY = AR_ROOT + ".current_dirs"; /** Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2008-07-07 01:40:27 UTC (rev 13015) @@ -36,6 +36,7 @@ import javax.swing.tree.DefaultTreeModel; import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.io.VFS; import org.gjt.sp.jedit.io.VFSFile; import org.gjt.sp.jedit.io.VFSManager; @@ -83,6 +84,7 @@ protected VPTNode selected; protected VPTProject project; private boolean noThread; + private boolean lockProject; /** The list of added files, if any, for event firing purposes. */ protected ArrayList added; @@ -117,6 +119,7 @@ this.viewer = viewer; this.noThread = noThread; this.postAction = null; + this.lockProject = true; } //}}} //{{{ +Importer(VPTNode, ProjectViewer) : <init> @@ -130,7 +133,12 @@ * so that the UI is not blocked during the process, which can take some * time for large numbers of files. */ - public void doImport() { + public final void doImport() { + if (lockProject && !project.tryLock()) { + setViewStatus("projectviewer.error.project_locked"); + return; + } + if (noThread) { setViewerEnabled(false); run(); @@ -140,6 +148,23 @@ } } //}}} + + /** + * Tells the importer whether to lock the project while doing the + * import. If not locking, the caller is responsible for locking + * the project so other tasks are notified that the project is + * being modified. + * + * @param lock Whether to lock the project before importing. + * + * @since PV 3.0.0 + */ + public void setLockProject(boolean lock) + { + this.lockProject = lock; + } + + //{{{ #importNode(VPTNode, VPTNode) : void /** * Imports a child into the given parent. @@ -179,6 +204,8 @@ * This is called after {@link #internalDoImport()} is invoked, so * implementations can clean up any internal state. Default implementation * does nothing. + * + * @since PV 3.0.0 */ protected void cleanup() { @@ -232,8 +259,12 @@ VFS vfs; VFSFile file; - assert path.startsWith(root.getNodePath()) : - "Path not under root: " + path + " (root = " + root.getNodePath() + ")"; + if (!path.startsWith(root.getNodePath())) { + Log.log(Log.ERROR, this, + "Path not under root: " + path + + " (root = " + root.getNodePath() + ")"); + return null; + } if (path.endsWith(File.separator)) { path = path.substring(0, path.length() - File.separator.length()); @@ -252,14 +283,15 @@ while (!path.equals(rootPath)) { dirs.push(path); path = vfs.getParentOfPath(path); + /* * VFS.getParentOfPath() returns paths with a trailing slash... * BTW, it's interesting that it uses "File.separatorChar" * when all this is supposed to be URL-based. */ - if (path.endsWith(File.separator)) { - path = path.substring(0, path.length() - File.separator.length()); - } + if (path.endsWith(File.separator)) { + path = path.substring(0, path.length() - File.separator.length()); + } } while (!dirs.isEmpty()) { @@ -332,48 +364,45 @@ //{{{ #setViewerEnabled(boolean) : void protected void setViewerEnabled(final boolean flag) { if (viewer != null) { - final ProjectViewer fviewer = viewer; PVActions.swingInvoke( new Runnable() { - //{{{ +run() : void public void run() { - if (!flag) - viewer.setStatus(jEdit.getProperty("projectviewer.import.wait_msg")); - fviewer.setEnabled(flag); - } //}}} + if (!flag) { + setViewStatus("projectviewer.import.wait_msg"); + } + viewer.setEnabled(flag); + } } ); } } //}}} //{{{ +run() : void - public void run() { + public final void run() { boolean error = false; setViewerEnabled(false); try { final Collection c = internalDoImport(); cleanup(); - if (c != null && c.size() > 0) { - PVActions.swingInvoke(new Runnable() { + PVActions.swingInvoke( + new Runnable() { public void run() { - for (Iterator i = c.iterator(); i.hasNext(); ) { - VPTNode n = (VPTNode) i.next(); - importNode(n); + if (c != null && c.size() > 0) { + for (Iterator i = c.iterator(); i.hasNext(); ) { + VPTNode n = (VPTNode) i.next(); + importNode(n); + } + ProjectViewer.nodeStructureChangedFlat(project); + fireProjectEvent(); + } else if (fireEvent) { + if ((added != null && added.size() > 0) || + (removed != null && removed.size() > 0)) { + fireProjectEvent(); + } } - ProjectViewer.nodeStructureChangedFlat(project); - fireProjectEvent(); } - }); - } else if (fireEvent) { - if ((added != null && added.size() > 0) || - (removed != null && removed.size() > 0)) { - PVActions.swingInvoke(new Runnable() { - public void run() { - fireProjectEvent(); - } - }); } - } + ); ProjectManager.getInstance().saveProject(project); } catch (RuntimeException e) { error = true; @@ -381,6 +410,9 @@ } finally { if (postAction == null || error) setViewerEnabled(true); + if (lockProject) { + project.unlock(); + } } if (postAction != null) SwingUtilities.invokeLater(new PostActionWrapper()); @@ -433,6 +465,28 @@ } + /** + * Sets a message in the view's status bar. + * + * @param msgKey jEdit property key, or message to be displayed. + * + * @since PV 3.0.0 + */ + protected void setViewStatus(final String msgKey) + { + PVActions.swingInvoke( + new Runnable() { + public void run() { + String msg = jEdit.getProperty(msgKey, msgKey); + View v = (viewer != null) ? viewer.getView() + : jEdit.getActiveView(); + v.getStatus().setMessageAndClear(msg); + } + } + ); + } + + //{{{ #class ShowNode /** Makes sure a node is visible. */ protected class ShowNode implements Runnable { Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java 2008-07-06 18:46:02 UTC (rev 13014) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTProject.java 2008-07-07 01:40:27 UTC (rev 13015) @@ -29,6 +29,8 @@ import java.util.Properties; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; + import javax.swing.Icon; import org.gjt.sp.jedit.jEdit; @@ -61,6 +63,7 @@ private String rootPath; private String url; private Properties properties; + private AtomicBoolean lock; protected Map<String,VPTNode> openableNodes; @@ -74,6 +77,7 @@ openFiles = new ArrayList(); properties = new Properties(); filterList = Collections.EMPTY_LIST; + lock = new AtomicBoolean(false); } //}}} @@ -298,6 +302,37 @@ return filterList; } //}}} + + /** + * "Locks" the project. All tasks that need to perform destructive + * operations on the project (like changing settings, importing + * files, etc) should first try to lock the object. If the project + * is already locked, the task should fail (either retry later, or + * error out). + * + * The lock ownership is not enforced: anyone can call + * {@link #unlock()} to unlock the project (or simply ignore locks). + * That's obviously not encouraged. + * + * @return Whether the project was successfully locked by the caller. + */ + public boolean tryLock() + { + return lock.compareAndSet(false, true); + } + + + /** + * Unlocks the project. + * + * @see #tryLock() + */ + public void unlock() + { + lock.set(false); + } + + //{{{ +fireFilesChanged(ArrayList, ArrayList) : void /** * Notifies the listeners that a group of files has been added to and/or This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2007-03-27 03:45:00
|
Revision: 9220 http://svn.sourceforge.net/jedit/?rev=9220&view=rev Author: vanza Date: 2007-03-26 20:44:56 -0700 (Mon, 26 Mar 2007) Log Message: ----------- - Fix an NPE in project manager. - Fix a deadlock when creating new projects. Modified Paths: -------------- plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-03-27 03:12:28 UTC (rev 9219) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-03-27 03:44:56 UTC (rev 9220) @@ -16,6 +16,12 @@ * CHANGELOG version: $Id$ */ +Version 2.1.3.7: + [marcelo vanzin] + - fix NPE in ProjectManager.removeProject() + - fix deadlock when creating new project + + Version 2.1.3.6: [marcelo vanzin] - don't ignore errors when ProjectManager is starting up; that way, Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-03-27 03:12:28 UTC (rev 9219) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-03-27 03:44:56 UTC (rev 9220) @@ -311,15 +311,15 @@ Entry e = (Entry) projects.get(p.getName()); if (e == null) return; - synchronized (e) { - if (e.fileName != null) { - new File(ProjectPlugin.getResourcePath("projects/" + e.fileName)).delete(); - // project list changed, save "global" data. - saveProjectList(); - } - projects.remove(p.getName()); + projects.remove(p.getName()); + ProjectViewer.projectRemoved(this, p); + + if (e.fileName != null) { + new File(ProjectPlugin.getResourcePath("projects/" + e.fileName)).delete(); + // project list changed, save "global" data. + saveProjectList(); } - ProjectViewer.projectRemoved(this, p); + p.removeAllChildren(); // for the GC fireDynamicMenuChange(); } //}}} Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-03-27 03:12:28 UTC (rev 9219) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2007-03-27 03:44:56 UTC (rev 9220) @@ -153,9 +153,9 @@ if (add) { ProjectManager.getInstance().addProject(proj, parent); + ProjectViewer.setActiveNode(jEdit.getActiveView(), proj); RootImporter ipi = new RootImporter(proj, null, viewer, jEdit.getActiveView()); ipi.doImport(); - ProjectViewer.setActiveNode(jEdit.getActiveView(), proj); } else { if (!proj.getName().equals(oldName)) { ProjectManager.getInstance().renameProject(oldName, proj.getName()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2007-07-08 00:39:37
|
Revision: 9945 http://svn.sourceforge.net/jedit/?rev=9945&view=rev Author: vanza Date: 2007-07-07 17:39:35 -0700 (Sat, 07 Jul 2007) Log Message: ----------- - use jEdit's service framework for PV extensions. - port the context menu actions to use the new framework. Modified Paths: -------------- plugins/ProjectViewer/trunk/actions.xml plugins/ProjectViewer/trunk/build.xml plugins/ProjectViewer/trunk/docs/CHANGELOG plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java plugins/ProjectViewer/trunk/pvdebug/PVDebugPlugin.props Added Paths: ----------- plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java plugins/ProjectViewer/trunk/pvdebug/services.xml Modified: plugins/ProjectViewer/trunk/actions.xml =================================================================== --- plugins/ProjectViewer/trunk/actions.xml 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/actions.xml 2007-07-08 00:39:35 UTC (rev 9945) @@ -71,7 +71,7 @@ <ACTION NAME="projectviewer_set-active"> <CODE> - p = projectviewer.ProjectViewer.getProjectViewer(view); + p = projectviewer.ProjectViewer.getViewer(view); if (p == null) return; n = p.getSelectedNode(); if (n == null) return; Modified: plugins/ProjectViewer/trunk/build.xml =================================================================== --- plugins/ProjectViewer/trunk/build.xml 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/build.xml 2007-07-08 00:39:35 UTC (rev 9945) @@ -79,9 +79,9 @@ <fileset dir="${build.classes}"> <include name="pvdebug/**.*" /> </fileset> - <fileset dir="${basedir}"> - <include name="pvdebug/**.*" /> - <exclude name="**/*.java" /> + <fileset dir="${basedir}/pvdebug"> + <include name="*.*" /> + <exclude name="*.java" /> </fileset> </jar> </target> Modified: plugins/ProjectViewer/trunk/docs/CHANGELOG =================================================================== --- plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/docs/CHANGELOG 2007-07-08 00:39:35 UTC (rev 9945) @@ -24,8 +24,13 @@ - Get rid of the old listener-based event notification system, reorganize the events into newer classes, and use the EditBus to send events. + - Use jEdit's service framework to register extensions to PV. + This will be used for all extensions except option panes, + since those work differently inside jEdit and we'd like to + reuse as much code from the core as possible. + ================================================================================ Version 2.1.3.7: Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectPlugin.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -36,7 +36,6 @@ import org.gjt.sp.jedit.EditPlugin; import org.gjt.sp.jedit.OperatingSystem; import org.gjt.sp.jedit.msg.PluginUpdate; -import org.gjt.sp.jedit.msg.PropertiesChanged; import org.gjt.sp.jedit.msg.ViewUpdate; import org.gjt.sp.util.Log; @@ -44,6 +43,7 @@ import projectviewer.vpt.VPTContextMenu; import projectviewer.vpt.VPTNode; +import projectviewer.config.ExtensionManager; import projectviewer.config.ProjectViewerConfig; import projectviewer.persist.ProjectPersistenceManager; //}}} @@ -119,32 +119,20 @@ //{{{ +start() : void /** Start the plugin. */ public void start() { - // work around for brokenness in JDK 1.4 - if (OperatingSystem.hasJava14() && !OperatingSystem.hasJava15() - && System.getProperty("org.xml.sax.driver") == null) - { - System.setProperty("org.xml.sax.driver", - "org.apache.crimson.parser.XMLReaderImpl"); - } - File f = new File(getResourcePath("projects/null")); if (!f.getParentFile().exists()) { if (!f.getParentFile().mkdirs()) { Log.log(Log.ERROR, this, "Cannot create config directory; ProjectViewer will not function properly."); } } - // check plugins that are already loaded + + /* + * set up a task to check any available extensions after + * jEdit is done loading. + */ SwingUtilities.invokeLater(new Runnable() { public void run() { - EditPlugin[] plugins = jEdit.getPlugins(); - for (int i = 0; i < plugins.length; i++) { - // create a "fake" PluginUpdate message - PluginUpdate msg = - new PluginUpdate(plugins[i].getPluginJAR(), - PluginUpdate.LOADED, - false); - checkPluginUpdate(msg); - } + ExtensionManager.getInstance().reloadExtensions(); } }); } //}}} @@ -173,9 +161,7 @@ /** Handles plugin load/unload messages in the EditBus. */ public void handleMessage(EBMessage msg) { if (msg instanceof PluginUpdate) { - checkPluginUpdate((PluginUpdate)msg); - } else if (msg instanceof PropertiesChanged) { - VPTContextMenu.userMenuChanged(); + ExtensionManager.getInstance().reloadExtensions(); } else if (msg instanceof ViewUpdate) { ViewUpdate vu = (ViewUpdate) msg; if (vu.getWhat() == ViewUpdate.CLOSED) { @@ -187,30 +173,5 @@ } } //}}} - //{{{ -checkPluginUpdate(PluginUpdate) : void - private void checkPluginUpdate(PluginUpdate msg) { - if (msg.getWhat() == PluginUpdate.LOADED) { - try { - ProjectViewer.addToolbarActions(msg.getPluginJAR()); - VPTContextMenu.registerActions(msg.getPluginJAR()); - ProjectPersistenceManager.loadNodeHandlers(msg.getPluginJAR()); - } catch (Exception e) { - Log.log(Log.WARNING, this, "Error loading PV extension, error follows."); - Log.log(Log.ERROR, this, e); - } catch (NoClassDefFoundError ncde) { - Log.log(Log.WARNING, this, "Error loading PV extension, error follows."); - Log.log(Log.ERROR, this, ncde); - } catch (ExceptionInInitializerError eiie) { - Log.log(Log.WARNING, this, "Error loading PV extension, error follows."); - Log.log(Log.ERROR, this, eiie); - } - } else if (msg.getWhat() == PluginUpdate.UNLOADED) { - ProjectManager.getInstance().unloadProjectProperties(); - ProjectViewer.removeToolbarActions(msg.getPluginJAR()); - VPTContextMenu.unregisterActions(msg.getPluginJAR()); - PVActions.cleanup(msg.getPluginJAR()); - } - } //}}} - } Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -138,64 +138,6 @@ actions.add(new OldStyleAddFileAction()); } //}}} - //{{{ Action Handling - - //{{{ +_registerAction(Action)_ : void - /** Adds an action to be shown on the toolbar. */ - public static void registerAction(Action action) { - actions.add(action); - actionsChanged(); - } //}}} - - //{{{ +_unregisterAction(Action)_ : void - /** Removes an action from the toolbar. */ - public static void unregisterAction(Action action) { - actions.remove(action); - actionsChanged(); - } //}}} - - //{{{ +_removeToolbarActions(PluginJAR)_ : void - /** - * Removes the project listeners of the given plugin from the list, and - * from any active project in ProjectViewer. - */ - public static void removeToolbarActions(PluginJAR jar) { - Collection removed = PVActions.prune(actions, jar); - if (removed != null) { - actionsChanged(); - } - } //}}} - - //{{{ +_addToolbarActions(PluginJAR)_ : void - /** - * Adds to the list of listeners for the given view the listeners that - * have been declared by the given plugin using properties. For global - * listeners, "view" should be null. - */ - public static void addToolbarActions(PluginJAR jar) { - if (jar.getPlugin() == null) return; - String list = jEdit.getProperty("plugin.projectviewer." + - jar.getPlugin().getClassName() + ".toolbar-actions"); - Collection aList = PVActions.listToObjectCollection(list, jar, Action.class); - if (aList != null && aList.size() > 0) { - actions.addAll(aList); - actionsChanged(); - } - } //}}} - - //{{{ -_actionsChanged()_ : void - /** Reloads the action list for the toolbar. */ - private static void actionsChanged() { - for (Iterator it = viewers.values().iterator(); it.hasNext(); ) { - ViewerEntry ve = (ViewerEntry) it.next(); - ProjectViewer v = ve.dockable; - if (v != null && v.toolBar != null) - v.populateToolBar(); - } - } //}}} - - //}}} - //{{{ +_getViewer(View)_ : ProjectViewer /** * Returns the viewer associated with the given view, or null if none @@ -1197,6 +1139,13 @@ return; } + if (evt.getPropertyName().equals(ProjectViewerConfig.USER_CONTEXT_MENU) || + evt.getPropertyName().equals(ProjectViewerConfig.USER_MENU_FIRST)) + { + treePanel.getContextMenu().userMenuChanged(); + return; + } + }//}}} //{{{ +run() : void Modified: plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/projectviewer/config/ContextOptionPane.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -62,8 +62,6 @@ import org.gjt.sp.util.StandardUtilities; import common.gui.OkCancelButtons; - -import projectviewer.vpt.VPTContextMenu; //}}} /** @@ -152,7 +150,7 @@ buttons.add(moveDown); showUserFirst = new JCheckBox(jEdit.getProperty("options.projectviewer.contextmenu.userfirst")); - showUserFirst.setSelected(jEdit.getBooleanProperty("projectviewer.contextmenu.userfirst")); + showUserFirst.setSelected(ProjectViewerConfig.getInstance().getUserMenuFirst()); buttons.add(showUserFirst); buttons.add(Box.createHorizontalStrut(6)); @@ -185,8 +183,7 @@ buf.append(((MenuItem)listModel.elementAt(i)).actionName); } ProjectViewerConfig.getInstance().setUserContextMenu(buf.toString()); - jEdit.setBooleanProperty("projectviewer.contextmenu.userfirst", showUserFirst.isSelected()); - VPTContextMenu.userMenuChanged(); + ProjectViewerConfig.getInstance().setUserMenuFirst(showUserFirst.isSelected()); } //}}} //{{{ updateButtons() method Added: plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -0,0 +1,138 @@ +/* + * :tabSize=4:indentSize=4:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * 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 2 + * of the License, or 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package projectviewer.config; + +import java.lang.ref.WeakReference; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.ServiceManager; + +/** + * A central location for managing ProjectViewer extensions (deployed + * as jEdit services). Allows for instantiation, cleanup, configuration + * for enabling/disabling extensions, etc. + * + * @author Marcelo Vanzin + * @since PV 3.0.0 + * @version $Id$ + */ +public class ExtensionManager +{ + + //{{{ Singleton + private static ExtensionManager instance = new ExtensionManager(); + + public static ExtensionManager getInstance() { + return instance; + } + //}}} + + private List<WeakReference<ManagedService>> services; + + private ExtensionManager() + { + services = new LinkedList<WeakReference<ManagedService>>(); + } + + /** Registers the given managed service with the manager. */ + public void register(ManagedService service) + { + services.add(new WeakReference<ManagedService>(service)); + service.updateExtensions(loadExtensions(service.getServiceClass())); + } + + /** Unregisters the given managed service. */ + public void unregister(ManagedService service) + { + for (Iterator<WeakReference<ManagedService>> it = services.iterator(); + it.hasNext(); ) { + WeakReference<ManagedService> ref = it.next(); + if (ref.get() == service || ref.get() == null) { + it.remove(); + break; + } + } + } + + /** + * Called by the PV plugin instance to refresh the extensions of + * all the currently registered managed services. + */ + public void reloadExtensions() + { + for (Iterator<WeakReference<ManagedService>> it = services.iterator(); + it.hasNext(); ) { + WeakReference<ManagedService> ref = it.next(); + if (ref.get() != null) { + System.err.println("updating managed service: " + ref.get().getClass().getName()); + ref.get().updateExtensions(loadExtensions(ref.get().getServiceClass())); + } else { + System.err.println("cleaning up gc'ed managed service"); + it.remove(); + } + } + } + + private List<Object> loadExtensions(Class clazz) + { + System.err.println("Getting extensions for: " + clazz.getName()); + String[] extensions = ServiceManager.getServiceNames(clazz.getName()); + List<Object> lst = null; + for (String ext : extensions) { + System.err.println("Found extension: " + ext); + // XXX: check if extension is disabled + Object svc = ServiceManager.getService(clazz.getName(), ext); + if (svc != null) { + if (lst == null) { + lst = new LinkedList<Object>(); + } + lst.add(svc); + } + } + return lst; + } + + /** + * Classes that use extensions should implement this interface + * and register themselves by calling + * {@link #register(ManagedService)}, to receive events about + * changes in the service configuration. + */ + public static interface ManagedService + { + + /** Returns the base class of the jEdit service. */ + public Class getServiceClass(); + + /** + * Notifies the instance that a new list of extensions has + * been created in response to some event (such as a plugin + * being loaded or unloaded). The instance should free the + * old extension list and use the new one. + */ + public void updateExtensions(List<Object> l); + + } + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java ___________________________________________________________________ Name: svn:keywords + Id Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectViewerConfig.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -50,10 +50,11 @@ * * <p>Note about property changing events: currently, these events are only * generated for the properties regarding the ProjectViewer GUI (that is, - * SHOW_TOOLBAR_OPT, SHOW_FOLDERS_OPT, SHOW_FILES_OPT and SHOW_WFILES_OPT). - * If the change of another property needs to be notified to someone, please - * include the call to the appropriate "firePropertyChanged" method is the - * setter methods of the property.</p> + * SHOW_TOOLBAR_OPT, SHOW_FOLDERS_OPT, SHOW_FILES_OPT, SHOW_WFILES_OPT, + * USER_CONTEXT_MENU and USER_MENU_FIRST).If the change of another + * property needs to be notified to someone, please include the call to + * the appropriate "firePropertyChanged" method is the setter methods + * of the property.</p> * * <p>Also of note is that these events are for internal ProjectViewer use * and are not meant to be used by other plugins interfacing with PV.</p> @@ -94,6 +95,7 @@ public static final String SHOW_TOOLBAR_OPT = "projectviewer.show_toolbar"; public static final String SHOW_WFILES_OPT = "projectviewer.show_working_files_tree"; + public static final String USER_MENU_FIRST = "projectviewer.contextmenu.userfirst"; public static final String USER_CONTEXT_MENU = "projectviewer.user_context_menu"; public static final int ASK_ALWAYS = 0; @@ -139,6 +141,7 @@ private String lastProject = null; private String browserPath = "mozilla"; + private boolean userMenuFirst = false; private String userContextMenu = null; private String lastInitVersion = null; @@ -320,6 +323,10 @@ setUseInfoViewer("true".equalsIgnoreCase(tmp)); } + // projectviewer.contextmenu.userfirst + tmp = props.getProperty(USER_MENU_FIRST); + userMenuFirst = "true".equalsIgnoreCase(tmp); + // projectviewer.user_context_menu tmp = props.getProperty(USER_CONTEXT_MENU); if (tmp != null) { @@ -517,9 +524,23 @@ } //}}} + //{{{ property userMenuFirst + public void setUserMenuFirst(boolean userMenuFirst) { + boolean oldValue = this.userMenuFirst; + this.userMenuFirst = userMenuFirst; + firePropertyChanged(USER_CONTEXT_MENU, oldValue, userMenuFirst); + } + + public boolean getUserMenuFirst() { + return userMenuFirst; + } + //}}} + //{{{ property userContextMenu public void setUserContextMenu(String userContextMenu) { + String oldMenu = this.userContextMenu; this.userContextMenu = userContextMenu; + firePropertyChanged(USER_CONTEXT_MENU, oldMenu, userContextMenu); } public String getUserContextMenu() { @@ -684,6 +705,7 @@ props.setProperty(BROWSER_PATH_OPT, String.valueOf(browserPath)); props.setProperty(BROWSER_USE_INFOVIEWER, String.valueOf(useInfoViewer)); + props.setProperty(USER_MENU_FIRST, String.valueOf(userMenuFirst)); if (userContextMenu != null) { props.setProperty(USER_CONTEXT_MENU, userContextMenu); } @@ -759,7 +781,9 @@ /** Fires and event when a property is changed. */ private void firePropertyChanged(String property, Object oldValue, Object newValue) { - if (!oldValue.equals(newValue) && listeners.size() > 0) { + if (((oldValue == null && newValue != null) || + (oldValue != null && newValue != null) || + !oldValue.equals(newValue)) && listeners.size() > 0) { PropertyChangeEvent evt = new PropertyChangeEvent(this,property,oldValue,newValue); for (Iterator i = listeners.iterator(); i.hasNext(); ) { Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/ProjectTreePanel.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -248,6 +248,13 @@ } } + /** + * Returns the context menu. + */ + public VPTContextMenu getContextMenu() + { + return contextMenu; + } //{{{ Tree notification methods Modified: plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/projectviewer/vpt/VPTContextMenu.java 2007-07-08 00:39:35 UTC (rev 9945) @@ -19,12 +19,7 @@ package projectviewer.vpt; //{{{ Imports -import java.util.Iterator; import java.util.ArrayList; -import java.util.Comparator; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.awt.Component; @@ -36,10 +31,8 @@ import javax.swing.tree.TreePath; import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.PluginJAR; import org.gjt.sp.jedit.GUIUtilities; -import projectviewer.PVActions; import projectviewer.ProjectViewer; import projectviewer.action.Action; @@ -58,7 +51,7 @@ import projectviewer.action.VFSFileImportAction; import projectviewer.action.OpenWithEncodingAction; -import projectviewer.config.AppLauncher; +import projectviewer.config.ExtensionManager; import projectviewer.config.ProjectViewerConfig; //}}} @@ -69,149 +62,68 @@ * @author Marcelo Vanzin * @version $Id$ */ -public class VPTContextMenu extends MouseAdapter { +public class VPTContextMenu extends MouseAdapter + implements ExtensionManager.ManagedService +{ - //{{{ Static Members - - private static final ArrayList actions = new ArrayList(); - private static final ArrayList intActions = new ArrayList(); - private static long lastMod = System.currentTimeMillis(); - - /** Initializes the internal action list. */ - static { - intActions.add(new EditProjectAction()); - intActions.add(new EditGroupAction(true)); - intActions.add(new EditGroupAction(false)); - intActions.add(new FileImportAction()); - intActions.add(new VFSFileImportAction()); - intActions.add(new ReimportAction()); - intActions.add(new NodeRemoverAction(false)); - intActions.add(new NodeRemoverAction(true)); - intActions.add(new NodeRenamerAction()); - intActions.add(new MoveNodeAction()); - intActions.add(new LaunchBrowserAction()); - intActions.add(new OpenWithAppAction()); - intActions.add(new OpenWithEncodingAction()); - intActions.add(new SearchAction()); - intActions.add(new ArchiveAction()); - } - - //{{{ +_registerAction(Action)_ : void - /** - * Adds an action to be shown on the context menu. Actions are shown in the - * same order as they are registered. - * - * @deprecated Use the property system to add context menu actions. - */ - public static void registerAction(Action action) { - actions.add(action); - sortMenu(); - lastMod = System.currentTimeMillis(); - } //}}} - - //{{{ +_unregisterAction(Action)_ : void - /** - * Removes an action from the context menu. - * - * @deprecated Use the property system to add context menu actions. - */ - public static void unregisterAction(Action action) { - actions.remove(action); - lastMod = System.currentTimeMillis(); - } //}}} - - //{{{ +_unregisterActions(PluginJAR)_ : void - /** Removes all actions from the given plugin. */ - public static void unregisterActions(PluginJAR jar) { - Collection removed = PVActions.prune(actions, jar); - if (removed != null) { - lastMod = System.currentTimeMillis(); - } - } //}}} - - //{{{ +_registerActions(PluginJAR)_ : void - /** Registers actions from the given plugin. */ - public static void registerActions(PluginJAR jar) { - if (jar.getPlugin() == null) return; - String list = jEdit.getProperty("plugin.projectviewer." + - jar.getPlugin().getClassName() + ".context-menu-actions"); - Collection aList = PVActions.listToObjectCollection(list, jar, Action.class); - if (aList != null && aList.size() > 0) { - actions.addAll(aList); - sortMenu(); - lastMod = System.currentTimeMillis(); - } - } //}}} - - //{{{ +_userMenuChanged()_ : void - /** Updates "lastMod" so that the menu is rebuilt at the next invocation. */ - public static void userMenuChanged() { - lastMod = System.currentTimeMillis(); - } //}}} - - //{{{ -_sortMenu()_ : void - /** Sorts the menu in alphabetical order. */ - private static void sortMenu() { - class ActionComparer implements Comparator { - - public int compare(Object o1, Object o2) { - return ((Action)o1).getText().compareTo( - ((Action)o2).getText()); - } - - } - Collections.sort(actions, new ActionComparer()); - } //}}} - - //}}} - - //{{{ Instance Variables private final ProjectViewer viewer; - private final AppLauncher appList; - private final JPopupMenu popupMenu; - private final List internalActions; - private final List separators; - private long pmLastBuilt; - //}}} + private final JPopupMenu popupMenu; + private final List<Action> intActions; + private final List<Action> extActions; + private final List<Action> separators; - //{{{ +VPTContextMenu(ProjectViewer) : <init> - /** * Constructs a listener that will ask the provided viewer instance for * information about the nodes clicked. */ - public VPTContextMenu(ProjectViewer viewer) { + public VPTContextMenu(ProjectViewer viewer) + { this.viewer = viewer; - appList = AppLauncher.getInstance(); - internalActions = new ArrayList(); - separators = new LinkedList(); + intActions = new ArrayList<Action>(); + extActions = new ArrayList<Action>(); + separators = new ArrayList<Action>(); popupMenu = new JPopupMenu(); - loadGUI(); - } - //}}} + addAction(new EditProjectAction(), true); + addAction(new EditGroupAction(true), false); + addAction(new EditGroupAction(false), true); + addAction(new FileImportAction(), false); + addAction(new VFSFileImportAction(), false); + addAction(new ReimportAction(), false); + addAction(new NodeRemoverAction(false), false); + addAction(new NodeRemoverAction(true), false); + addAction(new NodeRenamerAction(), true); + addAction(new MoveNodeAction(), false); + addAction(new LaunchBrowserAction(), false); + addAction(new OpenWithAppAction(), false); + addAction(new OpenWithEncodingAction(), false); + addAction(new SearchAction(), false); + addAction(new ArchiveAction(), false); - //{{{ Event Handling + /* Separator for the list of external actions added to the menu. */ + ActionSeparator sep = new ActionSeparator(); + separators.add(sep); + sep.setLinkedActions(extActions); + popupMenu.add(sep.getMenuItem()); - //{{{ +mousePressed(MouseEvent) : void + ExtensionManager.getInstance().register(this); + } + /** Context-menus are shown on the "pressed" event. */ - public void mousePressed(MouseEvent me) { + public void mousePressed(MouseEvent me) + { handleMouseEvent(me); - } //}}} + } - //{{{ +mouseReleased(MouseEvent) : void /** Context-menus are shown on the "pressed" event. */ - public void mouseReleased(MouseEvent me) { + public void mouseReleased(MouseEvent me) + { handleMouseEvent(me); - } //}}} + } - //}}} - - //{{{ Private Methods - - //{{{ -handleMouseEvent(MouseEvent) : void /** Handles the mouse event internally. */ - private void handleMouseEvent(MouseEvent me) { + private void handleMouseEvent(MouseEvent me) + { if (!viewer.isEnabled()) return; if (me.isPopupTrigger()) { @@ -225,112 +137,110 @@ } } if (tree.getSelectionCount() != 0) { - prepareMenu( tree.getSelectionCount() > 1 ? null : viewer.getSelectedNode() ); + VPTNode n = tree.getSelectionCount() > 1 ? null : viewer.getSelectedNode(); + for (Action a : intActions) { + a.prepareForNode(n); + } + for (Action a : extActions) { + a.prepareForNode(n); + } + for (Action a : separators) { + a.prepareForNode(n); + } popupMenu.show(me.getComponent(), me.getX(), me.getY()); } } - } //}}} + } - //{{{ -loadGUI() : void - /** Constructs the menus' GUI. */ - private void loadGUI() { - internalActions.clear(); - popupMenu.removeAll(); + /** + * Called when the user context menu (or a config option related to + * that menu) has changed. + */ + public void userMenuChanged() + { + updateExtensions(new ArrayList(extActions)); + } - Action a; + /** + * ManagedService implementation. + * + * @since PV 3.0.0 + */ + public Class getServiceClass() + { + return Action.class; + } - for (Iterator it = intActions.iterator(); it.hasNext(); ) { - a = (Action) it.next(); - a = (Action) a.clone(); - a.setViewer(viewer); - internalActions.add(a); - popupMenu.add(a.getMenuItem()); + /** + * ManagedService implementation. + * + * @since PV 3.0.0 + */ + public void updateExtensions(List<Object> l) + { + ProjectViewerConfig cfg = ProjectViewerConfig.getInstance(); - // hacks to add some separators to the menu... - if (a instanceof EditProjectAction) { - ActionSeparator as = new ActionSeparator(); - as.setLinkedAction(a); - as.setViewer(viewer); - separators.add(as); - popupMenu.add(as.getMenuItem()); - } + extActions.clear(); + popupMenu.removeAll(); - if (a instanceof NodeRenamerAction) { - ActionSeparator as = new ActionSeparator(); - as.setViewer(viewer); - separators.add(as); - popupMenu.add(as.getMenuItem()); - } + for (Action a : intActions) { + popupMenu.add(a.getMenuItem()); + } + if (l != null && l.size() > 0) { + for (Object _a : l) { + Action a = (Action) _a; + a = (Action) a.clone(); + a.setViewer(viewer); + extActions.add(a); + popupMenu.add(a.getMenuItem()); + } } + /* Insert the user-defined context menu items into the popup menu. */ String menu = ProjectViewerConfig.getInstance().getUserContextMenu(); - boolean usersFirst =jEdit.getBooleanProperty("projectviewer.contextmenu.userfirst"); if (menu != null) { jEdit.setTemporaryProperty("projectviewer.tmp_menu", menu); - JPopupMenu pm = GUIUtilities.loadPopupMenu("projectviewer.tmp_menu"); - Component[] userActions = pm.getComponents(); + JPopupMenu userMenu = GUIUtilities.loadPopupMenu("projectviewer.tmp_menu"); + jEdit.unsetProperty("projectviewer.tmp_menu"); + Component[] userActions = userMenu.getComponents(); + if (userActions != null && userActions.length > 0) { + int i = 0; - if (!usersFirst) popupMenu.addSeparator(); - int i=0; + if (!cfg.getUserMenuFirst()) { + popupMenu.addSeparator(); + } + for (i = 0; i < userActions.length; i++) { - if (usersFirst) { + if (cfg.getUserMenuFirst()) { popupMenu.insert(userActions[i], i); } else { popupMenu.add(userActions[i]); } } - if (usersFirst) popupMenu.insert(new JPopupMenu.Separator(), i++); - } - } - if (actions.size() > 0) { - List linkedActions = new ArrayList(); - ActionSeparator sep = new ActionSeparator(); - - separators.add(sep); - sep.setLinkedActions(linkedActions); - popupMenu.add(sep.getMenuItem()); - - for (Iterator it = actions.iterator(); it.hasNext(); ) { - a = (Action) it.next(); - a = (Action) a.clone(); - linkedActions.add(a); - a.setViewer(viewer); - internalActions.add(a); - popupMenu.add(a.getMenuItem()); + if (cfg.getUserMenuFirst()) { + popupMenu.insert(new JPopupMenu.Separator(), i++); + } } } - pmLastBuilt = System.currentTimeMillis(); - } //}}} + } - //{{{ -prepareMenu(VPTNode) : void - /** - * Prepares the context menu for the given node. Shows only menu items - * that are allowed for the node (e.g., "Add Project" only applies for - * the root node). If the node is null, the method guesses that multiple - * nodes are selected, and chooses the appropriate entries. - */ - private void prepareMenu(VPTNode selectedNode) { + private void addAction(Action a, boolean addSep) + { + a.setViewer(viewer); + intActions.add(a); - if (pmLastBuilt < lastMod) { - loadGUI(); + if (addSep) { + ActionSeparator as = new ActionSeparator(); + as.setLinkedAction(a); + as.setViewer(viewer); + intActions.add(as); + separators.add(as); } + } - for (Iterator it = internalActions.iterator(); it.hasNext(); ) { - ((Action)it.next()).prepareForNode(selectedNode); - } - - // need to prepare the separators last since they might refer - // to items added after them. - for (Iterator it = separators.iterator(); it.hasNext(); ) { - ((Action)it.next()).prepareForNode(selectedNode); - } - } //}}} - - //}}} - } Modified: plugins/ProjectViewer/trunk/pvdebug/PVDebugPlugin.props =================================================================== --- plugins/ProjectViewer/trunk/pvdebug/PVDebugPlugin.props 2007-07-07 23:30:10 UTC (rev 9944) +++ plugins/ProjectViewer/trunk/pvdebug/PVDebugPlugin.props 2007-07-08 00:39:35 UTC (rev 9945) @@ -13,11 +13,6 @@ #{{{ Debug -plugin.projectviewer.pvdebug.PVDebugPlugin.prj-listeners=pvdebug.ProjectEventDumper -plugin.projectviewer.pvdebug.PVDebugPlugin.global-pv-listeners=pvdebug.ProjectViewerEventDumper -plugin.projectviewer.pvdebug.PVDebugPlugin.toolbar-actions=pvdebug.DummyAction -plugin.projectviewer.pvdebug.PVDebugPlugin.context-menu-actions=pvdebug.DummyAction - plugin.projectviewer.pvdebug.PVDebugPlugin.option-pane=dummy options.dummy.code=new pvdebug.DummyOptionPane("dummy"); options.dummy.label=Dummy Added: plugins/ProjectViewer/trunk/pvdebug/services.xml =================================================================== --- plugins/ProjectViewer/trunk/pvdebug/services.xml (rev 0) +++ plugins/ProjectViewer/trunk/pvdebug/services.xml 2007-07-08 00:39:35 UTC (rev 9945) @@ -0,0 +1,10 @@ +<?xml version="1.0"?> + +<!DOCTYPE SERVICES SYSTEM "services.dtd"> + +<SERVICES> + <SERVICE CLASS="projectviewer.action.Action" NAME="PVDebug Dummy Action"> + new pvdebug.DummyAction(); + </SERVICE> +</SERVICES> + Property changes on: plugins/ProjectViewer/trunk/pvdebug/services.xml ___________________________________________________________________ Name: svn:keywords + Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |