/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.glass.ui.win;
import com.sun.glass.events.KeyEvent;
import com.sun.glass.ui.MenuItem;
import com.sun.glass.ui.MenuItem.Callback;
import com.sun.glass.ui.Pixels;
import com.sun.glass.ui.delegate.MenuItemDelegate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
final class WinMenuItemDelegate implements MenuItemDelegate {
final private MenuItem owner;
private WinMenuImpl parent = null;
private int cmdID = -1;
public WinMenuItemDelegate(MenuItem item) {
owner = item;
}
public MenuItem getOwner() {
return owner;
}
@Override public boolean createMenuItem(String title, Callback callback,
int shortcutKey, int shortcutModifiers, Pixels pixels,
boolean enabled, boolean checked) {
// nothing to to
return true;
}
// all methods report success status (true - success, false - failure)
@Override public boolean setTitle(String title) {
if (parent != null) {
title = getTitle(title, getOwner().getShortcutKey(),
getOwner().getShortcutModifiers());
return parent.setItemTitle(this, title);
}
return true;
}
@Override public boolean setCallback(Callback callback) {
// nothing to do
return true;
}
@Override public boolean setShortcut(int shortcutKey, int shortcutModifiers) {
if (parent != null) {
String title = getTitle(getOwner().getTitle(),
shortcutKey, shortcutModifiers);
return parent.setItemTitle(this, title);
}
return true;
}
@Override public boolean setPixels(Pixels pixels) {
// TODO: implement images in menuItem
return false;
}
@Override public boolean setEnabled(boolean enabled) {
if (parent != null) {
return parent.enableItem(this, enabled);
}
return true;
}
@Override public boolean setChecked(boolean checked) {
if (parent != null) {
return parent.checkItem(this, checked);
}
return true;
}
Obtains title for the specified title & shortcut
/**
* Obtains title for the specified title & shortcut
*/
private String getTitle(String title, int key, int modifiers) {
if (key == KeyEvent.VK_UNDEFINED) {
return title;
}
return title;
}
WinMenuImpl getParent() {
return parent;
}
void setParent(WinMenuImpl newParent) {
// we always switch parent through null (i.e. oldParent => null => newParent)
if (parent != null) {
CommandIDManager.freeID(cmdID);
cmdID = -1;
}
if (newParent != null) {
cmdID = CommandIDManager.getID(this);
}
parent = newParent;
}
int getCmdID() {
return cmdID;
}
static class CommandIDManager {
final private static int FIRST_ID = 1;
final private static int LAST_ID = 0xFFFF;
private static List<Integer> freeList = new ArrayList<Integer>();
final private static Map<Integer, WinMenuItemDelegate> map =
new HashMap<Integer, WinMenuItemDelegate>();
private static int nextID = FIRST_ID;
public static synchronized int getID(WinMenuItemDelegate menu) {
Integer id;
if (freeList.isEmpty()) {
if (nextID > LAST_ID) {
// TODO: handle
nextID = FIRST_ID;
}
id = nextID;
nextID++;
} else {
// get & remove last item in the list (it's faster for ArrayList)
id = freeList.remove(freeList.size() - 1);
}
map.put(id, menu);
return id;
}
public static synchronized void freeID(int cmdID) {
Integer id = Integer.valueOf(cmdID);
if (map.remove(id) != null) {
freeList.add(id);
}
}
public static WinMenuItemDelegate getHandler(int cmdID) {
return map.get(Integer.valueOf(cmdID));
}
}
}