/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2007 - Zoltan Bartko - bartkozoltan@bartkozoltan.com 2008 Didier Briel 2015 Aaron Madlon-Kay Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OmegaT 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. **************************************************************************/ package org.omegat.gui.dialogs; import java.awt.Cursor; import java.awt.Window; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultListModel; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.SwingWorker; import org.omegat.core.spellchecker.DictionaryManager; import org.omegat.util.OStrings; import org.omegat.util.gui.StaticUIUtils; /** * The spellchecker dictionary installer. * * @author bartkoz * @author Didier Briel * @author Aaron Madlon-Kay */ @SuppressWarnings("serial") public class DictionaryInstallerDialog extends JDialog { /** * The dictionary manager in use */ private final DictionaryManager dicMan; /** * the list model */ private final DefaultListModel<String> listModel = new DefaultListModel<>(); private LoaderWorker loader = null; private InstallerWorker installer = null; /** Creates new form DictionaryInstallerDialog */ public DictionaryInstallerDialog(Window parent, DictionaryManager dicMan) { super(parent, JDialog.DEFAULT_MODALITY_TYPE); StaticUIUtils.setEscapeClosable(this); this.dicMan = dicMan; initComponents(); dictionaryList.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) { installButtonActionPerformed(null); } } }); setLocationRelativeTo(parent); dictionaryListValueChanged(null); addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { progressBar.setVisible(true); loader = new LoaderWorker(); loader.execute(); } }); } private class LoaderWorker extends SwingWorker<List<String>, Void> { @Override protected List<String> doInBackground() throws Exception { //Connect with remote URL to get list of dictionaries. return dicMan.getInstallableDictionaryNameList(); } @Override protected void done() { try { List<String> list = get(); list.forEach(listModel::addElement); dictionaryList.setModel(listModel); dictionaryList.setEnabled(true); if (list.isEmpty()) { installButton.setEnabled(false); infoTextArea.setText(OStrings.getString("GUI_DICTIONARY_INSTALLER_TEXT_NOTHING")); } progressBar.setVisible(false); } catch (InterruptedException | ExecutionException ex) { Logger.getLogger(DictionaryInstallerDialog.class.getName()).log(Level.SEVERE, null, ex); } } } /** * 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() { infoTextArea = new javax.swing.JTextArea(); jPanel1 = new javax.swing.JPanel(); listLabel = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); dictionaryList = new javax.swing.JList<>(); jPanel2 = new javax.swing.JPanel(); installButton = new javax.swing.JButton(); jPanel3 = new javax.swing.JPanel(); progressBar = new javax.swing.JProgressBar(); jPanel4 = new javax.swing.JPanel(); closeButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle(OStrings.getString("GUI_DICTIONARY_INSTALLER_TITLE")); // NOI18N setPreferredSize(new java.awt.Dimension(400, 500)); infoTextArea.setEditable(false); infoTextArea.setFont(new JLabel().getFont()); infoTextArea.setLineWrap(true); infoTextArea.setText(OStrings.getString("GUI_DICTIONARY_INSTALLER_TEXT_GO")); // NOI18N infoTextArea.setWrapStyleWord(true); infoTextArea.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); infoTextArea.setDragEnabled(false); infoTextArea.setFocusable(false); infoTextArea.setOpaque(false); getContentPane().add(infoTextArea, java.awt.BorderLayout.NORTH); jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 10, 10, 10)); jPanel1.setLayout(new java.awt.BorderLayout()); org.openide.awt.Mnemonics.setLocalizedText(listLabel, OStrings.getString("GUI_DICTIONARY_INSTALLER_AVAILABLE")); // NOI18N jPanel1.add(listLabel, java.awt.BorderLayout.NORTH); dictionaryList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { dictionaryListValueChanged(evt); } }); jScrollPane2.setViewportView(dictionaryList); jPanel1.add(jScrollPane2, java.awt.BorderLayout.CENTER); jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 5, 0, 0)); jPanel2.setLayout(new java.awt.BorderLayout()); org.openide.awt.Mnemonics.setLocalizedText(installButton, OStrings.getString("GUI_DICTIONARY_INSTALLER_INSTALL")); // NOI18N installButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { installButtonActionPerformed(evt); } }); jPanel2.add(installButton, java.awt.BorderLayout.NORTH); jPanel1.add(jPanel2, java.awt.BorderLayout.EAST); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); jPanel3.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 10, 10, 10)); jPanel3.setLayout(new java.awt.BorderLayout()); progressBar.setIndeterminate(true); jPanel3.add(progressBar, java.awt.BorderLayout.CENTER); jPanel4.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 5, 0, 0)); jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.LINE_AXIS)); org.openide.awt.Mnemonics.setLocalizedText(closeButton, OStrings.getString("BUTTON_CLOSE")); // NOI18N closeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { closeButtonActionPerformed(evt); } }); jPanel4.add(closeButton); jPanel3.add(jPanel4, java.awt.BorderLayout.EAST); getContentPane().add(jPanel3, java.awt.BorderLayout.SOUTH); pack(); }// </editor-fold>//GEN-END:initComponents private void installButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_installButtonActionPerformed if (installer != null) { installer.cancel(true); } progressBar.setVisible(true); installButton.setEnabled(false); closeButton.setEnabled(false); installer = new InstallerWorker(); installer.execute(); }//GEN-LAST:event_installButtonActionPerformed private class InstallerWorker extends SwingWorker<List<String>, String> { private final Cursor HOURGLASS_CURSOR = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); private Cursor oldCursor; @Override protected List<String> doInBackground() throws Exception { oldCursor = getCursor(); setCursor(HOURGLASS_CURSOR); List<String> selection = dictionaryList.getSelectedValuesList(); List<String> completed = new ArrayList<>(); for (String item : selection) { if (isCancelled()) { break; } // install the respective dictionaries String langCode = item.substring(0, item.indexOf(" ")); try { dicMan.installRemoteDictionary(langCode); completed.add(item); publish(item); } catch (Exception ex) { setCursor(oldCursor); JOptionPane.showMessageDialog(DictionaryInstallerDialog.this, ex.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE); setCursor(HOURGLASS_CURSOR); } } return completed; } @Override protected void process(List<String> chunks) { chunks.forEach(listModel::removeElement); } @Override protected void done() { try { get().forEach(listModel::removeElement); } catch (InterruptedException | ExecutionException e) { // Ignore } setCursor(oldCursor); progressBar.setVisible(false); installButton.setEnabled(true); closeButton.setEnabled(true); } } private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed if (installer != null) { installer.cancel(true); } if (loader != null) { loader.cancel(true); } setVisible(false); dispose(); }//GEN-LAST:event_closeButtonActionPerformed private void dictionaryListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_dictionaryListValueChanged installButton.setEnabled(!dictionaryList.getSelectedValuesList().isEmpty()); }//GEN-LAST:event_dictionaryListValueChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton closeButton; private javax.swing.JList<String> dictionaryList; private javax.swing.JTextArea infoTextArea; private javax.swing.JButton installButton; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JLabel listLabel; private javax.swing.JProgressBar progressBar; // End of variables declaration//GEN-END:variables }