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 *******************************************************************************/ 11 package org.eclipse.wb.internal.core.model.property; 12 13 import com.google.common.collect.Maps; 14 15 import org.eclipse.wb.internal.core.model.property.category.PropertyCategory; 16 import org.eclipse.wb.internal.core.model.property.editor.PropertyEditor; 17 18 import java.util.Comparator; 19 import java.util.Map; 20 21 /** 22 * {@link Property} is used to display/change properties of ObjectInfo's. 23 * 24 * @author scheglov_ke 25 * @coverage core.model.property 26 */ 27 public abstract class Property { 28 /** 29 * The value that should be used when we don't know real value of {@link Property}. We can not use 30 * <code>null</code> because <code>null</code> can be valid value. 31 */ 32 public static final Object UNKNOWN_VALUE = new Object() { 33 @Override 34 public String toString() { 35 return "UNKNOWN_VALUE"; 36 } 37 }; 38 //////////////////////////////////////////////////////////////////////////// 39 // 40 // Instance fields 41 // 42 //////////////////////////////////////////////////////////////////////////// 43 protected final PropertyEditor m_editor; 44 45 //////////////////////////////////////////////////////////////////////////// 46 // 47 // Constructor 48 // 49 //////////////////////////////////////////////////////////////////////////// 50 public Property(PropertyEditor editor) { 51 m_category = PropertyCategory.NORMAL; 52 m_editor = editor; 53 } 54 55 //////////////////////////////////////////////////////////////////////////// 56 // 57 // Presentation 58 // 59 //////////////////////////////////////////////////////////////////////////// 60 /** 61 * @return the title displayed to the user to identify the property. 62 */ 63 public abstract String getTitle(); 64 65 /** 66 * @return <code>true</code> if this property has a non-default value 67 */ 68 public abstract boolean isModified() throws Exception; 69 70 //////////////////////////////////////////////////////////////////////////// 71 // 72 // Category 73 // 74 //////////////////////////////////////////////////////////////////////////// 75 private PropertyCategory m_category; 76 77 /** 78 * @return current {@link PropertyCategory}. 79 */ 80 public final PropertyCategory getCategory() { 81 return m_category; 82 } 83 84 /** 85 * Sets the {@link PropertyCategory} for this {@link Property}. 86 */ 87 public final void setCategory(PropertyCategory category) { 88 m_category = category; 89 } 90 91 //////////////////////////////////////////////////////////////////////////// 92 // 93 // Value 94 // 95 //////////////////////////////////////////////////////////////////////////// 96 /** 97 * @return the current value of this {@link Property} or {@link #UNKNOWN_VALUE}. 98 */ 99 public abstract Object getValue() throws Exception; 100 101 /** 102 * Sets the new value of this {@link Property}. 103 * 104 * @param the 105 * new value of {@link Property} or {@link #UNKNOWN_VALUE} if {@link Property} 106 * modification should be removed. 107 */ 108 public abstract void setValue(Object value) throws Exception; 109 110 //////////////////////////////////////////////////////////////////////////// 111 // 112 // Editor 113 // 114 //////////////////////////////////////////////////////////////////////////// 115 /** 116 * @return the {@link PropertyEditor}. 117 */ 118 public final PropertyEditor getEditor() { 119 return m_editor; 120 } 121 122 //////////////////////////////////////////////////////////////////////////// 123 // 124 // Composite 125 // 126 //////////////////////////////////////////////////////////////////////////// 127 /** 128 * @return the composite {@link Property} for given array of {@link Property}'s or 129 * <code>null</code> if no composite {@link Property} can be created. 130 */ 131 public Property getComposite(Property[] properties) { 132 return null; 133 } 134 135 public <T> T getAdapter(Class<T> adapter) { 136 return null; 137 } 138 139 //////////////////////////////////////////////////////////////////////////// 140 // 141 // Arbitrary values map 142 // 143 //////////////////////////////////////////////////////////////////////////// 144 private Map<Object, Object> m_arbitraryMap; 145 146 /** 147 * Associates the given value with the given key. 148 */ 149 public final void putArbitraryValue(Object key, Object value) { 150 if (m_arbitraryMap == null) { 151 m_arbitraryMap = Maps.newHashMap(); 152 } 153 m_arbitraryMap.put(key, value); 154 } 155 156 /** 157 * @return the value to which the given key is mapped, or <code>null</code>. 158 */ 159 public final Object getArbitraryValue(Object key) { 160 if (m_arbitraryMap != null) { 161 return m_arbitraryMap.get(key); 162 } 163 return null; 164 } 165 166 /** 167 * Removes the mapping for a key. 168 */ 169 public final void removeArbitraryValue(Object key) { 170 if (m_arbitraryMap != null) { 171 m_arbitraryMap.remove(key); 172 } 173 } 174 175 // BEGIN ADT MODIFICATIONS 176 177 /** 178 * Returns the name of the property (which is not always the same as the 179 * title; for example, the "maxWidth" property has title "Max Width" and 180 * name "maxWidth". 181 * <p> 182 * This is shown in tooltips to users etc to make it clear what they should 183 * use in their own code. 184 * 185 * @return the name of the property 186 */ 187 public String getName() { 188 return getTitle(); 189 } 190 191 private int mPriority; 192 193 /** 194 * Gets the custom sort priority of this property 195 * 196 * @return the sort priority 197 */ 198 public int getPriority() { 199 return mPriority; 200 } 201 202 /** 203 * Sets the custom sort priority of this property 204 * 205 * @param priority the new priority to use 206 */ 207 public void setPriority(int priority) { 208 this.mPriority = priority; 209 } 210 211 /** Sort {@link Property} instances alphabetically by property name */ 212 public static final Comparator<Property> ALPHABETICAL = new Comparator<Property>() { 213 @Override 214 public int compare(Property p1, Property p2) { 215 return p1.getName().compareTo(p2.getName()); 216 } 217 }; 218 219 /** Sort {@link Property} instances by priority */ 220 public static final Comparator<Property> PRIORITY = new Comparator<Property>() { 221 @Override 222 public int compare(Property p1, Property p2) { 223 int delta = p1.mPriority - p2.mPriority; 224 if (delta != 0) { 225 return delta; 226 } 227 228 return p1.getName().compareTo(p2.getName()); 229 } 230 }; 231 // END ADT MODIFICATIONS 232 } 233