SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Webサービスを利用したEclipseプラグインの作成

Google Web APIsを使用したEclipseのプラグインの作成

Webサービスを利用したEclipseプラグインの作成 第3回


ビューの本体にTableViewerを配置する

 では、そのソースコードにいろいろ追加していこうと思います。まずはビューの本体を構築していきます。ビューの構築は、

public void createPartControl(Composite parent);

 をオーバーライドすることで行います。引数のCompositeにいろいろウィジェットを配置していくわけです。今回は下記のとおりビュー全体にTableViewerを配置することにしました。ここで出てくるTableViewerとはEclipseの「問題ビュー」のようにヘッダをもった表形式のビューワです。

createPartControlのソース
public void createPartControl(Composite parent) {
    Composite container = new Composite(parent, SWT.NONE);
    container.setLayout(new FillLayout());
 
    viewer = new TableViewer(container, 
                             SWT.FULL_SELECTION | SWT.BORDER);
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setInput(getViewSite());
    initTable(viewer);
 
    createActions();
    initializeToolBar();
    initializeMenu();
}

 TableViewerにカラムを追加する処理はinitTable(viewer)で行っています。具体的なソースは次のとおりです。

initTableのソース
private void initTable(final TableViewer viewer) {
    table = viewer.getTable();
    TableLayout layout = new TableLayout();
    table.setLayout(layout);
    table.setHeaderVisible(true); //ヘッダを表示する 
    table.setLinesVisible(true);  //ラインを表示する

    ColumnLayoutData[] columnLayouts = getColumnLayouts();

    for (int i = 0; i < columnLayouts.length; i++) {
        layout.addColumnData(columnLayouts[i]);
        TableColumn tc = new TableColumn(table, SWT.NONE, i);
        tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
        tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
    }
}

 ColumnLayoutDataはカラムの幅などレイアウト情報を管理するクラスです。上のソースの、

initTableのソース抜粋1
table = viewer.getTable();
TableLayout layout = new TableLayout();
table.setLayout(layout);

 の箇所で、TableLayoutはTableViewerにセットされます。さらにTableLayoutに、

layout.addColumnData(columnLayouts[i]);

 の箇所でColumnLayoutDataがセットされます。これでTableViewerのカラムの情報をColumnLayoutDataで設定できるようになりました。

ColumnLayoutDataの生成について

 さて、

ColumnLayoutData[] columnLayouts = getColumnLayouts();

 で、各カラムのレイアウト情報を配列で取得していますが、現段階ではgetColumnLayouts()は、

現段階のColumnLayoutData[]を取得するソース
private ColumnLayoutData[] getColumnLayouts() {
    return DEFAULT_COLUMN_LAYOUTS;
}

 とフィールドに定義されている配列をそのまま返すようになっています。ここはあとで「既に前回の情報が保存されていたらその情報を復元する」という処理に変更します。例えば前回Eclipseを使用していたときにカラム幅を変更していた際、その幅を次回Eclipseを起動したときに復元する、といったことをできるようにするわけです。

実際にカラムを追加する

 実際にカラムを追加する処理は、

カラムを追加するソース
for (int i = 0; i < columnLayouts.length; i++) {
   layout.addColumnData(columnLayouts[i]);
   TableColumn tc = new TableColumn(table, SWT.NONE, i);
   tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
   tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
}

 の箇所で行っています。先のColumnLayoutData(レイアウト情報)をセットするのと、TableColumn#setTextでカラムごとのヘッダの文言を設定しています。また上で出てくるVISIBLE_FIELDS[]は、

GoogleResultViewのフィールドに定義されているVISIBLE_FIELDS
private final IField[] VISIBLE_FIELDS = 
    { new TitleField(),new SummaryField(), new URLField() };

 と、あらかじめGoogleResultViewのフィールドに定義されているIFieldインターフェースの配列です。

IFieldインターフェースの役割

 IFieldインターフェースのソースは次のとおりです。

IFieldインターフェースのソース
public interface IField {
    String getColumnHeaderText();
    Image getColumnHeaderImage();
    String getValue(Object obj);
    Image getImage(Object obj);
    int compare(Object obj1, Object obj2);
}

 IFieldインターフェースは、ヘッダ名やヘッダに表示するアイコンの情報、またTableViewerの各カラムに表示したいオブジェクトが渡されたときに、オブジェクトを文字列に変換する処理などを備えたインターフェースです。実装しているクラスTitleField、SummaryField、URLFieldはそれぞれ

IFieldの実装クラスのソース
public class TitleField implements IField {
    public String getColumnHeaderText() {return "Title";}
    -- 以下省略 --
}

public class SummaryField implements IField {
    public String getColumnHeaderText() {return "Summary";}
    -- 以下省略 --
}

public class URLField implements IField {
    public String getColumnHeaderText() {return "URL";}
    -- 以下省略 --
}

 などというように、ヘッダ部分の文言が定義されています。他のメソッドの実装はソースコードを参照ください。

 さて上記のIFieldとその実装クラスですが、先のソースで、

for (int i = 0; i < columnLayouts.length; i++) {
    layout.addColumnData(columnLayouts[i]);
    TableColumn tc = new TableColumn(table, SWT.NONE, i);
    tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
    tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
}

 とTableColumnのsetTextを呼び出して、各カラムにヘッダ名をセットしています。IFieldはこのようにヘッダ名をセットするだけではなくTableViewerへのデータ表示時にも使用されるのですが、それについては後述します。

次のページ
検索メソッドを定義する

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

Webサービスを利用したEclipseプラグインの作成連載記事一覧

もっと読む

この記事の著者

木野 雅富(キノ マサトミ)

2000年にシンクタンク系のSIerに入社後、サーバサイドJava開発やWEBサービスを利用したリッチクライアント開発など、さまざまな開発プロジェクトに携わる。2008年より株式会社プライムブレインズにて、システムコンサルタントとして従事。現在は会社作りも楽しんでいます!専門はJ2EEと最近はEcl...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1541 2008/08/22 19:07

イベント

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

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

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

メールバックナンバー