/** * */ package org.gcube.portlets.user.workspaceexplorerapp.client; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerSelectNotification.HasWorskpaceExplorerSelectNotificationListener; import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; import org.gcube.portlets.user.workspaceexplorerapp.client.download.RequestBuilderWorkspaceValidateItem; import org.gcube.portlets.user.workspaceexplorerapp.client.download.WindowOpenParameter; import org.gcube.portlets.user.workspaceexplorerapp.client.event.BreadcrumbClickEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.BreadcrumbClickEventHandler; import org.gcube.portlets.user.workspaceexplorerapp.client.event.ClickItemEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.ClickItemEventHandler; import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEventHandler; import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEventHandler; import org.gcube.portlets.user.workspaceexplorerapp.client.event.OrderDataByEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.OrderDataByEventHandler; import org.gcube.portlets.user.workspaceexplorerapp.client.event.RightClickItemEvent; import org.gcube.portlets.user.workspaceexplorerapp.client.event.RightClickItemEventHandler; import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; import org.gcube.portlets.user.workspaceexplorerapp.client.view.Breadcrumbs; import org.gcube.portlets.user.workspaceexplorerapp.client.view.PopupContextMenu; import org.gcube.portlets.user.workspaceexplorerapp.client.view.WorkspaceExplorer; import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; import com.google.gwt.core.shared.GWT; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.VerticalPanel; import gwt.material.design.client.ui.MaterialToast; /** * The Class WorkspaceResourcesExplorerPanel. * * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * * Dec 3, 2021 */ public class WorkspaceResourcesExplorerPanel extends DockPanel implements HasWorskpaceExplorerSelectNotificationListener { public HandlerManager eventBus; private Breadcrumbs breadcrumbs; private boolean isSelect = false; private String captionTxt; private List listeners = new ArrayList(); private VerticalPanel mainVP = new VerticalPanel(); private WorkspaceExplorer wsExplorer; private ScrollPanel centerScrollable = new ScrollPanel(); private String folderName; private Item baseFolder; public static final DisplayField[] displayFields = new DisplayField[] { DisplayField.ICON, DisplayField.NAME, DisplayField.OWNER, DisplayField.CREATION_DATE }; /** * Instantiates a new workspace folder explorer select panel. * * @param eventBus the event bus * @param folderId the folder id like root folder to explore * @param folderName the folder name * @throws Exception the exception */ public WorkspaceResourcesExplorerPanel(HandlerManager eventBus, String folderId, String folderName) throws Exception { initExplorer(eventBus, folderId, folderName, ItemType.values(), ItemType.values()); } /** * Inits the explorer. * * @param eventBus the event bus * @param folderId the folder id * @param folderName the folder name * @param selectableTypes the selectable types * @param showableTypes the showable types * @throws Exception the exception */ private void initExplorer(HandlerManager eventBus, String folderId, String folderName, ItemType[] selectableTypes, ItemType[] showableTypes) throws Exception { this.folderName = folderName; this.eventBus = eventBus; this.breadcrumbs = new Breadcrumbs(eventBus); bindEvents(); wsExplorer = new WorkspaceExplorer(eventBus, showableTypes, selectableTypes, displayFields); Item item = new Item(folderId, folderName, true); this.baseFolder = item; wsExplorer.setBaseFolder(item); if (folderId != null && !folderId.isEmpty()) wsExplorer.loadFolder(item); initPanel(""); } /** * Instantiates a new workspace explorer select panel. * * @param eventBus the event bus * @param folderId the folder id * @param showOnlyFolders the show only folders * @throws Exception the exception */ public WorkspaceResourcesExplorerPanel(HandlerManager eventBus, String folderId, boolean showOnlyFolders) throws Exception { if (showOnlyFolders) { ItemType[] itemsType = new ItemType[1]; itemsType[0] = ItemType.FOLDER; initExplorer(eventBus, folderId, "", itemsType, itemsType); } else { initExplorer(eventBus, folderId, "", ItemType.values(), ItemType.values()); } } /** * Bind events. */ private void bindEvents() { eventBus.addHandler(ClickItemEvent.TYPE, new ClickItemEventHandler() { @Override public void onClick(final ClickItemEvent clickItemEvent) { // isSelect = false; // Set items = wsExplorer.getItemsSelected(); // List lstItems = toList(items); // // //Return if item is not selectable // if(!itemIsSelectable(lstItems.get(0))){ // notifyNotValidSelection(); // return; // } // // notifySelectedItem(lstItems.get(0)); // isSelect = true; } }); eventBus.addHandler(LoadFolderEvent.TYPE, new LoadFolderEventHandler() { @Override public void onLoadFolder(LoadFolderEvent loadFolderEvent) { GWT.log("LoadFolderEvent fired"); Item item = loadFolderEvent.getTargetFolder() == null ? baseFolder : loadFolderEvent.getTargetFolder(); if (item.isFolder()) { try { wsExplorer.loadFolder(item); loadParentBreadcrumbByItemId(item.getId(), true); // clearMoreInfo(); } catch (Exception e) { GWT.log(e.getMessage()); } } } }); eventBus.addHandler(BreadcrumbClickEvent.TYPE, new BreadcrumbClickEventHandler() { @Override public void onBreadcrumbClick(BreadcrumbClickEvent breadcrumbClickEvent) { if (breadcrumbClickEvent.getTargetItem() != null) eventBus.fireEvent(new LoadFolderEvent(breadcrumbClickEvent.getTargetItem())); } }); eventBus.addHandler(OrderDataByEvent.TYPE, new OrderDataByEventHandler() { @Override public void onOrderDataBy(OrderDataByEvent orderDataByEvent) { wsExplorer.getItTables().sortDataBy(orderDataByEvent.getLabel()); } }); eventBus.addHandler(RightClickItemEvent.TYPE, new RightClickItemEventHandler() { @Override public void onClick(RightClickItemEvent rightClickItemEvent) { if (rightClickItemEvent.getItem() != null && rightClickItemEvent.getItem().getId() != null) { PopupContextMenu popupCM = new PopupContextMenu(true, eventBus, rightClickItemEvent.getItem()); popupCM.showPopup(rightClickItemEvent.getXPos(), Window.getScrollTop() + rightClickItemEvent.getYPos()); } } }); eventBus.addHandler(DownloadItemEvent.TYPE, new DownloadItemEventHandler() { @Override public void onDownloadItem(DownloadItemEvent downloadItemEvent) { GWT.log("Fired event DownloadItemEvent"); String itemIds = ""; if (downloadItemEvent.getItem() != null) itemIds = downloadItemEvent.getItem().getId() + WorkspaceExplorerAppConstants.IDS_SEPARATOR; else { List lstItems = toList(wsExplorer.getItemsSelected()); for (Item item : lstItems) { itemIds += item.getId() + WorkspaceExplorerAppConstants.IDS_SEPARATOR; } } GWT.log("itemIds: " + itemIds); if (!itemIds.isEmpty()) { // MaterialToast.fireToast("Download..."); switch (downloadItemEvent.getType()) { case DOWNLOAD: MaterialToast.fireToast("Download..."); try { new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET, WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE, WorkspaceExplorerAppConstants.IDS + "=" + itemIds, "_self", downloadHandlerCallback); } catch (Exception e) { Window.alert("Sorry, an error occurred while contacting server, try again"); } break; // case PREVIEW: // break; case OPEN: MaterialToast.fireToast("Showing..."); if (downloadItemEvent.getItem().getType().equals(ItemType.URL_DOCUMENT)) { final NewBrowserWindow newBrowserWindow = NewBrowserWindow.open("", "_blank", ""); final String theItemIds = itemIds; WorkspaceExplorerAppConstants.workspaceNavigatorService .getUrlById(downloadItemEvent.getItem().getId(), new AsyncCallback() { @Override public void onSuccess(String result) { newBrowserWindow.setUrl(result); } @Override public void onFailure(Throwable caught) { try { new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET, WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE, WorkspaceExplorerAppConstants.IDS + "=" + theItemIds + "&viewContent=true", "_blank", downloadHandlerCallback); } catch (Exception e) { Window.alert( "Sorry, an error occurred while contacting server, try again"); } } }); return; } try { new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET, WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE, WorkspaceExplorerAppConstants.IDS + "=" + itemIds + "&viewContent=true", "_blank", downloadHandlerCallback); } catch (Exception e) { Window.alert("Sorry, an error occurred while contacting server, try again"); } break; default: break; } } } }); } /** * To list. * * @param items the items * @return the list */ private List toList(Set items) { if (items != null && items.size() > 0) { List lstItems = new ArrayList(items.size()); lstItems.addAll(items); return lstItems; } return null; } /** * Load parent breadcrumb by item id. * * @param itemIdentifier the item identifier * @param includeItemAsParent the include item as parent */ protected void loadParentBreadcrumbByItemId(final String itemIdentifier, boolean includeItemAsParent) { GWT.log("Reload Parent Breadcrumb: [Item id: " + itemIdentifier + "]"); WorkspaceExplorerAppConstants.workspaceNavigatorService.getBreadcrumbsByItemIdentifierToParentLimit( itemIdentifier, baseFolder.getId(), includeItemAsParent, new AsyncCallback>() { @Override public void onFailure(Throwable caught) { GWT.log(caught.getMessage()); Item goToBaseFolder = null; // I'm adding go to folder only if is a sub-folder of baseFolder if (itemIdentifier != baseFolder.getId()) goToBaseFolder = baseFolder; // wsExplorer.setAlert(caught.getMessage(), AlertType.ERROR, goToBaseFolder); } @Override public void onSuccess(List result) { if (result != null) { breadcrumbs.setPath(result); } } }); } /** * Refresh root folder view. */ public void refreshRootFolderView() { // Item item = new Item(baseFolder.getId(), folderName, true); eventBus.fireEvent(new LoadFolderEvent(baseFolder)); } /** * Inits the panel. * * @param captionTxt the caption txt is the tool-tip */ private void initPanel(String captionTxt) { this.captionTxt = captionTxt; this.getElement().setId("WorkspaceExplorerContainer"); this.getElement().setAttribute("id", "WorkspaceExplorerContainer"); this.getElement().addClassName("workspace-explorer-container"); if (this.captionTxt != null && !this.captionTxt.isEmpty()) setTitle(this.captionTxt); setWidth("100%"); add(breadcrumbs, DockPanel.NORTH); mainVP.add(wsExplorer.getPanel()); centerScrollable.add(mainVP); add(centerScrollable, DockPanel.CENTER); } /** * Notify selected item. * * @param selected the selected */ private void notifySelectedItem(Item selected) { for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { worskpaceExplorerNotificationListener.onSelectedItem(selected); } } /** * Notify aborted. */ private void notifyAborted() { for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { worskpaceExplorerNotificationListener.onAborted(); } } /** * Notify not valid selection. */ private void notifyNotValidSelection() { for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { worskpaceExplorerNotificationListener.onNotValidSelection(); } } /** * Notify failed. * * @param t the t */ @SuppressWarnings("unused") private void notifyFailed(Throwable t) { for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { worskpaceExplorerNotificationListener.onFailed(t); } } /** * Gets the caption txt. * * @return the captionTxt */ public String getCaptionTxt() { return captionTxt; } /** * Checks if is valid hide. * * @return the isValidHide */ public boolean isValidHide() { return isSelect; } /** * Adds the workspace explorer select notification listener. * * @param handler the handler */ /* * (non-Javadoc) * * @see org.gcube.portlets.widgets.wsexplorer.client.notification. * WorskpaceExplorerNotification.HasWorskpaceExplorerNotificationListener# * addWorkspaceExplorerNotificationListener(org.gcube.portlets.widgets. * wsexplorer.client.notification.WorskpaceExplorerNotification. * WorskpaceExplorerNotificationListener) */ @Override public void addWorkspaceExplorerSelectNotificationListener(WorskpaceExplorerSelectNotificationListener handler) { if (handler != null) listeners.add(handler); } /** * Removes the workspace explorer select notification listener. * * @param handler the handler */ /* * (non-Javadoc) * * @see org.gcube.portlets.widgets.wsexplorer.client.notification. * WorskpaceExplorerNotification.HasWorskpaceExplorerNotificationListener# * removeWorkspaceExplorerNotificationListener(org.gcube.portlets.widgets. * wsexplorer.client.notification.WorskpaceExplorerNotification. * WorskpaceExplorerNotificationListener) */ @Override public void removeWorkspaceExplorerSelectNotificationListener(WorskpaceExplorerSelectNotificationListener handler) { if (handler != null) { if (listeners.contains(handler)) listeners.remove(handler); } } /** * Item is selectable. * * @param item the item * @return true, if successful */ public boolean itemIsSelectable(Item item) { GWT.log("Selectable type: " + wsExplorer.getSelectableTypes()); GWT.log("item: " + item); if (item != null) { boolean selectable = wsExplorer.getSelectableTypes().contains(item.getType()); return selectable ? true : false; } return false; } /** * Gets the ws explorer. * * @return the wsExplorer */ public WorkspaceExplorer getWsExplorer() { return wsExplorer; } /** * Gets the event bus. * * @return the eventBus */ public HandlerManager getEventBus() { return eventBus; } public AsyncCallback downloadHandlerCallback = new AsyncCallback() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(WindowOpenParameter windowOpenParam) { String params = "?" + windowOpenParam.getParameters(); if (params.length() > 1) params += "&"; params += WorkspaceExplorerAppConstants.REDIRECTONERROR + "=" + windowOpenParam.isRedirectOnError(); windowOpenParam.getBrowserWindow() .setUrl(WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE + params); } }; }