/* Violet - A program for editing UML diagrams. Copyright (C) 2007 Cay S. Horstmann (http://horstmann.com) Alexandre de Pellegrin (http://alexdp.free.fr); 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 (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.horstmann.violet.product.diagram.propertyeditor.customeditor; import java.awt.FontMetrics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyEditorSupport; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JPanel; import com.horstmann.violet.framework.file.GraphFile; import com.horstmann.violet.framework.file.IFile; import com.horstmann.violet.framework.file.IGraphFile; import com.horstmann.violet.framework.file.chooser.IFileChooserService; import com.horstmann.violet.framework.file.naming.ExtensionFilter; import com.horstmann.violet.framework.file.naming.FileNamingService; import com.horstmann.violet.framework.file.persistence.IFileReader; import com.horstmann.violet.framework.injection.bean.ManiocFramework.InjectedBean; import com.horstmann.violet.framework.injection.resources.ResourceBundleInjector; import com.horstmann.violet.product.diagram.common.DiagramLink; import com.horstmann.violet.workspace.IWorkspace; import com.horstmann.violet.workspace.Workspace; /** * A PropertyEditor for FileLink objects that lets the user select a file and/or open it. * * @author Alexandre de Pellegrin */ public abstract class AbstractDiagramLinkEditor extends PropertyEditorSupport { /** The file chooser used for selecting files */ protected JFileChooser m_FileChooser; /** The panel displayed */ private JPanel m_Panel; /** The file chooser to use with with menu */ @InjectedBean private IFileChooserService fileChooserService; /** File services */ @InjectedBean private FileNamingService fileNamingService; /** * Returns a representation of the current property value as java source. * * @return a value of type 'String' */ public String getJavaInitializationString() { DiagramLink fl = (DiagramLink) getValue(); if (fl == null) { return "null"; } return "new File(\"" + fl.getURL().getFile() + "\")"; } /** * Returns true because we do support a custom editor. * * @return true */ public boolean supportsCustomEditor() { return true; } /** * Gets the custom editor component. * * @return a value of type 'java.awt.Component' */ public java.awt.Component getCustomEditor() { if (this.m_Panel == null) { ResourceBundleInjector.getInjector().inject(this); JButton chooseButton = new JButton(); chooseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { ExtensionFilter[] filters = fileNamingService.getFileFilters(); IFileReader fileOpener = fileChooserService.chooseAndGetFileReader(filters); IFile selectedFile = fileOpener.getFileDefinition(); if (selectedFile == null) return; DiagramLink diagramLink = (DiagramLink) AbstractDiagramLinkEditor.this.getValue(); diagramLink.setFile(selectedFile); AbstractDiagramLinkEditor.this.setValue(diagramLink); firePropertyChange(); } catch (Exception ex) { throw new RuntimeException(ex); } } }); //this.getResourceBundle().getString("file.link.open.text") JButton goButton = new JButton(); goButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { DiagramLink diagramLink = (DiagramLink) AbstractDiagramLinkEditor.this.getValue(); IFile file = diagramLink.getFile(); if (file == null) return; IGraphFile graphFile = new GraphFile(file); IWorkspace workspace = new Workspace(graphFile); show(workspace); } catch (Exception ex) { throw new RuntimeException(ex); } } }); this.m_Panel = new JPanel(); this.m_Panel.add(chooseButton); this.m_Panel.add(goButton); } return this.m_Panel; } /** * Needs to be implemented to display the workspace created when a file is opened * @param workspace */ public abstract void show(IWorkspace workspace); /** * Returns true since this editor is paintable. * * @return true. */ public boolean isPaintable() { return true; } /** * Paints a representation of the current Object. * * @param gfx the graphics context to use * @param box the area we are allowed to paint into */ public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) { FontMetrics fm = gfx.getFontMetrics(); int vpad = (box.height - fm.getHeight()) / 2; DiagramLink fl = (DiagramLink) getValue(); String val = "No file"; IFile file = fl.getFile(); if (fl != null && file != null) { val = file.getFilename(); } gfx.drawString(val, 2, fm.getHeight() + vpad); } }