いよいよ検索結果一覧を表示するビューを作成します。とりあえず
nu.mine.kino.plugin.google.ui.views.GoogleResultView
としました。
plugin.xml(抜粋)は以下のようになりました。
<extension point="org.eclipse.ui.views"> <category name="Googleプラグイン" id="nu.mine.kino.plugin.google"/> <view class="nu.mine.kino.plugin.google.ui.views.GoogleResultView" icon="icons/icon.gif" category="nu.mine.kino.plugin.google" name="Google検索結果" id="nu.mine.kino.plugin.google.ui.views.GoogleResultView"/> </extension>
どんどんウィジェットを配置していきます。とりあえず、こんな感じになりました。
SWTだけではなくて、JFaceも使うときはカラムの制御をColumnLayoutDataでやるのがスマートみたいです*1。実際それに習って変更します。ColumnLayoutDataはフィールドの幅などの情報を表現するクラスです。
ポイントは
というところですね。わけがわからないと思うので、もっと具体的に、コーディングはこんな感じになります。
// TableLayoutと一緒になって使う。各カラムの表示幅など情報を設定する。 private final ColumnLayoutData[] DEFAULT_COLUMN_LAYOUTS = { new ColumnWeightData(100), new ColumnWeightData(100), new ColumnWeightData(100) }; private final IField[] VISIBLE_FIELDS = { new TitleField(), new SummaryField(), new URLField() };
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()); <-後述2 tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage()); <-後述2 // tc.addSelectionListener(headerListener); }
private ColumnLayoutData[] getColumnLayouts() { if (memento == null) { return DEFAULT_COLUMN_LAYOUTS; } // ↓実際はmementoからColumnLayoutData[]を構築して返す return DEFAULT_COLUMN_LAYOUTS; }
package nu.mine.kino.plugin.google.ui.views.fields; import org.eclipse.swt.graphics.Image; /** * テーブル形式のビューワのカラム情報を扱うインターフェースです。 * * @author Masatomi KINO * @version $Revision$ */ public interface IField { /** * @return The text to be displayed in the column header for this field. */ String getColumnHeaderText(); /** * @return The image to be displayed in the column header for this field or * <code>null<code>. */ Image getColumnHeaderImage(); /** * @param obj * @return The String value of the object for this particular field to be * displayed to the user. */ String getValue(Object obj); /** * @param obj * @return The image value of the object for this particular field to be * displayed to the user or <code>null<code>. */ Image getImage(Object obj); }その実装クラス
public class TitleField implements IField { public String getColumnHeaderText() { return "Title"; } public Image getColumnHeaderImage() { // TODO 自動生成されたメソッド・スタブ return null; } public String getValue(Object obj) { // TODO 自動生成されたメソッド・スタブ return obj.toString(); } public Image getImage(Object obj) { // TODO 自動生成されたメソッド・スタブ return null; } }
となるような感じです。
こうすることで、
などの効果が得られそうです。
最後にソースはこんな感じです。
//作成日: 2005/05/21 package nu.mine.kino.plugin.google.ui.views; import nu.mine.kino.plugin.google.ui.views.fields.IField; import nu.mine.kino.plugin.google.ui.views.fields.SummaryField; import nu.mine.kino.plugin.google.ui.views.fields.TitleField; import nu.mine.kino.plugin.google.ui.views.fields.URLField; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; public class GoogleResultView extends ViewPart { // TableLayoutと一緒になって使う。各カラムの表示幅など情報を設定する。 private final ColumnLayoutData[] DEFAULT_COLUMN_LAYOUTS = { new ColumnWeightData(200), new ColumnWeightData(200), new ColumnWeightData(200) }; private final IField[] VISIBLE_FIELDS = { new TitleField(), new SummaryField(), new URLField() }; private Table table; private Action doubleClickAction; private Action openBrowserAction; private IMemento memento; public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); this.memento = memento; } public void createPartControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayout(new FillLayout()); final TableViewer viewer = new TableViewer(container, SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ArrayContentProvider()); viewer.setInput(getViewSite()); initTable(viewer); createActions(); initializeToolBar(); initializeMenu(); } 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()); // tc.addSelectionListener(headerListener); } } private ColumnLayoutData[] getColumnLayouts() { if (memento == null) { return DEFAULT_COLUMN_LAYOUTS; } // ↓実際はmementoからColumnLayoutData[]を構築して返す return DEFAULT_COLUMN_LAYOUTS; } private void createActions() { openBrowserAction = new Action("サイトにアクセスする") { public void run() { } }; doubleClickAction = new Action("") { public void run() { } }; } private void initializeToolBar() { IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager(); } private void initializeMenu() { IMenuManager manager = getViewSite().getActionBars().getMenuManager(); } public void setFocus() { } }
実際にビューを表示してみると、こんな感じです。
次は 検索ロジックをビューに実装 します。
この記事は
現在のアクセス:12545