All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.vergne.translation.editor.Editor Maven / Gradle / Ivy

package fr.vergne.translation.editor;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JSplitPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.border.EtchedBorder;

import fr.vergne.translation.TranslationEntry;
import fr.vergne.translation.TranslationMap;
import fr.vergne.translation.TranslationProject;
import fr.vergne.translation.editor.MapListPanel.MapSelectedListener;
import fr.vergne.translation.editor.ProjectLoaderPanel.ProjectLoadedListener;
import fr.vergne.translation.editor.content.EntryComponentFactory;
import fr.vergne.translation.editor.content.FilterAction;
import fr.vergne.translation.editor.content.MapComponentFactory;
import fr.vergne.translation.editor.content.SimpleEntryComponent;
import fr.vergne.translation.editor.content.SimpleMapComponent;
import fr.vergne.translation.editor.tool.FileBasedProperties;
import fr.vergne.translation.editor.tool.Search;
import fr.vergne.translation.editor.tool.ToolProvider;
import fr.vergne.translation.impl.EmptyProject;
import fr.vergne.translation.util.EntryFilter;
import fr.vergne.translation.util.Feature;
import fr.vergne.translation.util.MapNamer;
import fr.vergne.translation.util.ProjectLoader;
import fr.vergne.translation.util.impl.DefaultMapNamer;

@SuppressWarnings("serial")
public class Editor, TMap extends TranslationMap, TProject extends TranslationProject>
		extends JFrame {

	private static final Logger logger = Logger.getLogger(Editor.class
			.getName());
	private static final String ACTION_LAST_ENTRY = "lastEntry";
	private static final String ACTION_FIRST_ENTRY = "firstEntry";
	private static final String ACTION_NEXT_ENTRY = "nextEntry";
	private static final String ACTION_PREVIOUS_ENTRY = "previousEntry";
	private static final String ACTION_SAVE = "save";
	private static final String ACTION_RESET = "reset";
	private static final String CONFIG_Y = "y";
	private static final String CONFIG_X = "x";
	private static final String CONFIG_FILTER = "filter";
	private static final String CONFIG_WIDTH = "width";
	private static final String CONFIG_HEIGHT = "height";
	private static final String CONFIG_SPLIT = "split";
	private static final String CONFIG_THEME = "theme";
	private static final String CONFIG_MAP_NAMER = "mapNamer";
	private static final String CONFIG_MAP_DIR = "mapDir";
	private static final String CONFIG_CLEARED_DISPLAYED = "clearedDisplayed";
	private static final String CONFIG_REMAINING_FILTER = "remainingFilter";
	// TODO make config non-static
	public static final FileBasedProperties config = new FileBasedProperties(
			"vh-editor.ini", true);
	private final MapContentPanel mapPanel;
	private TranslationProject currentProject = new EmptyProject<>();
	private final DefaultMapNamer defaultMapNamer = new DefaultMapNamer<>();
	private final ToolProvider toolProvider;

	public Editor(ProjectLoader projectLoader,
			MapComponentFactory mapComponentFactory) {
		// TODO rename as ConfigurationProvider
		// TODO use it instead of the static config
		toolProvider = new ToolProvider() {

			@Override
			public TranslationProject getProject() {
				return currentProject;
			}

			@Override
			public MapNamer getMapNamer() {
				return retrieveCurrentMapNamer();
			}

			@Override
			public void loadMap(MapID id) {
				loadMapEntry(id, 0);
			}

			@Override
			public void loadMapEntry(MapID id, int entryIndex) {
				try {
					mapPanel.setMap(id, entryIndex);
				} catch (Exception e) {
					JOptionPane.showMessageDialog(Editor.this, e.getMessage(),
							"Error", JOptionPane.ERROR_MESSAGE);
				}
			}
		};

		final ProjectLoaderPanel projectPanel = new ProjectLoaderPanel<>(
				projectLoader);
		final MapListPanel listPanel = new MapListPanel<>(
				toolProvider);
		mapPanel = new MapContentPanel(toolProvider, mapComponentFactory);
		final ToolPanel toolPanel = new ToolPanel();

		final JPanel filters = new JPanel();

		JMenuBar menuBar = new JMenuBar();
		final JMenu projectMenu = new JMenu("Project");
		menuBar.add(projectMenu);
		final JMenu listMenu = new JMenu("List");
		menuBar.add(listMenu);
		JMenu themeMenu = new JMenu("Theme");
		menuBar.add(themeMenu);

		projectPanel
				.addProjectLoadedListener(new ProjectLoadedListener() {

					@Override
					public void projectLoaded(File directory, TProject project) {
						Editor.config.setProperty(CONFIG_MAP_DIR,
								directory.toString());
						currentProject = project;
						logger.info("Project loaded: " + project);

						updateEntryFilters(project, filters, mapPanel);
						updateProjectMenu(projectMenu, listPanel, project);
						updateListMenu(listMenu, listPanel, project);

						RemainingFilterConfig config = retrieveRemainingFilterConfig(project);
						listPanel.setRemainingFilter(config.filter);
						listPanel.setProject(project);
					}

				});
		listPanel.addMapSelectedListener(new MapSelectedListener() {

			@Override
			public void mapSelected(MapID id) {
				toolProvider.loadMap(id);
			}
		});
		mapPanel.addUpdateListener(new MapContentPanel.MapUpdateListener() {

			@Override
			public void mapModified(final MapID id,
					final boolean isDifferentFromStore) {
				listPanel.setModifiedStatus(id, isDifferentFromStore);
				if (isDifferentFromStore) {
					// do not care about new progress
				} else {
					SwingUtilities.invokeLater(new Runnable() {

						@Override
						public void run() {
							listPanel.updateMapSummary(id, true);
						}
					});
				}
			}
		});

		ButtonGroup group = new ButtonGroup();
		String currentTheme = config.getProperty(CONFIG_THEME,
				UIManager.getSystemLookAndFeelClassName());
		for (final LookAndFeelInfo theme : UIManager.getInstalledLookAndFeels()) {
			final JRadioButtonMenuItem item = new JRadioButtonMenuItem(
					new AbstractAction(theme.getName()) {

						@Override
						public void actionPerformed(ActionEvent event) {
							try {
								UIManager.setLookAndFeel(theme.getClassName());
								SwingUtilities
										.updateComponentTreeUI(Editor.this);
								Editor.this.setSize(Editor.this.getSize());

								String name = theme.getClassName();
								config.setProperty(CONFIG_THEME, name);
								logger.info("Apply theme: " + name);
							} catch (ClassNotFoundException
									| InstantiationException
									| IllegalAccessException
									| UnsupportedLookAndFeelException ex) {
								logger.log(Level.SEVERE, null, ex);
							}
						}
					});

			if (theme.getClassName().equals(currentTheme)) {
				item.setSelected(true);
				SwingUtilities.invokeLater(new Runnable() {

					@Override
					public void run() {
						item.getAction().actionPerformed(null);
					}
				});
			} else {
				// keep it unselected
			}
			group.add(item);
			themeMenu.add(item);
		}
		configureTools(toolPanel, toolProvider);
		addWindowListener(new WindowListener() {

			@Override
			public void windowOpened(WindowEvent arg0) {
				// nothing to do
			}

			@Override
			public void windowIconified(WindowEvent arg0) {
				// nothing to do
			}

			@Override
			public void windowDeiconified(WindowEvent arg0) {
				// nothing to do
			}

			@Override
			public void windowDeactivated(WindowEvent arg0) {
				// nothing to do
			}

			@Override
			public void windowClosing(WindowEvent arg0) {
				mapPanel.alignStoredAndCurrentValues();
				dispose();
			}

			@Override
			public void windowClosed(WindowEvent arg0) {
				// nothing to do
			}

			@Override
			public void windowActivated(WindowEvent arg0) {
				// nothing to do
			}
		});

		JPanel translationPanel = new JPanel();
		translationPanel.setLayout(new GridBagLayout());
		GridBagConstraints constraints = new GridBagConstraints();
		constraints.gridx = 1;
		constraints.gridy = 0;
		translationPanel.add(configureButtons(mapPanel, filters), constraints);
		constraints.gridy = 1;
		constraints.fill = GridBagConstraints.BOTH;
		constraints.weightx = 0;
		constraints.weighty = 1;
		translationPanel.add(toolPanel, constraints);
		constraints.gridx = 0;
		constraints.gridy = 0;
		constraints.gridheight = 2;
		constraints.fill = GridBagConstraints.BOTH;
		constraints.weightx = 1;
		constraints.weighty = 1;
		translationPanel.add(mapPanel, constraints);

		JPanel leftPanel = new JPanel(new GridBagLayout());
		GridBagConstraints constraints2 = new GridBagConstraints();
		constraints2.gridx = 0;
		constraints2.gridy = 0;
		constraints2.fill = GridBagConstraints.HORIZONTAL;
		constraints2.weightx = 1;
		leftPanel.add(projectPanel, constraints2);
		constraints2.gridy++;
		constraints2.fill = GridBagConstraints.BOTH;
		constraints2.weighty = 1;
		leftPanel.add(listPanel, constraints2);

		final JSplitPane rootSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		rootSplit.setLeftComponent(leftPanel);
		rootSplit.setRightComponent(translationPanel);
		rootSplit.setResizeWeight(1.0 / 3);

		setLayout(new GridLayout(1, 1));
		add(rootSplit);
		setJMenuBar(menuBar);
		setTitle("Translation Editor");
		setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		ToolTipManager.sharedInstance().setDismissDelay(Integer.MAX_VALUE);

		String projectPath = Editor.config.getProperty(CONFIG_MAP_DIR, null);
		if (projectPath == null) {
			// nothing to load
		} else {
			projectPanel.setProjectPath(new File(projectPath));
		}

		pack();

		finalizeConfig(rootSplit);
	}

	private String formatTooltip(String description) {
		return "

" + description + "

"; } public Editor(ProjectLoader projectLoader, final EntryComponentFactory entryFactory) { this(projectLoader, new MapComponentFactory() { @Override public SimpleMapComponent createMapComponent(TranslationMap map) { return new SimpleMapComponent(map, entryFactory); } }); } public Editor(ProjectLoader projectLoader) { this(projectLoader, new EntryComponentFactory>() { @Override public SimpleEntryComponent createEntryComponent( TranslationEntry entry) { return new SimpleEntryComponent<>(entry); } }); } protected void updateEntryFilters(TProject project, JPanel filterComponent, final MapContentPanel mapPanel) { filterComponent.removeAll(); filterComponent.setLayout(new GridBagLayout()); final JComboBox> comboBox = new JComboBox<>(); List filterNames = new LinkedList<>(); Collection> filters = project .getEntryFilters(); for (EntryFilter filter : filters) { comboBox.addItem(new FilterAction<>(filter, mapPanel)); filterNames.add(filter.getName()); } final JButton nextButton = new JButton(new AbstractAction("Next") { @Override public void actionPerformed(ActionEvent e) { FilterAction action = (FilterAction) comboBox .getSelectedItem(); action.actionPerformed(e); } }); comboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { FilterAction filterAction = (FilterAction) comboBox .getSelectedItem(); EntryFilter filter = filterAction.getFilter(); nextButton.setToolTipText(formatTooltip(filter.getDescription())); logger.info("Select filter: " + filterAction); config.setProperty(CONFIG_FILTER, "" + filterAction); } }); String preferredFilter = config.getProperty(CONFIG_FILTER, null); if (preferredFilter == null) { comboBox.setSelectedIndex(0); } else { for (int i = 0; i < comboBox.getItemCount(); i++) { FilterAction item = comboBox.getItemAt(i); if (item.toString().equals(preferredFilter)) { comboBox.setSelectedItem(item); } else { // search for another one } } } GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 1; constraints.gridx = 0; filterComponent.add(comboBox, constraints); constraints.fill = GridBagConstraints.NONE; constraints.weightx = 0; constraints.gridx = 1; constraints.insets = new Insets(0, 10, 0, 0); filterComponent.add(nextButton, constraints); } private void configureTools(final ToolPanel toolPanel, final ToolProvider provider) { Search tool = new Search<>(); tool.setToolProvider(provider); toolPanel.addTool(tool); } private void finalizeConfig(final JSplitPane rootSplit) { setLocation(Integer.parseInt(config.getProperty(CONFIG_X, "0")), Integer.parseInt(config.getProperty(CONFIG_Y, "0"))); setSize(new Dimension(Integer.parseInt(config.getProperty(CONFIG_WIDTH, "700")), Integer.parseInt(config.getProperty(CONFIG_HEIGHT, "500")))); rootSplit.setDividerLocation(Integer.parseInt(config.getProperty( CONFIG_SPLIT, "" + (getWidth() * 4 / 10)))); rootSplit.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (event.getPropertyName().equals( JSplitPane.DIVIDER_LOCATION_PROPERTY)) { config.setProperty(CONFIG_SPLIT, "" + event.getNewValue()); } else { // do not care about other properties } } }); addComponentListener(new ComponentListener() { @Override public void componentShown(ComponentEvent arg0) { // nothing to do } @Override public void componentResized(ComponentEvent arg0) { config.setProperty(CONFIG_WIDTH, "" + getWidth()); config.setProperty(CONFIG_HEIGHT, "" + getHeight()); } @Override public void componentMoved(ComponentEvent arg0) { config.setProperty(CONFIG_X, "" + getX()); config.setProperty(CONFIG_Y, "" + getY()); } @Override public void componentHidden(ComponentEvent arg0) { // nothing to do } }); } private JPanel configureButtons(final MapContentPanel mapPanel, JPanel filters) { ActionMap actions = getRootPane().getActionMap(); InputMap inputs = getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); actions.put(ACTION_PREVIOUS_ENTRY, new AbstractAction("<") { @Override public void actionPerformed(ActionEvent arg0) { mapPanel.goToEntry(mapPanel.getCurrentEntryIndex() - 1); } }); inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.ALT_DOWN_MASK), ACTION_PREVIOUS_ENTRY); JButton previous = new JButton(actions.get(ACTION_PREVIOUS_ENTRY)); previous.setToolTipText("Go to previous entry (ALT+LEFT)."); actions.put(ACTION_NEXT_ENTRY, new AbstractAction(">") { @Override public void actionPerformed(ActionEvent arg0) { mapPanel.goToEntry(mapPanel.getCurrentEntryIndex() + 1); } }); inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.ALT_DOWN_MASK), ACTION_NEXT_ENTRY); JButton next = new JButton(actions.get(ACTION_NEXT_ENTRY)); next.setToolTipText("Go to next entry (ALT+RIGHT)."); actions.put(ACTION_FIRST_ENTRY, new AbstractAction("|<") { @Override public void actionPerformed(ActionEvent arg0) { mapPanel.goToEntry(0); } }); inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, InputEvent.ALT_DOWN_MASK), ACTION_FIRST_ENTRY); JButton first = new JButton(actions.get(ACTION_FIRST_ENTRY)); first.setToolTipText("Go to first entry (ALT+HOME)."); actions.put(ACTION_LAST_ENTRY, new AbstractAction(">|") { @Override public void actionPerformed(ActionEvent arg0) { mapPanel.goToEntry(mapPanel.getMap().size() - 1); } }); inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_END, InputEvent.ALT_DOWN_MASK), ACTION_LAST_ENTRY); JButton last = new JButton(actions.get(ACTION_LAST_ENTRY)); last.setToolTipText("Go to last entry (ALT+END)."); actions.put(ACTION_SAVE, new AbstractAction("Save") { @Override public void actionPerformed(ActionEvent arg0) { mapPanel.save(); } }); inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK), ACTION_SAVE); JButton save = new JButton(actions.get(ACTION_SAVE)); save.setToolTipText("Write the modifications to the map file (CTRL+S)."); actions.put(ACTION_RESET, new AbstractAction("Reset") { @Override public void actionPerformed(ActionEvent arg0) { mapPanel.reset(); } }); // no key binding to avoid wrong manipulation JButton reset = new JButton(actions.get(ACTION_RESET)); reset.setToolTipText("Cancel all the modifications."); JPanel buttonPanel = new JPanel(); buttonPanel.setBorder(new EtchedBorder()); buttonPanel.setLayout(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); Insets closeInsets = new Insets(5, 5, 5, 5); Insets farInsets = new Insets(20, 5, 5, 5); constraints.insets = closeInsets; constraints.weightx = 1; constraints.weighty = 1; constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 0; constraints.gridy = 0; buttonPanel.add(previous, constraints); constraints.gridx++; buttonPanel.add(next, constraints); constraints.gridx = 0; constraints.gridy++; buttonPanel.add(first, constraints); constraints.gridx++; buttonPanel.add(last, constraints); constraints.gridwidth = 2; constraints.gridx = 0; constraints.gridy++; buttonPanel.add(filters, constraints); constraints.gridx = 0; constraints.gridy++; constraints.insets = farInsets; buttonPanel.add(save, constraints); constraints.gridx = 0; constraints.gridy++; constraints.insets = closeInsets; buttonPanel.add(reset, constraints); return buttonPanel; } private MapNamer retrieveCurrentMapNamer() { Collection> namers = currentProject.getMapNamers(); if (namers.isEmpty()) { return defaultMapNamer; } else { MapNamer defaultNamer = namers.iterator().next(); String id = Editor.config.getProperty(CONFIG_MAP_NAMER, defaultNamer.getName()); for (MapNamer namer : namers) { if (namer.getName().equals(id)) { return namer; } else { // not found yet } } return defaultNamer; } } private void updateProjectMenu(final JMenu projectMenu, final MapListPanel listPanel, final TProject project) { projectMenu.removeAll(); for (final Feature feature : project.getFeatures()) { logger.fine("Adding project feature: " + feature.getName()); JMenuItem item = new JMenuItem( new AbstractAction(feature.getName()) { @Override public void actionPerformed(ActionEvent arg0) { feature.run(); } }); item.setToolTipText(formatTooltip(feature.getDescription())); projectMenu.add(item); } } private void updateListMenu(final JMenu listMenu, final MapListPanel listPanel, final TProject project) { listMenu.removeAll(); logger.fine("Adding list clear display"); final JCheckBoxMenuItem displayCleared = new JCheckBoxMenuItem(); displayCleared.setAction(new AbstractAction("Cleared") { @Override public void actionPerformed(ActionEvent arg0) { boolean isClearedDisplay = displayCleared.isSelected(); Editor.config.setProperty(CONFIG_CLEARED_DISPLAYED, "" + isClearedDisplay); listPanel.setClearedDisplayed(isClearedDisplay); } }); boolean isClearedDisplayed = Boolean.parseBoolean(Editor.config .getProperty(CONFIG_CLEARED_DISPLAYED, "true")); displayCleared.setSelected(isClearedDisplayed); displayCleared.setToolTipText("Display cleared maps."); listPanel.setClearedDisplayed(isClearedDisplayed); logger.fine("Clear display status: " + isClearedDisplayed); listMenu.add(displayCleared); JMenuItem statItem = new JMenuItem(new AbstractAction( "Remaining Filter") { @Override public void actionPerformed(ActionEvent arg0) { final RemainingFilterConfig initialConfig = retrieveRemainingFilterConfig(project); final RemainingFilterConfig config = new RemainingFilterConfig<>( initialConfig); JPanel remainingEntriesPanel = new JPanel(); remainingEntriesPanel.setLayout(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); constraints.gridy = GridBagConstraints.RELATIVE; ButtonGroup group = new ButtonGroup(); for (final EntryFilter filter : project .getEntryFilters()) { final JRadioButton selection = new JRadioButton(); final JLabel label = new JLabel(filter.getName()); selection.setAction(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { config.filter = filter; } }); selection.setSelected(initialConfig.filter.equals(filter)); constraints.gridx = 1; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 1; remainingEntriesPanel.add(label, constraints); constraints.fill = GridBagConstraints.NONE; constraints.weightx = 0; constraints.gridx = 0; group.add(selection); remainingEntriesPanel.add(selection, constraints); } JPanel message = new JPanel(); message.setLayout(new BoxLayout(message, BoxLayout.PAGE_AXIS)); JLabel comp = new JLabel( "Select the filter to use for the remaining entries:"); comp.setAlignmentX(JLabel.LEFT_ALIGNMENT); message.add(comp); remainingEntriesPanel.setAlignmentX(JLabel.LEFT_ALIGNMENT); message.add(remainingEntriesPanel); int answer = JOptionPane.showConfirmDialog(Editor.this, message, "Remaining Stats", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null); if (answer == JOptionPane.OK_OPTION && !config.equals(initialConfig)) { Editor.config.setProperty(CONFIG_REMAINING_FILTER, "" + config.filter.getName()); listPanel.setRemainingFilter(config.filter); } else { // keep current config } } }); statItem.setToolTipText(formatTooltip("Choose what to consider as a remaining entry.")); listMenu.add(statItem); statItem.setEnabled(!project.getEntryFilters().isEmpty()); listMenu.addSeparator(); MapNamer currentNamer = retrieveCurrentMapNamer(); ButtonGroup group = new ButtonGroup(); for (final MapNamer namer : project.getMapNamers()) { logger.fine("Adding list namer: " + namer.getName()); final JRadioButtonMenuItem nameItem = new JRadioButtonMenuItem( new AbstractAction(namer.getName()) { @Override public void actionPerformed(ActionEvent e) { Editor.config.setProperty(CONFIG_MAP_NAMER, namer.getName()); listPanel.requestUpdate(); } }); if (namer.equals(currentNamer)) { nameItem.setSelected(true); logger.fine("Set as current namer."); } else { // let it unselected } nameItem.setToolTipText(formatTooltip(namer.getDescription())); group.add(nameItem); listMenu.add(nameItem); } } private static class RemainingFilterConfig> { private EntryFilter filter; public RemainingFilterConfig() { } public RemainingFilterConfig(RemainingFilterConfig config) { filter = config.filter; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } else if (obj instanceof RemainingFilterConfig) { RemainingFilterConfig c = (RemainingFilterConfig) obj; return filter.equals(c.filter); } else { return false; } } @Override public int hashCode() { return filter.hashCode(); } } private RemainingFilterConfig retrieveRemainingFilterConfig( final TProject project) { final RemainingFilterConfig initialConfig = new RemainingFilterConfig<>(); String filterName = Editor.config.getProperty(CONFIG_REMAINING_FILTER, null); if (filterName == null) { if (project.getEntryFilters().isEmpty()) { throw new RuntimeException( "This dialog should not be shown if no filters are provided."); } else { filterName = project.getEntryFilters().iterator().next() .getName(); } } else { // use the one configured } for (EntryFilter filter : project.getEntryFilters()) { if (filter.getName().equals(filterName)) { initialConfig.filter = filter; } else { // continue searching } } return initialConfig; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy