2007年10月07日 23:29:00
http://hexapixel.com/projects/
下载地址: 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):
|
Todo list:
|
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