public void Unpack(FieldList source) { if (source == null) { return; } UnpackDefinitionID(source); if (source.GetItemCount(DefAgentFieldID.PaletteEntryIndex) > 0) { int paletteSize = source[DefAgentFieldID.PaletteSize].AsShort() ?? 0; if (paletteSize > 0) { // create internal array entries = new PaletteEntryBase[paletteSize]; // add entries IEnumerator <IFieldBase> enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryIndex) { int entryIndex = enumerator.Current.AsShort() ?? -1; if (entryIndex != -1) { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryType) { PaletteEntryType entryType = (PaletteEntryType)(enumerator.Current.AsByte() ?? 0); PaletteEntryBase newEntry = null; switch (entryType) { case PaletteEntryType.Undefined: default: break; case PaletteEntryType.Inherited: newEntry = new InheritedPaletteEntry(); break; case PaletteEntryType.DoNotPaint: newEntry = new DoNotPaintPaletteEntry(); break; case PaletteEntryType.FontReference: { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryData) { int fontDefID = enumerator.Current.AsInteger() ?? -1; if (fontDefID != -1) { newEntry = new FontReferencePaletteEntry(fontDefID); } } break; } case PaletteEntryType.Image: { break; } case PaletteEntryType.Colour: { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryData) { int?argb = enumerator.Current.AsInteger(); if (argb.HasValue) { newEntry = new ColourPaletteEntry(argb.Value); } } break; } case PaletteEntryType.LinearGradient: { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryData) { FieldList gradientData = enumerator.Current as FieldList; if (gradientData != null) { newEntry = new LinearGradientPaletteEntry(gradientData); } } break; } case PaletteEntryType.ColourSequence: { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryData) { FieldList clsData = enumerator.Current as FieldList; if (clsData != null) { newEntry = new ColourSequencePaletteEntry(clsData); } } break; } case PaletteEntryType.PaletteReference: { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryData) { int rf = enumerator.Current.AsInteger() ?? -1; if (rf != -1) { newEntry = new PaletteReferencePaletteEntry(rf); } } break; } case PaletteEntryType.StyleSet: case PaletteEntryType.SystemDialogRoot: case PaletteEntryType.SystemDialogContainer: case PaletteEntryType.SystemDialogTitle: case PaletteEntryType.SystemDialogStaticText: case PaletteEntryType.SystemDialogListEntry: case PaletteEntryType.SystemDialogMenuBar: { enumerator.MoveNext(); if (enumerator.Current.FieldID == (short)DefAgentFieldID.PaletteEntryData) { FieldList styleSetData = enumerator.Current as FieldList; if (styleSetData != null) { StyleSet sst = new StyleSet(entryType); sst.Unpack(styleSetData); newEntry = sst; } } break; } } if (newEntry != null) { entries[entryIndex] = newEntry; } } } } } } } // done IsUnpacked = true; }