package org.erlide.ui.actions; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextOperationTarget; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.texteditor.ITextEditor; import org.erlide.core.ErlangCore; import org.erlide.core.ErlangStatus; import org.erlide.engine.ErlangEngine; import org.erlide.ui.handlers.ErlangAbstractHandler; import org.erlide.util.ErlLogger; import org.erlide.util.Util; import com.ericsson.otp.erlang.OtpErlangObject; public class ToggleCommentHandler extends ErlangAbstractHandler { @Override protected void doAction(final ISelection sel, final ITextEditor textEditor) { final IDocument document = textEditor.getDocumentProvider() .getDocument(textEditor.getEditorInput()); final ITextSelection selection = extendSelectionToWholeLines(document, (ITextSelection) sel); final ITextSelection getSelection = getTextSelection(document, selection, textEditor); String text; OtpErlangObject r1 = null; try { text = document.get(getSelection.getOffset(), getSelection.getLength()); // call erlang, with selection within text r1 = callErlang(selection.getOffset() - getSelection.getOffset(), selection.getLength(), text); } catch (final Exception e) { ErlLogger.error(e); } final String newText = Util.stringValue(r1); if (newText == null) { final String msg = "call to " + getClass().getSimpleName() + " timed out; try a smaller selection."; final Status status = new Status(IStatus.ERROR, ErlangCore.PLUGIN_ID, ErlangStatus.INTERNAL_ERROR.getValue(), msg, null); ErlLogger.error("INTERNAL ERROR: " + msg); ErrorDialog.openError(textEditor.getSite().getShell(), ActionMessages.IndentAction_error_message, "Internal error", status); return; } final Display display = textEditor.getEditorSite().getShell().getDisplay(); display.syncExec(new Runnable() { @Override public void run() { final ITextOperationTarget target1 = (ITextOperationTarget) textEditor .getAdapter(ITextOperationTarget.class); if (target1 instanceof ITextViewer) { final ITextViewer textViewer = (ITextViewer) target1; try { if (!document.get(selection.getOffset(), selection.getLength()) .equals(newText)) { document.replace(selection.getOffset(), selection.getLength(), newText); textViewer.setSelectedRange(selection.getOffset(), newText.length()); } } catch (final BadLocationException e) { ErlLogger.warn(e); } } } }); } private OtpErlangObject callErlang(final int offset, final int length, final String aText) { final String fErlModule = "erlide_comment"; final String fErlFunction = "toggle_comment"; final OtpErlangObject r1 = ErlangEngine.getInstance().getGenericService() .call(fErlModule, fErlFunction, offset, length, aText); return r1; } }