/* * 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.account.view; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.TableRowElement; 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.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.*; import org.fourthline.konto.client.bundle.Bundle; import org.fourthline.konto.client.ledger.account.AccountGroupSuggestion; import org.fourthline.konto.shared.AccountType; import org.fourthline.konto.shared.entity.MonetaryUnit; import org.seamless.gwt.component.client.binding.BigDecimalViewProperty; import org.seamless.gwt.component.client.binding.DateBoxViewProperty; import org.seamless.gwt.component.client.binding.TextBoxViewProperty; import org.seamless.gwt.component.client.binding.ValidatableViewProperty; import org.seamless.gwt.component.client.suggest.SuggestionSelectView; import org.seamless.gwt.component.client.widget.AutocompleteDateTextBox; import org.seamless.gwt.theme.shared.client.ThemeStyle; import org.seamless.gwt.validation.shared.ValidationError; import org.seamless.util.time.DateFormat; import javax.inject.Inject; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Christian Bauer */ public class AccountViewImpl extends Composite implements AccountView { interface UI extends UiBinder<DockLayoutPanel, AccountViewImpl> { } private UI ui = GWT.create(UI.class); @UiField(provided = true) Bundle bundle; @UiField AccountViewStyle style; @UiField VerticalPanel form; @UiField Button saveButton; @UiField Button deleteButton; @UiField Button cancelButton; @UiField ListBox typeListBox; @UiField TextBox nameTextBox; @UiField TextBox initialBalanceTextBox; @UiField ListBox currencyListBox; @UiField TableRowElement typeRow; @UiField AutocompleteDateTextBox effectiveOnDateBox; @UiField TableRowElement currencyRow; @UiField SimplePanel accountGroupSelectPanel; @UiField Label initialBalanceCurrencyLabel; @UiField VerticalPanel nameErrors; @UiField VerticalPanel groupErrors; @UiField VerticalPanel effectiveOnErrors; @UiField VerticalPanel initialBalanceErrors; Presenter presenter; List<IsWidget> addedRows = new ArrayList(); final ValidatableViewProperty<String> nameProperty; final SuggestionSelectView<AccountGroupSuggestion> accountGroupSelectView; final ValidatableViewProperty<Date> effectiveOnProperty; final ValidatableViewProperty<BigDecimal> initialBalanceProperty; @Inject public AccountViewImpl(Bundle bundle, AccountGroupSelectView accountGroupSelectView) { this.bundle = bundle; this.accountGroupSelectView = accountGroupSelectView; initWidget(ui.createAndBindUi(this)); initTypeListBox(); nameProperty = new TextBoxViewProperty(nameErrors, nameTextBox, ThemeStyle.FormErrorField()); effectiveOnProperty = new DateBoxViewProperty(effectiveOnErrors, effectiveOnDateBox, ThemeStyle.FormErrorField()); initialBalanceProperty = new BigDecimalViewProperty(initialBalanceErrors, initialBalanceTextBox, ThemeStyle.FormErrorField()); accountGroupSelectPanel.setWidget(accountGroupSelectView); accountGroupSelectView.getTextBox().addStyleName(style.groupNameBox()); accountGroupSelectView.getButton().addStyleName(style.groupShowAllButton()); currencyListBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { presenter.currencySelected(currencyListBox.getSelectedIndex()); } }); } protected void initTypeListBox() { typeListBox.clear(); for (AccountType type : AccountType.values()) { typeListBox.addItem(type.getLabel()); } typeListBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { presenter.typeSelected(AccountType.values()[typeListBox.getSelectedIndex()]); } }); } @Override public void setPresenter(Presenter presenter) { this.presenter = presenter; setVisible(false); // Avoid jitter and wait until setCreateMode() is complete } @Override public void setDateFormat(DateFormat dateFormat) { effectiveOnDateBox.setDateFormat(dateFormat); } @Override public void reset() { initTypeListBox(); nameProperty.reset(); groupErrors.clear(); accountGroupSelectView.reset(); effectiveOnProperty.reset(); currencyListBox.clear(); initialBalanceProperty.reset(); initialBalanceCurrencyLabel.setText(""); for (IsWidget addedRow : addedRows) { removeFormPanelRow(addedRow); } } @Override public void focus() { if (deleteButton.isVisible()) { nameTextBox.selectAll(); nameTextBox.setFocus(true); } else { typeListBox.setFocus(true); } } @Override public SuggestionSelectView<AccountGroupSuggestion> getAccountGroupSelectView() { return accountGroupSelectView; } @Override public void showValidationErrorAccountGroup(ValidationError error) { Label l = new Label(error.getMessage()); l.setStyleName(ThemeStyle.ErrorMessage()); groupErrors.add(l); accountGroupSelectView.showValidationError(error); } @Override public void clearValidationErrorAccountGroup() { groupErrors.clear(); accountGroupSelectView.clearValidationError(); } @Override public void setCreateMode(boolean createMode) { typeRow.setClassName( createMode ? ThemeStyle.FormRowVisible() : ThemeStyle.FormRowInvisible() ); currencyRow.setClassName( createMode ? ThemeStyle.FormRowVisible() : ThemeStyle.FormRowInvisible() ); deleteButton.setVisible(!createMode); setVisible(true); } @Override public ValidatableViewProperty<String> getNameProperty() { return nameProperty; } @Override public ValidatableViewProperty<Date> getEffectiveOnProperty() { return effectiveOnProperty; } @Override public ValidatableViewProperty<BigDecimal> getInitialBalanceProperty() { return initialBalanceProperty; } @Override public void setCurrency(String string) { for (int i = 0; i < currencyListBox.getItemCount(); i++) { if (currencyListBox.getItemText(i).equals(string)) { currencyListBox.setSelectedIndex(i); } } initialBalanceCurrencyLabel.setText(string); } @Override public void setCurrencies(List<MonetaryUnit> currencies) { currencyListBox.clear(); for (MonetaryUnit currency : currencies) { currencyListBox.addItem(currency.getCurrencyCode()); } } @Override public void addFormPanelRow(IsWidget widget) { addedRows.add(widget); form.add(widget); } @Override public void removeFormPanelRow(IsWidget widget) { form.remove(widget); } @UiHandler("saveButton") void onClickSave(ClickEvent e) { if (presenter != null) { presenter.save(); } } @UiHandler("deleteButton") void onClickDelete(ClickEvent e) { if (presenter != null && Window.confirm( "Are you are you want to delete this account? " + "All entries will be deleted!" )) { presenter.delete(); } } @UiHandler("cancelButton") void onClickCancel(ClickEvent e) { if (presenter != null) { presenter.cancel(); } } }