/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.deved.antlride.viz.railroad;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.LinkedHashSet;
import org.deved.antlride.common.ui.AntlrImages;
import org.deved.antlride.core.model.IRule;
import org.deved.antlride.internal.viz.RuleBasedGraphViewer;
import org.deved.antlride.railroad.RailRoadGenerator;
import org.deved.antlride.ui.action.DropDownMenu;
import org.deved.antlride.viz.AntlrViz;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.draw2d.IFigure;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
public class RailRoadGraphViewer extends RuleBasedGraphViewer {
private class ExportAsHtmlAction extends Action {
public ExportAsHtmlAction() {
super("Export to HTML", IAction.AS_PUSH_BUTTON);
}
@Override
public void run() {
exportToHtml();
}
}
private class OptmizeGraphAction extends Action {
public OptmizeGraphAction() {
super("", IAction.AS_CHECK_BOX);
setImageDescriptor(AntlrImages
.getDescriptor(AntlrImages.OPTIMIZE_GRAPH));
setToolTipText("Optimize Graph");
setChecked(true);
}
@Override
public void run() {
optimizeGraph = !optimizeGraph;
IRule selectedRule = getSelectedRule();
if (selectedRule != null) {
draw(selectedRule);
}
}
}
private class AppendGraphAction extends Action {
public AppendGraphAction() {
super("", IAction.AS_CHECK_BOX);
setImageDescriptor(AntlrImages
.getDescriptor(AntlrImages.APPEND_GRAPH));
setToolTipText("Enqueue graph");
setChecked(false);
}
@Override
public void run() {
append = !append;
IRule selectedRule = getSelectedRule();
if (selectedRule != null) {
draw(selectedRule);
}
}
}
private DropDownMenu exportMenu;
private boolean optimizeGraph = true;
private boolean append = false;
private Collection<IRule> rules;
public RailRoadGraphViewer(Composite composite) {
super(composite);
rules = new LinkedHashSet<IRule>();
}
@Override
protected IFigure doDraw(IRule rule) {
if (!append) {
rules.clear();
}
rules.add(rule);
exportMenu.setEnabled(true);
IFigure figure = RailRoadGenerator.generate(rules
.toArray(new IRule[rules.size()]), optimizeGraph);
return figure;
}
@Override
protected void fillToolBar(IToolBarManager manager) {
exportMenu = new DropDownMenu(new ExportAsHtmlAction(),
new ExportAsImage("png", SWT.IMAGE_PNG), new ExportAsImage(
"jpeg", SWT.IMAGE_JPEG));
exportMenu.setImageDescriptor(AntlrImages
.getDescriptor(AntlrImages.SAVE_AS));
exportMenu.setToolTipText("Export diagram");
manager.add(new Separator());
manager.add(new OptmizeGraphAction());
manager.add(new AppendGraphAction());
manager.add(new Separator());
manager.add(exportMenu);
}
private void exportToHtml() {
try {
final RailRoadExportDialog options = new RailRoadExportDialog(
getControl().getShell());
if (options.open() == Dialog.OK) {
ProgressMonitorDialog progress = new ProgressMonitorDialog(
getControl().getShell());
progress.run(false, false, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException,
InterruptedException {
try {
new RailRoadGenerator().export(monitor, grammar,
options);
MessageDialog.open(MessageDialog.INFORMATION,
getControl().getShell(),
"Railroad exporter", grammar
.getElementName()
+ " successfully exported.",
MessageDialog.OK);
} catch (IOException ex) {
throw new InvocationTargetException(ex);
}
}
});
}
} catch (InvocationTargetException e) {
ErrorDialog.openError(getControl().getShell(), "Railroad exporter",
null, new Status(IStatus.ERROR, AntlrViz.PLUGIN_ID, grammar
.getElementName()
+ " can't be exported", e.getTargetException()));
AntlrViz.error(e.getTargetException());
} catch (InterruptedException e) {
AntlrViz.error(e);
}
}
@Override
protected void onClearGraph() {
rules.clear();
}
@Override
protected boolean useGraphicsTransalate() {
return true;
}
}