ビューの本体にTableViewerを配置する
では、そのソースコードにいろいろ追加していこうと思います。まずはビューの本体を構築していきます。ビューの構築は、
public void createPartControl(Composite parent);
をオーバーライドすることで行います。引数のCompositeにいろいろウィジェットを配置していくわけです。今回は下記のとおりビュー全体にTableViewerを配置することにしました。ここで出てくるTableViewerとはEclipseの「問題ビュー」のようにヘッダをもった表形式のビューワです。
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)で行っています。具体的なソースは次のとおりです。
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はカラムの幅などレイアウト情報を管理するクラスです。上のソースの、
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()は、
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[]は、
private final IField[] VISIBLE_FIELDS = { new TitleField(),new SummaryField(), new URLField() };
と、あらかじめGoogleResultViewのフィールドに定義されている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はそれぞれ
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へのデータ表示時にも使用されるのですが、それについては後述します。
