All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.jwic.controls.menu.MenuItem Maven / Gradle / Ivy

There is a newer version: 5.3.43
Show newest version
/*******************************************************************************
 * Copyright 2015 xWic group (http://www.xwic.de)
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 *  
 *******************************************************************************/
package de.jwic.controls.menu;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import de.jwic.base.IHaveEnabled;
import de.jwic.base.ImageRef;
import de.jwic.controls.actions.IAction;
import de.jwic.util.Util;

/**
 * @author lippisch
 *
 */
public class MenuItem implements Serializable, IHaveEnabled {

	private List menuSelectionListeners = new ArrayList();

	private IAction action = null;
	
	private int id = 0;
	private String title = null;
	private ImageRef iconEnabled = null;
	private ImageRef iconDisabled = null;

	private Object data = null;
	
	private boolean enabled = true;
	private boolean visible = true;
	private String tooltip = null;
	
	private int width = 150;
	
	private List menuItems = null;
	private Menu menu;
	
	private String urlToOpen;
	
	private PropertyChangeListener actionListener = new PropertyChangeListener() {
		@Override
		public void propertyChange(PropertyChangeEvent evt) {
			copyActionProperties();
		}
	};
	
	/**
	 * 
	 */
	MenuItem(Menu menu, int id) {
		this.menu = menu;
		this.id = id;
	}

	/**
	 * Add a MenuSelectionListener.
	 * @param listener
	 */
	public void addMenuSelectionListener(MenuSelectionListener listener) {
		menuSelectionListeners.add(listener);
	}
	
	/**
	 * Remove the MenuSelectionListener.
	 * @param listener
	 */
	public void removeMenuSelectionListener(MenuSelectionListener listener) {
		menuSelectionListeners.remove(listener);
	}

	
	/**
	 * Invoke the clicked event.
	 */
	public void clicked() {
		MenuEvent event = new MenuEvent(this);
		MenuSelectionListener[] l = new MenuSelectionListener[menuSelectionListeners.size()];
		l = menuSelectionListeners.toArray(l);
		for (MenuSelectionListener listener : l) {
			listener.menuItemSelected(event);
		}
		
		// now notify the action
		if (action != null) {
			action.run();
		}
	}
	

	/**
	 * Returns true if at least one MenuItem has icons. This is used
	 * during rendering to identify if a spacer has to be put in front of the
	 * menu items that do not have an icon.
	 * @return
	 */
	public boolean hasIcons() {
		if (menuItems != null) {
			for (MenuItem item : menuItems) {
				if (item.getIconEnabled() != null) {
					return true;
				}
			}
		}
		return false;
	}
		
	/**
	 * Add a MenuItem to the menu.
	 * @return
	 */
	public MenuItem addMenuItem() {
		MenuItem item = menu.createMenuItem();
		if (menuItems == null) {
			menuItems = new ArrayList();
		}
		menuItems.add(item);
		return item;
	}
	
	/**
	 * Add an item based on the specified action element. When the action is updated, the MenuItem 
	 * automatically updates itself too.
	 * @param title
	 * @return
	 */
	public MenuItem addMenuItem(IAction action) {
		MenuItem item = addMenuItem();
		item.setAction(action);
		return item;
	}

	/**
	 * Add an item with the title as specified.
	 * @param title
	 * @return
	 */
	public MenuItem addMenuItem(String title) {
		MenuItem item = addMenuItem();
		item.setTitle(title);
		return item;
	}

	/**
	 * Add an item with the title as specified.
	 * @param title
	 * @return
	 */
	public MenuItem addMenuItem(String title, ImageRef icon) {
		MenuItem item = addMenuItem();
		item.setTitle(title);
		item.setIconEnabled(icon);
		return item;
	}

	/**
	 * Associate this MenuItem with the specified action.
	 * @param action
	 */
	public void setAction(IAction action) {
		if (this.action != null) {
			this.action.removePropertyChangeListener(actionListener); // remove listener from old action..
		}
		this.action = action;
		
		if (action != null) {
			
			action.addPropertyChangeListener(actionListener);
			copyActionProperties();
		}
	}
	
	private void copyActionProperties() {
		setTitle(action.getTitle());
		setIconEnabled(action.getIconEnabled());
		setIconDisabled(action.getIconDisabled());
		setEnabled(action.isEnabled());
		setVisible(action.isVisible());
		setTooltip(action.getTooltip());
	}
	
	/**
	 * @return the title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * @param title the title to set
	 */
	public void setTitle(String title) {
		if (!Util.equals(this.title, title)) {
			this.title = title;
			menu.requireRedraw();
		}
	}

	/**
	 * @return the icon
	 */
	public ImageRef getIconEnabled() {
		return iconEnabled;
	}

	/**
	 * @param icon the icon to set
	 */
	public void setIconEnabled(ImageRef icon) {
		if (!Util.equals(this.iconEnabled, icon)) {
			this.iconEnabled = icon;
			menu.requireRedraw();
		}
	}

	/**
	 * @return the iconDisabled
	 */
	public ImageRef getIconDisabled() {
		return iconDisabled;
	}

	/**
	 * @param iconDisabled the iconDisabled to set
	 */
	public void setIconDisabled(ImageRef iconDisabled) {
		if (!Util.equals(this.iconDisabled, iconDisabled)) {
			this.iconDisabled = iconDisabled;
			menu.requireRedraw();
		}
	}

	/**
	 * Returns the icon to use.
	 * @return
	 */
	public ImageRef getIcon() {
		if (!enabled && iconDisabled != null) {
			return iconDisabled;
		}
		return iconEnabled;
	}
	
	/* (non-Javadoc)
	 * @see de.jwic.base.IHaveEnabled#isEnabled()
	 */
	@Override
	public boolean isEnabled() {
		return enabled;
	}

	/* (non-Javadoc)
	 * @see de.jwic.base.IHaveEnabled#setEnabled(boolean)
	 */
	@Override
	public void setEnabled(boolean enabled) {
		if (!Util.equals(this.enabled, enabled)) {
			this.enabled = enabled;
			menu.requireRedraw();
		}
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @return the data
	 */
	public Object getData() {
		return data;
	}

	/**
	 * @param data the data to set
	 */
	public void setData(Object data) {
		this.data = data;
	}

	/**
	 * @return the menuItems
	 */
	public List getMenuItems() {
		return menuItems;
	}

	/**
	 * @return the visible
	 */
	public boolean isVisible() {
		return visible;
	}

	/**
	 * @param visible the visible to set
	 */
	public void setVisible(boolean visible) {
		this.visible = visible;
	}

	/**
	 * @return the tooltip
	 */
	public String getTooltip() {
		return tooltip;
	}

	/**
	 * @param tooltip the tooltip to set
	 */
	public void setTooltip(String tooltip) {
		this.tooltip = tooltip;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((data == null) ? 0 : data.hashCode());
		result = prime * result + (enabled ? 1231 : 1237);
		result = prime * result
				+ ((iconDisabled == null) ? 0 : iconDisabled.hashCode());
		result = prime * result
				+ ((iconEnabled == null) ? 0 : iconEnabled.hashCode());
		result = prime * result + id;
		result = prime * result + ((title == null) ? 0 : title.hashCode());
		result = prime * result + ((tooltip == null) ? 0 : tooltip.hashCode());
		result = prime * result + (visible ? 1231 : 1237);
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MenuItem other = (MenuItem) obj;
		if (data == null) {
			if (other.data != null)
				return false;
		} else if (!data.equals(other.data))
			return false;
		if (enabled != other.enabled)
			return false;
		if (iconDisabled == null) {
			if (other.iconDisabled != null)
				return false;
		} else if (!iconDisabled.equals(other.iconDisabled))
			return false;
		if (iconEnabled == null) {
			if (other.iconEnabled != null)
				return false;
		} else if (!iconEnabled.equals(other.iconEnabled))
			return false;
		if (id != other.id)
			return false;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		if (tooltip == null) {
			if (other.tooltip != null)
				return false;
		} else if (!tooltip.equals(other.tooltip))
			return false;
		if (visible != other.visible)
			return false;
		return true;
	}

	/**
	 * @return the width
	 */
	public int getWidth() {
		return width;
	}

	/**
	 * @param width the width to set
	 */
	public void setWidth(int width) {
		this.width = width;
	}

	/**
	 * @return the urlToOpen
	 */
	public String getUrlToOpen() {
		return urlToOpen;
	}

	/**
	 * Sets the URL to be opened when clicking this MenuItem.
	 * 
* If urlToOpen is provided, then no action event will be fired when the MenuItem is clicked. Instead, * the given URL will be opened using target='_blank' * * @param urlToOpen the urlToOpen to set */ public void setUrlToOpen(String urlToOpen) { this.urlToOpen = urlToOpen; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy