public static Slice Create(FdoCache cache, string editor, int flid, XmlNode node, ICmObject obj, StringTable stringTbl, IPersistenceProvider persistenceProvider, Mediator mediator, XmlNode caller, ObjSeqHashMap reuseMap) { Slice slice; switch(editor) { case "multistring": // first, these are the most common slices. { if (flid == 0) throw new ApplicationException("field attribute required for multistring " + node.OuterXml); string wsSpec = XmlUtils.GetOptionalAttributeValue(node, "ws"); int wsMagic = WritingSystemServices.GetMagicWsIdFromName(wsSpec); if (wsMagic == 0) throw new ApplicationException( "ws must be 'all vernacular', 'all analysis', 'analysis vernacular', or 'vernacular analysis'" + " it said '" + wsSpec + "'."); bool forceIncludeEnglish = XmlUtils.GetOptionalBooleanAttributeValue(node, "forceIncludeEnglish", false); bool spellCheck = XmlUtils.GetOptionalBooleanAttributeValue(node, "spell", true); // Either the part or the caller can specify that it isn't editable. // (The part may 'know' this, e.g. because it's a virtual attr not capable of editing; // more commonly the caller knows there isn't enough context for safe editing. bool editable = XmlUtils.GetOptionalBooleanAttributeValue(caller, "editable", true) && XmlUtils.GetOptionalBooleanAttributeValue(node, "editable", true); string optionalWsSpec = XmlUtils.GetOptionalAttributeValue(node, "optionalWs"); int wsMagicOptional = WritingSystemServices.GetMagicWsIdFromName(optionalWsSpec); MultiStringSlice msSlice = reuseMap.GetSliceToReuse("MultiStringSlice") as MultiStringSlice; if (msSlice == null) slice = new MultiStringSlice(obj, flid, wsMagic, wsMagicOptional, forceIncludeEnglish, editable, spellCheck); else { slice = msSlice; msSlice.Reuse(obj, flid, wsMagic, wsMagicOptional, forceIncludeEnglish, editable, spellCheck); } break; } case "defaultvectorreference": // second most common. { var rvSlice = reuseMap.GetSliceToReuse("ReferenceVectorSlice") as ReferenceVectorSlice; if (rvSlice == null) slice = new ReferenceVectorSlice(cache, obj, flid); else { slice = rvSlice; rvSlice.Reuse(obj, flid); } break; } case "possvectorreference": { var prvSlice = reuseMap.GetSliceToReuse("PossibilityReferenceVectorSlice") as PossibilityReferenceVectorSlice; if (prvSlice == null) slice = new PossibilityReferenceVectorSlice(cache, obj, flid); else { slice = prvSlice; prvSlice.Reuse(obj, flid); } break; } case "semdomvectorreference": { var prvSlice = reuseMap.GetSliceToReuse("SemanticDomainReferenceVectorSlice") as SemanticDomainReferenceVectorSlice; if (prvSlice == null) slice = new SemanticDomainReferenceVectorSlice(cache, obj, flid); else { slice = prvSlice; prvSlice.Reuse(obj, flid); } break; } case "string": { if (flid == 0) throw new ApplicationException("field attribute required for basic properties " + node.OuterXml); int ws = GetWs(mediator, cache, node); if (ws != 0) slice = new StringSlice(obj, flid, ws); else slice = new StringSlice(obj, flid); var fShowWsLabel = XmlUtils.GetOptionalBooleanAttributeValue(node, "labelws", false); if (fShowWsLabel) (slice as StringSlice).ShowWsLabel = true; int wsEmpty = GetWs(mediator, cache, node, "wsempty"); if (wsEmpty != 0) (slice as StringSlice).DefaultWs = wsEmpty; break; } case "jtview": { string layout = XmlUtils.GetOptionalAttributeValue(caller, "param"); if (layout == null) layout = XmlUtils.GetManditoryAttributeValue(node, "layout"); // Editable if BOTH the caller (part ref) AND the node itself (the slice) say so...or at least if neither says not. bool editable = XmlUtils.GetOptionalBooleanAttributeValue(caller, "editable", true) && XmlUtils.GetOptionalBooleanAttributeValue(node, "editable", true); slice = new ViewSlice(new XmlView(obj.Hvo, layout, stringTbl, editable)); break; } case "summary": { slice = new SummarySlice(); break; } case "enumcombobox": { slice = new EnumComboSlice(cache, obj, flid, stringTbl, node["deParams"]); break; } case "referencecombobox": { slice = new ReferenceComboBoxSlice(cache, obj, flid, persistenceProvider); break; } case "typeaheadrefatomic": { slice = new AtomicRefTypeAheadSlice(obj, flid); break; } case "msareferencecombobox": { slice = new MSAReferenceComboBoxSlice(cache, obj, flid, persistenceProvider); break; } case "lit": // was "message" { string message = XmlUtils.GetManditoryAttributeValue(node, "message"); if (stringTbl != null) { string sTranslate = XmlUtils.GetOptionalAttributeValue(node, "translate", ""); if (sTranslate.Trim().ToLower() != "do not translate") message = stringTbl.LocalizeLiteralValue(message); } slice = new MessageSlice(message); break; } case "picture": { slice = new PictureSlice((ICmPicture)obj); break; } case "image": { try { slice = new ImageSlice(FwDirectoryFinder.CodeDirectory, XmlUtils.GetManditoryAttributeValue(node, "param1")); } catch (Exception error) { slice = new MessageSlice(String.Format(DetailControlsStrings.ksImageSliceFailed, error.Message)); } break; } case "checkbox": { slice = new CheckboxSlice(cache, obj, flid, node); break; } case "checkboxwithrefresh": { slice = new CheckboxRefreshSlice(cache, obj, flid, node); break; } case "time": { slice = new DateSlice(cache, obj, flid); break; } case "integer": // produced in the auto-generated parts from the conceptual model case "int": // was "integer" { slice = new IntegerSlice(cache, obj, flid); break; } case "gendate": { slice = new GenDateSlice(cache, obj, flid); break; } case "morphtypeatomicreference": { slice = new MorphTypeAtomicReferenceSlice(cache, obj, flid); break; } case "atomicreferencepos": { slice = new AtomicReferencePOSSlice(cache, obj, flid, persistenceProvider, mediator); break; } case "possatomicreference": { slice = new PossibilityAtomicReferenceSlice(cache, obj, flid); break; } case "atomicreferenceposdisabled": { slice = new AutomicReferencePOSDisabledSlice(cache, obj, flid, persistenceProvider, mediator); break; } case "defaultatomicreference": { slice = new AtomicReferenceSlice(cache, obj, flid); break; } case "defaultatomicreferencedisabled": { slice = new AtomicReferenceDisabledSlice(cache, obj, flid); break; } case "derivmsareference": { slice = new DerivMSAReferenceSlice(cache, obj, flid); break; } case "inflmsareference": { slice = new InflMSAReferenceSlice(cache, obj, flid); break; } case "phoneenvreference": { slice = new PhoneEnvReferenceSlice(cache, obj, flid); break; } case "sttext": { slice = new StTextSlice(obj, flid, GetWs(mediator, cache, node)); break; } case "custom": { slice = (Slice)DynamicLoader.CreateObject(node); break; } case "customwithparams": { slice = (Slice)DynamicLoader.CreateObject(node, new object[]{cache, editor, flid, node, obj, stringTbl, persistenceProvider, GetWs(mediator, cache, node)}); break; } case "ghostvector": { slice = new GhostReferenceVectorSlice(cache, obj, node); break; } case "command": { slice = new CommandSlice(node["deParams"]); break; } case null: //grouping nodes do not necessarily have any editor { slice = new Slice(); break; } case "message": // case "integer": // added back in to behave as "int" above throw new Exception("use of obsolete editor type (message->lit, integer->int)"); case "autocustom": slice = MakeAutoCustomSlice(cache, obj, caller); if (slice == null) return null; break; case "defaultvectorreferencedisabled": // second most common. { ReferenceVectorDisabledSlice rvSlice = reuseMap.GetSliceToReuse("ReferenceVectorDisabledSlice") as ReferenceVectorDisabledSlice; if (rvSlice == null) slice = new ReferenceVectorDisabledSlice(cache, obj, flid); else { slice = rvSlice; rvSlice.Reuse(obj, flid); } break; } default: { //Since the editor has not been implemented yet, //is there a bitmap file that we can show for this editor? //Such bitmaps belong in the distFiles xde directory string fwCodeDir = FwDirectoryFinder.CodeDirectory; string editorBitmapRelativePath = "xde/" + editor + ".bmp"; if(File.Exists(Path.Combine(fwCodeDir, editorBitmapRelativePath))) slice = new ImageSlice(fwCodeDir, editorBitmapRelativePath); else slice = new MessageSlice(String.Format(DetailControlsStrings.ksBadEditorType, editor)); break; } } slice.AccessibleName = editor; return slice; }
/// <summary></summary> public static Slice Create(FdoCache cache, string editor, int flid, XmlNode node, ICmObject obj, StringTable stringTbl, IPersistenceProvider persistenceProvider, Mediator mediator, XmlNode caller, ObjSeqHashMap reuseMap) { Slice slice; switch (editor) { case "multistring": // first, these are the most common slices. { if (flid == 0) { throw new ApplicationException("field attribute required for multistring " + node.OuterXml); } string wsSpec = XmlUtils.GetOptionalAttributeValue(node, "ws"); int wsMagic = WritingSystemServices.GetMagicWsIdFromName(wsSpec); if (wsMagic == 0) { throw new ApplicationException( "ws must be 'all vernacular', 'all analysis', 'analysis vernacular', or 'vernacular analysis'" + " it said '" + wsSpec + "'."); } bool forceIncludeEnglish = XmlUtils.GetOptionalBooleanAttributeValue(node, "forceIncludeEnglish", false); bool spellCheck = XmlUtils.GetOptionalBooleanAttributeValue(node, "spell", true); // Either the part or the caller can specify that it isn't editable. // (The part may 'know' this, e.g. because it's a virtual attr not capable of editing; // more commonly the caller knows there isn't enough context for safe editing. bool editable = XmlUtils.GetOptionalBooleanAttributeValue(caller, "editable", true) && XmlUtils.GetOptionalBooleanAttributeValue(node, "editable", true); string optionalWsSpec = XmlUtils.GetOptionalAttributeValue(node, "optionalWs"); int wsMagicOptional = WritingSystemServices.GetMagicWsIdFromName(optionalWsSpec); MultiStringSlice msSlice = reuseMap.GetSliceToReuse("MultiStringSlice") as MultiStringSlice; if (msSlice == null) { slice = new MultiStringSlice(obj, flid, wsMagic, wsMagicOptional, forceIncludeEnglish, editable, spellCheck); } else { slice = msSlice; msSlice.Reuse(obj, flid, wsMagic, wsMagicOptional, forceIncludeEnglish, editable, spellCheck); } break; } case "defaultvectorreference": // second most common. { var rvSlice = reuseMap.GetSliceToReuse("ReferenceVectorSlice") as ReferenceVectorSlice; if (rvSlice == null) { slice = new ReferenceVectorSlice(cache, obj, flid); } else { slice = rvSlice; rvSlice.Reuse(obj, flid); } break; } case "possvectorreference": { var prvSlice = reuseMap.GetSliceToReuse("PossibilityReferenceVectorSlice") as PossibilityReferenceVectorSlice; if (prvSlice == null) { slice = new PossibilityReferenceVectorSlice(cache, obj, flid); } else { slice = prvSlice; prvSlice.Reuse(obj, flid); } break; } case "semdomvectorreference": { var prvSlice = reuseMap.GetSliceToReuse("SemanticDomainReferenceVectorSlice") as SemanticDomainReferenceVectorSlice; if (prvSlice == null) { slice = new SemanticDomainReferenceVectorSlice(cache, obj, flid); } else { slice = prvSlice; prvSlice.Reuse(obj, flid); } break; } case "string": { if (flid == 0) { throw new ApplicationException("field attribute required for basic properties " + node.OuterXml); } int ws = GetWs(mediator, cache, node); if (ws != 0) { slice = new StringSlice(obj, flid, ws); } else { slice = new StringSlice(obj, flid); } var fShowWsLabel = XmlUtils.GetOptionalBooleanAttributeValue(node, "labelws", false); if (fShowWsLabel) { (slice as StringSlice).ShowWsLabel = true; } int wsEmpty = GetWs(mediator, cache, node, "wsempty"); if (wsEmpty != 0) { (slice as StringSlice).DefaultWs = wsEmpty; } break; } case "jtview": { string layout = XmlUtils.GetOptionalAttributeValue(caller, "param"); if (layout == null) { layout = XmlUtils.GetManditoryAttributeValue(node, "layout"); } // Editable if BOTH the caller (part ref) AND the node itself (the slice) say so...or at least if neither says not. bool editable = XmlUtils.GetOptionalBooleanAttributeValue(caller, "editable", true) && XmlUtils.GetOptionalBooleanAttributeValue(node, "editable", true); slice = new ViewSlice(new XmlView(obj.Hvo, layout, stringTbl, editable)); break; } case "summary": { slice = new SummarySlice(); break; } case "enumcombobox": { slice = new EnumComboSlice(cache, obj, flid, stringTbl, node["deParams"]); break; } case "referencecombobox": { slice = new ReferenceComboBoxSlice(cache, obj, flid, persistenceProvider); break; } case "typeaheadrefatomic": { slice = new AtomicRefTypeAheadSlice(obj, flid); break; } case "msareferencecombobox": { slice = new MSAReferenceComboBoxSlice(cache, obj, flid, persistenceProvider); break; } case "lit": // was "message" { string message = XmlUtils.GetManditoryAttributeValue(node, "message"); if (stringTbl != null) { string sTranslate = XmlUtils.GetOptionalAttributeValue(node, "translate", ""); if (sTranslate.Trim().ToLower() != "do not translate") { message = stringTbl.LocalizeLiteralValue(message); } } slice = new MessageSlice(message); break; } case "picture": { slice = new PictureSlice((ICmPicture)obj); break; } case "image": { try { slice = new ImageSlice(DirectoryFinder.FWCodeDirectory, XmlUtils.GetManditoryAttributeValue(node, "param1")); } catch (Exception error) { slice = new MessageSlice(String.Format(DetailControlsStrings.ksImageSliceFailed, error.Message)); } break; } case "checkbox": { slice = new CheckboxSlice(cache, obj, flid, node); break; } case "checkboxwithrefresh": { slice = new CheckboxRefreshSlice(cache, obj, flid, node); break; } case "time": { slice = new DateSlice(cache, obj, flid); break; } case "integer": // produced in the auto-generated parts from the conceptual model case "int": // was "integer" { slice = new IntegerSlice(cache, obj, flid); break; } case "gendate": { slice = new GenDateSlice(cache, obj, flid); break; } case "morphtypeatomicreference": { slice = new MorphTypeAtomicReferenceSlice(cache, obj, flid); break; } case "atomicreferencepos": { slice = new AtomicReferencePOSSlice(cache, obj, flid, persistenceProvider, mediator); break; } case "possatomicreference": { slice = new PossibilityAtomicReferenceSlice(cache, obj, flid); break; } case "atomicreferenceposdisabled": { slice = new AutomicReferencePOSDisabledSlice(cache, obj, flid, persistenceProvider, mediator); break; } case "defaultatomicreference": { slice = new AtomicReferenceSlice(cache, obj, flid); break; } case "defaultatomicreferencedisabled": { slice = new AtomicReferenceDisabledSlice(cache, obj, flid); break; } case "derivmsareference": { slice = new DerivMSAReferenceSlice(cache, obj, flid); break; } case "inflmsareference": { slice = new InflMSAReferenceSlice(cache, obj, flid); break; } case "phoneenvreference": { slice = new PhoneEnvReferenceSlice(cache, obj, flid); break; } case "sttext": { slice = new StTextSlice(obj, flid, GetWs(mediator, cache, node)); break; } case "custom": { slice = (Slice)DynamicLoader.CreateObject(node); break; } case "customwithparams": { slice = (Slice)DynamicLoader.CreateObject(node, new object[] { cache, editor, flid, node, obj, stringTbl, persistenceProvider, GetWs(mediator, cache, node) }); break; } case "ghostvector": { slice = new GhostReferenceVectorSlice(cache, obj, node); break; } case "command": { slice = new CommandSlice(node["deParams"]); break; } case null: //grouping nodes do not necessarily have any editor { slice = new Slice(); break; } case "message": // case "integer": // added back in to behave as "int" above throw new Exception("use of obsolete editor type (message->lit, integer->int)"); case "autocustom": slice = MakeAutoCustomSlice(cache, obj, caller); if (slice == null) { return(null); } break; case "defaultvectorreferencedisabled": // second most common. { ReferenceVectorDisabledSlice rvSlice = reuseMap.GetSliceToReuse("ReferenceVectorDisabledSlice") as ReferenceVectorDisabledSlice; if (rvSlice == null) { slice = new ReferenceVectorDisabledSlice(cache, obj, flid); } else { slice = rvSlice; rvSlice.Reuse(obj, flid); } break; } default: { //Since the editor has not been implemented yet, //is there a bitmap file that we can show for this editor? //Such bitmaps belong in the distFiles xde directory string fwCodeDir = DirectoryFinder.FWCodeDirectory; string editorBitmapRelativePath = "xde/" + editor + ".bmp"; if (File.Exists(Path.Combine(fwCodeDir, editorBitmapRelativePath))) { slice = new ImageSlice(fwCodeDir, editorBitmapRelativePath); } else { slice = new MessageSlice(String.Format(DetailControlsStrings.ksBadEditorType, editor)); } break; } } slice.AccessibleName = editor; return(slice); }