KiCad PCB EDA Suite
dialog_shim.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
5  * Copyright (C) 2012-2019 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #ifndef DIALOG_SHIM_
26 #define DIALOG_SHIM_
27 
28 #include <wx/dialog.h>
29 #include <kiway_player.h>
30 class wxGridEvent;
31 
32 
33 
35 {
36  WINDOW_THAWER( wxWindow* aWindow )
37  {
38  m_window = aWindow;
39  m_freezeCount = 0;
40 
41  while( m_window->IsFrozen() )
42  {
43  m_window->Thaw();
44  m_freezeCount++;
45  }
46  }
47 
49  {
50  while( m_freezeCount > 0 )
51  {
52  m_window->Freeze();
53  m_freezeCount--;
54  }
55  }
56 
57 protected:
58  wxWindow* m_window;
60 };
61 
62 
63 class WDO_ENABLE_DISABLE;
64 class WX_EVENT_LOOP;
65 
66 // These macros are for DIALOG_SHIM only, NOT for KIWAY_PLAYER. KIWAY_PLAYER
67 // has its own support for quasi modal and its platform specific issues are different
68 // than for a wxDialog.
69  #define SHOWQUASIMODAL ShowQuasiModal
70  #define ENDQUASIMODAL EndQuasiModal
71 
82 class DIALOG_SHIM : public wxDialog, public KIWAY_HOLDER
83 {
84 public:
85  DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& title,
86  const wxPoint& pos = wxDefaultPosition,
87  const wxSize& size = wxDefaultSize,
88  long style = wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER,
89  const wxString& name = wxDialogNameStr );
90 
91  ~DIALOG_SHIM();
92 
97  void SetInitialFocus( wxWindow* aWindow )
98  {
99  m_initialFocusTarget = aWindow;
100  }
101 
102  int ShowQuasiModal(); // disable only the parent window, otherwise modal.
103 
104  void EndQuasiModal( int retCode ); // End quasi-modal mode
105 
106  bool IsQuasiModal() const { return m_qmodal_showing; }
107 
108  bool Show( bool show ) override;
109 
110  bool Enable( bool enable ) override;
111 
112  void OnPaint( wxPaintEvent &event );
113 
117  void SetPosition( const wxPoint& aNewPosition );
118 
120  {
121  return m_units;
122  }
123 
124  static bool IsCtrl( int aChar, const wxKeyEvent& e )
125  {
126  return e.GetKeyCode() == aChar && e.ControlDown() && !e.AltDown() &&
127  !e.ShiftDown() && !e.MetaDown();
128  }
129 
130  static bool IsShiftCtrl( int aChar, const wxKeyEvent& e )
131  {
132  return e.GetKeyCode() == aChar && e.ControlDown() && !e.AltDown() &&
133  e.ShiftDown() && !e.MetaDown();
134  }
135 
136 protected:
147  void finishDialogSettings();
148 
154  void setSizeInDU( int x, int y );
155 
160  int horizPixelsFromDU( int x ) const;
161 
166  int vertPixelsFromDU( int y ) const;
167 
175  void resetSize();
176 
177  virtual void OnCharHook( wxKeyEvent& aEvt );
178 
179 private:
184  void OnCloseWindow( wxCloseEvent& aEvent );
185 
190  void OnButton( wxCommandEvent& aEvent );
191 
192  void OnGridEditorShown( wxGridEvent& event );
193  void OnGridEditorHidden( wxGridEvent& event );
194 
196 
197 protected:
198  EDA_UNITS m_units; // userUnits for display and parsing
199  std::string m_hash_key; // alternate for class_map when classname re-used
200 
201  // The following disables the storing of a user size. It is used primarily for dialogs
202  // with conditional content which don't need user sizing.
204 
205  // On MacOS (at least) SetFocus() calls made in the constructor will fail because a
206  // window that isn't yet visible will return false to AcceptsFocus(). So we must delay
207  // the initial-focus SetFocus() call to the first paint event.
210 
211  WX_EVENT_LOOP* m_qmodal_loop; // points to nested event_loop, NULL means not qmodal
212  // and dismissed
215 
217 
218  std::vector<wxWindow*> m_tabOrder;
219 
220  // The size asked by the caller, used the first time the dialog is created
222 };
223 
224 #endif // DIALOG_SHIM_
bool m_qmodal_showing
Definition: dialog_shim.h:213
A mix in class which holds the location of a wxWindow's KIWAY.
Definition: kiway_holder.h:36
void setSizeInDU(int x, int y)
Set the dialog to the given dimensions in "dialog units".
#define WX_EVENT_LOOP
Definition: kiway_player.h:41
void OnButton(wxCommandEvent &aEvent)
Properly handle the default button events when in the quasimodal mode when not calling EndQuasiModal ...
std::string m_hash_key
Definition: dialog_shim.h:199
std::vector< wxWindow * > m_tabOrder
Definition: dialog_shim.h:218
bool IsQuasiModal() const
Definition: dialog_shim.h:106
wxWindow * m_initialFocusTarget
Definition: dialog_shim.h:209
int horizPixelsFromDU(int x) const
Convert an integer number of dialog units to pixels, horizontally.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
Definition: dialog_shim.h:82
void OnGridEditorShown(wxGridEvent &event)
void OnGridEditorHidden(wxGridEvent &event)
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:97
DIALOG_SHIM(wxWindow *aParent, wxWindowID id, const wxString &title, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER, const wxString &name=wxDialogNameStr)
Definition: dialog_shim.cpp:77
EDA_UNITS GetUserUnits() const
Definition: dialog_shim.h:119
bool m_firstPaintEvent
Definition: dialog_shim.h:208
WX_EVENT_LOOP * m_qmodal_loop
Definition: dialog_shim.h:211
void OnCloseWindow(wxCloseEvent &aEvent)
Properly handle the wxCloseEvent when in the quasimodal mode when not calling EndQuasiModal which is ...
WINDOW_THAWER(wxWindow *aWindow)
Definition: dialog_shim.h:36
void SetPosition(const wxPoint &aNewPosition)
Force the position of the dialog to a new position.
EDA_BASE_FRAME * m_parentFrame
Definition: dialog_shim.h:216
int ShowQuasiModal()
void OnPaint(wxPaintEvent &event)
wxWindow * m_window
Definition: dialog_shim.h:58
bool Show(bool show) override
EDA_UNITS
Definition: eda_units.h:38
EDA_UNITS m_units
Definition: dialog_shim.h:198
WDO_ENABLE_DISABLE * m_qmodal_parent_disabler
Definition: dialog_shim.h:214
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual void OnCharHook(wxKeyEvent &aEvt)
void EndQuasiModal(int retCode)
const char * name
Definition: DXF_plotter.cpp:56
static bool IsShiftCtrl(int aChar, const wxKeyEvent &e)
Definition: dialog_shim.h:130
The base frame for deriving all KiCad main window classes.
Toggle a window's "enable" status to disabled, then enabled on destruction.
Definition: dialog_shim.cpp:44
void resetSize()
Clear the existing dialog size and position.
int vertPixelsFromDU(int y) const
Convert an integer number of dialog units to pixels, vertically.
bool Enable(bool enable) override
static bool IsCtrl(int aChar, const wxKeyEvent &e)
Definition: dialog_shim.h:124
bool m_useCalculatedSize
Definition: dialog_shim.h:203
wxSize m_initialSize
Definition: dialog_shim.h:221