/** * 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 java.util.Map; import java.util.Set; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ParameterizedCommand; 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.swt.SWT; import org.eclipse.ui.texteditor.ITextEditor; import com.mulgasoft.emacsplus.EmacsPlusActivator; import com.mulgasoft.emacsplus.execute.EmacsPlusConsole; import com.mulgasoft.emacsplus.execute.CommandHelp; import com.mulgasoft.emacsplus.execute.ICommandResult; import com.mulgasoft.emacsplus.minibuffer.MetaXMinibuffer; /** * Describe command/binding information in Emacs+ console * * @author Mark Feber - initial API and implementation */ public class CommandDescribeHandler extends MinibufferExecHandler implements INonEditingCommand { static String CMD_KEY_RESULT = EmacsPlusActivator.getResourceString("Cmd_Key_Result"); //$NON-NLS-1$ private static String DESC_PREFIX = EmacsPlusActivator.getResourceString("Cmd_Desc_Prefix"); //$NON-NLS-1$ private static String DESC_ID = EmacsPlusActivator.getResourceString("Cmd_Id"); //$NON-NLS-1$ private static String CMD_KEY_HEADING= EmacsPlusActivator.getResourceString("Cmd_KeyHeading"); //$NON-NLS-1$ private static String CMD_DESC_HEADING= EmacsPlusActivator.getResourceString("Cmd_DescHeading"); //$NON-NLS-1$ private static String CMD_PARAM_HEADING= EmacsPlusActivator.getResourceString("Cmd_ParamHeading"); //$NON-NLS-1$ /** * @see com.mulgasoft.emacsplus.minibuffer.IMinibufferExecutable#getMinibufferPrefix() */ public String getMinibufferPrefix() { return DESC_PREFIX; } /** * @see com.mulgasoft.emacsplus.commands.EmacsPlusCmdHandler#transform(ITextEditor, IDocument, ITextSelection, ExecutionEvent) */ @Override protected int transform(ITextEditor editor, IDocument document, ITextSelection currentSelection, ExecutionEvent event) throws BadLocationException { MetaXMinibuffer mini = new MetaXMinibuffer(this); mini.setIgnoreDisabled(true); // allow currently disabled commands to appear return bufferTransform(mini, editor, event); } /** * @see com.mulgasoft.emacsplus.minibuffer.IMinibufferExecutable#executeResult(ITextEditor, java.lang.Object) */ public boolean doExecuteResult(ITextEditor editor, Object minibufferResult) { if (minibufferResult != null) { EmacsPlusConsole console = EmacsPlusConsole.getInstance(); console.clear(); console.activate(); ICommandResult commandR = (ICommandResult) minibufferResult; String name = commandR.getName(); Command cmd = commandR.getCommand(); console.printBold(name + CR); printCmdDetails(cmd, console); } return true; } /** * Print the details about a parameterized command on the Emacs+ console * * @param cmd * @param console */ void printCmdDetails(ParameterizedCommand cmd, EmacsPlusConsole console) { String[] bindings = CommandHelp.getKeyBindingStrings(cmd, false); String[] abindings = CommandHelp.getKeyBindingStrings(cmd, true); console.print(SWT.TAB + DESC_ID); console.printContext(cmd.getId() + CR); @SuppressWarnings("unchecked") Map<String,?> parameterMap = cmd.getParameterMap(); if (!parameterMap.isEmpty()) { console.printBold(' ' + CMD_PARAM_HEADING + CR); try { Set<String> keySet = parameterMap.keySet(); for (String key : keySet) { console.print(SWT.TAB + key + '=' + parameterMap.get(key) + CR); } } catch (Exception e) {} } console.printBold(' ' + CMD_KEY_HEADING + CR); printDetails(cmd.getCommand(), bindings, abindings, console); } /** * Print the details about a command on the Emacs+ console * * @param cmd * @param console */ void printCmdDetails(Command cmd, EmacsPlusConsole console) { String[] bindings = CommandHelp.getKeyBindingStrings(cmd, false); String[] abindings = CommandHelp.getKeyBindingStrings(cmd, true); console.print(SWT.TAB + DESC_ID); console.printContext(cmd.getId() + CR); console.printBold(' ' + CMD_KEY_HEADING + CR); printDetails(cmd, bindings, abindings, console); } private void printDetails(Command cmd, String[] bindings, String[] abindings, EmacsPlusConsole console) { if (bindings.length == 0) { console.printBold(SWT.TAB + CMD_NO_BINDING + CR); } else { for (int i = 0; i < abindings.length; i+=2) { console.printBinding(SWT.TAB + abindings[i]); console.printContext(A_MSG + abindings[i+1] + Z_MSG + CR); } for (int i = 0; i < bindings.length; i+=2) { boolean printit = true; for (int j=0; j < abindings.length; j+=2) { if (bindings[i].equals(abindings[j])) { printit = false; break; } } if (printit) { // don't bold non-active bindings console.print(SWT.TAB + bindings[i]); console.printContext(A_MSG + bindings[i+1] + Z_MSG + CR); } } } console.printBold(' ' + CMD_DESC_HEADING + CR + SWT.TAB); try { console.print(cmd.getDescription()); } catch (NotDefinedException e) { } } Command getCommand(Binding binding) { Command result = null; ParameterizedCommand pc = binding.getParameterizedCommand(); if (pc != null) { result = pc.getCommand(); } return result; } ParameterizedCommand getPCommand(Binding binding) { return binding.getParameterizedCommand(); } }