1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 16:51:30 2013 +0200
1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 18:26:11 2013 +0200
1.3 @@ -38,7 +38,10 @@
1.4 }
1.5
1.6 public void assign(Knockout model) {
1.7 - this.model = model;
1.8 + if (this.model != model) {
1.9 + this.model = model;
1.10 + notifyChange();
1.11 + }
1.12 }
1.13
1.14 public KOList<T> onChange(Runnable r) {
1.15 @@ -156,7 +159,9 @@
1.16
1.17 @Override
1.18 public KOList clone() {
1.19 - return (KOList)super.clone();
1.20 + KOList ko = (KOList)super.clone();
1.21 + ko.model = null;
1.22 + return ko;
1.23 }
1.24
1.25 }
2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 16:51:30 2013 +0200
2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 18:26:11 2013 +0200
2.3 @@ -1136,8 +1136,10 @@
2.4 w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ";\n");
2.5 continue;
2.6 }
2.7 + w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n");
2.8 + } else {
2.9 + w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n");
2.10 }
2.11 - w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n");
2.12 }
2.13
2.14 w.write(" return ret;\n");
3.1 --- a/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 16:51:30 2013 +0200
3.2 +++ b/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 18:26:11 2013 +0200
3.3 @@ -31,7 +31,7 @@
3.4 @Page(xhtml="index.html", className="TwitterModel", properties={
3.5 @Property(name="savedLists", type=TwitterClient.Twttrs.class, array = true),
3.6 @Property(name="activeTweetersName", type=String.class),
3.7 - @Property(name="modifiedList", type=TwitterClient.Twttrs.class),
3.8 + @Property(name="activeTweeters", type=TwitterClient.Twttrs.class),
3.9 @Property(name="userNameToAdd", type=String.class),
3.10 @Property(name="currentTweets", type=TwitterClient.Twt.class, array = true)
3.11 })
3.12 @@ -63,26 +63,27 @@
3.13 page.getCurrentTweets().addAll(q.getResults());
3.14 }
3.15
3.16 + @OnPropertyChange("activeTweetersName")
3.17 + static void changeTweetersList(TwitterModel model) {
3.18 + Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName());
3.19 + model.setActiveTweeters(people.clone());
3.20 + }
3.21 +
3.22 @OnPropertyChange("activeTweeters")
3.23 static void refreshTweets(TwitterModel model) {
3.24 Tweeters people = model.getActiveTweeters();
3.25 - StringBuilder sb = new StringBuilder();
3.26 - sb.append("rpp=25&q=");
3.27 - String sep = "";
3.28 - for (String p : people.getUserNames()) {
3.29 - sb.append(sep);
3.30 - sb.append("from:");
3.31 - sb.append(p);
3.32 - sep = " OR ";
3.33 + if (people != null) {
3.34 + StringBuilder sb = new StringBuilder();
3.35 + sb.append("rpp=25&q=");
3.36 + String sep = "";
3.37 + for (String p : people.getUserNames()) {
3.38 + sb.append(sep);
3.39 + sb.append("from:");
3.40 + sb.append(p);
3.41 + sep = " OR ";
3.42 + }
3.43 + model.queryTweets("http://search.twitter.com", sb.toString());
3.44 }
3.45 - model.queryTweets("http://search.twitter.com", sb.toString());
3.46 - }
3.47 -
3.48 - private static Tweeters tweeters(String listName, String... userNames) {
3.49 - Tweeters t = new Tweeters();
3.50 - t.setName(listName);
3.51 - t.getUserNames().addAll(Arrays.asList(userNames));
3.52 - return t;
3.53 }
3.54
3.55 static {
3.56 @@ -100,31 +101,21 @@
3.57 }
3.58
3.59 @ComputedProperty
3.60 - static Tweeters activeTweeters(String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
3.61 - if (modifiedList != null && modifiedList.getName() != null) {
3.62 - if (modifiedList.getName().equals(activeTweetersName)) {
3.63 - return modifiedList;
3.64 - }
3.65 + static boolean hasUnsavedChanges(Tweeters activeTweeters, List<Tweeters> savedLists, String activeTweetersName) {
3.66 + Tweeters tw = findByName(savedLists, activeTweetersName);
3.67 + if (activeTweeters == null) {
3.68 + return false;
3.69 }
3.70 - return findByName(savedLists, activeTweetersName);
3.71 - }
3.72 -
3.73 - @OnPropertyChange("activeTweetersName")
3.74 - static void clearModifiedList(TwitterModel m) {
3.75 - m.setModifiedList(null);
3.76 + return !tw.equals(activeTweeters);
3.77 }
3.78
3.79 @ComputedProperty
3.80 - static boolean hasUnsavedChanges(Tweeters modifiedList) {
3.81 - return modifiedList != null;
3.82 - }
3.83 -
3.84 - @ComputedProperty
3.85 - static boolean userNameToAddIsValid(String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters modifiedList) {
3.86 - Tweeters editingList = activeTweeters(activeTweetersName, savedLists, modifiedList);
3.87 - return editingList != null && userNameToAdd != null &&
3.88 + static boolean userNameToAddIsValid(
3.89 + String userNameToAdd, String activeTweetersName, List<Tweeters> savedLists, Tweeters activeTweeters
3.90 + ) {
3.91 + return activeTweeters != null && userNameToAdd != null &&
3.92 userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") &&
3.93 - !editingList.getUserNames().contains(userNameToAdd);
3.94 + !activeTweeters.getUserNames().contains(userNameToAdd);
3.95 }
3.96
3.97 @OnFunction
3.98 @@ -143,33 +134,37 @@
3.99 static void saveChanges(TwitterModel model) {
3.100 Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName());
3.101 int indx = model.getSavedLists().indexOf(t);
3.102 - assert indx != -1;
3.103 - model.getSavedLists().set(indx, model.getModifiedList());
3.104 - model.setModifiedList(null);
3.105 + if (indx != -1) {
3.106 + model.getSavedLists().set(indx, model.getActiveTweeters());
3.107 + } else {
3.108 + model.getSavedLists().add(model.getActiveTweeters());
3.109 + }
3.110 }
3.111
3.112 @OnFunction
3.113 static void addUser(TwitterModel model) {
3.114 String n = model.getUserNameToAdd();
3.115 - findModifiedList(model).getUserNames().add(n);
3.116 + model.getActiveTweeters().getUserNames().add(n);
3.117 }
3.118 @OnFunction
3.119 static void removeUser(String data, TwitterModel model) {
3.120 - findModifiedList(model).getUserNames().remove(data);
3.121 + model.getActiveTweeters().getUserNames().remove(data);
3.122 }
3.123
3.124 - private static Tweeters findModifiedList(TwitterModel model) {
3.125 - if (model.getModifiedList() == null || model.getModifiedList().getName() == null) {
3.126 - model.setModifiedList(model.getActiveTweeters().clone());
3.127 - }
3.128 - return model.getModifiedList();
3.129 - }
3.130 private static Tweeters findByName(List<Tweeters> list, String name) {
3.131 for (Tweeters l : list) {
3.132 if (l.getName() != null && l.getName().equals(name)) {
3.133 return l;
3.134 }
3.135 }
3.136 - return list.isEmpty() ? null : list.get(0);
3.137 + return list.isEmpty() ? new Tweeters() : list.get(0);
3.138 }
3.139 +
3.140 + private static Tweeters tweeters(String listName, String... userNames) {
3.141 + Tweeters t = new Tweeters();
3.142 + t.setName(listName);
3.143 + t.getUserNames().addAll(Arrays.asList(userNames));
3.144 + return t;
3.145 + }
3.146 +
3.147 }
4.1 --- a/javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java Mon Apr 08 16:51:30 2013 +0200
4.2 +++ b/javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java Mon Apr 08 18:26:11 2013 +0200
4.3 @@ -46,7 +46,7 @@
4.4 assertFalse(model.isUserNameToAddIsValid(), "Can't add Joe for the 2nd time");
4.5 assertEquals(t.getUserNames().size(), 0, "Original tweeters list remains empty");
4.6
4.7 - Tweeters mod = model.getModifiedList();
4.8 + Tweeters mod = model.getActiveTweeters();
4.9 assertNotNull(mod, "Modified list is not filled in");
4.10 assertTrue(model.isHasUnsavedChanges(), "We have modifications");
4.11 assertEquals(mod.getUserNames().size(), 1, "One element in the list");
4.12 @@ -56,7 +56,6 @@
4.13
4.14 TwitterClient.saveChanges(model);
4.15 assertFalse(model.isHasUnsavedChanges(), "Does not have anything to save");
4.16 - assertNull(model.getModifiedList(), "No list modified");
4.17
4.18 assertSame(model.getActiveTweeters(), mod, "Still editing the old modified one");
4.19