/*******************************************************************************
* Copyright (c) 2008 Ketan Padegaonkar and others.
* 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:
* Ketan Padegaonkar - initial API and implementation
*******************************************************************************/
package org.eclipse.swtbot.eclipse.spy;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swtbot.swt.finder.resolvers.IChildrenResolver;
import org.eclipse.swtbot.swt.finder.resolvers.IParentResolver;
/**
* @author Ketan Padegaonkar <KetanPadegaonkar [at] gmail [dot] com>
* @version $Id$
*/
public class EclipseSpy {
Action actionMonitor;
Object lastWidget;
StyledText output;
Runnable trackWidgets;
private final Composite parent;
/**
* @param parent
* @param childrenResolver
* @param parentResolver
*/
public EclipseSpy(Composite parent, IChildrenResolver childrenResolver, IParentResolver parentResolver) {
this.parent = parent;
initialize(parent.getDisplay());
trackWidgets = new EclipseWidgetTracker(this, childrenResolver, parentResolver);
}
private void createActionMonitor() {
actionMonitor = new Action("Monitor", IAction.AS_CHECK_BOX) { //$NON-NLS-1$
public void run() {
if (actionMonitor.isChecked() && !output.isDisposed()) {
Display display = output.getDisplay();
display.timerExec(100, trackWidgets);
}
}
};
actionMonitor.setToolTipText("Enable/Disable monitoring of widgets"); //$NON-NLS-1$
actionMonitor.setChecked(false);
}
private void createOutputText() {
output = new StyledText(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY);
output.setLayoutData(new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true));
output.setText("To toggle, or freeze info on a particular control, press CTRL+SHIFT: \n");
if (isMac()){
output.setFont(new Font(Display.getCurrent(), "Monaco", 11, SWT.NONE)); //$NON-NLS-1$
}else
output.setFont(new Font(Display.getCurrent(), "Courier New", 10, SWT.NONE)); //$NON-NLS-1$
}
private void hookAccelerator() {
parent.getDisplay().addFilter(SWT.KeyDown, new Listener() {
public void handleEvent(Event e) {
if ((e.stateMask == SWT.CTRL) && (e.keyCode == SWT.SHIFT))
if (actionMonitor.isChecked())
actionMonitor.setChecked(false);
else {
actionMonitor.setChecked(true);
actionMonitor.run();
}
}
});
// parent.getDisplay().addFilter(SWT.KeyDown, new SWTBotExecutionListener());
}
private static boolean isMac() {
String swtPlatform = SWT.getPlatform();
return ("carbon".equals(swtPlatform) || "cocoa".equals(swtPlatform));
}
private void initialize(Display display) {
createOutputText();
createActionMonitor();
hookAccelerator();
}
}