First version of client that displays first level containers
[pithos-web-client] / src / gr / grnet / pithos / web / client / foldertree / FolderTreeView.java
1 /*
2  * Copyright (c) 2011 Greek Research and Technology Network
3  */
4
5 package gr.grnet.pithos.web.client.foldertree;
6
7 import com.google.gwt.cell.client.AbstractCell;
8 import com.google.gwt.cell.client.Cell;
9 import com.google.gwt.core.client.GWT;
10 import com.google.gwt.resources.client.ClientBundle;
11 import com.google.gwt.resources.client.ImageResource;
12 import com.google.gwt.resources.client.ImageResource.ImageOptions;
13 import com.google.gwt.safehtml.client.SafeHtmlTemplates;
14 import com.google.gwt.safehtml.shared.SafeHtml;
15 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
16 import com.google.gwt.user.cellview.client.CellTree;
17 import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
18 import com.google.gwt.user.client.DeferredCommand;
19 import com.google.gwt.user.client.Event;
20 import com.google.gwt.user.client.IncrementalCommand;
21 import com.google.gwt.user.client.ui.AbstractImagePrototype;
22 import com.google.gwt.user.client.ui.Composite;
23 import com.google.gwt.user.client.ui.Tree;
24 import com.google.gwt.view.client.ListDataProvider;
25 import com.google.gwt.view.client.SelectionChangeEvent;
26 import com.google.gwt.view.client.SelectionChangeEvent.Handler;
27 import com.google.gwt.view.client.SingleSelectionModel;
28 import com.google.gwt.view.client.TreeViewModel;
29 import com.google.gwt.view.client.TreeViewModel.NodeInfo;
30 import gr.grnet.pithos.web.client.CellTreeViewModel;
31 import gr.grnet.pithos.web.client.CellTreeViewUtils;
32 import gr.grnet.pithos.web.client.FolderContextMenu;
33 import gr.grnet.pithos.web.client.GSS;
34 import gr.grnet.pithos.web.client.rest.resource.FolderResource;
35 import gr.grnet.pithos.web.client.rest.resource.RestResource;
36 import gr.grnet.pithos.web.client.rest.resource.RestResourceWrapper;
37 import gwtquery.plugins.droppable.client.gwt.DragAndDropCellTree;
38 import java.util.Arrays;
39
40 public class FolderTreeView extends Composite {
41
42     static interface BasicResources extends CellTree.Resources {
43
44         @ImageOptions(flipRtl = true)
45         @Source("cellTreeClosedItem.gif")
46         ImageResource cellTreeClosedItem();
47
48         @ImageOptions(flipRtl = true)
49         @Source("cellTreeLoadingBasic.gif")
50         ImageResource cellTreeLoading();
51
52         @ImageOptions(flipRtl = true)
53         @Source("cellTreeOpenItem.gif")
54         ImageResource cellTreeOpenItem();
55
56         @Source({"GssCellTreeBasic.css"})
57         CellTree.Style cellTreeStyle();
58     }
59
60     static interface Images extends ClientBundle,Tree.Resources, FolderContextMenu.Images {
61
62         @Source("gr/grnet/pithos/resources/folder_home.png")
63         ImageResource home();
64
65         @Source("gr/grnet/pithos/resources/folder_yellow.png")
66         ImageResource folderYellow();
67     }
68
69     private static Images images = GWT.create(Images.class);
70
71     static interface Templates extends SafeHtmlTemplates {
72         Templates INSTANCE = GWT.create(Templates.class);
73
74         @Template("<span>{0}</span>")
75         public SafeHtml nameSpan(String name);
76       }
77
78     static class FolderCell extends AbstractCell<Folder> {
79
80         @Override
81         public void render(Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
82             String html = AbstractImagePrototype.create(images.folderYellow()).getHTML();
83             safeHtmlBuilder.appendHtmlConstant(html);
84             safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName()));
85         }
86     }
87
88     private SingleSelectionModel<Folder> selectionModel = new SingleSelectionModel<Folder>();
89
90     public FolderTreeView() {
91         final FolderTreeViewModel model = new FolderTreeViewModel(selectionModel);
92         /*
93          * Create the tree using the model. We use <code>null</code> as the default
94          * value of the root node. The default value will be passed to
95          * CustomTreeModel#getNodeInfo();
96          */
97         CellTree.Resources res = GWT.create(BasicResources.class);
98         DragAndDropCellTree tree = new DragAndDropCellTree(model,null, res);
99
100         tree.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
101
102         Handler selectionHandler = new SelectionChangeEvent.Handler() {
103             @Override
104             public void onSelectionChange(com.google.gwt.view.client.SelectionChangeEvent event) {
105                 NodeInfo<Folder> nodeInfo = (NodeInfo<Folder>) model.getNodeInfo(selectionModel.getSelectedObject());
106                 if(nodeInfo == null || nodeInfo.getValueUpdater() == null) {
107                     //GSS.get().showFileList(selectionModel.getSelectedObject());
108                 }
109                 else
110                     nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject());
111                 GSS.get().setCurrentSelection(selectionModel.getSelectedObject());
112
113
114             }
115         };
116         selectionModel.addSelectionChangeHandler(selectionHandler);
117         sinkEvents(Event.ONCONTEXTMENU);
118         sinkEvents(Event.ONMOUSEUP);
119         initWidget(tree);
120     }
121 }