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. |