SWT Ribbon Control 主页及下载地址, 精彩截屏

2007年10月07日 23:29:00

http://hexapixel.com/projects/

http://hexapixel.com/ribbon/

下载地址: download the jar and the source

源码包里面的 com.hexapixel.widgets.ribbon.RibbonTester 展示了如何使用这个组件.

作者提示道: 可能有很多 bug, 仅供测试.

呵呵, 差不多所有组件都要重新代码画了, 这就也跟 Swing 一样的思路了. 没办法, Java 的界面, 一直到现在也没几个做的速度快又漂亮的, 包括 SWT 在内.

更多截图:

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 - 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.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 );

}

}


Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1814503


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值