New javascript method Trim added in DisplayHelper that trim not only whitespaces...
[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.http.client.URL;
38 import com.google.gwt.user.client.DOM;
39 import com.google.gwt.user.client.Event;
40 import com.google.gwt.user.client.History;
41 import com.google.gwt.user.client.ui.Tree;
42 import com.google.gwt.user.client.ui.TreeItem;
43
44 /**
45  * @author kman
46  */
47 public class PopupTree extends Tree {
48
49         private FolderContextMenu menu;
50
51         private Images images;
52
53         private boolean ctrlKeyPressed = false;
54
55         private boolean leftClicked = false;
56
57         private boolean rightClicked = false;
58
59         private TreeItem treeSelectedItem = null;
60
61         public PopupTree(Images theImages) {
62                 super(theImages);
63                 images = theImages;
64                 sinkEvents(Event.ONCONTEXTMENU);
65                 sinkEvents(Event.ONMOUSEUP);
66 //              sinkEvents(Event.ONMOUSEDOWN);
67
68                 addSelectionHandler(new SelectionHandler<TreeItem>() {
69
70                         @Override
71                         public void onSelection(SelectionEvent<TreeItem> event) {
72                                 TreeItem item = event.getSelectedItem();
73                                 processItemSelected(item, true);
74
75                                 String path = GSS.get().getApiPath() + GSS.get().getCurrentUserResource().getUsername()+ "/";
76
77 //                              case: Trash is selected
78                                 if(GSS.get().getFolders().isTrash(item)){
79                                         TrashResource currentObject = (TrashResource) GSS.get().getFolders().getCurrent().getUserObject();
80                                         String finalUri = currentObject.getUri().substring(path.lastIndexOf("/")+1);
81                                         History.newItem("Files/"+finalUri);
82                                 }
83 //                              case: Other's shared option is selected
84                                 else if (GSS.get().getFolders().getCurrent().getUserObject() instanceof OthersResource){
85                                         String currentPartTrimmed = DisplayHelper.trim(item.getText());
86                                         String finalUri = URL.encodeComponent("Files/"+path.substring(path.lastIndexOf("/")+1) + currentPartTrimmed);
87
88                                         History.newItem(finalUri);
89                                 }
90 //                              case: expand Other's shared to folder below
91                                 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof OtherUserResource){
92                                         OtherUserResource currentObject = (OtherUserResource) GSS.get().getFolders().getCurrent().getUserObject();
93                                         String finalUri = URL.encodeComponent("others/"+ currentObject.getName());
94                                         History.newItem(finalUri);
95                                 }
96 //                              case: my shared is selected
97                                 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof SharedResource){
98                                         SharedResource currentObject = (SharedResource) GSS.get().getFolders().getCurrent().getUserObject();
99                                         String finalUri = currentObject.getUri().substring(path.lastIndexOf("/")+1);
100                                         History.newItem("Files/"+finalUri);
101                                 }
102
103 //                              case: home folders are selected
104                                 else{
105                                         FolderResource currentObject = (FolderResource) GSS.get().getFolders().getCurrent().getUserObject();
106                                         String parentUri = currentObject.getParentURI();
107                                         if(parentUri == null){
108                                                 if(containsTrash(GSS.get().getFolders().getCurrent())){
109                                                         String finalUri = constructPartialPath(GSS.get().getFolders().getCurrent());
110                                                         History.newItem("trash/"+finalUri);
111                                                 }else{
112                                                         String nonEncodedUri = "Files/" + currentObject.getName();
113
114                                                         History.newItem(URL.encode(nonEncodedUri));
115                                                 }
116                                         } else if(containsSharedFolder(GSS.get().getFolders().getCurrent())){
117                                                 String finalUri = constructPartialPath(GSS.get().getFolders().getCurrent());
118                                                 History.newItem("shared/"+finalUri);
119                                         }else if(containsSharedFolder(GSS.get().getFolders().getCurrent())){
120                                                 String finalUri = constructPartialPath(GSS.get().getFolders().getCurrent());
121                                                 History.newItem("other's/"+finalUri);
122                                         }
123                                         else{
124                                                 String uri = "Files"+ parentUri.substring(path.lastIndexOf("/")) + URL.encode(currentObject.getName());
125                                                 History.newItem(uri);
126                                         }
127                                 }
128                         }
129
130
131                 });
132
133                 addOpenHandler(new OpenHandler<TreeItem>() {
134
135                         @Override
136                         public void onOpen(OpenEvent<TreeItem> event) {
137                                 TreeItem item = event.getTarget();
138                                 if (item != null && item.getState())
139                                         GSS.get().getFolders().update(item);
140
141                         }
142                 });
143                 addHandler(new ContextMenuHandler() {
144
145                         @Override
146                         public void onContextMenu(ContextMenuEvent event) {
147                                 TreeItem item = getSelectedItem();
148                                 if (item != null) {
149                                         int left = item.getAbsoluteLeft() + 40;
150                                         int top = item.getAbsoluteTop() + 20;
151                                         showPopup(left, top);
152                                 }
153
154                         }
155                 }, ContextMenuEvent.getType());
156                 // DOM.setStyleAttribute(getElement(), "position", "static");
157
158         }
159
160         @Override
161         public void onBrowserEvent(Event event) {
162                 if (DOM.eventGetType(event) == Event.ONCLICK)
163                         return;
164
165                 switch (DOM.eventGetType(event)) {
166                         case Event.ONKEYDOWN:
167                                 int key = DOM.eventGetKeyCode(event);
168                                 if (key == KeyCodes.KEY_CTRL)
169                                         ctrlKeyPressed = true;
170                                 break;
171
172                         case Event.ONKEYUP:
173                                 key = DOM.eventGetKeyCode(event);
174                                 if (key == KeyCodes.KEY_CTRL)
175                                         ctrlKeyPressed = false;
176                                 break;
177
178                         case Event.ONMOUSEDOWN:
179                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
180                                         rightClicked = true;
181                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
182                                         leftClicked = true;
183                                 break;
184
185                         case Event.ONMOUSEUP:
186                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
187                                         rightClicked = false;
188                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
189                                         leftClicked = false;
190                                 break;
191                 }
192
193                 super.onBrowserEvent(event);
194         }
195
196         protected void showPopup(final int x, final int y) {
197                 if (treeSelectedItem == null)
198                         return;
199                 if (menu != null)
200                         menu.hide();
201                 menu = new FolderContextMenu(images);
202                 menu.setPopupPosition(x, y);
203                 menu.show();
204         }
205
206         public void processItemSelected(TreeItem item, boolean fireEvents) {
207
208                 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
209                         GSS.get().setCurrentSelection(item.getUserObject());
210                 if (!GSS.get().isFileListShowing())
211                         GSS.get().showFileList();
212
213                 // refresh Others Shared Node
214                 if (GSS.get().getFolders().isOthersShared(item)) {
215                         GSS.get().getFolders().update(item);
216                         GSS.get().showFileList();
217                 }
218                 // refresh Others Shared User Node
219 //               else if(GSS.get().getFolders().isOthersSharedItem(item) &&
220 //               item.getUserObject() instanceof UserDTO)
221 //               GSS.get().getFolders().update(item);
222
223                 if (!item.equals(treeSelectedItem))
224                         processSelection(item);
225                 if (rightClicked) {
226                         rightClicked = false;
227                         int left = item.getAbsoluteLeft() + 40;
228                         int top = item.getAbsoluteTop() + 20;
229                         showPopup(left, top);
230                 } else if (leftClicked && ctrlKeyPressed) {
231                         leftClicked = false;
232                         ctrlKeyPressed = false;
233                         int left = item.getAbsoluteLeft() + 40;
234                         int top = item.getAbsoluteTop() + 20;
235                         showPopup(left, top);
236                 }
237         }
238
239         public void clearSelection() {
240                 if (treeSelectedItem != null)
241                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
242                 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
243
244                 treeSelectedItem = null;
245                 setSelectedItem(null, true);
246                 GSS.get().setCurrentSelection(null);
247         }
248
249         private void processSelection(TreeItem item) {
250                 if (treeSelectedItem != null) {
251                         GSS.get().setCurrentSelection(null);
252                         // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
253                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
254                         treeSelectedItem = null;
255                         setSelectedItem(null, true);
256                 }
257                 treeSelectedItem = item;
258                 setSelectedItem(item, true);
259                 // ensureSelectedItemVisible();
260                 if (((DnDTreeItem) item).getFolderResource() != null)
261                         GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
262                 if (item.getUserObject() instanceof FolderResource)
263                         GSS.get().setCurrentSelection(item.getUserObject());
264                 else if (item.getUserObject() instanceof OtherUserResource)
265                         GSS.get().setCurrentSelection(item.getUserObject());
266                 else if (GSS.get().getFolders().isTrash(item))
267                         GSS.get().setCurrentSelection(null);
268                 // item.getWidget().addStyleName("gss-SelectedRow");
269                 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
270                 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
271                 GSS.get().showFileList(true);
272         }
273
274         /**
275          * Retrieve the selectedItem.
276          *
277          * @return the selectedItem
278          */
279         public TreeItem getTreeSelectedItem() {
280                 return treeSelectedItem;
281         }
282
283         /**
284          * Modify the selectedItem.
285          *
286          * @param newSelectedItem the selectedItem to set
287          */
288         public void setTreeSelectedItem(TreeItem newSelectedItem) {
289                 treeSelectedItem = newSelectedItem;
290         }
291
292         /**
293          * examine whether there is "My Shared" inside path
294          *
295          * @param selectedItem the selectedItem to check
296          */
297
298         public boolean containsSharedFolder(TreeItem selectedItem){
299                    TreeItem parent = selectedItem.getParentItem();
300                    while (parent != null){
301                       String parentItemText = parent.getText();
302                       String parentItemTextTr = DisplayHelper.trim(parentItemText);
303                       if(parentItemTextTr.equals("My Shared")||parentItemTextTr.equals("Other's Shared")) return true;
304                       parent = parent.getParentItem();
305                    }
306                    return false;
307         }
308         public boolean containsTrash(TreeItem selectedItem){
309                    TreeItem parent = selectedItem.getParentItem();
310                    while (parent != null){
311                       String parentItemText = parent.getText();
312                       String parentItemTextTr = DisplayHelper.trim(parentItemText);
313                       if(parentItemTextTr.equals("Trash")) return true;
314                       parent = parent.getParentItem();
315                    }
316                    return false;
317         }
318
319         /**
320          * construct the partial path of the selected TreeItem
321          *
322          * @param selectedItem the selectedItem to check
323          */
324         public String constructPartialPath(TreeItem selectedItem){
325            String result = DisplayHelper.trim(selectedItem.getText());
326            TreeItem parent = selectedItem.getParentItem();
327            while (!(DisplayHelper.trim(parent.getText()).equals("My Shared") || DisplayHelper.trim(parent.getText()).equals("Other's Shared")||DisplayHelper.trim(parent.getText()).equals("Trash"))){
328               result = DisplayHelper.trim(parent.getText()) + "/" + result;
329               if(result.equals("My Shared")||result.equals("Other's Shared")) return result;
330               parent = parent.getParentItem();
331            }
332
333            return result;
334         }
335
336
337 }