/** * 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.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.jface.bindings.TriggerSequence; import org.eclipse.jface.bindings.keys.KeySequence; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ui.keys.IBindingService; import org.eclipse.ui.texteditor.ITextEditor; import com.mulgasoft.emacsplus.EmacsPlusActivator; import com.mulgasoft.emacsplus.EmacsPlusUtils; import com.mulgasoft.emacsplus.execute.KbdMacroSupport; import com.mulgasoft.emacsplus.execute.KbdMacroSupport.KbdMacro; import com.mulgasoft.emacsplus.minibuffer.IMinibufferState; import com.mulgasoft.emacsplus.minibuffer.KbdMacroMinibuffer; // Location user = Platform.getUserLocation(); // Location config = Platform.getConfigurationLocation(); /** * Implement save-kbd-macro * * Save the named kbd macro to an external file * * @author Mark Feber - initial API and implementation */ public class KbdMacroSaveHandler extends KbdMacroFileHandler { private static String KBD_SAVE_PREFIX = EmacsPlusActivator.getResourceString("KbdMacro_Save_Prefix"); //$NON-NLS-1$ private static String QUESTION = EmacsPlusActivator.getResourceString("KbdMacro_File_Exists"); //$NON-NLS-1$ private static String SAVED = EmacsPlusActivator.getResourceString("KbdMacro_Saved"); //$NON-NLS-1$ private static String ABORT_SAVE = EmacsPlusActivator.getResourceString("KbdMacro_Abort_Save"); //$NON-NLS-1$ /** * @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 { if (KbdMacroSupport.getInstance().hasKbdMacro(true)) { mbState = nameState(); return mbState.run(editor); } else { asyncShowMessage(editor, NO_MACRO_ERROR, true); } return NO_OFFSET; } /** * Get state to handle prompt for getting kbd macro name * * @return naming prompt state */ protected IMinibufferState nameState() { return new IMinibufferState() { public String getMinibufferPrefix() { return KBD_SAVE_PREFIX; } public int run(ITextEditor editor) { miniTransform(new KbdMacroMinibuffer(KbdMacroSaveHandler.this),editor,null); return NO_OFFSET; } public boolean executeResult(ITextEditor editor, Object minibufferResult) { boolean result = true; String name = (String) minibufferResult; if (name == null || name.length() == 0) { // no name entered asyncShowMessage(editor, String.format(CMD_NO_RESULT, name) + CMD_NO_BINDING, true); } else if (KbdMacroSupport.getInstance().getKbdMacro(name) != null) { // macro by that name transitionState(editor,name); } else { // no macro found asyncShowMessage(editor, String.format(NO_NAME_UNO, name), true); } return result; } private void transitionState(ITextEditor editor, String name) { mbState = yesnoState(name,QUESTION, new IKbdMacroOperation() { public void doOperation(ITextEditor editor, String name, File file) { saveMacro(editor,name,file); } }); mbState.run(editor); } }; } private void saveMacro(ITextEditor editor,String name, File file) { IBindingService service = (IBindingService) editor.getSite().getService(IBindingService.class); KbdMacro kbdMacro = KbdMacroSupport.getInstance().getKbdMacro(name); TriggerSequence sequence = service.getBestActiveBindingFor(EmacsPlusUtils.kbdMacroId(name)); if (sequence != null && sequence instanceof KeySequence) { kbdMacro.setBindingKeys(((KeySequence)sequence).toString()); } writeMacro(editor,file,kbdMacro); kbdMacro.setBindingKeys(null); } private void writeMacro(ITextEditor editor, File file, KbdMacro kbdMacro) { try { file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(kbdMacro); oos.flush(); oos.close(); asyncShowMessage(editor, String.format(SAVED, kbdMacro.getName()), false); } catch (Exception e) { asyncShowMessage(editor, String.format(ABORT_SAVE, file.toString(), e.getMessage()), true); } } }