/////////////////////////////////////////////////////////////////////////////
-// Name: busyinfo.cpp
+// Name: src/generic/busyinfo.cpp
// Purpose: Information window when app is busy
// Author: Vaclav Slavik
// Copyright: (c) 1999 Vaclav Slavik
-// Licence: wxWindows Licence
+// RCS-ID: $Id$
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "busyinfo.h"
-#endif
-
#include "wx/wxprec.h"
-#ifdef __BORDLANDC__
+#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_BUSYINFO
+// for all others, include the necessary headers
+#ifndef WX_PRECOMP
+ #include "wx/frame.h"
+ #include "wx/stattext.h"
+ #include "wx/panel.h"
+ #include "wx/utils.h"
+#endif
+
#include "wx/busyinfo.h"
-#include "wx/stattext.h"
-#include "wx/panel.h"
-#include "wx/utils.h"
+
+class WXDLLEXPORT wxInfoFrame : public wxFrame
+{
+public:
+ wxInfoFrame(wxWindow *parent, const wxString& message);
+
+private:
+ DECLARE_NO_COPY_CLASS(wxInfoFrame)
+};
wxInfoFrame::wxInfoFrame(wxWindow *parent, const wxString& message)
- : wxFrame(parent, -1, wxT(""), wxPoint(0, 0), wxSize(400, 80), wxTHICK_FRAME | wxSIMPLE_BORDER | wxFRAME_TOOL_WINDOW)
+ : wxFrame(parent, wxID_ANY, wxT("Busy"),
+ wxDefaultPosition, wxDefaultSize,
+#if defined(__WXX11__)
+ wxRESIZE_BORDER
+#else
+ wxSIMPLE_BORDER
+#endif
+ | wxFRAME_TOOL_WINDOW)
{
- wxPanel *p = new wxPanel( this );
- wxStaticText *s = new wxStaticText( p, -1, message, wxPoint(20, 20), wxSize(360, 40), wxALIGN_CENTER );
+ wxPanel *panel = new wxPanel( this );
+ wxStaticText *text = new wxStaticText(panel, wxID_ANY, message);
+
+ panel->SetCursor(*wxHOURGLASS_CURSOR);
+ text->SetCursor(*wxHOURGLASS_CURSOR);
+
+ // make the frame of at least the standard size (400*80) but big enough
+ // for the text we show
+ wxSize sizeText = text->GetBestSize();
+#ifdef __WXPM__
+ int nX = 0;
+ int nY = 0;
+ int nWidth = 0;
+ int nHeight = 0;
+ int nParentHeight = parent->GetClientSize().y;
+ int nParentWidth = parent->GetClientSize().x;
+ int nColor;
+
+ SetBackgroundColour(wxT("WHITE"));
+ nColor = (LONG)GetBackgroundColour().GetPixel();
+
+ ::WinSetPresParam( GetHwnd()
+ ,PP_BACKGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&nColor
+ );
+ panel->SetBackgroundColour(wxT("WHITE"));
+ nColor = (LONG)panel->GetBackgroundColour().GetPixel();
+
+ ::WinSetPresParam( GetHwndOf(panel)
+ ,PP_BACKGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&nColor
+ );
+ nWidth = wxMax(sizeText.x, 340) + 60;
+ nHeight = wxMax(sizeText.y, 40) + 40;
+ nX = (nParentWidth - nWidth) / 2;
+ nY = (nParentHeight / 2) - (nHeight / 2);
+ nY = nParentHeight - (nY + nHeight);
+ ::WinSetWindowPos( m_hFrame
+ ,HWND_TOP
+ ,nX
+ ,nY
+ ,nWidth
+ ,nHeight
+ ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE
+ );
+ text->SetBackgroundColour(wxT("WHITE"));
+ nColor = (LONG)text->GetBackgroundColour().GetPixel();
+
+ ::WinSetPresParam( GetHwndOf(text)
+ ,PP_BACKGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&nColor
+ );
+ text->Center(wxBOTH);
+#else
+ SetClientSize(wxMax(sizeText.x, 340) + 60, wxMax(sizeText.y, 40) + 40);
+
+ // need to size the panel correctly first so that text->Centre() works
+ panel->SetSize(GetClientSize());
+
+ text->Centre(wxBOTH);
Centre(wxBOTH);
- p->SetCursor(*wxHOURGLASS_CURSOR);
- s->SetCursor(*wxHOURGLASS_CURSOR);
+#endif
}
-wxBusyInfo::wxBusyInfo(const wxString& message) : wxObject()
+wxBusyInfo::wxBusyInfo(const wxString& message, wxWindow *parent)
{
- m_InfoFrame = new wxInfoFrame( (wxWindow*) NULL, message);
- m_InfoFrame->Show(TRUE);
- wxYield();
+ m_InfoFrame = new wxInfoFrame( parent, message);
+ if ( parent && parent->HasFlag(wxSTAY_ON_TOP) )
+ {
+ // we must have this flag to be in front of our parent if it has it
+ m_InfoFrame->SetWindowStyleFlag(wxSTAY_ON_TOP);
+ }
+
+ m_InfoFrame->Show(true);
m_InfoFrame->Refresh();
+ m_InfoFrame->Update();
+
+#ifdef __WXGTK20__
+ // FIXME: this is pretty bad, as any call to Yield(), but without it, the
+ // static text is never shown and neither gdk_display_flush() nor
+ // gdk_display_sync() nor gdk_window_process_updates() helps
+ wxMilliSleep(100);
wxYield();
+#endif
}
wxBusyInfo::~wxBusyInfo()
{
- m_InfoFrame->Show(FALSE);
+ m_InfoFrame->Show(false);
m_InfoFrame->Close();
- wxYield();
}
-#endif
- // wxUSE_BUSYINFO
-
+#endif // wxUSE_BUSYINFO