/**
* Copyright (c) 2009, 2010 Mark Feber, MulgaSoft
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package com.mulgasoft.emacsplus.commands;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.ui.texteditor.ITextEditor;
import com.mulgasoft.emacsplus.EmacsPlusActivator;
import com.mulgasoft.emacsplus.EmacsPlusUtils;
import com.mulgasoft.emacsplus.execute.EmacsPlusConsole;
import com.mulgasoft.emacsplus.execute.IBindingResult;
import com.mulgasoft.emacsplus.minibuffer.KeyHandlerMinibuffer;
/**
* Implements: describe-key
*
* Describe key binding in Emacs+ console
*
* @author Mark Feber - initial API and implementation
*/
public class CommandKeyHandler extends CommandDescribeHandler {
private static String KEY_DESC_PREFIX = EmacsPlusActivator.getResourceString("Cmd_Key_Prefix"); //$NON-NLS-1$
/**
* @see com.mulgasoft.emacsplus.minibuffer.IMinibufferExecutable#getMinibufferPrefix()
*/
public String getMinibufferPrefix() {
return KEY_DESC_PREFIX;
}
/**
* @see com.mulgasoft.emacsplus.commands.EmacsPlusCmdHandler#transform(ITextEditor, IDocument, ITextSelection, ExecutionEvent)
*/
protected int transform(ITextEditor editor, IDocument document, ITextSelection currentSelection,
ExecutionEvent event) throws BadLocationException {
return bufferTransform(new KeyHandlerMinibuffer(this), editor, event);
}
/**
* @see com.mulgasoft.emacsplus.minibuffer.IMinibufferExecutable#executeResult(org.eclipse.ui.texteditor.ITextEditor, java.lang.Object)
*/
public boolean executeResult(final ITextEditor editor, final Object minibufferResult) {
if (minibufferResult != null) {
final EmacsPlusConsole console = EmacsPlusConsole.getInstance();
console.clear();
console.activate();
EmacsPlusUtils.asyncUiRun(new Runnable() {
public void run() {
String summary = EMPTY_STR;
IBindingResult bindingR = (IBindingResult) minibufferResult;
String name = bindingR.getKeyString();
if (bindingR == null || bindingR.getKeyBinding() == null) {
summary = String.format(CMD_NO_RESULT, name) + CMD_NO_BINDING;
console.print(summary);
} else {
Binding binding = bindingR.getKeyBinding();
summary = String.format(CMD_KEY_RESULT,name);
console.print(summary);
try {
Command com = getCommand(binding);
if (com != null) {
name = normalizeCommandName(com.getName());
summary += name;
console.printBinding(name + CR);
printCmdDetails(getPCommand(binding),console);
}
} catch (NotDefinedException e) {
// can't happen as the Command will be null or valid
}
}
showResultMessage(editor, summary, false);
}});
}
return true;
}
}