blob: 1bd99d8a71d2bb534bbae4030664f5b294cd3613 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.internal.theme;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.carbon.OS;
import org.eclipse.swt.internal.carbon.CGRect;
import org.eclipse.swt.internal.carbon.HIThemeSeparatorDrawInfo;
import org.eclipse.swt.internal.carbon.HIThemePopupArrowDrawInfo;
public class ToolItemDrawData extends DrawData {
public ToolBarDrawData parent;
static final int ARROW_WIDTH = 9;
static final int INSET = 3;
public ToolItemDrawData() {
state = new int[2];
}
Rectangle computeTrim(Theme theme, GC gc) {
int x = clientArea.x - INSET;
int y = clientArea.y - INSET;
int width = clientArea.width + INSET * 2;
int height = clientArea.height + INSET * 2;
if ((style & SWT.DROP_DOWN) != 0) {
width += ARROW_WIDTH;
}
return new Rectangle(x, y, width, height);
}
void draw(Theme theme, GC gc, Rectangle bounds) {
CGRect rect = new CGRect();
rect.x = bounds.x;
rect.y = bounds.y;
rect.width = bounds.width;
rect.height = bounds.height;
if ((style & SWT.SEPARATOR) != 0) {
HIThemeSeparatorDrawInfo info = getSeparatorInfo();
OS.HIThemeDrawSeparator (rect, info, gc.handle, OS.kHIThemeOrientationNormal);
} else {
if ((state[DrawData.WIDGET_WHOLE] & DrawData.SELECTED) != 0) {
OS.CGContextSaveGState (gc.handle);
OS.CGContextSetFillColor (gc.handle, new float[]{0.025f, 0.025f, 0.025f, 0.025f});
OS.CGContextFillRect (gc.handle, rect);
OS.CGContextSetStrokeColor (gc.handle, new float[]{0.2f, 0.2f, 0.2f, 0.2f});
rect.x += 0.5f;
rect.y += 0.5f;
rect.width -= 1;
rect.height -= 1;
OS.CGContextStrokeRect (gc.handle, rect);
OS.CGContextRestoreGState (gc.handle);
}
}
if (clientArea != null) {
clientArea.x = bounds.x;
clientArea.y = bounds.y;
clientArea.width = bounds.width;
clientArea.height = bounds.height;
}
if ((style & SWT.DROP_DOWN) != 0) {
rect.y = bounds.y + rect.height / 2 - 1;
rect.x = bounds.x + rect.width - ARROW_WIDTH;
HIThemePopupArrowDrawInfo info = getArrowInfo();
OS.HIThemeDrawPopupArrow (rect, info, gc.handle, OS.kHIThemeOrientationNormal);
if (clientArea != null) {
clientArea.width -= ARROW_WIDTH;
}
}
}
HIThemePopupArrowDrawInfo getArrowInfo() {
HIThemePopupArrowDrawInfo info = new HIThemePopupArrowDrawInfo();
int state = this.state[DrawData.TOOLITEM_ARROW];
if ((state & DrawData.PRESSED) != 0) {
info.state = OS.kThemeStatePressed;
} else {
if ((state & DrawData.ACTIVE) != 0) {
info.state = (state & DrawData.DISABLED) == 0 ? OS.kThemeStateActive : OS.kThemeStateUnavailable;
} else {
info.state = (state & DrawData.DISABLED) == 0 ? OS.kThemeStateInactive : OS.kThemeStateUnavailableInactive;
}
}
info.orientation = (short) OS.kThemeArrowDown;
info.size = (short) OS.kThemeArrow5pt;
return info;
}
HIThemeSeparatorDrawInfo getSeparatorInfo() {
HIThemeSeparatorDrawInfo info = new HIThemeSeparatorDrawInfo();
int state = this.state[DrawData.WIDGET_WHOLE];
if ((state & DrawData.ACTIVE) != 0) {
info.state = (state & DrawData.DISABLED) == 0 ? OS.kThemeStateActive : OS.kThemeStateUnavailable;
} else {
info.state = (state & DrawData.DISABLED) == 0 ? OS.kThemeStateInactive : OS.kThemeStateUnavailableInactive;
}
return info;
}
int hit(Theme theme, Point position, Rectangle bounds) {
if (!bounds.contains(position)) return DrawData.WIDGET_NOWHERE;
if ((style & SWT.DROP_DOWN) != 0) {
if (bounds.x + bounds.width - ARROW_WIDTH <= position.x) {
return DrawData.TOOLITEM_ARROW;
}
}
return DrawData.WIDGET_WHOLE;
}
}