package org.sigmah.client.ui.view.project.dashboard; /* * #%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 java.util.Arrays; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.presenter.project.dashboard.PhasesPresenter; import org.sigmah.client.ui.res.icon.IconImageBundle; import org.sigmah.client.ui.view.base.AbstractView; import org.sigmah.client.ui.widget.button.Button; 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.element.FlexibleElementDTO; import org.sigmah.shared.dto.element.FlexibleElementType; import com.extjs.gxt.ui.client.Style.HorizontalAlignment; import com.extjs.gxt.ui.client.Style.LayoutRegion; import com.extjs.gxt.ui.client.Style.Scroll; 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.TabPanel; import com.extjs.gxt.ui.client.widget.grid.CheckColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnData; 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.GridCellRenderer; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.user.client.ui.Widget; /** * Phases view implementation. * * @author Denis Colliot (dcolliot@ideia.fr) */ public class PhasesView extends AbstractView implements PhasesPresenter.View { // CSS style names. public static final String PROJECT_CURRENT_PHASE_PANEL = "project-current-phase-panel"; public static final String PROJECT_PHASE_ACTIVE = "project-phase-active"; public static final String PROJECT_PHASE_CLOSED = "project-phase-closed"; private static final String X_BORDER_PANEL = "x-border-panel"; private static final String WHITE_TAB_BODY = "white-tab-body"; private ContentPanel requiredElementContentPanel; private Grid<FlexibleElementDTO> gridRequiredElements; private TabPanel tabPanelPhases; private ToolBar toolBar; private LayoutContainer panelProjectModel; private LayoutContainer panelSelectedPhase; private Button buttonSavePhase; private Button buttonActivatePhase; private Button buttonPhaseGuide; /** * The counter before the main panel is unmasked. */ private int maskCount; /** * {@inheritDoc} */ @Override public void initialize() { gridRequiredElements = new Grid<FlexibleElementDTO>(new ListStore<FlexibleElementDTO>(), getRequiredElementsColumModel()); gridRequiredElements.setAutoExpandColumn(FlexibleElementDTO.LABEL); gridRequiredElements.getView().setForceFit(true); // Phases tab panel tabPanelPhases = new TabPanel(); tabPanelPhases.setPlain(true); tabPanelPhases.setTabScroll(true); tabPanelPhases.setAnimScroll(true); tabPanelPhases.addStyleName(X_BORDER_PANEL); tabPanelPhases.addStyleName(WHITE_TAB_BODY); // Toolbar toolBar = new ToolBar(); toolBar.setAlignment(HorizontalAlignment.LEFT); toolBar.setBorders(false); buttonSavePhase = Forms.button(I18N.CONSTANTS.projectSavePhaseButton(), IconImageBundle.ICONS.save()); buttonActivatePhase = Forms.button(I18N.CONSTANTS.projectClosePhaseButton(), IconImageBundle.ICONS.activate()); buttonPhaseGuide = Forms.button(I18N.CONSTANTS.projectPhaseGuideHeader(), IconImageBundle.ICONS.info()); buttonActivatePhase.setEnabled(false); buttonSavePhase.setEnabled(false); buttonPhaseGuide.setEnabled(false); toolBar.add(buttonActivatePhase); toolBar.add(new SeparatorToolItem()); toolBar.add(buttonSavePhase); toolBar.add(new SeparatorToolItem()); toolBar.add(buttonPhaseGuide); // Tab item main panel panelProjectModel = Layouts.border(false, PROJECT_CURRENT_PHASE_PANEL); panelProjectModel.setBorders(false); panelSelectedPhase = Layouts.fit(false); requiredElementContentPanel = new ContentPanel(new FitLayout()); requiredElementContentPanel.add(gridRequiredElements); panelProjectModel.add(requiredElementContentPanel, Layouts.borderLayoutData(LayoutRegion.WEST, Layouts.LEFT_COLUMN_WIDTH, Margin.HALF_RIGHT, Margin.HALF_BOTTOM, Margin.HALF_LEFT)); final ContentPanel cp2 = Panels.content(I18N.CONSTANTS.phaseDetails(), Layouts.fitLayout()); cp2.setScrollMode(Scroll.AUTOY); cp2.setTopComponent(toolBar); cp2.add(panelSelectedPhase, Layouts.fitData(Margin.HALF_TOP, Margin.HALF_RIGHT, Margin.HALF_BOTTOM, Margin.HALF_LEFT)); panelProjectModel.add(cp2, Layouts.borderLayoutData(LayoutRegion.CENTER, Margin.HALF_RIGHT, Margin.HALF_BOTTOM)); } /** * {@inheritDoc} */ @Override public Widget asWidget() { return tabPanelPhases; } /** * Generates the {@link ColumnModel} for the required elements grid. * * @return the {@link ColumnModel} for the required elements grid. */ private static ColumnModel getRequiredElementsColumModel() { // Element's label. final ColumnConfig labelColumn = new ColumnConfig(FlexibleElementDTO.LABEL, I18N.CONSTANTS.projectRequiredElementsGridLabel(), 150); // Element's completion. final CheckColumnConfig filledInColumn = new CheckColumnConfig("filledIn", I18N.CONSTANTS.projectRequiredElementsGridChecked(), 50); filledInColumn.setMenuDisabled(false); filledInColumn.setSortable(false); filledInColumn.setRenderer(new GridCellRenderer<FlexibleElementDTO>() { @Override public Object render(FlexibleElementDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<FlexibleElementDTO> store, Grid<FlexibleElementDTO> grid) { if (model.isFilledIn()) { return IconImageBundle.ICONS.elementCompleted().createImage(); } else { return IconImageBundle.ICONS.elementUncompleted().createImage(); } } }); // Element's type. final ColumnConfig typeColumn = new ColumnConfig("typeOfElement", I18N.CONSTANTS.projectRequiredElementsElementType(), 75); typeColumn.setRenderer(new GridCellRenderer<FlexibleElementDTO>() { @Override public Object render(FlexibleElementDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<FlexibleElementDTO> store, Grid<FlexibleElementDTO> grid) { return FlexibleElementType.getFlexibleElementTypeName(model); } }); return new ColumnModel(Arrays.asList(filledInColumn, labelColumn, typeColumn)); } /** * {@inheritDoc} */ @Override public void mask(int count) { maskCount = count; tabPanelPhases.mask(I18N.CONSTANTS.loading()); } /** * {@inheritDoc} */ @Override public boolean unmask() { maskCount--; if (maskCount == 0) { tabPanelPhases.unmask(); return true; } return false; } /** * {@inheritDoc} */ @Override public Button getButtonActivatePhase() { return buttonActivatePhase; } /** * {@inheritDoc} */ @Override public Button getButtonPhaseGuide() { return buttonPhaseGuide; } /** * {@inheritDoc} */ @Override public Button getButtonSavePhase() { return buttonSavePhase; } /** * {@inheritDoc} */ @Override public Grid<FlexibleElementDTO> getGridRequiredElements() { return gridRequiredElements; } /** * {@inheritDoc} */ @Override public LayoutContainer getPanelProjectModel() { return panelProjectModel; } /** * {@inheritDoc} */ @Override public LayoutContainer getPanelSelectedPhase() { return panelSelectedPhase; } /** * {@inheritDoc} */ @Override public TabPanel getTabPanelPhases() { return tabPanelPhases; } /** * {@inheritDoc} */ @Override public void flushToolbar() { toolBar.removeAll(); toolBar.removeAllListeners(); } /** * {@inheritDoc} */ @Override public void fillToolbar(final boolean changePhaseAuthorized) { flushToolbar(); if (changePhaseAuthorized) { toolBar.add(buttonActivatePhase); toolBar.add(new SeparatorToolItem()); } toolBar.add(buttonSavePhase); toolBar.add(new SeparatorToolItem()); toolBar.add(buttonPhaseGuide); } /** * {@inheritDoc} */ @Override public ContentPanel getRequiredElementContentPanel() { return requiredElementContentPanel; } @Override public void setLoading(boolean loading) { if(loading) { mask(1); } else { unmask(); } } @Override public boolean isLoading() { return maskCount > 0; } @Override public void layout() { layoutContainer.layout(true); } }