/************************************************************************** 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 2013 Alex Buloichik, Yu Tang 2014 Aaron Madlon-Kay 2015 Yu Tang, Aaron Madlon-Kay 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.filters2; import java.awt.Component; import java.awt.Font; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableCellRenderer; import org.omegat.core.Core; import org.omegat.filters2.IFilter; import org.omegat.filters2.master.FilterMaster; import org.omegat.filters2.master.FiltersTableModel; import org.omegat.gui.preferences.BasePreferencesController; import org.omegat.util.OStrings; import org.omegat.util.Preferences; import org.omegat.util.gui.TableColumnSizer; import gen.core.filters.Filter; import gen.core.filters.Filters; /** * @author Maxym Mykhalchuk * @author Alex Buloichik * @author Yu Tang * @author Aaron Madlon-Kay */ public class FiltersCustomizerController extends BasePreferencesController { private FiltersCustomizerPanel panel; /** * Flag if this customizer shows project specific filters or not */ private final boolean isProjectSpecific; /** Filters from OmegaT. */ private final Filters defaultFilters; /** User-modified filters */ private final Filters userFilters; /** Project-specific filters */ private final Filters projectFilters; /** Filters which editable now. */ private Filters editableFilters; /** Names of filters to mark as in-use in the list */ private Collection<String> inUseFilters = Collections.emptySet(); public FiltersCustomizerController() { this(false, FilterMaster.createDefaultFiltersConfig(), Preferences.getFilters(), null); } public FiltersCustomizerController(boolean projectSpecific, Filters defaultFilters, Filters userFilters, Filters projectFilters) { this.isProjectSpecific = projectSpecific; this.defaultFilters = defaultFilters; this.userFilters = userFilters == null ? defaultFilters : userFilters; this.projectFilters = projectFilters; } @Override public JComponent getGui() { if (panel == null) { initGui(); initFromPrefs(); } return panel; } @Override public String toString() { return isProjectSpecific ? OStrings.getString("FILTERSCUSTOMIZER_TITLE_PROJECTSPECIFIC") : OStrings.getString("FILTERSCUSTOMIZER_TITLE"); } private void initGui() { panel = new FiltersCustomizerPanel(); panel.filtersTable.setDefaultRenderer(String.class, new FilterFormatCellRenderer()); panel.filtersTable.getSelectionModel().addListSelectionListener(e -> { if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel) e.getSource(); if (lsm.isSelectionEmpty()) { panel.editButton.setEnabled(false); panel.optionsButton.setEnabled(false); } else { panel.editButton.setEnabled(true); Filter currFilter = getFilterAtRow(panel.filtersTable.getSelectedRow()); IFilter f = FilterMaster.getFilterInstance(currFilter.getClassName()); panel.optionsButton.setEnabled(f != null && f.hasOptions()); } }); panel.filtersTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent me) { if (me.getClickCount() == 2 && me.getButton() == MouseEvent.BUTTON1) { doEdit(panel.filtersTable.rowAtPoint(me.getPoint())); } } }); TableColumnSizer.autoSize(panel.filtersTable, 0, true); if (!isProjectSpecific) { panel.projectSpecificCB.setVisible(false); } panel.projectSpecificCB.addActionListener(e -> updateEnabledness()); panel.cbRemoveTags .addActionListener(e -> editableFilters.setRemoveTags(panel.cbRemoveTags.isSelected())); panel.cbRemoveSpacesNonseg.addActionListener( e -> editableFilters.setRemoveSpacesNonseg(panel.cbRemoveSpacesNonseg.isSelected())); panel.cbPreserveSpaces.addActionListener( e -> editableFilters.setPreserveSpaces(panel.cbPreserveSpaces.isSelected())); panel.cbIgnoreFileContext.addActionListener( e -> editableFilters.setIgnoreFileContext(panel.cbIgnoreFileContext.isSelected())); panel.optionsButton.addActionListener(e -> { Filter currFilter = getFilterAtRow(panel.filtersTable.getSelectedRow()); IFilter f = FilterMaster.getFilterInstance(currFilter.getClassName()); if (f != null) { // new options handling Map<String, String> newConfig = f.changeOptions(SwingUtilities.windowForComponent(panel), FilterMaster.forFilter(currFilter.getOption())); if (newConfig != null) { FilterMaster.setOptions(currFilter, newConfig); } } }); panel.editButton.addActionListener(e -> doEdit(panel.filtersTable.getSelectedRow())); if (Core.getProject().isProjectLoaded()) { inUseFilters = Core.getProject().getProjectFiles().stream().map(info -> info.filterFileFormatName) .collect(Collectors.toSet()); } } private void updateEnabledness() { boolean enabled = panel.projectSpecificCB.isSelected() || !isProjectSpecific; panel.filtersTable.setEnabled(enabled); panel.filtersTable.setFocusable(enabled); panel.cbRemoveTags.setEnabled(enabled); panel.cbRemoveSpacesNonseg.setEnabled(enabled); panel.cbPreserveSpaces.setEnabled(enabled); panel.cbIgnoreFileContext.setEnabled(enabled); if (!enabled) { panel.filtersTable.getSelectionModel().clearSelection(); } } private void doEdit(int row) { Filter filter = getFilterAtRow(row); FilterEditor editor = new FilterEditor(SwingUtilities.windowForComponent(panel), filter); editor.setVisible(true); if (editor.result != null) { List<Filter> filters = editableFilters.getFilters(); filters.set(filters.indexOf(filter), editor.result); } } private Filter getFilterAtRow(int row) { return ((FiltersTableModel) panel.filtersTable.getModel()).getFilterAtRow(row); } @Override protected void initFromPrefs() { editableFilters = isProjectSpecific && projectFilters != null ? FilterMaster.cloneConfig(projectFilters) : FilterMaster.cloneConfig(userFilters); panel.filtersTable.setModel(new FiltersTableModel(editableFilters)); if (isProjectSpecific) { panel.projectSpecificCB.setSelected(projectFilters != null); } panel.cbRemoveTags.setSelected(editableFilters.isRemoveTags()); panel.cbRemoveSpacesNonseg.setSelected(editableFilters.isRemoveSpacesNonseg()); panel.cbPreserveSpaces.setSelected(editableFilters.isPreserveSpaces()); panel.cbIgnoreFileContext.setSelected(editableFilters.isIgnoreFileContext()); updateEnabledness(); } @Override public void persist() { if (!isProjectSpecific) { Core.setFilterMaster(new FilterMaster(editableFilters)); Preferences.setFilters(editableFilters); } } @Override public void restoreDefaults() { if (panel.projectSpecificCB.isSelected() || !isProjectSpecific) { editableFilters = FilterMaster.cloneConfig(defaultFilters); panel.filtersTable.setModel(new FiltersTableModel(editableFilters)); panel.cbRemoveTags.setSelected(editableFilters.isRemoveTags()); panel.cbRemoveSpacesNonseg.setSelected(editableFilters.isRemoveSpacesNonseg()); panel.cbPreserveSpaces.setSelected(editableFilters.isPreserveSpaces()); panel.cbIgnoreFileContext.setSelected(editableFilters.isIgnoreFileContext()); } } public Filters getResult() { if (isProjectSpecific && !panel.projectSpecificCB.isSelected()) { return null; } else { return editableFilters; } } @SuppressWarnings("serial") private class FilterFormatCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (value != null && inUseFilters.contains(value.toString())) { component.setFont(component.getFont().deriveFont(Font.BOLD)); } return component; } } }