package org.sigmah.client.ui.view.admin.importation;
/*
* #%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.dispatch.monitor.LoadingMask;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.ui.notif.ConfirmCallback;
import org.sigmah.client.ui.notif.N10N;
import org.sigmah.client.ui.presenter.admin.importation.ImportationSchemeAdminPresenter;
import org.sigmah.client.ui.presenter.admin.importation.ImportationSchemeAdminPresenter.ImportationSchemePresenterHandler;
import org.sigmah.client.ui.res.icon.IconImageBundle;
import org.sigmah.client.ui.view.base.AbstractView;
import org.sigmah.shared.dto.importation.ImportationSchemeDTO;
import org.sigmah.shared.dto.importation.VariableDTO;
import org.sigmah.shared.dto.referential.ImportationSchemeFileFormat;
import org.sigmah.shared.dto.referential.ImportationSchemeImportType;
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.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.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
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.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
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.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
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.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.inject.Singleton;
import org.sigmah.client.ui.widget.button.Button;
import org.sigmah.client.ui.widget.layout.Layouts;
import org.sigmah.client.ui.widget.panel.Panels;
/**
* View for {@link ImportationSchemeAdminPresenter}.
*
* @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr)
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
@Singleton
public class ImportationSchemeAdminView extends AbstractView implements ImportationSchemeAdminPresenter.View {
// CSS style names.
private static final String STYLE_TOOL_CLOSE_ICON = "x-tool-close";
private static final String STYLE_LAYOUT = "x-border-layout-ct";
private Grid<ImportationSchemeDTO> schemesGrid;
private Grid<VariableDTO> variablesGrid;
private ContentPanel schemePanel;
private ContentPanel variablePanel;
private IconButton closeButton;
private Button addVariableButton;
private Button deleteVariableButton;
private Button addSchemeButton;
private Button deleteSchemeButton;
private Button editSchemeButton;
private NumberField firstRow;
private TextField<String> sheetName;
private Button saveSheetNameFirstRowButton;
private Label firstRowLabel;
private Label sheetNameLabel;
private ImportationSchemePresenterHandler importationShemePresenterHandler;
@Override
public void initialize() {
schemePanel = Panels.content(I18N.CONSTANTS.adminImportationSchemes());
schemePanel.setWidth(450);
schemePanel.setScrollMode(Scroll.AUTOY);
schemesGrid = buildSchemasGrid();
schemePanel.add(schemesGrid);
schemePanel.setTopComponent(importationSchemeToolBar());
variablePanel = Panels.content(I18N.CONSTANTS.edit());
variablePanel.setScrollMode(Scroll.AUTOY);
variablesGrid = buildVariablesGrid();
variablePanel.add(variablesGrid);
variablePanel.setTopComponent(variableToolBar());
closeButton = new ToolButton(STYLE_TOOL_CLOSE_ICON);
variablePanel.getHeader().addTool(closeButton);
final LayoutContainer details = Layouts.fit(false, STYLE_LAYOUT);
details.add(variablePanel);
final BorderLayoutData leftLayoutData = new BorderLayoutData(LayoutRegion.WEST, 450);
leftLayoutData.setMargins(new Margins(0, 4, 0, 0));
add(schemePanel, leftLayoutData);
final BorderLayoutData mainLayoutData = new BorderLayoutData(LayoutRegion.CENTER);
mainLayoutData.setMargins(new Margins(0, 0, 0, 4));
add(details, mainLayoutData);
}
/**
* Variable Importation Scheme Grid
*
* @return Grid<VariableDTO>
*/
private Grid<VariableDTO> buildVariablesGrid() {
// Reference column.
final ColumnConfig referenceColumn = new ColumnConfig("reference", I18N.CONSTANTS.importVariableReference(), 75);
// Name column.
final ColumnConfig nameColumn = new ColumnConfig("name", I18N.CONSTANTS.importVariableName(), 300);
nameColumn.setRenderer(new GridCellRenderer<VariableDTO>() {
@Override
public Object render(final VariableDTO variable, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) {
final Anchor anchor = new Anchor(variable.getName());
anchor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
importationShemePresenterHandler.onVariableImportationSchemeEdit(variable);
}
});
final SimplePanel panel = new SimplePanel();
panel.addStyleName("project-grid-code");
panel.setWidget(anchor);
return panel;
}
});
final List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
configs.add(referenceColumn);
configs.add(nameColumn);
ColumnModel cm = new ColumnModel(configs);
final Grid<VariableDTO> variablesDTOGrid = new Grid<VariableDTO>(new ListStore<VariableDTO>(), cm);
variablesDTOGrid.getView().setForceFit(true);
variablesDTOGrid.hide();
return variablesDTOGrid;
}
/**
* Build Importation Scheme Grid
*
* @return Grid<ImportationSchemeDTO>
*/
private Grid<ImportationSchemeDTO> buildSchemasGrid() {
final ColumnConfig nameColumn = new ColumnConfig("name", I18N.CONSTANTS.importSchemeName(), 75);
nameColumn.setRenderer(new GridCellRenderer<ImportationSchemeDTO>() {
@Override
public Object render(final ImportationSchemeDTO model, String property, ColumnData config, int rowIndex, int colIndex,
ListStore<ImportationSchemeDTO> store, Grid<ImportationSchemeDTO> grid) {
final Anchor anchor = new Anchor(model.getName());
anchor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
importationShemePresenterHandler.onImportationSchemeEdit(model);
}
});
final com.google.gwt.user.client.ui.Grid panel = new com.google.gwt.user.client.ui.Grid(1, 2);
panel.setCellPadding(0);
panel.setCellSpacing(0);
panel.setWidget(0, 0, ImportationSchemeDTO.getFileFormatIcon(model));
panel.getCellFormatter().addStyleName(0, 0, "project-grid-code-icon");
panel.setWidget(0, 1, anchor);
panel.getCellFormatter().addStyleName(0, 1, "project-grid-code");
return panel;
}
});
final ColumnConfig typeColumn = new ColumnConfig("importType", I18N.CONSTANTS.adminImportSchemeFileImportType(), 50);
typeColumn.setRenderer(new GridCellRenderer<ImportationSchemeDTO>() {
@Override
public Object render(final ImportationSchemeDTO model, String property, ColumnData config, int rowIndex, int colIndex,
ListStore<ImportationSchemeDTO> store, Grid<ImportationSchemeDTO> grid) {
return ImportationSchemeImportType.getStringValue(model.getImportType());
}
});
final List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
configs.add(nameColumn);
configs.add(typeColumn);
final ColumnModel columnModel = new ColumnModel(configs);
final Grid<ImportationSchemeDTO> grid = new Grid<ImportationSchemeDTO>(new ListStore<ImportationSchemeDTO>(), columnModel);
grid.getSelectionModel().setSelectionMode(Style.SelectionMode.SINGLE);
grid.getView().setForceFit(true);
grid.setWidth(450);
return grid;
}
/**
* Importation Scheme Tool Bar
*
* @return ToolBar
*/
private ToolBar importationSchemeToolBar() {
// Add scheme button.
addSchemeButton = new Button(I18N.CONSTANTS.addItem(), IconImageBundle.ICONS.add());
// Delete scheme button.
deleteSchemeButton = new Button(I18N.CONSTANTS.delete(), IconImageBundle.ICONS.delete());
deleteSchemeButton.setEnabled(false);
// Edit scheme button.
editSchemeButton = new Button(I18N.CONSTANTS.edit(), IconImageBundle.ICONS.editPage());
editSchemeButton.setEnabled(false);
final ToolBar toolbar = new ToolBar();
toolbar.add(addSchemeButton);
toolbar.add(deleteSchemeButton);
toolbar.add(new SeparatorToolItem());
toolbar.add(editSchemeButton);
return toolbar;
}
/**
* Importation Scheme Variable Tool Bar
*
* @return ToolBar
*/
private ToolBar variableToolBar() {
ToolBar toolbar = new ToolBar();
firstRowLabel = new Label(I18N.CONSTANTS.adminImportationSchemeFirstRow());
toolbar.add(firstRowLabel);
firstRow = new NumberField();
firstRow.setAllowBlank(false);
firstRow.setWidth(50);
toolbar.add(firstRow);
sheetNameLabel = new Label(I18N.CONSTANTS.adminImportationSchemeSheetName());
toolbar.add(sheetNameLabel);
sheetName = new TextField<String>();
sheetName.setAllowBlank(false);
sheetName.setWidth(100);
toolbar.add(sheetName);
saveSheetNameFirstRowButton = new Button(I18N.CONSTANTS.save());
saveSheetNameFirstRowButton.setIcon(IconImageBundle.ICONS.save());
saveSheetNameFirstRowButton.setWidth(80);
sheetName.addListener(Events.OnKeyUp, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
saveSheetNameFirstRowButton.enable();
}
});
firstRow.addListener(Events.OnKeyUp, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
saveSheetNameFirstRowButton.enable();
}
});
saveSheetNameFirstRowButton.disable();
toolbar.add(saveSheetNameFirstRowButton);
addVariableButton = new Button(I18N.CONSTANTS.addItem(), IconImageBundle.ICONS.add());
toolbar.add(addVariableButton);
deleteVariableButton = new Button(I18N.CONSTANTS.delete(), IconImageBundle.ICONS.delete());
deleteVariableButton.setEnabled(false);
toolbar.add(deleteVariableButton);
return toolbar;
}
@Override
public void confirmDeleteSchemesSelected(final ConfirmCallback confirmCallback) {
if (getSchemesSelection().isEmpty()) {
N10N.infoNotif(I18N.CONSTANTS.delete(), I18N.CONSTANTS.adminImportationSchemesDeleteNone());
} else {
String confirmMessage = "";
for (ImportationSchemeDTO schemaToDelete : getSchemesSelection()) {
confirmMessage += schemaToDelete.getName() + ", ";
}
if (!confirmMessage.isEmpty()) {
confirmMessage = confirmMessage.substring(0, confirmMessage.lastIndexOf(", "));
}
confirmMessage = I18N.MESSAGES.confirmDeleteSchemes(confirmMessage);
N10N.confirmation(I18N.CONSTANTS.delete(), confirmMessage, new ConfirmCallback() {
@Override
public void onAction() {
// TODO
}
});
}
}
@Override
public void confirmDeleteVariablesSelected(final ConfirmCallback confirmCallback) {
if (getVariablesSelection().isEmpty()) {
N10N.infoNotif(I18N.CONSTANTS.delete(), I18N.CONSTANTS.adminVariablesDeleteNone());
} else {
String confirmMessage = "";
for (VariableDTO variableToDelete : getVariablesSelection()) {
confirmMessage += variableToDelete.getName() + ", ";
}
if (!confirmMessage.isEmpty()) {
confirmMessage = confirmMessage.substring(0, confirmMessage.lastIndexOf(", "));
}
confirmMessage = I18N.MESSAGES.confirmDeleteVariables(confirmMessage);
N10N.confirmation(I18N.CONSTANTS.delete(), confirmMessage, new ConfirmCallback() {
@Override
public void onAction() {
// TODO
}
});
}
}
/**
* @return the addVariableButton
*/
@Override
public Button getAddVariableButton() {
return addVariableButton;
}
/**
* @return the deleteVariableButton
*/
@Override
public Button getDeleteVariableButton() {
return deleteVariableButton;
}
/**
* @return the deleteSchemaButton
*/
@Override
public Button getDeleteSchemeButton() {
return deleteSchemeButton;
}
/**
* @return the addSchemaButton
*/
@Override
public Button getAddSchemeButton() {
return addSchemeButton;
}
@Override
public Button getEditSchemeButton() {
return editSchemeButton;
}
@Override
public IconButton getVariablesCloseButton() {
return closeButton;
}
/**
* @return the saveSheetNameFirstRowButton
*/
@Override
public Button getSaveSheetNameFirstRowButton() {
return saveSheetNameFirstRowButton;
}
@Override
public List<VariableDTO> getVariablesSelection() {
GridSelectionModel<VariableDTO> sm = variablesGrid.getSelectionModel();
return sm.getSelectedItems();
}
@Override
public List<ImportationSchemeDTO> getSchemesSelection() {
GridSelectionModel<ImportationSchemeDTO> sm = schemesGrid.getSelectionModel();
return sm.getSelectedItems();
}
@Override
public LoadingMask getVariablesLoadingMonitor() {
return new LoadingMask(variablesGrid, I18N.CONSTANTS.loading());
}
@Override
public LoadingMask getSchemesLoadingMonitor() {
return new LoadingMask(schemesGrid, I18N.CONSTANTS.loading());
}
@Override
public ListStore<VariableDTO> getVariablesStore() {
return variablesGrid.getStore();
}
@Override
public ListStore<ImportationSchemeDTO> getSchemesStore() {
return schemesGrid.getStore();
}
/**
* @return the schemesGrid
*/
@Override
public Grid<ImportationSchemeDTO> getSchemesGrid() {
return schemesGrid;
}
/**
* @return the variablesGrid
*/
@Override
public Grid<VariableDTO> getVariablesGrid() {
return variablesGrid;
}
@Override
public boolean isFirstRowSheetNameValid(ImportationSchemeFileFormat format) {
if (format.equals(ImportationSchemeFileFormat.CSV)) {
return firstRow.isValid();
} else {
return sheetName.isValid() && firstRow.isValid();
}
}
@Override
public void setImportationSchemePresenterHandler(ImportationSchemePresenterHandler importationSchemePresenterHandler) {
this.importationShemePresenterHandler = importationSchemePresenterHandler;
}
@Override
public ContentPanel getSchemePanel() {
return schemePanel;
}
@Override
public ContentPanel getVariablePanel() {
return variablePanel;
}
@Override
public NumberField getFirstRow() {
return firstRow;
}
@Override
public TextField<String> getSheetName() {
return sheetName;
}
@Override
public Label getFirstRowLabel() {
return firstRowLabel;
}
@Override
public Label getSheetNameLabel() {
return sheetNameLabel;
}
}