/* * Author: Markus Barchfeld * * Copyright (c) 2005 RubyPeople. * * This file is part of the Ruby Development Tools (RDT) plugin for eclipse. RDT is * subject to the "Common Public License (CPL) v 1.0". You may not use RDT except in * compliance with the License. For further information see org.rubypeople.rdt/rdt.license. */ package org.rubypeople.rdt.internal.debug.ui.actions; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.IDebugView; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorActionDelegate; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IViewActionDelegate; import org.eclipse.ui.IViewPart; import org.rubypeople.rdt.debug.core.RdtDebugCorePlugin; import org.rubypeople.rdt.debug.core.model.IRubyStackFrame; import org.rubypeople.rdt.debug.core.model.IRubyVariable; import org.rubypeople.rdt.internal.debug.core.model.RubyExpression; import org.rubypeople.rdt.internal.debug.core.model.RubyProcessingException; public class InspectAction extends AbstractInspectAction implements IViewActionDelegate, IEditorActionDelegate { private IRubyVariable inspectResult; protected IRubyStackFrame getRubyStackFrame() { IViewPart part = page.findView(IDebugUIConstants.ID_DEBUG_VIEW); if (part == null) { return null; } IDebugView launchView = (IDebugView) part; StructuredSelection selected = (StructuredSelection) launchView.getViewer().getSelection(); if (selected.isEmpty()) { return null; } if (!(selected.getFirstElement() instanceof IRubyStackFrame)) { return null; } return (IRubyStackFrame) selected.getFirstElement(); } public void run(IAction action) { final IRubyStackFrame stackFrame = this.getRubyStackFrame(); if (stackFrame == null) { MessageDialog.openInformation(page.getActivePart().getSite().getShell(), "No suitable stack frame", "Could not inspect because there is no context (a ruby stack frame) for inspection selected."); return; } if (!(selection instanceof ITextSelection)) { return; } final String selectedText = ((ITextSelection) selection).getText().replace('\n', ';').replace('\r', ' '); String jobName = "Inspect " + (selectedText.length() < 20 ? selectedText : selectedText.substring(0, 19) + "..."); Job job = new Job(jobName) { @Override protected IStatus run(IProgressMonitor monitor) { monitor.beginTask("inspecting", IProgressMonitor.UNKNOWN); IStatus result = null; try { inspectResult = stackFrame.getRubyDebuggerProxy().readInspectExpression(stackFrame, selectedText); result = Status.OK_STATUS; } catch (RubyProcessingException e) { String message = e.getRubyExceptionType() + " inspecting '" + selectedText + "':\n" + e.getMessage(); result = new Status(IStatus.ERROR, RdtDebugCorePlugin.PLUGIN_ID, IStatus.ERROR, message, e); } return result; } }; job.addJobChangeListener(new JobChangeAdapter() { public void done(final IJobChangeEvent event) { Display.getDefault().syncExec(new Runnable() { public void run() { if (event.getResult().isOK()) { showExpressionView(); DebugPlugin.getDefault().getExpressionManager().addExpression(new RubyExpression(selectedText, inspectResult)); } // if (event.getResult().getSeverity() == IStatus.ERROR) // { // String message = event.getResult().getMessage(); // MessageDialog.openInformation(Display.getCurrent().getActiveShell(), // "Error", "Could not inspect '" + selectedText + "': " // + message); // } } }); } }); job.setPriority(Job.SHORT); job.schedule(); } public void setActiveEditor(IAction action, IEditorPart targetEditor) { if (targetEditor == null || targetEditor.getEditorSite() == null) { this.page = null; } else { this.page = targetEditor.getEditorSite().getPage(); } } }