public class PlateHandler extends DefaultComponentHandler { transient private static final Class CLASS = PlateHandler.class; private ScalarVariable shapeProp; private ScalarVariable materialProp; private ScalarVariable thicknessParam; /** * This implementation saves a reference to the properties * @param component * @throws SDKException */ public void initHandler(DtComponent component) throws SDKException { super.initHandler(component); } public void addedToModel() throws SDKException { try { shapeProp = ((DtScalarVariable)component.getProperty("Shape")); materialProp = ((DtScalarVariable)component.getProperty ("Material")); thicknessParam = ((DtScalarVariable)component.getParameter ("Thickness")); } catch (Throwable e) { throw new SDKException(e, "Error initializing component Handler."); } } /** * Reacts to changes to the pre-defined parameters * @param event * @throws DtModelException * @throws VariableException */ public void modelChanged(DtModelEvent event) throws DtModelException, VariableException { // A MODEL_UPDATED type of event is a way to bundle numerous events // under a single one so they can all be processed together. We must // account for these here by looping over all of the bundled events // and processing each if (event.getEventType() == DtModelEvent.MODEL_UPDATED) { Iterator eventIter = event.getAccumulatedEvents().iterator(); while (eventIter.hasNext()) { this.modelChanged((DtModelEvent)eventIter.next()); } return; } DtModelElement dtme = event.getModelElement(); // Only interested in Variable events for my component DtComponent eventComp = event.getParentCompForEvent(); if (eventComp == myComponent && dtme instanceof Variable) { Variable eVar = (Variable)dtme; Variable rootVar = VariableUtil.getRootVariable(eVar); String rootVarName = rootVar.getName(); // if one of our predefined parameter names changes, change it back if (event.getChangeType() == DtModelEvent.CHANGED_VARNAME) { String oldName = (String)event.getOldValue(); String newName = VariableUtil.getVariablePathAsString(eVar); if (oldName.equals("Dimensions")) { ((DtVariable)eVar).setName("Dimensions"); } else if (oldName.equals("Area")) { ((DtVariable)eVar).setName("Area"); } else if (oldName.equals("Volume")) { ((DtVariable)eVar).setName("Volume"); } else if (oldName.equals("Weight")) { ((DtVariable)eVar).setName("Weight"); } } // if a pre-defined parameter is deleted, add it back if (event.getEventType() == DtModelEvent.ELEMENT_REMOVED) { String varName = eVar.getName(); DtVariable dtVar = (DtVariable)eVar; if (varName.equals("Dimensions") || varName.equals("Area") || varName.equals("Weight") || varName.equals("Volume")) { myComponent.addParameter(dtVar); } } // if a pre-defined parameter is changed to an inappropriate type if (event.getChangeType() == DtModelEvent.CHANGED_TYPE) { String varName = eVar.getName(); DtVariable dtVar = (DtVariable)eVar; if (varName.equals("Dimensions")) { dtVar.setMode(Variable.MODE_INPUT); } else if (varName.equals("Area") || varName.equals("Weight") || varName.equals("Volume")) { dtVar.setMode(Variable.MODE_OUTPUT); } } } } /** * Validates the values of the properties * @param validationList * @throws SDKException */ public void validate(java.util.List validationList) throws SDKException { try { String name = myComponent.getName(); MetaModel myMM = myComponent.getMetaModel(); // warn if shape, material, or thickness are not specified if (shapeProp.getValueObj().getAsString().length() == 0) { validationList.add(new ValidationResult(ValidationEvent.SEVERITY_WARNING, myComponent, new IString(CLASS, 0, "{0}: No shape specified for the plate", name), "shape")); } if (materialProp.getValueObj().getAsString().length() == 0) { validationList.add(new ValidationResult(ValidationEvent.SEVERITY_WARNING, myComponent, new IString(CLASS, 0, "{0}: No material specified for the plate", name), "material")); } if (thicknessParam.getValueObj().getAsString().length() == 0) { validationList.add(new ValidationResult(ValidationEvent.SEVERITY_WARNING, myComponent,new IString(CLASS, 0, "{0}: No thickness specified for the plate", name), "thickness")); } } catch (Exception e) { throw new SDKException(e, e.getMessage()); } } } |