読者です 読者をやめる 読者になる 読者になる

伝説のツール「NotesPeek」をQtでリメイクする(その6・文書取得)

その4・IDテーブル」「その5・@式その1」「その5・@式その2」「その5・@式その3」とAPIの説明などが続いたので、このあたりでコードの紹介を挟みます。

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

今回のゴールは、データベースアイテムの直下に、文書のアイテムを展開し、文書ID(NOTEID)とその文書のウィンドウタイトルを画面に表示することです。

操作方法はデータベースを展開する時と同じく、コンテキストメニュー(右クリックメニュー)を開きます。データベースアイテムにマウスを移動し、コンテキストメニューで「Refresh Children」を選ぶと、そのデータベースに含まれる文書がすべて展開されます。

構築環境は、以前のIntroQtデモと同じです。nsfinder本体と、ntlxライブラリのコードはBitbucketから取得できます。

Bitbucket/ntlxライブラリ

クローンをダウンロードしたあと、タグv0.1.2をチェックアウトしてください。

Bitbucket/nsfinder本体

こちらはタグv0.9.1をチェックアウトしてください。

Mac以外にWindowsLinux(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テーブルに文書を捕捉することが可能になります。