/*
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.wizards;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.IDE;
import com.horstmann.violet.eclipseplugin.editors.EclipseColorPicker;
import com.horstmann.violet.eclipseplugin.editors.EclipseTheme;
import com.horstmann.violet.framework.file.persistence.IFilePersistenceService;
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.product.diagram.abstracts.IGraph;
import com.horstmann.violet.product.diagram.communication.ClassDiagramGraph;
/**
* Generic diagram creation wizard
*
* @author Alexandre de Pellegrin
*
*/
public abstract class NewWizard extends Wizard implements INewWizard
{
private IStructuredSelection selection = null;
private WizardNewFileCreationPage creationPage = null;
private String pageTitle;
private IGraph UMLGraph;
/**
* Called by eclipse when wizard ends
*/
public boolean performFinish()
{
String fname = creationPage.getFileName();
if (!fname.toLowerCase().endsWith(getFileExtension()))
{
creationPage.setFileName(fname + getFileExtension());
}
if (creationPage.getErrorMessage() != null) return false;
final IFile file = creationPage.createNewFile();
IRunnableWithProgress op = new IRunnableWithProgress()
{
public void run(IProgressMonitor monitor) throws InvocationTargetException
{
try
{
doFinish(file, monitor);
}
catch (CoreException e)
{
throw new InvocationTargetException(e);
}
finally
{
monitor.done();
}
}
};
try
{
getContainer().run(true, false, op);
}
catch (InterruptedException e)
{
return false;
}
catch (InvocationTargetException e)
{
Throwable realException = e.getTargetException();
MessageDialog.openError(getShell(), "Error", realException.getMessage());
return false;
}
return true;
}
/**
* Called by Eclipse at wizard init
*/
public void init(IWorkbench workbench, IStructuredSelection selection)
{
this.selection = selection;
BeanInjector.getInjector().inject(this);
// Theme is initialized from wizard when creating a new diagram file
// and from EditorPart when opening an existing diagram file
EclipseColorPicker eclipseColorPicker = new EclipseColorPicker(workbench.getDisplay());
ITheme eclipseTheme = new EclipseTheme(eclipseColorPicker);
ThemeManager.getInstance().switchToTheme(eclipseTheme);
}
/**
* Construct wizard page (use standard WizardNewFileCreationPage)
*/
public void addPages()
{
creationPage = new WizardNewFileCreationPage(this.getPageTitle(), selection);
creationPage.setTitle(this.getPageTitle());
creationPage.setDescription("Enter file name.");
addPage(creationPage);
}
/**
* Get wizard page title
*
* @return
*/
private String getPageTitle()
{
if (this.pageTitle == null)
{
// Return class diagram by default
this.pageTitle = "New UML Class Diagram";
}
return this.pageTitle;
}
/**
* Set wizard page title
*
* @param title
*/
public void setPageTitle(String title)
{
this.pageTitle = title;
}
/**
* Return UML graph diagram model to create
*
* @return class diagram by default if not alredy set
*/
private IGraph getUMLGraph()
{
if (this.UMLGraph == null)
{
this.UMLGraph = new ClassDiagramGraph();
}
return this.UMLGraph;
}
/**
* Set UML graph diagram model to create
*
* @param graph
*/
public void setUMLGraph(IGraph graph)
{
this.UMLGraph = graph;
}
/**
* Called by performFinish(). Create new file wirh default content and then open editor
*
* @param file
* @param monitor
* @throws CoreException
*/
private void doFinish(final IFile file, IProgressMonitor monitor) throws CoreException
{
ByteArrayOutputStream bos = null;
ByteArrayInputStream bis = null;
try
{
IGraph graph = this.getUMLGraph();
bos = new ByteArrayOutputStream();
this.filePersistenceService.write(graph, bos);
byte[] content = bos.toByteArray();
bis = new ByteArrayInputStream(content);
file.setContents(bis, true, true, monitor);
}
finally
{
try {
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
monitor.worked(1);
monitor.setTaskName("Opening file for editing...");
getShell().getDisplay().asyncExec(new Runnable()
{
public void run()
{
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try
{
IDE.setDefaultEditor(file, "com.horstmann.violet.eclipseplugin.editors.VioletUMLEditor");
IDE.openEditor(page, file, "com.horstmann.violet.eclipseplugin.editors.VioletUMLEditor", true);
}
catch (PartInitException e)
{
}
}
});
monitor.worked(1);
}
/**
* @return file extension (.class.violet for example)
*/
public abstract String getFileExtension();
@InjectedBean
private IFilePersistenceService filePersistenceService;
}