/************************************************************************** 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.externalfinder.gui; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JComponent; import javax.swing.JSpinner; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import org.omegat.externalfinder.ExternalFinder; import org.omegat.externalfinder.item.ExternalFinderConfiguration; import org.omegat.externalfinder.item.ExternalFinderItem; import org.omegat.externalfinder.item.ExternalFinderItem.SCOPE; import org.omegat.gui.preferences.BasePreferencesController; import org.omegat.util.OStrings; import org.omegat.util.Preferences; import org.omegat.util.gui.StaticUIUtils; import org.omegat.util.gui.TableColumnSizer; public class ExternalFinderPreferencesController extends BasePreferencesController { private static int MAX_ROW_COUNT = 10; private final boolean isProjectSpecific; private final ExternalFinderConfiguration originalConfig; private ExternalFinderPreferencesPanel panel; public ExternalFinderPreferencesController() { this(false, ExternalFinder.getGlobalConfig()); } public ExternalFinderPreferencesController(boolean isProjectSpecific, ExternalFinderConfiguration originalConfig) { this.isProjectSpecific = isProjectSpecific; this.originalConfig = originalConfig; } @Override public Component getGui() { if (panel == null) { initGui(); initFromPrefs(); } return panel; } private void initGui() { panel = new ExternalFinderPreferencesPanel(); JComponent editor = panel.prioritySpinner.getEditor(); if (editor instanceof JSpinner.DefaultEditor) { ((JSpinner.DefaultEditor) editor).getTextField().setColumns(4); } panel.addButton.addActionListener(e -> addItem()); panel.removeButton.addActionListener(e -> removeSelection()); panel.editButton.addActionListener(e -> editSelection()); panel.prioritySpinner.addChangeListener(e -> { boolean changed = (Integer) panel.prioritySpinner.getValue() != originalConfig.getPriority(); setRestartRequired(changed); }); panel.itemTable.getSelectionModel().addListSelectionListener(e -> onSelectionChanged()); Dimension tableSize = panel.itemTable.getPreferredSize(); panel.itemTable.setPreferredScrollableViewportSize( new Dimension(tableSize.width, panel.itemTable.getRowHeight() * MAX_ROW_COUNT)); panel.itemTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) { editSelection(); } } }); TableColumnSizer.autoSize(panel.itemTable, ItemColumn.CONTENTS.index, true); panel.globalOptionsPanel.setVisible(!isProjectSpecific); } private void addItem() { SCOPE scope = isProjectSpecific ? SCOPE.PROJECT : SCOPE.GLOBAL; ExternalFinderItemEditorController editor = new ExternalFinderItemEditorController(scope); if (editor.show(SwingUtilities.windowForComponent(panel))) { int row = panel.itemTable.getSelectedRow(); ItemsTableModel model = (ItemsTableModel) panel.itemTable.getModel(); int newRow = row >= 0 ? row + 1 : panel.itemTable.getRowCount(); model.addItemAtRow(newRow, editor.getResult()); panel.itemTable.setRowSelectionInterval(newRow, newRow); } } private void removeSelection() { int row = panel.itemTable.getSelectedRow(); if (row >= 0) { ItemsTableModel model = (ItemsTableModel) panel.itemTable.getModel(); model.removeItemAtRow(row); } } private void editSelection() { int row = panel.itemTable.getSelectedRow(); if (row >= 0) { ItemsTableModel model = (ItemsTableModel) panel.itemTable.getModel(); ExternalFinderItem item = model.getItemAtRow(row); ExternalFinderItemEditorController editor = new ExternalFinderItemEditorController(item); if (editor.show(SwingUtilities.windowForComponent(panel))) { model.setItemAtRow(row, editor.getResult()); } } } private void onSelectionChanged() { int row = panel.itemTable.getSelectedRow(); boolean enabled = row >= 0; panel.removeButton.setEnabled(enabled); panel.editButton.setEnabled(enabled); } @Override public void persist() { if (!isProjectSpecific) { ExternalFinder.setGlobalConfig(getResult()); Preferences.setPreference(Preferences.EXTERNAL_FINDER_ALLOW_PROJECT_COMMANDS, panel.projectSpecificCommandsCheckBox.isSelected()); } } public ExternalFinderConfiguration getResult() { int priority = (Integer) panel.prioritySpinner.getValue(); List<ExternalFinderItem> items = ((ItemsTableModel) panel.itemTable.getModel()).getItems(); return new ExternalFinderConfiguration(priority, items); } @Override public void restoreDefaults() { } @Override protected void initFromPrefs() { panel.projectSpecificCommandsCheckBox .setSelected(Preferences.isPreference(Preferences.EXTERNAL_FINDER_ALLOW_PROJECT_COMMANDS)); panel.prioritySpinner.setValue(originalConfig.getPriority()); ItemsTableModel model = new ItemsTableModel(originalConfig.getItems()); panel.itemTable.setModel(model); onSelectionChanged(); } @Override public String toString() { return isProjectSpecific ? OStrings.getString("PREFS_TITLE_EXTERNALFINDER_PROJ_SPECIFIC") : OStrings.getString("PREFS_TITLE_EXTERNALFINDER"); } static enum ItemColumn { NAME(0, OStrings.getString("PREFS_EXTERNALFINDER_COL_NAME"), String.class), CONTENTS(1, OStrings.getString("PREFS_EXTERNALFINDER_COL_SUMMARY"), String.class), KEYSTROKE(2, OStrings.getString("PREFS_EXTERNALFINDER_COL_KEYSTROKE"), String.class), NOPOPUP(3, OStrings.getString("PREFS_EXTERNALFINDER_COL_POPUP"), Boolean.class); final int index; final String label; final Class<?> clazz; private ItemColumn(int index, String label, Class<?> clazz) { this.index = index; this.label = label; this.clazz = clazz; } static ItemColumn get(int index) { return values()[index]; } } @SuppressWarnings("serial") static class ItemsTableModel extends AbstractTableModel { private final List<ExternalFinderItem> data; public ItemsTableModel(List<ExternalFinderItem> data) { this.data = new ArrayList<>(data); } @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return ItemColumn.values().length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (ItemColumn.get(columnIndex)) { case NAME: return getItemAtRow(rowIndex).getName(); case CONTENTS: return getItemAtRow(rowIndex).getContentSummary(); case KEYSTROKE: KeyStroke ks = getItemAtRow(rowIndex).getKeystroke(); return ks == null ? null : StaticUIUtils.getKeyStrokeText(ks); case NOPOPUP: return !getItemAtRow(rowIndex).isNopopup(); } throw new IllegalArgumentException(); } @Override public String getColumnName(int column) { return ItemColumn.get(column).label; } @Override public Class<?> getColumnClass(int columnIndex) { return ItemColumn.get(columnIndex).clazz; } ExternalFinderItem getItemAtRow(int row) { return data.get(row); } void removeItemAtRow(int row) { data.remove(row); fireTableRowsDeleted(row, row); } void addItemAtRow(int row, ExternalFinderItem newItem) { data.add(row, newItem); fireTableRowsInserted(row, row); } public void setItemAtRow(int row, ExternalFinderItem newItem) { data.set(row, newItem); fireTableRowsUpdated(row, row); } public List<ExternalFinderItem> getItems() { return data; } } }