Statistics
| Branch: | Tag: | Revision:

root / src / gr / ebs / gss / client / PopupTree.java @ fc0fa492

History | View | Annotate | Download (9.6 kB)

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.RestResource;
27
import gr.ebs.gss.client.rest.resource.SharedResource;
28
import gr.ebs.gss.client.rest.resource.TrashResource;
29

    
30
import java.util.Iterator;
31

    
32
import com.google.gwt.dom.client.NativeEvent;
33
import com.google.gwt.event.dom.client.ContextMenuEvent;
34
import com.google.gwt.event.dom.client.ContextMenuHandler;
35
import com.google.gwt.event.dom.client.KeyCodes;
36
import com.google.gwt.event.logical.shared.OpenEvent;
37
import com.google.gwt.event.logical.shared.OpenHandler;
38
import com.google.gwt.event.logical.shared.SelectionEvent;
39
import com.google.gwt.event.logical.shared.SelectionHandler;
40
import com.google.gwt.user.client.DOM;
41
import com.google.gwt.user.client.Event;
42
import com.google.gwt.user.client.ui.Tree;
43
import com.google.gwt.user.client.ui.TreeItem;
44

    
45
/**
46
 * @author kman
47
 */
48
public class PopupTree extends Tree {
49

    
50
        private FolderContextMenu menu;
51

    
52
        private Images images;
53

    
54
        private boolean ctrlKeyPressed = false;
55

    
56
        private boolean leftClicked = false;
57

    
58
        private boolean rightClicked = false;
59

    
60
        private TreeItem treeSelectedItem = null;
61

    
62
        public PopupTree(Images theImages) {
63
                super(theImages);
64
                images = theImages;
65
                sinkEvents(Event.ONCONTEXTMENU);
66
                sinkEvents(Event.ONMOUSEUP);
67
//                sinkEvents(Event.ONMOUSEDOWN);
68

    
69
                addSelectionHandler(new SelectionHandler<TreeItem>() {
70

    
71
                        @Override
72
                        public void onSelection(SelectionEvent<TreeItem> event) {
73
                                TreeItem treeItem = event.getSelectedItem();
74
                                processItemSelected(treeItem);
75
                                String path = GSS.get().getApiPath() + GSS.get().getCurrentUserResource().getUsername()+ "/";
76
                                String constructedUri = ((RestResource) GSS.get().getFolders().getCurrent().getUserObject()).constructUri(treeItem, path);
77
                                GSS.get().updateHistory(constructedUri);
78
                        }
79
                });
80

    
81
                addOpenHandler(new OpenHandler<TreeItem>() {
82

    
83
                        @Override
84
                        public void onOpen(OpenEvent<TreeItem> event) {
85
                                TreeItem item = event.getTarget();
86
                                if (item != null && item.getState())
87
                                        GSS.get().getFolders().update(item);
88

    
89
                        }
90
                });
91
                addHandler(new ContextMenuHandler() {
92

    
93
                        @Override
94
                        public void onContextMenu(ContextMenuEvent event) {
95
                                TreeItem item = getSelectedItem();
96
                                if (item != null) {
97
                                        int left = item.getAbsoluteLeft() + 40;
98
                                        int top = item.getAbsoluteTop() + 20;
99
                                        showPopup(left, top);
100
                                }
101

    
102
                        }
103
                }, ContextMenuEvent.getType());
104
                // DOM.setStyleAttribute(getElement(), "position", "static");
105

    
106
        }
107

    
108
        @Override
109
        public void onBrowserEvent(Event event) {
110
                if (DOM.eventGetType(event) == Event.ONCLICK)
111
                        return;
112

    
113
                switch (DOM.eventGetType(event)) {
114
                        case Event.ONKEYDOWN:
115
                                int key = DOM.eventGetKeyCode(event);
116
                                if (key == KeyCodes.KEY_CTRL)
117
                                        ctrlKeyPressed = true;
118
                                break;
119

    
120
                        case Event.ONKEYUP:
121
                                key = DOM.eventGetKeyCode(event);
122
                                if (key == KeyCodes.KEY_CTRL)
123
                                        ctrlKeyPressed = false;
124
                                break;
125

    
126
                        case Event.ONMOUSEDOWN:
127
                                if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
128
                                        rightClicked = true;
129
                                else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
130
                                        leftClicked = true;
131
                                break;
132

    
133
                        case Event.ONMOUSEUP:
134
                                if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
135
                                        rightClicked = false;
136
                                else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
137
                                        leftClicked = false;
138
                                break;
139
                }
140

    
141
                super.onBrowserEvent(event);
142
        }
143

    
144
        protected void showPopup(final int x, final int y) {
145
                if (treeSelectedItem == null)
146
                        return;
147
                if (menu != null)
148
                        menu.hide();
149
                menu = new FolderContextMenu(images);
150
                menu.setPopupPosition(x, y);
151
                menu.show();
152
        }
153

    
154
        public void processItemSelected(TreeItem item) {
155
                 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
156
                        GSS.get().setCurrentSelection(item.getUserObject());
157
                if (!GSS.get().isFileListShowing())
158
                        GSS.get().showFileList();
159

    
160
                // refresh Others Shared Node
161
                if (GSS.get().getFolders().isOthersShared(item)){
162
                        GSS.get().getFolders().update(item);
163
                        GSS.get().showFileList();
164
                }
165

    
166
                if (!item.equals(treeSelectedItem))
167
                        processSelection(item);
168
                if (rightClicked) {
169
                        rightClicked = false;
170
                        int left = item.getAbsoluteLeft() + 40;
171
                        int top = item.getAbsoluteTop() + 20;
172
                        showPopup(left, top);
173
                } else if (leftClicked && ctrlKeyPressed) {
174
                        leftClicked = false;
175
                        ctrlKeyPressed = false;
176
                        int left = item.getAbsoluteLeft() + 40;
177
                        int top = item.getAbsoluteTop() + 20;
178
                        showPopup(left, top);
179
                }
180
        }
181

    
182
        public void clearSelection() {
183
                if (treeSelectedItem != null)
184
                        ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
185
                // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
186

    
187
                treeSelectedItem = null;
188
                setSelectedItem(null, true);
189
                GSS.get().setCurrentSelection(null);
190
        }
191

    
192
        private void processSelection(TreeItem item) {
193
                if (treeSelectedItem != null) {
194
                        GSS.get().setCurrentSelection(null);
195
                        // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
196
                        ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
197
                        treeSelectedItem = null;
198
                        setSelectedItem(null, true);
199
                }
200
                treeSelectedItem = item;
201
                setSelectedItem(item, true);
202
                // ensureSelectedItemVisible();
203
                if (((DnDTreeItem) item).getFolderResource() != null)
204
                        GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
205
                if (item.getUserObject() instanceof FolderResource)
206
                        GSS.get().setCurrentSelection(item.getUserObject());
207
                else if (item.getUserObject() instanceof OtherUserResource)
208
                        GSS.get().setCurrentSelection(item.getUserObject());
209
                else if (GSS.get().getFolders().isTrash(item))
210
                        GSS.get().setCurrentSelection(null);
211
                // item.getWidget().addStyleName("gss-SelectedRow");
212
                ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
213
                // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
214
                GSS.get().showFileList(true);
215
        }
216

    
217
        /**
218
         * Retrieve the selectedItem.
219
         *
220
         * @return the selectedItem
221
         */
222
        public TreeItem getTreeSelectedItem() {
223
                return treeSelectedItem;
224
        }
225

    
226
        /**
227
         * Modify the selectedItem.
228
         *
229
         * @param newSelectedItem the selectedItem to set
230
         */
231
        public void setTreeSelectedItem(TreeItem newSelectedItem) {
232
                treeSelectedItem = newSelectedItem;
233
        }
234
        /**
235
         * Method that takes a folderName and finds the corresponding treeItem object and returns it
236
         * @param historyToken
237
         * @return treeItem
238
         */
239

    
240
        public TreeItem getTreeItem (String historyToken){
241
//                String historyTokenOriginal = historyToken.replace("+", " ");
242
                String path = GSS.get().getApiPath() + GSS.get().getCurrentUserResource().getUsername()+ "/";
243
                String rootText = DisplayHelper.trim(GSS.get().getFolders().getRootItem().getText());
244
                String uriToGet = "Files/files/" + rootText;
245
                Iterator<TreeItem> it = GSS.get().getFolders().getPopupTree().treeItemIterator() ;
246
                while(it.hasNext()){
247
                        String constructedUri = "";
248
                        TreeItem treeItem = it.next();
249
                        if(treeItem.getUserObject() instanceof TrashResource){
250
                                TrashResource currentObject = (TrashResource) treeItem.getUserObject();
251
                                constructedUri = constructedUri + currentObject.constructUri(treeItem,path);
252
                        }
253
                        if(treeItem.getUserObject() instanceof SharedResource){
254
                                SharedResource currentObject = (SharedResource) treeItem.getUserObject();
255
                                constructedUri = constructedUri + currentObject.constructUri(treeItem, path);
256
                        }
257
                        if(treeItem.getUserObject() instanceof OthersResource){
258
                                OthersResource currentObject = (OthersResource) treeItem.getUserObject();
259
                                constructedUri = constructedUri + currentObject.constructUri(treeItem, path);
260
                        }
261
                        if(treeItem.getUserObject() instanceof OtherUserResource){
262
                                OtherUserResource currentObject = (OtherUserResource) treeItem.getUserObject();
263
                                constructedUri = constructedUri + currentObject.constructUri(treeItem, path);
264
                        }
265
                        if(treeItem.getUserObject() instanceof FolderResource){
266
                                FolderResource currentObject = (FolderResource) treeItem.getUserObject();
267
                                constructedUri = constructedUri + currentObject.constructUri(treeItem, path);
268
                        }
269
                        if(constructedUri.equals(historyToken))
270
                                return treeItem;
271
                }
272
                return expandHiddenItems(uriToGet);
273

    
274
        }
275

    
276

    
277
        public TreeItem expandHiddenItems(String tokenInput){
278
                //TODO
279
                // this method handles objects that are not constructed during loading the application
280
                // and when there's a need to seek them inside some non-expanded folder
281
                // This method is not implemented yet and in case of a non-constructed object
282
                // returns the home/root folder
283
                // treeItem.getState() method returns always false so the OpenEvent.fire() method
284
                // fails to expand the parent folder in the UI
285

    
286
                GSS.get().getFolders().getRootItem().getText();
287
                TreeItem treeItem = getTreeItem(tokenInput);
288
                OpenEvent.fire(GSS.get().getFolders().getPopupTree(), treeItem);
289
                return treeItem;
290
        }
291

    
292

    
293
}