--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: mainfrm.cpp
+// Purpose: Studio main frame
+// Author: Julian Smart
+// Modified by:
+// Created: 27/7/98
+// RCS-ID: $Id$
+// Copyright: (c) Julian Smart
+// Licence:
+/////////////////////////////////////////////////////////////////////////////
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#include "wx/mdi.h"
+#endif
+
+#include "wx/laywin.h"
+
+#include "studio.h"
+#include "view.h"
+#include "doc.h"
+#include "cspalette.h"
+#include "mainfrm.h"
+#include "dialogs.h"
+
+BEGIN_EVENT_TABLE(csFrame, wxDocMDIParentFrame)
+ EVT_MENU(ID_CS_ABOUT, csFrame::OnAbout)
+ EVT_MENU(wxID_EXIT, csFrame::OnQuit)
+ EVT_MENU(wxID_HELP, csFrame::OnHelp)
+ EVT_MENU(ID_CS_SETTINGS, csFrame::OnSettings)
+ EVT_SIZE(csFrame::OnSize)
+ EVT_SASH_DRAGGED(ID_LAYOUT_WINDOW_PALETTE, csFrame::OnSashDragPaletteWindow)
+ EVT_SASH_DRAGGED(ID_LAYOUT_WINDOW_PROJECT, csFrame::OnSashDragProjectWindow)
+ EVT_IDLE(csFrame::OnIdle)
+ EVT_UPDATE_UI(wxID_PRINT, csFrame::OnUpdateDisable)
+ EVT_UPDATE_UI(wxID_PREVIEW, csFrame::OnUpdateDisable)
+ EVT_UPDATE_UI(wxID_SAVE, csFrame::OnSaveUpdate)
+ EVT_UPDATE_UI(wxID_SAVEAS, csFrame::OnSaveUpdate)
+ EVT_UPDATE_UI(wxID_UNDO, csFrame::OnUpdateDisable)
+ EVT_UPDATE_UI(wxID_REDO, csFrame::OnUpdateDisable)
+ EVT_UPDATE_UI(wxID_CUT, csFrame::OnUpdateDisable)
+ EVT_UPDATE_UI(wxID_COPY, csFrame::OnUpdateDisable)
+ EVT_UPDATE_UI(wxID_PASTE, csFrame::OnUpdateDisable)
+ EVT_CLOSE(csFrame::OnCloseWindow)
+END_EVENT_TABLE()
+
+// Define my frame constructor
+csFrame::csFrame(wxDocManager* manager, wxFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size,
+ long style):
+ wxDocMDIParentFrame(manager, parent, id, title, pos, size, style, "frame")
+{
+ CreateToolBar(wxNO_BORDER|wxTB_FLAT|wxTB_HORIZONTAL);
+ wxGetApp().InitToolBar(GetToolBar());
+
+ // Accelerators
+ wxAcceleratorEntry entries[4];
+
+ entries[0].Set(wxACCEL_NORMAL, WXK_F1, wxID_HELP);
+ entries[1].Set(wxACCEL_CTRL, 'O', wxID_OPEN);
+ entries[2].Set(wxACCEL_CTRL, 'N', wxID_NEW);
+ entries[3].Set(wxACCEL_CTRL, 'P', wxID_PRINT);
+
+ wxAcceleratorTable accel(4, entries);
+ SetAcceleratorTable(accel);
+}
+
+void csFrame::OnHelp(wxCommandEvent& event)
+{
+ wxGetApp().GetHelpController().DisplayContents();
+}
+
+void csFrame::OnSettings(wxCommandEvent& event)
+{
+ csSettingsDialog* dialog = new csSettingsDialog(this);
+ int ret = dialog->ShowModal();
+ dialog->Destroy();
+}
+
+void csFrame::OnQuit(wxCommandEvent& event)
+{
+ Close(TRUE);
+}
+
+void csFrame::OnAbout(wxCommandEvent& event)
+{
+ (void)wxMessageBox("OGL Studio\n(c) 1999, Julian Smart", "About OGL Studio", wxICON_INFORMATION);
+}
+
+void csFrame::OnSashDragPaletteWindow(wxSashEvent& event)
+{
+ if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
+ return;
+
+ switch (event.GetId())
+ {
+ case ID_LAYOUT_WINDOW_PALETTE:
+ {
+ wxGetApp().GetDiagramPaletteSashWindow()->SetDefaultSize(wxSize(10000, event.GetDragRect().height));
+ break;
+ }
+ }
+ wxLayoutAlgorithm layout;
+ layout.LayoutMDIFrame(this);
+}
+
+void csFrame::OnSashDragProjectWindow(wxSashEvent& event)
+{
+ if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
+ return;
+
+ switch (event.GetId())
+ {
+ case ID_LAYOUT_WINDOW_PROJECT:
+ {
+ wxGetApp().GetProjectSashWindow()->SetDefaultSize(wxSize(event.GetDragRect().width, 10000));
+ break;
+ }
+ }
+ wxLayoutAlgorithm layout;
+ layout.LayoutMDIFrame(this);
+}
+
+// Define the behaviour for the frame closing
+// - must delete all frames except for the main one.
+void csFrame::OnCloseWindow(wxCloseEvent& event)
+{
+ int x, y;
+ GetPosition(& x, & y);
+ wxGetApp().m_mainFramePos = wxPoint(x, y);
+
+ GetSize(& x, & y);
+ wxGetApp().m_mainFrameSize = wxSize(x, y);
+
+ wxDocMDIParentFrame::OnCloseWindow(event);
+}
+
+void csFrame::OnSize(wxSizeEvent& event)
+{
+ wxLayoutAlgorithm layout;
+ layout.LayoutMDIFrame(this);
+}
+
+// Make sure the correct toolbars are showing for the active view
+void csFrame::OnIdle(wxIdleEvent& event)
+{
+ wxDocMDIParentFrame::OnIdle(event);
+
+ wxSashLayoutWindow* paletteWin = wxGetApp().GetDiagramPaletteSashWindow();
+ wxSashLayoutWindow* diagramToolBarWin = wxGetApp().GetDiagramToolBarSashWindow();
+ if (!paletteWin || !diagramToolBarWin)
+ return;
+ bool doLayout = FALSE;
+ if (GetActiveChild())
+ {
+ if (!paletteWin->IsShown() || !diagramToolBarWin->IsShown())
+ {
+ paletteWin->Show(TRUE);
+ diagramToolBarWin->Show(TRUE);
+
+ doLayout = TRUE;
+ }
+ }
+ else
+ {
+ if (paletteWin->IsShown() || diagramToolBarWin->IsShown())
+ {
+ paletteWin->Show(FALSE);
+ diagramToolBarWin->Show(FALSE);
+ doLayout = TRUE;
+ }
+ }
+ if (doLayout)
+ {
+ wxLayoutAlgorithm layout;
+ layout.LayoutMDIFrame(this);
+
+#if defined(__WXMSW__) && defined(__WIN95__)
+ // Need to do something else to get it to refresh properly
+ // when a client frame is first displayed; moving the client
+ // window doesn't cause the proper refresh. Just refreshing the
+ // client doesn't work (presumably because it's clipping the
+ // children).
+ // FIXED in wxWindows, by intercepting wxMDIClientWindow::DoSetSize
+ // and checking if the position has changed, before redrawing the
+ // child windows.
+#if 0
+ wxMDIChildFrame* childFrame = GetActiveChild();
+ if (childFrame)
+ {
+ HWND hWnd = (HWND) childFrame->GetHWND();
+ ::RedrawWindow(hWnd, NULL, NULL, RDW_FRAME|RDW_ALLCHILDREN|RDW_INVALIDATE );
+
+ }
+#endif
+#endif
+ }
+}
+
+// General handler for disabling items
+void csFrame::OnUpdateDisable(wxUpdateUIEvent& event)
+{
+ event.Enable(FALSE);
+}
+
+void csFrame::OnSaveUpdate(wxUpdateUIEvent& event)
+{
+ event.Enable( (GetActiveChild() != NULL) );
+}
+
+/*
+ * Child frame
+ */
+
+BEGIN_EVENT_TABLE(csMDIChildFrame, wxDocMDIChildFrame)
+ EVT_ACTIVATE(csMDIChildFrame::OnActivate)
+END_EVENT_TABLE()
+
+csMDIChildFrame::csMDIChildFrame(wxDocument* doc, wxView* view, wxMDIParentFrame *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
+ wxDocMDIChildFrame(doc, view, parent, id, title, pos, size, style)
+{
+ // Accelerators
+ wxAcceleratorEntry entries[18];
+
+ // Usual editing functions
+ entries[0].Set(wxACCEL_NORMAL, WXK_DELETE, wxID_CLEAR);
+ entries[1].Set(wxACCEL_CTRL, 'X', wxID_CUT);
+ entries[2].Set(wxACCEL_CTRL, 'C', wxID_COPY);
+ entries[3].Set(wxACCEL_SHIFT, WXK_INSERT, wxID_PASTE);
+ entries[4].Set(wxACCEL_CTRL, 'V', wxID_PASTE);
+ entries[5].Set(wxACCEL_CTRL, 'A', ID_CS_SELECT_ALL);
+
+ // Undo/redo
+ entries[6].Set(wxACCEL_CTRL, 'Z', wxID_UNDO);
+ entries[7].Set(wxACCEL_CTRL, 'Y', wxID_REDO);
+
+ // Other
+ entries[8].Set(wxACCEL_NORMAL, WXK_RETURN, ID_CS_EDIT_PROPERTIES);
+ entries[9].Set(wxACCEL_ALT, WXK_RETURN, ID_CS_EDIT_PROPERTIES);
+ entries[10].Set(wxACCEL_CTRL, 'D', wxID_DUPLICATE);
+ entries[11].Set(wxACCEL_NORMAL, WXK_F1, wxID_HELP);
+
+ // File handling
+ entries[12].Set(wxACCEL_CTRL, 'S', wxID_SAVE);
+ entries[13].Set(wxACCEL_NORMAL, WXK_F12, wxID_SAVEAS);
+ entries[14].Set(wxACCEL_CTRL, 'O', wxID_OPEN);
+ entries[15].Set(wxACCEL_CTRL, 'N', wxID_NEW);
+ entries[16].Set(wxACCEL_CTRL, 'P', wxID_PRINT);
+ entries[17].Set(wxACCEL_CTRL, 'W', wxID_CLOSE);
+
+
+ wxAcceleratorTable accel(18, entries);
+ SetAcceleratorTable(accel);
+}
+
+void csMDIChildFrame::OnActivate(wxActivateEvent& event)
+{
+ wxDocMDIChildFrame::OnActivate(event);
+/*
+ wxSashLayoutWindow* win = wxGetApp().GetDiagramPaletteSashWindow();
+ if (!win)
+ return;
+
+ win->Show(event.GetActive());
+
+ wxLayoutAlgorithm layout;
+ layout.LayoutMDIFrame((wxMDIParentFrame*) GetParent());
+*/
+}
+