伝説のツール「NotesPeek」をQtでリメイクする(その6・文書取得)
「その4・IDテーブル」「その5・@式その1」「その5・@式その2」「その5・@式その3」とAPIの説明などが続いたので、このあたりでコードの紹介を挟みます。
今回のゴールは、データベースアイテムの直下に、文書のアイテムを展開し、文書ID(NOTEID)とその文書のウィンドウタイトルを画面に表示することです。
操作方法はデータベースを展開する時と同じく、コンテキストメニュー(右クリックメニュー)を開きます。データベースアイテムにマウスを移動し、コンテキストメニューで「Refresh Children」を選ぶと、そのデータベースに含まれる文書がすべて展開されます。
構築環境は、以前のIntroQtデモと同じです。nsfinder本体と、ntlxライブラリのコードはBitbucketから取得できます。
クローンをダウンロードしたあと、タグv0.1.2をチェックアウトしてください。
こちらはタグv0.9.1をチェックアウトしてください。
Mac以外にWindows、Linux(Ubuntu)でも動作確認しています。Qt Creatorなどの設定は、以前の記事をご覧ください。
さて、すべてのコードの説明は割愛しますが、IDテーブル用クラスと@式用クラスの、2つのヘッダーファイルだけ簡単に紹介しておきます。
#include <ntlx/idtable.h> #ifndef NTLX_IDTABLE_H #define NTLX_IDTABLE_H #include "ntlx_global.h" #include "ntlx/status.h" #if defined(NT) #pragma pack(push, 1) #endif #include <nsfdata.h> #if defined(NT) #pragma pack(pop) #endif namespace ntlx { class Database; class Note; /** * @brief IDテーブルクラス */ class NTLXSHARED_EXPORT IDTable : public IStatus { public: /** * @brief イテレータインナークラス */ class NTLXSHARED_EXPORT iterator { public: /** * @brief デフォルトコンストラクタ */ iterator(); /** * @brief NOTEIDを返す演算子 * @return NOTEID */ NOTEID operator*(); /** * @brief 前置きインクリメント演算子 * @return 自身への参照 */ iterator& operator++(); /** * @brief 後置きインクリメント演算子 * @return インクリメントする前のイテレータ */ iterator operator++(int); /** * @brief NOTEIDに対応したNoteオブジェクトを取得する * @param db 取得元になるデータベースオブジェクト * @return Noteオブジェクト */ Note getNote(Database& db) const; protected: /** * @brief コンストラクタ * @param pIdTable IDTableオブジェクトへのポインタ * @param noteId NOTEID * @param isLast 最後を示しているか */ iterator(IDTable* pIdTable, NOTEID noteId, bool isLast = false); IDTable* idTable_; NOTEID id_; bool isLast_; /** * @brief 等値演算子 * @param lhs 左辺値 * @param rhs 右辺値 * @return ブール値 */ friend NTLXSHARED_EXPORT bool operator==( const iterator& lhs , const iterator& rhs ); /** * @brief 不等値演算子 * @param lhs 左辺値 * @param rhs 右辺値 * @return ブール値 */ friend NTLXSHARED_EXPORT bool operator!=( const iterator& lhs , const iterator& rhs ); friend class IDTable; }; /** * @brief コンストラクタ */ IDTable(); /** * @brief デストラクタ */ virtual ~IDTable(); /** * @brief 最初のイテレータを返す * @return 最初のイテレータ */ iterator begin(); /** * @brief 最後のイテレータを返す * @return 最後のイテレータ */ iterator end(); /** * @brief NOTEIDを挿入する * @param id NOTEID * @return 重複していなければ真 */ bool insert(NOTEID id); private: DHANDLE handle_; friend class iterator; }; } // namespace ntlx #endif // IDTABLE_H
このIDTableクラスは、ほぼ「Notes/Domino APIプログラミング―C++とSTLによる実践的プログラミング」の定義を踏襲しています。インナークラスiteratorを用いて、STLのコンテナクラスのようなイテレーション操作を可能にしているところなどは秀逸です。
#include <ntlx/formula.h> #ifndef NTLX_FORMULA_H #define NTLX_FORMULA_H #include "ntlx_global.h" #include "ntlx/status.h" #include "ntlx/note.h" namespace ntlx { /** * @brief 式クラス */ class NTLXSHARED_EXPORT Formula : public IStatus { public: /** * @brief デフォルトコンストラクタ */ Formula(); /** * @brief コンストラクタ * @param bin コンパイル済み@式へのポインタ * @param size コンパイル済み@式の長さ */ Formula(const char* bin, WORD size); /** * @brief コピーコンストラクタ * @param other コピー元Formula */ Formula(const Formula& other); /** * @brief 代入演算子 * @param other 代入元Formula * @return 自身への参照 */ Formula& operator=(const Formula& other); /** * @brief デストラクタ */ virtual ~Formula(); /** * @brief コンパイル済み@式のサイズを取得する * @return コンパイル済み@式のサイズ */ WORD odsLength() const; /** * @brief 式ハンドルをロックする * @return コンパイル済み@式へのポインタ */ const char* lock() const; /** * @brief コンパイル済み@式を割り当てる * @param bin コンパイル済み@式 * @param size コンパイル済み@式の長さ */ void assign(const char* bin, WORD size); /** * @brief 式を評価する * @param note 評価元になる文書オブジェクト * @return 評価した式の結果テキスト */ QString evaluate(Note& note); protected: /** * @brief 計算を開始する * @return 計算ハンドルを取得できれば真 */ bool startCompute(); /** * @brief 計算を終了する */ void stopCompute() const; /** * @brief 式ハンドルをアンロックする */ void unlock() const; /** * @brief 式を閉じる */ void close() const; mutable FORMULAHANDLE handle_; mutable char* bin_; mutable HCOMPUTE hCompute_; }; } // namespace ntlx #endif // NTLX_FORMULA_H
こちらのFormulaクラスも前出の「Notes/Domino APIプログラミング―C++とSTLによる実践的プログラミング」のコーディングを応用しています。
このFormulaとIDTableを組み合わせると、選択式を使ってIDテーブルに文書を捕捉することが可能になります。