]> git.saurik.com Git - wxWidgets.git/blame - contrib/samples/ogl/studio/mainfrm.cpp
blind fix for Unicode key handling (patch 1615989)
[wxWidgets.git] / contrib / samples / ogl / studio / mainfrm.cpp
CommitLineData
1fc25a89 1/////////////////////////////////////////////////////////////////////////////
1ed64378 2// Name: ogl/stufio/mainfrm.cpp
1fc25a89
JS
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
33BEGIN_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)
52END_EVENT_TABLE()
53
54// Define my frame constructor
2ba06d5a 55csFrame::csFrame(wxDocManager* manager, wxFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
1484b5cc 56 wxDocMDIParentFrame(manager, parent, id, title, pos, size, style, _T("frame"))
1fc25a89
JS
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
1484b5cc 73void csFrame::OnHelp(wxCommandEvent& WXUNUSED(event))
1fc25a89 74{
2ba06d5a
WS
75 wxHelpControllerBase* help;
76 help = wxGetApp().GetHelpController();
77 if (help)
78 help->DisplayContents();
1fc25a89
JS
79}
80
1484b5cc 81void csFrame::OnSettings(wxCommandEvent& WXUNUSED(event))
1fc25a89 82{
cecdcad1 83#if wxUSE_WX_RESOURCES
1fc25a89 84 csSettingsDialog* dialog = new csSettingsDialog(this);
1484b5cc 85 /* int ret = */ dialog->ShowModal();
1fc25a89 86 dialog->Destroy();
cecdcad1 87#endif // wxUSE_WX_RESOURCES
1fc25a89
JS
88}
89
1484b5cc 90void csFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
1fc25a89 91{
2ba06d5a 92 Close(true);
1fc25a89
JS
93}
94
1484b5cc 95void csFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
1fc25a89 96{
1484b5cc 97 (void)wxMessageBox(_T("OGL Studio\n(c) 1999, Julian Smart"), _T("About OGL Studio"), wxICON_INFORMATION);
1fc25a89
JS
98}
99
100void 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
117void 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.
136void 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
83ae4c61 148void csFrame::OnSize(wxSizeEvent& event)
1fc25a89
JS
149{
150 wxLayoutAlgorithm layout;
151 layout.LayoutMDIFrame(this);
83ae4c61 152 event.Skip();
1fc25a89
JS
153}
154
155// Make sure the correct toolbars are showing for the active view
156void csFrame::OnIdle(wxIdleEvent& event)
157{
1fc25a89
JS
158 wxSashLayoutWindow* paletteWin = wxGetApp().GetDiagramPaletteSashWindow();
159 wxSashLayoutWindow* diagramToolBarWin = wxGetApp().GetDiagramToolBarSashWindow();
160 if (!paletteWin || !diagramToolBarWin)
161 return;
2ba06d5a 162 bool doLayout = false;
1fc25a89
JS
163 if (GetActiveChild())
164 {
165 if (!paletteWin->IsShown() || !diagramToolBarWin->IsShown())
166 {
2ba06d5a
WS
167 paletteWin->Show(true);
168 diagramToolBarWin->Show(true);
1fc25a89 169
2ba06d5a 170 doLayout = true;
1fc25a89
JS
171 }
172 }
173 else
174 {
175 if (paletteWin->IsShown() || diagramToolBarWin->IsShown())
176 {
2ba06d5a
WS
177 paletteWin->Show(false);
178 diagramToolBarWin->Show(false);
179 doLayout = true;
1fc25a89
JS
180 }
181 }
182 if (doLayout)
183 {
184 wxLayoutAlgorithm layout;
185 layout.LayoutMDIFrame(this);
186
1ed64378 187#if defined(__WXMSW__)
1fc25a89
JS
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).
be5a51fb 193 // FIXED in wxWidgets, by intercepting wxMDIClientWindow::DoSetSize
1fc25a89
JS
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
1ed64378 205#endif // __WXMSW__
1fc25a89 206 }
34f7e40f 207 event.Skip();
1fc25a89
JS
208}
209
210// General handler for disabling items
211void csFrame::OnUpdateDisable(wxUpdateUIEvent& event)
212{
2ba06d5a 213 event.Enable(false);
1fc25a89
JS
214}
215
216void csFrame::OnSaveUpdate(wxUpdateUIEvent& event)
217{
218 event.Enable( (GetActiveChild() != NULL) );
219}
220
221/*
222 * Child frame
223 */
224
225BEGIN_EVENT_TABLE(csMDIChildFrame, wxDocMDIChildFrame)
226 EVT_ACTIVATE(csMDIChildFrame::OnActivate)
227END_EVENT_TABLE()
228
229csMDIChildFrame::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
266void 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}