package com.mxgraph.examples.swing.editor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;
import javax.swing.TransferHandler;
import com.mxgraph.examples.swing.editor.EditorActions.HistoryAction;
import com.mxgraph.examples.swing.editor.EditorActions.NewAction;
import com.mxgraph.examples.swing.editor.EditorActions.OpenAction;
import com.mxgraph.examples.swing.editor.EditorActions.PrintAction;
import com.mxgraph.examples.swing.editor.EditorActions.SaveAction;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.swing.util.mxGraphActions;
import com.mxgraph.util.mxEvent;
import com.mxgraph.util.mxEventObject;
import com.mxgraph.util.mxResources;
import com.mxgraph.util.mxEventSource.mxIEventListener;
import com.mxgraph.view.mxGraphView;
public class SchemaEditorToolBar extends JToolBar
{
/**
*
*/
private static final long serialVersionUID = -3979320704834605323L;
/**
*
* @param frame
* @param orientation
*/
private boolean ignoreZoomChange = false;
/**
*
*/
public SchemaEditorToolBar(final BasicGraphEditor editor, int orientation)
{
super(orientation);
setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createEmptyBorder(3, 3, 3, 3), getBorder()));
setFloatable(false);
add(editor.bind("New", new NewAction(),
"/com/mxgraph/examples/swing/images/new.gif"));
add(editor.bind("Open", new OpenAction(),
"/com/mxgraph/examples/swing/images/open.gif"));
add(editor.bind("Save", new SaveAction(false),
"/com/mxgraph/examples/swing/images/save.gif"));
addSeparator();
add(editor.bind("Print", new PrintAction(),
"/com/mxgraph/examples/swing/images/print.gif"));
addSeparator();
add(editor.bind("Cut", TransferHandler.getCutAction(),
"/com/mxgraph/examples/swing/images/cut.gif"));
add(editor.bind("Copy", TransferHandler.getCopyAction(),
"/com/mxgraph/examples/swing/images/copy.gif"));
add(editor.bind("Paste", TransferHandler.getPasteAction(),
"/com/mxgraph/examples/swing/images/paste.gif"));
addSeparator();
add(editor.bind("Delete", mxGraphActions.getDeleteAction(),
"/com/mxgraph/examples/swing/images/delete.gif"));
addSeparator();
add(editor.bind("Undo", new HistoryAction(true),
"/com/mxgraph/examples/swing/images/undo.gif"));
add(editor.bind("Redo", new HistoryAction(false),
"/com/mxgraph/examples/swing/images/redo.gif"));
addSeparator();
final mxGraphView view = editor.getGraphComponent().getGraph()
.getView();
final JComboBox zoomCombo = new JComboBox(new Object[] { "400%",
"200%", "150%", "100%", "75%", "50%", mxResources.get("page"),
mxResources.get("width"), mxResources.get("actualSize") });
zoomCombo.setEditable(true);
zoomCombo.setMinimumSize(new Dimension(75, 0));
zoomCombo.setPreferredSize(new Dimension(75, 0));
zoomCombo.setMaximumSize(new Dimension(75, 100));
zoomCombo.setMaximumRowCount(9);
add(zoomCombo);
// Sets the zoom in the zoom combo the current value
mxIEventListener scaleTracker = new mxIEventListener()
{
/**
*
*/
public void invoke(Object sender, mxEventObject evt)
{
ignoreZoomChange = true;
try
{
zoomCombo.setSelectedItem((int) Math.round(100 * view
.getScale())
+ "%");
}
finally
{
ignoreZoomChange = false;
}
}
};
// Installs the scale tracker to update the value in the combo box
// if the zoom is changed from outside the combo box
view.getGraph().getView().addListener(mxEvent.SCALE, scaleTracker);
view.getGraph().getView().addListener(mxEvent.SCALE_AND_TRANSLATE,
scaleTracker);
// Invokes once to sync with the actual zoom value
scaleTracker.invoke(null, null);
zoomCombo.addActionListener(new ActionListener()
{
/**
*
*/
public void actionPerformed(ActionEvent e)
{
mxGraphComponent graphComponent = editor.getGraphComponent();
// Zoomcombo is changed when the scale is changed in the diagram
// but the change is ignored here
if (!ignoreZoomChange)
{
String zoom = zoomCombo.getSelectedItem().toString();
if (zoom.equals(mxResources.get("page")))
{
graphComponent.setPageVisible(true);
graphComponent
.setZoomPolicy(mxGraphComponent.ZOOM_POLICY_PAGE);
}
else if (zoom.equals(mxResources.get("width")))
{
graphComponent.setPageVisible(true);
graphComponent
.setZoomPolicy(mxGraphComponent.ZOOM_POLICY_WIDTH);
}
else if (zoom.equals(mxResources.get("actualSize")))
{
graphComponent.zoomActual();
}
else
{
try
{
zoom = zoom.replace("%", "");
double scale = Math.min(16, Math.max(0.01,
Double.parseDouble(zoom) / 100));
graphComponent.zoomTo(scale, graphComponent
.isCenterZoom());
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(editor, ex
.getMessage());
}
}
}
}
});
}
}