Top / Eclipse / プラグイン開発のTIPS集 / タスクトレイにアイコンを表示する

Eclipse プラグインでタスクトレイのアイコンを制御する方法です。 Windowsのタスクトレイや、Macのメニューバーにアイコンを表示するには、

private TrayItem initTaskItem(IWorkbenchWindow window, String toolTip) {
    final Tray tray = window.getShell().getDisplay().getSystemTray();
    TrayItem trayItem = new TrayItem(tray, SWT.NONE);
    trayItem.setImage(appIconImage);
    trayItem.setToolTipText(toolTip);
    return trayItem;
}

という感じでTrayItem?を生成し、

final Shell shell = window.getShell();
final MenuManager trayMenu = new MenuManager();
final Menu menu = trayMenu.createContextMenu(shell);
trayMenu.add(ActionFactory.PREFERENCES.create(window)); ← Eclipseの「設定」を追加してみた

とやってMenuManager?を生成、最後に

trayItem.addMenuDetectListener(new MenuDetectListener() {
    public void menuDetected(MenuDetectEvent e) {
        menu.setVisible(true);
    }
});

動かしてみると、、、

taskTray.png

表示されました。。

終了時のDisposeなど含め、全体のソースはこんな感じ。

package nu.mine.kino.plugin.tasktray;

import org.apache.log4j.Logger;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.plugin.AbstractUIPlugin;

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger
            .getLogger(ApplicationWorkbenchWindowAdvisor.class);

    private TrayItem trayItem;

    private Image appIconImage;

    private IWorkbenchWindow window;

    public ApplicationWorkbenchWindowAdvisor(
            IWorkbenchWindowConfigurer configurer) {
        super(configurer);

        // Task Tray のアイコンイメージ
        appIconImage = AbstractUIPlugin.imageDescriptorFromPlugin(
                TaskTrayPlugin.PLUGIN_ID, "/icons/application.png")
                .createImage();

    }

    public ActionBarAdvisor createActionBarAdvisor(
            IActionBarConfigurer configurer) {
        return new ApplicationActionBarAdvisor(configurer);
    }

    public void preWindowOpen() {
        // ここはアプリ(GUI)を画面に表示しないための処理で、タスクトレイとは関係ない
        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
        configurer.setInitialSize(new Point(1, 1));
        configurer.setShowCoolBar(false);
        configurer.setShowStatusLine(false);
        configurer.setShellStyle(SWT.NONE);
        //        configurer.setTitle("TaskTray RCP"); //$NON-NLS-1$

    }

    @Override
    public void postWindowOpen() {
        window = getWindowConfigurer().getWindow();

        // ここはアプリ(GUI)を画面に表示しないための処理で、タスクトレイとは関係ない
        Shell shell = window.getShell();
        shell.setMinimized(true);
        shell.setVisible(false);
        super.postWindowOpen();

        initTrayItem("Retrieving information ...");

    }

    private void initTrayItem(String toolTip) {
        if (trayItem != null) {
            trayItem.dispose();
        }

        trayItem = initTaskItem(window, toolTip);

        final Shell shell = window.getShell();
        final MenuManager trayMenu = new MenuManager();
        final Menu menu = trayMenu.createContextMenu(shell);
        trayMenu.add(ActionFactory.PREFERENCES.create(window));
        final IWorkbenchAction quitAction = ActionFactory.QUIT.create(window);

        trayMenu.add(new Action() {
            {
                setText("Quit");
            }

            @Override
            public void run() {
                // defaultのquitActionだと、場合によってアプリが終了しないケースがあったため
                // 自前で終了処理。どうも画面にUIがないとダメなケースがあるぽい。
                shell.setVisible(true);
                shell.setMinimized(false);
                quitAction.run();
            }
        });

        trayItem.addMenuDetectListener(new MenuDetectListener() {
            public void menuDetected(MenuDetectEvent e) {
                menu.setVisible(true);
            }
        });

        trayItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                // トレイのアイコンをダブルクリックしたときの処理
            }
        });
    }

    private TrayItem initTaskItem(IWorkbenchWindow window, String toolTip) {
        final Tray tray = window.getShell().getDisplay().getSystemTray();
        TrayItem trayItem = new TrayItem(tray, SWT.NONE);
        trayItem.setImage(appIconImage);
        trayItem.setToolTipText(toolTip);
        return trayItem;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#dispose()
     */
    @Override
    public void dispose() {
        logger.debug("dispose() - start");
        appIconImage.dispose();
        trayItem.dispose();
        super.dispose();
        logger.debug("dispose() - end");
    }

}

この記事は

選択肢 投票
おもしろかった 3  
そうでもない 10  
  • やりかたはわかったんだけどーじかんが。。。 -- きの? 2006-08-09 08:53:56 (水)
  • 気づいたら、七年ぶりの更新。。 -- きの? 2014-01-23 (木) 01:14:14

Top / Eclipse / プラグイン開発のTIPS集 / タスクトレイにアイコンを表示する

現在のアクセス:10928


添付ファイル: filetaskTray.png 609件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-05-28 (月) 16:44:35 (2153d)