]> git.argeo.org Git - lgpl/argeo-commons.git/blob - UserMenuLink.java
08af8d3da419df52971e20c1cc5862381da4e012
[lgpl/argeo-commons.git] / UserMenuLink.java
1 package org.argeo.cms.util;
2
3 import javax.jcr.Node;
4 import javax.security.auth.Subject;
5
6 import org.argeo.cms.CmsMsg;
7 import org.argeo.cms.auth.CurrentUser;
8 import org.argeo.cms.ui.CmsStyles;
9 import org.argeo.node.NodeConstants;
10 import org.eclipse.swt.events.DisposeEvent;
11 import org.eclipse.swt.events.DisposeListener;
12 import org.eclipse.swt.events.MouseEvent;
13 import org.eclipse.swt.events.MouseListener;
14 import org.eclipse.swt.widgets.Composite;
15 import org.eclipse.swt.widgets.Control;
16 import org.eclipse.swt.widgets.Label;
17
18 /** Open the user menu when clicked */
19 public class UserMenuLink extends MenuLink {
20
21 public UserMenuLink() {
22 setCustom(CmsStyles.CMS_USER_MENU_LINK);
23 }
24
25 @Override
26 public Control createUi(Composite parent, Node context) {
27 Subject subject = CmsUtils.getCmsView().getSubject();
28 String username = CurrentUser.getUsername(subject);
29 if (username.equalsIgnoreCase(NodeConstants.ROLE_ANONYMOUS))
30 setLabel(CmsMsg.login.lead());
31 else {
32 setLabel(CurrentUser.getDisplayName(subject));
33 }
34 Label link = (Label) ((Composite) super.createUi(parent, context))
35 .getChildren()[0];
36 link.addMouseListener(new UserMenuLinkController());
37 return link.getParent();
38 }
39
40 protected UserMenu createUserMenu(Control source) {
41 return new UserMenu(source.getParent());
42 }
43
44 private class UserMenuLinkController implements MouseListener,
45 DisposeListener {
46 private static final long serialVersionUID = 3634864186295639792L;
47
48 private UserMenu userMenu = null;
49 private long lastDisposeTS = 0l;
50
51 //
52 // MOUSE LISTENER
53 //
54 @Override
55 public void mouseDown(MouseEvent e) {
56 if (e.button == 1) {
57 Control source = (Control) e.getSource();
58 if (userMenu == null) {
59 long durationSinceLastDispose = System.currentTimeMillis()
60 - lastDisposeTS;
61 // avoid to reopen the menu, if one has clicked gain
62 if (durationSinceLastDispose > 200) {
63 userMenu = createUserMenu(source);
64 userMenu.getShell().addDisposeListener(this);
65 }
66 }
67 }
68 }
69
70 @Override
71 public void mouseDoubleClick(MouseEvent e) {
72 }
73
74 @Override
75 public void mouseUp(MouseEvent e) {
76 }
77
78 @Override
79 public void widgetDisposed(DisposeEvent event) {
80 userMenu = null;
81 lastDisposeTS = System.currentTimeMillis();
82 }
83 }
84 }