예제 #1
0
        public bool OpenScreen(string screenName, String controllerName
                               , Dictionary <string, object> parameters = null
                               , bool isBackCommand = false
                               , bool isRefresh     = false)
        {
            try
            {
                ControlsContext.Current.ActionHandlerLocker.Acquire();

                LogManager.Logger.ScreenOpening(screenName, controllerName, parameters);

                _baseActivity.ClearNavigationEvents();

                DateTime startLoading = DateTime.Now;

                ValueStack = ValueStackContext.Current.CreateValueStack(BitBrowserApp.Current.ExceptionHandler);
                ValueStack.Push("common", _commonData);
                ValueStack.Push("context", this);
                ValueStack.Push("dao", Dal.Dao);
                ValueStack.Push("activity", _baseActivity);
                ValueStack.Push("isTablet", IsTablet());

                foreach (var variable in GlobalVariables)
                {
                    ValueStack.Push(variable.Key, variable.Value);
                }

                if (parameters != null)
                {
                    foreach (KeyValuePair <String, object> item in parameters)
                    {
                        ValueStack.Push(item.Key, item.Value);
                    }
                }

                var controller = BusinessProcessContext.Current.CreateScreenController(controllerName);
                ValueStack.SetCurrentController(controller);
                ValueStack.Push("controller", controller);
                screenName = controller.GetView(screenName);

                var imageCashe = new ImageCache(this);
                var scr        = (Screen)BusinessProcessContext.Current.CreateScreenFactory()
                                 .CreateScreen(screenName, ValueStack, controller, imageCashe);
                var currentScreen = ControlsContext.Current.CreateScreenData(screenName, controllerName, scr);

                FlipScreen(scr.View, isBackCommand, isRefresh);

                if (Settings.DevelopModeEnabled)
                {
                    Runtime runtime         = Runtime.GetRuntime();
                    long    usedMemInMb     = (runtime.TotalMemory() - runtime.FreeMemory()) / 1048576L;
                    long    maxHeapSizeInMb = runtime.MaxMemory() / 1048576L;
                    string  memory          = string.Format("{0}/{1}", usedMemInMb, maxHeapSizeInMb);

                    string message = string.Format("{0}\n{1}\n{2}"
                                                   , screenName
                                                   , (DateTime.Now - startLoading).ToString("ss\\.ff")
                                                   , memory);
                    Toast.MakeText(_baseActivity, message, ToastLength.Short).Show();
                }

                ThreadPool.QueueUserWorkItem(Finish, new object[] { CurrentScreen, _currentImageCache });

                CurrentScreen      = currentScreen;
                _currentImageCache = imageCashe;

                return(true);
            }
            catch (Exception e)
            {
                HandleException(e);

                return(false);
            }
        }
예제 #2
0
        public bool OpenScreen(String screenName
                               , string controllerName, Dictionary <String
                                                                    , object> parameters = null
                               , bool isBackCommand = false
                               , bool isRefresh     = false)
        {
            IDisposable rootControl = null;

            try
            {
                Busy = true;

                LogManager.Logger.ScreenOpening(screenName, controllerName, parameters);

                _back    = null;
                _forward = null;

                ValueStack = ValueStackContext.Current.CreateValueStack(_exceptionHandler);
                ValueStack.Push("common", CommonData);
                ValueStack.Push("context", this);
                ValueStack.Push("dao", Dal.Dao);
                ValueStack.Push("isTablet", UIDevice.CurrentDevice.Model.Contains("iPad"));

                foreach (var variable in GlobalVariables)
                {
                    ValueStack.Push(variable.Key, variable.Value);
                }

                if (parameters != null)
                {
                    foreach (var item in parameters)
                    {
                        ValueStack.Push(item.Key, item.Value);
                    }
                }

                IScreenController newController = BusinessProcessContext.Current.CreateScreenController(controllerName);
                ValueStack.SetCurrentController(newController);
                ValueStack.Push("controller", newController);
                screenName = newController.GetView(screenName);

                TabOrderManager.Create(this);

                var scr =
                    (Screen)
                    BusinessProcessContext.Current.CreateScreenFactory()
                    .CreateScreen(screenName, ValueStack, newController, null);

                rootControl   = RootControl;
                CurrentScreen = ControlsContext.Current.CreateScreenData(screenName, controllerName, scr);

                var viewController = new ScreenController(scr.View);

                if (!isRefresh)
                {
                    _controller.SetViewControllers(new[]
                    {
                        _controller.TopViewController
                    }, false);

                    if (!isBackCommand)
                    {
                        _controller.PushViewController(viewController, true);
                    }
                    else
                    {
                        _controller.SetViewControllers(new[]
                        {
                            viewController,
                            _controller.TopViewController
                        }, false);
                        _controller.PopViewControllerAnimated(true);
                    }
                }
                else
                {
                    _controller.PopViewControllerAnimated(false);
                    _controller.PushViewController(viewController, false);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                LogManager.Logger.ScreenOpened();

                if (rootControl != null)
                {
                    rootControl.Dispose();
                }

                GC.Collect();

                ControlsContext.Current.ActionHandlerLocker.Release();
                Busy = false;
            }
            return(true);
        }