1 创建操作,以下创建3个操作
添加到上下文菜单
添加到菜单栏和工具栏
deleteAction的代码如下:
addAdress代码如下:
FillterAress代码如下:
AddressViewerCategoryFilter为自定义的一个过滤器,用于按类别过滤:
private void makeActions() {
// 增加的操作
ImageDescriptor deleteImage = ImageKeys
.getImageDescriptor(ImageKeys.IMG_TOOL_DELETE);
deleteAction = new DeleteAdress(this, "删除", deleteImage);
deleteAction.setDisabledImageDescriptor(ImageKeys
.getImageDescriptor(ImageKeys.IMG_TOOL_DISABLEDELETE));
ImageDescriptor addImage = ImageKeys
.getImageDescriptor(ImageKeys.IMG_TOOL_ADD);
addAction = new AddAddress(this, "添加", addImage);
ImageDescriptor filterImage = ImageKeys
.getImageDescriptor(ImageKeys.IMG_TOOL_FILTER);
filterAction = new AddressFilter(viewer, "过滤...", filterImage);
}
添加到上下文菜单
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.add(new Separator(
IWorkbenchActionConstants.MB_ADDITIONS));
// 增加操作
manager.add(addAction);
manager.add(new Separator());
manager.add(deleteAction);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
添加到菜单栏和工具栏
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
// 加到菜单栏
bars.getMenuManager().add(filterAction);
// 加到工具栏
IToolBarManager manager = bars.getToolBarManager();
manager.add(addAction);
manager.add(deleteAction);
deleteAction.setEnabled(false);//初始不可以
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
deleteAction.setEnabled(!event.getSelection().isEmpty());
}//当选中item时才能激活
});
}
deleteAction的代码如下:
public class DeleteAdress extends Action {
private AddressView view;
public DeleteAdress(AddressView view, String text,
ImageDescriptor imageDescriptor){
super(text, imageDescriptor);
this.view = view;
}
public void run()
{
AddressManager.getManager().removeAddresses(
view.getSelectedAddresses());
}
}
//view.getSelectedAddresses()为AdressView中定义的用于获取选择项的函数
public AddressItem[] getSelectedAddresses() {
IStructuredSelection selection = (IStructuredSelection) viewer
.getSelection();
AddressItem[] items = new AddressItem[selection.size()];
Iterator iter = selection.iterator();
int index = 0;
while (iter.hasNext())
items[index++] = (AddressItem) iter.next();
return items;
}
addAdress代码如下:
public class AddAddress extends Action{
private AddressView view;
public AddAddress(AddressView view, String text,
ImageDescriptor imageDescriptor){
super(text, imageDescriptor);
this.view = view;
}
public void run()
{
//临时实现,将在后续章节中最终实现
AddressItem[] addresses = new AddressItem[8];
AddressItem item1 = new AddressItem("Nemo", AddressCategory.FAMILY);
AddressItem item2 = new AddressItem("Dingding", AddressCategory.VIP);
AddressItem item3 = new AddressItem("Flysky", AddressCategory.FRIENDS);
AddressItem item4 = new AddressItem("Rainny", AddressCategory.UNKNOWN);
AddressItem item5 = new AddressItem("Brighter", AddressCategory.ORDINARY);
AddressItem item6 = new AddressItem("Snow", AddressCategory.LOVER);
AddressItem item7 = new AddressItem("Denny", AddressCategory.BUSINESS);
AddressItem item8 = new AddressItem("Lily", AddressCategory.TEACHER);
addresses[0] = item1;
addresses[1] = item2;
addresses[2] = item3;
addresses[3] = item4;
addresses[4] = item5;
addresses[5] = item6;
addresses[6] = item7;
addresses[7] = item8;
AddressManager.getManager().addAddresses(addresses);
}
}
FillterAress代码如下:
public class AddressFilter extends Action {
private final Shell shell;
private final AddressViewerCategoryFilter categoryFilter;
public AddressFilter(
StructuredViewer viewer, String text, ImageDescriptor imageDescriptor)
{
super(text, imageDescriptor);
shell = viewer.getControl().getShell();
categoryFilter = new AddressViewerCategoryFilter(viewer);
}
public void run(){
InputDialog dialog =
new InputDialog(
shell,"类别过滤", "输入一个类别名称 "
+System.getProperty("line.seperator")
+"或者置空",
categoryFilter.getPattern(),
null);
if(dialog.open() == InputDialog.OK)
categoryFilter.setPattern(dialog.getValue().trim());
}
}
AddressViewerCategoryFilter为自定义的一个过滤器,用于按类别过滤:
public class AddressViewerCategoryFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
return matcher.match(
((AddressItem) element).getCategory().getCategoryName());
}
private final StructuredViewer viewer;
private String pattern = "";
private StringMatcher matcher;
public AddressViewerCategoryFilter(StructuredViewer viewer) {
this.viewer = viewer;
}
public String getPattern() {
return pattern;
}
//设置view的过滤器,设置字符串匹配对象
public void setPattern(String newPattern) {
boolean filtering = matcher != null;
if (newPattern != null && newPattern.trim().length() > 0) {
pattern = newPattern;
matcher = new StringMatcher(pattern, true, false);
if (!filtering)
viewer.addFilter(this);
else
viewer.refresh();
}
else {
pattern = "";
matcher = null;
if (filtering)
viewer.removeFilter(this);
}
}
}