]> git.saurik.com Git - wxWidgets.git/blob - contrib/samples/ogl/studio/mainfrm.cpp
Document wxTextCtrl::XYToPosition, PositionToXY and GetLineLength change
[wxWidgets.git] / contrib / samples / ogl / studio / mainfrm.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: mainfrm.cpp
3 // Purpose: Studio main frame
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 27/7/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence:
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #include "wx/mdi.h"
22 #endif
23
24 #include "wx/laywin.h"
25
26 #include "studio.h"
27 #include "view.h"
28 #include "doc.h"
29 #include "cspalette.h"
30 #include "mainfrm.h"
31 #include "dialogs.h"
32
33 BEGIN_EVENT_TABLE(csFrame, wxDocMDIParentFrame)
34 EVT_MENU(ID_CS_ABOUT, csFrame::OnAbout)
35 EVT_MENU(wxID_EXIT, csFrame::OnQuit)
36 EVT_MENU(wxID_HELP, csFrame::OnHelp)
37 EVT_MENU(ID_CS_SETTINGS, csFrame::OnSettings)
38 EVT_SIZE(csFrame::OnSize)
39 EVT_SASH_DRAGGED(ID_LAYOUT_WINDOW_PALETTE, csFrame::OnSashDragPaletteWindow)
40 EVT_SASH_DRAGGED(ID_LAYOUT_WINDOW_PROJECT, csFrame::OnSashDragProjectWindow)
41 EVT_IDLE(csFrame::OnIdle)
42 EVT_UPDATE_UI(wxID_PRINT, csFrame::OnUpdateDisable)
43 EVT_UPDATE_UI(wxID_PREVIEW, csFrame::OnUpdateDisable)
44 EVT_UPDATE_UI(wxID_SAVE, csFrame::OnSaveUpdate)
45 EVT_UPDATE_UI(wxID_SAVEAS, csFrame::OnSaveUpdate)
46 EVT_UPDATE_UI(wxID_UNDO, csFrame::OnUpdateDisable)
47 EVT_UPDATE_UI(wxID_REDO, csFrame::OnUpdateDisable)
48 EVT_UPDATE_UI(wxID_CUT, csFrame::OnUpdateDisable)
49 EVT_UPDATE_UI(wxID_COPY, csFrame::OnUpdateDisable)
50 EVT_UPDATE_UI(wxID_PASTE, csFrame::OnUpdateDisable)
51 EVT_CLOSE(csFrame::OnCloseWindow)
52 END_EVENT_TABLE()
53
54 // Define my frame constructor
55 csFrame::csFrame(wxDocManager* manager, wxFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
56 wxDocMDIParentFrame(manager, parent, id, title, pos, size, style, _T("frame"))
57 {
58 CreateToolBar(wxNO_BORDER|wxTB_FLAT|wxTB_HORIZONTAL);
59 wxGetApp().InitToolBar(GetToolBar());
60
61 // Accelerators
62 wxAcceleratorEntry entries[4];
63
64 entries[0].Set(wxACCEL_NORMAL, WXK_F1, wxID_HELP);
65 entries[1].Set(wxACCEL_CTRL, 'O', wxID_OPEN);
66 entries[2].Set(wxACCEL_CTRL, 'N', wxID_NEW);
67 entries[3].Set(wxACCEL_CTRL, 'P', wxID_PRINT);
68
69 wxAcceleratorTable accel(4, entries);
70 SetAcceleratorTable(accel);
71 }
72
73 void csFrame::OnHelp(wxCommandEvent& WXUNUSED(event))
74 {
75 wxHelpControllerBase* help;
76 help = wxGetApp().GetHelpController();
77 if (help)
78 help->DisplayContents();
79 }
80
81 void csFrame::OnSettings(wxCommandEvent& WXUNUSED(event))
82 {
83 #if wxUSE_WX_RESOURCES
84 csSettingsDialog* dialog = new csSettingsDialog(this);
85 /* int ret = */ dialog->ShowModal();
86 dialog->Destroy();
87 #endif // wxUSE_WX_RESOURCES
88 }
89
90 void csFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
91 {
92 Close(true);
93 }
94
95 void csFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
96 {
97 (void)wxMessageBox(_T("OGL Studio\n(c) 1999, Julian Smart"), _T("About OGL Studio"), wxICON_INFORMATION);
98 }
99
100 void csFrame::OnSashDragPaletteWindow(wxSashEvent& event)
101 {
102 if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
103 return;
104
105 switch (event.GetId())
106 {
107 case ID_LAYOUT_WINDOW_PALETTE:
108 {
109 wxGetApp().GetDiagramPaletteSashWindow()->SetDefaultSize(wxSize(10000, event.GetDragRect().height));
110 break;
111 }
112 }
113 wxLayoutAlgorithm layout;
114 layout.LayoutMDIFrame(this);
115 }
116
117 void csFrame::OnSashDragProjectWindow(wxSashEvent& event)
118 {
119 if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
120 return;
121
122 switch (event.GetId())
123 {
124 case ID_LAYOUT_WINDOW_PROJECT:
125 {
126 wxGetApp().GetProjectSashWindow()->SetDefaultSize(wxSize(event.GetDragRect().width, 10000));
127 break;
128 }
129 }
130 wxLayoutAlgorithm layout;
131 layout.LayoutMDIFrame(this);
132 }
133
134 // Define the behaviour for the frame closing
135 // - must delete all frames except for the main one.
136 void csFrame::OnCloseWindow(wxCloseEvent& event)
137 {
138 int x, y;
139 GetPosition(& x, & y);
140 wxGetApp().m_mainFramePos = wxPoint(x, y);
141
142 GetSize(& x, & y);
143 wxGetApp().m_mainFrameSize = wxSize(x, y);
144
145 wxDocMDIParentFrame::OnCloseWindow(event);
146 }
147
148 void csFrame::OnSize(wxSizeEvent& event)
149 {
150 wxLayoutAlgorithm layout;
151 layout.LayoutMDIFrame(this);
152 event.Skip();
153 }
154
155 // Make sure the correct toolbars are showing for the active view
156 void csFrame::OnIdle(wxIdleEvent& event)
157 {
158 wxSashLayoutWindow* paletteWin = wxGetApp().GetDiagramPaletteSashWindow();
159 wxSashLayoutWindow* diagramToolBarWin = wxGetApp().GetDiagramToolBarSashWindow();
160 if (!paletteWin || !diagramToolBarWin)
161 return;
162 bool doLayout = false;
163 if (GetActiveChild())
164 {
165 if (!paletteWin->IsShown() || !diagramToolBarWin->IsShown())
166 {
167 paletteWin->Show(true);
168 diagramToolBarWin->Show(true);
169
170 doLayout = true;
171 }
172 }
173 else
174 {
175 if (paletteWin->IsShown() || diagramToolBarWin->IsShown())
176 {
177 paletteWin->Show(false);
178 diagramToolBarWin->Show(false);
179 doLayout = true;
180 }
181 }
182 if (doLayout)
183 {
184 wxLayoutAlgorithm layout;
185 layout.LayoutMDIFrame(this);
186
187 #if defined(__WXMSW__) && defined(__WIN95__)
188 // Need to do something else to get it to refresh properly
189 // when a client frame is first displayed; moving the client
190 // window doesn't cause the proper refresh. Just refreshing the
191 // client doesn't work (presumably because it's clipping the
192 // children).
193 // FIXED in wxWidgets, by intercepting wxMDIClientWindow::DoSetSize
194 // and checking if the position has changed, before redrawing the
195 // child windows.
196 #if 0
197 wxMDIChildFrame* childFrame = GetActiveChild();
198 if (childFrame)
199 {
200 HWND hWnd = (HWND) childFrame->GetHWND();
201 ::RedrawWindow(hWnd, NULL, NULL, RDW_FRAME|RDW_ALLCHILDREN|RDW_INVALIDATE );
202
203 }
204 #endif
205 #endif
206 }
207 event.Skip();
208 }
209
210 // General handler for disabling items
211 void csFrame::OnUpdateDisable(wxUpdateUIEvent& event)
212 {
213 event.Enable(false);
214 }
215
216 void csFrame::OnSaveUpdate(wxUpdateUIEvent& event)
217 {
218 event.Enable( (GetActiveChild() != NULL) );
219 }
220
221 /*
222 * Child frame
223 */
224
225 BEGIN_EVENT_TABLE(csMDIChildFrame, wxDocMDIChildFrame)
226 EVT_ACTIVATE(csMDIChildFrame::OnActivate)
227 END_EVENT_TABLE()
228
229 csMDIChildFrame::csMDIChildFrame(wxDocument* doc, wxView* view, wxMDIParentFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
230 wxDocMDIChildFrame(doc, view, parent, id, title, pos, size, style)
231 {
232 // Accelerators
233 wxAcceleratorEntry entries[18];
234
235 // Usual editing functions
236 entries[0].Set(wxACCEL_NORMAL, WXK_DELETE, wxID_CLEAR);
237 entries[1].Set(wxACCEL_CTRL, 'X', wxID_CUT);
238 entries[2].Set(wxACCEL_CTRL, 'C', wxID_COPY);
239 entries[3].Set(wxACCEL_SHIFT, WXK_INSERT, wxID_PASTE);
240 entries[4].Set(wxACCEL_CTRL, 'V', wxID_PASTE);
241 entries[5].Set(wxACCEL_CTRL, 'A', ID_CS_SELECT_ALL);
242
243 // Undo/redo
244 entries[6].Set(wxACCEL_CTRL, 'Z', wxID_UNDO);
245 entries[7].Set(wxACCEL_CTRL, 'Y', wxID_REDO);
246
247 // Other
248 entries[8].Set(wxACCEL_NORMAL, WXK_RETURN, ID_CS_EDIT_PROPERTIES);
249 entries[9].Set(wxACCEL_ALT, WXK_RETURN, ID_CS_EDIT_PROPERTIES);
250 entries[10].Set(wxACCEL_CTRL, 'D', wxID_DUPLICATE);
251 entries[11].Set(wxACCEL_NORMAL, WXK_F1, wxID_HELP);
252
253 // File handling
254 entries[12].Set(wxACCEL_CTRL, 'S', wxID_SAVE);
255 entries[13].Set(wxACCEL_NORMAL, WXK_F12, wxID_SAVEAS);
256 entries[14].Set(wxACCEL_CTRL, 'O', wxID_OPEN);
257 entries[15].Set(wxACCEL_CTRL, 'N', wxID_NEW);
258 entries[16].Set(wxACCEL_CTRL, 'P', wxID_PRINT);
259 entries[17].Set(wxACCEL_CTRL, 'W', wxID_CLOSE);
260
261
262 wxAcceleratorTable accel(18, entries);
263 SetAcceleratorTable(accel);
264 }
265
266 void csMDIChildFrame::OnActivate(wxActivateEvent& event)
267 {
268 wxDocMDIChildFrame::OnActivate(event);
269 /*
270 wxSashLayoutWindow* win = wxGetApp().GetDiagramPaletteSashWindow();
271 if (!win)
272 return;
273
274 win->Show(event.GetActive());
275
276 wxLayoutAlgorithm layout;
277 layout.LayoutMDIFrame((wxMDIParentFrame*) GetParent());
278 */
279 }
280