/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.preference;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.servoy.j2db.IApplication;
import com.servoy.j2db.persistence.IServer;
import com.servoy.j2db.persistence.IServerInternal;
import com.servoy.j2db.persistence.RepositoryException;
import com.servoy.j2db.persistence.Table;
import com.servoy.j2db.smart.J2DBClient;
import com.servoy.j2db.util.Debug;
import com.servoy.j2db.util.PersistHelper;
/**
* @author jcompagner
*/
public class LocalePreferences extends PreferencePanel implements ItemListener, FocusListener
{
public static final String SELECTION_NONE = "<none>"; //$NON-NLS-1$
private final IApplication _application;
private JTextField _tfDateFormat;
private JTextField _tfNumberFormat;
private JTextField _tfIntegerFormat;
private JComboBox _cbLocales;
private JComboBox _cbTimezones;
private JComboBox _cbServer;
private JComboBox _cbTable;
private String _defaultLocale;
public LocalePreferences(IApplication app)
{
super();
_application = app;
createUI();
}
private void createUI()
{
setLayout(new BorderLayout());
final Properties settings = _application.getSettings();
_tfDateFormat = new JTextField();
_tfDateFormat.setText(settings.getProperty("locale.dateformat")); //$NON-NLS-1$
_tfDateFormat.addFocusListener(this);
_tfNumberFormat = new JTextField();
_tfNumberFormat.setText(settings.getProperty("locale.numberformat")); //$NON-NLS-1$
_tfNumberFormat.addFocusListener(this);
_tfIntegerFormat = new JTextField();
_tfIntegerFormat.setText(settings.getProperty("locale.integerformat")); //$NON-NLS-1$
_tfIntegerFormat.addFocusListener(this);
JPanel panelLabels = new JPanel();
panelLabels.setLayout(new GridLayout(0, 1, J2DBClient.BUTTON_SPACING, J2DBClient.BUTTON_SPACING));
panelLabels.setBorder(BorderFactory.createEmptyBorder(J2DBClient.COMPONENT_SPACING, J2DBClient.COMPONENT_SPACING, J2DBClient.COMPONENT_SPACING,
J2DBClient.COMPONENT_SPACING));
panelLabels.add(new JLabel(_application.getI18NMessage("servoy.preference.locale.dateFormat"))); //$NON-NLS-1$
panelLabels.add(new JLabel(_application.getI18NMessage("servoy.preference.locale.numberFormat"))); //$NON-NLS-1$
panelLabels.add(new JLabel(_application.getI18NMessage("servoy.preference.locale.integerFormat"))); //$NON-NLS-1$
panelLabels.add(new JLabel(_application.getI18NMessage("servoy.preference.locale.defaultLocale"))); //$NON-NLS-1$
panelLabels.add(new JLabel(_application.getI18NMessage("servoy.preference.locale.defaultTimezone"))); //$NON-NLS-1$
JPanel panelText = new JPanel();
panelText.setLayout(new GridLayout(0, 1, J2DBClient.BUTTON_SPACING, J2DBClient.BUTTON_SPACING));
panelText.setBorder(BorderFactory.createEmptyBorder(J2DBClient.COMPONENT_SPACING, J2DBClient.COMPONENT_SPACING, J2DBClient.COMPONENT_SPACING,
J2DBClient.COMPONENT_SPACING));
panelText.add(_tfDateFormat);
panelText.add(_tfNumberFormat);
panelText.add(_tfIntegerFormat);
ArrayList al = new ArrayList();
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < locales.length; i++)
{
if (locales[i].getCountry() != null && !locales[i].getCountry().equals("")) //$NON-NLS-1$
{
al.add(locales[i]);
}
}
locales = new Locale[al.size()];
locales = (Locale[])al.toArray(locales);
Arrays.sort(locales, new LocaleSorter());
_cbLocales = new JComboBox(locales);
_defaultLocale = new String(_application.getI18NMessage("servoy.i18nPanel.default"));
_cbLocales.insertItemAt(_defaultLocale, 0);
_cbLocales.setRenderer(new LocaleRenderer());
String locale = settings.getProperty("locale.default"); //$NON-NLS-1$
if (locale == null)
{
_cbLocales.setSelectedItem(_defaultLocale);
}
else
{
_cbLocales.setSelectedItem(Locale.getDefault());
}
_cbLocales.addItemListener(this);
panelText.add(_cbLocales);
String[] timeZones = TimeZone.getAvailableIDs();
Arrays.sort(timeZones);
_cbTimezones = new JComboBox(timeZones);
panelText.add(_cbTimezones);
_cbTimezones.setSelectedItem(TimeZone.getDefault().getID());
_cbTimezones.addItemListener(this);
JPanel holder = new JPanel();
holder.setLayout(new BorderLayout());
holder.add(panelLabels, BorderLayout.WEST);
holder.add(panelText, BorderLayout.CENTER);
this.add(holder, BorderLayout.NORTH);
}
private ChangeListener listener;
@Override
public void addChangeListener(ChangeListener l)
{
listener = l;
}
private void fireChangeEvent()
{
changed = true;
listener.stateChanged(new ChangeEvent(this));
}
private boolean changed = false;
public void itemStateChanged(ItemEvent e)
{
if (e.getSource() == _cbServer)
{
if (e.getStateChange() == ItemEvent.SELECTED)
{
try
{
String serverName = (String)_cbServer.getSelectedItem();
fillTableCombo(SELECTION_NONE.equals(serverName) ? null : _application.getRepository().getServer(serverName));
_cbTable.setSelectedItem(SELECTION_NONE);
}
catch (Exception e1)
{
Debug.error(e1);
}
}
}
fireChangeEvent();
}
// @Override
// public void setVisible(boolean v)
// {
// super.setVisible(v);
// try
// {
// if (_application.isInDeveloper() && v && _cbTable != null && _cbTable.getModel().getSize() <= 1)
// {
// Object selected = _cbTable.getSelectedItem();
// String serverName = (String)_cbServer.getSelectedItem();
// fillTableCombo(SELECTION_NONE.equals(serverName) ? null : _application.getRepository().getServer(serverName));
// _cbTable.setSelectedItem(selected);
// }
// }
// catch (Exception e1)
// {
// Debug.error(e1);
// }
// }
/**
* @param server
* @throws RepositoryException
* @throws RemoteException
*/
private void fillTableCombo(IServer server) throws RepositoryException, RemoteException
{
if (server == null)
{
_cbTable.setModel(new DefaultComboBoxModel(new String[] { SELECTION_NONE }));
}
else
{
List al = new ArrayList();
al.add(SELECTION_NONE);
List lst = ((IServerInternal)server).getTableAndViewNames(true, true);
for (int i = 0; i < lst.size(); i++)
{
String tableName = (String)lst.get(i);
Table table = (Table)server.getTable(tableName);
if (table.getColumnInfoID("message_key") == -1) continue; //$NON-NLS-1$
if (table.getColumnInfoID("message_value") == -1) continue; //$NON-NLS-1$
if (table.getColumnInfoID("message_language") == -1) continue; //$NON-NLS-1$
al.add(tableName);
}
DefaultComboBoxModel model = new DefaultComboBoxModel(al.toArray());
_cbTable.setModel(model);
}
}
public void focusGained(FocusEvent e)
{
fireChangeEvent();
}
public void focusLost(FocusEvent e)
{
}
@Override
public int getRequiredUserAction()
{
int retval = PreferencePanel.NO_USER_ACTION_REQUIRED;
if (changed)
{
retval = PreferencePanel.APPLICATION_RESTART_NEEDED;
}
changed = false;
return retval;
}
/**
* @see com.servoy.j2db.preference.PreferencePanel#cancel()
*/
@Override
public boolean handleCancel()
{
Properties settings = _application.getSettings();
_tfDateFormat.setText(settings.getProperty("locale.dateformat")); //$NON-NLS-1$
_tfNumberFormat.setText(settings.getProperty("locale.numberformat")); //$NON-NLS-1$
_tfIntegerFormat.setText(settings.getProperty("locale.integerformat")); //$NON-NLS-1$
// if(_application.getApplicationType() == IApplication.DEVELOPER)
String locale = settings.getProperty("locale.default"); //$NON-NLS-1$
if (locale == null)
{
_cbLocales.setSelectedItem(_defaultLocale);
}
else
{
_cbLocales.setSelectedItem(Locale.getDefault());
}
// if (_application.isInDeveloper())
// {
// String serverName = settings.getProperty("defaultMessagesServer"); //$NON-NLS-1$
// String tableName = settings.getProperty("defaultMessagesTable"); //$NON-NLS-1$
//
// if (serverName == null)
// {
// _cbServer.setSelectedItem(SELECTION_NONE);
// }
// else
// {
// _cbServer.setSelectedItem(serverName);
// }
// if (tableName != null) _cbTable.setSelectedItem(tableName);
// else _cbTable.setSelectedItem(SELECTION_NONE);
// }
return true;
}
/**
* @see com.servoy.j2db.preference.PreferencePanel#ok()
*/
@Override
public boolean handleOK()
{
Properties settings = _application.getSettings();
String dateFormat = _tfDateFormat.getText();
String numberFormat = _tfNumberFormat.getText();
String integerFormat = _tfIntegerFormat.getText();
if (dateFormat == null || dateFormat.trim().length() == 0)
{
settings.remove("locale.dateformat"); //$NON-NLS-1$
}
else
{
settings.setProperty("locale.dateformat", dateFormat); //$NON-NLS-1$
}
if (numberFormat == null || numberFormat.trim().length() == 0)
{
settings.remove("locale.numberformat"); //$NON-NLS-1$
}
else
{
settings.setProperty("locale.numberformat", numberFormat); //$NON-NLS-1$
}
if (integerFormat == null || integerFormat.trim().length() == 0)
{
settings.remove("locale.integerformat"); //$NON-NLS-1$
}
else
{
settings.setProperty("locale.integerformat", integerFormat); //$NON-NLS-1$
}
Locale loc = null;
Object selectedLocale = _cbLocales.getSelectedItem();
if (selectedLocale.equals(_defaultLocale))
{
settings.remove("locale.default");//$NON-NLS-1$
loc = Locale.getDefault();
}
else
{
loc = (Locale)selectedLocale;
settings.setProperty("locale.default", PersistHelper.createLocaleString(loc)); //$NON-NLS-1$
}
_application.setLocale(loc);
String timezone = (String)_cbTimezones.getSelectedItem();
TimeZone.setDefault(TimeZone.getTimeZone(timezone));
settings.setProperty("timezone.default", timezone); //$NON-NLS-1$
// if (_application.isInDeveloper())
// {
// String serverName = ""; //$NON-NLS-1$
// String tableName = (String)_cbTable.getSelectedItem();
// if (tableName == null || SELECTION_NONE.equals(tableName))
// {
// tableName = ""; //$NON-NLS-1$
// }
//
// String selectedServerName = (String)_cbServer.getSelectedItem();
// if (!SELECTION_NONE.equals(selectedServerName) && selectedServerName != null)
// {
// serverName = selectedServerName;
// }
// settings.setProperty("defaultMessagesServer", serverName); //$NON-NLS-1$
// if (!Utils.equalObjects(settings.getProperty("defaultMessagesTable"), tableName)) //$NON-NLS-1$
// {
// settings.setProperty("defaultMessagesTable", tableName); //$NON-NLS-1$
// if (_application instanceof IMessagesCallback)
// {
// Messages.load((IMessagesCallback)_application);
// }
// }
// }
return true;
}
/**
* @see com.servoy.j2db.preference.PreferencePanel#getTabName()
*/
@Override
public String getTabName()
{
return _application.getI18NMessage("servoy.preference.locale.tabName"); //$NON-NLS-1$
}
private class LocaleRenderer extends DefaultListCellRenderer
{
/**
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
String localeName = "";
if (value != null && value instanceof String)
{
localeName = value.toString();
}
else
{
localeName = (value == null) ? " " : ((Locale)value).getDisplayName(((Locale)value)); //$NON-NLS-1$
}
return super.getListCellRendererComponent(list, localeName, index, isSelected, cellHasFocus);
}
}
private class LocaleSorter implements Comparator
{
public int compare(Object o1, Object o2)
{
String name1 = ((Locale)o1).getDisplayName((Locale)o1);
String name2 = ((Locale)o2).getDisplayName((Locale)o2);
return name1.compareToIgnoreCase(name2);
}
}
}