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