001 package crisp.wbwiki.client;
002
003 import com.google.gwt.core.client.EntryPoint;
004 import com.google.gwt.core.client.GWT;
005 import com.google.gwt.user.client.Timer;
006 import com.google.gwt.user.client.rpc.ServiceDefTarget;
007 import com.google.gwt.user.client.ui.Button;
008 import com.google.gwt.user.client.ui.ClickListener;
009 import com.google.gwt.user.client.ui.RootPanel;
010 import com.google.gwt.user.client.ui.TextArea;
011 import com.google.gwt.user.client.ui.VerticalPanel;
012 import com.google.gwt.user.client.ui.Widget;
013
014
015 /**
016 * Entry point classes define <code>onModuleLoad()</code>.
017 */
018 public class WikiClient implements EntryPoint, WikiGui {
019 /** How often we poll the server to save/load the wiki page */
020 private static final int POLL_INTERVAL_MS = 1000;
021
022 final TextArea textArea = new TextArea();
023 final TextArea log = new TextArea();
024 boolean loggingEnabled = false;
025 WikiServiceAsync wikiService;
026
027 ClientStateManager stateManager;
028
029 boolean timerOn = true;
030 Button timerButton = new Button("Turn off timer");
031
032 /**
033 * Init method called by GWT
034 */
035 public void onModuleLoad() {
036 //Load and initialize the wikiService
037 wikiService = (WikiServiceAsync) GWT.create(WikiService.class);
038 ServiceDefTarget endPoint = (ServiceDefTarget) wikiService;
039 String url = GWT.getModuleBaseURL() + "wbwiki";
040 endPoint.setServiceEntryPoint(url);
041
042 //Add the wiki textarea to the RootPanel
043 RootPanel.get("wikiSlot").add(textArea);
044 textArea.setText("(loading page contents...)");
045 textArea.setEnabled(false);
046 textArea.setSize("100%", "100%");
047
048
049 addDebugWidgets();
050
051 stateManager = new ClientStateManager(wikiService);
052
053 //Load the wiki page from the server
054 stateManager.synchronizeWithServer(this);
055
056 //Start a timer that regularly saves & reloads the page
057 Timer timer;
058 timer = new Timer() {
059 public void run() {
060 if (timerOn) {
061 stateManager.synchronizeWithServer(WikiClient.this);
062 }
063 }
064 };
065 timer.scheduleRepeating(POLL_INTERVAL_MS);
066
067
068
069 }
070
071 private void addDebugWidgets() {
072 RootPanel logSlot = RootPanel.get("logSlot");
073 if (logSlot != null) {
074 log.setSize("100%", "100%");
075 logSlot.add(log);
076 loggingEnabled = true;
077 } else {
078 loggingEnabled = false;
079 }
080 RootPanel timerButtonSlot = RootPanel.get("timerButtonSlot");
081 if (timerButtonSlot != null) {
082 timerButtonSlot.add(timerButton);
083 timerButton.addClickListener(
084 new ClickListener() {
085 public void onClick(Widget sender) {
086 if (timerOn == true) {
087 timerOn = false;
088 timerButton.setText("Turn on timer");
089 } else {
090 timerOn = true;
091 timerButton.setText("Turn off timer");
092 }
093 }
094 }
095 );
096 }
097 }
098
099 public String getCurrentContent() {
100 return textArea.getText();
101 }
102
103 public void setCurrentContent(String content) {
104 int oldCursorPos = textArea.getCursorPos();
105 int oldLength = textArea.getText().length();
106 textArea.setText(content);
107 textArea.setEnabled(true);
108 int newLength = content.length();
109 int newCursorPos;
110 if (oldCursorPos > newLength) {
111 newCursorPos = newLength;
112 } else {
113 newCursorPos = oldCursorPos;
114 }
115 textArea.setCursorPos(newCursorPos);
116 log("" + oldCursorPos + "/" + oldLength + " => " + newCursorPos + "/" + newLength);
117
118
119 }
120
121 public void log(String logEntry) {
122 if (loggingEnabled) {
123 log.setText(log.getText() + logEntry + "\n");
124 log.setCursorPos(log.getText().length());
125 }
126 }
127 }