`
louisling
  • 浏览: 143070 次
  • 性别: Icon_minigender_1
  • 来自: ZhuHai
社区版块
存档分类
最新评论

Create fake tooltips for items in a SWT table

    博客分类:
  • RCP
阅读更多
1)
/**
 * Table that provides fake tooltips for items in a SWT table
 */
public class TooltipTable extends Table {
    private TooltipTableListener tableListener;

    protected void checkSubclass() {
    }

    public TooltipTable(Composite parent, int style) {
        super(parent, style);

        //1)
        setToolTipText("");

        //2)
        tableListener = new TooltipTableListener(this);
        addListener(SWT.Dispose, tableListener);
        addListener(SWT.KeyDown, tableListener);
        addListener(SWT.MouseExit, tableListener); //Hide tootip
        addListener(SWT.MouseDown, tableListener); //Hide tooltip
        addListener(SWT.MouseHover, tableListener); //Show tooltip
    }

    /** Default tooltip extracted from TableItem, subclass may override it */
    protected String getTooltip(TableItem item) {
        return "Hint: " + item.getText();
    }
}


2)
/**
 * Show tooltip when mouse hover TableItem
 * Hide tooltip when mouse out of TableItem and not in tooltip 
 */
public class TooltipTableListener implements Listener {
    private Shell tip;
    private Label label;
    private TooltipTable table;
    private TooltipLabelListener labelListener;
    //private String brokerName;
    private TableItem item;

    //It should > 0
    private int delayToRemoveTip = 100;
    
    //Remove tooltip when mouse out of the TableItem and not in tooltip
    private boolean isRemoveTip = true;

    public TooltipTableListener(TooltipTable table) {
        this.table = table;
        labelListener = new TooltipLabelListener();
    }

    public void handleEvent(Event event) {
        switch (event.type) {
        case SWT.Dispose:
        case SWT.KeyDown:
        case SWT.MouseDown:
        case SWT.MouseExit:
            isRemoveTip = true;
            disposeTooltip();
            break;
        case SWT.MouseHover:
            item = table.getItem(new Point(event.x, event.y));
            createTooltip();
        }
    }

    /**
     * Hide tooltip when mouse out of TableItem
     * Do it after some delay, if mouse go into tooltip, don't hide tooltip
     */
    class ReleaseTipThread extends Thread {
        public void run() {
            try {
                Thread.yield();
                Thread.sleep(delayToRemoveTip);
            } catch (Exception e) {
                e.printStackTrace();
            }

            Display.getDefault().asyncExec(new Runnable() {
                public void run() {
                    if (isRemoveTip && tip != null && !tip.isDisposed()) {
                        tip.dispose();
                        tip = null;
                    }
                }
            });
        }
    }

    private void disposeTooltip() {
        new ReleaseTipThread().start();        
    }

    private void createTooltip() {
        if (item == null) {
            disposeTooltip();
            return;
        }
        if (table.getTooltip(item) == null)
            return;

        if (tip == null || tip.isDisposed()) {
            Shell shell = table.getShell();
            Display display = table.getDisplay();

            tip = new Shell(shell, SWT.ON_TOP | SWT.TOOL);
            FillLayout layout = new FillLayout();
            tip.setLayout(layout);

            label = new Label(tip, SWT.NONE);
            //label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
            //label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
            label.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
            label.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
            label.addListener(SWT.MouseDown, labelListener);
            label.addListener(SWT.MouseHover, labelListener);
        }
        initTip();
    }

    private void initTip() {
        label.setData("_TABLEITEM", item);
        label.setText(table.getTooltip(item));
        Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        Rectangle rect = item.getBounds(0);
        Point pt = table.toDisplay(rect.x, rect.y);
        tip.setBounds(pt.x, pt.y, size.x, size.y);
        tip.setVisible(true);
    }

    /** If MouseHover in the tooltip label, don't remove the tooltip */
    class TooltipLabelListener implements Listener {
        public void handleEvent(Event event) {
            Label label = (Label) event.widget;
            if ((label == null) || label.isDisposed())
                return;

            switch (event.type) {
            case SWT.MouseHover:
                isRemoveTip = false;
                break;
            case SWT.MouseDown:
                Event e = new Event();
                e.item = (TableItem) label.getData("_TABLEITEM");
                table.setSelection(new TableItem[] { (TableItem) e.item });
                table.notifyListeners(SWT.Selection, e);
                
                isRemoveTip = true;
                disposeTooltip();
            }
        }
    }
}

1
0
分享到:
评论

相关推荐

    fake sendmail for windows(wamp)

    总结来说,"fake sendmail for windows(wamp)"是一个帮助WAMP环境下的开发者在本地进行邮件功能测试的工具。它模拟了邮件发送的过程,允许开发者在不实际发送邮件的情况下,检查和调试网站的邮件功能。通过配置PHP...

    qq.vbs, it can pretend as a fake icon for QQ, just for kidding.

    qq.vbs, it can pretend as a fake icon for QQ, just for kidding.

    Fake GPS 安装包

    Fake GPS must run in privileged mode because it interacts with the GPS intermediate driver and writes to the privileged area of the registry. Fake GPS ships with a couple of sample data files: dixies...

    json fake_useragent fake_useragent

    fake_useragent json缓存 爬虫 fake 消息头

    deepfake视频检测-基于卷积Vision-Transformer实现的deepfake视频检测源码+模型+运行说明.zip

    deepfake视频检测-基于卷积Vision-Transformer实现的deepfake视频检测源码+模型+运行说明.zipdeepfake视频检测-基于卷积Vision-Transformer实现的deepfake视频检测源码+模型+运行说明.zipdeepfake视频检测-基于卷积...

    fake2db创建自定义测试数据库填充假数据

    for data in fake_data: cursor.execute("INSERT INTO users VALUES (?, ?, ?)", data.values()) conn.commit() ``` `fake2db`还支持多种数据库适配器,如MySQL、PostgreSQL等,只需更换相应的数据库连接模块即可...

    fake名字fake名字fake名字

    fake名字fake名字fake名字fake名字fake名字

    修改以后的Fake菜单

    这需要编程语言的支持,例如C++中的`CreateMenu()`和`AppendMenu()`函数,或者在.NET框架中使用`MenuStrip`类的`Items`集合。 3. **句柄操作**:在Windows API中,菜单是由句柄(HWND)标识的。修改后的Fake菜单...

    Fake Location(com.lerist.fakelocation).bak

    Fake Location(com.lerist.fakelocation).bak

    fake_useragent.zip

    在Python编程中,Fake UserAgent库是一个非常实用的工具,它允许开发者生成逼真的用户代理字符串,以模拟不同浏览器或设备访问网站。这个工具的主要作用是帮助开发人员在进行网络爬虫或者自动化测试时,避免被目标...

    Fake Location + Vmos虚拟机

    Fake Location + Vmos虚拟机 + 步道乐跑(钉钉),《Fake Location [1] 》是一款位置模拟软件,可以通过root环境对手机所处的位置进行模拟,同时支持模拟时的移动。Vmos虚拟机的作用是能够获取root权限,步道乐跑等...

    开源项目-fsouza-fake-gcs-server.zip

    开源项目-fsouza-fake-gcs-server.zip,fake-gcs-server - Go library providing a fake Google Cloud Storage API server, intended for testing.

    fake location.apk

    Fake Location是一款很有趣的虚拟位置应用,玩过的人也应该都是知道的,可以直接实现位置的模拟,需要root权限,因为这样不容易被检测到,让模拟的成功概率更加的高,支持多级的移动速度,而且也很适合游戏的场景,...

    无需注册可用的fakelocation

    APK文件包含了应用的所有组件,包括代码、资源、资产和证书,用户可以通过安装这个文件来使用Fakelocation应用。 关于"Fakelocation"这款应用的具体功能,我们可以推测它可能具有以下特点: 1. 定位模拟:用户可以...

    kinect2_fake_laser

    ros-indigo-turtlebot-create-desktop ros-indigo-openni-* \ ros-indigo-openni2-* ros-indigo-freenect-* ros-indigo-usb-cam \ ros-indigo-laser-* ros-indigo-hokuyo-node \ ros-indigo-audio-common gstreamer...

    前端开源库-fake-fetch

    在前端开发中,"fake-fetch" 是一个非常实用的开源库,主要用来模拟 `fetch` API,以便在测试环境中进行数据获取和交互。`fetch` 是现代 Web 开发中的一个核心部分,它允许开发者向服务器发起异步请求,获取或发送...

    Laravel开发-fake-better

    `Laravel开发-fake-better`项目正是为了解决这个问题,它提供了一个更先进的仿冒(fake)数据生成器,使开发者能够快速创建出更贴近实际的数据,提升测试的准确性和效率。 在Laravel的默认情况下,`...

    fake_useragent.json

    fake_useragent 本地文件,版本为 0.1.11。FakeUserAgentError('Maximum amount of retries reached') 彻底解决办法中,fake_useragent.json 文件需要从 herokuapp 下载。为无法打开 herokuapp 网站的朋友提供下载。

    fake call 汉化版

    Fake Call v1.1 CAB汉化版 【软件类型】手机软件 【支持平台】基于ARM架构的所有 Windows Mobile 5.0 以上设备 【测试平台】Dopod900+繁体Windows Mobile 6.1 【软件大小】234K,安装后占用347K空间 【软件简介】...

Global site tag (gtag.js) - Google Analytics