/************************************************************************** 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.Dimension; import java.awt.Window; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JDialog; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.AbstractTableModel; import org.omegat.externalfinder.item.ExternalFinderItem; import org.omegat.externalfinder.item.ExternalFinderItem.ENCODING; import org.omegat.externalfinder.item.ExternalFinderItem.SCOPE; import org.omegat.externalfinder.item.ExternalFinderItem.TARGET; import org.omegat.externalfinder.item.ExternalFinderItemCommand; import org.omegat.externalfinder.item.ExternalFinderItemURL; import org.omegat.gui.dialogs.KeyStrokeEditorDialog; import org.omegat.util.OStrings; import org.omegat.util.gui.StaticUIUtils; import org.omegat.util.gui.TableColumnSizer; /** * Editor GUI for a single {@link ExternalFinderItem}. * * @author Aaron Madlon-Kay */ public class ExternalFinderItemEditorController { private static int MAX_ROW_COUNT = 5; private final ExternalFinderItemEditorPanel panel; private final ExternalFinderItem.Builder builder; private boolean userDidConfirm; public ExternalFinderItemEditorController(SCOPE scope) { this(new ExternalFinderItem.Builder().setScope(scope)); } public ExternalFinderItemEditorController(ExternalFinderItem item) { this(ExternalFinderItem.Builder.from(item)); } public ExternalFinderItemEditorController(ExternalFinderItem.Builder builder) { this.builder = builder; this.panel = new ExternalFinderItemEditorPanel(); } public boolean show(Window parent) { JDialog dialog = new JDialog(parent, OStrings.getString("EXTERNALFINDER_EDITOR_TITLE")); dialog.setModal(true); dialog.getContentPane().add(panel); dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); StaticUIUtils.setWindowIcon(dialog); StaticUIUtils.setEscapeClosable(dialog); panel.nameField.setText(builder.getName()); panel.nameField.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { update(); } @Override public void insertUpdate(DocumentEvent e) { update(); } @Override public void changedUpdate(DocumentEvent e) { update(); } private void update() { builder.setName(panel.nameField.getText().trim()); validate(); } }); panel.setKeystrokeButton.addActionListener(e -> editKeyStroke()); updateKeyStroke(); panel.popupCheckBox.setSelected(!builder.isNopopup()); panel.popupCheckBox.addActionListener(e -> builder.setNopopup(!panel.popupCheckBox.isSelected())); // URLs table panel.addUrlButton.addActionListener(e -> addUrl()); panel.removeUrlButton.addActionListener(e -> removeSelectedUrl()); panel.editUrlButton.addActionListener(e -> editSelectedUrl()); panel.urlsTable.setModel(new UrlsTableModel()); panel.urlsTable.getSelectionModel().addListSelectionListener(e -> onUrlSelectionChanged()); Dimension tableSize = panel.urlsTable.getPreferredSize(); panel.urlsTable.setPreferredScrollableViewportSize( new Dimension(tableSize.width, panel.urlsTable.getRowHeight() * MAX_ROW_COUNT)); TableColumnSizer.autoSize(panel.urlsTable, UrlColumn.URL.index, true); panel.urlsTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) { editSelectedUrl(); } } }); // Commands table panel.addCommandButton.addActionListener(e -> addCommand()); panel.removeCommandButton.addActionListener(e -> removeSelectedCommand()); panel.editCommandButton.addActionListener(e -> editSelectedCommand()); panel.commandsTable.setModel(new CommandsTableModel()); panel.commandsTable.getSelectionModel().addListSelectionListener(e -> onCommandSelectionChanged()); tableSize = panel.commandsTable.getPreferredSize(); panel.commandsTable.setPreferredScrollableViewportSize( new Dimension(tableSize.width, panel.commandsTable.getRowHeight() * MAX_ROW_COUNT)); TableColumnSizer.autoSize(panel.commandsTable, CommandColumn.COMMAND.index, true); panel.commandsTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) { editSelectedCommand(); } } }); panel.okButton.addActionListener(e -> { if (validate()) { userDidConfirm = true; StaticUIUtils.closeWindowByEvent(dialog); } }); dialog.getRootPane().setDefaultButton(panel.okButton); panel.cancelButton.addActionListener(e -> { userDidConfirm = false; StaticUIUtils.closeWindowByEvent(dialog); }); onUrlSelectionChanged(); onCommandSelectionChanged(); validate(); dialog.pack(); dialog.setLocationRelativeTo(parent); dialog.setVisible(true); return userDidConfirm; } public ExternalFinderItem getResult() { return builder.build(); } private boolean validate() { boolean isValid = true; try { builder.validate(); } catch (Exception e) { isValid = false; } panel.okButton.setEnabled(isValid); return isValid; } private void editKeyStroke() { KeyStrokeEditorDialog dialog = new KeyStrokeEditorDialog(builder.getKeyStroke()); if (dialog.show(SwingUtilities.windowForComponent(panel))) { builder.setKeyStroke(dialog.getResult()); updateKeyStroke(); } } private void updateKeyStroke() { KeyStroke ks = builder.getKeyStroke(); String text = ks == null ? OStrings.getString("KEYSTROKE_EDITOR_NOT_SET") : StaticUIUtils.getKeyStrokeText(ks); panel.keystrokeLabel.setText(text); } private void addUrl() { ExternalFinderItemURLEditorController editor = new ExternalFinderItemURLEditorController(); if (editor.show(SwingUtilities.windowForComponent(panel))) { int row = panel.urlsTable.getSelectedRow(); int newRow = row >= 0 ? row + 1 : builder.getURLs().size(); builder.getURLs().add(newRow, editor.getResult()); panel.urlsTable.repaint(); panel.urlsTable.setRowSelectionInterval(newRow, newRow); validate(); } } private void removeSelectedUrl() { int row = panel.urlsTable.getSelectedRow(); if (row >= 0) { builder.getURLs().remove(row); panel.urlsTable.repaint(); validate(); } } private void editSelectedUrl() { int row = panel.urlsTable.getSelectedRow(); if (row >= 0) { ExternalFinderItemURL url = builder.getURLs().get(row); ExternalFinderItemURLEditorController editor = new ExternalFinderItemURLEditorController(url); if (editor.show(SwingUtilities.windowForComponent(panel))) { builder.getURLs().set(row, editor.getResult()); panel.urlsTable.repaint(); validate(); } } } private void addCommand() { ExternalFinderItemCommandEditorController editor = new ExternalFinderItemCommandEditorController(); if (editor.show(SwingUtilities.windowForComponent(panel))) { int row = panel.commandsTable.getSelectedRow(); int newRow = row >= 0 ? row + 1 : builder.getCommands().size(); builder.getCommands().add(newRow, editor.getResult()); panel.commandsTable.repaint(); panel.commandsTable.setRowSelectionInterval(newRow, newRow); validate(); } } private void removeSelectedCommand() { int row = panel.commandsTable.getSelectedRow(); if (row >= 0) { builder.getCommands().remove(row); panel.commandsTable.repaint(); validate(); } } private void editSelectedCommand() { int row = panel.commandsTable.getSelectedRow(); if (row >= 0) { ExternalFinderItemCommand command = builder.getCommands().get(row); ExternalFinderItemCommandEditorController editor = new ExternalFinderItemCommandEditorController( command); if (editor.show(SwingUtilities.windowForComponent(panel))) { builder.getCommands().set(row, editor.getResult()); panel.commandsTable.repaint(); validate(); } } } private void onUrlSelectionChanged() { int row = panel.urlsTable.getSelectedRow(); boolean enabled = row >= 0; panel.removeUrlButton.setEnabled(enabled); panel.editUrlButton.setEnabled(enabled); } private void onCommandSelectionChanged() { int row = panel.commandsTable.getSelectedRow(); boolean enabled = row >= 0; panel.removeCommandButton.setEnabled(enabled); panel.editCommandButton.setEnabled(enabled); } static enum UrlColumn { URL(0, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_URL"), String.class), TARGET(1, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_TARGET"), TARGET.class), ENCODING(2, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_ENCODING"), ENCODING.class); final int index; final String label; final Class<?> clazz; private UrlColumn(int index, String label, Class<?> clazz) { this.index = index; this.label = label; this.clazz = clazz; } static UrlColumn get(int index) { return values()[index]; } } @SuppressWarnings("serial") class UrlsTableModel extends AbstractTableModel { @Override public int getRowCount() { return builder.getURLs().size(); } @Override public int getColumnCount() { return UrlColumn.values().length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (UrlColumn.get(columnIndex)) { case URL: return builder.getURLs().get(rowIndex).getURL(); case TARGET: return builder.getURLs().get(rowIndex).getTarget(); case ENCODING: return builder.getURLs().get(rowIndex).getEncoding(); } throw new IllegalArgumentException(); } @Override public String getColumnName(int column) { return UrlColumn.get(column).label; } @Override public Class<?> getColumnClass(int columnIndex) { return UrlColumn.get(columnIndex).clazz; } } static enum CommandColumn { COMMAND(0, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_COMMAND"), String.class), TARGET(1, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_TARGET"), TARGET.class), ENCODING(2, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_ENCODING"), ENCODING.class), DELIMITER(3, OStrings.getString("EXTERNALFINDER_EDITOR_COLUMN_DELIMITER"), String.class); final int index; final String label; final Class<?> clazz; private CommandColumn(int index, String label, Class<?> clazz) { this.index = index; this.label = label; this.clazz = clazz; } static CommandColumn get(int index) { return values()[index]; } } @SuppressWarnings("serial") class CommandsTableModel extends AbstractTableModel { @Override public int getRowCount() { return builder.getCommands().size(); } @Override public int getColumnCount() { return CommandColumn.values().length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (CommandColumn.get(columnIndex)) { case COMMAND: return builder.getCommands().get(rowIndex).getCommand(); case TARGET: return builder.getCommands().get(rowIndex).getTarget(); case ENCODING: return builder.getCommands().get(rowIndex).getEncoding(); case DELIMITER: return builder.getCommands().get(rowIndex).getDelimiter(); } throw new IllegalArgumentException(); } @Override public String getColumnName(int column) { return CommandColumn.get(column).label; } @Override public Class<?> getColumnClass(int columnIndex) { return CommandColumn.get(columnIndex).clazz; } } }