2012-12-05 9 views
5

Gibt es eine Möglichkeit, IDs auf SWT-Widgets automatisch zu generieren, damit UI-Tests darauf verweisen können? Ich weiß, dass ich eine ID mit SeData manuell festlegen kann, aber ich möchte diese Funktion für eine vorhandene Anwendung in einer etwas generischen Weise implementieren.Automatisch IDs auf SWT-Widgets generieren

Antwort

8

Sie können IDs für alle Ihre Shells in Ihrer Anwendung mithilfe von Display.getCurrent().getShells(); und Widget.setData(); rekursiv zuweisen.

die IDs einstellen

Shell []shells = Display.getCurrent().getShells(); 

for(Shell obj : shells) { 
    setIds(obj); 
} 

Sie haben Zugriff auf alle aktiven (nicht angeordnet) Muscheln in der Anwendung der Methode Display.getCurrent().getShells();. Sie können alle untergeordneten Elemente jeder Shell Schleife durchlaufen und jeder Control mit der Methode Widget.setData(); eine ID zuweisen.

private Integer count = 0; 

private void setIds(Composite c) { 
    Control[] children = c.getChildren(); 
    for(int j = 0 ; j < children.length; j++) { 
     if(children[j] instanceof Composite) { 
      setIds((Composite) children[j]); 
     } else { 
      children[j].setData(count); 
      System.out.println(children[j].toString()); 
      System.out.println(" '-> ID: " + children[j].getData()); 
      ++count; 
     } 
    } 
} 

Wenn die Control ein Composite ist es Kontrollen innerhalb des Verbunds haben kann, das ist der Grund, warum ich eine rekursive Lösung in meinem Beispiel verwendet habe.


Kontrollen von ID

Jetzt zu finden, wenn Sie eine Steuerung finden wie in einem Ihrer Schalen würde ich ein ähnliches, rekursive Ansatz vorschlagen:

public Control findControlById(Integer id) { 
    Shell[] shells = Display.getCurrent().getShells(); 

    for(Shell e : shells) { 
     Control foundControl = findControl(e, id); 
     if(foundControl != null) { 
      return foundControl; 
     } 
    } 
    return null; 
} 

private Control findControl(Composite c, Integer id) { 
    Control[] children = c.getChildren(); 
    for(Control e : children) { 
     if(e instanceof Composite) { 
      Control found = findControl((Composite) e, id); 
      if(found != null) { 
       return found; 
      } 
     } else { 
      int value = id.intValue(); 
      int objValue = ((Integer)e.getData()).intValue(); 

      if(value == objValue) 
       return e; 
     } 
    } 
    return null; 
} 

Mit dem Methode findControlById() Sie können leicht eine Control von seiner ID finden.

Control foundControl = findControlById(12); 
    System.out.println(foundControl.toString()); 

Verbindungen