⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myactiongroup.java

📁 Eclipse从入门到精通源代码/第二篇 SWT_JFace篇(6-16章)
💻 JAVA
字号:
/**
 * @作者:陈刚
 * @Email:glchengang@yeah.net
 * @Blog:http://blog.csdn.net/glchengang
 */
package jface.tableviewer;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.actions.ActionGroup;

//--------文件名:MyActionGroup.java----------
public class MyActionGroup extends ActionGroup {
    private TableViewer tv;

    private CheckboxTableViewer ctv;

    /**
     * 用来接受TableViewer对象的构造函数。因为在Action会要使用到TableViewer对象 所以一定要把TableViewer传进来。
     */
    public MyActionGroup(TableViewer tableViewer) {
        this.tv = tableViewer;
    }

    public MyActionGroup(TableViewer v, CheckboxTableViewer ctv) {
        this.tv = v;
        this.ctv = ctv;
    }

    /**
     * 生成菜单Menu,并将两个Action传入
     */
    public void fillContextMenu(IMenuManager mgr) {
        /*
         * 加入两个Action对象到菜单管理器
         */
        MenuManager menuManager = (MenuManager) mgr; //类型转换一下,注意参数是接口
        menuManager.add(new OpenAction());
        menuManager.add(new RefreshAction());
        /*
         * 生成Menu并挂在表格table上。menu和table两个对象互为对方的参数。
         */
        Table table = tv.getTable();
        Menu menu = menuManager.createContextMenu(table);
        table.setMenu(menu);

    }

    /**
     * “打开”的Action类
     */
    private class OpenAction extends Action {
        public OpenAction() {
            setText("打开");
        }

        /**
         * 继承自Action的方法,动作代码写此方法中
         */
        public void run() {
            IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
            PeopleEntity obj = (PeopleEntity) (selection.getFirstElement());
            if (obj == null)
                MessageDialog.openInformation(null, null, "选选择记录");
            else
                MessageDialog.openInformation(null, null, obj.getName());
        }
    }

    /**
     * 刷新的Action类
     */
    private final class RefreshAction extends Action {
        public RefreshAction() {
            //给Action设置图像。getImageDesc为自定义方法,得到一个图像
            setHoverImageDescriptor(getImageDesc("refresh.gif"));
            setText("刷新");
        }

        public void run() {
            tv.refresh();//调用表格的刷新方法
        }
    }

    private class RemoveAction extends Action {
        public RemoveAction() {
            //正常情况下的图标
            setHoverImageDescriptor(getImageDesc("remove.gif"));
            //置灰(removeAction.setEnabled(false))情况下的图标
            setDisabledImageDescriptor(getImageDesc("disremove.gif"));
            setText("删除");
        }

        /**
         * 这里演示了如何从表格中删除所选的记录(可选多个)
         */
        public void run() {
            if (ctv != null) {
                Object[] checkObj = ctv.getCheckedElements(); //取得打勾的记录
                if (checkObj.length == 0) //判断是否有勾选复选框
                    MessageDialog.openInformation(null, "提示", "请先选择");
                for (int i = 0; i < checkObj.length; i++) {
                    PeopleEntity o = (PeopleEntity) checkObj[i];
                    ctv.remove(o);
                }
            } else {
                //得到选择的对象集
                IStructuredSelection s = (IStructuredSelection) tv.getSelection();
                if (s.isEmpty())
                    MessageDialog.openInformation(null, "提示", "请先选择");
                else
                    for (Iterator it = s.iterator(); it.hasNext();) {
                        PeopleEntity o = (PeopleEntity) it.next();
                        tv.remove(o);
                    }
            }
        }
    }

    private class FirstAction extends Action {
        public FirstAction() {
            setHoverImageDescriptor(getImageDesc("first.gif"));
            setText("首页");
        }

        public void run() {
            /*
             * 方法分两步: 第一步:从数据库中取出第一页的记录。
             * 第二步:使用tv.setInput()将新得的数据集数据传入TableViewer即可
             * 下一页、上一页、末页的实现方法与此雷同,实现方法参见“插件项目实战”一章
             */
        }
    }

    private class PrevAction extends Action {
        public PrevAction() {
            this.setHoverImageDescriptor(getImageDesc("prev.gif"));
            setText("上一页");
        }

        public void run() {
        }
    }

    private class NextAction extends Action {
        public NextAction() {
            this.setHoverImageDescriptor(getImageDesc("next.gif"));
            setText("下一页");
        }

        public void run() {
        }
    }

    private class LastAction extends Action {
        public LastAction() {
            setHoverImageDescriptor(getImageDesc("last.gif"));
            setText("末页");
        }

        public void run() {
        }
    }

    //新增的“全选”Action
    private class SelectAllAction extends Action {
        public SelectAllAction() {
            setHoverImageDescriptor(getImageDesc("selectall.gif"));
            setText("全选");
        }

        public void run() {
            if (ctv != null)
                ctv.setAllChecked(true); //将所有复选框打勾
        }
    }

    //新增的“全不选”Action
    private class DeselectAction extends Action {
        public DeselectAction() {
            setHoverImageDescriptor(getImageDesc("deselect.gif"));
            setText("全不选");
        }

        public void run() {
            if (ctv != null)
                ctv.setAllChecked(false); //取消所有复选框打勾
        }
    }

    /**
     * 得到一个图像的方法
     */
    public ImageDescriptor getImageDesc(String fileName) {
        try {
            URL url = new URL("file:icons/" + fileName);
            return ImageDescriptor.createFromURL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 自定义方法。生成六个Action对象,并通过工具栏管理器ToolBarManager填充进工具栏
     */
    public void fillActionToolBars(ToolBarManager actionBarManager) {
        //生成按钮,按钮就是一个个的Action
        Action removeAction = new RemoveAction();
        Action refreshAction = new RefreshAction();
        Action firstAction = new FirstAction();
        Action preAction = new PrevAction();
        Action nextAction = new NextAction();
        Action lastAction = new LastAction();
        Action selAllAction = new SelectAllAction();
        Action deselAction = new DeselectAction();

        /*
         * 将按钮通过工具栏管理器ToolBarManager填充进工具栏,如果用add(action)
         * 也是可以的,只不过只有文字没有图像。要显示图像需要将Action包装成
         * ActionContributionItem,在这里我们将包装的处理过程写成了一个方法。
         *  
         */
        actionBarManager.add(createActionContributionItem(removeAction));
        actionBarManager.add(createActionContributionItem(refreshAction));
        actionBarManager.add(createActionContributionItem(firstAction));
        actionBarManager.add(createActionContributionItem(preAction));
        actionBarManager.add(createActionContributionItem(nextAction));
        actionBarManager.add(createActionContributionItem(lastAction));
        actionBarManager.add(createActionContributionItem(selAllAction));
        actionBarManager.add(createActionContributionItem(deselAction));
        //更新工具栏。没有这一句,工具栏上会没有任何显示
        actionBarManager.update(true);
    }

    /**
     * 将Action包装成ActionContributionItem类的方法。实际上Action加入到
     * ToolBarManager或MenuManager里时,也做了ActionContributionItem的包装,
     * 大家可以看它ToolBarManager的add(IAction)的源代码即知。
     */
    ActionContributionItem createActionContributionItem(IAction action) {
        ActionContributionItem aci = new ActionContributionItem(action);
        aci.setMode(ActionContributionItem.MODE_FORCE_TEXT);//显示图像+文字
        return aci;
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -