Ch5Undoable.java Source code

Java tutorial

Introduction

Here is the source code for Ch5Undoable.java

Source

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