Simplifying code by using @OnPropertyChange a bit more model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 08 Apr 2013 18:26:11 +0200
branchmodel
changeset 955dad881565d0a
parent 954 6448c284fe21
child 956 7fc6b7e9c982
Simplifying code by using @OnPropertyChange a bit more
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
javaquery/demo-twitter/src/test/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClientTest.java
     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