javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 03 Apr 2013 11:37:52 +0200
branchmodel
changeset 921 cd0a40987abb
parent 887 13dc5ada296b
child 928 ac45e76f196e
permissions -rw-r--r--
Persists arrays to JSON
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.htmlpage;
    19 
    20 import java.util.ArrayList;
    21 import java.util.Collection;
    22 import java.util.Iterator;
    23 import org.apidesign.bck2brwsr.core.JavaScriptOnly;
    24 
    25 /**
    26  *
    27  * @author Jaroslav Tulach <jtulach@netbeans.org>
    28  */
    29 public final class KOList<T> extends ArrayList<T> {
    30     private final String name;
    31     private final String[] deps;
    32     private Knockout model;
    33 
    34     public KOList(String name, String... deps) {
    35         this.name = name;
    36         this.deps = deps;
    37     }
    38     
    39     public void assign(Knockout model) {
    40         this.model = model;
    41     }
    42 
    43     @Override
    44     public boolean add(T e) {
    45         boolean ret = super.add(e);
    46         notifyChange();
    47         return ret;
    48     }
    49 
    50     @Override
    51     public boolean remove(Object o) {
    52         boolean ret = super.remove(o);
    53         notifyChange();
    54         return ret;
    55     }
    56 
    57     @Override
    58     public void clear() {
    59         super.clear();
    60         notifyChange();
    61     }
    62 
    63     @Override
    64     public boolean removeAll(Collection<?> c) {
    65         boolean ret = super.removeAll(c);
    66         notifyChange();
    67         return ret;
    68     }
    69 
    70     @Override
    71     public boolean retainAll(Collection<?> c) {
    72         boolean ret = super.retainAll(c);
    73         notifyChange();
    74         return ret;
    75     }
    76 
    77     @Override
    78     public T set(int index, T element) {
    79         T ret = super.set(index, element);
    80         notifyChange();
    81         return ret;
    82     }
    83 
    84     @Override
    85     public void add(int index, T element) {
    86         super.add(index, element);
    87         notifyChange();
    88     }
    89 
    90     @Override
    91     public T remove(int index) {
    92         T ret = super.remove(index);
    93         notifyChange();
    94         return ret;
    95     }
    96 
    97     @Override
    98     public String toString() {
    99         Iterator<T> it = iterator();
   100         if (!it.hasNext()) {
   101             return "[]";
   102         }
   103         String sep = "";
   104         StringBuilder sb = new StringBuilder();
   105         sb.append('[');
   106         while (it.hasNext()) {
   107             T t = it.next();
   108             sb.append(sep);
   109             sb.append(ConvertTypes.toJSON(t));
   110             sep = ",";
   111         }
   112         sb.append(']');
   113         return sb.toString();
   114     }
   115     
   116     
   117     @JavaScriptOnly(name = "koArray", value = "function() { return this.toArray___3Ljava_lang_Object_2(); }")
   118     private static native int koArray();
   119 
   120     private void notifyChange() {
   121         Knockout m = model;
   122         if (m == null) {
   123             return;
   124         }
   125         m.valueHasMutated(name);
   126         for (String dependant : deps) {
   127             m.valueHasMutated(dependant);
   128         }
   129     }
   130     
   131     
   132 }