/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.windowtester.recorder.ui.EventSequenceOptimizer;
import com.windowtester.ui.core.model.IEvent;
import com.windowtester.ui.core.model.IEventGroup;
import com.windowtester.ui.core.model.IEventSequence;
import com.windowtester.ui.core.model.ISemanticEvent;
public class EventSequence implements IEventSequence {
private static final String DEFAULT_GROUP_LABEL = "group";
private ArrayList events; //concrete class because we depend on clear() being supported
public List getEvents0() {
if (events == null)
events = new ArrayList();
return events;
}
public IEventSequence add(ISemanticEvent event) {
getEvents0().add(event);
postChange();
return this;
}
public IEventSequence addAll(ISemanticEvent[] events) {
for (int i = 0; i < events.length; i++) {
getEvents0().add(events[i]);
}
postChange();
return this;
}
public IEventSequence add(int index, ISemanticEvent event) {
getEvents0().add(index, event);
postChange();
return this;
}
public ISemanticEvent[] getEvents() {
return (ISemanticEvent[]) getEvents0().toArray(new ISemanticEvent[]{});
}
public IEventGroup group(IEvent[] events) {
int insertIndex = -1;
List eventList = getEvents0();
for (int i = 0; i < events.length; i++) {
IEvent event = events[i];
if (insertIndex == -1)
if (eventList.contains(event))
insertIndex = eventList.indexOf(event);
eventList.remove(event);
}
EventGroup group = new EventGroup(DEFAULT_GROUP_LABEL);
group.addAll(events);
add(insertIndex, group);
postChange();
return group;
}
/* (non-Javadoc)
* @see com.windowtester.ui.core.model.IEventSequence#removeAll()
*/
public IEventSequence removeAll() {
getEvents0().clear();
postChange();
return this;
}
/* (non-Javadoc)
* @see com.windowtester.ui.core.model.IEventSequence#removeAll(com.windowtester.ui.core.model.ISemanticEvent[])
*/
public IEventSequence removeAll(ISemanticEvent[] events) {
for (int i = 0; i < events.length; i++) {
remove(events[i]);
}
postChange();
return this;
}
private void postChange() {
doPostChange();
}
private void doPostChange() {
EventSequenceOptimizer.optimize(this);
}
/* (non-Javadoc)
* @see com.windowtester.ui.core.model.IEventSequence#remove(com.windowtester.ui.core.model.ISemanticEvent)
*/
public IEventSequence remove(ISemanticEvent event) {
if (!getEvents0().remove(event))
deepRemove(event);
postChange();
return this;
}
/* (non-Javadoc)
* @see com.windowtester.ui.core.model.IEventSequence#isEmpty()
*/
public boolean isEmpty() {
return events.isEmpty();
}
//tunnel into groups and text entry events
public void deepRemove(ISemanticEvent event) {
for (Iterator iter = getEvents0().iterator(); iter.hasNext(); ) {
Object next = iter.next();
if (next instanceof IEventGroup)
((IEventGroup)next).remove((IEvent) event); //groups can only contain events...
}
}
}