Clarify distinction between UX views and parts
[lgpl/argeo-commons.git] / swt / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtTableView.java
diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTableView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTableView.java
new file mode 100644 (file)
index 0000000..b136f36
--- /dev/null
@@ -0,0 +1,82 @@
+package org.argeo.cms.swt.widgets;
+
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ux.widgets.Column;
+import org.argeo.cms.ux.widgets.TabularPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/** View of a {@link TabularPart} based on a {@link Table}. */
+public class SwtTableView<INPUT, T> extends AbstractSwtView<INPUT, T> {
+       private static final long serialVersionUID = -1114155772446357750L;
+       private final Table table;
+       private TabularPart<INPUT, T> tabularPart;
+
+       private CmsSwtTheme theme;
+
+       public SwtTableView(Composite parent, int style, TabularPart<INPUT, T> tabularPart) {
+               super(parent, style, tabularPart);
+               theme = CmsSwtUtils.getCmsTheme(parent);
+
+               table = new Table(this, SWT.VIRTUAL | SWT.BORDER);
+               table.setLinesVisible(true);
+               table.setLayoutData(CmsSwtUtils.fillAll());
+
+               this.tabularPart = tabularPart;
+       }
+
+       @Override
+       public void refresh() {
+               // TODO optimise
+               table.clearAll();
+               table.addListener(SWT.SetData, event -> {
+                       TableItem item = (TableItem) event.item;
+                       refreshItem(item);
+               });
+               table.setItemCount(tabularPart.getItemCount());
+               for (int i = 0; i < tabularPart.getColumnCount(); i++) {
+                       TableColumn swtColumn = new TableColumn(table, SWT.NONE);
+                       swtColumn.setWidth(tabularPart.getColumn(i).getWidth());
+               }
+               CmsSwtUtils.fill(table);
+
+               table.addSelectionListener(selectionListener);
+
+       }
+
+       protected Object getDataFromEvent(SelectionEvent e) {
+               Object data = e.item.getData();
+               if (data == null)
+                       data = tabularPart.getData(getTable().indexOf((TableItem) e.item));
+               return data;
+       }
+
+       protected void refreshItem(TableItem item) {
+               int row = getTable().indexOf(item);
+               for (int i = 0; i < tabularPart.getColumnCount(); i++) {
+                       Column<T> column = tabularPart.getColumn(i);
+                       T data = tabularPart.getData(row);
+                       item.setData(data);
+                       String text = data != null ? column.getText(data) : "";
+                       if (text != null)
+                               item.setText(i, text);
+                       CmsIcon icon = column.getIcon(data);
+                       if (icon != null) {
+                               Image image = theme.getSmallIcon(icon);
+                               item.setImage(i, image);
+                       }
+               }
+       }
+
+       protected Table getTable() {
+               return table;
+       }
+
+}