/**
* 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.minibuffer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Read yes/no from the minibuffer
*
* Minibuffer result is Boolean true if yes, false if no, null if neither
*
* @author Mark Feber - initial API and implementation
*/
public class YesNoMinibuffer extends TextMinibuffer {
private boolean immediately = false;
/**
* @param executable
*/
public YesNoMinibuffer(IMinibufferExecutable executable) {
super(executable);
}
/**
* @param executable
*/
public YesNoMinibuffer(IMinibufferExecutable executable, boolean immediately) {
this(executable);
this.immediately = immediately;
}
/**
* @see com.mulgasoft.emacsplus.minibuffer.ExecutingMinibuffer#executeResult(org.eclipse.ui.texteditor.ITextEditor, java.lang.Object)
*/
@Override
protected boolean executeResult(ITextEditor editor, Object commandResult) {
return super.executeResult(editor, returnResult((String)commandResult));
}
/**
* Read a yes or no string
*
* @see com.mulgasoft.emacsplus.minibuffer.WithMinibuffer#charEvent(org.eclipse.swt.events.VerifyEvent)
*/
protected void charEvent(VerifyEvent event) {
event.doit = false;
switch (event.character) {
case 0x0D: // CR - execute command (if complete) \r
case 0x1B: // ESC - another way to leave
case 0x08: // BS
case 0x7F: // DEL
super.charEvent(event);
break;
default:
if (immediately && (YESORNO_Y.equalsIgnoreCase(String.valueOf(event.character)) || YESORNO_N.equalsIgnoreCase(String.valueOf(event.character) ))) {
// respond immediately to a character
super.charEvent(event);
executeCR(event);
} else if (!immediately && Character.isLetter(event.character) && ((event.stateMask & SWT.MODIFIER_MASK) == 0)) {
// accept if plain letter
super.charEvent(event);
} else {
beep();
}
}
}
/**
* Force result to either initial character or full string depending on minibuffer state
*
* @param yorn
* @return true if yes, false if no, or null
*/
private Boolean returnResult(String yorn) {
Boolean result = null;
if (yorn != null && yorn.length() > 0) {
if (immediately) {
if (YESORNO_Y.equalsIgnoreCase(yorn)) {
result = true;
} else if (YESORNO_N.equalsIgnoreCase(yorn)) {
result = false;
}
} else {
if (YESORNO_YES.equalsIgnoreCase(yorn)) {
result = true;
} else if (YESORNO_NO.equalsIgnoreCase(yorn)) {
result = false;
}
}
}
return result;
}
}