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

org.fife.ui.rtextarea.RTextAreaOptionPanel Maven / Gradle / Ivy

/*
 * 10/29/2004
 *
 * RTextAreaOptionPanel.java - An options panel that can be added to
 * org.fife.ui.OptionsDialog for an RTextArea.
 * Copyright (C) 2004 Robert Futrell
 * robert_futrell at users.sourceforge.net
 * http://rtext.fifesoft.com
 *
 * This file is a part of RText.
 *
 * RText 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 2
 * of the License, or any later version.
 *
 * RText 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package org.fife.ui.rtextarea;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ResourceBundle;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

import org.fife.rtext.AbstractMainView;
import org.fife.rtext.RText;
import org.fife.ui.*;
import org.fife.ui.rtextarea.RTextArea;


/**
 * Options panel for basic RTextArea options.
 *
 * @author Robert Futrell
 * @version 0.7
 */
public class RTextAreaOptionPanel extends OptionsDialogPanel
		implements ActionListener, DocumentListener, PropertyChangeListener {

	private FontSelector fontSelector;

	private JLabel tabSizeLabel;
	private JTextField tabSizeField;
	private int tabSize;
	private JCheckBox emulateTabsCheckBox;

	private JCheckBox linkCB;
	private JLabel modKeyLabel;
	private JComboBox modKeyCombo;
	private JLabel linkColorLabel;
	private RColorSwatchesButton linkColorButton;

	private JTextField backgroundField;
	private RButton backgroundButton;
	private BackgroundDialog backgroundDialog;
	private Object background;
	private String bgImageFileName; // null if background is a color.
	private JCheckBox wordWrapCheckBox;
	private JCheckBox highlightCurrentLineCheckBox;
	private RColorSwatchesButton hclColorButton;
	private JCheckBox marginLineCheckBox;
	private JTextField marginLinePositionField;
	private JLabel marginLineColorLabel;
	private RColorSwatchesButton marginLineColorButton;
	private int marginLinePosition;

	private RButton restoreDefaultsButton;

	private static final String PROPERTY		= "property";


	/**
	 * Constructor.
	 */
	public RTextAreaOptionPanel() {

		ComponentOrientation orientation = ComponentOrientation.
									getOrientation(getLocale());

		ResourceBundle msg = ResourceBundle.getBundle(
								"org.fife.ui.rtextarea.OptionPanel");

		setName(msg.getString("Title"));

		setBorder(UIUtil.getEmpty5Border());
		setLayout(new BorderLayout());

		// We'll add everything to this panel, then add this panel so that
		// stuff stays at the "top."
		Box topPanel = Box.createVerticalBox();
		JPanel fontPanel = new JPanel(new BorderLayout());
		fontPanel.setBorder(new OptionPanelBorder(msg.getString("Font")));
		fontSelector = new FontSelector();
		fontSelector.setColorSelectable(true);
		fontSelector.addPropertyChangeListener(FontSelector.FONT_PROPERTY, this);
		fontSelector.addPropertyChangeListener(FontSelector.FONT_COLOR_PROPERTY, this);
		fontPanel.add(fontSelector);
		topPanel.add(fontPanel);

		topPanel.add(Box.createVerticalStrut(5));

		Box tabPanel = Box.createVerticalBox();
		tabPanel.setBorder(new OptionPanelBorder(msg.getString("Tabs")));
		JPanel inputPanel = new JPanel();
		inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS));
		tabSizeLabel = new JLabel(msg.getString("TabSize"));
		tabSizeField = new JTextField();
		tabSizeField.getDocument().addDocumentListener(this);
		Dimension size = new Dimension(40,tabSizeField.getPreferredSize().height);
		tabSizeField.setMaximumSize(size);
		tabSizeField.setPreferredSize(size);
		inputPanel.add(tabSizeLabel);
		inputPanel.add(tabSizeField);
		inputPanel.add(Box.createHorizontalGlue());
		tabPanel.add(inputPanel);
		JPanel etPanel = new JPanel();
		etPanel.setLayout(new BoxLayout(etPanel, BoxLayout.LINE_AXIS));
		emulateTabsCheckBox = new JCheckBox(msg.getString("EmulateTabs"));
		emulateTabsCheckBox.setActionCommand("EmulateTabsCheckBox");
		emulateTabsCheckBox.addActionListener(this);
		etPanel.add(emulateTabsCheckBox);
		etPanel.add(Box.createHorizontalGlue());
		tabPanel.add(etPanel);
		tabPanel.add(Box.createVerticalGlue());
		topPanel.add(tabPanel);

		topPanel.add(Box.createVerticalStrut(5));

		Box linkPanel = Box.createVerticalBox();
		linkPanel.setBorder(new OptionPanelBorder(msg.getString("Hyperlinks")));

		JPanel temp = new JPanel();
		temp.setLayout(new BoxLayout(temp, BoxLayout.LINE_AXIS));
		linkCB = new JCheckBox(msg.getString("MakeLinksClickable"));
		linkCB.setActionCommand("MakeLinksClickable");
		linkCB.addActionListener(this);
		temp.add(linkCB);
		temp.add(Box.createHorizontalGlue());
		linkPanel.add(temp);
		linkPanel.add(Box.createVerticalStrut(5));

		modKeyCombo = createModKeyCombo();
		modKeyLabel = new JLabel(msg.getString("ModifierKey"));
		modKeyLabel.setLabelFor(modKeyCombo);
		linkColorButton = new RColorSwatchesButton();
		linkColorButton.addPropertyChangeListener(this);
		linkColorLabel = new JLabel(msg.getString("HyperlinkColor"));
		linkColorLabel.setLabelFor(linkColorButton);
		JPanel modKeyPanel = new JPanel(new BorderLayout());
		modKeyPanel.add(modKeyCombo, BorderLayout.LINE_START);
		JPanel linkColorPanel = new JPanel(new BorderLayout());
		linkColorPanel.add(linkColorButton, BorderLayout.LINE_START);
		temp = new JPanel(new SpringLayout());
		if (orientation.isLeftToRight()) {
			temp.add(modKeyLabel);    temp.add(modKeyPanel);
			temp.add(linkColorLabel); temp.add(linkColorPanel);
		}
		else {
			temp.add(modKeyPanel);    temp.add(modKeyLabel);
			temp.add(linkColorPanel); temp.add(linkColorLabel);
		}
		UIUtil.makeSpringCompactGrid(temp, 2,2, 20,0, 5,5);
		linkPanel.add(temp);

		topPanel.add(linkPanel);
		topPanel.add(Box.createVerticalStrut(5));

		Box bigOtherPanel = Box.createVerticalBox();
		bigOtherPanel.setBorder(new OptionPanelBorder(msg.getString("Other")));

		Box otherPanel = new Box(BoxLayout.LINE_AXIS);
		JLabel bgLabel = new JLabel(msg.getString("Background"));
		backgroundField = new JTextField(20);
		backgroundField.setEditable(false);
		backgroundButton = new RButton(msg.getString("Change"));
		backgroundButton.setActionCommand("BackgroundButton");
		backgroundButton.addActionListener(this);
		bgLabel.setLabelFor(backgroundButton);
		otherPanel.add(bgLabel);
		otherPanel.add(Box.createHorizontalStrut(5));
		otherPanel.add(backgroundField);
		otherPanel.add(Box.createHorizontalStrut(5));
		otherPanel.add(backgroundButton);
		otherPanel.add(Box.createHorizontalGlue());
		bigOtherPanel.add(otherPanel);

		otherPanel = new Box(BoxLayout.LINE_AXIS);
		wordWrapCheckBox = new JCheckBox(msg.getString("WordWrap"));
		wordWrapCheckBox.setActionCommand("WordWrapCheckBox");
		wordWrapCheckBox.addActionListener(this);
		otherPanel.add(wordWrapCheckBox);
		otherPanel.add(Box.createHorizontalGlue());
		bigOtherPanel.add(otherPanel);

		otherPanel = new Box(BoxLayout.LINE_AXIS);
		highlightCurrentLineCheckBox = new JCheckBox(msg.getString("HighlightCL"));
		highlightCurrentLineCheckBox.setActionCommand("HighlightCurrentLineCheckBox");
		highlightCurrentLineCheckBox.addActionListener(this);
		hclColorButton = new RColorSwatchesButton(Color.BLACK, 50,15);
		hclColorButton.addPropertyChangeListener(this);
		otherPanel.add(highlightCurrentLineCheckBox);
		otherPanel.add(hclColorButton);
		otherPanel.add(Box.createHorizontalGlue());
		bigOtherPanel.add(otherPanel);

		otherPanel = new Box(BoxLayout.LINE_AXIS);
		marginLineCheckBox = new JCheckBox(msg.getString("DrawML"));
		marginLineCheckBox.setActionCommand("MarginLineCheckBox");
		marginLineCheckBox.addActionListener(this);
		marginLinePositionField = new JTextField();
		marginLinePositionField.getDocument().addDocumentListener(this);
		size = new Dimension(40,marginLinePositionField.getPreferredSize().height);
		marginLinePositionField.setMaximumSize(size);
		marginLinePositionField.setPreferredSize(size);
		marginLineColorLabel = new JLabel(msg.getString("WithThisColor"));
		marginLineColorButton = new RColorSwatchesButton(Color.BLACK, 50,15);
		marginLineColorButton.addPropertyChangeListener(this);
		marginLineColorLabel.setLabelFor(marginLineColorButton);
		otherPanel.add(marginLineCheckBox);
		otherPanel.add(marginLinePositionField);
		otherPanel.add(Box.createHorizontalStrut(5));
		otherPanel.add(marginLineColorLabel);
		otherPanel.add(marginLineColorButton);
		otherPanel.add(Box.createHorizontalGlue());
		bigOtherPanel.add(otherPanel);

		bigOtherPanel.add(Box.createVerticalStrut(5));

		topPanel.add(bigOtherPanel);

		JPanel rdPanel = new JPanel();
		rdPanel.setLayout(new BoxLayout(rdPanel, BoxLayout.LINE_AXIS));
		restoreDefaultsButton = new RButton(msg.getString("RestoreDefaults"));
		restoreDefaultsButton.setActionCommand("RestoreDefaults");
		restoreDefaultsButton.addActionListener(this);
		rdPanel.add(restoreDefaultsButton);
		rdPanel.add(Box.createHorizontalGlue());
		topPanel.add(rdPanel);

		add(topPanel, BorderLayout.NORTH);
		applyComponentOrientation(orientation);

		msg = null;

	}


	/**
	 * Listens for actions in this panel.
	 */
	public void actionPerformed(ActionEvent e) {

		String command = e.getActionCommand();

		if (command.equals("RestoreDefaults")) {

			Color defaultCurrentLineHighlightColor = RTextArea.getDefaultCurrentLineHighlightColor();
			int defaultTabSize = RTextArea.getDefaultTabSize();
			int defaultMarginLinePosition = RTextArea.getDefaultMarginLinePosition();
			Color defaultMarginLineColor = RTextArea.getDefaultMarginLineColor();
			Font defaultFont = RTextArea.getDefaultFont();
			Color defaultForeground = RTextArea.getDefaultForeground();

			if ( !Color.WHITE.equals(background) ||
				wordWrapCheckBox.isSelected() ||
				!highlightCurrentLineCheckBox.isSelected() ||
				!getCurrentLineHighlightColor().equals(defaultCurrentLineHighlightColor) ||
				getTabSize()!=defaultTabSize ||
				getEmulateTabs()==true ||
				!linkCB.isSelected() ||
				modKeyCombo.getSelectedIndex()!=0 ||
				!linkColorButton.getColor().equals(Color.BLUE) ||
				!marginLineCheckBox.isSelected() ||
				getMarginLinePosition()!=defaultMarginLinePosition ||
				!getMarginLineColor().equals(defaultMarginLineColor) ||
				!getTextAreaFont().equals(defaultFont) ||
				getUnderline()==true ||
				!getTextAreaForeground().equals(defaultForeground))
			{
				setBackgroundObject(Color.WHITE);
				wordWrapCheckBox.setSelected(false);
				highlightCurrentLineCheckBox.setSelected(true);
				hclColorButton.setEnabled(true);
				setCurrentLineHighlightColor(defaultCurrentLineHighlightColor);
				setTabSize(defaultTabSize);
				setEmulateTabs(false);
				linkCB.setSelected(true);
				modKeyCombo.setSelectedIndex(0);
				linkColorButton.setColor(Color.BLUE);
				setMarginLineEnabled(true);
				setMarginLinePosition(defaultMarginLinePosition);
				setMarginLineColor(defaultMarginLineColor);
				setTextAreaFont(defaultFont, false);
				setTextAreaForeground(defaultForeground);
				setHyperlinksEnabled(true);
				hasUnsavedChanges = true;
				firePropertyChange(PROPERTY, null, null);
			}

		}

		else if (command.equals("BackgroundButton")) {
			if (backgroundDialog==null) {
				backgroundDialog = new BackgroundDialog(getOptionsDialog());
			}
			backgroundDialog.initializeData(background, bgImageFileName);
			backgroundDialog.setVisible(true);
			Object newBG = backgroundDialog.getChosenBackground();
			// Non-null newBG means user hit OK, not Cancel.
			if (newBG!=null && !newBG.equals(background)) {
				Object oldBG = background;
				setBackgroundObject(newBG);
				setBackgroundImageFileName(backgroundDialog.
										getCurrentImageFileName());
				hasUnsavedChanges = true;
				firePropertyChange(PROPERTY, oldBG, newBG);
			}
		}

		else if (command.equals("WordWrapCheckBox")) {
			boolean ww = wordWrapCheckBox.isSelected();
			hasUnsavedChanges = true;
			firePropertyChange(PROPERTY, !ww, ww);
		}
	
		else if (command.equals("HighlightCurrentLineCheckBox")) {
			boolean selected = highlightCurrentLineCheckBox.isSelected();
			hclColorButton.setEnabled(selected);
			hasUnsavedChanges = true;
			firePropertyChange(PROPERTY, !selected, selected);
		}

		else if (command.equals("EmulateTabsCheckBox")) {
			boolean selected = emulateTabsCheckBox.isSelected();
			hasUnsavedChanges = true;
			firePropertyChange(PROPERTY, !selected, selected);
		}

		else if (command.equals("MarginLineCheckBox")) {
			boolean selected = marginLineCheckBox.isSelected();
			marginLinePositionField.setEnabled(selected);
			marginLineColorButton.setEnabled(selected);
			hasUnsavedChanges = true;
			firePropertyChange(PROPERTY, !selected, selected);
		}

		else if (command.equals("MakeLinksClickable")) {
			boolean selected = linkCB.isSelected();
			modKeyLabel.setEnabled(selected);
			modKeyCombo.setEnabled(selected);
			linkColorLabel.setEnabled(selected);
			linkColorButton.setEnabled(selected);
			hasUnsavedChanges = true;
			firePropertyChange(PROPERTY, !selected, selected);
		}

		else if (command.equals("ModKeyCombo")) {
			hasUnsavedChanges = true;
			firePropertyChange(PROPERTY, -1, modKeyCombo.getSelectedIndex());
		}

	}


	/**
	 * This doesn't get called but is here because this class implements
	 * DocumentListener.
	 */
	public void changedUpdate(DocumentEvent e) {
	}


	private JComboBox createModKeyCombo() {
		Integer[] items = new Integer[] {
			new Integer(InputEvent.CTRL_DOWN_MASK),
			new Integer(InputEvent.META_DOWN_MASK),
			new Integer(InputEvent.SHIFT_DOWN_MASK),
			new Integer(InputEvent.ALT_DOWN_MASK),
		};
		JComboBox combo = new JComboBox(items);
		combo.setRenderer(new ModKeyCellRenderer());
		combo.setActionCommand("ModKeyCombo");
		combo.addActionListener(this);
		return combo;
	}


	/**
	 * Applies the settings entered into this dialog on the specified
	 * application.
	 *
	 * @param owner The application.
	 */
	protected void doApplyImpl(Frame owner) {

		RText rtext = (RText)owner;
		AbstractMainView mainView = rtext.getMainView();

		mainView.setTextAreaForeground(getTextAreaForeground());
		mainView.setTextAreaFont(getTextAreaFont(), getUnderline());
		mainView.setBackgroundObject(getBackgroundObject());
		mainView.setBackgroundImageFileName(getBackgroundImageFileName());
		mainView.setLineWrap(getWordWrap());
		rtext.setRowColumnIndicatorVisible(!mainView.getLineWrap());
		if (isCurrentLineHighlightCheckboxSelected()==true) {
			mainView.setCurrentLineHighlightEnabled(true);
			mainView.setCurrentLineHighlightColor(getCurrentLineHighlightColor());
		}
		else {
			mainView.setCurrentLineHighlightEnabled(false);
		}
		mainView.setTabSize(getTabSize());				// Doesn't update if unnecessary.
		mainView.setTabsEmulated(getEmulateTabs());		// Doesn't update if unnecessary.
		mainView.setMarginLineEnabled(isMarginLineEnabled());	// Doesn't update if unnecessary.
		mainView.setMarginLinePosition(getMarginLinePosition()); // Doesn't update if unnecessary.
		mainView.setMarginLineColor(getMarginLineColor());	// Doesn't update if unnecessary.
		mainView.setHyperlinksEnabled(getHyperlinksEnabled()); // Doesn't update if unnecessary.
		mainView.setHyperlinkColor(getHyperlinkColor()); // Doesn't update if unnecessary.
		mainView.setHyperlinkModifierKey(getHyperlinkModifierKey()); // Doesn't update if unnecessary.

	}


	/**
	 * Called when a text field in this panel gets updated.
	 */
	private void doDocumentUpdated(DocumentEvent e) {

		hasUnsavedChanges = true;

		Document modifiedDocument = e.getDocument();

		if (modifiedDocument==tabSizeField.getDocument()) {
			firePropertyChange(PROPERTY, null, tabSizeField.getText());
		}
		else if (modifiedDocument==marginLinePositionField.getDocument()) {
			firePropertyChange(PROPERTY,
							null, marginLinePositionField.getText());
		}
			
	}


	/**
	 * {@inheritDoc}
	 */
	protected OptionsPanelCheckResult ensureValidInputsImpl() {

		// Ensure the tab size specified is valid.
		int temp = 0;
		try {
			temp = Integer.parseInt(tabSizeField.getText());
			if (temp<0) throw new NumberFormatException();
		} catch (NumberFormatException nfe) {
			OptionsPanelCheckResult res = new OptionsPanelCheckResult(this);
			res.errorMessage = "Invalid number format for tab size;\nPlease input a tab size greater than zero.";
			res.component = tabSizeField;
			// Hack; without this, tabSize is still valid, so if they hit Cancel
			// then brought the Options dialog back up, the invalid text would
			// still be there.
			tabSize = -1;
			return res;
		}
		tabSize = temp;	// Store the value the user will get.

		// Ensure the margin line position specified is valid.
		try {
			temp = Integer.parseInt(marginLinePositionField.getText());
			if (temp<0) throw new NumberFormatException();
		} catch (NumberFormatException nfe) {
			OptionsPanelCheckResult res = new OptionsPanelCheckResult(this);
			res.errorMessage = "Invalid margin line position;\nPlease input a position greater than zero.";
			res.component = marginLinePositionField;
			// Hack; without this, marginLinePosition is still valid, so if
			// they hig Cancel then brought the Options dialog back up, the
			// invalid text would still be there.
			marginLinePosition = -1;
			return res;
		}
		marginLinePosition = temp;	// Store the value the user will get.

		// If that went okay then the entire panel is okay.
		return null;

	}


	/**
	 * Returns the name of the file containing the chosen background image.
	 * If the user selected a color for the background, this method returns
	 * null.
	 *
	 * @return The name of the file containing the chosen background image.
	 * @see #getBackgroundObject()
	 */
	public String getBackgroundImageFileName() {
		return bgImageFileName;
	}


	/**
	 * Returns the background object (a color or an image) selected by the
	 * user.
	 *
	 * @return The background object.
	 * @see #getBackgroundImageFileName()
	 */
	public Object getBackgroundObject() {
		return background;
	}


	/**
	 * Returns the current line highlight color chosen by the user.
	 *
	 * @return The color.
	 */
	public Color getCurrentLineHighlightColor() {
		return hclColorButton.getColor();
	}


	/**
	 * Returns whether or not the user decided to emulate tabs.
	 *
	 * @return true iff the "emulate tabs with whitespace"
	 *         checkbox was checked.
	 */
	public boolean getEmulateTabs() {
		return emulateTabsCheckBox.isSelected();
	}


	/**
	 * Returns the color this dialog shows to use for hyperlinks.
	 *
	 * @return The color displayed to use.
	 */
	private Color getHyperlinkColor() {
		return linkColorButton.getColor();
	}


	/**
	 * Returns the modifier key this dialog shows for hyperlinks.
	 *
	 * @return The modifier key(s).
	 * @see java.awt.event.InputEvent
	 */
	private int getHyperlinkModifierKey() {
		switch (modKeyCombo.getSelectedIndex()) {
			default:
			case 0:
				return InputEvent.CTRL_DOWN_MASK;
			case 1:
				return InputEvent.META_DOWN_MASK;
			case 2:
				return InputEvent.SHIFT_DOWN_MASK;
			case 3:
				return InputEvent.ALT_DOWN_MASK;
		}
	}


	/**
	 * Returns whether the user decided to enable hyperlinks in editors.
	 *
	 * @return Whether the user wants hyperlinks enabled.
	 */
	public boolean getHyperlinksEnabled() {
		return linkCB.isSelected();
	}


	/**
	 * Returns the color the user chose for the margin line.
	 *
	 * @return The color the user chose.
	 */
	public Color getMarginLineColor() {
		return marginLineColorButton.getColor();
	}


	/**
	 * Returns the margin line position text on this panel.
	 *
	 * @return The text in the "margin line position" text field.
	 */
	public int getMarginLinePosition() {
		return marginLinePosition;
	}


	/**
	 * Returns the tab size selected by the user.
	 *
	 * @return The tab size selected by the user.
	 */
	public int getTabSize() {
		return tabSize;
	}


	/**
	 * Returns the font to use in text areas.
	 *
	 * @return The font to use.
	 */
	public Font getTextAreaFont() {
		return fontSelector.getDisplayedFont();
	}


	/**
	 * Returns the text area's foreground color.
	 *
	 * @return The foreground color of the text area.
	 */
	public Color getTextAreaForeground() {
		return fontSelector.getFontColor();
	}


	/**
	 * Returns the JComponent at the "top" of this Options
	 * panel.  This is the component that will receive focus if the user
	 * switches to this Options panel in the Options dialog.  As an added
	 * bonus, if this component is a JTextComponent, its
	 * text is selected for easy changing.
	 */
	public JComponent getTopJComponent() {
		return tabSizeField;
	}


	/**
	 * Returns whether the text area's font should be underlined.
	 *
	 * @return Whether the text areas should underline their font.
	 * @see #getFont()
	 */
	public boolean getUnderline() {
		return fontSelector.getUnderline();
	}


	/**
	 * Returns whether the user selected word wrap.
	 *
	 * @return Whether or not the word wrap checkbox is checked.
	 */
	public boolean getWordWrap() {
		return wordWrapCheckBox.isSelected();
	}


	/**
	 * Called when a text field in this panel gets updated.
	 */
	public void insertUpdate(DocumentEvent e) {
		doDocumentUpdated(e);
	}


	/**
	 * Returns whether or not the current line highlight color checkbox is
	 * selected.
	 *
	 * @return Whether or not the checkbox is selected.
	 */
	public boolean isCurrentLineHighlightCheckboxSelected() {
		return highlightCurrentLineCheckBox.isSelected();
	}


	/**
	 * Returns whether or not the margin line stuff is enabled (i.e.,
	 * whether or not the "Margin line" checkbox is checked).
	 *
	 * @return Whether or not the margin line options are enabled.
	 */
	public boolean isMarginLineEnabled() {
		return marginLineCheckBox.isSelected();
	}


	/**
	 * Called when a property changes in an object we're listening to.
	 */
	public void propertyChange(PropertyChangeEvent e) {
		// We need to forward this on to the options dialog, whatever
		// it is, so that the "Apply" button gets updated.
		hasUnsavedChanges = true;
		firePropertyChange(PROPERTY, e.getOldValue(), e.getNewValue());
	}


	/**
	 * Called when a text field in this panel gets updated.
	 */
	public void removeUpdate(DocumentEvent e) {
		doDocumentUpdated(e);
	}


	/**
	 * Sets the name of the file containing the background image.  If the
	 * initial background object is a color, you should pass null
	 * to this method.
	 *
	 * @param name The name of the file containing the background image.
	 * @see #getBackgroundImageFileName
	 * @see #setBackgroundObject
	 */
	private void setBackgroundImageFileName(String name) {
		bgImageFileName = name;
		if (bgImageFileName!=null)
			backgroundField.setText(bgImageFileName);
	}


	/**
	 * Sets the background object displayed in this options panel.
	 *
	 * @param background The background object.
	 * @see #getBackgroundObject
	 */
	private void setBackgroundObject(Object background) {
		if (background instanceof Color) {
			String s = background.toString();
			backgroundField.setText(s.substring(s.indexOf('[')));
		}
		else if (background instanceof Image) {
			// backgroundField taken care of by setBackgroundImageFileName.
		}
		else {
			throw new IllegalArgumentException("Background must be either " +
				"a Color or an Image");
		}
		this.background = background;
	}


	/**
	 * Sets the current line highlight color displayed by this dialog.
	 *
	 * @param color The color to display for the current line highlight color.
	 *        If this parameter is null, Color.BLACK
	 *        is used (??).
	 * @see #getCurrentLineHighlightColor
	 */
	private void setCurrentLineHighlightColor(Color color) {
		hclColorButton.setColor(color);
	}


	/**
	 * Sets whether or not the current line highlight color checkbox is
	 * selected.
	 *
	 * @param selected Whether or not the checkbox is selected.
	 * @see #isCurrentLineHighlightCheckboxSelected
	 */
	private void setCurrentLineHighlightCheckboxSelected(boolean selected) {
		highlightCurrentLineCheckBox.setSelected(selected);
		hclColorButton.setEnabled(selected);
	}


	/**
	 * Sets the status of the "emulate tabs with whitespace" check box.
	 *
	 * @param areEmulated Whether or not the check box is checked.
	 */
	private void setEmulateTabs(boolean areEmulated) {
		emulateTabsCheckBox.setSelected(areEmulated);
	}


	/**
	 * Sets the color this dialog displays for hyperlinks.
	 *
	 * @param c The color to display.  This cannot be null.
	 */
	private void setHyperlinkColor(Color c) {
		linkColorButton.setColor(c);
	}


	/**
	 * Sets the modifier key this dialog shows for hyperlinks.
	 *
	 * @param key The modifier key(s).
	 * @see java.awt.event.InputEvent
	 */
	private void setHyperlinkModifierKey(int key) {
		switch (key) {
			default:
			case InputEvent.CTRL_DOWN_MASK:
				modKeyCombo.setSelectedIndex(0);
				break;
			case InputEvent.META_DOWN_MASK:
				modKeyCombo.setSelectedIndex(1);
				break;
			case InputEvent.SHIFT_DOWN_MASK:
				modKeyCombo.setSelectedIndex(2);
				break;
			case InputEvent.ALT_DOWN_MASK:
				modKeyCombo.setSelectedIndex(3);
				break;
		}
	}


	/**
	 * Sets the status of the "Enable hyperlinks" checkbox.
	 *
	 * @param clickable Whether the checkbox is selected.
	 */
	private void setHyperlinksEnabled(boolean enabled) {
		linkCB.setSelected(enabled);
		modKeyLabel.setEnabled(enabled);
		modKeyCombo.setEnabled(enabled);
		linkColorLabel.setEnabled(enabled);
		linkColorButton.setEnabled(enabled);
	}


	/**
	 * Sets the margin line color displayed by this dialog.
	 *
	 * @param color The color to display for the margin line color.
	 * @see #getMarginLineColor
	 */
	private void setMarginLineColor(Color color) {
		marginLineColorButton.setColor(color);
	}


	/**
	 * Sets whether or not the margin line stuff is enabled (i.e.,
	 * whether or not the "Margin line" checkbox is checked).
	 *
	 * @param enabled Whether or not the margin line options should be
	 *        enabled.
	 * @see #isMarginLineEnabled
	 */
	private void setMarginLineEnabled(boolean enabled) {
		marginLineCheckBox.setSelected(enabled);
		marginLinePositionField.setEnabled(enabled);
		marginLineColorButton.setEnabled(enabled);
	}


	/**
	 * Returns the margin line position currently being displayed.
	 *
	 * @param position The margin line position to display.
	 * @see #getMarginLinePosition
	 */
	private void setMarginLinePosition(int position) {
		if (marginLinePosition!=position && position>0) {
			marginLinePosition = position;
		}
		// We do this not in the if-condition above because the user could
		// have typed in a bad value, then hit "Cancel" previously, and we
		// need to clear this out.
		marginLinePositionField.setText(Integer.toString(marginLinePosition));
	}


	/**
	 * Sets the tab size currently being displayed.
	 *
	 * @param tabSize The tab size to display.
	 */
	private void setTabSize(int tabSize) {
		if (this.tabSize!=tabSize && tabSize>0) {
			this.tabSize = tabSize;
		}
		// We do this not in the if-condition above because the user could
		// have typed in a bad value, then hit "Cancel" previously, and we
		// need to clear this out.
		tabSizeField.setText(Integer.toString(tabSize));
	}


	/**
	 * Sets the font/underline status to display for text areas.
	 *
	 * @param font The font.
	 * @param underline Whether the font is underlined.
	 * @see #getTextAreaFont()
	 * @see #getUnderline()
	 */
	private void setTextAreaFont(Font font, boolean underline) {
		fontSelector.setDisplayedFont(font, underline);
	}


	/**
	 * Sets the foreground color for text areas.
	 *
	 * @param fg The new foreground color.
	 * @see #getTextAreaForeground()
	 */
	private void setTextAreaForeground(Color fg) {
		fontSelector.setFontColor(fg);
	}


	/**
	 * Sets the values displayed by this panel to reflect those in the
	 * application.  Child panels are not handled.
	 *
	 * @param owner The parent application.
	 * @see #setValues(Frame)
	 */
	protected void setValuesImpl(Frame owner) {
		RText rtext = (RText)owner;
		AbstractMainView mainView = rtext.getMainView();
		setTextAreaForeground(mainView.getTextAreaForeground());
		setTextAreaFont(mainView.getTextAreaFont(), mainView.getTextAreaUnderline());
		setBackgroundObject(mainView.getBackgroundObject());
		setBackgroundImageFileName(mainView.getBackgroundImageFileName());
		setWordWrap(mainView.getLineWrap());
		setCurrentLineHighlightCheckboxSelected(mainView.isCurrentLineHighlightEnabled());
		setCurrentLineHighlightColor(mainView.getCurrentLineHighlightColor());
		setTabSize(mainView.getTabSize());
		setEmulateTabs(mainView.areTabsEmulated());
		setMarginLineEnabled(mainView.isMarginLineEnabled());
		setMarginLinePosition(mainView.getMarginLinePosition());
		setMarginLineColor(mainView.getMarginLineColor());
		setHyperlinksEnabled(mainView.getHyperlinksEnabled());
		setHyperlinkColor(mainView.getHyperlinkColor());
		setHyperlinkModifierKey(mainView.getHyperlinkModifierKey());
	}


	/**
	 * Sets whether the word wrap checkbox is checked.
	 *
	 * @param enabled Whether or not to check the word wrap checkbox.
	 * @see #getWordWrap
	 */
	private void setWordWrap(boolean enabled) {
		wordWrapCheckBox.setSelected(enabled);
	}


	/**
	 * Overridden to ensure the background dialog is updated as well.
	 */
	public void updateUI() {
		super.updateUI();
		if (backgroundDialog!=null) {
			SwingUtilities.updateComponentTreeUI(backgroundDialog); // Updates dialog.
			backgroundDialog.updateUI(); // Updates image file chooser.
		}
	}


	/**
	 * Renderer for a "modifier key" combo box.
	 */
	private static class ModKeyCellRenderer extends DefaultListCellRenderer {

		public Component getListCellRendererComponent(JList list,
			Object value, int index, boolean selected, boolean hasFocus) {
			super.getListCellRendererComponent(list, value, index,
										selected, hasFocus);
			int i = ((Integer)value).intValue();
			setText(InputEvent.getModifiersExText(i));
			return this;
		}

	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy