BeanSoft's Java Blog
MyEclipse 6, Java EE 5, Spring, Struts, Hibernate, JPA, SWT, WebLogic, AJAX, JavaScript, Netbeans 6

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(255254243);
    
private Color mInnerTopPartTopBottomSplit = ColorCache.getInstance().getColor(255247217);
    
private Color mInnerTopPartTopBottomTopSplit = ColorCache.getInstance().getColor(255241194);
    
private Color mInnerTopPartTopBottomBottomSplit = ColorCache.getInstance().getColor(255240195);
    
    
private Color mInnerTopPartTopTopSplit_Hover = ColorCache.getInstance().getColor(255253219);
    
private Color mInnerTopPartTopBottomSplit_Hover = ColorCache.getInstance().getColor(255231144);
    
private Color mInnerTopPartTopBottomTopSplit_Hover = ColorCache.getInstance().getColor(25521576);
    
private Color mInnerTopPartTopBottomBottomSplit_Hover = ColorCache.getInstance().getColor(25521170);

    
private Color mInnerBottomPartTopSplit = ColorCache.getInstance().getColor(255239199);
    
private Color mInnerBottomPartBottomSplit = ColorCache.getInstance().getColor(255247223);
    
private Color mInnerBottomPartTopSplit_Hover = ColorCache.getInstance().getColor(25521283);
    
private Color mInnerBottomPartBottomSplit_Hover = ColorCache.getInstance().getColor(255234168);
    
private Color mInnerBottomPartTopSplit_Selected = ColorCache.getInstance().getColor(24917078);
    
private Color mInnerBottomPartBottomSplit_Selected = ColorCache.getInstance().getColor(252231160);

    
private Color mInnerSplitDividerLeft = ColorCache.getInstance().getColor(219195116);
    
private Color mInnerSplitDividerMid = ColorCache.getInstance().getColor(206190134);

    
private Color mInnerSplitSmallDividerTop = ColorCache.getInstance().getColor(226214189);
    
private Color mInnerSplitSmallDividerMid = ColorCache.getInstance().getColor(205181131);

    
// SPLIT SMALL
    private Color mInnerTopPartTopTopSplitSmall = ColorCache.getInstance().getColor(255255251);
    
private Color mInnerTopPartTopBottomSplitSmall = ColorCache.getInstance().getColor(255248224);
    
private Color mInnerTopPartTopBottomTopSplitSmall = ColorCache.getInstance().getColor(255252192);
    
private Color mInnerTopPartTopBottomBottomSplitSmall = ColorCache.getInstance().getColor(255251214);

    
/*    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(221207155); 
    
private Color mBorderSideTopTop_Hover = ColorCache.getInstance().getColor(220206154);
    
private Color mBorderSideTopBottom_Hover = ColorCache.getInstance().getColor(197174125); // 24 px high total
    private Color mBorderSideMidTop_Hover = ColorCache.getInstance().getColor(196173124); 
    
private Color mBorderSideMidBottom_Hover = ColorCache.getInstance().getColor(198178131); // 27 px high total
    private Color mBorderSideBottomTop_Hover = ColorCache.getInstance().getColor(198180135);
    
private Color mBorderSideBottomBottom_Hover = ColorCache.getInstance().getColor(211206185); // 13 px high total
    private Color mBorderBottom_Hover = ColorCache.getInstance().getColor(211207188);
    
    
private Color mCornerFadeTopPixel_Hover = ColorCache.getInstance().getColor(234226168);
    
private Color mCornerFadeBottomPixel_Hover = ColorCache.getInstance().getColor(235225189);
    
    
private Color mBorderInnerTop_Hover = ColorCache.getInstance().getColor(255255247);
    
private Color mBorderInnerSideTopTop_Hover = ColorCache.getInstance().getColor(255255247);
    
private Color mBorderInnerSideTopBottom_Hover = ColorCache.getInstance().getColor(255248223); // 23 px high total
    private Color mBorderInnerSideMidTop_Hover = ColorCache.getInstance().getColor(255243206); 
    
private Color mBorderInnerSideMidBottom_Hover = ColorCache.getInstance().getColor(255243173); // 27 px high total
    private Color mBorderInnerSideBottomTop_Hover = ColorCache.getInstance().getColor(255243170);
    
private Color mBorderInnerSideBottomBottom_Hover = ColorCache.getInstance().getColor(25524393); // 12 px high total    
    private Color mBorderInnerBottomCorner_Hover = ColorCache.getInstance().getColor(255247146);
    
private Color mBorderInnerBottomMidway_Hover = ColorCache.getInstance().getColor(255254247);
    
    
private Color mInnerTop_Hover = ColorCache.getInstance().getColor(255253220);
    
private Color mInnerTopBottom_Hover = ColorCache.getInstance().getColor(255231143);
    
private Color mInnerBottomTop_Hover = ColorCache.getInstance().getColor(25521592);
    
private Color mInnerBottomBottom_Hover = ColorCache.getInstance().getColor(255233164);
    
    
// TEXT COLOR
    private Color mButtonTextColor = ColorCache.getInstance().getColor(2166139);
    
    
// SELECTED COLORS
    private Color mBorderTop_Selected = ColorCache.getInstance().getColor(142129101);
    
    
private Color mBorderSideTopTop_Selected = ColorCache.getInstance().getColor(142129101);
    
private Color mBorderSideTopBottom_Selected = ColorCache.getInstance().getColor(142129101); // 24 px high total
    private Color mBorderSideMidTop_Selected = ColorCache.getInstance().getColor(142129101); 
    
private Color mBorderSideMidBottom_Selected = ColorCache.getInstance().getColor(166155133); // 27 px high total
    private Color mBorderSideBottomTop_Selected = ColorCache.getInstance().getColor(168158136);
    
private Color mBorderSideBottomBottom_Selected = ColorCache.getInstance().getColor(198192178); // 11 px high total
    
    
private Color mCornerFadeTopPixel_Selected = ColorCache.getInstance().getColor(181167145);
    
private Color mCornerFadeBottomPixel_Selected = ColorCache.getInstance().getColor(247229168);
    
private Color mCornerFadeBottomInsidePixel_Selected = ColorCache.getInstance().getColor(25421693);
    
    
private Color mBorderInnerSideTopTop_Selected = ColorCache.getInstance().getColor(24318695);
    
private Color mBorderInnerSideTopBottom_Selected = ColorCache.getInstance().getColor(25019593); // 23 px high total
    private Color mBorderInnerSideMidTop_Selected = ColorCache.getInstance().getColor(24819081); 
    
private Color mBorderInnerSideMidBottom_Selected = ColorCache.getInstance().getColor(25320873); // 27 px high total
    private Color mBorderInnerSideBottomTop_Selected = ColorCache.getInstance().getColor(25320870);
    
private Color mBorderInnerSideBottomBottom_Selected = ColorCache.getInstance().getColor(25520849); // 11 px high total
    
    
private Color mBorderInnerBottomCorner_Selected = ColorCache.getInstance().getColor(25520745);
    
private Color mBorderInnerBottomMidway_Selected = ColorCache.getInstance().getColor(255233160);
    
    
private Color mBorderTopInner_Selected = ColorCache.getInstance().getColor(182154120);
    
private Color mBorderTopInnerTwo_Selected = ColorCache.getInstance().getColor(224182136);
    
private Color mBorderTopInnerThree_Selected = ColorCache.getInstance().getColor(245201154);

    
private Color mInnerTop_Selected = ColorCache.getInstance().getColor(253212168);
    
private Color mInnerTopBottom_Selected = ColorCache.getInstance().getColor(25117395);
    
private Color mInnerMidTop_Selected = ColorCache.getInstance().getColor(24914846);
    
private Color mInnerMidBottom_Selected = ColorCache.getInstance().getColor(252226147);
    
private Color mInnerBottomTop_Selected = ColorCache.getInstance().getColor(252230154);
    
private Color mInnerBottomBottom_Selected = ColorCache.getInstance().getColor(253241176);

    
// SELECTED AND HOVER
    private Color mBorderTop_SelectedHover = ColorCache.getInstance().getColor(142129101);
    
    
private Color mBorderSideTopTop_SelectedHover = ColorCache.getInstance().getColor(142129101);
    
private Color mBorderSideTopBottom_SelectedHover = ColorCache.getInstance().getColor(142129101); // 24 px high total
    private Color mBorderSideMidTop_SelectedHover = ColorCache.getInstance().getColor(142129101); 
    
private Color mBorderSideMidBottom_SelectedHover = ColorCache.getInstance().getColor(166155133); // 27 px high total
    private Color mBorderSideBottomTop_SelectedHover = ColorCache.getInstance().getColor(168158136);
    
private Color mBorderSideBottomBottom_SelectedHover = ColorCache.getInstance().getColor(198192178); // 11 px high total
    
    
private Color mCornerFadeTopPixel_SelectedHover = ColorCache.getInstance().getColor(151137109);
    
private Color mCornerFadeBottomPixel_SelectedHover = ColorCache.getInstance().getColor(204190165);
    
private Color mCornerFadeBottomPixelCenter_SelectedHover = ColorCache.getInstance().getColor(225194113);
    
    
private Color mBorderInnerSideTopTop_SelectedHover = ColorCache.getInstance().getColor(22515347);
    
private Color mBorderInnerSideTopBottom_SelectedHover = ColorCache.getInstance().getColor(253226178); // 23 px high total
    private Color mBorderInnerSideMidTop_SelectedHover = ColorCache.getInstance().getColor(252226181); 
    
private Color mBorderInnerSideMidBottom_SelectedHover = ColorCache.getInstance().getColor(254229160); // 27 px high total
    private Color mBorderInnerSideBottomTop_SelectedHover = ColorCache.getInstance().getColor(254228155);
    
private Color mBorderInnerSideBottomBottom_SelectedHover = ColorCache.getInstance().getColor(255223113); // 11 px high total
    
    
private Color mBorderBottom_SelectedHover = ColorCache.getInstance().getColor(212197173);
    
    
private Color mBorderInnerBottomCorner_SelectedHover = ColorCache.getInstance().getColor(25520744);
    
private Color mBorderInnerBottomMidway_SelectedHover = ColorCache.getInstance().getColor(255233160);
    
    
private Color mBorderTopInner_SelectedHover = ColorCache.getInstance().getColor(16813694);
    
private Color mBorderTopInnerTwo_SelectedHover = ColorCache.getInstance().getColor(209155101);
    
private Color mBorderTopInnerThree_SelectedHover = ColorCache.getInstance().getColor(233169107);

    
private Color mInnerTop_SelectedHover = ColorCache.getInstance().getColor(233169107);
    
private Color mInnerTopBottom_SelectedHover = ColorCache.getInstance().getColor(22713978);
    
private Color mInnerMidTop_SelectedHover = ColorCache.getInstance().getColor(22913050);
    
private Color mInnerMidBottom_SelectedHover = ColorCache.getInstance().getColor(25220396);
    
private Color mInnerBottomTop_SelectedHover = ColorCache.getInstance().getColor(24919794);
    
private Color mInnerBottomBottom_SelectedHover = ColorCache.getInstance().getColor(252207100);
    
    
// SMALL BUTTONS
    
// HOVER
    private Color mSideTopTopSmall_Hover = ColorCache.getInstance().getColor(216202150);
    
private Color mSideTopBottomSmall_Hover = ColorCache.getInstance().getColor(185160116);
    
private Color mSideBottomTopSmall_Hover = ColorCache.getInstance().getColor(183158115);
    
private Color mSideBottomBottomSmall_Hover = ColorCache.getInstance().getColor(184169142);
    
private Color mBottomSmallMid_Hover = ColorCache.getInstance().getColor(203196170);
    
private Color mBorderSmallSideBottomTop_Hover = ColorCache.getInstance().getColor(255242201);
    
private Color mBorderSmallSideBottomBottom_Hover = ColorCache.getInstance().getColor(255246185); 
    
private Color mBorderSmallInsidePixelTop_Hover = ColorCache.getInstance().getColor(233223159);
    
private Color mBorderSmallInsidePixelBottom_Hover = ColorCache.getInstance().getColor(233219177);
    
    
// SELECTED
    private Color mSmallTop_Selected = ColorCache.getInstance().getColor(167142102);
    
private Color mSmallTopInner_Selected = ColorCache.getInstance().getColor(203180153);
    
private Color mSmallTopInnerTwo_Selected = ColorCache.getInstance().getColor(234209178);
    
private Color mSmallLeftSide_Selected = ColorCache.getInstance().getColor(15813085);
    
private Color mSmallRightSide_Selected = mSmallTop_Selected;
    
private Color mBottomSmallMid_Selected = ColorCache.getInstance().getColor(204197172);

    
private Color mSmallFillTopTop_Selected = ColorCache.getInstance().getColor(248218183);
    
private Color mSmallFillTopBottom_Selected = ColorCache.getInstance().getColor(254211139);
    
private Color mSmallFillBottomTop_Selected = ColorCache.getInstance().getColor(25319492);
    
private Color mSmallFillBottomBottom_Selected = ColorCache.getInstance().getColor(253234156);
    
    
private Color mSideBottomBottomSmall_Selected = ColorCache.getInstance().getColor(184169142);
    
private Color mBorderSmallSideTopTop_Selected = ColorCache.getInstance().getColor(239211176);
    
private Color mBorderSmallSideTopBottom_Selected = ColorCache.getInstance().getColor(24117890); 
    
private Color mBorderSmallSideBottomTop_Selected = ColorCache.getInstance().getColor(23917272);
    
private Color mBorderSmallSideBottomBottom_Selected = ColorCache.getInstance().getColor(23017782); 
    
private Color mBorderSmallInsidePixelTop_Selected = ColorCache.getInstance().getColor(178154120);
    
private Color mBorderSmallInsidePixelBottom_Selected = ColorCache.getInstance().getColor(200163104);

    
// SELECTED AND HOVER
    private Color mSmallTop_SelectedHover = ColorCache.getInstance().getColor(15813085);
    
private Color mSmallTopInner_SelectedHover = ColorCache.getInstance().getColor(18914070);
    
private Color mSmallTopInnerTwo_SelectedHover = ColorCache.getInstance().getColor(22216487);
    
private Color mSmallLeftSide_SelectedHover = mSmallTop_SelectedHover;
    
private Color mSmallRightSide_SelectedHover = mSmallTop_SelectedHover;
    
private Color mBottomSmallMid_SelectedHover = ColorCache.getInstance().getColor(204197172);

    
private Color mBottomSmallInnerSide_SelectedHover = ColorCache.getInstance().getColor(255173