SWT Ribbon Control (Work in progress) - Screenshots |
|
Features so far (major features):
- Groups - Named, Hover/Dehover colors, Dividers, Tooltip button corners on/off.
- Buttons - Normal, Toggle, Split, Toggle & Split, Enabled & disabled images. Vertical image alignments. Arrows.
- Split - Tooltip / Actions for both top & bottom. Supports toggle or non toggle for half button.
- Big - Same features as small, just different size.
- Tabs - Scrollwheel to cycle, Hover, Selected, Double-click to expand/collapse entire folder
- Checkboxes - The usual features
- Tooltips - Customizable images, text, sizes, fonts, colors, help icons, help text, rounded shell corners
- Button Dependency Groups - If button A belongs with buttons B and C and A is selected. User presses C. C is selected. A deselects.
|
Todo list:
- Event colors - Currently Normal, Hover, Hover + Selected are done, need to do Hover + Selected + MouseDown.
- Labels - Simple lables with images.
- Groups - Fade in/Fade out.
- Toolbar - All of it, included split-buttons.
- Layouts - Let user define built-ins to some extent.
... questionmarks:
- Big button - Big button in top left corner? Needed? Too much?
- What else?
|
1. Normal button with tooltip, text split on two rows, arrow. |
|
|
2. Split button, showing menu popup when bottom is clicked |
|
|
3. Split button where top is selected, no mouse focus |
|
|
4. Normal button with tooltip |
|
|
5. Same button, pressed and hovered and selected. |
|
|
6. Small split button, right part pressed down. |
|
|
7. Checkboxes, disabled with tooltip. |
|
|
8. Active tab + hover. |
|
|
9. Hover over non-active tab. |
|
|
10. Checkbox, with hover. |
|
|
11. Native control interaction (do note that "Native" group does not show hover right now, working on that). |
|
|
12. Collapsed entire tabfolder by doubleclicking tab. |
|
/******************************************************************************* * Copyright (c) Emil Crumhorn - Hexapixel.com - [email protected] * 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: * [email protected] - initial API and implementation *******************************************************************************/
package com.hexapixel.widgets.ribbon;
import java.util.List;
import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle;
import com.hexapixel.widgets.generic.ColorCache;
/** * Draws a Toolbar button in one of the following states: * * - Hover (light) * - Selected (darker) * - Selected and Hover (darkest) * * This is very down to the pixel level and not very simply done, each mode has different highlighted pixels as well so it's * not just a matter of darkening or lightening a certain color. * * @author Emil Crumhorn * */ public abstract class AbstractButtonPainter {
private static int TOP_SPACING = 2;
// SPLIT BUTTON (Mostly same colors as others, but fills and divider change) private Color mInnerTopPartTopTopSplit = ColorCache.getInstance().getColor(255, 254, 243); private Color mInnerTopPartTopBottomSplit = ColorCache.getInstance().getColor(255, 247, 217); private Color mInnerTopPartTopBottomTopSplit = ColorCache.getInstance().getColor(255, 241, 194); private Color mInnerTopPartTopBottomBottomSplit = ColorCache.getInstance().getColor(255, 240, 195); private Color mInnerTopPartTopTopSplit_Hover = ColorCache.getInstance().getColor(255, 253, 219); private Color mInnerTopPartTopBottomSplit_Hover = ColorCache.getInstance().getColor(255, 231, 144); private Color mInnerTopPartTopBottomTopSplit_Hover = ColorCache.getInstance().getColor(255, 215, 76); private Color mInnerTopPartTopBottomBottomSplit_Hover = ColorCache.getInstance().getColor(255, 211, 70);
private Color mInnerBottomPartTopSplit = ColorCache.getInstance().getColor(255, 239, 199); private Color mInnerBottomPartBottomSplit = ColorCache.getInstance().getColor(255, 247, 223); private Color mInnerBottomPartTopSplit_Hover = ColorCache.getInstance().getColor(255, 212, 83); private Color mInnerBottomPartBottomSplit_Hover = ColorCache.getInstance().getColor(255, 234, 168); private Color mInnerBottomPartTopSplit_Selected = ColorCache.getInstance().getColor(249, 170, 78); private Color mInnerBottomPartBottomSplit_Selected = ColorCache.getInstance().getColor(252, 231, 160);
private Color mInnerSplitDividerLeft = ColorCache.getInstance().getColor(219, 195, 116); private Color mInnerSplitDividerMid = ColorCache.getInstance().getColor(206, 190, 134);
private Color mInnerSplitSmallDividerTop = ColorCache.getInstance().getColor(226, 214, 189); private Color mInnerSplitSmallDividerMid = ColorCache.getInstance().getColor(205, 181, 131);
// SPLIT SMALL private Color mInnerTopPartTopTopSplitSmall = ColorCache.getInstance().getColor(255, 255, 251); private Color mInnerTopPartTopBottomSplitSmall = ColorCache.getInstance().getColor(255, 248, 224); private Color mInnerTopPartTopBottomTopSplitSmall = ColorCache.getInstance().getColor(255, 252, 192); private Color mInnerTopPartTopBottomBottomSplitSmall = ColorCache.getInstance().getColor(255, 251, 214);
/* private Color mInnerBottomTopSplit = ColorCache.getInstance().getColor(255, 254, 243); private Color mInnerBottomBottomSplit = ColorCache.getInstance().getColor(255, 254, 243); private Color mInnerBottomTopSplit_Hover = ColorCache.getInstance().getColor(255, 254, 243); private Color mInnerBottomBottomSplit_Hover = ColorCache.getInstance().getColor(255, 254, 243); */ // HOVER COLORS private Color mBorderTop_Hover = ColorCache.getInstance().getColor(221, 207, 155); private Color mBorderSideTopTop_Hover = ColorCache.getInstance().getColor(220, 206, 154); private Color mBorderSideTopBottom_Hover = ColorCache.getInstance().getColor(197, 174, 125); // 24 px high total private Color mBorderSideMidTop_Hover = ColorCache.getInstance().getColor(196, 173, 124); private Color mBorderSideMidBottom_Hover = ColorCache.getInstance().getColor(198, 178, 131); // 27 px high total private Color mBorderSideBottomTop_Hover = ColorCache.getInstance().getColor(198, 180, 135); private Color mBorderSideBottomBottom_Hover = ColorCache.getInstance().getColor(211, 206, 185); // 13 px high total private Color mBorderBottom_Hover = ColorCache.getInstance().getColor(211, 207, 188); private Color mCornerFadeTopPixel_Hover = ColorCache.getInstance().getColor(234, 226, 168); private Color mCornerFadeBottomPixel_Hover = ColorCache.getInstance().getColor(235, 225, 189); private Color mBorderInnerTop_Hover = ColorCache.getInstance().getColor(255, 255, 247); private Color mBorderInnerSideTopTop_Hover = ColorCache.getInstance().getColor(255, 255, 247); private Color mBorderInnerSideTopBottom_Hover = ColorCache.getInstance().getColor(255, 248, 223); // 23 px high total private Color mBorderInnerSideMidTop_Hover = ColorCache.getInstance().getColor(255, 243, 206); private Color mBorderInnerSideMidBottom_Hover = ColorCache.getInstance().getColor(255, 243, 173); // 27 px high total private Color mBorderInnerSideBottomTop_Hover = ColorCache.getInstance().getColor(255, 243, 170); private Color mBorderInnerSideBottomBottom_Hover = ColorCache.getInstance().getColor(255, 243, 93); // 12 px high total private Color mBorderInnerBottomCorner_Hover = ColorCache.getInstance().getColor(255, 247, 146); private Color mBorderInnerBottomMidway_Hover = ColorCache.getInstance().getColor(255, 254, 247); private Color mInnerTop_Hover = ColorCache.getInstance().getColor(255, 253, 220); private Color mInnerTopBottom_Hover = ColorCache.getInstance().getColor(255, 231, 143); private Color mInnerBottomTop_Hover = ColorCache.getInstance().getColor(255, 215, 92); private Color mInnerBottomBottom_Hover = ColorCache.getInstance().getColor(255, 233, 164); // TEXT COLOR private Color mButtonTextColor = ColorCache.getInstance().getColor(21, 66, 139); // SELECTED COLORS private Color mBorderTop_Selected = ColorCache.getInstance().getColor(142, 129, 101); private Color mBorderSideTopTop_Selected = ColorCache.getInstance().getColor(142, 129, 101); private Color mBorderSideTopBottom_Selected = ColorCache.getInstance().getColor(142, 129, 101); // 24 px high total private Color mBorderSideMidTop_Selected = ColorCache.getInstance().getColor(142, 129, 101); private Color mBorderSideMidBottom_Selected = ColorCache.getInstance().getColor(166, 155, 133); // 27 px high total private Color mBorderSideBottomTop_Selected = ColorCache.getInstance().getColor(168, 158, 136); private Color mBorderSideBottomBottom_Selected = ColorCache.getInstance().getColor(198, 192, 178); // 11 px high total private Color mCornerFadeTopPixel_Selected = ColorCache.getInstance().getColor(181, 167, 145); private Color mCornerFadeBottomPixel_Selected = ColorCache.getInstance().getColor(247, 229, 168); private Color mCornerFadeBottomInsidePixel_Selected = ColorCache.getInstance().getColor(254, 216, 93); private Color mBorderInnerSideTopTop_Selected = ColorCache.getInstance().getColor(243, 186, 95); private Color mBorderInnerSideTopBottom_Selected = ColorCache.getInstance().getColor(250, 195, 93); // 23 px high total private Color mBorderInnerSideMidTop_Selected = ColorCache.getInstance().getColor(248, 190, 81); private Color mBorderInnerSideMidBottom_Selected = ColorCache.getInstance().getColor(253, 208, 73); // 27 px high total private Color mBorderInnerSideBottomTop_Selected = ColorCache.getInstance().getColor(253, 208, 70); private Color mBorderInnerSideBottomBottom_Selected = ColorCache.getInstance().getColor(255, 208, 49); // 11 px high total private Color mBorderInnerBottomCorner_Selected = ColorCache.getInstance().getColor(255, 207, 45); private Color mBorderInnerBottomMidway_Selected = ColorCache.getInstance().getColor(255, 233, 160); private Color mBorderTopInner_Selected = ColorCache.getInstance().getColor(182, 154, 120); private Color mBorderTopInnerTwo_Selected = ColorCache.getInstance().getColor(224, 182, 136); private Color mBorderTopInnerThree_Selected = ColorCache.getInstance().getColor(245, 201, 154);
private Color mInnerTop_Selected = ColorCache.getInstance().getColor(253, 212, 168); private Color mInnerTopBottom_Selected = ColorCache.getInstance().getColor(251, 173, 95); private Color mInnerMidTop_Selected = ColorCache.getInstance().getColor(249, 148, 46); private Color mInnerMidBottom_Selected = ColorCache.getInstance().getColor(252, 226, 147); private Color mInnerBottomTop_Selected = ColorCache.getInstance().getColor(252, 230, 154); private Color mInnerBottomBottom_Selected = ColorCache.getInstance().getColor(253, 241, 176);
// SELECTED AND HOVER private Color mBorderTop_SelectedHover = ColorCache.getInstance().getColor(142, 129, 101); private Color mBorderSideTopTop_SelectedHover = ColorCache.getInstance().getColor(142, 129, 101); private Color mBorderSideTopBottom_SelectedHover = ColorCache.getInstance().getColor(142, 129, 101); // 24 px high total private Color mBorderSideMidTop_SelectedHover = ColorCache.getInstance().getColor(142, 129, 101); private Color mBorderSideMidBottom_SelectedHover = ColorCache.getInstance().getColor(166, 155, 133); // 27 px high total private Color mBorderSideBottomTop_SelectedHover = ColorCache.getInstance().getColor(168, 158, 136); private Color mBorderSideBottomBottom_SelectedHover = ColorCache.getInstance().getColor(198, 192, 178); // 11 px high total private Color mCornerFadeTopPixel_SelectedHover = ColorCache.getInstance().getColor(151, 137, 109); private Color mCornerFadeBottomPixel_SelectedHover = ColorCache.getInstance().getColor(204, 190, 165); private Color mCornerFadeBottomPixelCenter_SelectedHover = ColorCache.getInstance().getColor(225, 194, 113); private Color mBorderInnerSideTopTop_SelectedHover = ColorCache.getInstance().getColor(225, 153, 47); private Color mBorderInnerSideTopBottom_SelectedHover = ColorCache.getInstance().getColor(253, 226, 178); // 23 px high total private Color mBorderInnerSideMidTop_SelectedHover = ColorCache.getInstance().getColor(252, 226, 181); private Color mBorderInnerSideMidBottom_SelectedHover = ColorCache.getInstance().getColor(254, 229, 160); // 27 px high total private Color mBorderInnerSideBottomTop_SelectedHover = ColorCache.getInstance().getColor(254, 228, 155); private Color mBorderInnerSideBottomBottom_SelectedHover = ColorCache.getInstance().getColor(255, 223, 113); // 11 px high total private Color mBorderBottom_SelectedHover = ColorCache.getInstance().getColor(212, 197, 173); private Color mBorderInnerBottomCorner_SelectedHover = ColorCache.getInstance().getColor(255, 207, 44); private Color mBorderInnerBottomMidway_SelectedHover = ColorCache.getInstance().getColor(255, 233, 160); private Color mBorderTopInner_SelectedHover = ColorCache.getInstance().getColor(168, 136, 94); private Color mBorderTopInnerTwo_SelectedHover = ColorCache.getInstance().getColor(209, 155, 101); private Color mBorderTopInnerThree_SelectedHover = ColorCache.getInstance().getColor(233, 169, 107);
private Color mInnerTop_SelectedHover = ColorCache.getInstance().getColor(233, 169, 107); private Color mInnerTopBottom_SelectedHover = ColorCache.getInstance().getColor(227, 139, 78); private Color mInnerMidTop_SelectedHover = ColorCache.getInstance().getColor(229, 130, 50); private Color mInnerMidBottom_SelectedHover = ColorCache.getInstance().getColor(252, 203, 96); private Color mInnerBottomTop_SelectedHover = ColorCache.getInstance().getColor(249, 197, 94); private Color mInnerBottomBottom_SelectedHover = ColorCache.getInstance().getColor(252, 207, 100); // SMALL BUTTONS // HOVER private Color mSideTopTopSmall_Hover = ColorCache.getInstance().getColor(216, 202, 150); private Color mSideTopBottomSmall_Hover = ColorCache.getInstance().getColor(185, 160, 116); private Color mSideBottomTopSmall_Hover = ColorCache.getInstance().getColor(183, 158, 115); private Color mSideBottomBottomSmall_Hover = ColorCache.getInstance().getColor(184, 169, 142); private Color mBottomSmallMid_Hover = ColorCache.getInstance().getColor(203, 196, 170); private Color mBorderSmallSideBottomTop_Hover = ColorCache.getInstance().getColor(255, 242, 201); private Color mBorderSmallSideBottomBottom_Hover = ColorCache.getInstance().getColor(255, 246, 185); private Color mBorderSmallInsidePixelTop_Hover = ColorCache.getInstance().getColor(233, 223, 159); private Color mBorderSmallInsidePixelBottom_Hover = ColorCache.getInstance().getColor(233, 219, 177); // SELECTED private Color mSmallTop_Selected = ColorCache.getInstance().getColor(167, 142, 102); private Color mSmallTopInner_Selected = ColorCache.getInstance().getColor(203, 180, 153); private Color mSmallTopInnerTwo_Selected = ColorCache.getInstance().getColor(234, 209, 178); private Color mSmallLeftSide_Selected = ColorCache.getInstance().getColor(158, 130, 85); private Color mSmallRightSide_Selected = mSmallTop_Selected; private Color mBottomSmallMid_Selected = ColorCache.getInstance().getColor(204, 197, 172);
private Color mSmallFillTopTop_Selected = ColorCache.getInstance().getColor(248, 218, 183); private Color mSmallFillTopBottom_Selected = ColorCache.getInstance().getColor(254, 211, 139); private Color mSmallFillBottomTop_Selected = ColorCache.getInstance().getColor(253, 194, 92); private Color mSmallFillBottomBottom_Selected = ColorCache.getInstance().getColor(253, 234, 156); private Color mSideBottomBottomSmall_Selected = ColorCache.getInstance().getColor(184, 169, 142); private Color mBorderSmallSideTopTop_Selected = ColorCache.getInstance().getColor(239, 211, 176); private Color mBorderSmallSideTopBottom_Selected = ColorCache.getInstance().getColor(241, 178, 90); private Color mBorderSmallSideBottomTop_Selected = ColorCache.getInstance().getColor(239, 172, 72); private Color mBorderSmallSideBottomBottom_Selected = ColorCache.getInstance().getColor(230, 177, 82); private Color mBorderSmallInsidePixelTop_Selected = ColorCache.getInstance().getColor(178, 154, 120); private Color mBorderSmallInsidePixelBottom_Selected = ColorCache.getInstance().getColor(200, 163, 104);
// SELECTED AND HOVER private Color mSmallTop_SelectedHover = ColorCache.getInstance().getColor(158, 130, 85); private Color mSmallTopInner_SelectedHover = ColorCache.getInstance().getColor(189, 140, 70); private Color mSmallTopInnerTwo_SelectedHover = ColorCache.getInstance().getColor(222, 164, 87); private Color mSmallLeftSide_SelectedHover = mSmallTop_SelectedHover; private Color mSmallRightSide_SelectedHover = mSmallTop_SelectedHover; private Color mBottomSmallMid_SelectedHover = ColorCache.getInstance().getColor(204, 197, 172);
private Color mBottomSmallInnerSide_SelectedHover = ColorCache.getInstance().getColor(255, 173, 58); private Color mBottomSmallInnerMid_SelectedHover = ColorCache.getInstance().getColor(255, 201, 124);
private Color mSmallFillTopTop_SelectedHover = ColorCache.getInstance().getColor(243, 179, 101); private Color mSmallFillTopBottom_SelectedHover = ColorCache.getInstance().getColor(251, 173, 89); private Color mSmallFillBottomTop_SelectedHover = ColorCache.getInstance().getColor(250, 156, 47); private Color mSmallFillBottomBottom_SelectedHover = ColorCache.getInstance().getColor(252, 182, 16); private Color mSideBottomBottomSmall_SelectedHover = ColorCache.getInstance().getColor(184, 169, 142); private Color mBorderSmallSideTopTop_SelectedHover = ColorCache.getInstance().getColor(231, 174, 95); private Color mBorderSmallSideTopBottom_SelectedHover = ColorCache.getInstance().getColor(250, 209, 135); private Color mBorderSmallSideBottomTop_SelectedHover = ColorCache.getInstance().getColor(250, 203, 123); private Color mBorderSmallSideBottomBottom_SelectedHover = ColorCache.getInstance().getColor(254, 174, 56); private Color mBorderSmallInsidePixelTop_SelectedHover = ColorCache.getInstance().getColor(158, 130, 85); private Color mBorderSmallInsidePixelTopTwo_SelectedHover = ColorCache.getInstance().getColor(208, 156, 84); private Color mBorderSmallInsidePixelBottom_SelectedHover = ColorCache.getInstance().getColor(216, 168, 97); // ARROW private Color mArrowColor = ColorCache.getInstance().getColor(86, 125, 177); private Color mArrowColorShadow = ColorCache.getInstance().getColor(234, 242, 249); private Color mArrowColor_Disabled = ColorCache.getInstance().getColor(183, 183, 183); private Color mArrowColorShadow_Disabled = ColorCache.getInstance().getColor(237, 237, 237);
// SEPARATOR private Color mSeparatorColor = ColorCache.getInstance().getColor(251, 252, 254); private Color mSeparatorColorShadow = ColorCache.getInstance().getColor(150, 180, 218); // DISABLED TEXT private Color mTextColor_Disabled = ColorCache.getInstance().getColor(165, 141, 159); private Color mTextFadedRight_Disabled = ColorCache.getInstance().getColor(178, 214, 241); private Color mTextFadedLeft_Disabled = ColorCache.getInstance().getColor(211, 226, 210); public void drawButton(GC gc, AbstractRibbonGroupItem item) { int x = item.getX(); int y = item.getBounds().y; int width = item.getWidth(); int yMax = RibbonTabComposite.GROUP_HEIGHT; yMax -= 3; yMax -= RibbonGroup.BUTTON_BOT_HEIGHT; int imgTopSpacer = 5;
if (item instanceof RibbonGroupSeparator) { RibbonGroupSeparator rgs = (RibbonGroupSeparator) item; Rectangle rgsBounds = rgs.getBounds(); drawSeparator(gc, rgsBounds.x, rgsBounds.y, rgsBounds.height); } else if (item instanceof RibbonButton) { if (item.isEnabled() && (item.getStyle() & AbstractRibbonGroupItem.STYLE_ARROW_DOWN_SPLIT) != 0) { drawSplitButton(gc, item); return; } if (item.isEnabled()) { if (item.isHoverButton() && !item.isSelected()) { // top two lines gc.setForeground(mBorderTop_Hover); gc.drawLine(x+1, y, x+width-2, y); gc.setForeground(mBorderInnerTop_Hover); gc.drawLine(x+1, y+1, x+width-2, y+1); // pixels in corners gc.setForeground(mCornerFadeTopPixel_Hover); gc.drawLine(x+1, y+1, x+1, y+1); gc.drawLine(x+width-2, y+1, x+width-2, y+1); // sides are 3 steps we split them a bit more due to more gradients // note that outer borders stretch 1px higher and lower in the top and bottom sections, but mid stays the same // outer sides gc.setForeground(mBorderSideTopTop_Hover); gc.setBackground(mBorderSideTopBottom_Hover); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_Hover); gc.setBackground(mBorderSideMidBottom_Hover); gc.fillGradientRectangle(x, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 27, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_Hover); gc.setBackground(mBorderInnerSideMidBottom_Hover); gc.fillGradientRectangle(x+1, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-2, y+2+23, 1, 27, true); // outer bottom gc.setForeground(mBorderInnerSideBottomTop_Hover); gc.setBackground(mBorderInnerSideBottomBottom_Hover); gc.fillGradientRectangle(x+1, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23+27, 1, 12, true); // inner bottom gc.setForeground(mBorderSideBottomTop_Hover); gc.setBackground(mBorderSideBottomBottom_Hover); gc.fillGradientRectangle(x, y+2+23+27, 1, 13, true); gc.fillGradientRectangle(x+width-1, y+2+23+27, 1, 13, true); // pixel is just below so we do that now too gc.setForeground(mCornerFadeBottomPixel_Hover); gc.drawLine(x+1, y+2+23+27+12, x+1, y+2+23+27+12); gc.drawLine(x+width-2, y+2+23+27+12, x+width-2, y+2+23+27+12); // draw bottom, outer is plain, inner is a radial gradient with highlight at width/2 gc.setForeground(mBorderBottom_Hover); gc.drawLine(x+1, y+2+23+27+12+1, x+width-2, y+2+23+27+12+1); // inner, left half gc.setForeground(mBorderInnerBottomCorner_Hover); gc.setBackground(mBorderInnerBottomMidway_Hover); gc.fillGradientRectangle(x+2, y+2+23+27+12, width/2, 1, false); // inner, right half gc.setForeground(mBorderInnerBottomMidway_Hover); gc.setBackground(mBorderInnerBottomCorner_Hover); gc.fillGradientRectangle(x+2+(width/2), y+2+23+27+12, (width/2)-3, 1, false); // borders are all down, now we fill the center, which is the easy part compared gc.setForeground(mInnerTop_Hover); gc.setBackground(mInnerTopBottom_Hover); gc.fillGradientRectangle(x+2, y+2, width-4, 23, true); gc.setForeground(mInnerBottomTop_Hover); gc.setBackground(mInnerBottomBottom_Hover); gc.fillGradientRectangle(x+2, y+2+23, width-4, 39, true); } else if (item.isSelected() && !item.isHoverButton()) { // let's draw the outer box, start with top, sides, then bottom // top gc.setForeground(mBorderTop_Selected); gc.drawLine(x+1, TOP_SPACING, x+width-2, TOP_SPACING); gc.setForeground(mBorderTopInner_Selected); gc.drawLine(x+2, TOP_SPACING+1, x+width-3, TOP_SPACING+1); gc.setForeground(mBorderTopInnerTwo_Selected); gc.drawLine(x+2, TOP_SPACING+2, x+width-3, TOP_SPACING+2); gc.setForeground(mBorderTopInnerThree_Selected); gc.drawLine(x+2, TOP_SPACING+3, x+width-3, TOP_SPACING+3); // outer sides gc.setForeground(mBorderSideTopTop_Selected); gc.setBackground(mBorderSideTopBottom_Selected); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_Selected); gc.setBackground(mBorderInnerSideTopBottom_Selected); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_Selected); gc.setBackground(mBorderSideMidBottom_Selected); gc.fillGradientRectangle(x, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 27, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_Selected); gc.setBackground(mBorderInnerSideMidBottom_Selected); gc.fillGradientRectangle(x+1, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-2, y+2+23, 1, 27, true); // outer bottom gc.setForeground(mBorderInnerSideBottomTop_Selected); gc.setBackground(mBorderInnerSideBottomBottom_Selected); gc.fillGradientRectangle(x+1, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23+27, 1, 12, true); // inner bottom gc.setForeground(mBorderSideBottomTop_Selected); gc.setBackground(mBorderSideBottomBottom_Selected); gc.fillGradientRectangle(x, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-1, y+2+23+27, 1, 12, true); // draw pixel at top gc.setForeground(mCornerFadeTopPixel_Selected); gc.drawLine(x+1, TOP_SPACING+1, x+1, TOP_SPACING+1); gc.drawLine(x+width-2, TOP_SPACING+1, x+width-2, TOP_SPACING+1); // draw bottom pixel gc.setForeground(mCornerFadeBottomPixel_Selected); gc.drawLine(x, y+2+23+27+12, x, y+2+23+27+12); gc.drawLine(x+width-1, y+2+23+27+12, x+width-1, y+2+23+27+12); // fills gc.setForeground(mInnerTop_Selected); gc.setBackground(mInnerTopBottom_Selected); gc.fillGradientRectangle(x+2, y+4, width-4, 22, true); gc.setForeground(mInnerMidTop_Selected); gc.setBackground(mInnerMidBottom_Selected); gc.fillGradientRectangle(x+2, y+4+22, width-4, 26, true); gc.setForeground(mInnerBottomTop_Selected); gc.setBackground(mInnerBottomBottom_Selected); gc.fillGradientRectangle(x+2, y+4+22+26, width-4, 12, true); gc.setForeground(mInnerBottomBottom_Selected); gc.drawLine(x+3, y+4+22+26+12, x+width-4, y+4+22+26+12); // bottom border gc.setForeground(mBorderInnerBottomCorner_Selected); gc.setBackground(mBorderInnerBottomMidway_Selected); gc.fillGradientRectangle(x+1, y+4+22+26+12+1, (width/2)-2, 1, false); gc.setForeground(mBorderInnerBottomMidway_Selected); gc.setBackground(mBorderInnerBottomCorner_Selected); gc.fillGradientRectangle(x+1+(width/2)-2, y+4+22+26+12+1, (width/2)+1, 1, false); // more pixels gc.setForeground(mCornerFadeBottomInsidePixel_Selected); gc.drawLine(x+2, y+4+22+26+12, x+2, y+4+22+26+12); gc.drawLine(x+width-3, y+4+22+26+12, x+width-3, y+4+22+26+12); gc.setForeground(mBorderInnerSideBottomBottom_Selected); gc.drawLine(x+1, y+4+22+26+12, x+1, y+4+22+26+12); gc.drawLine(x+width-2, y+4+22+26+12, x+width-2, y+4+22+26+12); } else if (item.isSelected() && item.isHoverButton()) { // let's draw the outer box, start with top, sides, then bottom // top gc.setForeground(mBorderTop_SelectedHover); gc.drawLine(x+1, TOP_SPACING, x+width-2, TOP_SPACING); gc.setForeground(mBorderTopInner_SelectedHover); gc.drawLine(x+2, TOP_SPACING+1, x+width-3, TOP_SPACING+1); gc.setForeground(mBorderTopInnerTwo_SelectedHover); gc.drawLine(x+2, TOP_SPACING+2, x+width-3, TOP_SPACING+2); gc.setForeground(mBorderTopInnerThree_SelectedHover); gc.drawLine(x+2, TOP_SPACING+3, x+width-3, TOP_SPACING+3); // outer sides gc.setForeground(mBorderSideTopTop_SelectedHover); gc.setBackground(mBorderSideTopBottom_SelectedHover); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_SelectedHover); gc.setBackground(mBorderInnerSideTopBottom_SelectedHover); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_SelectedHover); gc.setBackground(mBorderSideMidBottom_SelectedHover); gc.fillGradientRectangle(x, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 27, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_SelectedHover); gc.setBackground(mBorderInnerSideMidBottom_SelectedHover); gc.fillGradientRectangle(x+1, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-2, y+2+23, 1, 27, true); // outer bottom gc.setForeground(mBorderInnerSideBottomTop_SelectedHover); gc.setBackground(mBorderInnerSideBottomBottom_SelectedHover); gc.fillGradientRectangle(x+1, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23+27, 1, 12, true); // inner bottom gc.setForeground(mBorderSideBottomTop_SelectedHover); gc.setBackground(mBorderSideBottomBottom_SelectedHover); gc.fillGradientRectangle(x, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-1, y+2+23+27, 1, 12, true); // draw pixel at top gc.setForeground(mCornerFadeTopPixel_SelectedHover); gc.drawLine(x+1, TOP_SPACING+1, x+1, TOP_SPACING+1); gc.drawLine(x+width-2, TOP_SPACING+1, x+width-2, TOP_SPACING+1); // draw bottom pixel gc.setForeground(mCornerFadeBottomPixel_SelectedHover); gc.drawLine(x, y+2+23+27+12, x, y+2+23+27+12); gc.drawLine(x+width-1, y+2+23+27+12, x+width-1, y+2+23+27+12); // fills gc.setForeground(mInnerTop_SelectedHover); gc.setBackground(mInnerTopBottom_SelectedHover); gc.fillGradientRectangle(x+2, y+4, width-4, 22, true); gc.setForeground(mInnerMidTop_SelectedHover); gc.setBackground(mInnerMidBottom_SelectedHover); gc.fillGradientRectangle(x+2, y+4+22, width-4, 26, true); gc.setForeground(mInnerBottomTop_SelectedHover); gc.setBackground(mInnerBottomBottom_SelectedHover); gc.fillGradientRectangle(x+2, y+4+22+26, width-4, 12, true); gc.setForeground(mInnerBottomBottom_SelectedHover); gc.drawLine(x+3, y+4+22+26+12, x+width-4, y+4+22+26+12); // bottom border gc.setForeground(mBorderInnerBottomCorner_SelectedHover); gc.setBackground(mBorderInnerBottomMidway_SelectedHover); gc.fillGradientRectangle(x+1, y+4+22+26+12, (width/2)-2, 1, false); gc.setForeground(mBorderInnerBottomMidway_SelectedHover); gc.setBackground(mBorderInnerBottomCorner_SelectedHover); gc.fillGradientRectangle(x+1+(width/2)-2, y+4+22+26+12, (width/2)+1, 1, false); // bottom dark gc.setForeground(mBorderBottom_SelectedHover); gc.drawLine(x+1, y+4+22+26+12+1, x+width-2, y+4+22+26+12+1); // more pixels gc.setForeground(mCornerFadeBottomPixelCenter_SelectedHover); gc.drawLine(x+1, y+4+22+26+12, x+1, y+4+22+26+12); gc.drawLine(x+width-2, y+4+22+26+12, x+width-2, y+4+22+26+12); } } Image toDraw = item.getImage(); // fallback is normal image if (!item.isEnabled()) toDraw = item.getDisabledImage() == null ? toDraw : item.getDisabledImage(); // draw image if (toDraw != null) { Rectangle imBounds = toDraw.getBounds(); int maxHeight = 32; int horizAlignment = x+(width/2)-(imBounds.width/2); switch (item.getImageVerticalAlignment()) { default: case SWT.TOP: { gc.drawImage(toDraw, horizAlignment, imgTopSpacer); break; } case SWT.BOTTOM: { int botSpacer = imBounds.height-maxHeight; if (botSpacer < 0) botSpacer = 0; botSpacer += imgTopSpacer; botSpacer *= 2; gc.drawImage(toDraw, horizAlignment, botSpacer); break; } case SWT.CENTER: { int botSpacer = Math.abs(imBounds.height-maxHeight); if (botSpacer < 0) botSpacer = 0; if (botSpacer != 0) botSpacer /= 2; botSpacer += imgTopSpacer; gc.drawImage(toDraw, horizAlignment, botSpacer); break; } } } // draw text if (item.getName() != null) { if (item.isEnabled()) { gc.setForeground(mButtonTextColor); gc.drawText(item.getName(), x+3, 40, true); } else { gc.setForeground(mTextFadedRight_Disabled); gc.drawText(item.getName(), x+4, 40, true); gc.setForeground(mTextFadedLeft_Disabled); gc.drawText(item.getName(), x+2, 40, true); gc.setForeground(mTextColor_Disabled); gc.drawText(item.getName(), x+3, 40, true); } } } else if (item instanceof RibbonButtonGroup) { RibbonButtonGroup rbg = (RibbonButtonGroup) item; List<AbstractRibbonGroupItem> buttons = rbg.getButtons(); int curY = y; int curImgY = curY + imgTopSpacer - 2; // int curX = x; if (buttons != null) { int maxImgWidth = 0; for (int i = 0; i < buttons.size(); i++) { AbstractRibbonGroupItem button = buttons.get(i); Image toUse = button.getImage(); if (!button.isEnabled()) toUse = button.getDisabledImage() == null ? toUse : button.getDisabledImage(); if (toUse != null) maxImgWidth = Math.max(maxImgWidth, toUse.getBounds().width); } for (int i = 0; i < buttons.size(); i++) { AbstractRibbonGroupItem button = buttons.get(i);
if ((button.getStyle() & RibbonButton.STYLE_ARROW_DOWN_SPLIT) != 0) drawSmallSplitButton(gc, button, maxImgWidth); else drawSmallButton(gc, button, maxImgWidth); curY += 22; curImgY += 22; } } } } private void drawSmallSplitButton(GC gc, AbstractRibbonGroupItem button, int maxImgWidth) { int x = button.getX(); int y = button.getBounds().y; int yMax = RibbonTabComposite.GROUP_HEIGHT; yMax -= 3; yMax -= RibbonGroup.BUTTON_BOT_HEIGHT; int imgTopSpacer = 5;
Rectangle bounds = button.getBounds(); int bx = bounds.x; int by = bounds.y; int bw = bounds.width; int bh = bounds.height; int curY = y; int curImgY = curY + imgTopSpacer - 2; int curX = x; // TODO: Setbounds on buttons seems off, and half is obviously 1 px off too, half is fine, but pick end pixel differently if (button.isEnabled()) { if (!button.isSelected() && button.isHoverButton()) { gc.setForeground(mBorderTop_Hover); gc.drawLine(bx+1, by, bx+bw-2, by); gc.setForeground(mBorderInnerTop_Hover); gc.drawLine(bx+1, by+1, bx+bw-2, by+1); gc.setForeground(mSideTopTopSmall_Hover); gc.setBackground(mSideTopBottomSmall_Hover); gc.fillGradientRectangle(bx, by+1, 1, 10, true); // left gc.fillGradientRectangle(bx+bw-1, by+1, 1, 10, true); // right gc.setForeground(mSideBottomTopSmall_Hover); gc.setBackground(mSideBottomBottomSmall_Hover); gc.fillGradientRectangle(bx, by+1+10, 1, 10, true); // left gc.fillGradientRectangle(bx+bw-1, by+1+10, 1, 10, true); // right gc.setForeground(mSideBottomBottomSmall_Hover); gc.setBackground(mBottomSmallMid_Hover); int half = (bw-2)/2; gc.fillGradientRectangle(bx+1, by+21, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(bx+bw-1, by+21, -half-1, 1, false); // fill if (button.isLeftHovered()) { int width = button.getLeftBounds().width; // fill left gc.setForeground(mInnerTopPartTopTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomSplitSmall); gc.fillGradientRectangle(bx+2, by+2, width-1, 9, true); gc.setForeground(mInnerTopPartTopBottomTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomBottomSplitSmall); gc.fillGradientRectangle(bx+2, by+2+9, width-1, 9, true); // fill right gc.setForeground(mInnerTop_Hover); gc.setBackground(mInnerTopBottom_Hover); gc.fillGradientRectangle(button.getRightBounds().x, by+2, button.getRightBounds().width, 9, true); gc.setForeground(mInnerBottomTop_Hover); gc.setBackground(mInnerBottomBottom_Hover); gc.fillGradientRectangle(button.getRightBounds().x, by+2+9, button.getRightBounds().width, 9, true); } else { // fill left gc.setForeground(mInnerTop_Hover); gc.setBackground(mInnerTopBottom_Hover); gc.fillGradientRectangle(bx+2, by+2, bw-4, 9, true); gc.setForeground(mInnerBottomTop_Hover); gc.setBackground(mInnerBottomBottom_Hover); gc.fillGradientRectangle(bx+2, by+2+9, bw-4, 9, true); // fill right gc.setForeground(mInnerTopPartTopTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomSplitSmall); gc.fillGradientRectangle(button.getRightBounds().x, by+2, button.getRightBounds().width, 9, true); gc.setForeground(mInnerTopPartTopBottomTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomBottomSplitSmall); gc.fillGradientRectangle(button.getRightBounds().x, by+2+9, button.getRightBounds().width, 9, true); }
// inner borders gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(bx+1, by+2, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2, 1, 9, true); gc.setForeground(mBorderSmallSideBottomTop_Hover); gc.setBackground(mBorderSmallSideBottomBottom_Hover); gc.fillGradientRectangle(bx+1, by+2+9, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2+9, 1, 9, true); // bottom border gc.setForeground(mBorderSmallSideBottomBottom_Hover); gc.drawLine(bx+1, by+2+9+9, bx+bw-2, by+2+9+9); gc.setForeground(mBorderSmallInsidePixelTop_Hover); gc.drawLine(bx+1, by+1, bx+1, by+1); gc.drawLine(bx+bw-2, by+1, bx+bw-2, by+1); gc.setForeground(mBorderSmallInsidePixelBottom_Hover); gc.drawLine(bx+1, by+1+9+9+1, bx+1, by+1+9+9+1); gc.drawLine(bx+bw-2, by+1+9+9+1, bx+bw-2, by+1+9+9+1); // draw divider gc.setForeground(mInnerSplitSmallDividerTop); gc.setBackground(mInnerSplitSmallDividerMid); gc.fillGradientRectangle(button.getRightBounds().x, y+1, 1, (bh/2)-1, true); gc.setForeground(mInnerSplitSmallDividerMid); gc.setBackground(mInnerSplitSmallDividerTop); gc.fillGradientRectangle(button.getRightBounds().x, y+(bh/2), 1, (bh/2)-1, true); } else if (button.isSelected()) { // draw hover border first gc.setForeground(mBorderTop_Hover); gc.drawLine(bx+1, by, bx+bw-2, by); gc.setForeground(mBorderInnerTop_Hover); gc.drawLine(bx+1, by+1, bx+bw-2, by+1); gc.setForeground(mSideTopTopSmall_Hover); gc.setBackground(mSideTopBottomSmall_Hover); gc.fillGradientRectangle(bx, by+1, 1, 10, true); // left gc.fillGradientRectangle(bx+bw-1, by+1, 1, 10, true); // right gc.setForeground(mSideBottomTopSmall_Hover); gc.setBackground(mSideBottomBottomSmall_Hover); gc.fillGradientRectangle(bx, by+1+10, 1, 10, true); // left gc.fillGradientRectangle(bx+bw-1, by+1+10, 1, 10, true); // right gc.setForeground(mSideBottomBottomSmall_Hover); gc.setBackground(mBottomSmallMid_Hover); int halfx = (bw-2)/2; gc.fillGradientRectangle(bx+1, by+21, halfx, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(bx+bw-1, by+21, -halfx-1, 1, false); int xx = bx+1; // left x int xw = bx+bw-2; // width if (button.isLeftSelected()) { xw = button.getRightBounds().x; } else { xx = button.getRightBounds().x; } // draw outer gc.setForeground(mSmallTop_SelectedHover); gc.drawLine(xx, by, xw, by); gc.setForeground(mSmallTopInner_SelectedHover); gc.drawLine(xx, by+1, xw, by+1); gc.setForeground(mSmallLeftSide_SelectedHover); gc.drawLine(xx-1, by+1, xx-1, by+1+19); gc.setForeground(mSmallRightSide_SelectedHover); gc.drawLine(xw+1, by+1, xw+1, by+1+19);
gc.setForeground(mSideBottomBottomSmall_SelectedHover); gc.setBackground(mBottomSmallMid_SelectedHover); int halfy = (bw-2)/2; gc.fillGradientRectangle(xx, by+21, halfy, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(xw+1, by+21, -halfy-1, 1, false);
gc.setForeground(mSmallTop_Selected); gc.drawLine(xx, by, xw, by); gc.setForeground(mSmallTopInner_Selected); gc.drawLine(xx, by+1, xw, by+1); gc.setForeground(mSmallLeftSide_Selected); gc.drawLine(xx-1, by+1, xx-1, by+1+19); gc.setForeground(mSmallRightSide_Selected); gc.drawLine(xw+1, by+1, xw+1, by+1+19);
gc.setForeground(mSideBottomBottomSmall_Selected); gc.setBackground(mBottomSmallMid_Selected); int half = (bw-2)/2; gc.fillGradientRectangle(xx, by+21, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(xw+1, by+21, -half-1, 1, false); // fill if (button.isLeftSelected()) { // left gc.setForeground(mSmallFillTopTop_SelectedHover); gc.setBackground(mSmallFillTopBottom_SelectedHover); gc.fillGradientRectangle(bx+2, by+2, bw-4, 9, true); gc.setForeground(mSmallFillBottomTop_SelectedHover); gc.setBackground(mSmallFillBottomBottom_SelectedHover); gc.fillGradientRectangle(bx+2, by+2+9, bw-4, 9, true);
// fill right gc.setForeground(mInnerTopPartTopTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomSplitSmall); gc.fillGradientRectangle(button.getRightBounds().x, by+2, button.getRightBounds().width, 9, true); gc.setForeground(mInnerTopPartTopBottomTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomBottomSplitSmall); gc.fillGradientRectangle(button.getRightBounds().x, by+2+9, button.getRightBounds().width, 9, true); } else if (button.isRightSelected()) { // fill left gc.setForeground(mInnerTopPartTopTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomSplitSmall); gc.fillGradientRectangle(bx+2, by+2, bw-4, 9, true); gc.setForeground(mInnerTopPartTopBottomTopSplitSmall); gc.setBackground(mInnerTopPartTopBottomBottomSplitSmall); gc.fillGradientRectangle(bx+2, by+2+9, bw-4, 9, true); // fill right gc.setForeground(mSmallFillTopTop_SelectedHover); gc.setBackground(mSmallFillTopBottom_SelectedHover); gc.fillGradientRectangle(button.getRightBounds().x, by+2, button.getRightBounds().width, 9, true); gc.setForeground(mSmallFillBottomTop_SelectedHover); gc.setBackground(mSmallFillBottomBottom_SelectedHover); gc.fillGradientRectangle(button.getRightBounds().x, by+2+9, button.getRightBounds().width, 9, true); } // draw hover first // inner borders gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(bx+1, by+2, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2, 1, 9, true); gc.setForeground(mBorderSmallSideBottomTop_Hover); gc.setBackground(mBorderSmallSideBottomBottom_Hover); gc.fillGradientRectangle(bx+1, by+2+9, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2+9, 1, 9, true); // bottom border gc.setForeground(mBorderSmallSideBottomBottom_Hover); gc.drawLine(bx+1, by+2+9+9, bx+bw-2, by+2+9+9); gc.setForeground(mBorderSmallInsidePixelTop_Hover); gc.drawLine(bx+1, by+1, bx+1, by+1); gc.drawLine(bx+bw-2, by+1, bx+bw-2, by+1); gc.setForeground(mBorderSmallInsidePixelBottom_Hover); gc.drawLine(bx+1, by+1+9+9+1, bx+1, by+1+9+9+1); gc.drawLine(bx+bw-2, by+1+9+9+1, bx+bw-2, by+1+9+9+1); // --- end // draw selected border second // third to top line as below inner borders will overdraw on sides gc.setForeground(mSmallTopInnerTwo_SelectedHover); gc.drawLine(xx, by+2, xw, by+2);
// inner borders gc.setForeground(mBorderSmallSideTopTop_SelectedHover); gc.setBackground(mBorderSmallSideTopBottom_SelectedHover); gc.fillGradientRectangle(xx, by+2, 1, 9, true); gc.fillGradientRectangle(xw, by+2, 1, 9, true); gc.setForeground(mBorderSmallSideBottomTop_SelectedHover); gc.setBackground(mBorderSmallSideBottomBottom_SelectedHover); gc.fillGradientRectangle(xx, by+2+9, 1, 9, true); gc.fillGradientRectangle(xw, by+2+9, 1, 9, true); // bottom border gc.setForeground(mBorderSmallSideBottomBottom_SelectedHover); gc.drawLine(xx, by+2+9+9, xw, by+2+9+9); // inner bottom gc.setForeground(mBottomSmallInnerSide_SelectedHover); gc.setBackground(mBottomSmallInnerMid_SelectedHover); gc.fillGradientRectangle(xx, by+20, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(xw+1, by+20, -half-1, 1, false); gc.setForeground(mBorderSmallInsidePixelTop_SelectedHover); gc.drawLine(xx, by+1, xx, by+1); gc.drawLine(xw, by+1, xw, by+1); gc.setForeground(mBorderSmallInsidePixelTopTwo_SelectedHover); gc.drawLine(xx, by+2, xx, by+2); gc.drawLine(xw, by+2, xw, by+2); gc.setForeground(mBorderSmallInsidePixelBottom_SelectedHover); gc.drawLine(xx, by+1+9+9+1, xx, by+1+9+9+1); gc.drawLine(xw, by+1+9+9+1, xw, by+1+9+9+1); // --- end } } Image toUse = button.getImage(); if (!button.isEnabled()) toUse = button.getDisabledImage() == null ? toUse : button.getDisabledImage();
// draw image if (toUse != null) gc.drawImage(toUse, curX + 3, curImgY); //if ((button.getStyle() & RibbonButton.STYLE_ARROW_DOWN) != 0) drawArrow(gc, curX + bw-9, curImgY+6, button.isEnabled());
// draw text if (button.getName() != null) { if (!button.isEnabled()) { gc.setForeground(mTextFadedRight_Disabled); gc.drawText(button.getName(), curX+5+maxImgWidth+3, curImgY, true); gc.setForeground(mTextFadedLeft_Disabled); gc.drawText(button.getName(), curX+3+maxImgWidth+3, curImgY, true); gc.setForeground(mTextColor_Disabled); gc.drawText(button.getName(), curX+4+maxImgWidth+3, curImgY, true); } else { gc.setForeground(mButtonTextColor); gc.drawText(button.getName(), curX+4+maxImgWidth+3, curImgY, true); } } } private void drawSmallButton(GC gc, AbstractRibbonGroupItem button, int maxImgWidth) { int x = button.getX(); int y = button.getBounds().y; int yMax = RibbonTabComposite.GROUP_HEIGHT; yMax -= 3; yMax -= RibbonGroup.BUTTON_BOT_HEIGHT; int imgTopSpacer = 5;
Rectangle bounds = button.getBounds(); int bx = bounds.x; int by = bounds.y; int bw = bounds.width; int curY = y; int curImgY = curY + imgTopSpacer - 2; int curX = x; // TODO: Setbounds on buttons seems off, and half is obviously 1 px off too, half is fine, but pick end pixel differently if (button.isEnabled()) { if (!button.isSelected() && button.isHoverButton()) { gc.setForeground(mBorderTop_Hover); gc.drawLine(bx+1, by, bx+bw-2, by); gc.setForeground(mBorderInnerTop_Hover); gc.drawLine(bx+1, by+1, bx+bw-2, by+1); gc.setForeground(mSideTopTopSmall_Hover); gc.setBackground(mSideTopBottomSmall_Hover); gc.fillGradientRectangle(bx, by+1, 1, 10, true); // left gc.fillGradientRectangle(bx+bw-1, by+1, 1, 10, true); // right gc.setForeground(mSideBottomTopSmall_Hover); gc.setBackground(mSideBottomBottomSmall_Hover); gc.fillGradientRectangle(bx, by+1+10, 1, 10, true); // left gc.fillGradientRectangle(bx+bw-1, by+1+10, 1, 10, true); // right gc.setForeground(mSideBottomBottomSmall_Hover); gc.setBackground(mBottomSmallMid_Hover); int half = (bw-2)/2; gc.fillGradientRectangle(bx+1, by+21, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(bx+bw-1, by+21, -half-1, 1, false); // fill gc.setForeground(mInnerTop_Hover); gc.setBackground(mInnerTopBottom_Hover); gc.fillGradientRectangle(bx+2, by+2, bw-4, 9, true); gc.setForeground(mInnerBottomTop_Hover); gc.setBackground(mInnerBottomBottom_Hover); gc.fillGradientRectangle(bx+2, by+2+9, bw-4, 9, true);
// inner borders gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(bx+1, by+2, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2, 1, 9, true); gc.setForeground(mBorderSmallSideBottomTop_Hover); gc.setBackground(mBorderSmallSideBottomBottom_Hover); gc.fillGradientRectangle(bx+1, by+2+9, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2+9, 1, 9, true); // bottom border gc.setForeground(mBorderSmallSideBottomBottom_Hover); gc.drawLine(bx+1, by+2+9+9, bx+bw-2, by+2+9+9); gc.setForeground(mBorderSmallInsidePixelTop_Hover); gc.drawLine(bx+1, by+1, bx+1, by+1); gc.drawLine(bx+bw-2, by+1, bx+bw-2, by+1); gc.setForeground(mBorderSmallInsidePixelBottom_Hover); gc.drawLine(bx+1, by+1+9+9+1, bx+1, by+1+9+9+1); gc.drawLine(bx+bw-2, by+1+9+9+1, bx+bw-2, by+1+9+9+1); } else if (!button.isHoverButton() && button.isSelected()) { gc.setForeground(mSmallTop_Selected); gc.drawLine(bx+1, by, bx+bw-2, by); gc.setForeground(mSmallTopInner_Selected); gc.drawLine(bx+1, by+1, bx+bw-2, by+1); gc.setForeground(mSmallLeftSide_Selected); gc.drawLine(bx, by+1, bx, by+1+19); gc.setForeground(mSmallRightSide_Selected); gc.drawLine(bx+bw-1, by+1, bx+bw-1, by+1+19);
gc.setForeground(mSideBottomBottomSmall_Selected); gc.setBackground(mBottomSmallMid_Selected); int half = (bw-2)/2; gc.fillGradientRectangle(bx+1, by+21, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(bx+bw-1, by+21, -half-1, 1, false); // fill gc.setForeground(mSmallFillTopTop_Selected); gc.setBackground(mSmallFillTopBottom_Selected); gc.fillGradientRectangle(bx+2, by+2, bw-4, 9, true); gc.setForeground(mSmallFillBottomTop_Selected); gc.setBackground(mSmallFillBottomBottom_Selected); gc.fillGradientRectangle(bx+2, by+2+9, bw-4, 9, true);
// third to top line as below inner borders will overdraw on sides gc.setForeground(mSmallTopInnerTwo_Selected); gc.drawLine(bx+1, by+2, bx+bw-2, by+2);
// inner borders gc.setForeground(mBorderSmallSideTopTop_Selected); gc.setBackground(mBorderSmallSideTopBottom_Selected); gc.fillGradientRectangle(bx+1, by+2, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2, 1, 9, true); gc.setForeground(mBorderSmallSideBottomTop_Selected); gc.setBackground(mBorderSmallSideBottomBottom_Selected); gc.fillGradientRectangle(bx+1, by+2+9, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2+9, 1, 9, true); // bottom border gc.setForeground(mBorderSmallSideBottomBottom_Selected); gc.drawLine(bx+1, by+2+9+9, bx+bw-2, by+2+9+9); gc.setForeground(mBorderSmallInsidePixelTop_Selected); gc.drawLine(bx+1, by+1, bx+1, by+1); gc.drawLine(bx+bw-2, by+1, bx+bw-2, by+1); gc.setForeground(mBorderSmallInsidePixelBottom_Selected); gc.drawLine(bx+1, by+1+9+9+1, bx+1, by+1+9+9+1); gc.drawLine(bx+bw-2, by+1+9+9+1, bx+bw-2, by+1+9+9+1);
} else if (button.isHoverButton() && button.isSelected()) { gc.setForeground(mSmallTop_SelectedHover); gc.drawLine(bx+1, by, bx+bw-2, by); gc.setForeground(mSmallTopInner_SelectedHover); gc.drawLine(bx+1, by+1, bx+bw-2, by+1); gc.setForeground(mSmallLeftSide_SelectedHover); gc.drawLine(bx, by+1, bx, by+1+19); gc.setForeground(mSmallRightSide_SelectedHover); gc.drawLine(bx+bw-1, by+1, bx+bw-1, by+1+19);
gc.setForeground(mSideBottomBottomSmall_SelectedHover); gc.setBackground(mBottomSmallMid_SelectedHover); int half = (bw-2)/2; gc.fillGradientRectangle(bx+1, by+21, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(bx+bw-1, by+21, -half-1, 1, false); // fill gc.setForeground(mSmallFillTopTop_SelectedHover); gc.setBackground(mSmallFillTopBottom_SelectedHover); gc.fillGradientRectangle(bx+2, by+2, bw-4, 9, true); gc.setForeground(mSmallFillBottomTop_SelectedHover); gc.setBackground(mSmallFillBottomBottom_SelectedHover); gc.fillGradientRectangle(bx+2, by+2+9, bw-4, 9, true);
// third to top line as below inner borders will overdraw on sides gc.setForeground(mSmallTopInnerTwo_SelectedHover); gc.drawLine(bx+1, by+2, bx+bw-2, by+2);
// inner borders gc.setForeground(mBorderSmallSideTopTop_SelectedHover); gc.setBackground(mBorderSmallSideTopBottom_SelectedHover); gc.fillGradientRectangle(bx+1, by+2, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2, 1, 9, true); gc.setForeground(mBorderSmallSideBottomTop_SelectedHover); gc.setBackground(mBorderSmallSideBottomBottom_SelectedHover); gc.fillGradientRectangle(bx+1, by+2+9, 1, 9, true); gc.fillGradientRectangle(bx+bw-2, by+2+9, 1, 9, true); // bottom border gc.setForeground(mBorderSmallSideBottomBottom_SelectedHover); gc.drawLine(bx+1, by+2+9+9, bx+bw-2, by+2+9+9); // inner bottom gc.setForeground(mBottomSmallInnerSide_SelectedHover); gc.setBackground(mBottomSmallInnerMid_SelectedHover); gc.fillGradientRectangle(bx+1, by+20, half, 1, false); // add -1 and start on the right so that if the half value is 1px off, it's ok as middle is highlight anyway gc.fillGradientRectangle(bx+bw-1, by+20, -half-1, 1, false); gc.setForeground(mBorderSmallInsidePixelTop_SelectedHover); gc.drawLine(bx+1, by+1, bx+1, by+1); gc.drawLine(bx+bw-2, by+1, bx+bw-2, by+1); gc.setForeground(mBorderSmallInsidePixelTopTwo_SelectedHover); gc.drawLine(bx+1, by+2, bx+1, by+2); gc.drawLine(bx+bw-2, by+2, bx+bw-2, by+2); gc.setForeground(mBorderSmallInsidePixelBottom_SelectedHover); gc.drawLine(bx+1, by+1+9+9+1, bx+1, by+1+9+9+1); gc.drawLine(bx+bw-2, by+1+9+9+1, bx+bw-2, by+1+9+9+1); } } Image toUse = button.getImage(); if (!button.isEnabled()) toUse = button.getDisabledImage() == null ? toUse : button.getDisabledImage();
// draw image if (toUse != null) gc.drawImage(toUse, curX + 3, curImgY); if ((button.getStyle() & RibbonButton.STYLE_ARROW_DOWN) != 0) drawArrow(gc, curX + bw-9, curImgY+5, button.isEnabled());
// draw text if (button.getName() != null) { if (!button.isEnabled()) { gc.setForeground(mTextFadedRight_Disabled); gc.drawText(button.getName(), curX+5+maxImgWidth+3, curImgY, true); gc.setForeground(mTextFadedLeft_Disabled); gc.drawText(button.getName(), curX+3+maxImgWidth+3, curImgY, true); gc.setForeground(mTextColor_Disabled); gc.drawText(button.getName(), curX+4+maxImgWidth+3, curImgY, true); } else { gc.setForeground(mButtonTextColor); gc.drawText(button.getName(), curX+4+maxImgWidth+3, curImgY, true); } } } public void drawSplitButton(GC gc, AbstractRibbonGroupItem item) { int x = item.getX(); int y = item.getBounds().y; int width = item.getWidth(); int yMax = RibbonTabComposite.GROUP_HEIGHT; yMax -= 3; yMax -= RibbonGroup.BUTTON_BOT_HEIGHT; int imgTopSpacer = 5;
if (item.isEnabled()) { if (item.isHoverButton() && !item.isSelected()) { // top two lines gc.setForeground(mBorderTop_Hover); gc.drawLine(x+1, y, x+width-2, y); gc.setForeground(mBorderInnerTop_Hover); gc.drawLine(x+1, y+1, x+width-2, y+1); // pixels in corners gc.setForeground(mCornerFadeTopPixel_Hover); gc.drawLine(x+1, y+1, x+1, y+1); gc.drawLine(x+width-2, y+1, x+width-2, y+1); // sides are 3 steps we split them a bit more due to more gradients // note that outer borders stretch 1px higher and lower in the top and bottom sections, but mid stays the same // outer sides gc.setForeground(mBorderSideTopTop_Hover); gc.setBackground(mBorderSideTopBottom_Hover); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_Hover); gc.setBackground(mBorderSideMidBottom_Hover); gc.fillGradientRectangle(x, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 27, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_Hover); gc.setBackground(mBorderInnerSideMidBottom_Hover); gc.fillGradientRectangle(x+1, y+2+22, 1, 28, true); gc.fillGradientRectangle(x+width-2, y+2+22, 1, 28, true); // outer bottom gc.setForeground(mBorderInnerSideBottomTop_Hover); gc.setBackground(mBorderInnerSideBottomBottom_Hover); gc.fillGradientRectangle(x+1, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23+27, 1, 12, true); // inner bottom gc.setForeground(mBorderSideBottomTop_Hover); gc.setBackground(mBorderSideBottomBottom_Hover); gc.fillGradientRectangle(x, y+2+23+27, 1, 13, true); gc.fillGradientRectangle(x+width-1, y+2+23+27, 1, 13, true); // pixel is just below so we do that now too gc.setForeground(mCornerFadeBottomPixel_Hover); gc.drawLine(x+1, y+2+23+27+12, x+1, y+2+23+27+12); gc.drawLine(x+width-2, y+2+23+27+12, x+width-2, y+2+23+27+12); // draw bottom gc.setForeground(mBorderBottom_Hover); gc.drawLine(x+1, y+2+23+27+12+1, x+width-2, y+2+23+27+12+1); // inner, left half gc.setForeground(mBorderInnerBottomCorner_Hover); gc.setBackground(mBorderInnerBottomMidway_Hover); gc.fillGradientRectangle(x+2, y+2+23+27+12, width/2, 1, false); // inner, right half gc.setForeground(mBorderInnerBottomMidway_Hover); gc.setBackground(mBorderInnerBottomCorner_Hover); gc.fillGradientRectangle(x+2+(width/2), y+2+23+27+12, (width/2)-3, 1, false); // fills if (item.isTopHovered()) { gc.setForeground(mInnerTopPartTopTopSplit_Hover); gc.setBackground(mInnerTopPartTopBottomSplit_Hover); } else { gc.setForeground(mInnerTopPartTopTopSplit); gc.setBackground(mInnerTopPartTopBottomSplit); } gc.fillGradientRectangle(x+2, y+2, width-4, 22, true); if (item.isTopHovered()) { gc.setForeground(mInnerTopPartTopBottomTopSplit_Hover); gc.setBackground(mInnerTopPartTopBottomBottomSplit_Hover); } else { gc.setForeground(mInnerTopPartTopBottomTopSplit); gc.setBackground(mInnerTopPartTopBottomBottomSplit); } gc.fillGradientRectangle(x+2, y+2+22, width-4, 12, true); gc.setForeground(mInnerSplitDividerLeft); gc.setBackground(mInnerSplitDividerMid); gc.fillGradientRectangle(x+1, y+2+22+12, (width/2)-2, 1, false); gc.setForeground(mInnerSplitDividerMid); gc.setBackground(mInnerSplitDividerLeft); gc.fillGradientRectangle(x+1+(width/2)-2, y+2+22+12, (width/2)+1, 1, false); if (item.isBottomHovered()) { gc.setForeground(mInnerBottomPartTopSplit_Hover); gc.setBackground(mInnerBottomPartBottomSplit_Hover); } else { gc.setForeground(mInnerBottomPartTopSplit); gc.setBackground(mInnerBottomPartBottomSplit); } gc.fillGradientRectangle(x+2, y+2+22+12+1, width-4, 27, true); } else if (item.isSelected()) { if (item.isTopSelected()) { // top two lines gc.setForeground(mBorderTop_SelectedHover); gc.drawLine(x+1, y, x+width-2, y); // pixels in corners gc.setForeground(mCornerFadeTopPixel_SelectedHover); gc.drawLine(x+1, y+1, x+1, y+1); gc.drawLine(x+width-2, y+1, x+width-2, y+1); // outer sides // -------------------- // TODO: This is a repeat of code, we draw the unselected button first, then overdraw, needs some cleaner way // -------------------- gc.setForeground(mBorderSideTopTop_Hover); gc.setBackground(mBorderSideTopBottom_Hover); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_Hover); gc.setBackground(mBorderSideMidBottom_Hover); gc.fillGradientRectangle(x, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 27, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_Hover); gc.setBackground(mBorderInnerSideMidBottom_Hover); gc.fillGradientRectangle(x+1, y+2+22, 1, 28, true); gc.fillGradientRectangle(x+width-2, y+2+22, 1, 28, true); // outer bottom gc.setForeground(mBorderInnerSideBottomTop_Hover); gc.setBackground(mBorderInnerSideBottomBottom_Hover); gc.fillGradientRectangle(x+1, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23+27, 1, 12, true); // inner bottom gc.setForeground(mBorderSideBottomTop_Hover); gc.setBackground(mBorderSideBottomBottom_Hover); gc.fillGradientRectangle(x, y+2+23+27, 1, 13, true); gc.fillGradientRectangle(x+width-1, y+2+23+27, 1, 13, true); // pixel is just below so we do that now too gc.setForeground(mCornerFadeBottomPixel_Hover); gc.drawLine(x+1, y+2+23+27+12, x+1, y+2+23+27+12); gc.drawLine(x+width-2, y+2+23+27+12, x+width-2, y+2+23+27+12); // draw bottom gc.setForeground(mBorderBottom_Hover); gc.drawLine(x+1, y+2+23+27+12+1, x+width-2, y+2+23+27+12+1); // inner, left half gc.setForeground(mBorderInnerBottomCorner_Hover); gc.setBackground(mBorderInnerBottomMidway_Hover); gc.fillGradientRectangle(x+2, y+2+23+27+12, width/2, 1, false); // inner, right half gc.setForeground(mBorderInnerBottomMidway_Hover); gc.setBackground(mBorderInnerBottomCorner_Hover); gc.fillGradientRectangle(x+2+(width/2), y+2+23+27+12, (width/2)-3, 1, false); // -------------------- END ---------------------- // let's draw the outer box, start with top, sides, then bottom // top gc.setForeground(mBorderTop_SelectedHover); gc.drawLine(x+1, TOP_SPACING, x+width-2, TOP_SPACING); gc.setForeground(mBorderTopInner_SelectedHover); gc.drawLine(x+2, TOP_SPACING+1, x+width-3, TOP_SPACING+1); gc.setForeground(mBorderTopInnerTwo_SelectedHover); gc.drawLine(x+2, TOP_SPACING+2, x+width-3, TOP_SPACING+2); gc.setForeground(mBorderTopInnerThree_SelectedHover); gc.drawLine(x+2, TOP_SPACING+3, x+width-3, TOP_SPACING+3); // outer sides gc.setForeground(mBorderSideTopTop_SelectedHover); gc.setBackground(mBorderSideTopBottom_SelectedHover); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_SelectedHover); gc.setBackground(mBorderInnerSideTopBottom_SelectedHover); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_SelectedHover); gc.setBackground(mBorderSideMidBottom_SelectedHover); gc.fillGradientRectangle(x, y+2+23, 1, 12, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 12, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_SelectedHover); gc.setBackground(mBorderInnerSideMidBottom_SelectedHover); gc.fillGradientRectangle(x+1, y+2+23, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23, 1, 12, true); // draw pixel at top gc.setForeground(mCornerFadeTopPixel_SelectedHover); gc.drawLine(x+1, TOP_SPACING+1, x+1, TOP_SPACING+1); gc.drawLine(x+width-2, TOP_SPACING+1, x+width-2, TOP_SPACING+1); // draw bottom pixel gc.setForeground(mCornerFadeBottomPixel_SelectedHover); gc.drawLine(x, y+2+23+27+12, x, y+2+23+27+12); gc.drawLine(x+width-1, y+2+23+27+12, x+width-1, y+2+23+27+12); // fill gc.setForeground(mInnerTop_SelectedHover); gc.setBackground(mInnerTopBottom_SelectedHover); gc.fillGradientRectangle(x+2, y+4, width-4, 22, true); gc.setForeground(mInnerMidTop_SelectedHover); gc.setBackground(mInnerMidBottom_SelectedHover); gc.fillGradientRectangle(x+2, y+4+22, width-4, 12, true); // bottom gc.setForeground(mInnerBottomPartTopSplit); gc.setBackground(mInnerBottomPartBottomSplit); gc.fillGradientRectangle(x+2, y+2+22+12+1, width-4, 27, true); } else if (item.isBottomSelected()) { gc.setForeground(mBorderTop_Hover); gc.drawLine(x+1, y, x+width-2, y); gc.setForeground(mBorderInnerTop_Hover); gc.drawLine(x+1, y+1, x+width-2, y+1);
// pixels in corners gc.setForeground(mCornerFadeTopPixel_SelectedHover); gc.drawLine(x+1, y+1, x+1, y+1); gc.drawLine(x+width-2, y+1, x+width-2, y+1);
// outer sides // -------------------- // TODO: This is a repeat of code, we draw the unselected button first, then overdraw, needs some cleaner way // -------------------- gc.setForeground(mBorderSideTopTop_Hover); gc.setBackground(mBorderSideTopBottom_Hover); gc.fillGradientRectangle(x, y+1, 1, 24, true); gc.fillGradientRectangle(x+width-1, y+1, 1, 24, true); // inner sides gc.setForeground(mBorderInnerSideTopTop_Hover); gc.setBackground(mBorderInnerSideTopBottom_Hover); gc.fillGradientRectangle(x+1, y+2, 1, 23, true); gc.fillGradientRectangle(x+width-2, y+2, 1, 23, true); // outer mid gc.setForeground(mBorderSideMidTop_Hover); gc.setBackground(mBorderSideMidBottom_Hover); gc.fillGradientRectangle(x, y+2+23, 1, 27, true); gc.fillGradientRectangle(x+width-1, y+2+23, 1, 27, true); // inner mid gc.setForeground(mBorderInnerSideMidTop_Hover); gc.setBackground(mBorderInnerSideMidBottom_Hover); gc.fillGradientRectangle(x+1, y+2+22, 1, 28, true); gc.fillGradientRectangle(x+width-2, y+2+22, 1, 28, true); // outer bottom gc.setForeground(mBorderInnerSideBottomTop_Hover); gc.setBackground(mBorderInnerSideBottomBottom_Hover); gc.fillGradientRectangle(x+1, y+2+23+27, 1, 12, true); gc.fillGradientRectangle(x+width-2, y+2+23+27, 1, 12, true); // inner bottom gc.setForeground(mBorderSideBottomTop_Hover); gc.setBackground(mBorderSideBottomBottom_Hover); gc.fillGradientRectangle(x, y+2+23+27, 1, 13, true); gc.fillGradientRectangle(x+width-1, y+2+23+27, 1, 13, true); // pixel is just below so we do that now too gc.setForeground(mCornerFadeBottomPixel_Hover); gc.drawLine(x+1, y+2+23+27+12, x+1, y+2+23+27+12); gc.drawLine(x+width-2, y+2+23+27+12, x+width-2, y+2+23+27+12); // draw bottom gc.setForeground(mBorderBottom_Hover); gc.drawLine(x+1, y+2+23+27+12+1, x+width-2, y+2+23+27+12+1); // inner, left half gc.setForeground(mBorderInnerBottomCorner_Hover); gc.setBackground(mBorderInnerBottomMidway_Hover); gc.fillGradientRectangle(x+2, y+2+23+27+12, width/2, 1, false); // inner, right half gc.setForeground(mBorderInnerBottomMidway_Hover); gc.setBackground(mBorderInnerBottomCorner_Hover); gc.fillGradientRectangle(x+2+(width/2), y+2+23+27+12, (width/2)-3, 1, false); // -------------------- END ---------------------- // fills gc.setForeground(mInnerTopPartTopTopSplit); gc.setBackground(mInnerTopPartTopBottomSplit); gc.fillGradientRectangle(x+2, y+2, width-4, 22, true); gc.setForeground(mInnerTopPartTopBottomTopSplit); gc.setBackground(mInnerTopPartTopBottomBottomSplit); gc.fillGradientRectangle(x+2, y+2+22, width-4, 12, true); gc.setForeground(mInnerBottomPartTopSplit_Selected); gc.setBackground(mInnerBottomPartBottomSplit_Selected); gc.fillGradientRectangle(x+2, y+2+22+12+1, width-4, 27, true); } gc.setForeground(mInnerSplitDividerLeft); gc.setBackground(mInnerSplitDividerMid); gc.fillGradientRectangle(x+1, y+2+22+12, (width/2)-2, 1, false); gc.setForeground(mInnerSplitDividerMid); gc.setBackground(mInnerSplitDividerLeft); gc.fillGradientRectangle(x+1+(width/2)-2, y+2+22+12, (width/2)+1, 1, false); } } // TODO: Account for multi-row text if ((item.getStyle() & RibbonButton.STYLE_ARROW_DOWN) != 0) drawArrow(gc, item.getBounds().width/2, 56, item.isEnabled()); Image toDraw = item.getImage(); // fallback is normal image if (!item.isEnabled()) toDraw = item.getDisabledImage() == null ? toDraw : item.getDisabledImage(); // draw image if (toDraw != null) { Rectangle imBounds = toDraw.getBounds(); int maxHeight = 32; int horizAlignment = x+(width/2)-(imBounds.width/2); switch (item.getImageVerticalAlignment()) { default: case SWT.TOP: { gc.drawImage(toDraw, horizAlignment, imgTopSpacer); break; } case SWT.BOTTOM: { int botSpacer = imBounds.height-maxHeight; if (botSpacer < 0) botSpacer = 0; botSpacer += imgTopSpacer; botSpacer *= 2; gc.drawImage(toDraw, horizAlignment, botSpacer); break; } case SWT.CENTER: { int botSpacer = Math.abs(imBounds.height-maxHeight); if (botSpacer < 0) botSpacer = 0; if (botSpacer != 0) botSpacer /= 2;
botSpacer += imgTopSpacer; gc.drawImage(toDraw, horizAlignment, botSpacer); break; } } } // draw text if (item.getName() != null) { if (item.isEnabled()) { gc.setForeground(mButtonTextColor); gc.drawText(item.getName(), x+3, 40, true); } else { gc.setForeground(mTextFadedRight_Disabled); gc.drawText(item.getName(), x+4, 40, true); gc.setForeground(mTextFadedLeft_Disabled); gc.drawText(item.getName(), x+2, 40, true); gc.setForeground(mTextColor_Disabled); gc.drawText(item.getName(), x+3, 40, true); } } }
public void drawSeparator(GC gc, int x, int y, int height) { gc.setForeground(mSeparatorColor); gc.drawLine(x, y, x, y+height); gc.setForeground(mSeparatorColorShadow); gc.drawLine(x+1, y, x+1, y+height); } public void drawArrow(GC gc, int x, int y, boolean enabled) { if (enabled) gc.setForeground(mArrowColor); else gc.setForeground(mArrowColor_Disabled); gc.drawLine(x, y, x+4, y); gc.drawLine(x+1, y+1, x+3, y+1); gc.drawLine(x+2, y+2, x+1, y+2);
if (enabled) gc.setForeground(mArrowColorShadow); else gc.setForeground(mArrowColorShadow_Disabled); gc.drawLine(x, y+1, x, y+1); gc.drawLine(x+1, y+2, x+1, y+2); gc.drawLine(x+2, y+3, x+2, y+3); gc.drawLine(x+3, y+2, x+3, y+2); gc.drawLine(x+4, y+1, x+4, y+1); } }
|
|