伝説のツール「NotesPeek」をQtでリメイク開発記2017-8-6

前回は、設計文書のうち、フォーム文書を展開してみました。今回はその続きです。

前回も触れましたが、Notesの設計文書は基本的に「文書クラス」というものでその性質が分けられますが、バージョンが進むうちに文書クラスの範囲(WORDビットの下位12ビット)では到底カバーできず、「フラグ」というテキストを併用することで正しく設計文書を認識することができます。

設計文書のフラグは、「$Flags」という単なるテキストフィールドです。

// stdnames.h

/* Design flags */
#define DESIGN_FLAGS "$Flags"

このフィールドに、1文字1文字に意味を持たせた文字フラグが列記されています。代表的なフラグを抜粋してみます。

// stdnames.h

// for ALL
#define DESIGN_FLAG_DEFAULT_DESIGN 'd' /* ALL: Indicates the default design note for it's class (used for VIEW) */

// for FORM
#define DESIGN_FLAG_FILE 'g' /* FORM: file design element */
#define DESIGN_FLAG_IMAGE_RESOURCE 'i' /* FORM: Note is a shared image resource */
#define DESIGN_FLAG_XSPPAGE 'K' /* FORM: with "g", design element is an xpage, much like a file resource, but special! */
#define DESIGN_FLAG_SUBFORM 'U' /* FORM: Indicates that a form is a subform.*/
#define DESIGN_FLAG_WEBPAGE 'W' /* FORM: Note is a WEBPAGE */
#define DESIGN_FLAG_FRAMESET '#' /* FORM: Indicates that this is a frameset note */ 

// for VIEW
#define DESIGN_FLAG_CALENDAR_VIEW 'c' /* VIEW: Indicates a form is a calendar style view. */
#define DESIGN_FLAG_FOLDER_VIEW 'F' /* VIEW: This is a V4 folder view. */
#define DESIGN_FLAG_SHARED_COL '^' /* VIEW: shared column design element */

// for FILTER(AGENT)
#define DESIGN_FLAG_LOTUSSCRIPT_AGENT 'L' /* FILTER: If its LOTUSSCRIPT */
#define DESIGN_FLAG_SCRIPTLIB 's' /* FILTER: A database global script library note */
#define DESIGN_FLAG_JAVA_AGENT 'J' /* FILTER: If its Java */
#define DESIGN_FLAG_DATABASESCRIPT 't' /* FILTER: A database script note */
#define DESIGN_FLAG_SERVLET 'z' /* FILTER: this is a servlet, not an agent! */

// Others
#define DESIGN_FLAG_JAVASCRIPT_LIBRARY 'h' /* Javascript library. */
#define DESIGN_FLAG_CONNECTION_RESOURCE 'k' /* Data Connection Resource (DCR) for 3rd party database */
#define DESIGN_FLAG_JSP '<' /* this design element is a jsp */
#define DESIGN_FLAG_SACTIONS 'y' /* Shared actions note */
#define DESIGN_FLAG_STYLESHEET_RESOURCE '=' /* Style Sheet Resource (SSR) */
#define DESIGN_FLAG_XSP_CC ';' /* note class form, a custom control */
#define DESIGN_FLAG_JAVAFILE '[' /* Java design element */

サブフォーム、フレームセット、ファイルリソース、イメージリソース、XPagesなどはフォームクラスから分岐しています。 フォルダ、カレンダービュー、共有列はビュークラスから分岐しています。 LotusScriptエージェント、Javaエージェント、データベーススクリプトなどはフィルタークラスから分岐しています。サーブレットも含まれていますが、どういうことでしょう?JSPも見受けられますね。

これらはフラグなので、文字列単位で比較するのではなく、所定の1文字が含まれていれば「フラグが立っている」ことになります。例えば、メールDBの「(GroupCalendarDlg)」というサブフォームには、以下のフラグが混在しています。

DESIGN_FLAG_ADD               // A
DESIGN_FLAG_NO_COMPOSE        // C
DESIGN_FLAG_SUBFORM           // U
DESIGN_FLAG_SUBFORM_NORENDER  // x
DESIGN_FLAG_HIDE_FROM_V3      // 3

$Flagsフィールドには、「CUA3x」という文字列で存在しています。1文字1文字の意味を抽出することで、この設計文書にはどんな属性が含まれているのかがわかります。

リメイクアプリ「nsfinder」では、今回これを確認できるようにしてみました。

f:id:takahide-kondoh:20170806161352p:plain

$Flagsフィールドだけでは、意味がわかりづらいので、「Design flags」というプロパティを設け、1つ1つのフラグ文字列に紐付く意味がわかるようにしました。

NotesPeekでは、これをアイコンのレベルでわかるようにしています。Notesの設計文書を、NotesPeekのまねをすることなく、アイコンレベルで表記できるようにするのは至難の業かもしれません。まずは文字ベースで表記できるようにし、実装に余裕が出てきたらアイコンも検討してみましょう。