package org.ourproject.massmob.client.ui; import org.ourproject.massmob.client.StateManager; import org.ourproject.massmob.client.ui.img.Images; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.OpenEvent; 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.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import com.thezukunft.wave.connector.GadgetUpdateEvent; import com.thezukunft.wave.connector.GadgetUpdateEventHandler; import com.thezukunft.wave.connector.StateUpdateEvent; import com.thezukunft.wave.connector.StateUpdateEventHandler; import cc.kune.common.shared.res.ICalConstants; import cc.kune.common.shared.utils.TextUtils; public class DescriptionField extends Composite { interface DescriptionFieldUiBinder extends UiBinder<Widget, DescriptionField> { } private static DescriptionFieldUiBinder uiBinder = GWT.create(DescriptionFieldUiBinder.class); @UiField TextArea description; @UiField CustomDisclosure disclo; private final EventBus eventBus; private final Images img; private final StateManager stateManager; private String summary = ""; private final Label summaryWidget; public DescriptionField(final EventBus eventBus, final StateManager stateManager, final Images img) { this.eventBus = eventBus; this.stateManager = stateManager; this.img = img; summaryWidget = new Label(); summaryWidget.addStyleName("descrip-summary"); initWidget(uiBinder.createAndBindUi(this)); disclo.setOpen(stateManager.getDescOpen()); disclo.setHeader(summaryWidget); eventBus.addHandler(GadgetUpdateEvent.TYPE, new GadgetUpdateEventHandler() { @Override public void onUpdate(final GadgetUpdateEvent event) { calcSummary(description.getValue()); setTitleDescription(); } }); eventBus.addHandler(StateUpdateEvent.TYPE, new StateUpdateEventHandler() { @Override public void onUpdate(final StateUpdateEvent event) { update(); } }); update(); } private void afterEdit() { final String newDescrip = description.getValue(); if (!newDescrip.equals(stateManager.getValue(ICalConstants.DESCRIPTION))) { stateManager.setValue(ICalConstants.DESCRIPTION, newDescrip); calcSummary(newDescrip); } } private void calcSummary(final String text) { final int length = (int) ((disclo.getOffsetWidth() - 20) * 0.12); // Log.debug("offset: " + length); summary = TextUtils.ellipsis(text, length); } @UiFactory CustomDisclosure getDisclo() { return new CustomDisclosure(img); } @UiHandler("description") public void onBlur(final BlurEvent event) { afterEdit(); } @UiHandler("description") public void onChange(final ChangeEvent event) { afterEdit(); } @UiHandler("disclo") void onClose(final CloseEvent<DisclosurePanel> event) { updateGadgetSize(); stateManager.setDescriptionOpen(false); setTitleDescription(); } @UiHandler("disclo") void onOpen(final OpenEvent<DisclosurePanel> event) { updateGadgetSize(); stateManager.setDescriptionOpen(true); setTitleDescription(); } public void setEnabled(final boolean enabled) { description.setEnabled(enabled); } private void setTitleDescription() { if (disclo.isOpen()) { summaryWidget.setText(""); } else { summaryWidget.setText(summary); } } public void update() { final String value = stateManager.getValue(ICalConstants.DESCRIPTION); description.setValue(value); calcSummary(value); setTitleDescription(); } private void updateGadgetSize() { eventBus.fireEvent(new GadgetUpdateEvent()); } }