一太郎Ark1.1/XML開発の日
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
&size(24){XML開発の日};
このページでは、一太郎Arkの様々な面に焦点を当てて観る内容...
一太郎Arkのソースコード公開や、各種プラグインのソースコー...
第四回XML開発者の日 もっとも遊ぶといっても、16万行のソ...
そこで編集コマンドを拡張するプラグインを書くために必要...
番外編 特集・XML開発者の日 ~一太郎ArkプラグインによるX...
#contents();
//●あらまし
//●一太郎Arkとは
//●一太郎Arkソース公開
//●例題:ツリーフラグメント挿入プラグイン
//●関連情報
//●最後に
**あらまし [#c513bc74]
一太郎Ark[ark]は1999年12月に発売されたジャストシステムの...
一太郎Arkはプラグインによって機能拡張できる特徴があり、実...
しかし2000年5月に一太郎Arkの全ソースコード[src]が公開され...
この発表では一太郎Ark上で複雑なXML文書の編集操作を支援す...
**一太郎Arkとは [#aba54fe6]
一太郎Arkがどんなアプリケーションなのかについて簡単に説明...
***一太郎Arkの「こころざし」 [#q8a7afb3]
一言で言うと...「構造化文書版 Emacs」を目指しています。す...
-プレーンテキストから XML へ
-elisp から Java へ
という方向で文書編集環境を進化させよう、というのがねらい...
***一太郎Arkのアーキテクチャ [#r171ff5c]
全体のアーキテクチャはいわゆる MVC (model-view-controller...
中核となる model 部分では、文書データの内部表現に DOM lev...
&ref(mvc.gif);
**一太郎Arkソース公開 [#rdaacb29]
先述のように一太郎Arkのソースコードが公開されたことで、一...
***ライセンス [#v2517b91]
一太郎Arkおよび標準プラグインのソースコードは「一太郎Ark...
できること:
-開発・評価目的でソースおよびバイナリを利用できます。
-プラグインを開発しそのソースやバイナリを自由に配布できま...
できないこと:
-ソースおよびバイナリの業務利用はできません。(製品版の一...
-ソースおよびバイナリの再配布はできません。
-公開したパッチをジャストシステムが利用することを制限でき...
(但しジャストシステムには製品に組み込んだ場合にパッチ作者...
***プラグインとパッチ [#j0f7a466]
プラグインは動作中の一太郎Arkに動的に追加できるプログラム...
パッチは改変したソースコードとオリジナルソースコードとの...
プラグインには一般ユーザーが利用できること、ライセンス上...
***プラグイン/パッチで何ができるか [#vcb71822]
プラグインによる機能拡張の代表的な例には以下のようなもの...
-編集コマンドの拡張 (例: 特殊文字挿入、XSLT変換)
-ファイル入出力の拡張(例: Word文書読み込み、FTP送受信、Zi...
-表示の拡張(例: SVG表示)
-言語リソースの追加(例: 中国語リソース、韓国語リソース)
もっとも一太郎ArkのプラグインAPIは現状では決して十分整備...
**例題: ツリーフラグメント挿入プラグイン [#qd639bba]
ここでは任意の DOM ツリーフラグメントをカーソル位置に挿入...
なお例題プラグインのソースコード一式とコンパイル済みの ja...
***仕様 [#t3fb8908]
■ 機能
XML で記述されたデータ構造を編集中の文書に挿入します。...
■ 操作
キーカスタマイズファイルにプラグインで追加したカスタム...
■ 設定ファイル
設定ファイルは XHTML 形式で記述します。だいたい以下のよ...
1:<?xml version="1.0"?>
2: <html xmlns="http://www.w3.org/1999/xhtml"
3: xmlns:s="http://www.horobi.com/xmlns/ark/struct">
4: ...
5: <s:structures>
6:
7: <s:struct>
8: <s:metainfo>
9: <s:name>構造体その 1</s:name>
10: ...
11: </s:metainfo>
12: <s:contents>
13: ...
14: </s:contents>
15: </s:struct>
16:
17: <s:struct>
18: ...
19: </s:struct>
20:
21: </s:structures>
22: </html>
個々のタグの意味は以下の通りです(プレフィクスを s と仮定...
s:structures
ツリーフラグメント定義のリストを表します。s:struct を複...
s:struct
一つのツリーフラグメントの定義を表します。s:metainfo と...
s:metainfo
ツリーフラグメントに関する情報を表します。s:name を複数...
s:name
ツリーフラグメントにつけた名前を表します(メニューに表示...
s:contents
挿入されるツリーフラグメントを表します。任意の内容(要素...
なお、適切なスタイルシートをリンクした設定ファイルは一...
■ 制限
話を簡単にするために例題のプラグインには以下の点は制限事...
-挿入位置が決め打ちになっています。必ずカーソル位置の直近...
-挿入先の文書に挿入元の構造体が使用しているタグセットが含...
***プラグインの作り方 [#d9b4deee]
一太郎Arkのプラグイン作成方法については、一太郎Arkのオフ...
APIの詳細は一太郎Arkソースコードダウンロードサイト[src]で...
■実装方法
編集コマンドを拡張するようなプラグインでは以下のインター...
UIPlugin (jp.co.justsystem.ark.plugin.UIPlugin)
プラグインのメインクラスでは UIPlugin インターフェース...
Action (javax.swing.Action)
メニュー選択やキー入力で実行される動作の定義がActionで...
EditCommand (jp.co.justsystem.ark.model.command.EditComma...
実際に DOM API で DOM ツリーを操作するコードは EditComm...
■キーカスタマイズとの連携
一太郎Arkのメニューで「ツール - オプション...」で出てく...
キーカスタマイズファイルは XML 形式のファイルで、フォーマ...
プラグインで追加したアクションについてもキーカスタマイズ...
1:<?xml version="1.0" encoding="utf-8" ?>
2:<keyConfig>
3: <binding context="document_inputmode" keymap="addKeym...
4: <binding context="document_resizemode" keymap="addKey...
5: <keymap id="addKeymap" >
6: <keymapRef stroke="CTRL+T" idref="CTRL_T_KEYMAP" />
7: </keymap>
8: <keymap id="CTRL_T_KEYMAP">
9: <command stroke="CTRL+G" action="EnterInputMode" />
10: <command stroke="1" action="com_horobi_ark_struct....
11: <command stroke="2" action="com_horobi_ark_struct....
12: </keymap>
13:</keyConfig>
***XML 文書の扱い方 [#h07fe1e8]
設定ファイルで使う XML 文書のロード、編集中の文書内での...
■ 内蔵パーサの使い方
一太郎Arkが内蔵しているXMLパーサ(jp.co.justsystem.io.sa...
必要なコードは 40 行程度ですが、普通の XML パーサなら 4 ...
一太郎Arkの内蔵パーサは単体のXMLパーサとして見るとDTDを全...
ただしDOMパーサで構築したDOMツリーを文書の内部表現に使用...
import org.apache.xerces.parsers.DOMParser;
...
DOMParser parser = new DOMParser();
parser.setDocumentClassName("jp.co.justsystem.ark.mode...
ArkDocument doc = (ArkDocument)parser.getDocument();
■ DOMツリーの「正規化」(ファイル読み込み)
Ark は Ark の編集ポリシーに合わせて XHTML 文書内でのタグ...
XMLDOMTreeNormalizer の挙動は実は文書に埋め込まれた(あ...
001:<html>
002: <head><title>title</title></head>
003: <body xmlns="http://www.w3.org/1999/xhtml"
004: xmlns:h="http://foo.bar.baz/hoge">
005: <h:hoge>
006: hoge
007: <h1>heading</h1>
008: hoge
009: </h:hoge>
010: </body>
011:</html>
この文書を XMLDOMTreeNormalizer で正規化すると以下のよう...
001:<html>
002: <head><title>title</title></head>
003: <body xmlns="http://www.w3.org/1999/xhtml"
004: xmlns:h="http://foo.bar.baz/hoge">
005: <h:hoge> hoge </h:hoge>
006: <h1><h:hoge>heading</h:hoge></h1>
007: <h:hoge> hoge </h:hoge>
008: </body>
009:</html>
これは XMLDOMTreeNormalizer が h:hoge タグをインラインタ...
このような事態を回避するには以下のようにして CSS スタイル...
1:<html>
2: <head><title>title</title>
3: <style type="text/css"><![CDATA[
4: h\:hoge { display:block; }
5: ]]></style></head>
6: <body xmlns="http://www.w3.org/1999/xhtml"
7: xmlns:h="http://foo.bar.baz/hoge">
8: <h:hoge> hoge </h:hoge>
9: <h1><h:hoge>heading</h:hoge></h1>
10: <h:hoge> hoge </h:hoge>
11: </body>
12:</html>
■ DOMツリーの「正規化」(編集時)
一太郎Arkでは一部の編集操作の際に、編集コマンドでは直接...
このため、ツリーフラグメント挿入プラグインで空のインライ...
これを回避する簡単な方法はありません。適切なロジックで必...
***編集コマンドの作り方 [#w28fe832]
編集コマンドを正しく実装するには一太郎Arkのコマンド処理シ...
ここではそういったオマジナイの唱え方とその意味を説明しま...
■ コマンド処理の流れ
コマンドの実行はユーザーのメニュー選択やキー入力で始まり...
ここではそういったコマンド処理の流れの概略を説明します。
▼ UIイベント処理
コマンドはユーザーインターフェース(UI)で発生したイベント...
普通のJava アプリケーションでは再描画処理(これは後から再...
具体的にはコマンドオブジェクト(jp.co.justsystem.ark.comma...
▼ コマンドキューイング
コマンドキューの管理は CommandInvoker (jp.co.justsystem.a...
コマンドをキューイングして別スレッドで実行するのは Even...
例えば高速に文字入力した場合、大量に発生した文字挿入コ...
しかし、連続した文字挿入コマンドは一つの文字列挿入コマ...
&ref(command.gif);
コマンドキューイング
▼ 再描画
レイアウト処理が終わるとJavaのGUIシステムに更新部分の再描...
■ 更新通知と再表示
ArkDocument(Ark の Document 実装)には、DOM ツリー更新通知...
DocumentView は DOM ツリーの更新通知を受け取るために Docu...
&ref(m-v.gif);
▼ DOM ツリー更新通知プロトコル
DOM ツリーの更新は DOM ツリーを編集するスレッド内でのメソ...
更新開始イベント (willBeUpdated)
DOM ツリーが更新される直前に発生します。ノード更新通知が...
リスナーは他のスレッドから自分を介した間接的な DOM へのア...
ノード更新イベント (textChenged, elementChanged)
一区切りの DOM ツリー操作が終わる度に発生します。更新内容...
但しこのイベントを処理した後も引き続き DOM ツリー操作が行...
更新終了イベント(updated)
一連の DOM 操作が完了した後で発生します。ここから先は次に...
これらのイベントは以下のような順番と回数で発生します(表記...
&ref(protocol.gif);
willBeUpdated, (textChanged | elementChanged)*, updated
▼ 更新イベント詳細
更新イベントは更新内容によってさらに種類が細分されます。
テキスト更新イベント(TextEvent)
挿入(INSERT)
文字列挿入があった時にテキストノード内の先頭から何文字目...
削除(DELETE)
文字列削除があった時にテキストノード内の先頭から何文字目...
変更(UPDATE)
テキストノードの内容全体が更新されたことを通知するイベン...
要素更新イベント(ElementEvent)
子供挿入(INSERT)
要素にノード挿入があった時に
子供削除(REMOVE)
要素変更(UPDATE)
子孫ノードも含めた要素全体の更新を意味します。
属性変更(ATTRIBUTE)
要素に対する属性の追加/削除、属性値の変更を意味します。
更新イベントの種類は Ark の差分レイアウトエンジンの仕様に...
▼ 更新通知のデフォルト動作
DOM ツリー更新通知の仕組みは Ark の DOM 実装内に埋め込ま...
この時は更新開始イベントから更新終了イベントまでの一揃の...
▼ 更新通知の最適化
デフォルトの更新通知に頼ると更新通知が冗長になり実行効率...
例えば Ark で改行キーを押したとき、DocumentModel では DOM...
このような場合、編集コマンド実装者は更新通知コードを直接...
001:ArkDocument arkdoc = (ArkDocument)document;
002:arkdoc.fireWillBeUpdated();
003:{一連のDOMツリー操作}
004:arkdoc.fireElementChanged(...);
005:{一連のDOMツリー操作}
006:arkdoc.fireElementChanged(...);
007:...
008:arkdoc.fireUpdated();
最適化の方法としては、例えば子孫要素の細々した更新を、親...
例えばArk で改行キーを押した場合は、以下のような手順で二...
カーソル位置の段落内容を切り詰める。
カーソル位置の段落要素の UPDATE イベントを通知。
新しい段落を作り切り詰められた残りをその段落に挿入。
新しい段落をカーソル位置の段落要素の親要素に挿入。
親要素の INSERT イベントを通知。
&ref(cut_up_block.gif);
■ アンドゥ/リドゥ
Ark の編集コマンドは undo/redo をサポートする必要があり...
-DOM ツリーの構造
-カーソル位置
-view の表示(更新通知)
▼ undo/redo の基本
Ark での undo/redo の基本は、操作の逆操作を undo バッファ...
undo 情報を記録するには DocumentModel の postEdit() メソ...
まとめると以下のような順番でメソッド呼び出しを行います。
beginUpdate, postEdit*, endUpdate
▼ DOM 実装のデフォルト動作
Ark の DOM 実装には undo の仕組みが埋め込まれていて、DOM ...
更新通知の最適化をしないなら、キャレット位置の undo 記録...
▼ 更新通知を最適化する場合
更新通知を最適化している場合は更新通知の逆操作を自分で un...
更新通知の undo 情報クラスには以下のものがあります。
TextEventUndoableEdit
テキストノード内の編集操作の更新通知の undo 情報クラス
ElementEventUndoableEdit
要素編集操作の更新通知の undo 情報クラス
UpdatedUndoableEdit
更新開始または更新終了時の更新通知の undo 情報クラス
まずコマンドで実行される一連の DOM ツリー操作の手前と後ろ...
デフォルトの更新通知を無効にしても DOM ツリー操作の undo ...
&ref(undo.gif);
また逆に redo で順操作を行った後は順操作の更新通知が行わ...
undoバッファ
TextEventUndoableEdit と ElementEventUndoableEdit はこの...
▼ カーソル移動の undo/redo
一つ一つのキャレット移動操作は頻繁に(そして気まぐれに)行...
カーソル移動の undo 情報も更新通知の undo 情報と同様の理...
■まとめ
付録のソースコードの InsertBlockStructCommand クラスが編...
TODO:挿入問題
例題とは言いながら使ってみると意外と使えるツリーフラグメ...
実際にこのプラグインを使ってみるとわかりますが、挿入位置...
挿入前 挿入後
<div class="section">
<h2>第一章</h2>
<p>...</p>
</div>
<div class="section">(A)
<h2>(B)第三章</h2>
<p>(C)...</p>
</div>
* かっこ内はカーソル位置を表す
<div class="section">
<h2>第一章</h2>
<p>...</p>
</div>
<div class="section">
<h2>第二章</h2>
<p>...</p>
</div>
<div class="section">
<h2>第三章</h2>
<p>...</p>
</div>
解決策には二通りのアプローチがありそうです。
カーソル移動方式の拡張
通常ツリーの末端にしか止まらないカーソルを、ツリー上の任...
Z軸方向(ノードの親子を辿る方向)のカーソル移動が必要になる...
挿入ルール定義言語による設定
設定ファイル上で挿入するフラグメント毎により複雑な挿入ル...
例えば上の図で言うと(B)の位置にカーソルがある場合は <div ...
そのような設定をするための記述言語を導入する必要がありま...
また、文書系のXMLを編集する場合、挿入操作は DOM API 的に...
** 関連情報 [#ffdb8fde]
[struct] ツリーフラグメント挿入プラグイン
http://www.horobi.com/ark/struct/
[ark] Ark Site
http://www.justsystem.co.jp/ark/
[ples] プラグイン作成講座
http://www.justsystem.co.jp/ark/p_lesson/index.html
[psrc] プラグインソースダウンロード
http://www.justsystem.co.jp/ark/p_source/index.html
** 最後に [#r6143804]
「XML開発者の日」、当日は、参加者の皆様より貴重なフィード...
終了行:
&size(24){XML開発の日};
このページでは、一太郎Arkの様々な面に焦点を当てて観る内容...
一太郎Arkのソースコード公開や、各種プラグインのソースコー...
第四回XML開発者の日 もっとも遊ぶといっても、16万行のソ...
そこで編集コマンドを拡張するプラグインを書くために必要...
番外編 特集・XML開発者の日 ~一太郎ArkプラグインによるX...
#contents();
//●あらまし
//●一太郎Arkとは
//●一太郎Arkソース公開
//●例題:ツリーフラグメント挿入プラグイン
//●関連情報
//●最後に
**あらまし [#c513bc74]
一太郎Ark[ark]は1999年12月に発売されたジャストシステムの...
一太郎Arkはプラグインによって機能拡張できる特徴があり、実...
しかし2000年5月に一太郎Arkの全ソースコード[src]が公開され...
この発表では一太郎Ark上で複雑なXML文書の編集操作を支援す...
**一太郎Arkとは [#aba54fe6]
一太郎Arkがどんなアプリケーションなのかについて簡単に説明...
***一太郎Arkの「こころざし」 [#q8a7afb3]
一言で言うと...「構造化文書版 Emacs」を目指しています。す...
-プレーンテキストから XML へ
-elisp から Java へ
という方向で文書編集環境を進化させよう、というのがねらい...
***一太郎Arkのアーキテクチャ [#r171ff5c]
全体のアーキテクチャはいわゆる MVC (model-view-controller...
中核となる model 部分では、文書データの内部表現に DOM lev...
&ref(mvc.gif);
**一太郎Arkソース公開 [#rdaacb29]
先述のように一太郎Arkのソースコードが公開されたことで、一...
***ライセンス [#v2517b91]
一太郎Arkおよび標準プラグインのソースコードは「一太郎Ark...
できること:
-開発・評価目的でソースおよびバイナリを利用できます。
-プラグインを開発しそのソースやバイナリを自由に配布できま...
できないこと:
-ソースおよびバイナリの業務利用はできません。(製品版の一...
-ソースおよびバイナリの再配布はできません。
-公開したパッチをジャストシステムが利用することを制限でき...
(但しジャストシステムには製品に組み込んだ場合にパッチ作者...
***プラグインとパッチ [#j0f7a466]
プラグインは動作中の一太郎Arkに動的に追加できるプログラム...
パッチは改変したソースコードとオリジナルソースコードとの...
プラグインには一般ユーザーが利用できること、ライセンス上...
***プラグイン/パッチで何ができるか [#vcb71822]
プラグインによる機能拡張の代表的な例には以下のようなもの...
-編集コマンドの拡張 (例: 特殊文字挿入、XSLT変換)
-ファイル入出力の拡張(例: Word文書読み込み、FTP送受信、Zi...
-表示の拡張(例: SVG表示)
-言語リソースの追加(例: 中国語リソース、韓国語リソース)
もっとも一太郎ArkのプラグインAPIは現状では決して十分整備...
**例題: ツリーフラグメント挿入プラグイン [#qd639bba]
ここでは任意の DOM ツリーフラグメントをカーソル位置に挿入...
なお例題プラグインのソースコード一式とコンパイル済みの ja...
***仕様 [#t3fb8908]
■ 機能
XML で記述されたデータ構造を編集中の文書に挿入します。...
■ 操作
キーカスタマイズファイルにプラグインで追加したカスタム...
■ 設定ファイル
設定ファイルは XHTML 形式で記述します。だいたい以下のよ...
1:<?xml version="1.0"?>
2: <html xmlns="http://www.w3.org/1999/xhtml"
3: xmlns:s="http://www.horobi.com/xmlns/ark/struct">
4: ...
5: <s:structures>
6:
7: <s:struct>
8: <s:metainfo>
9: <s:name>構造体その 1</s:name>
10: ...
11: </s:metainfo>
12: <s:contents>
13: ...
14: </s:contents>
15: </s:struct>
16:
17: <s:struct>
18: ...
19: </s:struct>
20:
21: </s:structures>
22: </html>
個々のタグの意味は以下の通りです(プレフィクスを s と仮定...
s:structures
ツリーフラグメント定義のリストを表します。s:struct を複...
s:struct
一つのツリーフラグメントの定義を表します。s:metainfo と...
s:metainfo
ツリーフラグメントに関する情報を表します。s:name を複数...
s:name
ツリーフラグメントにつけた名前を表します(メニューに表示...
s:contents
挿入されるツリーフラグメントを表します。任意の内容(要素...
なお、適切なスタイルシートをリンクした設定ファイルは一...
■ 制限
話を簡単にするために例題のプラグインには以下の点は制限事...
-挿入位置が決め打ちになっています。必ずカーソル位置の直近...
-挿入先の文書に挿入元の構造体が使用しているタグセットが含...
***プラグインの作り方 [#d9b4deee]
一太郎Arkのプラグイン作成方法については、一太郎Arkのオフ...
APIの詳細は一太郎Arkソースコードダウンロードサイト[src]で...
■実装方法
編集コマンドを拡張するようなプラグインでは以下のインター...
UIPlugin (jp.co.justsystem.ark.plugin.UIPlugin)
プラグインのメインクラスでは UIPlugin インターフェース...
Action (javax.swing.Action)
メニュー選択やキー入力で実行される動作の定義がActionで...
EditCommand (jp.co.justsystem.ark.model.command.EditComma...
実際に DOM API で DOM ツリーを操作するコードは EditComm...
■キーカスタマイズとの連携
一太郎Arkのメニューで「ツール - オプション...」で出てく...
キーカスタマイズファイルは XML 形式のファイルで、フォーマ...
プラグインで追加したアクションについてもキーカスタマイズ...
1:<?xml version="1.0" encoding="utf-8" ?>
2:<keyConfig>
3: <binding context="document_inputmode" keymap="addKeym...
4: <binding context="document_resizemode" keymap="addKey...
5: <keymap id="addKeymap" >
6: <keymapRef stroke="CTRL+T" idref="CTRL_T_KEYMAP" />
7: </keymap>
8: <keymap id="CTRL_T_KEYMAP">
9: <command stroke="CTRL+G" action="EnterInputMode" />
10: <command stroke="1" action="com_horobi_ark_struct....
11: <command stroke="2" action="com_horobi_ark_struct....
12: </keymap>
13:</keyConfig>
***XML 文書の扱い方 [#h07fe1e8]
設定ファイルで使う XML 文書のロード、編集中の文書内での...
■ 内蔵パーサの使い方
一太郎Arkが内蔵しているXMLパーサ(jp.co.justsystem.io.sa...
必要なコードは 40 行程度ですが、普通の XML パーサなら 4 ...
一太郎Arkの内蔵パーサは単体のXMLパーサとして見るとDTDを全...
ただしDOMパーサで構築したDOMツリーを文書の内部表現に使用...
import org.apache.xerces.parsers.DOMParser;
...
DOMParser parser = new DOMParser();
parser.setDocumentClassName("jp.co.justsystem.ark.mode...
ArkDocument doc = (ArkDocument)parser.getDocument();
■ DOMツリーの「正規化」(ファイル読み込み)
Ark は Ark の編集ポリシーに合わせて XHTML 文書内でのタグ...
XMLDOMTreeNormalizer の挙動は実は文書に埋め込まれた(あ...
001:<html>
002: <head><title>title</title></head>
003: <body xmlns="http://www.w3.org/1999/xhtml"
004: xmlns:h="http://foo.bar.baz/hoge">
005: <h:hoge>
006: hoge
007: <h1>heading</h1>
008: hoge
009: </h:hoge>
010: </body>
011:</html>
この文書を XMLDOMTreeNormalizer で正規化すると以下のよう...
001:<html>
002: <head><title>title</title></head>
003: <body xmlns="http://www.w3.org/1999/xhtml"
004: xmlns:h="http://foo.bar.baz/hoge">
005: <h:hoge> hoge </h:hoge>
006: <h1><h:hoge>heading</h:hoge></h1>
007: <h:hoge> hoge </h:hoge>
008: </body>
009:</html>
これは XMLDOMTreeNormalizer が h:hoge タグをインラインタ...
このような事態を回避するには以下のようにして CSS スタイル...
1:<html>
2: <head><title>title</title>
3: <style type="text/css"><![CDATA[
4: h\:hoge { display:block; }
5: ]]></style></head>
6: <body xmlns="http://www.w3.org/1999/xhtml"
7: xmlns:h="http://foo.bar.baz/hoge">
8: <h:hoge> hoge </h:hoge>
9: <h1><h:hoge>heading</h:hoge></h1>
10: <h:hoge> hoge </h:hoge>
11: </body>
12:</html>
■ DOMツリーの「正規化」(編集時)
一太郎Arkでは一部の編集操作の際に、編集コマンドでは直接...
このため、ツリーフラグメント挿入プラグインで空のインライ...
これを回避する簡単な方法はありません。適切なロジックで必...
***編集コマンドの作り方 [#w28fe832]
編集コマンドを正しく実装するには一太郎Arkのコマンド処理シ...
ここではそういったオマジナイの唱え方とその意味を説明しま...
■ コマンド処理の流れ
コマンドの実行はユーザーのメニュー選択やキー入力で始まり...
ここではそういったコマンド処理の流れの概略を説明します。
▼ UIイベント処理
コマンドはユーザーインターフェース(UI)で発生したイベント...
普通のJava アプリケーションでは再描画処理(これは後から再...
具体的にはコマンドオブジェクト(jp.co.justsystem.ark.comma...
▼ コマンドキューイング
コマンドキューの管理は CommandInvoker (jp.co.justsystem.a...
コマンドをキューイングして別スレッドで実行するのは Even...
例えば高速に文字入力した場合、大量に発生した文字挿入コ...
しかし、連続した文字挿入コマンドは一つの文字列挿入コマ...
&ref(command.gif);
コマンドキューイング
▼ 再描画
レイアウト処理が終わるとJavaのGUIシステムに更新部分の再描...
■ 更新通知と再表示
ArkDocument(Ark の Document 実装)には、DOM ツリー更新通知...
DocumentView は DOM ツリーの更新通知を受け取るために Docu...
&ref(m-v.gif);
▼ DOM ツリー更新通知プロトコル
DOM ツリーの更新は DOM ツリーを編集するスレッド内でのメソ...
更新開始イベント (willBeUpdated)
DOM ツリーが更新される直前に発生します。ノード更新通知が...
リスナーは他のスレッドから自分を介した間接的な DOM へのア...
ノード更新イベント (textChenged, elementChanged)
一区切りの DOM ツリー操作が終わる度に発生します。更新内容...
但しこのイベントを処理した後も引き続き DOM ツリー操作が行...
更新終了イベント(updated)
一連の DOM 操作が完了した後で発生します。ここから先は次に...
これらのイベントは以下のような順番と回数で発生します(表記...
&ref(protocol.gif);
willBeUpdated, (textChanged | elementChanged)*, updated
▼ 更新イベント詳細
更新イベントは更新内容によってさらに種類が細分されます。
テキスト更新イベント(TextEvent)
挿入(INSERT)
文字列挿入があった時にテキストノード内の先頭から何文字目...
削除(DELETE)
文字列削除があった時にテキストノード内の先頭から何文字目...
変更(UPDATE)
テキストノードの内容全体が更新されたことを通知するイベン...
要素更新イベント(ElementEvent)
子供挿入(INSERT)
要素にノード挿入があった時に
子供削除(REMOVE)
要素変更(UPDATE)
子孫ノードも含めた要素全体の更新を意味します。
属性変更(ATTRIBUTE)
要素に対する属性の追加/削除、属性値の変更を意味します。
更新イベントの種類は Ark の差分レイアウトエンジンの仕様に...
▼ 更新通知のデフォルト動作
DOM ツリー更新通知の仕組みは Ark の DOM 実装内に埋め込ま...
この時は更新開始イベントから更新終了イベントまでの一揃の...
▼ 更新通知の最適化
デフォルトの更新通知に頼ると更新通知が冗長になり実行効率...
例えば Ark で改行キーを押したとき、DocumentModel では DOM...
このような場合、編集コマンド実装者は更新通知コードを直接...
001:ArkDocument arkdoc = (ArkDocument)document;
002:arkdoc.fireWillBeUpdated();
003:{一連のDOMツリー操作}
004:arkdoc.fireElementChanged(...);
005:{一連のDOMツリー操作}
006:arkdoc.fireElementChanged(...);
007:...
008:arkdoc.fireUpdated();
最適化の方法としては、例えば子孫要素の細々した更新を、親...
例えばArk で改行キーを押した場合は、以下のような手順で二...
カーソル位置の段落内容を切り詰める。
カーソル位置の段落要素の UPDATE イベントを通知。
新しい段落を作り切り詰められた残りをその段落に挿入。
新しい段落をカーソル位置の段落要素の親要素に挿入。
親要素の INSERT イベントを通知。
&ref(cut_up_block.gif);
■ アンドゥ/リドゥ
Ark の編集コマンドは undo/redo をサポートする必要があり...
-DOM ツリーの構造
-カーソル位置
-view の表示(更新通知)
▼ undo/redo の基本
Ark での undo/redo の基本は、操作の逆操作を undo バッファ...
undo 情報を記録するには DocumentModel の postEdit() メソ...
まとめると以下のような順番でメソッド呼び出しを行います。
beginUpdate, postEdit*, endUpdate
▼ DOM 実装のデフォルト動作
Ark の DOM 実装には undo の仕組みが埋め込まれていて、DOM ...
更新通知の最適化をしないなら、キャレット位置の undo 記録...
▼ 更新通知を最適化する場合
更新通知を最適化している場合は更新通知の逆操作を自分で un...
更新通知の undo 情報クラスには以下のものがあります。
TextEventUndoableEdit
テキストノード内の編集操作の更新通知の undo 情報クラス
ElementEventUndoableEdit
要素編集操作の更新通知の undo 情報クラス
UpdatedUndoableEdit
更新開始または更新終了時の更新通知の undo 情報クラス
まずコマンドで実行される一連の DOM ツリー操作の手前と後ろ...
デフォルトの更新通知を無効にしても DOM ツリー操作の undo ...
&ref(undo.gif);
また逆に redo で順操作を行った後は順操作の更新通知が行わ...
undoバッファ
TextEventUndoableEdit と ElementEventUndoableEdit はこの...
▼ カーソル移動の undo/redo
一つ一つのキャレット移動操作は頻繁に(そして気まぐれに)行...
カーソル移動の undo 情報も更新通知の undo 情報と同様の理...
■まとめ
付録のソースコードの InsertBlockStructCommand クラスが編...
TODO:挿入問題
例題とは言いながら使ってみると意外と使えるツリーフラグメ...
実際にこのプラグインを使ってみるとわかりますが、挿入位置...
挿入前 挿入後
<div class="section">
<h2>第一章</h2>
<p>...</p>
</div>
<div class="section">(A)
<h2>(B)第三章</h2>
<p>(C)...</p>
</div>
* かっこ内はカーソル位置を表す
<div class="section">
<h2>第一章</h2>
<p>...</p>
</div>
<div class="section">
<h2>第二章</h2>
<p>...</p>
</div>
<div class="section">
<h2>第三章</h2>
<p>...</p>
</div>
解決策には二通りのアプローチがありそうです。
カーソル移動方式の拡張
通常ツリーの末端にしか止まらないカーソルを、ツリー上の任...
Z軸方向(ノードの親子を辿る方向)のカーソル移動が必要になる...
挿入ルール定義言語による設定
設定ファイル上で挿入するフラグメント毎により複雑な挿入ル...
例えば上の図で言うと(B)の位置にカーソルがある場合は <div ...
そのような設定をするための記述言語を導入する必要がありま...
また、文書系のXMLを編集する場合、挿入操作は DOM API 的に...
** 関連情報 [#ffdb8fde]
[struct] ツリーフラグメント挿入プラグイン
http://www.horobi.com/ark/struct/
[ark] Ark Site
http://www.justsystem.co.jp/ark/
[ples] プラグイン作成講座
http://www.justsystem.co.jp/ark/p_lesson/index.html
[psrc] プラグインソースダウンロード
http://www.justsystem.co.jp/ark/p_source/index.html
** 最後に [#r6143804]
「XML開発者の日」、当日は、参加者の皆様より貴重なフィード...
ページ名: