package org.gcube.portlets.user.workspace.client.view.windows.accounting; import java.util.ArrayList; import java.util.List; import org.gcube.portlets.user.workspace.client.resources.Resources; import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingEntryType; import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingField; import com.extjs.gxt.ui.client.Style.ButtonScale; import com.extjs.gxt.ui.client.Style.HorizontalAlignment; import com.extjs.gxt.ui.client.data.BaseModelData; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.GroupingStore; 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.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.grid.GridGroupRenderer; import com.extjs.gxt.ui.client.widget.grid.GroupColumnData; import com.extjs.gxt.ui.client.widget.grid.GroupingView; import com.extjs.gxt.ui.client.widget.grid.filters.DateFilter; import com.extjs.gxt.ui.client.widget.grid.filters.GridFilters; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; public class AccoutingInfoContainer extends LayoutContainer { protected static final String DATE = "Date"; protected static final String AUTHOR = "Author"; protected static final String OPERATION = "Operation"; protected static final String DESCRIPTION = "Description"; private ColumnModel cm; private Grid grid; private ContentPanel cp; private GroupingStore store = new GroupingStore(); private boolean groupingEnabled; public AccoutingInfoContainer(){ initContentPanel(); initGrid(); createToolBar(); } private void initContentPanel() { setLayout(new FitLayout()); getAriaSupport().setPresentation(true); cp = new ContentPanel(); cp.setHeaderVisible(false); cp.setBodyBorder(true); cp.setLayout(new FitLayout()); cp.setButtonAlign(HorizontalAlignment.CENTER); // cp.getHeader().setIconAltText("Grid Icon"); // cp.setSize(550, 280); add(cp); } private void createToolBar(){ ToolBar bar = new ToolBar(); final ToggleButton buttonGrouping = new ToggleButton("", Resources.getIconGridView()); buttonGrouping.setToolTip("Grouping by operation"); buttonGrouping.setScale(ButtonScale.SMALL); buttonGrouping.toggle(true); buttonGrouping.addSelectionListener(new SelectionListener() { @Override public void componentSelected(ButtonEvent ce) { if(buttonGrouping.isPressed()) enableGrouping(); else disableGrouping(); } }); bar.add(buttonGrouping); cp.setTopComponent(bar); } public void initGrid() { store.groupBy(OPERATION); List columns = new ArrayList(); ColumnConfig icon = createSortableColumnConfig("Type", "", 20); columns.add(icon); icon.setRenderer(new GridCellRenderer() { public Object render(ModelData model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) { if(model.get(OPERATION)!=null){ if(model.get(OPERATION).equals(GxtAccountingEntryType.CREATE)) return Resources.getIconCreateNew().createImage(); if(model.get(OPERATION).equals(GxtAccountingEntryType.READ)) return Resources.getIconRead().createImage(); else if(model.get(OPERATION).equals(GxtAccountingEntryType.CUT)) return Resources.getIconCut().createImage(); else if(model.get(OPERATION).equals(GxtAccountingEntryType.PASTE)) return Resources.getIconPaste().createImage(); else if(model.get(OPERATION).equals(GxtAccountingEntryType.REMOVE)) return Resources.getIconCancel().createImage(); else if(model.get(OPERATION).equals(GxtAccountingEntryType.RENAME)) return Resources.getIconRenameItem().createImage(); } return null; } }); ColumnConfig descr = createSortableColumnConfig(DESCRIPTION, DESCRIPTION, 230); columns.add(descr); descr.setRenderer(new GridCellRenderer() { public Object render(ModelData model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) { // if(model.get(OPERATION).equals(GxtAccountingEntryType.READ)) // return "

" // + model.get(DESCRIPTION)+ "

"; return model.get(DESCRIPTION); } }); ColumnConfig oper = createSortableColumnConfig(OPERATION, OPERATION, 70); columns.add(oper); ColumnConfig auth = createSortableColumnConfig(AUTHOR, AUTHOR, 120); columns.add(auth); ColumnConfig date = createSortableColumnConfig(DATE, DATE, 140); columns.add(date); cm = new ColumnModel(columns); final ColumnModel columnModel = cm; grid = new Grid(this.store, cm); GroupingView view = new GroupingView(); view.setShowGroupedColumn(true); this.grid.setView(view); view.setGroupRenderer(new GridGroupRenderer() { public String render(GroupColumnData data) { String f = columnModel.getColumnById(data.field).getHeader(); String l = data.models.size() == 1 ? "Item" : "Items"; return f + ": " + data.group + " (" + data.models.size() + " " + l + ")"; } }); GridFilters filters = new GridFilters(); filters.setLocal(true); DateFilter dateFilter = new DateFilter(DATE); filters.addFilter(dateFilter); grid.addPlugin(filters); grid.setBorders(true); grid.setStripeRows(true); grid.getView().setAutoFill(true); grid.setColumnLines(true); grid.setColumnReordering(true); grid.setStyleAttribute("borderTop", "none"); // grid.setLoadMask(true); cp.add(grid); } public void setPanelSize(int width, int height){ if(width>0 && height>0 && grid!=null){ cp.setSize(width, height); // grid.setSize(width, height); } } public AccoutingInfoContainer(List accountings) { initContentPanel(); initGrid(); updateListAccounting(accountings); } public void disableGrouping() { GroupingStore groupingStore = null; if (store instanceof GroupingStore) { groupingStore = (GroupingStore) store; if (groupingStore != null) { groupingStore.clearGrouping(); } this.groupingEnabled = false; } } public void enableGrouping() { GroupingStore groupingStore = null; if (store instanceof GroupingStore) { groupingStore = (GroupingStore) store; if (groupingStore != null) { groupingStore.groupBy(OPERATION); } this.groupingEnabled = true; } } public void updateListAccounting(List accountings){ List listModelData = new ArrayList(); store.removeAll(); for (GxtAccountingField gxtAccountingField : accountings) { BaseModelData baseModel = new BaseModelData(); baseModel.set(DESCRIPTION, gxtAccountingField.getDescription()); baseModel.set(OPERATION, gxtAccountingField.getOperation()); baseModel.set(AUTHOR, gxtAccountingField.getUser().getName()); baseModel.set(DATE, gxtAccountingField.getDate()); listModelData.add(baseModel); } store.add(listModelData); } @SuppressWarnings("unused") private void updateStore(ListStore store){ resetStore(); this.grid.getStore().add(store.getModels()); } public void resetStore(){ this.grid.getStore().removeAll(); } public ColumnConfig createSortableColumnConfig(String id, String name, int width) { ColumnConfig columnConfig = new ColumnConfig(id, name, width); columnConfig.setSortable(true); return columnConfig; } public void setHeaderTitle(String title) { cp.setHeading(title); // cp.layout(); } public boolean isGroupingEnabled() { return groupingEnabled; } public void setGroupingEnabled(boolean groupingEnabled) { this.groupingEnabled = groupingEnabled; } }