/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * muCommander 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.dialog.pref.theme; import com.mucommander.ui.chooser.*; import com.mucommander.ui.dialog.pref.PreferencesDialog; import com.mucommander.ui.theme.ThemeData; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; /** * @author Maxence Bernard, Nicolas Rinaudo */ class ColorButton extends JPanel implements ActionListener, ColorChangeListener { // - Instance variables ----------------------------------------------------- // -------------------------------------------------------------------------- /** ThemeData from which to retrieve the color chooser's values. */ private ThemeData themeData; /** Identifier of the color that's being edited. */ private int colorId; /** Dialog on which the color chooser should be centered and modal to. */ private PreferencesDialog parent; /** The preview component that is repainted when the current color changes (can be null) */ private JComponent previewComponent; /** Name of the preview component's property that gets updated with the current color of this button (can be null) */ private String previewColorPropertyName; private java.util.List<JComponent> updatedPreviewComponents; /** Button's border. */ private Border border = BorderFactory.createEtchedBorder(); /** The color button */ private JButton button; /** Current color displayed in the button */ private Color currentColor; public ColorButton(PreferencesDialog parent, ThemeData themeData, int colorId) { this(parent, themeData, colorId, null, null); } public ColorButton(PreferencesDialog parent, ThemeData themeData, int colorId, String previewColorPropertyName) { this(parent, themeData, colorId, previewColorPropertyName, null); } public ColorButton(PreferencesDialog parent, ThemeData themeData, int colorId, String previewColorPropertyName, JComponent previewComponent) { FlowLayout flowLayout = new FlowLayout(); flowLayout.setHgap(0); flowLayout.setVgap(0); setLayout(flowLayout); this.themeData = themeData; this.colorId = colorId; this.parent = parent; this.previewComponent = previewComponent; this.previewColorPropertyName = previewColorPropertyName; if(previewColorPropertyName != null && previewComponent != null) addUpdatedPreviewComponent(previewComponent); button = new JButton() { @Override public Dimension getPreferredSize() {return new Dimension(70, 30);} @Override public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Fill the button with the specified color g.setColor((ColorButton.this).currentColor); g.fillRect(0, 0, width, height); // Paint custom border border.paintBorder(this, g, 0, 0, width, height); } }; button.addActionListener(this); button.setBorderPainted(true); add(button); // Add a ColorPicker only if this component is supported by the current environment if(ColorPicker.isSupported()) { ColorPicker colorPicker = new ColorPicker(); colorPicker.addColorChangeListener(this); add(colorPicker); } setCurrentColor(themeData.getColor(colorId), false); } void addUpdatedPreviewComponent(JComponent previewComponent) { if(previewColorPropertyName == null) return; if(updatedPreviewComponents == null) updatedPreviewComponents = new Vector<JComponent>(); updatedPreviewComponents.add(previewComponent); previewComponent.putClientProperty(previewColorPropertyName, currentColor); } private void setCurrentColor(Color color, boolean initiatedByUser) { currentColor = color; if(themeData.isColorDifferent(colorId, currentColor)) initiatedByUser &= themeData.setColor(colorId, currentColor); button.repaint(); if(updatedPreviewComponents != null && previewColorPropertyName != null) { int nbPreviewComponents = updatedPreviewComponents.size(); for(int i = 0; i < nbPreviewComponents; i++) updatedPreviewComponents.get(i).putClientProperty(previewColorPropertyName, color); } if (initiatedByUser) parent.componentChanged(null); } private ColorChooser createColorChooser() { if(previewComponent!=null && previewColorPropertyName!=null && (previewComponent instanceof PreviewLabel)) { try {return new ColorChooser(currentColor, (PreviewLabel)((PreviewLabel)previewComponent).clone(), previewColorPropertyName);} catch(CloneNotSupportedException e) {} } return new ColorChooser(currentColor, new PreviewLabel(), PreviewLabel.BACKGROUND_COLOR_PROPERTY_NAME); } /////////////////////////////////// // ActionListener implementation // /////////////////////////////////// public void actionPerformed(ActionEvent e) { ColorChooser chooser; ColorChooser.createDialog(parent, chooser = createColorChooser()).showDialog(); setCurrentColor(chooser.getColor(), true); } //////////////////////////////////////// // ColorChangeListener implementation // //////////////////////////////////////// public void colorChanged(ColorChangeEvent event) {setCurrentColor(event.getColor(), true);} }