root/src/apps/debugger/user_interface/report/ReportUserInterface.h
/*
 * Copyright 2015-2016, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#ifndef REPORT_USER_INTERFACE_H
#define REPORT_USER_INTERFACE_H


#include <ObjectList.h>
#include <String.h>

#include "UserInterface.h"
#include "Team.h"


class ReportUserInterface : public UserInterface,
        private Team::Listener {
public:
                                                                ReportUserInterface(thread_id targetThread,
                                                                        const char* reportPath);
        virtual                                         ~ReportUserInterface();

        virtual const char*                     ID() const;

        virtual status_t                        Init(Team* team,
                                                                        UserInterfaceListener* listener);
        virtual void                            Show();
        virtual void                            Terminate();

        virtual UserInterface*          Clone() const;

        virtual bool                            IsInteractive() const;

        virtual status_t                        LoadSettings(const TeamUiSettings* settings);
        virtual status_t                        SaveSettings(TeamUiSettings*& settings) const;

        virtual void                            NotifyUser(const char* title,
                                                                        const char* message,
                                                                        user_notification_type type);
        virtual void                            NotifyBackgroundWorkStatus(
                                                                        const char* message);
        virtual int32                           SynchronouslyAskUser(const char* title,
                                                                        const char* message, const char* choice1,
                                                                        const char* choice2, const char* choice3);
        virtual status_t                        SynchronouslyAskUserForFile(entry_ref* _ref);

                        void                            Run();

        // Team::Listener
        virtual void                            ThreadAdded(const Team::ThreadEvent& event);
        virtual void                            ThreadStateChanged(
                                                                        const Team::ThreadEvent& event);
        virtual void                            DebugReportChanged(
                                                                        const Team::DebugReportEvent& event);

private:
                        ::Team*                         fTeam;
                        UserInterfaceListener* fListener;
                        thread_id                       fTargetThread;
                        const char*                     fReportPath;
                        sem_id                          fShowSemaphore;
                        sem_id                          fReportSemaphore;
                        bool                            fShown;
        volatile bool                           fTerminating;
};


#endif  // REPORT_USER_INTERFACE_H