/*******************************************************************************
* Copyright (c) 2010 protos software gmbh (http://www.protos.de).
* 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:
* Thomas Schuetz and Henrik Rentz-Reichert (initial contribution)
*
*******************************************************************************/
package org.eclipse.etrice.ui.structure.dialogs;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorContainerClass;
import org.eclipse.etrice.core.room.ActorContainerRef;
import org.eclipse.etrice.core.room.ActorRef;
import org.eclipse.etrice.core.room.RoomModel;
import org.eclipse.etrice.core.room.RoomPackage;
import org.eclipse.etrice.core.room.StructureClass;
import org.eclipse.etrice.core.room.SubSystemClass;
import org.eclipse.etrice.core.room.SubSystemRef;
import org.eclipse.etrice.core.room.LogicalSystem;
import org.eclipse.etrice.ui.common.dialogs.AbstractPropertyDialog;
import org.eclipse.etrice.ui.structure.Activator;
public class ActorContainerRefPropertyDialog extends AbstractPropertyDialog {
class NameValidator implements IValidator {
@Override
public IStatus validate(Object value) {
if (value instanceof String) {
String name = (String) value;
if (name.isEmpty())
return ValidationStatus.error("name must not be empty");
// TODOHRR: check valid identifier
// TODOHRR: use ValidationUtil
if (sc instanceof ActorClass) {
if (nameExists((ActorClass) sc, name))
return ValidationStatus.error("name already exists");
}
else if (sc instanceof SubSystemClass) {
SubSystemClass ssc = (SubSystemClass) sc;
for (ActorRef ar : ssc.getActorRefs()) {
if (ar!=ref && ar.getName().equals(name))
return ValidationStatus.error("name already exists");
}
}
else if (sc instanceof LogicalSystem) {
LogicalSystem ssc = (LogicalSystem) sc;
for (SubSystemRef ssr : ssc.getSubSystems()) {
if (ssr!=ref && ssr.getName().equals(name))
return ValidationStatus.error("name already exists");
}
}
else {
assert(false): "unexpected type";
}
return Status.OK_STATUS;
}
return Status.OK_STATUS;
}
private boolean nameExists(ActorClass ac, String name) {
for (ActorRef ar : ac.getActorRefs()) {
if (ar!=ref && ar.getName().equals(name))
return true;
}
if (ac.getBase()!=null)
return nameExists(ac.getBase(), name);
return false;
}
}
class ProtocolValidator implements IValidator {
@Override
public IStatus validate(Object value) {
if (value==null)
return ValidationStatus.error("select a class");
return Status.OK_STATUS;
}
}
private ActorContainerRef ref;
private StructureClass sc;
private boolean newRef;
public ActorContainerRefPropertyDialog(Shell shell, ActorContainerRef ref, StructureClass sc, boolean newRef) {
super(shell, "Edit Reference");
this.ref = ref;
this.sc = sc;
this.newRef = newRef;
}
@Override
protected void initializeBounds() {
getShell().setSize(300, 300);
}
private RoomModel getRoomModel() {
EObject obj = sc;
while (obj!=null) {
if (obj instanceof RoomModel)
return (RoomModel) obj;
obj = obj.eContainer();
}
return null;
}
@Override
protected void createContent(IManagedForm mform, Composite body,
DataBindingContext bindingContext) {
RoomModel model = getRoomModel();
NameValidator nv = new NameValidator();
ProtocolValidator pv = new ProtocolValidator();
boolean isActor = sc instanceof ActorContainerClass;
Text name = createText(body, "Name:", ref, RoomPackage.eINSTANCE.getActorContainerRef_Name(), nv);
Combo refClass = isActor?
createCombo(body, "Actor Class:", ref, ActorClass.class, RoomPackage.eINSTANCE.getActorRef_Type(), model.getActorClasses(), RoomPackage.eINSTANCE.getRoomClass_Name(), pv)
: createCombo(body, "SubSystem Class:", ref, SubSystemClass.class, RoomPackage.eINSTANCE.getSubSystemRef_Type(), model.getSubSystemClasses(), RoomPackage.eINSTANCE.getRoomClass_Name(), pv);
createDecorator(name, "invalid name");
createDecorator(refClass, "no class selected");
if (!newRef) {
refClass.setEnabled(false);
}
name.setFocus();
}
@Override
protected Image getImage() {
return Activator.getImage("icons/Structure.gif");
}
}