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

org.datacleaner.widgets.ComboButton Maven / Gradle / Ivy

There is a newer version: 6.0.0
Show newest version
/**
 * DataCleaner (community edition)
 * Copyright (C) 2014 Neopost - Customer Information Management
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.datacleaner.widgets;

import java.awt.Component;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;

import org.datacleaner.panels.DCPanel;
import org.datacleaner.util.IconUtils;
import org.datacleaner.util.ImageManager;
import org.datacleaner.util.LookAndFeelManager;
import org.datacleaner.util.WidgetFactory;
import org.datacleaner.util.WidgetUtils;
import org.jdesktop.swingx.HorizontalLayout;

/**
 * Represents a set of related buttons; typically a set of toggle buttons or a
 * button with an alternate mode/dropdown selector.
 */
public class ComboButton extends JPanel {

    private static final long serialVersionUID = 1L;

    private final List _buttons;
    private final ActionListener _commonToggleButtonActionListener;

    /**
     * Constructs a {@link ComboButton}.
     */
    public ComboButton() {
        super(new HorizontalLayout(0));
        _buttons = new ArrayList<>(2);
        _commonToggleButtonActionListener = e -> {
            for (final AbstractButton button : _buttons) {
                final Object source = e.getSource();
                if (source != button) {
                    button.setSelected(false);
                }
            }

        };

        final Border border = new LineBorder(WidgetUtils.BG_COLOR_LESS_BRIGHT, 1, false);
        setBorder(border);
    }

    /**
     * Adds a button to the {@link ComboButton}.
     *
     * @param text
     *            the text of the button
     * @param toggleButton
     *            whether or not this button should be a toggle button (true) or
     *            a regular button (false)
     * @return
     */
    public AbstractButton addButton(final String text, final boolean toggleButton) {
        return addButton(text, (Icon) null, toggleButton);
    }

    /**
     * Adds a button to this {@link ComboButton}
     *
     * @param text
     *            the text of the button
     * @param icon
     *            the icon of the button
     * @param toggleButton
     *            whether or not this button should be a toggle button (true) or
     *            a regular button (false)
     * @return
     */
    public AbstractButton addButton(final String text, final Icon icon, final boolean toggleButton) {
        final AbstractButton button;
        if (toggleButton) {
            button = new JToggleButton(text, icon);
            button.addActionListener(_commonToggleButtonActionListener);
        } else {
            button = new JButton(text, icon);
        }

        addButton(button);
        return button;
    }

    /**
     * Adds a button to this {@link ComboButton}. Beware that this method does
     * change the styling (colors, borders etc.) of the button to make it fit
     * the {@link ComboButton}.
     *
     * @param button
     */
    public void addButton(final AbstractButton button) {
        WidgetUtils.setDefaultButtonStyle(button);
        final EmptyBorder baseBorder =
                new EmptyBorder(WidgetUtils.BORDER_WIDE_WIDTH - 1, 9, WidgetUtils.BORDER_WIDE_WIDTH - 1, 9);
        if (getComponentCount() == 0) {
            button.setBorder(baseBorder);
        } else {
            final Component lastComponent = getComponent(getComponentCount() - 1);
            if (lastComponent instanceof AbstractButton) {
                // previous component was also a button - add a line on the left
                // side
                final Border outsideBorder = new MatteBorder(0, 1, 0, 0, WidgetUtils.BG_COLOR_LESS_BRIGHT);
                button.setBorder(new CompoundBorder(outsideBorder, baseBorder));
            } else {
                button.setBorder(baseBorder);
            }
        }
        button.setOpaque(false);
        _buttons.add(button);

        add(button);
    }

    /**
     * Gets the currently selected toggle button, if any.
     *
     * @return
     */
    public JToggleButton getSelectedToggleButton() {
        for (final AbstractButton button : _buttons) {
            if (button instanceof JToggleButton) {
                if (button.isSelected()) {
                    return (JToggleButton) button;
                }
            }
        }
        return null;
    }

    /**
     * Adds a button to this {@link ComboButton}
     *
     * @param text
     *            the text of the button
     * @param iconImagePath
     *            the icon path of the button
     * @param toggleButton
     *            whether or not this button should be a toggle button (true) or
     *            a regular button (false)
     * @return
     */
    public AbstractButton addButton(final String text, final String iconImagePath, final boolean toggleButton) {
        final ImageIcon icon = ImageManager.get().getImageIcon(iconImagePath, IconUtils.ICON_SIZE_MEDIUM);
        return addButton(text, icon, toggleButton);
    }

    // a simple test app
    public static void main(final String[] args) {
        LookAndFeelManager.get().init();

        final ComboButton comboButton1 = new ComboButton();
        comboButton1.addButton("Foo!", IconUtils.ACTION_ADD_DARK, true);
        comboButton1.addButton("Boo!", IconUtils.ACTION_REMOVE_DARK, true);

        final ComboButton comboButton2 = new ComboButton();
        comboButton2.addButton("Foo!", IconUtils.ACTION_ADD_DARK, false);
        comboButton2.addButton("Boo!", IconUtils.ACTION_REMOVE_DARK, false);
        comboButton2.addButton("Mrr!", IconUtils.ACTION_REFRESH, true);
        comboButton2.addButton("Rrrh!", IconUtils.ACTION_DRILL_TO_DETAIL, true);

        final DCPanel panel = new DCPanel(WidgetUtils.COLOR_DEFAULT_BACKGROUND);
        panel.add(comboButton1);
        panel.add(comboButton2);

        final JButton regularButton = WidgetFactory.createDefaultButton("Regular button", IconUtils.ACTION_ADD_DARK);
        panel.add(regularButton);

        final JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 400);
        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy