summaryrefslogtreecommitdiff
path: root/propertysheet/src/org/eclipse/wb/internal/core/editor/structure/property/PropertyListIntersector.java
diff options
context:
space:
mode:
Diffstat (limited to 'propertysheet/src/org/eclipse/wb/internal/core/editor/structure/property/PropertyListIntersector.java')
-rw-r--r--propertysheet/src/org/eclipse/wb/internal/core/editor/structure/property/PropertyListIntersector.java136
1 files changed, 136 insertions, 0 deletions
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/editor/structure/property/PropertyListIntersector.java b/propertysheet/src/org/eclipse/wb/internal/core/editor/structure/property/PropertyListIntersector.java
new file mode 100644
index 0000000..24aea2f
--- /dev/null
+++ b/propertysheet/src/org/eclipse/wb/internal/core/editor/structure/property/PropertyListIntersector.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Google, Inc.
+ * 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:
+ * Google, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wb.internal.core.editor.structure.property;
+
+import com.google.common.collect.Lists;
+
+import org.eclipse.wb.internal.core.model.property.Property;
+import org.eclipse.wb.internal.core.model.property.PropertyManager;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Helper for computing intersection of {@link Property} arrays.
+ *
+ * @author scheglov_ke
+ * @coverage core.editor.structure
+ */
+public final class PropertyListIntersector {
+ private List<PropertyGroup> m_intersection;
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Access
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * Updates intersection by intersecting with new given array.
+ */
+ public void intersect(Property[] properties) {
+ if (m_intersection == null) {
+ m_intersection = Lists.newArrayList();
+ for (int i = 0; i < properties.length; i++) {
+ Property property = properties[i];
+ m_intersection.add(new PropertyGroup(property));
+ }
+ } else {
+ for (Iterator<PropertyGroup> I = m_intersection.iterator(); I.hasNext();) {
+ PropertyGroup propertyGroup = I.next();
+ if (!propertyGroup.add(properties)) {
+ I.remove();
+ }
+ }
+ }
+ }
+
+ /**
+ * @return the array of matched composite {@link Property}'s.
+ */
+ public Property[] getProperties() {
+ List<Property> properties = Lists.newArrayList();
+ for (PropertyGroup propertyGroup : m_intersection) {
+ Property compositeProperty = propertyGroup.getCompositeProperty();
+ if (compositeProperty != null) {
+ properties.add(compositeProperty);
+ }
+ }
+ //
+ return properties.toArray(new Property[properties.size()]);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // PropertyGroup
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The group of {@link Property}'s that match.
+ */
+ private static final class PropertyGroup {
+ private final List<Property> m_properties = Lists.newArrayList();
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Constructor
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ public PropertyGroup(Property property) {
+ m_properties.add(property);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Access
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * @return <code>true</code> if new matched {@link Property} from given array was added.
+ */
+ public boolean add(Property[] properties) {
+ for (Property property : properties) {
+ if (add(property)) {
+ return true;
+ }
+ }
+ // no match
+ return false;
+ }
+
+ /**
+ * @return the composite {@link Property} for this group.
+ */
+ public Property getCompositeProperty() {
+ Property properties[] = m_properties.toArray(new Property[m_properties.size()]);
+ return properties[0].getComposite(properties);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Internal
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * @return <code>true</code> if given {@link Property} matches and was added.
+ */
+ private boolean add(Property property) {
+ Property example = m_properties.get(0);
+ if (example.getClass() == property.getClass()
+ && example.getTitle().equals(property.getTitle())
+ && PropertyManager.getCategory(example) == PropertyManager.getCategory(property)) {
+ m_properties.add(property);
+ return true;
+ }
+ // no match
+ return false;
+ }
+ }
+}