about:config風の設定画面をつくる
設定画面にも色々あるけど、設定項目が山のようにあってもそれなりに使いやすいものとして、Firefoxのabout:configがある。ただ、about:configそのままだと設定項目の解説が必要なので、各行に備考を追加したものを考えてみる。
まずmxmlの設定。肝要はこんな感じ。editableは親をtrueにしないと、子を設定しても意味がない。
<mx:VBox id="tn1" label="詳細設定" width="100%" height="100%"> <mx:TextInput id="searchbox" width="100%" /> <mx:DataGrid id="dg" width="100%" height="100%" dataProvider="{setvalue}" sortableColumns="true" editable="true" verticalScrollPolicy="on" > <mx:columns> <mx:DataGridColumn headerText="設定名" dataField="path" editable="false" width="100" /> <mx:DataGridColumn headerText="設定値" dataField="value" editable="true" width="40" /> <mx:DataGridColumn headerText="備考" dataField="remarks" editable="false" width="70" /> </mx:columns> </mx:DataGrid> </mx:VBox>
そして、設定ファイルのxmlをsetvalueに突っ込むわけだが、pathはドット区切りにしたいので、XPathなんかは使えない(それ以前に番号による参照が出てきてpathにするには結構汚い)ので、独自に作る。
rootのxmlだけを引数として投げると、pathをキー、対応するXMLを値とした連想配列を返す。
public function extractPathes(src : XML, path : String = "") : Object { var map : Object = { }; if (src.hasSimpleContent()) { map[path + src.localName()] = src; return map; } path += src.localName() + "."; for each(var xml : XML in src.children()) { mergeObjects(extractPathes(xml, path), map); } return map; }
設定xmlは全体を
こんな感じで得た連想配列をsetvalueに加えてやればいい。あと、連想配列なのでデフォルトの並び順はアルファベット順ではない。だから、ソートフィールドをつくってやる。
var sort : Sort = new Sort(); sort.fields = [new SortField("path", true)]; setvalue.sort = sort; setvalue.refresh();
これでDataGridのほうは完成。次は検索欄。Thread使用前提なのは勘弁><
event(gc.searchbox, Event.CHANGE, onChange);
を仕掛ける。
ArrayCollectionにはfilterFunctionなるおいしい機能があるので、これを使う。
private function onChange(e : Event) : void { gc.setvalue.filterFunction = function(item : Object) : Boolean { return item.path.indexOf(gc.searchbox.text) != -1; }; gc.setvalue.refresh(); next(run); }