Mega Code Archive

 
Categories / Java / SWT Jface Eclipse
 

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.Composite; 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());   } }