(defn seq-ref-combobox-model [seq-ref & [selected]]
(let [selected (or selected (atom nil))
listeners (atom #{})
key (gensym "seq-ref-combobox-model-watch")
m (commbo-box-model
:mutable true
:size ([] (count @seq-ref))
:get-selected-item ([] (dosync (if (and @selected (some #(= @selected %) @seq-ref)) @selected (swap! selected (constantly nil)))))
:set-selected-item ([i] (dosync (if (and i (some #(= i %) @seq-ref)) (swap! selected (constantly i)) (swap! selected (constantly nil)))))
:add-listener ([l] (swap! listeners conj l))
:remove-listener ([l] (swap! listeners disj l))
:get ([i] (if (has-index? @seq-ref i) (nth @seq-ref i) nil))
:add ([itm] (dosync (alter seq-ref conj itm)))
:add-at ([itm idx] (dosync
(if (vector? @seq-ref)
(alter seq-ref #(vec (insert-at % idx itm)))
(alter seq-ref insert-at idx itm))))
:remove ([itm] (dosync
(if (vector? @seq-ref)
(alter seq-ref #(vec (remove (partial = itm) %)))
(alter seq-ref #(remove (partial = itm) %)))))
:remove-at ([idx] (dosync
(if (vector? @seq-ref)
(alter seq-ref #(vec (drop-nth % idx)))
(alter seq-ref drop-nth idx)))))]
(add-watch seq-ref key
(fn [_ _ _ state]
(do-swing
(let [m (ListDataEvent. m (ListDataEvent/CONTENTS_CHANGED) 0 (count state))]
(doseq [l @listeners]
(.contentsChanged l m))))))
m))
Used in 0 other vars
Comments top
No comments for seq-ref-combobox-model. Log in to add a comment.