2006 年 10 月 のアーカイブ

qooxdooのappearイベント




















qooxdooのイベントを列挙してみた

全然OKじゃなかった。
appearにしたら、ページ表示時にイベント発生しまくって困った。
TabViewPageをaddしている最中に出るっぽい?
よくわからない。

TabViewButton_1.setChecked(true);

これを入れなければ発生しまくり事態は回避できるみたいだけど…
タブはあらかじめ選択状態にしておきたいし…

で、とりあえずcreateにしてみたら直った。
ちゃんとタブ切り替え時にイベントが発生する。
うーん、謎。

appearの方は発生タイミング調べてみる必要がありそう。


XMLとJavaScriptオブジェクトの変換




















とりあえず、SjaxでのAPIアクセスを汎用的にすべく、APIのレスポンスを連想配列のオブジェクトで返す関数を書く。

XMLをJavaScriptオブジェクトに変換するために[JSAN] XML.ObjTree – XML~JavaScriptオブジェクト変換クラスを使ってみることにした。

accessToAPIwithSjax : function(method, objParams) {
  // SjaxでAPIにリクエスト
  objParams['Method'] = method;
  var myAjax = new Ajax.Request(
    '/api/',
    {
      method: 'post',
      parameters: $H(objParams).toQueryString(),
      asynchronous: false
    }
  );
  var respXml = myAjax.transport.responseXML;
  var xotree = new XML.ObjTree();
  var data = xotree.parseDOM( respXml.childNodes[1] );
  return data;
},

エラーチェックとかはしてないけど。

var result = accessToAPIwithSjax('GetHogehoge', { param1: 'foo', param2: 'bar' });
alert(result.DocRoot.status);

みたいな感じで使える。ボタン押した時のイベントとかで、同期モードアクセスは便利。


Ajax/prototype.jsで同期通信




















prototype.js 1.4でのAjax同期取得

 あぁ、なんだ。XMLHttpRequestオブジェクトのresponseXMLを読めば良かったのか。
で、XMLHttpRequestオブジェクトはtransportを見ればいいのね。

var myAjax = new Ajax.Request(
  url,
  {
    method: 'post',
    parameters: params,
    asynchronous: true,
    onComplete: function(originalRequest) {
      var respXml = originalRequest.responseXML;
      …
    }
  }
);

これが、

var myAjax = new Ajax.Request(
  url,
  {
    method: 'post',
    parameters: params,
    asynchronous: false
  }
);
var respXml = myAjax.transport.responseXML;

こう。

onCompleteの中身を出すだけでほぼ完了。onComplete自体は書いてあっても呼ばれないっぽい。

onLoading: function() {
  alert('onLoading');
},
onCreate: function() {
  alert('onCreate');
},

これらも実行されず。まぁ、しょうがない。


qooxdooのListViewで複数行選択できないようにする




















qx.ui.listview.ListViewのメソッドにセレクションに関するものがなかったので、まさかqx.ui.form.Listの方でしかできないのかと思ってたら、やっぱりできた。

var ListView_1 = new qx.ui.listview.ListView(ld, lc);
ListView_1.getPane().getManager().setMultiSelection(false);

…遠い。

ListView_1.getPane().getManager()の中身はqx.manager.selection.VirtualSelectionManagerのようです。
なるほど、これで選択中のアイテムも取れるワケね。

ちなみにqx.ui.form.Listの方にはgetSelectedItemメソッドがあります。


qooxdooのイベントを列挙してみた





















APIのドキュメントにイベント一覧が見つからなかったので、qx.jsから抜き出して列挙してみる。
treeOpenWithContentとかインターネット全体のGoogle検索でも出なかったし。
つまりアレか。このエントリが唯一引っ掛かるページになるワケか。

MOUSEOVER:"mouseover"
MOUSEMOVE:"mousemove"
MOUSEOUT:"mouseout"
MOUSEDOWN:"mousedown"
MOUSEUP:"mouseup"
MOUSEWHEEL:"mousewheel"
CLICK:"click"
DBLCLICK:"dblclick"
CONTEXTMENU:"contextmenu"
KEYDOWN:"keydown"
KEYPRESS:"keypress"
KEYUP:"keyup"
BLUR:"blur"
FOCUS:"focus"
FOCUSIN:"focusin"
FOCUSOUT:"focusout"
SELECT:"select"
SCROLL:"scroll"
INPUT:"input"
CHANGE:"change"
RESIZE:"resize"
INTERVAL:"interval"
EXECUTE:"execute"
CREATE:"create"
LOAD:"load"
ERROR:"error"
SUBMIT:"submit"
UNLOAD:"unload"
BEFOREUNLOAD:"beforeunload"
TREEOPENWITHCONTENT:"treeOpenWithContent"
TREEOPENWHILEEMPTY:"treeOpenWhileEmpty"
TREECLOSE:"treeClose"
BEFOREAPPEAR:"beforeAppear"
APPEAR:"appear"
BEFOREDISAPPEAR:"beforeDisappear"
DISAPPEAR:"disappear"
BEFOREINSERTDOM:"beforeInsertDom"
INSERTDOM:"insertDom"
BEFOREREMOVEDOM:"beforeRemoveDom"
REMOVEDOM:"removeDom"
DRAGDROP:"dragdrop"
DRAGOVER:"dragover"
DRAGOUT:"dragout"
DRAGMOVE:"dragmove"
DRAGSTART:"dragstart"
DRAGEND:"dragend"
CREATED:"created"
CONFIGURED:"configured"
QUEUED:"queued"
SENDING:"sending"
RECEIVING:"receiving"
COMPLETED:"completed"
ABORTED:"aborted"
FAILED:"failed"
TIMEOUT:"timeout"
DIALOGOK:"dialogok"
DIALOGCANCEL:"dialogcancel"
DIALOGCLOSE:"dialogclose"
DIALOGPREVIOUS:"dialogprevious"
DIALOGNEXT:"dialognext"
DIALOGFIRST:"dialogfirst"
DIALOGLAST:"dialoglast"

で、結局何がしたかったかと言うと、タブの各ページを表示した瞬間にイベント発生させたかったわけです。
どうやらAPPEARがそれに該当する模様。タブボタンのCLICKではうまくいかなかった。

var TabViewPage_1 = new qx.ui.pageview.tabview.TabViewPage(TabViewButton_1);
var TabViewPage_2 = new qx.ui.pageview.tabview.TabViewPage(TabViewButton_2);
var TabViewPage_3 = new qx.ui.pageview.tabview.TabViewPage(TabViewButton_3);
TabView_1.getPane().add(TabViewPage_1, TabViewPage_2, TabViewPage_3);
TabViewPage_1.addEventListener("appear", function(e) {
  alert(e);
});

OK


i18n_ja_jp_hantozen




















PHP3のi18n_ja_jp_hantozenはスペースの半角全角変換の[sS]対応してないのね…

/**
 * mb_convert_kana
 */
if( !function_exists('mb_convert_kana') ) {
 
 function mb_convert_kana( $str, $options = 'KV', $internal_enc = 'EUC-JP' ) {
  
  if (preg_match('/s/', $options)) {
   $str = str_replace(' ', ' ', $str);
  }
  else if (preg_match('/S/', $options)) {
   $str = str_replace(' ', ' ', $str);
  }
  
  return i18n_ja_jp_hantozen( $str, $options, $internal_enc );
  
 }
 
}

第3引数なんか使わねーよという勝手な理由により手抜き実装を施す。


Pivotの欠損ファイル




















separator.gifが404だというログが大量に残っていたのでチェック。

エントリ画面のTinyMCEのツールバーのセパレータ画像が、Pivot 1.3のフルセットに含まれていなかった。

なので、TinyMCEのページから持ってくる。

Pivotの
/extensions/hooks/editor_wysi/themes/advanced/images/separator.gif
に配置して完了。


PhotoshopをVBScriptで操作




















スクリプトでPhotoshopを操作して画像を量産することにした。

とりあえずVBScriptにしておこう。
量産元のテキスト情報がExcelで送られてくるので。

フローとしてはこんな感じ。

  1. 必要なフォントが存在するかチェック
  2. ファイル選択ダイアログを出してExcelファイルを開く
  3. 内容をリストにして取得後、Excelを閉じる
  4. Photoshopを開く
  5. テンプレートデータを開く
  6. テキストレイヤーに流し込む
  7. GIFで保存
  8. 上記2行ひたすら繰り返し

vbsファイル実行して、ダイアログでExcelファイル指定するだけであとは全部自動でできるワケだ。
(゚д゚)ウマー

実装は次回。


GDでのフォント指定




















GDでttc(TrueType Collection font file)ファイルを指定すると、普通に使えるけど、どのフォントが実際使われているか分からないし、設定もできない。
ので、一度バラすことにした。

breakttc.exeを使って分解して、できたttfファイルを指定してImageTTFTextを呼べばOK。

header ("Content-type: image/jpeg");

$im = imagecreatetruecolor (455, 75);
imageantialias ($im, true);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);

$font1 = "./DShirkg7.ttf";

$str = "ほげ\n";
$str = mb_convert_encoding( $str, 'UTF-8', 'EUC-JP' );

ImageTTFText ($im, 13.4, 0, 10, 29, $white, $font1, $str);

ImageJpeg ($im);
ImageDestroy ($im);

こんな感じで。
ImageTTFTextのサイズって普通に小数で指定できたのね。


PHP3の$HTTP_SERVER_VARS




















何か定義されてなかった…orz

getallheaders()とgetenv()で対応。

で、Apacheのモジュール版じゃないとgetallheaders()が使えないので、自前で定義。

if ( !function_exists('getallheaders') ) {
   
    function getallheaders() {
       
        global $HTTP_SERVER_VARS;
       
        if (!empty($HTTP_SERVER_VARS) && is_array($HTTP_SERVER_VARS)) {
            reset( $HTTP_SERVER_VARS );
            while( $each_HTTP_SERVER_VARS = each($HTTP_SERVER_VARS) ) {
                $name = $each_HTTP_SERVER_VARS['key'];
                $value = $each_HTTP_SERVER_VARS['value'];
                if(substr($name, 0, 5) == 'HTTP_')
                    $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
            }
        }
       
        return $headers;
       
    }
   
}