static Slice MakeAutoCustomSlice(FdoCache cache, ICmObject obj, XmlNode caller)
{
IFwMetaDataCache mdc = cache.DomainDataByFlid.MetaDataCache;
int flid = GetCustomFieldFlid(caller, mdc, obj);
if (flid == 0)
return null;
Slice slice = null;
var type = (CellarPropertyType) mdc.GetFieldType(flid);
switch (type)
{
case CellarPropertyType.String:
case CellarPropertyType.MultiUnicode:
case CellarPropertyType.MultiString:
int ws = mdc.GetFieldWs(flid);
switch (ws)
{
case 0: // a desperate default.
case WritingSystemServices.kwsAnal:
slice = new StringSlice(obj, flid, cache.DefaultAnalWs);
break;
case WritingSystemServices.kwsVern:
slice = new StringSlice(obj, flid, cache.DefaultVernWs);
break;
case WritingSystemServices.kwsAnals:
case WritingSystemServices.kwsVerns:
case WritingSystemServices.kwsAnalVerns:
case WritingSystemServices.kwsVernAnals:
slice = new MultiStringSlice(obj, flid, ws, 0, false, true, true);
break;
default:
throw new Exception("unhandled ws code in MakeAutoCustomSlice");
}
break;
case CellarPropertyType.Integer:
slice = new IntegerSlice(cache, obj, flid);
break;
case CellarPropertyType.GenDate:
slice = new GenDateSlice(cache, obj, flid);
break;
case CellarPropertyType.OwningAtomic:
int dstClsid = mdc.GetDstClsId(flid);
if (dstClsid == StTextTags.kClassId)
slice = new StTextSlice(obj, flid, cache.DefaultAnalWs);
break;
case CellarPropertyType.ReferenceAtomic:
slice = new AtomicReferenceSlice(cache, obj, flid);
break;
case CellarPropertyType.ReferenceCollection:
case CellarPropertyType.ReferenceSequence:
slice = new ReferenceVectorSlice(cache, obj, flid);
break;
}
if (slice == null)
throw new Exception("unhandled field type in MakeAutoCustomSlice");
slice.Label = mdc.GetFieldLabel(flid);
return slice;
}