package org.gcube.portlets.widgets.wsexplorer.client.view.grid; import java.util.List; import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerController; import org.gcube.portlets.widgets.wsexplorer.client.event.ClickItemEvent; import org.gcube.portlets.widgets.wsexplorer.client.resources.CellTableResources; import org.gcube.portlets.widgets.wsexplorer.shared.Item; import com.github.gwtbootstrap.client.ui.CellTable; import com.github.gwtbootstrap.client.ui.Pagination; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.core.shared.GWT; import com.google.gwt.dom.client.Style.BorderStyle; 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.user.cellview.client.AbstractCellTable; 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.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SingleSelectionModel; /** * The Class AbstractItemTable. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 19, 2015 */ public abstract class AbstractItemsCellTable { protected CellTable cellTable; protected ListDataProvider dataProvider = new ListDataProvider(); protected Item itemContextMenu = null; protected boolean showMoreInfo; protected final SingleSelectionModel ssm; /** * Inits the table. * * @param ItemTable * the Item table * @param pager * the pager * @param pagination * the pagination */ public abstract void initTable(AbstractCellTable ItemTable, final SimplePager pager, final Pagination pagination); /** * Instantiates a new abstract items cell table. * * @param fireMoreInfo the fire more info */ public AbstractItemsCellTable(boolean fireOnClick) { this.showMoreInfo = fireOnClick; cellTable = new CellTable(1, CellTableResources.INSTANCE); cellTable.addStyleName("table-overflow"); cellTable.setStriped(true); cellTable.setCondensed(true); cellTable.setWidth("100%", false); cellTable.setHeight("100px"); dataProvider.addDataDisplay(cellTable); initTable(cellTable, null, null); cellTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); ssm = new SingleSelectionModel(); cellTable.setSelectionModel(ssm); ssm.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(final SelectionChangeEvent event) { final Item selectedObject = ssm.getSelectedObject(); if(selectedObject!=null){ GWT.log("Clicked: "+selectedObject); // selectedItem(selectedObject); if(showMoreInfo) WorkspaceExplorerController.eventBus.fireEvent(new ClickItemEvent(selectedObject)); } } }); cellTable.addDomHandler(new DoubleClickHandler() { @Override public void onDoubleClick(final DoubleClickEvent event) { Item selected = ssm.getSelectedObject(); if (selected != null) { GWT.log("Double Click: "+selected); WorkspaceExplorerController.eventBus.fireEvent(new org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEvent(selected)); } } }, DoubleClickEvent.getType()); /* cellTable.addCellPreviewHandler(new CellPreviewEvent.Handler () { long lastClick=-1000; @Override public void onCellPreview(CellPreviewEvent event) { long clictAt = System.currentTimeMillis(); GWT.log("clickAt: "+(clictAt)); GWT.log("lastClick: "+(lastClick)); if(event.getNativeEvent().getType().contains("click")){ GWT.log(""+(clictAt-lastClick)); if(clictAt-lastClick < 300) { // dblclick on 2 clicks detected within 300 ms Window.alert("I am a double click crafted event!"); } lastClick = System.currentTimeMillis(); } } }); */ MenuBar options = new MenuBar(true); ScheduledCommand openCommand = new ScheduledCommand() { @Override public void execute() { WorkspaceExplorerController.eventBus.fireEvent(new org.gcube.portlets.widgets.wsexplorer.client.event.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); cellTable.sinkEvents(Event.ONCONTEXTMENU); cellTable.addHandler(new ContextMenuHandler() { @Override public void onContextMenu(ContextMenuEvent event) { GWT.log("On Context Menu: " + event.getNativeEvent().getEventTarget().toString()); Item selectedObject = (Item) event.getSource(); itemContextMenu = selectedObject; if (selectedObject != null && selectedObject.isFolder()) { event.preventDefault(); event.stopPropagation(); menuWrapper.setPopupPosition(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY()); menuWrapper.show(); } } }, ContextMenuEvent.getType()); // ssm.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { // // @Override // public void onSelectionChange(SelectionChangeEvent event) { // // changed the context menu selection // GWT.log("Selected item is" + ssm.getSelectedObject()); // // } // }); } /** * Adds the Items. * * @param Items * the Items */ public void addItems(List Items) { dataProvider.getList().clear(); for (Item pckg : Items) addItem(pckg); cellTable.setPageSize(Items.size() + 1); cellTable.redraw(); } /** * Adds the Item. * * @param pckg * the pckg */ private void addItem(Item pckg) { dataProvider.getList().add(pckg); dataProvider.flush(); dataProvider.refresh(); } /** * Gets the cell tables. * * @return the cell tables */ public CellTable getCellTable() { return cellTable; } /** * 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; } }