/** * 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.events.VerifyEvent; import org.eclipse.ui.texteditor.ITextEditor; import com.mulgasoft.emacsplus.RingBuffer; /** * A minibuffer that reads only numbers (and minus) * * @author Mark Feber - initial API and implementation */ public class ReadNumberMinibuffer extends TextMinibuffer { /** * @param executable */ public ReadNumberMinibuffer(IMinibufferExecutable executable) { super(executable); } /** * @see com.mulgasoft.emacsplus.minibuffer.WithMinibuffer#handlesCtrl() */ @Override protected boolean handlesAlt() { // enable history for number reader return true; } /** * @see com.mulgasoft.emacsplus.minibuffer.ExecutingMinibuffer#executeResult(org.eclipse.ui.texteditor.ITextEditor, java.lang.Object) */ @Override protected boolean executeResult(ITextEditor editor, Object commandResult) { boolean result = true; String numberStr = (String)commandResult; if (numberStr != null && numberStr.length() > 0) { try { Integer number = Integer.valueOf(numberStr); result = super.executeResult(editor, number); addToHistory(number); // add to command history } catch (NumberFormatException e) { super.setResultMessage(String.format(BAD_NUMBER,numberStr), true, true); } } return result; } /** * Use number reading fragment * * @see com.mulgasoft.emacsplus.minibuffer.WithMinibuffer#charEvent(org.eclipse.swt.events.VerifyEvent) */ protected void charEvent(VerifyEvent event) { numCharEvent(event); } /**** Local RingBuffer: use lazy initialization holder class idiom ****/ /** * @see com.mulgasoft.emacsplus.minibuffer.HistoryMinibuffer#getHistoryRing() */ @Override @SuppressWarnings("unchecked") protected RingBuffer<Integer> getHistoryRing() { return NumberRing.ring; } private static class NumberRing { static final RingBuffer<Integer> ring = new RingBuffer<Integer>(); } }