blob: 8bc9e82a3470214d40225bc6b605373ce85c2c2b [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.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.swing.*;
import org.openide.util.HelpCtx;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
/**
* Customizer for bundle node (<code>PropertiesDataNode</code>) which represents
* bundle of .properties files with same basic name and set of Locales.
*
* @author Peter Zavadsky
* @see PropertiesDataNode
* @see PropertiesDataObject
*/
public class BundleNodeCustomizer extends JPanel {
/** Properties data object to customize. */
private PropertiesDataObject propDataObject;
/** Creates new form BundleNodeCustomizer */
public BundleNodeCustomizer(PropertiesDataObject propDataObject) {
this.propDataObject = propDataObject;
initComponents();
initAccessibility();
nameText.setText(propDataObject.getNodeDelegate().getName());
localesList.setListData(retrieveLocales(propDataObject));
removeLocales.setEnabled(false);
HelpCtx.setHelpIDString(this, Util.HELP_ID_ADDLOCALE);
}
/** Utility method. Gets icon for key item in key list. */
private static Icon getLocaleIcon() {
return ImageUtilities.loadImageIcon("org/netbeans/modules/properties/propertiesLocale.gif", false); // NOI18N
}
/** Retrieves entry locales. Utility method.
* @param propDataObject properties data object to retrieve entry names for */
private static Locale[] retrieveLocales(PropertiesDataObject propDataObject) {
List<Locale> entryList = new ArrayList<Locale>();
BundleStructure structure = propDataObject.getBundleStructure();
for (int i=0; i<structure.getEntryCount();i++) {
entryList.add(LocaleNodeCustomizer.getLocale(structure.getNthEntry(i)));
}
Locale[] entryLocales = new Locale[entryList.size()];
entryList.toArray(entryLocales);
return entryLocales;
}
private void initAccessibility() {
this.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_BundleNodeCustomizer"));
nameText.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_BundleName"));
localesList.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_LocalesList"));
addLocale.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_AddLocale"));
removeLocales.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(LocaleNodeCustomizer.class).getString("ACS_CTL_RemoveLocale"));
}
/** 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();
nameText = new javax.swing.JTextField();
localesLabel = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
localesList = new javax.swing.JList();
addLocale = new javax.swing.JButton();
removeLocales = 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.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 0);
add(nameLabel, gridBagConstraints);
nameText.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
nameTextActionPerformed(evt);
}
});
nameText.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
nameTextFocusLost(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(12, 12, 0, 11);
add(nameText, gridBagConstraints);
localesLabel.setLabelFor(localesList);
org.openide.awt.Mnemonics.setLocalizedText(localesLabel, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("LBL_Locales")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(11, 12, 0, 0);
add(localesLabel, gridBagConstraints);
localesList.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);
if(value instanceof String)
return label;
Locale locale = (Locale)value;
if(locale.equals(new Locale("", ""))) // NOI18N
label.setText(NbBundle.getBundle(BundleNodeCustomizer.class).getString("LAB_defaultLanguage"));//NOI18N
else {
label.setText(locale.toString() +
(locale.getLanguage().equals("") ? "" : " - " + locale.getDisplayLanguage()) + // NOI18N
(locale.getCountry().equals("") ? "" : " / " + locale.getDisplayCountry()) + // NOI18N
(locale.getVariant().equals("") ? "" : " / " + locale.getDisplayVariant()) // NOI18N
);
}
label.setIcon(getLocaleIcon());
return label;
}
});
localesList.setPrototypeCellValue("0123456789012345678901234567890123456789");
localesList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
localesListValueChanged(evt);
}
});
jScrollPane1.setViewportView(localesList);
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, 12, 5, 0);
add(jScrollPane1, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(addLocale, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("CTL_AddLocale")); // NOI18N
addLocale.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addLocaleActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.insets = new java.awt.Insets(11, 11, 0, 11);
add(addLocale, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(removeLocales, NbBundle.getBundle(LocaleNodeCustomizer.class).getString("CTL_RemoveLocale")); // NOI18N
removeLocales.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeLocalesActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 11, 5, 11);
add(removeLocales, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void localesListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_localesListValueChanged
if(localesList.isSelectionEmpty()
|| new Locale("", "").equals(localesList.getSelectedValue())
|| propDataObject.getBundleStructure().getEntryCount()==1) {
removeLocales.setEnabled(false);
} else {
removeLocales.setEnabled(true);
}
}//GEN-LAST:event_localesListValueChanged
private void removeLocalesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeLocalesActionPerformed
Object[] selectedValues = localesList.getSelectedValues();
String basicName = propDataObject.getPrimaryFile().getName();
basicName = Util.getBaseName(basicName);
NotifyDescriptor descriptor = new NotifyDescriptor.Confirmation(NbBundle.getMessage(BundleNodeCustomizer.class, "CTL_Deletebundle_Prompt"));
descriptor.setTitle(NbBundle.getMessage(BundleNodeCustomizer.class, "CTL_Deletebundle_Title"));
descriptor.setMessageType(JOptionPane.WARNING_MESSAGE);
descriptor.setOptionType(NotifyDescriptor.YES_NO_OPTION);
Object res = DialogDisplayer.getDefault().notify(descriptor);
if (res != NotifyDescriptor.YES_OPTION) {
return;
}
for(int i=0; i<selectedValues.length; i++) {
PropertiesFileEntry entry = propDataObject.getBundleStructure().getEntryByFileName(basicName + PropertiesDataLoader.PRB_SEPARATOR_CHAR + selectedValues[i].toString());
try {
entry.delete();
if (!propDataObject.isValid()) {
propDataObject = Util.findPrimaryDataObject(propDataObject);
nameText.setText(propDataObject.getName());
}
} catch(IOException ioe) {
org.openide.ErrorManager.getDefault().notify(org.openide.ErrorManager.INFORMATIONAL, ioe);
}
}
localesList.setListData(retrieveLocales(propDataObject));
}//GEN-LAST:event_removeLocalesActionPerformed
private void addLocaleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addLocaleActionPerformed
try {
propDataObject.getNodeDelegate().getNewTypes()[0].create();
} catch(IOException ioe) {
org.openide.ErrorManager.getDefault().notify(org.openide.ErrorManager.INFORMATIONAL, ioe);
}
localesList.setListData(retrieveLocales(propDataObject));
}//GEN-LAST:event_addLocaleActionPerformed
private void nameTextFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_nameTextFocusLost
nameTextHandler();
}//GEN-LAST:event_nameTextFocusLost
private void nameTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameTextActionPerformed
nameTextHandler();
}//GEN-LAST:event_nameTextActionPerformed
/** Name text field event handler delegate. */
private void nameTextHandler() {
String newName = nameText.getText();
if (newName == null || "".equals(newName)) { //NOI18N
return;
}
propDataObject.getNodeDelegate().setName(newName);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addLocale;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel localesLabel;
private javax.swing.JList localesList;
private javax.swing.JLabel nameLabel;
private javax.swing.JTextField nameText;
private javax.swing.JButton removeLocales;
// End of variables declaration//GEN-END:variables
}