2、定义视图
(1)视图概述
l 视图在 Eclipse 工作台中是可视化容器,允许用户显示或导航特定类型的资源
l 视图负责从域模型中显示数据,应当将相似类型的对象分组到同一个视图中
l 这种方法使用户为完成特定任务在视图之间切换的需求最小化
l 应用程序包含的视图数量很大程度上依赖于应用程序的规模和复杂程度
l 本教程中的Google应用程序示例有两个视图,一个用于查询和显示查询结果,另一个用于显示查询结果的Web页面
(2)定义org.eclipse.ui.views扩展
}
<extension
point="org.eclipse.ui.views">
<category
name="Google"
id="com.xqtu.google.views"/>
<view
class="com.xqtu.google.views.SearchView"
category="com.xqtu.google.views"
name="Search"
id="com.xqtu.google.views.SearchView"/>
<view
class="com.xqtu.google.views.BrowserView"
category="com.xqtu.google.views"
name="Browser"
id="com.xqtu.google.views.BrowserView"/>
</extension>
l 在plugin.xml中定义org.eclipse.ui.views扩展
l <category>定义目录(用于分组);name属性指定目录名称;id属性唯一标识该目录
l <view>定义视图;class属性指定实现org.eclipse.ui.IViewPart
接口的视图类全路径,category属性(可选)指定所属目录的id;name属性指定视图名称;id属性唯一标识该视图
l SearchView视图允许用户搜索Google并在列表中显示搜索结果;BrowserView视图包含一个SWT浏览器控件,根据用户在搜索结果表中的动作显示某个特定URL的Web页面
(3)实现SearchView视图
package com.xqtu.google.views;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.internal.dialogs.ViewContentProvider;
import org.eclipse.ui.part.ViewPart;
import com.google.soap.search.GoogleSearch;
import com.google.soap.search.GoogleSearchFault;
import com.google.soap.search.GoogleSearchResult;
import com.google.soap.search.GoogleSearchResultElement;
import com.xqtu.google.wizards.LicenseKeyWizard;
public class SearchView extends ViewPart implements IDoubleClickListener {
public static final String ID = "com.xqtu.google.views.SearchView";
private TableViewer tableViewer;
private Text searchText;
private GoogleSearchResultElement model;
public void createPartControl(Composite parent) {
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
gridLayout.marginHeight = 5;
gridLayout.marginWidth = 5;
parent.setLayout(gridLayout);
Label searchLabel = new Label(parent, SWT.NONE);
searchLabel.setText("Search:");
searchText = new Text(parent, SWT.BORDER);
searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
| GridData.HORIZONTAL_ALIGN_FILL));
Button searchButton = new Button(parent, SWT.PUSH);
searchButton.setText(" Search ");
searchButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
GoogleSearch search = new GoogleSearch();
search.setKey(LicenseKeyWizard.getLicenseKey());
search.setQueryString(searchText.getText());
try {
GoogleSearchResult result = search.doSearch();
tableViewer.setInput(model);
tableViewer.add(result.getResultElements());
} catch (GoogleSearchFault ex) {
MessageDialog.openWarning(e.display.getActiveShell(),
"Google Error", ex.getMessage());
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalSpan = 3;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
tableViewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.BORDER);
tableViewer.setLabelProvider(new SearchViewLabelProvider());
tableViewer.setContentProvider(new ViewContentProvider());
tableViewer.setInput(model);
tableViewer.getControl().setLayoutData(gridData);
tableViewer.addDoubleClickListener(this);
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn titleColumn = new TableColumn(table, SWT.NONE);
titleColumn.setText("Title");
titleColumn.setWidth(250);
TableColumn urlColumn = new TableColumn(table, SWT.NONE);
urlColumn.setText("URL");
urlColumn.setWidth(200);
}
public void setFocus() {
searchText.setFocus();
}
public void doubleClick(DoubleClickEvent event) {
if (!tableViewer.getSelection().isEmpty()) {
IStructuredSelection ss = (IStructuredSelection) tableViewer
.getSelection();
GoogleSearchResultElement element = (GoogleSearchResultElement) ss
.getFirstElement();
BrowserView.browser.setUrl(element.getURL());
}
}
}
l SearchView扩展ViewPart, ViewPart是所有工作台视图的抽象基类
l 这里必须实现createPartControl
和setFocus
抽象方法,前者负责创建用户界面控件,后者用于设置缺省焦点
l SearchView使用GridLayout布局视图,主要的控件是SWT风格的标题、文本域(搜索内容)、按钮和表格(搜索结果)
l 视图按3个单元列布局,Search标题、文本域、Search按钮在一行上,表格独占3列
l Search按钮增加SelectionListener监听器,在用户选择(即点击)按钮时,执行Google搜索
l SelectionListener监听器需要实现widgetSelected和widgetDefaultSelected方法,而Google搜索功能放在widgetSelected方法中
l Google搜索:创建GoogleSearch对象;设置License Key,本教程是通过向导(后面介绍)来收集License Key值;设置查询内容(由文本域获得);执行doSearch方法进行搜索,搜索结果返回GoogleSearchResult对象;将搜索结果加载到表格中;如果搜索时出错,显示警告信息
l 表格控件使用JFace的TableViewer视图来封装
l 首先是使用GridData设置表格控件的布局:占3个网格单元列,水平和垂直拉伸并全占整个单元
l 设置TableViewer视图:具有整行全选和边框风格;使用SearchViewLabelProvider对象(后面介绍)来设置表格每行的列值;使用前面的GridData对象设置表格控件的布局;增加双击事件的监听器,在用户双击时在BrowserView视图中显示指定URL的页面
l 增加双击事件的监听器是通过SearchView视图实现IdoubleClickListener接口的方法实现,添加doubleClick方法实现具体功能
l 最后设置表格的标题头和列的宽度
l setFocus方法比较简单,设置文本域获得缺省焦点