fromXmlNode function

WidgetModel? fromXmlNode(
  1. WidgetModel parent,
  2. XmlElement node,
  3. Scope? scope,
  4. dynamic data,
)

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;
}