/*******************************************************************************
* Copyright (c) 2012 Red Hat 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:
* Mickael Istria (Red Hat) - initial API and implementation
* Rastislav Wagner (Red Hat) - initial API and implementation
*******************************************************************************/
package org.eclipse.swtbot.generator.ui;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swtbot.generator.framework.Generator;
import org.eclipse.swtbot.generator.framework.IRecorderDialog;
import org.eclipse.swtbot.generator.listener.WorkbenchListener;
import org.eclipse.ui.IStartup;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
public class StartupRecorder implements IStartup {
public static final String ENABLEMENT_PROPERTY = "org.eclipse.swtbot.generator.enable"; //$NON-NLS-1$
public static final String DIALOG_PROPERTY = "org.eclipse.swtbot.generator.dialog"; //$NON-NLS-1$
private static final int[] monitoredEvents = new int[] {
SWT.Activate,
SWT.Close,
SWT.Selection,
SWT.Expand,
SWT.Modify,
SWT.MouseDown,
SWT.MouseDoubleClick,
SWT.KeyDown,
SWT.Close
};
private static final class StartRecorderRunnable implements Runnable {
private final Display display;
private String recorderDialogId;
private IRecorderDialog recorderDialog;
private StartRecorderRunnable(Display display) {
this.display = display;
}
public void setRecorderDialog(String dialog){
this.recorderDialogId = dialog;
}
public void run() {
final List<Generator> availableGenerators = GeneratorExtensionPointManager.loadGenerators();
Generator generator = availableGenerators.get(0);
final BotGeneratorEventDispatcher dispatcher = new BotGeneratorEventDispatcher();
dispatcher.setGenerator(generator);
for (int monitoredEvent : monitoredEvents) {
this.display.addFilter(monitoredEvent, dispatcher);
}
if(PlatformUI.isWorkbenchRunning()){
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
if(page != null){
page.addPartListener(new WorkbenchListener(dispatcher));
}
}
if(recorderDialogId == null || recorderDialogId.isEmpty()){
final List<IRecorderDialog> dialogs = GeneratorExtensionPointManager.loadDialogs();
this.recorderDialog = dialogs.get(0);
} else {
final List<IRecorderDialog> dialogs = GeneratorExtensionPointManager.loadDialogs();
boolean foundRecorderClass = false;
int i=0;
while(!foundRecorderClass && dialogs.size() > i){
if(dialogs.get(i).getId().equals(recorderDialogId)){
foundRecorderClass = true;
recorderDialog = dialogs.get(i);
}
i++;
}
}
dispatcher.ignoreShells(recorderDialog.getIgnoredShells());
recorderDialog.setAvailableGenerators(availableGenerators);
recorderDialog.setRecorder(dispatcher);
recorderDialog.open();
recorderDialog.getShell().addShellListener(new ShellAdapter() {
@Override
public void shellClosed(ShellEvent e) {
for (int monitoredEvent : monitoredEvents) {
display.removeFilter(monitoredEvent, dispatcher);
}
}
});
}
public IRecorderDialog getRecorderDialog() {
return this.recorderDialog;
}
}
public void earlyStartup() {
if (Boolean.parseBoolean(System.getProperty(ENABLEMENT_PROPERTY)) != true) {
return;
}
openRecorder(null);
}
public static IRecorderDialog openRecorder(String dialog) {
final Display display = Display.getDefault();
StartRecorderRunnable recorderStarter = new StartRecorderRunnable(display);
if(dialog == null && System.getProperty(DIALOG_PROPERTY) != null){
dialog = System.getProperty(DIALOG_PROPERTY);
}
recorderStarter.setRecorderDialog(dialog);
display.syncExec(recorderStarter);
return recorderStarter.getRecorderDialog();
}
}