/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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 gov.redhawk.ide.sad.internal.ui.properties;
import gov.redhawk.ide.sad.internal.ui.editor.XViewerCellEditor;
import gov.redhawk.ide.sad.internal.ui.editor.XViewerComboCellEditor;
import gov.redhawk.ide.sad.internal.ui.properties.model.SadProperty;
import gov.redhawk.ide.sad.internal.ui.properties.model.SadPropertyImpl;
import gov.redhawk.sca.sad.validation.DuplicateAssemblyExternalPropertyIDConstraint;
import gov.redhawk.sca.sad.validation.DuplicateExternalPropertyIDConstraint;
import mil.jpeojtrs.sca.sad.ExternalProperty;
import mil.jpeojtrs.sca.sad.SadFactory;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import mil.jpeojtrs.sca.util.ScaEcoreUtils;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.nebula.widgets.xviewer.XViewer;
import org.eclipse.nebula.widgets.xviewer.edit.CellEditDescriptor;
import org.eclipse.nebula.widgets.xviewer.edit.XViewerControlFactory;
import org.eclipse.nebula.widgets.xviewer.edit.XViewerConverter;
import org.eclipse.swt.widgets.Control;
/**
*
*/
public class PropertiesViewerEditingSupport implements XViewerControlFactory, XViewerConverter {
@Override
public Control createControl(CellEditDescriptor ced, final XViewer xv) {
IStructuredSelection ss = (IStructuredSelection) xv.getSelection();
Object editElement = ss.getFirstElement();
if (ced.getInputField().equals(PropertiesViewerFactory.EXTERNAL.getId())) {
final SadProperty prop = (SadProperty) editElement;
String[] items = new String[] { "", prop.getDefinition().getId() };
XViewerComboCellEditor editor = new XViewerComboCellEditor(xv.getTree(), items, ced.getSwtStyle());
final SoftwareAssembly sad = ScaEcoreUtils.getEContainerOfType(prop.getComponentInstantiation(), SoftwareAssembly.class);
editor.setValidator(new ICellEditorValidator() {
@Override
public String isValid(Object value) {
if (value == null || value.equals(prop.getExternalID())) {
return null;
} else if (!isUniqueProperty((String) value, sad)) {
return "Duplicate external property ID";
}
return null;
}
});
return editor;
} else if (ced.getInputField().equals(PropertiesViewerFactory.SAD_VALUE.getId())) {
return ((SadPropertyImpl< ? >) editElement).createCellEditor(xv.getTree());
}
return null;
}
protected boolean isUniqueProperty(String text, SoftwareAssembly sad) {
ExternalProperty prop = SadFactory.eINSTANCE.createExternalProperty();
prop.setPropID(text);
return DuplicateExternalPropertyIDConstraint.validateProperty(prop, sad);
}
/* (non-Javadoc)
* @see org.eclipse.nebula.widgets.xviewer.edit.XViewerConverter#setInput(org.eclipse.swt.widgets.Control, org.eclipse.nebula.widgets.xviewer.edit.CellEditDescriptor, java.lang.Object)
*/
@Override
public void setInput(Control c, CellEditDescriptor ced, Object selObject) {
if (ced.getInputField().equals(PropertiesViewerFactory.EXTERNAL.getId())) {
SadProperty prop = ((SadProperty) selObject);
String value = getUniqueValue(prop);
((XViewerCellEditor) c).setValue(value);
} else if (ced.getInputField().equals(PropertiesViewerFactory.SAD_VALUE.getId())) {
if (c instanceof XViewerCellEditor) {
Object value = ((SadProperty) selObject).getSadValue();
((XViewerCellEditor) c).setValue(value);
}
}
}
private String getUniqueValue(SadProperty viewerProp) {
if (viewerProp.getExternalID() != null) {
return viewerProp.getExternalID();
}
ExternalProperty prop = SadFactory.eINSTANCE.createExternalProperty();
prop.setPropID(viewerProp.getID());
SoftwareAssembly sad = ScaEcoreUtils.getEContainerOfType(viewerProp.getComponentInstantiation(), SoftwareAssembly.class);
for (int i = 1; !DuplicateAssemblyExternalPropertyIDConstraint.validateProperty(prop, sad); i++) {
prop.setPropID(viewerProp.getID() + "_" + i);
}
for (int i = 1; !DuplicateExternalPropertyIDConstraint.validateProperty(prop, sad); i++) {
prop.setPropID(viewerProp.getID() + "_" + i);
}
return prop.getPropID();
}
/* (non-Javadoc)
* @see org.eclipse.nebula.widgets.xviewer.edit.XViewerConverter#getInput(org.eclipse.swt.widgets.Control, org.eclipse.nebula.widgets.xviewer.edit.CellEditDescriptor, java.lang.Object)
*/
@Override
public Object getInput(Control c, CellEditDescriptor ced, Object selObject) {
if (ced.getInputField().equals(PropertiesViewerFactory.EXTERNAL.getId())) {
return setExternalID(c, selObject);
} else if (ced.getInputField().equals(PropertiesViewerFactory.SAD_VALUE.getId())) {
return setSadValue(c, selObject);
}
return null;
}
protected Object setSadValue(Control c, Object selObject) {
Object newValue = null;
if (c instanceof XViewerCellEditor) {
newValue = ((XViewerCellEditor) c).getValue();
if (newValue == null) {
return null;
}
} else {
return null;
}
if (selObject instanceof SadProperty) {
SadProperty property = (SadProperty) selObject;
property.setSadValue(newValue);
}
return selObject;
}
protected Object setExternalID(Control c, Object selObject) {
Object value = ((XViewerCellEditor) c).getValue();
if (value == null) {
return null;
}
((SadProperty) selObject).setExternalID((String) value);
return selObject;
}
@Override
public boolean isValid(CellEditDescriptor ced, Object selObject) {
if (ced.getInputField().equals(PropertiesViewerFactory.EXTERNAL.getId())) {
return ((SadProperty) selObject).canSetExternalId();
}
return true;
}
}