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 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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 java.util.Collection;
  38. import java.util.Collections;
  39. import java.util.Map;
  40. import java.util.concurrent.ConcurrentSkipListMap;
  41. import javax.inject.Inject;
  42. import static com.google.common.base.Preconditions.checkArgument;
  43. import static com.google.common.base.Preconditions.checkNotNull;
  44. /**
  45. * Model representing a list of aliases in a dialog.
  46. */
  47. public class CoreAliasDialogModel implements AliasDialogModel {
  48. private final CommandController commandController;
  49. private final AliasManager aliasManager;
  50. private final AliasFactory factory;
  51. private final ListenerList listeners;
  52. private final Map<String, Alias> aliases;
  53. private Optional<Alias> selectedAlias;
  54. private String name;
  55. private int minArgs;
  56. private String substitution;
  57. @Inject
  58. public CoreAliasDialogModel(final AliasManager aliasManager, final AliasFactory factory,
  59. final CommandController commandController) {
  60. this.commandController = commandController;
  61. this.aliasManager = aliasManager;
  62. this.factory = factory;
  63. listeners = new ListenerList();
  64. aliases = new ConcurrentSkipListMap<>();
  65. for (Alias alias : aliasManager.getAliases()) {
  66. aliases.put(alias.getName(), alias);
  67. }
  68. selectedAlias = Optional.absent();
  69. }
  70. @Override
  71. public Collection<Alias> getAliases() {
  72. return Collections.unmodifiableCollection(aliases.values());
  73. }
  74. @Override
  75. public Optional<Alias> getAlias(final String name) {
  76. checkNotNull(name, "Name cannot be null");
  77. return Optional.fromNullable(aliases.get(name));
  78. }
  79. @Override
  80. public void addAlias(final String name, final int minArguments, final String substitution) {
  81. checkNotNull(name, "Name cannot be null");
  82. checkArgument(!aliases.containsKey(name), "Name cannot already exist");
  83. final Alias alias = factory.createAlias(name, minArguments, substitution);
  84. aliases.put(name, alias);
  85. listeners.getCallable(AliasDialogModelListener.class).aliasAdded(alias);
  86. }
  87. @Override
  88. public void editAlias(final String name, final int minArguments, final String substitution) {
  89. checkNotNull(name, "Name cannot be null");
  90. checkArgument(aliases.containsKey(name), "Name must already exist");
  91. final Alias newAlias = factory.createAlias(name, minArguments, substitution);
  92. final Alias oldAlias = aliases.put(name, newAlias);
  93. listeners.getCallable(AliasDialogModelListener.class).aliasEdited(oldAlias, newAlias);
  94. }
  95. @Override
  96. public void renameAlias(final String oldName, final String newName) {
  97. renameAlias(oldName, newName, false);
  98. }
  99. public void renameAlias(final String oldName, final String newName, final boolean selection) {
  100. checkNotNull(oldName, "Oldname cannot be null");
  101. checkNotNull(newName, "Newname cannot be null");
  102. checkArgument(aliases.containsKey(oldName), "Old name must exist");
  103. checkArgument(!aliases.containsKey(newName), "New name must not exist");
  104. final Alias alias = aliases.get(oldName);
  105. final Alias newAlias = factory.createAlias(newName, alias.getMinArguments(),
  106. alias.getSubstitution());
  107. final Alias oldAlias = aliases.remove(oldName);
  108. aliases.put(newName, newAlias);
  109. if (!selection) {
  110. setSelectedAlias(Optional.fromNullable(aliases.get(newName)));
  111. }
  112. listeners.getCallable(AliasDialogModelListener.class).aliasRenamed(oldAlias, newAlias);
  113. }
  114. @Override
  115. public void removeAlias(final String name) {
  116. checkNotNull(name, "Name cannot be null");
  117. if (!aliases.containsKey(name)) {
  118. return;
  119. }
  120. final Alias alias = aliases.get(name);
  121. aliases.remove(name);
  122. if (getSelectedAlias().isPresent() && getSelectedAlias().get().equals(alias)) {
  123. setSelectedAlias(Optional.<Alias>absent());
  124. }
  125. listeners.getCallable(AliasDialogModelListener.class).aliasRemoved(alias);
  126. }
  127. @Override
  128. public void save() {
  129. setSelectedAlias(Optional.<Alias>absent());
  130. for (Alias alias : aliasManager.getAliases()) {
  131. aliasManager.removeAlias(alias);
  132. }
  133. for (Alias alias : aliases.values()) {
  134. aliasManager.addAlias(alias);
  135. }
  136. }
  137. @Override
  138. public void setSelectedAlias(final Optional<Alias> alias) {
  139. if (selectedAlias.isPresent()) {
  140. if (selectedAlias.get().getMinArguments() != minArgs
  141. || !selectedAlias.get().getSubstitution().equals(substitution)) {
  142. editAlias(selectedAlias.get().getName(), minArgs, substitution);
  143. }
  144. if (!selectedAlias.get().getName().equals(name)) {
  145. renameAlias(selectedAlias.get().getName(), name, true);
  146. }
  147. }
  148. selectedAlias = alias;
  149. if (alias.isPresent()) {
  150. name = alias.get().getName();
  151. minArgs = alias.get().getMinArguments();
  152. substitution = alias.get().getSubstitution();
  153. } else {
  154. name = null;
  155. minArgs = -1;
  156. substitution = null;
  157. }
  158. listeners.getCallable(AliasDialogModelListener.class).aliasSelectionChanged(selectedAlias);
  159. }
  160. @Override
  161. public Optional<Alias> getSelectedAlias() {
  162. return selectedAlias;
  163. }
  164. @Override
  165. public String getSelectedAliasName() {
  166. return name;
  167. }
  168. @Override
  169. public int getSelectedAliasMininumArguments() {
  170. return minArgs;
  171. }
  172. @Override
  173. public String getSelectedAliasSubstitution() {
  174. return substitution;
  175. }
  176. @Override
  177. public void setSelectedAliasName(final String aliasName) {
  178. this.name = aliasName;
  179. listeners.getCallable(AliasDialogModelListener.class).selectedAliasEdited(name, minArgs,
  180. substitution);
  181. }
  182. @Override
  183. public void setSelectedAliasMinimumArguments(final int minArgs) {
  184. this.minArgs = minArgs;
  185. listeners.getCallable(AliasDialogModelListener.class).selectedAliasEdited(name, minArgs,
  186. substitution);
  187. }
  188. @Override
  189. public void setSelectedAliasSubstitution(final String substitution) {
  190. this.substitution = substitution;
  191. listeners.getCallable(AliasDialogModelListener.class).selectedAliasEdited(name, minArgs,
  192. substitution);
  193. }
  194. @Override
  195. public boolean isCommandValid() {
  196. return selectedAlias.isPresent() && !getCommandValidator().validate(name).isFailure();
  197. }
  198. @Override
  199. public boolean isMinimumArgumentsValid() {
  200. return selectedAlias.isPresent() && !getMinimumArgumentsValidator().validate(minArgs).
  201. isFailure();
  202. }
  203. @Override
  204. public boolean isSubstitutionValid() {
  205. return selectedAlias.isPresent() && !getSubstitutionValidator().validate(substitution).
  206. isFailure();
  207. }
  208. @Override
  209. public boolean isSelectedAliasValid() {
  210. return selectedAlias.isPresent() && isCommandValid() && isMinimumArgumentsValid()
  211. && isSubstitutionValid();
  212. }
  213. @Override
  214. public Validator<String> getCommandValidator() {
  215. return ValidatorChain.<String>builder()
  216. .addValidator(new CommandNameValidator(commandController.getCommandChar()))
  217. .addValidator(new FileNameValidator())
  218. .addValidator(new RenameAliasValidator(this))
  219. .build();
  220. }
  221. @Override
  222. public Validator<String> getNewCommandValidator() {
  223. return ValidatorChain.<String>builder()
  224. .addValidator(new CommandNameValidator(commandController.getCommandChar()))
  225. .addValidator(new FileNameValidator())
  226. .addValidator(new NewAliasValidator(this))
  227. .build();
  228. }
  229. @Override
  230. public Validator<Integer> getMinimumArgumentsValidator() {
  231. return new IntegerValidator(0, Integer.MAX_VALUE);
  232. }
  233. @Override
  234. public Validator<String> getSubstitutionValidator() {
  235. return new NotEmptyValidator();
  236. }
  237. @Override
  238. public void addListener(final AliasDialogModelListener listener) {
  239. checkNotNull(listener, "Listener must not be null");
  240. listeners.add(AliasDialogModelListener.class, listener);
  241. }
  242. @Override
  243. public void removeListener(final AliasDialogModelListener listener) {
  244. checkNotNull(listener, "Listener must not be null");
  245. listeners.remove(AliasDialogModelListener.class, listener);
  246. }
  247. }