blob: 1a03f37d646ab71c774b63687db3f965a74ecb6f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.design.editparts;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xsd.ui.internal.adapters.XSDAdapterFactory;
import org.eclipse.wst.xsd.ui.internal.adapters.XSDBaseAdapter;
import org.eclipse.wst.xsd.ui.internal.adapters.XSDModelGroupAdapter;
import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.BaseEditPart;
import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.CenteredConnectionAnchor;
import org.eclipse.wst.xsd.ui.internal.common.util.XSDCommonUIUtils;
import org.eclipse.wst.xsd.ui.internal.design.editparts.model.TargetConnectionSpaceFiller;
import org.eclipse.wst.xsd.ui.internal.design.figures.GenericGroupFigure;
import org.eclipse.wst.xsd.ui.internal.design.figures.ModelGroupFigure;
import org.eclipse.xsd.XSDCompositor;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDModelGroup;
import org.eclipse.xsd.XSDModelGroupDefinition;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDWildcard;
import org.eclipse.xsd.util.XSDConstants;
public class ModelGroupEditPart extends ConnectableEditPart
{
protected IFigure createFigure()
{
return getExtendedFigureFactory().createModelGroupFigure(getModel());
}
public XSDParticle getXSDParticle()
{
Object o = getXSDModelGroup().getContainer();
return (o instanceof XSDParticle) ? (XSDParticle) o : null;
}
public XSDModelGroup getXSDModelGroup()
{
if (getModel() instanceof XSDModelGroupAdapter)
{
XSDModelGroupAdapter adapter = (XSDModelGroupAdapter) getModel();
return (XSDModelGroup) adapter.getTarget();
}
// else if (getModel() instanceof XSDModelGroup)
// {
// return (XSDModelGroup) getModel();
// }
return null;
}
protected void refreshVisuals()
{
boolean isReadOnly = false;
GenericGroupFigure modelGroupFigure = (GenericGroupFigure)getFigure();
XSDModelGroupAdapter adapter = (XSDModelGroupAdapter) getModel();
isReadOnly = adapter.isReadOnly();
String nodeName = "";
Image image;
switch (getXSDModelGroup().getCompositor().getValue())
{
case XSDCompositor.ALL:
{
image = isReadOnly ? ModelGroupFigure.ALL_ICON_DISABLED_IMAGE :ModelGroupFigure.ALL_ICON_IMAGE;
modelGroupFigure.getIconFigure().image = XSDCommonUIUtils.getUpdatedImage((XSDConcreteComponent)adapter.getTarget(), image, isReadOnly);
nodeName = XSDConstants.ALL_ELEMENT_TAG;
break;
}
case XSDCompositor.CHOICE:
{
image = isReadOnly ? ModelGroupFigure.CHOICE_ICON_DISABLED_IMAGE : ModelGroupFigure.CHOICE_ICON_IMAGE;
modelGroupFigure.getIconFigure().image = XSDCommonUIUtils.getUpdatedImage((XSDConcreteComponent)adapter.getTarget(), image, isReadOnly);
nodeName = XSDConstants.CHOICE_ELEMENT_TAG;
break;
}
case XSDCompositor.SEQUENCE:
{
image = isReadOnly ? ModelGroupFigure.SEQUENCE_ICON_DISABLED_IMAGE : ModelGroupFigure.SEQUENCE_ICON_IMAGE;
modelGroupFigure.getIconFigure().image = XSDCommonUIUtils.getUpdatedImage((XSDConcreteComponent)adapter.getTarget(), image, isReadOnly);
nodeName = XSDConstants.SEQUENCE_ELEMENT_TAG;
break;
}
}
// String occurenceDescription = adapter.getNameAnnotationToolTipString();
// modelGroupFigure.getIconFigure().setToolTip(occurenceDescription);
// TODO: commmon this up with XSDParticleAdapter's code
// -2 means the user didn't specify (so the default is 1)
int minOccurs = adapter.getMinOccurs();
int maxOccurs = adapter.getMaxOccurs();
String occurenceDescription = ""; //$NON-NLS-1$
if (minOccurs == -3 && maxOccurs == -3)
{
occurenceDescription = nodeName;
modelGroupFigure.setText(null);
}
else if (minOccurs == 0 && (maxOccurs == -2 || maxOccurs == 1))
{
occurenceDescription = nodeName + " [0..1]"; //$NON-NLS-1$
modelGroupFigure.setText("0..1");
}
else if ((minOccurs == 1 && maxOccurs == 1) ||
(minOccurs == -2 && maxOccurs == 1) ||
(minOccurs == 1 && maxOccurs == -2))
{
occurenceDescription = nodeName + " [1..1]"; //$NON-NLS-1$
modelGroupFigure.setText("1..1");
}
else if (minOccurs == -2 && maxOccurs == -2)
{
occurenceDescription = nodeName;
modelGroupFigure.setText(null);
}
else
{
if (maxOccurs == -2) maxOccurs = 1;
String maxSymbol = maxOccurs == -1 ? "*" : "" + maxOccurs; //$NON-NLS-1$ //$NON-NLS-2$
String minSymbol = minOccurs == -2 ? "1" : "" + minOccurs; //$NON-NLS-1$ //$NON-NLS-2$
occurenceDescription = nodeName + " [" + minSymbol + ".." + maxSymbol + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
modelGroupFigure.setText(minSymbol + ".." + maxSymbol);
}
modelGroupFigure.getIconFigure().setToolTipText(occurenceDescription);
modelGroupFigure.getIconFigure().repaint();
refreshConnection();
}
protected List getModelChildren()
{
// XSDModelGroupAdapter modelGroupAdapter = (XSDModelGroupAdapter)getModel();
// ArrayList ch = new ArrayList();
// ITreeElement [] tree = modelGroupAdapter.getChildren();
// int length = tree.length;
// for (int i = 0; i < length; i++)
// {
// ch.add(tree[i]);
// }
List list = new ArrayList();
XSDModelGroup xsdModelGroup = getXSDModelGroup();
for (Iterator i = xsdModelGroup.getContents().iterator(); i.hasNext();)
{
XSDParticle next = (XSDParticle) i.next();
if (next.getContent() instanceof XSDElementDeclaration)
{
XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) next.getContent();
Adapter adapter = XSDAdapterFactory.getInstance().adapt(elementDeclaration);
list.add(new TargetConnectionSpaceFiller((XSDBaseAdapter)adapter));
}
if (next.getContent() instanceof XSDModelGroupDefinition)
{
XSDModelGroupDefinition def = (XSDModelGroupDefinition) next.getContent();
Adapter adapter = XSDAdapterFactory.getInstance().adapt(def);
list.add(adapter);
}
else if (next.getTerm() instanceof XSDModelGroup)
{
XSDModelGroup modelGroup = (XSDModelGroup) next.getTerm();
Adapter adapter = XSDAdapterFactory.getInstance().adapt(modelGroup);
list.add(adapter);
}
else if (next.getTerm() instanceof XSDWildcard)
{
XSDWildcard wildCard = (XSDWildcard)next.getTerm();
Adapter adapter = XSDAdapterFactory.getInstance().adapt(wildCard);
list.add(new TargetConnectionSpaceFiller((XSDBaseAdapter)adapter));
}
}
if (list.size() == 0)
list.add(new TargetConnectionSpaceFiller(null));
return list;
// return ch;
}
public ReferenceConnection createConnectionFigure(BaseEditPart child)
{
ReferenceConnection connectionFigure = new ReferenceConnection();
GenericGroupFigure modelGroupFigure = (GenericGroupFigure)getFigure();
connectionFigure.setSourceAnchor(new CenteredConnectionAnchor(modelGroupFigure.getIconFigure(), CenteredConnectionAnchor.RIGHT, 0, 0));
if (child instanceof ModelGroupEditPart)
{
connectionFigure.setTargetAnchor(new CenteredConnectionAnchor(((ModelGroupEditPart) child).getTargetFigure(), CenteredConnectionAnchor.LEFT, 0, 0));
}
else if (child instanceof TargetConnectionSpacingFigureEditPart)
{
TargetConnectionSpacingFigureEditPart elem = (TargetConnectionSpacingFigureEditPart) child;
connectionFigure.setTargetAnchor(new CenteredConnectionAnchor(elem.getFigure(), CenteredConnectionAnchor.LEFT, 0, 1));
}
else if (child instanceof ModelGroupDefinitionReferenceEditPart)
{
ModelGroupDefinitionReferenceEditPart elem = (ModelGroupDefinitionReferenceEditPart) child;
connectionFigure.setTargetAnchor(new CenteredConnectionAnchor(elem.getFigure(), CenteredConnectionAnchor.LEFT, 0, 1));
}
connectionFigure.setHighlight(false);
return connectionFigure;
}
}