package org.jactr.eclipse.runtime.ui.misc; /* * default logging */ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.jactr.eclipse.runtime.RuntimePlugin; import org.jactr.eclipse.runtime.debug.elements.ACTRDebugElement; import org.jactr.eclipse.runtime.launching.iterative.IterativeSession; import org.jactr.eclipse.runtime.launching.session.AbstractSession; import org.jactr.eclipse.runtime.preferences.RuntimePreferences; import org.jactr.eclipse.runtime.session.ILocalSession; import org.jactr.eclipse.runtime.session.ISession; import org.jactr.eclipse.runtime.session.impl.Session2SessionAdapter; import org.jactr.eclipse.runtime.session.manager.ISessionManagerListener; import org.jactr.eclipse.ui.perspective.ACTRRuntimePerspective; /** * LayoutModifier listens for two things. 1) new ACTR Sesssions (using the out * of date ACTRSession), 2) debug events from the ACTR runtime. * * @author harrison */ public class LayoutModifier implements ISessionManagerListener { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(LayoutModifier.class); static public final String ENABLE_AUTO_LAYOUT_PREF = LayoutModifier.class .getName() + ".enable"; private final IDebugEventSetListener _debugListener; public LayoutModifier() { _debugListener = new IDebugEventSetListener() { public void handleDebugEvents(DebugEvent[] events) { for (DebugEvent event : events) { if (!(event.getSource() instanceof ACTRDebugElement)) continue; int details = event.getDetail(); if (details == DebugEvent.BREAKPOINT) switchToDebugView(true); // Display.getDefault().asyncExec(new Runnable() { // // public void run() // { // } // // }); } } }; DebugPlugin.getDefault().addDebugEventListener(_debugListener); } public void sessionAdded(ISession session) { // if (!RuntimePlugin.getDefault().getPreferenceStore() // .getBoolean(ENABLE_AUTO_LAYOUT_PREF)) return; if (hasDebugTarget(session)) switchToDebugView(false); else if (isNotIterative(session)) switchToRuntimeView(); } public void sessionRemoved(ISession session) { } private IWorkbenchPage getWorkbenchPage() { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow window = PlatformUI.getWorkbench() .getActiveWorkbenchWindow(); if (window == null) { IWorkbenchWindow[] windows = workbench.getWorkbenchWindows(); if (windows.length == 0) return null; window = windows[0]; } IWorkbenchPage page = window.getActivePage(); if (page == null) return null; return page; } private IPerspectiveDescriptor getPerspective() { IWorkbenchPage page = getWorkbenchPage(); if (page == null) return null; return page.getPerspective(); } private void switchToRuntimeView() { if (isInPerspective(ACTRRuntimePerspective.ID)) return; /* * query */ IPreferenceStore prefs = RuntimePlugin.getDefault().getPreferenceStore(); boolean dontAsk = prefs.getBoolean(RuntimePreferences.DONT_ASK_RUN_SWITCH); int rtnCode = 2; // yes if (!dontAsk) { MessageDialogWithToggle mdwt = MessageDialogWithToggle .openYesNoQuestion( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Switch to jACT-R Run Perspective?", "Models are best inspected using the jACT-R Run perspective. Switch now?", "Don't ask again", false, prefs, RuntimePreferences.DONT_ASK_RUN_SWITCH); rtnCode = mdwt.getReturnCode(); if (mdwt.getToggleState()) { prefs.setValue(RuntimePreferences.SWITCH_TO_RUN_PERSPECTIVE, rtnCode == 2); prefs.setValue(RuntimePreferences.DONT_ASK_RUN_SWITCH, true); } else prefs.setValue(RuntimePreferences.DONT_ASK_RUN_SWITCH, false); } else if (prefs.getBoolean(RuntimePreferences.SWITCH_TO_RUN_PERSPECTIVE)) rtnCode = 2; else rtnCode = 3; if (rtnCode == 2) switchToPerspective(ACTRRuntimePerspective.ID); } private void switchToDebugView(boolean dueToBreakpoint) { if (isInPerspective("org.eclipse.debug.ui.DebugPerspective")) return; IPreferenceStore prefs = RuntimePlugin.getDefault().getPreferenceStore(); boolean dontAsk = prefs .getBoolean(RuntimePreferences.DONT_ASK_DEBUG_SWITCH); int rtnCode = 2; if (!dontAsk) { MessageDialogWithToggle mdwt = MessageDialogWithToggle .openYesNoQuestion( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), dueToBreakpoint ? "Switch to jACT-R Run Perspective?" : "Switch to Debug Perspective?", dueToBreakpoint ? "Model breakpoint detected! Switch to debug perspective?" : "Debug models start suspended. To resume, use the Debug Perspective. Switch now?", "Don't ask again", false, prefs, RuntimePreferences.DONT_ASK_DEBUG_SWITCH); rtnCode = mdwt.getReturnCode(); if (mdwt.getToggleState()) { prefs.setValue(RuntimePreferences.SWITCH_TO_DEBUG_PERSPECTIVE, rtnCode == 2); prefs.setValue(RuntimePreferences.DONT_ASK_DEBUG_SWITCH, true); } else prefs.setValue(RuntimePreferences.DONT_ASK_DEBUG_SWITCH, false); } else if (prefs.getBoolean(RuntimePreferences.SWITCH_TO_DEBUG_PERSPECTIVE)) rtnCode = 2; else rtnCode = 3; if (rtnCode == 2) switchToPerspective("org.eclipse.debug.ui.DebugPerspective"); } private boolean isInPerspective(String perspectiveId) { IPerspectiveDescriptor perspective = getPerspective(); return perspectiveId.equals(perspective.getId()); } private void switchToPerspective(String perspectiveId) { IPerspectiveDescriptor perspective = getPerspective(); if (!perspective.getId().equals(perspectiveId)) getWorkbenchPage().setPerspective( getWorkbenchPage().getWorkbenchWindow().getWorkbench() .getPerspectiveRegistry().findPerspectiveWithId(perspectiveId)); } private boolean isNotIterative(ISession session) { if (session instanceof Session2SessionAdapter) { AbstractSession oldSession = ((Session2SessionAdapter) session) .getOldSession(); if (oldSession instanceof IterativeSession) return false; } return true; } private boolean hasDebugTarget(ISession session) { if (session instanceof ILocalSession) { ILocalSession lSession = (ILocalSession) session; ILaunch launch = lSession.getLaunch(); if (launch.getLaunchMode().equals(ILaunchManager.DEBUG_MODE)) return true; } return false; } }