1765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/*******************************************************************************
2765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Copyright (c) 2011 Google, Inc.
3765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * All rights reserved. This program and the accompanying materials
4765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * are made available under the terms of the Eclipse Public License v1.0
5765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * which accompanies this distribution, and is available at
6765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * http://www.eclipse.org/legal/epl-v10.html
7765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
8765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Contributors:
9765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *    Google, Inc. - initial API and implementation
10765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *******************************************************************************/
11765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepackage org.eclipse.wb.internal.core.model.property;
12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport com.google.common.collect.Maps;
14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.category.PropertyCategory;
16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.editor.PropertyEditor;
17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport java.util.Comparator;
19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport java.util.Map;
20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/**
22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * {@link Property} is used to display/change properties of ObjectInfo's.
23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @author scheglov_ke
25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @coverage core.model.property
26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */
27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic abstract class Property {
28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * The value that should be used when we don't know real value of {@link Property}. We can not use
30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * <code>null</code> because <code>null</code> can be valid value.
31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static final Object UNKNOWN_VALUE = new Object() {
33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    @Override
34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public String toString() {
35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return "UNKNOWN_VALUE";
36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Instance fields
41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected final PropertyEditor m_editor;
44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Constructor
48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public Property(PropertyEditor editor) {
51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_category = PropertyCategory.NORMAL;
52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_editor = editor;
53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Presentation
58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the title displayed to the user to identify the property.
62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public abstract String getTitle();
64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return <code>true</code> if this property has a non-default value
67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public abstract boolean isModified() throws Exception;
69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Category
73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private PropertyCategory m_category;
76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return current {@link PropertyCategory}.
79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final PropertyCategory getCategory() {
81765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_category;
82765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
83765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
84765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
85765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Sets the {@link PropertyCategory} for this {@link Property}.
86765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
87765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final void setCategory(PropertyCategory category) {
88765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_category = category;
89765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
90765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
91765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
92765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
93765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Value
94765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
95765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
96765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
97765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the current value of this {@link Property} or {@link #UNKNOWN_VALUE}.
98765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
99765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public abstract Object getValue() throws Exception;
100765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
101765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
102765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Sets the new value of this {@link Property}.
103765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   *
104765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @param the
105765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   *          new value of {@link Property} or {@link #UNKNOWN_VALUE} if {@link Property}
106765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   *          modification should be removed.
107765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
108765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public abstract void setValue(Object value) throws Exception;
109765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
110765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
111765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
112765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Editor
113765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
114765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
115765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
116765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the {@link PropertyEditor}.
117765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
118765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final PropertyEditor getEditor() {
119765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_editor;
120765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
121765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
122765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
123765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
124765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Composite
125765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
126765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
127765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
128765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the composite {@link Property} for given array of {@link Property}'s or
129765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   *         <code>null</code> if no composite {@link Property} can be created.
130765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
131765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public Property getComposite(Property[] properties) {
132765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return null;
133765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
134765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
135765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public <T> T getAdapter(Class<T> adapter) {
136765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return null;
137765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
138765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
139765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
140765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
141765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Arbitrary values map
142765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
143765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
144765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private Map<Object, Object> m_arbitraryMap;
145765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
146765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
147765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Associates the given value with the given key.
148765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
149765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final void putArbitraryValue(Object key, Object value) {
150765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (m_arbitraryMap == null) {
151765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_arbitraryMap = Maps.newHashMap();
152765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
153765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_arbitraryMap.put(key, value);
154765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
155765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
156765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
157765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the value to which the given key is mapped, or <code>null</code>.
158765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
159765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final Object getArbitraryValue(Object key) {
160765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (m_arbitraryMap != null) {
161765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return m_arbitraryMap.get(key);
162765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
163765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return null;
164765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
165765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
166765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
167765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Removes the mapping for a key.
168765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
169765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final void removeArbitraryValue(Object key) {
170765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (m_arbitraryMap != null) {
171765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      m_arbitraryMap.remove(key);
172765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
173765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
174765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
175765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // BEGIN ADT MODIFICATIONS
176765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
177765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    /**
178765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * Returns the name of the property (which is not always the same as the
179765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * title; for example, the "maxWidth" property has title "Max Width" and
180765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * name "maxWidth".
181765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * <p>
182765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * This is shown in tooltips to users etc to make it clear what they should
183765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * use in their own code.
184765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     *
185765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     * @return the name of the property
186765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye     */
187765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public String getName() {
188765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return getTitle();
189765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
190765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
191765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private int mPriority;
192765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
193765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
194765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Gets the custom sort priority of this property
195765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   *
196765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @return the sort priority
197765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
198765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public int getPriority() {
199765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return mPriority;
200765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
201765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
202765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
203765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Sets the custom sort priority of this property
204765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   *
205765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * @param priority the new priority to use
206765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
207765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void setPriority(int priority) {
208765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      this.mPriority = priority;
209765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
210765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
211765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /** Sort {@link Property} instances alphabetically by property name */
212765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static final Comparator<Property> ALPHABETICAL = new Comparator<Property>() {
213765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      @Override
214765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      public int compare(Property p1, Property p2) {
215765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          return p1.getName().compareTo(p2.getName());
216765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
217765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
218765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
219765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /** Sort {@link Property} instances by priority */
220765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static final Comparator<Property> PRIORITY = new Comparator<Property>() {
221765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      @Override
222765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      public int compare(Property p1, Property p2) {
223765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          int delta = p1.mPriority - p2.mPriority;
224765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (delta != 0) {
225765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye              return delta;
226765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
227765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
228765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          return p1.getName().compareTo(p2.getName());
229765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
230765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
231765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // END ADT MODIFICATIONS
232765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye}
233