ko-bck2brwsr/src/main/java/org/apidesign/html/ko2brwsr/KOList.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 29 Apr 2013 12:50:19 +0200
changeset 1189 9f8b07dcbe79
permissions -rw-r--r--
Putting the bck2brwsr bindings into html.java.net repository
jaroslav@1189
     1
/**
jaroslav@1189
     2
 * HTML via Java(tm) Language Bindings
jaroslav@1189
     3
 * Copyright (C) 2013 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@1189
     4
 *
jaroslav@1189
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@1189
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@1189
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@1189
     8
 *
jaroslav@1189
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@1189
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@1189
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@1189
    12
 * GNU General Public License for more details. apidesign.org
jaroslav@1189
    13
 * designates this particular file as subject to the
jaroslav@1189
    14
 * "Classpath" exception as provided by apidesign.org
jaroslav@1189
    15
 * in the License file that accompanied this code.
jaroslav@1189
    16
 *
jaroslav@1189
    17
 * You should have received a copy of the GNU General Public License
jaroslav@1189
    18
 * along with this program. Look for COPYING file in the top folder.
jaroslav@1189
    19
 * If not, see http://wiki.apidesign.org/wiki/GPLwithClassPathException
jaroslav@1189
    20
 */
jaroslav@1189
    21
package org.apidesign.html.ko2brwsr;
jaroslav@1189
    22
jaroslav@1189
    23
import java.util.ArrayList;
jaroslav@1189
    24
import java.util.Collection;
jaroslav@1189
    25
import java.util.Iterator;
jaroslav@1189
    26
import org.apidesign.bck2brwsr.core.JavaScriptOnly;
jaroslav@1189
    27
jaroslav@1189
    28
/**
jaroslav@1189
    29
 *
jaroslav@1189
    30
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@1189
    31
 */
jaroslav@1189
    32
public final class KOList<T> extends ArrayList<T> {
jaroslav@1189
    33
    private final String name;
jaroslav@1189
    34
    private final String[] deps;
jaroslav@1189
    35
    private Knockout model;
jaroslav@1189
    36
    private Runnable onchange;
jaroslav@1189
    37
jaroslav@1189
    38
    public KOList(String name, String... deps) {
jaroslav@1189
    39
        this.name = name;
jaroslav@1189
    40
        this.deps = deps;
jaroslav@1189
    41
    }
jaroslav@1189
    42
    
jaroslav@1189
    43
    public void assign(Knockout model) {
jaroslav@1189
    44
        if (this.model != model) {
jaroslav@1189
    45
            this.model = model;
jaroslav@1189
    46
            notifyChange();
jaroslav@1189
    47
        }
jaroslav@1189
    48
    }
jaroslav@1189
    49
    
jaroslav@1189
    50
    public KOList<T> onChange(Runnable r) {
jaroslav@1189
    51
        if (this.onchange != null) {
jaroslav@1189
    52
            throw new IllegalStateException();
jaroslav@1189
    53
        }
jaroslav@1189
    54
        this.onchange = r;
jaroslav@1189
    55
        return this;
jaroslav@1189
    56
    }
jaroslav@1189
    57
jaroslav@1189
    58
    @Override
jaroslav@1189
    59
    public boolean add(T e) {
jaroslav@1189
    60
        boolean ret = super.add(e);
jaroslav@1189
    61
        notifyChange();
jaroslav@1189
    62
        return ret;
jaroslav@1189
    63
    }
jaroslav@1189
    64
jaroslav@1189
    65
    @Override
jaroslav@1189
    66
    public boolean addAll(Collection<? extends T> c) {
jaroslav@1189
    67
        boolean ret = super.addAll(c);
jaroslav@1189
    68
        notifyChange();
jaroslav@1189
    69
        return ret;
jaroslav@1189
    70
    }
jaroslav@1189
    71
jaroslav@1189
    72
    @Override
jaroslav@1189
    73
    public boolean addAll(int index, Collection<? extends T> c) {
jaroslav@1189
    74
        boolean ret = super.addAll(index, c);
jaroslav@1189
    75
        notifyChange();
jaroslav@1189
    76
        return ret;
jaroslav@1189
    77
    }
jaroslav@1189
    78
jaroslav@1189
    79
    @Override
jaroslav@1189
    80
    public boolean remove(Object o) {
jaroslav@1189
    81
        boolean ret = super.remove(o);
jaroslav@1189
    82
        notifyChange();
jaroslav@1189
    83
        return ret;
jaroslav@1189
    84
    }
jaroslav@1189
    85
jaroslav@1189
    86
    @Override
jaroslav@1189
    87
    public void clear() {
jaroslav@1189
    88
        super.clear();
jaroslav@1189
    89
        notifyChange();
jaroslav@1189
    90
    }
jaroslav@1189
    91
jaroslav@1189
    92
    @Override
jaroslav@1189
    93
    public boolean removeAll(Collection<?> c) {
jaroslav@1189
    94
        boolean ret = super.removeAll(c);
jaroslav@1189
    95
        notifyChange();
jaroslav@1189
    96
        return ret;
jaroslav@1189
    97
    }
jaroslav@1189
    98
jaroslav@1189
    99
    @Override
jaroslav@1189
   100
    public boolean retainAll(Collection<?> c) {
jaroslav@1189
   101
        boolean ret = super.retainAll(c);
jaroslav@1189
   102
        notifyChange();
jaroslav@1189
   103
        return ret;
jaroslav@1189
   104
    }
jaroslav@1189
   105
jaroslav@1189
   106
    @Override
jaroslav@1189
   107
    public T set(int index, T element) {
jaroslav@1189
   108
        T ret = super.set(index, element);
jaroslav@1189
   109
        notifyChange();
jaroslav@1189
   110
        return ret;
jaroslav@1189
   111
    }
jaroslav@1189
   112
jaroslav@1189
   113
    @Override
jaroslav@1189
   114
    public void add(int index, T element) {
jaroslav@1189
   115
        super.add(index, element);
jaroslav@1189
   116
        notifyChange();
jaroslav@1189
   117
    }
jaroslav@1189
   118
jaroslav@1189
   119
    @Override
jaroslav@1189
   120
    public T remove(int index) {
jaroslav@1189
   121
        T ret = super.remove(index);
jaroslav@1189
   122
        notifyChange();
jaroslav@1189
   123
        return ret;
jaroslav@1189
   124
    }
jaroslav@1189
   125
jaroslav@1189
   126
    @Override
jaroslav@1189
   127
    public String toString() {
jaroslav@1189
   128
        Iterator<T> it = iterator();
jaroslav@1189
   129
        if (!it.hasNext()) {
jaroslav@1189
   130
            return "[]";
jaroslav@1189
   131
        }
jaroslav@1189
   132
        String sep = "";
jaroslav@1189
   133
        StringBuilder sb = new StringBuilder();
jaroslav@1189
   134
        sb.append('[');
jaroslav@1189
   135
        while (it.hasNext()) {
jaroslav@1189
   136
            T t = it.next();
jaroslav@1189
   137
            sb.append(sep);
jaroslav@1189
   138
            sb.append(ConvertTypes.toJSON(t));
jaroslav@1189
   139
            sep = ",";
jaroslav@1189
   140
        }
jaroslav@1189
   141
        sb.append(']');
jaroslav@1189
   142
        return sb.toString();
jaroslav@1189
   143
    }
jaroslav@1189
   144
    
jaroslav@1189
   145
    
jaroslav@1189
   146
    @JavaScriptOnly(name = "koArray", value = "function() { return this.toArray___3Ljava_lang_Object_2(); }")
jaroslav@1189
   147
    private static native int koArray();
jaroslav@1189
   148
jaroslav@1189
   149
    private void notifyChange() {
jaroslav@1189
   150
        Knockout m = model;
jaroslav@1189
   151
        if (m != null) {
jaroslav@1189
   152
            m.valueHasMutated(name);
jaroslav@1189
   153
            for (String dependant : deps) {
jaroslav@1189
   154
                m.valueHasMutated(dependant);
jaroslav@1189
   155
            }
jaroslav@1189
   156
        }
jaroslav@1189
   157
        Runnable r = onchange;
jaroslav@1189
   158
        if (r != null) {
jaroslav@1189
   159
            r.run();
jaroslav@1189
   160
        }
jaroslav@1189
   161
    }
jaroslav@1189
   162
jaroslav@1189
   163
    @Override
jaroslav@1189
   164
    public KOList clone() {
jaroslav@1189
   165
        KOList ko = (KOList)super.clone();
jaroslav@1189
   166
        ko.model = null;
jaroslav@1189
   167
        return ko;
jaroslav@1189
   168
    }
jaroslav@1189
   169
    
jaroslav@1189
   170
}