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.http.client.URL;
38 import com.google.gwt.user.client.DOM;
39 import com.google.gwt.user.client.Event;
40 import com.google.gwt.user.client.History;
41 import com.google.gwt.user.client.ui.Tree;
42 import com.google.gwt.user.client.ui.TreeItem;
47 public class PopupTree extends Tree {
49 private FolderContextMenu menu;
51 private Images images;
53 private boolean ctrlKeyPressed = false;
55 private boolean leftClicked = false;
57 private boolean rightClicked = false;
59 private TreeItem treeSelectedItem = null;
61 public PopupTree(Images theImages) {
64 sinkEvents(Event.ONCONTEXTMENU);
65 sinkEvents(Event.ONMOUSEUP);
66 // sinkEvents(Event.ONMOUSEDOWN);
68 addSelectionHandler(new SelectionHandler<TreeItem>() {
71 public void onSelection(SelectionEvent<TreeItem> event) {
72 TreeItem item = event.getSelectedItem();
73 processItemSelected(item, true);
75 String path = GSS.get().getApiPath() + GSS.get().getCurrentUserResource().getUsername()+ "/";
77 // case: Trash is selected
78 if(GSS.get().getFolders().isTrash(item)){
79 TrashResource currentObject = (TrashResource) GSS.get().getFolders().getCurrent().getUserObject();
80 String finalUri = currentObject.getUri().substring(path.lastIndexOf("/")+1);
81 History.newItem("Files/"+finalUri);
83 // case: Other's shared option is selected
84 else if (GSS.get().getFolders().getCurrent().getUserObject() instanceof OthersResource){
85 String currentPartTrimmed = DisplayHelper.trim(item.getText());
86 String finalUri = URL.encodeComponent("Files/"+path.substring(path.lastIndexOf("/")+1) + currentPartTrimmed);
88 History.newItem(finalUri);
90 // case: expand Other's shared to folder below
91 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof OtherUserResource){
92 OtherUserResource currentObject = (OtherUserResource) GSS.get().getFolders().getCurrent().getUserObject();
93 String finalUri = URL.encodeComponent("others/"+ currentObject.getName());
94 History.newItem(finalUri);
96 // case: my shared is selected
97 else if(GSS.get().getFolders().getCurrent().getUserObject() instanceof SharedResource){
98 SharedResource currentObject = (SharedResource) GSS.get().getFolders().getCurrent().getUserObject();
99 String finalUri = currentObject.getUri().substring(path.lastIndexOf("/")+1);
100 History.newItem("Files/"+finalUri);
103 // case: home folders are selected
105 FolderResource currentObject = (FolderResource) GSS.get().getFolders().getCurrent().getUserObject();
106 String parentUri = currentObject.getParentURI();
107 if(parentUri == null){
108 if(containsTrash(GSS.get().getFolders().getCurrent())){
109 String finalUri = constructPartialPath(GSS.get().getFolders().getCurrent());
110 History.newItem("trash/"+finalUri);
112 String nonEncodedUri = "Files/" + currentObject.getName();
114 History.newItem(URL.encode(nonEncodedUri));
116 } else if(containsSharedFolder(GSS.get().getFolders().getCurrent())){
117 String finalUri = constructPartialPath(GSS.get().getFolders().getCurrent());
118 History.newItem("shared/"+finalUri);
119 }else if(containsSharedFolder(GSS.get().getFolders().getCurrent())){
120 String finalUri = constructPartialPath(GSS.get().getFolders().getCurrent());
121 History.newItem("other's/"+finalUri);
124 String uri = "Files"+ parentUri.substring(path.lastIndexOf("/")) + URL.encode(currentObject.getName());
125 History.newItem(uri);
133 addOpenHandler(new OpenHandler<TreeItem>() {
136 public void onOpen(OpenEvent<TreeItem> event) {
137 TreeItem item = event.getTarget();
138 if (item != null && item.getState())
139 GSS.get().getFolders().update(item);
143 addHandler(new ContextMenuHandler() {
146 public void onContextMenu(ContextMenuEvent event) {
147 TreeItem item = getSelectedItem();
149 int left = item.getAbsoluteLeft() + 40;
150 int top = item.getAbsoluteTop() + 20;
151 showPopup(left, top);
155 }, ContextMenuEvent.getType());
156 // DOM.setStyleAttribute(getElement(), "position", "static");
161 public void onBrowserEvent(Event event) {
162 if (DOM.eventGetType(event) == Event.ONCLICK)
165 switch (DOM.eventGetType(event)) {
166 case Event.ONKEYDOWN:
167 int key = DOM.eventGetKeyCode(event);
168 if (key == KeyCodes.KEY_CTRL)
169 ctrlKeyPressed = true;
173 key = DOM.eventGetKeyCode(event);
174 if (key == KeyCodes.KEY_CTRL)
175 ctrlKeyPressed = false;
178 case Event.ONMOUSEDOWN:
179 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
181 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
185 case Event.ONMOUSEUP:
186 if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT)
187 rightClicked = false;
188 else if (DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)
193 super.onBrowserEvent(event);
196 protected void showPopup(final int x, final int y) {
197 if (treeSelectedItem == null)
201 menu = new FolderContextMenu(images);
202 menu.setPopupPosition(x, y);
206 public void processItemSelected(TreeItem item, boolean fireEvents) {
208 if (GSS.get().getCurrentSelection() == null || !GSS.get().getCurrentSelection().equals(item.getUserObject()))
209 GSS.get().setCurrentSelection(item.getUserObject());
210 if (!GSS.get().isFileListShowing())
211 GSS.get().showFileList();
213 // refresh Others Shared Node
214 if (GSS.get().getFolders().isOthersShared(item)) {
215 GSS.get().getFolders().update(item);
216 GSS.get().showFileList();
218 // refresh Others Shared User Node
219 // else if(GSS.get().getFolders().isOthersSharedItem(item) &&
220 // item.getUserObject() instanceof UserDTO)
221 // GSS.get().getFolders().update(item);
223 if (!item.equals(treeSelectedItem))
224 processSelection(item);
226 rightClicked = false;
227 int left = item.getAbsoluteLeft() + 40;
228 int top = item.getAbsoluteTop() + 20;
229 showPopup(left, top);
230 } else if (leftClicked && ctrlKeyPressed) {
232 ctrlKeyPressed = false;
233 int left = item.getAbsoluteLeft() + 40;
234 int top = item.getAbsoluteTop() + 20;
235 showPopup(left, top);
239 public void clearSelection() {
240 if (treeSelectedItem != null)
241 ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
242 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
244 treeSelectedItem = null;
245 setSelectedItem(null, true);
246 GSS.get().setCurrentSelection(null);
249 private void processSelection(TreeItem item) {
250 if (treeSelectedItem != null) {
251 GSS.get().setCurrentSelection(null);
252 // treeSelectedItem.getWidget().removeStyleName("gss-SelectedRow");
253 ((DnDTreeItem) treeSelectedItem).getContent().removeStyleName("gss-SelectedRow");
254 treeSelectedItem = null;
255 setSelectedItem(null, true);
257 treeSelectedItem = item;
258 setSelectedItem(item, true);
259 // ensureSelectedItemVisible();
260 if (((DnDTreeItem) item).getFolderResource() != null)
261 GSS.get().setCurrentSelection(((DnDTreeItem) item).getFolderResource());
262 if (item.getUserObject() instanceof FolderResource)
263 GSS.get().setCurrentSelection(item.getUserObject());
264 else if (item.getUserObject() instanceof OtherUserResource)
265 GSS.get().setCurrentSelection(item.getUserObject());
266 else if (GSS.get().getFolders().isTrash(item))
267 GSS.get().setCurrentSelection(null);
268 // item.getWidget().addStyleName("gss-SelectedRow");
269 ((DnDTreeItem) item).getContent().addStyleName("gss-SelectedRow");
270 // if(GSS.get().getFolders().isFileItem(item)||GSS.get().getFolders().isTrashItem(item)||GSS.get().getFolders().isMySharedItem(item))
271 GSS.get().showFileList(true);
275 * Retrieve the selectedItem.
277 * @return the selectedItem
279 public TreeItem getTreeSelectedItem() {
280 return treeSelectedItem;
284 * Modify the selectedItem.
286 * @param newSelectedItem the selectedItem to set
288 public void setTreeSelectedItem(TreeItem newSelectedItem) {
289 treeSelectedItem = newSelectedItem;
293 * examine whether there is "My Shared" inside path
295 * @param selectedItem the selectedItem to check
298 public boolean containsSharedFolder(TreeItem selectedItem){
299 TreeItem parent = selectedItem.getParentItem();
300 while (parent != null){
301 String parentItemText = parent.getText();
302 String parentItemTextTr = DisplayHelper.trim(parentItemText);
303 if(parentItemTextTr.equals("My Shared")||parentItemTextTr.equals("Other's Shared")) return true;
304 parent = parent.getParentItem();
308 public boolean containsTrash(TreeItem selectedItem){
309 TreeItem parent = selectedItem.getParentItem();
310 while (parent != null){
311 String parentItemText = parent.getText();
312 String parentItemTextTr = DisplayHelper.trim(parentItemText);
313 if(parentItemTextTr.equals("Trash")) return true;
314 parent = parent.getParentItem();
320 * construct the partial path of the selected TreeItem
322 * @param selectedItem the selectedItem to check
324 public String constructPartialPath(TreeItem selectedItem){
325 String result = DisplayHelper.trim(selectedItem.getText());
326 TreeItem parent = selectedItem.getParentItem();
327 while (!(DisplayHelper.trim(parent.getText()).equals("My Shared") || DisplayHelper.trim(parent.getText()).equals("Other's Shared")||DisplayHelper.trim(parent.getText()).equals("Trash"))){
328 result = DisplayHelper.trim(parent.getText()) + "/" + result;
329 if(result.equals("My Shared")||result.equals("Other's Shared")) return result;
330 parent = parent.getParentItem();