r1353 - in trunk/src/main/java/cc/kune: . core/client/state core/public gspace/client/tool/old gspace/client/viewers wave/client
Author: vjrj_ Date: 2011-05-06 14:42:51 +0200 (Fri, 06 May 2011) New Revision: 1353 Added: trunk/src/main/java/cc/kune/wave/client/WaveClientClearEvent.java Modified: trunk/src/main/java/cc/kune/Kune.gwt.xml trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java trunk/src/main/java/cc/kune/core/public/ws.css trunk/src/main/java/cc/kune/gspace/client/tool/old/FoldableAbstractClientTool.java trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.ui.xml trunk/src/main/java/cc/kune/wave/client/WebClient.java trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml Log: Webclient multiple workaround Modified: trunk/src/main/java/cc/kune/Kune.gwt.xml =================================================================== --- trunk/src/main/java/cc/kune/Kune.gwt.xml 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/Kune.gwt.xml 2011-05-06 12:42:51 UTC (rev 1353) @@ -35,7 +35,7 @@ <!-- NOTE: this only compiles for chromium/safari ============= --> <!--http://code.google.com/p/google-web-toolkit/issues/detail?id=42 --> <!-- <set-property name="user.agent" value="gecko1_8" /> --> -<!-- <set-property name="user.agent" value="safari,gecko1_8" /> --> + <set-property name="user.agent" value="safari,gecko1_8" /> <!-- gwt-platform ============================================= --> <inherits name='com.gwtplatform.mvp.Mvp' /> <define-configuration-property name="gin.ginjector" Modified: trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java 2011-05-06 12:42:51 UTC (rev 1353) @@ -50,372 +50,376 @@ import com.google.inject.Inject; public class StateManagerDefault implements StateManager, ValueChangeHandler<String> { - private final BeforeActionCollection beforeStateChangeCollection; - private final ContentCache contentCache; - private final EventBus eventBus; - private final HistoryWrapper history; - private StateToken previousToken; - /** - * When a historyChanged is interrupted (for instance because you are - * editing something), the new history token is stored here - */ - private String resumedHistoryToken; - private final Session session; - private final SiteTokenListeners siteTokens; - private final TokenMatcher tokenMatcher; + private final BeforeActionCollection beforeStateChangeCollection; + private final ContentCache contentCache; + private final EventBus eventBus; + private final HistoryWrapper history; + private StateToken previousToken; + /** + * When a historyChanged is interrupted (for instance because you are editing + * something), the new history token is stored here + */ + private String resumedHistoryToken; + private final Session session; + private final SiteTokenListeners siteTokens; + private final TokenMatcher tokenMatcher; - @Inject - public StateManagerDefault(final ContentCache contentProvider, final Session session, final HistoryWrapper history, - final TokenMatcher tokenMatcher, final EventBus eventBus, final SiteTokenListeners siteTokens) { - this.tokenMatcher = tokenMatcher; - this.eventBus = eventBus; - this.contentCache = contentProvider; - this.session = session; - this.history = history; - this.previousToken = null; - this.resumedHistoryToken = null; - tokenMatcher.init(GwtWaverefEncoder.INSTANCE); - this.siteTokens = siteTokens; - beforeStateChangeCollection = new BeforeActionCollection(); - session.onAppStart(true, new AppStartHandler() { - @Override - public void onAppStart(final AppStartEvent event) { - session.onUserSignIn(false, new UserSignInEvent.UserSignInHandler() { - @Override - public void onUserSignIn(final UserSignInEvent event) { - refreshCurrentGroupState(); - } - }); - session.onUserSignOut(false, new UserSignOutEvent.UserSignOutHandler() { - @Override - public void onUserSignOut(final UserSignOutEvent event) { - refreshCurrentGroupState(); - } - }); - processCurrentHistoryToken(); - } + @Inject + public StateManagerDefault(final ContentCache contentProvider, final Session session, + final HistoryWrapper history, final TokenMatcher tokenMatcher, final EventBus eventBus, + final SiteTokenListeners siteTokens) { + this.tokenMatcher = tokenMatcher; + this.eventBus = eventBus; + this.contentCache = contentProvider; + this.session = session; + this.history = history; + this.previousToken = null; + this.resumedHistoryToken = null; + tokenMatcher.init(GwtWaverefEncoder.INSTANCE); + this.siteTokens = siteTokens; + beforeStateChangeCollection = new BeforeActionCollection(); + session.onAppStart(true, new AppStartHandler() { + @Override + public void onAppStart(final AppStartEvent event) { + session.onUserSignIn(false, new UserSignInEvent.UserSignInHandler() { + @Override + public void onUserSignIn(final UserSignInEvent event) { + refreshCurrentGroupState(); + } }); - } + session.onUserSignOut(false, new UserSignOutEvent.UserSignOutHandler() { + @Override + public void onUserSignOut(final UserSignOutEvent event) { + refreshCurrentGroupState(); + } + }); + processCurrentHistoryToken(); + } + }); + } - @Override - public void addBeforeStateChangeListener(final BeforeActionListener listener) { - beforeStateChangeCollection.add(listener); - } + @Override + public void addBeforeStateChangeListener(final BeforeActionListener listener) { + beforeStateChangeCollection.add(listener); + } - @Override - public void addSiteToken(final String token, final HistoryTokenCallback callback) { - siteTokens.put(token.toLowerCase(), callback); - } + @Override + public void addSiteToken(final String token, final HistoryTokenCallback callback) { + siteTokens.put(token.toLowerCase(), callback); + } - private void checkGroupAndToolChange(final StateAbstractDTO newState) { - final String newGroup = newState.getStateToken().getGroup(); - final String previousGroup = getPreviousGroup(); - if (startingUp() || !previousGroup.equals(newGroup)) { - GroupChangedEvent.fire(eventBus, previousGroup, newGroup); - } - final String previousToolName = getPreviousTool(); - final String newTokenTool = newState.getStateToken().getTool(); - final String newToolName = newTokenTool == null ? "" : newTokenTool; - if (startingUp() || previousToolName == null || !previousToolName.equals(newToolName)) { - ToolChangedEvent.fire(eventBus, previousToolName, newToolName); - } + private void checkGroupAndToolChange(final StateAbstractDTO newState) { + final String newGroup = newState.getStateToken().getGroup(); + final String previousGroup = getPreviousGroup(); + if (startingUp() || !previousGroup.equals(newGroup)) { + GroupChangedEvent.fire(eventBus, previousGroup, newGroup); } - - private String getPreviousGroup() { - final String previousGroup = startingUp() ? "" : previousToken.getGroup(); - return previousGroup; + final String previousToolName = getPreviousTool(); + final String newTokenTool = newState.getStateToken().getTool(); + final String newToolName = newTokenTool == null ? "" : newTokenTool; + if (startingUp() || previousToolName == null || !previousToolName.equals(newToolName)) { + ToolChangedEvent.fire(eventBus, previousToolName, newToolName); } + } - private String getPreviousTool() { - final String previousTool = startingUp() ? "" : previousToken.getTool(); - return previousTool; - } + private String getPreviousGroup() { + final String previousGroup = startingUp() ? "" : previousToken.getGroup(); + return previousGroup; + } - @Override - public void gotoHistoryToken(final String token) { - Log.debug("StateManager: history goto-string-token :" + token); - history.newItem(token); - } + private String getPreviousTool() { + final String previousTool = startingUp() ? "" : previousToken.getTool(); + return previousTool; + } - @Override - public void gotoHistoryTokenButRedirectToCurrent(final String token) { - gotoHistoryToken(TokenUtils.addRedirect(token, history.getToken())); + @Override + public void gotoHistoryToken(final String token) { + Log.debug("StateManager: history goto-string-token :" + token); + history.newItem(token); + } - } + @Override + public void gotoHistoryTokenButRedirectToCurrent(final String token) { + gotoHistoryToken(TokenUtils.addRedirect(token, history.getToken())); - @Override - public void gotoStateToken(final StateToken newToken) { - Log.debug("StateManager: history goto-token: " + newToken + ", previous: " + previousToken); - history.newItem(newToken.getEncoded()); + } + + @Override + public void gotoStateToken(final StateToken newToken) { + Log.debug("StateManager: history goto-token: " + newToken + ", previous: " + previousToken); + history.newItem(newToken.getEncoded()); + } + + @Override + public void gotoStateToken(final StateToken token, final boolean useCache) { + if (!useCache) { + contentCache.removeContent(token); } + gotoStateToken(token); + } - @Override - public void gotoStateToken(final StateToken token, final boolean useCache) { - if (!useCache) { - contentCache.removeContent(token); - } - gotoStateToken(token); + @Override + public void onGroupChanged(final boolean fireNow, final GroupChangedHandler handler) { + eventBus.addHandler(GroupChangedEvent.getType(), handler); + final StateAbstractDTO currentState = session.getCurrentState(); + if (fireNow && currentState != null) { + handler.onGroupChanged(new GroupChangedEvent(getPreviousGroup(), + currentState.getStateToken().getGroup())); } - @Override - public void onGroupChanged(final boolean fireNow, final GroupChangedHandler handler) { - eventBus.addHandler(GroupChangedEvent.getType(), handler); - final StateAbstractDTO currentState = session.getCurrentState(); - if (fireNow && currentState != null) { - handler.onGroupChanged(new GroupChangedEvent(getPreviousGroup(), currentState.getStateToken().getGroup())); - } + } - } + @Override + public void onGroupChanged(final Listener2<String, String> listener) { + throw new NotImplementedException(); + } - @Override - public void onGroupChanged(final Listener2<String, String> listener) { - throw new NotImplementedException(); - } - - private void onHistoryChanged(final StateToken newState) { - // NotifyUser.info("loading: " + newState + " because current:" + - // session.getCurrentStateToken()); - contentCache.getContent(session.getUserHash(), newState, new AsyncCallbackSimple<StateAbstractDTO>() { - @Override - public void onSuccess(final StateAbstractDTO newState) { - setState(newState); - } + private void onHistoryChanged(final StateToken newState) { + // NotifyUser.info("loading: " + newState + " because current:" + + // session.getCurrentStateToken()); + contentCache.getContent(session.getUserHash(), newState, + new AsyncCallbackSimple<StateAbstractDTO>() { + @Override + public void onSuccess(final StateAbstractDTO newState) { + setState(newState); + } }); - } + } - @Override - public void onSocialNetworkChanged(final boolean fireNow, final SocialNetworkChangedHandler handler) { - eventBus.addHandler(SocialNetworkChangedEvent.getType(), handler); - final StateAbstractDTO currentState = session.getCurrentState(); - if (fireNow && currentState != null) { - handler.onSocialNetworkChanged(new SocialNetworkChangedEvent(currentState)); - } + @Override + public void onSocialNetworkChanged(final boolean fireNow, final SocialNetworkChangedHandler handler) { + eventBus.addHandler(SocialNetworkChangedEvent.getType(), handler); + final StateAbstractDTO currentState = session.getCurrentState(); + if (fireNow && currentState != null) { + handler.onSocialNetworkChanged(new SocialNetworkChangedEvent(currentState)); } + } - @Override - public void onSocialNetworkChanged(final Listener<StateAbstractDTO> listener) { - throw new NotImplementedException(); - } + @Override + public void onSocialNetworkChanged(final Listener<StateAbstractDTO> listener) { + throw new NotImplementedException(); + } - @Override - public void onStateChanged(final boolean fireNow, final StateChangedHandler handler) { - eventBus.addHandler(StateChangedEvent.getType(), handler); - final StateAbstractDTO currentState = session.getCurrentState(); - if (fireNow && currentState != null) { - handler.onStateChanged(new StateChangedEvent(currentState)); - } + @Override + public void onStateChanged(final boolean fireNow, final StateChangedHandler handler) { + eventBus.addHandler(StateChangedEvent.getType(), handler); + final StateAbstractDTO currentState = session.getCurrentState(); + if (fireNow && currentState != null) { + handler.onStateChanged(new StateChangedEvent(currentState)); } + } - @Override - public void onStateChanged(final Listener<StateAbstractDTO> listener) { - throw new NotImplementedException(); - } + @Override + public void onStateChanged(final Listener<StateAbstractDTO> listener) { + throw new NotImplementedException(); + } - @Override - public void onToolChanged(final boolean fireNow, final ToolChangedHandler handler) { - eventBus.addHandler(ToolChangedEvent.getType(), handler); - final StateAbstractDTO currentState = session.getCurrentState(); - if (fireNow && currentState != null) { - handler.onToolChanged(new ToolChangedEvent(getPreviousTool(), currentState.getStateToken().getTool())); - } + @Override + public void onToolChanged(final boolean fireNow, final ToolChangedHandler handler) { + eventBus.addHandler(ToolChangedEvent.getType(), handler); + final StateAbstractDTO currentState = session.getCurrentState(); + if (fireNow && currentState != null) { + handler.onToolChanged(new ToolChangedEvent(getPreviousTool(), + currentState.getStateToken().getTool())); } + } - @Override - public void onToolChanged(final Listener2<String, String> listener) { - throw new NotImplementedException(); - } + @Override + public void onToolChanged(final Listener2<String, String> listener) { + throw new NotImplementedException(); + } - @Override - public void onValueChange(final ValueChangeEvent<String> event) { - Log.info("History event value changed: " + event.getValue()); - processHistoryToken(event.getValue()); - } + @Override + public void onValueChange(final ValueChangeEvent<String> event) { + Log.info("History event value changed: " + event.getValue()); + processHistoryToken(event.getValue()); + } - private void processCurrentHistoryToken() { - processHistoryToken(history.getToken()); - } + private void processCurrentHistoryToken() { + processHistoryToken(history.getToken()); + } - void processHistoryToken(final String newHistoryToken) { - // http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/DevGuideHistory - if (beforeStateChangeCollection.checkBeforeAction()) { - // There isn't a beforeStateChange listener that stops this history - // change - HistoryTokenCallback tokenListener = null; - if (newHistoryToken != null) { - final String nToken = newHistoryToken.toLowerCase(); - tokenListener = siteTokens.get(nToken); - } - Log.debug("StateManager: on history changed (" + newHistoryToken + ")"); - if (tokenListener == null) { - Log.debug("Is not a special hash"); - // token is not one of #newgroup #signin #translate ... - final String nToken = newHistoryToken != null ? newHistoryToken.toLowerCase() : null; - if (tokenMatcher.hasRedirect(nToken)) { - final Pair<String, String> redirect = tokenMatcher.getRedirect(nToken); - final String firstToken = redirect.getLeft(); - final String sndToken = redirect.getRight(); - if (firstToken.equals(SiteTokens.PREVIEW)) { - SpaceSelectEvent.fire(eventBus, Space.publicSpace); - SpaceConfEvent.fire(eventBus, Space.groupSpace, sndToken); - SpaceConfEvent.fire(eventBus, Space.publicSpace, TokenUtils.preview(sndToken)); - onHistoryChanged(new StateToken(sndToken)); - } else if (firstToken.equals(SiteTokens.NEWGROUP)) { - siteTokens.get(SiteTokens.NEWGROUP).onHistoryToken(); - } else if (firstToken.equals(SiteTokens.SIGNIN)) { - if (session.isLogged()) { - // We are logged, then redirect: - history.newItem(sndToken, false); - processHistoryToken(sndToken); - } else { - // We have to loggin - siteTokens.get(SiteTokens.SIGNIN).onHistoryToken(); - } - } - } else if (tokenMatcher.isWaveToken(newHistoryToken)) { - if (session.isLogged()) { - SpaceSelectEvent.fire(eventBus, Space.userSpace); - } else { - history.newItem(TokenUtils.addRedirect(SiteTokens.SIGNIN, newHistoryToken)); - } - if (startingUp()) { - // Starting application (with Wave url) - onHistoryChanged(new StateToken(SiteTokens.GROUP_HOME)); - } - } else if (tokenMatcher.isGroupToken(newHistoryToken)) { - SpaceConfEvent.fire(eventBus, Space.groupSpace, newHistoryToken); - SpaceConfEvent.fire(eventBus, Space.publicSpace, TokenUtils.preview(newHistoryToken)); - SpaceSelectEvent.fire(eventBus, Space.groupSpace); - onHistoryChanged(new StateToken(newHistoryToken)); - } else { - // While we don't redefine token "" as home: - SpaceConfEvent.fire(eventBus, Space.groupSpace, SiteTokens.GROUP_HOME); - SpaceConfEvent.fire(eventBus, Space.publicSpace, TokenUtils.preview(SiteTokens.GROUP_HOME)); - SpaceSelectEvent.fire(eventBus, Space.groupSpace); - onHistoryChanged(new StateToken(SiteTokens.GROUP_HOME)); - } + void processHistoryToken(final String newHistoryToken) { + // http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/DevGuideHistory + if (beforeStateChangeCollection.checkBeforeAction()) { + // There isn't a beforeStateChange listener that stops this history + // change + HistoryTokenCallback tokenListener = null; + if (newHistoryToken != null) { + final String nToken = newHistoryToken.toLowerCase(); + tokenListener = siteTokens.get(nToken); + } + Log.debug("StateManager: on history changed (" + newHistoryToken + ")"); + if (tokenListener == null) { + // Log.debug("Is not a special hash"); + // token is not one of #newgroup #signin #translate ... + final String nToken = newHistoryToken != null ? newHistoryToken.toLowerCase() : null; + if (tokenMatcher.hasRedirect(nToken)) { + final Pair<String, String> redirect = tokenMatcher.getRedirect(nToken); + final String firstToken = redirect.getLeft(); + final String sndToken = redirect.getRight(); + if (firstToken.equals(SiteTokens.PREVIEW)) { + SpaceSelectEvent.fire(eventBus, Space.publicSpace); + SpaceConfEvent.fire(eventBus, Space.groupSpace, sndToken); + SpaceConfEvent.fire(eventBus, Space.publicSpace, TokenUtils.preview(sndToken)); + onHistoryChanged(new StateToken(sndToken)); + } else if (firstToken.equals(SiteTokens.NEWGROUP)) { + siteTokens.get(SiteTokens.NEWGROUP).onHistoryToken(); + } else if (firstToken.equals(SiteTokens.SIGNIN)) { + if (session.isLogged()) { + // We are logged, then redirect: + history.newItem(sndToken, false); + processHistoryToken(sndToken); } else { - // token is one of #newgroup #signin #translate ... - if (startingUp()) { - // Starting with some token like "signin": load defContent - // also - processHistoryToken(""); - // SpaceSelectEvent.fire(eventBus, Space.groupSpace); - } - // Fire the listener of this #hash token - tokenListener.onHistoryToken(); + // We have to loggin + siteTokens.get(SiteTokens.SIGNIN).onHistoryToken(); } - } else { - resumedHistoryToken = newHistoryToken; - } - } - - @Override - public void redirectOrRestorePreviousToken() { - final String token = history.getToken(); - if (tokenMatcher.hasRedirect(token)) { - // URL of the form signin(group.tool) - final String previousToken = tokenMatcher.getRedirect(token).getRight(); - if (previousToken.equals(SiteTokens.WAVEINBOX) && session.isNotLogged()) { - // signin(inbox) && cancel - restorePreviousToken(); - } else { - history.newItem(previousToken); + } + } else if (tokenMatcher.isWaveToken(newHistoryToken)) { + if (session.isLogged()) { + SpaceSelectEvent.fire(eventBus, Space.userSpace); + } else { + history.newItem(TokenUtils.addRedirect(SiteTokens.SIGNIN, newHistoryToken)); + if (startingUp()) { + // Starting application (with Wave url) + onHistoryChanged(new StateToken(SiteTokens.GROUP_HOME)); } + } + } else if (tokenMatcher.isGroupToken(newHistoryToken)) { + SpaceConfEvent.fire(eventBus, Space.groupSpace, newHistoryToken); + SpaceConfEvent.fire(eventBus, Space.publicSpace, TokenUtils.preview(newHistoryToken)); + SpaceSelectEvent.fire(eventBus, Space.groupSpace); + onHistoryChanged(new StateToken(newHistoryToken)); } else { - // No redirect then restore previous token - restorePreviousToken(); + // While we don't redefine token "" as home: + SpaceConfEvent.fire(eventBus, Space.groupSpace, SiteTokens.GROUP_HOME); + SpaceConfEvent.fire(eventBus, Space.publicSpace, TokenUtils.preview(SiteTokens.GROUP_HOME)); + SpaceSelectEvent.fire(eventBus, Space.groupSpace); + onHistoryChanged(new StateToken(SiteTokens.GROUP_HOME)); } - } - - /** - * <p> - * Reload current state (not using client cache) - * </p> - */ - @Override - public void refreshCurrentGroupState() { - final StateToken currentStateToken = session.getCurrentStateToken(); - if (currentStateToken == null) { - processCurrentHistoryToken(); - } else { - contentCache.removeContent(currentStateToken); - onHistoryChanged(currentStateToken); + } else { + // token is one of #newgroup #signin #translate ... + if (startingUp()) { + // Starting with some token like "signin": load defContent + // also + processHistoryToken(""); + // SpaceSelectEvent.fire(eventBus, Space.groupSpace); } + // Fire the listener of this #hash token + tokenListener.onHistoryToken(); + } + } else { + resumedHistoryToken = newHistoryToken; } + } - /** - * <p> - * Reload current state (using client cache if available) - * </p> - */ - @Override - public void reload() { - processHistoryToken(history.getToken()); + @Override + public void redirectOrRestorePreviousToken() { + final String token = history.getToken(); + if (tokenMatcher.hasRedirect(token)) { + // URL of the form signin(group.tool) + final String previousToken = tokenMatcher.getRedirect(token).getRight(); + if (previousToken.equals(SiteTokens.WAVEINBOX) && session.isNotLogged()) { + // signin(inbox) && cancel + restorePreviousToken(); + } else { + history.newItem(previousToken); + } + } else { + // No redirect then restore previous token + restorePreviousToken(); } + } - @Override - public void removeBeforeStateChangeListener(final BeforeActionListener listener) { - beforeStateChangeCollection.remove(listener); + /** + * <p> + * Reload current state (not using client cache) + * </p> + */ + @Override + public void refreshCurrentGroupState() { + final StateToken currentStateToken = session.getCurrentStateToken(); + if (currentStateToken == null) { + processCurrentHistoryToken(); + } else { + contentCache.removeContent(currentStateToken); + onHistoryChanged(currentStateToken); } + } - @Override - public void removeSiteToken(final String token) { - siteTokens.remove(token); - } + /** + * <p> + * Reload current state (using client cache if available) + * </p> + */ + @Override + public void reload() { + processHistoryToken(history.getToken()); + } - @Override - public void restorePreviousToken() { - if (previousToken != null) { - gotoStateToken(previousToken); - } - } + @Override + public void removeBeforeStateChangeListener(final BeforeActionListener listener) { + beforeStateChangeCollection.remove(listener); + } - @Override - public void resumeTokenChange() { - if (resumedHistoryToken != null) { - // Is this reload redundant? - reload(); - gotoHistoryToken(resumedHistoryToken); - resumedHistoryToken = null; - } - } + @Override + public void removeSiteToken(final String token) { + siteTokens.remove(token); + } - @Override - public void setRetrievedState(final StateAbstractDTO newState) { - contentCache.cache(newState.getStateToken(), newState); + @Override + public void restorePreviousToken() { + if (previousToken != null) { + gotoStateToken(previousToken); } + } - @Override - public void setRetrievedStateAndGo(final StateAbstractDTO newState) { - setRetrievedState(newState); - // setState(newState); - history.newItem(newState.getStateToken().toString()); + @Override + public void resumeTokenChange() { + if (resumedHistoryToken != null) { + // Is this reload redundant? + reload(); + gotoHistoryToken(resumedHistoryToken); + resumedHistoryToken = null; } + } - @Override - public void setSocialNetwork(final SocialNetworkDataDTO socialNet) { - StateAbstractDTO state; - if (session != null && (state = session.getCurrentState()) != null) { - // After a SN operation, usually returns a SocialNetworkResultDTO - // with new SN data and we refresh the state - // to avoid to reload() again the state - state.setSocialNetworkData(socialNet); - SocialNetworkChangedEvent.fire(eventBus, state); - } - } + @Override + public void setRetrievedState(final StateAbstractDTO newState) { + contentCache.cache(newState.getStateToken(), newState); + } - void setState(final StateAbstractDTO newState) { - session.setCurrentState(newState); - final StateToken newToken = newState.getStateToken(); - contentCache.cache(newToken, newState); - // history.newItem(newToken.toString(), false); - StateChangedEvent.fire(eventBus, newState); - checkGroupAndToolChange(newState); - previousToken = newToken; - eventBus.fireEvent(new ProgressHideEvent()); + @Override + public void setRetrievedStateAndGo(final StateAbstractDTO newState) { + setRetrievedState(newState); + // setState(newState); + history.newItem(newState.getStateToken().toString()); + } + + @Override + public void setSocialNetwork(final SocialNetworkDataDTO socialNet) { + StateAbstractDTO state; + if (session != null && (state = session.getCurrentState()) != null) { + // After a SN operation, usually returns a SocialNetworkResultDTO + // with new SN data and we refresh the state + // to avoid to reload() again the state + state.setSocialNetworkData(socialNet); + SocialNetworkChangedEvent.fire(eventBus, state); } + } - private boolean startingUp() { - return previousToken == null; - } + void setState(final StateAbstractDTO newState) { + session.setCurrentState(newState); + final StateToken newToken = newState.getStateToken(); + contentCache.cache(newToken, newState); + // history.newItem(newToken.toString(), false); + StateChangedEvent.fire(eventBus, newState); + checkGroupAndToolChange(newState); + previousToken = newToken; + eventBus.fireEvent(new ProgressHideEvent()); + } + + private boolean startingUp() { + return previousToken == null; + } } Modified: trunk/src/main/java/cc/kune/core/public/ws.css =================================================================== --- trunk/src/main/java/cc/kune/core/public/ws.css 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/core/public/ws.css 2011-05-06 12:42:51 UTC (rev 1353) @@ -1,6 +1,4 @@ -CHARSET "UTF-8 "; - -body { +CHARSET "UTF-8 "; body { background-color: white; color: black; font-family: 'Ubuntu', Arial; @@ -172,7 +170,6 @@ cursor: hand; } - .gwt-RichTextArea { border: 1px solid black; background-color: white; @@ -886,15 +883,8 @@ outline: 0 none; } -button[disabled]:active, button[disabled], -input[type="reset"][disabled]:active, -input[type="reset"][disabled], -input[type="button"][disabled]:active, -input[type="button"][disabled], -select[disabled] > input[type="button"], -select[disabled] > input[type="button"]:active, -input[type="submit"][disabled]:active, -input[type="submit"][disabled], .k-button-disabled { +button[disabled]:active,button[disabled],input[type="reset"][disabled]:active,input[type="reset"][disabled],input[type="button"][disabled]:active,input[type="button"][disabled],select[disabled]>input[type="button"],select[disabled]>input[type="button"]:active,input[type="submit"][disabled]:active,input[type="submit"][disabled],.k-button-disabled + { color: gray !important; } @@ -1164,7 +1154,7 @@ -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; border-bottom-left-radius: 5px; - kfilter: alpha(opacity = 90); + kfilter: alpha(opacity = 90); -moz-opacity: 0.90; -khtml-opacity: 0.90; opacity: 0.90; @@ -1316,4 +1306,12 @@ color: #999999; } -/* end Decorated tabbar */ \ No newline at end of file +/* end Decorated tabbar */ + +.k-waveHolder { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} \ No newline at end of file Modified: trunk/src/main/java/cc/kune/gspace/client/tool/old/FoldableAbstractClientTool.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/tool/old/FoldableAbstractClientTool.java 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/gspace/client/tool/old/FoldableAbstractClientTool.java 2011-05-06 12:42:51 UTC (rev 1353) @@ -24,99 +24,101 @@ import cc.kune.gspace.client.tool.selector.ToolSelector; public abstract class FoldableAbstractClientTool extends AbstractClientTool { - public static final String UPLOADEDFILE_SUFFIX = "uploaded"; - public static final String WAVE_SUFFIX = "wave"; - protected final ContentCapabilitiesRegistry contentCapabilitiesRegistry; + protected final ContentCapabilitiesRegistry contentCapabilitiesRegistry; - public FoldableAbstractClientTool(final String shortName, final String longName, final ToolSelector toolSelector, - final ContentCapabilitiesRegistry contentCapabilitiesRegistry) { - super(shortName, longName, toolSelector); - this.contentCapabilitiesRegistry = contentCapabilitiesRegistry; - } + public FoldableAbstractClientTool(final String shortName, final String longName, + final ToolSelector toolSelector, final ContentCapabilitiesRegistry contentCapabilitiesRegistry) { + super(shortName, longName, toolSelector); + this.contentCapabilitiesRegistry = contentCapabilitiesRegistry; + } - protected void registerAclEditableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getAclEditable().register(typeIds); - } + protected void registerAclEditableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getAclEditable().register(typeIds); + } - protected void registerAuthorableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getAuthorable().register(typeIds); - } + protected void registerAuthorableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getAuthorable().register(typeIds); + } - protected void registerComentableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getComentable().register(typeIds); - } + protected void registerComentableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getComentable().register(typeIds); + } - public void registerContentTypeIcon(final String typeId, final BasicMimeTypeDTO mimeType, final String iconUrl) { - contentCapabilitiesRegistry.getIconsRegistry().registerContentTypeIcon(typeId, mimeType, iconUrl); - } + public void registerContentTypeIcon(final String typeId, final BasicMimeTypeDTO mimeType, + final String iconUrl) { + contentCapabilitiesRegistry.getIconsRegistry().registerContentTypeIcon(typeId, mimeType, iconUrl); + } - public void registerContentTypeIcon(final String contentTypeId, final Object icon) { - contentCapabilitiesRegistry.getIconsRegistry().registerContentTypeIcon(contentTypeId, icon); - } + public void registerContentTypeIcon(final String contentTypeId, final Object icon) { + contentCapabilitiesRegistry.getIconsRegistry().registerContentTypeIcon(contentTypeId, icon); + } - protected void registerDragableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getDragable().register(typeIds); - } + protected void registerDragableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getDragable().register(typeIds); + } - protected void registerDropableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getDropable().register(typeIds); - } + protected void registerDropableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getDropable().register(typeIds); + } - protected void registerEmailSubscribeAbleTypes(final String... typeIds) { - contentCapabilitiesRegistry.getEmailSubscribeAble().register(typeIds); - } + protected void registerEmailSubscribeAbleTypes(final String... typeIds) { + contentCapabilitiesRegistry.getEmailSubscribeAble().register(typeIds); + } - protected void registerLicensableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getLicensable().register(typeIds); - } + protected void registerLicensableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getLicensable().register(typeIds); + } - protected void registerPublishModerableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getPublishModerable().register(typeIds); - } + protected void registerPublishModerableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getPublishModerable().register(typeIds); + } - protected void registerRateableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getRateable().register(typeIds); - } + protected void registerRateableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getRateable().register(typeIds); + } - protected void registerRenamableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getRenamable().register(typeIds); - } + protected void registerRenamableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getRenamable().register(typeIds); + } - protected void registerTageableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getTageable().register(typeIds); - } + protected void registerTageableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getTageable().register(typeIds); + } - protected void registerTranslatableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getTranslatable().register(typeIds); - } + protected void registerTranslatableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getTranslatable().register(typeIds); + } - protected void registerUploadTypesAndMimes(final String typeUploadedfile) { - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("image"), "images/nav/picture.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("video"), "images/nav/film.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("audio"), "images/nav/music.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "pdf"), "images/nav/page_pdf.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "zip"), "images/nav/page_zip.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "zip"), "images/nav/page_zip.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("text"), "images/nav/page_text.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "msword"), - "images/nav/page_word.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "excel"), - "images/nav/page_excel.png"); - registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "mspowerpoint"), - "images/nav/page_pps.png"); - registerContentTypeIcon(typeUploadedfile, "images/nav/page.png"); - } + protected void registerUploadTypesAndMimes(final String typeUploadedfile) { + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("image"), "images/nav/picture.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("video"), "images/nav/film.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("audio"), "images/nav/music.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "pdf"), + "images/nav/page_pdf.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "zip"), + "images/nav/page_zip.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "zip"), + "images/nav/page_zip.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("text"), "images/nav/page_text.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "msword"), + "images/nav/page_word.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "excel"), + "images/nav/page_excel.png"); + registerContentTypeIcon(typeUploadedfile, new BasicMimeTypeDTO("application", "mspowerpoint"), + "images/nav/page_pps.png"); + registerContentTypeIcon(typeUploadedfile, "images/nav/page.png"); + } - protected void registerVersionableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getVersionable().register(typeIds); - } + protected void registerVersionableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getVersionable().register(typeIds); + } - protected void registerXmppComentableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getXmppComentable().register(typeIds); - } + protected void registerXmppComentableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getXmppComentable().register(typeIds); + } - protected void registerXmppNotifyCapableTypes(final String... typeIds) { - contentCapabilitiesRegistry.getXmppNotificyCapable().register(typeIds); - } + protected void registerXmppNotifyCapableTypes(final String... typeIds) { + contentCapabilitiesRegistry.getXmppNotificyCapable().register(typeIds); + } } Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java 2011-05-06 12:42:51 UTC (rev 1353) @@ -2,17 +2,12 @@ import org.waveprotocol.box.webclient.client.ClientIdGenerator; import org.waveprotocol.box.webclient.client.RemoteViewServiceMultiplexer; -import org.waveprotocol.box.webclient.client.Session; import org.waveprotocol.box.webclient.client.SimpleWaveStore; import org.waveprotocol.box.webclient.client.StagesProvider; -import org.waveprotocol.box.webclient.client.WaveWebSocketClient; import org.waveprotocol.box.webclient.search.WaveStore; -import org.waveprotocol.box.webclient.widget.loading.LoadingIndicator; import org.waveprotocol.wave.client.account.ProfileManager; -import org.waveprotocol.wave.client.account.impl.ProfileManagerImpl; import org.waveprotocol.wave.client.widget.common.ImplPanel; import org.waveprotocol.wave.model.id.IdGenerator; -import org.waveprotocol.wave.model.wave.ParticipantId; import org.waveprotocol.wave.model.waveref.InvalidWaveRefException; import org.waveprotocol.wave.model.waveref.WaveRef; import org.waveprotocol.wave.util.escapers.GwtWaverefEncoder; @@ -26,12 +21,14 @@ import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.GSpaceArmor; import cc.kune.gspace.client.viewers.ContentViewerPresenter.ContentViewerView; +import cc.kune.wave.client.WaveClientClearEvent; import cc.kune.wave.client.WaveClientManager; import cc.kune.wave.client.WebClient; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; +import com.google.gwt.event.shared.EventBus; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; @@ -39,6 +36,7 @@ import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.InsertPanel.ForIsWidget; +import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.gwtplatform.mvp.client.ViewImpl; @@ -58,29 +56,40 @@ DeckPanel deck; private final GSpaceArmor gsArmor; private IdGenerator idGenerator; - private final Element loading = new LoadingIndicator().getElement(); + private Element loading; @UiField InlineHTML onlyViewPanel; private ProfileManager profiles; /** The wave panel, if a wave is open. */ private StagesProvider wave; private final WaveClientManager waveClient; + private ImplPanel waveHolder; + @UiField - ImplPanel waveHolder; + VerticalPanel waveHolderParent; private final WaveStore waveStore = new SimpleWaveStore(); + private WebClient webClient; + private final Widget widget; @Inject public ContentViewerPanel(final GSpaceArmor wsArmor, final WaveClientManager waveClient, - final ContentCapabilitiesRegistry capabilitiesRegistry, final I18nTranslationService i18n) { + final ContentCapabilitiesRegistry capabilitiesRegistry, final I18nTranslationService i18n, + final EventBus eventBus) { this.gsArmor = wsArmor; this.waveClient = waveClient; this.capabilitiesRegistry = capabilitiesRegistry; widget = uiBinder.createAndBindUi(this); contentTitle = new ContentTitleWidget(i18n, gsArmor, capabilitiesRegistry.getIconsRegistry()); - loading.addClassName("kune-Margin-40-tb"); + eventBus.addHandler(WaveClientClearEvent.getType(), + new WaveClientClearEvent.WaveClientClearHandler() { + @Override + public void onWaveClientClear(final WaveClientClearEvent event) { + waveClear(); + } + }); } @Override @@ -100,6 +109,7 @@ gsArmor.getSubheaderToolbar().clear(); UiUtils.clear(gsArmor.getDocContainer()); UiUtils.clear(gsArmor.getDocHeader()); + waveClear(); } @Override @@ -122,13 +132,13 @@ private void initWaveClientIfNeeded() { if (channel == null) { - final WaveWebSocketClient webSocket = new WaveWebSocketClient(WebClient.useSocketIO(), - WebClient.getWebSocketBaseUrl(GWT.getModuleBaseURL())); - webSocket.connect(); - channel = new RemoteViewServiceMultiplexer(webSocket, - new ParticipantId(Session.get().getAddress()).getAddress()); - profiles = new ProfileManagerImpl(Session.get().getDomain()); + webClient = waveClient.getWebClient(); + loading = webClient.getLoading(); + waveHolder = webClient.getWaveHolder(); + channel = webClient.getChannel(); + profiles = webClient.getProfiles(); idGenerator = ClientIdGenerator.create(); + loading.addClassName("kune-Margin-40-tb"); } } @@ -161,13 +171,17 @@ private void setEditableWaveContent(final String waveRefS, final boolean isNewWave) { final WaveRef waveRef = getWaveRef(waveRefS); - if (wave != null) { - wave.destroy(); - wave = null; + initWaveClientIfNeeded(); + + webClient.clear(); + waveClear(); + + if (waveHolder.isAttached()) { + waveHolder.removeFromParent(); + waveHolderParent.remove(waveHolder); } + waveHolderParent.add(waveHolder); - initWaveClientIfNeeded(); - // Release the display:none. // UIObject.setVisible(waveFrame.getElement(), true); waveHolder.getElement().appendChild(loading); @@ -199,4 +213,11 @@ channel = NO_CHANNEL; } + private void waveClear() { + if (wave != null) { + wave.destroy(); + wave = null; + } + } + } Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.ui.xml 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.ui.xml 2011-05-06 12:42:51 UTC (rev 1353) @@ -21,7 +21,8 @@ </ui:style> <g:HTMLPanel width="100%" height="100%"> <g:DeckPanel ui:field="deck" addStyleNames="k-doc-content-deck"> - <w:ImplPanel ui:field="waveHolder" addStyleNames="{style.waveHolder}" /> + <!-- <w:ImplPanel ui:field="waveHolder" addStyleNames="{style.waveHolder}" /> --> + <g:VerticalPanel ui:field="waveHolderParent" /> <g:InlineHTML ui:field="onlyViewPanel" styleName="{style.viewonly}" /> </g:DeckPanel> </g:HTMLPanel> Added: trunk/src/main/java/cc/kune/wave/client/WaveClientClearEvent.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WaveClientClearEvent.java (rev 0) +++ trunk/src/main/java/cc/kune/wave/client/WaveClientClearEvent.java 2011-05-06 12:42:51 UTC (rev 1353) @@ -0,0 +1,58 @@ +package cc.kune.wave.client; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; + +import com.google.gwt.event.shared.HasHandlers; + +public class WaveClientClearEvent extends GwtEvent<WaveClientClearEvent.WaveClientClearHandler> { + + public interface HasWaveClientClearHandlers extends HasHandlers { + HandlerRegistration addWaveClientClearHandler(WaveClientClearHandler handler); + } + + public interface WaveClientClearHandler extends EventHandler { + public void onWaveClientClear(WaveClientClearEvent event); + } + + private static final Type<WaveClientClearHandler> TYPE = new Type<WaveClientClearHandler>(); + + public static void fire(HasHandlers source) { + source.fireEvent(new WaveClientClearEvent()); + } + + public static Type<WaveClientClearHandler> getType() { + return TYPE; + } + + + public WaveClientClearEvent() { + } + + @Override + public Type<WaveClientClearHandler> getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(WaveClientClearHandler handler) { + handler.onWaveClientClear(this); + } + + @Override + public boolean equals(Object obj) { + return super.equals(obj); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public String toString() { + return "WaveClientClearEvent[" + + "]"; + } +} Property changes on: trunk/src/main/java/cc/kune/wave/client/WaveClientClearEvent.java ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: trunk/src/main/java/cc/kune/wave/client/WebClient.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WebClient.java 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/wave/client/WebClient.java 2011-05-06 12:42:51 UTC (rev 1353) @@ -93,61 +93,165 @@ interface Binder extends UiBinder<DockLayoutPanel, WebClient> { } + /** + * An exception handler that reports exceptions using a <em>shiny banner</em> + * (an alert placed on the top of the screen). Once the stack trace is + * prepared, it is revealed in the banner via a link. + */ + static class ErrorHandler implements UncaughtExceptionHandler { + public static void install() { + GWT.setUncaughtExceptionHandler(new ErrorHandler(GWT.getUncaughtExceptionHandler())); + } + + private static String maybe(final int value, final String otherwise) { + return value != -1 ? String.valueOf(value) : otherwise; + } + + private static String maybe(final String value, final String otherwise) { + return value != null ? value : otherwise; + } + + /** + * Indicates whether an error has already been reported (at most one error + * is ever reported by this handler). + */ + private boolean hasFired; + + /** Next handler in the handler chain. */ + private final UncaughtExceptionHandler next; + + private ErrorHandler(final UncaughtExceptionHandler next) { + this.next = next; + } + + private void getStackTraceAsync(final Throwable t, final Accessor<SafeHtml> whenReady) { + // TODO: Request stack-trace de-obfuscation. For now, just use the + // javascript stack trace. + // + // Use minimal services here, in order to avoid the chance that reporting + // the error produces more errors. In particular, do not use WIAB's + // scheduler to run this command. + // Also, this code could potentially be put behind a runAsync boundary, to + // save whatever dependencies it uses from the initial download. + new Timer() { + @Override + public void run() { + final SafeHtmlBuilder stack = new SafeHtmlBuilder(); + + Throwable error = t; + while (error != null) { + final String token = String.valueOf((new Date()).getTime()); + stack.appendHtmlConstant("Token: " + token + "<br> "); + stack.appendEscaped(String.valueOf(error.getMessage())).appendHtmlConstant("<br>"); + for (final StackTraceElement elt : error.getStackTrace()) { + stack.appendHtmlConstant(" ") + .appendEscaped(maybe(elt.getClassName(), "??")).appendHtmlConstant(".") // + .appendEscaped(maybe(elt.getMethodName(), "??")).appendHtmlConstant(" (") // + .appendEscaped(maybe(elt.getFileName(), "??")).appendHtmlConstant(":") // + .appendEscaped(maybe(elt.getLineNumber(), "??")).appendHtmlConstant(")") // + .appendHtmlConstant("<br>"); + } + error = error.getCause(); + if (error != null) { + stack.appendHtmlConstant("Caused by: "); + } + } + + whenReady.use(stack.toSafeHtml()); + } + }.schedule(1); + } + + @Override + public void onUncaughtException(final Throwable e) { + if (!hasFired) { + hasFired = true; + // final ErrorIndicatorPresenter error = + // ErrorIndicatorPresenter.create(RootPanel.get("banner")); + getStackTraceAsync(e, new Accessor<SafeHtml>() { + @Override + public void use(final SafeHtml stack) { + NotifyUser.error("Oops! Something has gone wrong. Please contact the site admins with <em>more details</em>"); + // error.addDetail(stack, null); + final String message = stack.asString().replace("<br>", "\n"); + REMOTE_LOG.severe(message); + NotifyUser.logError(message); + } + }); + } + + if (next != null) { + next.onUncaughtException(e); + } + } + } + interface Style extends CssResource { } private static final Binder BINDER = GWT.create(Binder.class); + static final Log LOG = Log.get(WebClient.class); - static final Log LOG = Log.get(WebClient.class); // Use of GWT logging is only intended for sending exception reports to the // server, nothing else in the client should use java.util.logging. // Please also see WebClientDemo.gwt.xml. private static final Logger REMOTE_LOG = Logger.getLogger("REMOTE_LOG"); - private final ProfileManager profiles = new ProfileManagerImpl(Session.get().getDomain()); + /** + * Returns <code>ws://yourhost[:port]/</code>. + */ + // XXX check formatting wrt GPE + public native static String getWebSocketBaseUrl(String moduleBase) /*-{ + return "ws" + /:\/\/[^\/]+/.exec(moduleBase)[0] + "/"; + }-*/; - @UiField - SplitLayoutPanel splitPanel; + public native static boolean useSocketIO() /*-{ + return !!$wnd.__useSocketIO + }-*/; - @UiField - Style style; + private RemoteViewServiceMultiplexer channel; - @UiField - FramedPanel waveFrame; + private final EventBus eventBus; + private IdGenerator idGenerator; - @UiField - ImplPanel waveHolder; private final Element loading = new LoadingIndicator().getElement(); + private ParticipantId loggedInUser; + + @UiField + DebugMessagePanel logPanel; + + private final ProfileManager profiles = new ProfileManagerImpl(Session.get().getDomain()); + @UiField(provided = true) final SearchPanelWidget searchPanel = new SearchPanelWidget(new SearchPanelRenderer(profiles)); @UiField - DebugMessagePanel logPanel; + SplitLayoutPanel splitPanel; + @UiField + Style style; + /** The wave panel, if a wave is open. */ private StagesProvider wave; +@UiField +FramedPanel waveFrame; + + ImplPanel waveHolder; + private final WaveStore waveStore = new SimpleWaveStore(); /** * Create a remote websocket to talk to the server-side FedOne service. */ - private WaveWebSocketClient websocket; + private final WaveWebSocketClient websocket; - private ParticipantId loggedInUser; - - private IdGenerator idGenerator; - - private RemoteViewServiceMultiplexer channel; - -private final EventBus eventBus; - /** * This is the entry point method. */ @Inject - public WebClient(EventBus eventBus) { + public WebClient(final EventBus eventBus) { this.eventBus = eventBus; ErrorHandler.install(); @@ -156,7 +260,7 @@ new WaveCreationEventHandler() { @Override - public void onCreateRequest(WaveCreationEvent event) { + public void onCreateRequest(final WaveCreationEvent event) { LOG.info("WaveCreationEvent received"); if (channel == null) { throw new DefaultException("Spaghetti attack. Create occured before login"); @@ -185,118 +289,62 @@ LOG.info("SimpleWebClient.onModuleLoad() done"); } - private void setupUi() { - // Set up UI - DockLayoutPanel self = BINDER.createAndBindUi(this); - // kune-patch - // RootPanel.get("app").add(self); - initWidget(self); - // DockLayoutPanel forcibly conflicts with sensible layout control, and - // sticks inline styles on elements without permission. They must be - // cleared. - self.getElement().getStyle().clearPosition(); - splitPanel.setWidgetMinSize(searchPanel, 300); - - if (LogLevel.showDebug()) { - logPanel.enable(); - } else { - logPanel.removeFromParent(); - } - - setupSearchPanel(); - setupWavePanel(); + public RemoteViewServiceMultiplexer getChannel() { + return channel; } - private void setupSearchPanel() { - // On wave selection, fire an event. - SearchPresenter.WaveSelectionHandler selectHandler = - new SearchPresenter.WaveSelectionHandler() { - @Override - public void onWaveSelected(WaveId id) { - ClientEvents.get().fireEvent(new WaveSelectionEvent(WaveRef.of(id))); - } - }; - Search search = SimpleSearch.create(RemoteSearchService.create(), waveStore); - SearchPresenter.create(search, searchPanel, selectHandler); + public Element getLoading() { + return loading; } - private void setupWavePanel() { - // Hide the frame until waves start getting opened. - UIObject.setVisible(waveFrame.getElement(), false); - - // Handles opening waves. - ClientEvents.get().addWaveSelectionEventHandler(new WaveSelectionEventHandler() { - @Override - public void onSelection(WaveRef waveRef) { - openWave(waveRef, false); - } - }); + public ProfileManager getProfiles() { + return profiles; } - private void setupConnectionIndicator() { - ClientEvents.get().addNetworkStatusEventHandler(new NetworkStatusEventHandler() { - @Override - public void onNetworkStatus(NetworkStatusEvent event) { - Element element = Document.get().getElementById("netstatus"); - if (element != null) { - switch (event.getStatus()) { - case CONNECTED: - case RECONNECTED: - element.setInnerText("Online"); - element.setClassName("online"); - break; - case DISCONNECTED: - element.setInnerText("Offline"); - element.setClassName("offline"); - break; - case RECONNECTING: - element.setInnerText("Connecting..."); - element.setClassName("connecting"); - break; - } - } - } - }); + public ImplPanel getWaveHolder() { + return waveHolder; } - +public WaveWebSocketClient getWebSocket() { + return websocket; +} /** - * Returns <code>ws://yourhost[:port]/</code>. */ - // XXX check formatting wrt GPE - public native static String getWebSocketBaseUrl(String moduleBase) /*-{ - return "ws" + /:\/\/[^\/]+/.exec(moduleBase)[0] + "/"; - }-*/; - - public native static boolean useSocketIO() /*-{ - return !!$wnd.__useSocketIO - }-*/; - - /** - */ private void loginToServer() { assert loggedInUser != null; channel = new RemoteViewServiceMultiplexer(websocket, loggedInUser.getAddress()); } + public void clear() { + if (wave != null) { + wave.destroy(); + wave = null; + } +} /** * Shows a wave in a wave panel. * * @param waveRef wave id to open * @param isNewWave whether the wave is being created by this client session. */ - private void openWave(WaveRef waveRef, boolean isNewWave) { + private void openWave(final WaveRef waveRef, final boolean isNewWave) { LOG.info("WebClient.openWave()"); + WaveClientClearEvent.fire(eventBus); if (wave != null) { wave.destroy(); wave = null; } - + if (waveHolder.isAttached()) { + waveHolder.removeFromParent(); + } + waveFrame.remove(waveHolder); + waveFrame.clear(); + waveFrame.add(waveHolder); // Release the display:none. UIObject.setVisible(waveFrame.getElement(), true); waveHolder.getElement().appendChild(loading); - Element holder = waveHolder.getElement().appendChild(Document.get().createDivElement()); - StagesProvider wave = new StagesProvider( + final Element holder = waveHolder.getElement().appendChild(Document.get().createDivElement()); + final StagesProvider wave = new StagesProvider( holder, waveHolder, waveRef, channel, idGenerator, profiles, waveStore, isNewWave); this.wave = wave; wave.load(new Command() { @@ -305,11 +353,11 @@ loading.removeFromParent(); } }); - String encodedToken = History.getToken(); + final String encodedToken = History.getToken(); // NotifyUser.info("Open Wave: " + encodedToken + " waveRef: " + waveRef.getWaveId(), true); // Kune patch if (encodedToken != null && !encodedToken.isEmpty() && !encodedToken.equals(SiteTokens.WAVEINBOX)) { - WaveRef fromWaveRef = HistorySupport.waveRefFromHistoryToken(encodedToken); + final WaveRef fromWaveRef = HistorySupport.waveRefFromHistoryToken(encodedToken); if (waveRef == null) { LOG.info("History token contains invalid path: " + encodedToken); return; @@ -321,113 +369,85 @@ return; } } - String tokenFromWaveref = HistorySupport.historyTokenFromWaveref(waveRef); + final String tokenFromWaveref = HistorySupport.historyTokenFromWaveref(waveRef); SpaceConfEvent.fire(eventBus, Space.userSpace, tokenFromWaveref); History.newItem(tokenFromWaveref, false); } - /** - * An exception handler that reports exceptions using a <em>shiny banner</em> - * (an alert placed on the top of the screen). Once the stack trace is - * prepared, it is revealed in the banner via a link. - */ - static class ErrorHandler implements UncaughtExceptionHandler { - /** Next handler in the handler chain. */ - private final UncaughtExceptionHandler next; - - /** - * Indicates whether an error has already been reported (at most one error - * is ever reported by this handler). - */ - private boolean hasFired; - - private ErrorHandler(UncaughtExceptionHandler next) { - this.next = next; - } - - public static void install() { - GWT.setUncaughtExceptionHandler(new ErrorHandler(GWT.getUncaughtExceptionHandler())); - } - - @Override - public void onUncaughtException(Throwable e) { - if (!hasFired) { - hasFired = true; - // final ErrorIndicatorPresenter error = - // ErrorIndicatorPresenter.create(RootPanel.get("banner")); - getStackTraceAsync(e, new Accessor<SafeHtml>() { - @Override - public void use(SafeHtml stack) { - NotifyUser.error("Oops! Something has gone wrong. Please contact the site admins with <em>more details</em>"); - // error.addDetail(stack, null); - String message = stack.asString().replace("<br>", "\n"); - REMOTE_LOG.severe(message); - NotifyUser.logError(message); + private void setupConnectionIndicator() { + ClientEvents.get().addNetworkStatusEventHandler(new NetworkStatusEventHandler() { + @Override + public void onNetworkStatus(final NetworkStatusEvent event) { + final Element element = Document.get().getElementById("netstatus"); + if (element != null) { + switch (event.getStatus()) { + case CONNECTED: + case RECONNECTED: + element.setInnerText("Online"); + element.setClassName("online"); + break; + case DISCONNECTED: + element.setInnerText("Offline"); + element.setClassName("offline"); + break; + case RECONNECTING: + element.setInnerText("Connecting..."); + element.setClassName("connecting"); + break; } - }); + } } + }); + } - if (next != null) { - next.onUncaughtException(e); - } - } - - private void getStackTraceAsync(final Throwable t, final Accessor<SafeHtml> whenReady) { - // TODO: Request stack-trace de-obfuscation. For now, just use the - // javascript stack trace. - // - // Use minimal services here, in order to avoid the chance that reporting - // the error produces more errors. In particular, do not use WIAB's - // scheduler to run this command. - // Also, this code could potentially be put behind a runAsync boundary, to - // save whatever dependencies it uses from the initial download. - new Timer() { - @Override - public void run() { - SafeHtmlBuilder stack = new SafeHtmlBuilder(); - - Throwable error = t; - while (error != null) { - String token = String.valueOf((new Date()).getTime()); - stack.appendHtmlConstant("Token: " + token + "<br> "); - stack.appendEscaped(String.valueOf(error.getMessage())).appendHtmlConstant("<br>"); - for (StackTraceElement elt : error.getStackTrace()) { - stack.appendHtmlConstant(" ") - .appendEscaped(maybe(elt.getClassName(), "??")).appendHtmlConstant(".") // - .appendEscaped(maybe(elt.getMethodName(), "??")).appendHtmlConstant(" (") // - .appendEscaped(maybe(elt.getFileName(), "??")).appendHtmlConstant(":") // - .appendEscaped(maybe(elt.getLineNumber(), "??")).appendHtmlConstant(")") // - .appendHtmlConstant("<br>"); - } - error = error.getCause(); - if (error != null) { - stack.appendHtmlConstant("Caused by: "); - } + private void setupSearchPanel() { + // On wave selection, fire an event. + final SearchPresenter.WaveSelectionHandler selectHandler = + new SearchPresenter.WaveSelectionHandler() { + @Override + public void onWaveSelected(final WaveId id) { + ClientEvents.get().fireEvent(new WaveSelectionEvent(WaveRef.of(id))); } + }; + final Search search = SimpleSearch.create(RemoteSearchService.create(), waveStore); + SearchPresenter.create(search, searchPanel, selectHandler); + } - whenReady.use(stack.toSafeHtml()); - } - }.schedule(1); - } + private void setupUi() { + // Set up UI + final DockLayoutPanel self = BINDER.createAndBindUi(this); + // kune-patch + // RootPanel.get("app").add(self); + initWidget(self); + waveHolder = new ImplPanel(""); + waveHolder.addStyleName("k-waveHolder"); + waveFrame.add(waveHolder); + // DockLayoutPanel forcibly conflicts with sensible layout control, and + // sticks inline styles on elements without permission. They must be + // cleared. + self.getElement().getStyle().clearPosition(); + splitPanel.setWidgetMinSize(searchPanel, 300); - private static String maybe(String value, String otherwise) { - return value != null ? value : otherwise; + if (LogLevel.showDebug()) { + logPanel.enable(); + } else { + logPanel.removeFromParent(); } - private static String maybe(int value, String otherwise) { - return value != -1 ? String.valueOf(value) : otherwise; - } + setupSearchPanel(); + setupWavePanel(); } - public WaveWebSocketClient getWebSocket() { - return websocket; - } + private void setupWavePanel() { + // Hide the frame until waves start getting opened. + UIObject.setVisible(waveFrame.getElement(), false); - public RemoteViewServiceMultiplexer getChannel() { - return channel; + // Handles opening waves. + ClientEvents.get().addWaveSelectionEventHandler(new WaveSelectionEventHandler() { + @Override + public void onSelection(final WaveRef waveRef) { + openWave(waveRef, false); + } + }); } - - public ProfileManager getProfiles() { - return profiles; - } } Modified: trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml 2011-05-06 02:36:59 UTC (rev 1352) +++ trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml 2011-05-06 12:42:51 UTC (rev 1353) @@ -1,13 +1,10 @@ -<ui:UiBinder - xmlns:ui="urn:ui:com.google.gwt.uibinder" - xmlns:g='urn:import:com.google.gwt.user.client.ui' - xmlns:d='urn:import:org.waveprotocol.box.webclient.client' - xmlns:s='urn:import:org.waveprotocol.box.webclient.search' - xmlns:f='urn:import:org.waveprotocol.box.webclient.widget.frame' - xmlns:w='urn:import:org.waveprotocol.wave.client.widget.common'> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" + xmlns:g='urn:import:com.google.gwt.user.client.ui' xmlns:d='urn:import:org.waveprotocol.box.webclient.client' + xmlns:s='urn:import:org.waveprotocol.box.webclient.search' xmlns:f='urn:import:org.waveprotocol.box.webclient.widget.frame' + xmlns:w='urn:import:org.waveprotocol.wave.client.widget.common'> <ui:style type="cc.kune.wave.client.WebClient.Style"> - @def rootBackground #f0f0ff; - @def gap 10px; + @def rootBackground #f4e3d7; + @def gap 5px; .root { background: rootBackground; position: absolute; @@ -15,6 +12,9 @@ left: 0; right: 0; bottom: 0; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; } .root2 { @@ -22,19 +22,20 @@ } .splitPanel { + } @external gwt-SplitLayoutPanel-HDragger; @external gwt-SplitLayoutPanel-VDragger; - .splitPanel .gwt-SplitLayoutPanel-HDragger,.splitPanel .gwt-SplitLayoutPanel-VDragger { + .splitPanel .gwt-SplitLayoutPanel-HDragger,.splitPanel .gwt-SplitLayoutPanel-VDragger + { background-color: rootBackground; } - .searchPanel { - /* - * GWT's drag panel separators are already huge, so no margin needed on - * sides that have drag panels. - */ + .searchPanel { /* + * GWT's drag panel separators are already huge, so no margin needed on + * sides that have drag panels. + */ margin: gap 0 0 gap; } @@ -45,11 +46,10 @@ margin: 0 gap gap gap; } - .wavePanel { - /* - * GWT's drag panel separators are already huge, so no margin needed on - * sides that have drag panels. - */ + .wavePanel { /* + * GWT's drag panel separators are already huge, so no margin needed on + * sides that have drag panels. + */ margin: gap 0 0 0; } @@ -63,16 +63,21 @@ </ui:style> <g:DockLayoutPanel unit="PX" styleName="{style.root}"> <g:center> - <g:SplitLayoutPanel ui:field="splitPanel" stylePrimaryName="{style.splitPanel}"> + <g:SplitLayoutPanel ui:field="splitPanel" + stylePrimaryName="{style.splitPanel}"> <g:south size="200"> - <d:DebugMessagePanel ui:field="logPanel" addStyleNames="{style.debugPanel}" /> + <d:DebugMessagePanel ui:field="logPanel" + addStyleNames="{style.debugPanel}" /> </g:south> <g:west size="400"> - <s:SearchPanelWidget ui:field="searchPanel" addStyleNames="{style.searchPanel}"/> + <s:SearchPanelWidget ui:field="searchPanel" + addStyleNames="{style.searchPanel}" /> </g:west> <g:center> - <f:FramedPanel ui:field="waveFrame" addStyleNames="{style.wavePanel}"> - <w:ImplPanel ui:field="waveHolder" addStyleNames="{style.waveHolder}"/> + <f:FramedPanel ui:field="waveFrame" + addStyleNames="{style.wavePanel}"> + <!-- <w:ImplPanel ui:field="waveHolder" + addStyleNames="{style.waveHolder}" /> --> </f:FramedPanel> </g:center> </g:SplitLayoutPanel>
participants (1)
-
Vicente J. Ruiz Jurado