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

org.fife.ui.rsyntaxtextarea.TextFilePropertiesDialog Maven / Gradle / Ivy

/*
 * 12/08/2004
 *
 * TextFilePropertiesDialog.java - Dialog allowing you to view/edit a
 * text file's properties.
 * Copyright (C) 2004 Robert Futrell
 * robert_futrell at users.sourceforge.net
 * http://fifesoft.com
 *
 * This program 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.
 *
 * This program 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.rsyntaxtextarea;

import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.nio.charset.Charset;
import java.text.BreakIterator;
import java.text.CharacterIterator;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Segment;

import org.fife.ui.EscapableDialog;
import org.fife.ui.RButton;
import org.fife.ui.ResizableFrameContentPane;
import org.fife.ui.SpecialValueComboBox;
import org.fife.ui.UIUtil;


/**
 * A dialog that displays the properties of an individual text file being
 * edited by a {@link org.fife.ui.rsyntaxtextarea.TextEditorPane}.  Some
 * properties can be modified directly from this dialog.
 *
 * @author Robert Futrell
 * @version 0.1
 */
public class TextFilePropertiesDialog extends EscapableDialog
								implements ActionListener {

	private static final long serialVersionUID = 1L;

	public static final String TERM_CR		= "\r";
	public static final String TERM_LF		= "\n";
	public static final String TERM_CRLF	= "\r\n";
	public static final String TERM_SYSTEM	= System.getProperty("line.separator");

	private JLabel wordsCountLabel;
	private SpecialValueComboBox terminatorCombo;
	private JComboBox encodingCombo;

	private RButton okButton;

	private TextEditorPane textArea;


	/**
	 * Constructor.
	 *
	 * @param parent The main application window.
	 * @param textArea The text area on which to report.
	 */
	public TextFilePropertiesDialog(Frame parent, TextEditorPane textArea) {

		super(parent);
		this.textArea = textArea;

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

		ResourceBundle msg = ResourceBundle.getBundle(
						"org.fife.ui.rsyntaxtextarea.TextFilePropertiesDialog");

		setTitle(msg.getString("Title") + textArea.getFileName());

		JPanel contentPane = new ResizableFrameContentPane(new BorderLayout());
		contentPane.setBorder(UIUtil.getEmpty5Border());

		// Where we actually add our content.
		JPanel content2 = new JPanel();
		content2.setLayout(new SpringLayout());
		contentPane.add(content2, BorderLayout.NORTH);

		JLabel filePathLabel = new JLabel(msg.getString("Path"));
		JTextField filePathField = new JTextField(30);
		filePathField.setText(textArea.getFileFullPath());
		filePathField.setEditable(false);
		filePathLabel.setLabelFor(filePathField);

		JLabel linesLabel = new JLabel(msg.getString("Lines"));
		JLabel linesCountLabel = new JLabel(
								Integer.toString(textArea.getLineCount()));

		JLabel charsLabel = new JLabel(msg.getString("Characters"));
		JLabel charsCountLabel = new JLabel(
						Integer.toString(textArea.getDocument().getLength()));

		JLabel wordsLabel = new JLabel(msg.getString("Words"));
		wordsCountLabel = new JLabel(
				Integer.toString(calculateWordCount(textArea)));

		JLabel terminatorLabel = UIUtil.createLabel(msg,
							"LineTerminator", "LineTerminatorMnemonic");
		terminatorCombo = new SpecialValueComboBox();
		UIUtil.fixComboOrientation(terminatorCombo);
		terminatorCombo.addSpecialItem(msg.getString("SysDef"), TERM_SYSTEM);
		terminatorCombo.addSpecialItem(msg.getString("CR"),     TERM_CR);
		terminatorCombo.addSpecialItem(msg.getString("LF"),     TERM_LF);
		terminatorCombo.addSpecialItem(msg.getString("CRLF"),   TERM_CRLF);
		terminatorCombo.setSelectedSpecialItem((String)textArea.
											getLineSeparator());
		terminatorCombo.setActionCommand("TerminatorComboBox");
		terminatorCombo.addActionListener(this);
		terminatorLabel.setLabelFor(terminatorCombo);

		JLabel encodingLabel = UIUtil.createLabel(msg,
								"Encoding", "EncodingMnemonic");
		encodingCombo = new JComboBox();
		UIUtil.fixComboOrientation(encodingCombo);

		// Populate the combo box with all available encodings.
		Map availcs = Charset.availableCharsets();
		Set keys = availcs.keySet();
		for (Iterator i=keys.iterator(); i.hasNext(); )
			encodingCombo.addItem(i.next());
		setEncoding(textArea.getEncoding());
		encodingCombo.setActionCommand("encodingCombo");
		encodingCombo.addActionListener(this);
		encodingLabel.setLabelFor(encodingCombo);

		JLabel sizeLabel = new JLabel(msg.getString("FileSize"));
		File file = new File(textArea.getFileFullPath());
		String size = "";
		if (file.exists() && !file.isDirectory()) {
			size = Long.toString(file.length());
		}
		JLabel sizeLabel2 = new JLabel(size);
		
		long temp = textArea.getLastSaveOrLoadTime();
		String modifiedString;
		if (temp<=0) { // 0 or -1, can be either
			modifiedString = "";
		}
		else {
			Date modifiedDate = new Date(temp);
			SimpleDateFormat rob = new SimpleDateFormat("hh:mm a  EEE, MMM d, yyyy");
			modifiedString = rob.format(modifiedDate);
		}
		JLabel modifiedLabel = new JLabel(msg.getString("LastModified"));
		JLabel modified = new JLabel(modifiedString);

		if (o.isLeftToRight()) {
			content2.add(filePathLabel);     content2.add(filePathField);
			content2.add(linesLabel);        content2.add(linesCountLabel);
			content2.add(charsLabel);        content2.add(charsCountLabel);
			content2.add(wordsLabel);        content2.add(wordsCountLabel);
			content2.add(terminatorLabel);   content2.add(terminatorCombo);
			content2.add(encodingLabel);     content2.add(encodingCombo);
			content2.add(sizeLabel);         content2.add(sizeLabel2);
			content2.add(modifiedLabel);     content2.add(modified);
		}
		else {
			content2.add(filePathField);     content2.add(filePathLabel);
			content2.add(linesCountLabel);   content2.add(linesLabel);
			content2.add(charsCountLabel);   content2.add(charsLabel);
			content2.add(wordsCountLabel);   content2.add(wordsLabel);
			content2.add(terminatorCombo);   content2.add(terminatorLabel);
			content2.add(encodingCombo);     content2.add(encodingLabel);
			content2.add(sizeLabel2);        content2.add(sizeLabel);
			content2.add(modified);          content2.add(modifiedLabel);
		}

		UIUtil.makeSpringCompactGrid(content2,
									8,2,		// rows,cols,
									0,0,		// initial-x, initial-y,
									5,5);	// x-spacing, y-spacing.

		// Make a panel for OK and cancel buttons.
		JPanel bottomPanel = new JPanel();
		JPanel buttonPanel = new JPanel(new GridLayout(1,2, 5,0));
		okButton = UIUtil.createRButton(msg, "OK", "OKMnemonic");
		okButton.setActionCommand("OKButton");
		okButton.addActionListener(this);
		okButton.setEnabled(false);
		buttonPanel.add(okButton);
		RButton cancelButton = UIUtil.createRButton(msg,
									"Cancel", "CancelMnemonic");
		cancelButton.setActionCommand("CancelButton");
		cancelButton.addActionListener(this);
		buttonPanel.add(cancelButton);
		bottomPanel.add(buttonPanel);
		contentPane.add(bottomPanel, BorderLayout.SOUTH);

		setContentPane(contentPane);
		setModal(true);
		applyComponentOrientation(o);
		pack();
		setLocationRelativeTo(parent);

	}


	/**
	 * Listens for actions in this dialog.
	 *
	 * @param e The action event.
	 */
	public void actionPerformed(ActionEvent e) {

		String actionCommand = e.getActionCommand();

		if (actionCommand.equals("TerminatorComboBox")) {
			okButton.setEnabled(true);
		}

		else if (actionCommand.equals("encodingCombo")) {
			okButton.setEnabled(true);
		}

		else if (actionCommand.equals("OKButton")) {
			String terminator = terminatorCombo.getSelectedSpecialItem();
			if (terminator!=null) {
				String old = (String)textArea.getLineSeparator();
				if (!terminator.equals(old)) {
					textArea.setLineSeparator(terminator);
				}
			}
			String encoding = (String)encodingCombo.getSelectedItem();
			if (encoding!=null) {
				textArea.setEncoding(encoding);
			}
			setVisible(false);
		}

		else if (actionCommand.equals("CancelButton")) {
			escapePressed();
		}

	}


	private int calculateWordCount(TextEditorPane textArea) {

		int wordCount = 0;
		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();

		BreakIterator bi = BreakIterator.getWordInstance();
		bi.setText(new DocumentCharIterator(textArea.getDocument()));
		for (int nextBoundary=bi.first(); nextBoundary!=BreakIterator.DONE;
				nextBoundary=bi.next()) {
			// getWordInstance() returns boundaries for both words and
			// non-words (whitespace, punctuation, etc.)
			try {
				char ch = doc.charAt(nextBoundary);
				if (Character.isLetterOrDigit(ch)) {
					wordCount++;
				}
			} catch (BadLocationException ble) {
				ble.printStackTrace();
			}
		}

		return wordCount;

	}


	/**
	 * Sets the encoding selected by this dialog.
	 *
	 * @param encoding The desired encoding.  If this value is invalid or not
	 *        supported by this OS, US-ASCII is used.
	 * @see #getEncoding
	 */
	private void setEncoding(String encoding) {

		Charset cs1 = Charset.forName(encoding);

		int count = encodingCombo.getItemCount();
		for (int i=0; i=getEndIndex()) {
				return DONE;
			}
			try {
				doc.getText(index, 1, s);
				return s.first();
			} catch (BadLocationException ble) {
				return DONE;
			}
		}

		public char first() {
			index = getBeginIndex();
			return current();
		}

		public int getBeginIndex() {
			return 0;
		}

		public int getEndIndex() {
			return doc.getLength();
		}

		public int getIndex() {
			return index;
		}

		public char last() {
			index = Math.max(0, getEndIndex() - 1);
			return current();
		}

		public char next() {
			index = Math.min(index+1, getEndIndex());
			return current();
		}

		public char previous() {
			index = Math.max(index-1, getBeginIndex());
			return current();
		}

		public char setIndex(int pos) {
			if (posgetEndIndex()) {
				throw new IllegalArgumentException("Illegal index: " + index);
			}
			index = pos;
			return current();
		}
		
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy