• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

テキストの各行をキーと値に分離し、複数テキストファイルを読み込み、キーを突き合わせ照合し、その結果を表示するGUIユーテリティです。


コミットメタ情報

リビジョン7079a574a68f75b36c91bbea6de9b868a827f58e (tree)
日時2011-10-19 18:30:04
作者osabe_masashi <osabe_masashi@MKI9...>
コミッターosabe_masashi

ログメッセージ

表示モードのバインド対応仕掛中

変更サマリ

差分

--- a/src/textkeymatcher/entity/FilteredRowMap.java
+++ b/src/textkeymatcher/entity/FilteredRowMap.java
@@ -9,6 +9,7 @@ import java.util.AbstractSet;
99 import java.util.Iterator;
1010 import java.util.Map;
1111 import java.util.Map.Entry;
12+import java.util.NoSuchElementException;
1213 import java.util.Set;
1314
1415 /**
@@ -19,15 +20,20 @@ public class FilteredRowMap extends AbstractMap<RowKey, RowValues> {
1920
2021 private Map<RowKey, RowValues> dataMap;
2122
22- private RowFilter rowFilter = DisplayMode.ALL;
23+ private RowFilter rowFilter;
2324
2425 public FilteredRowMap(Map<RowKey, RowValues> dataMap) {
25- if (dataMap == null) {
26+ this(dataMap, DisplayMode.ALL);
27+ }
28+
29+ public FilteredRowMap(Map<RowKey, RowValues> dataMap, RowFilter rowFilter) {
30+ if (dataMap == null || rowFilter == null) {
2631 throw new IllegalArgumentException();
2732 }
2833 this.dataMap = dataMap;
34+ this.rowFilter = rowFilter;
2935 }
30-
36+
3137 public void setRowFilter(RowFilter rowFilter) {
3238 if (rowFilter == null) {
3339 throw new IllegalArgumentException();
@@ -39,9 +45,74 @@ public class FilteredRowMap extends AbstractMap<RowKey, RowValues> {
3945 return rowFilter;
4046 }
4147
48+ private static int ref = 0;
4249
4350 @Override
4451 public Set<Entry<RowKey, RowValues>> entrySet() {
45- return dataMap.entrySet();
52+ final Set<Entry<RowKey, RowValues>> set = dataMap.entrySet();
53+ final RowFilter filter = this.rowFilter;
54+ return new AbstractSet<Entry<RowKey, RowValues>>() {
55+ @Override
56+ public Iterator<Entry<RowKey, RowValues>> iterator() {
57+ ref++;
58+ final Iterator<Entry<RowKey, RowValues>> ite = set.iterator();
59+ return new Iterator<Entry<RowKey, RowValues>>() {
60+
61+ private Entry<RowKey, RowValues> nextEntry;
62+
63+ private void fetch() {
64+ nextEntry = null;
65+ while (ite.hasNext()) {
66+ Entry<RowKey, RowValues> entry = ite.next();
67+ if (filter.isAcceptable(entry.getValue())) {
68+ nextEntry = entry;
69+ return;
70+ }
71+ }
72+ }
73+
74+ @Override
75+ public boolean hasNext() {
76+ if (nextEntry == null) {
77+ fetch();
78+ }
79+ return nextEntry != null;
80+ }
81+
82+ @Override
83+ public Entry<RowKey, RowValues> next() {
84+ if (nextEntry == null) {
85+ fetch();
86+ }
87+ if (nextEntry == null) {
88+ throw new NoSuchElementException();
89+ }
90+ Entry<RowKey, RowValues> entry = nextEntry;
91+ this.nextEntry = null;
92+ return entry;
93+ }
94+
95+ @Override
96+ public void remove() {
97+ throw new UnsupportedOperationException("Not supported yet.");
98+ }
99+ };
100+ }
101+
102+ @Override
103+ public int size() {
104+ int cnt = 0;
105+ Iterator<Entry<RowKey, RowValues>> ite = iterator();
106+ while (ite.hasNext()) {
107+ ite.next();
108+ cnt++;
109+ }
110+ return cnt;
111+ }
112+ };
113+ }
114+
115+ public static int getRef() {
116+ return ref;
46117 }
47118 }
--- a/src/textkeymatcher/ui/TextKeyMatcherView.form
+++ b/src/textkeymatcher/ui/TextKeyMatcherView.form
@@ -15,7 +15,7 @@
1515 </DimensionLayout>
1616 <DimensionLayout dim="1">
1717 <Group type="103" groupAlignment="0" attributes="0">
18- <Component id="dataViewTableSP" alignment="0" pref="391" max="32767" attributes="0"/>
18+ <Component id="dataViewTableSP" alignment="0" pref="392" max="32767" attributes="0"/>
1919 </Group>
2020 </DimensionLayout>
2121 </Layout>
@@ -296,7 +296,7 @@
296296 <DimensionLayout dim="0">
297297 <Group type="103" groupAlignment="0" attributes="0">
298298 <Group type="102" alignment="1" attributes="0">
299- <Component id="statusMessageLabel" pref="225" max="32767" attributes="0"/>
299+ <Component id="statusMessageLabel" pref="235" max="32767" attributes="0"/>
300300 <EmptySpace max="-2" attributes="0"/>
301301 <Component id="progressBar" min="-2" max="-2" attributes="0"/>
302302 <EmptySpace max="-2" attributes="0"/>
--- a/src/textkeymatcher/ui/TextKeyMatcherView.java
+++ b/src/textkeymatcher/ui/TextKeyMatcherView.java
@@ -38,6 +38,7 @@ import javax.swing.KeyStroke;
3838 import javax.swing.table.DefaultTableCellRenderer;
3939 import org.jdesktop.application.Application;
4040 import textkeymatcher.TextKeyMatcherApp;
41+import textkeymatcher.entity.FilteredRowMap;
4142 import textkeymatcher.io.DocArchive;
4243 import textkeymatcher.io.FileDocArchive;
4344 import textkeymatcher.service.LineDataBuilder;
@@ -602,6 +603,7 @@ public class TextKeyMatcherView extends FrameView implements ExitListener {
602603 */
603604 @Override
604605 public void willExit(EventObject event) {
606+ logger.log(Level.INFO, "ref={0}", new Object[] {FilteredRowMap.getRef()});
605607 logger.log(Level.INFO, "willExit");
606608 }
607609
--- a/src/textkeymatcher/ui/model/DataViewTableModel.java
+++ b/src/textkeymatcher/ui/model/DataViewTableModel.java
@@ -7,10 +7,15 @@ package textkeymatcher.ui.model;
77 import java.beans.PropertyChangeListener;
88 import java.beans.PropertyChangeSupport;
99 import java.io.IOException;
10+import java.util.Map;
1011 import org.apache.commons.lang3.StringUtils;
12+import textkeymatcher.entity.DisplayMode;
13+import textkeymatcher.entity.FilteredRowMap;
1114 import textkeymatcher.entity.KeyMatchedRowMap;
1215 import textkeymatcher.entity.KeyMatchedRowView;
1316 import textkeymatcher.entity.LineDataList;
17+import textkeymatcher.entity.RowKey;
18+import textkeymatcher.entity.RowValues;
1419 import textkeymatcher.io.DocArchive;
1520 import textkeymatcher.io.TextKeyMatcherDoc;
1621 import textkeymatcher.entity.KeyMatcher;
@@ -27,17 +32,37 @@ public class DataViewTableModel extends KeyMatchedRowView implements TextKeyMatc
2732 private PropertyChangeSupport propCng = new PropertyChangeSupport(this);
2833
2934 /**
35+ * キーカラムのカラム名.
36+ */
37+ public static final String COLUMN_NAME_KEY = "key";
38+
39+ /**
3040 * キーマッチング方法のプロパティ名
3141 */
3242 public static final String PROPERTY_KEY_MATCHER = "keyMatcher";
3343
3444 /**
45+ * 表示モード(行フィルタ方法)のプロパティ名
46+ */
47+ public static final String PROPERTY_DISPLAY_MODE = "displayMode";
48+
49+ /**
50+ * データ変更フラグ.<br>
51+ */
52+ public static final String PROPERTY_DIRTY = "dirty";
53+
54+ /**
3555 * 取り込んだデータソースや、キーマッチングなどを決定している
3656 * データマップ
3757 */
3858 private KeyMatchedRowMap rowMap = new KeyMatchedRowMap();
3959
4060 /**
61+ * データマップのカラムの関係により行の表示有無を切り替える.
62+ */
63+ private DisplayMode displayMode = DisplayMode.ALL;
64+
65+ /**
4166 * ダーティフラグ.<br>
4267 * データソースが追加・クリアされるか、キーマッチャが変更されると設定される.<br>
4368 * 一度設定されると、明示にクリアされるまで維持される.<br>
@@ -86,7 +111,7 @@ public class DataViewTableModel extends KeyMatchedRowView implements TextKeyMatc
86111 public void setDirty(boolean dirty) {
87112 boolean oldValue = this.dirty;
88113 this.dirty = dirty;
89- propCng.firePropertyChange("dirty", oldValue, dirty);
114+ propCng.firePropertyChange(PROPERTY_DIRTY, oldValue, dirty);
90115 }
91116
92117
@@ -164,7 +189,7 @@ public class DataViewTableModel extends KeyMatchedRowView implements TextKeyMatc
164189 @Override
165190 public String getColumnName(int i) {
166191 if (i == 0) {
167- return "Key";
192+ return COLUMN_NAME_KEY;
168193 }
169194 int column = i - 1; // 左端はキーカラム固定
170195 String title = rowMap.getTitle(column);
@@ -226,4 +251,26 @@ public class DataViewTableModel extends KeyMatchedRowView implements TextKeyMatc
226251 rowMap.remap();
227252 renumbering(rowMap);
228253 }
254+
255+ public void setDisplayMode(DisplayMode displayMode) {
256+ if (displayMode == null) {
257+ throw new IllegalArgumentException();
258+ }
259+ DisplayMode oldValue = this.displayMode;
260+ this.displayMode = displayMode;
261+
262+ if (displayMode != oldValue) {
263+ propCng.firePropertyChange(PROPERTY_DISPLAY_MODE, oldValue, displayMode);
264+ renumbering(rowMap);
265+ }
266+ }
267+
268+ public DisplayMode getDisplayMode() {
269+ return displayMode;
270+ }
271+
272+ @Override
273+ public void renumbering(Map<RowKey, RowValues> dataMap) {
274+ super.renumbering(new FilteredRowMap(dataMap, displayMode));
275+ }
229276 }
--- /dev/null
+++ b/src/textkeymatcher/ui/model/DisplayModeBinder.java
@@ -0,0 +1,149 @@
1+/*
2+ * To change this template, choose Tools | Templates
3+ * and open the template in the editor.
4+ */
5+package textkeymatcher.ui.model;
6+
7+import java.beans.PropertyChangeEvent;
8+import java.beans.PropertyChangeListener;
9+import java.util.logging.Logger;
10+import org.jdesktop.application.AbstractBean;
11+import textkeymatcher.entity.DisplayMode;
12+
13+/**
14+ * メニューのチェックボックス付きメニューアイテムでディスプレイモード(RowFilter)を切り替えるのに便利なように
15+ * バインドをサポートします.<br>
16+ * setFoo(boolean)では、引数enableがtrueである場合のみ設定されます.<br>
17+ * 引数がfalseの場合は単に無視して解除しません.別のタイプがsetでenableされたときに変更されます.<br>
18+ *
19+ * @author osabe_masashi
20+ */
21+public class DisplayModeBinder extends AbstractBean {
22+
23+ /**
24+ * ロガー
25+ */
26+ private static final Logger logger = Logger.getLogger(DisplayModeBinder.class.getName());
27+
28+ /**
29+ * キーマッチャをもつ実体オブジェクト
30+ */
31+ private DataViewTableModel tableModel;
32+
33+
34+ /**
35+ * 実体オブジェクトを設定します.<br>
36+ * プロパティ変更リスナーがセットアップされます.<br>
37+ * @param tableModel
38+ */
39+ public void bindDataViewTableModel(DataViewTableModel tableModel) {
40+ if (tableModel == null) {
41+ throw new IllegalArgumentException();
42+ }
43+ this.tableModel = tableModel;
44+ this.tableModel.addPropertyChangeListener(new PropertyChangeListener() {
45+ @Override
46+ public void propertyChange(PropertyChangeEvent pce) {
47+ tableModelPropertyChanged(pce);
48+ }
49+ });
50+ }
51+
52+ /**
53+ * キーマッチャが変更されたことを通知される.<br>
54+ * @param pce プロパティ変更イベント
55+ */
56+ protected void tableModelPropertyChanged(PropertyChangeEvent pce) {
57+ String propertyName = pce.getPropertyName();
58+ if (DataViewTableModel.PROPERTY_DISPLAY_MODE.equals(propertyName)) {
59+ changeDisplayMode(
60+ (DisplayMode) pce.getOldValue(),
61+ (DisplayMode) pce.getNewValue()
62+ );
63+ }
64+ }
65+
66+ protected DisplayMode getDisplayMode() {
67+ if (tableModel == null) {
68+ throw new IllegalStateException("先にsetDataViewTableModelで設定しておく必要があります.");
69+ }
70+ return tableModel.getDisplayMode();
71+ }
72+
73+ protected void setDisplayMode(DisplayMode displayMode) {
74+ if (tableModel == null) {
75+ throw new IllegalStateException("先にsetDataViewTableModelで設定しておく必要があります.");
76+ }
77+ tableModel.setDisplayMode(displayMode); // thisにも変更通知がくることを想定
78+ }
79+
80+ private void changeDisplayMode(DisplayMode oldValue, DisplayMode newValue) {
81+ boolean oldAll = oldValue == DisplayMode.ALL;
82+ boolean oldMatched = oldValue == DisplayMode.MATCHED;
83+ boolean oldUnmatched = oldValue == DisplayMode.UNMATCHED;
84+ boolean oldExistsFirst = oldValue == DisplayMode.EXISTS_FIRST_COLUMN;
85+ boolean oldMissingFirst = oldValue == DisplayMode.MISSING_FIRST_COLUMN;
86+
87+ boolean newAll = newValue == DisplayMode.ALL;
88+ boolean newMatched = newValue == DisplayMode.MATCHED;
89+ boolean newUnmatched = newValue == DisplayMode.UNMATCHED;
90+ boolean newExistsFirst = newValue == DisplayMode.EXISTS_FIRST_COLUMN;
91+ boolean newMissingFirst = newValue == DisplayMode.MISSING_FIRST_COLUMN;
92+
93+ firePropertyChange("all", oldAll, newAll);
94+ firePropertyChange("matched", oldMatched, newMatched);
95+ firePropertyChange("unmatched", oldUnmatched, newUnmatched);
96+ firePropertyChange("existsFirstColumn", oldExistsFirst, newExistsFirst);
97+ firePropertyChange("missingFirstColumn", oldMissingFirst, newMissingFirst);
98+ }
99+
100+ public void setAll(boolean enable) {
101+ if (enable) {
102+ setDisplayMode(DisplayMode.ALL);
103+ }
104+ }
105+
106+ public boolean isAll() {
107+ return getDisplayMode() == DisplayMode.ALL;
108+ }
109+
110+ public void setMatched(boolean enable) {
111+ if (enable) {
112+ setDisplayMode(DisplayMode.MATCHED);
113+ }
114+ }
115+
116+ public boolean isMatched() {
117+ return getDisplayMode() == DisplayMode.MATCHED;
118+ }
119+
120+ public void setUnmatched(boolean enable) {
121+ if (enable) {
122+ setDisplayMode(DisplayMode.UNMATCHED);
123+ }
124+ }
125+
126+ public boolean isUnmatched() {
127+ return getDisplayMode() == DisplayMode.UNMATCHED;
128+ }
129+
130+ public void setExistsFirstColumn(boolean enable) {
131+ if (enable) {
132+ setDisplayMode(DisplayMode.EXISTS_FIRST_COLUMN);
133+ }
134+ }
135+
136+ public boolean isExistsFirstColumn() {
137+ return getDisplayMode() == DisplayMode.EXISTS_FIRST_COLUMN;
138+ }
139+
140+ public void setMissingFirstColumn(boolean enable) {
141+ if (enable) {
142+ setDisplayMode(DisplayMode.MISSING_FIRST_COLUMN);
143+ }
144+ }
145+
146+ public boolean isMissingFirstColumn() {
147+ return getDisplayMode() == DisplayMode.MISSING_FIRST_COLUMN;
148+ }
149+}
--- a/src/textkeymatcher/ui/model/KeyMatcherBinder.java
+++ b/src/textkeymatcher/ui/model/KeyMatcherBinder.java
@@ -12,15 +12,16 @@ import org.jdesktop.application.AbstractBean;
1212 import textkeymatcher.entity.KeyMatcher;
1313
1414 /**
15- * メニューのチェックボックス付きメニューアイテムでキーマッチングを切り替える場合に便利なようにバイントサポートするクラス.<br>
16- * setText/setTextIgnoreCase/setNumericでは、引数enableがtrueである場合のみ設定されます。
15+ * メニューのチェックボックス付きメニューアイテムでキーマッチングを切り替える場合に便利なように
16+ * バイントサポートします.<br>
17+ * setText/setTextIgnoreCase/setNumericでは、引数enableがtrueである場合のみ設定されます.<br>
1718 * 引数がfalseの場合は単に無視して解除しません.別のタイプがsetでenableされたときに変更されます.<br>
1819 * @author seraphy
1920 */
2021 public class KeyMatcherBinder extends AbstractBean {
2122
2223 /**
23- * ロガー`
24+ * ロガー
2425 */
2526 private static final Logger logger = Logger.getLogger(KeyMatcherBinder.class.getName());
2627