您的位置:首页 > 编程语言 > Java开发

Eclipse popupMene高级教程:使用Visibility定制弹出菜单

2013-05-07 19:48 429 查看
文章转载自:http://solonote.javaeye.com/blog/150906
作者:solonote

这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。

1.文章类型:

这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。

2.此文对您的帮助:

看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。

setp1.创建一个rcp工程,模板使用有一个view的

step2.创建popupMenu

step2_1.新建类Action1:

Java代码


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>

[java] view
plaincopy

<?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类

Java代码


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项

Java代码

[java] view
plaincopy

<!-- 弹出菜单的定义 --> <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>


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接口

Java代码

[java] view
plaincopy

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; } }


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

这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.



然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我





描述: step2结束效果
大小: 13.1 KB

popupMenu.zip (21.2 KB)

描述: eclipse工程
下载次数: 277

查看图片附件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: