Implementation
WidgetModel? fromXmlNode(
WidgetModel parent, XmlElement node, Scope? scope, dynamic data) {
WidgetModel? model;
switch (node.localName) {
case "ALARM":
model = AlarmModel.fromXml(parent, node);
break;
case "ANIMATE": // Preferred Case
case "ANIMATION": // Animation may be deprecated
model = AnimationModel.fromXml(parent, node);
break;
case "AUTOCOMPLETE":
model = InputModel.fromXml(parent, node, type: "autocomplete");
break;
case "BARCODE":
model = BarcodeDetectorModel.fromXml(parent, node);
break;
case "BEACON":
model = BeaconModel.fromXml(parent, node);
break;
case "BIOMETRIC":
model = BiometricsDetectorModel.fromXml(parent, node);
break;
case "BOX": // Preferred Case
case "CONTAINER": // Container may be deprecated
case "SBOX":
case "SHRINKBOX":
// shrink by default?
bool shrink = node.localName == "SBOX" || node.localName == "SHRINKBOX";
// prototype?
bool isPrototype = Xml.hasAttribute(node: node, tag: "data");
// define model
model = isPrototype
? PrototypeModel.fromXml(parent, node)
: BoxModel.fromXml(parent, node, scope: scope, data: data, expandDefault: !shrink);
break;
case "BREADCRUMB":
model = BreadcrumbModel.fromXml(parent, node);
break;
case "BUSY":
model = BusyModel.fromXml(parent, node);
break;
case "BUTTON":
case "BTN":
model = ButtonModel.fromXml(parent, node);
break;
case "BUTTONSTATE":
model = ButtonModel.fromXml(parent, node);
break;
case "CALC":
if (parent is IDataSource) model = Calc.fromXml(parent, node);
break;
case "CAMERA":
model = CameraModel.fromXml(parent, node);
break;
case "CARD":
model = CardModel.fromXml(parent, node);
break;
case "CENTER":
model = CenterModel.fromXml(parent, node);
break;
case "CHART":
model = ChartModel.fromXml(parent, node);
break;
case "COLORPICKER":
model = ColorpickerModel.fromXml(parent, node);
break;
case "LINECHART":
model = LineChartModel.fromXml(parent, node);
break;
case "PIECHART":
model = PieChartModel.fromXml(parent, node);
break;
case "BARCHART":
model = BarChartModel.fromXml(parent, node);
break;
case "BODY":
// we dont want to deserialize datasorce body models
// in the future we may wish to have a BODY element
// for now just return null
if (parent is! IDataSource) model = null;
model = null;
break;
// case "sfchart":
// model = SFCHART.ChartModel.fromXml(parent, node);
// break;
// case "HTML":
// model = HtmlModel.fromXml(parent, node);
// break;
case "CHECKBOX":
case "CHECK":
model = CheckboxModel.fromXml(parent, node);
break;
case "CONST":
case "CONSTANT":
model = VariableModel.fromXml(parent, node, constant: true);
break;
case "CROP":
if (parent is IDataSource) model = Crop.fromXml(parent, node);
break;
case "COLUMN":
case "COL": //shorthand case
// table row?
if (parent is TableModel) {
model = TableRowModel.fromXml(parent, node);
break;
}
// prototype?
bool isPrototype = Xml.hasAttribute(node: node, tag: "data");
// define model
model = isPrototype
? PrototypeModel.fromXml(parent, node)
: ColumnModel.fromXml(parent, node, scope: scope, data: data);
break;
case "CONDITION":
case "CASE":
if (parent is TriggerModel) {
model = TriggerConditionModel.fromXml(parent, node);
}
break;
case "DATA":
model = DataModel.fromXml(parent, node);
break;
case "DATEPICKER":
model = DatepickerModel.fromXml(parent, node);
break;
case "DELETE":
model = HttpDeleteModel.fromXml(parent, node);
break;
case "DISTINCT":
if (parent is IDataSource) model = Distinct.fromXml(parent, node);
break;
case "EDITOR":
model = EditorModel.fromXml(parent, node);
break;
// deprecated. use row/column/box with %sizing or flex
case "EXPAND":
case "EXPANDED":
model = ColumnModel.fromXml(parent, node);
if (model is ColumnModel && model.flex == null) model.flex = "1";
break;
case "EVAL":
if (parent is IDataSource) model = Eval.fromXml(parent, node);
break;
case "FIELD":
model = FieldModel.fromXml(parent, node);
break;
case "FILEPICKER":
model = FilepickerModel.fromXml(parent, node);
break;
case "FILTER":
if (parent is IDataSource) {
model = Filter.fromXml(parent, node);
}
break;
case "FLIP":
if (parent is IDataSource) {
model = Flip.fromXml(parent, node);
} else if (parent is AnimationModel) {
model = FlipCardModel.fromXml(parent, node);
} else {
model = FlipCardModel.fromXml(parent, node);
}
break;
case "FML":
// <FML> root models are never a child element
// of another parent element, rather they get created from the FrameworkModel.fromXml() routine.
// If there is a future reason to do that, this item will need to be revisited. In the meantime,
// an <FML> tag encountered in the element xml stream is treated as a <BOX>, not as a new outer framework.
model = BoxModel.fromXml(parent, node);
break;
case "FOOTER":
if (parent is FrameworkModel) {
model = FooterModel.fromXml(parent, node);
}
break;
case "FORM":
model = FormModel.fromXml(parent, node);
break;
case "FORMAT":
if (parent is IDataSource) {
model = Format.fromXml(parent, node);
}
break;
case "GESTURE":
model = GestureModel.fromXml(parent, node);
break;
case "GET":
model = HttpGetModel.fromXml(parent, node);
break;
case "GREYSCALE":
case "GRAYSCALE":
if (parent is IDataSource) {
model = Grayscale.fromXml(parent, node);
}
break;
case "GPS":
model = GpsModel.fromXml(parent, node);
break;
case "GRID":
model = GridModel.fromXml(parent, node);
break;
case "HEADER":
if (parent is FrameworkModel) {
model = HeaderModel.fromXml(parent, node);
break;
}
if (parent is TableModel) {
model = TableHeaderModel.fromXml(parent, node);
break;
}
break;
case "HTTP":
model = HttpModel.fromXml(parent, node);
break;
case "ICON":
model = IconModel.fromXml(parent, node);
break;
case "WEBVIEW":
case "IFRAME":
model = InlineFrameModel.fromXml(parent, node);
break;
case "IMAGE":
case "IMG":
model = ImageModel.fromXml(parent, node);
break;
case "ITEM":
if (parent is GridModel) {
model = GridItemModel.fromXml(parent, node);
}
if (parent is ListModel) {
model = ListItemModel.fromXml(parent, node);
}
if (parent is MenuModel) {
model = MenuItemModel.fromXml(parent, node);
}
if (parent is PopoverModel) {
model = PopoverItemModel.fromXml(parent, node);
}
break;
case "INPUT":
model = InputModel.fromXml(parent, node);
break;
case "LAYOUT":
model = BoxModel.fromXml(parent, node);
break;
case "LABEL":
if (parent is ChartModel) {
model = ChartLabelModel.fromXml(parent, node);
}
break;
case "LINK":
model = LinkModel.fromXml(parent, node);
break;
case "LIST":
model = ListModel.fromXml(parent, node);
break;
case "LOG":
model = LogModel.fromXml(parent, node);
break;
case "MAP":
model = MapModel.fromXml(parent, node);
break;
case "MENU":
model = MenuModel.fromXml(parent, node);
break;
case "MODAL":
model = ModalModel.fromXml(parent, node);
break;
case "MQTT":
model = MqttModel.fromXml(parent, node);
break;
case "NFC":
model = NcfModel.fromXml(parent, node);
break;
case "NODE":
if (parent is TreeModel || parent is TreeNodeModel) {
model = TreeNodeModel.fromXml(parent, node);
}
break;
case "OCR":
model = TextDetectorModel.fromXml(parent, node);
break;
case "OPTION":
if (parent is SelectModel ||
parent is CheckboxModel ||
parent is RadioModel ||
parent is TypeaheadModel) model = OptionModel.fromXml(parent, node);
break;
case "FADE":
if (parent is AnimationModel) {
model = FadeTransitionModel.fromXml(parent, node);
} else {
model = FadeTransitionModel.fromXml(parent, node);
}
break;
case "ROTATE":
if (parent is AnimationModel) {
model = RotateTransitionModel.fromXml(parent, node);
} else {
model = RotateTransitionModel.fromXml(parent, node);
}
break;
case "TAG":
if (parent is OptionModel) model = TagModel.fromXml(parent, node);
break;
case "SHORTCUT":
model = ShortcutModel.fromXml(parent, node);
break;
case "SIZE":
if (parent is AnimationModel) {
model = SizeTransitionModel.fromXml(parent, node);
} else {
model = SizeTransitionModel.fromXml(parent, node);
}
break;
case "SLIDE":
if (parent is AnimationModel) {
model = SlideTransitionModel.fromXml(
parent,
node,
);
} else {
model = SlideTransitionModel.fromXml(parent, node);
}
break;
case "SCALE":
if (parent is AnimationModel) {
model = ScaleTransitionModel.fromXml(parent, node);
} else {
model = ScaleTransitionModel.fromXml(parent, node);
}
break;
case "STASH":
model = StashModel.fromXml(parent, node);
break;
case "SUBQUERY":
if (parent is HttpGetModel) model = Query.fromXml(parent, node);
break;
case "TESTDATA":
model = TestDataModel.fromXml(parent, node);
break;
case "TRANSFORM":
if (parent is AnimationModel) {
model = TransformModel.fromXml(parent, node);
} else {
model = TransformModel.fromXml(parent, node);
}
break;
case "TWEEN":
if (parent is AnimationModel) {
model = TweenModel.fromXml(parent, node);
} else {
model = TweenModel.fromXml(parent, node);
}
break;
case "PAD": // Preferred Case.
case "PADDING": // Padding could be deprecated.
model = PaddingModel.fromXml(parent, node);
break;
case "PAGE":
if (parent is PagerModel) {
model = PageModel.fromXml(parent, node);
}
break;
case "PAGER":
model = PagerModel.fromXml(parent, node);
break;
case "PIVOT":
if (parent is IDataSource) model = Pivot.fromXml(parent, node);
break;
case "PUT":
model = HttpPutModel.fromXml(parent, node);
break;
case "POPOVER":
model = PopoverModel.fromXml(parent, node);
break;
case "POPOVERITEM":
model = PopoverItemModel.fromXml(parent, node);
break;
case "POSITION": // Preferred case
case "POS": // Shorthand case
case "POSITIONED": // Positioned may be deprecated
model = PositionedModel.fromXml(parent, node);
break;
case "MARKER":
if (parent is MapModel) {
model = MapMarkerModel.fromXml(parent, node);
}
break;
case "POST":
model = HttpPostModel.fromXml(parent, node);
break;
case "RADIO":
model = RadioModel.fromXml(parent, node);
break;
case "RESIZE":
if (parent is IDataSource) model = Resize.fromXml(parent, node);
break;
case "ROW":
// table row?
if (parent is TableModel) {
model = TableRowModel.fromXml(parent, node);
break;
}
// prototype?
bool isPrototype = Xml.hasAttribute(node: node, tag: "data");
// define model
model = isPrototype
? PrototypeModel.fromXml(parent, node)
: RowModel.fromXml(parent, node, scope: scope, data: data);
break;
case "SCRIBBLE":
model = ScribbleModel.fromXml(parent, node);
break;
case "SCROLL": // Preferred Case
case "SCROLLER": // Scroller may be deprecated.
model = ScrollerModel.fromXml(parent, node);
break;
case "SELECT":
model = SelectModel.fromXml(parent, node);
break;
case "SERIES":
if (parent is ChartModel) {
model = ChartSeriesModel.fromXml(parent, node);
} else if (parent is BarChartModel) {
model = BarChartSeriesModel.fromXml(parent, node);
} else if (parent is LineChartModel) {
model = LineChartSeriesModel.fromXml(parent, node);
} else if (parent is PieChartModel) {
model = PieChartSeriesModel.fromXml(parent, node);
}
// else if (parent is SFCHART.ChartModel) model = SFCHART.ChartSeriesModel.fromXml(parent, node);
break;
case "SLIDER":
model = SliderModel.fromXml(parent, node);
break;
case "SOCKET":
model = SocketModel.fromXml(parent, node);
break;
case "SORT":
if (parent is IDataSource) model = Sort.fromXml(parent, node);
break;
case "SPAN":
model = SpanModel.fromXml(parent, node);
break;
case "SSE":
model = SseModel.fromXml(parent, node);
break;
case "STACK":
// prototype?
bool isPrototype = Xml.hasAttribute(node: node, tag: "data");
// define model
model = isPrototype
? PrototypeModel.fromXml(parent, node)
: StackModel.fromXml(parent, node, scope: scope, data: data);
break;
case "SPLITVIEW":
model = SplitViewModel.fromXml(parent, node);
break;
case "TABLE":
model = TableModel.fromXml(parent, node);
break;
case "TH":
case "TABLEHEADER":
if (parent is TableModel) {
model = TableHeaderModel.fromXml(parent, node);
}
break;
case "TR":
case "TABLEROW":
if (parent is TableModel) {
model = TableRowModel.fromXml(parent, node);
}
break;
case "TF":
case "TABLEFOOTER":
if (parent is TableModel) {
model = TableFooterModel.fromXml(parent, node);
}
break;
case "NODATA":
model = NoDataModel.fromXml(parent, node);
break;
case "TD":
case "TABLEDATA":
case "CELL":
if (parent is TableHeaderModel || parent is TableHeaderGroupModel) {
model = TableHeaderCellModel.fromXml(parent, node);
break;
}
if (parent is TableRowModel) {
model = TableRowCellModel.fromXml(parent, node);
break;
}
if (parent is TableFooterModel) {
model = TableFooterCellModel.fromXml(parent, node);
break;
}
break;
case "TG":
case "GROUP":
if (parent is TableHeaderModel || parent is TableHeaderGroupModel) {
model = TableHeaderGroupModel.fromXml(parent, node);
}
break;
case "TABVIEW":
model = TabModel.fromXml(parent, node);
break;
case "TEXT":
case "TXT":
model = TextModel.fromXml(parent, node);
break;
case "THEME":
model = ThemeModel.fromXml(parent, node);
break;
case "TIMER":
model = TimerModel.fromXml(parent, node);
break;
case "TOGGLE":
case "SWITCH":
model = SwitchModel.fromXml(parent, node);
break;
case "TIP":
case "TOOLTIP":
if (Xml.attribute(node: node, tag: "label") != null ||
Xml.attribute(node: node, tag: "text") != null) {
model = v1.TooltipModel.fromXml(parent, node);
} else {
model = v2.TooltipModel.fromXml(parent, node);
}
break;
case "TREEVIEW":
model = TreeModel.fromXml(parent, node);
break;
case "TRIGGER":
model = TriggerModel.fromXml(parent, node);
break;
case "TYPEAHEAD":
model = TypeaheadModel.fromXml(parent, node);
break;
case "VARIABLE":
case "VAR":
model = VariableModel.fromXml(parent, node);
break;
case "VIDEO":
model = VideoModel.fromXml(parent, node);
break;
case "VIEW":
if (parent is SplitViewModel) {
// ensure expand is set to true
Xml.setAttribute(node, "expand", "true");
// splitter views are simple BoxModel's
model = BoxModel.fromXml(parent, node);
}
break;
case "WINDOW":
model = FrameworkModel.fromXml(parent, node);
break;
case "XAXIS":
if (parent is ChartPainterModel) {
model = ChartAxisModel.fromXml(parent, node, ChartAxis.X);
}
// else if (parent is SFCHART.ChartModel) model = SFCHART.ChartAxisModel.fromXml(parent, node, SFCHART.Axis.X);
break;
case "YAXIS":
if (parent is ChartPainterModel) {
model = ChartAxisModel.fromXml(parent, node, ChartAxis.Y);
}
// else if (parent is SFCHART.ChartModel) model = SFCHART.ChartAxisModel.fromXml(parent, node, SFCHART.Axis.Y);
break;
case "ZEBRA":
model = ZebraModel.fromXml(parent, node);
break;
default:
break;
}
return model;
}