2010年8月27日金曜日

トピックノードとそうでないノードの違い

BEITELでは、ノードのハンドル(下の画面参考)には2種類の状態があります。
  • トピックノード: ハンドルの色は青色をしています。(初期状態)
  • トピックではないノード: ハンドルの色は白色をしています。
BEITELでは、各ノードに章や節番号, 箇条書き番号をつけることができます。この章番号や箇条書き番号は、ノードのレベル毎に指定することができます。例えば、以下の画面の「基本操作」と書かれているノードをクリックして、右クリックメニューを表示し、「見出し(n.n.n.)」を選択してください。

すると、以下の画面のように「基本操作」というノードの先頭に「1.」と表示され、さらに同レベルの「カラムの利用」の先頭にも「2.」が表示されます。同様に、「ノードの作成」というノードをクリックして、右クリックメニューを表示し、「見出し(n.n.n.)」を選択してください。同一レベルのノードに番号が表示されます。

このように「トピック」ノードの場合に、右クリックメニューの章や節番号, 箇条書き番号を指定すると、その指定された番号やマークが表示されます。
しかしながら、同レベルのノードではあるのですが、番号やマークを表示したくない場合があります。例えば次の画面の様に、「基本操作」という見出しの概要を説明する文を挿入しようと思い、「ノード作成」ノードの上に「この節では...」と書き始めたのですが、ノードの先頭に番号が表示されてしまいます。これは「この節では...」のノードがトピック(見出し)であるからです。


そこで、「この節では...」ノードをクリックし、右クリックメニューの「トピック」を選択してください。



すると、下の画面のように「この節では...」ノードのハンドルの色が白くなります。これでこのノードはトピック(見出し)ではなくなりました。そのため、番号が表示されなくなりました。


この右クリックメニューの「トピック」は、選択するとトピックであればトピックではなくなり、トピックでなければトピックとなります。

この「トピックではない」ノードを使うことで論文やマニュアル等の章や節構造を持つ文書を書く場合に記述しやすくなるかと思います。

BEITELで「トピック」が初期状態である理由は、伝えたいこと(トピック, 見出し)を最初に書き出しやすいようにしたかったからです。文書を作成する場合には、まず伝えたいことを書き出すことから始めると書きやすいと思います。まず「トピック」ノードで伝えたいことを箇条書きで書き出し、あとはそれぞれのトピックを肉付けしてゆきます。(このあたりはまた説明を書きたいと思います。)

この青色のハンドルは文書作成をしているときにちょっと威圧感を感じるんですよね...^^;;; 今後デザインなどもいろいろ試してみたいと思います。

2010年8月9日月曜日

JavaアプリケーションによるBEITELデータの読み込み

さて今回は、BEITELのデータを自分のJavaアプリケーションで読み込んでみましょう。
BEITELのデータを読み込むためには、(BEITELをインストールしたディレクトリ)/lib/beitel.jarをクラスパスに追加する必要があります。

BEITELのデータ読み込みには以下のクラス・インタフェースを使用します。
  • jp.carabiner.treeeditor.TreeEditorModelクラス - データを表現するモデル。
  • jp.carabiner.treeeditor.TreeNodeDataManagerクラス - ZTEファイルの読み込み用クラス。
  • jp.carabiner.treeeditor.FileManagerインタフェース - 一時ディレクトリの管理用インタフェース。
  • jp.carabiner.treeeditor.DataStoreインタフェース - ドキュメント内データの保持用インタフェース。
  • jp.carabiner.tarp.desktop.ui.TaskStatusインタフェース - タスク進行状況の管理用インタフェース。

これらのクラス・インタフェースの役割について簡単に説明します。
  • 読み込みはTreeNodeDataManagerクラスを介して行ないます。結果はTreeEditorModelとして取得されます。
  • 引数には以下のオブジェクトを指定します。
    • ZTEファイルのデータはjava.io.InputStreamクラスによって供給します。
    • 処理途中に必要となる一時ファイルの生成にはFileManagerインタフェースの実装が使用されます。
    • ZTEファイルから読み込んだデータのうち、画像などのバイナリデータはDataStoreインタフェースの実装に格納されます。
    • プログレスバーへの進行状況表示のため、進行状況は逐一TaskStatusインタフェースの実装に通知されます。
    • モデルの読み込み元を示す任意のファイル名を指定することができます。

このうち、DataStoreインタフェースにはデフォルトの実装jp.carabiner.treeeditor.DefaultDataStoreクラスがありますが、FileManagerとTaskStatusインタフェースは独自の実装クラスを作成する必要があります。

基本的な手順は以下のとおりです。
  1. jp.carabiner.treeeditor.FileManagerインタフェースの実装クラスの作成
    package jp.carabiner.beitel.sample;

    import java.io.File;
    import java.io.IOException;

    import jp.carabiner.treeeditor.FileManager;
    import jp.carabiner.treeeditor.TreeNode;

    /**
    * 一時ファイルのマネージャです。
    */
    public class TempFileManager implements FileManager {

    /**
    * 一時ディレクトリを保持します。
    */
    private File tempDir;

    /**
    * 構築します。
    *
    * @param tempDir
    * 一時ディレクトリ。
    */
    public TempFileManager(File tempDir) {
    this.tempDir = tempDir;
    }

    @Override
    public File createTempFile() throws IOException {
    File f = File.createTempFile("beitel-temp", ".tmp", tempDir);
    f.deleteOnExit();
    return f;
    }

    @Override
    public File createTempFile(TreeNode node) throws IOException {
    File f = File.createTempFile("beitel-node", ".tmp", tempDir);
    f.deleteOnExit();
    return f;
    }

    @Override
    public File createTempFile(String prefix, String suffix) throws IOException {
    File f = File.createTempFile(prefix, suffix, tempDir);
    f.deleteOnExit();
    return f;
    }

    @Override
    public void releaseTempFile(File f) {
    f.delete();
    }

    }
  2. jp.carabiner.tarp.desktop.ui.TaskStatusインタフェースの実装クラスの作成
    package jp.carabiner.beitel.sample;

    import jp.carabiner.tarp.desktop.ui.TaskStatus;

    /**
    * タスクの進行状況を管理します。
    */
    public class DefaultTaskStatus implements TaskStatus {

    /**
    * 構築します。
    */
    public DefaultTaskStatus() {
    ;
    }

    @Override
    public void begin(String name, int max, boolean indeterminate) {
    System.out.println("begin: " + name);
    }

    @Override
    public TaskStatus[] beginSubTask(String name, int num) {
    System.out.println("begin: " + name);
    DefaultTaskStatus[] subTasks = new DefaultTaskStatus[num];
    for (int i = 0; i < subTasks.length; i++) {
    subTasks[i] = new DefaultTaskStatus();
    }
    return subTasks;
    }

    @Override
    public void end() {
    System.out.println("end");
    }

    @Override
    public void progress() {
    System.out.print(".");
    }

    }
  3. jp.carabiner.treeeditor.TreeNodeDataManagerユーティリティクラスを利用してZTEファイルの読み込み
    package jp.carabiner.beitel.sample;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;

    import jp.carabiner.treeeditor.DataStore;
    import jp.carabiner.treeeditor.DefaultDataStore;
    import jp.carabiner.treeeditor.TreeEditorModel;
    import jp.carabiner.treeeditor.TreeNode;
    import jp.carabiner.treeeditor.TreeNodeDataManager;

    /**
    * テストタスクです。
    */
    public class Test {

    /**
    * 実行します。
    *
    * @param args
    * 引数。
    */
    public static void main(String[] args) {
    try {
    InputStream in = new FileInputStream(new File(args[0]));
    File tempDir = new File("temp/");
    tempDir.mkdirs();
    TempFileManager tempFileManager = new TempFileManager(tempDir);
    DefaultTaskStatus taskStatus = new DefaultTaskStatus();
    String filename = "test";
    DataStore dataStore = new DefaultDataStore(tempFileManager);

    TreeEditorModel model = TreeNodeDataManager.load(tempFileManager,
    filename, in, dataStore, taskStatus);
    in.close();

    TreeNode rootNode = model.getRootNode();
    printNode(rootNode, "");
    } catch (Throwable t) {
    t.printStackTrace();
    }
    }

    /**
    * ノードを出力します。
    *
    * @param node
    * ノード。
    * @param indent
    * インデント。
    */
    private static void printNode(TreeNode node, String indent) {
    System.out.println(indent + "+ " + node.getText());
    for (int i = 0; i < node.getChildrenCount(); i++) {
    printNode(node.getChild(i), indent + " ");
    }
    }

    }

BEITELバージョン1.1をリリースしました。

本日、BEITELのバージョン1.1をリリースしました。

今回の修正は、操作性の向上と、バグフィックスが中心です。ぜひお試しください。

変更点は以下のとおりです。


■2010年8月9日 (月) version 1.1
  • 文章途中でのEnter・行頭でのBS・行末でのDeleteキーでノードの分割・結合を行えるようにしました。
  • カラムの横幅を手入力できるようにしました。
  • ファイルを開く・保存する際の初期ディレクトリに関して、初回起動時はユーザのホームディレクトリとなるようにしました。
  • カラーパレットに関して、最近使った色は左側に追加するようにしました。
  • プラグインの非同期処理の方法をヘルプに追記しました。
  • [バグフィックス] GIFファイルなどのインデックスカラーの画像が表示されない問題を修正しました。
  • [バグフィックス] チェックボックスを変更後にUndo・Redoした際の画面表示の誤りを修正しました。
  • [バグフィックス] カラムの編集領域上にカーソルがある場合に、下キーが動作しないことがある問題を修正しました。
  • [バグフィックス] ノード貼付け時、ウィンドウサイズ変更時の縦スクロールバーの挙動を修正しました。
  • [バグフィックス] 検索結果リストの表示が乱れることがある問題を修正しました。

ダウンロードは
アウトラインエディタ BEITELのページ
からどうぞ。

2010年8月3日火曜日

Knifeのコンセプト紹介サイトをオープンしました。

本日、手書きカードをベースとしたインタフェースのフレームワーク
Carabiner Knife(ナイフ) (開発中)のコンセプト紹介サイトをオープンしました。

Knifeフレームワークを利用することで、手書きのカードをベースとした
直感的なデータ入力・操作インタフェースを備えたアプリケーションを
構築することが可能になります。


詳しくは、
Knifeのページ
からどうぞ。