`
louisling
  • 浏览: 141020 次
  • 性别: 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
分享到:
评论

相关推荐

    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 sendmail for windows(wamp)

    用于本地计算机模拟,收到本地搭建的网站发出的邮件。

    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 消息头

    FakeApp2.2+core文件共1.4G

    FakeApp2.2+core文件共1.4G

    a fake download

    a fake download a fake download

    fake名字fake名字fake名字

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

    FakeApp Setup 2.2.0

    试试这款Fakeapp特别版吧,这是一个采用人工智能技术进行智能视频换脸的软件,而且Fakeapp破解版已经完美解锁所有收费功能,但是这款Fakeapp特别版需要一定的功底技术才能够完美使用,不过这款软件已经在原来的版本上...

    Fake Location(com.lerist.fakelocation).bak

    Fake Location(com.lerist.fakelocation).bak

    开源项目-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.

    HaCreator_fake_FakeIt_

    fake

    fake call 汉化版

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

    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_useragent.json

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

    FakeAPP 真实资源不假打

    Fakeapp 软件

    fake_useragent.zip

    python使用的fake_useragent.json

    FakeApp Setup0.rar

    FakeApp Setup0.rar

    fake_useragent_0.1.11.json

    python运行出现"fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached"解决方案需要的缓存文件 1.获取临时目录: [root@hwcentos ~]# python Python 3.6.5 (default, Mar 20 2019, 21:55:...

    fake location.apk

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

Global site tag (gtag.js) - Google Analytics