svnno****@sourc*****
svnno****@sourc*****
2008年 10月 5日 (日) 02:31:33 JST
Revision: 1990 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=jiemamy&view=rev&rev=1990 Author: shin1 Date: 2008-10-05 02:31:32 +0900 (Sun, 05 Oct 2008) Log Message: ----------- Collectionの要素がObservableを実装しているか?の判断で、直接 instanceof Observableとなっていた。 これの判断方法を、getAdapter(Observable.class)がnull以外を返す、と変更した。 Modified Paths: -------------- zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableList.java zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableMap.java zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableSet.java -------------- next part -------------- Modified: zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableList.java =================================================================== --- zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableList.java 2008-10-04 16:07:52 UTC (rev 1989) +++ zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableList.java 2008-10-04 17:31:32 UTC (rev 1990) @@ -1,20 +1,16 @@ /* - * Copyright 2007-2008 MIYAMOTO Daisuke, jiemamy.org and the Others. - * Created on 2008/06/29 - * + * Copyright 2007-2008 MIYAMOTO Daisuke, jiemamy.org and the Others. Created on 2008/06/29 + * * This file is part of Jiemamy. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the specific language - * governing permissions and limitations under the License. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. */ package org.jiemamy.spec.event.collectionimpl; @@ -25,6 +21,7 @@ import java.util.List; import java.util.ListIterator; +import org.jiemamy.spec.Adaptable; import org.jiemamy.spec.event.ModelChangeEvent; import org.jiemamy.spec.event.ModelChangeListener; import org.jiemamy.spec.event.Observable; @@ -90,8 +87,8 @@ this, index, element)); list.add(index, element); // 要素に対する監視を開始する。 - if (element instanceof Observable) { - Observable observable = (Observable) element; + Observable observable = getObservableAdapter(element); + if (observable != null) { observable.addModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<List<T>, T>(ObservableCollectionChangeEvent.Timing.AFTER_ADD, @@ -108,8 +105,8 @@ this, index, o)); boolean result = list.add(o); // 要素に対する監視を開始する。 - if (o instanceof Observable) { - Observable observable = (Observable) o; + Observable observable = getObservableAdapter(o); + if (observable != null) { observable.addModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<List<T>, T>(ObservableCollectionChangeEvent.Timing.AFTER_ADD, @@ -271,7 +268,8 @@ ObservableCollectionChangeEvent.Timing.BEFORE_REMOVE, this, index, element)); T result = list.remove(index); // 要素に対する監視をやめる。 - if (element instanceof Observable) { + Observable observable = getObservableAdapter(element); + if (observable != null) { ((Observable) element).removeModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<List<T>, T>(ObservableCollectionChangeEvent.Timing.AFTER_REMOVE, @@ -291,7 +289,8 @@ ObservableCollectionChangeEvent.Timing.BEFORE_REMOVE, this, index, (T) o)); boolean result = list.remove(o); // 要素に対する監視をやめる。 - if (o instanceof Observable) { + Observable observable = getObservableAdapter((T) o); + if (observable != null) { ((Observable) o).removeModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<List<T>, T>(ObservableCollectionChangeEvent.Timing.AFTER_REMOVE, @@ -416,6 +415,19 @@ } } + /** + * valueが{@link Observable}の実装を持っていれば、そのインタスンスを返す。 + * @param value + * @return valueが{@link Observable}の実装を持っていない場合はnullを返す。 + */ + private Observable getObservableAdapter(T value) { + if (value instanceof Adaptable) { + return ((Adaptable) value).getAdapter(Observable.class); + } else { + return null; + } + } + /** * 要素に対する変更を監視する。 Modified: zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableMap.java =================================================================== --- zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableMap.java 2008-10-04 16:07:52 UTC (rev 1989) +++ zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableMap.java 2008-10-04 17:31:32 UTC (rev 1990) @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; +import org.jiemamy.spec.Adaptable; import org.jiemamy.spec.event.ModelChangeEvent; import org.jiemamy.spec.event.ModelChangeListener; import org.jiemamy.spec.event.Observable; @@ -111,9 +112,9 @@ for (V value : removedList) { fireChange(new ObservableCollectionChangeEvent<Map<K, V>, V>( ObservableCollectionChangeEvent.Timing.AFTER_REMOVE, this, index++, value)); - if (value instanceof Observable) { - Observable abstractModel = (Observable) value; - abstractModel.removeModelChangeListener(modelChangeListener); + Observable observable = getObservableAdapter(value); + if (observable != null) { + observable.removeModelChangeListener(modelChangeListener); } } removedList.clear(); @@ -169,9 +170,9 @@ fireChange(new ObservableCollectionChangeEvent<Map<K, V>, V>(ObservableCollectionChangeEvent.Timing.BEFORE_ADD, this, index, value)); V result = map.put(key, value); - if (value instanceof Observable) { - Observable abstractModel = (Observable) value; - abstractModel.addModelChangeListener(modelChangeListener); + Observable observable = getObservableAdapter(value); + if (observable != null) { + observable.addModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<Map<K, V>, V>(ObservableCollectionChangeEvent.Timing.AFTER_ADD, this, index, value)); @@ -201,9 +202,9 @@ V result = map.remove(key); fireChange(new ObservableCollectionChangeEvent<Map<K, V>, V>( ObservableCollectionChangeEvent.Timing.AFTER_REMOVE, this, index, result)); - if (result instanceof Observable) { - Observable abstractModel = (Observable) result; - abstractModel.removeModelChangeListener(modelChangeListener); + Observable observable = getObservableAdapter(result); + if (observable != null) { + observable.removeModelChangeListener(modelChangeListener); } return result; } @@ -237,6 +238,19 @@ } } + /** + * valueが{@link Observable}の実装を持っていれば、そのインタスンスを返す。 + * @param value + * @return valueが{@link Observable}の実装を持っていない場合はnullを返す。 + */ + private Observable getObservableAdapter(V value) { + if (value instanceof Adaptable) { + return ((Adaptable) value).getAdapter(Observable.class); + } else { + return null; + } + } + /** * 要素に対する変更を監視する。 @@ -265,6 +279,7 @@ @SuppressWarnings("unchecked") public void modelChanged(ModelChangeEvent e) { // int index = indexOf(e.getSource()); + System.out.println(getClass().getSimpleName() + "#modelChanged"); int index = -1; fireChange(new ObservableCollectionChangeEvent<Map<K, V>, V>( ObservableCollectionChangeEvent.Timing.COLLECTION_CHANGED, list, index, (V) e.getSource())); Modified: zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableSet.java =================================================================== --- zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableSet.java 2008-10-04 16:07:52 UTC (rev 1989) +++ zeus/trunk/org.jiemamy.spec.event/src/main/java/org/jiemamy/spec/event/collectionimpl/ObservableSet.java 2008-10-04 17:31:32 UTC (rev 1990) @@ -25,6 +25,7 @@ import java.util.List; import java.util.Set; +import org.jiemamy.spec.Adaptable; import org.jiemamy.spec.event.ModelChangeEvent; import org.jiemamy.spec.event.ModelChangeListener; import org.jiemamy.spec.event.Observable; @@ -90,8 +91,8 @@ this, index, o)); // 要素に対する監視を開始する。 boolean result = set.add(o); - if (o instanceof Observable) { - Observable observable = (Observable) o; + Observable observable = getObservableAdapter(o); + if (observable != null) { observable.addModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<Set<T>, T>(ObservableCollectionChangeEvent.Timing.AFTER_ADD, @@ -186,8 +187,8 @@ this, index, (T) o)); boolean result = set.remove(o); // 要素に対する監視をやめる。 - if (o instanceof Observable) { - Observable observable = (Observable) o; + Observable observable = getObservableAdapter((T) o); + if (observable != null) { observable.removeModelChangeListener(modelChangeListener); } fireChange(new ObservableCollectionChangeEvent<Set<T>, T>(ObservableCollectionChangeEvent.Timing.AFTER_REMOVE, @@ -264,6 +265,19 @@ } } + /** + * valueが{@link Observable}の実装を持っていれば、そのインタスンスを返す。 + * @param value + * @return valueが{@link Observable}の実装を持っていない場合はnullを返す。 + */ + private Observable getObservableAdapter(T value) { + if (value instanceof Adaptable) { + return ((Adaptable) value).getAdapter(Observable.class); + } else { + return null; + } + } + /** * 要素に対する変更を監視する。