use of org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPEditor in project linuxtools by eclipse.
the class AddStapProbeHandler method execute.
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ITextEditor editor;
try {
editor = (ITextEditor) HandlerUtil.getActiveEditor(event);
} catch (ClassCastException e) {
ExceptionErrorDialog.openError(Messages.AddStapProbe_unableToInsertProbe, Messages.AddStapProbe_editorError, e);
throw new ExecutionException(Messages.AddStapProbe_editorError, e);
}
IVerticalRulerInfo rulerInfo = editor.getAdapter(IVerticalRulerInfo.class);
Shell shell = editor.getSite().getShell();
shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
int lineno = rulerInfo.getLineOfLastMouseButtonActivity();
IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
String s = document.get();
// $NON-NLS-1$
String[] lines = s.split("\n");
String line = lines[lineno].trim();
boolean die = false;
if (line.isEmpty()) {
// eat blank lines
die = true;
}
if (line.startsWith("#")) {
// eat preprocessor directives //$NON-NLS-1$
die = true;
}
if (line.startsWith("//")) {
// eat C99 comments //$NON-NLS-1$
die = true;
}
if (line.startsWith("/*") && !line.contains("*/") && !line.endsWith("*/")) {
// try to eat single-line C comments //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
die = true;
}
// gogo find comment segments
try {
ArrayList<Integer> commentChunks = new ArrayList<>();
char[] chars = s.toCharArray();
int needle = 1;
int offset = document.getLineOffset(lineno);
while (needle < chars.length) {
if (chars[needle - 1] == '/' && chars[needle] == '*') {
commentChunks.add(needle);
while (needle < chars.length) {
if (chars[needle - 1] == '*' && chars[needle] == '/') {
commentChunks.add(needle);
needle++;
break;
}
needle++;
}
}
needle++;
}
for (int i = 0, pair, start, end; i < commentChunks.size(); i++) {
if (!(commentChunks.get(i).intValue() < offset)) {
pair = i - i % 2;
start = commentChunks.get(pair).intValue();
end = commentChunks.get(pair + 1).intValue();
if (offset >= start && offset <= end) {
die = true;
}
}
}
} catch (BadLocationException excp) {
ExceptionErrorDialog.openError(Messages.AddStapProbe_unableToInsertProbe, excp);
return null;
}
if (die) {
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.CEditor_probeInsertFailed, Messages.CEditor_canNotProbeLine);
} else {
IEditorInput in = editor.getEditorInput();
if (in instanceof FileStoreEditorInput) {
FileStoreEditorInput input = (FileStoreEditorInput) in;
IPreferenceStore p = IDEPlugin.getDefault().getPreferenceStore();
String kernroot = p.getString(IDEPreferenceConstants.P_KERNEL_SOURCE);
String filepath = input.getURI().getPath();
String kernrelative = filepath.substring(kernroot.length() + 1, filepath.length());
StringBuffer sb = new StringBuffer();
// $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
sb.append("probe kernel.statement(\"*@" + kernrelative + ":" + (lineno + 1) + "\")");
// $NON-NLS-1$
sb.append("\n{\n\t\n}\n");
STPEditor activeSTPEditor = IDESessionSettings.getOrAskForActiveSTPEditor(false);
if (activeSTPEditor != null) {
activeSTPEditor.insertText(sb.toString());
}
}
}
// Return the cursor to normal
shell.setCursor(null);
return null;
}
use of org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPEditor in project linuxtools by eclipse.
the class DefinitionHandler method execute.
@Override
public Object execute(ExecutionEvent event) {
TreeDefinitionNode t = getSelection(event);
if (t == null) {
return null;
}
String filename = t.getDefinition();
if (filename == null) {
return null;
}
File file = new File(filename);
OpenFileHandler open = new OpenFileHandler();
open.executeOnFile(file);
if (open.isSuccessful() && t.getData() instanceof ISearchableNode) {
IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
STPEditor editor = (STPEditor) editorPart;
editor.jumpToLocation(findDefinitionLine((ISearchableNode) t.getData(), editor) + 1, 0);
}
return null;
}
use of org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPEditor in project linuxtools by eclipse.
the class IDESessionSettings method getOrAskForActiveSTPEditor.
/**
* Restore and return an STPEditor based on the user's choice.
* @param checkCurrent Set to <code>true</code> if the currently active editor may be returned
* if it is an {@link STPEditor}.
* @return
*/
public static STPEditor getOrAskForActiveSTPEditor(boolean checkCurrent) {
STPEditor stpEditor;
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (checkCurrent) {
IEditorPart editor = page.getActiveEditor();
stpEditor = editor instanceof STPEditor ? (STPEditor) editor : askForSTPEditor(window);
} else {
stpEditor = askForSTPEditor(window);
}
if (stpEditor != null) {
page.activate(stpEditor);
}
return stpEditor;
}
use of org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPEditor in project linuxtools by eclipse.
the class IndentHandler method selectAndReveal.
/**
* Selects the given range on the editor.
*
* @param newOffset
* the selection offset
* @param newLength
* the selection range
*/
private void selectAndReveal(ITextEditor editor, int newOffset, int newLength) {
Assert.isTrue(newOffset >= 0);
Assert.isTrue(newLength >= 0);
if (editor instanceof STPEditor) {
ISourceViewer viewer = ((STPEditor) editor).getMySourceViewer();
if (viewer != null) {
viewer.setSelectedRange(newOffset, newLength);
}
} else {
// this is too intrusive, but will never get called anyway
editor.selectAndReveal(newOffset, newLength);
}
}
Aggregations