📄 encodingcomboboxmodel.java
字号:
/**
* ========================================
* JFreeReport : a free Java report library
* ========================================
*
* Project Info: http://www.jfree.org/jfreereport/index.html
* Project Lead: Thomas Morgner;
*
* (C) Copyright 2000-2003, by Simba Management Limited and Contributors.
*
* This library is free software; you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Foundation;
* either version 2.1 of the License, or (at your option) any later version.
*
* This library 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*
* --------------------------
* EncodingComboBoxModel.java
* --------------------------
* (C)opyright 2003, by Thomas Morgner and Contributors.
*
* Original Author: Thomas Morgner;
* Contributor(s): David Gilbert (for Simba Management Limited);
*
* $Id: EncodingComboBoxModel.java,v 1.22.2.2 2003/08/24 14:18:11 taqua Exp $
*
* Changes
* --------
* 25-Feb-2003 : Added standard header and Javadocs (DG);
*
*/
package com.jrefinery.report.preview;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Properties;
import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import com.jrefinery.report.util.EncodingSupport;
import com.jrefinery.report.util.Log;
import com.jrefinery.report.util.ReportConfiguration;
/**
* A model for the 'encoding' combo box.
* <p>
* This model is used in the {@link CSVExportDialog} class (and possibly others).
*
* @author Thomas Morgner.
*/
public class EncodingComboBoxModel implements ComboBoxModel
{
/** A default description. */
private static final String ENCODING_DEFAULT_DESCRIPTION = "[no description]";
/**
* An encoding comparator.
*/
private static class EncodingCarrierComparator implements Comparator
{
/**
* Compares its two arguments for order. Returns a negative integer,
* zero, or a positive integer as the first argument is less than, equal
* to, or greater than the second.
*
* @param o1 the first object to be compared.
* @param o2 the second object to be compared.
*
* @return a negative integer, zero, or a positive integer as the
* first argument is less than, equal to, or greater than the
* second.
*
* @throws ClassCastException if the arguments' types prevent them from
* being compared by this Comparator.
*/
public int compare(final Object o1, final Object o2)
{
final EncodingCarrier e1 = (EncodingCarrier) o1;
final EncodingCarrier e2 = (EncodingCarrier) o2;
return e1.getName().toLowerCase().compareTo(e2.getName().toLowerCase());
}
/**
* Returns <code>true</code> if this object is equal to <code>o</code>, and <code>false</code>
* otherwise.
*
* @param o the object.
*
* @return A boolean.
*/
public boolean equals(final Object o)
{
if (o == null)
{
return false;
}
return getClass().equals(o.getClass());
}
/**
* All comparators of this type are equal.
*
* @return A hash code.
*/
public int hashCode()
{
return getClass().hashCode();
}
}
/**
* An encoding carrier.
*/
private static class EncodingCarrier
{
/** The encoding name. */
private String name;
/** The encoding description. */
private String description;
/** The display name. */
private String displayName;
/**
* Creates a new encoding.
*
* @param name the name (<code>null</code> not permitted).
* @param description the description.
*/
public EncodingCarrier(final String name, final String description)
{
if (name == null)
{
throw new NullPointerException();
}
this.name = name;
this.description = description;
final StringBuffer dName = new StringBuffer();
dName.append(name);
dName.append(" (");
dName.append(description);
dName.append(")");
this.displayName = dName.toString();
}
/**
* Returns the name.
*
* @return The name.
*/
public String getName()
{
return name;
}
/**
* Returns the description.
*
* @return The description.
*/
public String getDescription()
{
return description;
}
/**
* Returns the display name (the regular name followed by the description in brackets).
*
* @return The display name.
*/
public String getDisplayName()
{
return displayName;
}
/**
* Returns <code>true</code> if the objects are equal, and <code>false</code> otherwise.
*
* @param o the object.
*
* @return A boolean.
*/
public boolean equals(final Object o)
{
if (this == o)
{
return true;
}
if (!(o instanceof EncodingCarrier))
{
return false;
}
final EncodingCarrier carrier = (EncodingCarrier) o;
if (!name.equalsIgnoreCase(carrier.name))
{
return false;
}
return true;
}
/**
* Returns a hash code.
*
* @return The hash code.
*/
public int hashCode()
{
return name.hashCode();
}
}
/** Contains the known default encodings. */
private static Properties defaultEncodings;
/** Storage for the encodings. */
private ArrayList encodings;
/** Storage for registered listeners. */
private ArrayList listDataListeners;
/** The selected index. */
private int selectedIndex;
/** The selected object. */
private Object selectedObject;
/**
* Creates a new model.
*/
public EncodingComboBoxModel()
{
encodings = new ArrayList();
listDataListeners = null;
selectedIndex = -1;
}
/**
* Adds an encoding.
*
* @param name the name.
* @param description the description.
*
* @return <code>true</code> if the encoding is valid and added to the model, <code>false</code>
* otherwise.
*/
public boolean addEncoding(final String name, final String description)
{
if (EncodingSupport.isSupportedEncoding(name))
{
encodings.add(new EncodingCarrier(name, description));
}
else
{
return false;
}
fireContentsChanged();
return true;
}
/**
* Adds an encoding to the model without checking its validity.
*
* @param name the name.
* @param description the description.
*/
public void addEncodingUnchecked(final String name, final String description)
{
encodings.add(new EncodingCarrier(name, description));
fireContentsChanged();
}
/**
* Make sure, that this encoding is defined and selectable in the combobox model.
*
* @param encoding the encoding that should be verified.
*/
public void ensureEncodingAvailable(final String encoding)
{
final String desc = getDefaultEncodings().getProperty(encoding, ENCODING_DEFAULT_DESCRIPTION);
final EncodingCarrier ec = new EncodingCarrier(encoding, desc);
if (encodings.contains(ec) == false)
{
encodings.add(ec);
fireContentsChanged();
}
}
/**
* Sorts the encodings.
*/
public void sort()
{
Collections.sort(encodings, new EncodingCarrierComparator());
fireContentsChanged();
}
/**
* Notifies all registered listeners that the content of the model has changed.
*/
protected void fireContentsChanged()
{
if (listDataListeners == null)
{
return;
}
final ListDataEvent evt = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, getSize());
for (int i = 0; i < listDataListeners.size(); i++)
{
final ListDataListener l = (ListDataListener) listDataListeners.get(i);
l.contentsChanged(evt);
}
}
/**
* Set the selected item. The implementation of this method should notify
* all registered <code>ListDataListener</code>s that the contents
* have changed.
*
* @param anItem the list object to select or <code>null</code>
* to clear the selection
*/
public void setSelectedItem(final Object anItem)
{
selectedObject = anItem;
if (anItem != null)
{
if (anItem != null && anItem instanceof String)
{
final int size = getSize();
for (int i = 0; i < size; i++)
{
if (anItem.equals(getElementAt(i)))
{
selectedIndex = i;
return;
}
}
}
}
selectedIndex = -1;
}
/**
* Returns the selected index.
*
* @return The index.
*/
public int getSelectedIndex()
{
return selectedIndex;
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -