Author: vjrj Date: 2008-11-04 13:32:31 +0100 (Tue, 04 Nov 2008) New Revision: 938 Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManager.java trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java trunk/src/main/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroup.java trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroupPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/Register.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignIn.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInAbstractPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPresenter.java trunk/src/test/java/org/ourproject/kune/platf/client/state/StateManagerTest.java trunk/src/test/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenterTest.java trunk/src/test/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenterTest.java Log: Complete - task TextEditor intercepts token change and ask for save before closing the editor Complete - task StateManager refactor Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-11-04 12:32:31 UTC (rev 938) @@ -109,7 +109,6 @@ import com.calclab.suco.client.ioc.decorator.Singleton; import com.calclab.suco.client.ioc.module.AbstractModule; import com.calclab.suco.client.ioc.module.Factory; -import com.calclab.suco.client.listener.Listener; import com.calclab.suco.client.listener.Listener0; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Cookies; @@ -443,26 +442,26 @@ }); // Register of tokens like "signin", "newgroup", "translate" etcetera - $(StateManager.class).addSiteToken(SiteToken.signin.toString(), new Listener<StateToken>() { - public void onEvent(final StateToken previousStateToken) { - $(SignIn.class).doSignIn(previousStateToken); + $(StateManager.class).addSiteToken(SiteToken.signin.toString(), new Listener0() { + public void onEvent() { + $(SignIn.class).doSignIn(); } }); - $(StateManager.class).addSiteToken(SiteToken.register.toString(), new Listener<StateToken>() { - public void onEvent(final StateToken previousStateToken) { - $(Register.class).doRegister(previousStateToken); + $(StateManager.class).addSiteToken(SiteToken.register.toString(), new Listener0() { + public void onEvent() { + $(Register.class).doRegister(); } }); - $(StateManager.class).addSiteToken(SiteToken.newgroup.toString(), new Listener<StateToken>() { - public void onEvent(final StateToken previousStateToken) { - $(NewGroup.class).doNewGroup(previousStateToken); + $(StateManager.class).addSiteToken(SiteToken.newgroup.toString(), new Listener0() { + public void onEvent() { + $(NewGroup.class).doNewGroup(); } }); - $(StateManager.class).addSiteToken(SiteToken.translate.toString(), new Listener<StateToken>() { - public void onEvent(final StateToken previousStateToken) { + $(StateManager.class).addSiteToken(SiteToken.translate.toString(), new Listener0() { + public void onEvent() { $(I18nTranslator.class).doShowTranslator(); } }); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManager.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManager.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManager.java 2008-11-04 12:32:31 UTC (rev 938) @@ -19,26 +19,25 @@ */ package org.ourproject.kune.platf.client.state; -import org.ourproject.kune.platf.client.dto.GroupDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkResultDTO; import org.ourproject.kune.platf.client.dto.StateAbstractDTO; import org.ourproject.kune.platf.client.dto.StateToken; import com.calclab.suco.client.listener.Listener; +import com.calclab.suco.client.listener.Listener0; import com.calclab.suco.client.listener.Listener2; -import com.google.gwt.user.client.HistoryListener; -public interface StateManager extends HistoryListener { +public interface StateManager { void addBeforeStateChangeListener(BeforeStateChangeListener listener); - void addSiteToken(String token, Listener<StateToken> whenToken); + void addSiteToken(String token, Listener0 whenToken); void gotoToken(StateToken newToken); void gotoToken(String newToken); - void onGroupChanged(Listener2<GroupDTO, GroupDTO> listener); + void onGroupChanged(Listener2<String, String> listener); void onSocialNetworkChanged(Listener<StateAbstractDTO> listener); @@ -52,8 +51,10 @@ void removeSiteToken(String token); - void restorePreviousState(); + void restorePreviousToken(); + void resumeTokenChange(); + void setRetrievedState(StateAbstractDTO state); void setSocialNetwork(SocialNetworkResultDTO socialNet); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java 2008-11-04 12:32:31 UTC (rev 938) @@ -22,12 +22,10 @@ import java.util.HashMap; import org.ourproject.kune.platf.client.app.HistoryWrapper; -import org.ourproject.kune.platf.client.dto.GroupDTO; import org.ourproject.kune.platf.client.dto.ParticipationDataDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkResultDTO; import org.ourproject.kune.platf.client.dto.StateAbstractDTO; -import org.ourproject.kune.platf.client.dto.StateContainerDTO; import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.dto.UserBuddiesDataDTO; import org.ourproject.kune.platf.client.dto.UserInfoDTO; @@ -40,17 +38,23 @@ import com.calclab.suco.client.listener.Listener; import com.calclab.suco.client.listener.Listener0; import com.calclab.suco.client.listener.Listener2; +import com.google.gwt.user.client.HistoryListener; -public class StateManagerDefault implements StateManager { +public class StateManagerDefault implements StateManager, HistoryListener { private final ContentProvider contentProvider; - private StateAbstractDTO oldState; + private StateToken previousToken; + /** + * When a historyChanged is interrupted (for instance because you are + * editing something), the new token is stored here + */ + private StateToken resumedToken; private final Session session; private final HistoryWrapper history; - private final HashMap<String, Listener<StateToken>> siteTokens; + private final HashMap<String, Listener0> siteTokens; private final Event<StateAbstractDTO> onStateChanged; private final Event<StateAbstractDTO> onSocialNetworkChanged; private final Event2<String, String> onToolChanged; - private final Event2<GroupDTO, GroupDTO> onGroupChanged; + private final Event2<String, String> onGroupChanged; private final BeforeStateChangeCollection beforeStateChangeCollection; public StateManagerDefault(final ContentProvider contentProvider, final Session session, @@ -58,17 +62,19 @@ this.contentProvider = contentProvider; this.session = session; this.history = history; - this.oldState = null; + this.previousToken = null; + this.resumedToken = null; this.onStateChanged = new Event<StateAbstractDTO>("onStateChanged"); - this.onGroupChanged = new Event2<GroupDTO, GroupDTO>("onGroupChanged"); + this.onGroupChanged = new Event2<String, String>("onGroupChanged"); this.onToolChanged = new Event2<String, String>("onToolChanged"); this.onSocialNetworkChanged = new Event<StateAbstractDTO>("onSocialNetworkChanged"); session.onUserSignIn(new Listener<UserInfoDTO>() { public void onEvent(final UserInfoDTO parameter) { - if (oldState != null) { - restorePreviousState(); + if (previousToken == null) { + // starting up + reload(); } else { - reload(); + // do nothing, SigInPresent calls goto; } } }); @@ -77,7 +83,7 @@ reload(); } }); - siteTokens = new HashMap<String, Listener<StateToken>>(); + siteTokens = new HashMap<String, Listener0>(); beforeStateChangeCollection = new BeforeStateChangeCollection(); } @@ -85,13 +91,12 @@ beforeStateChangeCollection.add(listener); } - public void addSiteToken(final String token, final Listener<StateToken> listener) { + public void addSiteToken(final String token, final Listener0 listener) { siteTokens.put(token, listener); } public void gotoToken(final StateToken newToken) { Log.debug("StateManager: history goto-token newItem (" + newToken + ")"); - history.newItem(newToken.getEncoded()); } @@ -99,28 +104,28 @@ gotoToken(new StateToken(token)); } - public void onGroupChanged(final Listener2<GroupDTO, GroupDTO> listener) { + public void onGroupChanged(final Listener2<String, String> listener) { onGroupChanged.add(listener); } public void onHistoryChanged(final String historyToken) { if (beforeStateListenersAllowChange(historyToken)) { - final Listener<StateToken> tokenListener = siteTokens.get(historyToken); + final Listener0 tokenListener = siteTokens.get(historyToken); Log.debug("StateManager: history token changed (" + historyToken + ")"); if (tokenListener == null) { + // Ok, normal token change onHistoryChanged(new StateToken(historyToken)); } else { - StateToken stateToken; - if (oldState == null) { + // token is one of #newgroup #signin #translate ... + if (previousToken == null) { // Starting with some token like "signin": load defContent // also - stateToken = new StateToken(); - onHistoryChanged(stateToken); - } else { - stateToken = oldState.getStateToken(); + onHistoryChanged(""); } - tokenListener.onEvent(stateToken); + tokenListener.onEvent(); } + } else { + resumedToken = previousToken; } } @@ -153,13 +158,15 @@ siteTokens.remove(token); } - public void restorePreviousState() { - if (oldState == null) { - onHistoryChanged(new StateToken()); - } else { - final StateAbstractDTO newState = oldState; - oldState = session.getCurrentState(); - setState(newState); + public void restorePreviousToken() { + gotoToken(previousToken); + } + + public void resumeTokenChange() { + if (resumedToken != null) { + reload(); + gotoToken(resumedToken); + clearResumedToken(); } } @@ -184,6 +191,14 @@ } } + void setState(final StateAbstractDTO newState) { + session.setCurrentState(newState); + onStateChanged.fire(newState); + Site.hideProgress(); + checkGroupAndToolChange(newState); + previousToken = newState.getStateToken(); + } + private boolean beforeStateListenersAllowChange(String newToken) { for (BeforeStateChangeListener listener : beforeStateChangeCollection) { if (!listener.beforeChange(newToken)) { @@ -193,26 +208,26 @@ return true; } - private void checkGroupAndToolChange(final StateAbstractDTO oldState, final StateAbstractDTO newState) { - final GroupDTO oldGroup = oldState != null ? oldState.getGroup() : null; - final GroupDTO newGroup = newState.getGroup(); - if (oldState == null || !oldGroup.equals(newGroup)) { - onGroupChanged.fire(oldGroup, newGroup); + private void checkGroupAndToolChange(final StateAbstractDTO newState) { + final String previousGroup = previousToken == null ? "" : previousToken.getGroup(); + final String newGroup = newState.getStateToken().getGroup(); + if (previousToken == null || !previousGroup.equals(newGroup)) { + onGroupChanged.fire(previousGroup, newGroup); } - // TODO field with oldToolName - String oldToolName = null; - String newToolName = null; - if (oldState instanceof StateContainerDTO) { - oldToolName = oldState != null ? ((StateContainerDTO) oldState).getToolName() : null; + String previousTokenTool = previousToken == null ? "" : previousToken.getTool(); + String newTokenTool = newState.getStateToken().getTool(); + String previousToolName = previousTokenTool == null ? "" : previousTokenTool; + String newToolName = newTokenTool == null ? "" : newTokenTool; + + if (previousToken == null || previousToolName == null || !previousToolName.equals(newToolName)) { + onToolChanged.fire(previousToolName, newToolName); } - if (newState instanceof StateContainerDTO) { - newToolName = ((StateContainerDTO) newState).getToolName(); - } - if (oldState == null || oldToolName == null || !oldToolName.equals(newToolName)) { - onToolChanged.fire(oldToolName, newToolName); - } } + private void clearResumedToken() { + resumedToken = null; + } + private void onHistoryChanged(final StateToken newState) { contentProvider.getContent(session.getUserHash(), newState, new AsyncCallbackSimple<StateAbstractDTO>() { public void onSuccess(final StateAbstractDTO newState) { @@ -220,12 +235,4 @@ } }); } - - private void setState(final StateAbstractDTO newState) { - session.setCurrentState(newState); - onStateChanged.fire(newState); - Site.hideProgress(); - checkGroupAndToolChange(oldState, newState); - oldState = newState; - } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.List; -import org.ourproject.kune.platf.client.dto.GroupDTO; import org.ourproject.kune.platf.client.dto.StateAbstractDTO; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.workspace.client.themes.WsThemePresenter; @@ -47,9 +46,9 @@ } } }); - stateManager.onGroupChanged(new Listener2<GroupDTO, GroupDTO>() { - public void onEvent(final GroupDTO oldGroup, final GroupDTO newGroup) { - onGroupChanged(newGroup.getShortName()); + stateManager.onGroupChanged(new Listener2<String, String>() { + public void onEvent(final String oldGroup, final String newGroup) { + onGroupChanged(newGroup); } }); stateManager.onToolChanged(new Listener2<String, String>() { @@ -78,10 +77,10 @@ } void onToolChanged(final String oldTool, final String newTool) { - if (oldTool != null) { + if (!oldTool.equals("")) { tools.get(oldTool).setSelected(false); } - if (newTool != null) { + if (!newTool.equals("")) { tools.get(newTool).setSelected(true); } } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2008-11-04 12:32:31 UTC (rev 938) @@ -35,6 +35,7 @@ public class TextEditorPanel implements TextEditorView { private static final String BACKCOLOR_ENABLED = "#FFF"; private static final String BACKCOLOR_DISABLED = "#CCC"; + public static final String TEXT_AREA = "k-tep-ta"; private final RichTextArea gwtRTarea; private final TextEditorToolbar textEditorToolbar; private final TextEditorPresenter presenter; @@ -54,6 +55,7 @@ gwtRTarea = new RichTextArea(); gwtRTarea.setWidth("97%"); gwtRTarea.addStyleName("kune-TexEditorPanel-TextArea"); + gwtRTarea.ensureDebugId(TEXT_AREA); final Toolbar editorTopBar = new Toolbar(); editorTopBar.getPanel().setWidth("auto"); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -51,7 +51,6 @@ private ActionToolbarButtonDescriptor<StateToken> close; private final I18nUITranslationService i18n; private final BeforeStateChangeListener beforeStateChangeListener; - private String newTokenAfterSave; private final StateManager stateManager; public TextEditorPresenter(final boolean isAutoSave, final ActionToolbar<StateToken> toolbar, @@ -67,7 +66,7 @@ beforeStateChangeListener = new BeforeStateChangeListener() { public boolean beforeChange(String newToken) { - return beforeTokenChange(newToken); + return beforeTokenChange(); } }; } @@ -79,7 +78,6 @@ view.attach(); setContent(content); stateManager.addBeforeStateChangeListener(beforeStateChangeListener); - newTokenAfterSave = null; } public String getContent() { @@ -131,7 +129,6 @@ savePending = false; saveAndCloseConfirmed = false; toolbar.setEnableAction(save, false); - newTokenAfterSave = null; } protected void onCancel() { @@ -145,7 +142,7 @@ protected void onCancelConfirmed() { stateManager.removeBeforeStateChangeListener(beforeStateChangeListener); - gotoNewTokenIfNecessary(); + stateManager.resumeTokenChange(); reset(); view.detach(); toolbar.detach(); @@ -172,9 +169,8 @@ onSave.onEvent(view.getHTML()); } - boolean beforeTokenChange(String newToken) { + boolean beforeTokenChange() { if (savePending) { - newTokenAfterSave = newToken; onCancel(); return false; } else { @@ -210,13 +206,6 @@ toolbar.setActions(collection); } - private void gotoNewTokenIfNecessary() { - if (newTokenAfterSave != null) { - stateManager.reload(); - stateManager.gotoToken(newTokenAfterSave); - } - } - private void setContent(final String html) { this.view.setHTML(html); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -39,9 +39,9 @@ public EntityLogoPresenter(final StateManager stateManager, final WsThemePresenter theme, final Session session) { this.session = session; - stateManager.onGroupChanged(new Listener2<GroupDTO, GroupDTO>() { - public void onEvent(final GroupDTO oldGroup, final GroupDTO newGroup) { - setGroupLogo(newGroup); + stateManager.onGroupChanged(new Listener2<String, String>() { + public void onEvent(final String oldGroup, final String newGroup) { + setGroupLogo(session.getCurrentState().getGroup()); } }); stateManager.onStateChanged(new Listener<StateAbstractDTO>() { Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroup.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroup.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroup.java 2008-11-04 12:32:31 UTC (rev 938) @@ -19,10 +19,9 @@ */ package org.ourproject.kune.workspace.client.newgroup; -import org.ourproject.kune.platf.client.dto.StateToken; public interface NewGroup { - void doNewGroup(StateToken previousToken); + void doNewGroup(); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroupPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroupPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/newgroup/NewGroupPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -34,7 +34,7 @@ import org.ourproject.kune.workspace.client.site.SiteToken; import com.calclab.suco.client.ioc.Provider; -import com.calclab.suco.client.listener.Listener; +import com.calclab.suco.client.listener.Listener0; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -43,7 +43,6 @@ public static final String REGISTER_TO_CREATE_A_GROUP = "Sign in or register to create a group"; private NewGroupView view; private final I18nTranslationService i18n; - private StateToken previousToken; private final Session session; private final StateManager stateManager; private final Provider<GroupServiceAsync> groupServiceProvider; @@ -54,15 +53,14 @@ this.session = session; this.stateManager = stateManager; this.groupServiceProvider = groupServiceProvider; - stateManager.addSiteToken(SiteToken.newgroup.toString(), new Listener<StateToken>() { - public void onEvent(final StateToken previousStateToken) { - doNewGroup(previousStateToken); + stateManager.addSiteToken(SiteToken.newgroup.toString(), new Listener0() { + public void onEvent() { + doNewGroup(); } }); } - public void doNewGroup(final StateToken previousToken) { - this.previousToken = previousToken; + public void doNewGroup() { session.check(new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { if (session.isLogged()) { @@ -71,7 +69,7 @@ view.center(); Site.hideProgress(); } else { - stateManager.gotoToken(previousToken); + stateManager.restorePreviousToken(); Site.info(i18n.t(REGISTER_TO_CREATE_A_GROUP)); } } @@ -96,12 +94,12 @@ public void onCancel() { view.hide(); reset(); - stateManager.gotoToken(previousToken); + stateManager.restorePreviousToken(); } public void onClose() { reset(); - stateManager.gotoToken(previousToken); + stateManager.restorePreviousToken(); } public void onFinish() { Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/Register.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/Register.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/Register.java 2008-11-04 12:32:31 UTC (rev 938) @@ -1,10 +1,9 @@ package org.ourproject.kune.workspace.client.signin; -import org.ourproject.kune.platf.client.dto.StateToken; public interface Register { - void doRegister(StateToken previousStateToken); + void doRegister(); void hide(); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPanel.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPanel.java 2008-11-04 12:32:31 UTC (rev 938) @@ -99,7 +99,8 @@ i18n.t("Now you can participate more actively in this site with other people and groups. " + "You can also use your personal space to publish contents. " + "Your email is not verified, please follow the instructions you will receive by email."), - i18n.t("Ok"), WELCOME_OK_BUTTON, true, true, 400, 210); + i18n.t("Ok"), WELCOME_OK_BUTTON, true, true, 380, 210); + welcomeDialog.setId(WELCOME_DIALOG); welcomeDialog.show(); } @@ -107,7 +108,7 @@ InfoDialog welcomeDialog = new InfoDialog(i18n.t("Welcome"), i18n.t("Thanks for registering"), i18n.t("Now you can participate more actively in this site with other people and groups. " + "Your email is not verified, please follow the instructions you will receive by email."), - i18n.t("Ok"), WELCOME_OK_BUTTON, true, true, 400, 210); + i18n.t("Ok"), WELCOME_OK_BUTTON, true, true, 380, 210); welcomeDialog.setId(WELCOME_DIALOG); welcomeDialog.show(); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -3,7 +3,6 @@ import org.ourproject.kune.platf.client.View; import org.ourproject.kune.platf.client.dto.I18nCountryDTO; import org.ourproject.kune.platf.client.dto.I18nLanguageDTO; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.dto.TimeZoneDTO; import org.ourproject.kune.platf.client.dto.UserDTO; import org.ourproject.kune.platf.client.dto.UserInfoDTO; @@ -36,8 +35,7 @@ this.signInProvider = signInProvider; } - public void doRegister(StateToken previousStateToken) { - this.previousStateToken = previousStateToken; + public void doRegister() { signInProvider.get().hide(); if (!session.isLogged()) { Site.showProgressProcessing(); @@ -45,7 +43,7 @@ view.center(); Site.hideProgress(); } else { - stateManager.gotoToken(previousStateToken); + stateManager.restorePreviousToken(); } } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignIn.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignIn.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignIn.java 2008-11-04 12:32:31 UTC (rev 938) @@ -1,10 +1,9 @@ package org.ourproject.kune.workspace.client.signin; -import org.ourproject.kune.platf.client.dto.StateToken; public interface SignIn { - void doSignIn(StateToken previousStateToken); + void doSignIn(); void hide(); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInAbstractPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInAbstractPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInAbstractPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -1,7 +1,6 @@ package org.ourproject.kune.workspace.client.signin; import org.ourproject.kune.platf.client.dto.I18nLanguageDTO; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.dto.UserInfoDTO; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; @@ -12,7 +11,6 @@ protected final Session session; protected final StateManager stateManager; protected final I18nUITranslationService i18n; - protected StateToken previousStateToken; protected SignInAbstractView view; public SignInAbstractPresenter(Session session, StateManager stateManager, I18nUITranslationService i18n) { @@ -29,14 +27,14 @@ view.reset(); view.hideMessages(); view.hide(); - stateManager.gotoToken(previousStateToken); + stateManager.restorePreviousToken(); } public void onClose() { view.reset(); view.hideMessages(); if (!session.isLogged()) { - stateManager.gotoToken(previousStateToken); + stateManager.restorePreviousToken(); } } @@ -49,6 +47,7 @@ final I18nLanguageDTO language = userInfoDTO.getLanguage(); i18n.changeCurrentLanguage(language.getCode()); session.setCurrentLanguage(language); + stateManager.restorePreviousToken(); } } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPresenter.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPresenter.java 2008-11-04 12:32:31 UTC (rev 938) @@ -1,7 +1,6 @@ package org.ourproject.kune.workspace.client.signin; import org.ourproject.kune.platf.client.View; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.dto.UserDTO; import org.ourproject.kune.platf.client.dto.UserInfoDTO; import org.ourproject.kune.platf.client.errors.UserAuthException; @@ -31,8 +30,7 @@ this.registerProvider = registerProvider; } - public void doSignIn(StateToken previousStateToken) { - this.previousStateToken = previousStateToken; + public void doSignIn() { registerProvider.get().hide(); if (!session.isLogged()) { Site.showProgressProcessing(); @@ -41,7 +39,7 @@ Site.hideProgress(); view.focusOnNickname(); } else { - stateManager.gotoToken(previousStateToken); + stateManager.restorePreviousToken(); } } @@ -88,7 +86,7 @@ public void onSuccess(final UserInfoDTO userInfoDTO) { onSignIn(userInfoDTO); - stateManager.gotoToken(previousStateToken); + stateManager.restorePreviousToken(); view.hide(); view.unMask(); } Modified: trunk/src/test/java/org/ourproject/kune/platf/client/state/StateManagerTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/client/state/StateManagerTest.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/test/java/org/ourproject/kune/platf/client/state/StateManagerTest.java 2008-11-04 12:32:31 UTC (rev 938) @@ -1,16 +1,21 @@ package org.ourproject.kune.platf.client.state; +import static org.junit.Assert.assertTrue; + import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.ourproject.kune.platf.client.app.HistoryWrapper; -import org.ourproject.kune.platf.client.dto.GroupDTO; import org.ourproject.kune.platf.client.dto.StateAbstractDTO; import org.ourproject.kune.platf.client.dto.StateToken; +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; +import org.ourproject.kune.workspace.client.site.Site; import org.ourproject.kune.workspace.client.site.SiteToken; +import org.ourproject.kune.workspace.client.sitebar.siteprogress.SiteProgress; -import com.calclab.suco.client.listener.Listener; -import com.calclab.suco.client.listener.Listener2; +import com.calclab.suco.testing.listener.MockListener; +import com.calclab.suco.testing.listener.MockListener0; +import com.calclab.suco.testing.listener.MockListener2; import com.google.gwt.user.client.rpc.AsyncCallback; public class StateManagerTest { @@ -20,29 +25,83 @@ private HistoryWrapper history; private ContentProvider contentProvider; private Session session; + private MockListener2<String, String> toolChangeListener; + private MockListener2<String, String> groupChangeListener; + private MockListener<StateAbstractDTO> stateChangeListener; + private StateAbstractDTO state; + private BeforeStateChangeListener beforeChangeListener1; + private BeforeStateChangeListener beforeChangeListener2; - @SuppressWarnings("unchecked") + @Before + public void before() { + contentProvider = Mockito.mock(ContentProvider.class); + session = Mockito.mock(Session.class); + history = Mockito.mock(HistoryWrapper.class); + stateManager = new StateManagerDefault(contentProvider, session, history); + Mockito.stub(session.getUserHash()).toReturn(HASH); + state = Mockito.mock(StateAbstractDTO.class); + stateChangeListener = new MockListener<StateAbstractDTO>(); + groupChangeListener = new MockListener2<String, String>(); + toolChangeListener = new MockListener2<String, String>(); + beforeChangeListener1 = Mockito.mock(BeforeStateChangeListener.class); + beforeChangeListener2 = Mockito.mock(BeforeStateChangeListener.class); + stateManager.onStateChanged(stateChangeListener); + stateManager.onGroupChanged(groupChangeListener); + stateManager.onToolChanged(toolChangeListener); + new Site(Mockito.mock(I18nUITranslationService.class), Mockito.mock(SiteProgress.class), null); + } + @Test + public void changeGroupWithNoTool() { + changeState("group1", "group2"); + assertTrue(groupChangeListener.isCalledWithEquals("", "group1", "group1", "group2")); + assertTrue(toolChangeListener.isCalledWithEquals("", "")); + assertTrue(groupChangeListener.isCalled(2)); + assertTrue(stateChangeListener.isCalled(2)); + } + + @Test + public void changeStateWithDifferentAndGroupsToolsMustFireListener() { + changeState("group2.tool1", "group1.tool2"); + assertTrue(stateChangeListener.isCalled(2)); + assertTrue(groupChangeListener.isCalledWithEquals("", "group2", "group2", "group1")); + assertTrue(toolChangeListener.isCalledWithEquals("", "tool1", "tool1", "tool2")); + } + + @Test public void changeStateWithDifferentGroupsMustFireListener() { - final Listener2<GroupDTO, GroupDTO> groupListener = Mockito.mock(Listener2.class); - stateManager.onGroupChanged(groupListener); - stateManager.onHistoryChanged("group1.tool1"); - stateManager.onHistoryChanged("group2.tool1"); - // TODO, think how to test this - // Mockito.verify(groupListener).onEvent("group1", "group2"); + changeState("group1.tool1", "group2.tool1"); + assertTrue(stateChangeListener.isCalled(2)); + assertTrue(groupChangeListener.isCalledWithEquals("", "group1", "group1", "group2")); + assertTrue(toolChangeListener.isCalledWithEquals("", "tool1")); } - @SuppressWarnings("unchecked") @Test public void changeStateWithDifferentToolsMustFireListener() { - final Listener2<String, String> toolListener = Mockito.mock(Listener2.class); - stateManager.onToolChanged(toolListener); - stateManager.gotoToken("group1.tool1"); - stateManager.gotoToken("group1.tool2"); - // TODO, think how to test this - // Mockito.verify(toolListener).onEvent("tool1", "tool2"); + changeState("group1.tool1", "group1.tool2"); + assertTrue(stateChangeListener.isCalled(2)); + assertTrue(toolChangeListener.isCalledWithEquals("", "tool1", "tool1", "tool2")); + assertTrue(groupChangeListener.isCalledWithEquals("", "group1")); } + @Test + public void changeToNoTool() { + changeState("group1.tool1", "group1"); + assertTrue(groupChangeListener.isCalledWithEquals("", "group1")); + assertTrue(toolChangeListener.isCalledWithEquals("", "tool1", "tool1", "")); + assertTrue(groupChangeListener.isCalledOnce()); + assertTrue(stateChangeListener.isCalled(2)); + } + + @Test + public void changeToSameToken() { + changeState("group1.tool1", "group1.tool1"); + assertTrue(groupChangeListener.isCalledWithEquals("", "group1")); + assertTrue(toolChangeListener.isCalledWithEquals("", "tool1")); + assertTrue(groupChangeListener.isCalledOnce()); + assertTrue(stateChangeListener.isCalled(2)); + } + @SuppressWarnings("unchecked") @Test public void getDefGroup() { @@ -51,15 +110,6 @@ (StateToken) Mockito.anyObject(), (AsyncCallback<StateAbstractDTO>) Mockito.anyObject()); } - @Before - public void init() { - contentProvider = Mockito.mock(ContentProvider.class); - session = Mockito.mock(Session.class); - history = Mockito.mock(HistoryWrapper.class); - stateManager = new StateManagerDefault(contentProvider, session, history); - Mockito.stub(session.getUserHash()).toReturn(HASH); - } - @SuppressWarnings("unchecked") @Test public void normalStartLoggedUser() { @@ -74,47 +124,44 @@ @SuppressWarnings("unchecked") @Test public void oneBeforeStateChangeListenerAddAndRemove() { - BeforeStateChangeListener listener1 = Mockito.mock(BeforeStateChangeListener.class); - BeforeStateChangeListener listener2 = Mockito.mock(BeforeStateChangeListener.class); - String newToken = "something"; - Mockito.stub(listener1.beforeChange(newToken)).toReturn(false); - Mockito.stub(listener2.beforeChange(newToken)).toReturn(false); - stateManager.addBeforeStateChangeListener(listener1); - stateManager.addBeforeStateChangeListener(listener2); - stateManager.removeBeforeStateChangeListener(listener1); - stateManager.removeBeforeStateChangeListener(listener2); + String newToken = confBeforeStateChangeListeners(false, false); stateManager.onHistoryChanged(newToken); + removeBeforeStateChangeListener(); + stateManager.onHistoryChanged(newToken); Mockito.verify(contentProvider, Mockito.times(1)).getContent(Mockito.anyString(), (StateToken) Mockito.anyObject(), (AsyncCallback<StateAbstractDTO>) Mockito.anyObject()); + } + @Test + public void oneBeforeStateChangeListenerFalseAndResume() { + String token = confBeforeStateChangeListeners(false, true); + stateManager.onHistoryChanged(token); + Mockito.verify(history, Mockito.never()).newItem(token); + removeBeforeStateChangeListener(); + stateManager.resumeTokenChange(); + Mockito.verify(history, Mockito.times(1)).newItem(token); } @SuppressWarnings("unchecked") @Test public void oneBeforeStateChangeListenerReturnFalse() { - BeforeStateChangeListener listener1 = Mockito.mock(BeforeStateChangeListener.class); - BeforeStateChangeListener listener2 = Mockito.mock(BeforeStateChangeListener.class); - String newToken = "something"; - Mockito.stub(listener1.beforeChange(newToken)).toReturn(true); - Mockito.stub(listener2.beforeChange(newToken)).toReturn(false); - stateManager.addBeforeStateChangeListener(listener1); - stateManager.addBeforeStateChangeListener(listener2); - stateManager.onHistoryChanged(newToken); + stateManager.onHistoryChanged(confBeforeStateChangeListeners(true, false)); Mockito.verify(contentProvider, Mockito.never()).getContent(Mockito.anyString(), (StateToken) Mockito.anyObject(), (AsyncCallback<StateAbstractDTO>) Mockito.anyObject()); } @SuppressWarnings("unchecked") @Test + public void oneBeforeStateChangeListenerReturnFalseWithTwo() { + stateManager.onHistoryChanged(confBeforeStateChangeListeners(false, false)); + Mockito.verify(contentProvider, Mockito.never()).getContent(Mockito.anyString(), + (StateToken) Mockito.anyObject(), (AsyncCallback<StateAbstractDTO>) Mockito.anyObject()); + } + + @SuppressWarnings("unchecked") + @Test public void oneBeforeStateChangeListenerReturnTrue() { - BeforeStateChangeListener listener1 = Mockito.mock(BeforeStateChangeListener.class); - BeforeStateChangeListener listener2 = Mockito.mock(BeforeStateChangeListener.class); - String newToken = "something"; - Mockito.stub(listener1.beforeChange(newToken)).toReturn(true); - Mockito.stub(listener2.beforeChange(newToken)).toReturn(true); - stateManager.addBeforeStateChangeListener(listener1); - stateManager.addBeforeStateChangeListener(listener2); - stateManager.onHistoryChanged(newToken); + stateManager.onHistoryChanged(confBeforeStateChangeListeners(true, true)); Mockito.verify(contentProvider, Mockito.times(1)).getContent(Mockito.anyString(), (StateToken) Mockito.anyObject(), (AsyncCallback<StateAbstractDTO>) Mockito.anyObject()); } @@ -122,13 +169,41 @@ @SuppressWarnings("unchecked") @Test public void siteTokenFirstLoadDefContentAndFireListener() { - final Listener listener = Mockito.mock(Listener.class); + final MockListener0 listener = new MockListener0(); final String token = SiteToken.signin.toString(); stateManager.addSiteToken(token, listener); stateManager.onHistoryChanged(token); - Mockito.verify(listener, Mockito.times(1)).onEvent(Mockito.anyObject()); + assertTrue(listener.isCalledOnce()); Mockito.verify(contentProvider, Mockito.times(1)).getContent(Mockito.anyString(), (StateToken) Mockito.anyObject(), (AsyncCallback<StateAbstractDTO>) Mockito.anyObject()); } + @Test + public void siteTokenTest() { + MockListener0 siteTokenListener = new MockListener0(); + stateManager.addSiteToken("signin", siteTokenListener); + stateManager.onHistoryChanged("signIn"); + siteTokenListener.isCalledOnce(); + } + + private void changeState(String... tokens) { + for (String token : tokens) { + Mockito.stub(state.getStateToken()).toReturn(new StateToken(token)); + stateManager.setState(state); + } + } + + private String confBeforeStateChangeListeners(boolean value, boolean value2) { + stateManager.addBeforeStateChangeListener(beforeChangeListener1); + stateManager.addBeforeStateChangeListener(beforeChangeListener2); + String newToken = "something"; + Mockito.stub(beforeChangeListener1.beforeChange(newToken)).toReturn(value); + Mockito.stub(beforeChangeListener2.beforeChange(newToken)).toReturn(value2); + return newToken; + } + + private void removeBeforeStateChangeListener() { + stateManager.removeBeforeStateChangeListener(beforeChangeListener1); + stateManager.removeBeforeStateChangeListener(beforeChangeListener2); + } } Modified: trunk/src/test/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenterTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenterTest.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/test/java/org/ourproject/kune/platf/client/tool/ToolSelectorPresenterTest.java 2008-11-04 12:32:31 UTC (rev 938) @@ -58,7 +58,7 @@ public void setStateFirstMustSelect() { setToolNames(); toolSelector.addTool(toolSelectorItem1); - toolSelector.onToolChanged(null, TOOL1_NAME); + toolSelector.onToolChanged("", TOOL1_NAME); Mockito.verify(toolSelectorItem1, Mockito.times(1)).setSelected(false); Mockito.verify(toolSelectorItem1, Mockito.times(1)).setSelected(true); } @@ -89,7 +89,7 @@ setToolNames(); toolSelector.addTool(toolSelectorItem1); toolSelector.addTool(toolSelectorItem2); - toolSelector.onToolChanged(TOOL1_NAME, null); + toolSelector.onToolChanged(TOOL1_NAME, ""); Mockito.verify(toolSelectorItem2, Mockito.times(1)).setSelected(false); Mockito.verify(toolSelectorItem1, Mockito.times(2)).setSelected(false); Mockito.verify(toolSelectorItem2, Mockito.never()).setSelected(true); Modified: trunk/src/test/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenterTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenterTest.java 2008-10-30 17:13:18 UTC (rev 937) +++ trunk/src/test/java/org/ourproject/kune/workspace/client/editor/TextEditorPresenterTest.java 2008-11-04 12:32:31 UTC (rev 938) @@ -38,7 +38,7 @@ @Test public void historyChangeWithoutPendingMustAccept() { presenter.editContent("Text to edit", saveListener, cancelListener); - boolean change = presenter.beforeTokenChange("somegroup"); + boolean change = presenter.beforeTokenChange(); assertTrue(change); Mockito.verify(view, Mockito.never()).showSaveBeforeDialog(); Mockito.verify(toolbar, Mockito.times(1)).detach(); @@ -46,19 +46,19 @@ @Test public void historyChangeWithPendingSaveAndCancelMustPosponeIt() { - String newToken = editAndChangeHistoryToken(); + editAndChangeHistoryToken(); presenter.onCancelConfirmed(); assertTrue(saveListener.isNotCalled()); - Mockito.verify(stateManager, Mockito.times(1)).gotoToken(newToken); + Mockito.verify(stateManager, Mockito.times(1)).resumeTokenChange(); } @Test public void historyChangeWithPendingSaveMustPosponeIt() { - String newToken = editAndChangeHistoryToken(); + editAndChangeHistoryToken(); presenter.onSaveAndClose(); presenter.onSaved(); assertTrue(saveListener.isCalledOnce()); - Mockito.verify(stateManager, Mockito.times(1)).gotoToken(newToken); + Mockito.verify(stateManager, Mockito.times(1)).resumeTokenChange(); } @Test @@ -118,7 +118,7 @@ presenter.editContent("Text to edit", saveListener, cancelListener); presenter.onEdit(); String newToken = "somegroup"; - boolean change = presenter.beforeTokenChange(newToken); + boolean change = presenter.beforeTokenChange(); assertFalse(change); Mockito.verify(view, Mockito.times(1)).showSaveBeforeDialog(); return newToken;