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.

AliasManagerLinker.java 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright (c) 2006-2015 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.addons.ui_swing.dialogs.aliases;
  23. import com.dmdirc.addons.ui_swing.UIUtilities;
  24. import com.dmdirc.addons.ui_swing.components.ConsumerDocumentListener;
  25. import com.dmdirc.addons.ui_swing.components.GenericListModel;
  26. import com.dmdirc.addons.ui_swing.components.renderers.PropertyListCellRenderer;
  27. import com.dmdirc.addons.ui_swing.components.vetoable.VetoableListSelectionModel;
  28. import com.dmdirc.addons.ui_swing.dialogs.StandardInputDialog;
  29. import com.dmdirc.commandparser.aliases.Alias;
  30. import com.dmdirc.interfaces.ui.AliasDialogModel;
  31. import com.dmdirc.interfaces.ui.AliasDialogModelListener;
  32. import com.dmdirc.addons.ui_swing.components.IconManager;
  33. import java.awt.Dialog;
  34. import java.beans.PropertyVetoException;
  35. import java.util.Optional;
  36. import javax.swing.JButton;
  37. import javax.swing.JList;
  38. import javax.swing.JScrollPane;
  39. import javax.swing.JSpinner;
  40. import javax.swing.JTextArea;
  41. import javax.swing.JTextField;
  42. import javax.swing.SpinnerNumberModel;
  43. /**
  44. * Links the Alias Manager Dialog with its controller and model.
  45. */
  46. public class AliasManagerLinker implements AliasDialogModelListener {
  47. private final AliasDialogModel model;
  48. private final AliasManagerDialog dialog;
  49. private final IconManager iconManager;
  50. private GenericListModel<Alias> commandModel;
  51. private VetoableListSelectionModel selectionModel;
  52. private JList<Alias> commandList;
  53. private JScrollPane responseScroll;
  54. private JTextArea response;
  55. private JTextField command;
  56. private JButton okButton;
  57. private JButton deleteAlias;
  58. private JSpinner argumentsNumber;
  59. public AliasManagerLinker(
  60. final AliasDialogModel model,
  61. final AliasManagerDialog dialog,
  62. final IconManager iconManager) {
  63. this.model = model;
  64. this.dialog = dialog;
  65. this.iconManager = iconManager;
  66. }
  67. public void init() {
  68. model.addListener(this);
  69. }
  70. public void bindCommandList(final JList<Alias> commandList) {
  71. this.commandList = commandList;
  72. commandModel = new GenericListModel<>();
  73. selectionModel = new VetoableListSelectionModel();
  74. commandList.setCellRenderer(new PropertyListCellRenderer<>(commandList.getCellRenderer(),
  75. Alias.class, "name"));
  76. commandList.setModel(commandModel);
  77. commandList.setSelectionModel(selectionModel);
  78. commandList.getSelectionModel().addListSelectionListener(e -> {
  79. if (e.getValueIsAdjusting()) {
  80. return;
  81. }
  82. final int index = commandList.getSelectedIndex();
  83. if (index == -1 || commandModel.getSize() == 0) {
  84. model.setSelectedAlias(Optional.<Alias>empty());
  85. } else if (index >= commandModel.getSize()) {
  86. model.setSelectedAlias(Optional.ofNullable(commandModel.
  87. getElementAt(index - 1)));
  88. } else {
  89. model.setSelectedAlias(Optional.ofNullable(commandModel.getElementAt(index)));
  90. }
  91. });
  92. selectionModel.addVetoableSelectionListener(evt -> {
  93. if (!model.isChangeAliasAllowed()) {
  94. throw new PropertyVetoException("Currently selected alias is invalid.", evt);
  95. }
  96. });
  97. }
  98. public void bindCommand(final JTextField command) {
  99. this.command = command;
  100. command.setEnabled(false);
  101. command.getDocument().addDocumentListener(
  102. new ConsumerDocumentListener(model::setSelectedAliasName));
  103. }
  104. public void bindArgumentsNumber(final JSpinner argumentsNumber) {
  105. this.argumentsNumber = argumentsNumber;
  106. argumentsNumber.setEnabled(false);
  107. argumentsNumber.setModel(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1));
  108. argumentsNumber.addChangeListener(
  109. e -> model.setSelectedAliasMinimumArguments((Integer) argumentsNumber.getValue()));
  110. }
  111. public void bindResponse(final JTextArea response, final JScrollPane responseScroll) {
  112. this.response = response;
  113. this.responseScroll = responseScroll;
  114. response.setEnabled(false);
  115. response.getDocument().addDocumentListener(
  116. new ConsumerDocumentListener(model::setSelectedAliasSubstitution));
  117. }
  118. public void bindAddAlias(final JButton addAlias) {
  119. addAlias.addActionListener(e -> new StandardInputDialog(dialog,
  120. Dialog.ModalityType.DOCUMENT_MODAL, iconManager,
  121. "Add Alias", "Enter the alias name", model.getNewCommandValidator(),
  122. (String s) -> model.addAlias(s, 0, s)).display());
  123. }
  124. public void bindDeleteAlias(final JButton deleteAlias) {
  125. this.deleteAlias = deleteAlias;
  126. deleteAlias.setEnabled(false);
  127. deleteAlias.addActionListener(e -> {
  128. final Optional<Alias> alias = model.getSelectedAlias();
  129. alias.ifPresent(alias1 -> model.removeAlias(alias1.getName()));
  130. });
  131. }
  132. public void bindOKButton(final JButton okButton) {
  133. this.okButton = okButton;
  134. okButton.addActionListener(e -> {
  135. model.save();
  136. dialog.dispose();
  137. });
  138. }
  139. public void bindCancelButton(final JButton cancelButton) {
  140. cancelButton.setEnabled(true);
  141. cancelButton.addActionListener(e -> dialog.dispose());
  142. }
  143. @Override
  144. public void aliasAdded(final Alias alias) {
  145. commandModel.add(alias);
  146. commandList.getSelectionModel().setSelectionInterval(
  147. commandModel.indexOf(alias), commandModel.indexOf(alias));
  148. }
  149. @Override
  150. public void aliasRemoved(final Alias alias) {
  151. final int index = commandModel.indexOf(alias);
  152. commandModel.remove(alias);
  153. if (index >= commandModel.getSize()) {
  154. model.setSelectedAlias(Optional.ofNullable(
  155. commandModel.getElementAt(commandModel.getSize())));
  156. } else if (index == -1 && !commandModel.isEmpty()) {
  157. model.setSelectedAlias(Optional.ofNullable(commandModel.get(0)));
  158. } else {
  159. model.setSelectedAlias(Optional.ofNullable(commandModel.get(index)));
  160. }
  161. }
  162. @Override
  163. public void aliasEdited(final Alias oldAlias, final Alias newAlias) {
  164. commandModel.replace(oldAlias, newAlias);
  165. }
  166. @Override
  167. public void aliasRenamed(final Alias oldAlias, final Alias newAlias) {
  168. commandModel.replace(oldAlias, newAlias);
  169. }
  170. @Override
  171. public void aliasSelectionChanged(final Optional<Alias> alias) {
  172. deleteAlias.setEnabled(model.getSelectedAlias().isPresent());
  173. argumentsNumber.setEnabled(model.isMinimumArgumentsValid());
  174. argumentsNumber.setValue(model.getSelectedAliasMinimumArguments());
  175. command.setEnabled(model.isCommandValid());
  176. command.setText(model.getSelectedAliasName());
  177. final int index;
  178. index = alias.map(alias1 -> commandModel.indexOf(alias1)).orElseGet(() -> -1);
  179. if (index != selectionModel.getLeadSelectionIndex()) {
  180. selectionModel.setLeadSelectionIndex(index);
  181. }
  182. response.setEnabled(model.isSubstitutionValid());
  183. response.setText(model.getSelectedAliasSubstitution());
  184. UIUtilities.resetScrollPane(responseScroll);
  185. }
  186. @Override
  187. public void selectedAliasEdited(final String name, final int minArguments,
  188. final String substitution) {
  189. okButton.setEnabled(model.isSelectedAliasValid());
  190. }
  191. }