From: <va...@us...> - 2009-03-30 05:52:39
|
Revision: 14866 http://jedit.svn.sourceforge.net/jedit/?rev=14866&view=rev Author: vanza Date: 2009-03-30 05:52:34 +0000 (Mon, 30 Mar 2009) Log Message: ----------- Refactor the project options code in ProjectViewer: . clean up the ProjectOptions class: there's now a single run() method, with a simplified argument list; no more static variables or synchronized methods. . create a new "OptionsService" class to retrieve option panes and groups from plugins. This allows for easy configurability of available option extensions in PV's options, and avoids the ugly overloading of the option pane properties by using a cleaner approach (services.xml). . make VersionControlService extend OptionsService, so that version control plugins provide option panes to PV using the same API. Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectFilterPane.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java plugins/ProjectViewer/trunk/projectviewer/config/VersionControlService.java Added Paths: ----------- plugins/ProjectViewer/trunk/projectviewer/config/OptionsService.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2009-03-30 05:52:34 UTC (rev 14866) @@ -37,7 +37,7 @@ options.projectviewer.optiongroup.external_apps.label=External Applications options.projectviewer.optiongroup.external_apps.code=new projectviewer.config.ProjectAppConfigPane(); options.projectviewer.optiongroup.filter.label=Filtered view -options.projectviewer.optiongroup.filter.code=new projectviewer.config.ProjectFilterPane(); +options.projectviewer.optiongroup.filter.code=new projectviewer.config.ProjectFilterPane(null); options.projectviewer.optiongroup.extensions.label=Extensions options.projectviewer.optiongroup.extensions.code=new projectviewer.config.ExtensionConfigPane(); @@ -385,6 +385,7 @@ projectviewer.extensions.custom_nodes=Custom Node Types projectviewer.extensions.file_filters=File Filters projectviewer.extensions.node_props=Node Properties +projectviewer.extensions.option_panes=Option Panes projectviewer.extensions.version_control=Version Control #}}} Modified: plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/projectviewer/action/EditProjectAction.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -86,8 +86,6 @@ /** Creates a new project. */ public void actionPerformed(ActionEvent e) { VPTNode selected = null; - String lookupPath = null; - VPTProject proj = null; VPTProject lockedProj = null; String oldName = null; @@ -111,12 +109,8 @@ if (!forceNew) { if (viewer != null) { selected = viewer.getSelectedNode(); - if (selected != null) { - lookupPath = selected.getNodePath(); - } else { - selected = viewer.getRoot(); - if (lookupPath == null && selected.isProject()) - lookupPath = selected.getNodePath(); + if (selected.isGroup()) { + parent = (VPTGroup) selected; } proj = VPTNode.findProjectFor(selected); } else { @@ -142,8 +136,9 @@ return; } lockedProj = proj; - proj = ProjectOptions.run(proj, parent, lookupPath); + proj = ProjectOptions.run(proj, proj == null, parent); + if (proj != null) { if (add) { ProjectManager.getInstance().addProject(proj, parent); Modified: plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/projectviewer/config/ExtensionManager.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -64,6 +64,8 @@ "file_filters")); dummyServices.add(new DummyManagedService(VersionControlService.class, "version_control")); + dummyServices.add(new DummyManagedService(OptionsService.class, + "option_panes")); } /** Added: plugins/ProjectViewer/trunk/projectviewer/config/OptionsService.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/OptionsService.java (rev 0) +++ plugins/ProjectViewer/trunk/projectviewer/config/OptionsService.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -0,0 +1,63 @@ +/* + * :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 org.gjt.sp.jedit.OptionGroup; +import org.gjt.sp.jedit.OptionPane; + +import projectviewer.vpt.VPTProject; + + +/** + * Defines the service for showing custom options panes when editing a + * project. + * + * @author Marcelo Vanzin + * @since PV 3.0.0 + * @version $Id$ + */ + +public interface OptionsService +{ + + /** + * This method should return the option pane to be shown. As with + * regular jEdit option panes, the label to be shown in the dialog + * should be defined by the "option.[pane_name].label" property. + * + * @param proj The project that will be edited. + * + * @return An OptionPane instance, or null for no option pane. + */ + public OptionPane getOptionPane(VPTProject proj); + + + /** + * This should return an OptionGroup to be shown. As with regular + * jEdit option groups, the label to be shown in the dialog + * should be defined by the "option.[group_name].label" property. + * + * @param proj The project that will be edited. + * + * @return An OptionGroup instance, or null for no option group. + */ + public OptionGroup getOptionGroup(VPTProject proj); + +} + Property changes on: plugins/ProjectViewer/trunk/projectviewer/config/OptionsService.java ___________________________________________________________________ Added: svn:keywords + Id Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectFilterPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectFilterPane.java 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectFilterPane.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -87,12 +87,14 @@ private FilterTabelModel model; private int editingRow; + private VPTProject proj; //}}} - ProjectFilterPane() + ProjectFilterPane(VPTProject proj) { super("projectviewer.optiongroup.filter", "projectviewer.filterconfig"); + this.proj = proj; } //{{{ #_init() : void @@ -169,10 +171,10 @@ gbc.fill = GridBagConstraints.BOTH; // load global filter list - if (ProjectOptions.getProject() == null) { + if (proj == null) { model = new FilterTabelModel(ProjectManager.getInstance().getGlobalFilterList()); } else { - model = new FilterTabelModel(ProjectOptions.getProject().getFilterList()); + model = new FilterTabelModel(proj.getFilterList()); } filterTable = new JTable(model); filterTable.addMouseListener(new MouseHandler()); @@ -227,11 +229,11 @@ //{{{ +_save() : void public void _save() { - if (ProjectOptions.getProject() == null) { + if (proj == null) { ProjectManager.getInstance().setGlobalFilterList(model.getFilterList()); } else { - ProjectOptions.getProject().setFilterList(model.getFilterList()); - ProjectViewer.nodeStructureChangedFlat(ProjectOptions.getProject()); + proj.setFilterList(model.getFilterList()); + ProjectViewer.nodeStructureChangedFlat(proj); } }//}}} Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectOptions.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -19,7 +19,9 @@ package projectviewer.config; //{{{ Imports +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.swing.JOptionPane; @@ -28,6 +30,8 @@ import org.gjt.sp.jedit.jEdit; import org.gjt.sp.jedit.EditPlugin; import org.gjt.sp.jedit.OptionGroup; +import org.gjt.sp.jedit.OptionPane; +import org.gjt.sp.jedit.ServiceManager; import org.gjt.sp.jedit.gui.OptionsDialog; import projectviewer.vpt.VPTGroup; @@ -42,302 +46,257 @@ * @author Marcelo Vanzin * @version $Id$ */ -public class ProjectOptions extends OptionsDialog { +public class ProjectOptions +{ - //{{{ Static Members - private static String lookupPath; - private static VPTProject p; - private static boolean isNew; + private VPTProject p; + private boolean isNew; - //{{{ +_run(VPTProject)_ : VPTProject - /** - * Shows the project options dialog for the given project. - * - * @param project The project to edit or null to create a new one. - * @return The new or modified project, or null if p was null and - * dialog was cancelled. - */ - public static VPTProject run(VPTProject project) { - return run(project, null, null); - } //}}} + private ProjectOptionsDialog.PVOptionTreeModel paneModel; + private ProjectPropertiesPane pOptPane; - //{{{ +_run(VPTProject, VPTGroup, String)_ : VPTProject + private Map<OptionsService, OptionGroup> groups; + private Map<OptionsService, OptionPane> panes; + + /** - * Shows the project options dialog for the given project, with an - * optional default start folder where to open the file chooser - * dialog. + * Shows the project options dialog for the given project. * - * <p>Method is sychronized so that the use of the static variables - * is safe.</p> + * @param project The project to edit (null to create a new one). + * @param isNew If a non-null project is provided, whether to + * treat is as a new project. + * @param parent The parent node where to insert new projects; + * may be null. * - * @param project The project to edit or null to create a new one. - * @param parent If creating a new project, the parent where the - * project should be added (null is ok). - * @param startPath Where to open the "choose root" file dialog. - * @return The new or modified project, or null if p was null and - * dialog was cancelled. + * @return The project with updated information, or null if the user + * cancelled the dialog. + * + * @since PV 3.0.0 */ - public static VPTProject run(VPTProject project, - VPTGroup parent, - String startPath) + public static VPTProject run(VPTProject proj, + boolean isNew, + VPTGroup parent) { - return run(project, parent, startPath, null); - } //}}} + ProjectOptions dlg = new ProjectOptions(proj, isNew, parent); + return dlg.run(); + } - //{{{ +_run(VPTProject, VPTGroup, String, String)_ : VPTProject - /** - * Shows the project options dialog for the given project, with an - * optional default start folder where to open the file chooser - * dialog. - * - * <p>Method is sychronized so that the use of the static variables - * is safe.</p> - * - * @param project The project to edit or null to create a new one. - * @param parent If creating a new project, the parent where the - * project should be added (null is ok). - * @param startPath Where to open the "choose root" file dialog. - * @param startPane The name of the option pane to be shown by - * default. If null, will show the main project - * options pane. - * @return The new or modified project, or null if p was null and - * dialog was cancelled. - * @since PV 2.1.3.4 - */ - public static synchronized VPTProject run(VPTProject project, - VPTGroup parent, - String startPath, - String startPane) + + private ProjectOptions(VPTProject proj, + boolean isNew, + VPTGroup parent) { - String title; - if (project == null) { + this.p = proj; + this.isNew = isNew; + if (p == null) { + this.isNew = true; p = new VPTProject(""); - p.setParent(parent); p.setRootPath(""); - isNew = true; - title = "projectviewer.create_project"; - } else { - p = project; - isNew = false; - title = "projectviewer.edit_project"; } - - lookupPath = startPath; - new ProjectOptions(jEdit.getActiveView(), title, startPane); - if (isNew && p != null) { - p.setParent(null); + if (p.getParent() == null) { + p.setParent(parent); } - project = p; - p = null; - return project; - } //}}} + } - //{{{ +_getProject()_ : VPTProject - /** - * Returns the project currently being edited, or null if the - * dialog is not active. - * - * @since PV 2.1.0.1 - */ - public static VPTProject getProject() { - return p; - } //}}} - //}}} + private VPTProject run() + { + String title; + title = (isNew) ? "projectviewer.create_project" + : "projectviewer.edit_project"; - //{{{ Instance Variables - - private PVOptionTreeModel paneModel; - private ProjectPropertiesPane pOptPane; - - //}}} - - //{{{ -ProjectOptions(View, String) : <init> - private ProjectOptions(View view, String name, String pane) { - super(JOptionPane.getFrameForComponent(view), name, pane); - setModal(true); - } //}}} - - public void setTitle(String title) { - if (!isNew) { - super.setTitle(title + " (" + p.getName() + ")"); - } else { - super.setTitle(title); + new ProjectOptionsDialog(jEdit.getActiveView(), title); + if (isNew && p != null) { + p.setParent(null); } + return p; } - //{{{ +cancel() : void - /** - * Called when the cancel button is pressed. Sets the project to null - * if "isNew" is true. - */ - public void cancel() { - p = null; - dispose(); - } //}}} - //{{{ +ok() : void - /** - * Called when ok is pressed. Verifies if the project's properties are OK - * before closing the dialog. - */ - public void ok() { - super.ok(false); - if (pOptPane.isOK()) { - dispose(); - } - } //}}} - - //{{{ #getDefaultGroup() : OptionGroup - protected OptionGroup getDefaultGroup() { - return (OptionGroup) paneModel.getRoot(); - } //}}} - - //{{{ #createOptionTreeModel() : OptionTreeModel - protected OptionTreeModel createOptionTreeModel() { - paneModel = new PVOptionTreeModel(); - - pOptPane = new ProjectPropertiesPane(this, p, isNew, lookupPath); - addOptionPane(pOptPane); - - addOptionPane(new AutoReimportPane(p)); - addOptionPane(new ProjectFilterPane()); - - EditPlugin[] eplugins = jEdit.getPlugins(); - for (int i = 0; i < eplugins.length; i++) { - addRemoveOptions(eplugins[i].getClassName(), - "option-pane", - "option-group", - true); - } - - return paneModel; - } //}}} - - void removeOptions(VersionControlService svc) { - PVOptionGroup root = (PVOptionGroup) paneModel.getRoot(); - addRemoveOptions(svc.getPlugin().getName(), - "vc-option-pane", - "vc-option-group", - false); + addRemoveOptions(svc, false); } void addOptions(VersionControlService svc) { - addRemoveOptions(svc.getPlugin().getName(), - "vc-option-pane", - "vc-option-group", - true); + addRemoveOptions(svc, true); } - private void addRemoveOptions(String plugin, - String pane, - String group, + private void addRemoveOptions(OptionsService svc, boolean add) { - PVOptionGroup root = (PVOptionGroup) paneModel.getRoot(); + ProjectOptionsDialog.PVOptionGroup root = + (ProjectOptionsDialog.PVOptionGroup) paneModel.getRoot(); + OptionPane pane; + OptionGroup group; - // Look for a single option pane - String property = "plugin.projectviewer." + plugin + "." + pane; - if ((property = jEdit.getProperty(property)) != null) { - if (add) { - root.addOptionPane(property); - paneModel.addRemoveMember(root, property, true); - } else { - paneModel.addRemoveMember(root, property, false); + // Single option pane. + if (add) { + if ((pane = panes.get(svc)) == null) { + pane = svc.getOptionPane(p); } + if (pane != null) { + root.addOptionPane(pane); + panes.put(svc, pane); + paneModel.addRemoveMember(root, pane, true); + } + } else { + pane = panes.get(svc); + if (pane != null) { + paneModel.addRemoveMember(root, pane, false); + } } - // Look for an option group - property = "plugin.projectviewer." + plugin + "." + group; - if ((property = jEdit.getProperty(property)) != null) { - if (add) { - OptionGroup newgroup = - new OptionGroup("plugin." + plugin, - jEdit.getProperty("plugin." + plugin + ".name"), - property); - root.addOptionGroup(newgroup); - paneModel.addRemoveMember(root, newgroup.getLabel(), true); - } else { - String label = jEdit.getProperty(property + ".label"); - paneModel.addRemoveMember(root, label, false); + // Option group; + if (add) { + if ((group = groups.get(svc)) == null) { + group = svc.getOptionGroup(p); } + if (group != null) { + root.addOptionGroup(group); + paneModel.addRemoveMember(root, group, true); + groups.put(svc, group); + } + } else { + group = groups.get(svc); + if (group != null) { + paneModel.addRemoveMember(root, group, false); + } } } - private class PVOptionGroup extends OptionGroup + + private class ProjectOptionsDialog extends OptionsDialog { - PVOptionGroup() + private ProjectOptionsDialog(View view, + String name) { - super(null); + super(JOptionPane.getFrameForComponent(view), name, null); } - int getIndexByName(String name) + public void setTitle(String title) { - for (int i = 0; i < members.size(); i++) { - Object o = members.get(i); - if (o instanceof String) { - if (name.equals((String)o)) { - return i; - } - } else if (o instanceof OptionGroup) { - if (name.equals(((OptionGroup)o).getLabel())) { - return i; - } - } else if (o instanceof AbstractOptionPane) { - if (name.equals(((AbstractOptionPane)o).getName())) { - return i; - } - } else { - throw new InternalError(); - } + if (p.getName() != null && p.getName().length() > 0) { + super.setTitle(title + " (" + p.getName() + ")"); } - return -1; } - void remove(int idx) + + /** + * Called when the cancel button is pressed. Sets the project to null + * if "isNew" is true. + */ + public void cancel() { + p = null; + dispose(); + } + + + /** + * Called when ok is pressed. Verifies if the project's properties are OK + * before closing the dialog. + */ + public void ok() { - members.remove(idx); + super.ok(false); + if (pOptPane.isOK()) { + dispose(); + } } - } - private class PVOptionTreeModel extends OptionTreeModel - { + protected OptionGroup getDefaultGroup() + { + return (OptionGroup) paneModel.getRoot(); + } - PVOptionTreeModel() + + protected OptionTreeModel createOptionTreeModel() { - super(new PVOptionGroup()); + ProjectViewerConfig cfg = ProjectViewerConfig.getInstance(); + PVOptionGroup root; + + paneModel = new PVOptionTreeModel(); + root = (PVOptionGroup) paneModel.getRoot(); + + pOptPane = new ProjectPropertiesPane(ProjectOptions.this, + p, isNew); + addOptionPane(pOptPane); + + addOptionPane(new AutoReimportPane(p)); + addOptionPane(new ProjectFilterPane(p)); + + groups = new HashMap<OptionsService, OptionGroup>(); + panes = new HashMap<OptionsService, OptionPane>(); + + String[] popts; + String type = OptionsService.class.getName(); + popts = ServiceManager.getServiceNames(type); + for (String svcname : popts) { + OptionsService svc = (OptionsService) + ServiceManager.getService(type, svcname); + if (cfg.isExtensionEnabled(type, svc.getClass().getName())) { + addRemoveOptions(svc, true); + } + } + + return paneModel; } - void addRemoveMember(PVOptionGroup grp, - String member, - boolean add) + private class PVOptionGroup extends OptionGroup { - int idx = grp.getIndexByName(member); - if (idx == -1) { - return; + + PVOptionGroup() + { + super(null); } - Object[] path = new Object[] { grp }; - int[] indices = new int[] { idx }; - Object[] children = new Object[] { grp.getMember(idx) }; - if (add) { - paneModel.fireNodesInserted(this, path, indices, children); - } else { - paneModel.fireNodesRemoved(this, path, indices, children); - grp.remove(idx); + + void remove(int idx) + { + members.remove(idx); } + } - } + private class PVOptionTreeModel extends OptionTreeModel + { + + PVOptionTreeModel() + { + super(new PVOptionGroup()); + } + + + void addRemoveMember(PVOptionGroup grp, + Object member, + boolean add) + { + int idx = grp.getMemberIndex(member); + if (idx == -1) { + return; + } + + Object[] path = new Object[] { grp }; + int[] indices = new int[] { idx }; + Object[] children = new Object[] { grp.getMember(idx) }; + if (add) { + fireNodesInserted(this, path, indices, children); + } else { + fireNodesRemoved(this, path, indices, children); + grp.remove(idx); + } + } + + } + + } } Modified: plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/projectviewer/config/ProjectPropertiesPane.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -71,7 +71,6 @@ //{{{ Instance Variables private int result; - private String lookupPath; private VPTProject project; private JTextField projName; @@ -95,8 +94,7 @@ ProjectPropertiesPane(ProjectOptions options, VPTProject p, - boolean isNew, - String lookupPath) + boolean isNew) { super("projectviewer.project_props", "projectviewer.project.options"); @@ -104,7 +102,6 @@ this.project = p; this.ok = true; this.isNew = isNew; - this.lookupPath = lookupPath; } //}}} @@ -123,9 +120,6 @@ if (root.length() > 0) { path = VFSManager.getVFSForPath(root).getParentOfPath(root); - } else if (lookupPath != null) { - path = VFSManager.getVFSForPath(lookupPath) - .getParentOfPath(lookupPath); } else { path = jEdit.getProperty("projectviewer.filechooser.directory", System.getProperty("user.home")); Modified: plugins/ProjectViewer/trunk/projectviewer/config/VersionControlService.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/config/VersionControlService.java 2009-03-30 03:46:43 UTC (rev 14865) +++ plugins/ProjectViewer/trunk/projectviewer/config/VersionControlService.java 2009-03-30 05:52:34 UTC (rev 14866) @@ -30,12 +30,17 @@ * a project. Plugins implementing this service should provide it * through jEdit's service.xml interface. * + * The interface extends {@link OptionsService}; the option pane or + * option group returned by this service is only shown if the service + * is chosen as the "version control service" for a project. + * * @author Marcelo Vanzin * @since PV 3.0.0 * @version $Id$ */ -public interface VersionControlService { +public interface VersionControlService extends OptionsService +{ /** Key in the project's properties identifying the version control service. */ public static final String VC_SERVICE_KEY = "projectviewer.version_control_service"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |