/** Creates a new UI delegate for ribbon button. */ public SubstanceCommandButtonUI(JCommandButton button) { super(); this.backgroundDelegate = new ButtonBackgroundDelegate(); this.overallRolloverModel = new DefaultButtonModel(); this.overallRolloverModel.setArmed(false); this.overallRolloverModel.setSelected(false); this.overallRolloverModel.setPressed(false); this.overallRolloverModel.setRollover(false); this.overallRolloverModel.setEnabled(button.isEnabled()); this.overallStateTransitionTracker = new StateTransitionTracker(button, this.overallRolloverModel); this.substanceVisualStateTracker = new CommandButtonVisualStateTracker(); }
/* * (non-Javadoc) * * @see * org.jvnet.flamingo.common.ui.BasicCommandButtonUI#paintButtonIcon(java * .awt.Graphics, java.awt.Rectangle) */ @Override protected void paintButtonIcon(Graphics g, Rectangle iconRect) { JCommandButton jcb = (JCommandButton) this.commandButton; Icon regular = jcb.getIcon(); if (toUseDisabledIcon() && (jcb.getDisabledIcon() != null) && ((regular != null) && !regular.getClass().isAnnotationPresent(TransitionAware.class))) regular = jcb.getDisabledIcon(); if ((iconRect == null) || (regular == null) || (iconRect.width == 0) || (iconRect.height == 0)) { return; } boolean useThemed = SubstanceCoreUtilities.useThemedDefaultIcon(this.commandButton); if (regular != null) { Graphics2D g2d = (Graphics2D) g.create(); GhostPaintingUtils.paintGhostIcon(g2d, jcb, regular, iconRect); g2d.setComposite(LafWidgetUtilities.getAlphaComposite(jcb, g)); if (!useThemed) { regular.paintIcon(jcb, g2d, iconRect.x, iconRect.y); } else { StateTransitionTracker tracker = this.substanceVisualStateTracker.getActionStateTransitionTracker(); ButtonModel model = commandButton.getActionModel(); if (jcb.getCommandButtonKind() == CommandButtonKind.POPUP_ONLY) { tracker = this.substanceVisualStateTracker.getPopupStateTransitionTracker(); model = jcb.getPopupModel(); } CommandButtonBackgroundDelegate.paintThemedCommandButtonIcon( g2d, iconRect, jcb, regular, model, tracker); } g2d.dispose(); } }
@Override protected void installComponents() { super.installComponents(); this.mainPanel = createMainPanel(); this.panelLevel1 = new JPanel(); this.panelLevel1.setLayout( new LayoutManager() { @Override public void addLayoutComponent(String name, Component comp) {} @Override public void removeLayoutComponent(Component comp) {} @Override public Dimension preferredLayoutSize(Container parent) { int height = 0; int width = 0; for (int i = 0; i < parent.getComponentCount(); i++) { Dimension pref = parent.getComponent(i).getPreferredSize(); height += pref.height; width = Math.max(width, pref.width); } Insets ins = parent.getInsets(); return new Dimension(width + ins.left + ins.right, height + ins.top + ins.bottom); } @Override public Dimension minimumLayoutSize(Container parent) { return preferredLayoutSize(parent); } @Override public void layoutContainer(Container parent) { Insets ins = parent.getInsets(); int topY = ins.top; for (int i = 0; i < parent.getComponentCount(); i++) { Component comp = parent.getComponent(i); Dimension pref = comp.getPreferredSize(); comp.setBounds(ins.left, topY, parent.getWidth() - ins.left - ins.right, pref.height); topY += pref.height; } } }); final RibbonApplicationMenu ribbonAppMenu = this.applicationMenuPopupPanel.getRibbonAppMenu(); if (ribbonAppMenu != null) { List<List<RibbonApplicationMenuEntryPrimary>> primaryEntries = ribbonAppMenu.getPrimaryEntries(); int primaryGroupCount = primaryEntries.size(); for (int i = 0; i < primaryGroupCount; i++) { for (final RibbonApplicationMenuEntryPrimary menuEntry : primaryEntries.get(i)) { final JCommandMenuButton commandButton = new JCommandMenuButton(menuEntry.getText(), menuEntry.getIcon()); commandButton.setCommandButtonKind(menuEntry.getEntryKind()); commandButton.addActionListener(menuEntry.getMainActionListener()); commandButton.setActionKeyTip(menuEntry.getActionKeyTip()); commandButton.setPopupKeyTip(menuEntry.getPopupKeyTip()); if (menuEntry.getDisabledIcon() != null) { commandButton.setDisabledIcon(menuEntry.getDisabledIcon()); } if (menuEntry.getSecondaryGroupCount() == 0) { // if there are no secondary menu items, register the // application rollover callback to populate the // second level panel commandButton.addRolloverActionListener( new RolloverActionListener() { @Override public void actionPerformed(ActionEvent e) { // System.out.println("Rollover action"); PrimaryRolloverCallback callback = menuEntry.getRolloverCallback(); if (callback != null) { callback.menuEntryActivated(panelLevel2); } else { // default callback? PrimaryRolloverCallback defaultCallback = ribbonAppMenu.getDefaultCallback(); if (defaultCallback != null) { defaultCallback.menuEntryActivated(panelLevel2); } else { panelLevel2.removeAll(); panelLevel2.revalidate(); panelLevel2.repaint(); } } panelLevel2.applyComponentOrientation( applicationMenuPopupPanel.getComponentOrientation()); } }); } else { // register a core callback to populate the second level // panel with secondary menu items final PrimaryRolloverCallback coreCallback = new PrimaryRolloverCallback() { @Override public void menuEntryActivated(JPanel targetPanel) { targetPanel.removeAll(); targetPanel.setLayout(new BorderLayout()); JRibbonApplicationMenuPopupPanelSecondary secondary = new JRibbonApplicationMenuPopupPanelSecondary(menuEntry) { @Override public void removeNotify() { super.removeNotify(); commandButton.getPopupModel().setPopupShowing(false); } }; secondary.applyComponentOrientation( applicationMenuPopupPanel.getComponentOrientation()); targetPanel.add(secondary, BorderLayout.CENTER); } }; commandButton.addRolloverActionListener( new RolloverActionListener() { @Override public void actionPerformed(ActionEvent e) { coreCallback.menuEntryActivated(panelLevel2); // emulate showing the popup so the // button remains "selected" commandButton.getPopupModel().setPopupShowing(true); } }); } commandButton.setDisplayState(MENU_TILE_LEVEL_1); commandButton.setHorizontalAlignment(SwingUtilities.LEADING); commandButton.setPopupOrientationKind(CommandButtonPopupOrientationKind.SIDEWARD); commandButton.setEnabled(menuEntry.isEnabled()); this.panelLevel1.add(commandButton); } if (i < (primaryGroupCount - 1)) { this.panelLevel1.add(new JPopupMenu.Separator()); } } } mainPanel.add(this.panelLevel1, BorderLayout.LINE_START); this.panelLevel2 = new JPanel(); this.panelLevel2.setBorder( new Border() { @Override public Insets getBorderInsets(Component c) { boolean ltr = c.getComponentOrientation().isLeftToRight(); return new Insets(0, ltr ? 1 : 0, 0, ltr ? 0 : 1); } @Override public boolean isBorderOpaque() { return true; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { g.setColor(FlamingoUtilities.getColor(Color.gray, "Label.disabledForeground")); boolean ltr = c.getComponentOrientation().isLeftToRight(); int xToPaint = ltr ? x : x + width - 1; g.drawLine(xToPaint, y, xToPaint, y + height); } }); this.panelLevel2.setPreferredSize( new Dimension( 30 * FlamingoUtilities.getFont( this.panelLevel1, "Ribbon.font", "Button.font", "Panel.font") .getSize() - 30, 10)); mainPanel.add(this.panelLevel2, BorderLayout.CENTER); if (ribbonAppMenu != null) { if (ribbonAppMenu.getDefaultCallback() != null) { ribbonAppMenu.getDefaultCallback().menuEntryActivated(this.panelLevel2); } } this.applicationMenuPopupPanel.add(mainPanel, BorderLayout.CENTER); this.footerPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING)) { @Override protected void paintComponent(Graphics g) { FlamingoUtilities.renderSurface( g, footerPanel, new Rectangle(0, 0, footerPanel.getWidth(), footerPanel.getHeight()), false, false, false); } }; if (ribbonAppMenu != null) { for (RibbonApplicationMenuEntryFooter footerEntry : ribbonAppMenu.getFooterEntries()) { JCommandButton commandFooterButton = new JCommandButton(footerEntry.getText(), footerEntry.getIcon()); if (footerEntry.getDisabledIcon() != null) { commandFooterButton.setDisabledIcon(footerEntry.getDisabledIcon()); } commandFooterButton.setCommandButtonKind(CommandButtonKind.ACTION_ONLY); commandFooterButton.addActionListener(footerEntry.getMainActionListener()); commandFooterButton.setDisplayState(CommandButtonDisplayState.MEDIUM); commandFooterButton.setFlat(false); commandFooterButton.setEnabled(footerEntry.isEnabled()); this.footerPanel.add(commandFooterButton); } } this.applicationMenuPopupPanel.add(this.footerPanel, BorderLayout.SOUTH); this.applicationMenuPopupPanel.setBorder( new Border() { @Override public Insets getBorderInsets(Component c) { return new Insets(20, 2, 2, 2); } @Override public boolean isBorderOpaque() { return true; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { g.setColor(FlamingoUtilities.getColor(Color.gray, "Label.disabledForeground")); g.drawRect(x, y, width - 1, height - 1); g.setColor( FlamingoUtilities.getColor(Color.gray, "Label.disabledForeground") .brighter() .brighter()); g.drawRect(x + 1, y + 1, width - 3, height - 3); FlamingoUtilities.renderSurface( g, applicationMenuPopupPanel, new Rectangle(x + 2, y + 2, width - 4, 24), false, false, false); // draw the application menu button JCommandButton button = applicationMenuPopupPanel.getAppMenuButton(); JRibbonApplicationMenuButton rendererButton = new JRibbonApplicationMenuButton( ((RibbonProvider) applicationMenuPopupPanel.getAppMenuButton()).getRibbon()); rendererButton.setPopupKeyTip(button.getPopupKeyTip()); rendererButton.setIcon(button.getIcon()); rendererButton.getPopupModel().setRollover(false); rendererButton.getPopupModel().setPressed(true); rendererButton.getPopupModel().setArmed(true); rendererButton.getPopupModel().setPopupShowing(true); CellRendererPane buttonRendererPane = new CellRendererPane(); Point buttonLoc = button.getLocationOnScreen(); Point panelLoc = c.getLocationOnScreen(); buttonRendererPane.setBounds( panelLoc.x - buttonLoc.x, panelLoc.y - buttonLoc.y, button.getWidth(), button.getHeight()); buttonRendererPane.paintComponent( g, rendererButton, (Container) c, -panelLoc.x + buttonLoc.x, -panelLoc.y + buttonLoc.y, button.getWidth(), button.getHeight(), true); } }); }