1/*******************************************************************************
2 * Copyright (c) 2011 Google, Inc.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 *    Google, Inc. - initial API and implementation
10 *******************************************************************************/
11package org.eclipse.wb.internal.core.model.property.category;
12
13import org.eclipse.wb.internal.core.model.property.Property;
14import org.eclipse.wb.internal.core.utils.check.Assert;
15
16/**
17 * Describes category of {@link Property}.
18 *
19 * @author scheglov_ke
20 * @coverage core.model.property
21 */
22public final class PropertyCategory {
23  /**
24   * "Normal" category, used for properties that should be displayed without any effect.
25   */
26  public static final PropertyCategory NORMAL = new PropertyCategory(0, "NORMAL");
27  /**
28   * "Preferred" category, for properties that are most useful for component.
29   */
30  public static final PropertyCategory PREFERRED = new PropertyCategory(-1, "PREFERRED");
31  /**
32   * "Advanced" category, for properties that are rarely used, visible if modified, even if not
33   * enabled.
34   */
35  public static final PropertyCategory ADVANCED = new PropertyCategory(1, "ADVANCED");
36  /**
37   * "Advanced" category, for properties that are rarely used, visible only if enabled.
38   */
39  public static final PropertyCategory ADVANCED_REALLY = new PropertyCategory(2, "ADVANCED_REALLY");
40  /**
41   * "Hidden" category, for properties that should not be displayed.
42   */
43  public static final PropertyCategory HIDDEN = new PropertyCategory(3, "HIDDEN");
44
45  ////////////////////////////////////////////////////////////////////////////
46  //
47  // System
48  //
49  ////////////////////////////////////////////////////////////////////////////
50  /**
51   * @return the system {@link PropertyCategory} with given priority.
52   */
53  public static final PropertyCategory system(int priority) {
54    return new PropertyCategory(SYSTEM_BASE + priority, "SYSTEM:" + priority);
55  }
56
57  /**
58   * @return the system {@link PropertyCategory} with priority
59   *         <code>system.getPriority() + additional</code>.
60   */
61  public static final PropertyCategory system(PropertyCategory system, int additional) {
62    Assert.isTrue(system.isSystem());
63    return system(system.getPriority() - SYSTEM_BASE + additional);
64  }
65
66  ////////////////////////////////////////////////////////////////////////////
67  //
68  // Instance fields
69  //
70  ////////////////////////////////////////////////////////////////////////////
71  private static final int SYSTEM_BASE = 1000;
72  private final int m_priority;
73  private final String m_string;
74
75  ////////////////////////////////////////////////////////////////////////////
76  //
77  // Constructor
78  //
79  ////////////////////////////////////////////////////////////////////////////
80  private PropertyCategory(int priority, String string) {
81    m_priority = priority;
82    m_string = string;
83  }
84
85  ////////////////////////////////////////////////////////////////////////////
86  //
87  // Object
88  //
89  ////////////////////////////////////////////////////////////////////////////
90  @Override
91  public String toString() {
92    return m_string;
93  }
94
95  @Override
96  public boolean equals(Object obj) {
97    if (obj == this) {
98      return true;
99    }
100    if (obj instanceof PropertyCategory) {
101      PropertyCategory category = (PropertyCategory) obj;
102      return m_priority == category.m_priority;
103    }
104    // unknown class
105    return false;
106  }
107
108  @Override
109  public int hashCode() {
110    return m_priority;
111  }
112
113  ////////////////////////////////////////////////////////////////////////////
114  //
115  // Access
116  //
117  ////////////////////////////////////////////////////////////////////////////
118  /**
119   * @return <code>true</code> if this property is preferred.
120   */
121  public boolean isPreferred() {
122    return this == PREFERRED;
123  }
124
125  /**
126   * @return <code>true</code> if this property is advanced.
127   */
128  public boolean isAdvanced() {
129    return this == ADVANCED;
130  }
131
132  /**
133   * @return <code>true</code> if this property is really advanced.
134   */
135  public boolean isAdvancedReally() {
136    return this == ADVANCED_REALLY;
137  }
138
139  /**
140   * @return <code>true</code> if this property is hidden.
141   */
142  public boolean isHidden() {
143    return this == HIDDEN;
144  }
145
146  /**
147   * @return <code>true</code> if this property is system.
148   */
149  public boolean isSystem() {
150    return m_priority >= 900;
151  }
152
153  /**
154   * @return the priority of this category.
155   */
156  public int getPriority() {
157    return m_priority;
158  }
159}
160