/// <summary> /// Find a matching layout for this Member using known values and converters. /// See <see cref="RawCallLayout.FindLayout(string, ConverterInfo[])"/> /// </summary> /// <param name="name">member name</param> /// <returns>layout found</returns> protected virtual IRawLayout GetLayout(string name) { return(RawCallLayout.FindLayout(name, Converters)); }
/// <summary> /// When configured by XML or by <see cref="ArrangementConverter"/> in general, /// the <see cref="Option"/> is tried to figure out the <see cref="IRawLayout"/> to use. /// </summary> /// <remarks> /// It can be a <see cref="PatternString" />, then the option will be stringified. /// It can be a <see cref="string"/>, then <see cref="ArrangementConverter.GetArrangement"/> will be attempted. /// It can be an <see cref="IArrangement"/>, then it will be used to arrange a new <see cref="RawArrangedLayout"/> /// It can be another <see cref="IMember" />, then if Name was not set yet it will be adopted. /// It can be a <see cref="ConverterInfo" />, then a new RawCallLayout will be set up around it. /// It can be a <see cref="PatternParser" />, then a new RawCallLayout will be set up around it. /// </remarks> public void ActivateOptions() { if (Option == null) { Option = GetLayout(Name); return; } if (Option is PatternString) { var ps = (PatternString)Option; Option = ps.Format(); } if (Option is string) { // try to parse an arrangement var arrangement = ArrangementConverter.GetArrangement(Option as string, Converters); if (arrangement != null) { Option = arrangement; } } if (Option is string) { // try to find a layout var layout = GetLayout(Option as string); if (layout != null) { Option = layout; } } if (Option is ConverterInfo) { Option = new RawCallLayout((ConverterInfo)Option); } if (Option is PatternConverter) { Option = new RawCallLayout(Name, (PatternConverter)Option); } if (Option is IOptionHandler) { // this simplifies calls in ArrangementConverter a lot ((IOptionHandler)Option).ActivateOptions(); } if (Option is ILayout) { var layout = (ILayout)Option; var playout = Option as PatternLayout; if (playout != null && Converters != null) { foreach (var conv in Converters) { playout.AddConverter(conv); } } Option = new Layout2RawLayoutAdapter((ILayout)Option); } else if (Option is IMember) { var optionMember = (IMember)Option; if (String.IsNullOrEmpty(Name)) { Name = optionMember.Name; } Option = optionMember.Layout; } else if (Option is IArrangement) { var optionArrangemet = (IArrangement)Option; var l = new RawArrangedLayout(); optionArrangemet.Arrange(l.Members, Converters); Option = l; } if (Option is IOptionHandler) { // do it again if object changed ((IOptionHandler)Option).ActivateOptions(); } }