You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CoreAliasDialogModel.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * Copyright (c) 2006-2014 DMDirc Developers
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to deal
  6. * in the Software without restriction, including without limitation the rights
  7. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. * copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. package com.dmdirc.ui.core.aliases;
  23. import com.dmdirc.commandparser.aliases.Alias;
  24. import com.dmdirc.commandparser.aliases.AliasFactory;
  25. import com.dmdirc.commandparser.aliases.AliasManager;
  26. import com.dmdirc.commandparser.validators.CommandNameValidator;
  27. import com.dmdirc.interfaces.CommandController;
  28. import com.dmdirc.interfaces.ui.AliasDialogModel;
  29. import com.dmdirc.interfaces.ui.AliasDialogModelListener;
  30. import com.dmdirc.util.collections.ListenerList;
  31. import com.dmdirc.util.validators.FileNameValidator;
  32. import com.dmdirc.util.validators.IntegerValidator;
  33. import com.dmdirc.util.validators.NotEmptyValidator;
  34. import com.dmdirc.util.validators.Validator;
  35. import com.dmdirc.util.validators.ValidatorChain;
  36. import com.google.common.base.Optional;
  37. import com.google.common.collect.Iterables;
  38. import java.util.Collection;
  39. import java.util.Collections;
  40. import java.util.Map;
  41. import java.util.concurrent.ConcurrentSkipListMap;
  42. import javax.inject.Inject;
  43. import static com.google.common.base.Preconditions.checkArgument;
  44. import static com.google.common.base.Preconditions.checkNotNull;
  45. public class CoreAliasDialogModel implements AliasDialogModel {
  46. private final CommandController commandController;
  47. private final AliasManager aliasManager;
  48. private final AliasFactory factory;
  49. private final ListenerList listeners;
  50. private final Map<String, Alias> aliases;
  51. private Optional<Alias> selectedAlias;
  52. private String name;
  53. private int minArgs;
  54. private String substitution;
  55. @Inject
  56. public CoreAliasDialogModel(final AliasManager aliasManager, final AliasFactory factory,
  57. final CommandController commandController) {
  58. this.commandController = commandController;
  59. this.aliasManager = aliasManager;
  60. this.factory = factory;
  61. listeners = new ListenerList();
  62. aliases = new ConcurrentSkipListMap<>();
  63. selectedAlias = Optional.absent();
  64. }
  65. @Override
  66. public void loadModel() {
  67. for (Alias alias : aliasManager.getAliases()) {
  68. aliases.put(alias.getName(), alias);
  69. listeners.getCallable(AliasDialogModelListener.class).aliasAdded(alias);
  70. }
  71. setSelectedAlias(Optional.fromNullable(Iterables.getFirst(aliasManager.getAliases(), null)));
  72. }
  73. @Override
  74. public Collection<Alias> getAliases() {
  75. return Collections.unmodifiableCollection(aliases.values());
  76. }
  77. @Override
  78. public Optional<Alias> getAlias(final String name) {
  79. checkNotNull(name, "Name cannot be null");
  80. return Optional.fromNullable(aliases.get(name));
  81. }
  82. @Override
  83. public void addAlias(final String name, final int minArguments, final String substitution) {
  84. checkNotNull(name, "Name cannot be null");
  85. checkArgument(!aliases.containsKey(name), "Name cannot already exist");
  86. final Alias alias = factory.createAlias(name, minArguments, substitution);
  87. aliases.put(name, alias);
  88. listeners.getCallable(AliasDialogModelListener.class).aliasAdded(alias);
  89. }
  90. @Override
  91. public void editAlias(final String name, final int minArguments, final String substitution) {
  92. editAlias(name, minArguments, substitution, false);
  93. }
  94. private void editAlias(final String name, final int minArguments, final String substitution,
  95. final boolean selection) {
  96. checkNotNull(name, "Name cannot be null");
  97. checkArgument(aliases.containsKey(name), "Name must already exist");
  98. final Alias newAlias = factory.createAlias(name, minArguments, substitution);
  99. final Alias oldAlias = aliases.put(name, newAlias);
  100. listeners.getCallable(AliasDialogModelListener.class).aliasEdited(oldAlias, newAlias);
  101. if (!selection) {
  102. setSelectedAlias(Optional.fromNullable(newAlias));
  103. }
  104. }
  105. @Override
  106. public void renameAlias(final String oldName, final String newName) {
  107. renameAlias(oldName, newName, false);
  108. }
  109. private void renameAlias(final String oldName, final String newName, final boolean selection) {
  110. checkNotNull(oldName, "Oldname cannot be null");
  111. checkNotNull(newName, "Newname cannot be null");
  112. checkArgument(aliases.containsKey(oldName), "Old name must exist");
  113. checkArgument(!aliases.containsKey(newName), "New name must not exist");
  114. final Alias alias = aliases.get(oldName);
  115. final Alias newAlias = factory.createAlias(newName, alias.getMinArguments(),
  116. alias.getSubstitution());
  117. final Alias oldAlias = aliases.remove(oldName);
  118. aliases.put(newName, newAlias);
  119. listeners.getCallable(AliasDialogModelListener.class).aliasRenamed(oldAlias, newAlias);
  120. if (!selection) {
  121. setSelectedAlias(Optional.fromNullable(aliases.get(newName)));
  122. }
  123. }
  124. @Override
  125. public void removeAlias(final String name) {
  126. checkNotNull(name, "Name cannot be null");
  127. if (!aliases.containsKey(name)) {
  128. return;
  129. }
  130. final Alias alias = aliases.get(name);
  131. aliases.remove(name);
  132. if (getSelectedAlias().isPresent() && getSelectedAlias().get().equals(alias)) {
  133. setSelectedAlias(Optional.<Alias>absent());
  134. }
  135. listeners.getCallable(AliasDialogModelListener.class).aliasRemoved(alias);
  136. }
  137. @Override
  138. public void save() {
  139. setSelectedAlias(Optional.<Alias>absent());
  140. for (Alias alias : aliasManager.getAliases()) {
  141. aliasManager.removeAlias(alias);
  142. }
  143. for (Alias alias : aliases.values()) {
  144. aliasManager.addAlias(alias);
  145. }
  146. }
  147. @Override
  148. public void setSelectedAlias(final Optional<Alias> alias) {
  149. if (alias.equals(selectedAlias)) {
  150. return;
  151. }
  152. if (selectedAlias.isPresent()) {
  153. if (selectedAlias.get().getMinArguments() != minArgs
  154. || !selectedAlias.get().getSubstitution().equals(substitution)) {
  155. editAlias(selectedAlias.get().getName(), minArgs, substitution, true);
  156. }
  157. if (!selectedAlias.get().getName().equals(name)) {
  158. renameAlias(selectedAlias.get().getName(), name, true);
  159. }
  160. }
  161. selectedAlias = alias;
  162. if (alias.isPresent()) {
  163. name = alias.get().getName();
  164. minArgs = alias.get().getMinArguments();
  165. substitution = alias.get().getSubstitution();
  166. } else {
  167. name = null;
  168. minArgs = -1;
  169. substitution = null;
  170. }
  171. listeners.getCallable(AliasDialogModelListener.class).aliasSelectionChanged(selectedAlias);
  172. }
  173. @Override
  174. public Optional<Alias> getSelectedAlias() {
  175. return selectedAlias;
  176. }
  177. @Override
  178. public String getSelectedAliasName() {
  179. return name;
  180. }
  181. @Override
  182. public int getSelectedAliasMinimumArguments() {
  183. return minArgs;
  184. }
  185. @Override
  186. public String getSelectedAliasSubstitution() {
  187. return substitution;
  188. }
  189. @Override
  190. public void setSelectedAliasName(final String aliasName) {
  191. this.name = aliasName;
  192. listeners.getCallable(AliasDialogModelListener.class).selectedAliasEdited(name, minArgs,
  193. substitution);
  194. }
  195. @Override
  196. public void setSelectedAliasMinimumArguments(final int minArgs) {
  197. this.minArgs = minArgs;
  198. listeners.getCallable(AliasDialogModelListener.class).selectedAliasEdited(name, minArgs,
  199. substitution);
  200. }
  201. @Override
  202. public void setSelectedAliasSubstitution(final String substitution) {
  203. this.substitution = substitution;
  204. listeners.getCallable(AliasDialogModelListener.class).selectedAliasEdited(name, minArgs,
  205. substitution);
  206. }
  207. @Override
  208. public boolean isCommandValid() {
  209. return selectedAlias.isPresent() && !getCommandValidator().validate(name).isFailure();
  210. }
  211. @Override
  212. public boolean isMinimumArgumentsValid() {
  213. return selectedAlias.isPresent() && !getMinimumArgumentsValidator().validate(minArgs).
  214. isFailure();
  215. }
  216. @Override
  217. public boolean isSubstitutionValid() {
  218. return selectedAlias.isPresent() && !getSubstitutionValidator().validate(substitution).
  219. isFailure();
  220. }
  221. @Override
  222. public boolean isSelectedAliasValid() {
  223. if (selectedAlias.isPresent()) {
  224. return isCommandValid() && isMinimumArgumentsValid() && isSubstitutionValid();
  225. } else {
  226. return true;
  227. }
  228. }
  229. @Override
  230. public boolean isChangeAliasAllowed() {
  231. if (selectedAlias.isPresent()) {
  232. return isCommandValid() && isMinimumArgumentsValid() && isSubstitutionValid();
  233. } else {
  234. return true;
  235. }
  236. }
  237. @Override
  238. public Validator<String> getCommandValidator() {
  239. return ValidatorChain.<String>builder()
  240. .addValidator(new CommandNameValidator(commandController.getCommandChar()))
  241. .addValidator(new FileNameValidator())
  242. .addValidator(new RenameAliasValidator(this))
  243. .build();
  244. }
  245. @Override
  246. public Validator<String> getNewCommandValidator() {
  247. return ValidatorChain.<String>builder()
  248. .addValidator(new CommandNameValidator(commandController.getCommandChar()))
  249. .addValidator(new FileNameValidator())
  250. .addValidator(new NewAliasValidator(this))
  251. .build();
  252. }
  253. @Override
  254. public Validator<Integer> getMinimumArgumentsValidator() {
  255. return new IntegerValidator(0, Integer.MAX_VALUE);
  256. }
  257. @Override
  258. public Validator<String> getSubstitutionValidator() {
  259. return new NotEmptyValidator();
  260. }
  261. @Override
  262. public void addListener(final AliasDialogModelListener listener) {
  263. checkNotNull(listener, "Listener must not be null");
  264. listeners.add(AliasDialogModelListener.class, listener);
  265. }
  266. @Override
  267. public void removeListener(final AliasDialogModelListener listener) {
  268. checkNotNull(listener, "Listener must not be null");
  269. listeners.remove(AliasDialogModelListener.class, listener);
  270. }
  271. }