/** * @see processing.app.Editor#handleCommentUncomment * @author fry */ public void handleCommentUncomment() { // TODO startCompoundEdit(); int startLine = textarea.getSelectionStartLine(); int stopLine = textarea.getSelectionStopLine(); int lastLineStart = textarea.getLineStartOffset(stopLine); int selectionStop = textarea.getSelectionStop(); // If the selection ends at the beginning of the last line, // then don't (un)comment that line. if (selectionStop == lastLineStart) { // Though if there's no selection, don't do that if (textarea.isSelectionActive()) { stopLine--; } } // If the text is empty, ignore the user. // Also ensure that all lines are commented (not just the first) // when determining whether to comment or uncomment. int length = textarea.getDocumentLength(); boolean commented = true; for (int i = startLine; commented && (i <= stopLine); i++) { int pos = textarea.getLineStartOffset(i); if (pos + 2 > length) { commented = false; } else { // Check the first two characters to see if it's already a comment. String begin = textarea.getText(pos, 2); // System.out.println("begin is '" + begin + "'"); commented = begin.equals("//"); } } for (int line = startLine; line <= stopLine; line++) { int location = textarea.getLineStartOffset(line); if (commented) { // remove a comment textarea.select(location, location + 2); if (textarea.getSelectedText().equals("//")) { textarea.setSelectedText(""); // pseudo-code: // find open code windows // find localLocation // insert/remove // update all codeblocks after } } else { // add a comment textarea.select(location, location); textarea.setSelectedText("//"); } } // Subtract one from the end, otherwise selects past the current line. // (Which causes subsequent calls to keep expanding the selection) textarea.select( textarea.getLineStartOffset(startLine), textarea.getLineStopOffset(stopLine) - 1); // stopCompoundEdit(); }
private Point getCaretLocation() { Point loc = new Point(); TextAreaPainter painter = textArea.getPainter(); FontMetrics fm = painter.getFontMetrics(); int offsetY = fm.getHeight() - COMPOSING_UNDERBAR_HEIGHT; int lineIndex = textArea.getCaretLine(); loc.y = lineIndex * fm.getHeight() + offsetY; int offsetX = textArea.getCaretPosition() - textArea.getLineStartOffset(lineIndex); loc.x = textArea.offsetToX(lineIndex, offsetX); return loc; }
/** * @see processing.app.Editor#handleIndentOutdent * @author fry */ public void handleIndentOutdent(boolean indent) { int tabSize = Preferences.getInteger("editor.tabs.size"); String tabString = " ".substring(0, tabSize); // TODO startCompoundEdit(); int startLine = textarea.getSelectionStartLine(); int stopLine = textarea.getSelectionStopLine(); // If the selection ends at the beginning of the last line, // then don't (un)comment that line. int lastLineStart = textarea.getLineStartOffset(stopLine); int selectionStop = textarea.getSelectionStop(); if (selectionStop == lastLineStart) { // Though if there's no selection, don't do that if (textarea.isSelectionActive()) { stopLine--; } } for (int line = startLine; line <= stopLine; line++) { int location = textarea.getLineStartOffset(line); if (indent) { textarea.select(location, location); textarea.setSelectedText(tabString); } else { // outdent textarea.select(location, location + tabSize); // Don't eat code if it's not indented if (textarea.getSelectedText().equals(tabString)) { textarea.setSelectedText(""); } } } // Subtract one from the end, otherwise selects past the current line. // (Which causes subsequent calls to keep expanding the selection) textarea.select( textarea.getLineStartOffset(startLine), textarea.getLineStopOffset(stopLine) - 1); // stopCompoundEdit(); }