All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.seaglasslookandfeel.component.SeaGlassArrowButton Maven / Gradle / Ivy

/*
 * Copyright (c) 2009 Kathryn Huxtable and Kenneth Orr.
 *
 * This file is part of the SeaGlass Pluggable Look and Feel.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * $Id: SeaGlassArrowButton.java 1115 2010-02-09 21:26:16Z [email protected] $
 */
package com.seaglasslookandfeel.component;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
import javax.swing.plaf.UIResource;

import com.seaglasslookandfeel.SeaGlassContext;
import com.seaglasslookandfeel.ui.SeaGlassButtonUI;

/**
 * JButton object that draws a scaled Arrow in one of the cardinal directions.
 *
 * 

Based on SynthArrowButton by Scott Violet.

* * @see javax.swing.plaf.synth.SynthArrowButton */ public class SeaGlassArrowButton extends JButton implements SwingConstants, UIResource { private static final long serialVersionUID = 2673388860074501956L; private int direction; /** * Creates a new SeaGlassArrowButton object. * * @param direction the direction to point the arrow. This will be one of * the SwingConstants {@code NORTH}, {@code WEST}, * {@code SOUTH}, or {@code EAST}. */ public SeaGlassArrowButton(int direction) { super(); super.setFocusable(false); setDirection(direction); setDefaultCapable(false); } /** * @see javax.swing.JButton#getUIClassID() */ public String getUIClassID() { return "ArrowButtonUI"; } /** * @see javax.swing.JButton#updateUI() */ public void updateUI() { setUI(new SeaGlassArrowButtonUI()); } /** * Set the arrow's direction. * * @param dir the direction to point the arrow. This will be one of the * SwingConstants {@code NORTH}, {@code WEST}, {@code SOUTH}, or * {@code EAST}. */ public void setDirection(int dir) { direction = dir; putClientProperty("__arrow_direction__", new Integer(dir)); repaint(); } /** * Get the direction of the arrow. * * @return the direction the arrow points. This will be one of the * SwingConstants {@code NORTH}, {@code WEST}, {@code SOUTH}, or * {@code EAST}. */ public int getDirection() { return direction; } /** * @see java.awt.Component#setFocusable(boolean) */ public void setFocusable(boolean focusable) { } /** * The UI delegate for the arrow button. */ private static class SeaGlassArrowButtonUI extends SeaGlassButtonUI { /** * @see com.seaglasslookandfeel.ui.SeaGlassButtonUI#installDefaults(javax.swing.AbstractButton) */ protected void installDefaults(AbstractButton b) { super.installDefaults(b); updateStyle(b); } /** * @see com.seaglasslookandfeel.ui.SeaGlassButtonUI#paint(com.seaglasslookandfeel.SeaGlassContext, * java.awt.Graphics) */ protected void paint(SeaGlassContext context, Graphics g) { SeaGlassArrowButton button = (SeaGlassArrowButton) context.getComponent(); context.getPainter().paintArrowButtonForeground(context, g, 0, 0, button.getWidth(), button.getHeight(), button.getDirection()); } /** * Paint the arrow background. * * @param context the SynthContext. * @param g the Graphics context. * @param c the arrow component. */ @SuppressWarnings("all") void paintBackground(SeaGlassContext context, Graphics g, JComponent c) { context.getPainter().paintArrowButtonBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); } /** * Paint the arrow border. * * @param context the SynthContext. * @param g the Graphics context. * @param x the x coordinate corresponding to the upper-left * corner to paint. * @param y the y coordinate corresponding to the upper-left * corner to paint. * @param w the width to paint. * @param h the height to paint. */ @SuppressWarnings("unused") public void paintBorder(SeaGlassContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintArrowButtonBorder(context, g, x, y, w, h); } /** * Get the minimum size for the arrow. * * @return the minimum size. */ @SuppressWarnings("unused") public Dimension getMinimumSize() { return new Dimension(5, 5); } /** * Get the maximum size for the arrow. * * @return the maximum size. */ @SuppressWarnings("unused") public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } /** * @see com.seaglasslookandfeel.ui.SeaGlassButtonUI#getPreferredSize(javax.swing.JComponent) */ public Dimension getPreferredSize(JComponent c) { SeaGlassContext context = getContext(c); Dimension dim = null; if (context.getComponent().getName() == "ScrollBar.button") { // ScrollBar arrow buttons can be non-square when // the ScrollBar.squareButtons property is set to FALSE // and the ScrollBar.buttonSize property is non-null dim = (Dimension) context.getStyle().get(context, "ScrollBar.buttonSize"); } if (dim == null) { // For all other cases (including Spinner, ComboBox), we will // fall back on the single ArrowButton.size value to create // a square return value int size = context.getStyle().getInt(context, "ArrowButton.size", 16); dim = new Dimension(size, size); } // handle scaling for sizeVarients for special case components. The // key "JComponent.sizeVariant" scales for large/small/mini // components are based on Apples LAF JComponent parent = (JComponent) context.getComponent().getParent(); if (parent != null && !(parent instanceof JComboBox)) { String scaleKey = (String) parent.getClientProperty("JComponent.sizeVariant"); if (scaleKey != null) { if ("large".equals(scaleKey)) { dim = new Dimension((int) (dim.width * 1.15), (int) (dim.height * 1.15)); } else if ("small".equals(scaleKey)) { dim = new Dimension((int) (dim.width * 0.857), (int) (dim.height * 0.857)); } else if ("mini".equals(scaleKey)) { dim = new Dimension((int) (dim.width * 0.714), (int) (dim.height * 0.714)); } } } context.dispose(); return dim; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy