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.RestResource;
27 import java.util.Iterator;
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 ((RestResource) GSS.get().getFolders().getCurrent().getUserObject()).updateHistory(item,path);
77 addOpenHandler(new OpenHandler<TreeItem>() {
80 public void onOpen(OpenEvent<TreeItem> event) {
81 TreeItem item = event.getTarget();
82 if (item != null && item.getState())
83 GSS.get().getFolders().update(item);
87 addHandler(new ContextMenuHandler() {
90 public void onContextMenu(ContextMenuEvent event) {
91 TreeItem item = getSelectedItem();
93 int left = item.getAbsoluteLeft() + 40;
94 int top = item.getAbsoluteTop() + 20;
99 }, ContextMenuEvent.getType());
100 // DOM.setStyleAttribute(getElement(), "position", "static");
105 public void onBrowserEvent(Event event) {
106 if (DOM.eventGetType(event) == Event.ONCLICK)
109 switch (DOM.eventGetType(event)) {
110 case Event.ONKEYDOWN:
111 int key = DOM.eventGetKeyCode(event);
112 if (key == KeyCodes.KEY_CTRL)
113 ctrlKeyPressed = true;
117 key = DOM.eventGetKeyCode(event);
118 if (key == KeyCodes.KEY_CTRL)
119 ctrlKeyPressed = false;
122 case Event.ONMOUSEDOWN:
123 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
125 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
129 case Event.ONMOUSEUP:
130 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
131 rightClicked = false;
132 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
137 super.onBrowserEvent(event);
140 protected void showPopup(final int x, final int y) {
141 if (treeSelectedItem == null)
145 menu = new FolderContextMenu(images);
146 menu.setPopupPosition(x, y);
150 public void processItemSelected(TreeItem item) {
151 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
152 GSS.get().setCurrentSelection(item.getUserObject());
153 if (!GSS.get().isFileListShowing())
154 GSS.get().showFileList();
156 // refresh Others Shared Node
157 if (GSS.get().getFolders().isOthersShared(item)){
158 GSS.get().getFolders().update(item);
159 GSS.get().showFileList();
162 if (!item.equals(treeSelectedItem))
163 processSelection(item);
165 rightClicked = false;
166 int left = item.getAbsoluteLeft() + 40;
167 int top = item.getAbsoluteTop() + 20;
168 showPopup(left, top);
169 } else if (leftClicked && ctrlKeyPressed) {
171 ctrlKeyPressed = false;
172 int left = item.getAbsoluteLeft() + 40;
173 int top = item.getAbsoluteTop() + 20;
174 showPopup(left, top);
178 public void clearSelection() {
179 if (treeSelectedItem != null)
180 ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
181 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
183 treeSelectedItem = null;
184 setSelectedItem(null, true);
185 GSS.get().setCurrentSelection(null);
188 private void processSelection(TreeItem item) {
189 if (treeSelectedItem != null) {
190 GSS.get().setCurrentSelection(null);
191 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
192 ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
193 treeSelectedItem = null;
194 setSelectedItem(null, true);
196 treeSelectedItem = item;
197 setSelectedItem(item, true);
198 // ensureSelectedItemVisible();
199 if (((DnDTreeItem) item).getFolderResource() != null)
200 GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
201 if (item.getUserObject() instanceof FolderResource)
202 GSS.get().setCurrentSelection(item.getUserObject());
203 else if (item.getUserObject() instanceof OtherUserResource)
204 GSS.get().setCurrentSelection(item.getUserObject());
205 else if (GSS.get().getFolders().isTrash(item))
206 GSS.get().setCurrentSelection(null);
207 // item.getWidget().addStyleName("gss-SelectedRow");
208 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
209 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
210 GSS.get().showFileList(true);
214 * Retrieve the selectedItem.
216 * @return the selectedItem
218 public TreeItem getTreeSelectedItem() {
219 return treeSelectedItem;
223 * Modify the selectedItem.
225 * @param newSelectedItem the selectedItem to set
227 public void setTreeSelectedItem(TreeItem newSelectedItem) {
228 treeSelectedItem = newSelectedItem;
231 * Method that takes the current string uri, finds the corresponding treeItem object
232 * using the getTreeItem method and fires this treeItem object
237 public TreeItem getTreeItemFromUri (String uri){
238 String newUri = uri.substring(uri.indexOf("/")+1);
239 // newUri = files/home
240 String uri2 = newUri.substring(0,newUri.indexOf("/"));
241 if(uri2.equalsIgnoreCase("files")){
243 String[] tokens = uri2.split("/");
244 for (String t : tokens){
245 TreeItem parentItem = getTreeItem(t);
246 getTreeItemFromUri(parentItem.getText());
248 }else if(uri2.equalsIgnoreCase("trash") || uri2.equalsIgnoreCase("shared") || uri2.equalsIgnoreCase("others"))
249 // trashResource, sharedResource, othersResource
250 return getTreeItem(uri2);
251 return getTreeItem(newUri);
255 * Method that takes a folderName and finds the corresponding treeItem object and returns it
260 public TreeItem getTreeItem (String folderName){
261 Iterator<TreeItem> it = GSS.get().getFolders().getPopupTree().treeItemIterator() ;
263 TreeItem treeitem = it.next();
264 if(treeitem.getText().equals(folderName))
269 // TODO when Groups or Search tab is selected then is there a TreeItem selected? guess not....