diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java index 6c234943130aebc201ba74d08f0b5c6464921f4f..cccbb55e2bf7b6344e94de75cce1acafb1b5b966 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java @@ -260,22 +260,21 @@ public class DisplaySettingsManager { boolean refreshNeeded = false; List<ColumnConfig> newColumnConfigList = new ArrayList<ColumnConfig>(); - Set<Integer> indices = new HashSet<Integer>(); + Set<String> ids = new HashSet<String>(); List<String> newFilteredColumnIds = new ArrayList<String>(); for (int i = 0; i < columnSettings.size(); i++) { ColumnSetting columnSetting = columnSettings.get(i); // update column using the settings stored for it String columnID = columnSetting.getColumnID(); - int index = columnModel.getIndexById(columnID); - if (index >= 0) + ColumnConfig columnConfig = columnModel.getColumnById(columnID); + if (columnConfig != null) { - if (i != index) + if (i != columnModel.getIndexById(columnID)) { refreshNeeded = true; } - indices.add(index); - ColumnConfig columnConfig = columnModel.getColumn(index); + ids.add(columnID); boolean hidden = columnSetting.isHidden(); if (columnConfig.isHidden() != hidden) { @@ -298,9 +297,10 @@ public class DisplaySettingsManager // add columns for which no settings were stored at the end for (int i = 0; i < columnModel.getColumnCount(); i++) { - if (indices.contains(i) == false) + ColumnConfig column = columnModel.getColumn(i); + if (ids.contains(column.getId()) == false) { - newColumnConfigList.add(columnModel.getColumn(i)); + newColumnConfigList.add(column); } } if (newFilteredColumnIds.equals(filteredColumnIds) == false) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java index e594c1b04808520522603043b9bbcd0f790a478d..1a335ca75b92a2b4d41588ad4295abafbc13a6e5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java @@ -133,12 +133,6 @@ public abstract class TypedTableGrid<T extends ISerializable> MaterialTableCell materialTableCell = (MaterialTableCell) value; return LinkExtractor.tryExtract(materialTableCell.getMaterialIdentifier()); } -// if (value instanceof VocabularyTermTableCell) -// { -// VocabularyTermTableCell vocabularyTermTableCell = (VocabularyTermTableCell) value; -// VocabularyTerm vocabularyTerm = vocabularyTermTableCell.getVocabularyTerm(); -// return VocabularyPropertyColRenderer.renderTerm(vocabularyTerm); -// } return LinkExtractor.createPermlink(entityKind, value.toString()); } @@ -169,6 +163,8 @@ public abstract class TypedTableGrid<T extends ISerializable> private Map<String, IColumnDefinition<TableModelRowWithObject<T>>> columnDefinitions; + private String currentGridDisplayTypeID; + protected TypedTableGrid(IViewContext<ICommonClientServiceAsync> viewContext, String browserId, boolean refreshAutomatically, IDisplayTypeIDGenerator displayTypeIDGenerator) { @@ -354,6 +350,7 @@ public abstract class TypedTableGrid<T extends ISerializable> } }; listTableRows(resultSetConfig, extendedCallback); + currentGridDisplayTypeID = getGridDisplayTypeID(); } @Override @@ -362,10 +359,16 @@ public abstract class TypedTableGrid<T extends ISerializable> return true; } + /** + * Refreshes the browser if the grid display type ID has changed because this means a different + * set of display settings. Thus column models and filters should be refreshed before data + * loading. + */ @Override protected void refresh() { - refresh(false); + String gridDisplayTypeID = getGridDisplayTypeID(); + refresh(gridDisplayTypeID.equals(currentGridDisplayTypeID) == false); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java index 2f082a0a8e3e32a86aaef904c8cbb1448371219c..66528d25c603fa4bd134f9bb70ec342c98883c42 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java @@ -84,7 +84,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.M import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.RealNumberRenderer; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ComponentEventLogger; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ComponentEventLogger.EventPair; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionUI; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.GridCustomColumnDefinition; @@ -216,6 +215,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod private LayoutContainer bottomToolbars; + private ColumnModel fullColumnModel; + protected AbstractBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext, String gridId, IDisplayTypeIDGenerator displayTypeIDGenerator) { @@ -568,8 +569,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod pendingFetchManager.pushPendingFetchConfig(ResultSetFetchConfig .createFetchFromCache(resultSetKeyOrNull)); } + GridFilters<T> filters = filterToolbar.getFilters(); final DefaultResultSetConfig<String, T> resultSetConfig = - createPagingConfig(loadConfig, filterToolbar.getFilters(), getGridDisplayTypeID()); + createPagingConfig(loadConfig, filters, getGridDisplayTypeID()); debug("create a refresh callback " + pendingFetchManager.tryTopPendingFetchConfig()); final ListEntitiesCallback listCallback = new ListEntitiesCallback(viewContext, callback, resultSetConfig); @@ -1157,10 +1159,34 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod private void changeColumnModel(ColumnModel columnModel) { + fullColumnModel = columnModel; int logId = log("grid reconfigure"); - grid.reconfigure(grid.getStore(), columnModel); + ColumnModel columnModelOfVisible = trimToVisibleColumns(columnModel); + grid.reconfigure(grid.getStore(), columnModelOfVisible); viewContext.logStop(logId); registerGridSettingsChangesListener(); + // add listeners of full column model to trimmed model + List<Listener<? extends BaseEvent>> listeners = + fullColumnModel.getListeners(Events.WidthChange); + for (Listener<? extends BaseEvent> listener : listeners) + { + columnModelOfVisible.addListener(Events.WidthChange, listener); + } + } + + private ColumnModel trimToVisibleColumns(ColumnModel columnModel) + { + List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); + for (int i = 0, n = columnModel.getColumnCount(); i < n; i++) + { + ColumnConfig column = columnModel.getColumn(i); + if (column.isHidden() == false) + { + columns.add(column); + } + } + ColumnModel trimmedModel = createColumnModel(columns); + return trimmedModel; } private void registerGridSettingsChangesListener() @@ -1190,7 +1216,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod { public ColumnModel getColumnModel() { - return AbstractBrowserGrid.this.getColumnModel(); + return AbstractBrowserGrid.this.getFullColumnModel(); } public List<String> getFilteredColumnIds() @@ -1294,8 +1320,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod private List<IColumnDefinition<T>> getVisibleColumns(Set<IColumnDefinition<T>> availableColumns) { Map<String, IColumnDefinition<T>> availableColumnsMap = asColumnIdMap(availableColumns); - final ColumnModel columnModel = grid.getColumnModel(); - return getVisibleColumns(availableColumnsMap, columnModel); + return getVisibleColumns(availableColumnsMap, fullColumnModel); } private void saveCacheKey(final String newResultSetKey) @@ -1341,8 +1366,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod // Default visibility so that friend classes can use -- should otherwise be considered private void saveColumnDisplaySettings() { + IDisplaySettingsGetter settingsUpdater = createDisplaySettingsUpdater(); viewContext.getDisplaySettingsManager().storeSettings(getGridDisplayTypeID(), - createDisplaySettingsUpdater(), false); + settingsUpdater, false); } // @Private - for tests @@ -1410,20 +1436,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod // ------- generic static helpers - // Default visibility so that friend classes can use -- should otherwise be considered private - static List<String> getFilteredColumnIds(List<ColumnDataModel> result) - { - List<String> filteredColumnsIds = new ArrayList<String>(); - for (ColumnDataModel model : result) - { - if (model.hasFilter()) - { - filteredColumnsIds.add(model.getColumnID()); - } - } - return filteredColumnsIds; - } - private static <T> List<String> extractColumnIds(List<IColumnDefinition<T>> columns) { List<String> columnsIds = new ArrayList<String>(); @@ -1434,51 +1446,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod return columnsIds; } - /** - * Updates specified model (<code>cm</code>) with visibility and order settings from - * <code>columnModels</code>. - */ - // Default visibility so that friend classes can use -- should otherwise be considered private - static void updateColumnsSettingsModel(final MoveableColumnModel cm, - List<ColumnDataModel> columnModels) - { - int newIndex = 0; - // do not fire events because of performance problems when hiding/unhiding all columns. View - // will be refreshed by refreshColumnsSettings() afterwards. - cm.setFiresEvents(false); - for (ColumnDataModel m : columnModels) - { - String columnID = m.getColumnID(); - int oldIndex = cm.getIndexById(columnID); - if (oldIndex != -1) - { - cm.setHidden(oldIndex, m.isVisible() == false); - cm.move(oldIndex, newIndex++); - } else - { // new custom column has been added. - cm.addAt(newIndex++, createTemporaryColumnConfig(m)); - } - } - // all deleted custom columns are now at the end starting from 'newIndex' - remove them - while (newIndex < cm.getColumnCount()) - { - cm.remove(cm.getColumnCount() - 1); - } - cm.setFiresEvents(true); - } - - // This column config is created just to make user settings persistent. - // It must have been a custom column. - // The config will be recreated in a proper form when data will be refreshed. - private static ColumnConfig createTemporaryColumnConfig(ColumnDataModel m) - { - ColumnConfig columnConfig = - new ColumnConfig(m.getColumnID(), m.getHeader(), - AbstractColumnDefinitionKind.DEFAULT_COLUMN_WIDTH); - columnConfig.setHidden(m.isVisible() == false); - return columnConfig; - } - // Default visibility so that friend classes can use -- should otherwise be considered private static List<ColumnDataModel> createColumnsSettingsModel(ColumnModel cm, List<String> filteredColumnsIds) @@ -1560,17 +1527,17 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod } // this should be the only place where we create the grid column model. - private static MoveableColumnModel createColumnModel(List<ColumnConfig> columConfigs) + private static ColumnModel createColumnModel(List<ColumnConfig> columConfigs) { - return new MoveableColumnModel(columConfigs); + return new ColumnModel(columConfigs); } // Default visibility so that friend classes can use -- should otherwise be considered private - MoveableColumnModel getColumnModel() + ColumnModel getFullColumnModel() { - return (MoveableColumnModel) grid.getColumnModel(); + return fullColumnModel; } - + private static final class ExportEntitiesCallback extends AbstractAsyncCallback<String> { public ExportEntitiesCallback(final IViewContext<ICommonClientServiceAsync> viewContext) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java index 716b644d224ce7d96664c90c7c1012e1b8cd4bdc..b681ead610f58963ec429c6c6d606ed07d6d443a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java @@ -16,10 +16,20 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid; +import static ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind.DEFAULT_COLUMN_WIDTH; + +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplaySettingsManager; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDisplaySettingsGetter; import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.expressions.filter.FilterToolbar; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridCustomColumnInfo; @@ -66,7 +76,7 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>> public void showDialog() { List<ColumnDataModel> settingsModel = - AbstractBrowserGrid.createColumnsSettingsModel(browserGrid.getColumnModel(), + AbstractBrowserGrid.createColumnsSettingsModel(browserGrid.getFullColumnModel(), filterToolbar.extractFilteredColumnIds()); AbstractColumnSettingsDataModelProvider provider = new AbstractColumnSettingsDataModelProvider(settingsModel) @@ -74,8 +84,32 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>> @Override public void onClose(List<ColumnDataModel> newColumnDataModels) { - MoveableColumnModel cm = browserGrid.getColumnModel(); - AbstractBrowserGrid.updateColumnsSettingsModel(cm, newColumnDataModels); + final ColumnModel newColumnModel = + createNewColumnModel(newColumnDataModels); + final List<String> filteredColumnIds = + getFilteredColumnIds(newColumnDataModels); + String gridDisplayTypeID = browserGrid.getGridDisplayTypeID(); + DisplaySettingsManager displaySettingsManager = + viewContext.getDisplaySettingsManager(); + displaySettingsManager.storeSettings(gridDisplayTypeID, + new IDisplaySettingsGetter() + { + + public Object getModifier() + { + return browserGrid; + } + + public List<String> getFilteredColumnIds() + { + return filteredColumnIds; + } + + public ColumnModel getColumnModel() + { + return newColumnModel; + } + }, false); // refresh the whole grid if custom columns changed List<GridCustomColumnInfo> newCustomColumns = tryGetCustomColumnsInfo(); @@ -86,15 +120,10 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>> } boolean customColumnsChanged = customColumnsMetadataProvider.getHasChangedAndSetFalse(); - if (customColumnsChanged) - { - browserGrid.recreateColumnModelAndRefreshColumnsWithFilters(); - } + browserGrid.recreateColumnModelAndRefreshColumnsWithFilters(); boolean columnFiltersChanged = - browserGrid.rebuildFiltersFromIds(AbstractBrowserGrid - .getFilteredColumnIds(newColumnDataModels)); - browserGrid.saveColumnDisplaySettings(); + browserGrid.rebuildFiltersFromIds(filteredColumnIds); if (customColumnsChanged || columnFiltersChanged) { @@ -130,4 +159,52 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>> }; ColumnSettingsDialog.show(viewContext, provider, browserGrid.getGridDisplayTypeID()); } + + /** + * Creates a new column model based on the specified column data models and the old full column + * model as provided by {@link AbstractBrowserGrid#getFullColumnModel()}. + */ + private ColumnModel createNewColumnModel(List<ColumnDataModel> newColumnDataModels) + { + Map<String, ColumnConfig> oldColumns = getOldColumns(); + List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); + for (ColumnDataModel columnDataModel : newColumnDataModels) + { + String columnID = columnDataModel.getColumnID(); + ColumnConfig column = oldColumns.get(columnID); + if (column == null) + { + String header = columnDataModel.getHeader(); + column = new ColumnConfig(columnID, header, DEFAULT_COLUMN_WIDTH); + } + column.setHidden(columnDataModel.isVisible() == false); + columns.add(column); + } + return new ColumnModel(columns); + } + + private Map<String, ColumnConfig> getOldColumns() + { + List<ColumnConfig> columns = browserGrid.getFullColumnModel().getColumns(); + HashMap<String, ColumnConfig> map = new HashMap<String, ColumnConfig>(); + for (ColumnConfig columnConfig : columns) + { + map.put(columnConfig.getId(), columnConfig); + } + return map; + } + + private static List<String> getFilteredColumnIds(List<ColumnDataModel> result) + { + List<String> filteredColumnsIds = new ArrayList<String>(); + for (ColumnDataModel model : result) + { + if (model.hasFilter() && filteredColumnsIds.size() < FilterToolbar.MAX_FILTER_FIELDS) + { + filteredColumnsIds.add(model.getColumnID()); + } + } + return filteredColumnsIds; + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/MoveableColumnModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/MoveableColumnModel.java deleted file mode 100644 index eeb9fecb2bfee7fb49554e37b7ee203e56acda47..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/MoveableColumnModel.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid; - -import java.util.List; - -import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; -import com.extjs.gxt.ui.client.widget.grid.ColumnModel; - -/** - * {@link ColumnModel} extension allowing to move columns. - * - * @author Izabela Adamczyk - */ -public class MoveableColumnModel extends ColumnModel -{ - - public MoveableColumnModel(List<ColumnConfig> columns) - { - super(columns); - } - - /** - * Moves the column from one position to another. - * - * @param fromIndex the old column index - * @param toIndex the new column index - */ - public void move(int fromIndex, int toIndex) - { - if (fromIndex != toIndex) - { - ColumnConfig c = configs.get(fromIndex); - configs.remove(fromIndex); - configs.add(toIndex, c); - // one event is triggered when all columns are set - } - } - - /** - * Removes the column from the specified position. - */ - public void remove(int fromIndex) - { - configs.remove(fromIndex); - } - - /** - * Adds the column at the specified position. - */ - public void addAt(int index, ColumnConfig columnConfig) - { - configs.add(index, columnConfig); - } - -} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/MoveableColumnModelEvent.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/MoveableColumnModelEvent.java deleted file mode 100644 index 1105f08181fa1d54e2c8d546f38e3a4d614db364..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/MoveableColumnModelEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid; - -import com.extjs.gxt.ui.client.event.ColumnModelEvent; -import com.extjs.gxt.ui.client.widget.grid.ColumnModel; - -/** - * {@link MoveableColumnModel} event. - * - * @author Izabela Adamczyk - */ -public class MoveableColumnModelEvent extends ColumnModelEvent -{ - - /** - * New index of the column. - */ - public int newColIndex; - - public MoveableColumnModelEvent(ColumnModel cm, int colIndex, int newColIndex) - { - super(cm, colIndex); - this.newColIndex = newColIndex; - } - -} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java index bc1aeb2a6c224a670bc8c4d23cfded1af04749cd..20dc48cda1bbb83537b23e4f42510186712f457d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java @@ -76,7 +76,7 @@ public class FilterToolbar<T> extends ToolBar implements IDatabaseModificationOb private final static int MAX_FILTER_FIELDS_ROWS = 4; - private final static int MAX_FILTER_FIELDS = MAX_FILTER_FIELDS_COLUMNS * MAX_FILTER_FIELDS_ROWS; + public final static int MAX_FILTER_FIELDS = MAX_FILTER_FIELDS_COLUMNS * MAX_FILTER_FIELDS_ROWS; public FilterToolbar(IViewContext<ICommonClientServiceAsync> viewContext, String gridId, IDisplayTypeIDProvider displayTypeIDProvider, IDelegatedAction applyFiltersAction)