--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2010, 2011 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.browsing.ui.model.visuals;\r
+\r
+import org.simantics.browsing.ui.model.InvalidContribution;\r
+import org.simantics.browsing.ui.model.check.CheckedStateContribution;\r
+import org.simantics.browsing.ui.model.check.CheckedStateRule;\r
+import org.simantics.browsing.ui.model.imagedecorators.ImageDecorationContribution;\r
+import org.simantics.browsing.ui.model.imagedecorators.ImageDecorationRule;\r
+import org.simantics.browsing.ui.model.images.ImageContribution;\r
+import org.simantics.browsing.ui.model.images.ImageRule;\r
+import org.simantics.browsing.ui.model.labeldecorators.LabelDecorationContribution;\r
+import org.simantics.browsing.ui.model.labeldecorators.LabelDecorationRule;\r
+import org.simantics.browsing.ui.model.labels.LabelContribution;\r
+import org.simantics.browsing.ui.model.labels.LabelRule;\r
+import org.simantics.browsing.ui.model.modifiers.ModifierContribution;\r
+import org.simantics.browsing.ui.model.modifiers.ModifierRule;\r
+import org.simantics.browsing.ui.model.nodetypes.NodeType;\r
+import org.simantics.browsing.ui.model.nodetypes.OrderedNodeTypeMultiMap;\r
+import org.simantics.browsing.ui.model.sorters.SorterContribution;\r
+import org.simantics.browsing.ui.model.sorters.SorterRule;\r
+import org.simantics.browsing.ui.model.tests.Test;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.exception.AdaptionException;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.viewpoint.ontology.ViewpointResource;\r
+\r
+/**\r
+ * Produces labels for nodes of given node type.\r
+ * @author Hannu Niemistö\r
+ */\r
+public class VisualsContribution implements Comparable<VisualsContribution> {\r
+ protected NodeType nodeType;\r
+ protected Test test;\r
+ protected double priority;\r
+ \r
+ public VisualsContribution(NodeType nodeType, Test test, double priority) throws InvalidContribution {\r
+ if(test != null && !test.isCompatible(\r
+ nodeType.getContentType()\r
+ ))\r
+ throw new InvalidContribution("Test is not compatible with the content type.");\r
+ this.nodeType = nodeType;\r
+ this.test = test;\r
+ this.priority = priority;\r
+ }\r
+ \r
+ public static void load(ReadGraph g, Resource visualsContributionResource,\r
+ OrderedNodeTypeMultiMap<LabelContribution> labelContributions,\r
+ OrderedNodeTypeMultiMap<ImageContribution> imageContributions,\r
+ OrderedNodeTypeMultiMap<CheckedStateContribution> checkedStateContributions,\r
+ OrderedNodeTypeMultiMap<LabelDecorationContribution> labelDecorationContributions,\r
+ OrderedNodeTypeMultiMap<ImageDecorationContribution> imageDecorationContributions,\r
+ OrderedNodeTypeMultiMap<ModifierContribution> modifierContributions,\r
+ OrderedNodeTypeMultiMap<SorterContribution> sorterContributions,\r
+ OrderedNodeTypeMultiMap<FlatNodeContribution> flatNodeContributions) \r
+ throws DatabaseException, InvalidContribution {\r
+ ViewpointResource vr = ViewpointResource.getInstance(g);\r
+ \r
+ Resource testResource = g.getPossibleObject(visualsContributionResource, vr.VisualsContribution_HasCondition);\r
+ Test test = testResource == null ? null : g.adapt(testResource, Test.class);\r
+ \r
+ Double mpriority = g.getPossibleRelatedValue(visualsContributionResource, vr.VisualsContribution_HasPriority);\r
+ double priority = mpriority == null ? 0.0 : mpriority.doubleValue(); \r
+ \r
+ for(Resource nodeTypeResource : g.getObjects(visualsContributionResource, vr.VisualsContribution_HasNodeType)) {\r
+ NodeType nodeType = g.adapt(nodeTypeResource, NodeType.class);\r
+\r
+ for(Resource ruleResource : g.getObjects(visualsContributionResource, vr.VisualsContribution_HasRule)) {\r
+ if(ruleResource.equals(vr.FlatNodeRule)) \r
+ flatNodeContributions.put(nodeType, FlatNodeContribution.INSTANCE);\r
+ else { \r
+ VisualsRule rule;\r
+ try {\r
+ rule = g.adapt(ruleResource, VisualsRule.class);\r
+ } catch(AdaptionException e) {\r
+ e.printStackTrace();\r
+ continue;\r
+ } \r
+ try {\r
+ // Note: the rule may be an instance of multiple interfaces\r
+ if(rule instanceof LabelRule)\r
+ labelContributions.put(nodeType, new LabelContribution(nodeType, test, (LabelRule)rule, priority));\r
+ if(rule instanceof ModifierRule)\r
+ modifierContributions.put(nodeType, new ModifierContribution(nodeType, test, (ModifierRule)rule, priority));\r
+ if(rule instanceof ImageRule)\r
+ imageContributions.put(nodeType, new ImageContribution(nodeType, test, (ImageRule)rule, priority));\r
+ if(rule instanceof CheckedStateRule)\r
+ checkedStateContributions.put(nodeType, new CheckedStateContribution(nodeType, test, (CheckedStateRule)rule, priority));\r
+ if(rule instanceof LabelDecorationRule)\r
+ labelDecorationContributions.put(nodeType, new LabelDecorationContribution(nodeType, test, (LabelDecorationRule)rule, priority));\r
+ if(rule instanceof ImageDecorationRule)\r
+ imageDecorationContributions.put(nodeType, new ImageDecorationContribution(nodeType, test, (ImageDecorationRule)rule, priority));\r
+ if(rule instanceof SorterRule)\r
+ sorterContributions.put(nodeType, new SorterContribution(nodeType, test, (SorterRule)rule, priority));\r
+ } catch(InvalidContribution e) {\r
+ e.printStackTrace();\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } \r
+ \r
+ public NodeType getNodeType() {\r
+ return nodeType;\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(VisualsContribution o) {\r
+ return Double.compare(o.priority, priority);\r
+ }\r
+}\r