diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/WorkspaceExplorerController.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/WorkspaceExplorerController.java index 87d9ee0..5fadeaa 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/WorkspaceExplorerController.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/WorkspaceExplorerController.java @@ -7,6 +7,8 @@ import java.util.List; import org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEvent; import org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEventHandler; +import org.gcube.portlets.widgets.wsexplorer.client.event.LoadMySpecialFolderEvent; +import org.gcube.portlets.widgets.wsexplorer.client.event.LoadMySpecialFolderEventHandler; import org.gcube.portlets.widgets.wsexplorer.client.event.LoadRootEvent; import org.gcube.portlets.widgets.wsexplorer.client.event.LoadRootEventHandler; import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService; @@ -21,8 +23,10 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.rpc.AsyncCallback; + /** - * + * The Class WorkspaceExplorerController. + * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Jun 25, 2015 */ @@ -35,11 +39,17 @@ public class WorkspaceExplorerController implements EventHandler{ private Navigation navigation = new Navigation(); public static final WorkspaceExplorerServiceAsync workspaceNavigatorService = GWT.create(WorkspaceExplorerService.class); + /** + * Instantiates a new workspace explorer controller. + */ public WorkspaceExplorerController(){ bindEvents(); workspaceExplorerPanel = new WorkspaceExplorerPanel(5, wsExplorer.getExplorerPanel(), breadcrumbs, navigation); } + /** + * Bind events. + */ private void bindEvents() { eventBus.addHandler(LoadFolderEvent.TYPE, new LoadFolderEventHandler() { @@ -47,7 +57,7 @@ public class WorkspaceExplorerController implements EventHandler{ @Override public void onLoadFolder(LoadFolderEvent loadFolderEvent) { - if(loadFolderEvent.getTargetItem()!=null){ + if(loadFolderEvent.getTargetItem()!=null && loadFolderEvent.getTargetItem().isFolder()){ wsExplorer.loadFolder(loadFolderEvent.getTargetItem()); loadParentBreadcrumbByItemId(loadFolderEvent.getTargetItem().getId(), true); } @@ -58,13 +68,27 @@ public class WorkspaceExplorerController implements EventHandler{ @Override public void onLoadRoot(LoadRootEvent loadRootEvent) { - wsExplorer.loadTree(); breadcrumbs.init(); } }); + + eventBus.addHandler(LoadMySpecialFolderEvent.TYPE, new LoadMySpecialFolderEventHandler() { + + @Override + public void onLoadMySpecialFolder(LoadMySpecialFolderEvent loadMySpecialFolderEvent) { + wsExplorer.loadMySpecialFolder(); + breadcrumbs.init(); + } + }); } + /** + * 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+"]"); @@ -87,6 +111,8 @@ public class WorkspaceExplorerController implements EventHandler{ } /** + * Gets the workspace explorer panel. + * * @return the workspaceExplorerPanel */ public WorkspaceExplorerPanel getWorkspaceExplorerPanel() { diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadFolderEvent.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadFolderEvent.java index 0d46f0a..40abac6 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadFolderEvent.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadFolderEvent.java @@ -7,7 +7,7 @@ import com.google.gwt.event.shared.GwtEvent; /** - * The Class DoubleClickEvent. + * The Class LoadFolderEvent. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Jun 25, 2015 @@ -17,8 +17,9 @@ public class LoadFolderEvent extends GwtEvent { private Item targetItem; + /** - * Instantiates a new double click event. + * Instantiates a new load folder event. * * @param target the target */ @@ -43,6 +44,8 @@ public class LoadFolderEvent extends GwtEvent { } /** + * Gets the target item. + * * @return the targetItem */ public Item getTargetItem() { @@ -50,6 +53,8 @@ public class LoadFolderEvent extends GwtEvent { } /** + * Sets the target item. + * * @param targetItem the targetItem to set */ public void setTargetItem(Item targetItem) { diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadMySpecialFolderEvent.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadMySpecialFolderEvent.java new file mode 100644 index 0000000..0d740c8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadMySpecialFolderEvent.java @@ -0,0 +1,35 @@ +package org.gcube.portlets.widgets.wsexplorer.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + */ +public class LoadMySpecialFolderEvent extends GwtEvent { + + public static Type TYPE = new Type(); + + /** + * Instantiates a new double click event. + * + * @param target the target + */ + public LoadMySpecialFolderEvent() { + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(LoadMySpecialFolderEventHandler handler) { + handler.onLoadMySpecialFolder(this); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadMySpecialFolderEventHandler.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadMySpecialFolderEventHandler.java new file mode 100644 index 0000000..da3aae4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadMySpecialFolderEventHandler.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.widgets.wsexplorer.client.event; + +import com.google.gwt.event.shared.EventHandler; + + + +/** + * The Interface LoadMySpecialFolderEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public interface LoadMySpecialFolderEventHandler extends EventHandler { + + /** + * On load my special folder. + * + * @param loadMySpecialFolderEvent the load my special folder event + */ + void onLoadMySpecialFolder(LoadMySpecialFolderEvent loadMySpecialFolderEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadRootEvent.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadRootEvent.java index dfd0fbf..93c995d 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadRootEvent.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/event/LoadRootEvent.java @@ -3,17 +3,15 @@ package org.gcube.portlets.widgets.wsexplorer.client.event; import com.google.gwt.event.shared.GwtEvent; /** - * + * The Class LoadRootEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 */ public class LoadRootEvent extends GwtEvent { public static Type TYPE = new Type(); - /** - * Instantiates a new double click event. - * - * @param target the target - */ public LoadRootEvent() { } diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/AbstractItemsCellTable.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/AbstractItemsCellTable.java index edeef4c..ddb1a34 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/AbstractItemsCellTable.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/AbstractItemsCellTable.java @@ -52,8 +52,8 @@ public abstract class AbstractItemsCellTable { cellTable = new CellTable(1, CellTableResources.INSTANCE); cellTable.addStyleName("table-overflow"); cellTable.setStriped(true); - cellTable.setBordered(true); -// cellTable.setCondensed(true); +// cellTable.setBordered(true); + cellTable.setCondensed(true); cellTable.setWidth("99%", true); dataProvider.addDataDisplay(cellTable); initTable(cellTable, null, null); diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/ItemsTable.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/ItemsTable.java index 235744b..5cd00b2 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/ItemsTable.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/grid/ItemsTable.java @@ -95,14 +95,14 @@ public class ItemsTable extends AbstractItemsCellTable{ return Util.getImage(dataObj); } - @Override - public void onBrowserEvent(Context context, Element elem, Item object, NativeEvent event) { - super.onBrowserEvent(context, elem, object, event); - if ("click".equals(event.getType())) { -// Window.open(object.getURL(), "_blank", ""); -// GcubeReleasesAppController.eventBus.fireEvent(new PackageClickEvent(object, AccoutingReference.DOWNLOAD)); - } - } +// @Override +// public void onBrowserEvent(Context context, Element elem, Item object, NativeEvent event) { +// super.onBrowserEvent(context, elem, object, event); +// if ("click".equals(event.getType())) { +//// Window.open(object.getURL(), "_blank", ""); +//// GcubeReleasesAppController.eventBus.fireEvent(new PackageClickEvent(object, AccoutingReference.DOWNLOAD)); +// } +// } /* (non-Javadoc) * @see com.google.gwt.user.cellview.client.Column#render(com.google.gwt.cell.client.Cell.Context, java.lang.Object, com.google.gwt.safehtml.shared.SafeHtmlBuilder) @@ -113,7 +113,7 @@ public class ItemsTable extends AbstractItemsCellTable{ } }; - icon.setCellStyleNames("img-centered-clickable"); +// icon.setCellStyleNames("img-centered-clickable"); icon.setSortable(false); packageTable.addColumn(icon, ""); packageTable.setColumnWidth(icon, 10.0, Unit.PCT); diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/resources/loading.gif b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/resources/loading.gif index ae484b2..ad155c0 100644 Binary files a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/resources/loading.gif and b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/resources/loading.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerService.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerService.java index 541b781..28859cf 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerService.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerService.java @@ -54,4 +54,15 @@ public interface WorkspaceExplorerService extends RemoteService { Item getRoot(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException; + + /** + * @param showableTypes + * @param purgeEmpyFolders + * @param filterCriteria + * @return + * @throws WorkspaceNavigatorServiceException + */ + Item getMySpecialFolder(List showableTypes, + boolean purgeEmpyFolders, FilterCriteria filterCriteria) + throws WorkspaceNavigatorServiceException; } diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerServiceAsync.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerServiceAsync.java index 5ecfa91..217e000 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerServiceAsync.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/rpc/WorkspaceExplorerServiceAsync.java @@ -75,4 +75,9 @@ public interface WorkspaceExplorerServiceAsync { public void getListParentsByItemIdentifier(String itemIdentifier, boolean includeItemAsParent, AsyncCallback> asyncCallback); + /** + * @param asyncCallback + */ + public void getMySpecialFolder(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria, AsyncCallback asyncCallback); + } diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Breadcrumbs.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Breadcrumbs.java index 17afba6..f446d64 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Breadcrumbs.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Breadcrumbs.java @@ -90,7 +90,7 @@ public class Breadcrumbs extends Composite { * the parent */ public void addNavigationLink(Item parent) { - if (parent != null && parent.getParent() != null) { + if (parent != null && parent.getParent() != null && !parent.isSpecialFolder()) { final NavLink navLink = new NavLink(parent.getName()); navLink.setName(parent.getId()); breadcrumbs.add(navLink); @@ -101,11 +101,10 @@ public class Breadcrumbs extends Composite { public void onClick(ClickEvent event) { Item target = hashListItems.get(navLink.getName()); - WorkspaceExplorerController.eventBus.fireEvent(new LoadFolderEvent(target)); } }); - } else { // is Root + } else { //IS ROOT OR SPECIAL FOLDER // final NavLink navLink = new NavLink(""); NavLink navLink = new NavLink(""); breadcrumbs.add(navLink);// INIT diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Navigation.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Navigation.java index 4440541..34fc3ed 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Navigation.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/Navigation.java @@ -5,6 +5,7 @@ package org.gcube.portlets.widgets.wsexplorer.client.view; import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants; import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerController; +import org.gcube.portlets.widgets.wsexplorer.client.event.LoadMySpecialFolderEvent; import org.gcube.portlets.widgets.wsexplorer.client.event.LoadRootEvent; import com.github.gwtbootstrap.client.ui.NavWidget; @@ -63,5 +64,13 @@ public class Navigation extends Composite{ vre_folder.setActive(true); vre_folder.setText(WorkspaceExplorerConstants.VRE_FOLDERS_LABEL); vre_folder.setIcon(IconType.FOLDER_CLOSE); + + vre_folder.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + WorkspaceExplorerController.eventBus.fireEvent(new LoadMySpecialFolderEvent()); + } + }); } } diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorer.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorer.java index b3fd2bf..6fcce6b 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorer.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorer.java @@ -104,13 +104,7 @@ public class WorkspaceExplorer { } public void onSuccess(Item item) { - GWT.log("workspace tree retrieved."); - // then we remove the loading icon - explorerPanel.clear(); - ItemsTable itTables = new ItemsTable(); - itTables.addItems(item.getChildren()); - explorerPanel.add(itTables.getCellTable()); - GWT.log("workspace tree loaded"); + updateExplorer(item.getChildren()); } }); @@ -147,17 +141,57 @@ public class WorkspaceExplorer { @Override public void onSuccess(Item result) { - GWT.log("workspace folder retrieved."); - explorerPanel.clear(); - ItemsTable itTables = new ItemsTable(); - itTables.addItems(result.getChildren()); - explorerPanel.add(itTables.getCellTable()); - GWT.log("workspace folder loaded"); + updateExplorer(result.getChildren()); } }); } } + /** + * Load the Workspace Tree. + */ + public void loadMySpecialFolder() { + GWT.log("loading folder data"); + setLoading(); + + + // we make a copy of showable types + List showableTypesParam = new ArrayList(showableTypes); + + // we get sure that folders are displayed + for (ItemType folder : Util.FOLDERS) { + if (!showableTypesParam.contains(folder)) + showableTypesParam.add(folder); + } + + boolean purgeEmpyFolders = !showEmptyFolders; + FilterCriteria filterCriteria = new FilterCriteria(allowedMimeTypes,requiredProperties); + + GWT.log("loading workspace tree from server"); + WorkspaceExplorerController.workspaceNavigatorService.getMySpecialFolder(showableTypesParam, purgeEmpyFolders, filterCriteria, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + GWT.log("Error loading workspace folder from server", + caught); + } + + @Override + public void onSuccess(Item items) { + updateExplorer(items.getChildren()); + } + }); + } + + private void updateExplorer(ArrayList items){ + GWT.log("workspace explorer updating.."); + explorerPanel.clear(); + ItemsTable itTables = new ItemsTable(); + itTables.addItems(items); + explorerPanel.add(itTables.getCellTable()); + GWT.log("workspace explorer updated"); + } + /** * @return the explorerPanel */ diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java index 88aaf6f..47c1804 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java @@ -16,6 +16,7 @@ import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; +import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants; import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService; import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria; import org.gcube.portlets.widgets.wsexplorer.shared.Item; @@ -186,6 +187,50 @@ public class WorkspaceExplorerServiceImpl extends RemoteServiceServlet implement throw new WorkspaceNavigatorServiceException(e.getMessage()); } } + + /** + * {@inheritDoc} + */ + @Override + public Item getMySpecialFolder(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { + _log.trace("GetMySpecialFolder showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); + + try { + + Workspace workspace = getWorkspace(); + WorkspaceItem folder = workspace.getMySpecialFolders(); + + long startTime = System.currentTimeMillis(); + _log.trace("start time - " + startTime); + + + Item itemFolder = ItemBuilder.getItem(null, folder, showableTypes, filterCriteria, true); + itemFolder.setName(WorkspaceExplorerConstants.SPECIAL_FOLDERS_LABEL); + itemFolder.setSpecialFolder(true); + + _log.trace("Only showable types:"); + //printName("", folderItem); + + if (purgeEmpyFolders) itemFolder = ItemBuilder.purgeEmptyFolders(itemFolder); + + _log.trace("Returning:"); + + Long endTime = System.currentTimeMillis() - startTime; + String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); + _log.trace("end time - " + time); + + //printName("", folderItem); + + Collections.sort(itemFolder.getChildren(), new ItemComparator()); + + return itemFolder; + + } catch (Exception e) { + _log.error("Error during special folders retrieving", e); + throw new WorkspaceNavigatorServiceException(e.getMessage()); + } + } + /** * {@inheritDoc} diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/shared/Item.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/shared/Item.java index 9349d8c..4d972c5 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/shared/Item.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/shared/Item.java @@ -26,7 +26,8 @@ public class Item implements IsSerializable{ protected ArrayList children; private String owner; private boolean isFolder; - + private boolean isSpecialFolder; + /** * Instantiates a new item. */ @@ -191,6 +192,19 @@ public class Item implements IsSerializable{ children.remove(child); } + /** + * @return the isSpecialFolder + */ + public boolean isSpecialFolder() { + return isSpecialFolder; + } + + /** + * @param isSpecialFolder the isSpecialFolder to set + */ + public void setSpecialFolder(boolean isSpecialFolder) { + this.isSpecialFolder = isSpecialFolder; + } /** @@ -253,7 +267,9 @@ public class Item implements IsSerializable{ @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("Item [id="); + builder.append("Item [parent="); + builder.append(parent); + builder.append(", id="); builder.append(id); builder.append(", name="); builder.append(name); @@ -261,14 +277,14 @@ public class Item implements IsSerializable{ builder.append(type); builder.append(", path="); builder.append(path); - builder.append(", shared="); + builder.append(", isSharedFolder="); builder.append(isSharedFolder); - builder.append(", children="); - builder.append(children); builder.append(", owner="); builder.append(owner); builder.append(", isFolder="); builder.append(isFolder); + builder.append(", isSpecialFolder="); + builder.append(isSpecialFolder); builder.append("]"); return builder.toString(); }