2 * Copyright 2008, 2009, 2010 Electronic Business Systems Ltd.
4 * This file is part of GSS.
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.
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.
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/>.
19 package gr.ebs.gss.client;
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;
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.ui.Tree;
40 import com.google.gwt.user.client.ui.TreeItem;
45 public class PopupTree extends Tree {
47 private FolderContextMenu menu;
49 private Images images;
51 private boolean ctrlKeyPressed = false;
53 private boolean leftClicked = false;
55 private boolean rightClicked = false;
57 private TreeItem treeSelectedItem = null;
59 public PopupTree(Images theImages) {
62 sinkEvents(Event.ONCONTEXTMENU);
63 sinkEvents(Event.ONMOUSEUP);
64 // sinkEvents(Event.ONMOUSEDOWN);
66 addSelectionHandler(new SelectionHandler<TreeItem>() {
69 public void onSelection(SelectionEvent<TreeItem> event) {
70 TreeItem item = event.getSelectedItem();
71 processItemSelected(item);
72 String path = GSS.get().getApiPath() + GSS.get().getCurrentUserResource().getUsername()+ "/";
73 // case: Trash folder is selected
74 if(GSS.get().getFolders().getCurrent().getUserObject() instanceof TrashResource){
75 TrashResource currentObject = (TrashResource) GSS.get().getFolders().getCurrent().getUserObject();
76 GSS.get().updateHistory("Files/"+ currentObject.getUri().substring(path.lastIndexOf("/")+1), item);
78 // case: Other's shared folder option is selected
79 else if (GSS.get().getFolders().getCurrent().getUserObject() instanceof OthersResource)
80 GSS.get().updateHistory("Files/"+ path.substring(path.lastIndexOf("/")+1) + "others/", item);
81 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof OtherUserResource){
82 OtherUserResource currentObject = (OtherUserResource) GSS.get().getFolders().getCurrent().getUserObject();
83 GSS.get().updateHistory("Files/others/"+ currentObject.getName(), item);
85 // case: my shared is selected
86 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof SharedResource){
87 SharedResource currentObject = (SharedResource) GSS.get().getFolders().getCurrent().getUserObject();
88 GSS.get().updateHistory("Files/"+ currentObject.getUri().substring(path.lastIndexOf("/")+1), item);
91 // case: all folder resources either below user's home folder or anywhere else(Trash/My Shared/Other's shared
92 FolderResource currentObject = (FolderResource) GSS.get().getFolders().getCurrent().getUserObject();
93 String parentUri = currentObject.getParentURI();
94 if(parentUri == null){
95 if(containsFolder(item, "Trash")){
96 // case: selected folders below Trash folder
97 String partialUri = constructPartialPath(item);
98 GSS.get().updateHistory("Files/trash/" + partialUri, item);
100 // case: home folders are selected
101 GSS.get().updateHistory("Files/files/" + currentObject.getName(), item);
103 else if(item.getParentItem() == null){
104 // this is the case when the user uses the browser's forward arrow to navigate through other's
105 // shared folders and item.getParentItem is null only inside other's shared folder
106 String apiPath = GSS.get().getApiPath();
107 String newPath = currentObject.getParentURI().substring(apiPath.lastIndexOf("/"));
108 GSS.get().updateHistory("Files"+ newPath + currentObject.getName(), item);
110 else if(containsFolder(item, "My Shared")){
111 // case: selected folders below My Shared folder
112 String partialUri = constructPartialPath(item);
113 GSS.get().updateHistory("Files/shared/" + partialUri, item);
114 }else if(containsFolder(item, "Other's Shared")){
115 // case: selected folders below Other's Shared folder
116 String partialPath = constructPartialPath(item);
117 GSS.get().updateHistory("Files/others/"+ partialPath, item);
120 // case:all folders in user's folders tree
121 String finalUri = parentUri.substring(path.lastIndexOf("/")) + currentObject.getName();
122 GSS.get().updateHistory("Files"+ finalUri, item);
128 addOpenHandler(new OpenHandler<TreeItem>() {
131 public void onOpen(OpenEvent<TreeItem> event) {
132 TreeItem item = event.getTarget();
133 if (item != null && item.getState())
134 GSS.get().getFolders().update(item);
138 addHandler(new ContextMenuHandler() {
141 public void onContextMenu(ContextMenuEvent event) {
142 TreeItem item = getSelectedItem();
144 int left = item.getAbsoluteLeft() + 40;
145 int top = item.getAbsoluteTop() + 20;
146 showPopup(left, top);
150 }, ContextMenuEvent.getType());
151 // DOM.setStyleAttribute(getElement(), "position", "static");
156 public void onBrowserEvent(Event event) {
157 if (DOM.eventGetType(event) == Event.ONCLICK)
160 switch (DOM.eventGetType(event)) {
161 case Event.ONKEYDOWN:
162 int key = DOM.eventGetKeyCode(event);
163 if (key == KeyCodes.KEY_CTRL)
164 ctrlKeyPressed = true;
168 key = DOM.eventGetKeyCode(event);
169 if (key == KeyCodes.KEY_CTRL)
170 ctrlKeyPressed = false;
173 case Event.ONMOUSEDOWN:
174 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
176 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
180 case Event.ONMOUSEUP:
181 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
182 rightClicked = false;
183 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
188 super.onBrowserEvent(event);
191 protected void showPopup(final int x, final int y) {
192 if (treeSelectedItem == null)
196 menu = new FolderContextMenu(images);
197 menu.setPopupPosition(x, y);
201 public void processItemSelected(TreeItem item) {
202 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
203 GSS.get().setCurrentSelection(item.getUserObject());
204 if (!GSS.get().isFileListShowing())
205 GSS.get().showFileList();
207 // refresh Others Shared Node
208 if (GSS.get().getFolders().isOthersShared(item)){
209 GSS.get().getFolders().update(item);
210 GSS.get().showFileList();
213 if (!item.equals(treeSelectedItem))
214 processSelection(item);
216 rightClicked = false;
217 int left = item.getAbsoluteLeft() + 40;
218 int top = item.getAbsoluteTop() + 20;
219 showPopup(left, top);
220 } else if (leftClicked && ctrlKeyPressed) {
222 ctrlKeyPressed = false;
223 int left = item.getAbsoluteLeft() + 40;
224 int top = item.getAbsoluteTop() + 20;
225 showPopup(left, top);
229 public void clearSelection() {
230 if (treeSelectedItem != null)
231 ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
232 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
234 treeSelectedItem = null;
235 setSelectedItem(null, true);
236 GSS.get().setCurrentSelection(null);
239 private void processSelection(TreeItem item) {
240 if (treeSelectedItem != null) {
241 GSS.get().setCurrentSelection(null);
242 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
243 ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
244 treeSelectedItem = null;
245 setSelectedItem(null, true);
247 treeSelectedItem = item;
248 setSelectedItem(item, true);
249 // ensureSelectedItemVisible();
250 if (((DnDTreeItem) item).getFolderResource() != null)
251 GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
252 if (item.getUserObject() instanceof FolderResource)
253 GSS.get().setCurrentSelection(item.getUserObject());
254 else if (item.getUserObject() instanceof OtherUserResource)
255 GSS.get().setCurrentSelection(item.getUserObject());
256 else if (GSS.get().getFolders().isTrash(item))
257 GSS.get().setCurrentSelection(null);
258 // item.getWidget().addStyleName("gss-SelectedRow");
259 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
260 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
261 GSS.get().showFileList(true);
265 * Retrieve the selectedItem.
267 * @return the selectedItem
269 public TreeItem getTreeSelectedItem() {
270 return treeSelectedItem;
274 * Modify the selectedItem.
276 * @param newSelectedItem the selectedItem to set
278 public void setTreeSelectedItem(TreeItem newSelectedItem) {
279 treeSelectedItem = newSelectedItem;
283 * construct the partial path of the selected TreeItem
285 * @param selectedItem the selectedItem to check
287 public String constructPartialPath(TreeItem selectedItem){
288 String result = DisplayHelper.trim(selectedItem.getText());
289 TreeItem parent = selectedItem.getParentItem();
290 while (!(DisplayHelper.trim(parent.getText()).equals("My Shared") || DisplayHelper.trim(parent.getText()).equals("Other's Shared")||DisplayHelper.trim(parent.getText()).equals("Trash"))){
291 result = DisplayHelper.trim(parent.getText()) + "/" + result;
292 if(result.equals("My Shared")||result.equals("Other's Shared")) return result;
293 parent = parent.getParentItem();
299 * examine whether a folder name like "Trash", "My Shared", "Other's Shared" is inside path
301 * @param selectedItem the selectedTreeItem to check
304 public boolean containsFolder(TreeItem selectedItem, String folderName){
305 TreeItem parent = selectedItem.getParentItem();
306 while (parent != null){
307 String parentItemText = parent.getText();
308 String parentItemTextTr = DisplayHelper.trim(parentItemText);
309 if(parentItemTextTr.equals(folderName)) return true;
310 parent = parent.getParentItem();