/******************************************************************************* * Copyright (c) 2014 Red Hat Inc. * 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: * Andrew Ferrazzutti <aferrazz@redhat.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.systemtap.ui.ide.handlers; import java.util.ArrayList; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.IVerticalRulerInfo; import org.eclipse.linuxtools.internal.systemtap.ui.ide.IDEPlugin; import org.eclipse.linuxtools.internal.systemtap.ui.ide.IDESessionSettings; import org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPEditor; import org.eclipse.linuxtools.internal.systemtap.ui.ide.preferences.IDEPreferenceConstants; import org.eclipse.linuxtools.systemtap.graphing.ui.widgets.ExceptionErrorDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.ide.FileStoreEditorInput; import org.eclipse.ui.texteditor.ITextEditor; public class AddStapProbeHandler extends AbstractHandler { @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(); String[] lines = s.split("\n"); //$NON-NLS-1$ 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(); sb.append("probe kernel.statement(\"*@" + kernrelative + ":" + (lineno + 1) + "\")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ sb.append("\n{\n\t\n}\n"); //$NON-NLS-1$ STPEditor activeSTPEditor = IDESessionSettings.getOrAskForActiveSTPEditor(false); if (activeSTPEditor != null) { activeSTPEditor.insertText(sb.toString()); } } } shell.setCursor(null); // Return the cursor to normal return null; } }