/*******************************************************************************
* 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.eclipse.ui.views;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import com.windowtester.codegen.ExecutionProfile;
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.recorder.event.user.ICompositeEvent;
import com.windowtester.recorder.ui.IEventSequenceModel;
import com.windowtester.recorder.ui.IEventSequenceView;
import com.windowtester.recorder.ui.IRecorderConsoleActionHandler;
import com.windowtester.recorder.ui.IRecorderPanelModel;
import com.windowtester.recorder.ui.IRecorderPanelView;
import com.windowtester.recorder.ui.RecorderConsoleActionAdapter;
import com.windowtester.recorder.ui.IEventSequenceModel.ISequenceListener;
import com.windowtester.recorder.ui.IRecorderPanelModel.IChangeListener;
import com.windowtester.swt.codegen.wizards.NewTestTypeWizard;
import com.windowtester.ui.core.model.IEvent;
import com.windowtester.ui.core.model.IEventGroup;
import com.windowtester.ui.core.model.ISemanticEvent;
import com.windowtester.ui.internal.corel.model.Event;
/**
* Console presenter that wires together view and model.
*
*/
public class RecorderConsolePresenter implements IRecorderConsoleActionHandler /*, IRecorderPanelModel*/, ISequenceListener, IChangeListener, ISessionListener {
private final IRecorderPanelModel _panelModel;
private final IRecorderPanelView _panelView;
private final List _handlers = new ArrayList();
private final IEventSequenceModel _sequenceModel;
private final IEventSequenceView _sequenceView;
private ExecutionProfile _currentProfile = new DefaultExecutionProfile();
private final IRecorderConsoleActionHandler _codegenHandler = new CodegenHandler();
static class DefaultExecutionProfile extends ExecutionProfile {
DefaultExecutionProfile() {
setExecType(ExecutionProfile.RCP_EXEC_TYPE);
}
}
/**
* This should probably move elsewhere...
*/
class CodegenHandler extends RecorderConsoleActionAdapter {
public void clickCodegen() {
if (!eventsToCodegen())
return;
doCodegen();
}
private boolean eventsToCodegen() {
return getSequenceModel().getEvents().length != 0;
}
private void doCodegen() {
final Display display = PlatformUI.getWorkbench().getDisplay();
display.syncExec(new Runnable() {
public void run() {
final NewTestTypeWizard wizard = new NewTestTypeWizard(asFlattenedList(getSequenceModel().getEvents()), getCurrentProfile());
WizardDialog dialog = new WizardDialog(display.getActiveShell(), wizard);
dialog.open();
}
});
}
/**
* Flattens out any composite events.
*/
private List asFlattenedList(ISemanticEvent[] events) {
List l = new ArrayList();
for (int i = 0; i < events.length; i++) {
ISemanticEvent event = events[i];
if (event instanceof Event) {
Object semantic = ((Event) event).getUIEvent();
if (semantic instanceof ICompositeEvent) {
ICompositeEvent composite = (ICompositeEvent)semantic;
com.windowtester.recorder.event.ISemanticEvent[] composedEvents = composite.getComponents();
for (int j = 0; j < composedEvents.length; j++) {
l.add(new Event(composedEvents[j]));
}
} else {
l.add(semantic);
}
} else {
l.add(event);
}
}
return l;
}
}
public RecorderConsolePresenter(IRecorderPanelModel recorderPanelModel, IRecorderPanelView view, IEventSequenceModel seqModel, IEventSequenceView seqView) {
_panelModel = recorderPanelModel;
_panelView = view;
_sequenceModel = seqModel;
_sequenceView = seqView;
_panelModel.setEventProvider(_sequenceModel);
hookListeners();
}
public IRecorderConsoleActionHandler getCodegenHandler() {
return _codegenHandler;
}
public ExecutionProfile getCurrentProfile() {
return _currentProfile;
}
public void setCurrentProfile(ExecutionProfile currentProfile) {
_currentProfile = currentProfile;
}
/**
* Perform teardown.
*/
public void dispose() {
unhookListeners();
}
private void hookListeners() {
getSessionMonitor().addListener(this);
getPanelModel().addListener(this);
getSequenceModel().addListener(this);
}
private void unhookListeners() {
getSequenceModel().removeListener(this);
getPanelModel().removeListener(this);
getSessionMonitor().removeListener(this);
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IEventSequenceModel.ISequenceListener#sequenceChanged()
*/
public void sequenceChanged() {
update();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel.IChangeListener#panelChanged()
*/
public void panelChanged() {
updatePanel();
}
protected ISessionMonitor getSessionMonitor() {
return UiPlugin.getDefault().getSessionMonitor();
}
/* (non-Javadoc)
* @see com.windowtester.eclipse.ui.session.ISessionMonitor.ISessionListener#ended(com.windowtester.eclipse.ui.session.ISession)
*/
public void ended(ISession session) {
sessionEnded();
}
/* (non-Javadoc)
* @see com.windowtester.eclipse.ui.session.ISessionMonitor.ISessionListener#started(com.windowtester.eclipse.ui.session.ISession)
*/
public void started(ISession session) {
setCurrentProfile(session.getExecutionProfile());
sessionStarted();
}
public void addHandler(IRecorderConsoleActionHandler handler) {
getHandlers().add(handler);
}
public void removeHandler(IRecorderConsoleActionHandler handler) {
getHandlers().remove(handler);
}
public IRecorderPanelModel getPanelModel() {
return _panelModel;
}
public IEventSequenceModel getSequenceModel() {
return _sequenceModel;
}
private IRecorderPanelView getPanelView() {
return _panelView;
}
public IEventSequenceView getSequenceView() {
return _sequenceView;
}
protected List getHandlers() {
return _handlers;
}
public void clickDelete() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickDelete();
}
getSequenceModel().clickDelete();
}
public void clickPause() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickPause();
}
getPanelModel().clickPause();
}
public void clickRecord() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickRecord();
}
getPanelModel().clickRecord();
}
public void clickRestart() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickRestart();
}
getPanelModel().clickRestart();
}
public void clickAddHook() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickAddHook();
}
getPanelModel().clickAddHook();
}
public void clickCodegen() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickCodegen();
}
//this could be a listener just as well
getCodegenHandler().clickCodegen();
}
public void clickSpyMode() {
for (Iterator iter = getHandlers().iterator(); iter.hasNext(); ) {
((IRecorderConsoleActionHandler)iter.next()).clickSpyMode();
}
getPanelModel().clickSpyMode();
}
public void update() {
updatePanel();
updateSequenceViewer();
}
private void updateSequenceViewer() {
getSequenceView().refresh();
}
private void updatePanel() {
IRecorderPanelModel panelModel = getPanelModel();
IRecorderPanelView panelView = getPanelView();
panelView.setRecordEnabled(panelModel.isRecordEnabled());
panelView.setDeleteEnabled(panelModel.isDeleteEnabled());
panelView.setPauseEnabled(panelModel.isPauseEnabled());
panelView.setCodegenEnabled(panelModel.isCodegenEnabled());
}
public boolean isDeleteEnabled() {
return getPanelModel().isDeleteEnabled();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel#getPauseEnabled()
*/
public boolean isPauseEnabled() {
return getPanelModel().isPauseEnabled();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel#isRecordEnabled()
*/
public boolean isRecordEnabled() {
return getPanelModel().isRecordEnabled();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel#isRestartEnabled()
*/
public boolean isRestartEnabled() {
return getPanelModel().isRestartEnabled();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel#inSession()
*/
public boolean inSession() {
return getPanelModel().inSession();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel#sesssionEnded()
*/
public void sessionEnded() {
getPanelModel().sessionEnded();
updatePanel(); //this refresh feels out of place: rub: need to refresh whenever a session starts
/*
* The old behavior was to pop up the codegen dialog at session end;
* for now we want to stay consistent with that...
*/
getCodegenHandler().clickCodegen();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.ui.IRecorderPanelModel#sesssionStarted()
*/
public void sessionStarted() {
getSequenceModel().sessionStarted();
getPanelModel().sessionStarted();
updatePanel(); //this refresh feels out of place: rub: need to refresh whenever a session starts
}
/**
* @param selected
* @return
* @since 3.9.1
*/
public IEventGroup group(IEvent[] selected) {
return _sequenceModel.group(selected);
}
}