protected override void SetupApplication()
        {
            RenderSplashScreen();

            app.SetupMiningEngineEvents();
            app.LoadPreviousHistory();

            app.DataModified += (object sender, EventArgs e) =>
            {
                ScreenDirty = true;
            };

            app.ConfigurationModified += (object sender, EventArgs e) =>
            {
                ScreenDirty = true;
            };

            app.ProgressStarted += (object sender, ProgressEventArgs e) =>
            {
                currentProgress = e.Text;
                RenderScreen();
            };

            app.ProgressCompleted += (object sender, EventArgs e) =>
            {
                currentProgress = String.Empty;
                RenderScreen();
            };

            app.NotificationReceived += (object sender, NotificationEventArgs e) =>
            {
                notifications.Add(e);
                ScreenDirty = true;
            };

            app.NotificationDismissed += (object sender, NotificationEventArgs e) =>
            {
                notifications.RemoveAll(n => !String.IsNullOrEmpty(n.Id) && n.Id.Equals(e.Id));
                ScreenDirty = true;
            };

            app.PromptReceived += (object sender, PromptEventArgs e) =>
            {
                currentPrompt = e;
                promptTime = DateTime.Now;
                RenderScreen();
            };

            app.CredentialsRequested += (object sender, CredentialsEventArgs e) =>
            {
                e.CredentialsProvided = false;
                credentialsPhase = CredentialsPhase.Username;
                credentialsTarget = app.LocalViewModel.GetNetworkDeviceByFriendlyName(e.ProtectedResource);
                RenderScreen();
            };

            app.Context = threadContext;

            mineOnStartTimer.Elapsed += (object sender, ElapsedEventArgs e) =>
            {
                if (app.StartupMiningCountdownSeconds > 0)
                    currentProgress = string.Format("Mining will start automatically in {0} seconds...", app.StartupMiningCountdownSeconds);
                else
                {
                    currentProgress = String.Empty;
                    mineOnStartTimer.Enabled = false;
                }
                RenderScreen();
            };

            RegisterCommands();
            RegisterScreens();
            RegisterSettings();
        }
 private PromptResult MessageBoxShow(string text, string caption, PromptButtons buttons, PromptIcon icon)
 {
     PromptEventArgs e = new PromptEventArgs
     {
         Caption = caption,
         Text = text,
         Buttons = buttons,
         Icon = icon
     };
     PromptReceived(this, e);
     return e.Result;
 }
        private void OutputSpecial()
        {
            if (credentialsPhase != CredentialsPhase.None)
            {
                OutputCredentialsPrompt();
                return; //early exit, prompt rendered
            }

            if (currentPrompt != null)
            {
                if ((DateTime.Now - promptTime).TotalSeconds > 30)
                    currentPrompt = null;
                else
                {
                    OutputCurrentPrompt();
                    return; //early exit, prompt rendered
                }
            }

            OutputCurrentProgress();
        }