1. more keyboard navigation fixes - seems to work now

2. wxPanel now remembers the last control which had focus, so it's restored
   to it when the focus returns to the panel (very handy IMHO)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1604 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-02-04 23:21:27 +00:00
parent 4adfb4e34e
commit 341c92a8b4
9 changed files with 265 additions and 157 deletions

View File

@@ -21,7 +21,6 @@
#endif
#ifndef WX_PRECOMP
#include <stdio.h>
#include "wx/setup.h"
#include "wx/menu.h"
#include "wx/dc.h"
@@ -36,6 +35,8 @@
#include "wx/button.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
#include <stdio.h>
#endif
#if wxUSE_OWNER_DRAWN
@@ -887,10 +888,8 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
wnd->m_hWnd = (WXHWND) hWnd;
}
// Stop right here if we don't have a valid handle
// in our wxWnd object.
// Stop right here if we don't have a valid handle in our wxWindow object.
if (wnd && !wnd->m_hWnd) {
// wxDebugMsg("Warning: could not find a valid handle, wx_win.cc/wxWndProc.\n");
wnd->m_hWnd = (WXHWND) hWnd;
long res = wnd->MSWDefWindowProc(message, wParam, lParam );
wnd->m_hWnd = 0;
@@ -1206,27 +1205,35 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
}
case WM_KEYDOWN:
{
MSWOnKeyDown((WORD) wParam, lParam);
// we consider these message "not interesting"
if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
return Default();
// Avoid duplicate messages to OnChar
if ( (wParam != VK_ESCAPE) && (wParam != VK_SPACE) &&
(wParam != VK_RETURN) && (wParam != VK_BACK) &&
(wParam != VK_TAB) )
// Avoid duplicate messages to OnChar for these special keys
switch ( wParam )
{
MSWOnChar((WORD)wParam, lParam);
if ( ::GetKeyState(VK_CONTROL) & 0x100 )
return Default();
case VK_ESCAPE:
case VK_SPACE:
case VK_RETURN:
case VK_BACK:
case VK_TAB:
case VK_LEFT:
case VK_RIGHT:
case VK_DOWN:
case VK_UP:
if ( ::GetKeyState(VK_CONTROL) & 0x100 )
MSWOnChar((WORD)wParam, lParam);
break;
default:
MSWOnChar((WORD)wParam, lParam);
if ( ::GetKeyState(VK_CONTROL) & 0x100 )
return Default();
break;
}
else if ( ::GetKeyState(VK_CONTROL) & 0x100 )
MSWOnChar((WORD)wParam, lParam);
else
return Default();
break;
}
case WM_KEYUP:
{
@@ -1438,6 +1445,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
default:
return MSWDefWindowProc(message, wParam, lParam );
}
return 0; // Success: we processed this command.
}
@@ -1704,6 +1712,13 @@ bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd))
::ShowCaret((HWND) GetHWND());
}
// panel wants to track the window which was the last to have focus in it
wxWindow *parent = GetParent();
if ( parent && parent->IsKindOf(CLASSINFO(wxPanel)) )
{
((wxPanel *)parent)->SetLastFocus(this);
}
wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
event.SetEventObject(this);
if (!GetEventHandler()->ProcessEvent(event))
@@ -1929,22 +1944,27 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
if ( msg->message != WM_KEYDOWN )
bProcess = FALSE;
if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
if ( bProcess && (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
bProcess = FALSE;
bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0;
if ( bProcess )
{
bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0;
// WM_GETDLGCODE: if the control wants it for itself, don't process it
// (except for Ctrl-Tab/Enter combinations which are always processed)
LONG lDlgCode = 0;
if ( bProcess && !bCtrlDown ) {
lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0);
}
// WM_GETDLGCODE: ask the control if it wants the key for itself,
// don't process it if it's the case (except for Ctrl-Tab/Enter
// combinations which are always processed)
LONG lDlgCode = 0;
if ( !bCtrlDown )
{
lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0);
}
bool bForward = TRUE,
bWindowChange = FALSE;
if ( bProcess ) {
switch ( msg->wParam ) {
bool bForward = TRUE,
bWindowChange = FALSE;
switch ( msg->wParam )
{
case VK_TAB:
if ( lDlgCode & DLGC_WANTTAB ) {
bProcess = FALSE;
@@ -1971,45 +1991,52 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
break;
case VK_RETURN:
// if there is a default button, Enter should press it
if ( !GetDefaultItem() ) {
// but if there is not it makes sense to make it work
// like a TAB
if ( bCtrlDown || (lDlgCode & DLGC_WANTMESSAGE == 0) )
{
// nothing to do - all variables are already set
break;
}
else
{
if ( lDlgCode & DLGC_WANTMESSAGE )
{
// control wants to process Enter itself, don't
// call IsDialogMessage() which would interpret
// it
return FALSE;
}
wxButton *btnDefault = GetDefaultItem();
if ( btnDefault && !bCtrlDown )
{
// if there is a default button, Enter should
// press it
(void)::SendMessage((HWND)btnDefault->GetHWND(),
BM_CLICK, 0, 0);
return TRUE;
}
// else: but if there is not it makes sense to make it
// work like a TAB - and that's what we do.
// Note that Ctrl-Enter always works this way.
}
//else: fall through and don't process the message
break;
default:
bProcess = FALSE;
}
if ( bProcess )
{
wxNavigationKeyEvent event;
event.SetDirection(bForward);
event.SetWindowChange(bWindowChange);
event.SetEventObject(this);
if ( GetEventHandler()->ProcessEvent(event) )
return TRUE;
}
}
if ( bProcess ) {
wxNavigationKeyEvent event;
event.SetDirection(bForward);
event.SetWindowChange(bWindowChange);
event.SetEventObject(this);
if ( GetEventHandler()->ProcessEvent(event) )
return TRUE;
}
return ::IsDialogMessage((HWND)GetHWND(), msg) != 0;
if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
return TRUE;
}
#if wxUSE_TOOLTIPS
else if ( m_tooltip ) {
if ( m_tooltip )
{
// relay mouse move events to the tooltip control
MSG *msg = (MSG *)pMsg;
if ( msg->message == WM_MOUSEMOVE )
@@ -2232,7 +2259,6 @@ void wxWindow::MSWOnMButtonDown(int x, int y, WXUINT flags)
void wxWindow::MSWOnMButtonUp(int x, int y, WXUINT flags)
{
//wxDebugMsg("MButtonUp\n") ;
wxMouseEvent event(wxEVT_MIDDLE_UP);
event.m_x = x; event.m_y = y;
@@ -3616,18 +3642,6 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D)
void wxWindow::OnChar(wxKeyEvent& event)
{
#if 0
if ( event.KeyCode() == WXK_TAB ) {
// propagate the TABs to the parent - it's up to it to decide what
// to do with it
wxWindow *parent = GetParent();
if ( parent ) {
if ( parent->GetEventHandler()->ProcessEvent(event) )
return;
}
}
#endif // 0
bool isVirtual;
int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual);
@@ -3661,7 +3675,7 @@ bool wxWindow::TransferDataToWindow()
if ( child->GetValidator() && /* child->GetValidator()->Ok() && */
!child->GetValidator()->TransferToWindow() )
{
wxMessageBox("Application Error", "Could not transfer data to window", wxOK|wxICON_EXCLAMATION);
wxLogError(_("Could not transfer data to window"));
return FALSE;
}
@@ -4043,16 +4057,17 @@ void wxWindow::SetConstraintSizes(bool recurse)
winName = "unnamed";
else
winName = GetName();
wxDebugMsg("Constraint(s) not satisfied for window of type %s, name %s:\n", (const char *)windowClass, (const char *)winName);
wxLogDebug("Constraint(s) not satisfied for window of type %s, name %s:",
(const char *)windowClass, (const char *)winName);
if (!constr->left.GetDone())
wxDebugMsg(" unsatisfied 'left' constraint.\n");
wxLogDebug(" unsatisfied 'left' constraint.");
if (!constr->right.GetDone())
wxDebugMsg(" unsatisfied 'right' constraint.\n");
wxLogDebug(" unsatisfied 'right' constraint.");
if (!constr->width.GetDone())
wxDebugMsg(" unsatisfied 'width' constraint.\n");
wxLogDebug(" unsatisfied 'width' constraint.");
if (!constr->height.GetDone())
wxDebugMsg(" unsatisfied 'height' constraint.\n");
wxDebugMsg("Please check constraints: try adding AsIs() constraints.\n");
wxLogDebug(" unsatisfied 'height' constraint.");
wxLogDebug("Please check constraints: try adding AsIs() constraints.\n");
}
if (recurse)