/******************************************************************************* * 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.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import com.windowtester.eclipse.ui.UiPlugin; import com.windowtester.eclipse.ui.session.ISession; import com.windowtester.eclipse.ui.session.ISessionMonitor; import com.windowtester.eclipse.ui.session.ISessionMonitor.ISessionListener; import com.windowtester.eclipse.ui.views.RecorderConsoleView; import com.windowtester.internal.runtime.IWidgetIdentifier; import com.windowtester.recorder.ISemanticEventProvider; import com.windowtester.recorder.event.ISemanticEventListener; import com.windowtester.recorder.event.IUISemanticEvent; import com.windowtester.recorder.event.user.SemanticEventAdapter; import com.windowtester.recorder.event.user.SemanticShellEvent; import com.windowtester.recorder.event.user.SemanticWidgetInspectionEvent; import com.windowtester.runtime.WidgetLocator; import com.windowtester.runtime.swt.locator.eclipse.ContributedToolItemLocator; import com.windowtester.runtime.swt.locator.eclipse.ViewLocator; import com.windowtester.ui.core.model.IEvent; import com.windowtester.ui.core.model.IEventGroup; import com.windowtester.ui.core.model.IEventSequence; public class EventSequenceContentProvider extends LabelProvider implements ITreeContentProvider, ISessionListener { private final ISessionMonitor sessionMonitor; private TreeViewer treeViewer; SemanticEventHandler eventHandler; private final IEventSequence sequence; //TODO: consider state object boolean disposed; private static final EventSequenceLabelProvider LABEL_PROVIDER = new EventSequenceLabelProvider(); private static final boolean DEBUGGING_LOCALLY = false; class SemanticEventHandler extends SemanticEventAdapter { /* (non-Javadoc) * @see com.windowtester.recorder.event.user.SemanticEventAdapter#notify(com.windowtester.recorder.event.IUISemanticEvent) */ public void notify(IUISemanticEvent event) { /* * TEMPORARY -- when this is not in the same Display as the app under test, this can go away! */ if (DEBUGGING_LOCALLY) { if (isInRecordViewScope(event)) return; // ignore if (isEmptyShellEvent(event)) return; // ignore if (isInspectionRequest(event)) return; // ignore } if (isInspectionRequest(event)) { SemanticWidgetInspectionEvent inspection = (SemanticWidgetInspectionEvent)event; //ignore if there are no flagged properties if (inspection.getProperties().flagged().isEmpty()) return; } getCachedSequence().add(new Event(event)); Display.getDefault().asyncExec(new Runnable() { public void run() { if (isDisposed()) return; TreeViewer viewer = getViewer(); if (viewer == null) return; viewer.refresh(); } }); } private boolean isInspectionRequest(IUISemanticEvent event) { return event instanceof SemanticWidgetInspectionEvent; } private boolean isDisposed() { return disposed || Display.getDefault().isDisposed(); } private boolean isEmptyShellEvent(IUISemanticEvent event) { if (event instanceof SemanticShellEvent) { SemanticShellEvent shellEvent = (SemanticShellEvent)event; String name = shellEvent.getName(); if (name == null) return true; name = name.trim(); return name.length() == 0 || name.equals(""); } return false; } private boolean isInRecordViewScope(IUISemanticEvent event) { IWidgetIdentifier hierarchyInfo = event.getHierarchyInfo(); if (hierarchyInfo instanceof WidgetLocator) { if (hierarchyInfo instanceof ContributedToolItemLocator) { return ((ContributedToolItemLocator)hierarchyInfo).getID().startsWith(RecorderConsoleView.ACTION_TAG_PREFIX); } WidgetLocator loc = (WidgetLocator)hierarchyInfo; //find top-most while (loc.getParentInfo() != null) { loc = loc.getParentInfo(); } if (loc instanceof ViewLocator) { return ((ViewLocator)loc).getViewId().equals(UiPlugin.RECORDER_VIEW_ID); } } return false; } } public IEventSequence getCachedSequence() { return sequence; } public EventSequenceContentProvider(ISessionMonitor sessionMonitor, IEventSequence sequence) { this.sessionMonitor = sessionMonitor; this.sequence = sequence; sessionMonitor.addListener(this); } public ISessionMonitor getSessionMonitor() { return sessionMonitor; } protected ISemanticEventProvider getRecorder() { return getSessionMonitor().getCurrent().getRecorder(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof IEventGroup) return ((IEventGroup)parentElement).getEvents(); if (parentElement instanceof IEventSequence) return ((IEventSequence)parentElement).getEvents(); if (parentElement instanceof IEvent) { //skipping widget locators for now... // IWidgetIdentifier hierarchyInfo = ((IEvent)parentElement).getUIEvent().getHierarchyInfo(); // if (hierarchyInfo != null) // return new Object[]{hierarchyInfo}; } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object element) { if (element instanceof IEvent) return ((IEvent)element).getGroup(); return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object element) { return getChildren(element) != null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { if (inputElement instanceof IEventSequence) return ((IEventSequence)inputElement).getEvents(); return new Object[]{inputElement}; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#dispose() */ public void dispose() { disposed = true; getRecorder().removeListener(getEventHandler()); //EventRecorderController.getInstance().removeListener(getEventHandler()); } private ISemanticEventListener getEventHandler() { if (eventHandler == null) eventHandler = new SemanticEventHandler(); return eventHandler; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { treeViewer = (TreeViewer)viewer; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) */ public String getText(Object e) { return LABEL_PROVIDER.getText(e); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object) */ public Image getImage(Object e) { return LABEL_PROVIDER.getImage(e); } protected final TreeViewer getViewer() { return treeViewer; } /* (non-Javadoc) * @see com.windowtester.eclipse.ui.session.ISessionMonitor.ISessionListener#started(com.windowtester.eclipse.ui.session.ISession) */ public void started(ISession session) { session.getRecorder().addListener(getEventHandler()); } /* (non-Javadoc) * @see com.windowtester.eclipse.ui.session.ISessionMonitor.ISessionListener#ended(com.windowtester.eclipse.ui.session.ISession) */ public void ended(ISession session) { session.getRecorder().removeListener(getEventHandler()); } }