Author: jvelociter
Date: 2007-11-01 14:29:17 +0100 (Thu, 01 Nov 2007)
New Revision: 5595

Added:
   
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/HyperlinkComposite.java
Modified:
   
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/Watch.java
   
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/FeedTreeWidget.java
Log:
XWATCH-35 Better UI for feed edition and deletion links. Got rid of the 
double-click.
XWATCH-52 Keep the tree view nodes in their states (open or closed) when 
refreshing the tree.

Patch submitted by Anca Paula Luca



Modified: 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/Watch.java
===================================================================
--- 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/Watch.java
    2007-11-01 10:31:17 UTC (rev 5594)
+++ 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/Watch.java
    2007-11-01 13:29:17 UTC (rev 5595)
@@ -250,6 +250,8 @@
      */
     public void refreshArticleList() {
         userInterface.refreshData("articlelist");
+        //refresh article number which will refresh the feedtree as well.
+        config.refreshArticleNumber();
         newArticlesMonitoring.stopBlinking();
     }
 

Modified: 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/FeedTreeWidget.java
===================================================================
--- 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/FeedTreeWidget.java
   2007-11-01 10:31:17 UTC (rev 5594)
+++ 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/FeedTreeWidget.java
   2007-11-01 13:29:17 UTC (rev 5595)
@@ -1,17 +1,14 @@
 package com.xpn.xwiki.watch.client.ui.menu;
 
 import com.xpn.xwiki.watch.client.ui.WatchWidget;
+import com.xpn.xwiki.watch.client.ui.dialog.FeedDialog;
 import com.xpn.xwiki.watch.client.ui.dialog.StandardFeedDialog;
 import com.xpn.xwiki.watch.client.Watch;
 import com.xpn.xwiki.watch.client.Feed;
 import com.xpn.xwiki.watch.client.Constants;
 import com.xpn.xwiki.gwt.api.client.app.XWikiAsyncCallback;
-import com.xpn.xwiki.gwt.api.client.dialog.ChoiceDialog;
-import com.xpn.xwiki.gwt.api.client.dialog.ChoiceInfo;
 import com.xpn.xwiki.gwt.api.client.dialog.Dialog;
 import com.google.gwt.user.client.ui.*;
-import com.google.gwt.user.client.*;
-import com.google.gwt.user.client.Timer;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import java.util.*;
@@ -85,10 +82,26 @@
     }
 
     private void  makeFeedTree() {
+        //get the state of the tree items on first level -> the groups tree 
items
+        HashMap itemsState = new HashMap();
+        for (int i = 0; i < this.groupTree.getItemCount(); i++) {
+            TreeItem currentTreeItem = this.groupTree.getItem(i);
+            //get user object
+            TreeItemObject userObj = 
(TreeItemObject)currentTreeItem.getUserObject();
+            itemsState.put(userObj.getKey(), new 
Boolean(currentTreeItem.getState()));
+        }
+        //get the selected item to set it back when the tree is refreshed 
+        TreeItem selectedTreeItem = this.groupTree.getSelectedItem();
+        String selectedItemKey = null;
+        if (selectedTreeItem != null) {
+            TreeItemObject selectedItemObject = 
(TreeItemObject)selectedTreeItem.getUserObject();
+            if (selectedItemObject != null) {
+                selectedItemKey = selectedItemObject.getKey();
+            }
+        }
         // clear all trees
         groupTree.clear();
 
-        Map feeds = watch.getConfig().getFeedsList();
         Map feedsbygroup = watch.getConfig().getFeedsByGroupList();
         Map groups = watch.getConfig().getGroups();
 
@@ -103,14 +116,16 @@
             if ((groupname!=null)&&(!groupname.trim().equals(""))) {
                 Map group = (Map) feedsbygroup.get(groupname);
                 TreeItem groupItemTree = new TreeItem();
-                Hyperlink link = new Hyperlink(groupTitle, "");
-                link.setStyleName(watch.getStyleName("feedtree","link"));
-                link.addClickListener(new ClickListener() {
-                    public void onClick(Widget widget) {
-                        watch.refreshOnGroupChange(groupname);
-                    }
-                });
-                groupItemTree.setWidget(link);
+                //set the TreeItem's object
+                GroupTreeItemObject groupObj = new 
GroupTreeItemObject(groupname, groupTitle);
+                groupItemTree.setUserObject(groupObj);
+                //check if selected
+                boolean selected = false;
+                if (selectedItemKey != null && 
groupname.equals(selectedItemKey)) {
+                    selected = true;
+                    selectedTreeItem = groupItemTree;
+                }
+                groupItemTree.setWidget(groupObj.getWidget(selected));
                 groupTree.addItem(groupItemTree);
                 List feedList = new ArrayList(group.keySet());
                 Collections.sort(feedList);
@@ -118,157 +133,175 @@
                 while (feedgroupit.hasNext()) {
                     String feedname = (String) feedgroupit.next();
                     Feed feed = (Feed) group.get(feedname);
-                    addFeedToTree(groupItemTree, feed);
+                    //set it's userObject to the name of the group + name of 
the feed since a 
+                    //feed can be part of multiple groups and we need to 
identify it uniquely.
+                    String itemTreeKey = groupname + "." + feedname;
+                    TreeItemObject feedObj = new 
FeedTreeItemObject(itemTreeKey, feed);
+                    TreeItem feedItem = new TreeItem();
+                    feedItem.setUserObject(feedObj);
+                    selected = false;
+                    if (selectedItemKey != null && 
itemTreeKey.equals(selectedItemKey)) {
+                        selected = true;
+                        selectedTreeItem = feedItem;
+                    }
+                    feedItem.setWidget(feedObj.getWidget(selected));
+                    groupItemTree.addItem(feedItem);
                 }
+                //expand it if necessary
+                Boolean state = (Boolean)itemsState.get(groupname);
+                if (state != null) {
+                    groupItemTree.setState(state.booleanValue());
+                }
                 groupTree.addItem(groupItemTree);
             }
         }
+        //set the selected tree item
+        this.groupTree.setSelectedItem(selectedTreeItem);
     }
 
-    /*
-    private void addFeedToTree(Tree treeItem, final Feed feed) {
-        String feedtitle =  feed.getName() + "(" + feed.getNb() + ")";
-        String imgurl = getFavIcon(feed);
-        if (imgurl!=null)
-         feedtitle = "<img src=\"" + imgurl + "\" class=\"" + 
watch.getStyleName("feedtree","rssthumbnail") +"\" alt=\"\" />" + feedtitle;
-        Hyperlink link = new Hyperlink(feedtitle, true, "");
-        link.setStyleName(watch.getStyleName("feedtree","link"));
-        link.addClickListener(new ClickListener() {
-            public void onClick(Widget widget) {
-                watch.refreshOnFeedChange(feed);
-            }
-        });
-        treeItem.add(link);
-    } */
-
-    private String getFavIcon(Feed feed) {
-        return watch.getFavIcon(feed);
-    }
-
-    private void addFeedToTree(TreeItem treeItem, final Feed feed) {
-
-        String feedtitle =  feed.getName() + "(" + feed.getNb() + ")";
-        String imgurl = getFavIcon(feed);     
-        if (imgurl!=null)
-         feedtitle = "<img src=\"" + imgurl + "\" class=\"" + 
watch.getStyleName("feedtree","logo-icon") + "\" alt=\"\" />" + feedtitle;
-        Hyperlink link = new DoubleClickHyperlink(feed, feedtitle, true, "");
-        link.setStyleName(watch.getStyleName("feedtree","link"));
-        treeItem.addItem(link);
-    }
-
-
     public void resizeWindow() {
         // Watch.setMaxHeight(panel);
     }
 
     /**
-     * Class to handle double click
+     * Class to enclose data to be stored by a tree item that should be able 
to:
+     * <ul>
+     * <li> get uniquely identifying key for this tree item </li>
+     * <li> generate a widget to be displayed by the tree item </li>
+     * </ul>
      */
-    public class DoubleClickHyperlink extends Hyperlink {
-        private Feed feed;
-        private int clicksCount = 0;
-        private Timer timer;
-        StandardFeedDialog feedDialog;
-        ChoiceDialog chooseActionDialog;
-        boolean actionStarted = false;
+    public abstract class TreeItemObject {
+        //the unique ID 
+        protected String key;
+        //the data of the TreeItemObject
+        protected Object data; 
+        
+        public TreeItemObject(String key, Object data)
+        {
+            this.key = key;
+            this.data = data;
+        }
+        
+        public String getKey() {
+            return this.key;
+        }
+        
+        public abstract Widget getWidget(boolean selected);
+    }
+    
+    public class GroupTreeItemObject extends TreeItemObject {
+        public GroupTreeItemObject(String key, Object data)
+        {
+            super(key, data);
+        }
 
-        public DoubleClickHyperlink(Feed feed, String text, boolean asHTML, 
String targetHistoryToken) {
-            super(text, asHTML, targetHistoryToken);
-            this.feed = feed;
-            sinkEvents(Event.ONDBLCLICK);
+        public GroupTreeItemObject(String groupname, String groupTitle)
+        {
+            super(groupname, null);
+            //can only instantiate groupdata obj from class.
+            //TODO: declare it static or not inner once all the data classes 
are moved.
+            this.data = new String[2];
+            ((String[])this.data)[0] = groupname;
+            ((String[])this.data)[1] = groupTitle;
         }
 
-        public void onBrowserEvent(Event event) {
-            if (DOM.eventGetType(event) == Event.ONDBLCLICK) {
-                // TODO: launch edit feed here
-                if (timer!=null)
-                    timer.cancel();
-                clicksCount = 0;
-                updateFeed();
-            } else if (DOM.eventGetType(event) == Event.ONCLICK) {
-                clicksCount++;
-                if ( clicksCount >= 2 ) {
-                    if (timer!=null)
-                        timer.cancel();
-                    clicksCount = 0;
-                    chooseAction();
-                } else {
-                    if (timer==null)
-                        timer = new Timer() {
-                            public void run() {
-                                clicksCount = 0;
-                                // cancel the timer
-                                cancel();
-                                watch.refreshOnFeedChange(feed);
-                            }
-                        };
-                    // Timer of double click delay
-                    timer.scheduleRepeating(200);
+        public Widget getWidget(boolean selected)
+        {
+            final String[] gData = (String[])this.data;
+            Hyperlink link = new Hyperlink(gData[1], "");
+            link.setStyleName(watch.getStyleName("feedtree","link"));
+            link.addClickListener(new ClickListener() {
+                public void onClick(Widget widget) {
+                    watch.refreshOnGroupChange(gData[0]);
                 }
+            });            
+            Widget widget = link;
+            if (selected) {
+                //create a composite with link as main widget and some actions
+                widget = new HyperlinkComposite(link);
+                //no actions for now
             }
+            return widget;
         }
+    }
+    
+    public class FeedTreeItemObject extends TreeItemObject {
 
-        private void chooseAction() {
-            if (actionStarted==false) {
-                actionStarted = true;
-                chooseActionDialog = new ChoiceDialog(watch, "chooseaction", 
Dialog.BUTTON_CANCEL | Dialog.BUTTON_NEXT, false,
-                        new AsyncCallback() {
+        public FeedTreeItemObject(String key, Object data)
+        {
+            super(key, data);
+        }
+        
+        private String getFavIcon(Feed feed) {
+            return watch.getFavIcon(feed);
+        }
+
+        public Widget getWidget(boolean selected)
+        {
+            //cast data to feed
+            final Feed feed = (Feed)this.data;
+            String feedtitle =  feed.getName() + "(" + feed.getNb() + ")";
+            String imgurl = getFavIcon(feed);     
+            if (imgurl!=null)
+             feedtitle = "<img src=\"" + imgurl + "\" class=\"" + 
watch.getStyleName("feedtree","logo-icon") + "\" alt=\"\" />" + feedtitle;
+            Hyperlink link = new Hyperlink(feedtitle, true, "");
+            link.addClickListener(new ClickListener() {
+                public void onClick(Widget widget) {
+                    watch.refreshOnFeedChange(feed);
+                } 
+            });
+            link.setStyleName(watch.getStyleName("feedtree","link"));          
  
+            Widget widget = link;
+            
+            //if selected, generate the two action links
+            if (selected) {
+                widget = new HyperlinkComposite(link);
+                //create the inner item
+                Hyperlink editHyperlink = new Hyperlink("edit", "");
+                editHyperlink.addClickListener(new ClickListener() {
+                    public void onClick (Widget widget) {
+                        FeedDialog feedDialog = new StandardFeedDialog(watch, 
"standardfeed", Dialog.BUTTON_CANCEL | Dialog.BUTTON_NEXT, feed);
+                        feedDialog.setAsyncCallback(new AsyncCallback() {
                             public void onFailure(Throwable throwable) {
-                                actionStarted = false;
+                                //nothing
                             }
-
                             public void onSuccess(Object object) {
-                                ChoiceInfo choice = (ChoiceInfo) object;
-                                if (choice.getName().equals("updatefeed")) {
-                                    updateFeed();
-                                } else if 
(choice.getName().equals("removefeed")){
-                                    watch.getDataManager().removeFeed(feed, 
new XWikiAsyncCallback(watch) {
-                                        public void onFailure(Throwable 
caught) {
-                                            super.onFailure(caught);
-                                            actionStarted = false;
-                                        }
-                                        public void onSuccess(Object result) {
-                                            super.onSuccess(result);
-                                            // We need to refreshData the tree
-                                            watch.refreshOnNewFeed();
-                                            actionStarted = false;
-                                        }
-                                    });
-                                }  else {
-                                    actionStarted = false;
-                                }
+                                Feed newfeed = (Feed) object;
+                                watch.getDataManager().updateFeed(newfeed, new 
XWikiAsyncCallback(watch) {
+                                    public void onFailure(Throwable caught) {
+                                        super.onFailure(caught);
+                                    }
+    
+                                    public void onSuccess(Object result) {
+                                        super.onSuccess(result);
+                                        // We need to refreshData the tree
+                                        watch.refreshOnNewFeed();
+                                    }
+                                });
                             }
                         });
+                        feedDialog.show();                    
+                    }
+                });
+                ((HyperlinkComposite)widget).add(new 
HyperlinkComposite(editHyperlink));
+                Hyperlink deleteHyperlink = new Hyperlink("delete", "");
+                deleteHyperlink.addClickListener(new ClickListener() {
+                   public void onClick(Widget widget) {
+                       watch.getDataManager().removeFeed(feed, new 
XWikiAsyncCallback(watch) {
+                           public void onFailure(Throwable caught) {
+                               super.onFailure(caught);
+                           }
+                           public void onSuccess(Object result) {
+                               super.onSuccess(result);
+                               // We need to refreshData the tree
+                               watch.refreshOnNewFeed();
+                           }
+                       });                       
+                   } 
+                });
+                ((HyperlinkComposite)widget).add(new 
HyperlinkComposite(deleteHyperlink));
             }
-            chooseActionDialog.addChoice("updatefeed");
-            chooseActionDialog.addChoice("removefeed");
-            chooseActionDialog.show();
+            return widget;
         }
-
-        private void updateFeed() {
-            feedDialog = new StandardFeedDialog(watch, "standardfeed", 
Dialog.BUTTON_CANCEL | Dialog.BUTTON_NEXT, feed);
-            feedDialog.setAsyncCallback(new AsyncCallback() {
-                public void onFailure(Throwable throwable) {
-                    actionStarted = false;
-                }
-                public void onSuccess(Object object) {
-                    Feed newfeed = (Feed) object;
-                    watch.getDataManager().updateFeed(newfeed, new 
XWikiAsyncCallback(watch) {
-                        public void onFailure(Throwable caught) {
-                            super.onFailure(caught);
-                            actionStarted = false;
-                        }
-
-                        public void onSuccess(Object result) {
-                            super.onSuccess(result);
-                            // We need to refreshData the tree
-                            watch.refreshOnNewFeed();
-                            actionStarted = false;
-                        }
-                    });
-                }
-            });
-            feedDialog.show();
-        }
     }
 }

Added: 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/HyperlinkComposite.java
===================================================================
--- 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/HyperlinkComposite.java
                               (rev 0)
+++ 
xwiki-products/xwiki-watch/trunk/web/src/main/java/com/xpn/xwiki/watch/client/ui/menu/HyperlinkComposite.java
       2007-11-01 13:29:17 UTC (rev 5595)
@@ -0,0 +1,32 @@
+package com.xpn.xwiki.watch.client.ui.menu;
+
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Hyperlink;
+import com.google.gwt.user.client.ui.Panel;
+
+public class HyperlinkComposite extends Composite
+{
+    protected Hyperlink mainWidget;
+    protected FlowPanel hyperlinksPanel;
+    public HyperlinkComposite(Hyperlink mainWidget)
+    {
+        this.mainWidget = mainWidget;
+        this.hyperlinksPanel = new FlowPanel();
+        
+        Panel compositePanel = new HorizontalPanel();
+        compositePanel.add(this.mainWidget);
+        compositePanel.add(this.hyperlinksPanel);
+        //every composite has to call initWidget in their constructors
+        initWidget(compositePanel);
+    }
+    
+    public void add(HyperlinkComposite cHyperlink) {
+        this.hyperlinksPanel.add(cHyperlink);
+    }
+    
+    public void remove(HyperlinkComposite cHyperlink) {
+        this.hyperlinksPanel.remove(cHyperlink);
+    }
+}

_______________________________________________
notifications mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/notifications

Reply via email to