- Timestamp:
- 09/19/12 10:46:39 (12 years ago)
- Location:
- trunk/JFCMonitor
- Files:
-
- 2 added
- 2 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/JFCMonitor
-
Property
svn:ignore
set to
.settings
-
Property
svn:ignore
set to
-
trunk/JFCMonitor/src/main/java/de/ugoe/cs/eventbench/jfcmonitor/JFCComponent.java
r368 r822 1 1 2 package de.ugoe.cs.eventbench.jfcmonitor; 2 3 … … 18 19 /** 19 20 * <p> 20 * This class manages information about the current GUI. It always contains the 21 * current GUIhierarchy.21 * This class manages information about the current GUI. It always contains the current GUI 22 * hierarchy. 22 23 * </p> 23 24 * … … 27 28 public class JFCComponent { 28 29 29 /** 30 * <p> 31 * Map of all known GUI components. 32 * </p> 33 */ 34 private static Map<Component, JFCComponent> knownComponents = new HashMap<Component, JFCComponent>(); 35 36 /** 37 * <p> 38 * Adds a AWT component to the GUI hierarchy. If the component already 39 * exists in the hierarchy, it is not added a second time. 40 * </p> 41 * 42 * @param component 43 * component that is added 44 */ 45 public static void add(Component component) { 46 add(component, find(component.getParent())); 47 } 48 49 /** 50 * <p> 51 * Adds a AWT component to the GUI hierarchy. If the component already 52 * exists in the hierarchy, it is not added a second time. 53 * </p> 54 * 55 * @param component 56 * component that is added 57 * @param parent 58 * parent of the component 59 */ 60 public static void add(Component component, JFCComponent parent) { 61 if (!knownComponents.containsKey(component)) { 62 knownComponents.put(component, new JFCComponent(component, parent)); 63 } 64 } 65 66 /** 67 * <p> 68 * Finds a component in the GUI hierarchy and returns the corresponding 69 * JFComponent instance. Returns null if the component is not found. 70 * </p> 71 * 72 * @param component 73 * component that is searched for 74 * @return corresponding JFComponent instance; null if the compenent is not 75 * found 76 */ 77 public static JFCComponent find(Component component) { 78 return knownComponents.get(component); 79 } 80 81 /** 82 * <p> 83 * Removes a component from the GUI hierarchy. In case the component is not 84 * part of the known hierachy, nothing happens. 85 * </p> 86 * 87 * @param component 88 * component to be removed 89 */ 90 public static void remove(Component component) { 91 JFCComponent jfcComponent = knownComponents.remove(component); 92 if (jfcComponent != null) { 93 jfcComponent.removeFromParent(); 94 jfcComponent.removeChildren(); 95 } 96 } 97 98 /** 99 * <p> 100 * Parent of the GUI component. null means, that the component has no 101 * parent. 102 * </p> 103 */ 104 private JFCComponent parent = null; 105 106 /** 107 * <p> 108 * Child components of the component. 109 * </p> 110 */ 111 private List<JFCComponent> children = new LinkedList<JFCComponent>(); 112 113 /** 114 * <p> 115 * Reference to the actual GUI component. 116 * </p> 117 */ 118 private Component component; 119 120 /** 121 * <p> 122 * Helper attribute that contains the title of the component. Set by 123 * {@link #setTitle()}. 124 * </p> 125 */ 126 private String title = null; 127 128 /** 129 * <p> 130 * Helper attribute that contains the class of the component. Set by 131 * {@link #setClass()}. 132 * </p> 133 */ 134 private String componentClass = null; 135 136 /** 137 * <p> 138 * Helper attribute that contains the icon of the component. Set by 139 * {@link #setIcon()}. 140 * </p> 141 */ 142 private String icon = null; 143 144 /** 145 * <p> 146 * Helper attribute that contains the icon of the component. Set by 147 * {@link #setIndex()}. 148 * </p> 149 */ 150 private int index = -1; 151 152 /** 153 * <p> 154 * Constructor. Creates a new JFCComponent. Only used internally by 155 * {@link #add(Component, JFCComponent)}. 156 * </p> 157 * 158 * @param component 159 * component associated with the JFCComponent 160 * @param parent 161 * parent of the component; null if there is no parent 162 */ 163 private JFCComponent(Component component, JFCComponent parent) { 164 if (component == null) { 165 throw new InvalidParameterException( 166 "parameter component must not be null"); 167 } 168 this.component = component; 169 this.parent = parent; 170 if (parent != null) { 171 parent.addChild(this); 172 } 173 174 if (component instanceof Container) { 175 for (Component childComponent : ((Container) component) 176 .getComponents()) { 177 add(childComponent, this); 178 } 179 } 180 } 181 182 /** 183 * <p> 184 * Adds a child component to the current component. 185 * </p> 186 * 187 * @param child 188 * child component to be added 189 */ 190 private void addChild(JFCComponent child) { 191 children.add(child); 192 } 193 194 /** 195 * <p> 196 * Returns an XML representation of the component. 197 * </p> 198 * 199 * @return XLM snippet 200 */ 201 public String getXML() { 202 setClass(); 203 setIcon(); 204 setIndex(); 205 setTitle(); 206 StringBuilder builder = new StringBuilder(); 207 if (parent != null) { 208 builder.append(parent.getXML()); 209 } 210 builder.append(" <component>" + StringTools.ENDLINE); 211 builder.append(" <param name=\"title\" value=\"" + title + "\" />" 212 + StringTools.ENDLINE); 213 builder.append(" <param name=\"class\" value=\"" + componentClass 214 + "\" />" + StringTools.ENDLINE); 215 builder.append(" <param name=\"icon\" value=\"" + icon + "\" />" 216 + StringTools.ENDLINE); 217 builder.append(" <param name=\"index\" value=\"" + index + "\" />" 218 + StringTools.ENDLINE); 219 builder.append(" <param name=\"hash\" value=\"" 220 + Integer.toHexString(component.hashCode()) + "\" />" 221 + StringTools.ENDLINE); 222 builder.append(" </component>" + StringTools.ENDLINE); 223 return builder.toString(); 224 } 225 226 /** 227 * <p> 228 * Removes a child component from the current component. 229 * </p> 230 * 231 * @param child 232 * child component to be removed 233 */ 234 private void removeChild(JFCComponent child) { 235 children.remove(child); 236 } 237 238 /** 239 * <p> 240 * Removes the component from the list of children of its parent. 241 * </p> 242 */ 243 private void removeFromParent() { 244 if (parent != null) { 245 parent.removeChild(this); 246 } 247 } 248 249 /** 250 * <p> 251 * Triggers the removals of all child components from the GUI hierarchy, 252 * i.e., calls {@link #remove(Component)} for all child components. 253 * </p> 254 */ 255 private void removeChildren() { 256 for (JFCComponent child : children) { 257 remove(child.component); 258 } 259 } 260 261 /** 262 * <p> 263 * Sets the {@link #title} of the component. The title is defined as follows 264 * (first in the list, that is not null): 265 * <ul> 266 * <li>accessible name of the component if available</li> 267 * <li>{@link #icon} of the component</li> 268 * <li>name of the component</li> 269 * <li>coordinates of the component</li> 270 * </ul> 271 * </p> 272 */ 273 private void setTitle() { 274 title = null; // reset title 275 276 AccessibleContext accessibleContext = component.getAccessibleContext(); 277 if (accessibleContext != null) { 278 title = accessibleContext.getAccessibleName(); 279 } 280 if (title == null) { 281 title = icon; 282 } 283 if (title == null) { 284 title = component.getName(); 285 } 286 if (title == null) { 287 // use coordinates as last resort 288 title = "Pos(" + component.getX() + "," + component.getY() + ")"; 289 } 290 } 291 292 /** 293 * <p> 294 * Sets the {@link #componentClass} of the component. 295 * </p> 296 */ 297 private void setClass() { 298 componentClass = component.getClass().getName(); 299 } 300 301 /** 302 * <p> 303 * Sets the {@link #icon} of the component. 304 * </p> 305 */ 306 private void setIcon() { 307 icon = null; // reset icon 308 309 Method getIconMethod; 310 try { 311 getIconMethod = component.getClass().getMethod("getIcon", 312 new Class[0]); 313 if (getIconMethod != null) { 314 Object iconObject = getIconMethod.invoke(component, 315 new Object[] {}); 316 if (iconObject != null) { 317 String iconPath = iconObject.toString(); 318 if (!iconPath.contains("@")) { 319 System.out.println("iconPath"); 320 String[] splitResult = iconPath 321 .split(File.separatorChar == '\\' ? "\\\\" 322 : File.separator); 323 icon = splitResult[splitResult.length - 1]; 324 } 325 } 326 } 327 } catch (SecurityException e) { 328 } catch (NoSuchMethodException e) { 329 } catch (IllegalArgumentException e) { 330 } catch (IllegalAccessException e) { 331 } catch (InvocationTargetException e) { 332 System.err.println("Found method with name " + "getIcon" 333 + " but could not access it."); 334 } 335 } 336 337 /** 338 * <p> 339 * Sets the {@link #index} of the component as the index in the parent, if 340 * it is accessible. 341 * </p> 342 */ 343 private void setIndex() { 344 index = -1; // reset index 345 346 AccessibleContext accessibleContext = component.getAccessibleContext(); 347 if (accessibleContext != null) { 348 index = accessibleContext.getAccessibleIndexInParent(); 349 } 350 } 30 /** 31 * <p> 32 * Map of all known GUI components. 33 * </p> 34 */ 35 private static Map<Component, JFCComponent> knownComponents = 36 new HashMap<Component, JFCComponent>(); 37 38 /** 39 * <p> 40 * Adds a AWT component to the GUI hierarchy. If the component already exists in the hierarchy, 41 * it is not added a second time. 42 * </p> 43 * 44 * @param component 45 * component that is added 46 */ 47 public static void add(Component component) { 48 add(component, find(component.getParent())); 49 } 50 51 /** 52 * <p> 53 * Adds a AWT component to the GUI hierarchy. If the component already exists in the hierarchy, 54 * it is not added a second time. 55 * </p> 56 * 57 * @param component 58 * component that is added 59 * @param parent 60 * parent of the component 61 */ 62 public static void add(Component component, JFCComponent parent) { 63 if (!knownComponents.containsKey(component)) { 64 knownComponents.put(component, new JFCComponent(component, parent)); 65 } 66 } 67 68 /** 69 * <p> 70 * Finds a component in the GUI hierarchy and returns the corresponding JFComponent instance. 71 * Returns null if the component is not found. 72 * </p> 73 * 74 * @param component 75 * component that is searched for 76 * @return corresponding JFComponent instance; null if the compenent is not found 77 */ 78 public static JFCComponent find(Component component) { 79 return knownComponents.get(component); 80 } 81 82 /** 83 * <p> 84 * Removes a component from the GUI hierarchy. In case the component is not part of the known 85 * hierachy, nothing happens. 86 * </p> 87 * 88 * @param component 89 * component to be removed 90 */ 91 public static void remove(Component component) { 92 JFCComponent jfcComponent = knownComponents.remove(component); 93 if (jfcComponent != null) { 94 jfcComponent.removeFromParent(); 95 jfcComponent.removeChildren(); 96 } 97 } 98 99 /** 100 * <p> 101 * Parent of the GUI component. null means, that the component has no parent. 102 * </p> 103 */ 104 private JFCComponent parent = null; 105 106 /** 107 * <p> 108 * Child components of the component. 109 * </p> 110 */ 111 private List<JFCComponent> children = new LinkedList<JFCComponent>(); 112 113 /** 114 * <p> 115 * Reference to the actual GUI component. 116 * </p> 117 */ 118 private Component component; 119 120 /** 121 * <p> 122 * Helper attribute that contains the title of the component. Set by {@link #setTitle()}. 123 * </p> 124 */ 125 private String title = null; 126 127 /** 128 * <p> 129 * Helper attribute that contains the class of the component. Set by {@link #setClass()}. 130 * </p> 131 */ 132 private String componentClass = null; 133 134 /** 135 * <p> 136 * Helper attribute that contains the icon of the component. Set by {@link #setIcon()}. 137 * </p> 138 */ 139 private String icon = null; 140 141 /** 142 * <p> 143 * Helper attribute that contains the icon of the component. Set by {@link #setIndex()}. 144 * </p> 145 */ 146 private int index = -1; 147 148 /** 149 * <p> 150 * Constructor. Creates a new JFCComponent. Only used internally by 151 * {@link #add(Component, JFCComponent)}. 152 * </p> 153 * 154 * @param component 155 * component associated with the JFCComponent 156 * @param parent 157 * parent of the component; null if there is no parent 158 */ 159 private JFCComponent(Component component, JFCComponent parent) { 160 if (component == null) { 161 throw new InvalidParameterException("parameter component must not be null"); 162 } 163 this.component = component; 164 this.parent = parent; 165 if (parent != null) { 166 parent.addChild(this); 167 } 168 169 if (component instanceof Container) { 170 for (Component childComponent : ((Container) component).getComponents()) { 171 add(childComponent, this); 172 } 173 } 174 } 175 176 /** 177 * <p> 178 * Adds a child component to the current component. 179 * </p> 180 * 181 * @param child 182 * child component to be added 183 */ 184 private void addChild(JFCComponent child) { 185 children.add(child); 186 } 187 188 /** 189 * <p> 190 * Returns an XML representation of the component. 191 * </p> 192 * 193 * @return XLM snippet 194 */ 195 public String getXML() { 196 setClass(); 197 setIcon(); 198 setIndex(); 199 setTitle(); 200 StringBuilder builder = new StringBuilder(); 201 if (parent != null) { 202 builder.append(parent.getXML()); 203 } 204 builder.append(" <component>" + StringTools.ENDLINE); 205 builder.append(" <param name=\"title\" value=\"" + title + "\" />" + StringTools.ENDLINE); 206 builder.append(" <param name=\"class\" value=\"" + componentClass + "\" />" + 207 StringTools.ENDLINE); 208 builder.append(" <param name=\"icon\" value=\"" + icon + "\" />" + StringTools.ENDLINE); 209 builder.append(" <param name=\"index\" value=\"" + index + "\" />" + StringTools.ENDLINE); 210 builder.append(" <param name=\"hash\" value=\"" + 211 Integer.toHexString(component.hashCode()) + "\" />" + StringTools.ENDLINE); 212 builder.append(" </component>" + StringTools.ENDLINE); 213 return builder.toString(); 214 } 215 216 /** 217 * <p> 218 * Removes a child component from the current component. 219 * </p> 220 * 221 * @param child 222 * child component to be removed 223 */ 224 private void removeChild(JFCComponent child) { 225 children.remove(child); 226 } 227 228 /** 229 * <p> 230 * Removes the component from the list of children of its parent. 231 * </p> 232 */ 233 private void removeFromParent() { 234 if (parent != null) { 235 parent.removeChild(this); 236 } 237 } 238 239 /** 240 * <p> 241 * Triggers the removals of all child components from the GUI hierarchy, i.e., calls 242 * {@link #remove(Component)} for all child components. 243 * </p> 244 */ 245 private void removeChildren() { 246 for (JFCComponent child : children) { 247 remove(child.component); 248 } 249 } 250 251 /** 252 * <p> 253 * Sets the {@link #title} of the component. The title is defined as follows (first in the list, 254 * that is not null): 255 * <ul> 256 * <li>accessible name of the component if available</li> 257 * <li>{@link #icon} of the component</li> 258 * <li>name of the component</li> 259 * <li>coordinates of the component</li> 260 * </ul> 261 * </p> 262 */ 263 private void setTitle() { 264 title = null; // reset title 265 266 AccessibleContext accessibleContext = component.getAccessibleContext(); 267 if (accessibleContext != null) { 268 title = accessibleContext.getAccessibleName(); 269 } 270 if (title == null) { 271 title = icon; 272 } 273 if (title == null) { 274 title = component.getName(); 275 } 276 if (title == null) { 277 // use coordinates as last resort 278 title = "Pos(" + component.getX() + "," + component.getY() + ")"; 279 } 280 } 281 282 /** 283 * <p> 284 * Sets the {@link #componentClass} of the component. 285 * </p> 286 */ 287 private void setClass() { 288 componentClass = component.getClass().getName(); 289 } 290 291 /** 292 * <p> 293 * Sets the {@link #icon} of the component. 294 * </p> 295 */ 296 private void setIcon() { 297 icon = null; // reset icon 298 299 Method getIconMethod; 300 try { 301 getIconMethod = component.getClass().getMethod("getIcon", new Class[0]); 302 if (getIconMethod != null) { 303 Object iconObject = getIconMethod.invoke(component, new Object[] { }); 304 if (iconObject != null) { 305 String iconPath = iconObject.toString(); 306 if (!iconPath.contains("@")) { 307 System.out.println("iconPath"); 308 String[] splitResult = 309 iconPath.split(File.separatorChar == '\\' ? "\\\\" : File.separator); 310 icon = splitResult[splitResult.length - 1]; 311 } 312 } 313 } 314 } 315 catch (SecurityException e) {} 316 catch (NoSuchMethodException e) {} 317 catch (IllegalArgumentException e) {} 318 catch (IllegalAccessException e) {} 319 catch (InvocationTargetException e) { 320 System.err.println("Found method with name " + "getIcon" + " but could not access it."); 321 } 322 } 323 324 /** 325 * <p> 326 * Sets the {@link #index} of the component as the index in the parent, if it is accessible. 327 * </p> 328 */ 329 private void setIndex() { 330 index = -1; // reset index 331 332 AccessibleContext accessibleContext = component.getAccessibleContext(); 333 if (accessibleContext != null) { 334 index = accessibleContext.getAccessibleIndexInParent(); 335 } 336 } 351 337 352 338 }
Note: See TracChangeset
for help on using the changeset viewer.