View Javadoc
1   package org.argeo.cms.ui.util;
2   
3   import javax.jcr.Node;
4   
5   import org.argeo.cms.CmsMsg;
6   import org.argeo.cms.auth.CurrentUser;
7   import org.argeo.cms.ui.CmsStyles;
8   import org.argeo.cms.ui.widgets.auth.CmsLoginShell;
9   import org.eclipse.swt.events.DisposeEvent;
10  import org.eclipse.swt.events.DisposeListener;
11  import org.eclipse.swt.events.MouseEvent;
12  import org.eclipse.swt.events.MouseListener;
13  import org.eclipse.swt.widgets.Composite;
14  import org.eclipse.swt.widgets.Control;
15  import org.eclipse.swt.widgets.Label;
16  
17  /** Open the user menu when clicked */
18  public class UserMenuLink extends MenuLink {
19  
20  	public UserMenuLink() {
21  		setCustom(CmsStyles.CMS_USER_MENU_LINK);
22  	}
23  
24  	@Override
25  	public Control createUi(Composite parent, Node context) {
26  		if (CurrentUser.isAnonymous())
27  			setLabel(CmsMsg.login.lead());
28  		else {
29  			setLabel(CurrentUser.getDisplayName());
30  		}
31  		Label link = (Label) ((Composite) super.createUi(parent, context)).getChildren()[0];
32  		link.addMouseListener(new UserMenuLinkController(context));
33  		return link.getParent();
34  	}
35  
36  	protected CmsLoginShell createUserMenu(Control source, Node context) {
37  		return new UserMenu(source.getParent(), context);
38  	}
39  
40  	private class UserMenuLinkController implements MouseListener, DisposeListener {
41  		private static final long serialVersionUID = 3634864186295639792L;
42  
43  		private CmsLoginShell userMenu = null;
44  		private long lastDisposeTS = 0l;
45  
46  		private final Node context;
47  
48  		public UserMenuLinkController(Node context) {
49  			this.context = context;
50  		}
51  
52  		//
53  		// MOUSE LISTENER
54  		//
55  		@Override
56  		public void mouseDown(MouseEvent e) {
57  			if (e.button == 1) {
58  				Control source = (Control) e.getSource();
59  				if (userMenu == null) {
60  					long durationSinceLastDispose = System.currentTimeMillis() - lastDisposeTS;
61  					// avoid to reopen the menu, if one has clicked gain
62  					if (durationSinceLastDispose > 200) {
63  						userMenu = createUserMenu(source, context);
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  }