Use separate progress bars next to each file, in order to better track the progress...
[pithos] / src / gr / ebs / gss / client / PopupTree.java
1 /*
2  * Copyright 2008, 2009 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
26 import com.google.gwt.user.client.DOM;
27 import com.google.gwt.user.client.Event;
28 import com.google.gwt.user.client.ui.KeyboardListener;
29 import com.google.gwt.user.client.ui.Tree;
30 import com.google.gwt.user.client.ui.TreeItem;
31 import com.google.gwt.user.client.ui.TreeListener;
32
33 /**
34  * @author kman
35  */
36 public class PopupTree extends Tree {
37
38         private FolderContextMenu menu;
39
40         private Images images;
41
42         private boolean ctrlKeyPressed = false;
43
44         private boolean leftClicked = false;
45
46         private boolean rightClicked = false;
47
48         private TreeItem treeSelectedItem = null;
49
50         public PopupTree(Images images) {
51                 super(images);
52                 this.images = images;
53                 sinkEvents(Event.ONCONTEXTMENU);
54                 sinkEvents(Event.ONMOUSEUP);
55                 addTreeListener(new TreeListener() {
56
57                         public void onTreeItemSelected(TreeItem item) {
58                                 processItemSelected(item, true);
59
60                         }
61
62                         public void onTreeItemStateChanged(TreeItem item) {
63                                  if (!item.getState())
64                                         return;
65                                 GSS.get().getFolders().update(item);
66                         }
67                 });
68                 //DOM.setStyleAttribute(getElement(), "position", "static");
69
70         }
71
72
73         public void onBrowserEvent(Event event) {
74                 if (DOM.eventGetType(event) == Event.ONCLICK) return;
75
76                 switch (DOM.eventGetType(event)) {
77                         case Event.ONKEYDOWN:
78                                 int key = DOM.eventGetKeyCode(event);
79                                 if (key == KeyboardListener.KEY_CTRL)
80                                         ctrlKeyPressed = true;
81                                 break;
82
83                         case Event.ONKEYUP:
84                                 key = DOM.eventGetKeyCode(event);
85                                 if (key == KeyboardListener.KEY_CTRL)
86                                         ctrlKeyPressed = false;
87                                 break;
88
89                         case Event.ONMOUSEDOWN:
90                                 if (DOM.eventGetButton(event) == Event.BUTTON_RIGHT)
91                                         rightClicked = true;
92                                 else if (DOM.eventGetButton(event) == Event.BUTTON_LEFT)
93                                         leftClicked = true;
94                                 break;
95
96                         case Event.ONMOUSEUP:
97                                 if (DOM.eventGetButton(event) == Event.BUTTON_RIGHT)
98                                         rightClicked = false;
99                                 else if (DOM.eventGetButton(event) == Event.BUTTON_LEFT)
100                                         leftClicked = false;
101                                 break;
102                 }
103
104                 super.onBrowserEvent(event);
105         }
106
107         protected void showPopup(final int x, final int y) {
108                 if (treeSelectedItem == null)
109                         return;
110                 if(menu != null)
111                         menu.hide();
112                 menu = new FolderContextMenu(images);
113                 menu.setPopupPosition(x, y);
114                 menu.show();
115         }
116
117         void processItemSelected(TreeItem item, boolean fireEvents) {
118
119                 if(GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
120                         GSS.get().setCurrentSelection(item.getUserObject());
121                 if(!GSS.get().isFileListShowing())
122                         GSS.get().showFileList();
123
124                 //refresh Others Shared Node
125                 if(GSS.get().getFolders().isOthersShared(item)){
126                         GSS.get().getFolders().update(item);
127                         GSS.get().showFileList();
128                 }
129                 //refresh Others Shared User Node
130                 //else if(GSS.get().getFolders().isOthersSharedItem(item) && item.getUserObject() instanceof UserDTO)
131                         //GSS.get().getFolders().update(item);
132
133                 if (!item.equals(treeSelectedItem))
134                         processSelection(item);
135                 if (rightClicked) {
136                         int left = item.getAbsoluteLeft() + 40;
137                         int top = item.getAbsoluteTop() + 20;
138                         showPopup(left, top);
139                 } else if (leftClicked && ctrlKeyPressed) {
140                         int left = item.getAbsoluteLeft() + 40;
141                         int top = item.getAbsoluteTop() + 20;
142                         showPopup(left, top);
143                 }
144         }
145
146         public void clearSelection(){
147                 if (treeSelectedItem != null)
148                         treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
149                 treeSelectedItem = null;
150                 setSelectedItem(null, true);
151                 GSS.get().setCurrentSelection(null);
152         }
153
154         private void processSelection(TreeItem item) {
155                 if (treeSelectedItem != null) {
156                         GSS.get().setCurrentSelection(null);
157                         treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
158
159                         treeSelectedItem = null;
160                         setSelectedItem(null, true);
161                 }
162                 treeSelectedItem = item;
163                 setSelectedItem(item, true);
164                 //ensureSelectedItemVisible();
165                 if(((DnDTreeItem)item).getFolderResource() != null)
166                         GSS.get().setCurrentSelection(((DnDTreeItem)item).getFolderResource());
167                 if (item.getUserObject() instanceof FolderResource)
168                         GSS.get().setCurrentSelection(item.getUserObject());
169                 else if(item.getUserObject() instanceof OtherUserResource)
170                         GSS.get().setCurrentSelection(item.getUserObject());
171                 else if(GSS.get().getFolders().isTrash(item))
172                         GSS.get().setCurrentSelection(null);
173                 item.getWidget().addStyleName("gss-SelectedRow");
174                 //if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
175                         GSS.get().showFileList(true);
176         }
177
178         /**
179          * Retrieve the selectedItem.
180          *
181          * @return the selectedItem
182          */
183         public TreeItem getTreeSelectedItem() {
184                 return treeSelectedItem;
185         }
186
187         /**
188          * Modify the selectedItem.
189          *
190          * @param treeSelectedItem the selectedItem to set
191          */
192         public void setTreeSelectedItem(TreeItem newSelectedItem) {
193                 treeSelectedItem = newSelectedItem;
194         }
195
196 }