/* $Id: $
*****************************************************************************
* Copyright (c) 2010 Contributors - see below
* 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
*
* Contributors:
* Bob Tarling
*****************************************************************************
*/
package org.argouml.state2.diagram;
import java.beans.PropertyVetoException;
import java.util.Collection;
import java.util.Collections;
import javax.swing.Action;
import org.apache.log4j.Logger;
import org.argouml.model.Model;
import org.argouml.ui.CmdCreateNode;
import org.argouml.uml.diagram.UMLMutableGraphSupport;
import org.argouml.uml.diagram.UmlDiagramRenderer;
import org.argouml.uml.diagram.ui.ActionSetMode;
import org.argouml.uml.diagram.ui.RadioAction;
import org.argouml.uml.diagram.ui.UMLDiagram;
import org.tigris.gef.base.LayerPerspective;
import org.tigris.gef.base.LayerPerspectiveMutable;
import org.tigris.gef.base.ModeCreatePolyEdge;
import org.tigris.gef.graph.MutableGraphModel;
import org.tigris.gef.presentation.FigNode;
abstract class BaseDiagram extends UMLDiagram {
private static final Logger LOG = Logger
.getLogger(BaseDiagram.class);
public BaseDiagram(Object owner) {
super();
MutableGraphModel gm = createGraphModel();
setGraphModel(gm);
// Create the layer
LayerPerspective lay = new
LayerPerspectiveMutable(this.getName(), gm);
setLayer(lay);
// Create the renderer
UmlDiagramRenderer renderer = createDiagramRenderer();
lay.setGraphNodeRenderer(renderer);
lay.setGraphEdgeRenderer(renderer);
if (LOG.isDebugEnabled()) {
LOG.debug("Constructing diagram for " + owner);
}
try {
this.setName(getNewDiagramName());
} catch (PropertyVetoException e) {
LOG.error("Exception", e);
}
}
abstract UmlDiagramRenderer createDiagramRenderer();
abstract UMLMutableGraphSupport createGraphModel();
@Override
protected Object[] getUmlActions() {
final Object[] edgeTools = getNewEdgeTypes();
final Object[] nodeTools = getNewNodeTypes();
final Object[] actions =
new Object[edgeTools.length + nodeTools.length];
int i = 0;
for (Object meta : edgeTools) {
if (meta instanceof Object[]) {
Object[] childEdgeTools = (Object[]) meta;
final Object[] childActions =
new Object[childEdgeTools.length];
int j = 0;
for (Object childMeta : childEdgeTools) {
childActions[j++] = getCreateEdgeAction(childMeta);
}
actions[i++] = childActions;
} else {
actions[i++] = getCreateEdgeAction(meta);
}
}
for (Object meta : nodeTools) {
if (meta instanceof Object[]) {
Object[] childNodeTools = (Object[]) meta;
final Object[] childActions =
new Object[childNodeTools.length];
int j = 0;
for (Object childMeta : childNodeTools) {
childActions[j++] = getCreateNodeAction(childMeta);
}
actions[i++] = childActions;
} else {
actions[i++] = getCreateNodeAction(meta);
}
}
return actions;
}
abstract Object[] getNewNodeTypes();
abstract Object[] getNewEdgeTypes();
/**
* @return Returns a diagram tool creation action.
*/
private Action getCreateNodeAction(Object metaType) {
String label = Model.getMetaTypes().getName(metaType);
return new RadioAction(
new CmdCreateNode(metaType, label));
}
protected Action getCreateEdgeAction(Object metaType) {
String label = Model.getMetaTypes().getName(metaType);
return new RadioAction(
new ActionSetMode(
ModeCreatePolyEdge.class,
"edgeClass",
metaType,
label));
}
@Override
public void encloserChanged(FigNode enclosed, FigNode oldEncloser,
FigNode newEncloser) {
// Do nothing.
}
/*
* @see org.argouml.uml.diagram.ui.UMLDiagram#isRelocationAllowed(java.lang.Object)
*/
public boolean isRelocationAllowed(Object base) {
return false;
}
public Collection getRelocationCandidates(Object root) {
return Collections.EMPTY_LIST;
}
public boolean relocate(Object base) {
return false;
}
}