/*
* Copyright (c) 2013 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.util.source;
import org.eclipse.jface.bindings.TriggerSequence;
import org.eclipse.jface.bindings.keys.KeySequence;
import org.eclipse.jface.bindings.keys.ParseException;
import org.eclipse.jface.bindings.keys.SWTKeySupport;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.swt.custom.VerifyKeyListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.graphics.Point;
import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
/**
* Utility class for source viewer key bindings if used outside an editor.
*
* @author Simon Templer
*/
public abstract class SourceViewerKeyBindings {
private static final ALogger log = ALoggerFactory.getLogger(SourceViewerKeyBindings.class);
/**
* Install the default bindings for undo, redo and shift.
*
* @param viewer the source viewer
*/
public static void installDefault(SourceViewer viewer) {
SourceViewerUndoSupport.install(viewer);
TextViewerOperationSupport.installDefaults(viewer, true);
installDeleteLine(viewer);
}
/**
* Install the ability to delete a line through <code>CTRL+D</code> on a
* text viewer.
*
* @param viewer the text viewer
*/
public static void installDeleteLine(final TextViewer viewer) {
try {
final TriggerSequence trigger = KeySequence.getInstance("CTRL+D");
viewer.appendVerifyKeyListener(new VerifyKeyListener() {
@Override
public void verifyKey(VerifyEvent event) {
int accelerator = SWTKeySupport.convertEventToUnmodifiedAccelerator(event);
KeySequence sequence = KeySequence.getInstance(SWTKeySupport
.convertAcceleratorToKeyStroke(accelerator));
if (trigger.equals(sequence)) {
// determine the current selection
int startOffset;
int endOffset;
Point sel = viewer.getTextWidget().getSelectionRange();
if (sel != null) {
startOffset = sel.x;
endOffset = startOffset + sel.y;
}
else {
startOffset = viewer.getTextWidget().getCaretOffset();
endOffset = startOffset;
}
try {
// determine the involved lines
IDocument doc = viewer.getDocument();
int startLine = doc.getLineOfOffset(startOffset);
int endLine = doc.getLineOfOffset(endOffset);
// derive start and end offset
startOffset = doc.getLineOffset(startLine);
if (startLine != endLine) {
// delete multiple lines
endOffset = doc.getLineOffset(endLine) + doc.getLineLength(endLine);
}
else {
// delete one line
endOffset = startOffset + doc.getLineLength(endLine);
}
// delete the line
doc.replace(startOffset, endOffset - startOffset, "");
event.doit = false;
} catch (Exception e) {
log.warn("Failed to delete line in document", e);
}
}
}
});
} catch (ParseException e) {
log.error("Failed to install delete line listener on source viewer", e);
}
}
}