#include "wx/log.h"
#endif //WX_PRECOMP
+#include "wx/display.h"
#include "wx/recguard.h"
#ifdef __WXUNIVERSAL__
wxPopupTransientWindow *m_popup;
DECLARE_EVENT_TABLE()
- DECLARE_NO_COPY_CLASS(wxPopupWindowHandler)
+ wxDECLARE_NO_COPY_CLASS(wxPopupWindowHandler);
};
class wxPopupFocusHandler : public wxEvtHandler
wxPopupTransientWindow *m_popup;
DECLARE_EVENT_TABLE()
- DECLARE_NO_COPY_CLASS(wxPopupFocusHandler)
+ wxDECLARE_NO_COPY_CLASS(wxPopupFocusHandler);
};
// ----------------------------------------------------------------------------
void wxPopupWindowBase::Position(const wxPoint& ptOrigin,
const wxSize& size)
{
- wxSize sizeScreen = wxGetDisplaySize(),
- sizeSelf = GetSize();
+ // determine the position and size of the screen we clamp the popup to
+ wxPoint posScreen;
+ wxSize sizeScreen;
+
+ const int displayNum = wxDisplay::GetFromPoint(ptOrigin);
+ if ( displayNum != wxNOT_FOUND )
+ {
+ const wxRect rectScreen = wxDisplay(displayNum).GetGeometry();
+ posScreen = rectScreen.GetPosition();
+ sizeScreen = rectScreen.GetSize();
+ }
+ else // outside of any display?
+ {
+ // just use the primary one then
+ posScreen = wxPoint(0, 0);
+ sizeScreen = wxGetDisplaySize();
+ }
+
+
+ const wxSize sizeSelf = GetSize();
// is there enough space to put the popup below the window (where we put it
// by default)?
wxCoord y = ptOrigin.y + size.y;
- if ( y + sizeSelf.y > sizeScreen.y )
+ if ( y + sizeSelf.y > posScreen.y + sizeScreen.y )
{
// check if there is enough space above
if ( ptOrigin.y > sizeSelf.y )
// now check left/right too
wxCoord x = ptOrigin.x;
-
+
if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft )
{
// shift the window to the left instead of the right.
else
x += size.x;
-
- if ( x + sizeSelf.x > sizeScreen.x )
+
+ if ( x + sizeSelf.x > posScreen.x + sizeScreen.x )
{
// check if there is enough space to the left
if ( ptOrigin.x > sizeSelf.x )
Show();
- // There is is a problem if these are still in use
+ // There is a problem if these are still in use
wxASSERT(!m_handlerFocus || !m_handlerFocus->GetNextHandler());
wxASSERT(!m_handlerPopup || !m_handlerPopup->GetNextHandler());
m_focus->SetFocus();
}
-#if defined( __WXMSW__ ) || defined( __WXMAC__)
+#if defined( __WXMSW__ ) || (defined( __WXMAC__) && wxOSX_USE_CARBON)
// MSW doesn't allow to set focus to the popup window, but we need to
// subclass the window which has the focus, and not winFocus passed in or
// otherwise everything else breaks down
void wxPopupComboWindow::OnDismiss()
{
- m_combo->OnPopupDismiss();
+ m_combo->OnPopupDismiss(true);
}
void wxPopupComboWindow::OnKeyDown(wxKeyEvent& event)
{
- m_combo->ProcessEvent(event);
+ m_combo->ProcessWindowEvent(event);
}
#endif // wxUSE_COMBOBOX && defined(__WXUNIVERSAL__)
default:
// forgot to update the switch after adding a new hit test code?
- wxFAIL_MSG( _T("unexpected HitTest() return value") );
+ wxFAIL_MSG( wxT("unexpected HitTest() return value") );
// fall through
case wxHT_WINDOW_CORNER: