Gridarta Editor
DefaultFilterControl.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.gui.filter;
21 
22 import javax.swing.JMenu;
23 import javax.swing.JMenuItem;
39 import net.sf.japi.swing.action.ActionBuilder;
40 import net.sf.japi.swing.action.ActionBuilderFactory;
41 import org.apache.log4j.Category;
42 import org.apache.log4j.Logger;
43 import org.jetbrains.annotations.NotNull;
44 import org.jetbrains.annotations.Nullable;
45 
62 //TODO allow implementation of own filter
63 public class DefaultFilterControl<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements FilterControl<G, A, R> {
64 
68  @NotNull
69  private static final Category LOG = Logger.getLogger(DefaultFilterControl.class);
70 
74  @NotNull
75  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
76 
77  @NotNull
78  private final NamedFilter filterList;
79 
80  @NotNull
82 
86  @NotNull
88 
89  @NotNull
91 
95  @NotNull
97 
98  @NotNull
100 
101  @Override
102  public void configChanged(@NotNull final FilterConfigChangeType filterConfigChangeType, @NotNull final FilterConfig<?, ?> filterConfig) {
103  @Nullable final EditorSettingsKey key;
104  @Nullable final FilterConfig<?, ?> valueFilterConfig;
105  if (isFilterConfig(filterConfig, filterOutConfig)) {
107  valueFilterConfig = filterOutConfig;
108  } else if (isFilterConfig(filterConfig, highlightConfig[0])) {
110  valueFilterConfig = highlightConfig[0];
111  } else if (isFilterConfig(filterConfig, highlightConfig[1])) {
113  valueFilterConfig = highlightConfig[1];
114  } else if (isFilterConfig(filterConfig, highlightConfig[2])) {
116  valueFilterConfig = highlightConfig[2];
117  } else {
118  LOG.warn("filter config " + filterConfig + " not found");
119  key = null;
120  valueFilterConfig = null;
121  }
122  if (key != null && valueFilterConfig != null) {
123  editorSettings.setKey(key, new FilterConfigEncoder().encode(valueFilterConfig));
124  }
125  for (final FilterConfigListener listener : configListeners.getListeners()) {
126  listener.configChanged(filterConfigChangeType, filterConfig);
127  }
128  }
129 
130  };
131 
138  public DefaultFilterControl(@NotNull final NamedFilter filterList, @NotNull final EditorSettings editorSettings) {
139  this.filterList = filterList;
140  filterOutConfig = filterList.createConfig();
141  this.editorSettings = editorSettings;
142  highlightConfig = new NamedFilterConfig[MAX_HIGHLIGHT];
143  for (int i = 0; i < MAX_HIGHLIGHT; i++) {
144  highlightConfig[i] = filterList.createConfig();
145  }
146  filterOutConfig.addConfigChangeListener(filterConfigListener);
147  for (int i = 0; i < MAX_HIGHLIGHT; i++) {
148  highlightConfig[i].addConfigChangeListener(filterConfigListener);
149  }
150 
151  final FilterConfigDecoder decoder = new FilterConfigDecoder();
152  decoder.decode(editorSettings.getKey(EditorSettingsKey.ANALYZE_FILTER_OUT, ""), filterOutConfig);
153  decoder.decode(editorSettings.getKey(EditorSettingsKey.ANALYZE_HIGHLIGHT0, ""), highlightConfig[0]);
154  decoder.decode(editorSettings.getKey(EditorSettingsKey.ANALYZE_HIGHLIGHT1, ""), highlightConfig[1]);
155  decoder.decode(editorSettings.getKey(EditorSettingsKey.ANALYZE_HIGHLIGHT2, ""), highlightConfig[2]);
156  }
157 
158  @Override
159  public void addConfigListener(@NotNull final FilterConfigListener listener) {
160  configListeners.add(listener);
161  }
162 
163  @Override
164  public void removeConfigListener(@NotNull final FilterConfigListener listener) {
165  configListeners.remove(listener);
166  }
167 
168  @Override
169  public void createMenuEntries(@NotNull final JMenu menu) {
170  final JMenuItem menuItem = new MenuItemCreator(filterOutConfig).getMenuItem();
171  menuItem.setText(ActionBuilderUtils.getString(ACTION_BUILDER, "filterView.text"));
172  menu.add(menuItem);
173  menu.addSeparator();
174  for (int i = 0; i < MAX_HIGHLIGHT; i++) {
175  final JMenuItem menuItem2 = new MenuItemCreator(highlightConfig[i]).getMenuItem();
176  menuItem2.setText(ActionBuilderUtils.format(ACTION_BUILDER, "filterViewHighlight.text", i));
177  menu.add(menuItem2);
178  }
179  }
180 
181  @Override
182  public void newSquare(@NotNull final FilterState filterState) {
183  for (int i = 0; i < MAX_HIGHLIGHT; i++) {
184  if (highlightConfig[i].isEnabled()) {
185  filterList.reset(highlightConfig[i]);
186  }
187  }
188  filterState.reset();
189  }
190 
191  @Override
192  public boolean isHighlightedSquare(@NotNull final FilterState filterState, final int path) {
193  return highlightConfig[path].isEnabled() && filterState.isHighlightedSquare(path);
194  }
195 
196  @Override
197  public void objectInSquare(@NotNull final FilterState filterState, @NotNull final G gameObject) {
198  for (int i = 0; i < MAX_HIGHLIGHT; i++) {
199  if (highlightConfig[i].isEnabled()) {
200  if (!filterState.isHighlightedSquare(i)) {
201  filterState.setHighlightedSquare(i, filterList.match(highlightConfig[i], gameObject));
202  }
203  }
204  }
205  }
206 
207  @Override
208  public boolean canShow(@NotNull final G gameObject) {
209  return !filterOutConfig.isEnabled() || filterList.canShow(gameObject, filterOutConfig);
210  }
211 
212  @Override
213  public void addFilter(@NotNull final String name, @NotNull final Filter<?, ?> filter) {
214  filterList.addFilter(name, filter);
215  }
216 
217  @Override
218  public void removeFilter(@NotNull final String name) {
219  filterList.removeFilter(name);
220  }
221 
229  private static boolean isFilterConfig(@NotNull final FilterConfig<?, ?> filterConfig, @NotNull final NamedFilterConfig expectedFilterConfig) {
230  if (filterConfig == expectedFilterConfig) {
231  return true;
232  }
233  for (final FilterConfig<?, ?> subFilterConfig : expectedFilterConfig.getEntries().values()) {
234  if (filterConfig == subFilterConfig) {
235  return true;
236  }
237  }
238  return false;
239  }
240 
241 }
A Filter that aggregates named filters.
final EventListenerList2< FilterConfigListener > configListeners
The FilterConfigListeners to notify.
T [] getListeners()
Returns an array of all the listeners.
Interface for Filters.
Definition: Filter.java:33
final EditorSettings editorSettings
The global EditorSettings instance.
void removeFilter(@NotNull final String name)
Removes a sub-filter.
boolean reset(@NotNull final NamedFilterConfig config)
boolean decode(@NotNull final String string, @NotNull final FilterConfig<?, ?> filterConfig)
Import the filter configuration settings.
void objectInSquare(@NotNull final FilterState filterState, @NotNull final G gameObject)
boolean canShow(@NotNull final G gameObject)
void addFilter(@NotNull final String name, @NotNull final Filter<?, ?> filter)
Adds a sub-Filter.
static boolean isFilterConfig(@NotNull final FilterConfig<?, ?> filterConfig, @NotNull final NamedFilterConfig expectedFilterConfig)
Returns whether a given FilterConfig is part another filter config.
void removeConfigListener(@NotNull final FilterConfigListener listener)
void addConfigChangeListener(@NotNull final FilterConfigListener listener)
Converts FilterConfig into string representation.
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Returns the value of a key.
Base package of all Gridarta classes.
Creates menu items for net.sf.gridarta.model.filter.Filter instances.
Reflects a game object (object on a map).
Definition: GameObject.java:36
boolean match(@NotNull final NamedFilterConfig config, @NotNull final GameObject<?, ?, ?> gameObject)
boolean isHighlightedSquare(@NotNull final FilterState filterState, final int path)
void remove(@NotNull final T listener)
Removes a listener.
static final Category LOG
The Logger for printing log messages.
GameObjects are the objects based on Archetypes found on maps.
ANALYZE_HIGHLIGHT1
The key for saving the menu state "Analyze|Highlight 0".
void add(@NotNull final T listener)
Adds a listener.
void newSquare(@NotNull final FilterState filterState)
ANALYZE_FILTER_OUT
The key for saving the menu state "Analyze|Highlight 2".
Utility class for ActionBuilder related functions.
Type-safe version of EventListenerList.
void addFilter(@NotNull final String name, @NotNull final Filter<?, ?> filter)
JMenuItem getMenuItem()
Returns the menu item.
ANALYZE_HIGHLIGHT2
The key for saving the menu state "Analyze|Highlight 1".
ANALYZE_HIGHLIGHT0
The key for saving the menu state "Analyze|Filter view".
DefaultFilterControl(@NotNull final NamedFilter filterList, @NotNull final EditorSettings editorSettings)
Create a new FilterControl.
Possible keys for saving values in the EditorSettings.
void addConfigListener(@NotNull final FilterConfigListener listener)
boolean canShow(@NotNull final GameObject<?, ?, ?> gameObject, @NotNull final NamedFilterConfig filterOutConfig)
Returns whether this filter matches a GameObject.
void setKey(@NotNull EditorSettingsKey key, @NotNull String value)
Saves a settings value.
static String format(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final Object... args)
Returns the value of a key.
Settings that apply to the editor.
static final ActionBuilder ACTION_BUILDER
The action builder.
Converts a string into a FilterConfig.
Interface for filter configurations.
Interface for listeners interested in FilterConfig related changes.
The highlighted state while using a FilterControl instance.