package com.yoursway.modelediting.swt.demo; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import com.yoursway.modelediting.Fragment; import com.yoursway.modelediting.IModelListener; import com.yoursway.modelediting.Model; import com.yoursway.modelediting.ReplaceImpossibleException; import com.yoursway.modelediting.StaticTextFragment; import com.yoursway.modelediting.TextFragment; import com.yoursway.modelediting.swt.IStyledText; import com.yoursway.modelediting.swt.ModelReconciler; public class ModelEditingDemo { private StyledText styledText; private AngryLetter angryLetter; private TextFormModel formModel; private ModelReconciler reconciler; private Shell shell; private class StyledTextWrap implements IStyledText { public void addListener(int eventType, Listener listener) { styledText.addListener(eventType, listener); } public String getText() { return styledText.getText(); } public void removeListener(int eventType, Listener listener) { styledText.removeListener(eventType, listener); } public void setText(String text) { Point selection = styledText.getSelection(); styledText.setText(text); styledText.setSelection(selection); shell.layout(); } public void replaceTextRange(int start, int length, String text) { // styledText.rep } } public void run() { Display display = new Display(); shell = new Shell(display); shell.setSize(400, 300); shell.setLayout(new FillLayout()); styledText = new StyledText(shell, SWT.BORDER); angryLetter = new AngryLetter(); formModel = new TextFormModel(); formModel.fragments().add(new StaticTextFragment("From: ")); formModel.fragments().add(new TextFragment("<yourname here>", true, true)); formModel.fragments().add(new StaticTextFragment("\n")); formModel.fragments().add(new StaticTextFragment("To: ")); formModel.fragments().add(new TextFragment("<recipient name here>", true, true)); formModel.fragments().add(new StaticTextFragment("\n")); formModel.fragments().add(new StaticTextFragment("Message: ")); formModel.fragments().add(new TextFragment("<message here>", true, true)); formModel.fragments().add(new StaticTextFragment("\n")); formModel.fragments().add( new StaticTextFragment("And again, fucking dumb, I'm writing you: ")); formModel.fragments().add(new TextFragment("", true, true)); formModel.fragments().add(new StaticTextFragment("\n")); formModel.addListener(new IModelListener() { public void modelChanged(Object sender, Model model, int firstFragment, int oldCount, int newCount) { if (sender == angryLetter) return; if (oldCount != newCount || oldCount != 1) throw new RuntimeException("Ooops..."); String fragmentText = model.fragments().get(firstFragment).toString(); switch (firstFragment) { case 1: angryLetter.setFrom(fragmentText); break; case 4: angryLetter.setTo(fragmentText); break; case 7: case 10: angryLetter.setMessage(fragmentText); break; default: throw new RuntimeException("Trying to change non-changable!"); } } }); angryLetter.addListener(new LetterListener() { private void setFragmentToString(int index, String string) { Fragment fragment = formModel.fragments().get(index); try { formModel.replace(angryLetter, fragment, 0, fragment.toString().length(), string); } catch (ReplaceImpossibleException e) { throw new RuntimeException(e); } } public void fromChanged() { setFragmentToString(1, angryLetter.from()); } public void messageChanged() { setFragmentToString(7, angryLetter.message()); setFragmentToString(10, angryLetter.message()); } public void toChanged() { setFragmentToString(4, angryLetter.to()); } }); reconciler = new ModelReconciler(new StyledTextWrap(), formModel); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void main(String[] args) { try { new ModelEditingDemo().run(); } catch (Throwable e) { e.printStackTrace(); } } }