256: Workspace explorer

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

Added events: LoadFolder, LoadRoot

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-explorer@115548 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2015-06-25 13:52:02 +00:00
parent 7946490b18
commit fdb64715a6
14 changed files with 322 additions and 86 deletions

View File

@ -0,0 +1,95 @@
/**
*
*/
package org.gcube.portlets.widgets.wsexplorer.client;
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.LoadRootEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.LoadRootEventHandler;
import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService;
import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerServiceAsync;
import org.gcube.portlets.widgets.wsexplorer.client.view.Breadcrumbs;
import org.gcube.portlets.widgets.wsexplorer.client.view.Navigation;
import org.gcube.portlets.widgets.wsexplorer.client.view.WorkspaceExplorer;
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jun 25, 2015
*/
public class WorkspaceExplorerController implements EventHandler{
public final static HandlerManager eventBus = new HandlerManager(null);
private WorkspaceExplorerPanel workspaceExplorerPanel;
private WorkspaceExplorer wsExplorer = new WorkspaceExplorer();
private Breadcrumbs breadcrumbs = new Breadcrumbs();
private Navigation navigation = new Navigation();
public static final WorkspaceExplorerServiceAsync workspaceNavigatorService = GWT.create(WorkspaceExplorerService.class);
public WorkspaceExplorerController(){
bindEvents();
workspaceExplorerPanel = new WorkspaceExplorerPanel(5, wsExplorer.getExplorerPanel(), breadcrumbs, navigation);
}
private void bindEvents() {
eventBus.addHandler(LoadFolderEvent.TYPE, new LoadFolderEventHandler() {
@Override
public void onLoadFolder(LoadFolderEvent loadFolderEvent) {
if(loadFolderEvent.getTargetItem()!=null){
wsExplorer.loadFolder(loadFolderEvent.getTargetItem());
loadParentBreadcrumbByItemId(loadFolderEvent.getTargetItem().getId(), true);
}
}
});
eventBus.addHandler(LoadRootEvent.TYPE, new LoadRootEventHandler() {
@Override
public void onLoadRoot(LoadRootEvent loadRootEvent) {
wsExplorer.loadTree();
breadcrumbs.reset();
}
});
}
protected void loadParentBreadcrumbByItemId(final String itemIdentifier, boolean includeItemAsParent){
GWT.log("Reload Parent Breadcrumb: [Item id: "+itemIdentifier+"]");
workspaceNavigatorService.getListParentsByItemIdentifier(itemIdentifier, includeItemAsParent, new AsyncCallback<List<Item>>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(List<Item> result) {
if(result!=null)
breadcrumbs.setPath(result);
}
});
}
/**
* @return the workspaceExplorerPanel
*/
public WorkspaceExplorerPanel getWorkspaceExplorerPanel() {
return workspaceExplorerPanel;
}
}

View File

@ -3,10 +3,7 @@
*/
package org.gcube.portlets.widgets.wsexplorer.client;
import org.gcube.portlets.widgets.wsexplorer.client.view.Breadcrumbs;
import org.gcube.portlets.widgets.wsexplorer.client.view.Navigation;
import org.gcube.portlets.widgets.wsexplorer.client.view.WorkspaceExplorer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
@ -25,13 +22,16 @@ public class WorkspaceExplorerPanel extends DockPanel{
private ScrollPanel westPanel = new ScrollPanel();
private ScrollPanel centerScrollable = new ScrollPanel();
private Breadcrumbs breadcrumbs = new Breadcrumbs();
private Navigation navigation = new Navigation();
private WorkspaceExplorer wsExplorer = new WorkspaceExplorer();
/**
* Instantiates a new split panel.
* Instantiates a new workspace explorer panel.
*
* @param splitterSize the splitter size
* @param wsExplorer the ws explorer
* @param breadcrumbs the breadcrumbs
* @param navigation the navigation
*/
public WorkspaceExplorerPanel(int splitterSize) {
public WorkspaceExplorerPanel(int splitterSize, ScrollPanel wsExplorer, Composite breadcrumbs, Composite navigation) {
// setStyleName("cw-DockPanel");
ensureDebugId("WorkspaceNavigatorPanel");
setSpacing(4);
@ -44,11 +44,13 @@ public class WorkspaceExplorerPanel extends DockPanel{
add(westPanel, DockPanel.WEST);
centerScrollable.setSize(width+"px", height+"px");
centerScrollable.add(wsExplorer.getExplorerPanel());
centerScrollable.add(wsExplorer);
add(centerScrollable, DockPanel.CENTER);
}
/**
* Gets the west panel.
*
* @return the westPanel
*/
public ScrollPanel getWestPanel() {
@ -56,6 +58,8 @@ public class WorkspaceExplorerPanel extends DockPanel{
}
/**
* Gets the center scrollable.
*
* @return the centerScrollable
*/
public ScrollPanel getCenterScrollable() {

View File

@ -0,0 +1,58 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
import com.google.gwt.event.shared.GwtEvent;
/**
* The Class DoubleClickEvent.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jun 25, 2015
*/
public class LoadFolderEvent extends GwtEvent<LoadFolderEventHandler> {
public static Type<LoadFolderEventHandler> TYPE = new Type<LoadFolderEventHandler>();
private Item targetItem;
/**
* Instantiates a new double click event.
*
* @param target the target
*/
public LoadFolderEvent(Item target) {
this.targetItem = target;
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#getAssociatedType()
*/
@Override
public Type<LoadFolderEventHandler> getAssociatedType() {
return TYPE;
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler)
*/
@Override
protected void dispatch(LoadFolderEventHandler handler) {
handler.onLoadFolder(this);
}
/**
* @return the targetItem
*/
public Item getTargetItem() {
return targetItem;
}
/**
* @param targetItem the targetItem to set
*/
public void setTargetItem(Item targetItem) {
this.targetItem = targetItem;
}
}

View File

@ -0,0 +1,16 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import com.google.gwt.event.shared.EventHandler;
/**
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* @May 23, 2013
*
*/
public interface LoadFolderEventHandler extends EventHandler {
/**
* @param accountingHistoryEvent
*/
void onLoadFolder(LoadFolderEvent loadFolderEvent);
}

View File

@ -0,0 +1,35 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import com.google.gwt.event.shared.GwtEvent;
/**
*
*/
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() {
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#getAssociatedType()
*/
@Override
public Type<LoadRootEventHandler> getAssociatedType() {
return TYPE;
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler)
*/
@Override
protected void dispatch(LoadRootEventHandler handler) {
handler.onLoadRoot(this);
}
}

View File

@ -0,0 +1,20 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import com.google.gwt.event.shared.EventHandler;
/**
* The Interface LoadRootEventHandler.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jun 25, 2015
*/
public interface LoadRootEventHandler extends EventHandler {
/**
* On load root.
*
* @param loadRootEvent the load root event
*/
void onLoadRoot(LoadRootEvent loadRootEvent);
}

View File

@ -2,6 +2,7 @@ package org.gcube.portlets.widgets.wsexplorer.client.grid;
import java.util.List;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerController;
import org.gcube.portlets.widgets.wsexplorer.client.resources.CellTableResources;
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
@ -27,7 +28,6 @@ public abstract class AbstractItemsCellTable {
protected CellTable<Item> cellTable;
protected ListDataProvider<Item> dataProvider = new ListDataProvider<Item>();
protected boolean showGroupId;
/**
* Inits the table.
@ -48,14 +48,13 @@ public abstract class AbstractItemsCellTable {
* @param showGroupId
* the show group id
*/
public AbstractItemsCellTable(boolean showGroupId) {
this.showGroupId = showGroupId;
public AbstractItemsCellTable() {
cellTable = new CellTable<Item>(1, CellTableResources.INSTANCE);
cellTable.addStyleName("table-overflow");
cellTable.setStriped(true);
cellTable.setBordered(true);
// cellTable.setCondensed(true);
cellTable.setWidth("98%", true);
cellTable.setWidth("99%", true);
dataProvider.addDataDisplay(cellTable);
initTable(cellTable, null, null);
cellTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
@ -78,6 +77,7 @@ public abstract class AbstractItemsCellTable {
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));
}
}
},
@ -149,15 +149,6 @@ public abstract class AbstractItemsCellTable {
return dataProvider;
}
/**
* Checks if is show group id.
*
* @return true, if is show group id
*/
public boolean isShowGroupId() {
return showGroupId;
}
/**
* Sets the data provider.
*
@ -167,14 +158,4 @@ public abstract class AbstractItemsCellTable {
public void setDataProvider(ListDataProvider<Item> dataProvider) {
this.dataProvider = dataProvider;
}
/**
* Sets the show group id.
*
* @param showGroupId
* the new show group id
*/
public void setShowGroupId(boolean showGroupId) {
this.showGroupId = showGroupId;
}
}

View File

@ -39,13 +39,12 @@ public class ItemsTable extends AbstractItemsCellTable{
private Column<Item, ImageResource> icon;
private TextColumn<Item> name;
private TextColumn<Item> owner;
/**
* Instantiates a new packages table.
*
* @param showGroupId the show group id
* Instantiates a new items table.
*/
public ItemsTable(boolean showGroupId) {
super(showGroupId);
public ItemsTable() {
super();
}

View File

@ -4,7 +4,7 @@
package org.gcube.portlets.widgets.wsexplorer.client.load;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerPanel;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerController;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
@ -24,16 +24,12 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
*/
public class WorkspaceExplorerLoadDialog extends DialogBox implements ClickHandler {
/**
*
*/
private Button cancel;
private WorkspaceExplorerLoadDialog INSTANCE = this;
private boolean isValidHide;
private String captionTxt;
private WorkspaceExplorerPanel wsp = new WorkspaceExplorerPanel(5);
private WorkspaceExplorerController controller = new WorkspaceExplorerController();
/**
* Instantiates a new worspace navigator dialog.
*
@ -63,7 +59,7 @@ public class WorkspaceExplorerLoadDialog extends DialogBox implements ClickHandl
hp.add(cancel);
dock.add(hp, DockPanel.SOUTH);
dock.add(wsp, DockPanel.CENTER);
dock.add(controller.getWorkspaceExplorerPanel(), DockPanel.CENTER);
dock.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
dock.setWidth("100%");

View File

@ -3,7 +3,7 @@ package org.gcube.portlets.widgets.wsexplorer.client.resources;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
public interface Icons extends ClientBundle {
public interface WorkspaceExplorerIcons extends ClientBundle {
@Source("cancel.png")
ImageResource cancel();

View File

@ -7,9 +7,9 @@ import com.google.gwt.user.client.ui.AbstractImagePrototype;
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
*
*/
public class Resources {
public class WorkspaceExplorerResources {
public static final Icons ICONS = GWT.create(Icons.class);
public static final WorkspaceExplorerIcons ICONS = GWT.create(WorkspaceExplorerIcons.class);
public static AbstractImagePrototype getIconCancel() {

View File

@ -69,10 +69,10 @@ public interface WorkspaceExplorerServiceAsync {
*
* @param itemIdentifier the item identifier
* @param includeItemAsParent the include item as parent
* @param callback the callback
* @param asyncCallback the callback
* @return the list parents by item identifier
*/
public void getListParentsByItemIdentifier(String itemIdentifier,
boolean includeItemAsParent, AsyncCallback<List<Item>> callback);
boolean includeItemAsParent, AsyncCallback<List<Item>> asyncCallback);
}

View File

@ -50,7 +50,7 @@ public class Breadcrumbs extends Composite {
public Breadcrumbs() {
initWidget(uiBinder.createAndBindUi(this));
breadcrumbs.setDivider(DIVIDER);
initBreadcrumbs();
breadcrumbs.add(new NavLink("/"));
// initBreadcrumb(true);
this.addStyleName("breadcrumbs-navigator");
}
@ -78,8 +78,6 @@ public class Breadcrumbs extends Composite {
*/
private void initBreadcrumbs() {
breadcrumbs.clear();
breadcrumbs.add(new NavLink(""));// INIT
breadcrumbs.add(new NavLink("Home"));
}
// @UiHandler("add")
@ -132,4 +130,11 @@ public class Breadcrumbs extends Composite {
return lastParent;
}
/**
*
*/
public void reset() {
initBreadcrumbs();
}
}

View File

@ -6,18 +6,15 @@ import java.util.List;
import java.util.Map;
import org.gcube.portlets.widgets.wsexplorer.client.Util;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerController;
import org.gcube.portlets.widgets.wsexplorer.client.grid.ItemsTable;
import org.gcube.portlets.widgets.wsexplorer.client.resources.Resources;
import org.gcube.portlets.widgets.wsexplorer.client.resources.old.WorkspaceLightTreeResources;
import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService;
import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerServiceAsync;
import org.gcube.portlets.widgets.wsexplorer.client.resources.WorkspaceExplorerResources;
import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria;
import org.gcube.portlets.widgets.wsexplorer.shared.Item;
import org.gcube.portlets.widgets.wsexplorer.shared.ItemType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
@ -29,10 +26,10 @@ import com.google.gwt.user.client.ui.ScrollPanel;
*/
public class WorkspaceExplorer {
private final WorkspaceExplorerServiceAsync workspaceNavigatorService = GWT.create(WorkspaceExplorerService.class);
protected static final HorizontalPanel LOADING_PANEL = new HorizontalPanel();
protected static final Image LOADING_IMAGE = Resources.getIconLoading().createImage();
protected static final HorizontalPanel LOADING_PANEL = new HorizontalPanel();
protected static final Image LOADING_IMAGE = WorkspaceExplorerResources.getIconLoading().createImage();
static {
LOADING_PANEL.getElement().getStyle().setMargin(5.0, Unit.PX);
// LOADING_PANEL.setSpacing(3);
@ -99,36 +96,66 @@ public class WorkspaceExplorer {
GWT.log("loading workspace tree from server");
workspaceNavigatorService.getRoot(showableTypesParam, purgeEmpyFolders,
filterCriteria, new AsyncCallback<Item>() {
WorkspaceExplorerController.workspaceNavigatorService.getRoot(showableTypesParam, purgeEmpyFolders, filterCriteria, new AsyncCallback<Item>() {
public void onFailure(Throwable caught) {
GWT.log("Error loading workspace tree from server",
caught);
// showErrorPanel(caught);
// DataLoadEvent.fireLoadDataFailed(WorkspaceLightTreePanel.this,
// caught);
}
public void onFailure(Throwable caught) {
GWT.log("Error loading workspace tree from server",
caught);
}
public void onSuccess(Item item) {
GWT.log("workspace tree retrieved.");
// tree.setRootItem(root);
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");
}
// we select the root
// tree.selectItem(root.getId());
});
}
/**
* Load the Workspace Tree.
*/
public void loadFolder(Item item) {
GWT.log("loading folder data");
setLoading();
if(item.isFolder()){
// we make a copy of showable types
List<ItemType> showableTypesParam = new ArrayList<ItemType>(showableTypes);
// then we remove the loading icon
explorerPanel.clear();
ItemsTable itTables = new ItemsTable(false);
itTables.addItems(item.getChildren());
explorerPanel.add(itTables.getCellTable());
// we get sure that folders are displayed
for (ItemType folder : Util.FOLDERS) {
if (!showableTypesParam.contains(folder))
showableTypesParam.add(folder);
}
GWT.log("workspace tree loaded");
// DataLoadEvent.fireLoadDataSuccess(WorkspaceLightTreePanel.this);
}
boolean purgeEmpyFolders = !showEmptyFolders;
FilterCriteria filterCriteria = new FilterCriteria(allowedMimeTypes,requiredProperties);
});
GWT.log("loading workspace tree from server");
WorkspaceExplorerController.workspaceNavigatorService.getFolder(item.getId(), 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 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");
}
});
}
}
/**