Formating commit. Comments fixed after code review. 1. Added a 2010 entry in copyrigh...
[pithos] / src / gr / ebs / gss / client / Groups.java
index c82adb7..9b3a634 100644 (file)
@@ -27,27 +27,33 @@ import gr.ebs.gss.client.rest.resource.GroupsResource;
 import java.util.List;\r
 \r
 import com.google.gwt.core.client.GWT;\r
+import com.google.gwt.dom.client.NativeEvent;\r
+import com.google.gwt.event.dom.client.ContextMenuEvent;\r
+import com.google.gwt.event.dom.client.ContextMenuHandler;\r
+import com.google.gwt.event.logical.shared.OpenEvent;\r
+import com.google.gwt.event.logical.shared.OpenHandler;\r
+import com.google.gwt.event.logical.shared.SelectionEvent;\r
+import com.google.gwt.event.logical.shared.SelectionHandler;\r
+import com.google.gwt.resources.client.ClientBundle;\r
+import com.google.gwt.resources.client.ImageResource;\r
 import com.google.gwt.user.client.DOM;\r
 import com.google.gwt.user.client.DeferredCommand;\r
 import com.google.gwt.user.client.Event;\r
 import com.google.gwt.user.client.ui.AbstractImagePrototype;\r
 import com.google.gwt.user.client.ui.Composite;\r
 import com.google.gwt.user.client.ui.HTML;\r
-import com.google.gwt.user.client.ui.KeyboardListener;\r
 import com.google.gwt.user.client.ui.Tree;\r
-import com.google.gwt.user.client.ui.TreeImages;\r
 import com.google.gwt.user.client.ui.TreeItem;\r
-import com.google.gwt.user.client.ui.TreeListener;\r
 \r
 /**\r
  * A component that displays a list of the user's groups.\r
  */\r
-public class Groups extends Composite implements TreeListener {\r
+public class Groups extends Composite implements SelectionHandler, OpenHandler {\r
 \r
        /**\r
         * An image bundle for this widget.\r
         */\r
-       public interface Images extends TreeImages, FileMenu.Images, EditMenu.Images, GroupMenu.Images, MessagePanel.Images {\r
+       public interface Images extends Tree.Resources, ClientBundle, FileMenu.Images, EditMenu.Images, GroupMenu.Images, MessagePanel.Images {\r
 \r
                /**\r
                 * Will bundle the file 'groupevent.png' residing in the package\r
@@ -55,11 +61,12 @@ public class Groups extends Composite implements TreeListener {
                 *\r
                 * @return the image prototype\r
                 */\r
-               @Resource("gr/ebs/gss/resources/groupevent.png")\r
-               AbstractImagePrototype groupImage();\r
+               @Source("gr/ebs/gss/resources/groupevent.png")\r
+               ImageResource groupImage();\r
+\r
+               @Source("gr/ebs/gss/resources/editdelete.png")\r
+               ImageResource delete();\r
 \r
-               @Resource("gr/ebs/gss/resources/editdelete.png")\r
-               AbstractImagePrototype delete();\r
        }\r
        private boolean ctrlKeyPressed = false;\r
 \r
@@ -98,6 +105,8 @@ public class Groups extends Composite implements TreeListener {
        private final Images images;\r
 \r
        private GroupContextMenu menu;\r
+\r
+       private boolean showMenu=false;\r
        /**\r
         * Constructs a new groups widget with a bundle of images.\r
         *\r
@@ -108,63 +117,47 @@ public class Groups extends Composite implements TreeListener {
                images = newImages;\r
                menu = new GroupContextMenu(images);\r
                tree = new Tree(newImages);\r
-               tree.addTreeListener(this);\r
+               this.addHandler(new ContextMenuHandler() {\r
+\r
+                       @Override\r
+                       public void onContextMenu(ContextMenuEvent event) {\r
+                               if(current==null) return;\r
+                               int left = current.getAbsoluteLeft() + 40;\r
+                               int top = current.getAbsoluteTop() + 20;\r
+                               showPopup(left, top);\r
+\r
+                       }\r
+               }, ContextMenuEvent.getType());\r
+               tree.addSelectionHandler(this);\r
+               tree.addOpenHandler(this);\r
+               tree.setAnimationEnabled(true);\r
                initWidget(tree);\r
                setStylePrimaryName("gss-Groups");\r
                sinkEvents(Event.ONCONTEXTMENU);\r
                sinkEvents(Event.ONMOUSEUP);\r
+               sinkEvents(Event.ONDBLCLICK);\r
        }\r
 \r
-       @Override\r
-       public void onBrowserEvent(Event event) {\r
-               switch (DOM.eventGetType(event)) {\r
-                       case Event.ONKEYDOWN:\r
-                               int key = DOM.eventGetKeyCode(event);\r
-                               if (key == KeyboardListener.KEY_CTRL)\r
-                                       ctrlKeyPressed = true;\r
-                               break;\r
-\r
-                       case Event.ONKEYUP:\r
-                               key = DOM.eventGetKeyCode(event);\r
-                               if (key == KeyboardListener.KEY_CTRL)\r
-                                       ctrlKeyPressed = false;\r
-                               break;\r
-\r
-                       case Event.ONMOUSEDOWN:\r
-                               if (DOM.eventGetButton(event) == Event.BUTTON_RIGHT)\r
-                                       rightClicked = true;\r
-                               else if (DOM.eventGetButton(event) == Event.BUTTON_LEFT)\r
-                                       leftClicked = true;\r
-                               break;\r
-\r
-                       case Event.ONMOUSEUP:\r
-                               if (DOM.eventGetButton(event) == Event.BUTTON_RIGHT)\r
-                                       rightClicked = false;\r
-                               else if (DOM.eventGetButton(event) == Event.BUTTON_LEFT)\r
-                                       leftClicked = false;\r
-                               break;\r
-               }\r
 \r
-               super.onBrowserEvent(event);\r
-       }\r
        /**\r
         * Make an RPC call to retrieve the groups that belong to the specified\r
         * user.\r
         */\r
        public void updateGroups() {\r
-               GetCommand<GroupsResource> gg = new GetCommand<GroupsResource>(GroupsResource.class, GSS.get().getCurrentUserResource().getGroupsPath()){\r
+               GetCommand<GroupsResource> gg = new GetCommand<GroupsResource>(GroupsResource.class, GSS.get().getCurrentUserResource().getGroupsPath(),null){\r
 \r
                        @Override\r
                        public void onComplete() {\r
                                GroupsResource res = getResult();\r
-                               MultipleGetCommand<GroupResource> ga = new MultipleGetCommand<GroupResource>(GroupResource.class, res.getGroupPaths().toArray(new String[]{})){\r
+                               MultipleGetCommand<GroupResource> ga = new MultipleGetCommand<GroupResource>(GroupResource.class, res.getGroupPaths().toArray(new String[]{}), null){\r
 \r
                                        @Override\r
                                        public void onComplete() {\r
                                                List<GroupResource> groupList = getResult();\r
                                                tree.clear();\r
                                                for (int i = 0; i < groupList.size(); i++) {\r
-                                                       final TreeItem item = new TreeItem(imageItemHTML(images.groupImage(), groupList.get(i).getName()));\r
+                                                       final TreeItem item = new TreeItem();\r
+                                                       item.setWidget(imageItemHTML(images.groupImage(), groupList.get(i).getName(),item));\r
                                                        item.setUserObject(groupList.get(i));\r
                                                        tree.addItem(item);\r
                                                        updateUsers(item);\r
@@ -208,8 +201,9 @@ public class Groups extends Composite implements TreeListener {
         * @param imageProto\r
         * @return the new tree item\r
         */\r
-       private TreeItem addImageItem(final TreeItem parent, final String title, final AbstractImagePrototype imageProto) {\r
-               final TreeItem item = new TreeItem(imageItemHTML(imageProto, title));\r
+       private TreeItem addImageItem(final TreeItem parent, final String title, final ImageResource imageProto) {\r
+               final TreeItem item = new TreeItem();\r
+               item.setWidget(imageItemHTML(imageProto, title,item));\r
                parent.addItem(item);\r
                return item;\r
        }\r
@@ -221,60 +215,39 @@ public class Groups extends Composite implements TreeListener {
         * @param title the title of the item\r
         * @return the resultant HTML\r
         */\r
-       private HTML imageItemHTML(final AbstractImagePrototype imageProto, final String title) {\r
-               final HTML link = new HTML("<a class='hidden-link' href='javascript:;'>" + "<span>" + imageProto.getHTML() + "&nbsp;" + title + "</span>" + "</a>");\r
+       private HTML imageItemHTML(final ImageResource imageProto, final String title,final TreeItem item) {\r
+               final HTML link = new HTML("<a class='hidden-link' href='javascript:;'>" + "<span>" + AbstractImagePrototype.create(imageProto).getHTML() + "&nbsp;" + title + "</span>" + "</a>"){\r
+                       @Override\r
+                       public void onBrowserEvent(Event event) {\r
+                               switch (DOM.eventGetType(event)) {\r
+                                       case Event.ONMOUSEDOWN:\r
+                                               if (DOM.eventGetButton(event) == NativeEvent.BUTTON_RIGHT || DOM.eventGetButton(event) == NativeEvent.BUTTON_LEFT)\r
+                                                       onSelection(item);\r
+                                               break;\r
+                               }\r
+                               super.onBrowserEvent(event);\r
+\r
+                       }\r
+               };\r
+               link.sinkEvents(Event.ONMOUSEDOWN);\r
                return link;\r
        }\r
 \r
-       /*\r
-        * (non-Javadoc)\r
-        *\r
-        * @see com.google.gwt.user.client.ui.TreeListener#onTreeItemSelected(com.google.gwt.user.client.ui.TreeItem)\r
-        */\r
-       public void onTreeItemSelected(final TreeItem item) {\r
-               final Object selected = item.getUserObject();\r
-               // Preserve the previously selected item, so that the current's\r
-               // onClick() method gets a chance to find it.\r
-               if (getPrevious() != null)\r
-                       getPrevious().getWidget().removeStyleName("gss-SelectedRow");\r
-               setCurrent(item);\r
-               getCurrent().getWidget().addStyleName("gss-SelectedRow");\r
-               setPrevious(getCurrent());\r
-               GSS.get().setCurrentSelection(selected);\r
-               //cache the latest top level node (group) for selecting and expanding on refresh\r
-               if (item.getParentItem() == null)\r
-                       selectedGroup = item.getText();\r
-               else\r
-                       selectedGroup = item.getParentItem().getText();\r
-               if (rightClicked) {\r
-                       int left = item.getAbsoluteLeft() + 40;\r
-                       int top = item.getAbsoluteTop() + 20;\r
-                       showPopup(left, top);\r
-               }\r
-       }\r
+\r
 \r
        protected void showPopup(final int x, final int y) {\r
-               if (getCurrent() == null)\r
+               if (getCurrent() == null){\r
+                       GWT.log("[POPUP IS NULL]", null);\r
                        return;\r
+               }\r
                menu.hide();\r
                menu = new GroupContextMenu(images);\r
                menu.setPopupPosition(x, y);\r
+               showMenu=false;\r
                menu.show();\r
        }\r
 \r
-       /*\r
-        * (non-Javadoc)\r
-        *\r
-        * @see com.google.gwt.user.client.ui.TreeListener#onTreeItemStateChanged(com.google.gwt.user.client.ui.TreeItem)\r
-        */\r
-       public void onTreeItemStateChanged(final TreeItem item) {\r
-               // Ignore closed items.\r
-               if (!item.getState())\r
-                       return;\r
 \r
-               setChanged(item);\r
-               updateUsers(item);\r
-       }\r
 \r
        /**\r
         * Generate an RPC request to retrieve the users of the specified group for\r
@@ -287,7 +260,7 @@ public class Groups extends Composite implements TreeListener {
        void updateUsers(final TreeItem groupItem) {\r
                if(groupItem.getUserObject() instanceof GroupResource){\r
                        GroupResource res = (GroupResource) groupItem.getUserObject();\r
-                       MultipleGetCommand<GroupUserResource> gu = new MultipleGetCommand<GroupUserResource>(GroupUserResource.class, res.getUserPaths().toArray(new String[]{})){\r
+                       MultipleGetCommand<GroupUserResource> gu = new MultipleGetCommand<GroupUserResource>(GroupUserResource.class, res.getUserPaths().toArray(new String[]{}), null){\r
                                @Override\r
                                public void onComplete() {\r
                                        List<GroupUserResource> users = getResult();\r
@@ -297,7 +270,8 @@ public class Groups extends Composite implements TreeListener {
                                                userItem.setUserObject(users.get(i));\r
                                        }\r
                                        if (selectedGroup != null && groupItem.getText().equals(selectedGroup)) {\r
-                                               onTreeItemSelected(groupItem);\r
+                                               //SelectionEvent.fire(tree, groupItem);;\r
+                                               onSelection(groupItem);\r
                                                groupItem.setState(true);\r
                                        }\r
                                }\r
@@ -368,4 +342,36 @@ public class Groups extends Composite implements TreeListener {
                if (visible)\r
                        updateGroups();\r
        }\r
+\r
+       @Override\r
+       public void onSelection(SelectionEvent event) {\r
+               final TreeItem item = (TreeItem)event.getSelectedItem();\r
+               onSelection(item);\r
+\r
+       }\r
+\r
+       private void onSelection(TreeItem item){\r
+               final Object selected = item.getUserObject();\r
+               // Preserve the previously selected item, so that the current's\r
+               // onClick() method gets a chance to find it.\r
+               if (getPrevious() != null)\r
+                       getPrevious().getWidget().removeStyleName("gss-SelectedRow");\r
+               setCurrent(item);\r
+               getCurrent().getWidget().addStyleName("gss-SelectedRow");\r
+               setPrevious(getCurrent());\r
+               GSS.get().setCurrentSelection(selected);\r
+               //cache the latest top level node (group) for selecting and expanding on refresh\r
+               if (item.getParentItem() == null)\r
+                       selectedGroup = item.getText();\r
+               else\r
+                       selectedGroup = item.getParentItem().getText();\r
+       }\r
+\r
+       @Override\r
+       public void onOpen(OpenEvent event) {\r
+               final TreeItem item = (TreeItem) event.getTarget();\r
+               setChanged(item);\r
+               updateUsers(item);\r
+\r
+       }\r
 }\r