diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/RealNumberRenderer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/RealNumberRenderer.java index 0794c5f85d9a15649d655053372b6171a9d0a660..5b4ef0763262a24c3ac320807c62715b0969a9d0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/RealNumberRenderer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/RealNumberRenderer.java @@ -33,9 +33,15 @@ public final class RealNumberRenderer implements GridCellRenderer<BaseEntityMode { format += "E000"; } - double doubleValue = Double.parseDouble(value); - String formattedValue = NumberFormat.getFormat(format).format(doubleValue); - return MultilineHTML.wrapUpInDivWithTooltip(formattedValue, value); + try + { + double doubleValue = Double.parseDouble(value); + String formattedValue = NumberFormat.getFormat(format).format(doubleValue); + return MultilineHTML.wrapUpInDivWithTooltip(formattedValue, value); + } catch (NumberFormatException ex) + { + return value; + } } private final RealNumberFormatingParameters realNumberFormatingParameters; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GridCustomColumnDefinition.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GridCustomColumnDefinition.java index 97ede91094c18f911df2eeb98d6d8924a9dd314c..f456e2c55f1ea247b275b7e3997704f4c174375e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GridCustomColumnDefinition.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GridCustomColumnDefinition.java @@ -21,6 +21,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridCustomColumnInfo; import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel; import ch.systemsx.cisd.openbis.generic.shared.basic.PrimitiveValue; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; /** * Column definition for a grid custom column. @@ -48,7 +49,8 @@ public class GridCustomColumnDefinition<T> implements IColumnDefinitionUI<T> public boolean isNumeric() { - return false; + DataTypeCode dataType = columnMetadata.getDataType(); + return dataType == DataTypeCode.INTEGER || dataType == DataTypeCode.REAL; } public boolean isLink() 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 21fccad7c59c7811d37c5c2b46f0bc4c6143c474..b691b6da1921b2d63c9c7c8751eff1966f6fb0b7 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 @@ -77,6 +77,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.ICl import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory; import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.InternalLinkCellRenderer; import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.MultilineStringCellRenderer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.RealNumberRenderer; 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; @@ -100,6 +101,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable; import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType; @@ -980,10 +982,24 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod { ColumnDefsAndConfigs<T> defsAndConfigs = createColumnsDefinition(); // add custom columns + List<GridCustomColumnInfo> customColumnsMetadata = + customColumnsMetadataProvider.tryGetCustomColumnsMetadata(); List<IColumnDefinitionUI<T>> customColumnsDefs = - createCustomColumnDefinitions(customColumnsMetadataProvider - .tryGetCustomColumnsMetadata()); + createCustomColumnDefinitions(customColumnsMetadata); defsAndConfigs.addColumns(customColumnsDefs); + if (customColumnsMetadata != null) + { + RealNumberRenderer renderer = + new RealNumberRenderer(viewContext.getDisplaySettingsManager() + .getRealNumberFormatingParameters()); + for (GridCustomColumnInfo gridCustomColumnInfo : customColumnsMetadata) + { + if (gridCustomColumnInfo.getDataType() == DataTypeCode.REAL) + { + defsAndConfigs.setGridCellRendererFor(gridCustomColumnInfo.getCode(), renderer); + } + } + } this.columnDefinitions = defsAndConfigs.getColumnDefs(); ColumnModel columnModel = createColumnModel(defsAndConfigs.getColumnConfigs()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnSettingsDataModelProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnSettingsDataModelProvider.java index 66a3513d8d1fe14631e08c96525128af3f3fe389..d09f33c496999d7d2f3481e3acdaf0c4ec704f16 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnSettingsDataModelProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnSettingsDataModelProvider.java @@ -96,7 +96,7 @@ public abstract class AbstractColumnSettingsDataModelProvider private GridCustomColumnInfo createCustomColumnInfo(GridCustomColumn column) { - return new GridCustomColumnInfo(getId(column), column.getName(), column.getDescription()); + return new GridCustomColumnInfo(getId(column), column.getName(), column.getDescription(), column.getDataType()); } private void addColumns(List<GridCustomColumn> columns) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/GridCustomColumnInfo.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/GridCustomColumnInfo.java index 8cfdfc4a4dbd5d7b3486303684d42a318a436e62..714fd3635812050f458e6443173dd78f6cff3282 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/GridCustomColumnInfo.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/GridCustomColumnInfo.java @@ -18,6 +18,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.dto; import com.google.gwt.user.client.rpc.IsSerializable; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; + /** * Basic metadata about a grid custom column: code (column identifier), label and description. * @@ -31,11 +33,14 @@ public class GridCustomColumnInfo implements IsSerializable private String description; - public GridCustomColumnInfo(String code, String label, String description) + private DataTypeCode dataType; + + public GridCustomColumnInfo(String code, String label, String description, DataTypeCode dataType) { this.code = code; this.label = label; this.description = description; + this.dataType = dataType; } public String getCode() @@ -58,6 +63,11 @@ public class GridCustomColumnInfo implements IsSerializable { return description; } + + public DataTypeCode getDataType() + { + return dataType; + } @Override public boolean equals(Object obj) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericColumnsHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericColumnsHelper.java index 8fcaac3afb76afa94fb49bfc9fd6263abd2a152d..a2eae7faba4eb099b6dcfbf3f16252a906350780 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericColumnsHelper.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/GenericColumnsHelper.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import ch.systemsx.cisd.openbis.generic.client.web.server.util.DataTypeUtils; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DateTableCell; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericTableColumnHeader; @@ -33,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SerializableComparableIDDecorator; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell; +import ch.systemsx.cisd.openbis.generic.shared.util.DataTypeUtils; /** * @author Franz-Josef Elmer diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java index ee1574cd3a6bafb90481589197bfaa286479b8fb..66dcd02922d15fd98cbe92325625e4a7d311bc1e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java @@ -37,6 +37,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition; import ch.systemsx.cisd.openbis.generic.shared.basic.PrimitiveValue; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person; +import ch.systemsx.cisd.openbis.generic.shared.util.DataTypeUtils; /** * Utility class containing functions helpful with dealing with grid custom filters or columns. @@ -127,6 +128,8 @@ public class GridExpressionUtils String columnId = customColumn.getCode(); RowCalculator<T> calculator = calculators.get(columnId); PrimitiveValue value = evalCustomColumn(rowData, customColumn, calculator); + customColumn.setDataType(DataTypeUtils.getCompatibleDataType(customColumn + .getDataType(), value.getDataType())); customColumnValues.put(columnId, value); } result.add(new GridRowModel<T>(rowData, customColumnValues)); @@ -157,7 +160,7 @@ public class GridExpressionUtils { GridCustomColumnInfo columnInfo = new GridCustomColumnInfo(column.getCode(), column.getName(), column - .getDescription()); + .getDescription(), column.getDataType()); result.add(columnInfo); } return result; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/PrimitiveValue.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/PrimitiveValue.java index 8f5964e13b626f864d0a43961e1cbfcce3d3060d..581e1844d2a61d41199ed168fbe38a868d5b97a8 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/PrimitiveValue.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/PrimitiveValue.java @@ -18,6 +18,8 @@ package ch.systemsx.cisd.openbis.generic.shared.basic; import com.google.gwt.user.client.rpc.IsSerializable; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; + /** * Stores one primitive value: Double, Long or String. * <p> @@ -49,7 +51,20 @@ public class PrimitiveValue implements IsSerializable { stringValueOrNull = value; } - + + public DataTypeCode getDataType() + { + if (doubleValueOrNull != null) + { + return DataTypeCode.REAL; + } + if (longValueOrNull != null) + { + return DataTypeCode.INTEGER; + } + return DataTypeCode.VARCHAR; + } + public Comparable<?> getComparableValue() { if (doubleValueOrNull != null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomColumn.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomColumn.java index c3cc927c3110646f09a92e021a182519893cfd20..fc21d1036bdd5667eca2f2cb00fb79cbad833979 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomColumn.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomColumn.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; + /** * Stores information describing the grid custom column. * @@ -27,6 +28,7 @@ public class GridCustomColumn extends AbstractGridExpression private static final long serialVersionUID = ServiceVersionHolder.VERSION; private String code; + private DataTypeCode dataType; public String getCode() { @@ -37,4 +39,15 @@ public class GridCustomColumn extends AbstractGridExpression { this.code = code; } + + public void setDataType(DataTypeCode dataType) + { + this.dataType = dataType; + } + + public DataTypeCode getDataType() + { + return dataType; + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DataTypeUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java similarity index 77% rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DataTypeUtils.java rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java index adf626ff6874b55951f37c1b6e0940122f0e8f2d..e15abd5d91011caa92aa45a8f4d6cf5d4f3cf4dc 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DataTypeUtils.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ch.systemsx.cisd.openbis.generic.client.web.server.util; +package ch.systemsx.cisd.openbis.generic.shared.util; import java.util.HashMap; import java.util.Map; @@ -124,6 +124,43 @@ public class DataTypeUtils return Converter.resolve(dataTypeCode).convert(value); } + /** + * Returns a data type which is compatible with the previous data type and the new data type. + */ + public static DataTypeCode getCompatibleDataType(DataTypeCode previousDataTypeOrNull, DataTypeCode dataType) + { + if (previousDataTypeOrNull == null) + { + return dataType; + } + if (previousDataTypeOrNull == DataTypeCode.REAL) + { + if (dataType == DataTypeCode.REAL || dataType == DataTypeCode.INTEGER) + { + return DataTypeCode.REAL; + } + return DataTypeCode.VARCHAR; + } + if (previousDataTypeOrNull == DataTypeCode.INTEGER) + { + if (dataType == DataTypeCode.REAL) + { + return DataTypeCode.REAL; + } + if (dataType == DataTypeCode.INTEGER) + { + return DataTypeCode.INTEGER; + } + return DataTypeCode.VARCHAR; + } + if (previousDataTypeOrNull == DataTypeCode.TIMESTAMP + && dataType == DataTypeCode.TIMESTAMP) + { + return DataTypeCode.TIMESTAMP; + } + return DataTypeCode.VARCHAR; + } + private DataTypeUtils() { }