Java/SWT JFace Eclipse/Undo Redo

Материал из Java эксперт
Версия от 18:01, 31 мая 2010; (обсуждение)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

SWT Undo Redo

/*
SWT/JFace in Action
GUI Design with Eclipse 3.0
Matthew Scarpino, Stephen Holder, Stanford Ng, and Laurent Mihalkovic
ISBN: 1932394273
Publisher: Manning
*/

import java.util.LinkedList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ExtendedModifyEvent;
import org.eclipse.swt.custom.ExtendedModifyListener;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.ruposite;
public class Ch5Undoable extends Composite {
  private static final int MAX_STACK_SIZE = 25;
  private List undoStack;
  private List redoStack;
  private StyledText styledText;
  public Ch5Undoable(Composite parent) {
    super(parent, SWT.NONE);
    undoStack = new LinkedList();
    redoStack = new LinkedList();
    buildControls();
  }
  private void buildControls() {
    this.setLayout(new FillLayout());
    styledText = new StyledText(this, SWT.MULTI | SWT.V_SCROLL);
    styledText.addExtendedModifyListener(new ExtendedModifyListener() {
      public void modifyText(ExtendedModifyEvent event) {
        String currText = styledText.getText();
        String newText = currText.substring(event.start, event.start
            + event.length);
        if (newText != null && newText.length() > 0) {
          if (undoStack.size() == MAX_STACK_SIZE) {
            undoStack.remove(undoStack.size() - 1);
          }
          undoStack.add(0, newText);
        }
      }
    });
    styledText.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e) {
        switch (e.keyCode) {
        case SWT.F1:
          undo();
          break;
        case SWT.F2:
          redo();
          break;
        default:
        //ignore everything else
        }
      }
    });
  }
  private void undo() {
    if (undoStack.size() > 0) {
      String lastEdit = (String) undoStack.remove(0);
      int editLength = lastEdit.length();
      String currText = styledText.getText();
      int startReplaceIndex = currText.length() - editLength;
      styledText.replaceTextRange(startReplaceIndex, editLength, "");
      redoStack.add(0, lastEdit);
    }
  }
  private void redo() {
    if (redoStack.size() > 0) {
      String text = (String) redoStack.remove(0);
      moveCursorToEnd();
      styledText.append(text);
      moveCursorToEnd();
    }
  }
  private void moveCursorToEnd() {
    styledText.setCaretOffset(styledText.getText().length());
  }
}