X-Git-Url: https://code.grnet.gr/git/pithos/blobdiff_plain/5b09ea6c7d2b6fcb2cd27c6b8d664f0a962d9b51..4ac4dbef869b50377d81d5ac680432c2bbd3b52c:/src/gr/ebs/gss/client/CellTreeView.java diff --git a/src/gr/ebs/gss/client/CellTreeView.java b/src/gr/ebs/gss/client/CellTreeView.java index b3f069e..9ee137e 100644 --- a/src/gr/ebs/gss/client/CellTreeView.java +++ b/src/gr/ebs/gss/client/CellTreeView.java @@ -18,49 +18,50 @@ */ package gr.ebs.gss.client; +import gr.ebs.gss.client.CellTreeViewModel.MyFolderDataProvider; import gr.ebs.gss.client.rest.GetCommand; -import gr.ebs.gss.client.rest.MultipleGetCommand; import gr.ebs.gss.client.rest.RestException; import gr.ebs.gss.client.rest.resource.FolderResource; +import gr.ebs.gss.client.rest.resource.MyFolderResource; +import gr.ebs.gss.client.rest.resource.OtherUserResource; +import gr.ebs.gss.client.rest.resource.OthersFolderResource; import gr.ebs.gss.client.rest.resource.OthersResource; import gr.ebs.gss.client.rest.resource.RestResource; +import gr.ebs.gss.client.rest.resource.RestResourceWrapper; import gr.ebs.gss.client.rest.resource.SharedResource; +import gr.ebs.gss.client.rest.resource.TrashFolderResource; import gr.ebs.gss.client.rest.resource.TrashResource; import gr.ebs.gss.client.rest.resource.UserResource; +import gwtquery.plugins.draggable.client.DragAndDropManager; +import gwtquery.plugins.droppable.client.events.DragAndDropContext; +import gwtquery.plugins.droppable.client.events.OverDroppableEvent; +import gwtquery.plugins.droppable.client.events.OverDroppableEvent.OverDroppableEventHandler; +import gwtquery.plugins.droppable.client.gwt.DragAndDropCellTree; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; -import com.google.gwt.cell.client.AbstractCell; -import com.google.gwt.cell.client.Cell; -import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.AttachEvent; import com.google.gwt.event.logical.shared.OpenEvent; +import com.google.gwt.event.logical.shared.OpenHandler; +import com.google.gwt.query.client.plugins.GQueryUi; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.resources.client.ImageResource.ImageOptions; -import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.CellTree; import com.google.gwt.user.cellview.client.TreeNode; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.IncrementalCommand; -import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Tree; -import com.google.gwt.user.client.ui.TreeItem; -import com.google.gwt.view.client.AbstractDataProvider; -import com.google.gwt.view.client.AsyncDataProvider; -import com.google.gwt.view.client.HasData; -import com.google.gwt.view.client.ListDataProvider; -import com.google.gwt.view.client.Range; +import com.google.gwt.view.client.ProvidesKey; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import com.google.gwt.view.client.TreeViewModel; import com.google.gwt.view.client.SelectionChangeEvent.Handler; -import com.google.gwt.view.client.TreeViewModel.DefaultNodeInfo; import com.google.gwt.view.client.TreeViewModel.NodeInfo; @@ -71,17 +72,23 @@ import com.google.gwt.view.client.TreeViewModel.NodeInfo; public class CellTreeView extends Composite{ public static final boolean DONE = false; Images images; - private final ListDataProvider rootNodes = new ListDataProvider(); - SingleSelectionModel selectionModel = new SingleSelectionModel(); + + SingleSelectionModel selectionModel = new SingleSelectionModel(new ProvidesKey() { + + @Override + public Object getKey(RestResource item) { + return item.getClass().getName()+":"+item.getUri(); + }}); FolderContextMenu menu; - FolderResource myFolders=null; + MyFolderResource myFolders=null; TrashResource trash = null; SharedResource myshared = null; OthersResource others = null; - TreeViewModel model = new CustomTreeModel(); + CellTreeViewModel model; + CellTreeViewUtils utils; public interface Images extends ClientBundle,Tree.Resources, FolderContextMenu.Images { @@ -106,7 +113,7 @@ public class CellTreeView extends Composite{ @Source("gr/ebs/gss/resources/trashcan_empty.png") ImageResource trash(); } - final CellTree tree; + DragAndDropCellTree tree; /*public interface BasicResources extends CellTree.BasicResources{ @ImageOptions(flipRtl = true) @Source("cellTreeLoadingBasic.gif") @@ -138,23 +145,46 @@ public class CellTreeView extends Composite{ */ public CellTreeView(final Images _images) { images = _images; - - + model = new CellTreeViewModel(images,selectionModel); /* * Create the tree using the model. We use null as the default * value of the root node. The default value will be passed to * CustomTreeModel#getNodeInfo(); */ CellTree.Resources res = GWT.create(BasicResources.class); - tree = new CellTree(model,null, res){ + tree = new DragAndDropCellTree(model,null, res){ @Override public void onBrowserEvent(Event event) { // TODO Auto-generated method stub super.onBrowserEvent(event); - //GWT.log(event.getType()); } }; + utils=new CellTreeViewUtils(tree); tree.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); + /*tree.addOpenHandler(new OpenHandler() { + + @Override + public void onOpen(OpenEvent event) { + Window.alert("[NODE OPENED]"+event.getTarget()); + + } + }); + tree.addOverDroppableHandler(new OverDroppableEventHandler() { + + @Override + public void onOverDroppable(OverDroppableEvent event) { + GWT.log("OVER:"+event); + + } + }); + tree.addAttachHandler(new AttachEvent.Handler() { + + @Override + public void onAttachOrDetach(AttachEvent event) { + GWT.log("ATTACH:"+event.getSource()); + + } + });*/ Handler selectionHandler = new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(com.google.gwt.view.client.SelectionChangeEvent event) { @@ -164,8 +194,8 @@ public class CellTreeView extends Composite{ //((DefaultNodeInfo)nodeInfo).getValueUpdater().update(selectionModel.getSelectedObject()); //if(nodeInfo.getProvidesKey() instanceof FolderDataProvider) //((FolderDataProvider)nodeInfo.getProvidesKey()).onRangeChanged(null); - if(nodeInfo.getValueUpdater()==null) - GWT.log("VALUE UPDATER IS NULL"); + if(nodeInfo==null || nodeInfo.getValueUpdater()==null){} + else nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject()); GSS.get().setCurrentSelection(selectionModel.getSelectedObject()); @@ -179,6 +209,7 @@ public class CellTreeView extends Composite{ sinkEvents(Event.ONCONTEXTMENU); sinkEvents(Event.ONMOUSEUP); initWidget(tree); + DeferredCommand.addCommand(new IncrementalCommand() { @Override @@ -190,14 +221,111 @@ public class CellTreeView extends Composite{ public void updateNode(RestResource resource){ NodeInfo nodeInfo = (NodeInfo) getModel().getNodeInfo(resource); - if(nodeInfo!=null){ - if(nodeInfo.getValueUpdater()==null) - GWT.log("VALUE UPDATER IS NULL"); + + if(nodeInfo!=null){ + if(nodeInfo.getValueUpdater()==null){} else nodeInfo.getValueUpdater().update(resource); } } + public void updateNodeChildren(final RestResource resource){ + + if(resource instanceof RestResourceWrapper){ + boolean updated=false; + if(((RestResourceWrapper)resource).getResource().getFolders().size()==0){ + if(model.getMymap().get(((RestResourceWrapper)resource).getResource().getParentURI())!=null){ + model.getMymap().get(((RestResourceWrapper)resource).getResource().getParentURI()).refresh(null); + updated=true; + } + if(model.getOthersmap().get(((RestResourceWrapper)resource).getResource().getParentURI())!=null){ + model.getOthersmap().get(((RestResourceWrapper)resource).getResource().getParentURI()).refresh(null); + updated=true; + } + if(model.getSharedmap().get(((RestResourceWrapper)resource).getResource().getParentURI())!=null){ + model.getSharedmap().get(((RestResourceWrapper)resource).getResource().getParentURI()).refresh(null); + updated=true; + } + if(updated){ + if(utils.doesSharedNodeContainsResourceIn1stLevel(resource.getUri())){ + updateMySharedNode(); + } + return; + } + } + } + + utils.refreshNodeContainingResource(resource); + if(utils.doesSharedNodeContainsResourceIn1stLevel(resource.getUri())){ + updateMySharedNode(); + } + + } + public void updateNodeChildrenForRemove(final String resource){ + GWT.log("********************************"); + GWT.log("[UPDATENODECHILDREN]"+resource); + GWT.log("********************************"); + boolean updated=false; + TreeNode node=null; + if(tree.getRootTreeNode().isChildOpen(0)){ + node = utils.getNodeContainingResource2(tree.getRootTreeNode().setChildOpen(0,true), resource); + } + GWT.log("CHECK NODE1:"+node+" "+resource); + if(node==null) + if(tree.getRootTreeNode().isChildOpen(2)){ + GWT.log("CHECK NODE2:"+node); + node = utils.getNodeContainingResource2(tree.getRootTreeNode().setChildOpen(2,true), resource); + } + if(node==null) + if(tree.getRootTreeNode().isChildOpen(3)){ + GWT.log("CHECK NODE3:"+node); + node = utils.getNodeContainingResource2(tree.getRootTreeNode().setChildOpen(3,true), resource); + } + + if(node != null && node.getValue() instanceof RestResourceWrapper){ + GWT.log("*********************"+((RestResourceWrapper) node.getValue()).getResource().getFolders().size()); + if(((RestResourceWrapper) node.getValue()).getResource().getFolders().size()==1||((RestResourceWrapper) node.getValue()).getResource().getFolders().size()==0) + updateNodeChildren(((RestResourceWrapper) node.getValue()).getResource().getParentURI()); + else + updateNodeChildren(((RestResource) node.getValue()).getUri()); + return; + /*GWT.log("INSIDE:"+node); + RestResourceWrapper rw = (RestResourceWrapper) node.getValue(); + //if(rw.getResource().getFolders().size()==0){ + if(model.getMymap().get(rw.getResource().getUri())!=null){ + model.getMymap().get(rw.getResource().getUri()).refresh(null); + updated=true; + } + if(model.getOthersmap().get(rw.getResource().getUri())!=null){ + model.getOthersmap().get(rw.getResource().getUri()).refresh(null); + updated=true; + } + if(model.getSharedmap().get(rw.getResource().getUri())!=null){ + model.getSharedmap().get(rw.getResource().getUri()).refresh(null); + updated=true; + } + if(updated){ + if(doesSharedNodeContainsResourceIn1stLevel(resource)){ + updateMySharedNode(); + } + return; + } + } + //}*/ + + } + updateNodeChildren(resource); + } + public void updateNodeChildren(final String resource){ + + + GWT.log("REFRESH THE OTHER WAY"); + utils.refreshNodeContainingResource(resource); + if(utils.doesSharedNodeContainsResourceIn1stLevel(resource)){ + updateMySharedNode(); + } + } + protected void showPopup(final int x, final int y) { if (selectionModel.getSelectedObject() == null) return; @@ -218,7 +346,8 @@ public class CellTreeView extends Composite{ @Override public void onComplete() { - myFolders = getResult(); + myFolders = new MyFolderResource(getResult()); + //selectionModel.setSelected(myFolders, true); //rootNodes.setList(Arrays.asList((RestResource)rootResource)); //tree.getRootTreeNode().setChildOpen(0, true); } @@ -286,8 +415,9 @@ public class CellTreeView extends Composite{ } if(myFolders==null||trash==null||myshared==null||others==null) return !DONE; - rootNodes.setList(Arrays.asList((RestResource)myFolders,(RestResource)trash,(RestResource)myshared,(RestResource)others)); + model.getRootNodes().setList(Arrays.asList((RestResource)myFolders,(RestResource)trash,(RestResource)myshared,(RestResource)others)); tree.getRootTreeNode().setChildOpen(0, true); + selectionModel.setSelected(myFolders, true); return DONE; } @@ -296,172 +426,95 @@ public class CellTreeView extends Composite{ } - class CustomTreeModel implements TreeViewModel{ - private final Cell departmentCell = new AbstractCell("contextmenu"){ - + public void updateTrashNode(){ + DeferredCommand.addCommand(new GetCommand(TrashResource.class, GSS.get().getCurrentUserResource().getTrashPath(), null) { @Override - public void render(com.google.gwt.cell.client.Cell.Context arg0, RestResource arg1, SafeHtmlBuilder arg2) { - String html=null; - String name=null; - if(arg1 instanceof FolderResource){ - FolderResource res = (FolderResource) arg1; - if(res.isShared()) - html = AbstractImagePrototype.create(images.sharedFolder()).getHTML(); - else if(res.getParentName()==null){ - html = AbstractImagePrototype.create(images.home()).getHTML(); - } - else - html = AbstractImagePrototype.create(images.folderYellow()).getHTML(); - name = res.getName(); - - } - if(arg1 instanceof TrashResource){ - html = AbstractImagePrototype.create(images.trash()).getHTML(); - name="Trash"; - } - if(arg1 instanceof SharedResource){ - html = AbstractImagePrototype.create(images.myShared()).getHTML(); - name="My Shared"; - } - if(arg1 instanceof OthersResource){ - html = AbstractImagePrototype.create(images.othersShared()).getHTML(); - name = "Other's Shared"; - } - arg2.appendHtmlConstant(html); - arg2.appendHtmlConstant(""); - arg2.appendEscaped(name); - arg2.appendHtmlConstant(""); + public void onComplete() { + trash = getResult(); + model.getRootNodes().getList().set(1, trash); + //model.getRootNodes().refresh(); } - - public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, FolderResource value, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater valueUpdater) { - GWT.log("-->"+event.getType()); - if(event.getType().equals("contextmenu")){ - selectionModel.setSelected(value, true); - showPopup(event.getClientX(), event.getClientY()); + + @Override + public void onError(Throwable t) { + if(t instanceof RestException){ + int statusCode = ((RestException)t).getHttpStatusCode(); + // On IE status code 1223 may be returned instead of 204. + if(statusCode == 204 || statusCode == 1223){ + trash = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath()); + model.getRootNodes().getList().set(1, trash); + //model.getRootNodes().refresh(); + } + else{ + GWT.log("", t); + GSS.get().displayError("Unable to fetch trash folder:"+t.getMessage()); + trash = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath()); + model.getRootNodes().getList().set(1, trash); + //model.getRootNodes().refresh(); } - }; - - }; - - - @Override - public NodeInfo getNodeInfo(T value) { - - if(value==null){ - return new DefaultNodeInfo(rootNodes, departmentCell, - selectionModel, null); - } - else if (value instanceof FolderResource) { - // Second level. - FolderDataProvider dataProvider = new FolderDataProvider( - ((FolderResource) value).getUri()); - return new DefaultNodeInfo(dataProvider, departmentCell, - selectionModel, new ResourceValueUpdater()); - } - else if (value instanceof SharedResource) { - // Second level. - FolderDataProvider dataProvider = new FolderDataProvider( - ((SharedResource) value).getUri()); - return new DefaultNodeInfo(dataProvider, departmentCell, - selectionModel, null); } - // TODO Auto-generated method stub - return null; } - - @Override - public boolean isLeaf(Object value) { - if(value instanceof FolderResource) - return ((FolderResource)value).getFolders().size()==0; - if(value instanceof TrashResource) - return ((TrashResource)value).getFolders().size()==0; - return false; - } - + }); } - class ResourceValueUpdater implements ValueUpdater{ - - @Override - public void update(final RestResource value) { - if(value instanceof FolderResource){ - GetCommand gf = new GetCommand(FolderResource.class, value.getUri(), null) { - - @Override - public void onComplete() { - FolderResource rootResource = getResult(); - ((FolderResource)value).setFiles(rootResource.getFiles()); - if(getSelection().getUri().equals(value.getUri())) - selectionModel.setSelected(value, true); - GSS.get().onResourceUpdate(value); - } - - @Override - public void onError(Throwable t) { - GWT.log("Error fetching root folder", t); - GSS.get().displayError("Unable to fetch root folder"); - } - }; - DeferredCommand.addCommand(gf); - } - - } - - } - class FolderDataProvider extends AsyncDataProvider{ - private final String department; - - public FolderDataProvider(String department) { - super(null); - this.department = department; - } + public void updateRootNode(){ + final String path = GSS.get().getCurrentUserResource().getFilesPath(); + GetCommand gf = new GetCommand(FolderResource.class, path, null) { - @Override - protected void onRangeChanged(final HasData view) { - GetCommand gf = new GetCommand(FolderResource.class, department, null) { + @Override + public void onComplete() { + myFolders = new MyFolderResource(getResult()); + model.getRootNodes().getList().set(0, myFolders); + model.getRootNodes().refresh(); + tree.getRootTreeNode().setChildOpen(0, true); + + } - @Override - public void onComplete() { - FolderResource rootResource = getResult(); - MultipleGetCommand gf2 = new MultipleGetCommand(FolderResource.class, - rootResource.getSubfolderPaths().toArray(new String[] {}), null) { - - @Override - public void onComplete() { - List res = new ArrayList(); - res.addAll(getResult()); - updateRowCount(res.size(), true); - updateRowData(0,res); - } + @Override + public void onError(Throwable t) { + GWT.log("Error fetching root folder", t); + GSS.get().displayError("Unable to fetch root folder"); + } - @Override - public void onError(Throwable t) { - GSS.get().displayError("Unable to fetch subfolders"); - GWT.log("Unable to fetch subfolders", t); - } + }; + DeferredCommand.addCommand(gf); + } + + public void updateMySharedNode(){ + GetCommand gs = new GetCommand(SharedResource.class, GSS.get().getCurrentUserResource().getSharedPath(), null) { - @Override - public void onError(String p, Throwable throwable) { - GWT.log("Path:"+p, throwable); - } + @Override + public void onComplete() { + myshared=getResult(); + model.getRootNodes().getList().set(2, myshared); + } - }; - DeferredCommand.addCommand(gf2); - - } + @Override + public void onError(Throwable t) { + GWT.log("Error fetching Shared Root folder", t); + GSS.get().displayError("Unable to fetch Shared Root folder"); + } + }; + DeferredCommand.addCommand(gs); + } + + public void updateOtherNode(){ + GetCommand go = new GetCommand(OthersResource.class, + GSS.get().getCurrentUserResource().getOthersPath(), null) { - @Override - public void onError(Throwable t) { - GWT.log("Error fetching root folder", t); - GSS.get().displayError("Unable to fetch root folder"); - } + @Override + public void onComplete() { + others = getResult(); + model.getRootNodes().getList().set(3, others); + } - }; - DeferredCommand.addCommand(gf); - - - } - + @Override + public void onError(Throwable t) { + GWT.log("Error fetching Others Root folder", t); + GSS.get().displayError("Unable to fetch Others Root folder"); + } + }; + DeferredCommand.addCommand(go); } @@ -469,13 +522,19 @@ public class CellTreeView extends Composite{ return selectionModel.getSelectedObject(); } + public void clearSelection(){ + if(GSS.get().getCurrentSelection().equals(getSelection())) + GSS.get().setCurrentSelection(null); + selectionModel.setSelected(getSelection(), false); + } + /** * Retrieve the myFolders. * * @return the myFolders */ - public FolderResource getMyFolders() { + public MyFolderResource getMyFolders() { return myFolders; } @@ -518,27 +577,43 @@ public class CellTreeView extends Composite{ public TreeViewModel getModel() { return model; } - /* - private TreeNode getUserItem(TreeNode parent, RestResource folder) { - if(parent==null) - parent = tree.getRootTreeNode(); - TreeNode tmp = null; - if (parent.getValue() instanceof RestResource && - (parent.getValue().equals(folder) || - ((FolderResource) parent.getValue()).getUri().equals(folder.getUri()))) - return parent; - for (int i = 0; i < parent.getChildCount(); i++) { - boolean op = parent.isChildOpen(i); - TreeNode child = parent.setChildOpen(index, open, fireEvents)(i); - if (child.getUserObject() instanceof FolderResource) { - FolderResource dto = (FolderResource) child.getUserObject(); - if (dto.equals(folder) || dto.getUri().equals(folder.getUri())) - return child; + + + + /** + * Retrieve the utils. + * + * @return the utils + */ + public CellTreeViewUtils getUtils() { + return utils; + } + + public interface RefreshHandler{ + void onRefresh(); + } + + + public boolean isTrashOrTrashFolderSelected(){ + return (getSelection() instanceof TrashResource) || (getSelection() instanceof TrashFolderResource); + } + + public OtherUserResource getOtherUserResourceOfOtherFolder(OthersFolderResource res){ + TreeNode n = utils.getNodeContainingResource(tree.getRootTreeNode().setChildOpen(3, true), res); + + if(n!=null){ + if(n.getValue() instanceof OtherUserResource) + return (OtherUserResource) n.getValue(); + TreeNode parent = n.getParent(); + + while (parent!=null){ + if(parent.getValue() instanceof OtherUserResource) + return (OtherUserResource) parent.getValue(); + parent = parent.getParent(); } - tmp = getUserItem(child, folder); - if (tmp != null) - return tmp; } return null; - }*/ + } + + }