package org.gcube.portlets.user.workspaceexplorerapp.client.grid; import java.util.List; import java.util.Set; import org.gcube.portlets.user.workspaceexplorerapp.client.download.DownloadType; import org.gcube.portlets.user.workspaceexplorerapp.client.event.ClickItemEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.RightClickItemEvent; import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; import com.github.gwtbootstrap.client.ui.Pagination; import com.google.gwt.core.shared.GWT; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.DoubleClickHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.cellview.client.DataGrid; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.cellview.client.SimplePager; import com.google.gwt.user.client.Event; import com.google.gwt.view.client.CellPreviewEvent; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.MultiSelectionModel; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; /** * The Class AbstractItemTable. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 19, 2015 */ public abstract class AbstractItemsCellTable { protected DataGrid dataGrid; protected ListDataProvider dataProvider = new ListDataProvider(); protected Item itemContextMenu = null; protected boolean showMoreInfo; protected final MultiSelectionModel msm; protected final HandlerManager eventBus; /** * Inits the table. * * @param ItemTable * the Item table * @param pager * the pager * @param pagination * the pagination */ public abstract void initTable(final SimplePager pager, final Pagination pagination); /** * Instantiates a new abstract items cell table. * * @param eventBus the event bus * @param fireOnClick the fire on click */ public AbstractItemsCellTable(HandlerManager eventBus, boolean fireOnClick) { this.eventBus = eventBus; this.showMoreInfo = fireOnClick; dataGrid = new DataGrid(1); dataGrid.getElement().setId("data_grid_explorer"); dataGrid.getElement().setAttribute("id", "data_grid_explorer"); dataGrid.setWidth("100%"); dataGrid.setHeight("100%"); dataProvider.addDataDisplay(dataGrid); dataGrid.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); msm = new MultiSelectionModel(); dataGrid.setSelectionModel(msm); msm.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(final SelectionChangeEvent event) { final Set selectedObject = msm.getSelectedSet(); GWT.log("Clicked: "+selectedObject); // dataGrid.getRowContainer().removeClassName("dataGridSelectedRow"); if(selectedObject!=null && !selectedObject.isEmpty()){ // GWT.log("Current Selected Row : "+ dataGrid.getKeyboardSelectedRow()); // dataGrid.getRowElement(dataGrid.getKeyboardSelectedRow()).addClassName("dataGridSelectedRow"); // selectedItem(selectedObject); if(showMoreInfo) AbstractItemsCellTable.this.eventBus.fireEvent(new ClickItemEvent(selectedObject)); } } }); dataGrid.addDomHandler(new DoubleClickHandler() { @Override public void onDoubleClick(final DoubleClickEvent event) { Set selected = msm.getSelectedSet(); GWT.log("Double Click: "+selected); if (selected != null && !selected.isEmpty()) { Item item = selected.iterator().next(); if(item.isFolder() || item.isRoot() || item.isSharedFolder() || item.isSpecialFolder()) //IN CASE OF FOLDER OPEN IT AbstractItemsCellTable.this.eventBus.fireEvent(new LoadFolderEvent(selected.iterator().next())); else //IN CASE OF FILE DOWNLOAD IT... AbstractItemsCellTable.this.eventBus.fireEvent(new DownloadItemEvent(item, DownloadType.DOWNLOAD)); } } }, DoubleClickEvent.getType()); dataGrid.addDomHandler(new ContextMenuHandler() { @Override public void onContextMenu(ContextMenuEvent event) { event.preventDefault(); event.stopPropagation(); } }, ContextMenuEvent.getType()); dataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler() { @Override public void onCellPreview(CellPreviewEvent event) { // GWT.log("CellPreview click"); if (event.getNativeEvent().getButton() == NativeEvent.BUTTON_RIGHT && event.getNativeEvent().getType().equals("contextmenu")) { event.getNativeEvent().preventDefault(); event.getNativeEvent().stopPropagation(); // int clickedRow = event.getIndex(); Item item = event.getValue(); GWT.log("Right click on "+ item); AbstractItemsCellTable.this.eventBus.fireEvent(new RightClickItemEvent(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY(), item)); event.setCanceled(true); } } }); /*MenuBar options = new MenuBar(true); ScheduledCommand openCommand = new ScheduledCommand() { @Override public void execute() { AbstractItemsCellTable.this.eventBus.fireEvent(new LoadFolderEvent(itemContextMenu)); } }; MenuItem openItem = new MenuItem("Open", openCommand); options.addItem(openItem); final DialogBox menuWrapper = new DialogBox(true); menuWrapper.getElement().getStyle().setBorderStyle(BorderStyle.NONE); menuWrapper.getElement().getStyle().setZIndex(10000); menuWrapper.add(options);*/ dataGrid.sinkEvents(Event.ONCONTEXTMENU); } /** * Update items. * * @param items the items * @param removeOldItems the remove old items */ public void updateItems(List items, boolean removeOldItems) { if(removeOldItems){ dataProvider.getList().clear(); msm.clear(); } dataProvider.getList().addAll(items); dataGrid.setPageSize(items.size()+1); dataGrid.redraw(); } /** * Gets the cell tables. * * @return the cell tables */ public DataGrid getCellTable() { return dataGrid; } /** * Gets the data provider. * * @return the data provider */ public ListDataProvider getDataProvider() { return dataProvider; } /** * Sets the data provider. * * @param dataProvider * the new data provider */ public void setDataProvider(ListDataProvider dataProvider) { this.dataProvider = dataProvider; } }