/******************************************************************************* * Copyright (c) 2012 Google, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.runtime.swt.internal.widgets; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.custom.*; import org.eclipse.swt.widgets.*; import org.eclipse.ui.dialogs.*; import org.eclipse.ui.forms.widgets.*; /** * Provides visitation support to the SWT widget hierarchy. */ @SuppressWarnings("deprecation") public class SWTWidgetHierarchy { public static interface IVisitor { void visitWidget(Widget widget); void visitCaret(Caret widget); //- controls void visitControl(Control widget); void visitButton(Button widget); void visitLabel(Label widget); void visitLink(Link widget); void visitProgressBar(ProgressBar widget); void visitSash(Sash widget); void visitScale(Scale widget); //-- scrollables void visitScrollable(Scrollable widget); void visitComposite(Composite widget); //--- composites void visitBrowser(Browser widget); //---- canvases void visitCanvas(Canvas widget); //----- hyperlinks void visitHyperlink(Hyperlink widget); void visitToggleHyperlink(ToggleHyperlink widget); // void visitCLabel(CLabel widget); //------ decorations void visitDecorations(Decorations widget); void visitShell(Shell widget); // //------ expandables void visitExpandableComposite(ExpandableComposite widget); void visitSection(Section widget); //----- void visitFormText(FormText widget); void visitStyledText(StyledText widget); //--- composites void visitCBanner(CBanner widget); void visitCCombo(CCombo widget); void visitCombo(Combo widget); void visitCoolBar(CoolBar widget); void visitCTabFolder(CTabFolder widget); void visitFilteredTree(FilteredTree widget); void visitForm(Form widget); void visitGroup(Group widget); void visitTabFolder(TabFolder widget); void visitTable(Table widget); void visitTableTree(TableTree widget); void visitToolBar(ToolBar widget); void visitTree(Tree widget); void visitViewForm(ViewForm widget); //-- scrollables void visitList(List widget); void visitText(Text widget); //- controls void visitSlider(Slider widget); //- items void visitItem(Item widget); void visitCoolItem(CoolItem widget); void visitCTabItem(CTabItem widget); void visitMenuItem(MenuItem widget); void visitTabItem(TabItem widget); void visitTableColumn(TableColumn widget); void visitTableItem(TableItem widget); void visitToolItem(ToolItem widget); void visitTrayItem(TrayItem widget); void visitTreeColumn(TreeColumn widget); void visitTreeItem(TreeItem widget); // widgets void visitMenu(Menu widget); void visitScrollBar(ScrollBar widget); void visitToolTip(ToolTip widget); void visitTracker(Tracker widget); void visitTray(Tray widget); } /** * A no-op or fall/through visitor. */ public static class VisitorAdapter implements IVisitor { public void visitBrowser(Browser widget) { //no-op } public void visitButton(Button widget) { //no-op } public void visitCBanner(CBanner widget) { //no-op } public void visitCCombo(CCombo widget) { //no-op } public void visitCLabel(CLabel widget) { //no-op } public void visitCTabFolder(CTabFolder widget) { //no-op } public void visitCTabItem(CTabItem widget) { //no-op } public void visitCanvas(Canvas widget) { //no-op } public void visitCaret(Caret widget) { //no-op } public void visitCombo(Combo widget) { //no-op } public void visitComposite(Composite widget) { //no-op } public void visitControl(Control widget) { //no-op } public void visitCoolBar(CoolBar widget) { //no-op } public void visitCoolItem(CoolItem widget) { //no-op } public void visitDecorations(Decorations widget) { //no-op } public void visitExpandableComposite(ExpandableComposite widget) { //no-op } public void visitFilteredTree(FilteredTree widget) { //no-op } public void visitForm(Form widget) { //no-op } public void visitFormText(FormText widget) { //no-op } public void visitGroup(Group widget) { //no-op } public void visitHyperlink(Hyperlink widget) { //no-op } public void visitItem(Item widget) { //no-op } public void visitLabel(Label widget) { //no-op } public void visitLink(Link widget) { //no-op } public void visitList(List widget) { //no-op } public void visitMenu(Menu widget) { //no-op } public void visitMenuItem(MenuItem widget) { //no-op } public void visitProgressBar(ProgressBar widget) { //no-op } public void visitSash(Sash widget) { //no-op } public void visitScale(Scale widget) { //no-op } public void visitScrollBar(ScrollBar widget) { //no-op } public void visitScrollable(Scrollable widget) { //no-op } public void visitSection(Section widget) { //no-op } public void visitShell(Shell widget) { //no-op } public void visitSlider(Slider widget) { //no-op } public void visitStyledText(StyledText widget) { //no-op } public void visitTabFolder(TabFolder widget) { //no-op } public void visitTabItem(TabItem widget) { //no-op } public void visitTable(Table widget) { //no-op } public void visitTableColumn(TableColumn widget) { //no-op } public void visitTableItem(TableItem widget) { //no-op } public void visitTableTree(TableTree widget) { //no-op } public void visitText(Text widget) { //no-op } public void visitToggleHyperlink(ToggleHyperlink widget) { //no-op } public void visitToolBar(ToolBar widget) { //no-op } public void visitToolItem(ToolItem widget) { //no-op } public void visitToolTip(ToolTip widget) { //no-op } public void visitTracker(Tracker widget) { //no-op } public void visitTray(Tray widget) { //no-op } public void visitTrayItem(TrayItem widget) { //no-op } public void visitTree(Tree widget) { //no-op } public void visitTreeColumn(TreeColumn widget) { //no-op } public void visitTreeItem(TreeItem widget) { //no-op } public void visitViewForm(ViewForm widget) { //no-op } public void visitWidget(Widget widget) { //no-op } } /** * A hierarchy visitor that does upward chaining to ensure that the most specific * type is communicated to the visitor. */ public static class Visitor extends VisitorAdapter { public void visitWidget(Widget widget){} @Override public void visitCaret(Caret widget){ visitWidget(widget); } @Override public void visitControl(Control widget){} @Override public void visitButton(Button widget){ visitControl(widget); } @Override public void visitLabel(Label widget){ visitControl(widget); } @Override public void visitLink(Link widget){ visitControl(widget); } @Override public void visitProgressBar(ProgressBar widget){ visitControl(widget); } @Override public void visitSash(Sash widget){ visitControl(widget); } @Override public void visitScale(Scale widget){ visitControl(widget); } //-- scrollables @Override public void visitScrollable(Scrollable widget){} @Override public void visitComposite(Composite widget){ visitScrollable(widget); } //--- composites @Override public void visitBrowser(Browser widget){ visitComposite(widget); } //---- canvases @Override public void visitCanvas(Canvas widget){ visitComposite(widget); } //----- hyperlinks @Override public void visitHyperlink(Hyperlink widget){ visitCanvas(widget); } @Override public void visitToggleHyperlink(ToggleHyperlink widget){ visitCanvas(widget); } // @Override public void visitCLabel(CLabel widget){ visitCanvas(widget); } //------ decorations @Override public void visitDecorations(Decorations widget){ visitCanvas(widget); } @Override public void visitShell(Shell widget){ visitDecorations(widget); } // //------ expandables @Override public void visitExpandableComposite(ExpandableComposite widget){ visitCanvas(widget); } @Override public void visitSection(Section widget){ visitExpandableComposite(widget); } //----- @Override public void visitFormText(FormText widget){ visitCanvas(widget); } @Override public void visitStyledText(StyledText widget){ visitCanvas(widget); } //--- composites @Override public void visitCBanner(CBanner widget){ visitComposite(widget); } @Override public void visitCCombo(CCombo widget){ visitComposite(widget); } @Override public void visitCombo(Combo widget){ visitComposite(widget); } @Override public void visitCoolBar(CoolBar widget){ visitComposite(widget); } @Override public void visitCTabFolder(CTabFolder widget){ visitComposite(widget); } @Override public void visitFilteredTree(FilteredTree widget){ visitComposite(widget); } @Override public void visitForm(Form widget){ visitComposite(widget); } @Override public void visitGroup(Group widget){ visitComposite(widget); } @Override public void visitTabFolder(TabFolder widget){ visitComposite(widget); } @Override public void visitTable(Table widget){ visitComposite(widget); } @Override public void visitTableTree(TableTree widget){ visitComposite(widget); } @Override public void visitToolBar(ToolBar widget){ visitComposite(widget); } @Override public void visitTree(Tree widget){ visitComposite(widget); } @Override public void visitViewForm(ViewForm widget){ visitComposite(widget); } //-- scrollables @Override public void visitList(List widget){ visitScrollable(widget); } @Override public void visitText(Text widget){ visitScrollable(widget); } //- controls @Override public void visitSlider(Slider widget){} //- items @Override public void visitItem(Item widget){ visitWidget(widget); } @Override public void visitCoolItem(CoolItem widget){ visitItem(widget); } @Override public void visitCTabItem(CTabItem widget){ visitItem(widget); } @Override public void visitMenuItem(MenuItem widget){ visitItem(widget); } @Override public void visitTabItem(TabItem widget){ visitItem(widget); } @Override public void visitTableColumn(TableColumn widget){ visitItem(widget); } @Override public void visitTableItem(TableItem widget){ visitItem(widget); } @Override public void visitToolItem(ToolItem widget){ visitItem(widget); } @Override public void visitTrayItem(TrayItem widget){ visitItem(widget); } @Override public void visitTreeColumn(TreeColumn widget){ visitItem(widget); } @Override public void visitTreeItem(TreeItem widget){ visitItem(widget); } // widgets @Override public void visitMenu(Menu widget){ visitWidget(widget); } @Override public void visitScrollBar(ScrollBar widget){ visitWidget(widget); } @Override public void visitToolTip(ToolTip widget){ visitWidget(widget); } @Override public void visitTracker(Tracker widget){ visitWidget(widget); } @Override public void visitTray(Tray widget){ visitWidget(widget); } } public static void accept(Widget widget, IVisitor visitor){ if (widget instanceof Item) acceptItemVisitor(widget, visitor); else if (widget instanceof Control) acceptControlVisitor(widget, visitor); else if (widget instanceof Menu) acceptMenuVisitor(widget, visitor); else acceptDefaultWidgetVisitor(widget, visitor); } private static void acceptDefaultWidgetVisitor(Widget widget, IVisitor visitor) { visitor.visitWidget(widget); } private static void acceptControlVisitor(Widget widget, IVisitor visitor) { if (widget instanceof Scrollable) acceptScrollableVisitor(widget, visitor); else if (widget instanceof Button) visitor.visitButton((Button) widget); else if (widget instanceof Label) visitor.visitLabel((Label) widget); else if (widget instanceof Link) visitor.visitLink((Link) widget); else if (widget instanceof ProgressBar) visitor.visitProgressBar((ProgressBar) widget); else if (widget instanceof Sash) visitor.visitSash((Sash) widget); else if (widget instanceof Slider) visitor.visitSlider((Slider) widget); else visitor.visitControl((Control) widget); } private static void acceptScrollableVisitor(Widget widget, IVisitor visitor) { if (widget instanceof Composite) acceptCompositeVisitor(widget, visitor); else if (widget instanceof List) visitor.visitList((List) widget); else if (widget instanceof Text) visitor.visitText((Text) widget); else visitor.visitScrollable((Scrollable) widget); } private static void acceptCompositeVisitor(Widget widget, IVisitor visitor) { if (widget instanceof Browser) visitor.visitBrowser((Browser) widget); else if (widget instanceof Canvas) acceptCanvasVisitor((Canvas)widget, visitor); else if (widget instanceof CBanner) visitor.visitCBanner((CBanner) widget); else if (widget instanceof CCombo) visitor.visitCCombo((CCombo) widget); else if (widget instanceof Combo) visitor.visitCombo((Combo) widget); else if (widget instanceof CoolBar) visitor.visitCoolBar((CoolBar) widget); else if (widget instanceof CTabFolder) visitor.visitCTabFolder((CTabFolder) widget); else if (widget instanceof FilteredTree) visitor.visitFilteredTree((FilteredTree) widget); else if (widget instanceof Form) visitor.visitForm((Form) widget); else if (widget instanceof Group) visitor.visitGroup((Group) widget); else if (widget instanceof Sash) visitor.visitSash((Sash) widget); else if (widget instanceof TabFolder) visitor.visitTabFolder((TabFolder) widget); else if (widget instanceof Table) visitor.visitTable((Table) widget); else if (widget instanceof TableTree) visitor.visitTableTree((TableTree) widget); else if (widget instanceof ToolBar) visitor.visitToolBar((ToolBar) widget); else if (widget instanceof Tree) visitor.visitTree((Tree) widget); else if (widget instanceof ViewForm) visitor.visitViewForm((ViewForm) widget); else visitor.visitComposite((Composite) widget); } private static void acceptCanvasVisitor(Canvas widget, IVisitor visitor) { // TODO[pq]: baked in Forms support will get factored out if (widget instanceof Hyperlink) visitor.visitHyperlink((Hyperlink)widget); else visitor.visitCanvas(widget); } private static void acceptItemVisitor(Widget widget, IVisitor visitor) { if (widget instanceof CoolItem) visitor.visitCoolItem((CoolItem) widget); else if (widget instanceof CTabItem) visitor.visitCTabItem((CTabItem) widget); else if (widget instanceof MenuItem) visitor.visitMenuItem((MenuItem) widget); else if (widget instanceof TabItem) visitor.visitTabItem((TabItem) widget); else if (widget instanceof TableColumn) visitor.visitTableColumn((TableColumn) widget); else if (widget instanceof TableItem) visitor.visitTableItem((TableItem) widget); else if (widget instanceof ToolItem) visitor.visitToolItem((ToolItem) widget); else if (widget instanceof TrayItem) visitor.visitTrayItem((TrayItem) widget); else if (widget instanceof TreeColumn) visitor.visitTreeColumn((TreeColumn) widget); else if (widget instanceof TreeItem) visitor.visitTreeItem((TreeItem) widget); else visitor.visitItem((Item) widget); } private static void acceptMenuVisitor(Widget widget, IVisitor visitor) { visitor.visitMenu((Menu) widget); } }