/*
* 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.RuntimeConstants;
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.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;
import java.io.InputStreamReader;
/**
* @author Nicolas Rinaudo, Maxence Bernard
*/
class FileEditorPanel extends ThemeEditorPanel implements PropertyChangeListener {
// - Instance fields -----------------------------------------------------------------
// -----------------------------------------------------------------------------------
/** Used to preview the editor's theme. */
private JTextArea preview;
// - Initialisation ------------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Creates a new file table editor.
* @param parent dialog containing the panel.
* @param themeData themeData being edited.
*/
public FileEditorPanel(PreferencesDialog parent, ThemeData themeData) {
super(parent, Translator.get("theme_editor.editor_tab"), themeData);
initUI();
}
// - UI initialisation ---------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Creates the JPanel that contains all of the color configuration elements.
* @param fontChooser font chooser used by the editor panel.
* @return the JPanel that contains all of the color configuration elements.
*/
private JPanel createColorsPanel(FontChooser fontChooser) {
ProportionalGridPanel gridPanel; // Contains all the color buttons.
JPanel colorsPanel; // Used to wrap the colors panel in a flow layout.
// Initialisation.
gridPanel = new ProportionalGridPanel(3);
// Header.
addLabelRow(gridPanel, false);
// Color buttons.
addColorButtons(gridPanel, fontChooser, "theme_editor.normal",
ThemeData.EDITOR_FOREGROUND_COLOR, ThemeData.EDITOR_BACKGROUND_COLOR).addPropertyChangeListener(this);
addColorButtons(gridPanel, fontChooser, "theme_editor.selected",
ThemeData.EDITOR_SELECTED_FOREGROUND_COLOR, ThemeData.EDITOR_SELECTED_BACKGROUND_COLOR).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;
}
/**
* Initialises the panel's UI.
*/
private void initUI() {
YBoxPanel configurationPanel; // Contains all the configuration elements.
FontChooser fontChooser; // Used to select a font.
JPanel mainPanel; // Main panel.
// Font chooser and preview initialisation.
mainPanel = new JPanel(new BorderLayout());
fontChooser = createFontChooser(ThemeData.EDITOR_FONT);
mainPanel.add(createPreviewPanel(), BorderLayout.EAST);
addFontChooserListener(fontChooser, preview);
// Configuration panel initialisation.
configurationPanel = new YBoxPanel();
configurationPanel.add(fontChooser);
configurationPanel.addSpace(10);
configurationPanel.add(createColorsPanel(fontChooser));
mainPanel.add(configurationPanel, BorderLayout.CENTER);
// Layout.
setLayout(new BorderLayout());
add(mainPanel, BorderLayout.NORTH);
}
/**
* Creates the file editor preview panel.
* @return the file editor preview panel.
*/
private JPanel createPreviewPanel() {
JPanel panel; // Preview panel.
JScrollPane scroll; // Wraps the preview text are.
// Initialises the preview text area.
preview = new JTextArea(15, 15);
// Initialises colors.
setBackgroundColors();
setForegroundColors();
// Creates the panel.
panel = new JPanel(new BorderLayout());
panel.add(scroll = new JScrollPane(preview, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
scroll.getViewport().setPreferredSize(preview.getPreferredSize());
panel.setBorder(BorderFactory.createTitledBorder(Translator.get("preview")));
loadText();
preview.setCaretPosition(0);
return panel;
}
/**
* 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))
setBackgroundColors();
// Foreground color changed.
else if(event.getPropertyName().equals(PreviewLabel.FOREGROUND_COLOR_PROPERTY_NAME))
setForegroundColors();
}
private void setBackgroundColors() {
preview.setBackground(themeData.getColor(ThemeData.EDITOR_BACKGROUND_COLOR));
preview.setSelectionColor(themeData.getColor(ThemeData.EDITOR_SELECTED_BACKGROUND_COLOR));
}
private void setForegroundColors() {
preview.setForeground(themeData.getColor(ThemeData.EDITOR_FOREGROUND_COLOR));
preview.setCaretColor(themeData.getColor(ThemeData.EDITOR_FOREGROUND_COLOR));
preview.setSelectedTextColor(themeData.getColor(ThemeData.EDITOR_SELECTED_FOREGROUND_COLOR));
}
// - Misc. ---------------------------------------------------------------------------
// -----------------------------------------------------------------------------------
private void loadText() {
char[] buffer; // Buffer for each chunk of data read from the license file.
int count; // Number of characters read from the last read operation.
InputStreamReader in; // Stream on the license file.
in = null;
try {
in = new InputStreamReader(FileEditorPanel.class.getResourceAsStream(RuntimeConstants.LICENSE));
buffer = new char[2048];
while((count = in.read(buffer)) != -1)
preview.append(new String(buffer, 0, count));
}
catch(Exception e) {}
finally {
if(in != null) {
try {in.close();}
catch(Exception e) {}
}
}
}
// - Modification management ---------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Ignored.
*/
@Override
public void commit() {}
}