256: Workspace explorer

Task-Url: https://support.d4science.org/issues/256

Added LoadMySpecialFolder

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-explorer@115555 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2015-06-25 15:22:13 +00:00
parent 40a4f9c4d0
commit bebfa3e47d
15 changed files with 247 additions and 43 deletions

View File

@ -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() {

View File

@ -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<LoadFolderEventHandler> {
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<LoadFolderEventHandler> {
}
/**
* Gets the target item.
*
* @return the targetItem
*/
public Item getTargetItem() {
@ -50,6 +53,8 @@ public class LoadFolderEvent extends GwtEvent<LoadFolderEventHandler> {
}
/**
* Sets the target item.
*
* @param targetItem the targetItem to set
*/
public void setTargetItem(Item targetItem) {

View File

@ -0,0 +1,35 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import com.google.gwt.event.shared.GwtEvent;
/**
*
*/
public class LoadMySpecialFolderEvent extends GwtEvent<LoadMySpecialFolderEventHandler> {
public static Type<LoadMySpecialFolderEventHandler> TYPE = new Type<LoadMySpecialFolderEventHandler>();
/**
* 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<LoadMySpecialFolderEventHandler> 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);
}
}

View File

@ -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);
}

View File

@ -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<LoadRootEventHandler> {
public static Type<LoadRootEventHandler> TYPE = new Type<LoadRootEventHandler>();
/**
* Instantiates a new double click event.
*
* @param target the target
*/
public LoadRootEvent() {
}

View File

@ -52,8 +52,8 @@ public abstract class AbstractItemsCellTable {
cellTable = new CellTable<Item>(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);

View File

@ -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);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -54,4 +54,15 @@ public interface WorkspaceExplorerService extends RemoteService {
Item getRoot(List<ItemType> showableTypes, boolean purgeEmpyFolders,
FilterCriteria filterCriteria)
throws WorkspaceNavigatorServiceException;
/**
* @param showableTypes
* @param purgeEmpyFolders
* @param filterCriteria
* @return
* @throws WorkspaceNavigatorServiceException
*/
Item getMySpecialFolder(List<ItemType> showableTypes,
boolean purgeEmpyFolders, FilterCriteria filterCriteria)
throws WorkspaceNavigatorServiceException;
}

View File

@ -75,4 +75,9 @@ public interface WorkspaceExplorerServiceAsync {
public void getListParentsByItemIdentifier(String itemIdentifier,
boolean includeItemAsParent, AsyncCallback<List<Item>> asyncCallback);
/**
* @param asyncCallback
*/
public void getMySpecialFolder(List<ItemType> showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria, AsyncCallback<Item> asyncCallback);
}

View File

@ -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

View File

@ -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());
}
});
}
}

View File

@ -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<ItemType> showableTypesParam = new ArrayList<ItemType>(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<Item>() {
@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<Item> 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
*/

View File

@ -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<ItemType> 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}

View File

@ -26,7 +26,8 @@ public class Item implements IsSerializable{
protected ArrayList<Item> 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();
}