|
■20011228
師走です。でも、時は2001年です。2年もタイムスリップしてしまった。本当、2年間、何をやっていたんだよ、という感じ。念願のWebサイトを作成して、MorePasteも陽の目を浴びさせることになりました。なんだか、不思議な気分。
一応、動作確認をすると、問題がいろいろと出てくるもんだ。あと、基本構造もマズイ部分が結構ある。この構造で作るのは、今ある機能を全部入れた形で一旦作って、それで終わりかね、という。2年の歳月で成長したどうかは別として、今なら、別の見方ができる、ということさ。JDKの使い方もだいぶ慣れたし。
まず、パスのペースト機能のタブが出ないじゃん。いろいろ見て行くと、そうか、1999年の最後に1.0にするために、機能を落としたんだ。パスのペーストは、機能としては十分に作りこんだんだけど、それだけにプラグイン化の先兵にしようとしちゃったんだよね。とりあえず、プラグイン化はやめにして、入れちゃいましょう。せっかく作ったんだし、プラグインにするなら全体的に作り直してからにするから、だいぶ先になっちゃう。
それと、他の機能については、ちゃんと動作するんだけど、なぜか行の間に、余計な空行が入っちゃう。改行コードが1つ多く挿入してる、ってことなんだけど、なんでだろう。全部が全部、そういう動作をするところを見ると、JDKの差が原因なんだろうか。うーん。これは、細かい動作を見ないとなんとも言えません。
■20020101
あけまして、おめでとうございます。雪の新潟は、今日は雨。山のほうはやっぱり雪なんだろうな。年末に帰ってくるときの高速は吹雪いていて、なんだかすごくストレスフルだったし。
田舎に帰ってまで、空行が入る問題の動作の確認。だって、することないし。それでわかったこと。JDK側の動作は何も変わっていない。変換後の内容確認は、System.outと秀丸、Outlook
Expressの新規メール作成のウインドウへのペーストで行っている。System.outは、空行は入らないんだけど、後の二者は空行が入る。なんでだ?
調べていくと、なんと、どちらも改行するとLFのコードしか出現しないことがわかった。いつからWindowsは改行コードがCR+LFじゃなくて、LFだけになったんだよ。Windows2000が、CR+LFを1文字として扱わなくなったから、秀丸は素直にCRとLFでそれぞれ改行動作をしている、という印象。
秀丸で改行コードをタイトルバーに表示するようにすると、"CR+LF"になっている。だけど、"CR"、"LF"だけで改行していて、だから当然、改行が1つ多いような状態になる。それを再度ペーストしなおすと、全部LFになっちゃう。おいおい、なんで、そんな仕様の変更をしたんだよ。うーん。どうしたものか。
Mac OSもX(テン)で、中身はMachをカーネルに使った立派な?Unixになったし、この際、改行コードはLFに統一、ということかね。困った、こまった。
■20020110
Webサイトから、MorePasteをダウンロードできるようにするために、いろいろと準備をしている。ドキュメントの整備とかが主なんだけど、リファレンスマニュアルなんかは、結構、作り始めると時間がかかっちゃう。今まで、特に機能を定義することなんてせずに、思いつきで作ってきているからねぇ。本当、行き当たり、ばったり。
どうも、やっぱり、クリップボードを経由して処理をするってのは、OSによる動作の違いが出てきそうで、いまいち自信を持って、こう動きます、とは書けない。まぁ、動作を保証するつもりもないんだけどね。
リファレンスを書いていて、タブを空白文字に置き換える機能で、おかしな動作を見つけた。タブ幅を入力して、任意の幅に指定する機能で、数字以外の文字を入力すると動作がおかしくなる。数字以外の場合、デフォルトの「16」に自動的に書き戻して、さらに「4」に選択しなおすようになっているんだけど、その後、テキストボックスの操作が全くできなくなる。
さらに、再び「Other」を指定して、テキストボックスを入力できる状態にしても、キーボードからの操作に反応しない。キーボードリスナがどこかに行っちゃったのかしら。カーソルの動作もあんまりうれしくないし、フォーカスも変だし。うーん。
数字以外の文字を入れた場合、内部的には、例外で処理している。NumberFormatExceptionのcatch節で、テキストボックスの設定の変更とかをしているわけだ。調べてみると、どうも、テキストボックスをsetEnabled(
false )している処理が問題らしい。こういうんじゃぁ、直しようがないな。
結局、仕様を変更することにした。「4」を選択しなおすのはやめにして、「Other」が選択されたままにすることにする。とりあえず、setEnabled(
false )しないから、動作の問題はなくなるし。前の仕様がよかったかというと、なんとも言えないので、まぁ、いいことにしよう。
全く、どういうことなんだろうねぇ。ああぁ、BoxFillも確認してみないと。
■20020111
引き続き、リファレンスマニュアル作成中。動作確認しながら、ってのはなかなか、連続して作業が進まない。やっぱり、チェックして行くと、いろいろ出てくるもんだ。
BoxFillは昨日のうちに動作の確認をしていて、で、問題発見。数字以外の場合については、タブを空白文字で置き換えるのと同じ処理をしていたんだけど、setEnabled()を呼び出していないせいか、目立った動作上の問題は無かった。でも、何となく、0より小さいマイナスの数を入れてみたら、スタックオーバーフローになった。やっぱりね。タブの方も同様。例外は飛ばないんだけど、処理はできない、ってな状況が起こりうるってことね。そりゃそうだ。
PasteQuote、BoxFill、Tab2Spaceは、全て、変換処理が別のクラスになっていて、委譲の関係になっている。タブ幅とか、1行の長さとかは、get/setのメソッドで処理を委譲するクラスに値を設定すようにしている。結局、このsetのメソッドがbooleanを返すようにして、委譲先にチェックさせることにした。UIは、直前にした変換の値に戻すことにしましょ。
Combinationは、追加と削除の動作がどうも自然じゃない。どこが選択されているか、に関係なく、クリックしたアイテムが操作の対象となる。これはこれで、わかりやすいことはわかりやすいんだけど、いまいち、一般的な動作と違うんだよね。何でこんな仕様にしたんだ。まぁ、今となっては知る由も無く。変なの自分で作ったのに。
選択を優先するように動作を変えるとして。複数選択されてる時の、追加の方はどうしたものか。とりあえず、この場合は、クリックされたアイテム優先かなぁ。
■20020114
1.0をリリースしました。やっとスタート。1.0をリリースしたのは、1.1を作り始めるためだからね。1.0の問題は、いろいろ感じていたわけなんだけど、まぁ、早めにリリースしたかったからねぇ。とりあえず、このままで行きます。自分がWindows環境なので、zipで固めて圧縮。問題あれば、その時また考えるということで。
ということで、1.1に向けて修正。早速、手を加えて、「MorePaste.jar」という今まで固定だったファイル名を変えられるようにした。今までファイル名が固定だったのは、「About...」の画像を読み出す処理を自作していて、自分自身をjava.util.jarのクラスに開かせていたためなのさ。
「自分のファイル名を取れないなんて、javaって不便だね」と思っていたんだけど、そんなこと、そもそもする必要なかったんだよね。自分を起動したファイルは、クラスパスに含まれるようになっていて、getClass().getClassLoader().getResource()でjarの中身にアクセス出来ちゃう。後は、そのまま、ImageIconクラスの引数に渡してやればいい。
これって、どこで知ったんだっけな。
■20020120
1.0のCheckBoxListModelのコラムを書いていて、問題があることに気がついた。このクラスは、javax.swing.DefaultListModelを継承している。DefaultListModel自体、内部にVectorを持っていて、新たにフィールドとして追加した2つのVectorとあわせて、3つのコレクションが同じインデックスで関連したデータを保持する構造になっている。
作ったときから、インデックスがずれる、という状況を懸念していて、でも特に何も対策せずに来ていた。1.0のリリース版でもそのまま。1.0じゃ、プログレスバーとか、マルチスレッドな処理はないので、synchronizedにもしてない。でも、まぁ、この際だからしちゃいましょ。ということで、1.0.1かなぁ。
でも、それとは別のインデックスがずれる状況を思いついた。DefaultListModelに型キャストされたとき。継承で作っている以上、ダウンキャストはどうしようもない。自分では、こういう処理はしないだろうからいいんだけど、どこまで対応すべきなのかね。
1.1では、CheckBoxListModelは実装方法を大幅に変えていて、synchronizedブロックにもしているし、インデックスがずれることは心配していないんだけど。それでも、やっぱり継承とダウンキャストの問題は出ちゃう。どうしたものか。
■20020126
先日、Java2 Standard Editionの1.4のRCが出た。ほんの3、4日前。ベータ版の間は何となく入れるのに躊躇してたんだけど、RCならいいでしょ。ということで、インストールして、いくつか機能を試してみた。
JTabbedPaneのスクローラブルなタブは、なかなかいい感じ。やっぱり、タブは1列の方がすっきりして見栄えがいい。MorePasteだと、すべてのタブが一覧できる必要はないからね。まぁ、タブにする必然性もないと言えばないんだけど。本当は、この辺りは、使いやすくするにはどうすればいいのか、ってのをちゃんと考えなきゃいけないんだよな。
そろそろ開発のベースを1.4にしようかね。
ところで、1.4と1.3両対応のMorePasteを作ろうと遊んでいて、どうしようか、ということに出くわした。Javaは、System.getProperty("java.version")でランタイムのバージョンを取得出来る。だけど、この取得できるのが文字列なんだよね。今回なんかは、"1.4.0-rc"。おいおい、よりによってアルファベットまで入ってるのかよ。それじゃぁ、数字にキャストも出来ないじゃないか。
1.4以上だったら、というふうに、大小でバージョンチェックができれば一番処理はしやすい。だけど、多分、バージョンの先頭に数字がくる、ってのも保証されているわけじゃないんだよね。勝手に思い込みで作るわけにもいかないしな。うーん。個々のパッケージでバージョンが衝突したりとか、ランタイム系のバージョン管理については、JavaSoftは仕様作りに手を抜いたとしか言いようがないね。そういうところは、本当、矛盾が噴出してきている感じ。やれやれ。
■20020129
ちょっと時間が出来たので、1.4。MorePasteを1.3と1.4の両対応にする、という話の続き。バージョン確認の話は、とりあえず、System.getProperty("java.version")の先頭の文字をチェックすることでよしとする。もうちょっとユニバーサルな解決法は、またどこかで探すことにしましょ。エレガントなのを誰かが作ってるでしょ。
さっそく、BoxFillのタブで、1行の長さとオフセットの長さを入力するテキストボックスを、1.4の場合はJSpinnerで置き換えるっていう機能を入れてみた。スピンボタンってのは、一時期、流行ったんだよね、Beanの実装の例でさ。本当、そこら中の雑誌でやってた。
JSpinnerってのは、なんでJSpinButtonじゃないのかなと、不思議に思っていた。で、使ってみ納得。理由はボタンじゃないから。JPanelが親で、JFormattedTextFieldとボタンが並んで出来ている。Delphiとかだとさ、IDEの存在が前提になっているから、プロパティシートでテキストフィールドと結びつける、なんてことが簡単に出来ちゃう。だから、ボタンとして定義しておいて問題ないんだろうけど、Javaじゃそういうのはなし、ってことね。今までのとは違って、なんだか高レベルな複合コンポーネントになってます。
それでも作りは素直で、コンストラクタでSpinnerNumberModelのインスタンスを引数に渡してやると、数字が上下するUIが出来上がっちゃう。現在の値とか、最大、最小を設定するのにプリミティブ型で指定できない、ってのは不便。まぁ、これは日付とかリストのスピンボタンとの互換性を考えると、しかたないか。ということで、出来上がり。
こういう高レベルのコンポーネントをどうするかってのは、行番号表示の機能をJarViewで作ったときに、ちょっと考えた。行番号表示は、スクロールバーの存在が前提になるから、結局JScrollPaneが親になっちゃう。いい意味での素直さが、損なわれちゃうような気がして。JavaSoftがこういう作り方をしちゃった、ってのは、ある意味、英断なんだろうけど。
ところで、なんで、MetalのUIなのに、JSpinnerだけWindowsのスタイルなんだ?
なんだかなぁ。
 |