]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/log.cpp
* wxMemory*Stream link problem fix.
[wxWidgets.git] / src / common / log.cpp
index 5f9ac6c643d5f778eb059a8b7b16540481b5de6a..62a70119a02b2e005db196c73267e37b2f956257 100644 (file)
 #include  <stdlib.h>
 #include  <time.h>
 
-// _WINDOWS_ is defined when windows.h is included,
-// __WINDOWS__ is defined for MS Windows compilation
-#if       defined(__WINDOWS__) && !defined(_WINDOWS_)
+#ifdef  __WXMSW__
   #include  <windows.h>
-#endif  //windows.h
+#else   //Unix
+  #include  <signal.h>
+#endif  //Win/Unix
 
 // ----------------------------------------------------------------------------
 // non member functions
@@ -130,7 +130,7 @@ void wxLogVerbose(wxTString strFormat, ...)
 }
 
 // debug functions
-#ifdef __DEBUG__
+#ifdef __WXDEBUG__
 #define IMPLEMENT_LOG_DEBUG_FUNCTION(level)                       \
   void wxLog##level(const char *szFormat, ...)                    \
   {                                                               \
@@ -210,7 +210,7 @@ wxLog::wxLog()
   m_bHasMessages = FALSE;
   m_bVerbose     = FALSE;
   m_szTimeFormat = "[%d/%b/%y %H:%M:%S] ";
-  m_ulTraceMask  = (wxTraceMask)-1;        // set all bits
+  m_ulTraceMask  = (wxTraceMask)0;        // -1 to set all bits
 }
 
 wxLog *wxLog::GetActiveTarget() 
@@ -291,7 +291,7 @@ void wxLog::DoLog(wxLogLevel level, const char *szString)
 
     case wxLOG_Trace:
     case wxLOG_Debug:
-      #ifdef __DEBUG__
+      #ifdef __WXDEBUG__
         #ifdef  __WIN32__
           // in addition to normal logging, also send the string to debugger
           // (don't prepend "Debug" here: it will go to debug window anyhow)
@@ -359,7 +359,7 @@ void wxLogStream::DoLogString(const char *szString)
 // ----------------------------------------------------------------------------
 wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl)
 // @@@ TODO: in wxGTK wxTextCtrl doesn't derive from streambuf
-#ifndef __GTK__
+#ifndef __WXGTK__
              : wxLogStream(new ostream(pTextCtrl))
 #endif //GTK
 {
@@ -367,7 +367,7 @@ wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl)
 
 wxLogTextCtrl::~wxLogTextCtrl()
 {
-  #ifndef __GTK__
+  #ifndef __WXGTK__
     delete m_ostr;
   #endif //GTK
 }
@@ -448,7 +448,7 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString)
 
     case wxLOG_Trace:
     case wxLOG_Debug:
-      #ifdef __DEBUG__
+      #ifdef __WXDEBUG__
         #ifdef  __WIN32__
           OutputDebugString(szString);
           OutputDebugString("\n\r");
@@ -496,6 +496,7 @@ public:
 
   // menu callbacks
   void OnClose(wxCommandEvent& event);
+  void OnCloseWindow(wxCloseEvent& event);
   void OnSave (wxCommandEvent& event);
   void OnClear(wxCommandEvent& event);
 
@@ -521,12 +522,16 @@ BEGIN_EVENT_TABLE(wxLogFrame, wxFrame)
   EVT_MENU(Menu_Save,  wxLogFrame::OnSave)
   EVT_MENU(Menu_Clear, wxLogFrame::OnClear)
 
-  EVT_CLOSE(wxLogFrame::OnClose)
+  EVT_CLOSE(wxLogFrame::OnCloseWindow)
 END_EVENT_TABLE() 
 
 wxLogFrame::wxLogFrame(const char *szTitle)
           : wxFrame(NULL, -1, szTitle)
 {
+  // we don't want to be a top-level frame because it would prevent the
+  // application termination when all other frames are closed
+  wxTopLevelWindows.DeleteObject(this);
+
   // @@ kludge: wxSIMPLE_BORDER is simply to prevent wxWindows from creating
   //    a rich edit control instead of a normal one we want
   m_pTextCtrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition,
@@ -559,6 +564,12 @@ void wxLogFrame::OnClose(wxCommandEvent& event)
   Show(FALSE);
 }
 
+void wxLogFrame::OnCloseWindow(wxCloseEvent& event)
+{
+  // just hide the window
+  Show(FALSE);
+}
+
 void wxLogFrame::OnSave(wxCommandEvent& event)
 {
   // get the file name
@@ -572,9 +583,9 @@ void wxLogFrame::OnSave(wxCommandEvent& event)
   // open file
   // ---------
   wxFile file;
-  Bool bOk;
+  bool bOk;
   if ( wxFile::Exists(szFileName) ) {
-    Bool bAppend;
+    bool bAppend;
     wxString strMsg;
     strMsg.Printf(_("Append log to file '%s' "
                     "(choosing [No] will overwrite it)?"), szFileName);
@@ -608,8 +619,10 @@ void wxLogFrame::OnSave(wxCommandEvent& event)
   // retrieve text and save it
   // -------------------------
   
+#ifdef __WXGTK__
   // @@@@ TODO: no GetNumberOfLines and GetLineText in wxGTK yet
-#ifndef __GTK__
+  wxLogError("Sorry, this function is not implemented under GTK");
+#else
   int nLines = m_pTextCtrl->GetNumberOfLines();
   for ( int nLine = 0; bOk && nLine < nLines; nLine++ ) {
     bOk = file.Write(m_pTextCtrl->GetLineText(nLine) + wxTextFile::GetEOL());
@@ -630,13 +643,16 @@ void wxLogFrame::OnClear(wxCommandEvent& event)
   m_pTextCtrl->Clear();
 }
 
-wxLogWindow::wxLogWindow(const wxTString& strTitle)
+wxLogWindow::wxLogWindow(const wxTString& strTitle, bool bShow)
 {
   m_pOldLog = wxLog::GetActiveTarget();
   m_pLogFrame = new wxLogFrame(strTitle);
+  
+  if ( bShow )
+    m_pLogFrame->Show(TRUE);
 }
 
-void wxLogWindow::Show(Bool bShow)
+void wxLogWindow::Show(bool bShow)
 {
   m_pLogFrame->Show(bShow);
 }
@@ -662,8 +678,10 @@ void wxLogWindow::DoLogString(const char *szString)
   wxTextCtrl *pText = m_pLogFrame->TextCtrl();
 
   // remove selection (WriteText is in fact ReplaceSelection)
-  long nLen = pText->GetLastPosition();
-  pText->SetSelection(nLen, nLen);
+  #ifdef __WXMSW__
+    long nLen = pText->GetLastPosition();
+    pText->SetSelection(nLen, nLen);
+  #endif // Windows
 
   pText->WriteText(szString);
   pText->WriteText("\n"); // "\n" ok here (_not_ "\r\n")
@@ -733,7 +751,7 @@ static void wxLogWrap(FILE *f, const char *pszPrefix, const char *psz)
 // get error code from syste
 unsigned long wxSysErrorCode()
 {
-  #ifdef  __WINDOWS__
+  #ifdef  __WXMSW__
     #ifdef  __WIN32__
       return ::GetLastError();
     #else   //WIN16
@@ -751,7 +769,7 @@ const char *wxSysErrorMsg(unsigned long nErrCode)
   if ( nErrCode == 0 )
     nErrCode = wxSysErrorCode();
 
-  #ifdef  __WINDOWS__
+  #ifdef  __WXMSW__
     #ifdef  __WIN32__
       static char s_szBuf[LOG_BUFFER_SIZE / 2];
 
@@ -791,7 +809,7 @@ const char *wxSysErrorMsg(unsigned long nErrCode)
 // debug helper
 // ----------------------------------------------------------------------------
 
-#ifdef  __DEBUG__
+#ifdef  __WXDEBUG__
 
 // this function is called when an assert fails
 void wxOnAssert(const char *szFile, int nLine, const char *szMsg)
@@ -812,29 +830,29 @@ void wxOnAssert(const char *szFile, int nLine, const char *szMsg)
   // send it to the normal log destination
   wxLogDebug(szBuf);
 
-  #ifdef  __WINDOWS__
-    if ( !s_bNoAsserts ) {
-      strcat(szBuf, _("\nDo you want to stop the program?"
-                      "\nYou can also choose [Cancel] to suppress "
-                      "further warnings."));
+  if ( !s_bNoAsserts ) {
+    strcat(szBuf, _("\nDo you want to stop the program?"
+                    "\nYou can also choose [Cancel] to suppress "
+                    "further warnings."));
 
-      switch ( ::MessageBox(NULL, szBuf, _("Debug"), 
-                            MB_YESNOCANCEL | MB_ICONINFORMATION) ) {
-        case IDYES:
+    switch ( wxMessageBox(szBuf, _("Debug"),
+                          wxYES_NO | wxCANCEL | wxICON_STOP ) ) {
+      case wxYES:
+        #ifdef __WXMSW__
           DebugBreak();
-          break;
+        #else // Unix
+          raise(SIGTRAP);
+        #endif // Win/Unix
+        break;
 
-        case IDCANCEL:
-          s_bNoAsserts = TRUE;
-          break;
-      }
+      case wxCANCEL:
+        s_bNoAsserts = TRUE;
+        break;
+        
+      //case wxNO: nothing to do
     }
-  #else   // !Windows
-    // @@@@ don't know how to start the debugger under generic Unix
-    s_bNoAsserts = TRUE; // suppress 'unused var' warning
-    abort();
-  #endif  // Windows/!Windows
+  }
 }
 
-#endif  //DEBUG
+#endif  //WXDEBUG