Archive for 3月, 2009

タブの実体を調べる

タブの実体と、TabNavigatorを調べるためにそのソースを調べていくことにします。
ソースはflexをインストールした場所で
framework/src/mx/containers/TabNavigator.as
のような感じであるので、見てみてください。

画面の構成を調べるには・・・

画面の構成を調べるのにたいていは createChildren() という関数内を調べていきます。

if (!tabBar)
{
tabBar = new TabBar();
tabBar.name = "tabBar";

のような記述があります。
この関数内は非常に短いのでわかりやすいと思います。

つまり、TabNavigatorのタブの場所だということがわかります。
TabBarは単独でも使用できるので、そちらの詳細が知りたい方は、Flexのドキュメントで調べることができると思います。

さて、タブを拡張するには、TabBarの中身を見なければわからないということで、この中身を見ていきましょう。
同様に、TabBar.as 内の createChildren() を探していくと・・・ ない。。。。。

んー、では、親クラスを見ていかなければ・・・ということで、このクラスの関係を改めて見てみると・・・
TabBar → ToggleButtonBar → ButtonBar → NavBar → Box → Container → UIComponent
さすがにUIComponent以降は、Flexではあまり関係がないので、ここまでで記述はしません。

さて、最初にcreateChildren()がある場所を探していくと・・・・

ありました!
NavBarクラスになってありました。

override protected function createChildren():void
{
super.createChildren();

if (dataProviderChanged)
{
createNavChildren();
dataProviderChanged = false;
}
}

でも、結局中身は createNavChildren() だとわかりました。
このメソッドをしらべると、privateメソッドのようです。

中身を調べていくと・・・・・

ありました。何やら怪しい記述が

navItem = Button(createNavItem(label, icon));

おー、タブって、結局ボタン関連か・・・ということがわかってきましたね。
でも、中身は何やら craeteNavItem というメソッドで作成しているらしい。

このcreateNavItemはTabBarの中でどうなっているか調べる必要がありそうです。

override protected function createNavItem(
label:String,
icon:Class = null):IFlexDisplayObject
{
var navItem:IFlexDisplayObject = super.createNavItem(label, icon);

DisplayObject(navItem).addEventListener(
MouseEvent.MOUSE_DOWN, tab_mouseDownHandler);

DisplayObject(navItem).addEventListener(
MouseEvent.DOUBLE_CLICK, tab_doubleClickHandler);

return navItem;
}

うん。大したことをやっているわけではなさそうだな。
これを書き換えれば、タブの部分を変更できそうだという感触がついてきました。

でも肝心のButtonのインスタンスを作成しているところが見つかりません。

これは、createNavItemをまた、親クラスをたどってみつけていくしかありませんね。

で、ButtonBarに見つかりました。

override protected function createNavItem(
label:String,
icon:Class = null):IFlexDisplayObject
{
var newButton:Button = Button(navItemFactory.newInstance());

// Set tabEnabled to false so individual buttons don't get focus.

んー、どうやら、navItemFactoryというClassオブジェクトから作成しているようです。

お、これは拡張できそうですね。
TabBar に戻ってみると、

public function TabBar()
{
super();

buttonHeightProp = "tabHeight";
buttonStyleNameProp = "tabStyleName";
firstButtonStyleNameProp = "firstTabStyleName";
lastButtonStyleNameProp = "lastTabStyleName";
buttonWidthProp = "tabWidth";
navItemFactory = new ClassFactory(Tab);
selectedButtonTextStyleNameProp = "selectedTabTextStyleName";
}

とコンストラクタで、Tabクラスを指定しているじゃないですか。

つまり、ここを書き換えれば独自のTabが作成できるということだということがわかりました。

ここまででわかった拡張するためのまとめ

1.Tabを継承し新しいクラスを定義する。
2.TabBarを継承し新しいクラスを定義する。
 このクラスでは、コンストラクタで

navItemFactory = new ClassFactory([1で作成したクラス]);

を定義する。
3.TabNavigatorを継承し、createChildren()ないでTabBarではなく、2で作成したクラスのオブジェクトを使用する。

ということです。
では、次回は各クラスを作成していくことにします。

ItemRenderer を同じmxml内に を用いて作成する際に、そのファイル内で定義している変数ってどうやってアクセスするのか、はまってしまった。

そもそも、調べる時のキーワードがよくわからなかったが、 outerDocumentを使えばいいことがわかった。

詳しくは
http://livedocs.adobe.com/flex/201_jp/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=cellrenderer_072_24.html
にのっています。

munin_tomcat_threads

munin_tomcat_threads

tomcatのスレッドを監視しておかしなスレッドがたまっていないか調べる必要がでてきた。

そこで、muninで監視するスクリプトを見つけたが、ちょっとちがったのと、個別のスレッドの状態までは確認できなかったので、自作しました。
ただ、perlがよくわからんので、そこはまねっこです。

PERL:
  1. use strict;
  2. use Switch '__';
  3.  
  4. my $ret = undef;
  5.  
  6. if(!eval "require LWP::UserAgent;") {
  7.     $ret = "LWP::UserAgent not found";
  8. }
  9.  
  10. if(!eval "require XML::LibXML;") {
  11.     $ret .= "XML::Simple not found";
  12. }
  13.  
  14. my $URL       = exists $ENV{'url'}       ? $ENV{'url'}       : "http://%s:%s\@127.0.0.1:%d/manager/status?XML=true";
  15. my $PORT      = exists $ENV{'ports'}     ? $ENV{'ports'}     : 8080;
  16. my $USER      = exists $ENV{'user'}      ? $ENV{'user'}      : "user";
  17. my $PASSWORD  = exists $ENV{'password'}  ? $ENV{'password'}  : "password";
  18. my $TIMEOUT   = exists $ENV{'timeout'}   ? $ENV{'timeout'}   : 30;
  19. my $CONNECTOR = exists $ENV{'connector'} ? $ENV{'connector'} : "jk-8009";
  20.  
  21. my $url = sprintf $URL, $USER, $PASSWORD, $PORT;
  22.  
  23. if(exists $ARGV[0] and $ARGV[0] eq "autoconf") {
  24.     if($ret) {
  25.     print "no ($ret)\n";
  26.     exit 1;
  27.     }
  28.     my $au = LWP::UserAgent->new(timeout => $TIMEOUT);
  29.     my $repsonse = $au->request(HTTP::Request->new('GET',$url));
  30.     if($repsonse->is_success and $repsonse->content =~ /<status>.*<\/status>/im) {
  31.     print "yes\n";
  32.     exit 0;
  33.     } else {
  34.     print "no (no tomcat status)\n";
  35.     exit 1;
  36.     }
  37. }
  38.  
  39. if(exists $ARGV[0] and $ARGV[0] eq "config") {
  40.     print "graph_title Tomcat current threads ($CONNECTOR) \n";
  41.     print "graph_args --base 1000 -l 0\n";
  42.     print "graph_vlabel current thread / count \n";
  43.     print "graph_category tomcat\n";
  44.     print "parse.label Parse and prepare request \n";
  45.     print "parse.max 150\n";
  46.     print "parse.min 0\n";
  47.    
  48.     print "service.label Service\n";
  49.     #print "service.type DERIVE\n";
  50.     print "service.max 150\n";
  51.     print "service.min 0\n";
  52.  
  53.     print "finishing.label Finishing\n";;
  54.     print "finishing.max 150\n";
  55.     print "finishing.min 0\n";
  56.  
  57.     print "ready.label Ready \n";
  58.     print "ready.max 150\n";
  59.     print "ready.min 0\n";
  60.    
  61.     print "keepalive.label Keepalive\n";
  62.     print "keepalive.max 150\n";
  63.     print "keepalive.min 0\n";
  64.     exit 0;
  65. }
  66.  
  67. my $ua = LWP::UserAgent->new(timeout => $TIMEOUT);
  68. my $response = $ua->request(HTTP::Request->new('GET',$url));
  69. my $xml = XML::LibXML->new->parse_string($response->content);
  70.  
  71. my $pNum = 0;
  72. my $sNum = 0;
  73. my $fNum = 0;
  74. my $rNum = 0;
  75. my $kNum = 0;
  76.  
  77. my @nodeList = $xml->getElementsByTagName('connector');
  78. foreach my $conn (@nodeList){
  79.   my $name = $conn->getAttribute('name');
  80.   if($name eq $CONNECTOR){
  81.     my @workers = $conn->getElementsByTagName('worker');
  82.     foreach my $worker (@workers){
  83.       my $stage = $worker->getAttribute("stage");
  84.       switch ($stage){
  85.     case 'P'    { $pNum++; }
  86.     case 'S'    { $sNum++; }
  87.     case 'F'    { $fNum++; }
  88.     case 'R'    { $rNum++; }
  89.     case 'K'    { $kNum++; }
  90.     else        { }
  91.       }
  92.     }
  93.   }
  94. }
  95.  
  96. print "parse.value $pNum\n";
  97. print "service.value $sNum\n";
  98. print "finishing.value $fNum\n";
  99. print "ready.value $rNum\n";
  100. print "keepalive.value $kNum\n";

FlexでTabNavigator を使った時に各タブにアイコンを表示するにはどうすればいいのか、
ちょっと迷ってしまった。

結局、ソースを見たら各コンテナのiconを設定すればいいということがわかった。

<mx :TabNavigator>
  <mx :Canvas icon="@Embed(.....)" />
</mx>

ってな感じです。
これって、どこかのマニュアルとかに書いてあるのかな・・・・

下の図は、アイコンのところにメールの画像をいれてみました。
各タブで別なものを指定できます。

ちなみに、バツボタンはTabNavigatorを拡張して表示できるようにしたものです。
これも整理したら記述する予定です。

メールのアイコンを表示したところ

メールのアイコンを表示したところ

むかーし、むかーし、SmartDocというXMLを使ってよくドキュメントを描いていたのだが、それをPDF等に簡単にできないものかと、iTextというものを使ってPDF出力するようにプログラムを作成してみたことがあった。

SmartDocは標準でPDF出力(といっても、TexからPDF出力)でき、また、きれいにできるのだが、どうしてもTexにすると、フォントやらなにやらわからないことが多すぎ、また、自分の環境ではエラーになってしまうので、直接PDFにできないものかとおもっていたのだ。

それで2003年ごろにiTextというJavaのPDF出力のライブラリの勉強も兼ねてプログラムを作ってみた。

しかし、当時借りていた500円/月レンタルサーバで契約が切れたのを忘れていて、どこかに行ってしまったのだが、パソコンの整理とともに見つかった。

しかし、バージョンがいつのだかわからない!

まあ、とりあえず現状で、パッケージ名などを変えて更新してみた。

久しぶりに、変換してみたら んー!?な内容です。
あれ、こんなレベルだっけ?

こちらからダウンロード可能です。

RSS
Add to Google

カスタム検索
ソフトウェア&ライブラリ


ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2009年3月
    4月 »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ