/* * 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; import com.google.web.bindery.event.shared.EventBus; import com.google.gwt.place.shared.PlaceController; import org.seamless.gwt.component.client.AbstractEventListeningPresenter; import org.fourthline.konto.client.ledger.component.AccountTreeSelectPresenter; import org.fourthline.konto.client.ledger.component.AccountTreeSelectView; import org.fourthline.konto.client.ledger.event.AccountSelectionModeChange; import org.fourthline.konto.client.ledger.view.LedgerSidebarView; import org.fourthline.konto.client.service.LedgerServiceAsync; import org.fourthline.konto.client.settings.GlobalSettings; import org.fourthline.konto.client.settings.event.GlobalSettingsRefreshedEvent; import org.fourthline.konto.shared.entity.Account; import org.fourthline.konto.shared.query.AccountsQueryCriteria; import javax.inject.Inject; /** * Delegates dynamically to {@link AccountTreeSelectPresenter} when switching modes. * * @author Christian Bauer */ public class LedgerSidebarPresenter extends AbstractEventListeningPresenter implements LedgerSidebarView.Presenter, GlobalSettingsRefreshedEvent.Handler, AccountSelectionModeChange.Handler { final LedgerSidebarView view; final PlaceController placeController; final EventBus bus; final LedgerServiceAsync service; GlobalSettings globalSettings; AccountTreeSelectPresenter delegate; boolean delegateDefaultState = false; @Inject public LedgerSidebarPresenter(LedgerSidebarView view, PlaceController placeController, EventBus bus, LedgerServiceAsync service, GlobalSettings globalSettings) { this.view = view; this.placeController = placeController; this.bus = bus; this.service = service; addRegistration(bus.addHandler(GlobalSettingsRefreshedEvent.TYPE, this)); addRegistration(bus.addHandler(AccountSelectionModeChange.TYPE, this)); resetDelegate(); delegate.onRefresh(); onSettingsRefreshed(globalSettings); } @Override public void onSettingsRefreshed(GlobalSettings gs) { this.globalSettings = gs; //view.setDateFormat(gs.getValue(GlobalOption.OPT_DATE_FORMAT)); } @Override public void stop() { super.stop(); if (delegate != null) delegate.stop(); } @Override public void onNewAccount() { if (delegate != null) delegate.onNewAccount(); } @Override public void onFilter(String filter) { if (delegate != null) delegate.onFilter(filter); } @Override public void onSingleSelectionChange(Account selectedAccount) { if (delegate != null) delegate.onSingleSelectionChange(selectedAccount); } @Override public void onMultiSelectionChange(AccountsQueryCriteria[] selectedAccounts) { if (delegate != null) delegate.onMultiSelectionChange(selectedAccounts); } @Override public void onSelectionModeChange(AccountSelectionModeChange event) { // If the event has null options, we need to reset the delegate, unless it's already in // that state, then we avoid the refresh roundtrip if (event.getOptions() == null) { if (delegateDefaultState) { return; } else { resetDelegate(); delegate.onRefresh(); return; } } // Are the options the same? boolean currentModeMatches = AccountTreeSelectView.Option.equals( delegate.getOptions(), event.getOptions() ); if (!currentModeMatches) { delegate.stop(); delegate = new AccountTreeSelectPresenter( view, placeController, bus, service, event.getOptions(), event.getPreselectedAccounts() ); delegateDefaultState = false; delegate.onRefresh(); } } protected void resetDelegate() { if (delegate != null) delegate.stop(); delegate = new AccountTreeSelectPresenter( view, placeController, bus, service, new AccountTreeSelectView.Option[]{ AccountTreeSelectView.Option.NEW_BUTTON, AccountTreeSelectView.Option.LABEL_FILTER } ); delegateDefaultState = true; } }