1 /*
   2  * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package com.sun.glass.ui.swt;
  26 
  27 import org.eclipse.swt.*;
  28 import org.eclipse.swt.graphics.Image;
  29 import org.eclipse.swt.widgets.Event;
  30 import org.eclipse.swt.widgets.Listener;
  31 
  32 import com.sun.glass.events.KeyEvent;
  33 import com.sun.glass.ui.Menu;
  34 import com.sun.glass.ui.MenuItem;
  35 import com.sun.glass.ui.Pixels;
  36 import com.sun.glass.ui.delegate.MenuDelegate;
  37 import com.sun.glass.ui.delegate.MenuItemDelegate;
  38 
  39 final class SWTMenuDelegate implements MenuDelegate, MenuItemDelegate {
  40     
  41     String title = "";
  42     MenuItem.Callback callback;
  43     int shortcutKey;
  44     int shortcutModifiers;
  45     Pixels pixels;
  46     boolean enabled;
  47     boolean checked;
  48     
  49     org.eclipse.swt.widgets.Menu menu;
  50     org.eclipse.swt.widgets.MenuItem item;
  51     
  52     Menu menu2;
  53     
  54     public SWTMenuDelegate(Menu menu2) {
  55         this.menu2 = menu2;
  56     }
  57 
  58     public SWTMenuDelegate() {
  59     }
  60 
  61     public boolean createMenu(String title, boolean enabled) {
  62         this.title = title;
  63         this.enabled = enabled;
  64         this.menu = new org.eclipse.swt.widgets.Menu(SWTView.hiddenShell, SWT.DROP_DOWN);
  65         this.menu.addListener(SWT.Show, new Listener () {
  66             public void handleEvent(Event event) {
  67                 Menu menu2 = SWTMenuDelegate.this.menu2;
  68                 if (menu2.getEventHandler() != null) {
  69                     menu2.getEventHandler().handleMenuOpening(menu2, System.nanoTime());
  70                 }
  71             }
  72         });
  73         this.menu.addListener(SWT.Hide, new Listener () {
  74             public void handleEvent(Event event) {
  75                 Menu menu2 = SWTMenuDelegate.this.menu2;
  76                 if (menu2.getEventHandler() != null) {
  77                     menu2.getEventHandler().handleMenuClosed(menu2, System.nanoTime());
  78                 }
  79             }
  80         });
  81         return true;
  82     }
  83 
  84     public boolean createMenuItem(String title, MenuItem.Callback callback, int shortcutKey, int shortcutModifiers, Pixels pixels, boolean enabled, boolean checked) {
  85         this.title = title;
  86         this.callback = callback;
  87         this.shortcutKey = shortcutKey;
  88         this.shortcutModifiers = shortcutModifiers;
  89         this.pixels = pixels;
  90         this.enabled = enabled;
  91         this.checked = checked;
  92         return true;
  93     }
  94 
  95     public boolean setTitle(String title) {
  96         this.title = title;
  97         if (item != null) item.setText(title);
  98         return true;
  99     }
 100 
 101     public boolean setCallback(final MenuItem.Callback callback) {
 102         this.callback = callback;
 103         if (item !=  null) {
 104             item.addListener(SWT.Selection, event -> {
 105                 item.setSelection(false);
 106                 callback.action();
 107             });
 108         }
 109         return true;
 110     }
 111 
 112     public boolean setShortcut(int shortcutKey, int shortcutModifiers) {
 113         this.shortcutKey = shortcutKey;
 114         this.shortcutModifiers = shortcutModifiers;
 115         if (item != null) {
 116             int modifier = 0;
 117             if ((shortcutModifiers & KeyEvent.MODIFIER_SHIFT) != 0) modifier |= SWT.SHIFT;
 118             if ((shortcutModifiers & KeyEvent.MODIFIER_CONTROL) != 0) modifier |= SWT.CONTROL;
 119             if ((shortcutModifiers & KeyEvent.MODIFIER_ALT) != 0) modifier |= SWT.ALT;
 120             if ((shortcutModifiers & KeyEvent.MODIFIER_COMMAND) != 0) modifier |= SWT.COMMAND;
 121             int key = SWTApplication.getSWTKeyCode(shortcutKey);
 122             item.setAccelerator(modifier | key);
 123         }
 124         return true;
 125     }
 126 
 127     public boolean setPixels(Pixels pixels) {
 128         this.pixels = pixels;
 129         if (item != null) {
 130             Image oldImage = item.getImage();
 131             if (oldImage != null) {
 132                 item.setImage(null);
 133                 oldImage.dispose();
 134             }
 135             Image newImage = SWTApplication.createImage(pixels);
 136             item.setImage(newImage);
 137         }
 138         return true;
 139     }
 140 
 141     public boolean setEnabled(boolean enabled) {
 142         this.enabled = enabled;
 143         if (item != null) item.setEnabled(enabled);
 144         return true;
 145     }
 146 
 147     public boolean setChecked(boolean checked) {
 148         this.checked = checked;
 149         if (item != null) item.setSelection(checked);
 150         return true;
 151     }
 152 
 153     public boolean insert(final MenuDelegate menu, int pos) {
 154         ((SWTMenuDelegate)menu).item = new org.eclipse.swt.widgets.MenuItem(this.menu, SWT.CASCADE, pos);
 155         ((SWTMenuDelegate)menu).item.setMenu(((SWTMenuDelegate)menu).menu);
 156         ((SWTMenuDelegate)menu).setTitle(((SWTMenuDelegate)menu).title);
 157         ((SWTMenuDelegate)menu).setPixels(((SWTMenuDelegate)menu).pixels);
 158         ((SWTMenuDelegate)menu).setEnabled(((SWTMenuDelegate)menu).enabled);
 159         ((SWTMenuDelegate)menu).item.addListener(SWT.Dispose, event -> {
 160             Image oldImage = ((SWTMenuDelegate)menu).item.getImage();
 161             if (oldImage != null) {
 162                 ((SWTMenuDelegate)menu).item.setImage(null);
 163                 oldImage.dispose();
 164             }
 165             ((SWTMenuDelegate)menu).item = null;
 166         });
 167         return true;
 168     }
 169 
 170     public boolean insert(final MenuItemDelegate item, int pos) {
 171         if (item == null) {
 172             new org.eclipse.swt.widgets.MenuItem(this.menu, SWT.SEPARATOR, pos);
 173         } else {
 174             ((SWTMenuDelegate)item).item = new org.eclipse.swt.widgets.MenuItem(this.menu, SWT.CHECK, pos);
 175             ((SWTMenuDelegate)item).item.addListener(SWT.Dispose, event -> {
 176                 Image oldImage = ((SWTMenuDelegate)item).item.getImage();
 177                 if (oldImage != null) {
 178                     ((SWTMenuDelegate)item).item.setImage(null);
 179                     oldImage.dispose();
 180                 }
 181                 ((SWTMenuDelegate)item).item = null;
 182             });
 183             ((SWTMenuDelegate)item).setTitle(((SWTMenuDelegate)item).title);
 184             ((SWTMenuDelegate)item).setPixels(((SWTMenuDelegate)item).pixels);
 185             ((SWTMenuDelegate)item).setEnabled(((SWTMenuDelegate)item).enabled);
 186             ((SWTMenuDelegate)item).setChecked(((SWTMenuDelegate)item).checked);
 187             ((SWTMenuDelegate)item).setShortcut(((SWTMenuDelegate)item).shortcutKey, ((SWTMenuDelegate)item).shortcutModifiers);
 188             ((SWTMenuDelegate)item).setCallback(((SWTMenuDelegate)item).callback);
 189         }
 190         return true;
 191     }
 192 
 193     public boolean remove(MenuDelegate menu, int pos) {
 194         if (0 <= pos && pos < ((SWTMenuDelegate)menu).menu.getItemCount()) {
 195             ((SWTMenuDelegate)menu).menu.getItem(pos).dispose();
 196             ((SWTMenuDelegate)menu).menu = null;
 197             ((SWTMenuDelegate)menu).item = null;
 198         }
 199         return true;
 200     }
 201 
 202     public boolean remove(MenuItemDelegate item, int pos) {
 203         if (0 <= pos && pos < this.menu.getItemCount()) {
 204             this.menu.getItem(pos).dispose();
 205             ((SWTMenuDelegate)item).item = null;
 206         }
 207         return true;
 208     }
 209 }