log
SWT_AWT.new_Frameの引数にshellを渡すと怒られる。そこでnew Composite(shell, 0)を渡してみると、やっぱり怒られる。new Composite(shell, SWT.BORDER)でも怒られる。new Composite(shell, SWT.EMBEDDED)ならOK。このあたりの引数の意味をよく理解できていない。[PDF] SWT 3.0 新機能解説には「親となるCompositeにはSWT.EMBEDDEDを指定せねばならない」ということが書いてあり、どうもSWT_AWTを使えるようにするためにSWTに開けた穴のような雰囲気。まぁ、知っていれば別になんということはない。
キャンバスをAWT化。 とりあえず動くところまで行くために、DrawOnPaintとResizeListenerはコメントアウト。背景画像の設定機能と描画されたものを保存する機能もコメントアウト。 一応コンパイルは通るようになったが、グラフを表示するとLinearEdgeがSWTのみ対応なのでエラー。AWT版を作ってあったので差し替え。
SWTのtextExtent(foo)に相当するのはgetFontMetrics().stringWidth(foo)とgetFontMetrics().getHeight()
BoxVertexのアドホックな「自分自身へのリンクを描画」機能をコメントアウト。
一応表示された。頂点が真っ黒で、ラベルの表示される位置がずれている。
AWTはsetColorの引数がnullの時に例外を投げずに真っ黒にする。
FontMetrics (Java 2 Platform SE 5.0)。あー。SWTで文字を表示した場合は指定したポイントに左上隅が来るが、AWTではベースラインの左端が来る。 正解はy + gc.getFontMetrics().getAscent()。
マウスイベント周りは、もともとAWT・SWT共通にすることを目指して設計したおかげで、まったく無修正でスルー。 SWT系のインターフェイスのimplementsを外したけど、外さなくてもよかったのかも。あ、でも外しておかないとアプレットを作るときにswt.jarを要求されるのか…。
とりあえずローカルで動く本体もキャンバスがAWTになったので、当分SWT系のはいらない。必要になるまであえてサポートしない方針で。
あー。AWTになったからメタキーの表現が変わってるんだ…。
「if((mask & 0x40000) > 0){ // ctrl」なんてのがあちこちにあるのは美しくないので、どのメタキーが押されているかを判断するクラスを作成しよう。
現状のスパゲッティな起動
config.pyにDEFAULT_START_SCRIPTって項目を入れて、それでstart.pyを指定しよう。例えばその項目をnarVisualizer.pyに書き換えると、起動時にNarVisualiserモードで起動するようになる。起動時のコマンドライン引数でスクリプトが渡された場合にはDEFAULT_START_SCRIPTを無視して渡された方を起動。
initMenu.pyも割と酷いことになっている。
プラグインでメニューに項目を追加したい。
今はMenuWrapperっていう、楽にメニューの項目が追加できるだけのオブジェクトなのだけど、あとあとスクリプトからのメニューの追加ができるようなMenuMediatorになるべきか。
MouseMediatorをJavaではなくPythonで実装。
整理しようと試行錯誤して、Editメニューをそれぞれ別のモジュールに切り分けてその中でメニューを作成していたのを撤回。そもそもEditメニューの一部の「メニューを押されたときの実装がPythonで書かれているもの」がinitMenu.pyにその定義まで書かれているのが目障りだったので切り分けようとしたのだけど、メニューの作成まで別のモジュールに切り分けたせいでわかりにくくなってしまったのだ。修正版では、動作の定義だけを別モジュールに置いて以下のように使う。
前よりはマシになったけど、これでカンペキかと言われると自信がないなぁ。
でもMouseMediatorはいい感じ。Cascadeを追加した際に、それをハッシュに入れていくので、後からでも「Editメニューの下に新しいメニューボタンを追加」なんてのができる。あと、もともとSWTだけを使っていたときに作ったMenuWrapperと、さらにPythonでアクセレータを追加しやすいようにもう一枚皮をかぶせたaddMenu関数とが統合されてひとつになったのでだいぶ読みやすくなった。パラメータが色々変わるものはやっぱりPythonで書く方がすっきりするね。仮にパラメータが5つあってそれぞれにデフォルトの値があって、可能な限り省略して指定したいなんて場合、JavaでやるよりPythonでやるほうがだいぶ楽。
__
pluginsフォルダ内のinit.pyって名前のPythonスクリプトを全部実行、ってのをJavaで書くつもりだったのだけど、Pythonで書けばいいじゃんと気がついて
Python楽だ。
__
Jythonだとこうなるのか。
__
プラグインで取り外し可能にしておきたかったのだけど、インタプリタ自体を
mmed.addCascade(_("&Edit"), "Edit")
from menu.blodenSelection import func
mmed.addMenu(_("bloden selection"), func)
from menu.selectWithCaption import func
mmed.addMenu(_("select vertex with its caption"), func)
mmed.addMenu(_("make group selected vertex"), ma.MA_Grouping())
import os
for (root, dirs, files) in os.walk("plugins"):
for f in files:
if f == "init.py":
execfile(os.path.join(root, f))
import os
def func(args, root, items):
for f in items:
if f == "init.py":
execfile(os.path.join(root, f))
os.path.walk("plugins", func, None)
console = new JyConsole();
JInteractiveInterpreter pyi = console.getPythonInterpreter();
とやってしまう方がパフォーマンスがよさそう。
うーん。
リフレクションを使えば「JyConsoleがあればそれを使い、なければJythonのPythonInterpreterを使う」ってのはできそうだけど、JyConsoleがQPLってだけでそこまでして切り離す必要性があるのかどうかが謎。底までする必要はないとは思うんだけどねぇ。ああ、そうか、作者に確認するべきなのか。