/*
   * (non-Javadoc)
   *
   * @see
   * org.jvnet.flamingo.common.ui.BasicCommandButtonUI#paint(java.awt.Graphics
   * , javax.swing.JComponent)
   */
  @Override
  public void paint(Graphics g, JComponent c) {
    Graphics2D g2d = (Graphics2D) g.create();
    g2d.setFont(
        FlamingoUtilities.getFont(this.commandButton, "Ribbon.font", "Button.font", "Panel.font"));

    this.layoutInfo = this.layoutManager.getLayoutInfo(this.commandButton, g);
    commandButton.putClientProperty("icon.bounds", layoutInfo.iconRect);
    commandButton.putClientProperty("icon", commandButton.getIcon());

    if (this.isPaintingBackground()) {
      this.paintButtonBackground(g2d, new Rectangle(0, 0, c.getWidth(), c.getHeight()));
    }

    // decide which command button model should be used to
    // compute the foreground color of the command button's text
    boolean useActionAreaForFg = layoutInfo.isTextInActionArea;
    StateTransitionTracker transitionTrackerForFg =
        useActionAreaForFg ? this.getActionTransitionTracker() : this.getPopupTransitionTracker();
    ModelStateInfo modelStateInfoForFg = transitionTrackerForFg.getModelStateInfo();
    ComponentState currStateForFg = modelStateInfoForFg.getCurrModelState();
    Color fgColor = this.commandButton.getForeground();

    if (fgColor instanceof UIResource) {
      float buttonAlpha =
          SubstanceColorSchemeUtilities.getAlpha(this.commandButton, currStateForFg);
      fgColor =
          SubstanceTextUtilities.getForegroundColor(
              this.commandButton, this.commandButton.getText(), modelStateInfoForFg, buttonAlpha);
    }

    if (layoutInfo.textLayoutInfoList != null) {
      for (CommandButtonLayoutManager.TextLayoutInfo mainTextLayoutInfo :
          layoutInfo.textLayoutInfoList) {
        if (mainTextLayoutInfo.text != null) {
          SubstanceTextUtilities.paintText(
              g2d,
              c,
              mainTextLayoutInfo.textRect,
              mainTextLayoutInfo.text,
              -1,
              g2d.getFont(),
              fgColor,
              g2d.getClipBounds());
        }
      }
    }

    if (layoutInfo.extraTextLayoutInfoList != null) {
      Color disabledFgColor =
          SubstanceColorSchemeUtilities.getColorScheme(
                  this.commandButton, ComponentState.DISABLED_UNSELECTED)
              .getForegroundColor();
      float buttonAlpha =
          SubstanceColorSchemeUtilities.getAlpha(
              this.commandButton, ComponentState.DISABLED_UNSELECTED);
      if (buttonAlpha < 1.0f) {
        Color bgFillColor = SubstanceColorUtilities.getBackgroundFillColor(this.commandButton);
        disabledFgColor =
            SubstanceColorUtilities.getInterpolatedColor(disabledFgColor, bgFillColor, buttonAlpha);
      }
      if (currStateForFg.isDisabled()) {
        disabledFgColor =
            SubstanceColorUtilities.getInterpolatedColor(
                disabledFgColor, SubstanceColorUtilities.getBackgroundFillColor(c), 0.5);
      }
      for (CommandButtonLayoutManager.TextLayoutInfo extraTextLayoutInfo :
          layoutInfo.extraTextLayoutInfoList) {
        if (extraTextLayoutInfo.text != null) {
          SubstanceTextUtilities.paintText(
              g2d,
              c,
              extraTextLayoutInfo.textRect,
              extraTextLayoutInfo.text,
              -1,
              g2d.getFont(),
              disabledFgColor,
              g2d.getClipBounds());
        }
      }
    }

    if (layoutInfo.iconRect != null) {
      this.paintButtonIcon(g2d, layoutInfo.iconRect);
    }
    if (layoutInfo.popupActionRect.getWidth() > 0) {
      paintPopupActionIcon(g2d, layoutInfo.popupActionRect);
    }

    if (this.isPaintingSeparators() && (layoutInfo.separatorArea != null)) {
      if (layoutInfo.separatorOrientation == CommandButtonSeparatorOrientation.HORIZONTAL) {
        this.paintButtonHorizontalSeparator(g2d, layoutInfo.separatorArea);
      } else {
        this.paintButtonVerticalSeparator(g2d, layoutInfo.separatorArea);
      }
    }

    // g2d.setColor(Color.red);
    // g2d.draw(layoutInfo.iconRect);
    // g2d.setColor(Color.blue);
    // if (layoutInfo.textLayoutInfoList != null) {
    // for (CommandButtonLayoutManager.TextLayoutInfo mainTextLayoutInfo :
    // layoutInfo.textLayoutInfoList) {
    // if (mainTextLayoutInfo.text != null) {
    // g2d.draw(mainTextLayoutInfo.textRect);
    // }
    // }
    // }
    // g2d.setColor(Color.magenta);
    // if (layoutInfo.extraTextLayoutInfoList != null) {
    // for (CommandButtonLayoutManager.TextLayoutInfo extraTextLayoutInfo :
    // layoutInfo.extraTextLayoutInfoList) {
    // if (extraTextLayoutInfo.text != null) {
    // g2d.draw(extraTextLayoutInfo.textRect);
    // }
    // }
    // }
    // g2d.setColor(Color.green);
    // g2d.draw(layoutInfo.popupActionRect);

    g2d.dispose();
  }
Exemple #2
0
  @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);
          }
        });
  }