public GenMainTabbedView(GenMainPage parentPage)
        {
            _parentPage     = parentPage;
            genSearchView   = new GenSearchView(_parentPage);
            genMapView      = new GenMapView(_parentPage);
            genUserListView = new GenUserListView(_parentPage);

            _tabList = new List <GenContentView> //needed for tab controls
            {
                genMapView,
                genSearchView,
                genUserListView
            };

            // main tabbed view
            var tabViewControl = new TabViewControl(_tabList.Select(x => x.AsTabItem()).ToList());

            tabViewControl.HeaderBackgroundColor = GlobalVars.ThemeColorsBG[(int)GlobalVars.ThemeColors.Secondary];
            tabViewControl.HeaderTabTextColor    = GlobalVars.ThemeColorsText[(int)GlobalVars.ThemeColors.Secondary];

            this.Content           = tabViewControl;
            this.VerticalOptions   = LayoutOptions.FillAndExpand;
            this.HorizontalOptions = LayoutOptions.FillAndExpand;

            tabViewControl.PositionChanged  += TabView_PositionChanged;
            tabViewControl.PositionChanging += TabView_PositionChanging;
        }
        public void ShowMainPage()
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                // this is an attempt to invalidate some of the list view sources before refreshing the app's view.
                // This alleviates some, but not all of the bugs associated with switching tabs quickly following a refresh
                if (HomePage != null)
                {
                    try
                    {
                        HomePage.tabbedView.genMapView.navigationListView.ItemsSource = null;
                    }
                    catch (Exception)
                    {

                    }

                    try
                    {
                        HomePage.tabbedView.genSearchView.genEventListView.ItemsSource = null;
                    }
                    catch (Exception)
                    {

                    }

                    try
                    {
                        HomePage.tabbedView.genUserListView.genEventListView.ItemsSource = null;
                    }
                    catch (Exception)
                    {

                    }
                }
                                
                HomePage = new GenMainPage();
                var mainPage = new NavigationPage(HomePage);
                mainPage.BarTextColor = GlobalVars.ThemeColorsText[(int)GlobalVars.ThemeColors.Primary];
                mainPage.BarBackgroundColor = GlobalVars.ThemeColorsBG[(int)GlobalVars.ThemeColors.Primary];
                MainPage = mainPage;
            });
        }
        public GenMapView(GenMainPage parentPage) : base(GlobalVars.navigationTitle)
        {
            GlobalVars.View_GenMapView = null;
            this._parentPage           = parentPage;

            navigationListView = new ListView
            {
                ItemTemplate = new DataTemplate(typeof(NavigationCell)),
                ItemsSource  = GlobalVars.NavigationChoices
            };

            navigationListView.ItemTapped += (object sender, ItemTappedEventArgs e) =>
            {
                //GlobalVars.GenConBusiness.ShowLoadingEventMessage("Data is still loading, map may not be up to date");

                if (e != null && e.Item != null)
                {
                    var selectedDetailChoice = (DetailChoice)e.Item;

                    if (selectedDetailChoice.data.ToLower().StartsWith("http:") || selectedDetailChoice.data.ToLower().StartsWith("https:"))
                    {
                        // don't put this in a popup container - it uses a plugin to determine the fastest option to open (uses embedded chrome options)
                        CrossShare.Current.OpenBrowser(selectedDetailChoice.data, null);
                    }
                    else
                    {
                        var page = (PopupPage)Activator.CreateInstance(selectedDetailChoice.pageType);
                        page.BindingContext = selectedDetailChoice;
                        PopupNavigation.Instance.PushAsync(page);
                    }

                    Device.BeginInvokeOnMainThread(() =>
                    {
                        navigationListView.SelectedItem = null;
                    });
                }
            };

            this.OnAppearedHandler += (sender, args) =>
            {
                ClearNavOption(ListView.SelectedItemProperty);
            };

            var content = new StackLayout
            {
                Children =
                {
                    navigationListView
                }
            };

            this.ToolbarItems.Add(new ToolbarItem("Font Size", "baseline_format_size_black_24.png", () =>
            {
                var page = new DisplayOptionsPage();
                PopupNavigation.Instance.PushAsync(page);
            }));

            this.ToolbarItems.Add(new ToolbarItem("Refresh", "ic_refresh_black_24dp.png", () =>
            {
                GlobalVars.View_GenEventsLoadingView.StartLoad();
            }));

            this.Content = content;
            GlobalVars.View_GenMapView = this;
        }
Beispiel #4
0
        public GenSearchView(GenMainPage parentPage) : base(GlobalVars.searchTitle)
        {
            GlobalVars.View_GenSearchView = null;
            _parentPage   = parentPage;
            _lastSyncTime = DateTime.Now;

            outerContainer = new AbsoluteLayout {
                Padding = 0
            };

            var wholePage = new StackLayout
            {
                Orientation       = StackOrientation.Vertical,
                Padding           = 0,
                Spacing           = 0,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions   = LayoutOptions.FillAndExpand
            };

            var searchNavSectionTwo = new Grid
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                Padding           = 1,
                ColumnSpacing     = 1,
                ColumnDefinitions = new ColumnDefinitionCollection()
                {
                    new ColumnDefinition()
                    {
                        Width = new GridLength(4, GridUnitType.Star)
                    },
                    new ColumnDefinition()
                    {
                        Width = new GridLength(4, GridUnitType.Star)
                    },
                    new ColumnDefinition()
                    {
                        Width = new GridLength(4, GridUnitType.Star)
                    },
                    new ColumnDefinition()
                    {
                        Width = new GridLength(3, GridUnitType.Star)
                    },
                    new ColumnDefinition()
                    {
                        Width = new GridLength(1, GridUnitType.Star)
                    }
                },
                RowDefinitions = new RowDefinitionCollection()
                {
                    new RowDefinition()
                    {
                        Height = GridLength.Auto
                    }
                }
            };

            //START OF UPPER SEARCH SECTION
            StackLayout searchNavSection = new StackLayout
            {
                Orientation       = StackOrientation.Horizontal,
                Padding           = 2,
                Spacing           = 0,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            searchEntry = new Entry
            {
                Keyboard          = Keyboard.Create(0),
                Placeholder       = "Search Here",
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            searchTerm = new SearchTerm();
            searchEntry.BindingContext = searchTerm;
            searchEntry.SetBinding(Entry.TextProperty, "searchTerm", BindingMode.TwoWay);

            searchEntry.Completed += (sender, e) =>
            {
                SetGenListContent();
            };

            //run the below on every keypress
            var clearWatcher = searchTerm.observer
                               .ObserveOn(SynchronizationContext.Current)
                               .Subscribe(final =>
            {
                searchTerm.isIgnoringNextEvent = false;
                outerContainer.Children.Remove(autoCompleteHolder);
            });

            //only run the below on legit text entry
            var autoCompleteWatcher = searchTerm.observer
                                      .Throttle(TimeSpan.FromMilliseconds(300))             //Wait for the user to pause typing
                                      .Where(x => !string.IsNullOrEmpty(x) && x.Length > 2) //Make sure the search term is long enough
                                      .DistinctUntilChanged()
                                      .ObserveOn(SynchronizationContext.Current)
                                      .Subscribe((x) =>
            {
                Observable.FromAsync((_) => {
                    string term = x.Trim();
                    if ((term.Length == 10 || term.Length == 11) && GlobalVars.isTypedEventID(term))
                    {
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            SetGenListContent();
                        });
                        return(new Task <IList <GenEvent> >(() =>
                        {
                            var returnMe = new List <GenEvent>();
                            return returnMe;
                        }));
                    }
                    return(GlobalVars.db.GetItemsFTS4(term, new GenconMobileDatabase.DBOptions[] { }));
                })                                         //MatchOnEmail returns Task<IEnumerable<T>>
                .TakeUntil(searchTerm.observer)            //If searchterm changes abandon the current request
                .ObserveOn(SynchronizationContext.Current) //To be safe marshall response to the UI thread
                .Subscribe(final =>                        //final holds the IEnumerable<T>
                {
                    try
                    {
                        if (!searchTerm.isIgnoringNextEvent)
                        {
                            AutoCompleteMatches.Clear();
                            if (final == null || !final.Any())
                            {
                                MatchCount = 0;
                                //ShowResult = false;
                                RemoveAutoCompleteView();
                            }
                            else
                            {
                                foreach (var g in final.DistinctBy(d => d.Title).OrderBy(d => d.Title).Take(5))
                                {
                                    AutoCompleteMatches.Add(g);
                                }
                                MatchCount = AutoCompleteMatches.Count;
                                matchListView.ItemsSource = AutoCompleteMatches;
                                var r    = AbsoluteLayout.GetLayoutBounds(autoCompleteHolder);
                                r.Y      = searchEntry.Y + (searchEntry.Height);
                                r.Height = wholePage.Height;
                                AbsoluteLayout.SetLayoutFlags(autoCompleteHolder, AbsoluteLayoutFlags.HeightProportional);
                                AbsoluteLayout.SetLayoutBounds(autoCompleteHolder, r);
                                //autoCompleteHolder.MinimumHeightRequest = wholePage.Height;
                                matchListView.HeightRequest = searchEntry.Height * Math.Min(AutoCompleteMatches.Count, 3);
                                //ShowResult = true;
                                if (!outerContainer.Children.Contains(autoCompleteHolder))
                                {
                                    outerContainer.Children.Add(autoCompleteHolder);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        string error = ex.Message;
                    }
                });
            });


            var clearSearchButton = new Image {
                Aspect = Aspect.AspectFit, HorizontalOptions = LayoutOptions.End
            };

            clearSearchButton.Source = ImageSource.FromFile("ic_cancel_black_24dp.png");

            TapGestureRecognizer clearSearchTap = new TapGestureRecognizer();

            clearSearchTap.Tapped += ClearSearchTap_Tapped;

            clearSearchButton.GestureRecognizers.Add(clearSearchTap);

            var searchStartButton = new Image {
                Aspect = Aspect.AspectFit, HorizontalOptions = LayoutOptions.End
            };

            searchStartButton.Source = ImageSource.FromFile("ic_search_black_24dp.png");

            TapGestureRecognizer startSearchTap = new TapGestureRecognizer();

            startSearchTap.Tapped += StartSearchTap_Tapped;
            //startSearchTap.Tapped += DEBUGDEMO_Tapped;
            searchStartButton.GestureRecognizers.Add(startSearchTap);
            autoCompleteHolder = new StackLayout
            {
                Padding           = 0,
                Spacing           = 0,
                VerticalOptions   = LayoutOptions.FillAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                Orientation       = StackOrientation.Vertical,
                BackgroundColor   = Color.FromRgba(0.2, 0.2, 0.2, 0.5)
            };
            var matchListTemplate = new DataTemplate(typeof(TextCell));

            matchListTemplate.SetBinding(TextCell.TextProperty, "Title");

            itemTemplate = new DataTemplate(typeof(GenEventCell));
            itemTemplate.CreateContent();

            matchListView = new ListView
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions   = LayoutOptions.Start,
                BindingContext    = this,
                ItemTemplate      = matchListTemplate,
                BackgroundColor   = Color.White
            };

            autoCompleteHolder.Children.Add(matchListView);

            searchNavSection.Children.Add(searchEntry);
            searchNavSection.Children.Add(clearSearchButton);
            searchNavSection.Children.Add(searchStartButton);

            wholePage.Children.Add(searchNavSection);

            //searchNavSectionTwo
            dayPicker = new Picker
            {
                Title             = "Days",
                VerticalOptions   = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            dayPicker.Items.Add("ALL");
            dayPicker.Items.Add("WED");
            dayPicker.Items.Add("THU");
            dayPicker.Items.Add("FRI");
            dayPicker.Items.Add("SAT");
            dayPicker.Items.Add("SUN");

            afterPicker = new Picker
            {
                Title             = "After",
                VerticalOptions   = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            afterPicker.Items.Add("---");
            afterPicker.Items.Add("01:00AM");
            afterPicker.Items.Add("02:00AM");
            afterPicker.Items.Add("03:00AM");
            afterPicker.Items.Add("04:00AM");
            afterPicker.Items.Add("05:00AM");
            afterPicker.Items.Add("06:00AM");
            afterPicker.Items.Add("07:00AM");
            afterPicker.Items.Add("08:00AM");
            afterPicker.Items.Add("09:00AM");
            afterPicker.Items.Add("10:00AM");
            afterPicker.Items.Add("11:00AM");
            afterPicker.Items.Add("12:00PM");
            afterPicker.Items.Add("01:00PM");
            afterPicker.Items.Add("02:00PM");
            afterPicker.Items.Add("03:00PM");
            afterPicker.Items.Add("04:00PM");
            afterPicker.Items.Add("05:00PM");
            afterPicker.Items.Add("06:00PM");
            afterPicker.Items.Add("07:00PM");
            afterPicker.Items.Add("08:00PM");
            afterPicker.Items.Add("09:00PM");
            afterPicker.Items.Add("10:00PM");
            afterPicker.Items.Add("11:00PM");

            beforePicker = new Picker
            {
                Title             = "Before",
                VerticalOptions   = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };


            beforePicker.Items.Add("---");
            beforePicker.Items.Add("01:00AM");
            beforePicker.Items.Add("02:00AM");
            beforePicker.Items.Add("03:00AM");
            beforePicker.Items.Add("04:00AM");
            beforePicker.Items.Add("05:00AM");
            beforePicker.Items.Add("06:00AM");
            beforePicker.Items.Add("07:00AM");
            beforePicker.Items.Add("08:00AM");
            beforePicker.Items.Add("09:00AM");
            beforePicker.Items.Add("10:00AM");
            beforePicker.Items.Add("11:00AM");
            beforePicker.Items.Add("12:00PM");
            beforePicker.Items.Add("01:00PM");
            beforePicker.Items.Add("02:00PM");
            beforePicker.Items.Add("03:00PM");
            beforePicker.Items.Add("04:00PM");
            beforePicker.Items.Add("05:00PM");
            beforePicker.Items.Add("06:00PM");
            beforePicker.Items.Add("07:00PM");
            beforePicker.Items.Add("08:00PM");
            beforePicker.Items.Add("09:00PM");
            beforePicker.Items.Add("10:00PM");
            beforePicker.Items.Add("11:00PM");

            sortPicker = new Picker
            {
                Title             = "Sort",
                VerticalOptions   = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            sortPicker.Items.Add("Time");
            sortPicker.Items.Add("Title");
            sortPicker.Items.Add("Ticket");
            sortPicker.Items.Add("Price");

            changeSortButton = new Image {
                Aspect = Aspect.AspectFit
            };
            changeSortButton.Source = ImageSource.FromFile("ic_arrow_downward_black_24dp.png");

            TapGestureRecognizer changeSortTap = new TapGestureRecognizer();

            changeSortTap.Tapped += ChangeSort_Tapped;

            changeSortButton.GestureRecognizers.Add(changeSortTap);

            searchNavSectionTwo.Children.Add(dayPicker, 0, 0);
            searchNavSectionTwo.Children.Add(afterPicker, 1, 0);
            searchNavSectionTwo.Children.Add(beforePicker, 2, 0);
            searchNavSectionTwo.Children.Add(sortPicker, 3, 0);
            searchNavSectionTwo.Children.Add(changeSortButton, 4, 0);

            wholePage.Children.Add(searchNavSectionTwo);

            //START OF LOWER EVENT SECTION
            eventDisplayWrapper = new StackLayout {
                Orientation = StackOrientation.Vertical, Padding = paddingAmount, Spacing = 0, HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand
            };
            eventDisplay = new StackLayout {
                Orientation = StackOrientation.Vertical, Padding = 0, Spacing = 6, HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand
            };

            lastUpdatedEventsLabel = new Label
            {
                Text                    = GlobalVars.eventsLastUpdatedPretty,
                FontSize                = 10,
                FontAttributes          = FontAttributes.Italic,
                HorizontalOptions       = LayoutOptions.FillAndExpand,
                HorizontalTextAlignment = TextAlignment.Center
            };

            eventsTotalCountLabel = new Label
            {
                Text                    = GlobalVars.eventsTotalCountPretty,
                FontSize                = 12,
                FontAttributes          = FontAttributes.Bold,
                HorizontalOptions       = LayoutOptions.FillAndExpand,
                HorizontalTextAlignment = TextAlignment.Center
            };

            var thirdString = new Label
            {
                Text                    = GlobalVars.eventsExplanationPretty,
                FontSize                = 10,
                HorizontalOptions       = LayoutOptions.FillAndExpand,
                HorizontalTextAlignment = TextAlignment.Center
            };

            var showAllButton = new Button
            {
                Text = "SHOW ALL",
                HorizontalOptions = LayoutOptions.Center
            };

            var fourthString = new Label
            {
                Text                    = GlobalVars.eventsFinalInfoPretty,
                FontSize                = 12,
                HorizontalOptions       = LayoutOptions.FillAndExpand,
                HorizontalTextAlignment = TextAlignment.Center
            };

            eventDisplay.Children.Add(lastUpdatedEventsLabel);
            eventDisplay.Children.Add(eventsTotalCountLabel);
            eventDisplay.Children.Add(thirdString);
            eventDisplay.Children.Add(showAllButton);
            eventDisplay.Children.Add(fourthString);

            eventDisplayWrapper.Children.Add(eventDisplay);

            wholePage.Children.Add(eventDisplayWrapper);

            genEventList = new GenEventList
            {
                VerticalOptions = LayoutOptions.FillAndExpand
            };

            genEventListView = new ListView(ListViewCachingStrategy.RecycleElement)
            {
                RowHeight = (int)GlobalVars.sizeListCellHeight,

                SeparatorVisibility = SeparatorVisibility.None
            };

            loadingListView = new ListView
            {
                RowHeight           = (int)GlobalVars.sizeListCellHeight,
                SeparatorVisibility = SeparatorVisibility.None
            };

            loadingIndicator = new ActivityIndicator()
            {
                IsRunning            = true,
                IsVisible            = false,
                VerticalOptions      = LayoutOptions.FillAndExpand,
                HorizontalOptions    = LayoutOptions.FillAndExpand,
                BackgroundColor      = Color.Transparent,
                MinimumWidthRequest  = 400,
                MinimumHeightRequest = 400
            };

            outerContainer.Children.Add(wholePage);
            outerContainer.Children.Add(loadingIndicator);

            AbsoluteLayout.SetLayoutBounds(wholePage, new Rectangle(0, 0, 1, 1));
            AbsoluteLayout.SetLayoutFlags(wholePage, AbsoluteLayoutFlags.All);

            AbsoluteLayout.SetLayoutFlags(loadingIndicator,
                                          AbsoluteLayoutFlags.PositionProportional);
            AbsoluteLayout.SetLayoutBounds(loadingIndicator,
                                           new Rectangle(0.5,
                                                         0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));


            Content = outerContainer;

            this.ToolbarItems.Add(new ToolbarItem("Font Size", "baseline_format_size_black_24.png", () =>
            {
                var page = new DisplayOptionsPage();
                PopupNavigation.Instance.PushAsync(page);
            }));

            this.ToolbarItems.Add(new ToolbarItem("Refresh", "ic_refresh_black_24dp.png", () =>
            {
                GlobalVars.View_GenEventsLoadingView.StartLoad();
            }));


            //Start of hidden event portion RESUME CODING HERE

            showAllButton.Clicked             += OnShowAllClicked;
            dayPicker.SelectedIndexChanged    += OnDayPickerSelected;
            sortPicker.SelectedIndexChanged   += OnSortPickerSelected;
            afterPicker.SelectedIndexChanged  += OnAfterPickerSelected;
            beforePicker.SelectedIndexChanged += OnBeforePickerSelected;

            matchListView.ItemSelected += MatchListView_ItemSelected;
            //genEventListView.ItemTapped += GenEventListView_ItemTapped;

            genEventListView.ItemSelected += GenEventListView_ItemSelected;

            TapGestureRecognizer clearAutoCompleteTap = new TapGestureRecognizer();

            clearAutoCompleteTap.Tapped += ClearAutoCompleteTap_Tapped;

            autoCompleteHolder.GestureRecognizers.Add(clearAutoCompleteTap);

            this.LayoutChanged += GenNavigationPage_LayoutChanged;

            this.OnAppearedHandler     += Event_CheckForUpdates;
            this.CheckForUpdateHandler += Event_CheckForUpdates;

            GlobalVars.View_GenSearchView = this;
        }