|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_vcl.hxx" | 
|  |  | 
|  | #include <tools/debug.hxx> | 
|  |  | 
|  | #include <svdata.hxx> | 
|  | #include <window.h> | 
|  |  | 
|  | #include <vcl/event.hxx> | 
|  | #include <vcl/svapp.hxx> | 
|  | #include <vcl/tabpage.hxx> | 
|  | #include <vcl/tabctrl.hxx> | 
|  | #include <vcl/tabdlg.hxx> | 
|  | #include <vcl/button.hxx> | 
|  |  | 
|  | #include <vcl/unohelp.hxx> | 
|  | #include <com/sun/star/i18n/XCharacterClassification.hpp> | 
|  |  | 
|  | using namespace ::com::sun::star; | 
|  |  | 
|  | // ======================================================================= | 
|  |  | 
|  | static sal_Bool ImplHasIndirectTabParent( Window* pWindow ) | 
|  | { | 
|  | // The window has inderect tab parent if it is included in tab hierarchy | 
|  | // of the indirect parent window | 
|  |  | 
|  | return ( pWindow && pWindow->GetParent() | 
|  | && ( pWindow->GetParent()->ImplGetWindow()->GetStyle() & WB_CHILDDLGCTRL ) ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplGetTopParentOfTabHierarchy( Window* pParent ) | 
|  | { | 
|  | // The method allows to find the most close parent containing all the | 
|  | // window from the current tab-hierarchy | 
|  | // The direct parent should be provided as a parameter here | 
|  |  | 
|  | Window* pResult = pParent; | 
|  |  | 
|  | if ( pResult ) | 
|  | { | 
|  | while ( pResult->GetParent() && ( pResult->ImplGetWindow()->GetStyle() & WB_CHILDDLGCTRL ) ) | 
|  | pResult = pResult->GetParent(); | 
|  | } | 
|  |  | 
|  | return pResult; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplGetSubChildWindow( Window* pParent, sal_uInt16 n, sal_uInt16& nIndex ) | 
|  | { | 
|  | Window*     pTabPage = NULL; | 
|  | Window*     pFoundWindow = NULL; | 
|  |  | 
|  | Window*     pWindow = pParent->GetWindow( WINDOW_FIRSTCHILD ); | 
|  | Window*     pNextWindow = pWindow; | 
|  | while ( pWindow ) | 
|  | { | 
|  | pWindow = pWindow->ImplGetWindow(); | 
|  |  | 
|  | // Unsichtbare und disablte Fenster werden uebersprungen | 
|  | if ( pTabPage || pWindow->IsVisible() ) | 
|  | { | 
|  | // Wenn das letzte Control ein TabControl war, wird von | 
|  | // diesem die TabPage genommen | 
|  | if ( pTabPage ) | 
|  | { | 
|  | pFoundWindow = ImplGetSubChildWindow( pTabPage, n, nIndex ); | 
|  | pTabPage = NULL; | 
|  | } | 
|  | else | 
|  | { | 
|  | pFoundWindow = pWindow; | 
|  |  | 
|  | // Bei einem TabControl sich die aktuelle TabPage merken, | 
|  | // damit diese dann genommen wird | 
|  | if ( pWindow->GetType() == WINDOW_TABCONTROL ) | 
|  | { | 
|  | TabControl* pTabControl = ((TabControl*)pWindow); | 
|  | // Feststellen, ob TabPage Child vom TabControl ist | 
|  | // und auch noch existiert (deshalb durch Vergleich, | 
|  | // indem alle ChildFenster getestet werden). Denn es | 
|  | // kann sein, das TabPages schon in einem Dialog-Dtor | 
|  | // zerstoert wurden, obwohl das TabControl noch | 
|  | // existiert. | 
|  | TabPage* pTempTabPage = pTabControl->GetTabPage( pTabControl->GetCurPageId() ); | 
|  | if ( pTempTabPage ) | 
|  | { | 
|  | Window* pTempWindow = pTabControl->GetWindow( WINDOW_FIRSTCHILD ); | 
|  | while ( pTempWindow ) | 
|  | { | 
|  | if ( pTempWindow->ImplGetWindow() == pTempTabPage ) | 
|  | { | 
|  | pTabPage = pTempTabPage; | 
|  | break; | 
|  | } | 
|  | pTempWindow = pTempWindow->GetWindow( WINDOW_NEXT ); | 
|  | } | 
|  | } | 
|  | } | 
|  | else if ( ( pWindow->GetStyle() & WB_DIALOGCONTROL ) | 
|  | || ( pWindow->GetStyle() & WB_CHILDDLGCTRL ) ) | 
|  | pFoundWindow = ImplGetSubChildWindow( pWindow, n, nIndex ); | 
|  | } | 
|  |  | 
|  | if ( n == nIndex ) | 
|  | return pFoundWindow; | 
|  | nIndex++; | 
|  | } | 
|  |  | 
|  | if ( pTabPage ) | 
|  | pWindow = pTabPage; | 
|  | else | 
|  | { | 
|  | pWindow = pNextWindow->GetWindow( WINDOW_NEXT ); | 
|  | pNextWindow = pWindow; | 
|  | } | 
|  | } | 
|  |  | 
|  | nIndex--; | 
|  | return pFoundWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplGetChildWindow( Window* pParent, sal_uInt16 n, sal_uInt16& nIndex, sal_Bool bTestEnable ) | 
|  | { | 
|  | pParent = ImplGetTopParentOfTabHierarchy( pParent ); | 
|  |  | 
|  | nIndex = 0; | 
|  | Window* pWindow = ImplGetSubChildWindow( pParent, n, nIndex ); | 
|  | if ( bTestEnable ) | 
|  | { | 
|  | sal_uInt16 n2 = nIndex; | 
|  | while ( pWindow && (!pWindow->IsEnabled() || !pWindow->IsInputEnabled()) ) | 
|  | { | 
|  | n2 = nIndex+1; | 
|  | nIndex = 0; | 
|  | pWindow = ImplGetSubChildWindow( pParent, n2, nIndex ); | 
|  | if ( nIndex < n2 ) | 
|  | break; | 
|  | } | 
|  |  | 
|  | if ( (nIndex < n2) && n ) | 
|  | { | 
|  | do | 
|  | { | 
|  | n--; | 
|  | nIndex = 0; | 
|  | pWindow = ImplGetSubChildWindow( pParent, n, nIndex ); | 
|  | } | 
|  | while ( pWindow && n && (!pWindow->IsEnabled() || !pWindow->IsInputEnabled()) ); | 
|  | } | 
|  | } | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplGetNextWindow( Window* pParent, sal_uInt16 n, sal_uInt16& nIndex, sal_Bool bTestEnable ) | 
|  | { | 
|  | Window* pWindow = ImplGetChildWindow( pParent, n+1, nIndex, bTestEnable ); | 
|  | if ( n == nIndex ) | 
|  | { | 
|  | n = 0; | 
|  | pWindow = ImplGetChildWindow( pParent, n, nIndex, bTestEnable ); | 
|  | } | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Window* Window::ImplGetDlgWindow( sal_uInt16 nIndex, sal_uInt16 nType, | 
|  | sal_uInt16 nFormStart, sal_uInt16 nFormEnd, | 
|  | sal_uInt16* pIndex ) | 
|  | { | 
|  | DBG_ASSERT( (nIndex >= nFormStart) && (nIndex <= nFormEnd), | 
|  | "Window::ImplGetDlgWindow() - nIndex not in Form" ); | 
|  |  | 
|  | Window* pWindow = NULL; | 
|  | sal_uInt16  i; | 
|  | sal_uInt16  nTemp; | 
|  | sal_uInt16  nStartIndex; | 
|  |  | 
|  | if ( nType == DLGWINDOW_PREV ) | 
|  | { | 
|  | i = nIndex; | 
|  | do | 
|  | { | 
|  | if ( i > nFormStart ) | 
|  | i--; | 
|  | else | 
|  | i = nFormEnd; | 
|  | pWindow = ImplGetChildWindow( this, i, nTemp, sal_True ); | 
|  | if ( !pWindow ) | 
|  | break; | 
|  | if ( (i == nTemp) && (pWindow->GetStyle() & WB_TABSTOP) ) | 
|  | break; | 
|  | } | 
|  | while ( i != nIndex ); | 
|  | } | 
|  | else | 
|  | { | 
|  | i = nIndex; | 
|  | pWindow = ImplGetChildWindow( this, i, i, (nType == DLGWINDOW_FIRST) ); | 
|  | if ( pWindow ) | 
|  | { | 
|  | nStartIndex = i; | 
|  |  | 
|  | if ( nType == DLGWINDOW_NEXT ) | 
|  | { | 
|  | if ( i < nFormEnd ) | 
|  | { | 
|  | pWindow = ImplGetNextWindow( this, i, i, sal_True ); | 
|  | if ( (i > nFormEnd) || (i < nFormStart) ) | 
|  | pWindow = ImplGetChildWindow( this, nFormStart, i, sal_True ); | 
|  | } | 
|  | else | 
|  | pWindow = ImplGetChildWindow( this, nFormStart, i, sal_True ); | 
|  | } | 
|  |  | 
|  | if ( i <= nFormEnd ) | 
|  | { | 
|  | // 2ten Index mitfuehren, falls alle Controls disablte | 
|  | sal_uInt16 nStartIndex2 = i; | 
|  | sal_uInt16 nOldIndex = i+1; | 
|  |  | 
|  | do | 
|  | { | 
|  | if ( pWindow->GetStyle() & WB_TABSTOP ) | 
|  | break; | 
|  | if( i == nOldIndex ) // only disabled controls ? | 
|  | { | 
|  | i = nStartIndex2; | 
|  | break; | 
|  | } | 
|  | nOldIndex = i; | 
|  | if ( (i > nFormEnd) || (i < nFormStart) ) | 
|  | pWindow = ImplGetChildWindow( this, nFormStart, i, sal_True ); | 
|  | else | 
|  | pWindow = ImplGetNextWindow( this, i, i, sal_True ); | 
|  | } | 
|  | while ( (i != nStartIndex) && (i != nStartIndex2) ); | 
|  |  | 
|  | if ( (i == nStartIndex2) && | 
|  | (!(pWindow->GetStyle() & WB_TABSTOP) || !pWindow->IsEnabled()) ) | 
|  | i = nStartIndex; | 
|  | } | 
|  | } | 
|  |  | 
|  | if ( nType == DLGWINDOW_FIRST ) | 
|  | { | 
|  | if ( pWindow ) | 
|  | { | 
|  | if ( pWindow->GetType() == WINDOW_TABCONTROL ) | 
|  | { | 
|  | Window* pNextWindow = ImplGetDlgWindow( i, DLGWINDOW_NEXT ); | 
|  | if ( pNextWindow ) | 
|  | { | 
|  | if ( pWindow->IsChild( pNextWindow ) ) | 
|  | pWindow = pNextWindow; | 
|  | } | 
|  | } | 
|  |  | 
|  | if ( !(pWindow->GetStyle() & WB_TABSTOP) ) | 
|  | pWindow = NULL; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if ( pIndex ) | 
|  | *pIndex = i; | 
|  |  | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplFindDlgCtrlWindow( Window* pParent, Window* pWindow, sal_uInt16& rIndex, | 
|  | sal_uInt16& rFormStart, sal_uInt16& rFormEnd ) | 
|  | { | 
|  | Window* pSWindow; | 
|  | Window* pSecondWindow = NULL; | 
|  | Window* pTempWindow = NULL; | 
|  | sal_uInt16  i; | 
|  | sal_uInt16  nSecond_i = 0; | 
|  | sal_uInt16  nFormStart = 0; | 
|  | sal_uInt16  nSecondFormStart = 0; | 
|  | sal_uInt16  nFormEnd; | 
|  |  | 
|  | // Focus-Fenster in der Child-Liste suchen | 
|  | Window* pFirstChildWindow = pSWindow = ImplGetChildWindow( pParent, 0, i, sal_False ); | 
|  |  | 
|  | if( pWindow == NULL ) | 
|  | pWindow = pSWindow; | 
|  |  | 
|  | while ( pSWindow ) | 
|  | { | 
|  | // the DialogControlStart mark is only accepted for the direct children | 
|  | if ( !ImplHasIndirectTabParent( pSWindow ) | 
|  | && pSWindow->ImplGetWindow()->IsDialogControlStart() ) | 
|  | nFormStart = i; | 
|  |  | 
|  | // SecondWindow wegen zusammengesetzten Controls wie | 
|  | // ComboBoxen und Feldern | 
|  | if ( pSWindow->ImplIsWindowOrChild( pWindow ) ) | 
|  | { | 
|  | pSecondWindow = pSWindow; | 
|  | nSecond_i = i; | 
|  | nSecondFormStart = nFormStart; | 
|  | if ( pSWindow == pWindow ) | 
|  | break; | 
|  | } | 
|  |  | 
|  | pSWindow = ImplGetNextWindow( pParent, i, i, sal_False ); | 
|  | if ( !i ) | 
|  | pSWindow = NULL; | 
|  | } | 
|  |  | 
|  | if ( !pSWindow ) | 
|  | { | 
|  | // Fenster nicht gefunden, dann koennen wir auch keine | 
|  | // Steuerung uebernehmen | 
|  | if ( !pSecondWindow ) | 
|  | return NULL; | 
|  | else | 
|  | { | 
|  | pSWindow = pSecondWindow; | 
|  | i = nSecond_i; | 
|  | nFormStart = nSecondFormStart; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Start-Daten setzen | 
|  | rIndex = i; | 
|  | rFormStart = nFormStart; | 
|  |  | 
|  | // Formularende suchen | 
|  | nFormEnd = nFormStart; | 
|  | pTempWindow = pSWindow; | 
|  | sal_Int32 nIteration = 0; | 
|  | do | 
|  | { | 
|  | nFormEnd = i; | 
|  | pTempWindow = ImplGetNextWindow( pParent, i, i, sal_False ); | 
|  |  | 
|  | // the DialogControlStart mark is only accepted for the direct children | 
|  | if ( !i | 
|  | || ( pTempWindow && !ImplHasIndirectTabParent( pTempWindow ) | 
|  | && pTempWindow->ImplGetWindow()->IsDialogControlStart() ) ) | 
|  | break; | 
|  |  | 
|  | if ( pTempWindow && pTempWindow == pFirstChildWindow ) | 
|  | { | 
|  | // It is possible to go through the begin of hierarchy once | 
|  | // while looking for DialogControlStart mark. | 
|  | // If it happens second time, it looks like an endless loop, | 
|  | // that should be impossible, but just for the case... | 
|  | nIteration++; | 
|  | if ( nIteration >= 2 ) | 
|  | { | 
|  | // this is an unexpected scenario | 
|  | DBG_ASSERT( sal_False, "It seems to be an endless loop!" ); | 
|  | rFormStart = 0; | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | while ( pTempWindow ); | 
|  | rFormEnd = nFormEnd; | 
|  |  | 
|  | return pSWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplFindAccelWindow( Window* pParent, sal_uInt16& rIndex, xub_Unicode cCharCode, | 
|  | sal_uInt16 nFormStart, sal_uInt16 nFormEnd, sal_Bool bCheckEnable = sal_True ) | 
|  | { | 
|  | DBG_ASSERT( (rIndex >= nFormStart) && (rIndex <= nFormEnd), | 
|  | "Window::ImplFindAccelWindow() - rIndex not in Form" ); | 
|  |  | 
|  | xub_Unicode cCompareChar; | 
|  | sal_uInt16  nStart = rIndex; | 
|  | sal_uInt16  i = rIndex; | 
|  | int     bSearch = sal_True; | 
|  | Window* pWindow; | 
|  |  | 
|  | // MT: Where can we keep the CharClass?! | 
|  | static uno::Reference< i18n::XCharacterClassification > xCharClass; | 
|  | if ( !xCharClass.is() ) | 
|  | xCharClass = vcl::unohelper::CreateCharacterClassification(); | 
|  |  | 
|  | const ::com::sun::star::lang::Locale& rLocale = Application::GetSettings().GetUILocale(); | 
|  | cCharCode = xCharClass->toUpper( String(cCharCode), 0, 1, rLocale )[0]; | 
|  |  | 
|  | if ( i < nFormEnd ) | 
|  | pWindow = ImplGetNextWindow( pParent, i, i, sal_True ); | 
|  | else | 
|  | pWindow = ImplGetChildWindow( pParent, nFormStart, i, sal_True ); | 
|  | while( bSearch && pWindow ) | 
|  | { | 
|  | const XubString aStr = pWindow->GetText(); | 
|  | sal_uInt16 nPos = aStr.Search( '~' ); | 
|  | while ( nPos != STRING_NOTFOUND ) | 
|  | { | 
|  | cCompareChar = aStr.GetChar( nPos+1 ); | 
|  | cCompareChar = xCharClass->toUpper( String(cCompareChar), 0, 1, rLocale )[0]; | 
|  | if ( cCompareChar == cCharCode ) | 
|  | { | 
|  | // Bei Static-Controls auf das naechste Controlm weiterschalten | 
|  | if ( (pWindow->GetType() == WINDOW_FIXEDTEXT)   || | 
|  | (pWindow->GetType() == WINDOW_FIXEDLINE)   || | 
|  | (pWindow->GetType() == WINDOW_GROUPBOX) ) | 
|  | pWindow = pParent->ImplGetDlgWindow( i, DLGWINDOW_NEXT ); | 
|  | rIndex = i; | 
|  | return pWindow; | 
|  | } | 
|  | nPos = aStr.Search( '~', nPos+1 ); | 
|  | } | 
|  |  | 
|  | // #i93011# it would have made sense to have this really recursive | 
|  | // right from the start. However this would cause unpredictable side effects now | 
|  | // so instead we have a style bit for some child windows, that want their | 
|  | // children checked for accelerators | 
|  | if( (pWindow->GetStyle() & WB_CHILDDLGCTRL) != 0 ) | 
|  | { | 
|  | sal_uInt16  nChildIndex; | 
|  | sal_uInt16  nChildFormStart; | 
|  | sal_uInt16  nChildFormEnd; | 
|  |  | 
|  | // get form start and end | 
|  | ::ImplFindDlgCtrlWindow( pWindow, NULL, | 
|  | nChildIndex, nChildFormStart, nChildFormEnd ); | 
|  | Window* pAccelWin = ImplFindAccelWindow( pWindow, nChildIndex, cCharCode, | 
|  | nChildFormStart, nChildFormEnd, | 
|  | bCheckEnable ); | 
|  | if( pAccelWin ) | 
|  | return pAccelWin; | 
|  | } | 
|  |  | 
|  | if ( i == nStart ) | 
|  | break; | 
|  |  | 
|  | if ( i < nFormEnd ) | 
|  | { | 
|  | pWindow = ImplGetNextWindow( pParent, i, i, bCheckEnable ); | 
|  | if( ! pWindow ) | 
|  | pWindow = ImplGetChildWindow( pParent, nFormStart, i, bCheckEnable ); | 
|  | } | 
|  | else | 
|  | pWindow = ImplGetChildWindow( pParent, nFormStart, i, bCheckEnable ); | 
|  | } | 
|  |  | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void Window::ImplControlFocus( sal_uInt16 nFlags ) | 
|  | { | 
|  | if ( nFlags & GETFOCUS_MNEMONIC ) | 
|  | { | 
|  | if ( GetType() == WINDOW_RADIOBUTTON ) | 
|  | { | 
|  | if ( !((RadioButton*)this)->IsChecked() ) | 
|  | ((RadioButton*)this)->ImplCallClick( sal_True, nFlags ); | 
|  | else | 
|  | ImplGrabFocus( nFlags ); | 
|  | } | 
|  | else | 
|  | { | 
|  | ImplGrabFocus( nFlags ); | 
|  | if ( nFlags & GETFOCUS_UNIQUEMNEMONIC ) | 
|  | { | 
|  | if ( GetType() == WINDOW_CHECKBOX ) | 
|  | ((CheckBox*)this)->ImplCheck(); | 
|  | else if ( mpWindowImpl->mbPushButton ) | 
|  | { | 
|  | ((PushButton*)this)->SetPressed( sal_True ); | 
|  | ((PushButton*)this)->SetPressed( sal_False ); | 
|  | ((PushButton*)this)->Click(); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | if ( GetType() == WINDOW_RADIOBUTTON ) | 
|  | { | 
|  | if ( !((RadioButton*)this)->IsChecked() ) | 
|  | ((RadioButton*)this)->ImplCallClick( sal_True, nFlags ); | 
|  | else | 
|  | ImplGrabFocus( nFlags ); | 
|  | } | 
|  | else | 
|  | ImplGrabFocus( nFlags ); | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | sal_Bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, sal_Bool bKeyInput ) | 
|  | { | 
|  | KeyCode aKeyCode = rKEvt.GetKeyCode(); | 
|  | sal_uInt16  nKeyCode = aKeyCode.GetCode(); | 
|  | Window* pSWindow; | 
|  | Window* pTempWindow; | 
|  | Window* pButtonWindow; | 
|  | sal_uInt16  i; | 
|  | sal_uInt16  iButton; | 
|  | sal_uInt16  iButtonStart; | 
|  | sal_uInt16  iTemp; | 
|  | sal_uInt16  nIndex; | 
|  | sal_uInt16  nFormStart; | 
|  | sal_uInt16  nFormEnd; | 
|  | sal_uInt16  nDlgCtrlFlags; | 
|  |  | 
|  | // Ohne Focus-Window koennen wir auch keine Steuerung uebernehmen | 
|  | Window* pFocusWindow = Application::GetFocusWindow(); | 
|  | if ( !pFocusWindow || !ImplIsWindowOrChild( pFocusWindow ) ) | 
|  | return sal_False; | 
|  |  | 
|  | // Focus-Fenster in der Child-Liste suchen | 
|  | pSWindow = ::ImplFindDlgCtrlWindow( this, pFocusWindow, | 
|  | nIndex, nFormStart, nFormEnd ); | 
|  | if ( !pSWindow ) | 
|  | return sal_False; | 
|  | i = nIndex; | 
|  |  | 
|  | nDlgCtrlFlags = 0; | 
|  | pTempWindow = pSWindow; | 
|  | do | 
|  | { | 
|  | nDlgCtrlFlags |= pTempWindow->GetDialogControlFlags(); | 
|  | if ( pTempWindow == this ) | 
|  | break; | 
|  | pTempWindow = pTempWindow->ImplGetParent(); | 
|  | } | 
|  | while ( pTempWindow ); | 
|  |  | 
|  | pButtonWindow = NULL; | 
|  |  | 
|  | if ( nKeyCode == KEY_RETURN ) | 
|  | { | 
|  | // Wir suchen zuerst nach einem DefPushButton/CancelButton | 
|  | pButtonWindow = ImplGetChildWindow( this, nFormStart, iButton, sal_True ); | 
|  | iButtonStart = iButton; | 
|  | while ( pButtonWindow ) | 
|  | { | 
|  | if ( (pButtonWindow->GetStyle() & WB_DEFBUTTON) && | 
|  | pButtonWindow->mpWindowImpl->mbPushButton ) | 
|  | break; | 
|  |  | 
|  | pButtonWindow = ImplGetNextWindow( this, iButton, iButton, sal_True ); | 
|  | if ( (iButton <= iButtonStart) || (iButton > nFormEnd) ) | 
|  | pButtonWindow = NULL; | 
|  | } | 
|  |  | 
|  | if ( bKeyInput && !pButtonWindow && (nDlgCtrlFlags & WINDOW_DLGCTRL_RETURN) ) | 
|  | { | 
|  | sal_uInt16  nType; | 
|  | sal_uInt16  nGetFocusFlags = GETFOCUS_TAB; | 
|  | sal_uInt16  nNewIndex; | 
|  | sal_uInt16  iStart; | 
|  | if ( aKeyCode.IsShift() ) | 
|  | { | 
|  | nType = DLGWINDOW_PREV; | 
|  | nGetFocusFlags |= GETFOCUS_BACKWARD; | 
|  | } | 
|  | else | 
|  | { | 
|  | nType = DLGWINDOW_NEXT; | 
|  | nGetFocusFlags |= GETFOCUS_FORWARD; | 
|  | } | 
|  | iStart = i; | 
|  | pTempWindow = ImplGetDlgWindow( i, nType, nFormStart, nFormEnd, &nNewIndex ); | 
|  | while ( pTempWindow && (pTempWindow != pSWindow) ) | 
|  | { | 
|  | if ( !pTempWindow->mpWindowImpl->mbPushButton ) | 
|  | { | 
|  | // Around-Flag ermitteln | 
|  | if ( nType == DLGWINDOW_PREV ) | 
|  | { | 
|  | if ( nNewIndex > iStart ) | 
|  | nGetFocusFlags |= GETFOCUS_AROUND; | 
|  | } | 
|  | else | 
|  | { | 
|  | if ( nNewIndex < iStart ) | 
|  | nGetFocusFlags |= GETFOCUS_AROUND; | 
|  | } | 
|  | pTempWindow->ImplControlFocus( nGetFocusFlags ); | 
|  | return sal_True; | 
|  | } | 
|  | else | 
|  | { | 
|  | i = nNewIndex; | 
|  | pTempWindow = ImplGetDlgWindow( i, nType, nFormStart, nFormEnd, &nNewIndex ); | 
|  | } | 
|  | if ( (i <= iStart) || (i > nFormEnd) ) | 
|  | pTempWindow = NULL; | 
|  | } | 
|  | // Wenn es das gleiche Fenster ist, ein Get/LoseFocus | 
|  | // simulieren, falls AROUND ausgewertet wird | 
|  | if ( pTempWindow && (pTempWindow == pSWindow) ) | 
|  | { | 
|  | NotifyEvent aNEvt1( EVENT_LOSEFOCUS, pSWindow ); | 
|  | if ( !ImplCallPreNotify( aNEvt1 ) ) | 
|  | pSWindow->LoseFocus(); | 
|  | pSWindow->mpWindowImpl->mnGetFocusFlags = nGetFocusFlags | GETFOCUS_AROUND; | 
|  | NotifyEvent aNEvt2( EVENT_GETFOCUS, pSWindow ); | 
|  | if ( !ImplCallPreNotify( aNEvt2 ) ) | 
|  | pSWindow->GetFocus(); | 
|  | pSWindow->mpWindowImpl->mnGetFocusFlags = 0; | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  | else if ( nKeyCode == KEY_ESCAPE ) | 
|  | { | 
|  | // Wir suchen zuerst nach einem DefPushButton/CancelButton | 
|  | pButtonWindow = ImplGetChildWindow( this, nFormStart, iButton, sal_True ); | 
|  | iButtonStart = iButton; | 
|  | while ( pButtonWindow ) | 
|  | { | 
|  | if ( pButtonWindow->GetType() == WINDOW_CANCELBUTTON ) | 
|  | break; | 
|  |  | 
|  | pButtonWindow = ImplGetNextWindow( this, iButton, iButton, sal_True ); | 
|  | if ( (iButton <= iButtonStart) || (iButton > nFormEnd) ) | 
|  | pButtonWindow = NULL; | 
|  | } | 
|  |  | 
|  | if ( bKeyInput && mpWindowImpl->mpDlgCtrlDownWindow ) | 
|  | { | 
|  | if ( mpWindowImpl->mpDlgCtrlDownWindow != pButtonWindow ) | 
|  | { | 
|  | ((PushButton*)mpWindowImpl->mpDlgCtrlDownWindow)->SetPressed( sal_False ); | 
|  | mpWindowImpl->mpDlgCtrlDownWindow = NULL; | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  | else if ( bKeyInput ) | 
|  | { | 
|  | if ( nKeyCode == KEY_TAB ) | 
|  | { | 
|  | // keine Alt-Taste abfangen, wegen Windows | 
|  | if ( !aKeyCode.IsMod2() ) | 
|  | { | 
|  | sal_uInt16  nType; | 
|  | sal_uInt16  nGetFocusFlags = GETFOCUS_TAB; | 
|  | sal_uInt16  nNewIndex; | 
|  | sal_Bool    bFormular = sal_False; | 
|  |  | 
|  | // Bei Ctrl-Tab erstmal testen, ob zwischen Formularen | 
|  | // gesprungen werden soll | 
|  | if ( aKeyCode.IsMod1() ) | 
|  | { | 
|  | // Gruppe suchen | 
|  | Window* pFormularFirstWindow = NULL; | 
|  | Window* pLastFormularFirstWindow = NULL; | 
|  | pTempWindow = ImplGetChildWindow( this, 0, iTemp, sal_False ); | 
|  | Window* pPrevFirstFormularFirstWindow = NULL; | 
|  | Window* pFirstFormularFirstWindow = pTempWindow; | 
|  | while ( pTempWindow ) | 
|  | { | 
|  | if ( pTempWindow->ImplGetWindow()->IsDialogControlStart() ) | 
|  | { | 
|  | if ( iTemp != 0 ) | 
|  | bFormular = sal_True; | 
|  | if ( aKeyCode.IsShift() ) | 
|  | { | 
|  | if ( iTemp <= nIndex ) | 
|  | pFormularFirstWindow = pPrevFirstFormularFirstWindow; | 
|  | pPrevFirstFormularFirstWindow = pTempWindow; | 
|  | } | 
|  | else | 
|  | { | 
|  | if ( (iTemp > nIndex) && !pFormularFirstWindow ) | 
|  | pFormularFirstWindow = pTempWindow; | 
|  | } | 
|  | pLastFormularFirstWindow = pTempWindow; | 
|  | } | 
|  |  | 
|  | pTempWindow = ImplGetNextWindow( this, iTemp, iTemp, sal_False ); | 
|  | if ( !iTemp ) | 
|  | pTempWindow = NULL; | 
|  | } | 
|  |  | 
|  | if ( bFormular ) | 
|  | { | 
|  | if ( !pFormularFirstWindow ) | 
|  | { | 
|  | if ( aKeyCode.IsShift() ) | 
|  | pFormularFirstWindow = pLastFormularFirstWindow; | 
|  | else | 
|  | pFormularFirstWindow = pFirstFormularFirstWindow; | 
|  | } | 
|  |  | 
|  | sal_uInt16 nFoundFormStart = 0; | 
|  | sal_uInt16 nFoundFormEnd = 0; | 
|  | sal_uInt16 nTempIndex = 0; | 
|  | if ( ::ImplFindDlgCtrlWindow( this, pFormularFirstWindow, nTempIndex, | 
|  | nFoundFormStart, nFoundFormEnd ) ) | 
|  | { | 
|  | nTempIndex = nFoundFormStart; | 
|  | pFormularFirstWindow = ImplGetDlgWindow( nTempIndex, DLGWINDOW_FIRST, nFoundFormStart, nFoundFormEnd ); | 
|  | if ( pFormularFirstWindow ) | 
|  | { | 
|  | pFormularFirstWindow->ImplControlFocus(); | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if ( !bFormular ) | 
|  | { | 
|  | // Only use Ctrl-TAB if it was allowed for the whole | 
|  | // dialog or for the current control (#103667#) | 
|  | if ( !aKeyCode.IsMod1() || (nDlgCtrlFlags & WINDOW_DLGCTRL_MOD1TAB) || | 
|  | ( pSWindow->GetStyle() & WINDOW_DLGCTRL_MOD1TAB) ) | 
|  | { | 
|  | if ( aKeyCode.IsShift() ) | 
|  | { | 
|  | nType = DLGWINDOW_PREV; | 
|  | nGetFocusFlags |= GETFOCUS_BACKWARD; | 
|  | } | 
|  | else | 
|  | { | 
|  | nType = DLGWINDOW_NEXT; | 
|  | nGetFocusFlags |= GETFOCUS_FORWARD; | 
|  | } | 
|  | Window* pWindow = ImplGetDlgWindow( i, nType, nFormStart, nFormEnd, &nNewIndex ); | 
|  | // Wenn es das gleiche Fenster ist, ein Get/LoseFocus | 
|  | // simulieren, falls AROUND ausgewertet wird | 
|  | if ( pWindow == pSWindow ) | 
|  | { | 
|  | NotifyEvent aNEvt1( EVENT_LOSEFOCUS, pSWindow ); | 
|  | if ( !ImplCallPreNotify( aNEvt1 ) ) | 
|  | pSWindow->LoseFocus(); | 
|  | pSWindow->mpWindowImpl->mnGetFocusFlags = nGetFocusFlags | GETFOCUS_AROUND; | 
|  | NotifyEvent aNEvt2( EVENT_GETFOCUS, pSWindow ); | 
|  | if ( !ImplCallPreNotify( aNEvt2 ) ) | 
|  | pSWindow->GetFocus(); | 
|  | pSWindow->mpWindowImpl->mnGetFocusFlags = 0; | 
|  | return sal_True; | 
|  | } | 
|  | else if ( pWindow ) | 
|  | { | 
|  | // Around-Flag ermitteln | 
|  | if ( nType == DLGWINDOW_PREV ) | 
|  | { | 
|  | if ( nNewIndex > i ) | 
|  | nGetFocusFlags |= GETFOCUS_AROUND; | 
|  | } | 
|  | else | 
|  | { | 
|  | if ( nNewIndex < i ) | 
|  | nGetFocusFlags |= GETFOCUS_AROUND; | 
|  | } | 
|  | pWindow->ImplControlFocus( nGetFocusFlags ); | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | else if ( (nKeyCode == KEY_LEFT) || (nKeyCode == KEY_UP) ) | 
|  | { | 
|  | Window* pWindow = pSWindow; | 
|  | WinBits nStyle = pSWindow->GetStyle(); | 
|  | if ( !(nStyle & WB_GROUP) ) | 
|  | { | 
|  | pWindow = pWindow->GetWindow( WINDOW_PREV ); | 
|  | while ( pWindow ) | 
|  | { | 
|  | pWindow = pWindow->ImplGetWindow(); | 
|  |  | 
|  | nStyle = pWindow->GetStyle(); | 
|  |  | 
|  | if ( pWindow->IsVisible() && pWindow->IsEnabled() && pWindow->IsInputEnabled() ) | 
|  | { | 
|  | if ( pWindow != pSWindow ) | 
|  | pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_BACKWARD ); | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | if ( nStyle & WB_GROUP ) | 
|  | break; | 
|  |  | 
|  | pWindow = pWindow->GetWindow( WINDOW_PREV ); | 
|  | } | 
|  | } | 
|  | } | 
|  | else if ( (nKeyCode == KEY_RIGHT) || (nKeyCode == KEY_DOWN) ) | 
|  | { | 
|  | Window* pWindow; | 
|  | WinBits nStyle; | 
|  | pWindow = pSWindow->GetWindow( WINDOW_NEXT ); | 
|  | while ( pWindow ) | 
|  | { | 
|  | pWindow = pWindow->ImplGetWindow(); | 
|  |  | 
|  | nStyle = pWindow->GetStyle(); | 
|  |  | 
|  | if ( nStyle & WB_GROUP ) | 
|  | break; | 
|  |  | 
|  | //Solution:Pure window shouldn't get window after controls such as buttons. | 
|  | //if ( pWindow->IsVisible() && pWindow->IsEnabled() && pWindow->IsInputEnabled() ) | 
|  | if ( pWindow->IsVisible() && pWindow->IsEnabled() && | 
|  | pWindow->IsInputEnabled() && ( | 
|  | pWindow->GetType() != WINDOW_WINDOW && | 
|  | pWindow->GetType() != WINDOW_SYSWINDOW && | 
|  | pWindow->GetType() != WINDOW_WORKWINDOW && | 
|  | pWindow->GetType() != WINDOW_CONTROL | 
|  | ) | 
|  | ) | 
|  | { | 
|  | pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_BACKWARD ); | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | pWindow = pWindow->GetWindow( WINDOW_NEXT ); | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | xub_Unicode c = rKEvt.GetCharCode(); | 
|  | if ( c ) | 
|  | { | 
|  | pSWindow = ::ImplFindAccelWindow( this, i, c, nFormStart, nFormEnd ); | 
|  | if ( pSWindow ) | 
|  | { | 
|  | sal_uInt16 nGetFocusFlags = GETFOCUS_MNEMONIC; | 
|  | if ( pSWindow == ::ImplFindAccelWindow( this, i, c, nFormStart, nFormEnd ) ) | 
|  | nGetFocusFlags |= GETFOCUS_UNIQUEMNEMONIC; | 
|  | pSWindow->ImplControlFocus( nGetFocusFlags ); | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if ( pButtonWindow && pButtonWindow->IsVisible() && pButtonWindow->IsEnabled() && pButtonWindow->IsInputEnabled() ) | 
|  | { | 
|  | if ( bKeyInput ) | 
|  | { | 
|  | if ( mpWindowImpl->mpDlgCtrlDownWindow && (mpWindowImpl->mpDlgCtrlDownWindow != pButtonWindow) ) | 
|  | { | 
|  | ((PushButton*)mpWindowImpl->mpDlgCtrlDownWindow)->SetPressed( sal_False ); | 
|  | mpWindowImpl->mpDlgCtrlDownWindow = NULL; | 
|  | } | 
|  |  | 
|  | ((PushButton*)pButtonWindow)->SetPressed( sal_True ); | 
|  | mpWindowImpl->mpDlgCtrlDownWindow = pButtonWindow; | 
|  | } | 
|  | else if ( mpWindowImpl->mpDlgCtrlDownWindow == pButtonWindow ) | 
|  | { | 
|  | mpWindowImpl->mpDlgCtrlDownWindow = NULL; | 
|  | ((PushButton*)pButtonWindow)->SetPressed( sal_False ); | 
|  | ((PushButton*)pButtonWindow)->Click(); | 
|  | } | 
|  |  | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | return sal_False; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | // checks if this window has dialog control | 
|  | sal_Bool Window::ImplHasDlgCtrl() | 
|  | { | 
|  | Window* pDlgCtrlParent; | 
|  | Window* pDlgCtrl; | 
|  |  | 
|  | // lookup window for dialog control | 
|  | pDlgCtrl = this; | 
|  | pDlgCtrlParent = ImplGetParent(); | 
|  | while ( pDlgCtrlParent && | 
|  | !pDlgCtrlParent->ImplIsOverlapWindow() && | 
|  | ((pDlgCtrlParent->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) != WB_DIALOGCONTROL) ) | 
|  | pDlgCtrlParent = pDlgCtrlParent->ImplGetParent(); | 
|  |  | 
|  | if ( !pDlgCtrlParent || ((pDlgCtrlParent->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) != WB_DIALOGCONTROL) ) | 
|  | return sal_False; | 
|  | else | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | void Window::ImplDlgCtrlNextWindow() | 
|  | { | 
|  | Window* pDlgCtrlParent; | 
|  | Window* pDlgCtrl; | 
|  | Window* pSWindow; | 
|  | sal_uInt16  nIndex; | 
|  | sal_uInt16  nFormStart; | 
|  | sal_uInt16  nFormEnd; | 
|  |  | 
|  | // lookup window for dialog control | 
|  | pDlgCtrl = this; | 
|  | pDlgCtrlParent = ImplGetParent(); | 
|  | while ( pDlgCtrlParent && | 
|  | !pDlgCtrlParent->ImplIsOverlapWindow() && | 
|  | ((pDlgCtrlParent->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) != WB_DIALOGCONTROL) ) | 
|  | pDlgCtrlParent = pDlgCtrlParent->ImplGetParent(); | 
|  |  | 
|  | if ( !pDlgCtrlParent || (GetStyle() & WB_NODIALOGCONTROL) || ((pDlgCtrlParent->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) != WB_DIALOGCONTROL) ) | 
|  | return; | 
|  |  | 
|  | // lookup window in child list | 
|  | pSWindow = ::ImplFindDlgCtrlWindow( pDlgCtrlParent, pDlgCtrl, | 
|  | nIndex, nFormStart, nFormEnd ); | 
|  | if ( !pSWindow ) | 
|  | return; | 
|  |  | 
|  | Window* pWindow = pDlgCtrlParent->ImplGetDlgWindow( nIndex, DLGWINDOW_NEXT, nFormStart, nFormEnd ); | 
|  | if ( pWindow && (pWindow != pSWindow) ) | 
|  | pWindow->ImplControlFocus(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static void ImplDlgCtrlUpdateDefButton( Window* pParent, Window* pFocusWindow, | 
|  | sal_Bool bGetFocus ) | 
|  | { | 
|  | PushButton* pOldDefButton   = NULL; | 
|  | PushButton* pNewDefButton   = NULL; | 
|  | Window*     pSWindow; | 
|  | sal_uInt16      i; | 
|  | sal_uInt16      nFormStart; | 
|  | sal_uInt16      nFormEnd; | 
|  |  | 
|  | // Formular suchen | 
|  | pSWindow = ::ImplFindDlgCtrlWindow( pParent, pFocusWindow, i, nFormStart, nFormEnd ); | 
|  | if ( !pSWindow ) | 
|  | { | 
|  | nFormStart = 0; | 
|  | nFormEnd = 0xFFFF; | 
|  | } | 
|  |  | 
|  | pSWindow = ImplGetChildWindow( pParent, nFormStart, i, sal_False ); | 
|  | while ( pSWindow ) | 
|  | { | 
|  | if ( pSWindow->ImplIsPushButton() ) | 
|  | { | 
|  | PushButton* pPushButton = (PushButton*)pSWindow; | 
|  | if ( pPushButton->ImplIsDefButton() ) | 
|  | pOldDefButton = pPushButton; | 
|  | if ( pPushButton->HasChildPathFocus() ) | 
|  | pNewDefButton = pPushButton; | 
|  | else if ( !pNewDefButton && (pPushButton->GetStyle() & WB_DEFBUTTON) ) | 
|  | pNewDefButton = pPushButton; | 
|  | } | 
|  |  | 
|  | pSWindow = ImplGetNextWindow( pParent, i, i, sal_False ); | 
|  | if ( !i || (i > nFormEnd) ) | 
|  | pSWindow = NULL; | 
|  | } | 
|  |  | 
|  | if ( !bGetFocus ) | 
|  | { | 
|  | sal_uInt16 nDummy; | 
|  | Window* pNewFocusWindow = Application::GetFocusWindow(); | 
|  | if ( !pNewFocusWindow || !pParent->ImplIsWindowOrChild( pNewFocusWindow ) ) | 
|  | pNewDefButton = NULL; | 
|  | else if ( !::ImplFindDlgCtrlWindow( pParent, pNewFocusWindow, i, nDummy, nDummy ) || | 
|  | (i < nFormStart) || (i > nFormEnd) ) | 
|  | pNewDefButton = NULL; | 
|  | } | 
|  |  | 
|  | if ( pOldDefButton != pNewDefButton ) | 
|  | { | 
|  | if ( pOldDefButton ) | 
|  | pOldDefButton->ImplSetDefButton( sal_False ); | 
|  | if ( pNewDefButton ) | 
|  | pNewDefButton->ImplSetDefButton( sal_True ); | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void Window::ImplDlgCtrlFocusChanged( Window* pWindow, sal_Bool bGetFocus ) | 
|  | { | 
|  | if ( mpWindowImpl->mpDlgCtrlDownWindow && !bGetFocus ) | 
|  | { | 
|  | ((PushButton*)mpWindowImpl->mpDlgCtrlDownWindow)->SetPressed( sal_False ); | 
|  | mpWindowImpl->mpDlgCtrlDownWindow = NULL; | 
|  | } | 
|  |  | 
|  | ImplDlgCtrlUpdateDefButton( this, pWindow, bGetFocus ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Window* Window::ImplFindDlgCtrlWindow( Window* pWindow ) | 
|  | { | 
|  | sal_uInt16  nIndex; | 
|  | sal_uInt16  nFormStart; | 
|  | sal_uInt16  nFormEnd; | 
|  |  | 
|  | // Focus-Fenster in der Child-Liste suchen und zurueckgeben | 
|  | return ::ImplFindDlgCtrlWindow( this, pWindow, nIndex, nFormStart, nFormEnd ); | 
|  | } | 
|  |  | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Window* Window::GetParentLabelFor( const Window* ) const | 
|  | { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Window* Window::GetParentLabeledBy( const Window* ) const | 
|  | { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static sal_Unicode getAccel( const String& rStr ) | 
|  | { | 
|  | sal_Unicode nChar = 0; | 
|  | sal_uInt16 nPos = 0; | 
|  | do | 
|  | { | 
|  | nPos = rStr.Search( '~', nPos ); | 
|  | if( nPos != STRING_NOTFOUND && nPos < rStr.Len() ) | 
|  | nChar = rStr.GetChar( ++nPos ); | 
|  | else | 
|  | nChar = 0; | 
|  | } while( nChar == '~' ); | 
|  | return nChar; | 
|  | } | 
|  |  | 
|  | static Window* ImplGetLabelFor( Window* pFrameWindow, WindowType nMyType, Window* pLabel, sal_Unicode nAccel ) | 
|  | { | 
|  | Window* pWindow = NULL; | 
|  |  | 
|  | if( nMyType == WINDOW_FIXEDTEXT		|| | 
|  | nMyType == WINDOW_FIXEDLINE		|| | 
|  | nMyType == WINDOW_GROUPBOX ) | 
|  | { | 
|  | // #i100833# MT 2010/02: Group box and fixed lines can also lable a fixed text. | 
|  | // See tools/options/print for example. | 
|  | sal_Bool bThisIsAGroupControl = (nMyType == WINDOW_GROUPBOX) || (nMyType == WINDOW_FIXEDLINE); | 
|  | Window* pSWindow = NULL; | 
|  | // get index, form start and form end | 
|  | sal_uInt16 nIndex=0, nFormStart=0, nFormEnd=0; | 
|  | pSWindow = ::ImplFindDlgCtrlWindow( pFrameWindow, | 
|  | pLabel, | 
|  | nIndex, | 
|  | nFormStart, | 
|  | nFormEnd ); | 
|  | if( nAccel ) | 
|  | { | 
|  | // find the accelerated window | 
|  | pWindow = ::ImplFindAccelWindow( pFrameWindow, | 
|  | nIndex, | 
|  | nAccel, | 
|  | nFormStart, | 
|  | nFormEnd, | 
|  | sal_False ); | 
|  | } | 
|  | else | 
|  | { | 
|  | // find the next control; if that is a fixed text | 
|  | // fixed line or group box, then return NULL | 
|  | while( nIndex < nFormEnd ) | 
|  | { | 
|  | nIndex++; | 
|  | pSWindow = ::ImplGetChildWindow( pFrameWindow, | 
|  | nIndex, | 
|  | nIndex, | 
|  | sal_False ); | 
|  | if( pSWindow && pSWindow->IsVisible() && ! (pSWindow->GetStyle() & WB_NOLABEL) ) | 
|  | { | 
|  | WindowType nType = pSWindow->GetType(); | 
|  | if( nType != WINDOW_FIXEDTEXT	&& | 
|  | nType != WINDOW_FIXEDLINE	&& | 
|  | nType != WINDOW_GROUPBOX ) | 
|  | { | 
|  | pWindow = pSWindow; | 
|  | } | 
|  | else if( bThisIsAGroupControl && ( nType == WINDOW_FIXEDTEXT ) ) | 
|  | { | 
|  | pWindow = pSWindow; | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | Window* Window::GetAccessibleRelationLabelFor() const | 
|  | { | 
|  | if ( mpWindowImpl->mbDisableAccessibleLabelForRelation ) | 
|  | return NULL; | 
|  |  | 
|  | if ( mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabelForWindow ) | 
|  | return mpWindowImpl->mpAccessibleInfos->pLabelForWindow; | 
|  |  | 
|  |  | 
|  | Window* pWindow = NULL; | 
|  | Window* pFrameWindow = ImplGetFrameWindow(); | 
|  |  | 
|  | WinBits nFrameStyle = pFrameWindow->GetStyle(); | 
|  | if( ! ( nFrameStyle & WB_DIALOGCONTROL ) | 
|  | || ( nFrameStyle & WB_NODIALOGCONTROL ) | 
|  | ) | 
|  | return NULL; | 
|  |  | 
|  | if ( mpWindowImpl->mpRealParent ) | 
|  | pWindow = mpWindowImpl->mpRealParent->GetParentLabelFor( this ); | 
|  |  | 
|  | if( pWindow ) | 
|  | return pWindow; | 
|  |  | 
|  | sal_Unicode nAccel = getAccel( GetText() ); | 
|  |  | 
|  | pWindow = ImplGetLabelFor( pFrameWindow, GetType(), const_cast<Window*>(this), nAccel ); | 
|  | if( ! pWindow && mpWindowImpl->mpRealParent ) | 
|  | pWindow = ImplGetLabelFor( mpWindowImpl->mpRealParent, GetType(), const_cast<Window*>(this), nAccel ); | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | static Window* ImplGetLabeledBy( Window* pFrameWindow, WindowType nMyType, Window* pLabeled ) | 
|  | { | 
|  | Window* pWindow = NULL; | 
|  | if ( (nMyType != WINDOW_GROUPBOX) && (nMyType != WINDOW_FIXEDLINE) ) | 
|  | { | 
|  | // search for a control that labels this window | 
|  | // a label is considered the last fixed text, fixed line or group box | 
|  | // that comes before this control; with the exception of push buttons | 
|  | // which are labeled only if the fixed text, fixed line or group box | 
|  | // is directly before the control | 
|  |  | 
|  | // get form start and form end and index of this control | 
|  | sal_uInt16 nIndex, nFormStart, nFormEnd; | 
|  | Window* pSWindow = ::ImplFindDlgCtrlWindow( pFrameWindow, | 
|  | pLabeled, | 
|  | nIndex, | 
|  | nFormStart, | 
|  | nFormEnd ); | 
|  | if( pSWindow && nIndex != nFormStart ) | 
|  | { | 
|  | if( nMyType == WINDOW_PUSHBUTTON		|| | 
|  | nMyType == WINDOW_HELPBUTTON		|| | 
|  | nMyType == WINDOW_OKBUTTON		|| | 
|  | nMyType == WINDOW_CANCELBUTTON ) | 
|  | { | 
|  | nFormStart = nIndex-1; | 
|  | } | 
|  | for( sal_uInt16 nSearchIndex = nIndex-1; nSearchIndex >= nFormStart; nSearchIndex-- ) | 
|  | { | 
|  | sal_uInt16 nFoundIndex = 0; | 
|  | pSWindow = ::ImplGetChildWindow( pFrameWindow, | 
|  | nSearchIndex, | 
|  | nFoundIndex, | 
|  | sal_False ); | 
|  | if( pSWindow && pSWindow->IsVisible() && !(pSWindow->GetStyle() & WB_NOLABEL) ) | 
|  | { | 
|  | WindowType nType = pSWindow->GetType(); | 
|  | if ( ( nType == WINDOW_FIXEDTEXT	|| | 
|  | nType == WINDOW_FIXEDLINE	|| | 
|  | nType == WINDOW_GROUPBOX ) ) | 
|  | { | 
|  | // a fixed text can't be labeld by a fixed text. | 
|  | if ( ( nMyType != WINDOW_FIXEDTEXT ) || ( nType != WINDOW_FIXEDTEXT ) ) | 
|  | pWindow = pSWindow; | 
|  | break; | 
|  | } | 
|  | } | 
|  | if( nFoundIndex > nSearchIndex || nSearchIndex == 0 ) | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | Window* Window::GetAccessibleRelationLabeledBy() const | 
|  | { | 
|  | if ( mpWindowImpl->mbDisableAccessibleLabeledByRelation ) | 
|  | return NULL; | 
|  |  | 
|  | if ( mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabeledByWindow ) | 
|  | return mpWindowImpl->mpAccessibleInfos->pLabeledByWindow; | 
|  |  | 
|  | Window* pWindow = NULL; | 
|  | Window* pFrameWindow = ImplGetFrameWindow(); | 
|  |  | 
|  | if ( mpWindowImpl->mpRealParent ) | 
|  | { | 
|  | pWindow = mpWindowImpl->mpRealParent->GetParentLabeledBy( this ); | 
|  |  | 
|  | if( pWindow ) | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | // #i62723#, #104191# checkboxes and radiobuttons are not supposed to have labels | 
|  | if( GetType() == WINDOW_CHECKBOX || GetType() == WINDOW_RADIOBUTTON ) | 
|  | return NULL; | 
|  |  | 
|  | //    if( ! ( GetType() == WINDOW_FIXEDTEXT		|| | 
|  | //            GetType() == WINDOW_FIXEDLINE		|| | 
|  | //            GetType() == WINDOW_GROUPBOX ) ) | 
|  | // #i100833# MT 2010/02: Group box and fixed lines can also lable a fixed text. | 
|  | // See tools/options/print for example. | 
|  |  | 
|  | pWindow = ImplGetLabeledBy( pFrameWindow, GetType(), const_cast<Window*>(this) ); | 
|  | if( ! pWindow && mpWindowImpl->mpRealParent ) | 
|  | pWindow = ImplGetLabeledBy( mpWindowImpl->mpRealParent, GetType(), const_cast<Window*>(this) ); | 
|  |  | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | Window* Window::GetAccessibleRelationMemberOf() const | 
|  | { | 
|  | Window* pWindow = NULL; | 
|  | Window* pFrameWindow = GetParent(); | 
|  | if ( !pFrameWindow ) | 
|  | { | 
|  | pFrameWindow = ImplGetFrameWindow(); | 
|  | } | 
|  | // if( ! ( GetType() == WINDOW_FIXEDTEXT		|| | 
|  | if( !( GetType() == WINDOW_FIXEDLINE || | 
|  | GetType() == WINDOW_GROUPBOX ) ) | 
|  | { | 
|  | // search for a control that makes member of this window | 
|  | // it is considered the last fixed line or group box | 
|  | // that comes before this control; with the exception of push buttons | 
|  | // which are labeled only if the fixed line or group box | 
|  | // is directly before the control | 
|  | // get form start and form end and index of this control | 
|  | sal_uInt16 nIndex, nFormStart, nFormEnd; | 
|  | Window* pSWindow = ::ImplFindDlgCtrlWindow( pFrameWindow, | 
|  | const_cast<Window*>(this), | 
|  | nIndex, | 
|  | nFormStart, | 
|  | nFormEnd ); | 
|  | if( pSWindow && nIndex != nFormStart ) | 
|  | { | 
|  | if( GetType() == WINDOW_PUSHBUTTON		|| | 
|  | GetType() == WINDOW_HELPBUTTON		|| | 
|  | GetType() == WINDOW_OKBUTTON		|| | 
|  | GetType() == WINDOW_CANCELBUTTON ) | 
|  | { | 
|  | nFormStart = nIndex-1; | 
|  | } | 
|  | for( sal_uInt16 nSearchIndex = nIndex-1; nSearchIndex >= nFormStart; nSearchIndex-- ) | 
|  | { | 
|  | sal_uInt16 nFoundIndex = 0; | 
|  | pSWindow = ::ImplGetChildWindow( pFrameWindow, | 
|  | nSearchIndex, | 
|  | nFoundIndex, | 
|  | sal_False ); | 
|  | if( pSWindow && pSWindow->IsVisible() && | 
|  | ( pSWindow->GetType() == WINDOW_FIXEDLINE	|| | 
|  | pSWindow->GetType() == WINDOW_GROUPBOX ) ) | 
|  | { | 
|  | pWindow = pSWindow; | 
|  | break; | 
|  | } | 
|  | if( nFoundIndex > nSearchIndex || nSearchIndex == 0 ) | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | return pWindow; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | KeyEvent Window::GetActivationKey() const | 
|  | { | 
|  | KeyEvent aKeyEvent; | 
|  |  | 
|  | sal_Unicode nAccel = getAccel( GetText() ); | 
|  | if( ! nAccel ) | 
|  | { | 
|  | Window* pWindow = GetAccessibleRelationLabeledBy(); | 
|  | if( pWindow ) | 
|  | nAccel = getAccel( pWindow->GetText() ); | 
|  | } | 
|  | if( nAccel ) | 
|  | { | 
|  | sal_uInt16 nCode = 0; | 
|  | if( nAccel >= 'a' && nAccel <= 'z' ) | 
|  | nCode = KEY_A + (nAccel-'a'); | 
|  | else if( nAccel >= 'A' && nAccel <= 'Z' ) | 
|  | nCode = KEY_A + (nAccel-'A'); | 
|  | else if( nAccel >= '0' && nAccel <= '9' ) | 
|  | nCode = KEY_0 + (nAccel-'0'); | 
|  | else if( nAccel == '.' ) | 
|  | nCode = KEY_POINT; | 
|  | else if( nAccel == '-' ) | 
|  | nCode = KEY_SUBTRACT; | 
|  | KeyCode aKeyCode( nCode, sal_False, sal_False, sal_True, sal_False ); | 
|  | aKeyEvent = KeyEvent( nAccel, aKeyCode ); | 
|  | } | 
|  | return aKeyEvent; | 
|  | } |