com.windowtester.ui.internal.corel.model.EventSequenceLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.windowtester.ui.internal.corel.model.EventSequenceLabelProvider.java

Source

/*******************************************************************************
 *  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.ui.internal.corel.model;

import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Text;

import com.windowtester.eclipse.ui.UiPlugin;
import com.windowtester.internal.runtime.ICodegenParticipant;
import com.windowtester.internal.runtime.IWidgetIdentifier;
import com.windowtester.internal.runtime.Platform;
import com.windowtester.internal.runtime.PropertySet.PropertyMapping;
import com.windowtester.internal.runtime.locator.IdentifierAdapter;
import com.windowtester.recorder.event.ISemanticEvent;
import com.windowtester.recorder.event.IUISemanticEvent;
import com.windowtester.recorder.event.meta.RecorderAssertionHookAddedEvent;
import com.windowtester.recorder.event.user.SemanticDropEvent;
import com.windowtester.recorder.event.user.SemanticKeyDownEvent;
import com.windowtester.recorder.event.user.SemanticMenuSelectionEvent;
import com.windowtester.recorder.event.user.SemanticShellClosingEvent;
import com.windowtester.recorder.event.user.SemanticShellDisposedEvent;
import com.windowtester.recorder.event.user.SemanticShellEvent;
import com.windowtester.recorder.event.user.SemanticShellShowingEvent;
import com.windowtester.recorder.event.user.SemanticTextEntryEvent;
import com.windowtester.recorder.event.user.SemanticTreeItemSelectionEvent;
import com.windowtester.recorder.event.user.SemanticWidgetClosedEvent;
import com.windowtester.recorder.event.user.SemanticWidgetInspectionEvent;
import com.windowtester.runtime.IAdaptable;
import com.windowtester.runtime.WidgetLocator;
import com.windowtester.runtime.locator.IPathLocator;
import com.windowtester.runtime.swing.locator.JButtonLocator;
import com.windowtester.runtime.swing.locator.JCheckBoxLocator;
import com.windowtester.runtime.swing.locator.JComboBoxLocator;
import com.windowtester.runtime.swing.locator.JListLocator;
import com.windowtester.runtime.swing.locator.JMenuItemLocator;
import com.windowtester.runtime.swing.locator.JRadioButtonLocator;
import com.windowtester.runtime.swing.locator.JTabbedPaneLocator;
import com.windowtester.runtime.swing.locator.JTableItemLocator;
import com.windowtester.runtime.swing.locator.JTextComponentLocator;
import com.windowtester.runtime.swing.locator.JToggleButtonLocator;
import com.windowtester.runtime.swing.locator.JTreeItemLocator;
import com.windowtester.runtime.swt.locator.jface.WizardPageLocator;
import com.windowtester.runtime.swt.locator.ButtonLocator;
import com.windowtester.runtime.swt.locator.CComboItemLocator;
import com.windowtester.runtime.swt.locator.CTabItemLocator;
import com.windowtester.runtime.swt.locator.ComboItemLocator;
import com.windowtester.runtime.swt.locator.FilteredTreeItemLocator;
import com.windowtester.runtime.swt.locator.LabeledLocator;
import com.windowtester.runtime.swt.locator.LabeledTextLocator;
import com.windowtester.runtime.swt.locator.ListItemLocator;
import com.windowtester.runtime.swt.locator.MenuItemLocator;
import com.windowtester.runtime.swt.locator.TabItemLocator;
import com.windowtester.runtime.swt.locator.TableItemLocator;
import com.windowtester.runtime.swt.locator.TreeItemLocator;
import com.windowtester.runtime.swt.locator.eclipse.ContributedToolItemLocator;
import com.windowtester.runtime.swt.locator.eclipse.EditorLocator;
import com.windowtester.runtime.swt.locator.eclipse.PerspectiveLocator;
import com.windowtester.runtime.swt.locator.eclipse.PullDownMenuItemLocator;
import com.windowtester.runtime.swt.locator.eclipse.ViewLocator;
import com.windowtester.ui.core.model.IEvent;
import com.windowtester.ui.core.model.IEventGroup;

/**
 * A label provider for recorded events.
 *
 */
public class EventSequenceLabelProvider extends LabelProvider {

    static abstract class Type {
        abstract String getIntro();

        abstract String getDescription(IUISemanticEvent event);

        public static Type forEvent(IUISemanticEvent event) {
            if (event instanceof SemanticWidgetInspectionEvent)
                return ASSERT;
            if (event instanceof SemanticDropEvent)
                return DRAG;
            if (event instanceof SemanticWidgetClosedEvent)
                return CLOSED;
            return CLICK;
        }
    }

    private static final Type DRAG = new Type() {
        public String getIntro() {
            return "Dragged to";
        }

        public String getDescription(IUISemanticEvent event) {
            return null;
        }
    };

    private static final Type CLICK = new Type() {
        public String getIntro() {
            return null;
        }

        public String getDescription(IUISemanticEvent event) {
            return "clicked";
        }
    };

    private static final Type CLOSED = new Type() {
        public String getIntro() {
            return null;
        }

        public String getDescription(IUISemanticEvent event) {
            return "closed";
        }
    };

    private static final Type ASSERT = new Type() {
        public String getIntro() {
            return "Asserted";
        }

        public String getDescription(IUISemanticEvent event) {
            if (!(event instanceof SemanticWidgetInspectionEvent))
                return ""; //shouldn't happen...
            SemanticWidgetInspectionEvent assertion = (SemanticWidgetInspectionEvent) event;
            PropertyMapping[] flagged = assertion.getProperties().flagged().toArray();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < flagged.length; i++) {
                sb.append(flagged[i].asString());
                if (i + 1 < flagged.length)
                    sb.append(", ");
            }
            return sb.toString();
        }
    };

    private static final String ICON_ROOT = "icons/full/obj16/";

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
     */
    public String getText(Object e) {

        ILabelProvider labelProvider = adaptToLabelProvider(e);
        if (labelProvider != null)
            return labelProvider.getText(e);

        if (e instanceof IEventGroup)
            return ((IEventGroup) e).getName();
        if (e instanceof IEvent)
            return getEventText((IEvent) e);

        return super.getText(e);
    }

    private ILabelProvider adaptToLabelProvider(Object e) {
        if (e instanceof IAdaptable) {
            return (ILabelProvider) ((IAdaptable) e).getAdapter(ILabelProvider.class);
        }
        return null;
    }

    private ICodegenParticipant adaptToCodegenParticipant(Object o) {
        if (o instanceof IAdaptable) {
            return (ICodegenParticipant) ((IAdaptable) o).getAdapter(ICodegenParticipant.class);
        }
        return null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
     */
    public Image getImage(Object e) {

        ILabelProvider labelProvider = adaptToLabelProvider(e);
        if (labelProvider != null) {
            Image image = labelProvider.getImage(e);
            if (image != null)
                return image;
        }

        if (e instanceof IEvent) {
            return getEventImage((IEvent) e);
        }
        if (e instanceof IEventGroup) {
            return getPluginImage("eventGroup.gif");
        }
        if (e instanceof IWidgetIdentifier) {
            return getPluginImage("class_hi.gif");
        }
        return super.getImage(e);
    }

    private String getEventText(IEvent e) {

        ISemanticEvent event = e.getUIEvent();
        if (event instanceof RecorderAssertionHookAddedEvent)
            return asserted(((RecorderAssertionHookAddedEvent) event).getHookName());
        /*
         * sanity: want to filter out all non- IUISemantic events
         */
        if (!(event instanceof IUISemanticEvent))
            return "<null>";

        IUISemanticEvent uiEvent = (IUISemanticEvent) event;

        if (uiEvent instanceof SemanticKeyDownEvent)
            return toString(((SemanticKeyDownEvent) uiEvent)) + " pressed";
        if (uiEvent instanceof SemanticTextEntryEvent) {
            return toString(((SemanticTextEntryEvent) uiEvent)) + " entered";
        }
        if (uiEvent instanceof SemanticShellEvent)
            return uiEvent.toString();
        if (uiEvent.isContext())
            return contextClicked(uiEvent);

        return clicked(uiEvent);
    }

    private String toString(SemanticTextEntryEvent textEvent) {
        return EnteredKeyLabelProvider.getLabel(textEvent);
    }

    private String toString(SemanticKeyDownEvent keyEvent) {
        return EnteredKeyLabelProvider.getLabel(keyEvent);

    }

    private String clicked(IUISemanticEvent uiEvent) {

        Type type = Type.forEvent(uiEvent);
        String description = type.getDescription(uiEvent);

        Object info = uiEvent.getHierarchyInfo();

        ILabelProvider labelProvider = adaptToLabelProvider(info);
        if (labelProvider != null)
            return toString("", type, info, description);

        ICodegenParticipant cp = adaptToCodegenParticipant(info);
        if (cp != null) {
            if (description == null)
                description = "";
            return toString(cp, type, info, description);
        }
        if (info instanceof IdentifierAdapter)
            info = ((IdentifierAdapter) info).getLocator();

        if (info instanceof ButtonLocator || isJButton(info))
            return toString("Button: ", type, info, description);
        if (info instanceof ComboItemLocator || info instanceof JComboBoxLocator)
            return toString("Combo Item: ", type, info, description);
        if (info instanceof CComboItemLocator)
            return toString("CCombo Item: ", type, info, description);
        if (info instanceof CTabItemLocator)
            return toString("CTabItem: ", type, info, description);
        if (info instanceof TabItemLocator || info instanceof JTabbedPaneLocator)
            return toString("TabItem: ", type, info, description);
        if (info instanceof ListItemLocator || info instanceof JListLocator)
            return toString("List Item: ", type, info, description);
        if (info instanceof TreeItemLocator || info instanceof JTreeItemLocator)
            return toString("Tree Item: ", type, info, description);
        if (info instanceof FilteredTreeItemLocator)
            return toString("Tree Item: ", type, info, description);
        if (info instanceof MenuItemLocator || info instanceof JMenuItemLocator)
            return toString("Menu Item: ", type, info, description);
        if (info instanceof PullDownMenuItemLocator)
            return toString("Pull Down Menu Item: ", type, info, description);
        if (info instanceof TableItemLocator || info instanceof JTableItemLocator)
            return toString("Table Item: ", type, info, description);
        if (info instanceof ContributedToolItemLocator)
            return toString("Tool Item: ", type, info, description);
        if (info instanceof WizardPageLocator)
            return toString("Wizard Page:", type, info, description);
        if (info instanceof LabeledLocator) {
            String intro = type.getIntro();
            intro = intro == null ? "" : intro + " ";
            if (isType(((LabeledLocator) info).getTargetClass(), Text.class))
                return intro + "Text Labeled: " + getLocatorText(info) + " " + description;
            if (isType(((LabeledLocator) info).getTargetClass(), StyledText.class))
                return intro + "Text Labeled: " + getLocatorText(info) + " " + description;
            return intro + "Labeled Widget: " + getLocatorText(info) + " " + description;
        }
        if (info instanceof ViewLocator) {
            return toString("View:", type, info, description);
        }
        if (info instanceof EditorLocator) {
            return toString("Editor:", type, info, description);
        }
        if (info instanceof PerspectiveLocator) {
            return toString("Perspective:", type, info, description);
        }
        if (info instanceof LabeledTextLocator)
            return "Text Labeled: " + getLocatorText(info) + " " + description;
        if (info instanceof JTextComponentLocator)
            return toString("Text : ", type, info, description);
        return defaultLocatorText(info);
    }

    private String toString(ICodegenParticipant cp, Type type, Object info, String description) {
        String intro = type.getIntro();
        if (intro == null)
            intro = "";
        else
            intro += " ";
        if (description == null)
            description = "";
        else
            description = " " + description;
        return intro + LabelTranslator.fromCodeString(cp) + description;
    }

    private String contextClicked(IUISemanticEvent event) {

        IWidgetIdentifier locator = event.getHierarchyInfo();

        if (event instanceof SemanticTreeItemSelectionEvent) {
            return treeContextClick((SemanticTreeItemSelectionEvent) event);
        }

        if (!(event instanceof SemanticMenuSelectionEvent)) //shouldn't happen
            return defaultContextClick(locator);

        SemanticMenuSelectionEvent menuSelect = (SemanticMenuSelectionEvent) event;

        StringBuffer sb = new StringBuffer();
        sb.append("Context Menu Item '").append(menuSelect.getPathString());
        sb.append("' clicked in ").append(getLocatorText(locator));
        return sb.toString();
    }

    private String defaultContextClick(IWidgetIdentifier locator) {
        return "Context Menu Item '" + getLocatorText(locator) + "' clicked";
    }

    private String treeContextClick(SemanticTreeItemSelectionEvent event) {

        StringBuffer sb = new StringBuffer();
        sb.append("Context Menu Item '").append(event.getContextMenuSelectionPath());
        sb.append("' clicked in Tree Item '").append(event.getPathString()).append("'");

        IWidgetIdentifier loc = event.getHierarchyInfo();
        if (loc instanceof WidgetLocator) {
            WidgetLocator parent = ((WidgetLocator) loc).getParentInfo();
            if (parent != null) {
                if (parent instanceof ViewLocator)
                    sb.append(" in view '").append(((ViewLocator) parent).getViewId()).append("'");
            }
        }
        return sb.toString();
    }

    private String asserted(String hookName) {
        return hookName;
    }

    private String defaultLocatorText(Object info) {
        String detail = info == null ? "<unknown>" : info.toString();
        return "Widget (" + detail + ") clicked";
    }

    //   private String clicked(String label, IWidgetIdentifier info) {
    //      return toString(label, info, "clicked");
    //   }

    //   private String toString(String label, IWidgetIdentifier info, String description) {
    //      return label + ": " + getLocatorText(info) + " " + description;
    //   }

    private String toString(String label, Type type, Object info, String description) {
        String intro = type.getIntro();
        if (intro != null)
            label = intro + " " + label;
        if (description == null)
            description = "";
        else
            description = " " + description;
        return label + getLocatorText(info) + description;
    }

    private String getLocatorText(Object info) {

        ILabelProvider labelProvider = adaptToLabelProvider(info);
        if (labelProvider != null)
            return labelProvider.getText(info);

        if (info instanceof PerspectiveLocator) {
            return "'" + ((PerspectiveLocator) info).getPerspectiveId() + "'";
        }
        if (!(info instanceof WidgetLocator)) {
            return "";
        }
        WidgetLocator locator = (WidgetLocator) info;
        String detail = null;
        if (locator instanceof IPathLocator)
            detail = ((IPathLocator) locator).getPath();
        else
            detail = locator.getNameOrLabel();
        // special case JTableItemLocator
        if (locator instanceof JTableItemLocator) {
            JTableItemLocator tableLocator = (JTableItemLocator) locator;
            detail = "row " + tableLocator.getRow() + ", column " + tableLocator.getColumn();
        } else {
            detail = "'" + detail + "'";
        }

        //detail = "'" + detail + "'";

        WidgetLocator parentInfo = locator.getParentInfo();
        if (parentInfo != null) {
            if (parentInfo instanceof ViewLocator)
                detail += " in view '" + ((ViewLocator) parentInfo).getViewId() + "'";
        }

        return detail;
    }

    private Image getEventImage(IEvent e) {
        ISemanticEvent event = e.getUIEvent();
        if (event instanceof RecorderAssertionHookAddedEvent)
            return widget("assertion");
        if (event instanceof SemanticWidgetInspectionEvent)
            return widget("assertion");
        if (event instanceof SemanticDropEvent)
            return widget("dragTo");
        /*
         * sanity: want to filter out all non- IUISemantic events
         */
        if (!(event instanceof IUISemanticEvent))
            return null;

        IUISemanticEvent uiEvent = (IUISemanticEvent) event;

        if (uiEvent instanceof SemanticKeyDownEvent)
            return widget("key");
        if (uiEvent instanceof SemanticTextEntryEvent)
            return widget("key");
        if (uiEvent instanceof SemanticShellShowingEvent)
            return widget("shell_in");
        if (uiEvent instanceof SemanticShellDisposedEvent)
            return widget("shell_out");
        if (uiEvent instanceof SemanticShellClosingEvent)
            return widget("shell_out");
        if (uiEvent.isContext())
            return widget("popup_menu");

        IWidgetIdentifier info = uiEvent.getHierarchyInfo();

        ILabelProvider labelProvider = adaptToLabelProvider(info);
        if (labelProvider != null) {
            Image image = labelProvider.getImage(info);
            if (image != null)
                return image;
        }

        if (info instanceof ButtonLocator || isJButton(info))
            return widget("button");
        if (info instanceof ComboItemLocator || info instanceof JComboBoxLocator)
            return widget("combo");
        if (info instanceof CComboItemLocator)
            return widget("combo");
        if (info instanceof CTabItemLocator)
            return widget("tab_item");
        if (info instanceof TabItemLocator || info instanceof JTabbedPaneLocator)
            return widget("tab_item");
        if (info instanceof ListItemLocator || info instanceof JListLocator)
            return widget("list");
        if (info instanceof TreeItemLocator || info instanceof JTreeItemLocator)
            return widget("tree");
        if (info instanceof FilteredTreeItemLocator)
            return widget("tree");
        if (info instanceof MenuItemLocator || info instanceof JMenuItemLocator)
            return widget("menu");
        if (info instanceof PullDownMenuItemLocator)
            return widget("menu");
        if (info instanceof TableItemLocator || info instanceof JTableItemLocator)
            return widget("table");
        if (info instanceof ContributedToolItemLocator)
            return widget("tool_item");
        if (info instanceof LabeledLocator) {
            if (isType(info.getTargetClass(), Text.class))
                return widget("text");
            if (isType(info.getTargetClass(), StyledText.class))
                return widget("text");
            return widget("label");
        }
        if (info instanceof LabeledTextLocator || info instanceof JTextComponentLocator)
            return widget("text");

        //fall through
        return defaultEventImage();
    }

    private boolean isJButton(Object info) {
        if (info instanceof JButtonLocator || info instanceof JRadioButtonLocator
                || info instanceof JToggleButtonLocator || info instanceof JCheckBoxLocator)
            return true;
        return false;
    }

    private boolean isType(Class targetClass, Class type) {
        if (targetClass == null || type == null)
            return false;
        return type.isAssignableFrom(targetClass);
    }

    private Image widget(String name) {
        return getPluginImage("widgets/" + name + ".gif");
    }

    private Image defaultEventImage() {
        return widget("default_widget");
        //      return getPluginImage("event.gif");
    }

    private Image getPluginImage(String path) {
        if (!Platform.isRunning())
            return null;
        return UiPlugin.getDefault().getImage(ICON_ROOT + path);
    }

}