package org.ourproject.massmob.client.ui;
import java.util.Date;
import org.ourproject.massmob.client.CustomConstants;
import org.ourproject.massmob.client.StateManager;
import org.ourproject.massmob.client.actions.OptionsActions;
import org.ourproject.massmob.client.actions.UnconfirmedEvent;
import org.ourproject.massmob.client.actions.WithFieldEvent;
import org.ourproject.massmob.client.ui.EditEvent.EditHandler;
import org.ourproject.massmob.client.ui.date.DatePresenter;
import org.ourproject.massmob.client.ui.img.Images;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiFactory;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
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.Label;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.ToggleButton;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
import com.thezukunft.wave.connector.ModeChangeEvent;
import com.thezukunft.wave.connector.ModeChangeEventHandler;
import com.thezukunft.wave.connector.StateUpdateEvent;
import com.thezukunft.wave.connector.StateUpdateEventHandler;
import com.thezukunft.wave.connector.Wave;
import cc.kune.common.client.actions.gwtui.GwtGuiProvider;
import cc.kune.common.client.actions.ui.GuiProvider;
import cc.kune.common.client.notify.NotifyUser;
import cc.kune.common.client.resources.CommonResources;
import cc.kune.common.client.tooltip.Tooltip;
import cc.kune.common.client.utils.DateUtils;
import cc.kune.common.shared.i18n.I18nTranslationServiceMocked;
import cc.kune.common.shared.res.ICalConstants;
public class MassmobMainPanel extends Composite {
interface MainPanelUiBinder extends UiBinder<Widget, MassmobMainPanel> {
}
private static final String FIELDLABEL_STYLE = "fieldlabel";
private static MainPanelUiBinder uiBinder = GWT.create(MainPanelUiBinder.class);
private final OptionsActions actions;
@UiField
EditableLabel appTitle;
@UiField
DescriptionField desc;
private final EventBus eventBus;
@UiField
FlexTable fields;
private final GuiProvider guiReg;
private final Images img;
@UiField
FlowPanel mainPanel;
@UiField
OptionsPanel options;
@UiField
Assistance parts;
private final StateManager stateManager;
@UiField
FlowPanel titlePanel;
private final Wave wave;
@Inject
public MassmobMainPanel(final EventBus eventBus, final Wave wave, final StateManager stateManager,
final DatePresenter startDate, final DatePresenter endDate, final Images img,
final CommonResources res, final OptionsActions actions, final GuiProvider guiReg,
final GwtGuiProvider guiProvider, final I18nTranslationServiceMocked i18n) {
this.eventBus = eventBus;
this.wave = wave;
this.stateManager = stateManager;
this.img = img;
this.actions = actions;
this.guiReg = guiReg;
startDate.init(ICalConstants.DATE_TIME_START);
endDate.init(ICalConstants.DATE_TIME_END);
initWidget(uiBinder.createAndBindUi(this));
this.setWidth("auto");
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
onModuleLoad();
}
private void onModuleLoad() {
Resources.INSTANCE.style().ensureInjected();
final TextField where = new TextField();
final TextField who = new TextField();
Tooltip.to(where, "Where the event will happens?");
Tooltip.to(who, "Who's organizing the event?");
img.css().ensureInjected();
final Label whereLabel = new Label("Location:", true);
final Label whoLabel = new Label("Who organize:", false);
final Label allDayLabel = new Label("All day event:", false);
final Label startLabel = new Label("Start:");
final Label linkLabel = new Label("Keep the duration when changing dates");
final Label endLabel = new Label("End:");
final PushButton mapBtn = new PushButton(new Image(res.locationGrey()),
new Image(res.locationBlack()));
final ToggleButton keepDuration = new ToggleButton(new Image(res.chainOpenGrey()),
new Image(res.chainClosedGrey()));
keepDuration.setStyleName("k-nothing");
keepDuration.addStyleName("k-pointer");
Tooltip.to(keepDuration, "Click to change");
new PushButton(AbstractImagePrototype.create(res.pictureGrey()).createImage(),
AbstractImagePrototype.create(res.pictureBlack()).createImage());
final CheckBox allDay = new CheckBox();
allDay.setValue(Boolean.valueOf(wave.getState().get(ICalConstants._ALL_DAY)));
keepDuration.setValue(Boolean.valueOf(wave.getState().get(CustomConstants.KEEP_DURATION)));
Tooltip.to(mapBtn, "See location map");
mapBtn.setStyleName("mapBtn");
// keepDurationBtn.setStyleName("mapBtn");
whereLabel.addStyleName(FIELDLABEL_STYLE);
whoLabel.addStyleName(FIELDLABEL_STYLE);
allDayLabel.addStyleName(FIELDLABEL_STYLE);
startLabel.addStyleName(FIELDLABEL_STYLE);
endLabel.addStyleName(FIELDLABEL_STYLE);
keepDuration.addStyleName(FIELDLABEL_STYLE);
fields.getColumnFormatter().setStyleName(1, "fieldboxes");
fields.setWidget(0, 0, whereLabel);
fields.setWidget(1, 0, whoLabel);
fields.setWidget(2, 0, allDayLabel);
fields.setWidget(4, 0, keepDuration);
fields.setWidget(3, 0, startLabel);
fields.setWidget(5, 0, endLabel);
fields.setWidget(0, 1, where);
fields.setWidget(1, 1, who);
fields.setWidget(2, 1, allDay);
fields.setWidget(3, 1, startDate.getView().asWidget());
fields.setWidget(4, 1, linkLabel);
fields.setWidget(5, 1, endDate.getView().asWidget());
fields.setWidget(0, 2, mapBtn);
allDay.addClickHandler(new ClickHandler() {
@SuppressWarnings("deprecation")
@Override
public void onClick(final ClickEvent event) {
final Boolean isAllDay = allDay.getValue();
wave.getState().submitValue(ICalConstants._ALL_DAY, isAllDay.toString());
if (isAllDay) {
// We set all the hour to zero
final Date start = DateUtils.toDate(wave.getState().get(ICalConstants.DATE_TIME_START));
final Date end = DateUtils.toDate(wave.getState().get(ICalConstants.DATE_TIME_END));
/*
* See:
* https://stackoverflow.com/questions/4170827/gwt-no-source-code-
* is-available-for-type-java-util-calendar
*/
start.setHours(0);
start.setMinutes(0);
start.setSeconds(0);
end.setHours(23);
end.setMinutes(59);
end.setSeconds(59);
wave.getState().submitValue(ICalConstants.DATE_TIME_START, DateUtils.toString(start));
wave.getState().submitValue(ICalConstants.DATE_TIME_END, DateUtils.toString(start));
}
}
});
keepDuration.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
wave.getState().submitValue(CustomConstants.KEEP_DURATION,
keepDuration.getValue().toString());
}
});
mapBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
final String whereS = where.getText();
if (whereS.length() > 0) {
if (Boolean.parseBoolean(stateManager.getValue(CustomConstants.USEGMAPS))) {
Window.open("http://maps.google.com/maps?q=" + whereS, "_blank", "");
} else {
Window.open("http://nominatim.openstreetmap.org/search/" + whereS, "_blank", "");
}
} else {
NotifyUser.info("Fill the location where the event will take place");
}
}
});
appTitle.addEditHandler(createHandler(ICalConstants.SUMMARY));
where.addEditHandler(createHandler(ICalConstants.LOCATION));
who.addEditHandler(createHandler(ICalConstants.ORGANIZER));
eventBus.addHandler(StateUpdateEvent.TYPE, new StateUpdateEventHandler() {
@Override
public void onUpdate(final StateUpdateEvent event) {
update(where, who, startDate, endDate, allDay, keepDuration);
setEnabled(!wave.isPlayback(), stateManager, startDate, endDate, where, who);
}
});
eventBus.addHandler(ModeChangeEvent.TYPE, new ModeChangeEventHandler() {
@Override
public void onUpdate(final ModeChangeEvent event) {
setEnabled(!wave.isPlayback(), stateManager, startDate, endDate, where, who);
}
});
setEnabled(!wave.isPlayback(), stateManager, startDate, endDate, where, who);
update(where, who, startDate, endDate, allDay, keepDuration);
eventBus.addHandler(ChangeBackgroundEvent.TYPE,
new ChangeBackgroundEvent.ChangeBackgroundHandler() {
@Override
public void fire(final ChangeBackgroundEvent event) {
setBackground(event.getBg());
}
});
String withState = wave.getState().get(CustomConstants.WITHWHO);
boolean visible = withState == null || Boolean.parseBoolean(withState);
who.setVisible(visible);
whoLabel.setVisible(visible);
withState = wave.getState().get(CustomConstants.WITHASSISTANCE);
visible = withState == null || Boolean.parseBoolean(withState);
parts.setVisible(visible);
eventBus.addHandler(WithFieldEvent.TYPE, new WithFieldEvent.WithFieldHandler() {
@Override
public void fire(final WithFieldEvent event) {
final boolean with = event.getWith();
final String field = event.getField();
if (field.equals(CustomConstants.WITHWHO)) {
who.setVisible(with);
whoLabel.setVisible(with);
}
if (field.equals(CustomConstants.WITHASSISTANCE)) {
parts.setVisible(with);
}
}
});
eventBus.addHandler(UnconfirmedEvent.TYPE, new UnconfirmedEvent.UnconfirmedHandler() {
@Override
public void fire(final UnconfirmedEvent event) {
where.setText("Unconfirmed location, be attent to your mobile");
}
});
final String bg = wave.getState().get(CustomConstants.BACKGROUND);
if (bg != null) {
setBackground(bg);
}
}
});
}
private EditHandler createHandler(final String key) {
return new EditHandler() {
@Override
public void fire(final EditEvent event) {
stateManager.setValue(key, event.getText());
}
};
}
@UiFactory
OptionsPanel createOptionsPanel() {
return new OptionsPanel(guiReg, actions);
}
@UiFactory
@Inject
DescriptionField makeDescriptionField() {
return new DescriptionField(eventBus, stateManager, img);
}
@UiFactory
@Inject
Assistance makeParts() {
return new Assistance(eventBus, wave, stateManager, img);
}
@UiFactory
CustomRoundedLinePanel makeRD() {
return new CustomRoundedLinePanel("#808080", "#f4e7ee", "#f4e7ee");
}
private void setBackground(final String bg) {
final String bodyProp = "#f4e7ee url('" + bg + "') fixed no-repeat top left";
mainPanel.getElement().getStyle().setProperty("background", bodyProp);
mainPanel.getElement().getStyle().setProperty("backgroundAttachment", "inherit");
wave.getState().submitValue(CustomConstants.BACKGROUND, bg);
}
private void setEnabled(final boolean enabled, final StateManager stateManager,
final DatePresenter startDatePresenter, final DatePresenter endDatePresenter,
final TextField where, final TextField who) {
startDatePresenter.setEnabled(enabled);
endDatePresenter.setEnabled(enabled);
who.textbox.setEnabled(enabled);
where.textbox.setEnabled(enabled);
desc.setEnabled(enabled);
parts.setEnabled(enabled);
appTitle.setEnabled(enabled);
stateManager.setEnabled(enabled);
options.setEnabled(enabled);
}
private void update(final TextField where, final TextField who, final DatePresenter startDate,
final DatePresenter endDate, final CheckBox allDay, final ToggleButton keepDuration) {
final String summary = stateManager.getValue(ICalConstants.SUMMARY);
final String location = stateManager.getValue(ICalConstants.LOCATION);
final String organizer = stateManager.getValue(ICalConstants.ORGANIZER);
final boolean allDayValue = Boolean.parseBoolean(stateManager.getValue(ICalConstants._ALL_DAY));
final boolean keepDurationValue = Boolean.parseBoolean(
stateManager.getValue(CustomConstants.KEEP_DURATION));
if (summary != null) {
appTitle.setText(summary);
}
if (location != null) {
where.setText(location);
}
if (organizer != null) {
who.setText(organizer);
}
startDate.updateView(wave.getState());
endDate.updateView(wave.getState());
allDay.setValue(allDayValue);
keepDuration.setValue(keepDurationValue);
}
}