package org.sigmah.client.ui.view.admin.models.base; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import org.sigmah.client.dispatch.monitor.LoadingMask; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.presenter.admin.models.base.AbstractModelsAdminPresenter; import org.sigmah.client.ui.res.icon.IconImageBundle; import org.sigmah.client.ui.view.base.AbstractView; import org.sigmah.client.ui.widget.Loadable; import org.sigmah.client.ui.widget.button.Button; import org.sigmah.client.ui.widget.form.FormPanel; import org.sigmah.client.ui.widget.form.Forms; import org.sigmah.client.ui.widget.layout.Layouts; import org.sigmah.client.ui.widget.layout.Layouts.Margin; import org.sigmah.client.ui.widget.panel.Panels; import org.sigmah.shared.dto.IsModel; import com.extjs.gxt.ui.client.Style; import com.extjs.gxt.ui.client.Style.LayoutRegion; import com.extjs.gxt.ui.client.Style.Scroll; import com.extjs.gxt.ui.client.Style.SelectionMode; import com.extjs.gxt.ui.client.event.ComponentEvent; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.TabItem; import com.extjs.gxt.ui.client.widget.TabPanel; import com.extjs.gxt.ui.client.widget.button.IconButton; import com.extjs.gxt.ui.client.widget.button.ToolButton; import com.extjs.gxt.ui.client.widget.form.AdapterField; import com.extjs.gxt.ui.client.widget.form.CheckBox; import com.extjs.gxt.ui.client.widget.form.DateField; import com.extjs.gxt.ui.client.widget.form.Field; import com.extjs.gxt.ui.client.widget.form.TimeField; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel; import com.extjs.gxt.ui.client.widget.layout.BorderLayout; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.user.client.ui.Widget; import java.util.Date; /** * Models administration presenters abstract view implementation. * * @author Denis Colliot (dcolliot@ideia.fr) (v2.0) */ public abstract class AbstractModelsAdminView<E extends IsModel> extends AbstractView implements AbstractModelsAdminPresenter.View<E> { // CSS style names. private static final String STYLE_TOOL_CLOSE_ICON = "x-tool-close"; // -- // GRID PANEL. // -- private ContentPanel gridPanel; private Grid<E> grid; private Button addButton; private Button importButton; private Button deleteButton; private Button exportButton; private Button duplicateButton; private GridEventHandler<E> gridEventHandler; // -- // DETAILS PANEL. // -- private LayoutContainer detailsContainer; private FormPanel detailsHeaderForm; private ToolButton closeButton; private Button saveDetailsHeaderButton; private AdapterField maintenanceGroupField; private CheckBox underMaintenanceField; private DateField maintenanceDateField; private TimeField maintenanceTimeField; private TabPanel tabPanel; /** * {@inheritDoc} */ @Override public final void initialize() { // -- // GRID PANEL. // -- gridPanel = Panels.content("Models"); // TODO i18n grid = new Grid<E>(new ListStore<E>(), getColumnModel()); grid.setAutoHeight(true); grid.getView().setForceFit(true); final GridSelectionModel<E> selectionModel = new GridSelectionModel<E>(); selectionModel.setSelectionMode(SelectionMode.SINGLE); grid.setSelectionModel(selectionModel); gridPanel.setTopComponent(createGridToolBar()); gridPanel.setScrollMode(Style.Scroll.AUTO); gridPanel.add(grid); // -- // MAINTENANCE FIELDS. // -- underMaintenanceField = Forms.checkbox(I18N.CONSTANTS.UNDER_MAINTENANCE()); maintenanceDateField = Forms.date(null, true); maintenanceTimeField = Forms.time(null, true); maintenanceDateField.setVisible(false); maintenanceTimeField.setVisible(false); final com.google.gwt.user.client.ui.Grid maintenanceGrid = new com.google.gwt.user.client.ui.Grid(1, 5); maintenanceGrid.setWidget(0, 0, underMaintenanceField); maintenanceGrid.setWidget(0, 2, maintenanceDateField); maintenanceGrid.setWidget(0, 4, maintenanceTimeField); maintenanceGroupField = new AdapterField(maintenanceGrid); maintenanceGroupField.setFieldLabel(I18N.CONSTANTS.UNDER_MAINTENANCE()); // -- // DETAILS PANEL. // -- detailsContainer = Layouts.fit(false, "x-border-layout-ct"); detailsHeaderForm = buildHeaderForm(); closeButton = new ToolButton(STYLE_TOOL_CLOSE_ICON); detailsHeaderForm.getHeader().addTool(closeButton); detailsHeaderForm.setHeaderVisible(true); saveDetailsHeaderButton = Forms.button(I18N.CONSTANTS.save(), IconImageBundle.ICONS.save()); detailsHeaderForm.addButton(saveDetailsHeaderButton); tabPanel = Panels.tab(Layouts.STYLE_WHITE_BACKGROUND); tabPanel.setPlain(true); // -- // GENERAL INITIALIZATION. // -- add(gridPanel, Layouts.borderLayoutData(LayoutRegion.WEST, 500f, true, Margin.RIGHT)); add(detailsContainer); } /** * {@inheritDoc} */ @Override public final void setGridEventHandler(final GridEventHandler<E> gridEventHandler) { this.gridEventHandler = gridEventHandler; } /** * {@inheritDoc} */ @Override public final Button getGridAddButton() { return addButton; } /** * {@inheritDoc} */ @Override public final Button getGridImportButton() { return importButton; } /** * {@inheritDoc} */ @Override public final Button getGridDeleteButton() { return deleteButton; } /** * {@inheritDoc} */ @Override public final Button getGridExportButton() { return exportButton; } /** * {@inheritDoc} */ @Override public final Button getGridDuplicateButton() { return duplicateButton; } /** * {@inheritDoc} */ @Override public final Grid<E> getGrid() { return grid; } /** * {@inheritDoc} */ @Override public final ListStore<E> getStore() { return grid.getStore(); } /** * {@inheritDoc} */ @Override public final Loadable getGridMask() { return new LoadingMask(grid); } /** * {@inheritDoc} */ @Override public final Loadable getDetailsPanelMask() { return new LoadingMask(detailsContainer); } /** * {@inheritDoc} */ @Override public final void loadModel(final E model) { detailsContainer.removeAll(); if (model == null) { return; } final String modelHeader = loadModelHeader(model); detailsHeaderForm.setHeadingHtml(modelHeader); final LayoutContainer container = Layouts.border(false); container.add(detailsHeaderForm, Layouts.borderLayoutData(LayoutRegion.NORTH, getDetailsHeaderFormHeight(), Margin.BOTTOM)); container.add(tabPanel, Layouts.borderLayoutData(LayoutRegion.CENTER)); detailsContainer.add(container); detailsContainer.layout(); selectFirstTab(); } /** * Height of the details header form (can be overwritten if necessary). * * @return The height of the details header form. */ public float getDetailsHeaderFormHeight() { return 200.0f; } /** * {@inheritDoc} */ @Override public final IconButton getDetailsCloseButton() { return closeButton; } /** * {@inheritDoc} */ @Override public final Button getHeaderSaveButton() { return saveDetailsHeaderButton; } /** * {@inheritDoc} */ @Override public final void addTab(final String tabTitle, final Widget tabView, final Listener<ComponentEvent> listener) { final TabItem tabItem = new TabItem(tabTitle); tabItem.addListener(Events.Select, listener); tabItem.add(tabView); tabItem.setScrollMode(Scroll.AUTO); tabPanel.add(tabItem); } /** * {@inheritDoc} */ @Override public final void selectFirstTab() { tabPanel.setSelection(tabPanel.getItem(0)); } /** * {@inheritDoc} */ @Override public FormPanel getHeaderForm() { return detailsHeaderForm; } /** * {@inheritDoc} */ @Override public void setModelGridPanelExpanded(boolean expanded) { final BorderLayout layout = (BorderLayout) ((LayoutContainer)asWidget()).getLayout(); if(expanded) { layout.expand(LayoutRegion.WEST); } else { layout.collapse(LayoutRegion.WEST); } } /** * {@inheritDoc} */ @Override public com.google.gwt.user.client.ui.Grid getMaintenanceGrid() { return (com.google.gwt.user.client.ui.Grid) maintenanceGroupField.getWidget(); } /** * {@inheritDoc} */ @Override public Field<Boolean> getUnderMaintenanceField() { return underMaintenanceField; } /** * {@inheritDoc} */ @Override public Field<Date> getMaintenanceDateField() { return maintenanceDateField; } /** * {@inheritDoc} */ @Override public TimeField getMaintenanceTimeField() { return maintenanceTimeField; } /** * {@inheritDoc} */ @Override public Field<?> getMaintenanceGroupField() { return maintenanceGroupField; } // --------------------------------------------------------------------------------------------------------------- // // UTILITY METHODS. // // --------------------------------------------------------------------------------------------------------------- /** * Returns the grid events handler. * * @return The grid events handler. */ protected final GridEventHandler<E> getGridEventHandler() { return gridEventHandler; } /** * Creates the project models grid toolbar and its buttons. * * @return The toolbar component. */ private ToolBar createGridToolBar() { final ToolBar toolbar = new ToolBar(); addButton = Forms.button(I18N.CONSTANTS.addItem(), IconImageBundle.ICONS.add()); toolbar.add(addButton); importButton = Forms.button(I18N.CONSTANTS.importItem(), IconImageBundle.ICONS.up()); toolbar.add(importButton); // -- // Following buttons should be enabled only if a single item is selected. // -- deleteButton = Forms.button(I18N.CONSTANTS.delete(), IconImageBundle.ICONS.delete()); deleteButton.disable(); toolbar.add(deleteButton); exportButton = Forms.button(I18N.CONSTANTS.export(), IconImageBundle.ICONS.down()); exportButton.disable(); toolbar.add(exportButton); duplicateButton = Forms.button(I18N.CONSTANTS.adminModelCopy(), IconImageBundle.ICONS.add()); duplicateButton.disable(); toolbar.add(duplicateButton); return toolbar; } // --------------------------------------------------------------------------------------------------------------- // // ABSTRACT METHODS. // // --------------------------------------------------------------------------------------------------------------- /** * Returns the main grid's column model. * * @return The column model. */ protected abstract ColumnModel getColumnModel(); /** * Builds the header form panel and its fields.<br> * Should not include the save button. * * @return The header form panel. */ protected abstract FormPanel buildHeaderForm(); /** * Loads the given {@code model} header. * * @param model * The loaded model. * @return The model header name displayed into panel header. */ protected abstract String loadModelHeader(E model); }