fromXml static method

WidgetModel? fromXml(
  1. WidgetModel parent,
  2. XmlElement node
)

Implementation

static WidgetModel? fromXml(WidgetModel parent, XmlElement node) {
  // clone node?
  node = cloneNode(node, parent.scope);

  // exclude this element?
  if (excludeFromTemplate(node, parent.scope)) return null;

  // element local name is the element name without the namespace prefix (if one exists)
  String elementLocalName = node.localName.toLowerCase();

  // build the element model
  WidgetModel? model;
  switch (elementLocalName) {
    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 "biometic":
      model = BiometricsDetectorModel.fromXml(parent, node);
      break;

    case "box": // Preferred Case
    case "container": // Container may be deprecated
      model = BoxModel.fromXml(parent, node);
      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 "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
      model = ColumnModel.fromXml(parent, node);
      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 "drag": // Preferred case.
    case "draggable": // draggable may be deprecated
      model = DraggableModel.fromXml(parent, node);
      break;

    case "drop": // Preferred case.
    case "droppable": // droppable may be deprecated.
      model = DroppableModel.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;

    case "http":
      model = HttpModel.fromXml(parent, node);
      break;

    case "icon":
      model = IconModel.fromXml(parent, node);
      break;

    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 "sbox":
    case "shrinkbox":
      model = BoxModel.fromXml(parent, node, expandDefault: false);
      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 "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":
      model = RowModel.fromXml(parent, node);
      break;

    case "scope":
      model = ScopeModel.fromXml(parent, node);
      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 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":
      model = StackModel.fromXml(parent, node);
      break;

    case "splitview":
      model = SplitModel.fromXml(parent, node);
      break;

    case "table":
      model = TableModel.fromXml(parent, node);
      break;

    case "th":
    case "tableheader":
      model = TableHeaderModel.fromXml(parent, node);
      break;

    case "tr":
    case "tablerow":
      model = TableRowModel.fromXml(parent, node);
      break;

    case "tf":
    case "tablefooter":
      model = TableFooterModel.fromXml(parent, node);
      break;

    case "td":
    case "tabledata":
    case "cell":
      if (parent is TableHeaderModel) {
        model = TableHeaderCellModel.fromXml(parent, node);
      }
      if (parent is TableRowModel) {
        model = TableRowCellModel.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 SplitModel) {
        model = BoxModel.fromXml(parent, node);
      }
      break;

    case "window":
      model = FrameworkModel.fromXml(parent, node);
      break;

    case "xaxis":
      if (parent is ChartModel) {
        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 ChartModel) {
        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;
}