1//----------------------------------------------------------------------------------------
2// Name:        doc.cpp
3// Purpose:     Holds information for DBBrowser - (a do-it-yourself document)
4// Author:      Mark Johnson
5// Modified by: 19990808.mj10777
6// BJO        : Bart A.M. JOURQUIN
7// Created:     19990808
8// Copyright:   (c) Mark Johnson
9// Licence:     wxWindows license
10// RCS-ID:      $Id: doc.cpp 35650 2005-09-23 12:56:45Z MR $
11//----------------------------------------------------------------------------------------
12
13// For compilers that support precompilation, includes "wx/wx.h".
14#include "wx/wxprec.h"
15//----------------------------------------------------------------------------------------
16#ifdef __BORLANDC__
17#pragma hdrstop
18#endif
19//----------------------------------------------------------------------------------------
20#ifndef WX_PRECOMP
21#include "wx/wx.h"
22#endif
23//----------------------------------------------------------------------------------------
24//-- all #includes that every .cpp needs             ----19990807.mj10777 ----------------
25//----------------------------------------------------------------------------------------
26#include "std.h"       // sorgsam Pflegen !
27//----------------------------------------------------------------------------------------
28//-- Some Global Vars for all Files (extern in ?.h needed) -------------------------------
29// Global structure for holding ODBC connection information
30extern wxDbConnectInf DbConnectInf;
31
32//----------------------------------------------------------------------------------------
33wxConfigBase   *p_ProgramCfg;       // All Config and Path information
34wxLogTextCtrl  *p_LogBook;          // All Log messages
35wxString        LogBuf;             // String for all Logs
36
37//----------------------------------------------------------------------------------------
38MainDoc::MainDoc()
39{
40    db_Br          = NULL;
41    p_DSN          = NULL;
42    i_DSN          = 0;
43    p_Splitter     = NULL;
44    p_MainFrame    = NULL;
45    p_PgmCtrl      = NULL;               // Is not active
46    p_DBTree       = NULL;
47    p_DBGrid       = NULL;
48    p_LogWin       = NULL;
49    p_TabArea      = NULL;
50    p_PageArea     = NULL;
51    i_TabNr        = 0;
52    i_PageNr       = 0;
53    s_BColour      = _T("WHEAT");
54    ft_Doc         = new wxFont(wxSystemSettings::GetFont(wxSYS_SYSTEM_FONT));
55}
56
57//----------------------------------------------------------------------------------------
58MainDoc::~MainDoc()
59{
60    p_TabArea->Show(false);    // Deactivate the Window
61    p_PageArea->Show(false);    // Deactivate the Window
62
63    // ----------------------------------------------------------
64    // -E-> The Tree Controls take to long to close : Why ??
65    // ----------------------------------------------------------
66    delete ft_Doc;     ft_Doc  = NULL;
67    delete p_PgmCtrl;  p_PgmCtrl = NULL;
68    delete [] p_DSN;
69    delete p_DBTree;
70    delete p_TabArea;  p_TabArea  = NULL;
71    delete p_PageArea; p_PageArea = NULL;
72    delete p_Splitter; p_Splitter = NULL;
73    delete [] db_Br;   db_Br      = NULL;
74    //  wxMessageBox("~MainDoc");
75}
76
77//----------------------------------------------------------------------------------------
78bool MainDoc::OnNewDocument()
79{
80    wxStopWatch sw;
81    //---------------------------------------------------------------------------------------
82    if (!OnInitView())
83        return false;
84    p_PgmCtrl->OnPopulate();
85    //---------------------------------------------------------------------------------------
86    wxLogMessage(_("-I-> MainDoc::OnNewDocument() - End - Time needed : %ld ms"),sw.Time());
87    return true;
88}
89
90//----------------------------------------------------------------------------------------
91bool MainDoc::OnInitView()
92{
93    Sash = p_ProgramCfg->Read(_T("/MainFrame/Sash"), 200);
94    // wxMessageBox("OnInitView() - Begin ","-I->MainDoc::OnInitView");
95    //---------------------------------------------------------------------------------------
96    // create "workplace" window
97    //---------------------------------------------------------------------------------------
98    p_TabArea = new wxTabbedWindow(); // Init the Pointer
99    p_TabArea->Create(p_Splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
100    //---------------------------------------------------------------------------------------
101    p_PgmCtrl = new PgmCtrl(p_TabArea, TREE_CTRL_PGM,wxDefaultPosition, wxDefaultSize,
102        wxTR_HAS_BUTTONS | wxSUNKEN_BORDER);
103    p_PgmCtrl->i_TabArt = 0; // 0 = Tab ; 1 = Page
104    p_PgmCtrl->i_ViewNr = p_TabArea->GetTabCount()-1;
105    //---------------------------------------------------------------------------------------
106    wxBitmap *p_FolderClose = new wxBitmap(_T("PgmCtrl")); //, wxBITMAP_TYPE_BMP_RESOURCE); // BJO20000115
107    //---------------------------------------------------------------------------------------
108    p_TabArea->AddTab(p_PgmCtrl,_T("PgmCtrl"),p_FolderClose);
109    delete p_FolderClose;      // Memory leak
110    p_FolderClose = NULL;
111    wxUnusedVar(p_FolderClose);
112    //---------------------------------------------------------------------------------------
113    // now create "output" window
114    //---------------------------------------------------------------------------------------
115    p_PageArea = new wxPagedWindow();  // Init the Pointer
116    p_PageArea->Create(p_Splitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
117    //---------------------------------------------------------------------------------------
118    p_LogWin = new wxTextCtrl(p_PageArea,wxID_ANY,wxEmptyString,
119        wxDefaultPosition, wxDefaultSize,wxTE_MULTILINE );
120    p_LogWin->SetFont(* ft_Doc);
121    // Don't forget ! This is always : i_TabArt = 0 ; i_ViewNr = 1;
122    //---------------------------------------------------------------------------------------
123    p_LogBook = new wxLogTextCtrl(p_LogWin); // make p_LogWin the LogBook
124    p_LogBook->SetActiveTarget(p_LogBook);
125    p_LogBook->SetTimestamp( NULL );
126    //---------------------------------------------------------------------------------------
127    p_PageArea->AddTab(p_LogWin,_("LogBook"), _T("what is this?") );
128    i_TabNr  = p_TabArea->GetTabCount()-1;  // Add one when a new AddTab is done;
129    i_PageNr = p_PageArea->GetTabCount()-1; // Add one when a new AddTab is done;
130    //---------------------------------------------------------------------------------------
131    p_PgmCtrl->pDoc = this;
132    p_TabArea->SetActiveTab(i_PageNr);
133    //---------------------------------------------------------------------------------------
134    p_Splitter->Initialize(p_TabArea);
135    p_Splitter->SplitHorizontally(p_TabArea,p_PageArea,Sash);
136    //---------------------------------------------------------------------------------------
137    // if (!OnInitODBC())
138    //  return false;
139    OnInitODBC();
140    //---------------------------------------------------------------------------------------
141#if wxUSE_STATUSBAR
142    Temp0.Printf(_("-I-> MainDoc::OnInitView() - End - %d DSN's found"),i_DSN);
143    p_MainFrame->SetStatusText(Temp0, 0);
144    wxLogMessage(Temp0);
145#endif // wxUSE_STATUSBAR
146    return true;
147}
148
149//----------------------------------------------------------------------------------------
150bool MainDoc::OnInitODBC()
151{
152    wxChar Dsn[SQL_MAX_DSN_LENGTH+1];
153    wxChar DsDesc[254+1]; // BJO20002501 instead of 512
154    Temp0 = wxEmptyString;
155    i_DSN = 0;       // Counter
156    int i;
157    //---------------------------------------------------------------------------------------
158    // Initialize the ODBC Environment for Database Operations
159
160    if (!DbConnectInf.AllocHenv())
161    {
162        return false;
163    }
164
165    //---------------------------------------------------------------------------------------
166    const wxChar sep = 3; // separator character used in string between DSN and DsDesc
167    wxSortedArrayString s_SortDSNList, s_SortDsDescList;
168    // BJO-20000127
169    // In order to have same sort result on both Dsn and DsDesc, create a 'keyed' string.
170    // The key will be removed after sorting
171    wxString KeyString;
172    //---------------------------------------------------------------------------------------
173    while (wxDbGetDataSource(DbConnectInf.GetHenv(), Dsn, SQL_MAX_DSN_LENGTH, DsDesc, 254))
174    {
175        i_DSN++;   // How many Dsn have we ?
176        KeyString.Printf(_T("%s%c%s"),Dsn, sep, DsDesc);
177        s_SortDSNList.Add(Dsn);
178        s_SortDsDescList.Add(KeyString);
179    }
180
181    //---------------------------------------------------------------------------------------
182    // Allocate n ODBC-DSN objects to hold the information
183    // Allocate n wxDatabase objects to hold the column information
184    p_DSN = new DSN[i_DSN];  //BJO
185    db_Br = new BrowserDB[i_DSN];
186    for (i=0;i<i_DSN;i++)
187    {
188        KeyString = s_SortDsDescList[i];
189        KeyString = KeyString.AfterFirst(sep);
190
191        // ODBC-DSN object
192        (p_DSN+i)->Dsn = s_SortDSNList[i];
193        (p_DSN+i)->Drv = KeyString;
194        (p_DSN+i)->Usr = wxEmptyString;
195        (p_DSN+i)->Pas = wxEmptyString;
196        Temp0.Printf(_T("%02d) Dsn(%s) DsDesc(%s)"),i,(p_DSN+i)->Dsn.c_str(),(p_DSN+i)->Drv.c_str());
197        wxLogMessage(Temp0);
198
199        // wxDataBase object
200        (db_Br+i)->p_LogWindow = p_LogWin;
201        (db_Br+i)->ODBCSource  = (p_DSN+i)->Dsn;
202        (db_Br+i)->UserName    = (p_DSN+i)->Usr;
203        (db_Br+i)->Password    = (p_DSN+i)->Pas;
204        (db_Br+i)->pDoc        = this;
205        (db_Br+i)->i_Which     = i;
206    }
207
208    DbConnectInf.FreeHenv();
209
210    //---------------------------------------------------------------------------------------
211    if (!i_DSN)
212    {
213        wxString message = _("No Dataset names found in ODBC!\n");
214        message += _("           Program will exit!\n\n");
215        message += _("                       Ciao");
216        wxMessageBox( message,_("-E-> Fatal situation"));
217        return false;
218    }
219    //---------------------------------------------------------------------------------------
220    return true;
221}
222
223//----------------------------------------------------------------------------------------
224bool MainDoc::OnChosenDSN(int Which)
225{
226    // wxLogMessage("OnChosenDSN(%d) - Begin",Which);
227    //---------------------------------------------------------------------------------------
228    if (p_DBTree != NULL)
229    {
230        p_TabArea->Show(false);    // Deactivate the Window
231        p_TabArea->RemoveTab(p_DBTree->i_ViewNr);
232        p_TabArea->Show(true);     // Activate the Window
233        OnChosenTbl(77,wxEmptyString);
234    }
235    //-------------------------
236    p_TabArea->Show(false);    // Deactivate the Window
237    p_DBTree = new DBTree(p_TabArea, TREE_CTRL_DB,wxDefaultPosition, wxDefaultSize,
238        wxTR_HAS_BUTTONS | wxSUNKEN_BORDER);
239    p_TabArea->AddTab(p_DBTree,(p_DSN+Which)->Dsn,_T(" ? "));
240    p_DBTree->i_ViewNr = p_TabArea->GetTabCount()-1;
241    p_TabArea->Show(true);    // Deactivate the Window
242    p_DBTree->i_Which  = Which;
243    p_DBTree->s_DSN    = (p_DSN+Which)->Dsn;
244    p_DBTree->i_TabArt = 0;
245    p_DBTree->pDoc     = this;
246    p_DBTree->OnPopulate();
247    p_TabArea->SetActiveTab(p_DBTree->i_ViewNr);
248    //---------------------------------------------------------------------------------------
249    // wxLogMessage("OnChosenDSN(%d) - End",Which);
250    return true;
251}
252
253//----------------------------------------------------------------------------------------
254bool MainDoc::OnChosenTbl(int Tab,wxString Table)
255{
256    // wxLogMessage("OnChosenTbl(%d,%s)",Tab,Table.c_str());
257    //-------------------------
258    if (p_DBGrid != NULL)
259    {
260        if (p_DBGrid->i_TabArt == 0)
261        {
262            p_TabArea->Show(false);    // Deactivate the Window
263            p_TabArea->RemoveTab(p_DBGrid->i_ViewNr);
264            p_TabArea->Show(true);     // Activate the Window
265        }
266        if (p_DBGrid->i_TabArt == 1)
267        {
268            p_PageArea->Show(false);   // Deactivate the Window
269            p_PageArea->RemoveTab(p_DBGrid->i_ViewNr);
270            p_PageArea->Show(true);    // Activate the Window
271        }
272        p_DBGrid = NULL;
273        delete p_DBGrid;
274    }
275    if (Tab == 77)               // Delete only
276        return true;
277    //-------------------------
278    if (Tab == 0)  // Tabview
279    {
280        p_TabArea->Show(false);    // Deactivate the Window
281        p_DBGrid = new DBGrid(p_TabArea,GRID_CTRL_DB,wxDefaultPosition, wxDefaultSize,
282            wxSUNKEN_BORDER);
283        p_TabArea->AddTab(p_DBGrid, Table, wxEmptyString);
284        p_DBGrid->i_ViewNr = p_TabArea->GetTabCount()-1;
285        p_DBGrid->pDoc       = this;
286        p_DBGrid->db_Br      = db_Br;
287        p_DBGrid->OnTableView(Table);
288        p_TabArea->SetActiveTab(p_DBGrid->i_ViewNr);
289        p_TabArea->Show(true);     // Activate the Window
290    }
291    if (Tab == 1)  // Pageview
292    {
293        p_PageArea->Show(false);   // Deactivate the Window
294        p_DBGrid = new DBGrid(p_PageArea,GRID_CTRL_DB,wxDefaultPosition, wxDefaultSize,
295            wxSUNKEN_BORDER);
296        p_PageArea->AddTab(p_DBGrid, Table, wxEmptyString);
297        p_DBGrid->i_ViewNr = p_PageArea->GetTabCount()-1;
298        p_DBGrid->pDoc       = this;
299        p_DBGrid->db_Br      = db_Br;
300        p_DBGrid->i_Which    = p_DBTree->i_Which;
301        p_PageArea->Show(true);    // Activate the Window
302        p_DBGrid->OnTableView(Table);
303        p_PageArea->SetActiveTab(p_DBGrid->i_ViewNr);
304    }
305    p_DBGrid->i_TabArt = Tab;
306    //--------------------------
307    return true;
308}
309
310//----------------------------------------------------------------------------------------
311void MainDoc::OnLeer(wxString Aufrufer)
312{
313    // Temp0.Printf(_("\nMainDoc::OnLeer(%s) : auch diese funktion steht eines Tages zur Verf�gung !"),Aufrufer.c_str());
314    Temp0.Printf(_("\nMainDoc::OnLeer(%s) : even this function will one day be available !"),Aufrufer.c_str());
315    wxLogMessage(Temp0);  Temp0.Empty();
316    return;
317}
318
319//----------------------------------------------------------------------------------------
320BEGIN_EVENT_TABLE(DocSplitterWindow, wxSplitterWindow)
321END_EVENT_TABLE()
322
323//----------------------------------------------------------------------------------------
324DocSplitterWindow::DocSplitterWindow(wxWindow *parent, wxWindowID id) : wxSplitterWindow(parent, id)
325{ // Define a constructor for my p_Splitter
326}
327//----------------------------------------------------------------------------------------
328