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
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
140
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
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
171 public IStructuredSelection getStructuredSelection() throws ClassCastException {
172 ISelection selection = getSelection();
173 return (IStructuredSelection) selection;
174 }
175
176 }