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