#include <time.h>
#include "pmMainframe.h"
#include "pmBasicframe.h"
#include "pmBasicdlg.h"
#include "pmCanvas.h"
pmMainframe::pmMainframe
( wxWindow * parent,
const wxChar *title, int xpos, int ypos, int width, int height)
: wxFrame( parent, -1, title,
wxPoint(xpos, ypos),
wxSize(width, height))
{
theText = (wxTextCtrl *) NULL;
menuBar = (wxMenuBar *) NULL;
CreateStatusBar(3);
connectStatus = false;
logFile = "pmLog.txt";
lastCmd = "select now()";
theText = new wxTextCtrl(this,-1,wxEmptyString,wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
editMenu = new wxMenu;
editMenu->Append(MAIN_FONT, "Choose font","Select a font for the text control");
editMenu->Append(MAIN_NEWFRAME, "Create new text frame");
editMenu->Append(MAIN_NEWCANVAS, "Create new image frame");
editMenu->Append(MAIN_SAVE, "Save log","Save log to a text file");
editMenu->Append(MAIN_EXIT, "Quit");
dataMenu = new wxMenu;
dataMenu->Append(MAIN_CONNECT, "Connect...", "Connect to database");
dataMenu->Append(MAIN_DISCONNECT, "Disconnect...");
dataMenu->Append(MAIN_QUERY, "SQL...","Execute an SQL statement");
helpMenu = new wxMenu;
helpMenu->Append(MAIN_ABOUT, "About");
menuBar = new wxMenuBar;
menuBar->Append(editMenu, "&Frames");
menuBar->Append(dataMenu, "&SQL");
menuBar->Append(helpMenu, "&Help");
SetMenuBar(menuBar);
wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl(theText));
delete old_log;
time_t curtime = time (NULL);
wxString currentDate = asctime (localtime (&curtime));
currentDate.RemoveLast();
DATABASE = "DSN=PG_DB_PM;UID=david;PWD=nimrodel";
wxLogMessage("Start session %s Id is %d", currentDate.GetData(), this->GetId());
SetTitle(GetTitle() + " " + logFile);
}
pmMainframe::~pmMainframe()
{
}
void pmMainframe::OnSaveLog(void)
{
theText->SaveFile(logFile);
}
void pmMainframe::ChildMessage(wxString s)
{ theText->AppendText(s); }
void pmMainframe::OnExit (wxCommandEvent & event)
{
Close();
}
bool pmMainframe::GetConnectStatus(void)
{
return connectStatus;
}
void pmMainframe::SetConnectStatus(bool s)
{
connectStatus = s;
}
void pmMainframe::OnCloseWindow (wxCloseEvent& event)
{ wxString msg = "Close Warning: the text has changed"
"\nSelect OK to ignore changes for\n";
wxString con = "Connect Warning: still connected.\n"
"Please disconnect first.";
if (GetConnectStatus() == true)
{ wxMessageDialog
warnDialog (this, con, "Active connection", wxICON_HAND | wxOK | wxCANCEL);
warnDialog.ShowModal();
}
else
if ( theText->IsModified() == true)
{ wxMessageDialog
warnDialog ( this, msg, "File changed", wxICON_HAND | wxOK | wxCANCEL);
if (warnDialog.ShowModal() == wxID_OK)
{ Destroy();
}
}
else
Destroy();
}
void pmMainframe::OnChooseFont(wxCommandEvent & event)
{ wxFontData fontData;
wxFont theFont = theText->GetFont();
wxColour colour;
colour = theText->GetForegroundColour();
fontData.SetColour(colour);
fontData.SetInitialFont(theFont);
fontData.SetShowHelp(true);
wxFontDialog *dialog = new wxFontDialog(this, &fontData);
if (dialog->ShowModal() == wxID_OK)
{ fontData = dialog->GetFontData();
theFont = fontData.GetChosenFont();
theText->SetFont(theFont);
theText->SetForegroundColour(fontData.GetColour());
}
dialog->Destroy();
}
void pmMainframe::OnNewCanvas (wxCommandEvent & event)
{
wxString theTitle;
theTitle =
wxGetTextFromUser("Enter a title", "Input text", "NO NAME", this, -1,-1,TRUE);
pmCanvasframe * win = new pmCanvasframe(this);
win->Show(TRUE);
}
void pmMainframe::OnNewFrame (wxCommandEvent & event)
{
wxString theTitle;
theTitle =
wxGetTextFromUser("Enter a title", "Input text", "NO NAME", this, -1,-1,TRUE);
pmBasicframe * win = new pmBasicframe(this, theTitle, 150, 150, 450, 300);
win->Show(TRUE);
}
void pmMainframe::OnAbout(wxCommandEvent & event)
{
pmBasicdialog
aboutDialog ( this, -1,this->GetTitle(),wxPoint(100,100),wxSize(250, 300),
wxRESIZE_BORDER | wxDEFAULT_DIALOG_STYLE );
aboutDialog.ShowModal();
}
SQLRETURN pmMainframe::dbConnect(wxString connectString)
{ SQLRETURN retCode;
retCode = theDatabase.connect(connectString.c_str());
if (retCode == SQL_SUCCESS)
SetConnectStatus(true);
else
SetConnectStatus(false);
if (GetConnectStatus())
this->SetStatusText("Connected " + connectString, 2);
else
this->SetStatusText("Unable to connect", 2);
return retCode;
}
//Takes two hits to register disconnect
//Skip() added??
SQLRETURN pmMainframe::OnDBDisconnect(wxCommandEvent & event)
{ event.Skip(); //???? Why ????
return dbDisconnect();
}
SQLRETURN pmMainframe::dbDisconnect(void)
{ SQLRETURN retCode = SQL_SUCCESS;
if (GetConnectStatus())
{ retCode = theDatabase.disconnect();
SetConnectStatus(false);
}
else
this->SetStatusText("Not connected", 2);
return retCode;
}
SQLRETURN pmMainframe::OnExecSQLGrid(wxCommandEvent & event)
{ SQLRETURN retCode = SQL_SUCCESS;
wxString cmd;
if ( GetConnectStatus() )
{ pmSQLdlg * getSQL =
new pmSQLdlg (this,-1,"SQL Command",lastCmd, wxPoint(100,100), wxSize(450, 300),
wxRESIZE_BORDER | wxDEFAULT_DIALOG_STYLE);
if (getSQL->ShowModal() == wxID_OK)
{ cmd = getSQL->GetValue();
lastCmd = cmd;
retCode = theDatabase.execSQL(cmd.c_str(), theTable);
if (retCode == SQL_SUCCESS)
{ attribs = theTable.getAttribs();
wxLogMessage("%d rows, %d columns", attribs.cRows, attribs.cColumns);
if (attribs.cRows > 0)
{ pmGridframe * x = new pmGridframe(this, "testing", theTable, 20,20,200,200);
x->Show(TRUE);
}
else
wxLogMessage("SQL returned zero rows");
}
}
else wxLogMessage("Failed - SQL return code %d", retCode);
}
else
wxLogMessage("Cannot execute SQL - we are disconnected.");
return retCode;
}
void pmMainframe::OnDBStart(wxCommandEvent & event)
{ SQLRETURN rc;
pmSRCdlg * getLogon =
new pmSRCdlg (this,-1,"Log on (dsn,uid,pwd)", wxPoint(100,100), wxSize(450, 300),
wxRESIZE_BORDER | wxDEFAULT_DIALOG_STYLE);
if (getLogon->ShowModal() == wxID_OK)
{ wxString connectStr = getLogon->GetValue();
wxLogMessage("Connecting to %s", connectStr.c_str());
rc = dbConnect(connectStr);
if (rc == SQL_SUCCESS)
wxLogMessage("Connect OK");
else
wxLogMessage("Connect failed. SQL return code %d", rc);
}
else
wxLogMessage("Connect declined");
}
BEGIN_EVENT_TABLE (pmMainframe, wxFrame)
EVT_MENU ( MAIN_EXIT, pmMainframe::OnExit)
EVT_MENU ( MAIN_FONT, pmMainframe::OnChooseFont)
EVT_MENU ( MAIN_NEWFRAME, pmMainframe::OnNewFrame)
EVT_MENU ( MAIN_NEWCANVAS, pmMainframe::OnNewCanvas)
EVT_MENU ( MAIN_ABOUT, pmMainframe::OnAbout)
EVT_MENU ( MAIN_CONNECT, pmMainframe::OnDBStart)
EVT_MENU ( MAIN_DISCONNECT, pmMainframe::OnDBDisconnect)
EVT_MENU ( MAIN_QUERY, pmMainframe::OnExecSQLGrid)
EVT_MENU ( MAIN_SAVE, pmMainframe::OnSaveLog)
EVT_CLOSE( pmMainframe::OnCloseWindow)
END_EVENT_TABLE()