root/src/preferences/time/NetworkTimeView.h
/*
 * Copyright 2011-2014 Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Axel Dörfler, axeld@pinc-software.de
 *              Hamish Morrison, hamish@lavabit.com
 *              John Scipione, jscipione@gmail.com
 */
#ifndef NETWORK_TIME_VIEW_H
#define NETWORK_TIME_VIEW_H


#include <LayoutBuilder.h>


class BButton;
class BCheckBox;
class BListView;
class BMessage;
class BMessenger;
class BPath;
class BTextControl;


static const uint32 kMsgNetworkTimeSettings = 'ntst';
static const uint32 kMsgSetDefaultServer = 'setd';
static const uint32 kMsgServerEdited = 'sved';
static const uint32 kMsgAddServer = 'asrv';
static const uint32 kMsgRemoveServer = 'rsrv';
static const uint32 kMsgResetServerList = 'rstl';
static const uint32 kMsgTryAllServers = 'tras';
static const uint32 kMsgSynchronizeAtBoot = 'synb';
static const uint32 kMsgSynchronize = 'sync';
static const uint32 kMsgStopSynchronization = 'stps';
static const uint32 kMsgSynchronizationResult = 'syrs';
static const uint32 kMsgNetworkTimeChange = 'ntch';


class Settings {
public:
                                                        Settings();
                                                        ~Settings();

                        void                    AddServer(const char* server);
                        const char*             GetServer(int32 index) const;
                        void                    RemoveServer(const char* server);
                        void                    SetDefaultServer(int32 index);
                        int32                   GetDefaultServer() const;
                        void                    SetTryAllServers(bool boolean);
                        bool                    GetTryAllServers() const;
                        void                    SetSynchronizeAtBoot(bool boolean);
                        bool                    GetSynchronizeAtBoot() const;

                        void                    ResetServersToDefaults();
                        void                    ResetToDefaults();
                        void                    Revert();
                        bool                    SettingsChanged();
                        
                        status_t                Load();
                        status_t                Save();

private:
                        int32                   _GetStringByValue(const char* name,
                                                                const char* value);
                        status_t                _GetPath(BPath& path);

                        BMessage                fMessage;
                        BMessage                fOldMessage;
                        bool                    fWasUpdated;
};


class NetworkTimeView : public BGroupView {
public:
                                                        NetworkTimeView(const char* name);
        virtual                                 ~NetworkTimeView();

        virtual void                    MessageReceived(BMessage* message);
        virtual void                    AttachedToWindow();

                        bool                    CheckCanRevert();
private:
                        void                    _InitView();
                        void                    _UpdateServerList();
                        void                    _DoneSynchronizing();
                        bool                    _IsValidServerName(const char* serverName);

                        Settings                fSettings;

                        BTextControl*   fServerTextControl;
                        BButton*                fAddButton;
                        BButton*                fRemoveButton;
                        BButton*                fResetButton;

                        BListView*              fServerListView;
                        BCheckBox*              fTryAllServersCheckBox;
                        BCheckBox*              fSynchronizeAtBootCheckBox;
                        BButton*                fSynchronizeButton;

                        rgb_color               fTextColor;
                        rgb_color               fInvalidColor;

                        thread_id               fUpdateThread;
};


int32
update_thread(void* params);

status_t
update_time(const Settings& settings, BMessenger* messenger,
        thread_id* thread);

status_t
update_time(const Settings& settings, const char** errorString,
        int32* errorCode);


#endif  // NETWORK_TIME_VIEW_H