package org.sigmah.offline.view;
/*
* #%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.Style;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionEvent;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Status;
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.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
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.user.client.ui.AbstractImagePrototype;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.ui.res.icon.IconImageBundle;
import org.sigmah.client.ui.view.base.AbstractPopupView;
import org.sigmah.client.ui.widget.button.Button;
import org.sigmah.client.ui.widget.form.Forms;
import org.sigmah.client.ui.widget.panel.Panels;
import org.sigmah.client.ui.widget.popup.PopupWidget;
import org.sigmah.offline.presenter.FileSelectionPresenter;
import org.sigmah.offline.presenter.TreeGridFileModel;
import org.sigmah.shared.dto.base.EntityDTO;
import org.sigmah.shared.dto.element.FilesListElementDTO;
import org.sigmah.shared.dto.value.FileVersionDTO;
/**
* {@link FileSelectionPresenter}'s view implementation.
*
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
public class FileSelectionView extends AbstractPopupView<PopupWidget> implements FileSelectionPresenter.View {
private ContentPanel uploadPanel;
private ContentPanel downloadPanel;
private Button cancelButton;
private Button transferFilesButton;
private Map<Integer, TreeGridFileModel> parents;
/**
* Popup's initialization.
*/
public FileSelectionView() {
super(new PopupWidget(true), 620); // 800
}
@Override
public void initialize() {
this.parents = new HashMap<Integer, TreeGridFileModel>();
this.uploadPanel = createGridPanel(
I18N.CONSTANTS.sigmahOfflinePrepareOfflineFileTransferPopupUploads(),
IconImageBundle.ICONS.right());
this.downloadPanel = createGridPanel(
I18N.CONSTANTS.sigmahOfflinePrepareOfflineFileTransferPopupDownloads(),
IconImageBundle.ICONS.left());
final LayoutContainer container = new LayoutContainer(new RowLayout(Style.Orientation.VERTICAL));
container.add(uploadPanel);
container.add(downloadPanel);
this.cancelButton = Forms.button(I18N.CONSTANTS.cancel());
this.transferFilesButton = Forms.button(I18N.CONSTANTS.sigmahOfflinePrepareOfflineFileTransferButtonTransferFiles(),
IconImageBundle.ICONS.transfer());
getPopup().addButton(cancelButton);
getPopup().addButton(transferFilesButton);
initPopup(container);
}
@Override
public TreeStore<TreeGridFileModel> getUploadStore() {
return getUploadGrid().getTreeStore();
}
@Override
public TreeStore<TreeGridFileModel> getDownloadStore() {
return getDownloadGrid().getTreeStore();
}
@Override
public Button getCancelButton() {
return cancelButton;
}
@Override
public Button getTransferFilesButton() {
return transferFilesButton;
}
@Override
public GridSelectionModel<TreeGridFileModel> getUploadSelectionModel() {
return getUploadGrid().getSelectionModel();
}
@Override
public GridSelectionModel<TreeGridFileModel> getDownloadSelectionModel() {
return getDownloadGrid().getSelectionModel();
}
@Override
public void addFileVersionToUploadGrid(FileVersionDTO fileVersion, EntityDTO<Integer> parent) {
add(getUploadGrid(), fileVersion, parent);
}
@Override
public void addFileVersionToDownloadGrid(FileVersionDTO fileVersion, EntityDTO<Integer> parent) {
add(getDownloadGrid(), fileVersion, parent);
}
private void add(TreeGrid<TreeGridFileModel> grid, FileVersionDTO fileVersion, EntityDTO<Integer> parent) {
TreeGridFileModel parentModel = parents.get(parent.getId());
if(parentModel == null) {
parentModel = new TreeGridFileModel(parent);
parents.put(parent.getId(), parentModel);
grid.getTreeStore().add(parentModel, false);
}
final TreeGridFileModel fileVersionModel = new TreeGridFileModel(fileVersion);
grid.getTreeStore().add(parentModel, fileVersionModel, false);
}
@Override
public void selectAndExpandAll() {
getUploadGrid().expandAll();
getDownloadGrid().expandAll();
getUploadGrid().getSelectionModel().selectAll();
getDownloadGrid().getSelectionModel().selectAll();
}
@Override
public void setUploadSelectedFileSize(long totalSize) {
getStatus(uploadPanel).setText(I18N.MESSAGES.sigmahOfflinePrepareOfflineFileTransferTotalUploadSize(sizeToString(totalSize)));
}
@Override
public void setDownloadSelectedFileSize(long totalSize) {
getStatus(downloadPanel).setText(I18N.MESSAGES.sigmahOfflinePrepareOfflineFileTransferTotalDownloadSize(sizeToString(totalSize)));
}
@Override
public void clear() {
getUploadStore().removeAll();
getDownloadStore().removeAll();
// BUGFIX #698
parents.clear();
}
@Override
public TreeGrid<TreeGridFileModel> getUploadGrid() {
return (TreeGrid<TreeGridFileModel>) uploadPanel.getWidget(0);
}
@Override
public TreeGrid<TreeGridFileModel> getDownloadGrid() {
return (TreeGrid<TreeGridFileModel>) downloadPanel.getWidget(0);
}
private Status getStatus(ContentPanel contentPanel) {
return (Status) ((ToolBar) contentPanel.getBottomComponent()).getWidget(0);
}
private ContentPanel createGridPanel(String title, AbstractImagePrototype icon) {
final TreeStore<TreeGridFileModel> store = new TreeStore<TreeGridFileModel>();
final CheckBoxSelectionModel<TreeGridFileModel> selectionModel = createSelectionModel(store);
final TreeGrid<TreeGridFileModel> grid = new TreeGrid<TreeGridFileModel>(store, createColumnModel(selectionModel));
grid.setSelectionModel(selectionModel);
grid.addPlugin(selectionModel);
grid.getView().setForceFit(true);
final ToolBar bottomBar = new ToolBar();
bottomBar.add(new Status());
final ContentPanel panel = Panels.content(title);
panel.setIcon(icon);
panel.setHeight(200);
panel.add(grid);
panel.setBottomComponent(bottomBar);
return panel;
}
private CheckBoxSelectionModel<TreeGridFileModel> createSelectionModel(final TreeStore<TreeGridFileModel> store) {
final CheckBoxSelectionModel<TreeGridFileModel> selectionModel = new CheckBoxSelectionModel<TreeGridFileModel>();
selectionModel.addListener(Events.BeforeSelect, new Listener<SelectionEvent<TreeGridFileModel>>() {
@Override
public void handleEvent(SelectionEvent<TreeGridFileModel> be) {
final TreeGridFileModel model = be.getModel();
if(model.getChildren() != null) {
selectionModel.select(store.getChildren(model), true);
}
}
});
return selectionModel;
}
private ColumnModel createColumnModel(CheckBoxSelectionModel<TreeGridFileModel> selectionModel) {
// Project / org unit / file name column.
final ColumnConfig nameColumnConfig = new ColumnConfig(TreeGridFileModel.NAME, I18N.CONSTANTS.sigmahOfflinePrepareOfflineFileTransferColumnName(), 200);
nameColumnConfig.setRenderer(new TreeGridCellRenderer());
// Last modification date column.
final ColumnConfig lastModificationColumnConfig = new ColumnConfig(TreeGridFileModel.LAST_MODIFICATION, I18N.CONSTANTS.sigmahOfflinePrepareOfflineFileTransferColumnLastModification(), 85);
// Author full name column.
final ColumnConfig authorColumnConfig = new ColumnConfig(TreeGridFileModel.AUTHOR, I18N.CONSTANTS.flexibleElementFilesListAuthor(), 100);
// Size column.
final ColumnConfig sizeColumnConfig = new ColumnConfig(TreeGridFileModel.SIZE, I18N.CONSTANTS.flexibleElementFilesListSize(), 85);
return new ColumnModel(Arrays.asList(
selectionModel.getColumn(),
nameColumnConfig,
lastModificationColumnConfig,
authorColumnConfig,
sizeColumnConfig
));
}
private String sizeToString(long size) {
final FilesListElementDTO.Size converter = FilesListElementDTO.Size.convertToBestUnit(new FilesListElementDTO.Size(size, FilesListElementDTO.Size.SizeUnit.BYTE));
return Math.round(converter.getSize()) + " " + FilesListElementDTO.Size.SizeUnit.getTranslation(converter.getUnit());
}
}