Java tutorial
/* * Copyright (C) 2011 4th Line GmbH, Switzerland * * 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.fourthline.konto.client.ledger.entry.view; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTMLTable; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import org.fourthline.konto.client.bundle.Bundle; import org.seamless.gwt.component.client.binding.ValidatableViewProperty; import org.seamless.gwt.component.client.binding.ViewProperty; import org.seamless.gwt.component.client.widget.AutocompleteDateTextBox; import org.seamless.gwt.theme.shared.client.ThemeStyle; import org.seamless.util.time.DateFormat; import org.seamless.gwt.validation.shared.ValidationError; import javax.inject.Inject; import java.util.Date; /** * @author Christian Bauer */ public class EntryViewImpl extends Composite implements EntryView { interface UI extends UiBinder<VerticalPanel, EntryViewImpl> { } private UI ui = GWT.create(UI.class); interface Style extends CssResource { String deleteSplitColumn(); String splitViewColumn(); String splitViewRowOdd(); String splitViewRowEven(); String splitView(); String deleteSplitButton(); } @UiField(provided = true) Bundle bundle; @UiField Style style; @UiField AutocompleteDateTextBox effectiveOnDateBox; @UiField SimplePanel entrySummaryPanel; @UiField FlexTable splitsTable; @UiField Button addSplitButton; @UiField Button saveButton; @UiField Button deleteButton; @UiField Button cancelButton; @UiField SimplePanel addSplitCell; EntryView.Presenter presenter; final ValidatableViewProperty<Date> effectiveOnProperty; @Inject public EntryViewImpl(final Bundle bundle) { this.bundle = bundle; initWidget(ui.createAndBindUi(this)); splitsTable.getColumnFormatter().addStyleName(1, style.splitViewColumn()); effectiveOnDateBox.getTextBox().addValueChangeHandler(new ValueChangeHandler() { @Override public void onValueChange(ValueChangeEvent event) { if (effectiveOnDateBox.getValue() != null) presenter.dateEntered(effectiveOnDateBox.getValue()); } }); effectiveOnProperty = new ValidatableViewProperty<Date>() { @Override public void reset() { set(new Date()); } @Override public void set(Date value) { effectiveOnDateBox.setValue(value, true); } @Override public Date get() { return effectiveOnDateBox.getValue(); } @Override public void showValidationError(ValidationError error) { effectiveOnDateBox.getTextBox().addStyleName(ThemeStyle.FormErrorField()); } @Override public void clearValidationError() { effectiveOnDateBox.getTextBox().removeStyleName(ThemeStyle.FormErrorField()); } }; } @Override public void focus(Boolean selectDay) { if (selectDay != null && selectDay) effectiveOnDateBox.selectDay(); else effectiveOnDateBox.getTextBox().selectAll(); effectiveOnDateBox.getTextBox().setFocus(true); } @Override public void setPresenter(EntryView.Presenter presenter) { this.presenter = presenter; } @Override public void setDateFormat(DateFormat dateFormat) { effectiveOnDateBox.setDateFormat(dateFormat); } @Override public void reset() { effectiveOnProperty.reset(); entrySummaryPanel.clear(); splitsTable.removeAllRows(); hideSplitDelete(); showSplitAdd(); } @Override public ValidatableViewProperty<Date> getEffectiveOnProperty() { return effectiveOnProperty; } @Override public void showEntrySummaryView(EntrySummaryView summaryView) { entrySummaryPanel.clear(); entrySummaryPanel.add(summaryView); entrySummaryPanel.setVisible(true); } @Override public void removeEntrySummaryView() { entrySummaryPanel.clear(); entrySummaryPanel.setVisible(false); } @Override public void hideSplitDelete() { for (int i = 0; i < splitsTable.getRowCount(); ++i) { splitsTable.getWidget(i, 0).setVisible(false); } splitsTable.getColumnFormatter().removeStyleName(0, style.deleteSplitColumn()); } @Override public void showSplitDelete() { for (int i = 0; i < splitsTable.getRowCount(); ++i) { splitsTable.getWidget(i, 0).setVisible(true); } splitsTable.getColumnFormatter().addStyleName(0, style.deleteSplitColumn()); } @Override public void hideSplitAdd() { addSplitCell.setVisible(false); } @Override public void showSplitAdd() { addSplitCell.setVisible(true); } @Override public void addSplitView(SplitView splitView) { final int row = splitsTable.getRowCount() == 0 ? 0 : splitsTable.getRowCount(); final Button deleteSplitButton = new Button("Delete Split"); deleteSplitButton.addStyleName(ThemeStyle.FormButton()); deleteSplitButton.addStyleName(style.deleteSplitButton()); deleteSplitButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { FlexTable.Cell clickedCell = splitsTable.getCellForEvent(event); presenter.removeSplit(clickedCell.getRowIndex()); } }); SimplePanel deleteButtonWrapper = new SimplePanel(); deleteButtonWrapper.addStyleName(ThemeStyle.FormButton()); deleteButtonWrapper.add(deleteSplitButton); deleteButtonWrapper.setVisible(false); SimplePanel splitViewWrapper = new SimplePanel(); splitViewWrapper.addStyleName(style.splitView()); splitViewWrapper.add(splitView); splitsTable.setWidget(row, 0, deleteButtonWrapper); splitsTable.setWidget(row, 1, splitViewWrapper); styleEntryView(row); } @Override public void removeSplitView(int row) { splitsTable.removeRow(row); for (int i = 0; i < splitsTable.getRowCount(); i++) { styleEntryView(i); } } protected void styleEntryView(Integer row) { HTMLTable.RowFormatter rf = splitsTable.getRowFormatter(); rf.addStyleName(row, (row == 0 || ((row % 2) == 0)) ? style.splitViewRowEven() : style.splitViewRowOdd()); } @UiHandler("addSplitButton") void onClickAddSplit(ClickEvent e) { if (presenter != null) { presenter.addSplit(); } } @UiHandler("saveButton") void onClickSaveEntry(ClickEvent e) { if (presenter != null) { presenter.saveEntry(); } } @UiHandler("deleteButton") void onClickDeleteEntry(ClickEvent e) { if (presenter != null && Window.confirm("Are you are you want to delete the entry?")) { presenter.deleteEntry(); } } @UiHandler("cancelButton") void onClickCancel(ClickEvent e) { if (presenter != null) { presenter.cancel(); } } }