From 1399018ffd70782c6c28b8471630ee7d7ad413c3 Mon Sep 17 00:00:00 2001 From: Kirill Grouchnikov Date: Fri, 5 May 2023 17:18:23 -0400 Subject: [PATCH] Third pass to migrate away from component customizers for command buttons Convert ribbon gallery scroller / expand buttons, as well as scrollable panel scroll buttons to be fully configured by the command and the presentation model, with no component customizer For #447 --- .../CommandButtonFollowColorSchemeIcon.java | 10 +++ .../model/CommandStripPresentationModel.java | 20 ++++- .../api/common/projection/Projection.java | 4 + .../common/ui/RadianceScrollablePanelUI.java | 58 -------------- .../ribbon/ui/RadianceRibbonGalleryUI.java | 57 -------------- .../ui/common/BasicCommandButtonStripUI.java | 1 + .../ui/common/BasicScrollablePanelUI.java | 75 ++++++++++++++----- .../ui/ribbon/BasicRibbonGalleryUI.java | 58 ++++++++++---- 8 files changed, 134 insertions(+), 149 deletions(-) diff --git a/component/src/main/java/org/pushingpixels/radiance/component/api/common/icon/CommandButtonFollowColorSchemeIcon.java b/component/src/main/java/org/pushingpixels/radiance/component/api/common/icon/CommandButtonFollowColorSchemeIcon.java index f84d48919..b587b584d 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/api/common/icon/CommandButtonFollowColorSchemeIcon.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/api/common/icon/CommandButtonFollowColorSchemeIcon.java @@ -38,6 +38,8 @@ import org.pushingpixels.radiance.theming.internal.animation.StateTransitionTracker; import org.pushingpixels.radiance.theming.internal.blade.BladeColorScheme; import org.pushingpixels.radiance.theming.internal.blade.BladeUtils; +import org.pushingpixels.radiance.theming.internal.utils.RadianceColorSchemeUtilities; +import org.pushingpixels.radiance.theming.internal.utils.WidgetUtilities; import org.pushingpixels.radiance.theming.internal.utils.icon.TransitionAware; import java.awt.*; @@ -111,6 +113,7 @@ public CommandButtonFollowColorSchemeIcon(ColorSchemeAssociationKind colorScheme @Override public void paintIcon(Component c, Graphics g, int x, int y) { + float alpha = 1.0f; // If the passed component is null or not a JCommandButton, our best effort is to // display either "enabled" or "disabled" version of the delegate icon if (!(c instanceof JCommandButton)) { @@ -118,6 +121,9 @@ public void paintIcon(Component c, Graphics g, int x, int y) { ((c == null) || !c.isEnabled()) ? ComponentState.DISABLED_UNSELECTED : ComponentState.ENABLED, this.colorSchemeAssociationKind, false); + if ((c == null) || !c.isEnabled()) { + alpha = RadianceColorSchemeUtilities.getAlpha(c, ComponentState.DISABLED_UNSELECTED); + } } else { JCommandButton commandButton = (JCommandButton) c; @@ -130,10 +136,14 @@ public void paintIcon(Component c, Graphics g, int x, int y) { BladeUtils.populateColorScheme(mutableColorScheme, commandButton, modelStateInfo, currState, this.colorSchemeAssociationKind, false); + alpha = RadianceColorSchemeUtilities.getAlpha(c, currState); } Graphics2D graphics = (Graphics2D) g.create(); graphics.translate(x, y); + if (alpha < 1.0f) { + graphics.setComposite(WidgetUtilities.getAlphaComposite(c, alpha, g)); + } this.delegate.drawColorSchemeIcon(graphics, mutableColorScheme, this.width, this.height); graphics.dispose(); } diff --git a/component/src/main/java/org/pushingpixels/radiance/component/api/common/model/CommandStripPresentationModel.java b/component/src/main/java/org/pushingpixels/radiance/component/api/common/model/CommandStripPresentationModel.java index 478e2b574..b0440b373 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/api/common/model/CommandStripPresentationModel.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/api/common/model/CommandStripPresentationModel.java @@ -32,6 +32,8 @@ import org.pushingpixels.radiance.component.api.common.CommandButtonPresentationState; import org.pushingpixels.radiance.theming.api.RadianceThemingSlices; +import java.awt.*; + public class CommandStripPresentationModel implements ImmutablePresentationModel { public static final double DEFAULT_GAP_SCALE_FACTOR_PRIMARY_AXIS = 0.75; public static final double DEFAULT_GAP_SCALE_FACTOR_SECONDARY_AXIS = 1.0; @@ -59,6 +61,8 @@ public enum StripOrientation { */ private CommandButtonPresentationState commandPresentationState; + private Insets commandContentPadding; + private RadianceThemingSlices.IconFilterStrategy activeIconFilterStrategy; private RadianceThemingSlices.IconFilterStrategy enabledIconFilterStrategy; private RadianceThemingSlices.IconFilterStrategy disabledIconFilterStrategy; @@ -97,6 +101,10 @@ public CommandButtonPresentationState getCommandPresentationState() { return this.commandPresentationState; } + public Insets getCommandContentPadding() { + return this.commandContentPadding; + } + public RadianceThemingSlices.IconFilterStrategy getActiveIconFilterStrategy() { return this.activeIconFilterStrategy; } @@ -134,8 +142,10 @@ public boolean isToDismissPopupsOnActivation() { } public static class Builder { - private CommandButtonPresentationState commandPresentationState - = CommandButtonPresentationState.SMALL; + private CommandButtonPresentationState commandPresentationState = + CommandButtonPresentationState.SMALL; + private Insets commandContentPadding = + CommandButtonPresentationModel.COMPACT_BUTTON_CONTENT_PADDING; private RadianceThemingSlices.IconFilterStrategy activeIconFilterStrategy = RadianceThemingSlices.IconFilterStrategy.ORIGINAL; private RadianceThemingSlices.IconFilterStrategy enabledIconFilterStrategy = @@ -156,6 +166,11 @@ public Builder setCommandPresentationState( return this; } + public Builder setCommandContentPadding(Insets commandContentPadding) { + this.commandContentPadding = commandContentPadding; + return this; + } + public Builder setIconFilterStrategies( RadianceThemingSlices.IconFilterStrategy activeIconFilterStrategy, RadianceThemingSlices.IconFilterStrategy enabledIconFilterStrategy, @@ -200,6 +215,7 @@ public Builder setToDismissPopupsOnActivation(boolean toDismissPopupsOnActivatio public CommandStripPresentationModel build() { CommandStripPresentationModel presentationModel = new CommandStripPresentationModel(); presentationModel.commandPresentationState = this.commandPresentationState; + presentationModel.commandContentPadding = this.commandContentPadding; presentationModel.activeIconFilterStrategy = this.activeIconFilterStrategy; presentationModel.enabledIconFilterStrategy = this.enabledIconFilterStrategy; presentationModel.disabledIconFilterStrategy = this.disabledIconFilterStrategy; diff --git a/component/src/main/java/org/pushingpixels/radiance/component/api/common/projection/Projection.java b/component/src/main/java/org/pushingpixels/radiance/component/api/common/projection/Projection.java index 24f87faa5..531c1a84a 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/api/common/projection/Projection.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/api/common/projection/Projection.java @@ -107,6 +107,10 @@ public void setComponentCustomizer(ComponentCustomizer componentCustomizer) { this.componentCustomizer = componentCustomizer; } + /** + * @deprecated This method will be removed before the final 7.0 release. + */ + @Deprecated public void setCommandComponentCustomizers(Map> commandComponentCustomizers) { this.commandComponentCustomizers = commandComponentCustomizers; diff --git a/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/common/ui/RadianceScrollablePanelUI.java b/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/common/ui/RadianceScrollablePanelUI.java index 2f240b5ec..fc1832924 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/common/ui/RadianceScrollablePanelUI.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/common/ui/RadianceScrollablePanelUI.java @@ -29,22 +29,14 @@ */ package org.pushingpixels.radiance.component.internal.theming.common.ui; -import org.pushingpixels.radiance.common.api.icon.RadianceIcon; -import org.pushingpixels.radiance.component.api.common.JCommandButton; import org.pushingpixels.radiance.component.api.common.JScrollablePanel; -import org.pushingpixels.radiance.component.internal.theming.common.BladeTransitionAwareRadianceIcon; import org.pushingpixels.radiance.component.internal.ui.common.BasicScrollablePanelUI; -import org.pushingpixels.radiance.theming.api.RadianceThemingCortex; -import org.pushingpixels.radiance.theming.api.RadianceThemingSlices; -import org.pushingpixels.radiance.theming.internal.blade.BladeArrowIconUtils; import org.pushingpixels.radiance.theming.internal.painter.BackgroundPaintingUtils; import org.pushingpixels.radiance.theming.internal.utils.RadianceCoreUtilities; -import org.pushingpixels.radiance.theming.internal.utils.RadianceSizeUtils; import javax.swing.*; import javax.swing.plaf.ComponentUI; import java.awt.*; -import java.util.EnumSet; /** * UI for {@link JScrollablePanel} components in Radiance look and feel. @@ -74,54 +66,4 @@ public void update(Graphics g, JComponent c) { } } } - - @Override - protected void configureLeadingScrollerButton(JCommandButton button) { - final int fontSize = RadianceSizeUtils.getComponentFontSize(button); - int arrowIconHeight = (int) RadianceSizeUtils.getSmallDoubleArrowIconHeight(fontSize); - int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); - RadianceIcon arrowIcon = new BladeTransitionAwareRadianceIcon(button, - () -> ((ActionPopupTransitionAwareUI) button.getUI()).getActionTransitionTracker(), - (g, scheme, width, height) -> BladeArrowIconUtils.drawDoubleArrow(g, width, height, - RadianceSizeUtils.getSmallDoubleArrowGap(fontSize), - RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), - (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) - ? SwingUtilities.WEST - : SwingUtilities.NORTH, - scheme), - new Dimension(arrowIconHeight, arrowIconWidth)); - button.setIcon(arrowIcon); - RadianceThemingCortex.ComponentScope.setButtonStraightSides(button, - (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) - ? EnumSet.of(RadianceThemingSlices.Side.TRAILING) - : EnumSet.of(RadianceThemingSlices.Side.BOTTOM)); - - button.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); - button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - - @Override - protected void configureTrailingScrollerButton(JCommandButton button) { - final int fontSize = RadianceSizeUtils.getComponentFontSize(button); - int arrowIconHeight = (int) RadianceSizeUtils.getSmallDoubleArrowIconHeight(fontSize); - int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); - RadianceIcon arrowIcon = new BladeTransitionAwareRadianceIcon(button, - () -> ((ActionPopupTransitionAwareUI) button.getUI()).getActionTransitionTracker(), - (g, scheme, width, height) -> BladeArrowIconUtils.drawDoubleArrow(g, width, height, - RadianceSizeUtils.getSmallDoubleArrowGap(fontSize), - RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), - (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) - ? SwingUtilities.EAST - : SwingUtilities.SOUTH, - scheme), - new Dimension(arrowIconHeight, arrowIconWidth)); - button.setIcon(arrowIcon); - RadianceThemingCortex.ComponentScope.setButtonStraightSides(button, - (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) - ? EnumSet.of(RadianceThemingSlices.Side.LEADING) - : EnumSet.of(RadianceThemingSlices.Side.TOP)); - - button.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); - button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } } diff --git a/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/ribbon/ui/RadianceRibbonGalleryUI.java b/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/ribbon/ui/RadianceRibbonGalleryUI.java index 5b6573718..388831682 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/ribbon/ui/RadianceRibbonGalleryUI.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/internal/theming/ribbon/ui/RadianceRibbonGalleryUI.java @@ -29,18 +29,11 @@ */ package org.pushingpixels.radiance.component.internal.theming.ribbon.ui; -import org.pushingpixels.radiance.common.api.icon.RadianceIcon; -import org.pushingpixels.radiance.component.api.common.JCommandButton; -import org.pushingpixels.radiance.component.internal.theming.common.BladeTransitionAwareRadianceIcon; -import org.pushingpixels.radiance.component.internal.theming.common.ui.ActionPopupTransitionAwareUI; import org.pushingpixels.radiance.component.internal.ui.ribbon.BasicRibbonGalleryUI; import org.pushingpixels.radiance.component.internal.ui.ribbon.JRibbonGallery; import org.pushingpixels.radiance.theming.api.ComponentState; -import org.pushingpixels.radiance.theming.api.RadianceThemingCortex; -import org.pushingpixels.radiance.theming.api.RadianceThemingSlices; import org.pushingpixels.radiance.theming.api.RadianceThemingSlices.ColorSchemeAssociationKind; import org.pushingpixels.radiance.theming.api.colorscheme.RadianceColorScheme; -import org.pushingpixels.radiance.theming.internal.blade.BladeArrowIconUtils; import org.pushingpixels.radiance.theming.internal.blade.BladeDrawingUtils; import org.pushingpixels.radiance.theming.internal.utils.RadianceColorSchemeUtilities; import org.pushingpixels.radiance.theming.internal.utils.RadianceCoreUtilities; @@ -83,56 +76,6 @@ protected void paintRibbonGalleryBorder(Graphics graphics) { g2d.dispose(); } - @Override - protected void configureExpandButton(JCommandButton button) { - final int fontSize = RadianceSizeUtils.getComponentFontSize(button); - int arrowIconHeight = (int) RadianceSizeUtils.getSmallDoubleArrowIconHeight(fontSize); - int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); - final RadianceIcon arrowIcon = new BladeTransitionAwareRadianceIcon(button, - () -> ((ActionPopupTransitionAwareUI) button.getUI()).getActionTransitionTracker(), - (g, scheme, width, height) -> - BladeArrowIconUtils.drawDoubleArrow(g, width, height, - RadianceSizeUtils.getSmallDoubleArrowGap(fontSize), - RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), - SwingConstants.SOUTH, scheme), - new Dimension(arrowIconWidth, arrowIconHeight)); - button.setIcon(arrowIcon); - RadianceThemingCortex.ComponentScope.setButtonStraightSide(button, - RadianceThemingSlices.Side.LEADING); - } - - @Override - protected void configureScrollDownButton(JCommandButton button) { - final int fontSize = RadianceSizeUtils.getComponentFontSize(button); - int arrowIconHeight = (int) RadianceSizeUtils.getSmallArrowIconHeight(fontSize); - int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); - final RadianceIcon arrowIcon = new BladeTransitionAwareRadianceIcon(button, - () -> ((ActionPopupTransitionAwareUI) button.getUI()).getActionTransitionTracker(), - (g, scheme, width, height) -> BladeArrowIconUtils.drawArrow(g, width, height, - RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), - SwingConstants.SOUTH, scheme), - new Dimension(arrowIconWidth, arrowIconHeight)); - button.setIcon(arrowIcon); - RadianceThemingCortex.ComponentScope.setButtonStraightSide(button, - RadianceThemingSlices.Side.LEADING); - } - - @Override - protected void configureScrollUpButton(JCommandButton button) { - final int fontSize = RadianceSizeUtils.getComponentFontSize(button); - int arrowIconHeight = (int) RadianceSizeUtils.getSmallArrowIconHeight(fontSize); - int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); - final RadianceIcon arrowIcon = new BladeTransitionAwareRadianceIcon(button, - () -> ((ActionPopupTransitionAwareUI) button.getUI()).getActionTransitionTracker(), - (g, scheme, width, height) -> BladeArrowIconUtils.drawArrow(g, width, height, - RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), - SwingConstants.NORTH, scheme), - new Dimension(arrowIconWidth, arrowIconHeight)); - button.setIcon(arrowIcon); - RadianceThemingCortex.ComponentScope.setButtonStraightSide(button, - RadianceThemingSlices.Side.LEADING); - } - @Override public void update(Graphics g, JComponent c) { super.update(g, c); diff --git a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicCommandButtonStripUI.java b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicCommandButtonStripUI.java index 98d72901c..d930ccad9 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicCommandButtonStripUI.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicCommandButtonStripUI.java @@ -174,6 +174,7 @@ private void addButton(Command command) { CommandButtonPresentationModel presentation = CommandButtonPresentationModel.withDefaults() .overlayWith(CommandButtonPresentationModel.overlay() .setPresentationState(stripPresentationModel.getCommandPresentationState()) + .setContentPadding(stripPresentationModel.getCommandContentPadding()) .setIconFilterStrategies( stripPresentationModel.getActiveIconFilterStrategy(), stripPresentationModel.getEnabledIconFilterStrategy(), diff --git a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicScrollablePanelUI.java b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicScrollablePanelUI.java index ae05034cc..9fc08e541 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicScrollablePanelUI.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/common/BasicScrollablePanelUI.java @@ -29,13 +29,17 @@ */ package org.pushingpixels.radiance.component.internal.ui.common; +import org.pushingpixels.radiance.component.api.common.CommandButtonPresentationState; import org.pushingpixels.radiance.component.api.common.JCommandButton; import org.pushingpixels.radiance.component.api.common.JScrollablePanel; import org.pushingpixels.radiance.component.api.common.JScrollablePanel.ScrollType; +import org.pushingpixels.radiance.component.api.common.icon.CommandButtonFollowColorSchemeIcon; import org.pushingpixels.radiance.component.api.common.model.Command; import org.pushingpixels.radiance.component.api.common.model.CommandButtonPresentationModel; import org.pushingpixels.radiance.component.api.common.projection.CommandButtonProjection; import org.pushingpixels.radiance.theming.api.RadianceThemingSlices; +import org.pushingpixels.radiance.theming.internal.blade.BladeArrowIconUtils; +import org.pushingpixels.radiance.theming.internal.utils.RadianceSizeUtils; import javax.swing.*; import java.awt.*; @@ -44,6 +48,7 @@ import java.awt.event.ComponentListener; import java.awt.event.MouseWheelListener; import java.beans.PropertyChangeListener; +import java.util.EnumSet; /** * Basic UI for scrollable panel {@link JScrollablePanel}. @@ -58,6 +63,10 @@ public abstract class BasicScrollablePanelUI extends ScrollablePanelUI { private JPanel viewport; + private Command leadingScrollCommand; + + private Command trailingScrollCommand; + private JCommandButton leadingScroller; private JCommandButton trailingScroller; @@ -156,22 +165,47 @@ public void layoutContainer(Container parent) { } this.scrollablePanel.add(this.viewport); - Command leadingScrollCommand = Command.builder() + final int fontSize = RadianceSizeUtils.getComponentFontSize(null); + int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); + int arrowIconHeight = (int) RadianceSizeUtils.getSmallDoubleArrowIconHeight(fontSize); + this.leadingScrollCommand = Command.builder() .setAction(commandActionEvent -> { viewOffset -= 12; syncScrolling(); }) + .setIconFactory(() -> new CommandButtonFollowColorSchemeIcon( + (g, scheme, width, height) -> { + BladeArrowIconUtils.drawDoubleArrow(g, width, height, + RadianceSizeUtils.getSmallDoubleArrowGap(fontSize), + RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), + (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) + ? SwingUtilities.WEST + : SwingUtilities.NORTH, + scheme); + }, new Dimension(arrowIconHeight, arrowIconWidth))) .build(); - Command trailingScrollCommand = Command.builder() + this.trailingScrollCommand = Command.builder() .setAction(commandActionEvent -> { viewOffset += 12; syncScrolling(); }) + .setIconFactory(() -> new CommandButtonFollowColorSchemeIcon( + (g, scheme, width, height) -> { + BladeArrowIconUtils.drawDoubleArrow(g, width, height, + RadianceSizeUtils.getSmallDoubleArrowGap(fontSize), + RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), + (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) + ? SwingUtilities.EAST + : SwingUtilities.SOUTH, + scheme); + }, new Dimension(arrowIconHeight, arrowIconWidth))) .build(); // Common scroller command presentation CommandButtonPresentationModel scrollerActionsPresentation = CommandButtonPresentationModel.builder() + .setPresentationState(CommandButtonPresentationState.SMALL_FIT_TO_ICON) + .setContentPadding(new Insets(2, 2, 2, 2)) .setFocusable(false) .setToDismissPopupsOnActivation(false) .setHorizontalAlignment(SwingConstants.CENTER) @@ -186,12 +220,26 @@ public void layoutContainer(Container parent) { // Create command projections for scroller commands and set button customizers for // icons and additional straight sides CommandButtonProjection leadingScrollerProjection = - leadingScrollCommand.project(scrollerActionsPresentation); - leadingScrollerProjection.setComponentCustomizer(this::configureLeadingScrollerButton); + leadingScrollCommand.project(scrollerActionsPresentation.overlayWith( + CommandButtonPresentationModel.overlay().setSides( + RadianceThemingSlices.Sides.builder().setStraightSides( + (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) + ? EnumSet.of(RadianceThemingSlices.Side.TRAILING) + : EnumSet.of(RadianceThemingSlices.Side.BOTTOM)) + .build() + ) + )); CommandButtonProjection trailingScrollerProjection = - trailingScrollCommand.project(scrollerActionsPresentation); - trailingScrollerProjection.setComponentCustomizer(this::configureTrailingScrollerButton); + trailingScrollCommand.project(scrollerActionsPresentation.overlayWith( + CommandButtonPresentationModel.overlay().setSides( + RadianceThemingSlices.Sides.builder().setStraightSides( + (scrollablePanel.getScrollType() == JScrollablePanel.ScrollType.HORIZONTALLY) + ? EnumSet.of(RadianceThemingSlices.Side.LEADING) + : EnumSet.of(RadianceThemingSlices.Side.TOP)) + .build() + ) + )); this.leadingScroller = leadingScrollerProjection.buildComponent(); this.scrollablePanel.add(this.leadingScroller); @@ -234,10 +282,6 @@ protected void uninstallListeners() { } } - protected abstract void configureLeadingScrollerButton(JCommandButton button); - - protected abstract void configureTrailingScrollerButton(JCommandButton button); - private void syncScrolling() { this.scrollablePanel.doLayout(); } @@ -414,13 +458,10 @@ public void layoutContainer(Container c) { trailingScroller.setBounds(ins.left, y, width - ins.left - ins.right, sph); } } - - if (scrollablePanel.getScrollType() == ScrollType.HORIZONTALLY) { - trailingScroller.setEnabled((viewOffset + viewport.getWidth()) < view.getWidth()); - } else { - trailingScroller.setEnabled((viewOffset + viewport.getHeight()) < view.getHeight()); - } - leadingScroller.setEnabled(viewOffset > 0); + leadingScrollCommand.setActionEnabled(viewOffset > 0); + trailingScrollCommand.setActionEnabled((scrollablePanel.getScrollType() == ScrollType.HORIZONTALLY) + ? (viewOffset + viewport.getWidth()) < view.getWidth() + : (viewOffset + viewport.getHeight()) < view.getHeight()); } } diff --git a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonGalleryUI.java b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonGalleryUI.java index fd17ac965..293b649b8 100644 --- a/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonGalleryUI.java +++ b/component/src/main/java/org/pushingpixels/radiance/component/internal/ui/ribbon/BasicRibbonGalleryUI.java @@ -29,8 +29,10 @@ */ package org.pushingpixels.radiance.component.internal.ui.ribbon; +import org.pushingpixels.radiance.common.api.icon.RadianceIcon; import org.pushingpixels.radiance.component.api.common.CommandButtonPresentationState; import org.pushingpixels.radiance.component.api.common.JCommandButton; +import org.pushingpixels.radiance.component.api.common.icon.CommandButtonFollowColorSchemeIcon; import org.pushingpixels.radiance.component.api.common.model.*; import org.pushingpixels.radiance.component.api.common.model.CommandStripPresentationModel.StripOrientation; import org.pushingpixels.radiance.component.api.common.popup.JCommandPopupMenuPanel; @@ -39,10 +41,14 @@ import org.pushingpixels.radiance.component.api.common.projection.Projection; import org.pushingpixels.radiance.component.api.ribbon.JRibbonBand; import org.pushingpixels.radiance.component.api.ribbon.model.RibbonGalleryContentModel; +import org.pushingpixels.radiance.component.internal.theming.common.BladeTransitionAwareRadianceIcon; +import org.pushingpixels.radiance.component.internal.theming.common.ui.ActionPopupTransitionAwareUI; import org.pushingpixels.radiance.component.internal.utils.ComponentUtilities; import org.pushingpixels.radiance.component.internal.utils.KeyTipManager; import org.pushingpixels.radiance.theming.api.RadianceThemingCortex; import org.pushingpixels.radiance.theming.api.RadianceThemingSlices; +import org.pushingpixels.radiance.theming.internal.blade.BladeArrowIconUtils; +import org.pushingpixels.radiance.theming.internal.utils.RadianceSizeUtils; import javax.swing.*; import javax.swing.border.Border; @@ -51,6 +57,7 @@ import javax.swing.plaf.BorderUIResource; import javax.swing.plaf.UIResource; import java.awt.*; +import java.util.EnumSet; import java.util.HashMap; import java.util.Map; @@ -114,18 +121,36 @@ public void installUI(JComponent c) { */ @SuppressWarnings("unchecked") protected void installComponents() { + + final int fontSize = RadianceSizeUtils.getComponentFontSize(this.ribbonGallery); + int arrowIconHeight = (int) RadianceSizeUtils.getSmallArrowIconHeight(fontSize); + int arrowDoubleIconHeight = (int) RadianceSizeUtils.getSmallDoubleArrowIconHeight(fontSize); + int arrowIconWidth = (int) RadianceSizeUtils.getSmallArrowIconWidth(fontSize); + // Gallery scroller commands this.scrollUpCommand = Command.builder() .setAction(commandActionEvent -> { scrollOneRowUp(); ribbonGallery.revalidate(); }) + .setIconFactory(() -> new CommandButtonFollowColorSchemeIcon( + (g, scheme, width, height) -> + BladeArrowIconUtils.drawArrow(g, width, height, + RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), + SwingConstants.NORTH, + scheme), new Dimension(arrowIconWidth, arrowIconHeight))) .build(); this.scrollDownCommand = Command.builder() .setAction(commandActionEvent -> { scrollOneRowDown(); ribbonGallery.revalidate(); }) + .setIconFactory(() -> new CommandButtonFollowColorSchemeIcon( + (g, scheme, width, height) -> + BladeArrowIconUtils.drawArrow(g, width, height, + RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), + SwingConstants.SOUTH, + scheme), new Dimension(arrowIconWidth, arrowIconHeight))) .build(); this.expandCommand = Command.builder() .setAction(commandActionEvent -> { @@ -170,6 +195,13 @@ protected void installComponents() { popupMenuPanel, x, loc.y); }); }) + .setIconFactory(() -> new CommandButtonFollowColorSchemeIcon( + (g, scheme, width, height) -> + BladeArrowIconUtils.drawDoubleArrow(g, width, height, + RadianceSizeUtils.getSmallDoubleArrowGap(fontSize), + RadianceSizeUtils.getDoubleArrowStrokeWidth(fontSize), + SwingConstants.SOUTH, scheme), + new Dimension(arrowIconWidth, arrowDoubleIconHeight))) .build(); // Configure the overlay for the expand command to show the gallery's expand key tip @@ -177,25 +209,27 @@ protected void installComponents() { new HashMap<>(); galleryScrollerOverlays.put(this.scrollUpCommand, CommandButtonPresentationModel.overlay() + .setSides(RadianceThemingSlices.Sides.builder() + .setStraightSides(EnumSet.of(RadianceThemingSlices.Side.LEADING)) + .build()) .setAutoRepeatAction(true) .setAutoRepeatActionIntervals(200, 50)); galleryScrollerOverlays.put(this.scrollDownCommand, CommandButtonPresentationModel.overlay() + .setSides(RadianceThemingSlices.Sides.builder() + .setStraightSides(EnumSet.of(RadianceThemingSlices.Side.LEADING)) + .build()) .setAutoRepeatAction(true) .setAutoRepeatActionIntervals(200, 50)); galleryScrollerOverlays.put(this.expandCommand, CommandButtonPresentationModel.overlay() + .setSides(RadianceThemingSlices.Sides.builder() + .setStraightSides(EnumSet.of(RadianceThemingSlices.Side.LEADING)) + .build()) .setActionKeyTip(this.ribbonGallery.getProjection() .getPresentationModel().getExpandKeyTip()) .setActionFireTrigger(CommandButtonPresentationModel.ActionFireTrigger.ON_PRESSED)); - // Configure customizers for all the scroller buttons (setting icons and additional - // straight sides) - Map> galleryScrollerCustomizers = new HashMap<>(); - galleryScrollerCustomizers.put(this.scrollUpCommand, this::configureScrollUpButton); - galleryScrollerCustomizers.put(this.scrollDownCommand, this::configureScrollDownButton); - galleryScrollerCustomizers.put(this.expandCommand, this::configureExpandButton); - // Configure the component supplier for the expand command to return our own subclass Map> galleryScrollerSuppliers = new HashMap<>(); @@ -209,12 +243,12 @@ protected void installComponents() { this.galleryScrollerCommands, CommandStripPresentationModel.builder() .setOrientation(StripOrientation.VERTICAL) - .setCommandPresentationState(CommandButtonPresentationState.BIG_FIT_TO_ICON) + .setCommandPresentationState(CommandButtonPresentationState.SMALL_FIT_TO_ICON) + .setCommandContentPadding(new Insets(0, 0, 0, 0)) .setBackgroundAppearanceStrategy(RadianceThemingSlices.BackgroundAppearanceStrategy.ALWAYS) .setToDismissPopupsOnActivation(false) .build()); projection.setCommandComponentSuppliers(galleryScrollerSuppliers); - projection.setCommandComponentCustomizers(galleryScrollerCustomizers); projection.setCommandOverlays(galleryScrollerOverlays); this.buttonStrip = projection.buildComponent(); @@ -588,10 +622,4 @@ public ExpandCommandButton(Projection