/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.internal.ui.ridgets.swt;
import org.eclipse.core.databinding.BindingException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.MenuListener;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.riena.ui.ridgets.AbstractMarkerSupport;
import org.eclipse.riena.ui.ridgets.IMenuItemRidget;
import org.eclipse.riena.ui.swt.utils.SwtUtilities;
/**
* Ridget of a menu item.
*/
public class MenuItemRidget extends AbstractItemRidget implements IMenuItemRidget {
/**
* Workaround for bug #397884
*/
private final MenuListener enablementWatcher = new MenuAdapter() {
@Override
public void menuShown(final MenuEvent e) {
if (!SwtUtilities.isDisposed(getUIControl()) && isEnabled() != getUIControl().getEnabled()) {
getUIControl().setEnabled(isEnabled());
}
}
};
/**
* Returns whether the given menu item is a cascade menu.
*
* @param menuItem
* menu item
* @return {@code true} if item is cascade menu; otherwise {@code false}
*/
protected boolean isMenu(final MenuItem menuItem) {
if (menuItem == null) {
return false;
}
return ((menuItem.getStyle() & SWT.CASCADE) == SWT.CASCADE);
}
@Override
protected void bindUIControl() {
super.bindUIControl();
final MenuItem menuItem = getUIControl();
if (!SwtUtilities.isDisposed(menuItem)) {
menuItem.addSelectionListener(getActionObserver());
menuItem.getParent().addMenuListener(enablementWatcher);
}
}
@Override
protected void unbindUIControl() {
savedVisibleState = isVisible();
final MenuItem menuItem = getUIControl();
if (!SwtUtilities.isDisposed(menuItem) && !isMenu(menuItem)) {
menuItem.getParent().removeMenuListener(enablementWatcher);
menuItem.removeSelectionListener(getActionObserver());
}
super.unbindUIControl();
}
@Override
protected void checkUIControl(final Object uiControl) {
checkType(uiControl, MenuItem.class);
if (isMenu((MenuItem) uiControl)) {
throw new BindingException("Menu item is a cascade menu item!"); //$NON-NLS-1$
}
}
@Override
public MenuItem getUIControl() {
return (MenuItem) super.getUIControl();
}
@Override
protected AbstractMarkerSupport createMarkerSupport() {
return new MenuItemMarkerSupport(this, propertyChangeSupport);
}
@Override
protected void updateEnabled() {
if (!SwtUtilities.isDisposed(getUIControl())) {
getUIControl().setEnabled(isEnabled());
}
}
@Override
AbstractItemProperties createProperties() {
return new MenuItemProperties(this);
}
}