/*******************************************************************************
* Copyright (c) Emil Crumhorn - Hexapixel.com - emil.crumhorn@gmail.com
* 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:
* emil.crumhorn@gmail.com - initial API and implementation
*******************************************************************************/
package com.hexapixel.widgets.ribbon;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.MenuListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import com.hexapixel.widgets.generic.ImageCache;
public abstract class AbstractRibbonGroupItem implements MenuListener, IDisposable {
// BITVECTORS!
public static final int STYLE_NONE = SWT.NONE;
public static final int STYLE_ARROW_DOWN = 1 << 0;
// TODO: Activate, later
public static final int STYLE_ARROW_DOWN_SPLIT = 1 << 1;
public static final int STYLE_NO_DEPRESS = 1 << 2;
public static final int STYLE_TOGGLE = 1 << 3;
public static final int STYLE_TWO_LINE_TEXT = 1 << 4;
private int mXLocation;
private int mXWidth;
private boolean mHover;
private boolean mSelected;
private boolean mEnabled = true; // default is true
private boolean mTopHover;
private boolean mBottomHover;
private boolean mTopSelected;
private boolean mBottomSelected;
private boolean mLeftHover;
private boolean mRightHover;
private boolean mLeftSelected;
private boolean mRightSelected;
private Rectangle mBounds;
private int mImageVerticalAlignment = SWT.TOP;
private int mAccelerator;
private String mName;
private Image mImage;
private Image mDisabledImage;
private int mStyle;
private RibbonTooltip mTooltip;
private RibbonTooltip mTooltipBottomOrRight;
private ButtonSelectGroup mButtonSelectGroup;
private RibbonGroup mParent;
private boolean mToolbarButton;
public static final int TOOLBAR_SIDE_LEFT = 1;
public static final int TOOLBAR_SIDE_NOT_LEFT_OR_RIGHT = 2;
public static final int TOOLBAR_SIDE_RIGHT = 3;
public static final int TOOLBAR_SIDE_LEFT_AND_RIGHT = 4;
private int mToolbarSide = TOOLBAR_SIDE_NOT_LEFT_OR_RIGHT;
private List<SelectionListener> mSelectionListeners;
private Menu mMenu;
public AbstractRibbonGroupItem(RibbonGroup parent, String name, Image image, int style) {
//if (style == SWT.NONE)
//style = RibbonButton.STYLE_NO_DEPRESS;
mParent = parent;
mName = name;
mImage = image;
mStyle = style;
init();
}
public AbstractRibbonGroupItem(RibbonGroup parent, String name, Image image, Image disabledImage, int style) {
mParent = parent;
mName = name;
mImage = image;
mDisabledImage = disabledImage;
mStyle = style;
init();
}
public AbstractRibbonGroupItem(RibbonGroup parent, String name, Image image, Image disabledImage, RibbonTooltip toolTip, int style) {
mParent = parent;
mName = name;
mImage = image;
mDisabledImage = disabledImage;
mStyle = style;
mTooltip = toolTip;
init();
}
public AbstractRibbonGroupItem(QuickAccessShellToolbar parent, String name, Image image, Image disabledImage, RibbonTooltip toolTip, int style) {
//mParent = parent;
mName = name;
mImage = image;
mDisabledImage = disabledImage;
mStyle = style;
mTooltip = toolTip;
init();
}
private void init() {
mSelectionListeners = new ArrayList<SelectionListener>();
if (mParent != null) {
mMenu = new Menu(mParent.getParent());
mMenu.addMenuListener(this);
}
}
void createMenu(RibbonShell rs) {
mMenu = new Menu(rs.getShell());
mMenu.addMenuListener(this);
}
void createMenu(Control control) {
mMenu = new Menu(control);
mMenu.addMenuListener(this);
}
public void menuHidden(MenuEvent e) {
setBottomSelected(false);
}
public void menuShown(MenuEvent e) {
}
public void showMenu() {
if (mMenu.getItemCount() == 0)
return;
mMenu.setLocation(mParent.toDisplay(mBounds.x, mBounds.height+mBounds.y));
mMenu.setVisible(true);
}
public RibbonGroup getParent() {
return mParent;
}
public void setButtonSelectGroup(ButtonSelectGroup group) {
mButtonSelectGroup = group;
group.add(this);
}
public ButtonSelectGroup getButtonSelectGroup() {
return mButtonSelectGroup;
}
public void removeButtonSelectGroup(ButtonSelectGroup group) {
group.remove(this);
}
public void setToolTip(RibbonTooltip toolTip) {
mTooltip = toolTip;
}
public RibbonTooltip getToolTip() {
return mTooltip;
}
public void setTopOrLeftToolTip(RibbonTooltip toolTip) {
mTooltip = toolTip;
}
public RibbonTooltip getTopOrLeftToolTip() {
return mTooltip;
}
public void setBottomOrRightToolTip(RibbonTooltip toolTip) {
mTooltipBottomOrRight = toolTip;
}
public RibbonTooltip getBottomOrRightToolTip() {
return mTooltipBottomOrRight;
}
public boolean isHoverButton() {
return mHover;
}
public void setHoverButton(boolean hover) {
mHover = hover;
if (!hover) {
mTopHover = false;
mBottomHover = false;
mLeftHover = false;
mRightHover = false;
}
}
public void setSelected(boolean selected) {
mSelected = selected;
if (!selected) {
mTopSelected = false;
mBottomSelected = false;
mLeftSelected = false;
mRightSelected = false;
}
}
public boolean isChecked() {
return isSelected();
}
public void setChecked(boolean checked) {
setSelected(checked);
}
public boolean isToolbarButton() {
return mToolbarButton;
}
protected void setToolbarButton(boolean toolbarButton) {
mToolbarButton = toolbarButton;
}
protected void setToolbarSide(int side) {
mToolbarSide = side;
}
protected int getToolbarSide() {
return mToolbarSide;
}
public boolean isSelected() {
return mSelected;
}
public void setTopHovered(boolean hovered) {
mTopHover = hovered;
mBottomHover = false;
mLeftHover = false;
mRightHover = false;
}
public boolean isTopHovered() {
return mTopHover;
}
public void setBottomHovered(boolean hovered) {
mBottomHover = hovered;
mTopHover = false;
mLeftHover = false;
mRightHover = false;
}
public boolean isBottomHovered() {
return mBottomHover;
}
public void setTopSelected(boolean selected) {
mTopSelected = selected;
mSelected = selected;
mBottomSelected = false;
mLeftSelected = false;
mRightSelected = false;
mBottomHover = false;
mLeftHover = false;
mRightHover = false;
}
public boolean isTopSelected() {
return mTopSelected;
}
public void setBottomSelected(boolean selected) {
mBottomSelected = selected;
mSelected = selected;
mTopSelected = false;
mLeftSelected = false;
mRightSelected = false;
mTopHover = false;
mLeftHover = false;
mRightHover = false;
}
public boolean isBottomSelected() {
return mBottomSelected;
}
// --
public void setLeftHovered(boolean hovered) {
mLeftHover = hovered;
mRightHover = false;
}
public boolean isLeftHovered() {
return mLeftHover;
}
public void setRightHovered(boolean hovered) {
mRightHover = hovered;
mLeftHover = false;
mTopHover = false;
mBottomHover = false;
}
public boolean isRightHovered() {
return mRightHover;
}
public void setLeftSelected(boolean selected) {
mLeftSelected = selected;
mSelected = selected;
mRightSelected = false;
mTopSelected = false;
mBottomSelected = false;
}
public boolean isLeftSelected() {
return mLeftSelected;
}
public void setRightSelected(boolean selected) {
mRightSelected = selected;
mSelected = selected;
mLeftSelected = false;
mTopSelected = false;
mBottomSelected = false;
}
public boolean isRightSelected() {
return mRightSelected;
}
public int getX() {
return mBounds.x;
}
public int getWidth() {
return mBounds.width;
}
public Rectangle getBounds() {
return mBounds;
}
public void setBounds(Rectangle bounds) {
mBounds = bounds;
}
public Rectangle getTopBounds() {
return new Rectangle(mBounds.x, mBounds.y, mBounds.width, 38);
}
public Rectangle getBottomBounds() {
return new Rectangle(mBounds.x, mBounds.y+35, mBounds.width, mBounds.height-35);
}
public Rectangle getLeftBounds() {
return new Rectangle(mBounds.x, mBounds.y, mBounds.width-12, mBounds.height);
}
public Rectangle getRightBounds() {
return new Rectangle(mBounds.x+mBounds.width-11, mBounds.y, 11, mBounds.height);
}
public int getImageVerticalAlignment() {
return mImageVerticalAlignment;
}
public void setImageVerticalAlignment(int alignment) {
mImageVerticalAlignment = alignment;
}
public void setAccelerator(int keycode) {
mAccelerator = keycode;
}
public int getAccelerator() {
return mAccelerator;
}
public String getName() {
return mName;
}
public Image getImage() {
return mImage;
}
public void setImage(Image image) {
//ImageCache.ensureImageIsCached(image);
mImage = image;
}
public Image getDisabledImage() {
return mDisabledImage;
}
public void setDisabledImage(Image image) {
//ImageCache.ensureImageIsCached(image);
mDisabledImage = image;
}
public void setName(String name) {
mName = name;
}
public void setEnabled(boolean enabled) {
mEnabled = enabled;
}
public boolean isEnabled() {
return mEnabled;
}
public int getStyle() {
return mStyle;
}
public void setStyle(int style) {
mStyle = style;
}
public void addSelectionListener(SelectionListener listener) {
if (!mSelectionListeners.contains(listener))
mSelectionListeners.add(listener);
}
public void removeSelectionListener(SelectionListener listener) {
mSelectionListeners.remove(listener);
}
protected void notifySelectionListeners(MouseEvent me) {
Event e = new Event();
e.button = me.button;
e.data = this;
e.display = me.display;
e.stateMask = me.stateMask;
e.widget = me.widget;
e.x = me.x;
e.y = me.y;
SelectionEvent se = new SelectionEvent(e);
for (SelectionListener listener : mSelectionListeners)
listener.widgetSelected(se);
}
public boolean isSplit() {
return (mStyle & STYLE_ARROW_DOWN_SPLIT) != 0;
}
public boolean isArrow() {
return (mStyle & STYLE_ARROW_DOWN) != 0;
}
public boolean isTwoLineText() {
return (mStyle & RibbonButton.STYLE_TWO_LINE_TEXT) != 0;
}
/* public void setMenu(Menu menu) {
mMenu = menu;
}
*/
public Menu getMenu() {
return mMenu;
}
public void redraw() {
mParent.redraw(mBounds.x-4, mBounds.y, mBounds.width+8, mBounds.height, false);
}
public String toString() {
return getClass().getName() + " - " + getName() + ". loc; [bounds:" + mBounds + "] parent: " + mParent;
}
}