Java/SWT JFace Eclipse/Undo Redo

Материал из Java эксперт
Перейти к: навигация, поиск

SWT Undo Redo

   <source lang="java">

/* 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());
 }

}

      </source>