early commit - first attemp, regarding giving a uri and fetching the proper directory
[pithos] / src / gr / ebs / gss / client / PopupTree.java
1 /*
2  * Copyright 2008, 2009, 2010 Electronic Business Systems Ltd.
3  *
4  * This file is part of GSS.
5  *
6  * GSS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 package gr.ebs.gss.client;
20
21 import gr.ebs.gss.client.Folders.Images;
22 import gr.ebs.gss.client.dnd.DnDTreeItem;
23 import gr.ebs.gss.client.rest.resource.FolderResource;
24 import gr.ebs.gss.client.rest.resource.OtherUserResource;
25 import gr.ebs.gss.client.rest.resource.RestResource;
26
27 import java.util.Iterator;
28
29 import com.google.gwt.dom.client.NativeEvent;
30 import com.google.gwt.event.dom.client.ContextMenuEvent;
31 import com.google.gwt.event.dom.client.ContextMenuHandler;
32 import com.google.gwt.event.dom.client.KeyCodes;
33 import com.google.gwt.event.logical.shared.OpenEvent;
34 import com.google.gwt.event.logical.shared.OpenHandler;
35 import com.google.gwt.event.logical.shared.SelectionEvent;
36 import com.google.gwt.event.logical.shared.SelectionHandler;
37 import com.google.gwt.user.client.DOM;
38 import com.google.gwt.user.client.Event;
39 import com.google.gwt.user.client.ui.Tree;
40 import com.google.gwt.user.client.ui.TreeItem;
41
42 /**
43  * @author kman
44  */
45 public class PopupTree extends Tree {
46
47         private FolderContextMenu menu;
48
49         private Images images;
50
51         private boolean ctrlKeyPressed = false;
52
53         private boolean leftClicked = false;
54
55         private boolean rightClicked = false;
56
57         private TreeItem treeSelectedItem = null;
58
59         public PopupTree(Images theImages) {
60                 super(theImages);
61                 images = theImages;
62                 sinkEvents(Event.ONCONTEXTMENU);
63                 sinkEvents(Event.ONMOUSEUP);
64 //              sinkEvents(Event.ONMOUSEDOWN);
65
66                 addSelectionHandler(new SelectionHandler<TreeItem>() {
67
68                         @Override
69                         public void onSelection(SelectionEvent<TreeItem> event) {
70                                 TreeItem item = event.getSelectedItem();
71                                 processItemSelected(item);
72                                 String path = GSS.get().getApiPath() + GSS.get().getCurrentUserResource().getUsername()+ "/";
73                                 ((RestResource) GSS.get().getFolders().getCurrent().getUserObject()).updateHistory(item,path);
74                                 }
75                 });
76
77                 addOpenHandler(new OpenHandler<TreeItem>() {
78
79                         @Override
80                         public void onOpen(OpenEvent<TreeItem> event) {
81                                 TreeItem item = event.getTarget();
82                                 if (item != null && item.getState())
83                                         GSS.get().getFolders().update(item);
84
85                         }
86                 });
87                 addHandler(new ContextMenuHandler() {
88
89                         @Override
90                         public void onContextMenu(ContextMenuEvent event) {
91                                 TreeItem item = getSelectedItem();
92                                 if (item != null) {
93                                         int left = item.getAbsoluteLeft() + 40;
94                                         int top = item.getAbsoluteTop() + 20;
95                                         showPopup(left, top);
96                                 }
97
98                         }
99                 }, ContextMenuEvent.getType());
100                 // DOM.setStyleAttribute(getElement(), "position", "static");
101
102         }
103
104         @Override
105         public void onBrowserEvent(Event event) {
106                 if (DOM.eventGetType(event) == Event.ONCLICK)
107                         return;
108
109                 switch (DOM.eventGetType(event)) {
110                         case Event.ONKEYDOWN:
111                                 int key = DOM.eventGetKeyCode(event);
112                                 if (key == KeyCodes.KEY_CTRL)
113                                         ctrlKeyPressed = true;
114                                 break;
115
116                         case Event.ONKEYUP:
117                                 key = DOM.eventGetKeyCode(event);
118                                 if (key == KeyCodes.KEY_CTRL)
119                                         ctrlKeyPressed = false;
120                                 break;
121
122                         case Event.ONMOUSEDOWN:
123                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
124                                         rightClicked = true;
125                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
126                                         leftClicked = true;
127                                 break;
128
129                         case Event.ONMOUSEUP:
130                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
131                                         rightClicked = false;
132                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
133                                         leftClicked = false;
134                                 break;
135                 }
136
137                 super.onBrowserEvent(event);
138         }
139
140         protected void showPopup(final int x, final int y) {
141                 if (treeSelectedItem == null)
142                         return;
143                 if (menu != null)
144                         menu.hide();
145                 menu = new FolderContextMenu(images);
146                 menu.setPopupPosition(x, y);
147                 menu.show();
148         }
149
150         public void processItemSelected(TreeItem item) {
151                 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
152                         GSS.get().setCurrentSelection(item.getUserObject());
153                 if (!GSS.get().isFileListShowing())
154                         GSS.get().showFileList();
155
156                 // refresh Others Shared Node
157                 if (GSS.get().getFolders().isOthersShared(item)){
158                         GSS.get().getFolders().update(item);
159                         GSS.get().showFileList();
160                 }
161
162                 if (!item.equals(treeSelectedItem))
163                         processSelection(item);
164                 if (rightClicked) {
165                         rightClicked = false;
166                         int left = item.getAbsoluteLeft() + 40;
167                         int top = item.getAbsoluteTop() + 20;
168                         showPopup(left, top);
169                 } else if (leftClicked && ctrlKeyPressed) {
170                         leftClicked = false;
171                         ctrlKeyPressed = false;
172                         int left = item.getAbsoluteLeft() + 40;
173                         int top = item.getAbsoluteTop() + 20;
174                         showPopup(left, top);
175                 }
176         }
177
178         public void clearSelection() {
179                 if (treeSelectedItem != null)
180                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
181                 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
182
183                 treeSelectedItem = null;
184                 setSelectedItem(null, true);
185                 GSS.get().setCurrentSelection(null);
186         }
187
188         private void processSelection(TreeItem item) {
189                 if (treeSelectedItem != null) {
190                         GSS.get().setCurrentSelection(null);
191                         // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
192                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
193                         treeSelectedItem = null;
194                         setSelectedItem(null, true);
195                 }
196                 treeSelectedItem = item;
197                 setSelectedItem(item, true);
198                 // ensureSelectedItemVisible();
199                 if (((DnDTreeItem) item).getFolderResource() != null)
200                         GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
201                 if (item.getUserObject() instanceof FolderResource)
202                         GSS.get().setCurrentSelection(item.getUserObject());
203                 else if (item.getUserObject() instanceof OtherUserResource)
204                         GSS.get().setCurrentSelection(item.getUserObject());
205                 else if (GSS.get().getFolders().isTrash(item))
206                         GSS.get().setCurrentSelection(null);
207                 // item.getWidget().addStyleName("gss-SelectedRow");
208                 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
209                 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
210                 GSS.get().showFileList(true);
211         }
212
213         /**
214          * Retrieve the selectedItem.
215          *
216          * @return the selectedItem
217          */
218         public TreeItem getTreeSelectedItem() {
219                 return treeSelectedItem;
220         }
221
222         /**
223          * Modify the selectedItem.
224          *
225          * @param newSelectedItem the selectedItem to set
226          */
227         public void setTreeSelectedItem(TreeItem newSelectedItem) {
228                 treeSelectedItem = newSelectedItem;
229         }
230         /**
231          * Method that takes the current string uri, finds the corresponding treeItem object
232          * using the getTreeItem method and fires this treeItem object
233          * @param uri
234          * @return treeItem
235          */
236 //      #Files/files/home
237         public TreeItem getTreeItemFromUri (String uri){
238                 String newUri = uri.substring(uri.indexOf("/")+1);
239 //              newUri = files/home
240                 String uri2 = newUri.substring(0,newUri.indexOf("/"));
241                 if(uri2.equalsIgnoreCase("files")){
242 //                      folderResource
243                         String[] tokens = uri2.split("/");
244                         for (String t : tokens){
245                                 TreeItem parentItem = getTreeItem(t);
246                                 getTreeItemFromUri(parentItem.getText());
247                         }
248                 }else if(uri2.equalsIgnoreCase("trash") || uri2.equalsIgnoreCase("shared") || uri2.equalsIgnoreCase("others"))
249                         //                      trashResource, sharedResource, othersResource
250                         return getTreeItem(uri2);
251                 return getTreeItem(newUri);
252         }
253
254         /**
255          * Method that takes a folderName and finds the corresponding treeItem object and returns it
256          * @param folderName
257          * @return treeItem
258          */
259
260         public TreeItem getTreeItem (String folderName){
261                 Iterator<TreeItem> it = GSS.get().getFolders().getPopupTree().treeItemIterator() ;
262                 while(it.hasNext()){
263                         TreeItem treeitem = it.next();
264                         if(treeitem.getText().equals(folderName))
265                                 return treeitem;
266                         }
267                 return null;
268         }
269 //      TODO when Groups or Search tab is selected then is there a TreeItem selected? guess not....
270
271 }