OpenDolphin

2020年9月 4日 (金)

スタンプの簡易表示

できるだけ無駄な処方はしないように気をつけているが,それでもどうしても処方薬が増えてしまう場合がある。そうすると,スタンプが増えて,画面をスクロールしないと全体が確認できなくなってしまう。

そこで,スタンプを簡易表示する j2html コードを追加して,スクロールせずに全体を確認できるようにしてみた。⌘-T を押す毎に通常表示と簡易表示が切り替わるようにした。

Normal ⌘T
Simple_20200903190401

2020年7月26日 (日)

Java 1.8.0_261 での apple.awt.brushMetalLook

これまでずっと java 8 を 11 にバージョンアップせず使っている。その唯一の理由は,java 11 でウインドウのタイトルが unified にならないことであった。java 8 だと "apple.awt.brushMetalLook" を true に設定することで,title bar と tool bar が連続した美しいウインドウにできる。いや,できていた。

それが,1.8.0_261 から java 11 と同じになってしまったのである。悲しすぎる。java 11 に移行する潮時なのか。

251

2020年7月23日 (木)

Undo の充実 (4) StampEditor, StampTree

次に,StampEditor の undo を実装した。StampEditor の TableModel である ObjectReflectTableModel を extend した UndoableObjectRelflectTableModel に undoable... な method を作成し,おまとめ undo 機能も組み込んだ。ObjectReflectTableModel を使っていた AllergyInspector と PhysicalInspector も undoable にすることができた。

最後に StampTree を undoable にした。StampTree の TableModel である StampTableModel に同様の undoable な method を組み込んで undo できるようにした。

これでほとんどの操作が undo 可能となったと思う。

2020年7月22日 (水)

Undo の充実 (3) AtokListener

ATOK には,確定直後に ctrl-delete を押すと,未確定状態に戻してくれる「確定アンドゥ」という便利な機能がある。しかし JTextPane でこの操作を行うと,前の確定文字が消えずに未確定文字列が確定文字列の後ろに出る状態になってしまう(下図)。また,間違って半角アルファベットで打ち込んでしまった文を,かなキーの2度打ちでひらがなに戻して変換したり,間違って打ち込んでしまった英単語を,英数キーの2度打ちで半角アルファベットに変換してくれる機能も便利なのだが,これも JTextPane だともとの文字が残ってしまっていた

Atoklistener

ずっと何とかならないかと思っていたのだが,今回 TextComponentUndoManager に【おまとめ undo】機能を付けたので,ATOK の確定アンドゥと同時に JTextPane に undo を1回かけてやれば,前の確定文字列を消せるのではないかと思いついた。KeyListener と InputMethodListener を組み込んだ AtokListener を作って,上記動作をプログラムしたところうまく動作した。頑張ってプログラムしたおかげで日本語入力環境がぐっと便利になった。

Atok

2020年7月21日 (火)

Undo の充実 (2) TextComponentUndoManager

これまで KarteEditor の JTextPane に TextComponentUndoManager を付けて undo ができるようにしてあったが,機能的には入力を1段階戻すだけの単純なものであった。

そのため,例えばスタンプを DnD で移動した場合,【ドロップしたスタンプを書き込む】【位置や改行などの調節】【元のスタンプを削除する】という一連の操作が行われるので,これを undo すると,undo 1回毎に【元のスタンプが復活】【改行などの調節が戻る】【ドロップしたスタンプが消える】と戻っていくことになる。できれば DnD の操作はまとめて1回で undo したいところである。また,英単語を打つ場合【english word】と打った後に undo すると,【english wor】【english wo】【english w】と1文字ずつ戻ることになる。ここはできれば,単語毎にまとめて消えて欲しいところである。

そこで,まず TextComponentUndoManager に Timer を組み込んで,短時間 (30 msec 以内) に連続しておきた操作は,1つにまとめてから UndoManager に登録するようにした。これによって DnD は1回の undo で戻るようになり,ATOK の漢字変換後の入力も,変換して入力した分が1回の undo で戻るようになった。また,アルファベット入力の場合は, 前の入力をチェックして,アルファベットだった場合は前の undo 情報にマージするようにして,word 単位の undo ができるようにした。

Textcomponent_20200720082001

2020年7月20日 (月)

Undo の充実 (1) StampHolder/SchemaHolder

これまで,DiagnosisDocumentTableModelTextComponentUndoManager で,病名編集とカルテ編集を undo できるようにしていたが,その他もろもろの機能は undo できないままであった。今回がんばって undo 機能をいろいろつけてみた。

まずは StampHolder/SchemaHolder の undo 対応をプログラムした。StampHolder/SchemaHolder のモデル更新を updateModel() というメソッドで実行するようにして,ここを AbstractComponentHolder の undoableUpdateModel() メソッドでフックして,StampHolder/SchemaHolder からここを呼んで undo 情報をとる方式にした。具体的な undo 処理は AbstractComponentHolder で行うことにより,StampHolder/SchemaHolder の両方の undo ができるようになった。

Componentholder

2020年6月 2日 (火)

簡易スタンプ編集機能

スタンプ編集に関して,これまで当院のカスタマイズでは,スタンプ選択後にダブルクリック or スペースキーでスタンプエディタを立ち上げる方法と,右クリックでコンテクストメニューを表示して編集する機能があった。

Editor   Popup

今回それに加えて,スタンプ選択後に数字キーを押して簡単な編集ができるようにしてみた。スタンプを選択して数字キーを押すと小さなテキストボックスが現れて数字が入力できるようになる。数字を入力して enter を押すと,内服薬の場合は日数を,外用剤の場合は処方量を変更することができる。

Screen_20200531190201

2020年5月28日 (木)

Google Calendar API の利用

当院では休日・休診情報を Google Calendar で管理して,ホームページ上で公開している。 OpenDolphin のカレンダーでも休日・休診情報を表示できるようにカスタマイズしていたが,表示データはプログラム内にハードコーディングであった。これを Google Calendar から情報を読み込めるようにして,データを Google Calendar で一元管理できるようにしてみた。

Google Calendar には Calendar API というのが用意されており,利用しやすいように主要言語のチュートリアルまで用意されている。そこに出ている java のサンプルを参考にしてプログラムした。Calendar API の認証にはブラウザが必要になるのだが,当院のサーバは CUI でブラウザは使えない。そこで,診察室のクライアントでデータを取込み,それをサーバに保存して,そのデータを全クライアントで利用するという方式にした。

CalendarSettingPanel で Calendar API からデータを取り込み,それをサーバに保存する。サーバ側ではわざわざ Entity を作るのも面倒なので,PnsServiceImpl の Preferences に保存するという素人丸出しの方法を使った。保存したカレンダー情報は,各クライアントが起動時にサーバから読み込む。

Settingpanel   Calendar

2020年5月11日 (月)

病名検索フィールドをカルテ検索と併用する

JWindow バージョンの JSheet を作っていい気になっていたら,mac だと JWindow の JTextField にうまくフォーカスが取れないことが判明してしまった。これではカルテ検索ダイアログが使えないではないか。

JWindow,JTextField のソースを読んでいろいろ試してみたがうまくいかず (native 領域の問題っぽい),どうしたものかと考えあぐねていたところ,ふと病名検索フィールドが目に付き,検索ダイアログをあきらめてこれを使ったらよいのではないかと思いついた。早速,⌘F でカルテ検索,⇧⌘F で病名検索ができるように切り替えるプログラムを書いた。結果的に無駄なダイアログを一つ廃止できてよかった。

左:JTextField にフォーカスが取れないダイアログ,右:ダイアログを廃止,⌘F でカルテ検索に切り替わるようにした

1_20200510204001  2_20200510204201

⇧⌘F で元々の病名検索モードに切り替わる

3_20200510204401  4

2020年5月 6日 (水)

JWindow を使った JSheet

mac のダイアログは,タイトルバーのあたりからせり下がってくる Sheet という方式になっている。これを java でシミュレートするために,JDialog を undecorated にしたウインドウを使っていた。しかしこれには,JDialog が表示されると親フレームがフォーカスを失って,タイトルバーがグレーアウトされてしまうという,かっこよくない欠陥があった。

JDialog ではなく,JWindow を使えば,親フレームを active にしたままダイアログが出せるのであるが,JWindow を modal にする方法がわからず,ずっと pending になっていた。

時間があるときに JDialog のソースを読んで,modal をどのように実現しているのかを調べていたのだが,ついに SecondaryLoop というのを発見することができた。これを使って JWindow で modal な JSheet を作った。

左:JDialog によるもの,中:JWindow によるもの,右:アニメーションGIF

1_20200506120001  2_20200506120201  Jsheet

こういう,機能的にはどうでもよいことにこだわるのは,マカーのマカーたる所以である。

より以前の記事一覧