/******************************************************************************* * 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); } }