package org.sigmah.client.ui.view.admin.orgunits; /* * #%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.ArrayList; import java.util.List; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.presenter.admin.orgunits.AddOrgUnitAdminPresenter; import org.sigmah.client.ui.presenter.admin.orgunits.OrgUnitsAdminPresenter; import org.sigmah.client.ui.res.icon.IconImageBundle; import org.sigmah.client.ui.res.icon.orgunit.OrgUnitImageBundle; 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.panel.Panels; import org.sigmah.client.util.TreeGridCheckboxSelectionModel; import org.sigmah.shared.dto.OrgUnitModelDTO; import org.sigmah.shared.dto.country.CountryDTO; import org.sigmah.shared.dto.orgunit.OrgUnitDTO; import com.extjs.gxt.ui.client.Style.HorizontalAlignment; import com.extjs.gxt.ui.client.Style.SelectionMode; import com.extjs.gxt.ui.client.Style.SortDir; import com.extjs.gxt.ui.client.data.SortInfo; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.store.Store; import com.extjs.gxt.ui.client.store.StoreSorter; import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel; 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.toolbar.SeparatorToolItem; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid; import com.extjs.gxt.ui.client.widget.treegrid.TreeGridCellRenderer; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.InlineLabel; import com.google.inject.Singleton; /** * {@link AddOrgUnitAdminPresenter}'s view implementation. * * @author Denis Colliot (dcolliot@ideia.fr) */ @Singleton public class OrgUnitsAdminView extends AbstractView implements OrgUnitsAdminPresenter.View { // CSS style names. private static final String STYLE_FLEXIBILITY_ACTION = "flexibility-action"; private ContentPanel mainPanel; private TreeGrid<OrgUnitDTO> treeGrid; private ToolBar toolbar; private Button addButton; private Button moveButton; private Button removeButton; private TreeGridEventHandler<OrgUnitDTO> handler; /** * {@inheritDoc} */ @Override public void initialize() { mainPanel = Panels.content(I18N.CONSTANTS.orgunitTree(), Layouts.fitLayout()); mainPanel.setTopComponent(buildToolbar()); mainPanel.add(buildTreeGrid()); add(mainPanel); } /** * Builds the tree grid component. * * @return The tree grid component. */ private Component buildTreeGrid() { // -- // Code column. // -- final ColumnConfig nameColumn = new ColumnConfig(); nameColumn.setId(OrgUnitDTO.NAME); nameColumn.setHeaderHtml(I18N.CONSTANTS.projectName()); nameColumn.setRenderer(new TreeGridCellRenderer<OrgUnitDTO>()); nameColumn.setWidth(150); // -- // Title column. // -- final ColumnConfig fullNameColumn = new ColumnConfig(); fullNameColumn.setId(OrgUnitDTO.FULL_NAME); fullNameColumn.setHeaderHtml(I18N.CONSTANTS.projectFullName()); fullNameColumn.setRenderer(new GridCellRenderer<OrgUnitDTO>() { @Override public Object render(final OrgUnitDTO model, final String property, final ColumnData config, final int rowIndex, final int colIndex, final ListStore<OrgUnitDTO> store, final Grid<OrgUnitDTO> grid) { final InlineLabel visitButton = new InlineLabel((String) model.get(property)); visitButton.addStyleName(STYLE_FLEXIBILITY_ACTION); visitButton.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent e) { handler.onRowClickEvent(model); } }); return visitButton; } }); // -- // Country column. // -- final ColumnConfig countryColumn = new ColumnConfig(); countryColumn.setId(OrgUnitDTO.OFFICE_LOCATION_COUNTRY); countryColumn.setHeaderHtml(I18N.CONSTANTS.projectCountry()); countryColumn.setWidth(100); countryColumn.setRenderer(new GridCellRenderer<OrgUnitDTO>() { @Override public Object render(final OrgUnitDTO model, final String property, final ColumnData config, final int rowIndex, final int colIndex, final ListStore<OrgUnitDTO> store, final Grid<OrgUnitDTO> grid) { final CountryDTO country = (CountryDTO) model.get(property); if (country == null) { return ""; } return country.getName() + " (" + country.getCodeISO() + ')'; } }); // -- // OrgUnitModel column. // -- final ColumnConfig modelColumn = new ColumnConfig(); modelColumn.setId(OrgUnitDTO.MODEL); modelColumn.setHeaderHtml(I18N.CONSTANTS.projectModel()); modelColumn.setWidth(200); modelColumn.setRenderer(new GridCellRenderer<OrgUnitDTO>() { @Override public Object render(final OrgUnitDTO model, final String property, final ColumnData config, final int rowIndex, final int colIndex, final ListStore<OrgUnitDTO> store, final Grid<OrgUnitDTO> grid) { final OrgUnitModelDTO orgUnitModel = (OrgUnitModelDTO) model.get(property); return orgUnitModel != null ? orgUnitModel.getName() : ""; } }); // -- // Tree store. // -- final TreeStore<OrgUnitDTO> store = new TreeStore<OrgUnitDTO>(); store.setSortInfo(new SortInfo(OrgUnitDTO.NAME, SortDir.ASC)); store.setStoreSorter(new StoreSorter<OrgUnitDTO>() { @Override public int compare(final Store<OrgUnitDTO> store, final OrgUnitDTO m1, final OrgUnitDTO m2, final String property) { if (OrgUnitDTO.OFFICE_LOCATION_COUNTRY.equals(property)) { final CountryDTO country1 = (CountryDTO) m1.get(property); final CountryDTO country2 = (CountryDTO) m2.get(property); return country1.getName().compareToIgnoreCase(country2.getName()); } else { return super.compare(store, m1, m2, property); } } }); // -- // Tree selection model. // -- final CheckBoxSelectionModel<OrgUnitDTO> selectionModel = new TreeGridCheckboxSelectionModel<OrgUnitDTO>(); selectionModel.setSelectionMode(SelectionMode.SINGLE); final List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); columns.add(selectionModel.getColumn()); columns.add(nameColumn); columns.add(fullNameColumn); columns.add(countryColumn); columns.add(modelColumn); // -- // Tree grid. // -- treeGrid = new TreeGrid<OrgUnitDTO>(store, new ColumnModel(columns)); treeGrid.setBorders(true); treeGrid.getStyle().setLeafIcon(OrgUnitImageBundle.ICONS.orgUnitSmall()); treeGrid.getStyle().setNodeCloseIcon(OrgUnitImageBundle.ICONS.orgUnitSmall()); treeGrid.getStyle().setNodeOpenIcon(OrgUnitImageBundle.ICONS.orgUnitSmallTransparent()); treeGrid.setAutoExpandColumn(OrgUnitDTO.FULL_NAME); treeGrid.setTrackMouseOver(false); treeGrid.setSelectionModel(selectionModel); treeGrid.addPlugin(selectionModel); return treeGrid; } /** * Builds the toolbar component. * * @return The toolbar component. */ private Component buildToolbar() { // -- // Expand all button. // -- final Button expandButton = Forms.button(I18N.CONSTANTS.expandAll(), IconImageBundle.ICONS.expand(), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(final ButtonEvent ce) { treeGrid.expandAll(); } }); // -- // Collapse all button. // -- final Button collapseButton = Forms.button(I18N.CONSTANTS.collapseAll(), IconImageBundle.ICONS.collapse(), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(final ButtonEvent ce) { treeGrid.collapseAll(); } }); // -- // Actions buttons. // -- addButton = Forms.button(I18N.CONSTANTS.addItem(), IconImageBundle.ICONS.add()); moveButton = Forms.button(I18N.CONSTANTS.adminOrgUnitMove(), IconImageBundle.ICONS.up()); removeButton = Forms.button(I18N.CONSTANTS.delete(), IconImageBundle.ICONS.delete()); // -- // Toolbar. // -- toolbar = new ToolBar(); toolbar.setAlignment(HorizontalAlignment.LEFT); toolbar.add(expandButton); toolbar.add(collapseButton); toolbar.add(new SeparatorToolItem()); toolbar.add(addButton); toolbar.add(moveButton); toolbar.add(removeButton); return toolbar; } /** * {@inheritDoc} */ @Override public TreeGrid<OrgUnitDTO> getTreeGrid() { return treeGrid; } /** * {@inheritDoc} */ @Override public TreeStore<OrgUnitDTO> getStore() { return treeGrid.getTreeStore(); } /** * {@inheritDoc} */ @Override public void setTreeGridEventHandler(final TreeGridEventHandler<OrgUnitDTO> handler) { this.handler = handler; } /** * {@inheritDoc} */ @Override public Button getAddButton() { return addButton; } /** * {@inheritDoc} */ @Override public Button getMoveButton() { return moveButton; } /** * {@inheritDoc} */ @Override public Button getRemoveButton() { return removeButton; } /** * {@inheritDoc} */ @Override public Component getMainPanel() { return mainPanel; } }