d57d9ffaf7
The wxGTK implementation uses wx{File,Dir}Button, which derives from wxButton, but is not a GtkButton, so many operations which try to modify it, such as changing it's style, are likely to result in errors. See #17984
197 lines
7.3 KiB
C++
197 lines
7.3 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/gtk/filedirpicker.h
|
|
// Purpose: wxFileButton, wxDirButton header
|
|
// Author: Francesco Montorsi
|
|
// Modified by:
|
|
// Created: 14/4/2006
|
|
// Copyright: (c) Francesco Montorsi
|
|
// Licence: wxWindows Licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_GTK_FILEPICKER_H_
|
|
#define _WX_GTK_FILEPICKER_H_
|
|
|
|
// since GtkColorButton is available only for GTK+ >= 2.4,
|
|
// we need to use generic versions if we detect (at runtime)
|
|
// that GTK+ < 2.4
|
|
#include "wx/generic/filepickerg.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxFileButton and wxDirButton shared code
|
|
// (cannot be a base class since they need to derive from wxGenericFileButton
|
|
// and from wxGenericDirButton classes !)
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#define FILEDIRBTN_OVERRIDES \
|
|
/* NULL is because of a problem with destruction order which happens */ \
|
|
/* if we pass GetParent(): in fact, this GTK native implementation */ \
|
|
/* needs to create the dialog in ::Create() and not for each user */ \
|
|
/* request in response to the user click as the generic implementation */ \
|
|
/* does. */ \
|
|
virtual wxWindow *GetDialogParent() wxOVERRIDE \
|
|
{ \
|
|
return NULL; \
|
|
} \
|
|
\
|
|
/* even if wx derive from wxGenericFileButton, i.e. from wxButton, our */ \
|
|
/* native GTK+ widget does not derive from GtkButton thus *all* uses */ \
|
|
/* GTK_BUTTON(m_widget) macro done by wxButton must be bypassed to */ \
|
|
/* avoid bunch of GTK+ warnings like: */ \
|
|
/* invalid cast from `GtkFileChooserButton' to `GtkButton' */ \
|
|
/* so, override wxButton::GTKGetWindow and return NULL as GTK+ doesn't */ \
|
|
/* give us access to the internal GdkWindow of a GtkFileChooserButton */ \
|
|
protected: \
|
|
virtual GdkWindow * \
|
|
GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const wxOVERRIDE \
|
|
{ return NULL; }
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxFileButton
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class WXDLLIMPEXP_CORE wxFileButton : public wxGenericFileButton
|
|
{
|
|
public:
|
|
wxFileButton() { Init(); }
|
|
wxFileButton(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& label = wxFilePickerWidgetLabel,
|
|
const wxString &path = wxEmptyString,
|
|
const wxString &message = wxFileSelectorPromptStr,
|
|
const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxFILEBTN_DEFAULT_STYLE,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxFilePickerWidgetNameStr)
|
|
{
|
|
Init();
|
|
m_pickerStyle = style;
|
|
Create(parent, id, label, path, message, wildcard,
|
|
pos, size, style, validator, name);
|
|
}
|
|
|
|
virtual ~wxFileButton();
|
|
|
|
|
|
public: // overrides
|
|
|
|
bool Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& label = wxFilePickerWidgetLabel,
|
|
const wxString &path = wxEmptyString,
|
|
const wxString &message = wxFileSelectorPromptStr,
|
|
const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = 0,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxFilePickerWidgetNameStr);
|
|
|
|
// event handler for the click
|
|
void OnDialogOK(wxCommandEvent &);
|
|
|
|
virtual void SetPath(const wxString &str) wxOVERRIDE;
|
|
virtual void SetInitialDirectory(const wxString& dir) wxOVERRIDE;
|
|
|
|
// see macro defined above
|
|
FILEDIRBTN_OVERRIDES
|
|
|
|
protected:
|
|
wxDialog *m_dialog;
|
|
|
|
virtual void DoApplyWidgetStyle(GtkRcStyle*) wxOVERRIDE;
|
|
|
|
private:
|
|
// common part of all ctors
|
|
void Init() { m_dialog = NULL; }
|
|
|
|
wxDECLARE_DYNAMIC_CLASS(wxFileButton);
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxDirButton
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class WXDLLIMPEXP_CORE wxDirButton : public wxGenericDirButton
|
|
{
|
|
public:
|
|
wxDirButton() { Init(); }
|
|
wxDirButton(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& label = wxFilePickerWidgetLabel,
|
|
const wxString &path = wxEmptyString,
|
|
const wxString &message = wxFileSelectorPromptStr,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxDIRBTN_DEFAULT_STYLE,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxFilePickerWidgetNameStr)
|
|
{
|
|
Init();
|
|
|
|
m_pickerStyle = style;
|
|
|
|
Create(parent, id, label, path, message, wxEmptyString,
|
|
pos, size, style, validator, name);
|
|
}
|
|
|
|
virtual ~wxDirButton();
|
|
|
|
|
|
public: // overrides
|
|
|
|
bool Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& label = wxFilePickerWidgetLabel,
|
|
const wxString &path = wxEmptyString,
|
|
const wxString &message = wxFileSelectorPromptStr,
|
|
const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = 0,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxFilePickerWidgetNameStr);
|
|
|
|
|
|
// GtkFileChooserButton does not support GTK_FILE_CHOOSER_CREATE_FOLDER
|
|
// thus we must ensure that the wxDD_DIR_MUST_EXIST style was given
|
|
long GetDialogStyle() const wxOVERRIDE
|
|
{
|
|
return (wxGenericDirButton::GetDialogStyle() | wxDD_DIR_MUST_EXIST);
|
|
}
|
|
|
|
virtual void SetPath(const wxString &str) wxOVERRIDE;
|
|
virtual void SetInitialDirectory(const wxString& dir) wxOVERRIDE;
|
|
|
|
// see macro defined above
|
|
FILEDIRBTN_OVERRIDES
|
|
|
|
protected:
|
|
wxDialog *m_dialog;
|
|
|
|
virtual void DoApplyWidgetStyle(GtkRcStyle*) wxOVERRIDE;
|
|
|
|
public: // used by the GTK callback only
|
|
|
|
bool m_bIgnoreNextChange;
|
|
|
|
void GTKUpdatePath(const char *gtkpath);
|
|
|
|
private:
|
|
void Init()
|
|
{
|
|
m_dialog = NULL;
|
|
m_bIgnoreNextChange = false;
|
|
}
|
|
|
|
wxDECLARE_DYNAMIC_CLASS(wxDirButton);
|
|
};
|
|
|
|
#undef FILEDIRBTN_OVERRIDES
|
|
|
|
#endif // _WX_GTK_FILEPICKER_H_
|
|
|