ref #7502 Add table settings to search bar
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / e4 / BulkEditorE4Composite.java
index 4b1824e4d073fe3c6b01f5bc4c47e32a1f57799c..50a9eecbf684b2e813de2f2a901835bada4b7e5d 100644 (file)
@@ -30,12 +30,14 @@ import org.eclipse.nebula.widgets.nattable.command.VisualRefreshCommand;
 import org.eclipse.nebula.widgets.nattable.command.VisualRefreshCommandHandler;
 import org.eclipse.nebula.widgets.nattable.config.AbstractRegistryConfiguration;
 import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration;
+import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
 import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
 import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
 import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
 import org.eclipse.nebula.widgets.nattable.config.IEditableRule;
 import org.eclipse.nebula.widgets.nattable.data.IRowIdAccessor;
 import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
+import org.eclipse.nebula.widgets.nattable.data.convert.DefaultBooleanDisplayConverter;
 import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes;
 import org.eclipse.nebula.widgets.nattable.edit.action.MouseEditAction;
 import org.eclipse.nebula.widgets.nattable.edit.config.DefaultEditConfiguration;
@@ -53,6 +55,8 @@ import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer;
 import org.eclipse.nebula.widgets.nattable.layer.AbstractLayer;
 import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
 import org.eclipse.nebula.widgets.nattable.layer.stack.DefaultBodyLayerStack;
+import org.eclipse.nebula.widgets.nattable.painter.cell.CheckBoxPainter;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ImagePainter;
 import org.eclipse.nebula.widgets.nattable.selection.RowSelectionModel;
 import org.eclipse.nebula.widgets.nattable.selection.RowSelectionProvider;
 import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer;
@@ -80,6 +84,7 @@ import eu.etaxonomy.cdm.model.description.SpecimenDescription;
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditorQuery;
 import eu.etaxonomy.taxeditor.bulkeditor.input.AbstractBulkEditorInput;
 import eu.etaxonomy.taxeditor.l10n.Messages;
+import eu.etaxonomy.taxeditor.model.ImageResources;
 
 /**
  *
@@ -89,11 +94,13 @@ import eu.etaxonomy.taxeditor.l10n.Messages;
  */
 public class BulkEditorE4Composite extends Composite {
 
-    public static final String TYPE_PROPERTY = Messages.BulkEditorE4_TYPE;
+    public static final String LABEL_CANDIDATE = "LABEL_CANDIDATE"; //$NON-NLS-1$
+    public static final String LABEL_CANDIDATE_ICON = "LABEL_CANDIDATE_ICON"; //$NON-NLS-1$
 
-    public static final String CANDIDATE_LABEL = "candidate";
+    public static final String LABEL_TARGET = "LABEL_TARGET"; //$NON-NLS-1$
+    public static final String LABEL_TARGET_ICON = "LABEL_TARGET_ICON"; //$NON-NLS-1$
 
-    public static final String TARGET_LABEL = "target";
+    private final List<String> columnList = new ArrayList<>();
 
     private Composite topComposite;
 
@@ -114,6 +121,7 @@ public class BulkEditorE4Composite extends Composite {
     private ListDataProvider<CdmBase> bodyDataProvider;
 
     private BulkEditorE4 bulkEditor;
+    private BulkEditorSearchE4 bulkEditorSearch;
 
 
     public BulkEditorE4Composite(BulkEditorE4 bulkEditor, Composite parent, int style) {
@@ -137,7 +145,9 @@ public class BulkEditorE4Composite extends Composite {
        @SuppressWarnings("unused")
     public void init(AbstractBulkEditorInput<?> input){
 
-           new BulkEditorSearchE4(this, topComposite, SWT.NONE);
+        input.getPropertyKeys().forEach(key->columnList.add(key));
+
+           bulkEditorSearch = new BulkEditorSearchE4(this, topComposite, SWT.NONE);
            //layout needed because the search bar is added after @PostConstuct method
            topComposite.getParent().layout();
 
@@ -159,19 +169,20 @@ public class BulkEditorE4Composite extends Composite {
         selectionProvider.addSelectionChangedListener(selectionChangedListener);
 
         bottomComposite.layout();
+
        }
 
        private void createTable(){
            ConfigRegistry configRegistry = new ConfigRegistry();
            //property map
         Map<String, String> propertyToLabels = new HashMap<>();
-        propertyToLabels.put(bulkEditor.getEditorInput().getName(), bulkEditor.getEditorInput().getName());
-        propertyToLabels.put(TYPE_PROPERTY, TYPE_PROPERTY);
-        String[] propertyNames = new String[] { bulkEditor.getEditorInput().getName(), TYPE_PROPERTY };
+        columnList.forEach(columnLabel->propertyToLabels.put(columnLabel, columnLabel));
+
+        String[] propertyNames = columnList.toArray(columnList.toArray(new String[columnList.size()]));
         //sorted list
         SortedList<CdmBase> sortedList = new SortedList<>(bulkEditor.getEditorInput().getModel(), bulkEditor.getEditorInput().getTitleComparator());
         //data provider
-        BulkEditorPropertyAccessor columnPropertyAccessor = new BulkEditorPropertyAccessor(bulkEditor.getEditorInput());
+        BulkEditorPropertyAccessor columnPropertyAccessor = new BulkEditorPropertyAccessor(this, bulkEditor.getEditorInput());
         bodyDataProvider = new ListDataProvider<CdmBase>(sortedList,
                 columnPropertyAccessor);
         DefaultColumnHeaderDataProvider colHeaderDataProvider = new DefaultColumnHeaderDataProvider(
@@ -184,9 +195,16 @@ public class BulkEditorE4Composite extends Composite {
         GlazedListsEventLayer<CdmBase> eventLayer = new GlazedListsEventLayer<>(dataLayer, bulkEditor.getEditorInput().getModel());
         bodyLayer = new DefaultBodyLayerStack(eventLayer);
 
-        dataLayer.setColumnPercentageSizing(true);
-        dataLayer.setColumnWidthPercentageByPosition(0, 80);
-        dataLayer.setColumnWidthPercentageByPosition(1, 20);
+        dataLayer.setColumnPercentageSizing(0, true);
+        dataLayer.setColumnWidthPercentageByPosition(0, 45);
+        for(int i=1;i<columnList.size();i++){
+            if(bulkEditor.getEditorInput().isCacheProperty(columnList.get(i))){
+                dataLayer.setColumnWidthByPosition(i, 16);
+            }
+            else{
+                dataLayer.setColumnWidthByPosition(i, 100);
+            }
+        }
 
         //column
         DataLayer columnHeaderDataLayer = new DataLayer(colHeaderDataProvider);
@@ -203,10 +221,13 @@ public class BulkEditorE4Composite extends Composite {
                         columnPropertyAccessor,
                         configRegistry,
                         columnHeaderDataLayer));
+        columnHeaderDataLayer.setConfigLabelAccumulator(
+                new BulkEditorConfigLabelAccumulatorHeader(colHeaderDataProvider, bulkEditor.getEditorInput()));
         //row
         DataLayer rowHeaderDataLayer = new DataLayer(rowHeaderDataProvider);
         RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer,
                 bodyLayer, bodyLayer.getSelectionLayer());
+        rowHeaderDataLayer.setColumnWidthByPosition(0, 50);
 
         //corner
         DefaultCornerDataProvider cornerDataProvider = new DefaultCornerDataProvider(
@@ -217,7 +238,6 @@ public class BulkEditorE4Composite extends Composite {
         GridLayer gridLayer = new GridLayer(bodyLayer, sortHeaderLayer,
                 rowHeaderLayer, cornerLayer, false);//set autoconfigure to false to get rid of the single click editing
         natTable = new NatTable(bottomComposite, gridLayer, false);
-        natTable.setConfigRegistry(configRegistry);
 
         //full row selection
         bodyLayer.getSelectionLayer().setSelectionModel(new RowSelectionModel<CdmBase>(bodyLayer.getSelectionLayer(), bodyDataProvider, new IRowIdAccessor<CdmBase>() {
@@ -227,11 +247,13 @@ public class BulkEditorE4Composite extends Composite {
             }
         }));
 
-        //add label to deduplication rows
-        dataLayer.setConfigLabelAccumulator(new BulkEditorConfigLabelAccumulator(natTable, bodyDataProvider, bulkEditor.getEditorInput()));
+        dataLayer.setConfigLabelAccumulator(new BulkEditorConfigLabelAccumulator(bodyDataProvider, colHeaderDataProvider,
+                bulkEditor.getEditorInput()));
+
+        natTable.setConfigRegistry(configRegistry);
 
         //add tooltip to table
-        new BulkEditorTooltip(natTable);
+        new BulkEditorTooltip(natTable, colHeaderDataProvider);
        }
 
        private void configureTable(){
@@ -280,8 +302,10 @@ public class BulkEditorE4Composite extends Composite {
             public void configureUiBindings(
                     UiBindingRegistry uiBindingRegistry) {
                 // add e4 menu to NatTable
-                new PopupMenuBuilder(natTable, e4Menu)
-                    .build();
+                        new PopupMenuBuilder(natTable, e4Menu)
+                        .withHideColumnMenuItem()
+                        .withShowAllColumnsMenuItem()
+                        .build();
 
                 // register the UI binding for header, corner and body region
                 uiBindingRegistry.registerMouseDownBinding(
@@ -302,6 +326,39 @@ public class BulkEditorE4Composite extends Composite {
 
         //add default configuration because autoconfigure is set to false in constructor
         natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
+
+        //show boolean values as check boxes
+        natTable.addConfiguration(new AbstractRegistryConfiguration() {
+            @Override
+            public void configureRegistry(IConfigRegistry configRegistry) {
+                configRegistry.registerConfigAttribute(
+                        CellConfigAttributes.CELL_PAINTER,
+                        new CheckBoxPainter(),
+                        DisplayMode.NORMAL,
+                        BulkEditorConfigLabelAccumulatorHeader.BOOLEAN_COLUMN);
+
+                configRegistry.registerConfigAttribute(
+                        CellConfigAttributes.DISPLAY_CONVERTER,
+                        new DefaultBooleanDisplayConverter(),
+                        DisplayMode.NORMAL,
+                        BulkEditorConfigLabelAccumulatorHeader.BOOLEAN_COLUMN);
+            }
+        });
+
+        natTable.addConfiguration(new AbstractRegistryConfiguration() {
+            @Override
+            public void configureRegistry(IConfigRegistry configRegistry) {
+                configRegistry.registerConfigAttribute(
+                        CellConfigAttributes.CELL_PAINTER,
+                        new ImagePainter(ImageResources.getImage(ImageResources.LOCK_ICON)),
+                        DisplayMode.NORMAL,
+                        BulkEditorConfigLabelAccumulatorHeader.CACHE_COLUMN);
+            }
+        });
+
+        //register handler for view configuration menu
+        natTable.registerCommandHandler(bulkEditorSearch.getDisplayPersistenceDialogCommandHandler());
+
         natTable.configure();
        }
 
@@ -337,6 +394,10 @@ public class BulkEditorE4Composite extends Composite {
         natTable.doCommand(new VisualRefreshCommand());
     }
 
+    public List<String> getColumnList() {
+        return columnList;
+    }
+
     public IStructuredSelection getSelection(){
         List<CdmBase> selection = new ArrayList<>();
         int[] fullySelectedRowPositions = bodyLayer.getSelectionLayer().getFullySelectedRowPositions();
@@ -363,7 +424,7 @@ public class BulkEditorE4Composite extends Composite {
     }
 
     public void copyDataToClipboard() {
-        String textData = "";
+        String textData = ""; //$NON-NLS-1$
         IStructuredSelection selection = getSelection();
         Object[] objects = selection.toArray();
         for (Object object : objects) {
@@ -381,4 +442,8 @@ public class BulkEditorE4Composite extends Composite {
         }
     }
 
+    NatTable getNatTable() {
+        return natTable;
+    }
+
 }