X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fsymbolcontribution%2FCompositeSymbolProviderFactory.java;h=d57d0007b89e4cabca602a1d2dd8b229b9cb999a;hb=785f638bab44e70ec6103c3891daea95bcda9a07;hp=f27bd0b059236908c506e7c133fabe39d486e50c;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/symbolcontribution/CompositeSymbolProviderFactory.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/symbolcontribution/CompositeSymbolProviderFactory.java index f27bd0b05..d57d0007b 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/symbolcontribution/CompositeSymbolProviderFactory.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/symbolcontribution/CompositeSymbolProviderFactory.java @@ -1,141 +1,141 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * 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: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.diagram.symbolcontribution; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - -import org.simantics.db.ReadGraph; -import org.simantics.db.exception.DatabaseException; -import org.simantics.diagram.symbollibrary.ISymbolGroup; -import org.simantics.utils.datastructures.MapList; -import org.simantics.utils.strings.EString; - -/** - * @author Tuukka Lehtonen - */ -public class CompositeSymbolProviderFactory implements SymbolProviderFactory { - - Collection factories; - - public CompositeSymbolProviderFactory(Collection factories) { - if (factories == null) - throw new NullPointerException("null factories"); - this.factories = factories; - } - - @Override - public int hashCode() { - return factories.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - CompositeSymbolProviderFactory other = (CompositeSymbolProviderFactory) obj; - return factories.equals(other.factories); - } - - @Override - public ISymbolProvider create(ReadGraph graph) throws DatabaseException { - ArrayList providers = new ArrayList(factories.size()); - for (SymbolProviderFactory factory : factories) { - ISymbolProvider provider = factory.create(graph); - providers.add(provider); - } - return new CompositeSymbolProvider(providers); - } - - static class CompositeSymbolProvider extends AbstractSymbolProvider { - - Collection providers; - - public CompositeSymbolProvider(Collection providers) { - this.providers = providers; - } - - @Override - public Collection getSymbolGroups() { - MapList groupsByName = new MapList(); - Set processedIds = new HashSet(); - Map groups = new TreeMap(); - for(ISymbolProvider provider : providers) { - for(ISymbolGroup group : provider.getSymbolGroups()) { - String name = group.getName(); - if (group instanceof IIdentifiedObject) { - Object id = ((IIdentifiedObject) group).getId(); - if (!processedIds.add(id)) - continue; - } - groupsByName.add(name, group); - } - } - // Process groups with multiple ISymbolGroup contributions - // into CompositeSymbolGroupsand leave single ISymbolGroups as such. - for (String name : groupsByName.getKeys()) { - List grps = groupsByName.getValues(name); - int grpCount = grps.size(); - if (grpCount == 1) { - groups.put(name, grps.get(0)); - } else if (grpCount > 1) { - Object id = combineIdentification(grps); - String description = combineDescriptions(grps); - CompositeSymbolGroup cgroup = new CompositeSymbolGroup(id, name, description); - for (ISymbolGroup grp : grps) - cgroup.add(grp); - groups.put(name, cgroup); - } - } - return new ArrayList(groups.values()); - } - - private Object combineIdentification(List grps) { - Set id = new HashSet(); - for (ISymbolGroup grp : grps) { - if (grp instanceof IIdentifiedObject) { - id.add( ((IIdentifiedObject) grp).getId() ); - } - } - return id; - } - - private String combineDescriptions(List grps) { - Set descs = new TreeSet(); - for (ISymbolGroup grp : grps) - descs.add(grp.getDescription()); - if (descs.isEmpty()) - return ""; - if (descs.size() == 1) - return descs.iterator().next(); - return EString.implode(descs); - } - - @Override - public void setListener(Runnable listener) { - for (ISymbolProvider provider : providers) - provider.setListener(listener); - } - - } - -} +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * 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: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.diagram.symbolcontribution; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.diagram.symbollibrary.ISymbolGroup; +import org.simantics.utils.datastructures.MapList; +import org.simantics.utils.strings.EString; + +/** + * @author Tuukka Lehtonen + */ +public class CompositeSymbolProviderFactory implements SymbolProviderFactory { + + Collection factories; + + public CompositeSymbolProviderFactory(Collection factories) { + if (factories == null) + throw new NullPointerException("null factories"); + this.factories = factories; + } + + @Override + public int hashCode() { + return factories.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CompositeSymbolProviderFactory other = (CompositeSymbolProviderFactory) obj; + return factories.equals(other.factories); + } + + @Override + public ISymbolProvider create(ReadGraph graph) throws DatabaseException { + ArrayList providers = new ArrayList(factories.size()); + for (SymbolProviderFactory factory : factories) { + ISymbolProvider provider = factory.create(graph); + providers.add(provider); + } + return new CompositeSymbolProvider(providers); + } + + static class CompositeSymbolProvider extends AbstractSymbolProvider { + + Collection providers; + + public CompositeSymbolProvider(Collection providers) { + this.providers = providers; + } + + @Override + public Collection getSymbolGroups() { + MapList groupsByName = new MapList(); + Set processedIds = new HashSet(); + Map groups = new TreeMap(); + for(ISymbolProvider provider : providers) { + for(ISymbolGroup group : provider.getSymbolGroups()) { + String name = group.getName(); + if (group instanceof IIdentifiedObject) { + Object id = ((IIdentifiedObject) group).getId(); + if (!processedIds.add(id)) + continue; + } + groupsByName.add(name, group); + } + } + // Process groups with multiple ISymbolGroup contributions + // into CompositeSymbolGroupsand leave single ISymbolGroups as such. + for (String name : groupsByName.getKeys()) { + List grps = groupsByName.getValues(name); + int grpCount = grps.size(); + if (grpCount == 1) { + groups.put(name, grps.get(0)); + } else if (grpCount > 1) { + Object id = combineIdentification(grps); + String description = combineDescriptions(grps); + CompositeSymbolGroup cgroup = new CompositeSymbolGroup(id, name, description); + for (ISymbolGroup grp : grps) + cgroup.add(grp); + groups.put(name, cgroup); + } + } + return new ArrayList(groups.values()); + } + + private Object combineIdentification(List grps) { + Set id = new HashSet(); + for (ISymbolGroup grp : grps) { + if (grp instanceof IIdentifiedObject) { + id.add( ((IIdentifiedObject) grp).getId() ); + } + } + return id; + } + + private String combineDescriptions(List grps) { + Set descs = new TreeSet(); + for (ISymbolGroup grp : grps) + descs.add(grp.getDescription()); + if (descs.isEmpty()) + return ""; + if (descs.size() == 1) + return descs.iterator().next(); + return EString.implode(descs); + } + + @Override + public void setListener(Runnable listener) { + for (ISymbolProvider provider : providers) + provider.setListener(listener); + } + + } + +}