Ignore:
Timestamp:
09/19/12 10:46:39 (12 years ago)
Author:
sherbold
Message:
  • converted JFCMonitor to Maven project
Location:
trunk/JFCMonitor
Files:
2 added
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/JFCMonitor

    • Property svn:ignore set to
      .settings
  • trunk/JFCMonitor/src/main/java/de/ugoe/cs/eventbench/jfcmonitor/JFCComponent.java

    r368 r822  
     1 
    12package de.ugoe.cs.eventbench.jfcmonitor; 
    23 
     
    1819/** 
    1920 * <p> 
    20  * This class manages information about the current GUI. It always contains the 
    21  * current GUI hierarchy. 
     21 * This class manages information about the current GUI. It always contains the current GUI 
     22 * hierarchy. 
    2223 * </p> 
    2324 *  
     
    2728public class JFCComponent { 
    2829 
    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    } 
    351337 
    352338} 
Note: See TracChangeset for help on using the changeset viewer.