/** * 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. */ /* * Created on 01/08/2005 * * @author Fabio Zadrozny */ package org.python.pydev.editor.actions; import org.python.pydev.core.docutils.PySelection; import org.python.pydev.core.docutils.StringUtils; import org.python.pydev.editor.commentblocks.CommentBlocksPreferences; import org.python.pydev.plugin.PydevPlugin; import com.aptana.shared_core.string.FastStringBuffer; import com.aptana.shared_core.structure.Tuple; public class PyAddSingleBlockComment extends AbstractBlockCommentAction { public PyAddSingleBlockComment() { //default } /** * For tests: assigns the default values */ PyAddSingleBlockComment(int defaultCols, boolean alignLeft) { super(defaultCols, alignLeft); } /** * Performs the action with a given PySelection * * @param ps Given PySelection * @return boolean The success or failure of the action */ public int perform(PySelection ps) { // What we'll be replacing the selected text with FastStringBuffer strbuf = new FastStringBuffer(); // If they selected a partial line, count it as a full one ps.selectCompleteLine(); int i; try { // For each line, comment them out for (i = ps.getStartLineIndex(); i <= ps.getEndLineIndex(); i++) { String line = StringUtils.rightTrim(ps.getLine(i)); if (getAlignRight()) { strbuf.append(getRightAlignedFullCommentLine(line)); strbuf.append(line.trim()); if (i != ps.getEndLineIndex()) { strbuf.append(ps.getEndLineDelim()); } } else { Tuple<Integer, Character> colsAndChar = getColsAndChar(); int cols = colsAndChar.o1; char c = colsAndChar.o2; FastStringBuffer buffer = makeBufferToIndent(line, cols); int lenOfStrWithTabsAsSpaces = getLenOfStrConsideringTabEditorLen(buffer.toString()); int diff = lenOfStrWithTabsAsSpaces - buffer.length(); buffer.append("# "); buffer.append(line.trim()); buffer.append(' '); while (buffer.length() + diff < cols) { buffer.append(c); } strbuf.append(buffer); if (i != ps.getEndLineIndex()) { strbuf.append(ps.getEndLineDelim()); } } } int startOffset = ps.getStartLine().getOffset(); String str = strbuf.toString(); // Replace the text with the modified information ps.getDoc().replace(startOffset, ps.getSelLength(), str); return startOffset + str.length(); } catch (Exception e) { beep(e); } // In event of problems, return false return -1; } private boolean getAlignRight() { PydevPlugin plugin = PydevPlugin.getDefault(); if (plugin != null) { return plugin.getPluginPreferences().getBoolean(CommentBlocksPreferences.SINGLE_BLOCK_COMMENT_ALIGN_RIGHT); } else { //tests env return this.alignRight; } } @Override protected String getPreferencesNameForChar() { return CommentBlocksPreferences.SINGLE_BLOCK_COMMENT_CHAR; } /** * Currently returns a string with the comment block. * * @param line * * @return Comment line string, or a default one if Preferences are null */ protected String getRightAlignedFullCommentLine(String line) { Tuple<Integer, Character> colsAndChar = getColsAndChar(); int cols = colsAndChar.o1; char c = colsAndChar.o2; FastStringBuffer buffer = makeBufferToIndent(line, cols); int lenOfStrWithTabsAsSpaces = getLenOfStrConsideringTabEditorLen(buffer.toString()); int diff = lenOfStrWithTabsAsSpaces - buffer.length(); buffer.append("#"); for (int i = 0; i + line.length() + diff < cols - 2; i++) { buffer.append(c); } buffer.append(" "); return buffer.toString(); } private FastStringBuffer makeBufferToIndent(String line, int cols) { FastStringBuffer buffer = new FastStringBuffer(cols); for (int i = 0; i < line.length(); i++) { char ch = line.charAt(i); if (ch == '\t' || ch == ' ') { buffer.append(ch); } else { break; } } return buffer; } }