Author: lgiessmann Date: Wed Aug 24 08:24:57 2011 New Revision: 777
Log: gdl-frontend: Widgets: implementedthe consulption of association in GdlEditorAssociationView => Changed the behavior of the GdlView-hierarchy
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/TODO.txt branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/container/GdlUnit.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/text/GdlText.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlCreatorAssociationView.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlEditorAssociationView.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlTopicView.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/TODO.txt ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/TODO.txt Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/TODO.txt Wed Aug 24 08:24:57 2011 (r777) @@ -1,4 +1,4 @@ -* finalise the GDL-Schema for creating and editing instances of tgm:Hash-Object => AssociationView + Hidden-Value (type-occurrence) +* finalise the GDL-Schema for creating and editing instances of tgm:Hash-Object => Hidden-Value (type-occurrence) + otherrole * Implement all IHasValueGroup to: * GdlText * GdlInfo
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Wed Aug 24 08:24:57 2011 (r777) @@ -710,7 +710,7 @@ ArrayList<Topic> constrainedNameTypes = getOtherPlayerOfBinaryAssociation(constraintTopic, constraintRoleType, constrainedStatementAssocType, null, nameType, constrainedRoleType); ArrayList<Topic> constrainedOccurrenceTypes = getOtherPlayerOfBinaryAssociation(constraintTopic, constraintRoleType, constrainedStatementAssocType, null, occurrenceType, constrainedRoleType); ArrayList<Topic> constrainedAssociationTypes = getOtherPlayerOfBinaryAssociation(constraintTopic, constraintRoleType, constrainedStatementAssocType, null, associationType, constrainedRoleType); - ArrayList<Topic> constrainedStatements = Utils.merge(Utils.merge(constrainedNameTypes, constrainedOccurrenceTypes), constrainedAssociationTypes); + ArrayList<Topic> constrainedStatements = Utils.union(Utils.union(constrainedNameTypes, constrainedOccurrenceTypes), constrainedAssociationTypes); if(constrainedStatements.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(constraintTopic) + " must be bound exactly once to a statement topic via a " + PSIs.TMCL.tmclConstrainedStatement + " association, but is: " + constrainedStatements.size()); else return constrainedStatements.get(0); @@ -950,7 +950,7 @@ Topic constrainedStatementAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedStatement, tm); ArrayList<Topic> nameTypeTopics = getOtherPlayerOfBinaryAssociation(rootConstraint, constraintRoleType, constrainedStatementAssocType, null, nameType, constrainedRoleType); ArrayList<Topic> occurrenceTypeTopics = getOtherPlayerOfBinaryAssociation(rootConstraint, constraintRoleType, constrainedStatementAssocType, null, occurrenceType, constrainedRoleType); - ArrayList<Topic> typeTopics = Utils.merge(nameTypeTopics, occurrenceTypeTopics); + ArrayList<Topic> typeTopics = Utils.union(nameTypeTopics, occurrenceTypeTopics); if(typeTopics.size() != 1){ throw new InvalidGdlSchemaException("the constraint " + getAnyIdOfTopic(rootConstraint) + " must be bound extactly once to an occurrence or name type, but is: " + typeTopics.size()); @@ -998,7 +998,7 @@ Topic occurrenceType = getTopicByPsi(PSIs.TMCL.tmclOccurrenceType, tm); ArrayList<Topic> nameTypes = getOtherPlayerOfBinaryAssociation(constraint, constraintRoleType, constrainedStatementAssocType, null, nameType, constrainedRoleType); ArrayList<Topic> occurrenceTypes = getOtherPlayerOfBinaryAssociation(constraint, constraintRoleType, constrainedStatementAssocType, null, occurrenceType, constrainedRoleType); - ArrayList<Topic> nameOrOccurrenceTypes = Utils.merge(nameTypes, occurrenceTypes); + ArrayList<Topic> nameOrOccurrenceTypes = Utils.union(nameTypes, occurrenceTypes); if(nameOrOccurrenceTypes.size() == 0){ return result; @@ -1030,7 +1030,7 @@ JsArray<Topic> topicTypes = topicInstance.getTypes(); for(int i = 0; i != topicTypes.length(); ++i){ ArrayList<Topic> resultForType = getTopicRoleConstraintsForTopicType(topicTypes.get(i)); - result = Utils.merge(result, resultForType); + result = Utils.union(result, resultForType); } return result; @@ -1093,7 +1093,7 @@ ArrayList<Topic> resultIi = getOtherPlayerOfBinaryAssociation(tmValueOrvalueGroup, descriptorRoleType, displayByAssocType, null, tmConstruct, itemIdentifierConstraintType); ArrayList<Topic> resultName = getOtherPlayerOfBinaryAssociation(tmValueOrvalueGroup, descriptorRoleType, displayByAssocType, null, tmConstruct, topicNameConstraintType); - ArrayList<Topic> result = Utils.merge(Utils.merge(Utils.merge(resultPsi, resultSl), resultIi), resultName); + ArrayList<Topic> result = Utils.union(Utils.union(Utils.union(resultPsi, resultSl), resultIi), resultName); if(result.size() > 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(tmValueOrvalueGroup) + " must be bound none or once to a tmcl:constraint via a " + PSIs.AssociationType.gdlDisplayBy + " assciation, but is: " + result.size()); else if(result.size() == 1) return result.get(0);
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Wed Aug 24 08:24:57 2011 (r777) @@ -23,7 +23,7 @@ // returns a list that contains a union of both lists - public static <T> ArrayList<T> union(ArrayList<T> fst, ArrayList<T> snd){ + public static <T> ArrayList<T> intersection(ArrayList<T> fst, ArrayList<T> snd){ ArrayList<T> result = new ArrayList<T>(); if(fst == null || snd == null) return result; @@ -34,7 +34,7 @@
// returns an ArrayList that is a merged ArrayList of fst and snd - public static <T> ArrayList<T> merge(ArrayList<T> fst, ArrayList<T> snd){ + public static <T> ArrayList<T> union(ArrayList<T> fst, ArrayList<T> snd){ ArrayList<T> result = new ArrayList<T>(); if(fst != null) for (T t : fst) if(!result.contains(t)) result.add(t);
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/container/GdlUnit.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/container/GdlUnit.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/container/GdlUnit.java Wed Aug 24 08:24:57 2011 (r777) @@ -215,7 +215,7 @@ ArrayList<Topic> nameConstraints = TmHelper.getOtherPlayerOfBinaryAssociation(this.tmRepresentative, descriptorRoleType, tmBindingAssocType, null, tmclTopicNameConstraintType, tmConstructRoleType); ArrayList<Topic> variantConstraints = TmHelper.getOtherPlayerOfBinaryAssociation(this.tmRepresentative, descriptorRoleType, tmBindingAssocType, null, tmclVariantNameConstraintType, tmConstructRoleType); ArrayList<Topic> occurrenceConstraints = TmHelper.getOtherPlayerOfBinaryAssociation(this.tmRepresentative, descriptorRoleType, tmBindingAssocType, null, tmclTopicOccurrenceConstraintType, tmConstructRoleType); - ArrayList<Topic> allConstraints = Utils.merge(Utils.merge(nameConstraints, variantConstraints), occurrenceConstraints); + ArrayList<Topic> allConstraints = Utils.union(Utils.union(nameConstraints, variantConstraints), occurrenceConstraints); if(allConstraints.size() > 1) throw new InvalidGdlSchemaException("the topic " + TmHelper.getAnyIdOfTopic(this.tmRepresentative) + " can be bound only to one constraint, but is " + allConstraints.size());
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java Wed Aug 24 08:24:57 2011 (r777) @@ -94,20 +94,15 @@ }else if(TmHelper.isInstanceOf(tmRepresentative, PSIs.TopicType.gdlDefaultCreatorTopicView)){ return new GdlDefaultCreatorTopicView(tmRepresentative); }else if(TmHelper.isInstanceOf(tmRepresentative, PSIs.TopicType.gdlDefaultEditorTopicView)){ - if(!(receivedData instanceof Topic) && receivedData != null) throw new ExecutionException("receivedData must be of type Topic when used with " + PSIs.TopicType.gdlDefaultEditorTopicView); return new GdlDefaultEditorTopicView(tmRepresentative, (Topic)receivedData); }else if(TmHelper.isInstanceOf(tmRepresentative, PSIs.TopicType.gdlSpecialCreatorTopicView)){ - if(!(receivedData instanceof Topic) && receivedData != null) throw new ExecutionException("receivedData must be of type Topic when used with " + PSIs.TopicType.gdlSpecialCreatorTopicView); return new GdlSpecialCreatorTopicView(tmRepresentative); }else if(TmHelper.isInstanceOf(tmRepresentative, PSIs.TopicType.gdlSpecialEditorTopicView)){ - if(!(receivedData instanceof Topic) && receivedData != null) throw new ExecutionException("receivedData must be of type Topic when used with " + PSIs.TopicType.gdlSpecialEditorTopicView); return new GdlSpecialEditorTopicView(tmRepresentative, (Topic)receivedData); }else if(TmHelper.isInstanceOf(tmRepresentative, PSIs.TopicType.gdlCreatorAssociationview)){ - if(!(receivedData instanceof Topic) && receivedData != null) throw new ExecutionException("receivedData must be of type Association when used with " + PSIs.TopicType.gdlCreatorAssociationview); - return new GdlCreatorAssociationView(tmRepresentative, (Topic)receivedData); + return new GdlCreatorAssociationView(tmRepresentative, (Association)receivedData); }else if(TmHelper.isInstanceOf(tmRepresentative, PSIs.TopicType.gdlEditorAssociationView)){ - if(!(receivedData instanceof Topic) && receivedData != null) throw new ExecutionException("receivedData must be of type Associaiton when used with " + PSIs.TopicType.gdlEditorAssociationView); - return new GdlEditorAssociationView(tmRepresentative, (Topic)receivedData); + return new GdlEditorAssociationView(tmRepresentative, (Association)receivedData); }else{ String values = ""; for(int i = 0; i != tmRepresentative.getTypes().length(); ++i){
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/text/GdlText.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/text/GdlText.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/text/GdlText.java Wed Aug 24 08:24:57 2011 (r777) @@ -131,6 +131,8 @@ this.createNewTextArea().setText(((Topic)this.receivedData).getOccurrences(occurrenceType).get(i).getValue()); } else if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TopicType.gdlRolePlayer)){ this.createNewTextArea().setText("gdl:Role-Player instance"); + // TODO: search role => role-type + role-player + // TODO: display the correponding value } // TODO: implement type, variant, datatype, associations, roles, ... constraints }
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Wed Aug 24 08:24:57 2011 (r777) @@ -1,19 +1,25 @@ package us.isidor.gdl.anaToMia.Widgets.view;
import java.util.ArrayList; + import com.google.gwt.core.client.JsArray; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; -import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Occurrence; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; +import us.isidor.gdl.anaToMia.Widgets.base.ButtonableObject; +import us.isidor.gdl.anaToMia.Widgets.base.PSIs; import us.isidor.gdl.anaToMia.Widgets.base.TmHelper; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; import us.isidor.gdl.anaToMia.Widgets.environment.Pair; +import us.isidor.gdl.anaToMia.Widgets.value.ContentOrientationValue;
public abstract class GdlAssociationView extends GdlView { - protected ArrayList<Association> associationsToRepresent = null; - protected boolean associationsToRepresentSet = false; private ArrayList<Topic> associationRoleConstraints = new ArrayList<Topic>(); private boolean associationRoleConstraintsSet = false; private ArrayList<Topic> topicRoleConstraints = new ArrayList<Topic>(); @@ -32,25 +38,28 @@ super(); } - - public GdlAssociationView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException { - this(); - this.tmRepresentative = tmRepresentative; - this.tm = this.tmRepresentative.getTopicMap(); - this.receivedData = receivedData; - this.setId(this.getId()); - this.setGdlStyle(); - if(this instanceof GdlEditorAssociationView) this.associationsToRepresent = this.filterAssociations(); - - ArrayList<Topic> objectsContained = this.contains(); - - Topic currentTopic = this.getStartElement(objectsContained); - Topic lastTopic = super.getTmRepresentative(); - while(currentTopic != null){ - this.append(lastTopic, currentTopic); - lastTopic = currentTopic; - currentTopic = TmHelper.getNextContainee(currentTopic, objectsContained); - } + + public GdlAssociationView(Topic tmRepresentative, Association receivedData) throws InvalidGdlSchemaException, ExecutionException { + super(tmRepresentative, receivedData); + } + + + // content orientation has no effect on a view, so here must the original method + // defined in GdlVisibleObject implemented + @Override + public void setContentOrientation(ContentOrientationValue value) throws InvalidGdlSchemaException, ExecutionException { + if(value == ContentOrientationValue.HORIZONTAL && this.containerPanel == null) this.containerPanel = new HorizontalPanel(); + else if(this.containerPanel == null) this.containerPanel = new VerticalPanel(); + + this.mainPanel.add(this.containerPanel); + } + + + // Searches the topic that represents the first item that is placed within this view instance + // i.e. such an item must not have an association that is bound to it via a role of the type + // gdl:ancestor. + protected Topic getStartElement(ArrayList<Topic> containees) throws InvalidGdlSchemaException { + return TmHelper.getFirstContainee(super.getTmRepresentative(), containees); } @@ -155,77 +164,6 @@ } - // returns all associations of the received topicthat have a - // correct type determined by this association-view - private ArrayList<Association> filterAssociationsByType() throws InvalidGdlSchemaException { - ArrayList<Association> allAssociations = new ArrayList<Association>(); - if(this.receivedData != null) - for(int i = 0; i != ((Topic)this.receivedData).getRolesPlayed().length(); ++i) - allAssociations.add(((Topic)this.receivedData).getRolesPlayed().get(i).getParent()); - - // collect only the associations that match the correct association type - ArrayList<Association> filteredAssociationsByType = new ArrayList<Association>(); - for (Association assoc : allAssociations) - if(assoc.getType().equals(this.getAssociationType())) filteredAssociationsByType.add(assoc); - - return filteredAssociationsByType; - } - - - // returns all associations contained in the ArrayList allAssociations - // that have the only permitted role types - private ArrayList<Association> filterAssociationsByRoleAndPlayerTypes(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { - if(allAssociations == null) return new ArrayList<Association>(); - - ArrayList<Association> filteredAssociationsByAssociationRoleConstraints = new ArrayList<Association>(); - for (Association assoc : allAssociations){ - JsArray<Role> roles = assoc.getRoles(); - int i = 0; - for( ; i != roles.length(); ++i){ - Topic rt = roles.get(i).getType(); - Topic rp = roles.get(i).getPlayer(); - - int j = 0; - for( ; j != this.getRoleAndPlayerTypes().size(); ++j){ - Pair<Topic, Topic> pair = this.getRoleAndPlayerTypes().get(j); - if(pair.getFirst().equals(rt) && TmHelper.isInstanceOf(rp, pair.getSecond())) break; - } - - if(j == this.getRoleAndPlayerTypes().size()) break; - } - - if(i == roles.length())filteredAssociationsByAssociationRoleConstraints.add(assoc); - } - - return filteredAssociationsByAssociationRoleConstraints; - } - - - // throws an InvalidGdlSchemaException if passed one association does not satisfy - // any defined role-combination-constraint - private void checkAssociationsByRoleCombinations(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { - if(this.getRoleCombinationConstraints().size() == 0) return; - - for (Association assoc : allAssociations) { - JsArray<Role> roles = assoc.getRoles(); - if(roles.length() != 2) throw new InvalidGdlSchemaException("the association " + assoc + " violates the defined role-combination-constrains"); - Role fstRole = roles.get(0); - Role sndRole = roles.get(1); - - int i = 0; - for ( ; i != this.getValidRoleCombinations().size(); ++i) { - Pair<Topic, Topic> fstCombi = this.getValidRoleCombinations().get(i).getFirst(); - Pair<Topic, Topic> sndCombi = this.getValidRoleCombinations().get(i).getSecond(); - - if(fstRole.getType().equals(fstCombi.getFirst()) && TmHelper.isInstanceOf(fstRole.getPlayer(), fstCombi.getSecond()) && sndRole.getType().equals(sndCombi.getFirst()) && TmHelper.isInstanceOf(sndRole.getPlayer(), sndCombi.getSecond())) break; - if(sndRole.getType().equals(fstCombi.getFirst()) && TmHelper.isInstanceOf(sndRole.getPlayer(), fstCombi.getSecond()) && fstRole.getType().equals(sndCombi.getFirst()) && TmHelper.isInstanceOf(fstRole.getPlayer(), sndCombi.getSecond())) break; - } - - if(i == this.getValidRoleCombinations().size()) throw new InvalidGdlSchemaException("the association " + assoc + " violates the defined role-combination-constrains"); - } - } - - // Returns all valid role-player combinations for this association-view public ArrayList<Pair<Pair<Topic, Topic>, Pair<Topic, Topic>>> getValidRoleCombinations() throws InvalidGdlSchemaException { if(this.validRoleCombinationsSet){ @@ -241,23 +179,120 @@ return this.validRoleCombinations; } } - + + + // This class represents a single association that is displayed. + // Further elements are created by caling the GdlInstantiator.instantiate + // method, the passed received argument is set ot the association that is + // represented by this class + protected class AssociationItem extends GdlView { + private int indexInParent = -1; + + + @SuppressWarnings("unused") + private AssociationItem(){ + super(); + } + + + public AssociationItem(Topic tmRepresentative, Association receivedData, int indexInParent) throws InvalidGdlSchemaException, ExecutionException{ + super(tmRepresentative, receivedData); + this.indexInParent = indexInParent; + + ArrayList<Topic> objectsContained = this.contains(); + + Topic currentTopic = this.getStartElement(objectsContained); + Topic lastTopic = super.getTmRepresentative(); + while(currentTopic != null){ + this.append(lastTopic, currentTopic); + lastTopic = currentTopic; + currentTopic = TmHelper.getNextContainee(currentTopic, objectsContained); + } + } + + + // this method should be invoked if a new sub-element is added to this instance. + // instances of GdlView does not organize their sub-elements in + // tables, sub-elements are placed directly on the mainpanel + @Override + protected ButtonableObject addToContainerPanel(Widget widget){ + this.subElements.add(widget); + this.mainPanel.add(widget); + return null; + } + + + // returns the string value of a gdl:id occurrence + public String getId() throws InvalidGdlSchemaException { + JsArray<Occurrence> idOccs = getOccurrences(PSIs.OccurrenceType.gdlId); + if(idOccs.length() != 1){ + throw new InvalidGdlSchemaException("The topic " + TmHelper.getAnyIdOfTopic(this.tmRepresentative) + " must be bound to exactly one occurrence of the type " + PSIs.OccurrenceType.gdlId + ", but is bound " + idOccs.length() + " times to it"); + } else { + return idOccs.get(0).getValue() + "__GDL_" + this.indexInParent; + } + } + + + // sets all GDL styles that are defined by the topic map representative + @Override + protected void setGdlStyle() throws InvalidGdlSchemaException, ExecutionException { + // do nothing: all properties are set in the parent element + // and are ignored for this element + } + + + // sets all GDL styles that are defined by the topic map representative to tha passed widget + @Override + public void setGdlStyle(Widget widget) throws InvalidGdlSchemaException, ExecutionException { + String[] styleClasses = new String[]{null, PSIs.Scope.gdlActive, PSIs.Scope.gdlFocus, PSIs.Scope.gdlHover}; + for (String styleClass : styleClasses) { + this.setVerticalAlign(widget, this.getVerticalAlign(styleClass), styleClass); + + this.setBorderColor(widget, this.getBorderColor(styleClass), styleClass); + this.setBorderTopColor(widget, this.getBorderTopColor(styleClass), styleClass); + this.setBorderRightColor(widget, this.getBorderRightColor(styleClass), styleClass); + this.setBorderBottomColor(widget, this.getBorderBottomColor(styleClass), styleClass); + this.setBorderLeftColor(widget, this.getBorderLeftColor(styleClass), styleClass); + + this.setBorderStyle(widget, this.getBorderStyle(styleClass), styleClass); + this.setBorderTopStyle(widget, this.getBorderTopStyle(styleClass), styleClass); + this.setBorderRightStyle(widget, this.getBorderRightStyle(styleClass), styleClass); + this.setBorderBottomStyle(widget, this.getBorderBottomStyle(styleClass), styleClass); + this.setBorderLeftStyle(widget, this.getBorderLeftStyle(styleClass), styleClass); + + this.setBorderWidth(widget, this.getBorderWidth(styleClass), styleClass); + this.setBorderTopWidth(widget, this.getBorderTopWidth(styleClass), styleClass); + this.setBorderRightWidth(widget, this.getBorderRightWidth(styleClass), styleClass); + this.setBorderBottomWidth(widget, this.getBorderBottomWidth(styleClass), styleClass); + this.setBorderLeftWidth(widget, this.getBorderLeftWidth(styleClass), styleClass); + + this.setBorderRadius(widget, this.getBorderRadius(styleClass), styleClass); + this.setBorderTopRightRadius(widget, this.getBorderTopRightRadius(styleClass), styleClass); + this.setBorderBottomRightRadius(widget, this.getBorderBottomRightRadius(styleClass), styleClass); + this.setBorderBottomLeftRadius(widget, this.getBorderBottomLeftRadius(styleClass), styleClass); + this.setBorderTopLeftRadius(widget, this.getBorderTopLeftRadius(styleClass), styleClass); + + this.setCursor(widget, this.getCursor(styleClass), styleClass); + + this.setWidth(widget, this.getWidth(styleClass), styleClass); + this.setMaxWidth(widget, this.getMaxWidth(styleClass), styleClass); + this.setMinWidth(widget, this.getMinWidth(styleClass), styleClass); + + this.setHeight(widget, this.getHeight(styleClass), styleClass); + this.setMaxHeight(widget, this.getMaxHeight(styleClass), styleClass); + this.setMinHeight(widget, this.getMinHeight(styleClass), styleClass); + + this.setBackgroundColor(widget, this.getBackgroundColor(styleClass), styleClass); + } + } + + + @Override + @Deprecated + public TopicMap getContent() { + // this item has no content that is a Topic Map item! + return null; + } - // returns an array with associations that - // must be represented by this association view - private ArrayList<Association> filterAssociations() throws InvalidGdlSchemaException { - ArrayList<Association> filteredAssociations = this.filterAssociationsByType(); - filteredAssociations = this.filterAssociationsByRoleAndPlayerTypes(filteredAssociations); - this.checkAssociationsByRoleCombinations(filteredAssociations); - this.associationsToRepresent = filteredAssociations; - this.associationsToRepresentSet = true; - return this.associationsToRepresent; - } - - - // Returns the associations that are represented by this associaton-view - public ArrayList<Association> getAssociationsToRepresent() throws InvalidGdlSchemaException { - if(this.associationsToRepresentSet) return this.associationsToRepresent; - else return this.filterAssociations(); } }
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlCreatorAssociationView.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlCreatorAssociationView.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlCreatorAssociationView.java Wed Aug 24 08:24:57 2011 (r777) @@ -1,5 +1,6 @@ package us.isidor.gdl.anaToMia.Widgets.view;
+import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; @@ -8,11 +9,11 @@
public class GdlCreatorAssociationView extends GdlAssociationView {
- public GdlCreatorAssociationView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException { + public GdlCreatorAssociationView(Topic tmRepresentative, Association receivedData) throws InvalidGdlSchemaException, ExecutionException { super(tmRepresentative, receivedData); // TODO Auto-generated constructor stub } - +
@Override public TopicMap getContent() {
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlEditorAssociationView.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlEditorAssociationView.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlEditorAssociationView.java Wed Aug 24 08:24:57 2011 (r777) @@ -1,19 +1,129 @@ package us.isidor.gdl.anaToMia.Widgets.view;
+import java.util.ArrayList;
+import com.google.gwt.core.client.JsArray; + +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; +import us.isidor.gdl.anaToMia.Widgets.base.TmHelper; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; +import us.isidor.gdl.anaToMia.Widgets.environment.Pair;
public class GdlEditorAssociationView extends GdlAssociationView { + protected ArrayList<Association> associationsToRepresent = null; + protected boolean associationsToRepresentSet = false; +
- public GdlEditorAssociationView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException { + public GdlEditorAssociationView(Topic tmRepresentative, Association receivedData) throws InvalidGdlSchemaException, ExecutionException { super(tmRepresentative, receivedData); - // TODO Auto-generated constructor stub + + // create an association item for each association that must be represetned + // by this view + for (int i = 0; i != this.getAssociationsToRepresent().size(); ++i) + this.addToContainerPanel(new AssociationItem(this.tmRepresentative, this.getAssociationsToRepresent().get(i), i)); + } + + + // returns all associations of the received topic that have a + // correct type determined by this association-view + private ArrayList<Association> filterAssociationsByType() throws InvalidGdlSchemaException { + ArrayList<Association> allAssociations = new ArrayList<Association>(); + if(this.receivedData != null) + for(int i = 0; i != ((Topic)this.receivedData).getRolesPlayed().length(); ++i) + allAssociations.add(((Topic)this.receivedData).getRolesPlayed().get(i).getParent()); + + // collect only the associations that match the correct association type + ArrayList<Association> filteredAssociationsByType = new ArrayList<Association>(); + for (Association assoc : allAssociations) + if(assoc.getType().equals(this.getAssociationType())) filteredAssociationsByType.add(assoc); + + return filteredAssociationsByType; + } + + + // returns all associations contained in the ArrayList allAssociations + // that have the only permitted role types + private ArrayList<Association> filterAssociationsByRoleAndPlayerTypes(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { + if(allAssociations == null) return new ArrayList<Association>(); + + ArrayList<Association> filteredAssociationsByAssociationRoleConstraints = new ArrayList<Association>(); + for (Association assoc : allAssociations){ + JsArray<Role> roles = assoc.getRoles(); + int i = 0; + for( ; i != roles.length(); ++i){ + Topic rt = roles.get(i).getType(); + Topic rp = roles.get(i).getPlayer(); + + int j = 0; + for( ; j != this.getRoleAndPlayerTypes().size(); ++j){ + Pair<Topic, Topic> pair = this.getRoleAndPlayerTypes().get(j); + if(pair.getFirst().equals(rt) && TmHelper.isInstanceOf(rp, pair.getSecond())) break; + } + + if(j == this.getRoleAndPlayerTypes().size()) break; + } + + if(i == roles.length())filteredAssociationsByAssociationRoleConstraints.add(assoc); + } + + return filteredAssociationsByAssociationRoleConstraints; } +
+ // throws an InvalidGdlSchemaException if passed one association does not satisfy + // any defined role-combination-constraint + private void checkAssociationsByRoleCombinations(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { + if(this.getRoleCombinationConstraints().size() == 0) return; + + for (Association assoc : allAssociations) { + JsArray<Role> roles = assoc.getRoles(); + if(roles.length() != 2) throw new InvalidGdlSchemaException("the association " + assoc + " violates the defined role-combination-constrains"); + Role fstRole = roles.get(0); + Role sndRole = roles.get(1); + + int i = 0; + for ( ; i != this.getValidRoleCombinations().size(); ++i) { + Pair<Topic, Topic> fstCombi = this.getValidRoleCombinations().get(i).getFirst(); + Pair<Topic, Topic> sndCombi = this.getValidRoleCombinations().get(i).getSecond(); + + if(fstRole.getType().equals(fstCombi.getFirst()) && TmHelper.isInstanceOf(fstRole.getPlayer(), fstCombi.getSecond()) && sndRole.getType().equals(sndCombi.getFirst()) && TmHelper.isInstanceOf(sndRole.getPlayer(), sndCombi.getSecond())) break; + if(sndRole.getType().equals(fstCombi.getFirst()) && TmHelper.isInstanceOf(sndRole.getPlayer(), fstCombi.getSecond()) && fstRole.getType().equals(sndCombi.getFirst()) && TmHelper.isInstanceOf(fstRole.getPlayer(), sndCombi.getSecond())) break; + } + + if(i == this.getValidRoleCombinations().size()) throw new InvalidGdlSchemaException("the association " + assoc + " violates the defined role-combination-constrains"); + } + } + + + // returns an array with associations that + // must be represented by this association view + private ArrayList<Association> filterAssociations() throws InvalidGdlSchemaException { + if(this.receivedData instanceof Association){ + this.associationsToRepresent = new ArrayList<Association>(); + this.associationsToRepresent.add((Association)this.receivedData); + return this.associationsToRepresent; + } else { + ArrayList<Association> filteredAssociations = this.filterAssociationsByType(); + filteredAssociations = this.filterAssociationsByRoleAndPlayerTypes(filteredAssociations); + this.checkAssociationsByRoleCombinations(filteredAssociations); + this.associationsToRepresent = filteredAssociations; + this.associationsToRepresentSet = true; + return this.associationsToRepresent; + } + } + + + // Returns the associations that are represented by this associaton-view + public ArrayList<Association> getAssociationsToRepresent() throws InvalidGdlSchemaException { + if(this.associationsToRepresentSet) return this.associationsToRepresent; + else return this.filterAssociations(); + } +
@Override public String getViewName() {
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlTopicView.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlTopicView.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlTopicView.java Wed Aug 24 08:24:57 2011 (r777) @@ -1,13 +1,69 @@ package us.isidor.gdl.anaToMia.Widgets.view;
+import java.util.ArrayList; +import com.google.gwt.user.client.ui.Widget; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; +import us.isidor.gdl.anaToMia.Widgets.base.ButtonableObject; +import us.isidor.gdl.anaToMia.Widgets.base.TmHelper; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; +import us.isidor.gdl.anaToMia.Widgets.value.ContentOrientationValue;
public abstract class GdlTopicView extends GdlView {
public GdlTopicView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException{ super(tmRepresentative, receivedData); + + ArrayList<Topic> objectsContained = this.contains(); + + Topic currentTopic = this.getStartElement(objectsContained); + Topic lastTopic = super.getTmRepresentative(); + while(currentTopic != null){ + this.append(lastTopic, currentTopic); + lastTopic = currentTopic; + currentTopic = TmHelper.getNextContainee(currentTopic, objectsContained); + } + } + + + // this method should be invoked if a new sub-element is added to this instance. + // instances of GdlView does not organize their sub-elements in + // tables, sub-elements are placed directly on the mainpanel + @Override + protected ButtonableObject addToContainerPanel(Widget widget){ + this.subElements.add(widget); + this.mainPanel.add(widget); + return null; + } + + + // content orientation has no effect on a view + @Override + public void setContentOrientation(ContentOrientationValue value) throws InvalidGdlSchemaException, ExecutionException { + // do nothing, no table is set for organizing content widgets, since a view does not organize + // its content in this manner + } + + + // Searches the topic that represents the first item that is placed within this view instance + // i.e. such an item must not have an association that is bound to it via a role of the type + // gdl:ancestor. + protected Topic getStartElement(ArrayList<Topic> containees) throws InvalidGdlSchemaException { + return TmHelper.getFirstContainee(super.getTmRepresentative(), containees); + } + + + // sets all GDL styles that are defined by the topic map representative. + // In contrast to visible-object, the styles are applied only on the main + // panel, since the view's sub-elements must be formatted with their own + // style properties + @Override + protected void setGdlStyle() throws InvalidGdlSchemaException, ExecutionException { + this.setDisplay(this.getDisplay()); + this.setZindex(this.getZindex()); + this.setFloat(this.getFloat()); + this.setClear(this.getClear()); + this.setGdlStyle(this.mainPanel); } }
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java Tue Aug 23 11:06:14 2011 (r776) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java Wed Aug 24 08:24:57 2011 (r777) @@ -1,5 +1,6 @@ package us.isidor.gdl.anaToMia.Widgets.view;
+ import java.util.ArrayList; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.ui.Widget; @@ -7,11 +8,10 @@ import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Name; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; -import us.isidor.gdl.anaToMia.Widgets.base.ButtonableObject; import us.isidor.gdl.anaToMia.Widgets.base.GdlPosition; -import us.isidor.gdl.anaToMia.Widgets.base.PSIs; import us.isidor.gdl.anaToMia.Widgets.base.GdlVisibleObject; import us.isidor.gdl.anaToMia.Widgets.base.IGdlContainer; +import us.isidor.gdl.anaToMia.Widgets.base.PSIs; import us.isidor.gdl.anaToMia.Widgets.base.TmHelper; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.GdlInstantiator; @@ -27,26 +27,17 @@ public GdlView(Topic tmRepresentative, Construct receivedData) throws InvalidGdlSchemaException, ExecutionException{ super(tmRepresentative, receivedData); - ArrayList<Topic> objectsContained = this.contains(); - Topic currentTopic = this.getStartElement(objectsContained); - Topic lastTopic = super.getTmRepresentative(); - while(currentTopic != null){ - this.append(lastTopic, currentTopic); - lastTopic = currentTopic; - currentTopic = TmHelper.getNextContainee(currentTopic, objectsContained); - } } - // this method should be invoked if a new sub-element is added to this instance. - // instances ov GdlView does not organize their sub-elements in - // tables, sub-elements are placed directly on the mainpanel - @Override - protected ButtonableObject addToContainerPanel(Widget widget){ - this.subElements.add(widget); - this.mainPanel.add(widget); - return null; + + public String getViewName()throws InvalidGdlSchemaException { + JsArray<Name> viewNames = super.tmRepresentative.getNames(tm.getTopicBySubjectIdentifier(tm.createLocator(PSIs.NameType.gdlViewName))); + if(viewNames.length() != 1){ + throw new InvalidGdlSchemaException("A view must be bound to a " + PSIs.NameType.gdlViewName + " instance"); + } + return viewNames.get(0).getValue(); } @@ -56,15 +47,6 @@ // do nothing, no table is set for organizing content widgets, since a view does not organize // its content in this manner } - - - public String getViewName()throws InvalidGdlSchemaException { - JsArray<Name> viewNames = super.tmRepresentative.getNames(tm.getTopicBySubjectIdentifier(tm.createLocator(PSIs.NameType.gdlViewName))); - if(viewNames.length() != 1){ - throw new InvalidGdlSchemaException("A view must be bound to a " + PSIs.NameType.gdlViewName + " instance"); - } - return viewNames.get(0).getValue(); - } // Searches the topic that represents the first item that is placed within this view instance @@ -75,20 +57,6 @@ } - // sets all GDL styles that are defined by the topic map representative. - // In contrast to visible-object, the styles are applied only on the main - // panel, since the view's sub-elements must be formatted with their own - // style properties - @Override - protected void setGdlStyle() throws InvalidGdlSchemaException, ExecutionException { - this.setDisplay(this.getDisplay()); - this.setZindex(this.getZindex()); - this.setFloat(this.getFloat()); - this.setClear(this.getClear()); - this.setGdlStyle(this.mainPanel); - } - - // creates a GdlVisbleObject instance of the passed topic current and inserts it // by using it's defined position style depending on the GdlVisibleObject // represented by ancestor. If ancestor is null current is the first topic