/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.editor.actions; import org.eclipse.jface.text.BadLocationException; import org.python.pydev.core.docutils.PySelection; import com.aptana.shared_core.string.FastStringBuffer; import com.aptana.shared_core.structure.Tuple; /** * Same toggle comment action as we are used to it in the java perspective * * @author e0525580 at student.tuwien.ac.at * Created from patch: https://sourceforge.net/tracker/?func=detail&atid=577329&aid=1999389&group_id=85796 */ public class PyToggleComment extends PyComment { @Override public Tuple<Integer, Integer> perform(final PySelection ps) throws BadLocationException { ps.selectCompleteLine(); final boolean shouldAddCommentSign = PyToggleComment.allLinesStartWithCommentSign(ps) == false; String endLineDelim = ps.getEndLineDelim(); int endLineIndex = ps.getEndLineIndex(); int startLineIndex = ps.getStartLineIndex(); final FastStringBuffer sb = new FastStringBuffer(ps.getSelLength() + (endLineIndex - startLineIndex) + 10); for (int i = startLineIndex, n = endLineIndex; i <= n; i++) { final String line = ps.getLine(i); if (shouldAddCommentSign) { sb.append("#"); sb.append(line); } else { // remove comment sign sb.append(line.replaceFirst("#", "")); } //add a new line if we're not in the last line. sb.append((i < endLineIndex ? endLineDelim : "")); } final int start = ps.getStartLine().getOffset(); final String replacement = sb.toString(); ps.getDoc().replace(start, ps.getSelLength(), replacement); return new Tuple<Integer, Integer>(start, replacement.length()); } /** * Checks if all lines start with '#' */ private static boolean allLinesStartWithCommentSign(final PySelection ps) { int endLineIndex = ps.getEndLineIndex(); for (int i = ps.getStartLineIndex(), n = endLineIndex; i <= n; i++) { final String line = ps.getLine(i); if (line.trim().startsWith("#") == false) { return false; } } return true; } }