/////////////////////////////////////////////////////////////////////////////
// Name:        wx/dirdlg.h
// Purpose:     wxDirDialog base class
// Author:      Robert Roebling
// Created:
// Copyright:   (c) Robert Roebling
// Licence:     wxWindows Licence
/////////////////////////////////////////////////////////////////////////////

#ifndef _WX_DIRDLG_H_BASE_
#define _WX_DIRDLG_H_BASE_

#include "wx/defs.h"

#if wxUSE_DIRDLG

#include "wx/dialog.h"

// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------

extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogNameStr[];
extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogDefaultFolderStr[];
extern WXDLLIMPEXP_DATA_CORE(const char) wxDirSelectorPromptStr[];


/*
    The flags below must coexist with the following flags in m_windowStyle
    #define wxCAPTION               0x20000000
    #define wxMAXIMIZE              0x00002000
    #define wxCLOSE_BOX             0x00001000
    #define wxSYSTEM_MENU           0x00000800
    wxBORDER_NONE   =               0x00200000
    #define wxRESIZE_BORDER         0x00000040
    #define wxDIALOG_NO_PARENT      0x00000020
*/

#define wxDD_CHANGE_DIR         0x0100
#define wxDD_DIR_MUST_EXIST     0x0200
#define wxDD_MULTIPLE           0x0400
#define wxDD_SHOW_HIDDEN        0x0001

// deprecated, on by default now, use wxDD_DIR_MUST_EXIST to disable it
#define wxDD_NEW_DIR_BUTTON     0

#define wxDD_DEFAULT_STYLE      (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)

//-------------------------------------------------------------------------
// wxDirDialogBase
//-------------------------------------------------------------------------

class WXDLLIMPEXP_CORE wxDirDialogBase : public wxDialog
{
public:
    wxDirDialogBase() = default;
    wxDirDialogBase(wxWindow *parent,
                    const wxString& title = wxASCII_STR(wxDirSelectorPromptStr),
                    const wxString& defaultPath = wxEmptyString,
                    long style = wxDD_DEFAULT_STYLE,
                    const wxPoint& pos = wxDefaultPosition,
                    const wxSize& sz = wxDefaultSize,
                    const wxString& name = wxASCII_STR(wxDirDialogNameStr))
    {
        Create(parent, title, defaultPath, style, pos, sz, name);
    }

    virtual ~wxDirDialogBase() = default;


    bool Create(wxWindow *parent,
                const wxString& title = wxASCII_STR(wxDirSelectorPromptStr),
                const wxString& defaultPath = wxEmptyString,
                long style = wxDD_DEFAULT_STYLE,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& sz = wxDefaultSize,
                const wxString& name = wxASCII_STR(wxDirDialogNameStr))
    {
        if (!wxDialog::Create(parent, wxID_ANY, title, pos, sz, style, name))
            return false;
        m_path = defaultPath;
        m_message = title;
        return true;
    }

    virtual void SetMessage(const wxString& message) { m_message = message; }
    virtual void SetPath(const wxString& path) { m_path = path; }

    virtual wxString GetMessage() const { return m_message; }
    virtual wxString GetPath() const
    {
        wxCHECK_MSG( !HasFlag(wxDD_MULTIPLE), wxString(),
                     "When using wxDD_MULTIPLE, must call GetPaths() instead" );
        return m_path;
    }

    virtual void GetPaths(wxArrayString& paths) const
    {
        paths = m_paths;
    }

protected:
    wxString m_message;
    wxString m_path;
    wxArrayString m_paths;
};


// Universal and non-port related switches with need for generic implementation
#if defined(__WXUNIVERSAL__)
    #include "wx/generic/dirdlgg.h"
    #define wxDirDialog wxGenericDirDialog
#elif defined(__WXMSW__) && !wxUSE_OLE
    #include "wx/generic/dirdlgg.h"
    #define wxDirDialog wxGenericDirDialog
#elif defined(__WXMSW__) || (defined(__WXQT__) && defined(__WINDOWS__))
    #include "wx/msw/dirdlg.h"  // Native MSW or Qt under MSW
#elif defined(__WXGTK__)
    #include "wx/gtk/dirdlg.h"  // Native GTK for gtk2.4
#elif defined(__WXMAC__)
    #include "wx/osx/dirdlg.h"      // Native Mac
#elif defined(__WXX11__)
    #include "wx/generic/dirdlgg.h"     // Other ports use generic implementation
    #define wxDirDialog wxGenericDirDialog
#elif defined(__WXQT__)
    #include "wx/qt/dirdlg.h"
#endif

// ----------------------------------------------------------------------------
// common ::wxDirSelector() function
// ----------------------------------------------------------------------------

WXDLLIMPEXP_CORE wxString
wxDirSelector(const wxString& message = wxASCII_STR(wxDirSelectorPromptStr),
              const wxString& defaultPath = wxEmptyString,
              long style = wxDD_DEFAULT_STYLE,
              const wxPoint& pos = wxDefaultPosition,
              wxWindow *parent = nullptr);

#endif // wxUSE_DIRDLG

#endif
    // _WX_DIRDLG_H_BASE_
