package org.erlide.debug.ui.views; import java.util.EnumSet; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; 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.ILaunchConfiguration; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.RuntimeProcess; import org.eclipse.debug.ui.AbstractDebugView; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.contexts.DebugContextEvent; import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PartInitException; import org.erlide.backend.api.ErlRuntimeAttributes; import org.erlide.backend.debug.IErlangDebugNode; import org.erlide.backend.debug.model.ErlangDebugElement; import org.erlide.backend.debug.model.ErlangDebugTarget; import org.erlide.debug.ui.utils.ModuleItemLabelProvider; import org.erlide.engine.ErlangEngine; import org.erlide.engine.model.root.IErlModule; import org.erlide.runtime.api.ErlDebugFlags; import org.erlide.ui.editors.util.EditorUtility; import org.erlide.util.ErlLogger; /** * A view with a checkbox tree of interpreted modules checking/unchecking * interpretes/de-interpretes a module * * @author jakob */ public class InterpretedModulesView extends AbstractDebugView implements IDebugEventSetListener, IDebugContextListener { ListViewer listViewer; InterpretedModuleListContentProvider contentProvider; private ErlangDebugTarget erlangDebugTarget; private boolean distributed; @Override public void debugContextChanged(final DebugContextEvent event) { if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) { contextActivated(event.getContext()); } } private void contextActivated(final ISelection selection) { if (!isAvailable() || !isVisible()) { return; } erlangDebugTarget = null; if (selection instanceof IStructuredSelection) { final IStructuredSelection structuredSelection = (IStructuredSelection) selection; final Object o = structuredSelection.getFirstElement(); if (o instanceof ErlangDebugElement) { final ErlangDebugElement e = (ErlangDebugElement) o; erlangDebugTarget = e.getErlangDebugTarget(); } else if (o instanceof ILaunch) { final ILaunch launch = (ILaunch) o; final IDebugTarget target = launch.getDebugTarget(); if (target instanceof IErlangDebugNode) { final IErlangDebugNode edn = (IErlangDebugNode) target; erlangDebugTarget = edn.getErlangDebugTarget(); } } else if (o instanceof RuntimeProcess) { final RuntimeProcess ep = (RuntimeProcess) o; final ILaunch launch = ep.getLaunch(); final IDebugTarget target = launch.getDebugTarget(); if (target instanceof IErlangDebugNode) { final IErlangDebugNode edn = (IErlangDebugNode) target; erlangDebugTarget = edn.getErlangDebugTarget(); } } if (erlangDebugTarget == null) { ErlLogger.debug("no debug target found for " + selection); return; } final ILaunchConfiguration launchConfiguration = erlangDebugTarget.getLaunch() .getLaunchConfiguration(); setViewerInput(launchConfiguration); try { final EnumSet<ErlDebugFlags> debugFlags = ErlDebugFlags.makeSet( launchConfiguration.getAttribute(ErlRuntimeAttributes.DEBUG_FLAGS, ErlDebugFlags .getFlag(ErlDebugFlags.DEFAULT_DEBUG_FLAGS))); distributed = debugFlags.contains(ErlDebugFlags.DISTRIBUTED_DEBUG); } catch (final CoreException e1) { distributed = false; } } listViewer.refresh(); showViewer(); // updateAction(VARIABLES_FIND_ELEMENT_ACTION); // updateAction(FIND_ACTION); } private void setViewerInput(final ILaunchConfiguration launchConfiguration) { listViewer.setInput(launchConfiguration); } @Override public void handleDebugEvents(final DebugEvent[] events) { boolean changed = false; for (final DebugEvent debugEvent : events) { if (debugEvent.getKind() == DebugEvent.MODEL_SPECIFIC && debugEvent .getDetail() == ErlangDebugTarget.INTERPRETED_MODULES_CHANGED) { changed = true; break; } } if (changed) { if (erlangDebugTarget == null) { ErlLogger.warn("erlangDebugTarget is null ?!?!"); return; } final Set<String> interpret = erlangDebugTarget.getInterpretedModules(); contentProvider.setModules(interpret); refreshList(); } } private void refreshList() { getSite().getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { listViewer.refresh(); } }); } @Override protected void configureToolBar(final IToolBarManager tbm) { } @Override protected void createActions() { } @Override protected Viewer createViewer(final Composite parent) { listViewer = new ListViewer(parent, SWT.BORDER); listViewer.setLabelProvider(new ModuleItemLabelProvider()); contentProvider = new InterpretedModuleListContentProvider(); listViewer.setContentProvider(contentProvider); getSite().setSelectionProvider(listViewer); listViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(final DoubleClickEvent event) { final IStructuredSelection ss = (IStructuredSelection) event .getSelection(); for (final Object o : ss.toArray()) { try { EditorUtility.openInEditor(o); } catch (final PartInitException e) { ErlLogger.warn(e); } } } }); DebugUITools.getDebugContextManager().addDebugContextListener(this); DebugPlugin.getDefault().addDebugEventListener(this); return listViewer; } @Override protected void fillContextMenu(final IMenuManager menu) { } @Override protected String getHelpContextId() { return null; } @Override protected void becomesHidden() { setViewerInput(null); super.becomesHidden(); } @Override protected void becomesVisible() { super.becomesVisible(); final ISelection selection = DebugUITools.getDebugContextManager() .getContextService(getSite().getWorkbenchWindow()).getActiveContext(); contextActivated(selection); } public void interpretOrDeinterpret(final IErlModule module, final boolean checked) { if (erlangDebugTarget == null) { ErlLogger.warn("erlangDebugTarget is null ?!?!"); return; } final String moduleWoExtension = module.getModuleName(); final IProject project = ErlangEngine.getInstance().getModelUtilService() .getProject(module).getWorkspaceProject(); final boolean interpret = checked; if (erlangDebugTarget.getInterpretedModules() .contains(moduleWoExtension) != interpret) { // FIXME this isn't correct!!! erlangDebugTarget.interpret(project, moduleWoExtension, distributed, interpret); } addRemove(module, checked); } private void addRemove(final IErlModule module, final boolean add) { if (add) { contentProvider.addModule(module); } else { contentProvider.removeModule(module); } refreshList(); } }