/*
* Copyright 2010 Vodafone Group Services Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.onesocialweb.gwt.client.ui.window;
import static org.onesocialweb.gwt.client.util.FormLayoutHelper.addHTMLLabelRow;
import static org.onesocialweb.gwt.client.util.FormLayoutHelper.addWidgetRow;
import java.util.Date;
import java.util.HashMap;
import org.onesocialweb.gwt.client.OswClient;
import org.onesocialweb.gwt.client.i18n.UserInterfaceText;
import org.onesocialweb.gwt.client.task.DefaultTaskInfo;
import org.onesocialweb.gwt.client.task.TaskMonitor;
import org.onesocialweb.gwt.client.task.TaskInfo.Status;
import org.onesocialweb.gwt.client.ui.widget.AvatarUploadField;
import org.onesocialweb.gwt.client.ui.widget.DateField;
import org.onesocialweb.gwt.client.ui.widget.GenderEditField;
import org.onesocialweb.gwt.client.ui.widget.NameEditField;
import org.onesocialweb.gwt.client.ui.widget.PrivacySelector;
import org.onesocialweb.gwt.client.ui.widget.StyledFlowPanel;
import org.onesocialweb.gwt.client.ui.widget.StyledLabel;
import org.onesocialweb.gwt.client.ui.widget.StyledTextBox;
import org.onesocialweb.gwt.client.ui.widget.TooltipPushButton;
import org.onesocialweb.gwt.client.util.OSWUrlBuilder;
import org.onesocialweb.gwt.service.OswServiceFactory;
import org.onesocialweb.gwt.service.RequestCallback;
import org.onesocialweb.model.vcard4.BirthdayField;
import org.onesocialweb.model.vcard4.DefaultGenderField;
import org.onesocialweb.model.vcard4.DefaultNameField;
import org.onesocialweb.model.vcard4.EmailField;
import org.onesocialweb.model.vcard4.FullNameField;
import org.onesocialweb.model.vcard4.GenderField;
import org.onesocialweb.model.vcard4.NameField;
import org.onesocialweb.model.vcard4.NoteField;
import org.onesocialweb.model.vcard4.PhotoField;
import org.onesocialweb.model.vcard4.Profile;
import org.onesocialweb.model.vcard4.TelField;
import org.onesocialweb.model.vcard4.URLField;
import org.onesocialweb.model.vcard4.VCard4Factory;
import org.onesocialweb.model.vcard4.exception.CardinalityException;
import org.onesocialweb.model.vcard4.exception.UnsupportedFieldException;
import com.google.code.gwt.storage.client.Storage;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TabPanel;
import com.reveregroup.gwt.imagepreloader.FitImage;
public class PreferencesWindow extends AbstractWindow {
// internationalization
private UserInterfaceText uiText = (UserInterfaceText) GWT.create(UserInterfaceText.class);
private String jid;
private Profile model;
private TabPanel tabpanel = new TabPanel();
private FlowPanel account = new FlowPanel();
private FlowPanel privacy = new FlowPanel();
private FlowPanel profile = new FlowPanel();
private boolean IsProfileLoaded;
private boolean IsAccountLoaded;
private boolean IsPrivacyLoaded;
private StyledFlowPanel sectionGeneral;
private FlexTable general;
private FlexTable generalEdit;
private TooltipPushButton buttonEditG;
private StyledLabel instructionG;
final GenderEditField genderF = new GenderEditField();
final FitImage avatarD = new FitImage();
@Override
protected void onInit() {
setStyle("preferencesWindow");
setWindowTitle(uiText.Preferences());
// TODO get data
// show data
composeWindow();
}
private void composeWindow() {
// add components
tabpanel.add(account, uiText.Account());
tabpanel.add(profile, uiText.ProfileAndContact());
// tabpanel.add(privacy, "Privacy");
tabpanel.selectTab(0);
getContents().add(tabpanel);
// load first tab
getAccountPreferences();
// styles
account.setStyleName("tabcontentflowlayout");
profile.setStyleName("tabcontentflowlayout");
privacy.setStyleName("tabcontentflowlayout");
tabpanel.addSelectionHandler(new SelectionHandler<Integer>() {
public void onSelection(SelectionEvent<Integer> event) {
if (event.getSelectedItem() == 0) {
getAccountPreferences();
}
if (event.getSelectedItem() == 1) {
getProfilePreferences();
}
if (event.getSelectedItem() == 2) {
getPrivacyPreferences();
}
}
});
}
private void getProfilePreferences() {
// Used for dynamically loading the profile tab
if (!IsProfileLoaded) {
loadProfile();
IsProfileLoaded = true;
} else {
refreshProfile();
}
}
private void getPrivacyPreferences() {
// Used for dynamically loading the preferences tab
if (!IsPrivacyLoaded) {
loadPrivacy();
IsPrivacyLoaded = true;
} else {
// TODO refresh data
}
}
private void getAccountPreferences() {
// Used for dynamically loading the account tab
if (!IsAccountLoaded) {
loadAccount();
IsAccountLoaded = true;
} else {
// TODO refresh data
}
}
private void loadPrivacy() {
// Compose privacy tab
StyledFlowPanel sectionSimple = new StyledFlowPanel("section");
Button buttonAdvanced = new Button("Advanced");
buttonAdvanced.addStyleName("sectionedit");
StyledLabel titleUN = new StyledLabel("grouplabel", "Privacy settings");
StyledLabel instructionUN = new StyledLabel("instruction",
"Choose the defaults for who can see and do what.");
sectionSimple.add(buttonAdvanced);
sectionSimple.add(titleUN);
sectionSimple.add(instructionUN);
DisclosurePanel disclosureStatus = new DisclosurePanel(
"More options for status updates");
// Advanced settings status
FlexTable advancedStatus = new FlexTable();
PrivacySelector advancedstatus = new PrivacySelector("advancedstatus");
addWidgetRow(advancedStatus, "See your status updates", advancedstatus);
disclosureStatus.add(advancedStatus);
// Simple privacy settings
FlexTable simple = new FlexTable();
simple.addStyleName("privacy");
PrivacySelector status = new PrivacySelector("status");
addWidgetRow(simple, "See your posts", status);
PrivacySelector comment = new PrivacySelector("status");
addWidgetRow(simple, "Comment on your posts", comment);
PrivacySelector profile = new PrivacySelector("profile");
addWidgetRow(simple, "See your profile information", profile);
PrivacySelector contact = new PrivacySelector("contact");
addWidgetRow(simple, "See your contact information", contact);
PrivacySelector following = new PrivacySelector("following");
addWidgetRow(simple, "See people you're following", following);
PrivacySelector friends = new PrivacySelector("friends");
addWidgetRow(simple, "See your friends", friends);
sectionSimple.add(simple);
privacy.add(sectionSimple);
}
private void loadProfile() {
// get a handle to the jid
jid = OswServiceFactory.getService().getUserBareJID();
// Fetch the new profile
final DefaultTaskInfo task = new DefaultTaskInfo(
uiText.FetchingProfile(), false);
TaskMonitor.getInstance().addTask(task);
OswServiceFactory.getService().getProfile(jid,
new RequestCallback<Profile>() {
@Override
public void onFailure() {
// no profile available
task.complete("", Status.succes);
model = null;
composeProfile();
}
@Override
public void onSuccess(Profile result) {
task.complete("", Status.succes);
model = result;
composeProfile();
}
});
}
private void refreshProfile() {
general.removeAllRows();
if (model.hasField(PhotoField.NAME)) {
String avatar = model.getPhotoUri();
avatarD.setUrl(avatar);
if (avatar != null && avatar.length() > 0)
addWidgetRow(general, uiText.Avatar(), avatarD);
}
if (model.hasField(FullNameField.NAME)) {
String displayname = model.getFullName();
if (displayname != null && displayname.length() > 0)
addHTMLLabelRow(general, uiText.DisplayName(), displayname);
}
if (model.hasField(NameField.NAME)) {
String name = model.getName();
if (name != null && name.length() > 0)
addHTMLLabelRow(general, uiText.FullName(), name);
}
if (model.hasField(BirthdayField.NAME)) {
Date birthday = model.getBirthday();
if (birthday != null) {
DateTimeFormat dtf = DateTimeFormat.getFormat("d MMMM yyyy");
String bday = dtf.format(birthday);
addHTMLLabelRow(general, uiText.Birthday(), bday);
}
}
if (model.hasField(GenderField.NAME)) {
GenderField.Type gender = model.getGender();
// in this case the GenderEditField will provide the display value, not the model
// because of internationalization
if (gender != null)
addHTMLLabelRow(general, uiText.Gender(), genderF.getGenderText());
}
if (model.hasField(NoteField.NAME)) {
String bio = model.getNote();
if (bio != null && bio.length() > 0)
addHTMLLabelRow(general, uiText.Bio(), bio);
}
if (model.hasField(EmailField.NAME)) {
String email = model.getEmail();
if (email != null && email.length() > 0)
addHTMLLabelRow(general, uiText.Email(), email);
}
if (model.hasField(TelField.NAME)) {
String tel = model.getTel();
if (tel != null && tel.length() > 0)
addHTMLLabelRow(general, uiText.Telephone(), tel);
}
if (model.hasField(URLField.NAME)) {
String url = model.getUrl();
if (url != null && url.length() > 0)
addHTMLLabelRow(general, uiText.Website(), url);
}
}
private void composeProfile() {
// compose profile tab
sectionGeneral = new StyledFlowPanel("section");
buttonEditG = new TooltipPushButton(new Image(OswClient.getInstance()
.getPreference("theme_folder")
+ "assets/i-edit.png"), uiText.EditProfile());
buttonEditG.addStyleName("sectionedit");
StyledLabel titleG = new StyledLabel("grouplabel", uiText.General());
sectionGeneral.add(buttonEditG);
sectionGeneral.add(titleG);
this.profile.add(sectionGeneral);
// Editor version of general information
generalEdit = new FlexTable();
generalEdit.addStyleName("edit");
final AvatarUploadField avatarF = new AvatarUploadField();
addWidgetRow(generalEdit, uiText.Avatar(), avatarF);
avatarD.setMaxSize(80, 80);
final StyledTextBox displaynameF = new StyledTextBox("", "", "250px");
addWidgetRow(generalEdit, uiText.DisplayName(), displaynameF);
final NameEditField nameF = new NameEditField();
addWidgetRow(generalEdit, uiText.FullName(), nameF);
final DateField birthdayF = new DateField();
addWidgetRow(generalEdit, uiText.Birthday(), birthdayF);
addWidgetRow(generalEdit, uiText.Gender(), genderF);
final StyledTextBox bioF = new StyledTextBox("", "", "250px");
addWidgetRow(generalEdit, uiText.Bio(), bioF);
final StyledTextBox emailF = new StyledTextBox("", "", "250px");
addWidgetRow(generalEdit, uiText.Email(), emailF);
final StyledTextBox telF = new StyledTextBox("", "", "250px");
addWidgetRow(generalEdit, uiText.Telephone(), telF);
final StyledTextBox urlF = new StyledTextBox("", "", "250px");
addWidgetRow(generalEdit, uiText.Website(), urlF);
// Text only version of general information
general = new FlexTable();
sectionGeneral.add(general);
// make sure the model is not empty when there is no profile available
if (model != null) {
if (model.hasField(PhotoField.NAME)) {
String avatar = model.getPhotoUri();
// the field
avatarF.setAvatar(avatar);
// for display
avatarD.setUrl(avatar);
if (avatar != null && avatar.length() > 0)
addWidgetRow(general, uiText.Avatar(), avatarD);
}
if (model.hasField(FullNameField.NAME)) {
String displayname = model.getFullName();
displaynameF.setText(displayname);
if (displayname != null && displayname.length() > 0)
addHTMLLabelRow(general, uiText.DisplayName(), displayname);
}
if (model.hasField(NameField.NAME)) {
// the full string
String name = model.getName();
// get the separate pieces for editing
DefaultNameField nameField = new DefaultNameField();
nameField = (DefaultNameField) model.getField(NameField.NAME);
nameF.setName(nameField.getGiven(), nameField.getSurname());
if (name != null && name.length() > 0)
addHTMLLabelRow(general, uiText.FullName(), name);
}
if (model.hasField(BirthdayField.NAME)) {
Date birthday = model.getBirthday();
if (birthday != null) {
DateTimeFormat dtf = DateTimeFormat.getFormat("d MMMM yyyy");
String bday = dtf.format(birthday);
birthdayF.setDate(birthday);
if (birthday != null ) addHTMLLabelRow(general, uiText.Birthday(), bday);
}
}
if (model.hasField(GenderField.NAME)) {
GenderField.Type gender = model.getGender();
// get the gender value
DefaultGenderField genderField = new DefaultGenderField();
genderField = (DefaultGenderField) model.getField(GenderField.NAME);
genderF.setGender(gender);
if (gender != null)
addHTMLLabelRow(general, uiText.Gender(), genderF.getGenderText());
}
if (model.hasField(NoteField.NAME)) {
String bio = model.getNote();
bioF.setText(bio);
if (bio != null && bio.length() > 0)
addHTMLLabelRow(general, uiText.Bio(), model.getField("note")
.getValue());
}
if (model.hasField(EmailField.NAME)) {
String email = model.getEmail();
emailF.setText(email);
if (email != null && email.length() > 0)
addHTMLLabelRow(general, uiText.Email(), email);
}
if (model.hasField(TelField.NAME)) {
String tel = model.getTel();
telF.setText(tel);
if (tel != null && tel.length() > 0)
addHTMLLabelRow(general, uiText.Telephone(), tel);
}
if (model.hasField(URLField.NAME)) {
String url = model.getUrl();
urlF.setText(url);
if (url != null && url.length() > 0)
addHTMLLabelRow(general, uiText.Website(), url);
}
// if there are no fields
if (model.getFields().size() == 0) {
showEditProfile();
}
}
StyledFlowPanel confirmG = new StyledFlowPanel("confirm");
Button buttonSaveG = new Button(uiText.Save());
Button buttonCancelG = new Button(uiText.Cancel());
confirmG.add(buttonSaveG);
confirmG.add(buttonCancelG);
addWidgetRow(generalEdit, "", confirmG);
// handlers
buttonEditG.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
showEditProfile();
}
});
buttonCancelG.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
sectionGeneral.add(general);
sectionGeneral.remove(generalEdit);
buttonEditG.setVisible(true);
}
});
buttonSaveG.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
final VCard4Factory profileFactory = OswServiceFactory
.getService().getProfileFactory();
final Profile profile = profileFactory.profile();
try {
// prepare for updating and check for empty values
if (avatarF.getAvatarUri().length() > 0)
profile.addField(profileFactory.photo(avatarF.getAvatarUri()));
if (displaynameF.getText().length() > 0)
profile.addField(profileFactory.fullname(displaynameF.getText()));
if (nameF.getFirstName().length() > 0 || nameF.getLastName().length() > 0)
profile.addField(profileFactory.name(null, nameF.getFirstName(), nameF.getLastName(), null));
if (birthdayF.getDate() != null)
profile.addField(profileFactory.birthday(birthdayF.getDate()));
if (genderF.getGenderText().length() > 0) {
if (genderF.getGenderValue().equals(GenderField.Type.MALE.toString())) {
profile.addField(profileFactory.gender(GenderField.Type.MALE));
} else if (genderF.getGenderValue().equals(GenderField.Type.FEMALE.toString())) {
profile.addField(profileFactory.gender(GenderField.Type.FEMALE));
} else if (genderF.getGenderValue().equals(GenderField.Type.NOTKNOWN.toString())) {
profile.addField(profileFactory.gender(GenderField.Type.NOTKNOWN));
} else if (genderF.getGenderValue().equals(GenderField.Type.NOTAPPLICABLE.toString())) {
profile.addField(profileFactory.gender(GenderField.Type.NOTAPPLICABLE));
}
}
if (bioF.getText().length() > 0)
profile.addField(profileFactory.note(bioF.getText()));
if (emailF.getText().length() > 0)
profile.addField(profileFactory.email(emailF.getText()));
if (telF.getText().length() > 0)
profile.addField(profileFactory.tel(telF.getText()));
if (urlF.getText().length() > 0)
profile.addField(profileFactory.url(urlF.getText()));
} catch (CardinalityException e) {
} catch (UnsupportedFieldException e) {
}
OswServiceFactory.getService().setProfile(profile,
new RequestCallback<Object>() {
@Override
public void onFailure() {
}
@Override
public void onSuccess(Object result) {
model = profile;
refreshProfile();
}
});
sectionGeneral.add(general);
sectionGeneral.remove(generalEdit);
buttonEditG.setVisible(true);
sectionGeneral.removeStyleName("edit");
}
});
}
private void showEditProfile() {
sectionGeneral.remove(general);
sectionGeneral.add(generalEdit);
buttonEditG.setVisible(false);
}
private void loadAccount() {
// username
StyledFlowPanel sectionUsername = new StyledFlowPanel("section");
FlexTable username = new FlexTable();
StyledLabel titleUN = new StyledLabel("grouplabel", uiText.YourIdentity());
StyledLabel instructionUN = new StyledLabel("instruction",
uiText.IdentityFixed());
sectionUsername.add(titleUN);
sectionUsername.add(instructionUN);
sectionUsername.add(username);
account.add(sectionUsername);
addHTMLLabelRow(username, uiText.UserName(), OswServiceFactory.getService()
.getUserBareJID());
// change language
StyledFlowPanel sectionChangeLocale = new StyledFlowPanel("section");
FlexTable changeLocale = new FlexTable();
StyledLabel titleCL = new StyledLabel("grouplabel", uiText.ChangeLocale());
StyledLabel instructionCL = new StyledLabel("instruction", uiText.SetLanguage());
final ListBox languageSelector = new ListBox();
// add the values to the list
HashMap<String, String> OSWLocales = OswClient.getInstance().getOSWLocales();
for (String locale : OSWLocales.keySet()) {
languageSelector.addItem(OSWLocales.get(locale).toString(), locale);
}
// get the locale if stored in the browser
String localeStored = "";
if (Storage.isSupported()) {
Storage localStorage = Storage.getLocalStorage();
localeStored = localStorage.getItem("locale");
}
// select the right locale in the list if one is predefined
if (localeStored != null) {
for (int i = 0; i < languageSelector.getItemCount(); i++) {
if ( localeStored.equals(languageSelector.getValue(i))) {
languageSelector.setSelectedIndex(i);
}
}
// otherwise provide the default
} else {
for (int i = 0; i < languageSelector.getItemCount(); i++) {
if (languageSelector.getValue(i).equals("default")) {
languageSelector.setSelectedIndex(i);
}
}
}
sectionChangeLocale.add(titleCL);
sectionChangeLocale.add(instructionCL);
sectionChangeLocale.add(changeLocale);
account.add(sectionChangeLocale);
addWidgetRow(changeLocale, uiText.Language(), languageSelector);
languageSelector.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
String value = languageSelector.getValue(languageSelector.getSelectedIndex());
// store the new default value if possible or remove the value in case
// of default (English)
if (Storage.isSupported()) {
Storage localStorage = Storage.getLocalStorage();
if (value.equals("default")) {
localStorage.removeItem("locale");
} else {
localStorage.setItem("locale", value);
}
}
// construct the new url with the locale parameter
// and reload in the PreferencesApplication
if (value != null && value.length() > 0) {
if (value.equals("default")) {
OSWUrlBuilder urlBuilder = new OSWUrlBuilder();
urlBuilder.removeParameter("locale");
Window.Location.replace(urlBuilder.buildString());
} else {
OSWUrlBuilder urlBuilder = new OSWUrlBuilder();
urlBuilder.setParameter("locale", value);
Window.Location.replace(urlBuilder.buildString());
}
}
}
});
//Location url = new Location.createUrlBuilder().setParameter("locale", "en");
//Window.Location.replace();
// change password
// StyledFlowPanel sectionChangePassword = new
// StyledFlowPanel("section");
// FlexTable changePassword = new FlexTable();
// StyledLabel titlePW = new StyledLabel("grouplabel",
// "Change password");
// StyledLabel instructionPW = new StyledLabel("instruction",
// "Pick a new password below.");
// sectionChangePassword.add(titlePW);
// sectionChangePassword.add(instructionPW);
// sectionChangePassword.add(changePassword);
// account.add(sectionChangePassword);
//
//
// addWidgetRow(changePassword, "Confirm password", new
// PasswordTextBox(), "");
// addWidgetRow(changePassword, "", new Button("Save"), "");
// change email
// StyledFlowPanel sectionChangeEmail = new StyledFlowPanel("section");
// FlexTable changeEmail = new FlexTable();
// StyledLabel titleEM = new StyledLabel("grouplabel", "Change email");
// StyledLabel instructionEM = new StyledLabel("instruction",
// "Change your email below and confirm the change in the new email inbox.");
// sectionChangePassword.add(titleEM);
// sectionChangePassword.add(instructionEM);
// sectionChangePassword.add(changeEmail);
// account.add(sectionChangeEmail);
//
// addHTMLLabelRow(changeEmail, "Current email",
// "alardweisscher@gmail.com");
// addWidgetRow(changeEmail, "New email", new TextBox(), "");
// addWidgetRow(changeEmail, "", new Button("Save"), "");
}
}