/*******************************************************************************
* Copyright (c) 2009 the CHISEL group and contributors.
* 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:
* Del Myers - initial API and implementation
*******************************************************************************/
package ca.uvic.chisel.javasketch.ui.internal;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import ca.uvic.chisel.javasketch.ISketchEventListener;
import ca.uvic.chisel.javasketch.ISketchInterestListener;
import ca.uvic.chisel.javasketch.SketchEvent;
import ca.uvic.chisel.javasketch.SketchInterestEvent;
import ca.uvic.chisel.javasketch.SketchPlugin;
import ca.uvic.chisel.javasketch.ui.internal.preferences.ISketchPluginPreferences;
import ca.uvic.chisel.javasketch.ui.internal.views.java.RefreshEditorsJob;
import ca.uvic.chisel.javasketch.ui.internal.views.java.RefreshPackageExplorerJob;
/**
* Handles all of the internal UI updates for the sketch plugin.
* @author Del Myers
*
*/
public class SketchUI implements IPropertyChangeListener, ISketchEventListener, ISketchInterestListener {
public static final SketchUI INSTANCE = new SketchUI();
private class RefreshRunnable implements Runnable {
@Override
public void run() {
IWorkbenchWindow window = SketchPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
ICommandService service = (ICommandService) window.getService(ICommandService.class);
if (service != null) {
service.refreshElements("ca.uvic.chisel.javasketch.packageExplorerFilter", null);
service.refreshElements(TraceCommandHandler.COMMAND_ID, null);
service.refreshElements(TraceDurationCommandHandler.COMMAND_ID, null);
}
}
}
public static final String PREFERENCE_FILTER_PACKAGE_EXPLORER = "ca.uvic.javasketch.ui.filters.packageExplorer";
private RefreshPackageExplorerJob refreshJavaJob;
private IWindowListener javaMarkerListener;
private RefreshEditorsJob javaEditorsJob;
/**
* Refreshes the command state for the current selection in the debug UI.
*/
public void refreshCommands() {
Display display = SketchPlugin.getDefault().getWorkbench().getDisplay();
if (Display.getCurrent() != null) {
new RefreshRunnable().run();
} else {
display.asyncExec(new RefreshRunnable());
}
}
/**
*
*/
private SketchUI() {
refreshJavaJob = new RefreshPackageExplorerJob();
javaMarkerListener = new JavaMarkerEditorListener();
javaEditorsJob = new RefreshEditorsJob();
SketchPlugin.getDefault().addSketchEventListener(this);
SketchPlugin.getDefault().getDOI().addSketchInterestListener(this);
PlatformUI.getWorkbench().addWindowListener(javaMarkerListener);
javaMarkerListener.windowActivated(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
}
/**
*
*/
public void refreshJavaUI() {
//new Exception().printStackTrace();
refreshJavaJob.cancel();
refreshJavaJob.schedule();
javaEditorsJob.cancel();
javaEditorsJob.schedule();
refreshCommands();
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
if (PREFERENCE_FILTER_PACKAGE_EXPLORER.equals(event.getProperty()) ||
ISketchPluginPreferences.DISPLAY_ONLY_SOURCE_FOLDERS.equals(event.getProperty())) {
refreshJavaUI();
}
}
/* (non-Javadoc)
* @see ca.uvic.chisel.javasketch.ISketchEventListener#handleSketchEvent(ca.uvic.chisel.javasketch.SketchEvent)
*/
@Override
public void handleSketchEvent(SketchEvent event) {
switch (event.getType()) {
case SketchRefreshed:
case SketchAnalysisEnded:
case SketchAnalysisInterrupted:
refreshJavaUI();
break;
}
}
/* (non-Javadoc)
* @see ca.uvic.chisel.javasketch.ISketchInterestListener#sketchInterestChanged(ca.uvic.chisel.javasketch.SketchInterestEvent)
*/
@Override
public void sketchInterestChanged(SketchInterestEvent event) {
refreshJavaUI();
}
/**
* Starts the ui services for listening to workbench selection changes.
*
public void start() {
SketchPlugin.getDefault().getWorkbench().getDisplay().asyncExec(new Runnable(){
@Override
public void run() {
IWorkbench workbench = SketchPlugin.getDefault().getWorkbench();
workbench.addWindowListener(SketchUI.this);
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
window.getSelectionService().addSelectionListener("org.eclipse.debug.ui.DebugView", SketchUI.this);
}
}
});
}
@Override
public void windowActivated(IWorkbenchWindow window) {
window.getSelectionService().addSelectionListener(this);
}
@Override
public void windowClosed(IWorkbenchWindow window) {
window.getSelectionService().removeSelectionListener(this);
}
@Override
public void windowDeactivated(IWorkbenchWindow window) {
window.getSelectionService().removeSelectionListener(this);
}
@Override
public void windowOpened(IWorkbenchWindow window) {
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
refreshCommands();
}
*/
}