Author: vjrj Date: 2008-09-08 03:13:19 +0200 (Mon, 08 Sep 2008) New Revision: 861 Added: trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/ trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogo.java trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoView.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterForm.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignIn.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInForm.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInView.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/AbstractBar.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Entity.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntitySummary.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntityWorkspace.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/SiteBar.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/TitleBar.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/WorkspaceSkeleton.java trunk/src/main/java/org/ourproject/kune/workspace/client/themes/ trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsTheme.java trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemeView.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitleView.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitleView.java Log: Refactorization Added: trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogo.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogo.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogo.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,6 @@ +package org.ourproject.kune.workspace.client.entitylogo; + + +public interface EntityLogo { + +} \ No newline at end of file Added: trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPanel.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPanel.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,123 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.entitylogo; + +import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; +import org.ourproject.kune.workspace.client.themes.WsTheme; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Hyperlink; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.VerticalPanel; + +public class EntityLogoPanel extends SimplePanel implements EntityLogoView { + class EntityTextLogo extends VerticalPanel { + + private static final int GROUP_NAME_LIMIT_SIZE = 90; + private static final String LOGO_SMALL_FONT_SIZE = "108%"; + private static final String LOGO_DEFAULT_FONT_SIZE = "167%"; + private final Label defTextLogoLabel; + private final Hyperlink defTextPutYourLogoHL; + private final HorizontalPanel putYourLogoHP; + + public EntityTextLogo() { + // Initialize + super(); + defTextLogoLabel = new Label(); + final HTML expandCell = new HTML("<b></b>"); + putYourLogoHP = new HorizontalPanel(); + defTextPutYourLogoHL = new Hyperlink(); + + // Layout + add(defTextLogoLabel); + add(putYourLogoHP); + putYourLogoHP.add(expandCell); + putYourLogoHP.add(defTextPutYourLogoHL); + + // Set properties + // TODO: Put your logo here functionality + defTextPutYourLogoHL.setText(i18n.t("Put Your Logo Here")); + expandCell.setWidth("100%"); + putYourLogoHP.setCellWidth(expandCell, "100%"); + // TODO: link to configure the logo + setStylePrimaryName("k-entitytextlogo"); + setDefaultText(""); + } + + public void setDefaultText(final String text) { + if (text.length() > GROUP_NAME_LIMIT_SIZE) { + DOM.setStyleAttribute(defTextLogoLabel.getElement(), "fontSize", LOGO_SMALL_FONT_SIZE); + } else { + DOM.setStyleAttribute(defTextLogoLabel.getElement(), "fontSize", LOGO_DEFAULT_FONT_SIZE); + } + defTextLogoLabel.setText(text); + + } + + public void setPutYourLogoVisible(final boolean visible) { + putYourLogoHP.setVisible(visible); + } + + } + + private EntityTextLogo entityTextLogo; + private final I18nTranslationService i18n; + + public EntityLogoPanel(final I18nTranslationService i18n, final WorkspaceSkeleton ws) { + this.i18n = i18n; + ws.addToEntityMainHeader(this); + } + + public void setLogo(final Image image) { + clear(); + add(image); + } + + public void setLogo(final String groupName) { + clear(); + add(getEntityTextLogo()); + entityTextLogo.setDefaultText(groupName); + } + + public void setPutYourLogoVisible(final boolean visible) { + getEntityTextLogo().setPutYourLogoVisible(visible); + } + + public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) { + if (oldTheme != null) { + getEntityTextLogo().removeStyleDependentName(oldTheme.toString()); + } + getEntityTextLogo().addStyleDependentName(newTheme.toString()); + } + + private EntityTextLogo getEntityTextLogo() { + if (entityTextLogo == null) { + this.entityTextLogo = new EntityTextLogo(); + } + return entityTextLogo; + } + +} Added: 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-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoPresenter.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,37 @@ +package org.ourproject.kune.workspace.client.entitylogo; + +import org.ourproject.kune.platf.client.dto.GroupDTO; +import org.ourproject.kune.platf.client.dto.StateDTO; +import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.workspace.client.themes.WsTheme; +import org.ourproject.kune.workspace.client.themes.WsThemePresenter; + +import com.calclab.suco.client.signal.Slot; +import com.calclab.suco.client.signal.Slot2; + +public class EntityLogoPresenter implements EntityLogo { + private EntityLogoView view; + + public EntityLogoPresenter(final StateManager stateManager, final WsThemePresenter theme) { + stateManager.onStateChanged(new Slot<StateDTO>() { + public void onEvent(final StateDTO state) { + final GroupDTO group = state.getGroup(); + final boolean isAdmin = state.getGroupRights().isAdministrable(); + + view.setLogo(group.getLongName()); + view.setPutYourLogoVisible(isAdmin); + } + }); + theme.onThemeChanged(new Slot2<WsTheme, WsTheme>() { + public void onEvent(final WsTheme oldTheme, final WsTheme newTheme) { + view.setTheme(oldTheme, newTheme); + } + }); + } + + public void init(final EntityLogoView view) { + this.view = view; + + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoView.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/entitylogo/EntityLogoView.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,17 @@ +package org.ourproject.kune.workspace.client.entitylogo; + +import org.ourproject.kune.workspace.client.themes.WsTheme; + +import com.google.gwt.user.client.ui.Image; + +public interface EntityLogoView { + + // FIXME: Don' use Image + public abstract void setLogo(final Image image); + + public abstract void setLogo(final String groupName); + + public abstract void setPutYourLogoVisible(final boolean visible); + + public abstract void setTheme(final WsTheme oldTheme, WsTheme newTheme); +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterForm.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterForm.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/RegisterForm.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,206 @@ +package org.ourproject.kune.workspace.client.signin; + +import org.ourproject.kune.platf.client.ui.dialogs.DefaultForm; +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; + +import com.gwtext.client.data.SimpleStore; +import com.gwtext.client.data.Store; +import com.gwtext.client.widgets.form.ComboBox; +import com.gwtext.client.widgets.form.TextField; +import com.gwtext.client.widgets.form.VType; +import com.gwtext.client.widgets.form.ValidationException; +import com.gwtext.client.widgets.form.Validator; + +public class RegisterForm extends DefaultForm { + + private static final String MUST_BE_BETWEEN_3_AND_15 = "Must be between 3 and 15 lowercase characters. Can only contain characters, numbers, and dashes"; + + private static final String NICK_FIELD = "nick"; + private static final String EMAIL_FIELD = "email"; + private static final String LONGNAME_FIELD = "long_name"; + private static final String PASSWORD_FIELD = "password"; + private static final String PASSWORD_FIELD_DUP = "passwordDup"; + private static final String LANG_FIELD = "lang"; + private static final String COUNTRY_FIELD = "country"; + private static final String TIMEZONE_FIELD = "timezone"; + + private final TextField shortNameRegField; + private final TextField longNameRegField; + private final TextField passwdRegField; + private final TextField passwdRegFieldDup; + private final TextField emailRegField; + private final ComboBox languageCombo; + private final ComboBox countryCombo; + private final ComboBox timezoneCombo; + + public RegisterForm(final SignInPresenter presenter, final I18nUITranslationService i18n) { + super.addStyleName("kune-Margin-Large-l"); + + shortNameRegField = new TextField(); + shortNameRegField.setFieldLabel(i18n.t("Nickname")); + shortNameRegField.setName(NICK_FIELD); + shortNameRegField.setWidth(DEF_FIELD_WIDTH); + shortNameRegField.setAllowBlank(false); + shortNameRegField.setMinLength(3); + shortNameRegField.setMaxLength(15); + shortNameRegField.setRegex("^[a-z0-9_\\-]+$"); + shortNameRegField.setMinLengthText(i18n.t(MUST_BE_BETWEEN_3_AND_15)); + shortNameRegField.setMaxLengthText(i18n.t(MUST_BE_BETWEEN_3_AND_15)); + shortNameRegField.setRegexText(i18n.t(MUST_BE_BETWEEN_3_AND_15)); + shortNameRegField.setValidationEvent(false); + add(shortNameRegField); + + longNameRegField = new TextField(); + longNameRegField.setFieldLabel(i18n.t("Full Name")); + longNameRegField.setName(LONGNAME_FIELD); + longNameRegField.setWidth(DEF_FIELD_WIDTH); + longNameRegField.setAllowBlank(false); + longNameRegField.setMinLength(3); + longNameRegField.setMaxLength(50); + longNameRegField.setValidationEvent(false); + add(longNameRegField); + + passwdRegField = new TextField(); + passwdRegField.setFieldLabel(i18n.t("Password")); + passwdRegField.setName(PASSWORD_FIELD); + passwdRegField.setPassword(true); + passwdRegField.setAllowBlank(false); + passwdRegField.setMaxLength(40); + passwdRegField.setWidth(DEF_FIELD_WIDTH); + passwdRegField.setValidationEvent(false); + add(passwdRegField); + + passwdRegFieldDup = new TextField(); + passwdRegFieldDup.setFieldLabel(i18n.t("Retype password")); + passwdRegFieldDup.setName(PASSWORD_FIELD_DUP); + passwdRegFieldDup.setPassword(true); + passwdRegFieldDup.setAllowBlank(false); + passwdRegFieldDup.setMinLength(6); + passwdRegFieldDup.setMaxLength(40); + passwdRegFieldDup.setWidth(DEF_FIELD_WIDTH); + passwdRegFieldDup.setInvalidText(i18n.t("Passwords do not match")); + passwdRegFieldDup.setValidator(new Validator() { + public boolean validate(final String value) throws ValidationException { + return passwdRegField.getValueAsString().equals(passwdRegFieldDup.getValueAsString()); + } + }); + passwdRegFieldDup.setValidationEvent(false); + add(passwdRegFieldDup); + + emailRegField = new TextField(); + emailRegField.setFieldLabel(i18n.t("Email")); + emailRegField.setName(EMAIL_FIELD); + emailRegField.setVtype(VType.EMAIL); + emailRegField.setWidth(DEF_FIELD_WIDTH); + emailRegField.setAllowBlank(false); + emailRegField.setValidationEvent(false); + + add(emailRegField); + + final Store langStore = new SimpleStore(new String[] { "abbr", "language" }, presenter.getLanguages()); + langStore.load(); + + languageCombo = new ComboBox(); + languageCombo.setName(LANG_FIELD); + languageCombo.setMinChars(1); + languageCombo.setFieldLabel(i18n.t("Language")); + languageCombo.setStore(langStore); + languageCombo.setDisplayField("language"); + languageCombo.setMode(ComboBox.LOCAL); + languageCombo.setTriggerAction(ComboBox.ALL); + languageCombo.setEmptyText(i18n.t("Enter language")); + languageCombo.setLoadingText(i18n.t("Searching...")); + languageCombo.setTypeAhead(true); + languageCombo.setTypeAheadDelay(1000); + languageCombo.setSelectOnFocus(false); + languageCombo.setWidth(186); + languageCombo.setAllowBlank(false); + languageCombo.setValueField("abbr"); + languageCombo.setValue(presenter.getCurrentLanguage().getCode()); + languageCombo.setPageSize(7); + languageCombo.setForceSelection(true); + languageCombo.setValidationEvent(false); + add(languageCombo); + + final Store countryStore = new SimpleStore(new String[] { "abbr", "country" }, presenter.getCountries()); + countryStore.load(); + + countryCombo = new ComboBox(); + countryCombo.setName(COUNTRY_FIELD); + countryCombo.setMinChars(1); + countryCombo.setFieldLabel(i18n.t("Country")); + countryCombo.setStore(countryStore); + countryCombo.setDisplayField("country"); + countryCombo.setMode(ComboBox.LOCAL); + countryCombo.setTriggerAction(ComboBox.ALL); + countryCombo.setEmptyText(i18n.t("Enter your country")); + countryCombo.setLoadingText(i18n.t("Searching...")); + countryCombo.setTypeAhead(true); + countryCombo.setTypeAheadDelay(1000); + countryCombo.setSelectOnFocus(false); + countryCombo.setWidth(186); + countryCombo.setAllowBlank(false); + countryCombo.setValueField("abbr"); + countryCombo.setPageSize(7); + countryCombo.setForceSelection(true); + countryCombo.setValidationEvent(false); + add(countryCombo); + + final Store timezoneStore = new SimpleStore(new String[] { "id" }, presenter.getTimezones()); + timezoneStore.load(); + + timezoneCombo = new ComboBox(); + timezoneCombo.setName(TIMEZONE_FIELD); + timezoneCombo.setMinChars(1); + timezoneCombo.setFieldLabel(i18n.t("Timezone")); + timezoneCombo.setStore(timezoneStore); + timezoneCombo.setDisplayField("id"); + timezoneCombo.setMode(ComboBox.LOCAL); + timezoneCombo.setTriggerAction(ComboBox.ALL); + timezoneCombo.setEmptyText(i18n.t("Enter your timezone")); + timezoneCombo.setLoadingText(i18n.t("Searching...")); + timezoneCombo.setTypeAhead(true); + timezoneCombo.setTypeAheadDelay(1000); + timezoneCombo.setSelectOnFocus(false); + timezoneCombo.setWidth(186); + timezoneCombo.setAllowBlank(false); + timezoneCombo.setValueField("id"); + timezoneCombo.setPageSize(7); + timezoneCombo.setForceSelection(true); + timezoneCombo.setValidationEvent(false); + add(timezoneCombo); + } + + public String getCountry() { + return countryCombo.getValueAsString(); + } + + public String getEmail() { + return emailRegField.getValueAsString(); + } + + public String getLanguage() { + return languageCombo.getValueAsString(); + } + + public String getLongName() { + return longNameRegField.getValueAsString(); + } + + public String getRegisterPassword() { + return passwdRegField.getValueAsString(); + } + + public String getRegisterPasswordDup() { + return passwdRegFieldDup.getValueAsString(); + } + + public String getShortName() { + return shortNameRegField.getValueAsString(); + } + + public String getTimezone() { + return timezoneCombo.getValueAsString(); + } + +} Added: 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-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignIn.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,28 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.signin; + +import org.ourproject.kune.platf.client.dto.StateToken; + +public interface SignIn { + + void doSignIn(StateToken previousStateToken); + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInForm.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInForm.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInForm.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,48 @@ +package org.ourproject.kune.workspace.client.signin; + +import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.platf.client.ui.dialogs.DefaultForm; + +import com.gwtext.client.widgets.form.TextField; + +public class SignInForm extends DefaultForm { + private static final String NICKOREMAIL_FIELD = "nickOrEmail"; + private static final String PASSWORD_FIELD = "password"; + + private final TextField loginNickOrEmailField; + private final TextField loginPassField; + + public SignInForm(final I18nTranslationService i18n) { + super.addStyleName("kune-Margin-Large-trbl"); + + loginNickOrEmailField = new TextField(); + loginNickOrEmailField.setFieldLabel(i18n.t("Nickname or email")); + loginNickOrEmailField.setName(NICKOREMAIL_FIELD); + loginNickOrEmailField.setWidth(DEF_FIELD_WIDTH); + loginNickOrEmailField.setAllowBlank(false); + loginNickOrEmailField.setValidationEvent(false); + super.add(loginNickOrEmailField); + + loginPassField = new TextField(); + loginPassField.setFieldLabel(i18n.t("Password")); + loginPassField.setName(PASSWORD_FIELD); + loginPassField.setWidth(DEF_FIELD_WIDTH); + loginPassField.setPassword(true); + loginPassField.setAllowBlank(false); + loginPassField.setValidationEvent(false); + super.add(loginPassField); + } + + public void focusLogin() { + loginNickOrEmailField.focus(); + } + + public String getLoginPassword() { + return loginPassField.getValueAsString(); + } + + public String getNickOrEmail() { + return loginNickOrEmailField.getValueAsString(); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPanel.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPanel.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,357 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.signin; + +import java.util.Date; + +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.platf.client.ui.dialogs.BasicDialog; +import org.ourproject.kune.platf.client.ui.dialogs.InfoDialog; +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; +import org.ourproject.kune.workspace.client.newgroup.SiteErrorType; +import org.ourproject.kune.workspace.client.site.Site; +import org.ourproject.kune.workspace.client.site.msg.SimpleMessagePanel; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Cookies; +import com.google.gwt.user.client.DeferredCommand; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.core.EventObject; +import com.gwtext.client.core.RegionPosition; +import com.gwtext.client.widgets.Button; +import com.gwtext.client.widgets.Component; +import com.gwtext.client.widgets.Panel; +import com.gwtext.client.widgets.TabPanel; +import com.gwtext.client.widgets.event.ButtonListenerAdapter; +import com.gwtext.client.widgets.event.PanelListenerAdapter; +import com.gwtext.client.widgets.event.WindowListenerAdapter; +import com.gwtext.client.widgets.form.Field; +import com.gwtext.client.widgets.layout.BorderLayout; +import com.gwtext.client.widgets.layout.BorderLayoutData; +import com.gwtext.client.widgets.layout.FitLayout; + +public class SignInPanel implements SignInView { + private class MessagePanel extends Panel { + private final SimpleMessagePanel messagesPanel; + + public MessagePanel() { + setPaddings(10); + setBorder(false); + setHeight(60); + messagesPanel = new SimpleMessagePanel(); + messagesPanel.setMessage("", SiteErrorType.info, SiteErrorType.error); + add(messagesPanel); + } + + public void hide() { + messagesPanel.hide(); + super.hide(); + } + + public void setMessage(final String message, final SiteErrorType lastMessageType, final SiteErrorType type) { + messagesPanel.setMessage(message, lastMessageType, type); + } + + public void show() { + messagesPanel.show(); + super.show(); + } + } + + private BasicDialog dialog; + private final SignInPresenter presenter; + private SignInForm signInForm; + private RegisterForm registerForm; + private MessagePanel messagesSignInPanel; + private InfoDialog welcomeDialog; + private TabPanel centerPanel; + private MessagePanel messagesRegisterPanel; + private final I18nUITranslationService i18n; + + public SignInPanel(final SignInPresenter presenter, final I18nUITranslationService i18n, final WorkspaceSkeleton ws) { + this.i18n = i18n; + Field.setMsgTarget("side"); + this.presenter = presenter; + createPanel(); + } + + public void center() { + dialog.center(); + } + + public String getCountry() { + return registerForm.getCountry(); + } + + public String getEmail() { + return registerForm.getEmail(); + } + + public String getLanguage() { + return registerForm.getLanguage(); + } + + public String getLoginPassword() { + return signInForm.getLoginPassword(); + } + + public String getLongName() { + return registerForm.getLongName(); + } + + public String getNickOrEmail() { + return signInForm.getNickOrEmail(); + } + + public String getRegisterPassword() { + return registerForm.getRegisterPassword(); + } + + public String getRegisterPasswordDup() { + return registerForm.getRegisterPasswordDup(); + } + + public String getShortName() { + return registerForm.getShortName(); + } + + public String getTimezone() { + return registerForm.getTimezone(); + } + + public void hide() { + dialog.hide(); + } + + public void hideMessages() { + messagesSignInPanel.hide(); + if (messagesRegisterPanel != null) { + messagesRegisterPanel.hide(); + } + renderDialogIfNeeded(); + } + + public boolean isRegisterFormValid() { + return registerForm.isValid(); + } + + public boolean isSignInFormValid() { + return signInForm.isValid(); + } + + public void mask(final String message) { + dialog.getEl().mask(message, "x-mask-loading"); + } + + public void maskProcessing() { + mask(i18n.t("Processing")); + } + + public void reset() { + DeferredCommand.addCommand(new Command() { + public void execute() { + signInForm.reset(); + if (registerForm != null) { + registerForm.reset(); + } + } + }); + } + + public void setCookie(final String userHash) { + // http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ + final long duration = Session.SESSION_DURATION; + final Date expires = new Date(System.currentTimeMillis() + duration); + Cookies.setCookie(Site.USERHASH, userHash, expires, null, "/", false); + GWT.log("Received hash: " + userHash, null); + } + + public void setRegisterMessage(final String message, final SiteErrorType type) { + messagesRegisterPanel.setMessage(message, type, type); + messagesRegisterPanel.show(); + renderDialogIfNeeded(); + } + + public void setSignInMessage(final String message, final SiteErrorType type) { + messagesSignInPanel.setMessage(message, type, type); + messagesSignInPanel.show(); + renderDialogIfNeeded(); + } + + public void show() { + centerPanel.activate(0); + dialog.setVisible(true); + dialog.show(); + Site.hideProgress(); + dialog.focus(); + signInForm.focusLogin(); + } + + public void showWelcolmeDialog() { + if (welcomeDialog == null) { + 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. " + + "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"), true, true, 400, 270); + } + welcomeDialog.show(); + } + + public void unMask() { + dialog.getEl().unmask(); + } + + private void confPanel(final Panel panel) { + // panel.setLayout(new FormLayout()); + // panel.setAutoWidth(true); + // anel.setAutoHeight(true); + } + + private Panel createNoAccountRegister() { + final Panel noAccRegisterPanel = new Panel(); + noAccRegisterPanel.setBorder(false); + noAccRegisterPanel.setMargins(0, 90, 0, 0); + final Label dontHaveAccountLabel = new Label(i18n.t("Don't have an account?")); + final Label registerLabel = new Label(i18n.t("Create one.")); + registerLabel.addClickListener(new ClickListener() { + public void onClick(final Widget arg0) { + centerPanel.activate(1); + } + }); + registerLabel.addStyleName("kune-Margin-Medium-l"); + registerLabel.addStyleName("kune-link"); + noAccRegisterPanel.add(dontHaveAccountLabel); + noAccRegisterPanel.add(registerLabel); + return noAccRegisterPanel; + } + + private void createPanel() { + dialog = new BasicDialog(i18n.t("Sign in"), true, false, 370, 400); + dialog.setLayout(new FitLayout()); + final Panel dialogPanel = new Panel(); + dialogPanel.setLayout(new BorderLayout()); + // dialog.setAutoHeight(false); + // dialog.setAutoWidth(false); + // dialog.setAutoHeight(true); + // dialog.setAutoWidth(true); + dialogPanel.setHeight("100%"); + dialogPanel.setWidth("auto"); + // dialog.setCollapsible(false); + + centerPanel = new TabPanel(); + centerPanel.setActiveTab(0); + // centerPanel.setAutoWidth(true); + // centerPanel.setAutoHeight(true); + centerPanel.setClosable(false); + + final Panel signInPanel = new Panel(i18n.t("Sign in")); + confPanel(signInPanel); + signInForm = new SignInForm(i18n); + signInPanel.add(signInForm.getForm()); + signInPanel.add(createNoAccountRegister()); + messagesSignInPanel = new MessagePanel(); + signInPanel.add(messagesSignInPanel); + + final Panel registerPanel = new Panel(i18n.t("Register")); + confPanel(registerPanel); + + centerPanel.add(signInPanel); + centerPanel.add(registerPanel); + dialogPanel.add(centerPanel, new BorderLayoutData(RegionPosition.CENTER)); + dialog.add(dialogPanel); + + final Button signInBtn = new Button(i18n.t("Sign in")); + signInBtn.addListener(new ButtonListenerAdapter() { + public void onClick(final Button button, final EventObject e) { + signInForm.validate(); + if (signInForm.isValid()) { + presenter.onFormSignIn(); + } + } + }); + dialog.addButton(signInBtn); + + final Button registerBtn = new Button(i18n.t("Register")); + registerBtn.addListener(new ButtonListenerAdapter() { + public void onClick(final Button button, final EventObject e) { + registerForm.validate(); + if (registerForm.isValid()) { + presenter.onFormRegister(); + } + } + }); + dialog.addButton(registerBtn); + registerBtn.hide(); + + final Button cancel = new Button(); + dialog.addButton(cancel); + cancel.setText(i18n.tWithNT("Cancel", "used in button")); + cancel.addListener(new ButtonListenerAdapter() { + public void onClick(final Button button, final EventObject e) { + presenter.onCancel(); + } + }); + + signInPanel.addListener(new PanelListenerAdapter() { + public void onActivate(final Panel panel) { + dialog.setTitle(i18n.t("Sign in")); + registerBtn.hide(); + signInBtn.show(); + } + }); + + registerPanel.addListener(new PanelListenerAdapter() { + public void onActivate(final Panel panel) { + if (registerForm == null) { + maskProcessing(); + registerForm = new RegisterForm(presenter, i18n); + registerPanel.add(registerForm.getForm()); + messagesRegisterPanel = new MessagePanel(); + registerPanel.add(messagesRegisterPanel); + messagesRegisterPanel.hide(); + renderDialogIfNeeded(); + unMask(); + } + dialog.setTitle(i18n.t("Register")); + signInBtn.hide(); + registerBtn.show(); + } + }); + + dialog.addListener(new WindowListenerAdapter() { + public void onHide(final Component component) { + presenter.onClose(); + } + }); + hideMessages(); + renderDialogIfNeeded(); + } + + private void renderDialogIfNeeded() { + if (dialog.isRendered()) { + dialog.doLayout(); + } + } +} Added: 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-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInPresenter.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,208 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.signin; + +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; +import org.ourproject.kune.platf.client.errors.EmailAddressInUseException; +import org.ourproject.kune.platf.client.errors.GroupNameInUseException; +import org.ourproject.kune.platf.client.errors.UserAuthException; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; +import org.ourproject.kune.workspace.client.newgroup.SiteErrorType; +import org.ourproject.kune.workspace.client.site.Site; +import org.ourproject.kune.workspace.client.site.rpc.UserServiceAsync; + +import com.calclab.emite.client.im.roster.RosterManager.SubscriptionMode; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class SignInPresenter implements SignIn { + + SignInView view; + private final Session session; + private final I18nUITranslationService i18n; + private final UserServiceAsync userService; + private final StateManager stateManager; + private StateToken previousStateToken; + + public SignInPresenter(final Session session, final StateManager stateManager, final I18nUITranslationService i18n, + final UserServiceAsync userService) { + this.session = session; + this.stateManager = stateManager; + this.userService = userService; + this.i18n = i18n; + } + + public void doSignIn(final StateToken previousStateToken) { + this.previousStateToken = previousStateToken; + if (!session.isLogged()) { + Site.showProgressProcessing(); + view.show(); + view.center(); + Site.hideProgress(); + } else { + stateManager.gotoToken(previousStateToken); + } + } + + public Object[][] getCountries() { + return session.getCountriesArray(); + } + + public I18nLanguageDTO getCurrentLanguage() { + return session.getCurrentLanguage(); + } + + public Object[][] getLanguages() { + return session.getLanguagesArray(); + } + + public Object[][] getTimezones() { + return session.getTimezones(); + } + + public void init(final SignInView loginview) { + this.view = loginview; + } + + public void onCancel() { + resetMessages(); + reset(); + view.hide(); + stateManager.gotoToken(previousStateToken); + } + + public void onClose() { + reset(); + view.hideMessages(); + if (!session.isLogged()) { + stateManager.gotoToken(previousStateToken); + } + } + + public void onFormRegister() { + if (view.isRegisterFormValid()) { + view.maskProcessing(); + + final I18nLanguageDTO language = new I18nLanguageDTO(); + language.setCode(view.getLanguage()); + + final I18nCountryDTO country = new I18nCountryDTO(); + country.setCode(view.getCountry()); + + final TimeZoneDTO timezone = new TimeZoneDTO(); + timezone.setId(view.getTimezone()); + + final UserDTO user = new UserDTO(view.getLongName(), view.getShortName(), view.getRegisterPassword(), view + .getEmail(), language, country, timezone, null, true, SubscriptionMode.manual, "blue"); + final AsyncCallback<UserInfoDTO> callback = new AsyncCallback<UserInfoDTO>() { + public void onFailure(final Throwable caught) { + view.unMask(); + try { + throw caught; + } catch (final EmailAddressInUseException e) { + view.setRegisterMessage(i18n.t("This email in in use by other person, try with another."), + SiteErrorType.error); + } catch (final GroupNameInUseException e) { + view.setRegisterMessage(i18n.t("This name in already in use, try with a different name."), + SiteErrorType.error); + } catch (final Throwable e) { + view.setRegisterMessage(i18n.t("Error during registration."), SiteErrorType.error); + GWT.log("Other kind of exception in user registration" + e.getMessage() + ", " + + e.getLocalizedMessage(), null); + e.printStackTrace(); + throw new RuntimeException(); + } + } + + public void onSuccess(final UserInfoDTO userInfoDTO) { + stateManager.gotoToken(userInfoDTO.getHomePage()); + onSignIn(userInfoDTO); + view.hide(); + view.unMask(); + view.showWelcolmeDialog(); + } + }; + userService.createUser(user, callback); + } + } + + protected void onFormSignIn() { + if (view.isSignInFormValid()) { + view.maskProcessing(); + + final String nickOrEmail = view.getNickOrEmail(); + final String passwd = view.getLoginPassword(); + + final UserDTO user = new UserDTO(); + user.setShortName(nickOrEmail); + user.setPassword(passwd); + + final AsyncCallback<UserInfoDTO> callback = new AsyncCallback<UserInfoDTO>() { + public void onFailure(final Throwable caught) { + view.unMask(); + Site.hideProgress(); + try { + throw caught; + } catch (final UserAuthException e) { + view.setSignInMessage(i18n.t("Incorrect nickname/email or password"), SiteErrorType.error); + } catch (final Throwable e) { + view.setSignInMessage("Error in login", SiteErrorType.error); + GWT.log("Other kind of exception in LoginFormPresenter/doLogin", null); + throw new RuntimeException(); + } + } + + public void onSuccess(final UserInfoDTO userInfoDTO) { + onSignIn(userInfoDTO); + stateManager.gotoToken(previousStateToken); + view.hide(); + view.unMask(); + } + }; + userService.login(user.getShortName(), user.getPassword(), callback); + } + } + + private void onSignIn(final UserInfoDTO userInfoDTO) { + final String userHash = userInfoDTO.getUserHash(); + view.setCookie(userHash); + session.setUserHash(userHash); + session.setCurrentUserInfo(userInfoDTO); + final I18nLanguageDTO language = userInfoDTO.getLanguage(); + i18n.changeCurrentLanguage(language.getCode()); + session.setCurrentLanguage(language); + } + + private void reset() { + view.reset(); + } + + private void resetMessages() { + view.hideMessages(); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInView.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/signin/SignInView.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,73 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.signin; + +import org.ourproject.kune.platf.client.View; +import org.ourproject.kune.workspace.client.newgroup.SiteErrorType; + +public interface SignInView extends View { + + public void center(); + + public String getCountry(); + + public String getEmail(); + + public String getLanguage(); + + public String getLoginPassword(); + + public String getLongName(); + + public String getNickOrEmail(); + + public String getRegisterPassword(); + + public String getRegisterPasswordDup(); + + public String getShortName(); + + public String getTimezone(); + + public void hide(); + + public void hideMessages(); + + public boolean isRegisterFormValid(); + + public boolean isSignInFormValid(); + + public void maskProcessing(); + + public void reset(); + + public void show(); + + public void showWelcolmeDialog(); + + public void unMask(); + + void setCookie(String userHash); + + void setRegisterMessage(String message, SiteErrorType type); + + void setSignInMessage(String message, SiteErrorType type); + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/AbstractBar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/AbstractBar.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/AbstractBar.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,45 @@ +package org.ourproject.kune.workspace.client.skel; + +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +public class AbstractBar extends Composite { + private final HorizontalPanel childPanel; + private final HorizontalPanel mainPanel; + + public AbstractBar() { + mainPanel = new HorizontalPanel(); + childPanel = new HorizontalPanel(); + mainPanel.add(childPanel); + initWidget(mainPanel); + mainPanel.setWidth("100%"); + } + + public void add(final Widget widget) { + childPanel.add(widget); + childPanel.setCellVerticalAlignment(widget, VerticalPanel.ALIGN_MIDDLE); + } + + public void addFill() { + final Label emptyLabel = new Label(""); + this.add(emptyLabel); + childPanel.setCellWidth(emptyLabel, "100%"); + } + + public void addSeparator() { + final Label emptyLabel = new Label(""); + emptyLabel.setStyleName("ytb-sep"); + emptyLabel.addStyleName("k-toolbar-sep"); + this.add(emptyLabel); + } + + public void addSpacer() { + final Label emptyLabel = new Label(""); + emptyLabel.setStyleName("ytb-spacer"); + this.add(emptyLabel); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Entity.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Entity.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Entity.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,47 @@ +package org.ourproject.kune.workspace.client.skel; + +import org.ourproject.kune.platf.client.ui.DefaultBorderLayout; +import org.ourproject.kune.workspace.client.themes.WsTheme; + +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.widgets.Panel; +import com.gwtext.client.widgets.layout.FitLayout; + +public class Entity extends DefaultBorderLayout { + + private final EntityWorkspace entityWorkspace; + private final EntitySummary entitySummary; + private final Panel entityMainHeader; + + public Entity() { + entityMainHeader = new Panel(); + entityMainHeader.setBorder(false); + entityMainHeader.setLayout(new FitLayout()); + entitySummary = new EntitySummary(); + entityWorkspace = new EntityWorkspace(); + add(entityMainHeader, DefaultBorderLayout.Position.NORTH, 65); + add(entityWorkspace.getPanel(), DefaultBorderLayout.Position.CENTER); + add(entitySummary.getPanel(), DefaultBorderLayout.Position.EAST, true, 150); + } + + public void addToEntityMainHeader(final Widget widget) { + entityMainHeader.add(widget); + doLayoutIfNeeded(); + } + + public EntitySummary getEntitySummary() { + return entitySummary; + } + + public EntityWorkspace getEntityWorkspace() { + return entityWorkspace; + } + + public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) { + if (oldTheme != null) { + super.removeStyle("k-entity-" + oldTheme); + } + super.addStyle("k-entity-" + newTheme); + entityWorkspace.setTheme(oldTheme, newTheme); + } +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntitySummary.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntitySummary.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntitySummary.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,66 @@ +package org.ourproject.kune.workspace.client.skel; + +import org.ourproject.kune.platf.client.ui.DefaultBorderLayout; + +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.widgets.Panel; +import com.gwtext.client.widgets.Toolbar; +import com.gwtext.client.widgets.event.ContainerListener; +import com.gwtext.client.widgets.layout.FitLayout; + +public class EntitySummary { + private final Panel entityTools; + private final Panel entitySummary; + private final DefaultBorderLayout mainPanel; + private final Toolbar trayBar; + private final VerticalPanel vpTools; + + public EntitySummary() { + mainPanel = new DefaultBorderLayout(); + entityTools = new Panel(); + entityTools.setLayout(new FitLayout()); + entityTools.setAutoHeight(true); + vpTools = new VerticalPanel(); + entityTools.add(vpTools); + entitySummary = new Panel(); + entityTools.setBorder(false); + entitySummary.setBorder(false); + entityTools.setAutoScroll(false); + entitySummary.setAutoScroll(true); + entitySummary.setCls("k-entity-summary"); + trayBar = mainPanel.createBottomBar(entitySummary, "k-site-traybar"); + mainPanel.add(entityTools, DefaultBorderLayout.Position.NORTH); + mainPanel.add(entitySummary, DefaultBorderLayout.Position.CENTER); + trayBar.addFill(); + } + + public void addInSummary(final Widget widget) { + entitySummary.add(widget); + entitySummary.syncSize(); + mainPanel.doLayoutIfNeeded(); + } + + public void addInTools(final Widget widget) { + vpTools.add(widget); + // entityTools.render(widget.getElement()); + if (entityTools.isRendered()) { + entityTools.syncSize(); + entityTools.doLayout(false); + mainPanel.doLayoutIfNeeded(); + } + } + + public void addListener(final ContainerListener listener) { + entitySummary.addListener(listener); + } + + public Panel getPanel() { + return mainPanel.getPanel(); + } + + public Toolbar getSiteTraybar() { + return trayBar; + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntityWorkspace.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntityWorkspace.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/EntityWorkspace.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,138 @@ +package org.ourproject.kune.workspace.client.skel; + +import org.ourproject.kune.platf.client.ui.DefaultBorderLayout; +import org.ourproject.kune.platf.client.ui.RoundedPanel; +import org.ourproject.kune.workspace.client.themes.WsTheme; + +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.widgets.Panel; +import com.gwtext.client.widgets.layout.AnchorLayout; +import com.gwtext.client.widgets.layout.AnchorLayoutData; + +public class EntityWorkspace extends DefaultBorderLayout { + private final Panel content; + private final Panel context; + private final TitleBar title; + private final TitleBar subTitle; + private final TitleBar bottom; + private final Toolbar contentTopBar; + private final Toolbar contentBottomBar; + private final Toolbar contextTopBar; + private final Toolbar contextBottomBar; + private final RoundedPanel roundedTitle; + private final RoundedPanel roundedBottom; + private final DefaultBorderLayout contextWrap; + + public EntityWorkspace() { + final Panel titles = new Panel(); + titles.setBorder(false); + titles.setLayout(new AnchorLayout()); + final Panel bottomPanel = new Panel(); + bottomPanel.setBorder(false); + bottomPanel.setLayout(new AnchorLayout()); + + title = new TitleBar(); + title.setHeight("" + (DEF_TOOLBAR_HEIGHT - 2)); + title.setStylePrimaryName("k-entity-title"); + subTitle = new TitleBar(); + subTitle.setStylePrimaryName("k-entity-subtitle"); + bottom = new TitleBar(); + bottom.setHeight("" + (DEF_TOOLBAR_HEIGHT - 2)); + bottom.setStylePrimaryName("k-entity-bottom"); + + roundedTitle = new RoundedPanel(title, RoundedPanel.TOPLEFT, 2); + roundedBottom = new RoundedPanel(bottom, RoundedPanel.BOTTOMLEFT, 2); + + titles.add(roundedTitle, new AnchorLayoutData("100% -" + DEF_TOOLBAR_HEIGHT)); + titles.add(subTitle, new AnchorLayoutData("100% -" + DEF_TOOLBAR_HEIGHT)); + bottomPanel.add(roundedBottom, new AnchorLayoutData("100% -" + DEF_TOOLBAR_HEIGHT)); + + final DefaultBorderLayout contentWrap = new DefaultBorderLayout(); + contextWrap = new DefaultBorderLayout(); + contentWrap.setBorder(true); + contextWrap.setBorder(true); + content = new Panel(); + context = new Panel(); + content.setBorder(false); + context.setBorder(false); + context.setCollapsible(true); + content.setPaddings(7); + content.setAutoScroll(true); + context.setAutoScroll(true); + + contentTopBar = new Toolbar(); + contentBottomBar = new Toolbar(); + contextTopBar = new Toolbar(); + contextBottomBar = new Toolbar(); + contentTopBar.addStyleName("k-toolbar-bottom-line"); + contentBottomBar.addStyleName("k-toolbar-top-line"); + contextTopBar.addStyleName("k-toolbar-bottom-line"); + contextBottomBar.addStyleName("k-toolbar-top-line"); + contentWrap.add(contentTopBar.getPanel(), Position.NORTH, false, DEF_TOOLBAR_HEIGHT); + contextWrap.add(contextTopBar.getPanel(), Position.NORTH, false, DEF_TOOLBAR_HEIGHT); + contentWrap.add(content, Position.CENTER); + contextWrap.add(context, Position.CENTER); + contentWrap.add(contentBottomBar.getPanel(), Position.SOUTH, false, DEF_TOOLBAR_HEIGHT); + contextWrap.add(contextBottomBar.getPanel(), Position.SOUTH, false, DEF_TOOLBAR_HEIGHT); + + add(titles, DefaultBorderLayout.Position.NORTH, DEF_TOOLBAR_HEIGHT * 2); + add(contentWrap.getPanel(), DefaultBorderLayout.Position.CENTER); + add(contextWrap.getPanel(), DefaultBorderLayout.Position.EAST, true, 175); + add(bottomPanel, DefaultBorderLayout.Position.SOUTH, DEF_TOOLBAR_HEIGHT + 2); + } + + public TitleBar getBottomTitle() { + return bottom; + } + + public Toolbar getContentBottomBar() { + return contentBottomBar; + } + + public Toolbar getContentTopBar() { + return contentTopBar; + } + + public Toolbar getContextBottomBar() { + return contextBottomBar; + } + + public Toolbar getContextTopBar() { + return contextTopBar; + } + + public TitleBar getSubTitle() { + return subTitle; + } + + public TitleBar getTitle() { + return title; + } + + public void setContent(final Widget widget) { + setPanel(content, widget); + } + + public void setContext(final Widget widget) { + setPanel(context, widget); + } + + public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) { + final String themeS = newTheme.toString(); + if (oldTheme != null) { + final String previousThemeS = oldTheme.toString(); + title.removeStyleDependentName(previousThemeS); + subTitle.removeStyleDependentName(previousThemeS); + bottom.removeStyleDependentName(previousThemeS); + super.removeStyle("k-entityworkspace-" + previousThemeS); + context.removeStyleName("k-entity-context-" + previousThemeS); + } + super.addStyle("k-entityworkspace-" + newTheme); + roundedTitle.setCornerStyleName("k-entity-title-rd-" + newTheme); + roundedBottom.setCornerStyleName("k-entity-bottom-rd-" + newTheme); + title.addStyleDependentName(themeS); + subTitle.addStyleDependentName(themeS); + bottom.addStyleDependentName(themeS); + context.addStyleName("k-entity-context-" + newTheme); + } +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/SiteBar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/SiteBar.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/SiteBar.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,33 @@ +package org.ourproject.kune.workspace.client.skel; + +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.widgets.Panel; + +public class SiteBar extends Panel { + + private final TitleBar titleBar; + + public SiteBar() { + super.setBorder(false); + titleBar = new TitleBar(); + titleBar.setStyleName("k-sitebar"); + super.add(titleBar); + } + + public void add(final Widget widget) { + titleBar.add(widget); + } + + public Widget addFill() { + return titleBar.addFill(); + } + + public Widget addSeparator() { + return titleBar.addSeparator(); + } + + public Widget addSpacer() { + return titleBar.addSpacer(); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/TitleBar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/TitleBar.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/TitleBar.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,48 @@ +package org.ourproject.kune.workspace.client.skel; + +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +public class TitleBar extends Composite { + + private final HorizontalPanel childPanel; + private final HorizontalPanel mainPanel; + + public TitleBar() { + mainPanel = new HorizontalPanel(); + childPanel = new HorizontalPanel(); + mainPanel.add(childPanel); + initWidget(mainPanel); + mainPanel.setWidth("100%"); + } + + public void add(final Widget widget) { + childPanel.add(widget); + childPanel.setCellVerticalAlignment(widget, VerticalPanel.ALIGN_MIDDLE); + } + + public Widget addFill() { + final Label emptyLabel = new Label(""); + this.add(emptyLabel); + childPanel.setCellWidth(emptyLabel, "100%"); + return emptyLabel; + } + + public Widget addSeparator() { + final Label emptyLabel = new Label(""); + emptyLabel.setStyleName("ytb-sep"); + emptyLabel.addStyleName("k-toolbar-sep"); + this.add(emptyLabel); + return emptyLabel; + } + + public Widget addSpacer() { + final Label emptyLabel = new Label(""); + emptyLabel.setStyleName("ytb-spacer"); + this.add(emptyLabel); + return emptyLabel; + } +} \ No newline at end of file Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,78 @@ +package org.ourproject.kune.workspace.client.skel; + +import org.ourproject.kune.platf.client.ui.DefaultBorderLayout; + +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.widgets.Panel; + +public class Toolbar { + private final Panel container; + private final HorizontalPanel childPanel; + + public Toolbar() { + container = new Panel(); + container.setBorder(false); + container.setBodyBorder(false); + container.setHeight(DefaultBorderLayout.DEF_TOOLBAR_HEIGHT); + container.setWidth("100%"); + container.setHeader(false); + container.setBaseCls("x-toolbar"); + container.addClass("x-panel"); + childPanel = new HorizontalPanel(); + container.add(childPanel); + } + + public void add(final Widget widget) { + childPanel.add(widget); + doLayoutIfNeeded(); + } + + public Widget addFill() { + final Label emptyLabel = new Label(""); + this.add(emptyLabel); + childPanel.setCellWidth(emptyLabel, "100%"); + return emptyLabel; + } + + public Widget addSeparator() { + final Label emptyLabel = new Label(""); + emptyLabel.setStyleName("ytb-sep"); + emptyLabel.addStyleName("k-toolbar-sep"); + this.add(emptyLabel); + return emptyLabel; + } + + public Widget addSpacer() { + final Label emptyLabel = new Label(""); + emptyLabel.setStyleName("ytb-spacer"); + this.add(emptyLabel); + return emptyLabel; + } + + public void addStyleName(final String cls) { + container.addClass(cls); + } + + public void doLayoutIfNeeded() { + if (container.isRendered()) { + container.doLayout(false); + } + } + + public Panel getPanel() { + return container; + } + + public void remove(final Widget widget) { + childPanel.remove(widget); + doLayoutIfNeeded(); + } + + public void removeAll() { + childPanel.clear(); + doLayoutIfNeeded(); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/WorkspaceSkeleton.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/WorkspaceSkeleton.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/WorkspaceSkeleton.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,108 @@ +package org.ourproject.kune.workspace.client.skel; + +import org.ourproject.kune.platf.client.ui.DefaultBorderLayout; +import org.ourproject.kune.workspace.client.themes.WsTheme; + +import com.calclab.suco.client.signal.Slot0; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.DeferredCommand; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.core.ExtElement; +import com.gwtext.client.widgets.MessageBox; +import com.gwtext.client.widgets.Panel; +import com.gwtext.client.widgets.Toolbar; +import com.gwtext.client.widgets.Viewport; +import com.gwtext.client.widgets.layout.FitLayout; + +public class WorkspaceSkeleton { + private final Entity entity; + private final SiteBar sitebar; + private final DefaultBorderLayout mainPanel; + private final Panel container; + private final ExtElement extRootBody; + + public WorkspaceSkeleton() { + extRootBody = new ExtElement(RootPanel.getBodyElement()); + container = new Panel(); + container.setLayout(new FitLayout()); + container.setBorder(false); + container.setPaddings(5); + mainPanel = new DefaultBorderLayout(); + sitebar = new SiteBar(); + entity = new Entity(); + mainPanel.add(sitebar, DefaultBorderLayout.Position.NORTH, DefaultBorderLayout.DEF_TOOLBAR_HEIGHT); + mainPanel.add(entity.getPanel(), DefaultBorderLayout.Position.CENTER); + container.add(mainPanel.getPanel()); + new Viewport(container); + } + + public void addToEntityMainHeader(final Widget widget) { + entity.addToEntityMainHeader(widget); + } + + public void askConfirmation(final String title, final String message, final Slot0 onConfirmed, final Slot0 onCancel) { + MessageBox.confirm(title, message, new MessageBox.ConfirmCallback() { + public void execute(final String btnID) { + if (btnID.equals("yes")) { + DeferredCommand.addCommand(new Command() { + public void execute() { + onConfirmed.onEvent(); + } + }); + } else { + onCancel.onEvent(); + } + } + }); + } + + public EntitySummary getEntitySummary() { + return entity.getEntitySummary(); + } + + public EntityWorkspace getEntityWorkspace() { + return entity.getEntityWorkspace(); + } + + public SiteBar getSiteBar() { + return sitebar; + } + + public Toolbar getSiteTraybar() { + return entity.getEntitySummary().getSiteTraybar(); + } + + public void mask() { + extRootBody.mask(); + } + + public void mask(final String message) { + extRootBody.mask(message, "x-mask-loading"); + } + + public void promptMessage(final String title, final String message, final Slot0 onEnter) { + MessageBox.prompt(title, message, new MessageBox.PromptCallback() { + public void execute(final String btnID, final String text) { + // FIXME: use btnID + onEnter.onEvent(); + } + }); + } + + public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) { + entity.setTheme(oldTheme, newTheme); + } + + public void showAlertMessage(final String title, final String message) { + MessageBox.alert(title, message, new MessageBox.AlertCallback() { + public void execute() { + } + }); + } + + public void unMask() { + extRootBody.unmask(); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsTheme.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsTheme.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsTheme.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,48 @@ +package org.ourproject.kune.workspace.client.themes; + +public class WsTheme { + private final String name; + + public WsTheme(final String name) { + this.name = name; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final WsTheme other = (WsTheme) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (name == null ? 0 : name.hashCode()); + return result; + } + + public String toString() { + return name; + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePanel.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePanel.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,59 @@ +package org.ourproject.kune.workspace.client.themes; + +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; + +import com.calclab.suco.client.signal.Slot2; +import com.gwtext.client.core.EventObject; +import com.gwtext.client.widgets.ToolbarButton; +import com.gwtext.client.widgets.menu.BaseItem; +import com.gwtext.client.widgets.menu.Menu; +import com.gwtext.client.widgets.menu.MenuItem; +import com.gwtext.client.widgets.menu.event.BaseItemListenerAdapter; + +public class WsThemePanel extends ToolbarButton implements WsThemeView { + + private final Menu menu; + private final WsThemePresenter presenter; + private final I18nUITranslationService i18n; + + public WsThemePanel(final WorkspaceSkeleton ws, final WsThemePresenter presenter, + final I18nUITranslationService i18n) { + this.presenter = presenter; + this.i18n = i18n; + menu = new Menu(); + + menu.setDefaultAlign("br-tr"); + super.setMenu(menu); + super.setIcon("images/colors.gif"); + super.setTooltip(i18n.t("Select Workspace theme for this group")); + ws.getSiteTraybar().addButton(this); + presenter.onThemeChanged(new Slot2<WsTheme, WsTheme>() { + public void onEvent(final WsTheme oldTheme, final WsTheme newTheme) { + ws.setTheme(oldTheme, newTheme); + } + }); + } + + public void setThemes(final String[] themes) { + for (int i = 0; i < themes.length; i++) { + final WsTheme theme = new WsTheme(themes[i]); + final MenuItem item = new MenuItem(); + final String name = theme.getName(); + item.setIconCls("k-wstheme-icon-" + name); + item.setText(i18n.t(name)); + menu.addItem(item); + item.addListener(new BaseItemListenerAdapter() { + @Override + public void onClick(final BaseItem item, final EventObject e) { + presenter.onChangeGroupWsTheme(theme); + } + }); + } + } + + public void setVisible(final boolean visible) { + super.setVisible(visible); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,78 @@ +package org.ourproject.kune.workspace.client.themes; + +import org.ourproject.kune.platf.client.dto.InitDataDTO; +import org.ourproject.kune.platf.client.dto.StateDTO; +import org.ourproject.kune.platf.client.rpc.AsyncCallbackSimple; +import org.ourproject.kune.platf.client.rpc.GroupServiceAsync; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.workspace.client.site.Site; + +import com.calclab.suco.client.provider.Provider; +import com.calclab.suco.client.signal.Signal2; +import com.calclab.suco.client.signal.Slot; +import com.calclab.suco.client.signal.Slot2; + +public class WsThemePresenter { + + private WsThemeView view; + private WsTheme previousTheme; + private final Signal2<WsTheme, WsTheme> onThemeChanged; + private final Provider<GroupServiceAsync> groupServiceProvider; + private final Session session; + + public WsThemePresenter(final Session session, final Provider<GroupServiceAsync> groupServiceProvider, + final StateManager stateManager) { + this.session = session; + this.groupServiceProvider = groupServiceProvider; + this.onThemeChanged = new Signal2<WsTheme, WsTheme>("onThemeChanged"); + session.onInitDataReceived(new Slot<InitDataDTO>() { + public void onEvent(final InitDataDTO initData) { + view.setThemes(initData.getWsThemes()); + setTheme(new WsTheme(initData.getWsThemes()[0])); + } + }); + stateManager.onStateChanged(new Slot<StateDTO>() { + public void onEvent(final StateDTO state) { + setState(state); + } + }); + } + + public void init(final WsThemeView view) { + this.view = view; + } + + public void onThemeChanged(final Slot2<WsTheme, WsTheme> slot) { + onThemeChanged.add(slot); + } + + protected void onChangeGroupWsTheme(final WsTheme newTheme) { + Site.showProgressProcessing(); + groupServiceProvider.get().changeGroupWsTheme(session.getUserHash(), + session.getCurrentState().getGroup().getShortName(), newTheme.getName(), + new AsyncCallbackSimple<Object>() { + public void onSuccess(final Object result) { + setTheme(newTheme); + Site.hideProgress(); + } + }); + } + + private void setState(final StateDTO state) { + setTheme(new WsTheme(state.getGroup().getWorkspaceTheme())); + if (state.getGroupRights().isAdministrable()) { + view.setVisible(true); + } else { + view.setVisible(false); + } + } + + private void setTheme(final WsTheme newTheme) { + if (previousTheme == null || !previousTheme.equals(newTheme)) { + onThemeChanged.fire(previousTheme, newTheme); + } + previousTheme = newTheme; + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemeView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemeView.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemeView.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,9 @@ +package org.ourproject.kune.workspace.client.themes; + +public interface WsThemeView { + + void setThemes(String[] themes); + + void setVisible(boolean visible); + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePanel.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePanel.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,68 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.title; + +import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.workspace.client.skel.TitleBar; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; + +import com.google.gwt.user.client.ui.Label; + +public class EntitySubTitlePanel implements EntitySubTitleView { + private final Label subTitleLeftLabel; + private final Label subTitleRightLabel; + + public EntitySubTitlePanel(final EntitySubTitlePresenter presenter, final I18nTranslationService i18n, + final WorkspaceSkeleton ws) { + subTitleLeftLabel = new Label(); + subTitleRightLabel = new Label(); + + final TitleBar wsSubTitle = ws.getEntityWorkspace().getSubTitle(); + wsSubTitle.add(subTitleLeftLabel); + wsSubTitle.addFill(); + wsSubTitle.add(subTitleRightLabel); + + subTitleRightLabel.setText(i18n.t("Language:")); + + subTitleLeftLabel.addStyleName("kune-Margin-Large-l"); + subTitleLeftLabel.addStyleName("kune-ft15px"); + subTitleRightLabel.addStyleName("kune-Margin-Large-r"); + subTitleRightLabel.addStyleName("kune-ft12px"); + } + + public void setContentSubTitleLeft(final String subTitle) { + subTitleLeftLabel.setText(subTitle); + } + + public void setContentSubTitleLeftVisible(final boolean visible) { + subTitleLeftLabel.setVisible(visible); + } + + public void setContentSubTitleRight(final String subTitle) { + subTitleRightLabel.setText(subTitle); + + } + + public void setContentSubTitleRightVisible(final boolean visible) { + subTitleRightLabel.setVisible(visible); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePresenter.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitlePresenter.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,73 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.title; + +import org.ourproject.kune.platf.client.View; +import org.ourproject.kune.platf.client.dto.StateDTO; +import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.platf.client.state.StateManager; + +import com.calclab.suco.client.signal.Slot; + +public class EntitySubTitlePresenter { + + private EntitySubTitleView view; + private final I18nTranslationService i18n; + + public EntitySubTitlePresenter(final I18nTranslationService i18n, final StateManager stateManager) { + this.i18n = i18n; + stateManager.onStateChanged(new Slot<StateDTO>() { + public void onEvent(final StateDTO state) { + setState(state); + } + }); + } + + public View getView() { + return view; + } + + public void init(final EntitySubTitleView view) { + this.view = view; + } + + public void setContentLanguage(final String langName) { + view.setContentSubTitleRight(i18n.t("Language: [%s]", langName)); + } + + private void setState(final StateDTO state) { + if (state.hasDocument()) { + view.setContentSubTitleLeft(i18n.tWithNT("by: [%s]", "used in a list of authors", state.getAuthors().get(0) + .getName())); + view.setContentSubTitleLeftVisible(true); + } else { + view.setContentSubTitleLeftVisible(false); + } + if (state.getLanguage() != null) { + final String langName = state.getLanguage().getEnglishName(); + setContentLanguage(langName); + view.setContentSubTitleRightVisible(true); + } else { + view.setContentSubTitleRightVisible(false); + } + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitleView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitleView.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntitySubTitleView.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,34 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.title; + +import org.ourproject.kune.platf.client.View; + +public interface EntitySubTitleView extends View { + + void setContentSubTitleLeft(String subTitle); + + void setContentSubTitleRight(String subTitle); + + void setContentSubTitleLeftVisible(boolean visible); + + void setContentSubTitleRightVisible(boolean visible); +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePanel.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePanel.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,72 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.title; + +import org.ourproject.kune.platf.client.ui.EditableClickListener; +import org.ourproject.kune.platf.client.ui.EditableIconLabel; +import org.ourproject.kune.workspace.client.skel.TitleBar; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; + +import com.google.gwt.user.client.ui.Label; + +public class EntityTitlePanel implements EntityTitleView { + private final EditableIconLabel titleLabel; + private final Label dateLabel; + + public EntityTitlePanel(final WorkspaceSkeleton ws, final EntityTitlePresenter presenter) { + titleLabel = new EditableIconLabel(new EditableClickListener() { + public void onEdited(final String text) { + presenter.onTitleRename(text); + } + }); + dateLabel = new Label(); + + final TitleBar wsTitle = ws.getEntityWorkspace().getTitle(); + wsTitle.add(titleLabel); + wsTitle.addFill(); + wsTitle.add(dateLabel); + titleLabel.addStyleName("kune-Margin-Large-l"); + titleLabel.addStyleName("kune-ft17px"); + dateLabel.addStyleName("kune-Margin-Large-r"); + dateLabel.addStyleName("kune-ft12px"); + } + + public void restoreOldTitle() { + titleLabel.restoreOldText(); + } + + public void setContentDate(final String date) { + dateLabel.setText(date); + } + + public void setContentTitle(final String title) { + titleLabel.setText(title); + } + + public void setContentTitleEditable(final boolean editable) { + titleLabel.setEditable(editable); + } + + public void setDateVisible(final boolean visible) { + dateLabel.setVisible(visible); + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,121 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.title; + +import java.util.Date; + +import org.ourproject.kune.platf.client.View; +import org.ourproject.kune.platf.client.dto.StateDTO; +import org.ourproject.kune.platf.client.rpc.ContentServiceAsync; +import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.platf.client.services.KuneErrorHandler; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.workspace.client.site.Site; + +import com.calclab.suco.client.provider.Provider; +import com.calclab.suco.client.signal.Slot; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class EntityTitlePresenter { + + private EntityTitleView view; + private final I18nTranslationService i18n; + private final KuneErrorHandler errorHandler; + private final StateManager stateManager; + private final Provider<ContentServiceAsync> contentServiceProvider; + private final Session session; + + public EntityTitlePresenter(final I18nTranslationService i18n, final KuneErrorHandler errorHandler, + final StateManager stateManager, final Session session, + final Provider<ContentServiceAsync> contentServiceProvider) { + this.i18n = i18n; + this.errorHandler = errorHandler; + this.stateManager = stateManager; + this.session = session; + this.contentServiceProvider = contentServiceProvider; + stateManager.onStateChanged(new Slot<StateDTO>() { + public void onEvent(final StateDTO state) { + setState(state); + } + }); + } + + public View getView() { + return view; + } + + public void init(final EntityTitleView view) { + this.view = view; + } + + public void onTitleRename(final String newName) { + Site.showProgressSaving(); + final StateDTO currentState = session.getCurrentState(); + contentServiceProvider.get().rename(session.getUserHash(), currentState.getGroup().getShortName(), + currentState.getStateToken().getEncoded(), newName, new AsyncCallback<String>() { + public void onFailure(final Throwable caught) { + view.restoreOldTitle(); + errorHandler.process(caught); + } + + public void onSuccess(final String result) { + Site.hideProgress(); + view.setContentTitle(result); + stateManager.reloadContextAndTitles(); + } + }); + Site.hideProgress(); + } + + public void setContentDate(final Date publishedOn) { + final DateTimeFormat fmt = DateTimeFormat.getFormat("MM/dd/yyyy, Z"); + view.setContentDate(i18n.t("Published on: [%s]", fmt.format(publishedOn))); + } + + private void setContentDateVisible(final boolean visible) { + view.setDateVisible(visible); + } + + private void setContentTitle(final String title, final boolean editable) { + view.setContentTitle(title); + view.setContentTitleEditable(editable); + } + + private void setState(final StateDTO state) { + if (state.hasDocument()) { + setContentTitle(state.getTitle(), state.getContentRights().isEditable()); + setContentDateVisible(true); + setContentDate(state.getPublishedOn()); + } else { + if (state.getFolder().getParentFolderId() == null) { + // We translate root folder names (documents, chat room, + // etcetera) + setContentTitle(i18n.t(state.getTitle()), false); + } else { + setContentTitle(state.getTitle(), state.getContentRights().isEditable()); + } + setContentDateVisible(false); + } + } + +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitleView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitleView.java 2008-09-08 01:05:36 UTC (rev 860) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitleView.java 2008-09-08 01:13:19 UTC (rev 861) @@ -0,0 +1,37 @@ +/* + * + * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) + * 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 org.ourproject.kune.workspace.client.title; + +import org.ourproject.kune.platf.client.View; + +public interface EntityTitleView extends View { + + void restoreOldTitle(); + + void setContentDate(String date); + + void setContentTitle(String title); + + void setContentTitleEditable(boolean editable); + + void setDateVisible(boolean visible); + +}