2f86ad14688decffe4dd2410d7b490f886cfd9e9
[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.GroupUserResource;
25 import gr.ebs.gss.client.rest.resource.OtherUserResource;
26 import gr.ebs.gss.client.rest.resource.OthersResource;
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.History;
40 import com.google.gwt.user.client.ui.Tree;
41 import com.google.gwt.user.client.ui.TreeItem;
42
43 /**
44  * @author kman
45  */
46 public class PopupTree extends Tree {
47
48         private FolderContextMenu menu;
49
50         private Images images;
51
52         private boolean ctrlKeyPressed = false;
53
54         private boolean leftClicked = false;
55
56         private boolean rightClicked = false;
57
58         private TreeItem treeSelectedItem = null;
59
60         public PopupTree(Images theImages) {
61                 super(theImages);
62                 images = theImages;
63                 sinkEvents(Event.ONCONTEXTMENU);
64                 sinkEvents(Event.ONMOUSEUP);
65 //              sinkEvents(Event.ONMOUSEDOWN);
66
67                 addSelectionHandler(new SelectionHandler<TreeItem>() {
68
69                         @Override
70                         public void onSelection(SelectionEvent<TreeItem> event) {
71                                 TreeItem item = event.getSelectedItem();
72                                 processItemSelected(item, true);
73
74                                 String path = GSS.get().getApiPath() +  GSS.get().getCurrentUserResource().getUsername()+ "/";
75
76                                 if(GSS.get().getFolders().isTrash(item)){
77                                         TrashResource currentObject = (TrashResource) GSS.get().getFolders().getCurrent().getUserObject();
78                                         History.newItem(currentObject.getUri().substring(path.lastIndexOf("/")) + GSS.get().getFolders().getCurrent().getText());
79                                 }else if (GSS.get().getFolders().isMyShares(item)){
80                                         GroupUserResource currentObject = (GroupUserResource)GSS.get().getFolders().getCurrent().getUserObject();
81                                         History.newItem(currentObject.getUri().substring(path.lastIndexOf("/")) + GSS.get().getFolders().getCurrent().getText());
82                                 }else if (GSS.get().getFolders().isOthersShared(item)){
83                                         OthersResource currentObject = (OthersResource) GSS.get().getFolders().getCurrent().getUserObject();
84                                         History.newItem(currentObject.getUri().substring(path.lastIndexOf("/")) + GSS.get().getFolders().getCurrent().getText());
85                                 }else{
86                                         FolderResource currentObject = (FolderResource) GSS.get().getFolders().getCurrent().getUserObject();
87                                         History.newItem("Files" + currentObject.getParentURI().substring(path.lastIndexOf("/")) + GSS.get().getFolders().getCurrent().getText());
88                                 }
89
90                         }
91                 });
92
93                 addOpenHandler(new OpenHandler<TreeItem>() {
94
95                         @Override
96                         public void onOpen(OpenEvent<TreeItem> event) {
97                                 TreeItem item = event.getTarget();
98                                 if (item != null && item.getState())
99                                         GSS.get().getFolders().update(item);
100
101                         }
102                 });
103                 addHandler(new ContextMenuHandler() {
104
105                         @Override
106                         public void onContextMenu(ContextMenuEvent event) {
107                                 TreeItem item = getSelectedItem();
108                                 if (item != null) {
109                                         int left = item.getAbsoluteLeft() + 40;
110                                         int top = item.getAbsoluteTop() + 20;
111                                         showPopup(left, top);
112                                 }
113
114                         }
115                 }, ContextMenuEvent.getType());
116                 // DOM.setStyleAttribute(getElement(), "position", "static");
117
118         }
119
120         @Override
121         public void onBrowserEvent(Event event) {
122                 if (DOM.eventGetType(event) == Event.ONCLICK)
123                         return;
124
125                 switch (DOM.eventGetType(event)) {
126                         case Event.ONKEYDOWN:
127                                 int key = DOM.eventGetKeyCode(event);
128                                 if (key == KeyCodes.KEY_CTRL)
129                                         ctrlKeyPressed = true;
130                                 break;
131
132                         case Event.ONKEYUP:
133                                 key = DOM.eventGetKeyCode(event);
134                                 if (key == KeyCodes.KEY_CTRL)
135                                         ctrlKeyPressed = false;
136                                 break;
137
138                         case Event.ONMOUSEDOWN:
139                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
140                                         rightClicked = true;
141                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
142                                         leftClicked = true;
143                                 break;
144
145                         case Event.ONMOUSEUP:
146                                 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
147                                         rightClicked = false;
148                                 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
149                                         leftClicked = false;
150                                 break;
151                 }
152
153                 super.onBrowserEvent(event);
154         }
155
156         protected void showPopup(final int x, final int y) {
157                 if (treeSelectedItem == null)
158                         return;
159                 if (menu != null)
160                         menu.hide();
161                 menu = new FolderContextMenu(images);
162                 menu.setPopupPosition(x, y);
163                 menu.show();
164         }
165
166         public void processItemSelected(TreeItem item, boolean fireEvents) {
167
168                 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
169                         GSS.get().setCurrentSelection(item.getUserObject());
170                 if (!GSS.get().isFileListShowing())
171                         GSS.get().showFileList();
172
173                 // refresh Others Shared Node
174                 if (GSS.get().getFolders().isOthersShared(item)) {
175                         GSS.get().getFolders().update(item);
176                         GSS.get().showFileList();
177                 }
178                 // refresh Others Shared User Node
179 //               else if(GSS.get().getFolders().isOthersSharedItem(item) &&
180 //               item.getUserObject() instanceof UserDTO)
181 //               GSS.get().getFolders().update(item);
182
183                 if (!item.equals(treeSelectedItem))
184                         processSelection(item);
185                 if (rightClicked) {
186                         rightClicked = false;
187                         int left = item.getAbsoluteLeft() + 40;
188                         int top = item.getAbsoluteTop() + 20;
189                         showPopup(left, top);
190                 } else if (leftClicked && ctrlKeyPressed) {
191                         leftClicked = false;
192                         ctrlKeyPressed = false;
193                         int left = item.getAbsoluteLeft() + 40;
194                         int top = item.getAbsoluteTop() + 20;
195                         showPopup(left, top);
196                 }
197         }
198
199         public void clearSelection() {
200                 if (treeSelectedItem != null)
201                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
202                 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
203
204                 treeSelectedItem = null;
205                 setSelectedItem(null, true);
206                 GSS.get().setCurrentSelection(null);
207         }
208
209         private void processSelection(TreeItem item) {
210                 if (treeSelectedItem != null) {
211                         GSS.get().setCurrentSelection(null);
212                         // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
213                         ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
214                         treeSelectedItem = null;
215                         setSelectedItem(null, true);
216                 }
217                 treeSelectedItem = item;
218                 setSelectedItem(item, true);
219                 // ensureSelectedItemVisible();
220                 if (((DnDTreeItem) item).getFolderResource() != null)
221                         GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
222                 if (item.getUserObject() instanceof FolderResource)
223                         GSS.get().setCurrentSelection(item.getUserObject());
224                 else if (item.getUserObject() instanceof OtherUserResource)
225                         GSS.get().setCurrentSelection(item.getUserObject());
226                 else if (GSS.get().getFolders().isTrash(item))
227                         GSS.get().setCurrentSelection(null);
228                 // item.getWidget().addStyleName("gss-SelectedRow");
229                 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
230                 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
231                 GSS.get().showFileList(true);
232         }
233
234         /**
235          * Retrieve the selectedItem.
236          *
237          * @return the selectedItem
238          */
239         public TreeItem getTreeSelectedItem() {
240                 return treeSelectedItem;
241         }
242
243         /**
244          * Modify the selectedItem.
245          *
246          * @param newSelectedItem the selectedItem to set
247          */
248         public void setTreeSelectedItem(TreeItem newSelectedItem) {
249                 treeSelectedItem = newSelectedItem;
250         }
251
252 }