Revision 44673 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/featuretype/DefaultFeatureTypeAttributePanel.java

View differences:

DefaultFeatureTypeAttributePanel.java
62 62
import org.gvsig.timesupport.RelativeInterval;
63 63
import org.gvsig.tools.ToolsLocator;
64 64
import org.gvsig.tools.dataTypes.DataType;
65
import org.gvsig.tools.dataTypes.DataType.NumberPrecisionAndScale;
65 66
import org.gvsig.tools.dataTypes.DataTypesManager;
66 67
import org.gvsig.tools.dynobject.DynObjectValueItem;
67 68
import org.gvsig.tools.i18n.I18nManager;
......
403 404
    private DatePickerController pickerIntervalEnd;
404 405
    private DatePickerController pickerIntervalStart;
405 406
    private CalculatorController<Integer> pickerSize;
407
    private CalculatorController<Integer> pickerPrecision;
406 408
    private CalculatorController<Integer> pickerScale;
407 409
    private CalculatorController<Object> pickerDefaultValue;
408 410
    private PickerController<IProjection> pickerCRS;
......
496 498
        swingManager.translate(this.lblIntervalStart);
497 499
        swingManager.translate(this.lblIsAutomatic);
498 500
        swingManager.translate(this.lblIsPrimaryKey);
501
        swingManager.translate(this.lblPrecision);
499 502
        swingManager.translate(this.lblScale);
500 503
        swingManager.translate(this.lblSize);
501 504
        swingManager.translate(this.chkVirtualField);
......
580 583
        this.pickerSize = evaluatorManager.createCalculatorController(
581 584
                this.txtSize, DataTypes.INT
582 585
        );
586
        this.pickerPrecision = evaluatorManager.createCalculatorController(
587
                this.txtPrecision, DataTypes.INT
588
        );
583 589
        this.pickerScale = evaluatorManager.createCalculatorController(
584 590
                this.txtScale, DataTypes.INT
585 591
        );
......
643 649
            }
644 650
        });
645 651

  
646
        this.pickerScale.addChangeListener(new ChangeListener() {
652
        this.pickerPrecision.addChangeListener(new ChangeListener() {
647 653
            @Override
648 654
            public void stateChanged(ChangeEvent e) {
649 655
                doCheckPrecisionAndScale();
650 656
            }
651 657
        });
652
        this.pickerSize.addChangeListener(new ChangeListener() {
658
        this.pickerScale.addChangeListener(new ChangeListener() {
653 659
            @Override
654 660
            public void stateChanged(ChangeEvent e) {
655 661
                doCheckPrecisionAndScale();
......
692 698
            descriptor.setIsPrimaryKey(this.chkIsPrimaryKey.isSelected());
693 699
            descriptor.setIsAutomatic(this.chkIsAutomatic.isSelected());
694 700
            descriptor.setSize(this.pickerSize.get(0));
701
            descriptor.setPrecision(this.pickerPrecision.get(0));
695 702
            descriptor.setScale(this.pickerScale.get(0));
696 703
            descriptor.setDefaultValue(this.pickerDefaultValue.get());
697 704
            descriptor.setDataProfileName((String) ListElement.getSelected(this.cboDataProfile));
......
895 902
            this.pickerIntervalEnd.set(interval.getEnd().toDate());
896 903
            this.pickerIntervalStart.set(interval.getStart().toDate());
897 904
        }
898
        this.pickerScale.set(descriptor.getScale());
899 905
        this.pickerSize.set(descriptor.getSize());
906
        this.pickerPrecision.set(descriptor.getPrecision());
907
        this.pickerScale.set(descriptor.getScale());
900 908

  
901 909
        this.chkAllowNulls.setSelected(descriptor.allowNull());
902 910
        this.chkIsAutomatic.setSelected(descriptor.isAutomatic());
......
961 969
        this.updateEditableStates();
962 970
    }
963 971

  
972
    private DataType getDataType() {
973
      Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
974
      if (fieldType == null) {
975
          return null;
976
      }
977
      DataType dataType = ToolsLocator.getDataTypesManager().get(fieldType);
978
      return dataType;
979
    }
980

  
964 981
    private void doFieldTypeChanged() {
965
        try {
966
            Integer fieldType = (Integer) ListElement.getSelected(this.cboFieldType);
967
            if (fieldType == null) {
968
                fieldType = DataTypes.UNKNOWN;
969
            }
970
            Integer size = this.pickerSize.get();
971
            if (fieldType == DataTypes.STRING) {
972
                if (size == null) {
973
                    this.pickerSize.set(50);
974
                }
975
            } else {
976
                int maxsize = this.getMaxSizeOfType(fieldType);
977
                if (size == null || (maxsize > 0 && size > maxsize)) {
978
                    this.pickerSize.set(maxsize);
979
                }
980
            }
981
            Integer scale = this.pickerScale.get();
982
            if (scale == null) {
983
                int defaultScale = this.getDefaultScaleOfType(fieldType);
984
                if (defaultScale > 0) {
985
                    this.pickerScale.set(defaultScale);
986
                }
987
            }
982
      try {
983
        DataType dataType = this.getDataType();
988 984

  
989
            switch (fieldType) {
990
                case DataTypes.GEOMETRY:
991
                    this.cboGeometryType.setEnabled(this.mode==MODE_EDIT_ALL);
992
                    this.cboGeometrySubtype.setEnabled(this.mode==MODE_EDIT_ALL);
993
                    this.pickerCRS.setEditable(this.mode==MODE_EDIT_ALL);
994
                    this.cboDateFormat.setEnabled(false);
995
                    this.pickerIntervalStart.setEditable(false);
996
                    this.pickerIntervalEnd.setEditable(false);
997
                    this.tabAditionalFields.setEnabledAt(1, true);
998
                    this.tabAditionalFields.setEnabledAt(2, false);
999
                    this.pickerSize.set(null);
1000
                    this.pickerScale.set(null);
1001
                    this.pickerSize.setEditable(false);
1002
                    this.pickerScale.setEditable(false);
1003
                    break;
1004
                case DataTypes.INSTANT:
1005
                case DataTypes.INTERVAL:
1006
                case DataTypes.DATE:
1007
                case DataTypes.TIME:
1008
                case DataTypes.TIMESTAMP:
1009
                    this.cboGeometryType.setEnabled(false);
1010
                    this.cboGeometrySubtype.setEnabled(false);
1011
                    this.pickerCRS.setEditable(false);
1012
                    this.cboDateFormat.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
1013
                    this.pickerIntervalStart.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
1014
                    this.pickerIntervalEnd.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
1015
                    this.tabAditionalFields.setEnabledAt(1, false);
1016
                    this.tabAditionalFields.setEnabledAt(2, true);
1017
                    this.pickerSize.set(null);
1018
                    this.pickerScale.set(null);
1019
                    this.pickerSize.setEditable(false);
1020
                    this.pickerScale.setEditable(false);
1021
                    break;
1022
                case DataTypes.BYTE:
1023
                case DataTypes.INT:
1024
                case DataTypes.LONG:
1025
                case DataTypes.STRING:
1026
                case DataTypes.FILE:
1027
                case DataTypes.URL:
1028
                case DataTypes.URI:
1029
                    this.cboGeometryType.setEnabled(false);
1030
                    this.cboGeometrySubtype.setEnabled(false);
1031
                    this.pickerCRS.setEditable(false);
1032
                    this.cboDateFormat.setEnabled(false);
1033
                    this.pickerIntervalStart.setEditable(false);
1034
                    this.pickerIntervalEnd.setEditable(false);
1035
                    this.tabAditionalFields.setEnabledAt(1, false);
1036
                    this.tabAditionalFields.setEnabledAt(2, false);
1037

  
1038
                    this.pickerScale.set(null);
1039
                    this.pickerSize.setEditable(this.mode==MODE_EDIT_ALL);
1040
                    this.pickerScale.setEditable(false);
1041
                    break;
1042
                case DataTypes.FLOAT:
1043
                case DataTypes.DOUBLE:
1044
                    this.cboGeometryType.setEnabled(false);
1045
                    this.cboGeometrySubtype.setEnabled(false);
1046
                    this.pickerCRS.setEditable(false);
1047
                    this.cboDateFormat.setEnabled(false);
1048
                    this.pickerIntervalStart.setEditable(false);
1049
                    this.pickerIntervalEnd.setEditable(false);
1050
                    this.tabAditionalFields.setEnabledAt(1, false);
1051
                    this.tabAditionalFields.setEnabledAt(2, false);
1052

  
1053
                    this.pickerSize.setEditable(this.mode==MODE_EDIT_ALL);
1054
                    this.pickerScale.setEditable(this.mode==MODE_EDIT_ALL);
1055
                    break;
1056
                default:
1057
                    this.cboGeometryType.setEnabled(false);
1058
                    this.cboGeometrySubtype.setEnabled(false);
1059
                    this.pickerCRS.setEditable(false);
1060
                    this.cboDateFormat.setEnabled(false);
1061
                    this.pickerIntervalStart.setEditable(false);
1062
                    this.pickerIntervalEnd.setEditable(false);
1063
                    this.tabAditionalFields.setEnabledAt(1, false);
1064
                    this.tabAditionalFields.setEnabledAt(2, false);
1065
                    this.pickerSize.set(null);
1066
                    this.pickerScale.set(null);
1067
                    this.pickerSize.setEditable(false);
1068
                    this.pickerScale.setEditable(false);
1069
            }
1070
        } catch (Exception ex) {
1071
            LOGGER.warn("Problems changing field type.", ex);
985
        if( dataType.supportSize() ) {
986
            this.pickerSize.setEditable(this.mode == MODE_EDIT_ALL);
987
        } else {
988
            this.pickerSize.setEditable(false);
989
            this.pickerSize.set(null);
990
        }        
991
        if( dataType.supportPrecision()) {
992
            this.pickerPrecision.setEditable(this.mode == MODE_EDIT_ALL);
993
        } else {
994
            this.pickerPrecision.setEditable(false);
995
            this.pickerPrecision.set(null);
996
        }        
997
        if( dataType.supportScale()) {
998
            this.pickerScale.setEditable(this.mode == MODE_EDIT_ALL);
999
        } else {
1000
            this.pickerScale.setEditable(false);
1001
            this.pickerScale.set(null);
1002
        }        
1003
        switch (dataType.getType()) {
1004
          case DataTypes.GEOMETRY:
1005
            this.cboGeometryType.setEnabled(this.mode == MODE_EDIT_ALL);
1006
            this.cboGeometrySubtype.setEnabled(this.mode == MODE_EDIT_ALL);
1007
            this.pickerCRS.setEditable(this.mode == MODE_EDIT_ALL);
1008
            this.cboDateFormat.setEnabled(false);
1009
            this.pickerIntervalStart.setEditable(false);
1010
            this.pickerIntervalEnd.setEditable(false);
1011
            this.tabAditionalFields.setEnabledAt(1, true);
1012
            this.tabAditionalFields.setEnabledAt(2, false);
1013
            break;
1014
          case DataTypes.INSTANT:
1015
          case DataTypes.INTERVAL:
1016
          case DataTypes.DATE:
1017
          case DataTypes.TIME:
1018
          case DataTypes.TIMESTAMP:
1019
            this.cboGeometryType.setEnabled(false);
1020
            this.cboGeometrySubtype.setEnabled(false);
1021
            this.pickerCRS.setEditable(false);
1022
            this.cboDateFormat.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1023
            this.pickerIntervalStart.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1024
            this.pickerIntervalEnd.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
1025
            this.tabAditionalFields.setEnabledAt(1, false);
1026
            this.tabAditionalFields.setEnabledAt(2, true);
1027
            break;
1028
          case DataTypes.BYTE:
1029
          case DataTypes.INT:
1030
          case DataTypes.LONG:
1031
          case DataTypes.STRING:
1032
          case DataTypes.FILE:
1033
          case DataTypes.URL:
1034
          case DataTypes.URI:
1035
          case DataTypes.FLOAT:
1036
          case DataTypes.DOUBLE:
1037
          case DataTypes.DECIMAL:
1038
            this.cboGeometryType.setEnabled(false);
1039
            this.cboGeometrySubtype.setEnabled(false);
1040
            this.pickerCRS.setEditable(false);
1041
            this.cboDateFormat.setEnabled(false);
1042
            this.pickerIntervalStart.setEditable(false);
1043
            this.pickerIntervalEnd.setEditable(false);
1044
            this.tabAditionalFields.setEnabledAt(1, false);
1045
            this.tabAditionalFields.setEnabledAt(2, false);
1046
            break;
1047
          default:
1048
            this.cboGeometryType.setEnabled(false);
1049
            this.cboGeometrySubtype.setEnabled(false);
1050
            this.pickerCRS.setEditable(false);
1051
            this.cboDateFormat.setEnabled(false);
1052
            this.pickerIntervalStart.setEditable(false);
1053
            this.pickerIntervalEnd.setEditable(false);
1054
            this.tabAditionalFields.setEnabledAt(1, false);
1055
            this.tabAditionalFields.setEnabledAt(2, false);
1072 1056
        }
1057
      } catch (Exception ex) {
1058
        LOGGER.warn("Problems changing field type.", ex);
1059
      }
1073 1060

  
1074 1061
    }
1062
    
1075 1063
    boolean isVirtualField() {
1076 1064
        return this.chkVirtualField.isSelected();
1077 1065
    }
......
1088 1076
    }
1089 1077
    
1090 1078
    private void updateEditableStates() {
1079
        DataType dataType = this.getDataType();
1091 1080
        switch(this.mode) {
1092 1081
            case MODE_EDIT_ALL:
1093 1082
                this.pickerDefaultValue.setEditable(true);
1094 1083
                this.txtFieldName.setEditable(true);
1095 1084
                this.pickerIntervalEnd.setEditable(true);
1096 1085
                this.pickerIntervalStart.setEditable(true);
1097
                this.pickerScale.setEditable(true);
1098
                this.pickerSize.setEditable(true);
1086
                this.pickerSize.setEditable(dataType.supportSize());
1087
                if( dataType.isFixedPrecision() ) {
1088
                  this.pickerPrecision.setEditable(false);
1089
                  this.pickerPrecision.set(dataType.getMaxPrecision());
1090
                } else {
1091
                  this.pickerPrecision.setEditable(dataType.supportPrecision());
1092
                }
1093
                this.pickerScale.setEditable(dataType.supportScale());
1099 1094
                this.cboDataProfile.setEnabled(true);
1100 1095

  
1101 1096
                this.chkAllowNulls.setEnabled(true);
......
1138 1133
                    this.pickerCRS.setEditable(true);
1139 1134
                } else {
1140 1135
                    this.txtFieldName.setEditable(false);
1136
                    this.pickerPrecision.setEditable(false);
1141 1137
                    this.pickerScale.setEditable(false);
1142 1138
                    this.pickerSize.setEditable(false);
1143 1139
                    this.pickerVirtualField.setEditable(false);
......
1181 1177
                this.txtFieldName.setEditable(false);
1182 1178
                this.pickerIntervalEnd.setEditable(false);
1183 1179
                this.pickerIntervalStart.setEditable(false);
1180
                this.pickerPrecision.setEditable(false);
1184 1181
                this.pickerScale.setEditable(false);
1185 1182
                this.pickerSize.setEditable(false);
1186 1183
                this.cboDataProfile.setEnabled(false);
......
1212 1209
        }
1213 1210
    }
1214 1211

  
1215
    private int getMaxSizeOfType(int dataType) {
1216
        switch (dataType) {
1217
            case DataTypes.BOOLEAN:
1218
                return 1;
1219
            case DataTypes.BYTE:
1220
                return 3;
1221
            case DataTypes.INT:
1222
                return 9;
1223
            case DataTypes.LONG:
1224
                return 19;
1225
            case DataTypes.FLOAT:
1226
                return 20;
1227
            case DataTypes.DOUBLE:
1228
                return 20;
1229
            case DataTypes.DATE:
1230
                return 8;
1231
            default:
1232
                return -1;
1233
        }
1234
    }
1235

  
1236
    private int getDefaultScaleOfType(int dataType) {
1237
        switch (dataType) {
1238
            case DataTypes.FLOAT:
1239
                return 6;
1240
            case DataTypes.DOUBLE:
1241
                return 6;
1242
            case DataTypes.DECIMAL:
1243
                return 6;
1244
            default:
1245
                return -1;
1246
        }
1247
    }
1248

  
1249 1212
    private void doCheckPrecisionAndScale() {
1250
        Integer size = this.pickerSize.get();
1251
        if (size == null) {
1252
            return;
1253
        }
1254
        int maxsize = this.getMaxSizeOfType((int) ListElement.getSelected(cboFieldType));
1255
        if (size < 1 || (maxsize > 0 && size > maxsize)) {
1256
            this.pickerSize.setWarning(true, "The size is not valid for the selected type");
1257
        } else {
1258
            this.pickerSize.setWarning(false);
1259
        }
1260
        if (this.pickerScale.isEnabled()) {
1261
            Integer precision = this.pickerScale.get();
1262
            if (precision == null) {
1263
                return;
1264
            }
1265
            if (precision < 0) {
1266
                this.pickerScale.setWarning(true, "the precision can not have a negative value");
1267
            } else if (precision > size) {
1268
                this.pickerScale.setWarning(true, "the precision can not have a value greater than the size");
1269
            } else {
1270
                this.pickerScale.setWarning(false);
1271
            }
1272
        }
1213
      DataType dataType = this.getDataType();
1214
      
1215
      Integer precision = this.pickerPrecision.get();
1216
      if( precision==null ) {
1217
        precision = 0;
1218
      }
1219
      Integer scale = this.pickerScale.get();
1220
      if( scale == null ) {
1221
        scale = 0;
1222
      }      
1223
      NumberPrecisionAndScale r = dataType.fixPrecisionAndScale(precision, scale);
1224
      if( r.getPrecision()!=precision || r.getScale()!=scale ) {
1225
        this.pickerPrecision.setWarning(true, "The precision/scale are not valids");
1226
        this.pickerScale.setWarning(true, "The precision/scale are not valids");
1227
      } else {
1228
        this.pickerPrecision.setWarning(false);
1229
        this.pickerScale.setWarning(false);
1230
      }
1273 1231
    }
1274 1232

  
1275 1233
    @Override

Also available in: Unified diff