/*
* 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 java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import com.mucommander.text.Translator;
import com.mucommander.ui.chooser.FontChooser;
import com.mucommander.ui.chooser.PreviewLabel;
import com.mucommander.ui.dialog.pref.PreferencesDialog;
import com.mucommander.ui.icon.CustomFileIconProvider;
import com.mucommander.ui.icon.IconManager;
import com.mucommander.ui.layout.ProportionalGridPanel;
import com.mucommander.ui.layout.YBoxPanel;
import com.mucommander.ui.quicklist.QuickList;
import com.mucommander.ui.quicklist.item.QuickListDataList;
import com.mucommander.ui.quicklist.item.QuickListDataListWithIcons;
import com.mucommander.ui.quicklist.item.QuickListHeaderItem;
import com.mucommander.ui.theme.ThemeData;
/**
* @author Arik Hadas
*/
public class QuickListPanel extends ThemeEditorPanel implements PropertyChangeListener {
// - Instance fields -----------------------------------------------------------------
// -----------------------------------------------------------------------------------
/** Used to preview the quick list. */
private JPanel quickListPreviewPanel;
/** The header of the sample quick list */
private QuickListHeaderItem header = new QuickListHeaderItem(Translator.get("sample_text"));
/** The items of the sample quick list */
private final static String[] sampleData;
/** The icon of the sample items */
private final Icon sampleIcon = IconManager.getIcon(IconManager.FILE_ICON_SET, CustomFileIconProvider.FOLDER_ICON_NAME);
static {
String sampleText = Translator.get("sample_text");
sampleData = new String[10];
for(int i=0; i<sampleData.length; i++)
sampleData[i] = sampleText + " " + (i+1)+" ";
}
/** The list of items of the sample quick list */
private QuickListDataList<String> list = new QuickListDataListWithIcons<String>(sampleData) {
{
for (KeyListener listener : getKeyListeners())
removeKeyListener(listener);
}
@Override
public Icon getImageIconOfItem(String item, final Dimension preferredSize) {
return sampleIcon;
}
@Override
protected void addMouseListenerToList() { }
};
/**
* Creates the quick list preview panel.
* @return the quick list preview panel.
*/
private JPanel createPreviewPanel() {
JPanel panel; // Preview panel.
JScrollPane scroll; // Wraps the preview quick list.
// add JScrollPane that contains the TablePopupDataList to the popup.
scroll = new JScrollPane(list,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setBorder(null);
scroll.getVerticalScrollBar().setFocusable( false );
scroll.getHorizontalScrollBar().setFocusable( false );
// Creates the panel.
panel = new JPanel();
quickListPreviewPanel = new YBoxPanel();
quickListPreviewPanel.add(header);
quickListPreviewPanel.add(scroll);
quickListPreviewPanel.setBorder(new QuickList.PopupsBorder());
panel.add(quickListPreviewPanel);
panel.setBorder(BorderFactory.createTitledBorder(Translator.get("preview")));
return panel;
}
// - Initialization ------------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Creates a new quick list editor.
* @param parent dialog containing the panel.
* @param themeData themeData being edited.
*/
public QuickListPanel(PreferencesDialog parent, ThemeData themeData) {
super(parent, Translator.get("quick_lists_menu"), themeData);
initUI();
}
// - UI initialization ---------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Creates the JPanel that contains all of the item's color configuration elements.
* @param fontChooser font chooser used by the editor panel.
* @return the JPanel that contains all of the item's color configuration elements.
*/
private JPanel createItemColorsPanel(FontChooser fontChooser) {
ProportionalGridPanel gridPanel; // Contains all the color buttons.
JPanel colorsPanel; // Used to wrap the colors panel in a flow layout.
PreviewLabel label;
// Initialisation.
gridPanel = new ProportionalGridPanel(3);
// Header.
addLabelRow(gridPanel, false);
label = new PreviewLabel();
// Color buttons.
addColorButtons(gridPanel, fontChooser, "theme_editor.normal",
ThemeData.QUICK_LIST_ITEM_FOREGROUND_COLOR, ThemeData.QUICK_LIST_ITEM_BACKGROUND_COLOR, label).addPropertyChangeListener(this);
addColorButtons(gridPanel, fontChooser, "theme_editor.selected",
ThemeData.QUICK_LIST_SELECTED_ITEM_FOREGROUND_COLOR, ThemeData.QUICK_LIST_SELECTED_ITEM_BACKGROUND_COLOR, label).addPropertyChangeListener(this);
label.addPropertyChangeListener(this);
// Wraps everything in a flow layout.
colorsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
colorsPanel.add(gridPanel);
colorsPanel.setBorder(BorderFactory.createTitledBorder(Translator.get("theme_editor.colors")));
return colorsPanel;
}
/**
* Creates the JPanel that contains all of the header's color configuration elements.
* @param fontChooser font chooser used by the editor panel.
* @return the JPanel that contains all of the header's color configuration elements.
*/
private JPanel createHeaderColorsPanel(FontChooser fontChooser) {
ProportionalGridPanel gridPanel; // Contains all the color buttons.
JPanel colorsPanel; // Used to wrap the colors panel in a flow layout.
PreviewLabel label;
// Initialization.
gridPanel = new ProportionalGridPanel(3);
// Header.
addLabelRow(gridPanel, false);
label = new PreviewLabel();
// Color buttons.
addColorButtons(gridPanel, fontChooser, "",
ThemeData.QUICK_LIST_HEADER_FOREGROUND_COLOR, ThemeData.QUICK_LIST_HEADER_BACKGROUND_COLOR, label).addPropertyChangeListener(this);
label.addPropertyChangeListener(this);
gridPanel.add(createCaptionLabel(""));
gridPanel.add(new JLabel());
PreviewLabel label3 = new PreviewLabel();
ColorButton butt;
gridPanel.add(butt = new ColorButton(parent, themeData, ThemeData.QUICK_LIST_HEADER_SECONDARY_BACKGROUND_COLOR, PreviewLabel.BACKGROUND_COLOR_PROPERTY_NAME, label3));//.addPropertyChangeListener(this);
label3.setTextPainted(true);
label3.addPropertyChangeListener(this);
butt.addUpdatedPreviewComponent(label3);
// Wraps everything in a flow layout.
colorsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
colorsPanel.add(gridPanel);
colorsPanel.setBorder(BorderFactory.createTitledBorder(Translator.get("theme_editor.colors")));
return colorsPanel;
}
/**
* Initializes the panel's UI.
*/
private void initUI() {
YBoxPanel headerConfigurationPanel; // Contains all the configuration elements.
YBoxPanel itemConfigurationPanel; // Contains all the configuration elements.
FontChooser fontChooser1; // Used to select a font.
FontChooser fontChooser2; // Used to select a font.
JPanel mainPanel; // Main panel.
JTabbedPane tabbedPane;
header.addComponentListener(new ComponentListener() {
public void componentHidden(ComponentEvent e) {}
public void componentMoved(ComponentEvent e) {}
public void componentResized(ComponentEvent e) {
quickListPreviewPanel.repaint();
}
public void componentShown(ComponentEvent e) {}
});
// Font chooser and preview initialization.
fontChooser1 = createFontChooser(ThemeData.QUICK_LIST_HEADER_FONT);
fontChooser2 = createFontChooser(ThemeData.QUICK_LIST_ITEM_FONT);
addFontChooserListener(fontChooser1, header);
addFontChooserListener(fontChooser2, list);
// Header configuration panel initialization.
headerConfigurationPanel = new YBoxPanel();
headerConfigurationPanel.add(fontChooser1);
headerConfigurationPanel.addSpace(10);
headerConfigurationPanel.add(createHeaderColorsPanel(fontChooser1));
// Item configuration panel initialization.
itemConfigurationPanel = new YBoxPanel();
itemConfigurationPanel.add(fontChooser2);
itemConfigurationPanel.addSpace(10);
itemConfigurationPanel.add(createItemColorsPanel(fontChooser1));
// Create the tabbed pane.
tabbedPane = new JTabbedPane();
tabbedPane.add(Translator.get("theme_editor.header"), headerConfigurationPanel);
tabbedPane.add(Translator.get("theme_editor.item"), itemConfigurationPanel);
// Main layout.
mainPanel = new JPanel(new BorderLayout());
mainPanel.add(tabbedPane, BorderLayout.CENTER);
mainPanel.add(createPreviewPanel(), BorderLayout.EAST);
// Layout.
setLayout(new BorderLayout());
add(mainPanel, BorderLayout.NORTH);
}
/**
* Listens on changes on the foreground and background colors.
*/
public void propertyChange(PropertyChangeEvent event) {
// Background color changed.
if(event.getPropertyName().equals(PreviewLabel.BACKGROUND_COLOR_PROPERTY_NAME)) {
header.setBackgroundColors(themeData.getColor(ThemeData.QUICK_LIST_HEADER_BACKGROUND_COLOR),
themeData.getColor(ThemeData.QUICK_LIST_HEADER_SECONDARY_BACKGROUND_COLOR));
list.setBackgroundColors(themeData.getColor(ThemeData.QUICK_LIST_ITEM_BACKGROUND_COLOR),
themeData.getColor(ThemeData.QUICK_LIST_SELECTED_ITEM_BACKGROUND_COLOR));
}
// Foreground color changed.
else if(event.getPropertyName().equals(PreviewLabel.FOREGROUND_COLOR_PROPERTY_NAME)) {
header.setForegroundColor(themeData.getColor(ThemeData.QUICK_LIST_HEADER_FOREGROUND_COLOR));
list.setForegroundColors(themeData.getColor(ThemeData.QUICK_LIST_ITEM_FOREGROUND_COLOR),
themeData.getColor(ThemeData.QUICK_LIST_SELECTED_ITEM_FOREGROUND_COLOR));
}
}
// - Modification management ---------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Ignored.
*/
@Override
public void commit() {}
}