package org.sigmah.client.ui.view.contact; /* * #%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 com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.form.CheckBox; import com.extjs.gxt.ui.client.widget.form.CheckBoxGroup; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.extjs.gxt.ui.client.Style; import com.extjs.gxt.ui.client.event.BaseEvent; 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.util.Padding; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.button.ToggleButton; 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.HBoxLayout; import com.extjs.gxt.ui.client.widget.layout.VBoxLayout; import java.util.ArrayList; import java.util.List; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.presenter.contact.ContactRelationshipsPresenter; 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.FormPanel; 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.shared.command.result.ContactRelationship; import org.sigmah.shared.dto.ContactDTO; public class ContactRelationshipsView extends AbstractView implements ContactRelationshipsPresenter.View { private static final int RESIZE_DELAY = 200; private static final int BUTTONS_PANEL_HEIGHT = 50; private static final int PADDING = 10; private ContentPanel container; private ToolBar toolBar; private Button exportButton; private Grid<ContactRelationship> grid; private LayoutContainer buttonsContainer; private ToggleButton inboundToggleButton; private ToggleButton outboundToggleButton; @Override public void initialize() { container = Panels.content(null, false, Layouts.vBoxLayout(VBoxLayout.VBoxLayoutAlign.STRETCH, new Layouts.LayoutOptions(new Padding(10))), "x-border-layout-ct"); container.setScrollMode(Style.Scroll.AUTOY); add(container); exportButton = Forms.button(I18N.CONSTANTS.export(), IconImageBundle.ICONS.excel()); toolBar = new ToolBar(); toolBar.setAlignment(Style.HorizontalAlignment.LEFT); toolBar.setBorders(false); toolBar.add(exportButton); container.setTopComponent(toolBar); } /** * {@inheritDoc} */ @Override public void buildExportDialog(final ContactRelationshipsPresenter.ExportActionHandler handler) { final com.extjs.gxt.ui.client.widget.Window w = new com.extjs.gxt.ui.client.widget.Window(); w.setPlain(true); w.setModal(true); w.setBlinkModal(true); w.setLayout(new FitLayout()); w.setSize(400, 180); w.setHeadingHtml(I18N.CONSTANTS.exportData()); final FormPanel panel = Forms.panel(); final CheckBox allRelationsBox = Forms.checkbox(I18N.CONSTANTS.allRelations(), Boolean.TRUE); allRelationsBox.setEnabled(false); final CheckBox frameworkRelationsBox = Forms.checkbox(I18N.CONSTANTS.frameworkRelations()); final CheckBox relationsByElementBox = Forms.checkbox(I18N.CONSTANTS.relationsByElement()); final CheckBoxGroup options = Forms.checkBoxGroup(I18N.CONSTANTS.exportOptions(), com.extjs.gxt.ui.client.Style.Orientation.VERTICAL, allRelationsBox, frameworkRelationsBox, relationsByElementBox); panel.add(options); final Button export = Forms.button(I18N.CONSTANTS.export()); panel.getButtonBar().add(export); export.addSelectionListener(new SelectionListener<ButtonEvent>() { @Override public void componentSelected(final ButtonEvent ce) { if (handler != null) { handler.onExportContactRelationships(false, allRelationsBox.getValue(), frameworkRelationsBox.getValue(), relationsByElementBox.getValue()); } w.hide(); } }); w.add(panel); w.show(); } @Override public Button getExportButton() { return exportButton; } @Override public Grid<ContactRelationship> getRelationshipsGrid() { return grid; } @Override public ToggleButton outboundToggleButton() { return outboundToggleButton; } @Override public ToggleButton inboundToggleButton() { return inboundToggleButton; } @Override public void updateGridData(List<ContactRelationship> relationships) { grid.getStore().removeAll(); grid.getStore().add(relationships); grid.recalculate(); resizeGrid(grid, container, true); } @Override public void reloadView(ContactDTO contactDTO, ContactRelationshipsPresenter.AnchorHandler anchorHandler) { container.remove(buttonsContainer); container.remove(grid); container.layout(); outboundToggleButton = new ToggleButton(I18N.CONSTANTS.contactRelationshipOwnedByToggleButtonLabel()); inboundToggleButton = new ToggleButton(I18N.CONSTANTS.contactRelationshipOwnerOfToggleButtonLabel()); buttonsContainer = Layouts.hBox(HBoxLayout.HBoxLayoutAlign.MIDDLE); buttonsContainer.add(outboundToggleButton); buttonsContainer.add(inboundToggleButton); buttonsContainer.setHeight(BUTTONS_PANEL_HEIGHT); grid = new Grid<ContactRelationship>(new ListStore<ContactRelationship>(), generateColumnModel(contactDTO, anchorHandler)); grid.getView().setForceFit(true); grid.setAutoHeight(true); grid.addListener(Events.ViewReady, new Listener<BaseEvent>() { @Override public void handleEvent(BaseEvent be) { resizeGrid(grid, container, true); } }); Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { resizeGrid(grid, container, true); } }); container.add(buttonsContainer); container.add(grid); container.layout(); } private ColumnModel generateColumnModel(final ContactDTO contactDTO, final ContactRelationshipsPresenter.AnchorHandler anchorHandler) { List<ColumnConfig> columnConfigs = new ArrayList<ColumnConfig>(); columnConfigs.add(new ColumnConfig(ContactRelationship.FIELD_NAME, I18N.CONSTANTS.contactRelationshipElementLabel(), 200)); columnConfigs.add(new ColumnConfig(ContactRelationship.GROUP_NAME, I18N.CONSTANTS.contactRelationshipGroupTitle(), 200)); columnConfigs.add(new ColumnConfig(ContactRelationship.FORMATTED_TYPE, I18N.CONSTANTS.contactRelationshipType(), 100)); ColumnConfig nameColumnConfig = new ColumnConfig(ContactRelationship.FIELD_NAME, I18N.CONSTANTS.contactRelationshipName(), 250); nameColumnConfig.setRenderer(new GridCellRenderer<ContactRelationship>() { @Override public Object render(final ContactRelationship model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ContactRelationship> store, Grid<ContactRelationship> grid) { Anchor anchor = new Anchor(model.getName()); anchor.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { anchorHandler.handleClick(model.getType(), model.getRelationshipId()); } }); return anchor; } }); columnConfigs.add(nameColumnConfig); ColumnConfig memberColumnConfig = new ColumnConfig(ContactRelationship.FIELD_NAME, I18N.CONSTANTS.contactRelationshipMember(), 120); memberColumnConfig.setRenderer(new GridCellRenderer<ContactRelationship>() { @Override public Object render(ContactRelationship model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ContactRelationship> store, Grid<ContactRelationship> grid) { if (model.getDirection() == null) { return ""; } switch (model.getDirection()) { case INBOUND: return I18N.MESSAGES.contactRelationshipsInbound(contactDTO.getFullName()); case OUTBOUND: return I18N.MESSAGES.contactRelationshipsOutbound(contactDTO.getFullName()); default: return ""; } } }); columnConfigs.add(memberColumnConfig); return new ColumnModel(columnConfigs); } private void resizeGrid(final Grid grid, final LayoutContainer container, final boolean canBeDelayed) { new Timer() { @Override public void run() { if (!grid.isVisible()) { if (canBeDelayed) { this.schedule(RESIZE_DELAY); } return; } grid.setAutoHeight(false); int height; int maxHeight = container.getHeight() - PADDING * 2; int unwrappedGridHeight = grid.getView().getScroller().firstChild().getHeight() + grid.getView().getHeader().getHeight(); if (unwrappedGridHeight < maxHeight) { height = unwrappedGridHeight; } else { height = maxHeight; } grid.setHeight(height); grid.getView().layout(); } }.schedule(RESIZE_DELAY); } }