public override void ViewDidLoad() { base.ViewDidLoad(); // Perform any additional setup after loading the view var info = new RootElement("Info") { new Section() { { meeting = new CheckboxElement("Meeting",true)}, { companyevent = new CheckboxElement("Company Event",true) }, { machinemaint = new CheckboxElement("Machine Maintenance" ,true) } }, }; Root.Add(info); UIButton filterEventsBtn = UIButton.FromType(UIButtonType.RoundedRect); filterEventsBtn.SetTitle("Filter Events", UIControlState.Normal); filterEventsBtn.Frame = new Rectangle(0, 0, 320, 44); int y = (int)((View.Frame.Size.Height - filterEventsBtn.Frame.Size.Height) / 1.25); int x = ((int)(View.Frame.Size.Width - filterEventsBtn.Frame.Size.Width)) / 2; filterEventsBtn.Frame = new Rectangle(x, y, (int)filterEventsBtn.Frame.Width, (int)filterEventsBtn.Frame.Height); View.AddSubview(filterEventsBtn); filterEventsBtn.TouchUpInside += (object sender, EventArgs e) => { setFilter(); UIAlertView _error = new UIAlertView("Success!", "Event filter successful!", null, "Ok", null); _error.Show(); }; }
public LoginViewController () : base (UITableViewStyle.Grouped, null) { hostEntry = new EntryElement ("Host", "imap.gmail.com", "imap.gmail.com"); portEntry = new EntryElement ("Port", "993", "993") { KeyboardType = UIKeyboardType.NumberPad }; sslCheckbox = new CheckboxElement ("Use SSL", true); userEntry = new EntryElement ("Username", "Email / Username", ""); passwordEntry = new EntryElement ("Password", "password", "", true); Root = new RootElement ("IMAP Login") { new Section ("Server") { hostEntry, portEntry, sslCheckbox }, new Section ("Account") { userEntry, passwordEntry }, new Section { new StyledStringElement ("Login", Login) } }; foldersViewController = new FoldersViewController (); }
public override void ViewDidLoad() { base.ViewDidLoad(); var title = expense == null ? "New Expense" : "Edit Expense"; this.Root = new RootElement(title) { new Section("Expense Details") { (name = new EntryElement("Name", "Expense Name", string.Empty)), (total = new EntryElement("Total", "1.00", string.Empty){KeyboardType = UIKeyboardType.DecimalPad}), (billable = new CheckboxElement("Billable", true)), new RootElement("Category", categories = new RadioGroup("category", 0)) { new Section() { from category in viewModel.Categories select (Element) new RadioElement(category) } }, (due = new DateElement("Due Date", DateTime.Now)) }, new Section("Notes") { (notes = new EntryElement(string.Empty, "Enter expense notes.", string.Empty)) } }; billable.Value = viewModel.Billable; name.Value = viewModel.Name; total.Value = viewModel.Total; notes.Caption = viewModel.Notes; categories.Selected = viewModel.Categories.IndexOf(viewModel.Category); due.DateValue = viewModel.Due; this.NavigationItem.RightBarButtonItem = new UIBarButtonItem(UIBarButtonSystemItem.Save, async delegate { viewModel.Category = viewModel.Categories[categories.Selected]; viewModel.Name = name.Value; viewModel.Billable = billable.Value; viewModel.Due = due.DateValue; viewModel.Notes = notes.Caption; viewModel.Total = total.Value; await viewModel.ExecuteSaveExpenseCommand(); if (!viewModel.CanNavigate) return; NavigationController.PopToRootViewController(true); }); }
void Populate (object callbacks, object o, RootElement root) { MemberInfo last_radio_index = null; BindingFlags flags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance; if (Attribute.GetCustomAttribute(o.GetType (), typeof(SkipNonPublicAttribute)) == null) flags |= BindingFlags.NonPublic; var members = o.GetType ().GetMembers (flags); Section section = null; foreach (var mi in members){ Type mType = GetTypeForMember (mi); if (mType == null) continue; string caption = null; object [] attrs = mi.GetCustomAttributes (false); bool skip = false; foreach (var attr in attrs){ if (attr is SkipAttribute) skip = true; if (attr is CaptionAttribute) caption = ((CaptionAttribute) attr).Caption; else if (attr is SectionAttribute){ if (section != null) root.Add (section); var sa = attr as SectionAttribute; section = new Section (sa.Caption, sa.Footer); } } if (skip) continue; if (caption == null) caption = MakeCaption (mi.Name); if (section == null) section = new Section (); Element element = null; if (mType == typeof (string)){ PasswordAttribute pa = null; AlignmentAttribute align = null; EntryAttribute ea = null; object html = null; NSAction invoke = null; bool multi = false; foreach (object attr in attrs){ if (attr is PasswordAttribute) pa = attr as PasswordAttribute; else if (attr is EntryAttribute) ea = attr as EntryAttribute; else if (attr is MultilineAttribute) multi = true; else if (attr is HtmlAttribute) html = attr; else if (attr is AlignmentAttribute) align = attr as AlignmentAttribute; if (attr is OnTapAttribute){ string mname = ((OnTapAttribute) attr).Method; if (callbacks == null){ throw new Exception ("Your class contains [OnTap] attributes, but you passed a null object for `context' in the constructor"); } var method = callbacks.GetType ().GetMethod (mname); if (method == null) throw new Exception ("Did not find method " + mname); invoke = delegate { method.Invoke (method.IsStatic ? null : callbacks, new object [0]); }; } } string value = (string) GetValue (mi, o); if (pa != null) element = new EntryElement (caption, pa.Placeholder, value, true); else if (ea != null) element = new EntryElement (caption, ea.Placeholder, value) { KeyboardType = ea.KeyboardType }; else if (multi) element = new MultilineElement (caption, value); else if (html != null) element = new HtmlElement (caption, value); else { var selement = new StringElement (caption, value); element = selement; if (align != null) selement.Alignment = align.Alignment; } if (invoke != null) ((StringElement) element).Tapped += invoke; } else if (mType == typeof (float)){ var floatElement = new FloatElement (null, null, (float) GetValue (mi, o)); floatElement.Caption = caption; element = floatElement; foreach (object attr in attrs){ if (attr is RangeAttribute){ var ra = attr as RangeAttribute; floatElement.MinValue = ra.Low; floatElement.MaxValue = ra.High; floatElement.ShowCaption = ra.ShowCaption; } } } else if (mType == typeof (bool)){ bool checkbox = false; foreach (object attr in attrs){ if (attr is CheckboxAttribute) checkbox = true; } if (checkbox) element = new CheckboxElement (caption, (bool) GetValue (mi, o)); else element = new BooleanElement (caption, (bool) GetValue (mi, o)); } else if (mType == typeof (DateTime)){ var dateTime = (DateTime) GetValue (mi, o); bool asDate = false, asTime = false; foreach (object attr in attrs){ if (attr is DateAttribute) asDate = true; else if (attr is TimeAttribute) asTime = true; } if (asDate) element = new DateElement (caption, dateTime); else if (asTime) element = new TimeElement (caption, dateTime); else element = new DateTimeElement (caption, dateTime); } else if (mType.IsEnum){ var csection = new Section (); ulong evalue = Convert.ToUInt64 (GetValue (mi, o), null); int idx = 0; int selected = 0; foreach (var fi in mType.GetFields (BindingFlags.Public | BindingFlags.Static)){ ulong v = Convert.ToUInt64 (GetValue (fi, null)); if (v == evalue) selected = idx; csection.Add (new RadioElement (MakeCaption (fi.Name))); idx++; } element = new RootElement (caption, new RadioGroup (null, selected)) { csection }; } else if (mType == typeof (UIImage)){ element = new ImageElement ((UIImage) GetValue (mi, o)); } else if (typeof (System.Collections.IEnumerable).IsAssignableFrom (mType)){ var csection = new Section (); int count = 0; if (last_radio_index == null) throw new Exception ("IEnumerable found, but no previous int found"); foreach (var e in (IEnumerable) GetValue (mi, o)){ csection.Add (new RadioElement (e.ToString ())); count++; } int selected = (int) GetValue (last_radio_index, o); if (selected >= count || selected < 0) selected = 0; element = new RootElement (caption, new MemberRadioGroup (null, selected, last_radio_index)) { csection }; last_radio_index = null; } else if (typeof (int) == mType){ foreach (object attr in attrs){ if (attr is RadioSelectionAttribute){ last_radio_index = mi; break; } } } else { var nested = GetValue (mi, o); if (nested != null){ var newRoot = new RootElement (caption); Populate (callbacks, nested, newRoot); element = newRoot; } } if (element == null) continue; section.Add (element); mappings [element] = new MemberAndInstance (mi, o); } root.Add (section); }
private Element RenderEditItemField(Item item, Field field) { PropertyInfo pi = null; object currentValue = null; object container = null; // get the current field value. // the value can either be in a strongly-typed property on the item (e.g. Name), // or in one of the FieldValues try { // get the strongly typed property pi = item.GetType().GetProperty(field.Name); if (pi != null) { // store current item's value for this field currentValue = pi.GetValue(item, null); // set the container - this will be the object that will be passed // to pi.SetValue() below to poke new values into container = item; } } catch (Exception) { // an exception indicates this isn't a strongly typed property on the Item // this is NOT an error condition } // if couldn't find a strongly typed property, this property is stored as a // FieldValue on the item if (pi == null) { // get current item's value for this field, or create a new FieldValue // if one doesn't already exist FieldValue fieldValue = item.GetFieldValue(field.ID, true); currentValue = fieldValue.Value; // get the value property of the current fieldvalue (this should never fail) pi = fieldValue.GetType().GetProperty("Value"); if (pi == null) return null; // set the container - this will be the object that will be passed // to pi.SetValue() below to poke new values into container = fieldValue; } // most elements will be Entry Elements - default to this EntryElement entryElement = new EntryElement(field.DisplayName, "", ""); Element element = entryElement; bool notMatched = false; // render the right control based on the type switch (field.DisplayType) { case DisplayTypes.Text: //StyledMultilineElement stringElement = new StyledMultilineElement(field.DisplayName, (string) currentValue); entryElement.KeyboardType = UIKeyboardType.Default; entryElement.Value = (string) currentValue; entryElement.AutocorrectionType = UITextAutocorrectionType.Yes; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; //element = stringElement; break; case DisplayTypes.TextArea: MultilineEntryElement multilineElement = new MultilineEntryElement(field.DisplayName, (string) currentValue) { Lines = 3 }; multilineElement.Changed += delegate { pi.SetValue(container, multilineElement.Value, null); }; //var multilineElement = new MultilineEntryElement3(field.DisplayName, (string) currentValue) { Editable = true }; //multilineElement.Changed += delegate { pi.SetValue(container, multilineElement.Value, null); }; element = multilineElement; //entryElement.Value = (string) currentValue; //entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case DisplayTypes.Phone: entryElement.Value = (string) currentValue; entryElement.KeyboardType = UIKeyboardType.PhonePad; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case DisplayTypes.Link: entryElement.Value = (string) currentValue; entryElement.KeyboardType = UIKeyboardType.Url; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case DisplayTypes.Email: entryElement.Value = (string) currentValue; entryElement.KeyboardType = UIKeyboardType.EmailAddress; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case DisplayTypes.Address: entryElement.Value = (string) currentValue; entryElement.AutocorrectionType = UITextAutocorrectionType.Yes; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case DisplayTypes.Priority: var priorities = new RadioGroup(field.DisplayName, 0); priorities.Selected = ((int?) currentValue) != null ? (int) currentValue : 1; // HACK: hardcode to "Normal" priority. this should come from a table. var priSection = new Section(); priSection.AddAll( from pr in App.ViewModel.Constants.Priorities select (Element) new RadioEventElement(pr.Name, field.DisplayName)); var priorityElement = new ThemedRootElement(field.DisplayName, priorities) { priSection }; // augment the radio elements with the right index and event handler int i = 0; foreach (var radio in priorityElement[0].Elements) { RadioEventElement radioEventElement = (RadioEventElement) radio; int index = i++; radioEventElement.OnSelected += delegate { pi.SetValue(container, index, null); }; } element = priorityElement; break; case DisplayTypes.Lists: // create a collection of lists in this folder, and add the folder as the first entry var lists = App.ViewModel.Items. Where(li => li.FolderID == item.FolderID && li.IsList == true && li.ItemTypeID != SystemItemTypes.Reference). OrderBy(li => li.Name). ToObservableCollection(); lists.Insert(0, new Item() { ID = Guid.Empty, Name = folder.Name }); // a null value for the "list" field indicates a Folder as a parent (i.e. this item is a top-level item) if (currentValue == null) currentValue = Guid.Empty; Item currentList = lists.FirstOrDefault(li => li.ID == (Guid) currentValue); var listsGroup = new RadioGroup (field.DisplayName, 0); listsGroup.Selected = Math.Max(lists.IndexOf(currentList), 0); var listsSection = new Section(); listsSection.AddAll( from l in lists select (Element) new RadioEventElement(l.Name, field.DisplayName)); var listsElement = new ThemedRootElement(field.DisplayName, listsGroup) { listsSection }; // augment the radio elements with the right index and event handler int index = 0; foreach (var radio in listsElement[0].Elements) { int currentIndex = index; // make a local copy for the closure RadioEventElement radioEventElement = (RadioEventElement) radio; radioEventElement.OnSelected += delegate(object sender, EventArgs e) { pi.SetValue(container, lists[currentIndex].ID, null); }; index++; } element = listsElement; break; case DisplayTypes.DatePicker: DateTime? dateTime = String.IsNullOrEmpty((string) currentValue) ? (DateTime?) null : Convert.ToDateTime((string) currentValue); DateEventElement dateElement = new DateEventElement(field.DisplayName, dateTime); dateElement.ValueSelected += delegate { pi.SetValue(container, ((DateTime)dateElement.DateValue).ToString("yyyy/MM/dd"), null); folder.NotifyPropertyChanged("FirstDue"); folder.NotifyPropertyChanged("FirstDueColor"); }; element = dateElement; break; case DisplayTypes.DateTimePicker: DateTime? dt = String.IsNullOrEmpty((string) currentValue) ? (DateTime?) null : Convert.ToDateTime((string) currentValue); DateTimeEventElement dateTimeElement = new DateTimeEventElement(field.DisplayName, dt); dateTimeElement.ValueSelected += (s, e) => { pi.SetValue(container, dateTimeElement.DateValue == null ? null : ((DateTime) dateTimeElement.DateValue).ToString(), null); folder.NotifyPropertyChanged("FirstDue"); folder.NotifyPropertyChanged("FirstDueColor"); }; element = dateTimeElement; break; case DisplayTypes.Checkbox: CheckboxElement checkboxElement = new CheckboxElement(field.DisplayName, currentValue == null ? false : (bool) currentValue); checkboxElement.Tapped += delegate { pi.SetValue(container, checkboxElement.Value, null); }; element = checkboxElement; break; case DisplayTypes.TagList: // TODO element = null; break; case DisplayTypes.ImageUrl: // TODO: wire up to picture picker, and upload to an image service element = null; break; case DisplayTypes.LinkArray: var linkArrayElement = new MultilineEntryElement(field.DisplayName, (string) currentValue) { Lines = 3, AcceptReturns = true }; if (!String.IsNullOrEmpty((string) currentValue)) { try { var linkList = JsonConvert.DeserializeObject<List<Link>>((string)currentValue); linkArrayElement.Value = String.Concat(linkList.Select(l => l.Name != null ? l.Name + "," + l.Url + "\n" : l.Url + "\n").ToList()); } catch (Exception) { } } linkArrayElement.Changed += delegate { // the expected format is a newline-delimited list of Name, Url pairs var linkArray = linkArrayElement.Value.Split(new char[] { '\r','\n' }, StringSplitOptions.RemoveEmptyEntries); var linkList = new List<Link>(); foreach (var link in linkArray) { var nameval = link.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (nameval.Length == 0) continue; if (nameval.Length == 1) linkList.Add(new Link() { Url = nameval[0].Trim() }); else linkList.Add(new Link() { Name = nameval[0].Trim(), Url = nameval[1].Trim() }); } var json = JsonConvert.SerializeObject(linkList); pi.SetValue(container, json, null); }; element = linkArrayElement; break; case DisplayTypes.Hidden: // skip rendering element = null; break; case DisplayTypes.ContactList: StringElement contactsElement = new StringElement(field.DisplayName); Item currentContacts = CreateValueList(item, field, currentValue == null ? Guid.Empty : new Guid((string) currentValue)); contactsElement.Value = CreateCommaDelimitedList(currentContacts); Item contacts = new Item() { Items = App.ViewModel.Items. Where(it => it.ItemTypeID == SystemItemTypes.Contact && it.IsList == false). Select(it => new Item() { Name = it.Name, FolderID = folder.ID, ItemTypeID = SystemItemTypes.Reference, ParentID = currentContacts.ID, ItemRef = it.ID }). ToObservableCollection(), }; contactsElement.Tapped += delegate { // put up the list picker dialog ListPickerPage listPicker = new ListPickerPage( SystemItemTypes.Contact, editViewController.NavigationController, contactsElement, pi, container, field.DisplayName, currentContacts, contacts); listPicker.PushViewController(); }; element = contactsElement; break; case DisplayTypes.LocationList: StringElement locationsElement = new StringElement(field.DisplayName); Item currentLocations = CreateValueList(item, field, currentValue == null ? Guid.Empty : new Guid((string) currentValue)); locationsElement.Value = CreateCommaDelimitedList(currentLocations); Item locations = new Item() { Items = App.ViewModel.Items. Where(it => it.ItemTypeID == SystemItemTypes.Location && it.IsList == false). Select(it => new Item() { Name = it.Name, FolderID = folder.ID, ItemTypeID = SystemItemTypes.Reference, ParentID = currentLocations.ID, ItemRef = it.ID }). ToObservableCollection(), }; locationsElement.Tapped += delegate { // put up the list picker dialog ListPickerPage listPicker = new ListPickerPage( SystemItemTypes.Location, editViewController.NavigationController, locationsElement, pi, container, field.DisplayName, currentLocations, locations); listPicker.PushViewController(); }; element = locationsElement; break; case DisplayTypes.ItemTypes: var itemTypePickerElement = new ItemTypePickerElement("Type", (Guid) currentValue); itemTypePickerElement.OnSelected += (sender, e) => { pi.SetValue(container, itemTypePickerElement.SelectedItemType, null); }; element = itemTypePickerElement; break; default: notMatched = true; break; } // if wasn't able to match field type by display type, try matching by FieldType if (notMatched == true) { switch (field.FieldType) { case FieldTypes.String: default: entryElement.KeyboardType = UIKeyboardType.Default; entryElement.Value = (string) currentValue; entryElement.AutocorrectionType = UITextAutocorrectionType.Yes; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case FieldTypes.Integer: entryElement.Value = (string) currentValue; entryElement.KeyboardType = UIKeyboardType.NumberPad; entryElement.Changed += delegate { pi.SetValue(container, entryElement.Value, null); }; break; case FieldTypes.DateTime: DateTime dateTime = currentValue == null ? DateTime.Now.Date : Convert.ToDateTime ((string) currentValue); DateEventElement dateElement = new DateEventElement(field.DisplayName, dateTime); dateElement.ValueSelected += delegate { pi.SetValue(container, ((DateTime)dateElement.DateValue).ToString("yyyy/MM/dd"), null); folder.NotifyPropertyChanged("FirstDue"); folder.NotifyPropertyChanged("FirstDueColor"); }; element = dateElement; break; case FieldTypes.Boolean: CheckboxElement checkboxElement = new CheckboxElement(field.DisplayName, currentValue == null ? false : (bool) currentValue); checkboxElement.Tapped += delegate { pi.SetValue(container, checkboxElement.Value, null); }; element = checkboxElement; break; } } return element; }
void Populate(object callbacks, object o, RootElement root) { MemberInfo last_radio_index = null; var members = o.GetType().GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); Section section = null; foreach (var mi in members) { Type mType = GetTypeForMember(mi); if (mType == null) { continue; } string caption = null; object [] attrs = mi.GetCustomAttributes(false); bool skip = false; foreach (var attr in attrs) { if (attr is SkipAttribute || attr is System.Runtime.CompilerServices.CompilerGeneratedAttribute) { skip = true; } else if (attr is CaptionAttribute) { caption = ((CaptionAttribute)attr).Caption; } else if (attr is SectionAttribute) { if (section != null) { root.Add(section); } var sa = attr as SectionAttribute; section = new Section(sa.Caption, sa.Footer); } } if (skip) { continue; } if (caption == null) { caption = MakeCaption(mi.Name); } if (section == null) { section = new Section(); } Element element = null; if (mType == typeof(string)) { PasswordAttribute pa = null; AlignmentAttribute align = null; EntryAttribute ea = null; object html = null; NSAction invoke = null; bool multi = false; foreach (object attr in attrs) { if (attr is PasswordAttribute) { pa = attr as PasswordAttribute; } else if (attr is EntryAttribute) { ea = attr as EntryAttribute; } else if (attr is MultilineAttribute) { multi = true; } else if (attr is HtmlAttribute) { html = attr; } else if (attr is AlignmentAttribute) { align = attr as AlignmentAttribute; } if (attr is OnTapAttribute) { string mname = ((OnTapAttribute)attr).Method; if (callbacks == null) { throw new Exception("Your class contains [OnTap] attributes, but you passed a null object for `context' in the constructor"); } var method = callbacks.GetType().GetMethod(mname); if (method == null) { throw new Exception("Did not find method " + mname); } invoke = delegate { method.Invoke(method.IsStatic ? null : callbacks, new object [0]); }; } } string value = (string)GetValue(mi, o); if (pa != null) { element = new EntryElement(caption, pa.Placeholder, value, true); } else if (ea != null) { element = new EntryElement(caption, ea.Placeholder, value) { KeyboardType = ea.KeyboardType, AutocapitalizationType = ea.AutocapitalizationType, AutocorrectionType = ea.AutocorrectionType, ClearButtonMode = ea.ClearButtonMode } } ; else if (multi) { element = new MultilineElement(caption, value); } else if (html != null) { element = new HtmlElement(caption, value); } else { var selement = new StringElement(caption, value); element = selement; if (align != null) { selement.Alignment = align.Alignment; } } if (invoke != null) { ((StringElement)element).Tapped += invoke; } } else if (mType == typeof(float)) { var floatElement = new FloatElement(null, null, (float)GetValue(mi, o)); floatElement.Caption = caption; element = floatElement; foreach (object attr in attrs) { if (attr is RangeAttribute) { var ra = attr as RangeAttribute; floatElement.MinValue = ra.Low; floatElement.MaxValue = ra.High; floatElement.ShowCaption = ra.ShowCaption; } } } else if (mType == typeof(bool)) { bool checkbox = false; foreach (object attr in attrs) { if (attr is CheckboxAttribute) { checkbox = true; } } if (checkbox) { element = new CheckboxElement(caption, (bool)GetValue(mi, o)); } else { element = new BooleanElement(caption, (bool)GetValue(mi, o)); } } else if (mType == typeof(DateTime)) { var dateTime = (DateTime)GetValue(mi, o); bool asDate = false, asTime = false; foreach (object attr in attrs) { if (attr is DateAttribute) { asDate = true; } else if (attr is TimeAttribute) { asTime = true; } } if (asDate) { element = new DateElement(caption, dateTime); } else if (asTime) { element = new TimeElement(caption, dateTime); } else { element = new DateTimeElement(caption, dateTime); } } else if (mType.IsEnum) { var csection = new Section(); ulong evalue = Convert.ToUInt64(GetValue(mi, o), null); int idx = 0; int selected = 0; foreach (var fi in mType.GetFields(BindingFlags.Public | BindingFlags.Static)) { ulong v = Convert.ToUInt64(GetValue(fi, null)); if (v == evalue) { selected = idx; } CaptionAttribute ca = Attribute.GetCustomAttribute(fi, typeof(CaptionAttribute)) as CaptionAttribute; csection.Add(new RadioElement(ca != null ? ca.Caption : MakeCaption(fi.Name))); idx++; } element = new RootElement(caption, new RadioGroup(null, selected)) { csection }; } else if (mType == typeof(UIImage)) { element = new ImageElement((UIImage)GetValue(mi, o)); } else if (typeof(System.Collections.IEnumerable).IsAssignableFrom(mType)) { var csection = new Section(); int count = 0; if (last_radio_index == null) { throw new Exception("IEnumerable found, but no previous int found"); } foreach (var e in (IEnumerable)GetValue(mi, o)) { csection.Add(new RadioElement(e.ToString())); count++; } int selected = (int)GetValue(last_radio_index, o); if (selected >= count || selected < 0) { selected = 0; } element = new RootElement(caption, new MemberRadioGroup(null, selected, last_radio_index)) { csection }; last_radio_index = null; } else if (typeof(int) == mType) { foreach (object attr in attrs) { if (attr is RadioSelectionAttribute) { last_radio_index = mi; break; } } } else { var nested = GetValue(mi, o); if (nested != null) { var newRoot = new RootElement(caption); Populate(callbacks, nested, newRoot); element = newRoot; } } if (element == null) { continue; } section.Add(element); mappings [element] = new MemberAndInstance(mi, o); } root.Add(section); }
private void BuildElementPropertyMap() { _ElementPropertyMap = new Dictionary <Type, Func <MemberInfo, string, object, List <Binding>, Element> >(); _ElementPropertyMap.Add(typeof(MethodInfo), (member, caption, dataContext, bindings) => { Element element = null; var buttonAttribute = member.GetCustomAttribute <ButtonAttribute>(); if (buttonAttribute != null) { element = new ButtonElement(caption) { BackgroundColor = buttonAttribute.BackgroundColor, TextColor = buttonAttribute.TextColor, Command = GetCommandForMember(dataContext, member) }; } return(element); }); _ElementPropertyMap.Add(typeof(CLLocationCoordinate2D), (member, caption, dataContext, bindings) => { Element element = null; var mapAttribute = member.GetCustomAttribute <MapAttribute>(); var location = (CLLocationCoordinate2D)GetValue(member, dataContext); if (mapAttribute != null) { element = new MapElement(mapAttribute.Caption, mapAttribute.Value, location); } return(element); }); _ElementPropertyMap.Add(typeof(string), (member, caption, dataContext, bindings) => { Element element = null; var passwordAttribute = member.GetCustomAttribute <PasswordAttribute>(); var entryAttribute = member.GetCustomAttribute <EntryAttribute>(); var multilineAttribute = member.GetCustomAttribute <MultilineAttribute>(); var htmlAttribute = member.GetCustomAttribute <HtmlAttribute>(); var alignmentAttribute = member.GetCustomAttribute <AlignmentAttribute>(); if (passwordAttribute != null) { element = new EntryElement(caption, passwordAttribute.Placeholder, true); } else if (entryAttribute != null) { element = new EntryElement(caption, entryAttribute.Placeholder) { KeyboardType = entryAttribute.KeyboardType } } ; else if (multilineAttribute != null) { element = new MultilineElement(caption); } else if (htmlAttribute != null) { SetDefaultConverter(member, "Value", new UriConverter(), bindings); element = new HtmlElement(caption); } else { var selement = new StringElement(caption, (string)GetValue(member, dataContext)); if (alignmentAttribute != null) { selement.Alignment = alignmentAttribute.Alignment; } element = selement; } var tappable = element as ITappable; if (tappable != null) { ((ITappable)element).Command = GetCommandForMember(dataContext, member); } return(element); }); _ElementPropertyMap.Add(typeof(float), (member, caption, dataContext, bindings) => { Element element = null; var rangeAttribute = member.GetCustomAttribute <RangeAttribute>(); if (rangeAttribute != null) { var floatElement = new FloatElement() { }; floatElement.Caption = caption; element = floatElement; floatElement.MinValue = rangeAttribute.Low; floatElement.MaxValue = rangeAttribute.High; floatElement.ShowCaption = rangeAttribute.ShowCaption; } else { var entryAttribute = member.GetCustomAttribute <EntryAttribute>(); var placeholder = ""; var keyboardType = UIKeyboardType.NumberPad; if (entryAttribute != null) { placeholder = entryAttribute.Placeholder; if (entryAttribute.KeyboardType != UIKeyboardType.Default) { keyboardType = entryAttribute.KeyboardType; } } element = new EntryElement(caption, placeholder, "") { KeyboardType = keyboardType }; } return(element); }); _ElementPropertyMap.Add(typeof(Uri), (member, caption, dataContext, bindings) => { return(new HtmlElement(caption, (Uri)GetValue(member, dataContext))); }); _ElementPropertyMap.Add(typeof(bool), (member, caption, dataContext, bindings) => { Element element = null; var checkboxAttribute = member.GetCustomAttribute <CheckboxAttribute>(); if (checkboxAttribute != null) { element = new CheckboxElement(caption) { } } ; else { element = new BooleanElement(caption) { } }; return(element); }); _ElementPropertyMap.Add(typeof(DateTime), (member, caption, dataContext, bindings) => { Element element = null; var dateAttribute = member.GetCustomAttribute <DateAttribute>(); var timeAttribute = member.GetCustomAttribute <TimeAttribute>(); if (dateAttribute != null) { element = new DateElement(caption); } else if (timeAttribute != null) { element = new TimeElement(caption); } else { element = new DateTimeElement(caption); } return(element); }); _ElementPropertyMap.Add(typeof(UIImage), (member, caption, dataContext, bindings) => { return(new ImageElement()); }); _ElementPropertyMap.Add(typeof(int), (member, caption, dataContext, bindings) => { return(new StringElement(caption) { Value = GetValue(member, dataContext).ToString() }); }); }
public UIViewController GetViewController () { var menu = new RootElement ("Test Runner"); var runMode = new Section("Run Mode"); var interactiveCheckBox = new CheckboxElement("Enable Interactive Mode"); interactiveCheckBox.Tapped += () => GraphicsTestBase.ForceInteractiveMode = interactiveCheckBox.Value; runMode.Add(interactiveCheckBox); menu.Add(runMode); Section main = new Section ("Loading test suites..."); menu.Add (main); Section options = new Section () { new StyledStringElement ("Options", Options) { Accessory = UITableViewCellAccessory.DisclosureIndicator }, new StyledStringElement ("Credits", Credits) { Accessory = UITableViewCellAccessory.DisclosureIndicator } }; menu.Add (options); // large unit tests applications can take more time to initialize // than what the iOS watchdog will allow them on devices ThreadPool.QueueUserWorkItem (delegate { foreach (Assembly assembly in assemblies) Load (assembly, null); window.InvokeOnMainThread (delegate { while (suite.Tests.Count == 1 && (suite.Tests[0] is TestSuite)) suite = (TestSuite)suite.Tests[0]; foreach (TestSuite ts in suite.Tests) { main.Add (Setup (ts)); } mre.Set (); main.Caption = null; menu.Reload (main, UITableViewRowAnimation.Fade); options.Insert (0, new StringElement ("Run Everything", Run)); menu.Reload (options, UITableViewRowAnimation.Fade); }); assemblies.Clear (); }); var dv = new DialogViewController (menu) { Autorotate = true }; // AutoStart running the tests (with either the supplied 'writer' or the options) if (AutoStart) { ThreadPool.QueueUserWorkItem (delegate { mre.WaitOne (); window.BeginInvokeOnMainThread (delegate { Run (); // optionally end the process, e.g. click "Touch.Unit" -> log tests results, return to springboard... // http://stackoverflow.com/questions/1978695/uiapplication-sharedapplication-terminatewithsuccess-is-not-there if (TerminateAfterExecution) TerminateWithSuccess (); }); }); } return dv; }
private void BuildElementPropertyMap() { _ElementPropertyMap = new Dictionary<Type, Func<MemberInfo, string, object, List<Binding>, Element>>(); _ElementPropertyMap.Add(typeof(MethodInfo), (member, caption, dataContext, bindings)=> { Element element = null; var buttonAttribute = member.GetCustomAttribute<ButtonAttribute>(); if (buttonAttribute != null) { element = new ButtonElement(caption) { BackgroundColor = buttonAttribute.BackgroundColor, TextColor = buttonAttribute.TextColor, Command = GetCommandForMember(dataContext, member) }; } return element; }); _ElementPropertyMap.Add(typeof(CLLocationCoordinate2D), (member, caption, dataContext, bindings)=> { Element element = null; var mapAttribute = member.GetCustomAttribute<MapAttribute>(); var location = (CLLocationCoordinate2D)GetValue(member, dataContext); if (mapAttribute != null) element = new MapElement(mapAttribute.Caption, mapAttribute.Value, location); return element; }); _ElementPropertyMap.Add(typeof(string), (member, caption, dataContext, bindings)=> { Element element = null; var passwordAttribute = member.GetCustomAttribute<PasswordAttribute>(); var entryAttribute = member.GetCustomAttribute<EntryAttribute>(); var multilineAttribute = member.GetCustomAttribute<MultilineAttribute>(); var htmlAttribute = member.GetCustomAttribute<HtmlAttribute>(); var alignmentAttribute = member.GetCustomAttribute<AlignmentAttribute>(); if (passwordAttribute != null) element = new EntryElement(caption, passwordAttribute.Placeholder, true); else if (entryAttribute != null) element = new EntryElement(caption, entryAttribute.Placeholder) { KeyboardType = entryAttribute.KeyboardType }; else if (multilineAttribute != null) element = new MultilineElement(caption); else if (htmlAttribute != null) { SetDefaultConverter(member, "Value", new UriConverter(), bindings); element = new HtmlElement(caption); } else { var selement = new StringElement(caption, (string)GetValue(member, dataContext)); if (alignmentAttribute != null) selement.Alignment = alignmentAttribute.Alignment; element = selement; } var tappable = element as ITappable; if (tappable != null) ((ITappable)element).Command = GetCommandForMember(dataContext, member); return element; }); _ElementPropertyMap.Add(typeof(float), (member, caption, dataContext, bindings)=> { Element element = null; var rangeAttribute = member.GetCustomAttribute<RangeAttribute>(); if (rangeAttribute != null) { var floatElement = new FloatElement() { }; floatElement.Caption = caption; element = floatElement; floatElement.MinValue = rangeAttribute.Low; floatElement.MaxValue = rangeAttribute.High; floatElement.ShowCaption = rangeAttribute.ShowCaption; } else { var entryAttribute = member.GetCustomAttribute<EntryAttribute>(); var placeholder = ""; var keyboardType = UIKeyboardType.NumberPad; if(entryAttribute != null) { placeholder = entryAttribute.Placeholder; if(entryAttribute.KeyboardType != UIKeyboardType.Default) keyboardType = entryAttribute.KeyboardType; } element = new EntryElement(caption, placeholder, "") { KeyboardType = keyboardType }; } return element; }); _ElementPropertyMap.Add(typeof(Uri), (member, caption, dataContext, bindings)=> { return new HtmlElement(caption, (Uri)GetValue(member, dataContext)); }); _ElementPropertyMap.Add(typeof(bool), (member, caption, dataContext, bindings)=> { Element element = null; var checkboxAttribute = member.GetCustomAttribute<CheckboxAttribute>(); if (checkboxAttribute != null) element = new CheckboxElement(caption) { }; else element = new BooleanElement(caption) { }; return element; }); _ElementPropertyMap.Add(typeof(DateTime), (member, caption, dataContext, bindings)=> { Element element = null; var dateAttribute = member.GetCustomAttribute<DateAttribute>(); var timeAttribute = member.GetCustomAttribute<TimeAttribute>(); if(dateAttribute != null) element = new DateElement(caption); else if (timeAttribute != null) element = new TimeElement(caption); else element = new DateTimeElement(caption); return element; }); _ElementPropertyMap.Add(typeof(UIImage),(member, caption, dataContext, bindings)=> { return new ImageElement(); }); _ElementPropertyMap.Add(typeof(int), (member, caption, dataContext, bindings)=> { return new StringElement(caption) { Value = GetValue(member, dataContext).ToString() }; }); }
// // This method is invoked when the application has loaded and is ready to run. In this // method you should instantiate the window, load the UI into it and then make the window // visible. // // You have 17 seconds to return from this method, or iOS will terminate your application. // public override bool FinishedLaunching (UIApplication app, NSDictionary options) { window = new UIWindow (UIScreen.MainScreen.Bounds); fullPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "test.db"); try { System.IO.Directory.CreateDirectory(fullPath); System.IO.Directory.Delete(fullPath); } catch { } serverURL = new EntryElement ("Server", "ZSS Server URL", "http://:8080"); serverURL.KeyboardType = UIKeyboardType.Url; dbFileElement = new EntryElement ("DBFile", "", ""); dbFileElement.AutocapitalizationType = UITextAutocapitalizationType.None; dbFileElement.AutocorrectionType = UITextAutocorrectionType.No; schemeElement = new EntryElement ("Scheme", "Auth Scheme", ""); schemeElement.AutocapitalizationType = UITextAutocapitalizationType.None; schemeElement.AutocorrectionType = UITextAutocorrectionType.No; userElement = new EntryElement ("User", "User name", ""); userElement.AutocapitalizationType = UITextAutocapitalizationType.None; userElement.AutocorrectionType = UITextAutocorrectionType.No; passElement = new EntryElement ("Password", "Password", "", true); passElement.AutocapitalizationType = UITextAutocapitalizationType.None; passElement.AutocorrectionType = UITextAutocorrectionType.No; authCheckboxElement = new CheckboxElement ("Send Auth Information", true); var syncButton = new StyledStringElement ("Sync", () => { SyncButtonClicked (authCheckboxElement.Value, serverURL.Value, dbFileElement.Value, schemeElement.Value, userElement.Value, passElement.Value); }); syncButton.Alignment = UITextAlignment.Center; syncButton.BackgroundColor = UIColor.Orange; var authSection = new Section ("Authentication") { authCheckboxElement, schemeElement, userElement, passElement }; root = new RootElement ("Sync") { new Section ("Server") { serverURL, dbFileElement }, authSection, new Section ("") { syncButton } }; root.UnevenRows = true; authCheckboxElement.Tapped += () => { if (authCheckboxElement.Value == false) { authSection.Remove(schemeElement); authSection.Remove(userElement); authSection.Remove(passElement); } else { authSection.Add(schemeElement); authSection.Add(userElement); authSection.Add(passElement); } }; DialogViewController dvc = new DialogViewController (root); window.RootViewController = new UINavigationController(dvc); window.MakeKeyAndVisible (); LoadValues (); return true; }
void SetElementValueFromDefaults(CheckboxElement e, NSUserDefaults defs, string key, bool defaultVal) { var value = defs.DataForKey (key); if (value == null) e.Value = defaultVal; else e.Value = defs.BoolForKey(key); }
private RootElement RenderPicker(Item values, Item pickerValues) { // build a section with all the items in the current list section = new Section(); foreach (var item in currentList) { CheckboxElement ce = new CheckboxElement(item.Name); // set the value to true if the current item is in the values list ce.Value = values.Items.IndexOf(item) < 0 ? false : true; ce.Tapped += delegate { Checkbox_Click(ce, new EventArgs()); }; section.Add(ce); } Section itemTypeSection = null; if (itemTypeID == SystemItemTypes.Contact) { itemTypeSection = new Section() { new StringElement("Add contact", delegate { var picker = new ABPeoplePickerNavigationController(); picker.SelectPerson += delegate(object sender, ABPeoplePickerSelectPersonEventArgs e) { // process the contact - if it's not null, handle adding the new contact to the ListPicker var contact = ContactPickerHelper.ProcessContact(e.Person); if (contact != null) HandleAddedContact(contact); picker.DismissModalViewControllerAnimated(true); }; picker.Cancelled += delegate { picker.DismissModalViewControllerAnimated(true); }; // present the contact picker controller.PresentModalViewController(picker, true); }), }; } var listPickerRoot = new RootElement(caption); if (itemTypeSection != null) listPickerRoot.Add(itemTypeSection); listPickerRoot.Add(section); return listPickerRoot; }
public CalloutViewCtrl () : base(null) { this.CentersCheck = new CheckboxElement[Centers.Length]; for (int i = 0; i < Centers.Length; i++) { var tmp = new CheckboxElement (Centers[i]); this.CentersCheck [i] = tmp; } this.FirstName = new EntryElement ("First Name", "Rocky", KeyStore.Get ("FirstName")) { TextAlignment = UITextAlignment.Right }; this.LastName = new EntryElement ("Last Name", "D. Bull", KeyStore.Get ("LastName")) { TextAlignment = UITextAlignment.Right }; this.Email = new EntryElement ("E-Mail", "*****@*****.**", KeyStore.Get ("Email")) { TextAlignment = UITextAlignment.Right, KeyboardType = UIKeyboardType.EmailAddress }; OptionGroup = new RadioGroup ("type", 0); Callout = new RadioElement ("Call-Out", "type"); Inlate = new RadioElement ("In Late", "type"); StartDate = new DateElement ("Out On", DateTime.Today) { Alignment = UITextAlignment.Right }; MultipleDays = new BooleanElement ("Out Multiple Days", false); EndDate = new DateElement ("Back On", DateTime.Today.AddDays (1)) { Alignment = UITextAlignment.Right }; WhenInDate = new DateTimeElement ("Will Be In", DateTime.Today.AddHours (12)) { Alignment = UITextAlignment.Right }; Explaination = new EntryElement ("Explaination", "reasons.", null) { TextAlignment = UITextAlignment.Right }; Section Name = new Section () { FirstName, LastName, Email }; Section Options = new Section () { Callout, Inlate }; Section CalloutDates = new Section () { StartDate, MultipleDays }; MultipleDays.ValueChanged += (sender, e) => { if (MultipleDays.Value) { CalloutDates.Add(EndDate); } else { CalloutDates.Remove(EndDate); } }; Section LateDay = new Section () { WhenInDate }; Callout.Tapped += delegate { this.Root.RemoveAt(2); this.Root.Insert(2, CalloutDates); }; Inlate.Tapped += delegate { this.Root.RemoveAt(2); this.Root.Insert(2, LateDay); }; this.Submit = new StringElement ("Submit") { Alignment = UITextAlignment.Center }; this.Root = new RootElement ("Call-Out", OptionGroup) { Name, Options, CalloutDates, new Section("Centers") { this.CentersCheck }, new Section() { Explaination }, new Section() { Submit } }; this.Submit.Tapped += Submit_Tapped; this.NavigationItem.LeftBarButtonItem = new UIBarButtonItem (UIBarButtonSystemItem.Cancel, delegate { this.NavigationController.PopViewController(true); }); }
void Populate (object callbacks, object o, RootElement root) { var members = o.GetType ().GetMembers (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); Section section = null; foreach (var mi in members){ Type mType = GetTypeForMember (mi); if (mType == null) continue; string caption = null; object [] attrs = mi.GetCustomAttributes (false); foreach (var attr in attrs){ if (attr is CaptionAttribute) caption = ((CaptionAttribute) attr).Caption; else if (attr is SectionAttribute){ if (section != null) Root.Add (section); var sa = attr as SectionAttribute; section = new Section (sa.Caption, sa.Footer); } } if (caption == null) caption = MakeCaption (mi.Name); if (section == null) section = new Section (); Element element = null; if (mType == typeof (string)){ PasswordAttribute pa = null; EntryAttribute ea = null; NSAction invoke = null; bool multi = false; foreach (object attr in attrs){ if (attr is PasswordAttribute) pa = attr as PasswordAttribute; else if (attr is EntryAttribute) ea = attr as EntryAttribute; else if (attr is MultilineAttribute) multi = true; if (attr is OnTapAttribute){ string mname = ((OnTapAttribute) attr).Method; if (callbacks == null){ throw new Exception ("Your class contains [OnTap] attributes, but you passed a null object for `context' in the constructor"); } var method = callbacks.GetType ().GetMethod (mname); if (method == null) throw new Exception ("Did not find method " + mname); invoke = delegate { method.Invoke (method.IsStatic ? null : callbacks, new object [0]); }; } } string value = (string) GetValue (mi, o); if (pa != null) element = new EntryElement (caption, pa.Placeholder, value, true); else if (ea != null) element = new EntryElement (caption, ea.Placeholder, value); else if (multi) element = new MultilineElement (caption, value); else element = new StringElement (caption, value); if (invoke != null) ((StringElement) element).Tapped += invoke; } else if (mType == typeof (float)){ var floatElement = new FloatElement (null, null, (float) GetValue (mi, o)); element = floatElement; foreach (object attr in attrs){ if (attr is RangeAttribute){ var ra = attr as RangeAttribute; floatElement.MinValue = ra.Low; floatElement.MaxValue = ra.High; } } } else if (mType == typeof (bool)){ bool checkbox = false; foreach (object attr in attrs){ if (attr is CheckboxAttribute) checkbox = true; } if (checkbox) element = new CheckboxElement (caption, (bool) GetValue (mi, o)); else element = new BooleanElement (caption, (bool) GetValue (mi, o)); } else if (mType == typeof (DateTime)){ var dateTime = (DateTime) GetValue (mi, o); bool asDate = false, asTime = false; foreach (object attr in attrs){ if (attr is DateAttribute) asDate = true; else if (attr is TimeAttribute) asTime = true; } if (asDate) element = new DateElement (caption, dateTime); else if (asTime) element = new TimeElement (caption, dateTime); else element = new DateTimeElement (caption, dateTime); } else if (mType.IsEnum){ var csection = new Section (); ulong evalue = Convert.ToUInt64 (GetValue (mi, o), null); int idx = 0; int selected = 0; foreach (var fi in mType.GetFields (BindingFlags.Public | BindingFlags.Static)){ ulong v = Convert.ToUInt64 (GetValue (fi, null)); if (v == evalue) selected = idx; csection.Add (new RadioElement (MakeCaption (fi.Name))); idx++; } element = new RootElement (caption, new RadioGroup (null, selected)) { csection }; } else if (mType == typeof (UIImage)){ element = new ImageElement ((UIImage) GetValue (mi, o)); } else { var nested = GetValue (mi, o); if (nested != null){ var newRoot = new RootElement (caption); Populate (callbacks, nested, newRoot); element = newRoot; } } if (element == null) continue; section.Add (element); mappings [element] = new MemberAndInstance (mi, o); } root.Add (section); }