/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2000-2006 Keith Godfrey and Maxym Mykhalchuk
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.segmentation;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import org.omegat.core.Core;
import org.omegat.core.segmentation.MapRule;
import org.omegat.core.segmentation.SRX;
import org.omegat.core.segmentation.Segmenter;
import org.omegat.core.segmentation.datamodels.MappingRulesModel;
import org.omegat.core.segmentation.datamodels.SegmentationRulesModel;
import org.omegat.gui.preferences.BasePreferencesController;
import org.omegat.util.OStrings;
import org.omegat.util.Preferences;
import org.omegat.util.StringUtil;
/**
* @author Maxym Mykhalchuk
* @author Aaron Madlon-Kay
*/
public class SegmentationCustomizerController extends BasePreferencesController {
private static final int MAX_ROW_COUNT = 10;
private SegmentationCustomizerPanel panel;
/** SRX from OmegaT. */
private final SRX defaultSRX;
/** SRX from user preferences. */
private final SRX userSRX;
/** Project-specific SRX */
private final SRX projectSRX;
/** SRX which editable now. */
private SRX editableSRX;
/**
* Flag if this customizer shows project specific segmentation rules or not
*/
private boolean isProjectSpecific;
private boolean haveProjectSrx;
public SegmentationCustomizerController() {
this(false, SRX.getDefault(), Preferences.getSRX(), null);
}
public SegmentationCustomizerController(boolean projectSpecific, SRX defaultSRX, SRX userSRX, SRX projectSRX) {
this.isProjectSpecific = projectSpecific;
this.defaultSRX = defaultSRX;
this.userSRX = userSRX;
this.projectSRX = projectSRX;
this.haveProjectSrx = projectSRX != null;
}
@Override
public JComponent getGui() {
if (panel == null) {
initGui();
initFromPrefs();
}
return panel;
}
@Override
public String toString() {
return isProjectSpecific ? OStrings.getString("GUI_SEGMENTATION_TITLE_PROJECTSPECIFIC")
: OStrings.getString("GUI_SEGMENTATION_TITLE");
}
private void initGui() {
panel = new SegmentationCustomizerPanel();
panel.mapTable.getSelectionModel().addListSelectionListener(e -> {
if (e.getValueIsAdjusting()) {
return;
}
panel.mapErrorsLabel.setText("");
if (panel.mapTable.getSelectionModel().isSelectionEmpty()) {
panel.mapDeleteButton.setEnabled(false);
panel.mapUpButton.setEnabled(false);
panel.mapDownButton.setEnabled(false);
panel.ruleTable.setModel(new DefaultTableModel());
panel.ruleInsertButton.setEnabled(false);
} else {
panel.mapDeleteButton.setEnabled(true);
int selrow = panel.mapTable.getSelectedRow();
int rows = panel.mapTable.getRowCount();
if (selrow > 0) {
panel.mapUpButton.setEnabled(true);
} else {
panel.mapUpButton.setEnabled(false);
}
if (selrow < (rows - 1)) {
panel.mapDownButton.setEnabled(true);
} else {
panel.mapDownButton.setEnabled(false);
}
MapRule maprule = this.editableSRX.getMappingRules().get(selrow);
SegmentationRulesModel model = new SegmentationRulesModel(maprule.getRules());
panel.ruleTable.setModel(model);
model.addExceptionListener(ex -> panel.ruleErrorsLabel.setText(ex.getLocalizedMessage()));
panel.ruleInsertButton.setEnabled(true);
}
});
panel.ruleTable.getSelectionModel().addListSelectionListener(e -> {
if (e.getValueIsAdjusting()) {
return;
}
panel.ruleErrorsLabel.setText("");
if (panel.ruleTable.getSelectionModel().isSelectionEmpty()) {
panel.ruleDeleteButton.setEnabled(false);
panel.ruleUpButton.setEnabled(false);
panel.ruleDownButton.setEnabled(false);
} else {
panel.ruleDeleteButton.setEnabled(true);
int rules = panel.ruleTable.getRowCount();
int rulerow = panel.ruleTable.getSelectedRow();
if (rulerow > 0) {
panel.ruleUpButton.setEnabled(true);
} else {
panel.ruleUpButton.setEnabled(false);
}
if (rulerow < (rules - 1)) {
panel.ruleDownButton.setEnabled(true);
} else {
panel.ruleDownButton.setEnabled(false);
}
}
});
panel.projectSpecificCB.addActionListener(e -> {
panel.ruleTable.clearSelection();
panel.mapTable.clearSelection();
updateEnabledness();
});
panel.ruleDownButton.addActionListener(e -> {
commitTableEdits();
SegmentationRulesModel model = (SegmentationRulesModel) panel.ruleTable.getModel();
int selrow = panel.ruleTable.getSelectedRow();
model.moveRowDown(selrow);
panel.ruleTable.getSelectionModel().clearSelection();
panel.ruleTable.getSelectionModel().addSelectionInterval(selrow + 1, selrow + 1);
});
panel.ruleUpButton.addActionListener(e -> {
commitTableEdits();
SegmentationRulesModel model = (SegmentationRulesModel) panel.ruleTable.getModel();
int selrow = panel.ruleTable.getSelectedRow();
model.moveRowUp(selrow);
panel.ruleTable.getSelectionModel().clearSelection();
panel.ruleTable.getSelectionModel().addSelectionInterval(selrow - 1, selrow - 1);
});
panel.ruleDeleteButton.addActionListener(e -> {
commitTableEdits();
SegmentationRulesModel model = (SegmentationRulesModel) panel.ruleTable.getModel();
model.removeRow(panel.ruleTable.getSelectedRow());
});
panel.mapDownButton.addActionListener(e -> {
commitTableEdits();
MappingRulesModel model = (MappingRulesModel) panel.mapTable.getModel();
int selrow = panel.mapTable.getSelectedRow();
model.moveRowDown(selrow);
panel.mapTable.getSelectionModel().clearSelection();
panel.mapTable.getSelectionModel().addSelectionInterval(selrow + 1, selrow + 1);
});
panel.mapUpButton.addActionListener(e -> {
commitTableEdits();
MappingRulesModel model = (MappingRulesModel) panel.mapTable.getModel();
int selrow = panel.mapTable.getSelectedRow();
model.moveRowUp(selrow);
panel.mapTable.getSelectionModel().clearSelection();
panel.mapTable.getSelectionModel().addSelectionInterval(selrow - 1, selrow - 1);
});
panel.mapDeleteButton.addActionListener(e -> {
commitTableEdits();
MappingRulesModel model = (MappingRulesModel) panel.mapTable.getModel();
String set = model.getValueAt(panel.mapTable.getSelectedRow(), 0).toString();
String title = OStrings.getString("CONFIRM_DIALOG_TITLE");
String message = StringUtil.format(OStrings.getString("SEG_CONFIRM_REMOVE_SENTSEG_SET"), set);
if (JOptionPane.showConfirmDialog(panel, message, title,
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
model.removeRow(panel.mapTable.getSelectedRow());
});
panel.ruleInsertButton.addActionListener(e -> {
commitTableEdits();
SegmentationRulesModel model = (SegmentationRulesModel) panel.ruleTable.getModel();
model.addRow();
panel.ruleTable.changeSelection(panel.ruleTable.getRowCount() - 1, 0, false, false);
panel.ruleTable.changeSelection(panel.ruleTable.getRowCount() - 1,
panel.ruleTable.getColumnCount() - 1, false,
true);
});
panel.mapInsertButton.addActionListener(e -> {
commitTableEdits();
MappingRulesModel model = (MappingRulesModel) panel.mapTable.getModel();
model.addRow();
panel.mapTable.changeSelection(panel.mapTable.getRowCount() - 1, 0, false, false);
panel.mapTable.changeSelection(panel.mapTable.getRowCount() - 1,
panel.mapTable.getColumnCount() - 1, false, true);
});
Dimension mapTableSize = panel.mapTable.getPreferredSize();
panel.mapTable.setPreferredScrollableViewportSize(
new Dimension(mapTableSize.width, panel.mapTable.getRowHeight() * MAX_ROW_COUNT));
Dimension ruleTableSize = panel.ruleTable.getPreferredSize();
panel.ruleTable.setPreferredScrollableViewportSize(
new Dimension(ruleTableSize.width, panel.ruleTable.getRowHeight() * MAX_ROW_COUNT));
}
/** Commits all pending edits on tables to allow up/down row movement */
private void commitTableEdits() {
if (panel.mapTable.getCellEditor() != null) {
panel.mapTable.getCellEditor().stopCellEditing();
}
if (panel.ruleTable.getCellEditor() != null) {
panel.ruleTable.getCellEditor().stopCellEditing();
}
}
@Override
protected void initFromPrefs() {
panel.projectSpecificCB.setVisible(isProjectSpecific);
panel.projectSpecificCB.setSelected(haveProjectSrx);
setEditableSRX(isProjectSpecific && haveProjectSrx ? projectSRX : userSRX);
updateEnabledness();
}
@Override
public void restoreDefaults() {
if (isEditable()) {
commitTableEdits();
setEditableSRX(defaultSRX);
updateEnabledness();
}
}
private boolean isEditable() {
return !isProjectSpecific || (haveProjectSrx && panel.projectSpecificCB.isSelected());
}
private void updateEnabledness() {
boolean enabled = isEditable();
panel.mapTable.setEnabled(enabled);
panel.mapTable.setFocusable(enabled);
panel.mapInsertButton.setEnabled(enabled);
}
protected void setEditableSRX(SRX srx) {
editableSRX = srx.copy();
MappingRulesModel model = new MappingRulesModel(editableSRX);
panel.mapTable.setModel(model);
model.addExceptionListener(ex -> panel.mapErrorsLabel.setText(ex.getLocalizedMessage()));
panel.ruleTable.setModel(new DefaultTableModel());
}
@Override
public void persist() {
if (!isProjectSpecific) {
Core.setSegmenter(new Segmenter(editableSRX));
Preferences.setSRX(editableSRX);
}
}
/**
* Returns the SRX that was edited, so it can be used. If project-specific segmentation rules are
* requested, and user has not checked 'enable project specific segmentation', then null is returned.
*/
public SRX getResult() {
if (isProjectSpecific && !panel.projectSpecificCB.isSelected()) {
return null;
} else {
return editableSRX;
}
}
}