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 }