PageRenderTime 34ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/suafe/src/main/java/org/xiaoniu/suafe/dialogs/AddRemoveMembersDialog.java

http://suafe.googlecode.com/
Java | 626 lines | 356 code | 100 blank | 170 comment | 72 complexity | 960aa5c54942110fde02c57a13131d63 MD5 | raw file
  1. /**
  2. * @copyright
  3. * ====================================================================
  4. * Copyright (c) 2006 Xiaoniu.org. All rights reserved.
  5. *
  6. * This software is licensed as described in the file LICENSE, which
  7. * you should have received as part of this distribution. The terms
  8. * are also available at http://code.google.com/p/suafe/.
  9. * If newer versions of this license are posted there, you may use a
  10. * newer version instead, at your option.
  11. *
  12. * This software consists of voluntary contributions made by many
  13. * individuals. For exact contribution history, see the revision
  14. * history and logs, available at http://code.google.com/p/suafe/.
  15. * ====================================================================
  16. * @endcopyright
  17. */
  18. package org.xiaoniu.suafe.dialogs;
  19. import java.awt.BorderLayout;
  20. import java.awt.Dimension;
  21. import java.awt.FlowLayout;
  22. import java.awt.GridLayout;
  23. import java.awt.event.ActionEvent;
  24. import java.awt.event.ActionListener;
  25. import java.awt.event.KeyEvent;
  26. import java.awt.event.KeyListener;
  27. import java.awt.event.MouseEvent;
  28. import java.awt.event.MouseListener;
  29. import java.util.Arrays;
  30. import java.util.Collections;
  31. import java.util.List;
  32. import java.util.Vector;
  33. import javax.swing.BoxLayout;
  34. import javax.swing.JButton;
  35. import javax.swing.JLabel;
  36. import javax.swing.JList;
  37. import javax.swing.JPanel;
  38. import javax.swing.JScrollPane;
  39. import javax.swing.WindowConstants;
  40. import org.xiaoniu.suafe.ActionConstants;
  41. import org.xiaoniu.suafe.UserPreferences;
  42. import org.xiaoniu.suafe.beans.Document;
  43. import org.xiaoniu.suafe.beans.Group;
  44. import org.xiaoniu.suafe.beans.GroupMemberObject;
  45. import org.xiaoniu.suafe.beans.Message;
  46. import org.xiaoniu.suafe.beans.User;
  47. import org.xiaoniu.suafe.exceptions.AppException;
  48. import org.xiaoniu.suafe.renderers.MyListCellRenderer;
  49. import org.xiaoniu.suafe.resources.ResourceUtil;
  50. /**
  51. * Dialog that allows a user to add/remove members of a group.
  52. *
  53. * @author Shaun Johnson
  54. */
  55. public final class AddRemoveMembersDialog extends ParentDialog implements ActionListener, KeyListener, MouseListener {
  56. /**
  57. * Serial ID.
  58. */
  59. private static final long serialVersionUID = 2808087711449246371L;
  60. private JPanel actionPanel = null;
  61. private JPanel actionSubPanel = null;
  62. private JButton assignGroupButton = null;
  63. private JPanel buttonPanel = null;
  64. private JButton cancelButton = null;
  65. private Document document = null;
  66. private JPanel formPanel = null;
  67. private Group group = null;
  68. private Vector<Group> groupMembers = null;
  69. private Vector<Group> groupNonMembers = null;
  70. private JPanel jContentPane = null;
  71. private JList memberList = null;
  72. private JScrollPane memberListScrollPane = null;
  73. private JPanel memberPanel = null;
  74. private Vector<GroupMemberObject> members = null;
  75. private Message message = null;
  76. private JList nonMemberList = null;
  77. private JScrollPane nonMemberListScrollPane = null;
  78. private JPanel nonMemberPanel = null;
  79. private Vector<GroupMemberObject> nonMembers = null;
  80. private JButton saveButton = null;
  81. private JButton unassignGroupButton = null;
  82. private Vector<User> userMembers = null;
  83. private Vector<User> userNonMembers = null;
  84. /**
  85. * Default constructor.
  86. */
  87. public AddRemoveMembersDialog(Document document, Group group, Message message) {
  88. super();
  89. this.document = document;
  90. this.message = message;
  91. this.message.setState(Message.CANCEL);
  92. this.group = group;
  93. initialize();
  94. }
  95. /**
  96. * ActionPerformed event handler
  97. *
  98. * @param event ActionEvent object.
  99. */
  100. public void actionPerformed(ActionEvent event) {
  101. if (event.getActionCommand().equals(ActionConstants.ASSIGN_ACTION)) {
  102. assignMembers();
  103. }
  104. else if (event.getActionCommand().equals(ActionConstants.UNASSIGN_ACTION)) {
  105. unassignMembers();
  106. }
  107. else if (event.getActionCommand().equals(ActionConstants.SAVE_ACTION)) {
  108. try {
  109. document.changeGroupMembers(group, groupMembers, userMembers);
  110. message.setUserObject(group);
  111. message.setState(Message.SUCCESS);
  112. dispose();
  113. }
  114. catch (Exception ex) {
  115. displayError(ex.getMessage());
  116. }
  117. }
  118. else if (event.getActionCommand().equals(ActionConstants.CANCEL_ACTION)) {
  119. message.setState(Message.CANCEL);
  120. dispose();
  121. }
  122. }
  123. /**
  124. * Assigns selected members.
  125. */
  126. private void assignMembers() {
  127. if (!getNonMemberList().isSelectionEmpty()) {
  128. List<Object> values = Arrays.asList(getNonMemberList().getSelectedValues());
  129. for (Object object : values) {
  130. if (object instanceof Group) {
  131. groupMembers.add((Group) object);
  132. groupNonMembers.remove(object);
  133. }
  134. if (object instanceof User) {
  135. userMembers.add((User) object);
  136. userNonMembers.remove(object);
  137. }
  138. }
  139. refreshLists();
  140. }
  141. }
  142. /**
  143. * This method initializes actionPanel.
  144. *
  145. * @return javax.swing.JPanel
  146. */
  147. private JPanel getActionPanel() {
  148. if (actionPanel == null) {
  149. actionPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 15));
  150. actionPanel.add(getActionSubPanel());
  151. }
  152. return actionPanel;
  153. }
  154. /**
  155. * This method initializes actionSubPanel.
  156. *
  157. * @return javax.swing.JPanel
  158. */
  159. private JPanel getActionSubPanel() {
  160. if (actionSubPanel == null) {
  161. actionSubPanel = new JPanel(new GridLayout(2, 1));
  162. actionSubPanel.add(getAssignGroupButton());
  163. actionSubPanel.add(getUnassignGroupButton());
  164. }
  165. return actionSubPanel;
  166. }
  167. /**
  168. * This method initializes assignGroupButton.
  169. *
  170. * @return javax.swing.JButton
  171. */
  172. private JButton getAssignGroupButton() {
  173. if (assignGroupButton == null) {
  174. assignGroupButton = new JButton();
  175. assignGroupButton.addActionListener(this);
  176. assignGroupButton.setActionCommand(ActionConstants.ASSIGN_ACTION);
  177. assignGroupButton.setIcon(ResourceUtil.assignIcon);
  178. }
  179. return assignGroupButton;
  180. }
  181. /**
  182. * This method initializes buttonPanel.
  183. *
  184. * @return javax.swing.JPanel
  185. */
  186. private JPanel getButtonPanel() {
  187. if (buttonPanel == null) {
  188. buttonPanel = new JPanel();
  189. buttonPanel.add(getSaveButton());
  190. buttonPanel.add(getCancelButton());
  191. }
  192. return buttonPanel;
  193. }
  194. /**
  195. * This method initializes cancelButton.
  196. *
  197. * @return javax.swing.JButton
  198. */
  199. private JButton getCancelButton() {
  200. if (cancelButton == null) {
  201. cancelButton = createButton("button.cancel", ActionConstants.CANCEL_ACTION, this);
  202. }
  203. return cancelButton;
  204. }
  205. /**
  206. * This method initializes formPanel.
  207. *
  208. * @return javax.swing.JPanel
  209. */
  210. private JPanel getFormPanel() {
  211. if (formPanel == null) {
  212. formPanel = new JPanel();
  213. formPanel.setLayout(new BoxLayout(formPanel, BoxLayout.X_AXIS));
  214. formPanel.add(getNonMemberPanel());
  215. formPanel.add(getActionPanel());
  216. formPanel.add(getMemberPanel());
  217. }
  218. return formPanel;
  219. }
  220. /**
  221. * This method initializes jContentPane
  222. *
  223. * @return javax.swing.JPanel
  224. */
  225. private JPanel getJContentPane() {
  226. if (jContentPane == null) {
  227. jContentPane = new JPanel(new BorderLayout());
  228. jContentPane
  229. .add(getInstructionsPanel("addremovemembers.instructions", group.getName()), BorderLayout.NORTH);
  230. jContentPane.add(getFormPanel(), BorderLayout.CENTER);
  231. jContentPane.add(getButtonPanel(), BorderLayout.SOUTH);
  232. }
  233. return jContentPane;
  234. }
  235. /**
  236. * This method initializes memberList.
  237. *
  238. * @return javax.swing.JList
  239. */
  240. private JList getMemberList() {
  241. if (memberList == null) {
  242. memberList = new JList(members);
  243. memberList.addKeyListener(this);
  244. memberList.addMouseListener(this);
  245. memberList.setCellRenderer(new MyListCellRenderer());
  246. memberList.setFont(UserPreferences.getUserFont());
  247. }
  248. return memberList;
  249. }
  250. /**
  251. * This method initializes memberListScrollPane.
  252. *
  253. * @return javax.swing.JScrollPane
  254. */
  255. private JScrollPane getMemberListScrollPane() {
  256. if (memberListScrollPane == null) {
  257. memberListScrollPane = new JScrollPane(getMemberList());
  258. }
  259. return memberListScrollPane;
  260. }
  261. /**
  262. * This method initializes memberPanel.
  263. *
  264. * @return javax.swing.JPanel
  265. */
  266. private JPanel getMemberPanel() {
  267. if (memberPanel == null) {
  268. memberPanel = new JPanel(new BorderLayout());
  269. memberPanel.setPreferredSize(new Dimension(350, 500));
  270. memberPanel.add(new JLabel(ResourceUtil.getString("addremovemembers.members")), BorderLayout.NORTH);
  271. memberPanel.add(getMemberListScrollPane(), BorderLayout.CENTER);
  272. }
  273. return memberPanel;
  274. }
  275. /**
  276. * This method initializes nonMemberList.
  277. *
  278. * @return javax.swing.JList
  279. */
  280. private JList getNonMemberList() {
  281. if (nonMemberList == null) {
  282. nonMemberList = new JList(nonMembers);
  283. nonMemberList.addKeyListener(this);
  284. nonMemberList.addMouseListener(this);
  285. nonMemberList.setCellRenderer(new MyListCellRenderer());
  286. nonMemberList.setFont(UserPreferences.getUserFont());
  287. }
  288. return nonMemberList;
  289. }
  290. /**
  291. * This method initializes nonMemberListScrollPane.
  292. *
  293. * @return javax.swing.JScrollPane
  294. */
  295. private JScrollPane getNonMemberListScrollPane() {
  296. if (nonMemberListScrollPane == null) {
  297. nonMemberListScrollPane = new JScrollPane(getNonMemberList());
  298. }
  299. return nonMemberListScrollPane;
  300. }
  301. /**
  302. * This method initializes nonMemberPanel.
  303. *
  304. * @return javax.swing.JPanel
  305. */
  306. private JPanel getNonMemberPanel() {
  307. if (nonMemberPanel == null) {
  308. nonMemberPanel = new JPanel(new BorderLayout());
  309. nonMemberPanel.setPreferredSize(new Dimension(350, 500));
  310. nonMemberPanel.add(new JLabel(ResourceUtil.getString("addremovemembers.nonmembers")), BorderLayout.NORTH);
  311. nonMemberPanel.add(getNonMemberListScrollPane(), BorderLayout.CENTER);
  312. }
  313. return nonMemberPanel;
  314. }
  315. /**
  316. * This method initializes saveButton.
  317. *
  318. * @return javax.swing.JButton
  319. */
  320. private JButton getSaveButton() {
  321. if (saveButton == null) {
  322. saveButton = createButton("button.save", ActionConstants.SAVE_ACTION, this);
  323. }
  324. return saveButton;
  325. }
  326. /**
  327. * This method initializes unassignGroupButton.
  328. *
  329. * @return javax.swing.JButton
  330. */
  331. private JButton getUnassignGroupButton() {
  332. if (unassignGroupButton == null) {
  333. unassignGroupButton = new JButton();
  334. unassignGroupButton.addActionListener(this);
  335. unassignGroupButton.setActionCommand(ActionConstants.UNASSIGN_ACTION);
  336. unassignGroupButton.setIcon(ResourceUtil.unassignIcon);
  337. }
  338. return unassignGroupButton;
  339. }
  340. /**
  341. * This method initializes this
  342. */
  343. private void initialize() {
  344. try {
  345. // Initialize groups
  346. Group[] groupMembersObjects = document.getGroupMemberGroups(group);
  347. if (groupMembersObjects != null) {
  348. List<Group> groupMembersList = Arrays.asList(groupMembersObjects);
  349. groupMembers = new Vector<Group>(groupMembersList);
  350. Collections.sort(groupMembers);
  351. }
  352. else {
  353. groupMembers = new Vector<Group>();
  354. }
  355. Group[] groupObjects = document.getGroupsArray();
  356. if (groupObjects != null) {
  357. List<Group> groupNonMembersList = Arrays.asList(groupObjects);
  358. groupNonMembers = new Vector<Group>(groupNonMembersList);
  359. // Remove group being edited
  360. groupNonMembers.remove(group);
  361. Collections.sort(groupNonMembers);
  362. groupNonMembers.removeAll(groupMembers);
  363. // Remove the group being edited.
  364. groupNonMembers.remove(group.getName());
  365. }
  366. else {
  367. groupNonMembers = new Vector<Group>();
  368. }
  369. // Initialize users
  370. User[] userMembersObjects = document.getGroupMemberUsers(group);
  371. if (userMembersObjects != null) {
  372. List<User> userMembersList = Arrays.asList(userMembersObjects);
  373. userMembers = new Vector<User>(userMembersList);
  374. Collections.sort(userMembers);
  375. }
  376. else {
  377. userMembers = new Vector<User>();
  378. }
  379. User[] userObjects = document.getUserObjectsExcludeAllUsers();
  380. if (userObjects != null) {
  381. List<User> userNonMembersList = Arrays.asList(userObjects);
  382. userNonMembers = new Vector<User>(userNonMembersList);
  383. Collections.sort(userNonMembers);
  384. userNonMembers.removeAll(userMembers);
  385. }
  386. else {
  387. userNonMembers = new Vector<User>();
  388. }
  389. members = new Vector<GroupMemberObject>(groupMembers.size() + userMembers.size());
  390. nonMembers = new Vector<GroupMemberObject>(groupNonMembers.size() + userNonMembers.size());
  391. members.addAll(groupMembers);
  392. members.addAll(userMembers);
  393. nonMembers.addAll(groupNonMembers);
  394. nonMembers.addAll(userNonMembers);
  395. }
  396. catch (AppException e) {
  397. displayError(ResourceUtil.getFormattedString("addremovemembers.error.errorloadinggroups", e.getMessage()));
  398. }
  399. this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  400. this.setTitle(ResourceUtil.getString("addremovemembers.title"));
  401. this.setContentPane(getJContentPane());
  402. this.setIconImage(ResourceUtil.serverImage);
  403. this.setMinimumSize(new Dimension(500, 300));
  404. getRootPane().setDefaultButton(saveButton);
  405. this.pack();
  406. this.setModal(true);
  407. }
  408. /**
  409. * KeyPressed event handler.
  410. *
  411. * @param event KeyEvent object.
  412. */
  413. public void keyPressed(KeyEvent event) {
  414. int code = event.getKeyCode();
  415. if (code == KeyEvent.VK_SPACE) {
  416. if (event.getComponent() == getMemberList()) {
  417. unassignMembers();
  418. }
  419. else if (event.getComponent() == getNonMemberList()) {
  420. assignMembers();
  421. }
  422. }
  423. else {
  424. super.keyPressed(event);
  425. }
  426. }
  427. /**
  428. * KeyReleased event handler. Not used.
  429. *
  430. * @param event KeyEvent object.
  431. */
  432. public void keyReleased(KeyEvent event) {
  433. // Unused
  434. }
  435. /**
  436. * KeyTyped event handler. Not used.
  437. *
  438. * @param event KeyEvent object.
  439. */
  440. public void keyTyped(KeyEvent event) {
  441. // Unused
  442. }
  443. /**
  444. * MouseClicked event handler.
  445. *
  446. * @param event MouseEvent object.
  447. */
  448. public void mouseClicked(MouseEvent event) {
  449. if (event.getClickCount() == 2) {
  450. if (event.getSource() == getNonMemberList()) {
  451. assignMembers();
  452. }
  453. else if (event.getSource() == getMemberList()) {
  454. unassignMembers();
  455. }
  456. }
  457. }
  458. /**
  459. * MouseEntered event handler. Not used.
  460. *
  461. * @param event MouseEvent object.
  462. */
  463. public void mouseEntered(MouseEvent event) {
  464. // Not used
  465. }
  466. /**
  467. * MouseExited event handler. Not used.
  468. *
  469. * @param event MouseEvent object.
  470. */
  471. public void mouseExited(MouseEvent event) {
  472. // Not used
  473. }
  474. /**
  475. * MousePressed event handler. Not used.
  476. *
  477. * @param event MouseEvent object.
  478. */
  479. public void mousePressed(MouseEvent event) {
  480. // Not used
  481. }
  482. /**
  483. * MouseReleased event handler. Not used.
  484. *
  485. * @param event MouseEvent object.
  486. */
  487. public void mouseReleased(MouseEvent event) {
  488. // Not used
  489. }
  490. /**
  491. * Refreshes lists displayed in dialog with current data.
  492. */
  493. private void refreshLists() {
  494. Collections.sort(groupMembers);
  495. Collections.sort(userMembers);
  496. Collections.sort(groupNonMembers);
  497. Collections.sort(userNonMembers);
  498. members = new Vector<GroupMemberObject>(groupMembers.size() + userMembers.size());
  499. nonMembers = new Vector<GroupMemberObject>(groupNonMembers.size() + userNonMembers.size());
  500. members.addAll(groupMembers);
  501. members.addAll(userMembers);
  502. nonMembers.addAll(groupNonMembers);
  503. nonMembers.addAll(userNonMembers);
  504. getMemberList().setListData(members);
  505. getNonMemberList().setListData(nonMembers);
  506. }
  507. /**
  508. * Unassigns selected members.
  509. */
  510. private void unassignMembers() {
  511. if (!getMemberList().isSelectionEmpty()) {
  512. List<Object> values = Arrays.asList(getMemberList().getSelectedValues());
  513. for (Object object : values) {
  514. if (object instanceof Group) {
  515. groupMembers.remove(object);
  516. groupNonMembers.add((Group) object);
  517. }
  518. if (object instanceof User) {
  519. userMembers.remove(object);
  520. userNonMembers.add((User) object);
  521. }
  522. }
  523. refreshLists();
  524. }
  525. }
  526. }