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