/*
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.eclipseplugin.editors;
import java.io.File;
import java.net.URI;
import java.net.URL;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.ResourceTransfer;
import com.horstmann.violet.eclipseplugin.file.EclipseFileChooserService;
import com.horstmann.violet.eclipseplugin.tools.EclipseUtils;
import com.horstmann.violet.framework.file.GraphFile;
import com.horstmann.violet.framework.file.IGraphFile;
import com.horstmann.violet.framework.file.LocalFile;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.BeanInjector;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.InjectedBean;
import com.horstmann.violet.framework.theme.ITheme;
import com.horstmann.violet.framework.theme.ThemeManager;
import com.horstmann.violet.workspace.IWorkspace;
import com.horstmann.violet.workspace.IWorkspaceListener;
import com.horstmann.violet.workspace.Workspace;
/**
* Main Editor Part
*
* @author Alexandre de Pellegrin
*
*/
public class VioletUMLEditor extends EditorPart
{
/**
* Performs saving
*/
@Override
public void doSave(IProgressMonitor monitor)
{
this.fileChooserService.changeProgressMonitor(monitor);
this.getUMLDiagramPanel().getGraphFile().save();
firePropertyChange(EditorPart.PROP_DIRTY);
}
/**
* @see org.eclipse.ui.ISaveablePart#doSaveAs()
*/
@Override
public void doSaveAs()
{
// Nothing to do here. Files are always created with the wizard
}
/**
* Initializes editor
*/
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException
{
BeanInjector.getInjector().inject(this);
setInput(input);
setSite(site);
// Theme is initialized from wizard when creating a new diagram file
// and from EditorPart when opening an existing diagram file
EclipseColorPicker eclipseColorPicker = new EclipseColorPicker(site.getWorkbenchWindow().getWorkbench().getDisplay());
ITheme eclipseTheme = new EclipseTheme(eclipseColorPicker);
ThemeManager.getInstance().switchToTheme(eclipseTheme);
// Retreive file input
if (input instanceof IFileEditorInput)
{
IFileEditorInput fe = (IFileEditorInput) input;
IFile file = fe.getFile();
this.fileChooserService.setEclipseFile(file);
// Update part editor title
this.setPartName(file.getName());
}
}
/**
* @see org.eclipse.ui.ISaveablePart#isDirty()
*/
@Override
public boolean isDirty()
{
IWorkspace umlDiagramPanel = this.getUMLDiagramPanel();
IGraphFile graphFile = umlDiagramPanel.getGraphFile();
return graphFile.isSaveRequired();
}
/**
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
@Override
public void setFocus()
{
// Nothing to do here.
}
/**
* 'Save As' is disabled
*/
@Override
public boolean isSaveAsAllowed()
{
return false;
}
/**
* Builds editor with embedded JPanels
*/
@Override
public void createPartControl(Composite parent)
{
// Set parent layout
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
parent.setLayout(gridLayout);
IWorkspace workspacePanel = this.getUMLDiagramPanel();
final DiagramComposite diagramComposite = new DiagramComposite(parent, workspacePanel);
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
Transfer[] types = new Transfer[]
{
ResourceTransfer.getInstance()
};
DropTarget target = new DropTarget(parent, operations);
target.setTransfer(types);
target.addDropListener(new FileDropTargetListener(workspacePanel.getEditorPart()));
}
/**
* Return master Violet Frame. Usefull to retreive graph and toolbar
*
* @return
*/
public IWorkspace getUMLDiagramPanel()
{
if (this.UMLWorkspace == null)
{
try {
IGraphFile graphFile = new GraphFile(fileChooserService.chooseAndGetFileReader().getFileDefinition());
this.UMLWorkspace = new Workspace(graphFile);
this.UMLWorkspace.addListener(new IWorkspaceListener() {
@Override
public void titleChanged(String newTitle) {
}
@Override
public void mustOpenfile(com.horstmann.violet.framework.file.IFile file) {
try {
IEditorSite site = getEditorSite();
Display d = site.getShell().getDisplay();
LocalFile localFile = new LocalFile(file);
File javaFile = localFile.toFile();
URI uri = javaFile.toURI();
URL url = uri.toURL();
EclipseUtils.openUMLDiagram(url, d);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void graphCouldBeSaved() {
IEditorSite site = getEditorSite();
if (site != null)
{
Display d = site.getShell().getDisplay();
d.asyncExec(new Runnable()
{
public void run()
{
firePropertyChange(EditorPart.PROP_DIRTY);
}
});
}
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return this.UMLWorkspace;
}
public static final String ID = "com.horstmann.violet.eclipseplugin.editors.VioletUMLEditor";
/** UML diagram swing panel */
private IWorkspace UMLWorkspace;
@InjectedBean
private EclipseFileChooserService fileChooserService;
}