prefwindowの伸縮
描画時の動的なレイアウトに頼らず高さを固定で決め打ちしておくにしても、ローカライズするとなれば言語によっては相当に長さが変わることが考えられる。そのため開発中の見た目より倍近い十分な高さを空けておくなどという情けない対策をとらざるを得ない。なんとかならないか試行錯誤した末、以下のようなhackに行き着いた。
<prefpane onpaneload="onpaneload();"> <vbox id="descbox"> <description id="desc" width="300">改行されるくらい長い文字列</description> </vbox> </prefpane> <script> function onpaneload() { setTimeout(function(){ var h = document.getElementById("desc").boxObject.height; document.getElementById("descbox").setAttribute("height",h); window.sizeToContent(); },1); } </script>
なんらかの原因によってsizeToContentが複数行になりうるコンポーネントの高さを一律一行であるとみなして全体の高さを計算してしまっているようなので、文字列のサイズとは無縁なboxで囲んであげた。DOMInspectorで見たところboxObject.heightはコンポーネントが改行した後の高さを保持してくれているようなので、これを後からboxへ伝えてやる。然る後、sizeToContentし直してあげているという仕組みである。
これでbabelzillaで訳を短くするよう努めてくれなんて注意書きをしなくて済むというものだ。