/*******************************************************************************
* 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.recorder.ui;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class RecorderPanelModel implements IRecorderPanelModel {
private static interface RecordingState extends IRecorderPanelModel {}
private static interface SessionState extends RecordingState {
void setRecording(RecordingState state);
}
class StateAdapter implements RecordingState {
public boolean isDeleteEnabled() {
return false;
}
public boolean isPauseEnabled() {
return false;
}
public boolean isRecordEnabled() {
return false;
}
public boolean isRestartEnabled() {
return false;
}
public boolean isCodegenEnabled() {
return false;
}
public boolean isHookEnabled() {
return false;
}
public boolean inSession() {
return false;
}
public void sessionEnded() {}
public void sessionStarted() {}
public void clickDelete() {}
public void clickPause() {}
public void clickRecord() {}
public void clickRestart() {}
public void clickCodegen() {}
public void clickAddHook() {}
public void clickSpyMode() {}
public void addListener(IChangeListener listener) {}
public void removeListener(IChangeListener listener) {}
public void setEventProvider(IEventSequenceModel provider) {}
}
class InSession extends StateAdapter implements SessionState {
private RecordingState _recordingState = IDLE; //initial state
public void setRecording(RecordingState state) {
_recordingState = state;
}
public boolean isDeleteEnabled() {
return getRecording().isDeleteEnabled();
}
public boolean isPauseEnabled() {
return getRecording().isPauseEnabled();
}
public boolean isRecordEnabled() {
return getRecording().isRecordEnabled();
}
public boolean isRestartEnabled() {
return getRecording().isRestartEnabled();
}
public void clickDelete() {
getRecording().clickDelete();
}
public void clickPause() {
getRecording().clickPause();
}
public void clickRecord() {
getRecording().clickRecord();
}
public void clickRestart() {
getRecording().clickRestart();
}
public boolean inSession() {
return true;
}
public boolean isHookEnabled() {
return true;
}
RecordingState getRecording() {
return _recordingState;
}
}
class OutOfSession extends StateAdapter implements SessionState {
public void setRecording(RecordingState state) {}
}
class Recording extends StateAdapter {
public void clickPause() {
setRecording(IDLE);
}
public boolean isRecordEnabled() {
return false;
}
public boolean isPauseEnabled() {
return true;
}
public boolean isRestartEnabled() {
return true;
}
public boolean isDeleteEnabled() {
return false;
}
}
class Idle extends StateAdapter implements RecordingState {
public void clickRecord() {
setRecording(RECORDING);
}
public boolean isDeleteEnabled() {
return false;
}
public boolean isRecordEnabled() {
return true;
}
public boolean isPauseEnabled() {
return false;
}
public boolean isRestartEnabled() {
return hasEventsToProcess();
}
}
private RecordingState RECORDING = new Recording();
private RecordingState IDLE = new Idle();
private SessionState OUT_OF_SESSION = new OutOfSession();
private IEventSequenceModel _provider;
private final List _listeners = new ArrayList();
public RecorderPanelModel(IEventSequenceModel provider) {
setEventProvider(provider);
setSession(OUT_OF_SESSION);
}
public void setEventProvider(IEventSequenceModel provider) {
_provider = provider;
}
public RecorderPanelModel() {
this(new EventSequenceModel());
}
public IEventSequenceModel getProvider() {
return _provider;
}
public boolean hasEventsToProcess() {
return getProvider().getEvents().length != 0;
}
private SessionState _sessionState;
private SessionState getSession() {
return _sessionState;
}
private void setRecording(RecordingState state) {
getSession().setRecording(state);
notifyChanged();
}
private void setSession(SessionState state) {
_sessionState = state;
notifyChanged();
}
public void clickPause() {
getSession().clickPause();
}
public void clickRecord() {
getSession().clickRecord();
}
public void clickRestart() {
getSession().clickRestart();
}
public void clickDelete() {
getSession().clickDelete();
}
public void clickAddHook() {
getSession().clickAddHook();
}
//ignored by session?
public void clickCodegen() {
// TODO Auto-generated method stub
}
public void clickSpyMode() {
// TODO Auto-generated method stub
}
public boolean isRecordEnabled() {
return getSession().isRecordEnabled();
}
public boolean isPauseEnabled() {
return getSession().isPauseEnabled();
}
public boolean isRestartEnabled() {
return getSession().isRestartEnabled();
}
public boolean isDeleteEnabled() {
return getProvider().hasSelection();
}
public boolean isCodegenEnabled() {
return hasEventsToProcess();
}
public boolean isHookEnabled() {
return getSession().isHookEnabled();
}
public void sessionStarted() {
setSession(new InSession()); //since in-sessions are stateful we don't use a constant
}
public void sessionEnded() {
setSession(OUT_OF_SESSION);
}
public boolean inSession() {
return getSession().inSession();
}
public void addListener(IChangeListener listener) {
getListeners().add(listener);
}
public void removeListener(IChangeListener listener) {
getListeners().remove(listener);
}
private void notifyChanged() {
for (Iterator iterator = getListeners().iterator(); iterator.hasNext();) {
IChangeListener listener = (IChangeListener) iterator.next();
listener.panelChanged();
}
}
public List getListeners() {
return _listeners;
}
}