javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 25 Mar 2013 16:17:21 +0100
branchmodel
changeset 887 13dc5ada296b
parent 761 ade90921ede5
child 921 cd0a40987abb
permissions -rw-r--r--
Better (from a static compilation point of view) to let JavaScript call the basic (non-private) getter and do conversion then
     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 org.apidesign.bck2brwsr.core.JavaScriptOnly;
    23 
    24 /**
    25  *
    26  * @author Jaroslav Tulach <jtulach@netbeans.org>
    27  */
    28 public final class KOList<T> extends ArrayList<T> {
    29     private final String name;
    30     private final String[] deps;
    31     private Knockout model;
    32 
    33     public KOList(String name, String... deps) {
    34         this.name = name;
    35         this.deps = deps;
    36     }
    37     
    38     public void assign(Knockout model) {
    39         this.model = model;
    40     }
    41 
    42     @Override
    43     public boolean add(T e) {
    44         boolean ret = super.add(e);
    45         notifyChange();
    46         return ret;
    47     }
    48 
    49     @Override
    50     public boolean remove(Object o) {
    51         boolean ret = super.remove(o);
    52         notifyChange();
    53         return ret;
    54     }
    55 
    56     @Override
    57     public void clear() {
    58         super.clear();
    59         notifyChange();
    60     }
    61 
    62     @Override
    63     public boolean removeAll(Collection<?> c) {
    64         boolean ret = super.removeAll(c);
    65         notifyChange();
    66         return ret;
    67     }
    68 
    69     @Override
    70     public boolean retainAll(Collection<?> c) {
    71         boolean ret = super.retainAll(c);
    72         notifyChange();
    73         return ret;
    74     }
    75 
    76     @Override
    77     public T set(int index, T element) {
    78         T ret = super.set(index, element);
    79         notifyChange();
    80         return ret;
    81     }
    82 
    83     @Override
    84     public void add(int index, T element) {
    85         super.add(index, element);
    86         notifyChange();
    87     }
    88 
    89     @Override
    90     public T remove(int index) {
    91         T ret = super.remove(index);
    92         notifyChange();
    93         return ret;
    94     }
    95     
    96     
    97     
    98     @JavaScriptOnly(name = "koArray", value = "function() { return this.toArray___3Ljava_lang_Object_2(); }")
    99     private static native int koArray();
   100 
   101     private void notifyChange() {
   102         Knockout m = model;
   103         if (m == null) {
   104             return;
   105         }
   106         m.valueHasMutated(name);
   107         for (String dependant : deps) {
   108             m.valueHasMutated(dependant);
   109         }
   110     }
   111     
   112     
   113 }