/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package de.unioninvestment.eai.portal.portlet.crud.mvp.presenters;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import de.unioninvestment.eai.portal.portlet.crud.GuiBuilder;
import de.unioninvestment.eai.portal.portlet.crud.Settings;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.CompoundSearch;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.CustomComponent;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Dialog;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Form;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.LazyInitializable;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Panel;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Portlet;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Region;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Tab;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Table;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Tabs;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.TextArea;
import de.unioninvestment.eai.portal.portlet.crud.mvp.presenters.configuration.PortletConfigurationPresenter;
import de.unioninvestment.eai.portal.portlet.crud.mvp.views.RowEditingFormView;
import de.unioninvestment.eai.portal.portlet.crud.mvp.views.ViewFactory;
import de.unioninvestment.eai.portal.portlet.crud.services.ConfigurationService;
import de.unioninvestment.eai.portal.support.vaadin.mvp.EventBus;
import de.unioninvestment.eai.portal.support.vaadin.mvp.Presenter;
/**
* Fabrik, die {@link Presenter} zurückliefert.
*
* @author carsten.mjartan
*/
@Configuration
@Lazy
@Scope("ui")
public class PresenterFactory {
@Autowired
private ViewFactory viewFactory;
@Autowired
private ConfigurationService configurationService;
@Autowired
private EventBus eventBus;
@Autowired
private Settings settings;
/**
* Liefert eine {@link GuiBuilder} zurück.
*
* @return GuiBuilder
*/
@Bean
@Lazy
@Scope("ui")
public GuiBuilder guiBuilder() {
return new GuiBuilder(this);
}
/**
* Liefert eine {@link PortletPresenter} zurück.
*
* @param portlet
* Portlet-Modell
*
* @return PortletPresenter
*/
public PortletPresenter portletPresenter(Portlet portlet) {
return new PortletPresenter(viewFactory.portletView(), portlet);
}
/**
* Liefert eine {@link PanelPresenter} zurück.
*
* @param panel
* das Panel-Modell
* @param dialogPresenterMap
* die Map mit allen Dialog-Presentern
*
* @return {@link PanelPresenter}
*/
public PanelPresenter panelPresenter(Panel panel,
Map<String, DialogPresenter> dialogPresenterMap) {
return new PanelPresenter(viewFactory.panelView(), panel,
dialogPresenterMap);
}
/**
* Liefert eine {@link PanelContentPresenter} zurück.
*
* @param panel
* Panel-Modell
*
* @return PanelContentPresenter
*/
public PanelContentPresenter panelContentPresenter(Panel panel) {
return new PanelContentPresenter(viewFactory.panelContentView(), panel);
}
/**
* Liefert einen {@link TextAreaPresenter} zurück.
*
* @param textarea
* TextArea-Modell
*
* @return TextAreaPresenter
*/
public TextAreaPresenter textAreaPresenter(TextArea textarea) {
return new TextAreaPresenter(viewFactory.textAreaView(
textarea.getWidth(), textarea.getHeight()), textarea);
}
/**
* Liefert eine {@link DialogPresenter} zurück.
*
* @param dialog
* Panel-Modell
*
* @return DialogPresenter
*/
public DialogPresenter dialogPresenter(Dialog dialog) {
return new DialogPresenter(viewFactory.panelContentView(), dialog);
}
/**
* Liefert einen {@link CollapsibleRegionPresenter} zurück.
*
* @param region
* das Modell-Objekt.
*
* @return die Presenter Instanz.
*/
public RegionPresenter regionPresenter(Region region) {
RegionPresenter presenter = null;
if (region.isCollapsible()) {
presenter = new CollapsibleRegionPresenter(
this.viewFactory.collapsibleRegionView(region.getWidth(),
region.getHeight()), region);
} else {
presenter = new RegionPresenter(this.viewFactory.regionView(true,
region.isHorizontalLayout(), region.getWidth(),
region.getHeight()), region);
}
return presenter;
}
/**
* Liefert eine {@link FormPresenter} zurück.
*
* @param form
* Form-Modell
*
* @return FormPresenter
*/
public FormPresenter formPresenter(Form form) {
return new FormPresenter(viewFactory.formView(), form);
}
/**
* Liefert eine {@link TablePresenter} zurück.
*
* @param table
* Table-Modell
*
* @return TablePresenter
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public TablePresenter tablePresenter(Table table) {
TablePresenter tablePresenter = new TablePresenter(
viewFactory.tableView(), table);
table.setPresenter(tablePresenter);
if (table.getPanel() instanceof LazyInitializable) {
((LazyInitializable) table.getPanel())
.addShowEventListener(tablePresenter);
} else {
tablePresenter.initialize();
}
return tablePresenter;
}
/**
*
* @param tabs
* Tabs
* @return Presenter der Tabs
*/
public TabsPresenter tabsPresenter(Tabs tabs) {
return new TabsPresenter(viewFactory.getTabsView(tabs.getWidth(),
tabs.getHeight()), tabs);
}
/**
* Liefert eine {@link PortletConfigurationPresenter} zurück.
*
* @return PortletConfigurationPresenter
*/
public PortletConfigurationPresenter portletConfigurationPresenter() {
return new PortletConfigurationPresenter(
viewFactory.portletConfigurationView(), configurationService,
eventBus, settings);
}
void setViewFactory(ViewFactory viewFactory) {
this.viewFactory = viewFactory;
}
void setConfigurationService(ConfigurationService configurationService) {
this.configurationService = configurationService;
}
void setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
}
/**
* Liefert einen {@link RowEditingFormPresenter} zurück.
*
* @param model
* {@link Dialog}-Model. In diesem Falle nur für die
* Back-Button-Caption.
* @param parentPanel
* das Parent-{@link Panel} (die Tabelle) an den der Form-Dialog
* attached wird.
* @param dialogId
* die Id des Dialogs.
* @return
*/
public RowEditingFormPresenter rowEditingFormPresenter(Dialog model,
Panel parentPanel, String dialogId, Table table) {
RowEditingFormView rowEditingFormView = viewFactory.rowEditingFormView(
parentPanel instanceof Tab, parentPanel.isHorizontalLayout(),
parentPanel.getWidth(), parentPanel.getHeight());
RowEditingFormPresenter rowEditingFormPresenter = new RowEditingFormPresenter(
rowEditingFormView, model, parentPanel, dialogId, table);
return rowEditingFormPresenter;
}
/**
* @param customComponent
* das Backing-Model
* @return den {@link Presenter} für Custom Components
*/
public CustomComponentPresenter customComponentPresenter(
CustomComponent customComponent) {
return new CustomComponentPresenter(viewFactory.customComponentView(
customComponent.getWidth(), customComponent.getHeight()),
customComponent);
}
public CompoundSearchPresenter compoundSearchPresenter(
CompoundSearch compoundSearch) {
return new CompoundSearchPresenter(viewFactory.compoundSearchView(),
compoundSearch);
}
}