blob: 3aa824433bda475af4862a2b6824656307a1f29e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.properties;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.util.HelpCtx;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
/**
* Customizer for locale node (<code>PropertiesLocaleNode</code>).
*
* @author Peter Zavadsky
* @see PropertiesLocaleNode
*/
public class LocaleNodeCustomizer extends JPanel {
/** Customized properties file entry which represents one properties file. */
private PropertiesFileEntry entry;
/** Creates new <code>LocaleNodeCustomizer</code>. */
public LocaleNodeCustomizer(PropertiesFileEntry entry) {
this.entry = entry;
initComponents();
initAccessibility();
Locale locale = getLocale(entry);
if(new Locale("", "").equals(locale)) { // NOI18N
changeNameButton.setEnabled(false);
nameText.setText(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("LAB_defaultLanguage"));//NOI18N
} else {
nameText.setText(locale.toString());
}
removeKeyButton.setEnabled(false);
HelpCtx.setHelpIDString(this, Util.HELP_ID_EDITLOCALE);
}
/** Updates name of the <code>entry</code>. */
private void updateName(Locale locale) {
// Don't rename to "Default" locale node or to the same one.
if (locale.equals(new Locale("", "")) || locale.equals(getLocale(entry)) ) {
return;
}
String newName = Util.assembleName(
entry.getDataObject().getPrimaryFile().getName(),
locale.toString()
);
entry.getNodeDelegate().setName(newName);
nameText.setText(locale.toString());
}
/** Utility method. Gets icon for key item in key list. */
private static Icon getKeyIcon() {
return ImageUtilities.loadImageIcon("org/netbeans/modules/properties/propertiesKey.gif", false); // NOI18N
}
/** Gets locale which represents the entry. Utility method.
* @param entry entry which <code>Locale</code> to get */
static Locale getLocale(PropertiesFileEntry entry) {
String localeSuffix = Util.getLocaleSuffix(entry);
String languageCode = Util.getLanguage(localeSuffix);
if (languageCode == null) {
return new Locale("", ""); // NOI18N
}
String countryCode = Util.getCountry(localeSuffix);
if (countryCode == null) {
return new Locale(languageCode, ""); // NOI18N
}
String variant = Util.getVariant(localeSuffix);
if (variant == null) {
return new Locale(languageCode, countryCode);
}
return new Locale(languageCode, countryCode, variant);
}
/** Retrievs keys in entry. Utility method.
* @param entry entry which keys to get */
private static String[] retrieveKeys(PropertiesFileEntry entry) {
List<String> keysList = new ArrayList<String>();
if(entry == null) {
return new String[0];
}
for (Iterator<Element.ItemElem> it = entry.getHandler().getStructure().allItems(); it.hasNext(); ) {
String key = it.next().getKey();
if (key != null && !(keysList.contains(key))) {
keysList.add(key);
}
}
String[] keys = new String[keysList.size()];
keysList.toArray(keys);
return keys;
}
private void initAccessibility() {
this.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_LocaleNodeCustomizer"));
nameText.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_LocaleName"));
addKeyButton.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_AddKey"));
changeNameButton.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_ChangeNameButton"));
removeKeyButton.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_RemoveKey"));
keyList.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_KeyList"));
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
nameLabel = new javax.swing.JLabel();
keyLabel = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
keyList = new JList(retrieveKeys(entry));
addKeyButton = new javax.swing.JButton();
removeKeyButton = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
nameText = new javax.swing.JTextField();
changeNameButton = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
nameLabel.setLabelFor(nameText);
org.openide.awt.Mnemonics.setLocalizedText(nameLabel, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("LBL_Name")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 0);
add(nameLabel, gridBagConstraints);
keyLabel.setLabelFor(keyList);
org.openide.awt.Mnemonics.setLocalizedText(keyLabel, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("LBL_Keys")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(11, 12, 0, 0);
add(keyLabel, gridBagConstraints);
keyList.setCellRenderer(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(
JList list,
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // the list and the cell have the focus
{
JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
label.setText(value.toString());
label.setIcon(getKeyIcon());
return label;
}
});
keyList.setPrototypeCellValue("0123456789012345678901234567890123456789");
keyList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
keyListValueChanged(evt);
}
});
jScrollPane1.setViewportView(keyList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(11, 11, 5, 0);
add(jScrollPane1, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(addKeyButton, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("CTL_AddKey")); // NOI18N
addKeyButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addKeyButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints.insets = new java.awt.Insets(11, 11, 0, 11);
add(addKeyButton, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(removeKeyButton, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("CTL_RemoveKey")); // NOI18N
removeKeyButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeKeyButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints.insets = new java.awt.Insets(5, 11, 5, 11);
add(removeKeyButton, gridBagConstraints);
jPanel1.setLayout(new java.awt.GridBagLayout());
nameText.setEditable(false);
nameText.selectAll();
nameText.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
nameTextFocusGained(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
jPanel1.add(nameText, gridBagConstraints);
changeNameButton.setText("...");
changeNameButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
changeNameButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
jPanel1.add(changeNameButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 11);
add(jPanel1, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void nameTextFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_nameTextFocusGained
// Accessibility
nameText.selectAll();
}//GEN-LAST:event_nameTextFocusGained
private void changeNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changeNameButtonActionPerformed
final Dialog[] dialog = new Dialog[1];
final LocalePanel panel = new LocalePanel(getLocale(entry));
DialogDescriptor dd = new DialogDescriptor(
panel,
NbBundle.getBundle(PropertiesDataNode.class).getString("CTL_NewLocaleTitle"),
true,
DialogDescriptor.OK_CANCEL_OPTION,
DialogDescriptor.OK_OPTION,
new ActionListener() {
public void actionPerformed(ActionEvent evt2) {
// OK pressed
if (evt2.getSource() == DialogDescriptor.OK_OPTION) {
dialog[0].setVisible(false);
dialog[0].dispose();
updateName(panel.getLocale());
// Cancel pressed
} else if (evt2.getSource() == DialogDescriptor.CANCEL_OPTION) {
dialog[0].setVisible(false);
dialog[0].dispose();
}
}
}
);
dialog[0] = DialogDisplayer.getDefault().createDialog(dd);
dialog[0].setVisible(true);
}//GEN-LAST:event_changeNameButtonActionPerformed
private void keyListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_keyListValueChanged
if (keyList.isSelectionEmpty()) {
removeKeyButton.setEnabled(false);
} else {
removeKeyButton.setEnabled(true);
}
}//GEN-LAST:event_keyListValueChanged
private void removeKeyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeKeyButtonActionPerformed
Object[] selectedValues = keyList.getSelectedValues();
PropertiesStructure ps = entry.getHandler().getStructure();
for(int i=0; i<selectedValues.length; i++) {
ps.deleteItem((String)selectedValues[i]);
}
updateKeyList();
}//GEN-LAST:event_removeKeyButtonActionPerformed
private void addKeyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addKeyButtonActionPerformed
try {
entry.getNodeDelegate().getNewTypes()[0].create();
updateKeyList();
} catch(IOException ioe) {
org.openide.ErrorManager.getDefault().notify(org.openide.ErrorManager.INFORMATIONAL, ioe);
}
}//GEN-LAST:event_addKeyButtonActionPerformed
/** Updates keys. Utility method. */
private void updateKeyList() {
// Very ugly, but now there is incosistency gap in the properties structure.
// REmove threads when changed parsing.
PropertiesRequestProcessor.getInstance().post(new Runnable() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Update keys.
keyList.setListData(retrieveKeys(entry));
}
});
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addKeyButton;
private javax.swing.JButton changeNameButton;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel keyLabel;
private javax.swing.JList keyList;
private javax.swing.JLabel nameLabel;
private javax.swing.JTextField nameText;
private javax.swing.JButton removeKeyButton;
// End of variables declaration//GEN-END:variables
}