| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        samples/docview/docview.cpp
 
- // Purpose:     Document/view demo
 
- // Author:      Julian Smart
 
- // Modified by: Vadim Zeitlin: merge with the MDI version and general cleanup
 
- // Created:     04/01/98
 
- // Copyright:   (c) 1998 Julian Smart
 
- //              (c) 2008 Vadim Zeitlin
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- /*
 
-     This sample show document/view support in wxWidgets.
 
-     It can be run in several ways:
 
-         * With "--mdi" command line option to use multiple MDI child frames
 
-           for the multiple documents (this is the default).
 
-         * With "--sdi" command line option to use multiple top level windows
 
-           for the multiple documents
 
-         * With "--single" command line option to support opening a single
 
-           document only
 
-     Notice that doing it like this somewhat complicates the code, you could
 
-     make things much simpler in your own programs by using either
 
-     wxDocParentFrame or wxDocMDIParentFrame unconditionally (and never using
 
-     the single mode) instead of supporting all of them as this sample does.
 
-  */
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- // 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/stockitem.h"
 
- #endif
 
- #if !wxUSE_DOC_VIEW_ARCHITECTURE
 
-     #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h!
 
- #endif
 
- #include "wx/docview.h"
 
- #include "wx/docmdi.h"
 
- #include "docview.h"
 
- #include "doc.h"
 
- #include "view.h"
 
- #include "wx/cmdline.h"
 
- #include "wx/config.h"
 
- #ifdef __WXMAC__
 
-     #include "wx/filename.h"
 
- #endif
 
- #ifndef wxHAS_IMAGES_IN_RESOURCES
 
-     #include "doc.xpm"
 
-     #include "chart.xpm"
 
-     #include "notepad.xpm"
 
- #endif
 
- // ----------------------------------------------------------------------------
 
- // MyApp implementation
 
- // ----------------------------------------------------------------------------
 
- IMPLEMENT_APP(MyApp)
 
- wxBEGIN_EVENT_TABLE(MyApp, wxApp)
 
-     EVT_MENU(wxID_ABOUT, MyApp::OnAbout)
 
- wxEND_EVENT_TABLE()
 
- MyApp::MyApp()
 
- {
 
- #if wxUSE_MDI_ARCHITECTURE
 
-     m_mode = Mode_MDI;
 
- #else
 
-     m_mode = Mode_SDI;
 
- #endif
 
-     m_canvas = NULL;
 
-     m_menuEdit = NULL;
 
- }
 
- // constants for the command line options names
 
- namespace CmdLineOption
 
- {
 
- const char * const MDI = "mdi";
 
- const char * const SDI = "sdi";
 
- const char * const SINGLE = "single";
 
- } // namespace CmdLineOption
 
- void MyApp::OnInitCmdLine(wxCmdLineParser& parser)
 
- {
 
-     wxApp::OnInitCmdLine(parser);
 
-     parser.AddSwitch("", CmdLineOption::MDI,
 
-                      "run in MDI mode: multiple documents, single window");
 
-     parser.AddSwitch("", CmdLineOption::SDI,
 
-                      "run in SDI mode: multiple documents, multiple windows");
 
-     parser.AddSwitch("", CmdLineOption::SINGLE,
 
-                      "run in single document mode");
 
- }
 
- bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser)
 
- {
 
-     int numModeOptions = 0;
 
- #if wxUSE_MDI_ARCHITECTURE
 
-     if ( parser.Found(CmdLineOption::MDI) )
 
-     {
 
-         m_mode = Mode_MDI;
 
-         numModeOptions++;
 
-     }
 
- #endif // wxUSE_MDI_ARCHITECTURE
 
-     if ( parser.Found(CmdLineOption::SDI) )
 
-     {
 
-         m_mode = Mode_SDI;
 
-         numModeOptions++;
 
-     }
 
-     if ( parser.Found(CmdLineOption::SINGLE) )
 
-     {
 
-         m_mode = Mode_Single;
 
-         numModeOptions++;
 
-     }
 
-     if ( numModeOptions > 1 )
 
-     {
 
-         wxLogError("Only a single option choosing the mode can be given.");
 
-         return false;
 
-     }
 
-     return wxApp::OnCmdLineParsed(parser);
 
- }
 
- bool MyApp::OnInit()
 
- {
 
-     if ( !wxApp::OnInit() )
 
-         return false;
 
-     ::wxInitAllImageHandlers();
 
-     // Fill in the application information fields before creating wxConfig.
 
-     SetVendorName("wxWidgets");
 
-     SetAppName("wx_docview_sample");
 
-     SetAppDisplayName("wxWidgets DocView Sample");
 
-     //// Create a document manager
 
-     wxDocManager *docManager = new wxDocManager;
 
-     //// Create a template relating drawing documents to their views
 
-     new wxDocTemplate(docManager, "Drawing", "*.drw", "", "drw",
 
-                       "Drawing Doc", "Drawing View",
 
-                       CLASSINFO(DrawingDocument), CLASSINFO(DrawingView));
 
- #if defined( __WXMAC__ )  && wxOSX_USE_CARBON
 
-     wxFileName::MacRegisterDefaultTypeAndCreator("drw" , 'WXMB' , 'WXMA');
 
- #endif
 
-     if ( m_mode == Mode_Single )
 
-     {
 
-         // If we've only got one window, we only get to edit one document at a
 
-         // time. Therefore no text editing, just doodling.
 
-         docManager->SetMaxDocsOpen(1);
 
-     }
 
-     else // multiple documents mode: allow documents of different types
 
-     {
 
-         // Create a template relating text documents to their views
 
-         new wxDocTemplate(docManager, "Text", "*.txt;*.text", "", "txt;text",
 
-                           "Text Doc", "Text View",
 
-                           CLASSINFO(TextEditDocument), CLASSINFO(TextEditView));
 
- #if defined( __WXMAC__ ) && wxOSX_USE_CARBON
 
-         wxFileName::MacRegisterDefaultTypeAndCreator("txt" , 'TEXT' , 'WXMA');
 
- #endif
 
-         // Create a template relating image documents to their views
 
-         new wxDocTemplate(docManager, "Image", "*.png;*.jpg", "", "png;jpg",
 
-                           "Image Doc", "Image View",
 
-                           CLASSINFO(ImageDocument), CLASSINFO(ImageView));
 
-     }
 
-     // create the main frame window
 
-     wxFrame *frame;
 
- #if wxUSE_MDI_ARCHITECTURE
 
-     if ( m_mode == Mode_MDI )
 
-     {
 
-         frame = new wxDocMDIParentFrame(docManager, NULL, wxID_ANY,
 
-                                         GetAppDisplayName(),
 
-                                         wxDefaultPosition,
 
-                                         wxSize(500, 400));
 
-     }
 
-     else
 
- #endif // wxUSE_MDI_ARCHITECTURE
 
-     {
 
-         frame = new wxDocParentFrame(docManager, NULL, wxID_ANY,
 
-                                      GetAppDisplayName(),
 
-                                      wxDefaultPosition,
 
-                                      wxSize(500, 400));
 
-     }
 
-     // and its menu bar
 
-     wxMenu *menuFile = new wxMenu;
 
-     menuFile->Append(wxID_NEW);
 
-     menuFile->Append(wxID_OPEN);
 
-     if ( m_mode == Mode_Single )
 
-         AppendDocumentFileCommands(menuFile, true);
 
-     menuFile->AppendSeparator();
 
-     menuFile->Append(wxID_EXIT);
 
-     // A nice touch: a history of files visited. Use this menu.
 
-     docManager->FileHistoryUseMenu(menuFile);
 
- #if wxUSE_CONFIG
 
-     docManager->FileHistoryLoad(*wxConfig::Get());
 
- #endif // wxUSE_CONFIG
 
-     if ( m_mode == Mode_Single )
 
-     {
 
-         m_canvas = new MyCanvas(NULL, frame);
 
-         m_menuEdit = CreateDrawingEditMenu();
 
-         docManager->CreateNewDocument();
 
-     }
 
-     CreateMenuBarForFrame(frame, menuFile, m_menuEdit);
 
-     frame->SetIcon(wxICON(doc));
 
-     frame->Centre();
 
-     frame->Show();
 
-     return true;
 
- }
 
- int MyApp::OnExit()
 
- {
 
-     wxDocManager * const manager = wxDocManager::GetDocumentManager();
 
- #if wxUSE_CONFIG
 
-     manager->FileHistorySave(*wxConfig::Get());
 
- #endif // wxUSE_CONFIG
 
-     delete manager;
 
-     return wxApp::OnExit();
 
- }
 
- void MyApp::AppendDocumentFileCommands(wxMenu *menu, bool supportsPrinting)
 
- {
 
-     menu->Append(wxID_CLOSE);
 
-     menu->Append(wxID_SAVE);
 
-     menu->Append(wxID_SAVEAS);
 
-     menu->Append(wxID_REVERT, _("Re&vert..."));
 
-     if ( supportsPrinting )
 
-     {
 
-         menu->AppendSeparator();
 
-         menu->Append(wxID_PRINT);
 
-         menu->Append(wxID_PRINT_SETUP, "Print &Setup...");
 
-         menu->Append(wxID_PREVIEW);
 
-     }
 
- }
 
- wxMenu *MyApp::CreateDrawingEditMenu()
 
- {
 
-     wxMenu * const menu = new wxMenu;
 
-     menu->Append(wxID_UNDO);
 
-     menu->Append(wxID_REDO);
 
-     menu->AppendSeparator();
 
-     menu->Append(wxID_CUT, "&Cut last segment");
 
-     return menu;
 
- }
 
- void MyApp::CreateMenuBarForFrame(wxFrame *frame, wxMenu *file, wxMenu *edit)
 
- {
 
-     wxMenuBar *menubar = new wxMenuBar;
 
-     menubar->Append(file, wxGetStockLabel(wxID_FILE));
 
-     if ( edit )
 
-         menubar->Append(edit, wxGetStockLabel(wxID_EDIT));
 
-     wxMenu *help= new wxMenu;
 
-     help->Append(wxID_ABOUT);
 
-     menubar->Append(help, wxGetStockLabel(wxID_HELP));
 
-     frame->SetMenuBar(menubar);
 
- }
 
- wxFrame *MyApp::CreateChildFrame(wxView *view, bool isCanvas)
 
- {
 
-     // create a child frame of appropriate class for the current mode
 
-     wxFrame *subframe;
 
-     wxDocument *doc = view->GetDocument();
 
- #if wxUSE_MDI_ARCHITECTURE
 
-     if ( GetMode() == Mode_MDI )
 
-     {
 
-         subframe = new wxDocMDIChildFrame
 
-                        (
 
-                             doc,
 
-                             view,
 
-                             wxStaticCast(GetTopWindow(), wxDocMDIParentFrame),
 
-                             wxID_ANY,
 
-                             "Child Frame",
 
-                             wxDefaultPosition,
 
-                             wxSize(300, 300)
 
-                        );
 
-     }
 
-     else
 
- #endif // wxUSE_MDI_ARCHITECTURE
 
-     {
 
-         subframe = new wxDocChildFrame
 
-                        (
 
-                             doc,
 
-                             view,
 
-                             wxStaticCast(GetTopWindow(), wxDocParentFrame),
 
-                             wxID_ANY,
 
-                             "Child Frame",
 
-                             wxDefaultPosition,
 
-                             wxSize(300, 300)
 
-                        );
 
-         subframe->Centre();
 
-     }
 
-     wxMenu *menuFile = new wxMenu;
 
-     menuFile->Append(wxID_NEW);
 
-     menuFile->Append(wxID_OPEN);
 
-     AppendDocumentFileCommands(menuFile, isCanvas);
 
-     menuFile->AppendSeparator();
 
-     menuFile->Append(wxID_EXIT);
 
-     wxMenu *menuEdit;
 
-     if ( isCanvas )
 
-     {
 
-         menuEdit = CreateDrawingEditMenu();
 
-         doc->GetCommandProcessor()->SetEditMenu(menuEdit);
 
-         doc->GetCommandProcessor()->Initialize();
 
-     }
 
-     else // text frame
 
-     {
 
-         menuEdit = new wxMenu;
 
-         menuEdit->Append(wxID_COPY);
 
-         menuEdit->Append(wxID_PASTE);
 
-         menuEdit->Append(wxID_SELECTALL);
 
-     }
 
-     CreateMenuBarForFrame(subframe, menuFile, menuEdit);
 
-     subframe->SetIcon(isCanvas ? wxICON(chrt) : wxICON(notepad));
 
-     return subframe;
 
- }
 
- void MyApp::OnAbout(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     wxString modeName;
 
-     switch ( m_mode )
 
-     {
 
- #if wxUSE_MDI_ARCHITECTURE
 
-         case Mode_MDI:
 
-             modeName = "MDI";
 
-             break;
 
- #endif // wxUSE_MDI_ARCHITECTURE
 
-         case Mode_SDI:
 
-             modeName = "SDI";
 
-             break;
 
-         case Mode_Single:
 
-             modeName = "single document";
 
-             break;
 
-         default:
 
-             wxFAIL_MSG( "unknown mode ");
 
-     }
 
- #ifdef __VISUALC6__
 
-     const int docsCount =
 
-         wxDocManager::GetDocumentManager()->GetDocuments().GetCount();
 
- #else
 
-     const int docsCount =
 
-         wxDocManager::GetDocumentManager()->GetDocumentsVector().size();
 
- #endif
 
-     wxLogMessage
 
-     (
 
-         "This is the wxWidgets Document/View Sample\n"
 
-         "running in %s mode.\n"
 
-         "%d open documents.\n"
 
-         "\n"
 
-         "Authors: Julian Smart, Vadim Zeitlin\n"
 
-         "\n"
 
-         "Usage: docview [--{mdi,sdi,single}]",
 
-         modeName,
 
-         docsCount
 
-     );
 
- }
 
 
  |