/* * $Id$ * * Copyright (c) 2007 by Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.i18n; import java.awt.Component; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Locale; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import VASSAL.Info; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.documentation.HelpWindow; import VASSAL.configure.ConfigureTree; import VASSAL.configure.ShowHelpAction; import VASSAL.tools.ReadErrorDialog; import VASSAL.tools.WriteErrorDialog; import VASSAL.tools.filechooser.ExtensionFileFilter; import VASSAL.tools.filechooser.FileChooser; import VASSAL.tools.io.IOUtils; public class TranslateVassalWindow extends TranslateWindow { private static final long serialVersionUID = 1L; protected LocaleConfigurer localeConfig; protected FileChooser fileChooser; public TranslateVassalWindow(Frame owner, boolean modal, Translatable target, HelpWindow helpWindow, ConfigureTree tree) { super(owner, modal, target, helpWindow, tree); } public TranslateVassalWindow(Frame owner) { super(owner, false, new VassalTranslation(), null, null); currentTranslation = (Translation) target; keyTable.setEnabled(true); newTranslation(); } protected FileChooser getFileChooser() { if (fileChooser == null) { fileChooser = FileChooser.createFileChooser(this, null); } else { fileChooser.resetChoosableFileFilters(); fileChooser.rescanCurrentDirectory(); } return fileChooser; } @Override protected Component buildMainPanel() { JSplitPane pane = (JSplitPane) super.buildMainPanel(); return pane.getBottomComponent(); } @Override protected Component getHeaderPanel() { final JPanel headPanel = new JPanel(); localeConfig = new LocaleConfigurer(null, "", new Locale(Locale.getDefault().getLanguage())); localeConfig.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { Locale l = localeConfig.getValueLocale(); if (!Resources.getSupportedLocales().contains(l)) { l = new Locale(l.getLanguage()); } if (Resources.getSupportedLocales().contains(l)) { final String filename = "VASSAL_" + l + ".properties"; final InputStream is = getClass().getResourceAsStream(filename); if (is != null) { BufferedInputStream in = null; try { in = new BufferedInputStream(is); ((VassalTranslation)target).loadProperties(in); ((MyTableModel) keyTable.getModel()).fireTableDataChanged(); in.close(); } catch (IOException e) { ReadErrorDialog.error(e, filename); } finally { IOUtils.closeQuietly(in); } } } else { ((VassalTranslation) target).clearProperties(); ((MyTableModel) keyTable.getModel()).fireTableDataChanged(); } } }); headPanel.add(localeConfig.getControls()); return headPanel; } @Override protected Component getButtonPanel() { final JPanel buttonBox = new JPanel(); final JButton helpButton = new JButton(Resources.getString(Resources.HELP)); helpButton.addActionListener(new ShowHelpAction(HelpFile.getReferenceManualPage("Translations.htm","application").getContents(),null)); final JButton loadButton = new JButton(Resources.getString(Resources.LOAD)); loadButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadTranslation(); } }); buttonBox.add(helpButton); buttonBox.add(loadButton); final JButton okButton = new JButton(Resources.getString(Resources.SAVE)); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { // FIXME: can this ever throw? save(); } catch (IOException e1) { // FIXME: error dialog } } }); buttonBox.add(okButton); final JButton cancelButton = new JButton(Resources.getString(Resources.CANCEL)); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cancel(); } }); buttonBox.add(cancelButton); return buttonBox; } protected void newTranslation() { ((VassalTranslation) target).clearProperties(); ArrayList<String> keyList = new ArrayList<String>(Resources.getVassalKeys()); Collections.sort(keyList); keys = keyList.toArray(new String[keyList.size()]); copyButtons = new CopyButton[keys.length]; ((MyTableModel) keyTable.getModel()).update(); } protected void loadTranslation() { if (currentTranslation.isDirty()) { try { if (!querySave()) { return; } } catch (IOException e) { ReadErrorDialog.error(e, currentTranslation.getBundleFileName()); return; } } final FileChooser fc = getFileChooser(); fc.setFileFilter(new ExtensionFileFilter("Property Files", new String[]{".properties"})); fc.setCurrentDirectory(Info.getHomeDir()); if (fc.showOpenDialog(this) != FileChooser.APPROVE_OPTION) return; final File file = fc.getSelectedFile(); if (!file.getName().endsWith(".properties")) { // FIXME: review error message loadError("Module Properties files must end in '.properties'."); return; } else { final String language = file.getName().substring(7, 9); String country = ""; if (file.getName().charAt(9) == '_') { country = file.getName().substring(10, 12); } final Locale locale = new Locale(language, country); localeConfig.setValue(locale); } BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(file)); ((VassalTranslation) target).loadProperties(in); in.close(); } catch (IOException e) { ReadErrorDialog.error(e, file); } finally { IOUtils.closeQuietly(in); } ((MyTableModel) keyTable.getModel()).fireTableDataChanged(); } protected void loadError(String mess) { JOptionPane.showMessageDialog(this, mess, "Invalid Properties file name", JOptionPane.ERROR_MESSAGE); return; } @Override protected boolean saveTranslation() { final FileChooser fc = getFileChooser(); final Locale l = localeConfig.getValueLocale(); String bundle = "VASSAL_" + l.getLanguage(); if (l.getCountry() != null && l.getCountry().length() > 0) { bundle += "_" + l.getCountry(); } bundle += ".properties"; fc.setSelectedFile(new File(Info.getHomeDir(), bundle)); if (fc.showSaveDialog(this) != FileChooser.APPROVE_OPTION) return false; final File outputFile = fc.getSelectedFile(); try { ((VassalTranslation) target).saveProperties( outputFile, localeConfig.getValueLocale()); } catch (IOException e) { WriteErrorDialog.error(e, outputFile); return false; } return true; } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { final TranslateVassalWindow w = new TranslateVassalWindow(null); w.setVisible(true); } }); } }