/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.core.client.sitebar.spaces;
import cc.kune.common.client.actions.AbstractExtendedAction;
import cc.kune.common.client.actions.ActionEvent;
import cc.kune.common.client.actions.Shortcut;
import cc.kune.common.client.log.Log;
import cc.kune.common.client.notify.NotifyLevel;
import cc.kune.common.client.shortcuts.GlobalShortcutRegister;
import cc.kune.common.client.ui.MaskWidgetView;
import cc.kune.common.shared.i18n.I18nTranslationService;
import cc.kune.core.client.auth.SignIn;
import cc.kune.core.client.events.AppStartEvent;
import cc.kune.core.client.events.AppStartEvent.AppStartHandler;
import cc.kune.core.client.events.UserSignInOrSignOutEvent;
import cc.kune.core.client.events.UserSignInOrSignOutEvent.UserSignInOrSignOutHandler;
import cc.kune.core.client.events.UserSignOutEvent;
import cc.kune.core.client.resources.CoreMessages;
import cc.kune.core.client.state.Session;
import cc.kune.core.client.state.SiteTokens;
import cc.kune.core.client.state.StateManager;
import cc.kune.core.client.state.TokenUtils;
import cc.kune.gspace.client.armor.GSpaceArmor;
import cc.kune.gspace.client.style.GSpaceBackgroundManager;
import cc.kune.polymer.client.PolymerUtils;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.Presenter;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit;
import com.gwtplatform.mvp.client.annotations.ProxyEvent;
import com.gwtplatform.mvp.client.proxy.Proxy;
import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent;
// TODO: Auto-generated Javadoc
/**
* The Class SpaceSelectorPresenter.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public class SpaceSelectorPresenter extends
Presenter<SpaceSelectorPresenter.SpaceSelectorView, SpaceSelectorPresenter.SpaceSelectorProxy> {
/**
* The Interface SpaceSelectorProxy.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
@ProxyCodeSplit
public interface SpaceSelectorProxy extends Proxy<SpaceSelectorPresenter> {
}
/**
* The Interface SpaceSelectorView.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public interface SpaceSelectorView extends View {
/** The group space id. */
public static String GROUP_SPACE_ID = "group_space_icon";
/** The home space id. */
public static String HOME_SPACE_ID = "home_space_icon";
/** The public space id. */
public static String PUBLIC_SPACE_ID = "public_space_icon";
/** The user space id. */
public static String USER_SPACE_ID = "user_space_icon";
/**
* Blink group btn.
*/
void blinkGroupBtn();
/**
* Blink home btn.
*/
void blinkHomeBtn();
/**
* Blink user btn.
*/
void blinkUserBtn();
/**
* Gets the group btn.
*
* @return the group btn
*/
HasClickHandlers getGroupBtn();
/**
* Gets the home btn.
*
* @return the home btn
*/
HasClickHandlers getHomeBtn();
/**
* Gets the user btn.
*
* @return the user btn
*/
HasClickHandlers getUserBtn();
/**
* Sets the group btn active.
*
* @param active
* the new group btn active
*/
void setGroupBtnActive(boolean active);
/**
* Sets the home btn active.
*
* @param active
* the new home btn active
*/
void setHomeBtnActive(boolean active);
void setNarrowSwipeEnabled(boolean enabled);
void setNarrowVisible(boolean visible);
/**
* Sets the user btn active.
*
* @param active
* the new user btn active
*/
void setUserBtnActive(boolean active);
/**
* Sets the window title.
*
* @param title
* the new window title
*/
void setWindowTitle(String title);
}
/** The armor. */
private final GSpaceArmor armor;
/** The back manager. */
private final GSpaceBackgroundManager backManager;
/** The current space. */
private Space currentSpace;
/** The group token. */
private String groupToken;
/** The home token. */
private String homeToken;
/** The i18n. */
private final I18nTranslationService i18n;
/** The inbox token. */
private String inboxToken;
/** The public token. */
private String publicToken;
/** The session. */
private final Session session;
/** The shortcut register. */
private final GlobalShortcutRegister shortcutRegister;
/** The sign in. */
private final Provider<SignIn> signIn;
/** The state manager. */
private final StateManager stateManager;
/**
* Instantiates a new space selector presenter.
*
* @param eventBus
* the event bus
* @param stateManager
* the state manager
* @param view
* the view
* @param proxy
* the proxy
* @param armor
* the armor
* @param session
* the session
* @param signIn
* the sign in
* @param backManager
* the back manager
* @param i18n
* the i18n
* @param mask
* the mask
* @param shortcutRegister
* the shortcut register
*/
@Inject
public SpaceSelectorPresenter(final EventBus eventBus, final StateManager stateManager,
final SpaceSelectorView view, final SpaceSelectorProxy proxy, final GSpaceArmor armor,
final Session session, final Provider<SignIn> signIn, final GSpaceBackgroundManager backManager,
final I18nTranslationService i18n, final MaskWidgetView mask,
final GlobalShortcutRegister shortcutRegister) {
super(eventBus, view, proxy);
this.stateManager = stateManager;
this.armor = armor;
this.session = session;
this.signIn = signIn;
this.backManager = backManager;
this.i18n = i18n;
this.shortcutRegister = shortcutRegister;
currentSpace = null;
homeToken = SiteTokens.HOME;
inboxToken = SiteTokens.WAVE_INBOX;
groupToken = SiteTokens.GROUP_HOME;
publicToken = TokenUtils.preview(SiteTokens.GROUP_HOME);
configureClickListeners();
configureShortcuts();
// eventBus.addHandler(WindowFocusEvent.getType(), new
// WindowFocusEvent.WindowFocusHandler() {
// @Override
// public void onWindowFocus(final WindowFocusEvent event) {
// if (event.isHasFocus() && !mask.isShowing()) {
// // showTooltipWithDelay();
// }
// }
// });
session.onAppStart(true, new AppStartHandler() {
@Override
public void onAppStart(final AppStartEvent event) {
// getView().setPublicVisible(event.getInitData().isPublicSpaceVisible());
}
});
session.onUserSignInOrSignOut(true, new UserSignInOrSignOutHandler() {
@Override
public void onUserSignInOrSignOut(final UserSignInOrSignOutEvent event) {
confDrawer(currentSpace, session.isLogged());
}
});
}
private void confDrawer(final Space space, final boolean logged) {
getView().setNarrowVisible(NarrowManager.shouldNarrowBeVisible(logged, space));
getView().setNarrowSwipeEnabled(NarrowManager.shouldNarrowSwipeBeEnabled(logged, space));
}
/**
* Configure click listeners.
*/
private void configureClickListeners() {
getView().getHomeBtn().addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
onHomeBtnClick();
}
});
getView().getUserBtn().addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
onUserBtnClick();
}
});
getView().getGroupBtn().addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
onGroupBtnClick();
}
});
}
/**
* Configure shortcuts.
*/
private void configureShortcuts() {
shortcutRegister.put(Shortcut.getShortcut("Alt+H"), new AbstractExtendedAction() {
@Override
public void actionPerformed(final ActionEvent event) {
onHomeBtnClick();
}
});
shortcutRegister.put(Shortcut.getShortcut("Alt+I"), new AbstractExtendedAction() {
@Override
public void actionPerformed(final ActionEvent event) {
onUserBtnClick();
}
});
shortcutRegister.put(Shortcut.getShortcut("Alt+G"), new AbstractExtendedAction() {
@Override
public void actionPerformed(final ActionEvent event) {
onGroupBtnClick();
}
});
// shortcutRegister.put(Shortcut.getShortcut("Alt+P"), new
// AbstractExtendedAction() {
// @Override
// public void actionPerformed(final ActionEvent event) {
// onPublicBtnClick();
// }
// });
}
/**
* On group btn click.
*/
private void onGroupBtnClick() {
// PolymerUtils.hideInboxWithDelay();
if (groupToken.equals(SiteTokens.GROUP_HOME)) {
// as current home is equal to "no content" token, we shall go to
// group space def home page
stateManager.gotoDefaultHomepage();
} else {
restoreToken(groupToken);
}
}
/**
* On group space select.
*
* @param shouldRestoreToken
* the should restore token
*/
private void onGroupSpaceSelect(final boolean shouldRestoreToken) {
restoreToken(shouldRestoreToken, groupToken);
armor.selectGroupSpace();
backManager.restoreBackgroundImage();
setActive(Space.groupSpace);
currentSpace = Space.groupSpace;
}
/**
* On home btn click.
*/
private void onHomeBtnClick() {
restoreToken(homeToken);
}
/**
* On home space select.
*
* @param shouldRestoreToken
* the should restore token
*/
private void onHomeSpaceSelect(final boolean shouldRestoreToken) {
restoreToken(shouldRestoreToken, homeToken);
armor.selectHomeSpace();
backManager.clearBackgroundImage();
setActive(Space.homeSpace);
currentSpace = Space.homeSpace;
getView().setWindowTitle(i18n.t("Home"));
}
/**
* On public btn click.
*/
@SuppressWarnings("unused")
private void onPublicBtnClick() {
restoreToken(publicToken);
}
/**
* On public space select.
*
* @param shouldRestoreToken
* the should restore token
*/
private void onPublicSpaceSelect(final boolean shouldRestoreToken) {
restoreToken(shouldRestoreToken, inboxToken);
armor.selectPublicSpace();
backManager.restoreBackgroundImage();
setActive(Space.publicSpace);
currentSpace = Space.publicSpace;
}
/**
* On space conf.
*
* @param event
* the event
*/
@ProxyEvent
public void onSpaceConf(final SpaceConfEvent event) {
final Space space = event.getSpace();
final String token = event.getToken();
switch (space) {
case homeSpace:
homeToken = token;
break;
case userSpace:
inboxToken = token;
break;
case groupSpace:
groupToken = token;
break;
case publicSpace:
publicToken = token;
break;
}
}
/**
* On space select.
*
* @param event
* the event
*/
@ProxyEvent
public void onSpaceSelect(final SpaceSelectEvent event) {
final Space space = event.getSpace();
final boolean isFirstBoot = currentSpace == null;
if (space != currentSpace) {
final boolean restoreToken = event.shouldRestoreToken();
switch (space) {
case homeSpace:
onHomeSpaceSelect(restoreToken);
break;
case userSpace:
onUserSpaceSelect(restoreToken);
break;
case groupSpace:
onGroupSpaceSelect(restoreToken);
break;
case publicSpace:
onPublicSpaceSelect(restoreToken);
break;
default:
break;
}
if (isFirstBoot && space == Space.groupSpace) {
// At boot, we prefer to not show the Inbox
confDrawer(null, session.isLogged());
} else {
confDrawer(space, session.isLogged());
}
}
}
/**
* On user btn click.
*/
private void onUserBtnClick() {
// PolymerUtils.hideInboxCancel();
signIn.get().setGotoTokenOnCancel(stateManager.getCurrentToken());
restoreToken(inboxToken);
if (session.isLogged()) {
// setActive(Space.userSpace);
}
}
/**
* On user sign out.
*
* @param event
* the event
*/
@ProxyEvent
public void onUserSignOut(final UserSignOutEvent event) {
if (currentSpace == Space.userSpace) {
restoreToken(homeToken);
}
inboxToken = SiteTokens.WAVE_INBOX;
}
/**
* On user space select.
*
* @param shouldRestoreToken
* the should restore token
*/
private void onUserSpaceSelect(final boolean shouldRestoreToken) {
// PolymerUtils.hideInboxCancel();
if (session.isLogged()) {
restoreToken(shouldRestoreToken, inboxToken);
armor.selectUserSpace();
backManager.clearBackgroundImage();
setActive(Space.userSpace);
currentSpace = Space.userSpace;
getView().setWindowTitle(i18n.t("Inbox"));
// Show inbox if xsmall
if (PolymerUtils.isXSmall() && PolymerUtils.getMainSelected().equals("main")) {
PolymerUtils.setDrawerSelected();
}
} else {
signIn.get().setErrorMessage(i18n.t(CoreMessages.SIGN_IN_TO_ACCESS_INBOX), NotifyLevel.info);
stateManager.gotoHistoryToken(TokenUtils.addRedirect(SiteTokens.SIGN_IN, inboxToken));
getView().setUserBtnActive(false);
}
}
/**
* Restore token.
*
* @param shouldRestoreToken
* the should restore token
* @param token
* the token
*/
private void restoreToken(final boolean shouldRestoreToken, final String token) {
if (shouldRestoreToken) {
restoreToken(token);
}
}
/**
* Restore token.
*
* @param token
* the token
*/
private void restoreToken(final String token) {
Log.info("Restoring token from SpaceSelector: " + token);
stateManager.gotoHistoryToken(token);
}
/*
* (non-Javadoc)
*
* @see com.gwtplatform.mvp.client.Presenter#revealInParent()
*/
@Override
protected void revealInParent() {
RevealRootContentEvent.fire(this, this);
}
/**
* Sets the space active.
*
* @param space
* the new active space
*/
private void setActive(final Space space) {
switch (space) {
case homeSpace:
default:
getView().setHomeBtnActive(true);
break;
case userSpace:
getView().setUserBtnActive(true);
break;
case groupSpace:
getView().setGroupBtnActive(true);
break;
}
}
}