blob: d47890d4cf1f6975877f935c9c9395edc484e4d2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Alphonse Van Assche and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alphonse Van Assche - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.ui.editor.actions;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.linuxtools.internal.rpm.ui.editor.ISpecfileSpecialSymbols;
import org.eclipse.linuxtools.internal.rpm.ui.editor.SpecfileLog;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
public class SpecfileEditorToggleCommentActionDelegate extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) {
IEditorPart editor = HandlerUtil.getActiveEditor(event);
ITextEditor specfileEditor = editor.getAdapter(ITextEditor.class);
IDocumentProvider dp = specfileEditor.getDocumentProvider();
IDocument document = dp.getDocument(specfileEditor.getEditorInput());
ISelection currentSelection = HandlerUtil.getCurrentSelection(event);
if (currentSelection instanceof ITextSelection) {
ITextSelection selection = (ITextSelection) currentSelection;
String selectedContent = ""; //$NON-NLS-1$
try {
int begin = document.getLineOffset(selection.getStartLine());
StringBuilder sb = new StringBuilder(document.get().substring(0, begin));
String content = document.get().substring(begin, selection.getOffset() + selection.getLength());
if (linesContentCommentChar(content)) {
if (selection.getStartLine() == selection.getEndLine()) {
selectedContent = ISpecfileSpecialSymbols.COMMENT_START + content;
} else {
selectedContent = ISpecfileSpecialSymbols.COMMENT_START + content.replaceAll("\n", "\n#"); //$NON-NLS-1$ //$NON-NLS-2$
}
} else {
selectedContent = content.replaceFirst(ISpecfileSpecialSymbols.COMMENT_START, "").replaceAll( //$NON-NLS-1$
"\n#", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
sb.append(selectedContent);
sb.append(document.get().substring(selection.getOffset() + selection.getLength(),
document.get().length()));
document.set(sb.toString());
specfileEditor.setHighlightRange(selection.getOffset(), selection.getLength(), true);
} catch (BadLocationException e) {
SpecfileLog.logError(e);
}
}
return null;
}
/**
* Check if all lines are commented
*
* @param content to check
* @return true if all lines begin with '#' char
*/
private boolean linesContentCommentChar(String content) {
LineNumberReader reader = new LineNumberReader(new StringReader(content));
String line;
boolean ret = false;
try {
while ((line = reader.readLine()) != null) {
if (line.startsWith(ISpecfileSpecialSymbols.COMMENT_START)) {
ret = false;
} else {
return true;
}
}
} catch (IOException e) {
SpecfileLog.logError(e);
return false;
}
return ret;
}
}