PageRenderTime 27ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/atlassian-intellij-connector/src/main/java/com/atlassian/theplugin/idea/crucible/CrucibleSetReviewersForm.java

https://bitbucket.org/chadum/connector-idea-2.4.2-crucible
Java | 287 lines | 225 code | 32 blank | 30 comment | 34 complexity | d580d4c11482c2f24cc27825acbb8f90 MD5 | raw file
Possible License(s): BSD-3-Clause, BSD-2-Clause, Apache-2.0
  1. /**
  2. * Copyright (C) 2008 Atlassian
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.atlassian.theplugin.idea.crucible;
  17. import com.atlassian.connector.intellij.crucible.CrucibleServerFacade;
  18. import com.atlassian.connector.intellij.crucible.ReviewAdapter;
  19. import com.atlassian.theplugin.commons.crucible.api.model.Reviewer;
  20. import com.atlassian.theplugin.commons.crucible.api.model.User;
  21. import com.atlassian.theplugin.commons.exception.ServerPasswordNotProvidedException;
  22. import com.atlassian.theplugin.commons.remoteapi.RemoteApiException;
  23. import com.atlassian.theplugin.commons.remoteapi.ServerData;
  24. import com.atlassian.theplugin.crucible.model.UpdateReason;
  25. import com.atlassian.theplugin.idea.IdeaHelper;
  26. import com.atlassian.theplugin.idea.ui.DialogWithDetails;
  27. import com.intellij.openapi.project.Project;
  28. import com.intellij.openapi.ui.DialogWrapper;
  29. import com.intellij.openapi.ui.Messages;
  30. import com.intellij.uiDesigner.core.GridConstraints;
  31. import com.intellij.uiDesigner.core.GridLayoutManager;
  32. import org.jetbrains.annotations.Nullable;
  33. import javax.swing.*;
  34. import java.awt.*;
  35. import java.awt.event.KeyAdapter;
  36. import java.awt.event.KeyEvent;
  37. import java.awt.event.MouseAdapter;
  38. import java.awt.event.MouseEvent;
  39. import static java.lang.System.arraycopy;
  40. import java.util.ArrayList;
  41. import java.util.HashSet;
  42. import java.util.List;
  43. import java.util.Set;
  44. public class CrucibleSetReviewersForm extends DialogWrapper {
  45. private JPanel rootComponent;
  46. private JList reviewersList;
  47. private DefaultListModel model;
  48. private Project project;
  49. private CrucibleServerFacade crucibleServerFacade;
  50. private ReviewAdapter reviewData;
  51. private List<Reviewer> actualReviewers;
  52. public CrucibleSetReviewersForm(Project project, CrucibleServerFacade crucibleServerFacade, ReviewAdapter reviewData) {
  53. super(false);
  54. this.project = project;
  55. this.crucibleServerFacade = crucibleServerFacade;
  56. this.reviewData = reviewData;
  57. $$$setupUI$$$();
  58. init();
  59. getOKAction().putValue(Action.NAME, "Set reviewers...");
  60. reviewersList.addMouseListener(new MouseAdapter() {
  61. @Override
  62. public void mousePressed(MouseEvent e) {
  63. int index = reviewersList.locationToIndex(e.getPoint());
  64. setCheckboxState(index);
  65. }
  66. });
  67. reviewersList.addKeyListener(new KeyAdapter() {
  68. @Override
  69. public void keyPressed(KeyEvent e) {
  70. if (e.getKeyCode() == KeyEvent.VK_SPACE) {
  71. int index = reviewersList.getSelectedIndex();
  72. setCheckboxState(index);
  73. }
  74. }
  75. });
  76. fillServerRelatedCombos(reviewData.getServerData());
  77. pack();
  78. }
  79. private void setCheckboxState(int index) {
  80. if (index != -1) {
  81. UserListItem pi = (UserListItem) reviewersList.getModel().getElementAt(index);
  82. pi.setSelected(!pi.isSelected());
  83. setViewState(index, pi.isSelected());
  84. repaint();
  85. }
  86. }
  87. private void setViewState(int index, boolean newState) {
  88. int[] oldIdx = reviewersList.getSelectedIndices();
  89. int[] newIdx;
  90. if (newState) {
  91. newIdx = new int[oldIdx.length + 1];
  92. arraycopy(newIdx, 0, oldIdx, 0, oldIdx.length);
  93. newIdx[newIdx.length - 1] = index;
  94. } else {
  95. newIdx = new int[Math.max(0, oldIdx.length - 1)];
  96. int i = 0;
  97. for (int id : oldIdx) {
  98. if (id == index) {
  99. continue;
  100. }
  101. newIdx[i++] = id;
  102. }
  103. }
  104. reviewersList.setSelectedIndices(newIdx);
  105. }
  106. private void fillServerRelatedCombos(final ServerData server) {
  107. model.removeAllElements();
  108. getOKAction().setEnabled(false);
  109. new Thread(new Runnable() {
  110. public void run() {
  111. List<User> users = new ArrayList<User>();
  112. List<Reviewer> reviewers = new ArrayList<Reviewer>();
  113. try {
  114. users = crucibleServerFacade.getAllowedReviewers(server, reviewData.getProjectKey());
  115. reviewers = crucibleServerFacade.getReviewers(server, reviewData.getPermId());
  116. } catch (RemoteApiException e) {
  117. // nothing can be done here
  118. } catch (ServerPasswordNotProvidedException e) {
  119. // nothing can be done here
  120. }
  121. final List<User> finalUsers = users;
  122. final List<Reviewer> finalReviewers = reviewers;
  123. EventQueue.invokeLater(new Runnable() {
  124. public void run() {
  125. updateServerRelatedData(server, finalUsers, finalReviewers);
  126. }
  127. });
  128. }
  129. }, "atlassian-idea-plugin crucible patch upload combos refresh").start();
  130. }
  131. private void updateServerRelatedData(ServerData server, List<User> users, List<Reviewer> reviewers) {
  132. actualReviewers = reviewers;
  133. if (!users.isEmpty()) {
  134. for (User user : users) {
  135. if (!user.getUsername().equals(server.getUsername())
  136. && !user.getUsername().equals(reviewData.getAuthor().getUsername())
  137. && (reviewData.getModerator() != null &&
  138. !user.getUsername().equals(reviewData.getModerator().getUsername()))) {
  139. boolean rev = false;
  140. for (Reviewer reviewer : reviewers) {
  141. if (reviewer.getUsername().equals(user.getUsername())) {
  142. rev = true;
  143. }
  144. }
  145. model.addElement(new UserListItem(user, rev));
  146. }
  147. }
  148. }
  149. getOKAction().setEnabled(true);
  150. }
  151. @Override
  152. public JComponent getPreferredFocusedComponent() {
  153. return reviewersList;
  154. }
  155. public JComponent getRootComponent() {
  156. return rootComponent;
  157. }
  158. @Override
  159. @Nullable
  160. protected JComponent createCenterPanel() {
  161. return getRootComponent();
  162. }
  163. @Override
  164. protected void doOKAction() {
  165. Set<String> reviewersForAdd = new HashSet<String>();
  166. Set<String> reviewersForRemove = new HashSet<String>();
  167. for (int i = 0; i < model.getSize(); ++i) {
  168. UserListItem item = (UserListItem) model.get(i);
  169. String username = item.getUser().getUsername();
  170. boolean found = false;
  171. if (item.isSelected()) {
  172. for (Reviewer actualReviewer : actualReviewers) {
  173. if (username.equals(actualReviewer.getUsername())) {
  174. found = true;
  175. break;
  176. }
  177. }
  178. if (!found) {
  179. reviewersForAdd.add(username);
  180. }
  181. } else {
  182. for (Reviewer actualReviewer : actualReviewers) {
  183. if (username.equals(actualReviewer.getUsername())) {
  184. found = true;
  185. break;
  186. }
  187. }
  188. if (found) {
  189. reviewersForRemove.add(username);
  190. }
  191. }
  192. }
  193. try {
  194. if (!reviewersForAdd.isEmpty()) {
  195. crucibleServerFacade.addReviewers(reviewData.getServerData(), reviewData.getPermId(), reviewersForAdd);
  196. }
  197. if (!reviewersForRemove.isEmpty()) {
  198. for (String reviewer : reviewersForRemove) {
  199. crucibleServerFacade.removeReviewer(reviewData.getServerData(), reviewData.getPermId(), reviewer);
  200. }
  201. }
  202. // this sucks a bit, because efreshing one review should not equire refreshing all reviews.
  203. // Posted PL-1506 to fix this
  204. if (!(reviewersForAdd.isEmpty() && reviewersForRemove.isEmpty())) {
  205. final ReviewListToolWindowPanel panel = IdeaHelper.getReviewListToolWindowPanel(project);
  206. if (panel != null) {
  207. panel.refresh(UpdateReason.REFRESH);
  208. }
  209. }
  210. } catch (RemoteApiException e) {
  211. DialogWithDetails.showExceptionDialog(project,
  212. e.getMessage() + "Error creating review: " + reviewData.getServerData().getUrl(), e);
  213. // Messages.showErrorDialog(project, e.getMessage() + "Error creating review: " + reviewData.getJiraServerData().getUrl(), "");
  214. } catch (ServerPasswordNotProvidedException e) {
  215. Messages.showErrorDialog(project, e.getMessage() + "Error creating review: "
  216. + reviewData.getServerData().getUrl(), "");
  217. }
  218. super.doOKAction();
  219. }
  220. private void createUIComponents() {
  221. model = new DefaultListModel();
  222. reviewersList = new JList(model);
  223. reviewersList.setCellRenderer(new UserListCellRenderer());
  224. reviewersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  225. reviewersList.setVisibleRowCount(15);
  226. }
  227. /**
  228. * Method generated by IntelliJ IDEA GUI Designer
  229. * >>> IMPORTANT!! <<<
  230. * DO NOT edit this method OR call it in your code!
  231. *
  232. * @noinspection ALL
  233. */
  234. private void $$$setupUI$$$() {
  235. createUIComponents();
  236. rootComponent = new JPanel();
  237. rootComponent.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
  238. rootComponent.setMinimumSize(new Dimension(0, 0));
  239. final JPanel panel1 = new JPanel();
  240. panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
  241. rootComponent.add(panel1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH,
  242. GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW,
  243. GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
  244. final JScrollPane scrollPane1 = new JScrollPane();
  245. panel1.add(scrollPane1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, 1, 1,
  246. null, null, null, 0, false));
  247. scrollPane1.setViewportView(reviewersList);
  248. }
  249. /**
  250. * @noinspection ALL
  251. */
  252. public JComponent $$$getRootComponent$$$() {
  253. return rootComponent;
  254. }
  255. }