# HG changeset patch # User Jaroslav Tulach # Date 1365438371 -7200 # Node ID dad881565d0a8d0f4531169beed843daf8feddf2 # Parent 6448c284fe21182599725603bdca010764040a3f Simplifying code by using @OnPropertyChange a bit more diff -r 6448c284fe21 -r dad881565d0a javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 16:51:30 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 18:26:11 2013 +0200 @@ -38,7 +38,10 @@ } public void assign(Knockout model) { - this.model = model; + if (this.model != model) { + this.model = model; + notifyChange(); + } } public KOList onChange(Runnable r) { @@ -156,7 +159,9 @@ @Override public KOList clone() { - return (KOList)super.clone(); + KOList ko = (KOList)super.clone(); + ko.model = null; + return ko; } } diff -r 6448c284fe21 -r dad881565d0a javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 16:51:30 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 18:26:11 2013 +0200 @@ -1136,8 +1136,10 @@ w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ";\n"); continue; } + w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n"); + } else { + w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n"); } - w.write(" ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n"); } w.write(" return ret;\n"); diff -r 6448c284fe21 -r dad881565d0a javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java --- a/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 16:51:30 2013 +0200 +++ b/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 18:26:11 2013 +0200 @@ -31,7 +31,7 @@ @Page(xhtml="index.html", className="TwitterModel", properties={ @Property(name="savedLists", type=TwitterClient.Twttrs.class, array = true), @Property(name="activeTweetersName", type=String.class), - @Property(name="modifiedList", type=TwitterClient.Twttrs.class), + @Property(name="activeTweeters", type=TwitterClient.Twttrs.class), @Property(name="userNameToAdd", type=String.class), @Property(name="currentTweets", type=TwitterClient.Twt.class, array = true) }) @@ -63,26 +63,27 @@ page.getCurrentTweets().addAll(q.getResults()); } + @OnPropertyChange("activeTweetersName") + static void changeTweetersList(TwitterModel model) { + Tweeters people = findByName(model.getSavedLists(), model.getActiveTweetersName()); + model.setActiveTweeters(people.clone()); + } + @OnPropertyChange("activeTweeters") static void refreshTweets(TwitterModel model) { Tweeters people = model.getActiveTweeters(); - StringBuilder sb = new StringBuilder(); - sb.append("rpp=25&q="); - String sep = ""; - for (String p : people.getUserNames()) { - sb.append(sep); - sb.append("from:"); - sb.append(p); - sep = " OR "; + if (people != null) { + StringBuilder sb = new StringBuilder(); + sb.append("rpp=25&q="); + String sep = ""; + for (String p : people.getUserNames()) { + sb.append(sep); + sb.append("from:"); + sb.append(p); + sep = " OR "; + } + model.queryTweets("http://search.twitter.com", sb.toString()); } - model.queryTweets("http://search.twitter.com", sb.toString()); - } - - private static Tweeters tweeters(String listName, String... userNames) { - Tweeters t = new Tweeters(); - t.setName(listName); - t.getUserNames().addAll(Arrays.asList(userNames)); - return t; } static { @@ -100,31 +101,21 @@ } @ComputedProperty - static Tweeters activeTweeters(String activeTweetersName, List savedLists, Tweeters modifiedList) { - if (modifiedList != null && modifiedList.getName() != null) { - if (modifiedList.getName().equals(activeTweetersName)) { - return modifiedList; - } + static boolean hasUnsavedChanges(Tweeters activeTweeters, List savedLists, String activeTweetersName) { + Tweeters tw = findByName(savedLists, activeTweetersName); + if (activeTweeters == null) { + return false; } - return findByName(savedLists, activeTweetersName); - } - - @OnPropertyChange("activeTweetersName") - static void clearModifiedList(TwitterModel m) { - m.setModifiedList(null); + return !tw.equals(activeTweeters); } @ComputedProperty - static boolean hasUnsavedChanges(Tweeters modifiedList) { - return modifiedList != null; - } - - @ComputedProperty - static boolean userNameToAddIsValid(String userNameToAdd, String activeTweetersName, List savedLists, Tweeters modifiedList) { - Tweeters editingList = activeTweeters(activeTweetersName, savedLists, modifiedList); - return editingList != null && userNameToAdd != null && + static boolean userNameToAddIsValid( + String userNameToAdd, String activeTweetersName, List savedLists, Tweeters activeTweeters + ) { + return activeTweeters != null && userNameToAdd != null && userNameToAdd.matches("[a-zA-Z0-9_]{1,15}") && - !editingList.getUserNames().contains(userNameToAdd); + !activeTweeters.getUserNames().contains(userNameToAdd); } @OnFunction @@ -143,33 +134,37 @@ static void saveChanges(TwitterModel model) { Tweeters t = findByName(model.getSavedLists(), model.getActiveTweetersName()); int indx = model.getSavedLists().indexOf(t); - assert indx != -1; - model.getSavedLists().set(indx, model.getModifiedList()); - model.setModifiedList(null); + if (indx != -1) { + model.getSavedLists().set(indx, model.getActiveTweeters()); + } else { + model.getSavedLists().add(model.getActiveTweeters()); + } } @OnFunction static void addUser(TwitterModel model) { String n = model.getUserNameToAdd(); - findModifiedList(model).getUserNames().add(n); + model.getActiveTweeters().getUserNames().add(n); } @OnFunction static void removeUser(String data, TwitterModel model) { - findModifiedList(model).getUserNames().remove(data); + model.getActiveTweeters().getUserNames().remove(data); } - private static Tweeters findModifiedList(TwitterModel model) { - if (model.getModifiedList() == null || model.getModifiedList().getName() == null) { - model.setModifiedList(model.getActiveTweeters().clone()); - } - return model.getModifiedList(); - } private static Tweeters findByName(List list, String name) { for (Tweeters l : list) { if (l.getName() != null && l.getName().equals(name)) { return l; } } - return list.isEmpty() ? null : list.get(0); + return list.isEmpty() ? new Tweeters() : list.get(0); } + + private static Tweeters tweeters(String listName, String... userNames) { + Tweeters t = new Tweeters(); + t.setName(listName); + t.getUserNames().addAll(Arrays.asList(userNames)); + return t; + } + } diff -r 6448c284fe21 -r dad881565d0a javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java --- a/javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java Mon Apr 08 16:51:30 2013 +0200 +++ b/javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java Mon Apr 08 18:26:11 2013 +0200 @@ -46,7 +46,7 @@ assertFalse(model.isUserNameToAddIsValid(), "Can't add Joe for the 2nd time"); assertEquals(t.getUserNames().size(), 0, "Original tweeters list remains empty"); - Tweeters mod = model.getModifiedList(); + Tweeters mod = model.getActiveTweeters(); assertNotNull(mod, "Modified list is not filled in"); assertTrue(model.isHasUnsavedChanges(), "We have modifications"); assertEquals(mod.getUserNames().size(), 1, "One element in the list"); @@ -56,7 +56,6 @@ TwitterClient.saveChanges(model); assertFalse(model.isHasUnsavedChanges(), "Does not have anything to save"); - assertNull(model.getModifiedList(), "No list modified"); assertSame(model.getActiveTweeters(), mod, "Still editing the old modified one");