Fix warnings and simplify a method signature.
[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.OthersResource;
26 import gr.ebs.gss.client.rest.resource.SharedResource;
27 import gr.ebs.gss.client.rest.resource.TrashResource;
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 //                              case: Trash folder is selected
74                                 if(GSS.get().getFolders().getCurrent().getUserObject() instanceof TrashResource){
75                                         TrashResource currentObject = (TrashResource) GSS.get().getFolders().getCurrent().getUserObject();
76                                         GSS.get().updateHistory("Files/"+ currentObject.getUri().substring(path.lastIndexOf("/")+1), item);
77                                 }
78 //                              case: Other's shared folder option is selected
79                                 else if (GSS.get().getFolders().getCurrent().getUserObject() instanceof OthersResource)
80                                         GSS.get().updateHistory("Files/"+ path.substring(path.lastIndexOf("/")+1) + "others/", item);
81                                 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof OtherUserResource){
82                                         OtherUserResource currentObject = (OtherUserResource) GSS.get().getFolders().getCurrent().getUserObject();
83                                         GSS.get().updateHistory("Files/others/"+ currentObject.getName(), item);
84                                         }
85 //                              case: my shared is selected
86                                 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof SharedResource){
87                                         SharedResource currentObject = (SharedResource) GSS.get().getFolders().getCurrent().getUserObject();
88                                         GSS.get().updateHistory("Files/"+ currentObject.getUri().substring(path.lastIndexOf("/")+1), item);
89                                 }
90                                 else{
91 //                                      case: all folder resources either below user's home folder or anywhere else(Trash/My Shared/Other's shared
92                                         FolderResource currentObject = (FolderResource) GSS.get().getFolders().getCurrent().getUserObject();
93                                         String parentUri = currentObject.getParentURI();
94                                         if(parentUri == null){
95                                                 if(containsFolder(item, "Trash")){
96 //                                                      case: selected folders below Trash folder
97                                                         String partialUri = constructPartialPath(item);
98                                                         GSS.get().updateHistory("Files/trash/" + partialUri, item);
99                                                 } else
100 //                                                      case: home folders are selected
101                                                         GSS.get().updateHistory("Files/files/" + currentObject.getName(), item);
102                                         }
103                                         else if(item.getParentItem() == null){
104 //                                              this is the case when the user uses the browser's forward arrow to navigate through other's
105 //                                              shared folders and      item.getParentItem is null only inside other's shared folder
106                                                 String apiPath = GSS.get().getApiPath();
107                                                 String newPath = currentObject.getParentURI().substring(apiPath.lastIndexOf("/"));
108                                                 GSS.get().updateHistory("Files"+ newPath + currentObject.getName(), item);
109                                         }
110                                         else if(containsFolder(item, "My Shared")){
111 //                                              case: selected folders below My Shared folder
112                                                 String partialUri = constructPartialPath(item);
113                                                 GSS.get().updateHistory("Files/shared/" + partialUri, item);
114                                         }else if(containsFolder(item, "Other's Shared")){
115 //                                              case: selected folders below Other's Shared folder
116                                                 String partialPath = constructPartialPath(item);
117                                                 GSS.get().updateHistory("Files/others/"+ partialPath, item);
118                                         }
119                                         else{
120 //                                              case:all folders in user's folders tree
121                                                 String finalUri = parentUri.substring(path.lastIndexOf("/")) + currentObject.getName();
122                                                 GSS.get().updateHistory("Files"+ finalUri, item);
123                                         }
124                                 }
125                         }
126                 });
127
128                 addOpenHandler(new OpenHandler<TreeItem>() {
129
130                         @Override
131                         public void onOpen(OpenEvent<TreeItem> event) {
132                                 TreeItem item = event.getTarget();
133                                 if (item != null && item.getState())
134                                         GSS.get().getFolders().update(item);
135
136                         }
137                 });
138                 addHandler(new ContextMenuHandler() {
139
140                         @Override
141                         public void onContextMenu(ContextMenuEvent event) {
142                                 TreeItem item = getSelectedItem();
143                                 if (item != null) {
144                                         int left = item.getAbsoluteLeft() + 40;
145                                         int top = item.getAbsoluteTop() + 20;
146                                         showPopup(left, top);
147                                 }
148
149                         }
150                 }, ContextMenuEvent.getType());
151                 // DOM.setStyleAttribute(getElement(), "position", "static");
152
153         }
154
155         @Override
156         public void onBrowserEvent(Event event) {
157                 if (DOM.eventGetType(event) == Event.ONCLICK)
158                         return;
159
160                 switch (DOM.eventGetType(event)) {
161                         case Event.ONKEYDOWN:
162                                 int key = DOM.eventGetKeyCode(event);
163                                 if (key == KeyCodes.KEY_CTRL)
164                                         ctrlKeyPressed = true;
165                                 break;
166
167                         case Event.ONKEYUP:
168                                 key = DOM.eventGetKeyCode(event);
169                                 if (key == KeyCodes.KEY_CTRL)
170                                         ctrlKeyPressed = false;
171                                 break;
172
173                         case Event.ONMOUSEDOWN:
174                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
175                                         rightClicked = true;
176                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
177                                         leftClicked = true;
178                                 break;
179
180                         case Event.ONMOUSEUP:
181                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
182                                         rightClicked = false;
183                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
184                                         leftClicked = false;
185                                 break;
186                 }
187
188                 super.onBrowserEvent(event);
189         }
190
191         protected void showPopup(final int x, final int y) {
192                 if (treeSelectedItem == null)
193                         return;
194                 if (menu != null)
195                         menu.hide();
196                 menu = new FolderContextMenu(images);
197                 menu.setPopupPosition(x, y);
198                 menu.show();
199         }
200
201         public void processItemSelected(TreeItem item) {
202                 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
203                         GSS.get().setCurrentSelection(item.getUserObject());
204                 if (!GSS.get().isFileListShowing())
205                         GSS.get().showFileList();
206
207                 // refresh Others Shared Node
208                 if (GSS.get().getFolders().isOthersShared(item)){
209                         GSS.get().getFolders().update(item);
210                         GSS.get().showFileList();
211                 }
212
213                 if (!item.equals(treeSelectedItem))
214                         processSelection(item);
215                 if (rightClicked) {
216                         rightClicked = false;
217                         int left = item.getAbsoluteLeft() + 40;
218                         int top = item.getAbsoluteTop() + 20;
219                         showPopup(left, top);
220                 } else if (leftClicked && ctrlKeyPressed) {
221                         leftClicked = false;
222                         ctrlKeyPressed = false;
223                         int left = item.getAbsoluteLeft() + 40;
224                         int top = item.getAbsoluteTop() + 20;
225                         showPopup(left, top);
226                 }
227         }
228
229         public void clearSelection() {
230                 if (treeSelectedItem != null)
231                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
232                 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
233
234                 treeSelectedItem = null;
235                 setSelectedItem(null, true);
236                 GSS.get().setCurrentSelection(null);
237         }
238
239         private void processSelection(TreeItem item) {
240                 if (treeSelectedItem != null) {
241                         GSS.get().setCurrentSelection(null);
242                         // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
243                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
244                         treeSelectedItem = null;
245                         setSelectedItem(null, true);
246                 }
247                 treeSelectedItem = item;
248                 setSelectedItem(item, true);
249                 // ensureSelectedItemVisible();
250                 if (((DnDTreeItem) item).getFolderResource() != null)
251                         GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
252                 if (item.getUserObject() instanceof FolderResource)
253                         GSS.get().setCurrentSelection(item.getUserObject());
254                 else if (item.getUserObject() instanceof OtherUserResource)
255                         GSS.get().setCurrentSelection(item.getUserObject());
256                 else if (GSS.get().getFolders().isTrash(item))
257                         GSS.get().setCurrentSelection(null);
258                 // item.getWidget().addStyleName("gss-SelectedRow");
259                 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
260                 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
261                 GSS.get().showFileList(true);
262         }
263
264         /**
265          * Retrieve the selectedItem.
266          *
267          * @return the selectedItem
268          */
269         public TreeItem getTreeSelectedItem() {
270                 return treeSelectedItem;
271         }
272
273         /**
274          * Modify the selectedItem.
275          *
276          * @param newSelectedItem the selectedItem to set
277          */
278         public void setTreeSelectedItem(TreeItem newSelectedItem) {
279                 treeSelectedItem = newSelectedItem;
280         }
281
282         /**
283          * construct the partial path of the selected TreeItem
284          *
285          * @param selectedItem the selectedItem to check
286          */
287         public String constructPartialPath(TreeItem selectedItem){
288            String result = DisplayHelper.trim(selectedItem.getText());
289            TreeItem parent = selectedItem.getParentItem();
290            while (!(DisplayHelper.trim(parent.getText()).equals("My Shared") || DisplayHelper.trim(parent.getText()).equals("Other's Shared")||DisplayHelper.trim(parent.getText()).equals("Trash"))){
291               result = DisplayHelper.trim(parent.getText()) + "/" + result;
292               if(result.equals("My Shared")||result.equals("Other's Shared")) return result;
293               parent = parent.getParentItem();
294            }
295
296            return result;
297         }
298         /**
299          * examine whether a folder name like "Trash", "My Shared", "Other's Shared" is inside path
300          *
301          * @param selectedItem the selectedTreeItem to check
302          */
303
304         public boolean containsFolder(TreeItem selectedItem, String folderName){
305                 TreeItem parent = selectedItem.getParentItem();
306                 while (parent != null){
307                         String parentItemText = parent.getText();
308                         String parentItemTextTr = DisplayHelper.trim(parentItemText);
309                         if(parentItemTextTr.equals(folderName)) return true;
310                         parent = parent.getParentItem();
311                         }
312                 return false;
313         }
314 }