文章转载自:
http://solonote.javaeye.com/blog/150906 作者:solonote
这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。
1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。
2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。
setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:
1
.
package
solonote.example.popupmenu;
2
.
3
.
import
org.eclipse.jface.action.IAction;
4
.
import
org.eclipse.jface.viewers.ISelection;
5
.
import
org.eclipse.ui.IObjectActionDelegate;
6
.
import
org.eclipse.ui.IWorkbenchPart;
7
.
8
.
public
class
Action1
implements
IObjectActionDelegate
{
9.
10. @Override
11. public void setActivePart(IAction action, IWorkbenchPart targetPart) {
12. // TODO Auto-generated method stub
13.
14. }
15.
16. @Override
17. public void run(IAction action) {
18. // TODO Auto-generated method stub
19.
20. }
21.
22. @Override
23. public void selectionChanged(IAction action, ISelection selection) {
24. // TODO Auto-generated method stub
25.
26. }
27.
28. }
step2_2.添加扩展点:
1.
<?
xml version="1.0" encoding="UTF-8"
?>
2.
<?
eclipse version="3.2"
?>
3.
<
plugin
>
4.
5.
<
extension
6. id
="application"
7. point
="org.eclipse.core.runtime.applications"
>
8.
<
application
>
9.
<
run
10. class
="solonote.example.popupmenu.Application"
>
11.
</
run
>
12.
</
application
>
13.
</
extension
>
14.
<
extension
15. point
="org.eclipse.ui.perspectives"
>
16.
<
perspective
17. name
="Perspective"
18. class
="solonote.example.popupmenu.Perspective"
19. id
="solonote.example.popupMenu.perspective"
>
20.
</
perspective
>
21.
</
extension
>
22.
<
extension
23. point
="org.eclipse.ui.views"
>
24.
<
view
25. name
="View"
26. class
="solonote.example.popupmenu.View"
27. id
="solonote.example.popupMenu.view"
>
28.
</
view
>
29.
</
extension
>
30.
<!--
弹出菜单的定义
-->
31.
<
extension
32. point
="org.eclipse.ui.popupMenus"
>
33.
<
objectContribution
34. id
="objectContribution"
35. objectClass
="java.lang.Object"
>
36.
<
action
37. class
="solonote.example.popupmenu.Action1"
38. id
="solonote.example.popupMenu.action1"
39. label
="label"
>
40.
</
action
>
41.
</
objectContribution
>
42.
</
extension
>
43.
44.
</
plugin
>
step2_3设置弹出菜单的弹出位置
修改View类
1
.
package
solonote.example.popupmenu;
2
.
3
.
import
org.eclipse.jface.action.MenuManager;
4
.
import
org.eclipse.jface.viewers.IStructuredContentProvider;
5
.
import
org.eclipse.jface.viewers.ITableLabelProvider;
6
.
import
org.eclipse.jface.viewers.LabelProvider;
7
.
import
org.eclipse.jface.viewers.TableViewer;
8
.
import
org.eclipse.jface.viewers.Viewer;
9
.
import
org.eclipse.swt.SWT;
10
.
import
org.eclipse.swt.graphics.Image;
11
.
import
org.eclipse.swt.widgets.Composite;
12
.
import
org.eclipse.swt.widgets.Menu;
13
.
import
org.eclipse.ui.ISharedImages;
14
.
import
org.eclipse.ui.PlatformUI;
15
.
import
org.eclipse.ui.part.ViewPart;
16
.
17
.
public
class
View
extends
ViewPart
{
18. public static final String ID = "solonote.example.popupMenu.view";
19.
20. private TableViewer viewer;
21.
22. /**
23. * The content provider class is responsible for providing objects to the
24. * view. It can wrap existing objects in adapters or simply return objects
25. * as-is. These objects may be sensitive to the current input of the view,
26. * or ignore it and always show the same content (like Task List, for
27. * example).
28. */
29. class ViewContentProvider implements IStructuredContentProvider {
30. public void inputChanged(Viewer v, Object oldInput, Object newInput) {
31. }
32.
33. public void dispose() {
34. }
35.
36. public Object[] getElements(Object parent) {
37. return new SimpleDTO[] { new SimpleDTO("One"), new SimpleDTO("Two"),
new SimpleDTO("Three") };
38.
39. }
40. }
41.
42. class ViewLabelProvider extends LabelProvider implements
43. ITableLabelProvider {
44. public String getColumnText(Object obj, int index) {
45. SimpleDTO dto = (SimpleDTO) obj;
46. return dto.getName();
47. }
48.
49. public Image getColumnImage(Object obj, int index) {
50. return getImage(obj);
51. }
52.
53. public Image getImage(Object obj) {
54. return PlatformUI.getWorkbench().getSharedImages().getImage(
55. ISharedImages.IMG_OBJ_ELEMENT);
56. }
57. }
58.
59. /**
60. * This is a callback that will allow us to create the viewer and initialize
61. * it.
62. */
63. public void createPartControl(Composite parent) {
64. viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
65. | SWT.V_SCROLL);
66. viewer.setContentProvider(new ViewContentProvider());
67. viewer.setLabelProvider(new ViewLabelProvider());
68. viewer.setInput(getViewSite());
69.
70. //初始化弹出菜单
71. MenuManager popupMenuManager = new MenuManager("#PopupMenu");
72. popupMenuManager.setRemoveAllWhenShown(true);
73. Menu popupMenu = popupMenuManager.createContextMenu(viewer.getTable());
74. viewer.getTable().setMenu(popupMenu);
75. //设置选择提供者和弹出菜单
76. getSite().setSelectionProvider(viewer);
77. getSite().registerContextMenu(popupMenuManager, viewer);
78. }
79.
80. /**
81. * Passing the focus request to the viewer's control.
82. */
83. public void setFocus() {
84. viewer.getControl().setFocus();
85. }
86. }
好的step2已经结束了,现在您可以运行一下程序,看看效果.
接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。
确切的说是只有选择Three时
<objectContribution
id="objectContribution"
objectClass="java.lang.Object">
节点中的Action才显示.
接下来:
step3_1修改扩展点 增加visibility项
1.
<!--
弹出菜单的定义
-->
2.
<
extension
3. point
="org.eclipse.ui.popupMenus"
>
4.
<
objectContribution
5. id
="objectContribution"
6. objectClass
="java.lang.Object"
>
7.
<
action
8. class
="solonote.example.popupmenu.Action1"
9. id
="solonote.example.popupMenu.action1"
10. label
="label"
>
11.
</
action
>
12.
<
visibility
>
13.
<
objectState
14. name
="name"
15. value
="Three"
>
16.
</
objectState
>
17.
</
visibility
>
18.
</
objectContribution
>
19.
</
extension
>
修改被选中的DTO,让其实现IActionFilter接口
1
.
package
solonote.example.popupmenu;
2
.
3
.
import
org.eclipse.ui.IActionFilter;
4
.
5
.
/**
6. * Viewer显示的项
7. * @author solonote
8. * @version 0.1.0 2007-12-26 上午11:49:41
9. */
10
.
public
class
SimpleDTO
implements
IActionFilter
{
11. /**
12. * 显示的名字
13. */
14. private String name;
15.
16. /**
17. * 返回显示的名字
18. * @return 显示的名字
19. */
20. public String getName() {
21. return name;
22. }
23.
24. /**
25. * 设置显示的名字
26. * @param name 显示的名字
27. */
28. public void setName(String name) {
29. this.name = name;
30. }
31.
32. public SimpleDTO(String name) {
33. super();
34. this.name = name;
35. }
36.
37. /**
38. * 选择时候是否显示Action的判断
39. * <visibility>
40. <objectState
41. name="name"
42. value="Three">
43. </objectState>
44. </visibility>
45. * @param target 选择的东西
46. * @param name plugin.xml里配置的name
47. * @param value plugin.xml里配置的value
48. */
49. @Override
50. public boolean testAttribute(Object target, String name, String value) {
51. System.out.println(name);
52. System.out.println(value);
53. System.out.println(target);
54. SimpleDTO dto = (SimpleDTO) target;
55. if(dto.getName().equals(value))
56. return true;
57. return false;
58. }
59.
60.
61. }
然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我 solonote@163.com
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。
1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。
2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。
setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:




























step2_2.添加扩展点:












































<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <plugin> <extension id="application" point="org.eclipse.core.runtime.applications"> <application> <run class="solonote.example.popupmenu.Application"> </run> </application> </extension> <extension point="org.eclipse.ui.perspectives"> <perspective name="Perspective" class="solonote.example.popupmenu.Perspective" id="solonote.example.popupMenu.perspective"> </perspective> </extension> <extension point="org.eclipse.ui.views"> <view name="View" class="solonote.example.popupmenu.View" id="solonote.example.popupMenu.view"> </view> </extension> <!-- 弹出菜单的定义 --> <extension point="org.eclipse.ui.popupMenus"> <objectContribution id="objectContribution" objectClass="java.lang.Object"> <action class="solonote.example.popupmenu.Action1" id="solonote.example.popupMenu.action1" label="label"> </action> </objectContribution> </extension> </plugin>
step2_3设置弹出菜单的弹出位置
修改View类





































new SimpleDTO("Three") };

















































好的step2已经结束了,现在您可以运行一下程序,看看效果.
接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。
确切的说是只有选择Three时
<objectContribution
id="objectContribution"
objectClass="java.lang.Object">
节点中的Action才显示.
接下来:
step3_1修改扩展点 增加visibility项
<!-- 弹出菜单的定义 --> <extension point="org.eclipse.ui.popupMenus"> <objectContribution id="objectContribution" objectClass="java.lang.Object"> <action class="solonote.example.popupmenu.Action1" id="solonote.example.popupMenu.action1" label="label"> </action> <visibility> <objectState name="name" value="Three"> </objectState> </visibility> </objectContribution> </extension>



















修改被选中的DTO,让其实现IActionFilter接口
package solonote.example.popupmenu; import org.eclipse.ui.IActionFilter; /** * Viewer显示的项 * @author solonote * @version 0.1.0 2007-12-26 上午11:49:41 */ public class SimpleDTO implements IActionFilter{ /** * 显示的名字 */ private String name; /** * 返回显示的名字 * @return 显示的名字 */ public String getName() { return name; } /** * 设置显示的名字 * @param name 显示的名字 */ public void setName(String name) { this.name = name; } public SimpleDTO(String name) { super(); this.name = name; } /** * 选择时候是否显示Action的判断 * <visibility> <objectState name="name" value="Three"> </objectState> </visibility> * @param target 选择的东西 * @param name plugin.xml里配置的name * @param value plugin.xml里配置的value */ @Override public boolean testAttribute(Object target, String name, String value) { System.out.println(name); System.out.println(value); System.out.println(target); SimpleDTO dto = (SimpleDTO) target; if(dto.getName().equals(value)) return true; return false; } }





























































然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我 solonote@163.com
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.