/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2012 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.text.SizeFormat;
import com.mucommander.text.Translator;
import com.mucommander.ui.border.MutableLineBorder;
import com.mucommander.ui.chooser.FontChooser;
import com.mucommander.ui.chooser.PreviewLabel;
import com.mucommander.ui.dialog.pref.PreferencesDialog;
import com.mucommander.ui.layout.ProportionalGridPanel;
import com.mucommander.ui.layout.YBoxPanel;
import com.mucommander.ui.theme.ThemeData;
import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* @author Nicolas Rinaudo, Maxence Bernard
*/
class StatusBarPanel extends ThemeEditorPanel implements PropertyChangeListener {
private static final int OK = 0;
private static final int WARNING = 1;
private static final int CRITICAL = 2;
private final static int WARNING_LEVEL_COLOR_IDS[] = {
ThemeData.STATUS_BAR_OK_COLOR,
ThemeData.STATUS_BAR_WARNING_COLOR,
ThemeData.STATUS_BAR_CRITICAL_COLOR
};
private final static String WARNING_LEVEL_LABELS[] = {
Translator.get("theme_editor.free_space.ok"),
Translator.get("theme_editor.free_space.warning"),
Translator.get("theme_editor.free_space.critical")
};
private final static int VOLUME_INFO_SIZE_FORMAT = SizeFormat.DIGITS_MEDIUM | SizeFormat.UNIT_SHORT | SizeFormat.INCLUDE_SPACE | SizeFormat.ROUND_TO_KB;
private final static long TOTAL_SIZE = 85899345920l;
private final static long NORMAL_SIZE = TOTAL_SIZE / 2;
private final static long WARNING_SIZE = TOTAL_SIZE / 10;
private final static long CRITICAL_SIZE = TOTAL_SIZE / 100;
private final static int WARNING_DRAW_PERCENTAGE[] = {50, 10, 1};
private final static String WARNING_LEVEL_TEXT[] = {
Translator.get("status_bar.volume_free", SizeFormat.format(NORMAL_SIZE, VOLUME_INFO_SIZE_FORMAT) + " / " + SizeFormat.format(TOTAL_SIZE, VOLUME_INFO_SIZE_FORMAT)),
Translator.get("status_bar.volume_free", SizeFormat.format(WARNING_SIZE, VOLUME_INFO_SIZE_FORMAT) + " / " + SizeFormat.format(TOTAL_SIZE, VOLUME_INFO_SIZE_FORMAT)),
Translator.get("status_bar.volume_free", SizeFormat.format(CRITICAL_SIZE, VOLUME_INFO_SIZE_FORMAT) + " / " + SizeFormat.format(TOTAL_SIZE, VOLUME_INFO_SIZE_FORMAT))
};
private JLabel normalPreview;
private Preview okPreview;
private Preview warningPreview;
private Preview criticalPreview;
// - Initialisation ------------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Creates a new file table editor.
* @param parent dialog containing the panel.
* @param themeData themeData being edited.
*/
public StatusBarPanel(PreferencesDialog parent, ThemeData themeData) {
super(parent, Translator.get("theme_editor.statusbar_tab"), themeData);
initUI();
}
private JPanel createGeneralPanel(FontChooser chooser, ColorButton foreground) {
YBoxPanel mainPanel;
JPanel colorPanel;
JPanel flowPanel;
// Initialises the color panel.
colorPanel = new ProportionalGridPanel(2);
colorPanel.add(createCaptionLabel("theme_editor.text"));
colorPanel.add(foreground);
// Wraps the color panel in a flow layout.
flowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
flowPanel.add(colorPanel);
flowPanel.setBorder(BorderFactory.createTitledBorder(Translator.get("theme_editor.colors")));
// Creates the general panel.
mainPanel = new YBoxPanel();
mainPanel.add(chooser);
mainPanel.addSpace(10);
mainPanel.add(flowPanel);
return mainPanel;
}
private JPanel createFreeSpacePanel(FontChooser chooser, ColorButton foreground, ColorButton background, ColorButton border) {
JPanel colorPanel;
JPanel flowPanel;
PreviewLabel previewLabel;
colorPanel = new ProportionalGridPanel(2);
colorPanel.add(new JLabel());
colorPanel.add(createCaptionLabel("theme_editor.color"));
colorPanel.add(createCaptionLabel("theme_editor.background"));
colorPanel.add(background);
colorPanel.add(createCaptionLabel("theme_editor.border"));
colorPanel.add(border);
for(int i=0; i<3; i++) {
previewLabel = new PreviewLabel();
previewLabel.setOverlayUnderText(true);
previewLabel.setTextPainted(true);
foreground.addUpdatedPreviewComponent(previewLabel);
background.addUpdatedPreviewComponent(previewLabel);
border.addUpdatedPreviewComponent(previewLabel);
addFontChooserListener(chooser, previewLabel);
colorPanel.add(createCaptionLabel(WARNING_LEVEL_LABELS[i]));
colorPanel.add(new ColorButton(parent, themeData, WARNING_LEVEL_COLOR_IDS[i], PreviewLabel.OVERLAY_COLOR_PROPERTY_NAME, previewLabel));
previewLabel.addPropertyChangeListener(this);
}
flowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
flowPanel.add(colorPanel);
return flowPanel;
}
private void addPreviewLabel(YBoxPanel panel, JLabel preview, String label, FontChooser chooser) {
JPanel wrapper;
panel.add(createCaptionLabel(label));
wrapper = new JPanel(new BorderLayout());
wrapper.add(preview, BorderLayout.NORTH);
panel.add(wrapper);
addFontChooserListener(chooser, preview);
}
private JPanel createPreviewPanel(FontChooser fontChooser) {
YBoxPanel previewPanel;
Insets insets;
previewPanel = new YBoxPanel();
addPreviewLabel(previewPanel, normalPreview = new JLabel(Translator.get("status_bar.selected_files", "3", "14")), "theme_editor.normal", fontChooser);
normalPreview.setForeground(themeData.getColor(ThemeData.STATUS_BAR_FOREGROUND_COLOR));
addPreviewLabel(previewPanel, okPreview = new Preview(OK), "theme_editor.free_space.ok", fontChooser);
addPreviewLabel(previewPanel, warningPreview = new Preview(WARNING), "theme_editor.free_space.warning", fontChooser);
addPreviewLabel(previewPanel, criticalPreview = new Preview(CRITICAL), "theme_editor.free_space.critical", fontChooser);
previewPanel.setBorder(BorderFactory.createTitledBorder(Translator.get("preview")));
insets = previewPanel.getInsets();
previewPanel.setInsets(new Insets(insets.top, insets.left + 8, insets.bottom, insets.right + 6));
return previewPanel;
}
/**
* Initialises the panel's UI.
*/
private void initUI() {
JPanel mainPanel;
ColorButton foreground;
ColorButton background;
ColorButton border;
PreviewLabel previewLabel;
PreviewLabel borderPreviewLabel;
FontChooser fontChooser;
JTabbedPane tabbedPane;
fontChooser = createFontChooser(ThemeData.STATUS_BAR_FONT);
// Initialises the foreground color button.
foreground = new ColorButton(parent, themeData, ThemeData.STATUS_BAR_FOREGROUND_COLOR, PreviewLabel.FOREGROUND_COLOR_PROPERTY_NAME, previewLabel = new PreviewLabel());
previewLabel.setTextPainted(true);
addFontChooserListener(fontChooser, previewLabel);
previewLabel.addPropertyChangeListener(this);
// Initialises the background and border color buttons.
background = new ColorButton(parent, themeData, ThemeData.STATUS_BAR_BACKGROUND_COLOR, PreviewLabel.BACKGROUND_COLOR_PROPERTY_NAME, previewLabel = new PreviewLabel());
border = new ColorButton(parent, themeData, ThemeData.STATUS_BAR_BORDER_COLOR, PreviewLabel.BORDER_COLOR_PROPERTY_NAME, borderPreviewLabel = new PreviewLabel());
// Initialises the background color preview.
previewLabel.setTextPainted(true);
foreground.addUpdatedPreviewComponent(previewLabel);
border.addUpdatedPreviewComponent(previewLabel);
addFontChooserListener(fontChooser, previewLabel);
previewLabel.addPropertyChangeListener(this);
// Initialises the border color preview.
borderPreviewLabel.setTextPainted(true);
foreground.addUpdatedPreviewComponent(borderPreviewLabel);
background.addUpdatedPreviewComponent(borderPreviewLabel);
addFontChooserListener(fontChooser, borderPreviewLabel);
borderPreviewLabel.addPropertyChangeListener(this);
tabbedPane = new JTabbedPane();
tabbedPane.add(Translator.get("theme_editor.general"), createGeneralPanel(fontChooser, foreground));
tabbedPane.add(Translator.get("theme_editor.free_space"), createFreeSpacePanel(fontChooser, foreground, background, border));
// Main layout.
mainPanel = new JPanel(new BorderLayout());
mainPanel.add(tabbedPane, BorderLayout.CENTER);
mainPanel.add(createPreviewPanel(fontChooser), BorderLayout.EAST);
// Aligns everything north.
setLayout(new BorderLayout());
add(mainPanel, BorderLayout.NORTH);
}
// - Modification management ---------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Ignored.
*/
@Override
public void commit() {}
// - Property listening --------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Refreshes the UI depending on the property event.
*/
public void propertyChange(PropertyChangeEvent event) {
// Repaints previews when the overlay or background color have been changed.
if(event.getPropertyName().equals(PreviewLabel.BACKGROUND_COLOR_PROPERTY_NAME) || event.getPropertyName().equals(PreviewLabel.OVERLAY_COLOR_PROPERTY_NAME)) {
okPreview.repaint();
warningPreview.repaint();
criticalPreview.repaint();
}
// Resets the preview labels' foreground color.
else if(event.getPropertyName().equals(PreviewLabel.FOREGROUND_COLOR_PROPERTY_NAME)) {
Color color;
color = themeData.getColor(ThemeData.STATUS_BAR_FOREGROUND_COLOR);
okPreview.setForeground(color);
warningPreview.setForeground(color);
criticalPreview.setForeground(color);
normalPreview.setForeground(color);
}
// Resets the preview labels' borders.
else if(event.getPropertyName().equals(PreviewLabel.BORDER_COLOR_PROPERTY_NAME)) {
okPreview.refreshBorder();
warningPreview.refreshBorder();
criticalPreview.refreshBorder();
}
}
// - Preview labels ------------------------------------------------------------------
// -----------------------------------------------------------------------------------
private class Preview extends JLabel {
private MutableLineBorder border;
private int type;
public Preview(int type) {
super(WARNING_LEVEL_TEXT[type]);
setOpaque(false);
setBorder(border = new MutableLineBorder(Color.BLACK, 1));
setHorizontalAlignment(CENTER);
setForeground(themeData.getColor(ThemeData.STATUS_BAR_FOREGROUND_COLOR));
this.type = type;
}
public void refreshBorder() {
border.setLineColor(themeData.getColor(ThemeData.STATUS_BAR_BORDER_COLOR));
repaint();
}
@Override
public void paint(Graphics g) {
int width;
width = ((getWidth() - 2) * WARNING_DRAW_PERCENTAGE[type]) / 100;
if(type == OK)
g.setColor(themeData.getColor(ThemeData.STATUS_BAR_OK_COLOR));
else if(type == WARNING)
g.setColor(themeData.getColor(ThemeData.STATUS_BAR_WARNING_COLOR));
else
g.setColor(themeData.getColor(ThemeData.STATUS_BAR_CRITICAL_COLOR));
g.fillRect(1, 1, width + 1, getHeight() - 2);
g.setColor(themeData.getColor(ThemeData.STATUS_BAR_BACKGROUND_COLOR));
g.fillRect(width + 1, 1, getWidth() - width - 1, getHeight() - 2);
super.paint(g);
}
}
}