SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

EclipseユーザのためのNetBeans環境とプラグイン開発入門

NetBeansとEclipseの機能比較とプラグイン開発方法

  • X ポスト
  • このエントリーをはてなブックマークに追加

リソースとWindow(エディターやIDEのメニュー)の連携について

 リソースがどのように管理されているかは、EclipseとNetBeansで大きく違うポイントです。この部分を良く理解できれば、NetBeansにおける開発をかなりハイスピードで行うことができます。

NetBeansでのファイルリソースの扱い

 Eclipseでは、IResourceというインターフェイスをベースに、IFileIFolderIProjectというインターフェイスが派生していて、リソースとビュー(表示機能)は独立しているシンプルな構成でした。

 NetBeansの場合は、下図のようになっています。

 下の方のオブジェクトから説明していくと、Fileは、java.io.Fileに相当する単なるJavaのオブジェクトです。

 FileObjectは、このjava.io.FileをラップしたNetBeans用のFileアクセス用の標準ライブラリだと理解してください。FileObjectでは、単純にラップするほかに、FileObjectへの変更をNetBeansの本体に通知する仕組みを実装しています。

 DataObjectは、NetBeansのリソース管理において中心的な存在です。なぜならば、DataObjectが非常に沢山の情報を持っているからです。DataObjectは、そのファイルに対して、現在どのような処理が可能かを管理したり、その処理を実際に行うオブジェクト(Cookie)を管理しています。また、Nodeオブジェクトのファクトリーとしての機能も持っています。

 Nodeは、プロジェクトのディレクトリツリーに表示されるときのアイコンやテキストなどのGUI表示に関する機能をサポートするほか、右クリックのした際に表示されるメニューのActionの管理や、ファイルのプロパティの項目のサポートをしています。

 NetBeansでプロジェクトを開くと、各ファイルにさまざまなアイコンがついていますが、これは、各Nodeオブジェクトがサポートしている機能です。

さまざまなアイコンで表示されるファイル
さまざまなアイコンで表示されるファイル

ファイルが認識されるまでの流れについて

 NetBeansのPluginモジュールの開発をする際、プロジェクトを開いたときに、内部でどのようにしてNetBeansがファイルを認識していくかを知ることは非常に重要です。

ファイルリソースを読み込む仕組み
ファイルリソースを読み込む仕組み

 まず最初にNetBeansがプロジェクトに相当するフォルダを開くと、NetBeansはそのフォルダの中にあるファイルやフォルダを認識します。このときに、その認識されたファイルやフォルダに相当するFileObjectが作られます。

 次に、NetBeans本体は、そのファイルオブジェクトの拡張子(XMLファイルの場合は、トップ階層のタグ名)から、どのDataLoaderを使うか判断します。このとき、どの拡張子に対してどのDataLoaderを使うかという情報は、システム・ファイルシステムの中から取得します。ですので、新しいタイプのデータタイプを作成するときには、どの拡張子に対してどのDataLoaderクラスを使うかという情報を「layer.xml」に記述しなくてはなりません。

 次に、先ほど選択されたDataLoaderからDataObjectが作成されます。DataObjectが作成された時点では、まだ表示されていません。そのファイルをビューの中に表示するには、表示に関してサポートするNodeオブジェクトを作成する必要があります。

 そして、最後に、DataLoaderNodeオブジェクトを作成します。これをプロジェクトの中身を表示するNetBeansのビュー(ウィンドウ)に渡すことによって、プロジェクトツリーの中にそのオブジェクトが表示されます。

DataObjectとCookieパターン

 DataObjectとCookieパターンについて知っておくことも、NetBeansでPluginモジュールを作成する上で必要です。

 DataObjectは、そのファイルに対して現在どのような処理を行えるかを知っていると書きましたが、それをコードにすると次のようになります。

Cookie cookie = this.dataObject.getCookie(SaveCookie.class);
// もしも、cookieがnullだった場合にはその処理ができないことを示す
if(cookie != null){
    SaveCookie saveCookie = (SaveCookie)cookie;

    // SaveCookie独自(保存処理)の処理を行う
    saveCookie.save();
}

 このコードでは、そのDataObjectを保存できるかどうかを聞いて、もし、DataObjectがエディタで変更されて保存が必要ならば保存し、変更がなく保存の必要がない場合には、何もしません。

 この、getCookie()メソッドから特定の処理用のCookieを取得し、取得したCookieがnullでないかnullかで、その処理ができるかできないかを判断するのは、NetBeansでは標準的な方法です。

 この方法が使われている例として、エディタでJavaのソースコードを更新した際に、左上の保存ボタンが有効になったり、保存した直後には無効になったりする仕組みが挙げられます。

無効状態の保存ボタン
無効状態の保存ボタン

 今回は、ドキュメントの保存処理に関するSaveCookieを紹介しましたが、そのほかに次のようなCookieがあります。

  • OpenCookie
  • CloseCookie
  • PrintCookie
  • EditorCookie

Lookupパターン

 Lookupパターンは、NetBeansのPlugin開発を勉強する際に、かなり使い方がつかみにくいパターンです。なぜ、つかみにくいかと言うと、それは、仕様用途が広範囲にわたるため、DocumentでLookupオブジェクトのところを見ても「何かを探す仕組み」としか書いていないからです。

 確かにそうなのですが、例がないと分かりにくいと思いますので、今回はLookupパターンの使用例を一つ挙げてみます。

 今回、Lookupパターンは、DataObjectNode、もしくはその他のDataObjectに関連付けられた部品間で情報を共有するための仕組みに用いられています。

 基本的にNodeがメインでLookupオブジェクトを管理していますが、DataObjectからNodeにアクセスしてLookupを取得することも可能です。

 Cookieパターンの復習も兼ねて、次のソースコードを見てください。

 ここでは、DbFuncDataObjectという名前のDataObjectにDbFuncFileCookieSupportという名前のCookieをセットしています。DataObjectに対して、OpenCookieインターフェイスの実装クラスをセットしているので、このファイルに対してOpen処理を行うことがこれで可能になります。

DataObject
public class DbFuncDataObject extends MultiDataObject {

    public DbFuncDataObject(FileObject pf, DbFuncDataLoader loader)
        throws DataObjectExistsException, IOException {
        super(pf, loader);
        CookieSet cookies = getCookieSet();
        cookies.add((Node.Cookie) DbFuncFileCookieSupport
            .create(this, getPrimaryEntry(), cookies));
    }

    protected Node createNodeDelegate() {
        return new DbFuncDataNode(this);
    }

}
可能になったOpen処理
可能になったOpen処理

 実際のOpen処理の内容は次のソースコードのようになります。ここで、そのファイルをOpenするためのエディタを指定しています。つまりNetBeansの場合は、Open処理に関連付けられるエディタがOpenCookieの実装で決まることになります。

OpenCookie実装クラス
public class EasyDbFuncEditorCookie extends DataEditorSupport
implements OpenCookie{
    public void open() {
        Lookup lookUp = dataObject.getNodeDelegate().getLookup();

        //NodeLookupオブジェクトからいろいろと取得
        // まずは、DataObjectオブジェクトを取得
        HyperDbFileDataObject dataObj
            = (HyperDbFileDataObject)
              lookUp.lookup(HyperDbFileDataObject.class);
        // つぎは、DataNodeオブジェクトを取得
        HyperDbFileDataNode nodeObj
            = (HyperDbFileDataNode)
              lookUp.lookup(HyperDbFileDataNode.class);
        // さらにCookieも取得できます
        EasyEditorCookie cookie
            = (EasyEditorCookie)lookUp.lookup(EasyEditorCookie.class);

        DbFuncTopComponent topComp
            = DbFuncTopComponent.getInstance(lookUp, dataObject);
        topComp.open();
        topComp.requestActive();
    }
}

 今回は、NodeオブジェクトからLookupを取得していますが、このLookupオブジェクトの実際のクラスは、NodeLookupクラスです。Lookupクラスからは、いろいろなものが取得できるようになっています。

 Lookupの使い方が分からないときは、デバッガで見てしまうのが一番です。

デバッガで中身を見る
デバッガで中身を見る

引用と謝辞

 本稿の画像は、NetBeans.org 『Recognizing a File Type Tutorial』を基に、描きおこさせていただきました。

 引用の許可などについて協力していただいた「NetBeans, Japanese Speaking Community」の皆さま、ありがとうございました。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

飯塚 友裕(イイヅカ トモヒロ)

Eclipse関連のソースコード自動生成プロダクトの開発者。ソースコード自動生成エンジンを他社に供給する技術エンジン会社「CROSSFIRE JAPAN, INC.」で、O/RマッピングツールやJavaによるSQLパーサーを開発。現在、NetBeans.org(米国)のパートナー。最近は、Alinous-Coreを利用したパッケージビジネスを行っています。SEO対策対応ECサイト構築パッケージOpen-ECAlinous-Coreのソースコードダウンロードhttp://sourceforge.jp/projects/alinous-core/はてなブログhttp://d.hatena.ne.jp/i-zuka/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/380 2006/05/19 11:06

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング