/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jkiss.dbeaver.ui.editors.text.handlers; import org.eclipse.jface.text.*; import org.eclipse.jface.viewers.ISelectionProvider; import org.jkiss.dbeaver.ui.ICommentsSupport; import org.jkiss.utils.ArrayUtils; public final class ToggleSingleLineCommentHandler extends AbstractCommentHandler { @Override protected void processAction(ISelectionProvider selectionProvider, ICommentsSupport commentsSupport, IDocument document, ITextSelection textSelection) throws BadLocationException { String[] singleLineComments = commentsSupport.getSingleLineComments(); if (ArrayUtils.isEmpty(singleLineComments)) { // Single line comments are not supported return; } int selOffset = textSelection.getOffset(); int originalLength = textSelection.getLength(); int selLength = originalLength; DocumentRewriteSession rewriteSession = null; if (document instanceof IDocumentExtension4) { rewriteSession = ((IDocumentExtension4) document).startRewriteSession(DocumentRewriteSessionType.SEQUENTIAL); } int endLine = textSelection.getEndLine(); int startLine = textSelection.getStartLine(); for (int lineNum = endLine; lineNum >= startLine; lineNum--) { int lineOffset = document.getLineOffset(lineNum); int lineLength = document.getLineLength(lineNum); String lineComment = null; for (String commentString : singleLineComments) { if (document.get(lineOffset, lineLength).startsWith(commentString)) { lineComment = commentString; break; } } if (lineComment != null) { // Remove comment document.replace(lineOffset, lineComment.length(), ""); selLength -= lineComment.length(); } else { // Add comment document.replace(lineOffset, 0, singleLineComments[0]); selLength += singleLineComments[0].length(); } } if (rewriteSession != null) { ((IDocumentExtension4) document).stopRewriteSession(rewriteSession); } if (originalLength > 0) { selectionProvider.setSelection(new TextSelection(selOffset, selLength)); } } }