// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。


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

動かしてみると、、、

#ref(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");
     }
 
 }
 

----
この記事は
#vote(おもしろかった[2],そうでもない[10])
#vote(おもしろかった[3],そうでもない[10])
-やりかたはわかったんだけどーじかんが。。。 -- [[きの]] &new{2006-08-09 08:53:56 (水)};
- 気づいたら、七年ぶりの更新。。 -- [[きの]] &new{2014-01-23 (木) 01:14:14};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS