Ch5Persistent.java Source code

Java tutorial

Introduction

Here is the source code for Ch5Persistent.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.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.StringTokenizer;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ExtendedModifyEvent;
import org.eclipse.swt.custom.ExtendedModifyListener;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

public class Ch5Persistent extends Composite {
    private static final String END_STYLES_MARK = "***EndStyles***";

    private static final String START_STYLES_MARK = "***Styles***";

    private static final String START_TEXT_MARK = "***Text***";

    private static final String FILE_NAME = "editorData.txt";

    private boolean doBold = false;

    private StyledText styledText;

    public Ch5Persistent(Composite parent) {
        super(parent, SWT.NONE);
        buildControls();
    }

    protected void buildControls() {
        this.setLayout(new FillLayout());
        styledText = new StyledText(this, SWT.MULTI | SWT.V_SCROLL);
        load();

        styledText.addExtendedModifyListener(new ExtendedModifyListener() {
            public void modifyText(ExtendedModifyEvent event) {
                if (doBold) {
                    StyleRange style = new StyleRange(event.start, event.length, null, null, SWT.BOLD);
                    styledText.setStyleRange(style);
                }
            }
        });

        styledText.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                switch (e.keyCode) {
                case SWT.F1:
                    toggleBold();
                    break;
                default:
                    //ignore everything else
                }
            }
        });
    }

    private void toggleBold() {
        doBold = !doBold;
        if (styledText.getSelectionCount() > 0) {
            Point selectionRange = styledText.getSelectionRange();
            StyleRange style = new StyleRange(selectionRange.x, selectionRange.y, null, null,
                    doBold ? SWT.BOLD : SWT.NORMAL);
            styledText.setStyleRange(style);
        }
    }

    private void load() {
        File file = new File(FILE_NAME);
        if (file.exists()) {
            try {
                BufferedReader reader = new BufferedReader(new FileReader(file));
                String currLine = reader.readLine();

                StringTokenizer tokenizer = new StringTokenizer(currLine);
                tokenizer.nextToken(); //discard START_TEXT_MARKER
                String contentLengthString = tokenizer.nextToken();
                int contentLength = Integer.parseInt(contentLengthString);

                readContent(reader, contentLength);

                //find the beginning of the styles section
                while (((currLine = reader.readLine()) != null) && !START_STYLES_MARK.equals(currLine))
                    ;

                readStyles(reader, currLine);
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void readStyles(BufferedReader reader, String currLine) throws IOException {
        while (!END_STYLES_MARK.equals(currLine)) {
            currLine = reader.readLine();
            if (!END_STYLES_MARK.equals(currLine))
                buildOneStyle(currLine);
        }
    }

    private void readContent(BufferedReader reader, int contentLength) throws IOException {
        char[] buffer = new char[contentLength];
        reader.read(buffer, 0, contentLength);

        styledText.append(new String(buffer));
    }

    private void buildOneStyle(String styleText) {
        StringTokenizer tokenizer = new StringTokenizer(styleText);
        int startPos = Integer.parseInt(tokenizer.nextToken());
        int length = Integer.parseInt(tokenizer.nextToken());

        StyleRange style = new StyleRange(startPos, length, null, null, SWT.BOLD);
        styledText.setStyleRange(style);
    }

    private void save() {
        try {
            PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(FILE_NAME)));
            String text = styledText.getText();
            writer.println(START_TEXT_MARK + " " + text.length());
            writer.println(text);
            writer.println(START_STYLES_MARK);
            StyleRange[] styles = styledText.getStyleRanges();
            for (int i = 0; i < styles.length; i++) {
                writer.println(styles[i].start + " " + styles[i].length);
            }
            writer.println(END_STYLES_MARK);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}