public UITableViewSource Parse(DialogViewController controller, object view, MemberInfo member) { UITableViewSource source = null; if (view != null) { view = GetActualView(view); controller.RootView = view; controller.ToolbarButtons = CheckForToolbarItems(view); controller.NavbarButtons = CheckForNavbarItems(view); if (member != null) { using (var memberData = new MemberData(view, member)) { source = ParseList(controller, memberData, null); } } if (source == null) { source = ParseView(controller, view); } InitializeSearch(view, source); } return source; }
protected override void SetDataContext(MemberData value) { base.SetDataContext(value); if (DataContext != null) { var propertyInfo = DataContext.Member as PropertyInfo; if (propertyInfo != null) { EditModeValue = !propertyInfo.CanWrite ? EditMode.ReadOnly : EditModeValue; } SetKeyboard(); } }
public UITableViewSource ParseView(DialogViewController controller, object view) { var members = view.GetType().GetMembers(false); var sections = new SortedList<int, Section>(); var memberLists = new SortedList<int, SortedList<int, MemberData>>(); var sectionIndex = 0; var memberOrder = 0; foreach (var member in members) { var attributes = member.GetCustomAttributes(false); var memberData = new MemberData(view, member) { Section = sectionIndex }; var defaultValueAttribute = member.GetCustomAttribute<DefaultValueAttribute>(); if (defaultValueAttribute != null) { memberData.Value = defaultValueAttribute.Value; } var pullToRefreshAttribute = member.GetCustomAttribute<PullToRefreshAttribute>(); if (pullToRefreshAttribute != null) { ((DialogViewController)controller).PullToRefreshCommand = GetCommandForMember(view, member); ((DialogViewController)controller).RefreshKey = pullToRefreshAttribute.SettingsKey; ((DialogViewController)controller).EnablePullToRefresh = true; } var toolbarButtonAttribute = member.GetCustomAttribute<ToolbarButtonAttribute>(); var navbarButtonAttribute = member.GetCustomAttribute<NavbarButtonAttribute>(); var skipAttribute = member.GetCustomAttribute<SkipAttribute>(); if (skipAttribute != null || toolbarButtonAttribute != null || navbarButtonAttribute != null || pullToRefreshAttribute != null || (attributes.Length == 0 && typeof(MethodInfo) == memberData.Type)) { memberData.Dispose(); continue; } var themeAttribute = member.GetCustomAttribute<ThemeAttribute>(); if (themeAttribute != null) { var theme = Theme.CreateTheme(themeAttribute.ThemeType); if (theme != null && theme.CellHeight > 0) { memberData.RowHeight = theme.CellHeight; theme.Dispose(); } } else { var themeable = view as IThemeable; if (themeable != null && themeable.Theme != null && themeable.Theme.CellHeight > 0) { memberData.RowHeight = themeable.Theme.CellHeight; } } var rowHeightAttribute = member.GetCustomAttribute<RowHeightAttribute>(); if (rowHeightAttribute != null) memberData.RowHeight = rowHeightAttribute.RowHeight; var listAttribute = member.GetCustomAttribute<ListAttribute>(); var isList = (listAttribute != null && listAttribute.DisplayMode == DisplayMode.List) && !typeof(string).IsAssignableFrom(memberData.Type) && (typeof(IEnumerable).IsAssignableFrom(memberData.Type) || typeof(Enum).IsAssignableFrom(memberData.Type)); var orderAttribute = member.GetCustomAttribute<OrderAttribute>(); if (orderAttribute != null) { // make sure assigned order is an even number to fit in between the default order // allowing the values int.MinValue and int.MaxValue for the first and Last positions memberData.Order = orderAttribute.Order > int.MaxValue / 2 ? int.MaxValue : orderAttribute.Order * 2; } else { // make sure all default memberOrder is odd; memberOrder = memberOrder + (memberOrder % 2) + 1; memberData.Order = memberOrder; } var sectionAttribute = member.GetCustomAttribute<SectionAttribute>(); if (sectionAttribute != null || isList) { if (sections.Count > 0) { sectionIndex++; } memberData.Section = sectionIndex; if (sectionAttribute != null && orderAttribute != null) { memberData.Section = orderAttribute.Order == 0 ? sectionIndex : orderAttribute.Order; } else { memberData.Section = sectionIndex; } } var viewTypes = GetViewTypes(memberData); if (!sections.ContainsKey(memberData.Section)) { var section = CreateSection(controller, memberData, viewTypes); sections.Add(memberData.Section, section); } else { if (viewTypes != null) { IList<Type> list = null; var key = memberData.Id.ToString(); var viewTypesList = sections[memberData.Section].ViewTypes; if (viewTypesList.ContainsKey(key)) { list = viewTypesList[key]; } else { list = new List<Type>(); viewTypesList.Add(key, list); } foreach(var viewType in viewTypes) { if (!list.Contains(viewType)) { list.Add(viewType); } } } } if (memberLists.ContainsKey(memberData.Section)) { memberLists[memberData.Section].Add(memberData.Order, memberData); } else { var sortedList = new SortedList<int, MemberData>(); sortedList.Add(memberData.Order, memberData); memberLists.Add(memberData.Section, sortedList); } } foreach(var kvp in memberLists) { var listSources = new SortedList<int, ListSource>(); var index = 0; var list = kvp.Value.Values.ToList(); list.ForEach(data => data.Order = index++); foreach(var memberData in list) { var viewTypes = GetViewTypes(memberData); if ((!typeof(string).IsAssignableFrom(memberData.Type) && typeof(IEnumerable).IsAssignableFrom(memberData.Type)) || typeof(Enum).IsAssignableFrom(memberData.Type)) { var listSource = ParseList(controller, memberData, viewTypes) as ListSource; listSource.MemberData = memberData; listSource.Sections[0].Index = memberData.Section; listSources.Add(memberData.Order, listSource); } else listSources.Add(memberData.Order, null); sections[memberData.Section].ListSources = listSources; sections[memberData.Section].Index = memberData.Section; var lastListSource = listSources.Values.Last(); if (lastListSource != null) memberData.DataContextBinder = new DataContextBinder(controller, lastListSource.Sections[0]); } sections[kvp.Key].DataContext = list; } var keyIndex = 0; var sectionList = sections.Select(kvp => kvp.Value).ToDictionary((value) => keyIndex++); // If there is only one list property return the ListSource rather than create a ViewSource if (sectionList.Count == 1 && sectionList[0].DataContext.Count == 1 && sectionList[0].ListSources[0] != null && !sectionList[0].ListSources[0].IsRootCell) { sectionList[0].ListSources[0].TableViewStyle = UITableViewStyle.Plain; return sectionList[0].ListSources[0]; } var source = new ViewSource(controller) { Sections = sectionList }; return source; }
private static List<Type> GetViewTypes(MemberData memberData) { List<Type> viewTypeList = new List<Type>(); var memberInfo = memberData.Member; if (memberInfo != null) { var cellViewAttributes = memberInfo.GetCustomAttributes<CellViewAttribute>(); if (cellViewAttributes.Length > 0) { viewTypeList = (from attribute in cellViewAttributes select attribute.ViewType).ToList(); var viewAttributesList = cellViewAttributes.ToList(); viewAttributesList.ForEach((attribute) => { var sizeable = attribute as ISizeable; if (sizeable != null) { memberData.RowHeight = sizeable.GetRowHeight(); } }); } var cellViewTemplates = memberInfo.GetCustomAttributes<Attribute>().Where(attribute=> typeof(CellViewTemplate).IsAssignableFrom(attribute.GetType())).Cast<CellViewTemplate>().ToList(); if (cellViewTemplates.Count > 0) { cellViewTemplates.ForEach(attribute=>viewTypeList.Add(attribute.CellViewType)); } } if (viewTypeList.Count == 0) return null; return viewTypeList; }
private static Section CreateSection(DialogViewController controller, MemberData memberData, List<Type> viewTypes) { var listSources = new SortedList<int, ListSource>(); listSources.Add(memberData.Order, null); var memberOrder = 0; memberData.Order = memberOrder; var sectionMembers = new List<MemberData>(); var section = new Section(controller) { DataContext = sectionMembers }; var sectionAttribute = memberData.Member.GetCustomAttribute<SectionAttribute>(); if (sectionAttribute != null) { section.HeaderText = sectionAttribute.Caption; section.FooterText = sectionAttribute.Footer; } section.ViewTypes.Add(memberData.Id.ToString(), viewTypes); return section; }
public static UITableViewSource ParseList(DialogViewController controller, MemberData memberData, List<Type> viewTypes) { object memberValue = memberData.Value; var member = memberData.Member; var type = memberData.Type; var isList = typeof(IEnumerable).IsAssignableFrom(type) || typeof(Enum).IsAssignableFrom(type); if (isList) { var data = type.CreateGenericListFromEnumerable(memberValue); var source = new ListSource(controller, (IList)data, viewTypes); if (source != null) { if (type.IsEnum) { source.SelectedItem = memberValue; source.SelectedItems.Add(source.SelectedItem); } else if (data != null && data.Count == 1) { source.SelectedItem = data[0]; source.SelectedItems.Add(source.SelectedItem); } source.Caption = GetCaption(member); var listAttribute = member.GetCustomAttribute<ListAttribute>(); if (listAttribute != null) { source.DisplayMode = listAttribute.DisplayMode; source.SelectionAction = listAttribute.SelectionAction; source.IsMultiselect = listAttribute.SelectionAction == SelectionAction.Multiselection; source.IsSelectable = source.SelectionAction != SelectionAction.NavigateToView; source.IsNavigable = listAttribute.DisplayMode != DisplayMode.Collapsable || listAttribute.SelectionAction == SelectionAction.NavigateToView; source.SelectedAccessoryViewType = listAttribute.SelectedAccessoryViewType; source.UnselectedAccessoryViewType = listAttribute.UnselectedAccessoryViewType; source.UnselectionBehavior = listAttribute.UnselectionBehavior; source.ReplaceCaptionWithSelection = listAttribute.ReplaceCaptionWithSelection; if (!string.IsNullOrEmpty(listAttribute.SelectedItemMemberName)) { source.SelectedItemMemberName = listAttribute.SelectedItemMemberName; } if (!string.IsNullOrEmpty(listAttribute.SelectedItemsMemberName)) { source.SelectedItemsMemberName = listAttribute.SelectedItemsMemberName; } } source.PopOnSelection = source.SelectionAction == SelectionAction.PopOnSelection; var memberAttributes = member.GetCustomAttributes(false); foreach(var memberAttribute in memberAttributes) { var navigable = memberAttribute as INavigable; if (navigable != null) { source.IsSelectable = false; source.NavigationViewType = navigable.NavigateToViewType; source.IsNavigable = navigable.NavigateToViewType != null; } } source.IsRootCell = source.DisplayMode != DisplayMode.List; return source; } } return null; }
public override void RowSelected(UITableView tableView, NSIndexPath indexPath) { MemberData memberData = null; var listIndexPath = NSIndexPath.FromRowSection(0, indexPath.Section); var listSource = GetListSource(listIndexPath); if (listSource != null && !listSource.IsRootCell) { var listCount = listSource.Sections[0].DataContext.Count; if (indexPath.Row < listCount) { memberData = listSource.MemberData; if (typeof(IEnumerable).IsAssignableFrom(memberData.Type) || typeof(Enum).IsAssignableFrom(memberData.Type)) { listSource.RowSelected(tableView, indexPath); // Special case: Since Enums don't have MemberInfo for individual items we only keep track of the base // type and set the actual value based on the row since we display them in the section in value order if (typeof(Enum).IsAssignableFrom(memberData.Type)) { memberData.Value = indexPath.Row; } return; } } } var cell = Controller.TableView.CellAt(indexPath); if (cell == null) { cell = GetCell(tableView, indexPath); } foreach (var section in Sections.Values) { if (section.Views.ContainsKey(cell)) { var views = section.Views[cell]; if (views.Count > 0) { memberData = GetMemberData(indexPath); foreach (var view in views) { var selectable = view as ISelectable; if (selectable != null) { selectable.Selected(Controller, tableView, memberData, indexPath); break; } } } } } }
public UITableViewSource ParseView(DialogViewController controller, object view) { var members = view.GetType().GetMembers(false); var sections = new SortedList <int, Section>(); var memberLists = new SortedList <int, SortedList <int, MemberData> >(); var sectionIndex = 0; var memberOrder = 0; foreach (var member in members) { var attributes = member.GetCustomAttributes(false); var memberData = new MemberData(view, member) { Section = sectionIndex }; var defaultValueAttribute = member.GetCustomAttribute <DefaultValueAttribute>(); if (defaultValueAttribute != null) { memberData.Value = defaultValueAttribute.Value; } var pullToRefreshAttribute = member.GetCustomAttribute <PullToRefreshAttribute>(); if (pullToRefreshAttribute != null) { ((DialogViewController)controller).PullToRefreshCommand = GetCommandForMember(view, member); ((DialogViewController)controller).RefreshKey = pullToRefreshAttribute.SettingsKey; ((DialogViewController)controller).EnablePullToRefresh = true; } var toolbarButtonAttribute = member.GetCustomAttribute <ToolbarButtonAttribute>(); var navbarButtonAttribute = member.GetCustomAttribute <NavbarButtonAttribute>(); var skipAttribute = member.GetCustomAttribute <SkipAttribute>(); if (skipAttribute != null || toolbarButtonAttribute != null || navbarButtonAttribute != null || pullToRefreshAttribute != null || (attributes.Length == 0 && typeof(MethodInfo) == memberData.Type)) { memberData.Dispose(); continue; } var themeAttribute = member.GetCustomAttribute <ThemeAttribute>(); if (themeAttribute != null) { var theme = Theme.CreateTheme(themeAttribute.ThemeType); if (theme != null && theme.CellHeight > 0) { memberData.RowHeight = theme.CellHeight; theme.Dispose(); } } else { var themeable = view as IThemeable; if (themeable != null && themeable.Theme != null && themeable.Theme.CellHeight > 0) { memberData.RowHeight = themeable.Theme.CellHeight; } } var rowHeightAttribute = member.GetCustomAttribute <RowHeightAttribute>(); if (rowHeightAttribute != null) { memberData.RowHeight = rowHeightAttribute.RowHeight; } var listAttribute = member.GetCustomAttribute <ListAttribute>(); var isList = (listAttribute != null && listAttribute.DisplayMode == DisplayMode.List) && !typeof(string).IsAssignableFrom(memberData.Type) && (typeof(IEnumerable).IsAssignableFrom(memberData.Type) || typeof(Enum).IsAssignableFrom(memberData.Type)); var orderAttribute = member.GetCustomAttribute <OrderAttribute>(); if (orderAttribute != null) { // make sure assigned order is an even number to fit in between the default order // allowing the values int.MinValue and int.MaxValue for the first and Last positions memberData.Order = orderAttribute.Order > int.MaxValue / 2 ? int.MaxValue : orderAttribute.Order * 2; } else { // make sure all default memberOrder is odd; memberOrder = memberOrder + (memberOrder % 2) + 1; memberData.Order = memberOrder; } var sectionAttribute = member.GetCustomAttribute <SectionAttribute>(); if (sectionAttribute != null || isList) { if (sections.Count > 0) { sectionIndex++; } memberData.Section = sectionIndex; if (sectionAttribute != null && orderAttribute != null) { memberData.Section = orderAttribute.Order == 0 ? sectionIndex : orderAttribute.Order; } else { memberData.Section = sectionIndex; } } var viewTypes = GetViewTypes(memberData); if (!sections.ContainsKey(memberData.Section)) { var section = CreateSection(controller, memberData, viewTypes); sections.Add(memberData.Section, section); } else { if (viewTypes != null) { IList <Type> list = null; var key = memberData.Id.ToString(); var viewTypesList = sections[memberData.Section].ViewTypes; if (viewTypesList.ContainsKey(key)) { list = viewTypesList[key]; } else { list = new List <Type>(); viewTypesList.Add(key, list); } foreach (var viewType in viewTypes) { if (!list.Contains(viewType)) { list.Add(viewType); } } } } if (memberLists.ContainsKey(memberData.Section)) { memberLists[memberData.Section].Add(memberData.Order, memberData); } else { var sortedList = new SortedList <int, MemberData>(); sortedList.Add(memberData.Order, memberData); memberLists.Add(memberData.Section, sortedList); } } foreach (var kvp in memberLists) { var listSources = new SortedList <int, ListSource>(); var index = 0; var list = kvp.Value.Values.ToList(); list.ForEach(data => data.Order = index++); foreach (var memberData in list) { var viewTypes = GetViewTypes(memberData); if ((!typeof(string).IsAssignableFrom(memberData.Type) && typeof(IEnumerable).IsAssignableFrom(memberData.Type)) || typeof(Enum).IsAssignableFrom(memberData.Type)) { var listSource = ParseList(controller, memberData, viewTypes) as ListSource; listSource.MemberData = memberData; listSource.Sections[0].Index = memberData.Section; listSources.Add(memberData.Order, listSource); } else { listSources.Add(memberData.Order, null); } sections[memberData.Section].ListSources = listSources; sections[memberData.Section].Index = memberData.Section; var lastListSource = listSources.Values.Last(); if (lastListSource != null) { memberData.DataContextBinder = new DataContextBinder(controller, lastListSource.Sections[0]); } } sections[kvp.Key].DataContext = list; } var keyIndex = 0; var sectionList = sections.Select(kvp => kvp.Value).ToDictionary((value) => keyIndex++); // If there is only one list property return the ListSource rather than create a ViewSource if (sectionList.Count == 1 && sectionList[0].DataContext.Count == 1 && sectionList[0].ListSources[0] != null && !sectionList[0].ListSources[0].IsRootCell) { sectionList[0].ListSources[0].TableViewStyle = UITableViewStyle.Plain; return(sectionList[0].ListSources[0]); } var source = new ViewSource(controller) { Sections = sectionList }; return(source); }
public static UITableViewSource ParseList(DialogViewController controller, MemberData memberData, List <Type> viewTypes) { object memberValue = memberData.Value; var member = memberData.Member; var type = memberData.Type; var isList = typeof(IEnumerable).IsAssignableFrom(type) || typeof(Enum).IsAssignableFrom(type); if (isList) { var data = type.CreateGenericListFromEnumerable(memberValue); var source = new ListSource(controller, (IList)data, viewTypes); if (source != null) { if (type.IsEnum) { source.SelectedItem = memberValue; source.SelectedItems.Add(source.SelectedItem); } else if (data != null && data.Count == 1) { source.SelectedItem = data[0]; source.SelectedItems.Add(source.SelectedItem); } source.Caption = GetCaption(member); var listAttribute = member.GetCustomAttribute <ListAttribute>(); if (listAttribute != null) { source.DisplayMode = listAttribute.DisplayMode; source.SelectionAction = listAttribute.SelectionAction; source.IsMultiselect = listAttribute.SelectionAction == SelectionAction.Multiselection; source.IsSelectable = source.SelectionAction != SelectionAction.NavigateToView; source.IsNavigable = listAttribute.DisplayMode != DisplayMode.Collapsable || listAttribute.SelectionAction == SelectionAction.NavigateToView; source.SelectedAccessoryViewType = listAttribute.SelectedAccessoryViewType; source.UnselectedAccessoryViewType = listAttribute.UnselectedAccessoryViewType; source.UnselectionBehavior = listAttribute.UnselectionBehavior; source.ReplaceCaptionWithSelection = listAttribute.ReplaceCaptionWithSelection; if (!string.IsNullOrEmpty(listAttribute.SelectedItemMemberName)) { source.SelectedItemMemberName = listAttribute.SelectedItemMemberName; } if (!string.IsNullOrEmpty(listAttribute.SelectedItemsMemberName)) { source.SelectedItemsMemberName = listAttribute.SelectedItemsMemberName; } } source.PopOnSelection = source.SelectionAction == SelectionAction.PopOnSelection; var memberAttributes = member.GetCustomAttributes(false); foreach (var memberAttribute in memberAttributes) { var navigable = memberAttribute as INavigable; if (navigable != null) { source.IsSelectable = false; source.NavigationViewType = navigable.NavigateToViewType; source.IsNavigable = navigable.NavigateToViewType != null; } } source.IsRootCell = source.DisplayMode != DisplayMode.List; return(source); } } return(null); }
public static Type GetView(MemberData memberData) { var attributes = memberData.Member.GetCustomAttributes(false); foreach(Attribute attribute in attributes) { var attributeType = attribute.GetType(); if (_TypeViewMap.ContainsKey(attributeType)) { return _TypeViewMap[attributeType]; } } var type = memberData.Member.GetMemberType(); return GetView(type); }