/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2016 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.preferences.view; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import javax.swing.JComponent; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import org.omegat.core.machinetranslators.MachineTranslators; import org.omegat.gui.exttrans.IMachineTranslation; import org.omegat.gui.preferences.BasePreferencesController; import org.omegat.util.OStrings; import org.omegat.util.Preferences; import org.omegat.util.gui.TableColumnSizer; /** * @author Aaron Madlon-Kay */ public class MachineTranslationPreferencesController extends BasePreferencesController { private final static int MAX_ROW_COUNT = 10; private final Map<String, Boolean> providerStatus = new HashMap<>(); private MachineTranslationPreferencesPanel panel; @Override public JComponent getGui() { if (panel == null) { initGui(); initFromPrefs(); } return panel; } @Override public String toString() { return OStrings.getString("PREFS_TITLE_MACHINE_TRANSLATION"); } enum ProviderColumn { NAME(0, OStrings.getString("PREFS_MT_HEADER_PROVIDER"), String.class), CHECKBOX(1, OStrings.getString("PREFS_MT_HEADER_ENABLED"), Boolean.class); private final int index; private final String label; private final Class<?> clazz; private ProviderColumn(int i, String label, Class<?> clazz) { this.index = i; this.label = label; this.clazz = clazz; } static ProviderColumn get(int i) { return values()[i]; } } private void initGui() { panel = new MachineTranslationPreferencesPanel(); Dimension tableSize = panel.mtProviderTable.getPreferredSize(); panel.mtProviderTable.setPreferredScrollableViewportSize( new Dimension(tableSize.width, panel.mtProviderTable.getRowHeight() * MAX_ROW_COUNT)); TableColumnSizer.autoSize(panel.mtProviderTable, ProviderColumn.NAME.index, true); panel.mtProviderTable.getSelectionModel().addListSelectionListener(e -> updateEnabledness()); panel.mtProviderTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { int row = panel.mtProviderTable.rowAtPoint(e.getPoint()); getProviderAtRow(row).ifPresent(provider -> { if (provider.isConfigurable()) { showProviderConfigUI(provider); } }); } } }); panel.configureButton.addActionListener(e -> { getSelectedProvider().ifPresent(this::showProviderConfigUI); }); panel.autoFetchCheckBox.addActionListener( e -> panel.untranslatedOnlyCheckBox.setSelected(panel.autoFetchCheckBox.isSelected())); } void updateEnabledness() { boolean enabled = getSelectedProvider().map(IMachineTranslation::isConfigurable).orElse(false); panel.configureButton.setEnabled(enabled); } Optional<IMachineTranslation> getSelectedProvider() { int row = panel.mtProviderTable.getSelectedRow(); return getProviderAtRow(row); } Optional<IMachineTranslation> getProviderAtRow(int row) { try { ProvidersTableModel model = (ProvidersTableModel) panel.mtProviderTable.getModel(); return Optional.of(model.getProviderAt(row)); } catch (IndexOutOfBoundsException ex) { return Optional.empty(); } } void showProviderConfigUI(IMachineTranslation provider) { provider.showConfigurationUI(SwingUtilities.windowForComponent(panel)); } @Override protected void initFromPrefs() { panel.autoFetchCheckBox.setSelected(Preferences.isPreference(Preferences.MT_AUTO_FETCH)); panel.untranslatedOnlyCheckBox.setSelected(Preferences.isPreference(Preferences.MT_ONLY_UNTRANSLATED)); List<IMachineTranslation> mtProviders = MachineTranslators.getMachineTranslators(); mtProviders.stream().forEach(p -> providerStatus.put(p.getName(), p.isEnabled())); panel.mtProviderTable.setModel(new ProvidersTableModel(mtProviders)); updateEnabledness(); } @Override public void restoreDefaults() { panel.autoFetchCheckBox.setSelected(false); panel.untranslatedOnlyCheckBox.setSelected(false); List<IMachineTranslation> mtProviders = MachineTranslators.getMachineTranslators(); mtProviders.stream().forEach(p -> providerStatus.put(p.getName(), false)); panel.mtProviderTable.setModel(new ProvidersTableModel(mtProviders)); updateEnabledness(); } @Override public void persist() { Preferences.setPreference(Preferences.MT_AUTO_FETCH, panel.autoFetchCheckBox.isSelected()); Preferences.setPreference(Preferences.MT_ONLY_UNTRANSLATED, panel.untranslatedOnlyCheckBox.isSelected()); MachineTranslators.getMachineTranslators().stream().forEach(p -> { Boolean status = providerStatus.get(p.getName()); if (status != null) { p.setEnabled(status); } }); } @SuppressWarnings("serial") class ProvidersTableModel extends AbstractTableModel { private final List<IMachineTranslation> mtProviders; public ProvidersTableModel(List<IMachineTranslation> mtProviders) { this.mtProviders = mtProviders; } @Override public boolean isCellEditable(int row, int column) { return ProviderColumn.get(column) == ProviderColumn.CHECKBOX; } @Override public void setValueAt(Object aValue, int row, int column) { if (ProviderColumn.get(column) == ProviderColumn.CHECKBOX) { providerStatus.put(mtProviders.get(row).getName(), (Boolean) aValue); } } @Override public int getColumnCount() { return ProviderColumn.values().length; } @Override public String getColumnName(int column) { return ProviderColumn.get(column).label; } @Override public Object getValueAt(int row, int column) { switch (ProviderColumn.get(column)) { case CHECKBOX: return providerStatus.get(mtProviders.get(row).getName()); case NAME: return mtProviders.get(row).getName(); default: throw new IndexOutOfBoundsException(); } } @Override public int getRowCount() { return mtProviders.size(); } @Override public java.lang.Class<?> getColumnClass(int columnIndex) { return ProviderColumn.get(columnIndex).clazz; }; public IMachineTranslation getProviderAt(int row) { return mtProviders.get(row); } } }