要件定義-一応正規

Download Report

Transcript 要件定義-一応正規

独自TextBox要件定義書
2006/03/02
Rev.1.1
t.tsugehara
概要
• 本書では独自TextBoxの設計前の要件定
義を目的とする。
• 検討課題が多いため、本書内で議論しな
がら結論を導き出す形式を採用した。
必要な機能-基本1
•
•
•
•
•
文字列(2バイト文字含む)を入力する機能
2バイト文字の入力に伴い、IMEと連携する機能
入力した文字列を表示する機能
横に表示しきれない文字列を折り返して表示する機能
縦に表示しきれない文字列をスクロールバーでスクロー
ルさせながら表示する機能
• 所定の位置にカーソルを表示する機能
• マウスでクリックした場所にカーソルを合わせる機能
必要な機能-基本2
•
•
•
•
•
•
•
入力した文字列をカーソル位置に挿入する機能
入力した文字列をカーソル位置から上書きする機能
挿入モードと上書きモードを切り替える機能
範囲選択をする機能
範囲選択をした範囲を反転表示させる機能
矢印キーでカーソルを上下左右に動かせる機能
SHIFTキーを押しながら矢印キーを操作することで、範囲選択をしな
がらカーソルを動かせる機能
• マウスのドラッグ操作で範囲選択をしながらカーソルを動かせる機能
• SHIFTを押さないキー操作で範囲選択を解除させる機能
• マウスのクリックで範囲選択を解除させる機能
必要な機能-基本3
• 選択範囲を削除する機能
• 選択範囲の文字列を削除し、挿入または上書きモードで文字列を入
力する機能
• 表示するフォントを指定する機能(フォント種別、フォントサイズ、太字、
斜線、下線)
• 表示するフォントの色を指定する機能(ARGB)
• 背景色を指定する機能(ARGB)
• 入力したテキストを外部から取得出来る機能
• テキストボックスを表示するかどうかを指定する機能
• テキストボックスの有効/無効を切り替える機能
• 読み取り専用を指定する機能
必要な機能-基本4
•
•
•
•
カーソル位置を外部から取得/設定する機能
選択範囲を外部から取得/設定する機能
カーソル位置にスクロールするよう外部から指定する機能
テキストに入力あるいは貼り付けられた文字列を外部に通知し、外
部の指定に応じてその動作をキャンセルさせる機能
• 削除または切り取られた文字列を外部に通知し、外部の指定に応じ
てその動作をキャンセルさせる機能
• その他System.Windows.Forms.Controlクラスの全機能
必要な機能-Clipboard
• 選択した範囲の文字列をクリップボードに
コピーする機能
• 選択した範囲の文字列をクリップボードに
コピーし、削除する機能
• クリップボードにあるテキストデータをカー
ソル位置に対して貼り付ける機能(挿入の
みで可)
検討する機能-表示1
•
•
•
•
•
•
•
•
•
•
•
タブの文字数を指定出来る機能
現在カーソルのある行に下線を引く機能
指定した桁数に対して縦線を表示する機能
サイズとは関係なく、指定した桁数で折り返す機能
等幅フォント以外のフォントで描画出来るようにする機能
半角スペースを別の形式で表示する機能
全角スペースを別の形式で表示する機能
タブを別の形式で表示する機能
バイナリ文字列(あるいはデータ)を表示する機能
表示している行数を表示する機能
表示している行数を論理行数で表示する機能
検討する機能-表示2
• 入力したカッコ文字列((), [], {}, <>)に対応するカッコ文字列を強調
表示する機能
• 入力したクォーテーション(“, ‘)に対応するクォーテーションを強調表
示する機能
• クォーテーション内の文字列の表示を他と、区別して表示する機能
• C言語テンプレートやBasicテンプレートなどを指定して、文字列をブ
ロックごとに表示分けする機能
• 指定した辞書に応じて入力ヒントを表示する機能
• 上記の入力ヒントを選択すると、そのヒント文字列を挿入する機能
• 改行を別形式で表示する機能
• ドキュメントの末尾にEOF判別記号を表示する機能
検討する機能・表示3
• 英文ワードラップの有効/無効を切り替える機能
• 「っ」や「、」、「。」等が行頭に来てしまう場合、自動的に前行の最後
尾に一文字だけその文字を移動させる機能
• 指定した倍率で表示できるようにする機能。この際、フォントや行番
号などまとめて表示できてしまってよい
検討する機能-複合1
• URL形式で指定された文字列を一般的なリンク文字列形式で表示
する機能、またリンクをマウスでクリックすることで自動的にブラウザ
を起動する機能
• 画面を分割する機能、またその機能使用の有無を外部から指定出
来るようにする機能(2分割までで可)
• メールアドレス形式の文字列を一般的なリンク形式で表示する機能、
またリンク形式で表示された文字列をクリックするとメーラを起動す
る機能
• 行単位で外部からアクセス出来るようにする機能
• クリップボードを直接呼び出すのではなく、呼び出し元が指定したク
リップボード用ラッパを呼び出すようにする機能
検討する機能-入力
• 前の段落のインデントを引き継いで改行する機能
• 改行を一つ前の行に行い、改行した行の先頭(先頭しかないが)に
カーソルを合わせる機能
• カーソルの合っている行を行単位で削除する機能
• まだ文字列が入力されていない場所にもカーソルを持っていける機
能(フリーカーソル)
• 選択を矩形で行える機能
• \n、\r、\r\nなど、改行コードが違う場合に自動補正する機能
使用元にやってほしい機能
•
•
•
•
•
元に戻すとやり直す機能
Base64デコードなどの外部拡張
ポップアップメニューのデフォルトメニュー
保存とか読み込み機能(全部オンメモリでいいかなと)
印刷機能
検討A
•
•
•
•
•
•
•
•
•
•
行数表示は実装する(必須)
タブの文字数も実装する(必須)
表示している行数を論理行数で表示する機能は実装する(必須)
等幅フォント以外は対応しない
「っ」や「、」、「。」などの自動補完は対応しない
半角スペースを別の形式で表示する機能は実装する
全角スペースを別の形式で表示する機能は実装する
タブ文字を別の形式で表示する機能は実装する
改行を別形式で表示する機能は実装する
画面分割機能は実装しない。将来的に実装するとした場合、別のテ
キストボックスとの同期機能という別の機構で実装する
検討B
• 元に戻すとやり直すは独自バッファを持ってもいいのだが、当面の使
用対象であるツリー型テキストエディタは呼び出し元で統合バッファ
を持っているため、テキストエディタ単体にはこのバッファを実装しな
い。実装するとした場合は継承したクラスで実装出来るよう対処する
• Base64デコードなどの拡張機能は使用しない。あれば色々便利だが、
使用元がポップアップメニューを作成すれば対応できる問題であると
判断
• ポップアップメニューのデフォルトメニューは対応しない。しても大し
て意味がないのと、逆にデフォルトの消し方で混乱するため。
• 印刷機能をテキストボックスには実装しない。これは当面の使用対
象であるツリー型テキストエディタで独自印刷機能を実装しているた
め。テキストボックス単体に実装したい場合、継承したクラスで実装
出来るよう配慮すること。
検討C
• 保存や読み込み機能はリッチテキストボックスのようにあれば非常
に便利な機能ではあるが、どの道プレーンテキストでの保存など大し
た手間でもないので実装しない。実装するとなるとエンコード指定な
ども出来ないと駄目だろうというのも判断基準のひとつ。
• バイナリ文字列を表示する機能は正直どう実装すればよいのかよく
わからんが実装する。これは折り返し処理などが一つのバイナリ文
字列でぐちゃぐちゃになってしまうため。
• \n、\r、\r\n等の改行コードが違っている場合に自動補正する機能は
実装しない。やられては迷惑だという場合もある思われる上、その判
断基準が非常に難しいため。呼び出し元の一括置換または同等機
能の実装で対応すべきものと判断する。
• 英文ワードラップの有効/無効を切り替える機能は実装しない。それ
ほど要望がないと思われるため、当初はペンディングできるとの判断
検討D
• メールアドレス、URLの判定ならびにクリックでのユーザー環境アプ
リケーション呼び出しについては、別途テンプレート読み込み機能で
検討するため検討課題からは外す。
• 入力したクォーテーション、カッコ文字列に対応するものを強調表示
する機能は「一時強調表示」というべき分類に属する若干特異な処
理を必要とするため実装しない。
• クォーテーション内文字列の別形式表示は、別途テンプレート読み
込み機能で検討するため検討課題からは外す。
• ドキュメント末尾にEOF判別記号を表示する機能は実装する。ただし
必ずこの機能の使用有無は切り替えられるようにすること。
• 行単位で外部からアクセスさせる機能はちと手間で仕方ないが実装
するしかないかなぁ。その代わりテキストプロパティのアクセス速度
が遅くなるのはよしとする。
検討E
• クリップボードラッパを呼び出す機能は実装する。これはテキストボッ
クスのDLLに含めてもよし、とりあえずアセンブリとして手軽に参照で
きる形式をとる
• 前の段落のインデントを引き継いで改行する機能は、、いいか、実装
してしまおう。普通の改行と区別するため、この機能を使用する場合
のKeyCodeを指定出来るプロパティを持つようにする。
• 行単位削除は行単位アクセスを許容した時点で自動的に実装すべ
き項目となるので実装する。
• 改行挿入はインデント付き改行と同じ手法で実装する
• メールアドレスとURLの補正はテンプレートで別途検討するため検
討課題からは除外する
検討課題残件
•
•
•
•
•
•
•
•
•
現在カーソルのある行に下線を引く機能
指定した桁数に対して縦線を表示する機能
サイズとは関係なく、指定した桁数で折り返す機能
C言語テンプレートやBasicテンプレートなどを指定して、文字列をブ
ロックごとに表示分けする機能
指定した辞書に応じて入力ヒントを表示する機能
上記の入力ヒントを選択すると、そのヒント文字列を挿入する機能
まだ文字列が入力されていない場所にもカーソルを持っていける機
能(フリーカーソル)
選択を矩形で行える機能
指定した倍率で表示できるようにする機能。この際、フォントや行番
号などまとめて表示できてしまってよい
検討-倍率指定機能 ●
• フォントサイズとは別に倍率指定出来る機能はOperaなどを使ってい
ればわかるがスライドショー時などに是非ほしい機能。
• しかしこの倍率切り替えをどのように行うか、また使用元の方ですで
に実装している場合は二重にならないかなどの検討によっては無用
の長物になりかねない。
• 実装に関してはバックバッファを一つ持ち、そこから倍率に応じて表
画面に転送するような形式になると思われるため、どうしても若干の
処理速度の落ちが見られることが予想される。
• 当然当初からGraphicsオブジェクトに対して描画する形式になると思
われるため、後日の機能追加は容易な機能と位置づけられる。
• 結論:実装しない
検討-フリーカーソル機能 ○
• ボックス内を縦横無尽に動けるようになる機能
• この機能の発動条件によってはユーザーに混乱を与えることもある
• なお、本機能は実装した場合、フリーカーソルで空白の場所にカーソ
ルを指定されているときの入力は、「カーソル位置までを半角スペー
スで埋めてから文字列入力」が無難と思われる
• まあ機能の発動条件については呼び出し元の責任といえるため、コ
ントロール単体としては実装しておいて損のない機能と呼んで差し支
えないだろう
• 結論:実装する
検討-矩形選択機能 ○
• TeraPadのある種目玉機能と言えるのがこの矩形選択。
• あればかなり強烈な機能となるが、実装項で述べている「選択範囲
の取得」に対してどのように参照先に通知するかなど、悩みが尽きな
い項目である(これを意識しなければStartLine, StartIndex, EndLine,
EndIndexの四つからライン検索することで容易に実装出来るのだ
が)
• 指定方法もよく注意する必要があるが、これは使用元の責任とも言
えるため、実装しないデメリットはほとんど見当たらない
• 結論:実装する
検討-サイズとは別の折り返し ○
• よくある80桁で折り返しとかのあの機能である
• 相変わらず自動改行されるメールなどの文書を作成する時に必須の
機能と呼べる。ちなみに近年この機能を実装していない有名エディタ
は存在しないと言っても過言ではない
• 難点は実装時に「サイズより折り返し時のサイズが大きかった時」に、
横スクロールバーを表示しなければならないことである。このため、
単純な折り返し処理よりも若干実装工数が増えてしまう。
• 実装手順としては「現在ウィンドウの表示可能文字数」<「指定文字
数」で横スクロールバー表示、「for (その論理行の文字数) { 指定文
字数で表示行切り替え}」という感じでいけそうな気がする。
• 結論:実装する
検討-現在行の強調表示 ○
• 上級者向けエディタに多い、現在編集中の行を迷わなくするための
機能
• 実装手順としてはカーソル位置に対して線を引くだけなんで別になん
てことない気がするが。
• まあ実装しちゃおうか。
• 結論:実装する
検討-指定桁の縦線 ○
• 折り返し桁の縦線ではなく指定桁の縦線である。注意。
• メールやWeb用テキストファイルの編集時、編集の目安としてよく使
われる機能。ちなみにこれの変形(または自動設定)パターンが折り
返し桁の縦線表示機能であり、この機能を実装するならこれも同時
に実装すること。
• やることは桁数に対して線を引くだけ。ただし横スクロールバーとの
兼ね合いは常に意識する必要がある点に注意。
• まあいいか、実装しちまえ。
• 結論:実装する
検討-テンプレート機能 ○
• BasicやCなどの構文を構造的に解析し、強調文字などを指定する機
能。ちなみにTeraPadはこの機能が実は結構しょぼい。
• そんなに大層なものではなく、キーワード、ダブルクォートなど。
• というかURL表示の補完なども色々あるので正直結構面倒くさくて、
軽く検証した後ちゃんとした設計を起こした方がいいです。
• でもこれはまともなテキストエディタには必須なので、当初テンプレー
ト編集や保存機能をツリー型テキストエディタに埋め込むかどうかは
ともかく、機能としては実装しないと話にならないでしょう。
• 結論:実装する
検討-ヒント辞書機能 ●
• ただしこのヒント辞書だと現在編集中ドキュメントの内容などは反映
されないため、あくまで固定ヒントのみであり別にそんな手間でもな
い気もするが。
• この機能は基本的に諸刃の剣であり、ことテキストエディタに関して
言えば表示しなくていいという人も結構多い。需要はあえて断言する
ならプログラミング用途のみであり、その用途を考慮した場合に固定
文字列補完だけでは貧弱なのも確か。
• あればあったでそれなりの強力さはもてそうだが、このレベルなら呼
び出し元で実装するべきな気もする。入力補完は出来ないが、完全
な単語ペーストであれば別ウィンドウで十分出来る。
• ホントはツリー型テキストエディタのプラグインで実装出来るような形
式のがいい。
• 結論:時間がそこまでないので実装出来ない
追加検討課題とその検討
• 画面上部にルーラを表示する機能
不要。その代わり、一文字単位のピクセル数を取得出来るメソッド
を用意する。
• 一連の語句を識別する機能
わかりづらいので補足。「おはよう」と打つと「お」「は」「よ」「う」に分
けて送信される文字列信号を「おはよう」と識別するかどうか。また、
「abcd」と打つときにabc部分は連続で打ち、しばらく時間経過してか
ら「d」を打ったときに「abc」を単語として識別する機能。前者はともか
く後者は結構大変な機能といえる。とりあえずちょっとテストしてみて
から再検討としましょう。当初予定としての実装機能には含めないも
のとする。