home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / demos / dbbrowse / dbbrowse.cpp < prev    next >
C/C++ Source or Header  |  2002-01-14  |  18KB  |  324 lines

  1. //----------------------------------------------------------------------------------------
  2. // Name:        dbbrowse.cpp
  3. // Purpose:     Through ODBC - Databases Browsen
  4. // Author:      Mark Johnson
  5. // Modified by:
  6. // BJO        : Bart A.M. JOURQUIN
  7. // Created:     19991127
  8. // Copyright:   (c) Mark Johnson
  9. // Licence:     wxWindows license
  10. // RCS-ID:      $Id: dbbrowse.cpp,v 1.14 2002/01/08 23:27:19 VS Exp $
  11. //----------------------------------------------------------------------------------------
  12. //-- all #ifdefs that the whole Project needs. -------------------------------------------
  13. //----------------------------------------------------------------------------------------
  14. #ifdef __GNUG__
  15. #pragma implementation
  16. #pragma interface
  17. #endif
  18. //----------------------------------------------------------------------------------------
  19. // For compilers that support precompilation, includes "wx/wx.h".
  20. #include "wx/wxprec.h"
  21. //----------------------------------------------------------------------------------------
  22. #ifdef __BORLANDC__
  23. #pragma hdrstop
  24. #endif
  25. //----------------------------------------------------------------------------------------
  26. #ifndef WX_PRECOMP
  27. #include "wx/wx.h"
  28. #endif
  29. //----------------------------------------------------------------------------------------
  30. #ifndef __WXMSW__
  31. #include "bitmaps/logo.xpm"
  32. #endif
  33. //----------------------------------------------------------------------------------------
  34. //-- all #includes that every .cpp needs             --- 19990807.mj10777 ----------------
  35. //----------------------------------------------------------------------------------------
  36. #include "std.h"    // sorgsam Pflegen !
  37. // #include <iostream>
  38. //----------------------------------------------------------------------------------------
  39. //-- Some Global Vars for this file ------------------------------------------------------
  40. //----------------------------------------------------------------------------------------
  41. BEGIN_EVENT_TABLE(MainFrame, wxFrame)
  42.     EVT_MENU(QUIT, MainFrame::OnQuit)                  // Program End
  43.     EVT_MENU(ABOUT, MainFrame::OnAbout)                // Program Discription
  44.     EVT_MENU(HELP, MainFrame::OnHelp)                  // Program Help
  45. END_EVENT_TABLE()
  46.  
  47. //----------------------------------------------------------------------------------------
  48. IMPLEMENT_APP(MainApp)      // This declares wxApp::MainApp as "the" Application
  49.  
  50. //----------------------------------------------------------------------------------------
  51. // 'Main program' equivalent, creating windows and returning main app frame
  52. //----------------------------------------------------------------------------------------
  53. bool MainApp::OnInit(void)  // Does everything needed for a program start
  54. {
  55.     wxString Temp0;            // Use as needed
  56.     //---------------------------------------------------------------------------------------
  57.     // set the language to use   // Help.??  (.std = english, .de = german etc.)
  58.     const char *language = NULL; // czech, german, french, polish
  59.     const char *langid   = NULL; // std = english , cz, de = german, fr = french, pl = polish
  60.     wxString   s_LangHelp;       // Directory/Filename.hhp of the Help-Project file
  61.     wxString   s_LangId, s_Language;
  62.     s_Language.Empty(); s_LangId.Empty(); s_LangHelp.Empty();
  63.     //---------------------------------------------------------------------------------------
  64.     //-- Graphic File suport - use only when needed, otherwise big .exe's
  65.     //---------------------------------------------------------------------------------------
  66. #if wxUSE_LIBPNG
  67.     wxImage::AddHandler( new wxPNGHandler );   // needed for help System
  68. #endif
  69. /*
  70.     #if wxUSE_LIBJPEG
  71.     wxImage::AddHandler(new wxJPEGHandler );   // use only when needed, otherwise big .exe's
  72.     #endif
  73.     wxImage::AddHandler( new wxGIFHandler );   // use only when needed, otherwise big .exe's
  74.     wxImage::AddHandler( new wxPCXHandler );   // use only when needed, otherwise big .exe's
  75.     wxImage::AddHandler( new wxPNMHandler );   // use only when needed, otherwise big .exe's
  76. */
  77. #ifdef __WXMSW__
  78.     // wxBitmap::AddHandler( new wxXPMFileHandler );   // Attempt to use XPS instead of ico
  79.     // wxBitmap::AddHandler( new wxXPMDataHandler );   // - Attempt failed
  80. #endif
  81.     //---------------------------------------------------------------------------------------
  82.     switch ( argc )
  83.     {
  84.     default:
  85.         // ignore the other args, fall through
  86.     case 3:
  87.         language = argv[2];         // czech, english, french, german , polish
  88.         langid   = argv[1];         // cz, std, fr, de , pl
  89.         break;
  90.     case 2:
  91.         langid   = argv[1];         // cz, std, fr, de , pl
  92.         break;
  93.     case 1:
  94.         break;
  95.     };
  96.     //---------------------------------------------------------------------------------------
  97.     // Win-Registry : Workplace\HKEY_CURRENT_USERS\Software\%GetVendorName()\%GetAppName()
  98.     //---------------------------------------------------------------------------------------
  99.     SetVendorName("mj10777");           // Needed to get Configuration Information
  100.     SetAppName("DBBrowse");            // "" , also needed for s_LangHelp
  101.     //---------------------------------------------------------------------------------------
  102.     // we're using wxConfig's "create-on-demand" feature: it will create the
  103.     // config object when it's used for the first time. It has a number of
  104.     // advantages compared with explicitly creating our wxConfig:
  105.     //  1) we don't pay for it if we don't use it
  106.     //  2) there is no danger to create it twice
  107.     
  108.     // application and vendor name are used by wxConfig to construct the name
  109.     // of the config file/registry key and must be set before the first call
  110.     // to Get() if you want to override the default values (the application
  111.     // name is the name of the executable and the vendor name is the same)
  112.     //---------------------------------------------------------------------------------------
  113.     p_ProgramCfg = wxConfigBase::Get();  // Get Program Configuration from Registry
  114.     // p_ProgramCfg->DeleteAll();           // This is how the Config can be erased
  115.     p_ProgramCfg->SetPath("/");          // Start at root
  116.     //---------------------------------------------------------------------------------------
  117.     //-- Set the Language and remember it for the next time. --------------------------------
  118.     //---------------------------------------------------------------------------------------
  119.     if (langid == NULL) // No Parameter was given
  120.     {
  121.         Temp0.Empty();
  122.         p_ProgramCfg->Read("/Local/langid",&Temp0); // >const char *langid< can't be used here
  123.         if (Temp0 == "")
  124.             langid = "std";  // Standard language is "std" = english
  125.         else
  126.             langid = Temp0;
  127.     }
  128.     Temp0.Printf("%s",langid);
  129.     //---------------------------------------------------------------------------------------
  130.     // Support the following languages  (std = english)
  131.     if ((Temp0 == "a")  || (Temp0 == "cz") || (Temp0 == "de") ||
  132.         (Temp0 == "fr") || (Temp0 == "pl"))
  133.     { // The three-letter language-string codes are only valid in Windows NT and Windows 95.
  134.         if (Temp0 == "cz")
  135.             language = "czech";  // csy or czech
  136.         if ((Temp0 == "de") || (Temp0 == "a"))
  137.         {
  138.             language = "german";  // deu or german
  139.             if (Temp0 == "a")
  140.             { langid = Temp0 = "de"; }  // Austrian = german
  141.         } // german / austrian
  142.         if (Temp0 == "fr")
  143.             language = "french";  // fra or french
  144.         if (Temp0 == "pl")
  145.             language = "polish";  // plk or polish
  146.         if (!m_locale.Init(language, langid, language)) // Don't do this for english (std)
  147.         { // You should recieve errors here for cz and pl since there is no cz/ and pl/ directory
  148.             wxLogMessage("-E-> %s : SetLocale error : langid(%s) ; language(%s)",GetAppName().c_str(),langid,language);
  149.             langid = "std";
  150.             language = "C";  // english, english-aus , -can , -nz , -uk , -usa
  151.         }
  152.         else
  153.         { // Read in Foreign language's text for GetAppName() and Help
  154.             Temp0 = GetAppName();
  155.             Temp0 = Temp0.Lower();
  156.             m_locale.AddCatalog(Temp0.c_str());
  157.             m_locale.AddCatalog("help");
  158.         }
  159.     } // Support the following languages  (std = english)
  160.     else
  161.     {
  162.         langid = "std";
  163.         language = "C";  // english, english-aus , -can , -nz , -uk , -usa
  164.     }
  165.     s_Language.Printf("%s",language);                       // language is a pointer
  166.     s_LangId.Printf("%s",langid);                           // langid   is a pointer
  167.     p_ProgramCfg->Write("/Local/language",s_Language);
  168.     p_ProgramCfg->Write("/Local/langid",s_LangId);
  169.     s_LangHelp.Printf("help.%s/%s.hhp",s_LangId.c_str(),GetAppName().c_str()); // "help.std/Garantie.hhp";
  170.     s_LangHelp = s_LangHelp.Lower();                       // A must for Linux
  171.     //---------------------------------------------------------------------------------------
  172.     Temp0 = "NONE";                               // I don't remember why I did this
  173.     p_ProgramCfg->Write("/NONE",Temp0);           // I don't remember why I did this
  174.     p_ProgramCfg->Write("/Paths/NONE",Temp0);     // I don't remember why I did this
  175.     p_ProgramCfg->Write("/MainFrame/NONE",Temp0); // I don't remember why I did this
  176.     //---------------------------------------------------------------------------------------
  177.     p_ProgramCfg->Write("/Paths/Work",wxGetCwd()); // Get current Working Path
  178.     p_ProgramCfg->SetPath("/");
  179.     //---------------------------------------------------------------------------------------
  180.     // restore frame position and size, if empty start Values (1,1) and (750,600)
  181.     int x = p_ProgramCfg->Read("/MainFrame/x", 1), y = p_ProgramCfg->Read("/MainFrame/y", 1),
  182.         w = p_ProgramCfg->Read("/MainFrame/w", 750), h = p_ProgramCfg->Read("/MainFrame/h", 600);
  183.     //---------------------------------------------------------------------------------------
  184.     // Create the main frame window
  185.     Temp0.Printf("%s - %s",GetAppName().c_str(),GetVendorName().c_str());
  186.     frame = new MainFrame((wxFrame *) NULL,(char *) Temp0.c_str(),wxPoint(x,y),wxSize(w,h));
  187.     //---------------------------------------------------------------------------------------
  188.     // Set the Backgroundcolour (only need if your are NOT using wxSYS_COLOUR_BACKGROUND)
  189.     frame->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND));
  190.     // frame->SetBackgroundColour(wxColour(255, 255, 255));
  191.     // frame->SetBackgroundColour(* wxWHITE);
  192.     //---------------------------------------------------------------------------------------
  193.     // Give it an icon
  194.     //---------------------------------------------------------------------------------------
  195.     // 12.02.2000 - Guillermo Rodriguez Garcia :
  196.     //---------------------------------------------------------------------------------------
  197.     // This is different for Win9x and WinNT; one of them takes the first ico
  198.     // in the .rc file, while the other takes the icon with the lowest name,
  199.     // so to be sure that it always work, put your icon the first *and* give
  200.     // it a name such a 'appicon' or something.
  201.     //---------------------------------------------------------------------------------------
  202.     // mj10777 : any special rule in Linux ?
  203.     //---------------------------------------------------------------------------------------
  204.     frame->SetIcon(wxICON(aLogo));    // lowest name and first entry in RC File
  205.     //---------------------------------------------------------------------------------------
  206.     // Make a menubar
  207.     wxMenu *file_menu = new wxMenu;
  208.     wxMenu *help_menu = new wxMenu;
  209.     
  210.     help_menu->Append(HELP, _("&Help"));
  211.     help_menu->AppendSeparator();
  212.     help_menu->Append(ABOUT, _("&About"));
  213.     file_menu->Append(QUIT, _("E&xit"));
  214.     
  215.     wxMenuBar *menu_bar = new wxMenuBar;
  216.     menu_bar->Append(file_menu, _("&File"));
  217.     menu_bar->Append(help_menu, _("&Help"));
  218.     frame->SetMenuBar(menu_bar);
  219.     frame->CreateStatusBar(1);
  220.     Temp0.Printf(_("%s has started !"),p_ProgramCfg->GetAppName().c_str());
  221.     frame->SetStatusText(Temp0, 0);
  222.     //---------------------------------------------------------------------------------------
  223.     int width, height;
  224.     frame->GetClientSize(&width, &height);
  225.     //---------------------------------------------------------------------------------------
  226.     frame->p_Splitter = new DocSplitterWindow(frame,-1);
  227.     // p_Splitter->SetCursor(wxCursor(wxCURSOR_PENCIL));
  228.     frame->pDoc                       = new MainDoc();
  229.     frame->pDoc->p_MainFrame          = frame;
  230.     frame->pDoc->p_Splitter           = frame->p_Splitter;
  231.     frame->pDoc->p_Splitter->pDoc     = frame->pDoc;       // ControlBase: saving the Sash
  232.     //---------------------------------------------------------------------------------------
  233.     //-- Problem : GetClientSize(Width,Hight) are not the same as the values given in the ---
  234.     //--            construction of the Frame.                                            ---
  235.     //-- Solved  : GetClientSize is called here and the difference is noted. When the     ---
  236.     //--           Window is closed the diff. is added to the result of GetClientSize.    ---
  237.     //---------------------------------------------------------------------------------------
  238.     frame->GetClientSize(&frame->DiffW, &frame->DiffH); frame->DiffW-=w; frame->DiffH-=h;
  239.     //----------------------------------------------------------------------------
  240.     //-- Help    : Load the help.%langid/%GetAppName().hhp (help.std/dbbrowse.hhp) file                                                                       ---
  241.     //----------------------------------------------------------------------------
  242.     frame->p_Help = new wxHtmlHelpController();   // construct the Help System
  243.     frame->p_Help->UseConfig(p_ProgramCfg);       // Don't rember what this was for
  244.     // You should recieve errors here for fr since there is no help.fr/ directory
  245.     if (!frame->p_Help->AddBook(s_LangHelp))      // Use the language set
  246.     { // You should recieve errors here for fr since there is no help.fr/ but a fr/ directory
  247.         wxLogMessage("-E-> %s : AddBook error : s_LangHelp(%s)",GetAppName().c_str(),s_LangHelp.c_str());
  248.     }
  249.     frame->pDoc->p_Help = frame->p_Help;          // Save the information to the document
  250.     //---------------------------------------------------------------------------------------
  251.     frame->Show(TRUE);                            // Show the frame
  252.     SetTopWindow(frame);                          // At this point the frame can be seen
  253.     //---------------------------------------------------------------------------------------
  254.     // If you need a "Splash Screen" because of a long OnNewDocument, do it here
  255.     if (!frame->pDoc->OnNewDocument())
  256.         frame->Close(TRUE);
  257.     // Kill a "Splash Screen" because OnNewDocument, if you have one
  258.     //---------------------------------------------------------------------------------------
  259.     p_ProgramCfg->Flush(TRUE);        // save the configuration
  260.     return TRUE;
  261. } // bool MainApp::OnInit(void)
  262.  
  263. //----------------------------------------------------------------------------------------
  264. // My frame constructor
  265. //----------------------------------------------------------------------------------------
  266. MainFrame::MainFrame(wxFrame *frame, char *title,  const wxPoint& pos, const wxSize& size):
  267. wxFrame(frame, -1, title,  pos, size)
  268. {
  269.     p_Splitter = NULL; pDoc = NULL; p_Help = NULL;    // Keep the Pointers clean !
  270.     //--- Everything else is done in MainApp::OnInit() --------------------------------------
  271. }
  272.  
  273. //----------------------------------------------------------------------------------------
  274. MainFrame::~MainFrame(void)
  275. {
  276.     // Close the help frame; this will cause the config data to get written.
  277.     if (p_Help->GetFrame()) // returns NULL if no help frame active
  278.         p_Help->GetFrame()->Close(TRUE);
  279.     delete p_Help;  // Memory Leak
  280.     p_Help = NULL;
  281.     // save the control's values to the config
  282.     if (p_ProgramCfg == NULL)
  283.         return;
  284.     // save the frame position before it is destroyed
  285.     int x, y, w, h;
  286.     GetPosition(&x, &y);
  287.     GetClientSize(&w, &h); w -= DiffW; h -= DiffH;
  288.     p_ProgramCfg->Write("/MainFrame/x", (long) x);
  289.     p_ProgramCfg->Write("/MainFrame/y", (long) y);
  290.     p_ProgramCfg->Write("/MainFrame/w", (long) w);
  291.     p_ProgramCfg->Write("/MainFrame/h", (long) h);
  292.     p_ProgramCfg->Write("/MainFrame/Sash", (long) pDoc->Sash);
  293.     // clean up: Set() returns the active config object as Get() does, but unlike
  294.     // Get() it doesn't try to create one if there is none (definitely not what
  295.     // we want here!)
  296.     // delete wxConfigBase::Set((wxConfigBase *) NULL);
  297.     p_ProgramCfg->Flush(TRUE);        // saves   Objekt
  298.     if (pDoc)                         // If we have a Valid Document
  299.         delete pDoc;                     // Cleanup (MainDoc::~MainDoc)
  300. } // MainFrame::~MainFrame(void)
  301.  
  302. //----------------------------------------------------------------------------------------
  303. void MainFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
  304. {
  305.     Close(TRUE);
  306. }
  307.  
  308. //----------------------------------------------------------------------------------------
  309. void MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
  310. {
  311.     wxString Temp0, Temp1;
  312.     Temp0.Printf(_("%s\nMark Johnson\nBerlin, Germany\nwxWindows@mj10777.de\n (c) 2000"),p_ProgramCfg->GetAppName().c_str());
  313.     Temp1.Printf(_("About %s"),p_ProgramCfg->GetAppName().c_str());
  314.     wxMessageDialog dialog(this, Temp0,Temp1,wxOK|wxCANCEL);
  315.     dialog.ShowModal();
  316. }
  317.  
  318. //----------------------------------------------------------------------------------------
  319. void MainFrame::OnHelp(wxCommandEvent& WXUNUSED(event))
  320. {
  321.     p_Help->Display("Main page");
  322. }
  323. //----------------------------------------------------------------------------------------
  324.