View Javadoc
1   package org.argeo.documents.composites;
2   
3   import javax.jcr.Node;
4   import javax.jcr.Property;
5   import javax.jcr.RepositoryException;
6   import javax.jcr.Session;
7   import javax.jcr.observation.Event;
8   import javax.jcr.observation.EventIterator;
9   import javax.jcr.observation.EventListener;
10  import javax.jcr.observation.ObservationManager;
11  
12  import org.argeo.connect.ui.AppUiService;
13  import org.argeo.connect.util.ConnectJcrUtils;
14  import org.argeo.documents.DocumentsException;
15  import org.argeo.documents.DocumentsService;
16  import org.argeo.documents.ui.DocumentsUiService;
17  import org.argeo.eclipse.ui.EclipseUiUtils;
18  import org.eclipse.jface.viewers.ColumnLabelProvider;
19  import org.eclipse.jface.viewers.ILazyContentProvider;
20  import org.eclipse.jface.viewers.ISelection;
21  import org.eclipse.jface.viewers.IStructuredSelection;
22  import org.eclipse.jface.viewers.TableViewer;
23  import org.eclipse.jface.viewers.TableViewerColumn;
24  import org.eclipse.jface.viewers.Viewer;
25  import org.eclipse.swt.SWT;
26  import org.eclipse.swt.events.DisposeEvent;
27  import org.eclipse.swt.events.DisposeListener;
28  import org.eclipse.swt.events.MouseAdapter;
29  import org.eclipse.swt.events.MouseEvent;
30  import org.eclipse.swt.graphics.Image;
31  import org.eclipse.swt.graphics.Point;
32  import org.eclipse.swt.layout.GridData;
33  import org.eclipse.swt.widgets.Composite;
34  import org.eclipse.swt.widgets.Table;
35  import org.eclipse.swt.widgets.TableColumn;
36  
37  public class BookmarksTableViewer extends TableViewer {
38  	private static final long serialVersionUID = -2638259376244326947L;
39  
40  	private final AppUiService appUiService;
41  	private final DocumentsService documentsService;
42  	private final DocumentsUiService documentsUiService = new DocumentsUiService();
43  	private final Node bookmarkParent;
44  	private BookmarksObserver bookmarksObserver = new BookmarksObserver();
45  
46  	public BookmarksTableViewer(Composite parent, int style, Node bookmarkParent, DocumentsService documentsService,
47  			AppUiService appUiService) {
48  		super(parent, style | SWT.VIRTUAL);
49  		this.bookmarkParent = bookmarkParent;
50  		this.documentsService = documentsService;
51  		this.appUiService = appUiService;
52  	}
53  
54  	public Table configureDefaultSingleColumnTable(int tableWidthHint) {
55  		Table table = this.getTable();
56  		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
57  		table.setLinesVisible(false);
58  		table.setHeaderVisible(false);
59  		TableViewerColumn column = new TableViewerColumn(this, SWT.NONE);
60  		TableColumn tcol = column.getColumn();
61  		tcol.setWidth(tableWidthHint);
62  		column.setLabelProvider(new BookmarkIconNameLabelProvider());
63  		this.setContentProvider(new MyLazyCP());
64  		refreshMyBookmarksList();
65  		// The context menu
66  		BookmarksContextMenu contextMenu = new BookmarksContextMenu(bookmarkParent, this, documentsUiService);
67  		table.addMouseListener(new MouseAdapter() {
68  			private static final long serialVersionUID = 6737579410648595940L;
69  
70  			@Override
71  			public void mouseDown(MouseEvent e) {
72  				if (e.button == 3) {
73  					contextMenu.show(table, new Point(e.x, e.y), BookmarksTableViewer.this.getStructuredSelection());
74  				}
75  			}
76  		});
77  		addBookmarksChangedListenner();
78  		return table;
79  	}
80  
81  	private void refreshMyBookmarksList() {
82  		Node[] rows = documentsService.getMyBookmarks(ConnectJcrUtils.getSession(bookmarkParent));
83  		setInput(rows);
84  		int length = rows == null ? 0 : rows.length;
85  		this.setItemCount(length);
86  		this.refresh();
87  	}
88  
89  	private void addBookmarksChangedListenner() {
90  		try {
91  			Session session = bookmarkParent.getSession();
92  			String path = bookmarkParent.getPath();
93  			ObservationManager observationManager = session.getWorkspace().getObservationManager();
94  			observationManager.addEventListener(bookmarksObserver,
95  					Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED, path, true,
96  					null, null, false);
97  		} catch (RepositoryException e) {
98  			throw new DocumentsException("Cannot handle event on " + bookmarkParent, e);
99  		}
100 
101 		Table table = this.getTable();
102 		table.addDisposeListener(new DisposeListener() {
103 			private static final long serialVersionUID = 7320917131465167200L;
104 
105 			@Override
106 			public void widgetDisposed(DisposeEvent event) {
107 				try {
108 					ObservationManager observationManager = bookmarkParent.getSession().getWorkspace()
109 							.getObservationManager();
110 					observationManager.removeEventListener(bookmarksObserver);
111 				} catch (RepositoryException e) {
112 					throw new DocumentsException("Cannot unsuscribe bookmark observer", e);
113 				}
114 			}
115 		});
116 	}
117 
118 	private class BookmarksObserver implements EventListener {
119 		@Override
120 		public void onEvent(EventIterator events) {
121 			BookmarksTableViewer.this.getControl().getDisplay().asyncExec(new Runnable() {
122 				@Override
123 				public void run() {
124 					refreshMyBookmarksList();
125 					BookmarksTableViewer.this.getControl().getParent().getParent().layout(true, true);
126 				}
127 			});
128 		}
129 	}
130 
131 	private class MyLazyCP implements ILazyContentProvider {
132 		private static final long serialVersionUID = 9096550041395433128L;
133 		private Object[] elements;
134 
135 		public void dispose() {
136 		}
137 
138 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
139 			// IMPORTANT: don't forget this: an exception will be thrown if
140 			// a selected object is not part of the results anymore.
141 			viewer.setSelection(null);
142 			this.elements = (Object[]) newInput;
143 		}
144 
145 		public void updateElement(int index) {
146 			BookmarksTableViewer.this.replace(elements[index], index);
147 		}
148 	}
149 
150 	private class BookmarkIconNameLabelProvider extends ColumnLabelProvider {
151 		private static final long serialVersionUID = 8187902187946523148L;
152 
153 		@Override
154 		public String getText(Object element) {
155 			Node node = (Node) element;
156 			String title = ConnectJcrUtils.get(node, Property.JCR_TITLE);
157 			// Todo rather diplay name of the target path directory.
158 			if (EclipseUiUtils.isEmpty(title))
159 				title = ConnectJcrUtils.getName(node);
160 			return title;
161 		}
162 
163 		@Override
164 		public Image getImage(Object element) {
165 			Node node = (Node) element;
166 			return appUiService.getIconForType(node);
167 		}
168 	}
169 
170 	/** Single-sourcing */
171 	public IStructuredSelection getStructuredSelection() throws ClassCastException {
172 		ISelection selection = getSelection();
173 		return (IStructuredSelection) selection;
174 	}
175 
176 }