diff options
Diffstat (limited to 'automation/source/server/sta_list.cxx')
-rw-r--r-- | automation/source/server/sta_list.cxx | 1194 |
1 files changed, 0 insertions, 1194 deletions
diff --git a/automation/source/server/sta_list.cxx b/automation/source/server/sta_list.cxx deleted file mode 100644 index 163c8e3dd..000000000 --- a/automation/source/server/sta_list.cxx +++ /dev/null @@ -1,1194 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_automation.hxx" -#include <tools/time.hxx> -#include <vcl/splitwin.hxx> -#include <vcl/wrkwin.hxx> -#include <basic/ttstrhlp.hxx> -#include "statemnt.hxx" - -#include "retstrm.hxx" -#include "rcontrol.hxx" - -#if OSL_DEBUG_LEVEL > 1 -#include "editwin.hxx" -#endif - -#include "profiler.hxx" -#include <vcl/floatwin.hxx> -#include <vcl/toolbox.hxx> - -// only needed for dynamic_cast in wintree -#include <svtools/editbrowsebox.hxx> -#include <svtools/valueset.hxx> -#include <svtools/roadmap.hxx> -#include <svtools/extensionlistbox.hxx> -#include <svtools/table/tablecontrol.hxx> - -#define WINDOW_ANYTYPE WINDOW_BASE - - -TTProfiler *StatementList::pProfiler = NULL; -StatementList *StatementList::pFirst = NULL; -sal_Bool StatementList::bReadingCommands = sal_False; -sal_Bool StatementList::bIsInReschedule = sal_False; -sal_uInt16 StatementList::nModalCount = 0; -Window *StatementList::pLastFocusWindow = NULL; -sal_Bool StatementList::bWasDragManager = sal_False; -sal_Bool StatementList::bWasPopupMenu = sal_False; -sal_Bool StatementList::bBasicWasRunning = sal_False; -RetStream *StatementList::pRet = NULL; -sal_Bool StatementList::IsError = sal_False; -sal_Bool StatementList::bDying = sal_False; -sal_Bool StatementList::bExecuting = sal_False; -StatementList *StatementList::pCurrentProfileStatement = NULL; -sal_Bool StatementList::bUsePostEvents = sal_True; -#if OSL_DEBUG_LEVEL > 1 -EditWindow *StatementList::m_pDbgWin; -#endif - - -rtl::OString StatementList::aWindowWaitUId = rtl::OString(); -Window *StatementList::pWindowWaitPointer = NULL; -rtl::OString StatementList::aWindowWaitOldHelpId = rtl::OString(); -rtl::OString StatementList::aWindowWaitOldUniqueId = rtl::OString(); -sal_uInt16 StatementList::nUseBindings = 0; - -sal_uInt16 StatementList::aSubMenuId1 = 0; // Untermen�s bei PopupMenus -sal_uInt16 StatementList::aSubMenuId2 = 0; // erstmal 2-Stufig -sal_uInt16 StatementList::aSubMenuId3 = 0; // and now even 3 levels #i31512# -SystemWindow *StatementList::pMenuWindow = NULL; -TTProperties *StatementList::pTTProperties = NULL; - -sal_uInt16 StatementList::nMinTypeKeysDelay = 0; // Verz�gerung der einzelnen Anschl�ge f�r TypeKeys -sal_uInt16 StatementList::nMaxTypeKeysDelay = 0; -sal_Bool StatementList::bDoTypeKeysDelay = sal_False; - -Window* StatementList::pFirstDocFrame = NULL; - -sal_Bool StatementList::bIsSlotInExecute = sal_False; - -sal_Bool StatementList::bCatchGPF = sal_True; - - -IMPL_GEN_RES_STR; - - -static TTSettings* pTTSettings = NULL; - -TTSettings* GetTTSettings() -{ - if ( !pTTSettings ) - { - pTTSettings = new TTSettings; - - // DisplayHID - pTTSettings->pDisplayInstance = NULL; - pTTSettings->pDisplayHidWin = NULL; - pTTSettings->Old = NULL; - pTTSettings->Act = NULL; - pTTSettings->aOriginalCaption.Erase(); - - // Translate - pTTSettings->pTranslateWin = NULL; - pTTSettings->bToTop = sal_True; - } - - return pTTSettings; -} - -// FIXME: HELPID -#define IS_WINP_CLOSING(pWin) \ - (pWin->GetHelpId().equalsL(RTL_CONSTASCII_STRINGPARAM("TT_Win_is_closing_HID")) && \ - pWin->GetUniqueId().equalsL(RTL_CONSTASCII_STRINGPARAM("TT_Win_is_closing_UID"))) - -StatementList::StatementList() -: nRetryCount(MAX_RETRIES) -, bStatementInQue(sal_False) -{ - if (!pRet) - pRet = new RetStream; // so Sp�t wie m�glich, aber dennoch Zentral und auf jeden Fall rechtzeitig, da pRet private ist. -} - -void StatementList::InitProfile() -{ - if ( pProfiler ) - { - if ( pProfiler->IsProfilingPerCommand() || pProfiler->IsPartitioning() ) - pProfiler->StartProfileInterval( pCurrentProfileStatement != this ); - -#if OSL_DEBUG_LEVEL > 1 - if ( pCurrentProfileStatement != NULL && pCurrentProfileStatement != this ) - pRet->GenReturn( RET_ProfileInfo, 0, CUniString("InitProfile von anderem Statement gerufen ohne SendProfile\n") ); -#endif - pCurrentProfileStatement = this; - } -} - -void StatementList::SendProfile( String aText ) -{ - if ( pProfiler ) - { - if ( pCurrentProfileStatement == this ) - { - if ( pProfiler->IsProfilingPerCommand() || pProfiler->IsPartitioning() ) - pProfiler->EndProfileInterval(); - - if ( pProfiler->IsProfilingPerCommand() ) - pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetProfileLine( aText ) ); - - if ( pProfiler->IsPartitioning() ) - // FIXME: HELPID - pRet->GenReturn( RET_ProfileInfo, S_ProfileTime, static_cast<comm_UINT32>(pProfiler->GetPartitioningTime()) ); // GetPartitioningTime() sal_uLong != comm_UINT32 on 64bit - } - - if ( pProfiler->IsAutoProfiling() ) - pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetAutoProfiling() ); - -#if OSL_DEBUG_LEVEL > 1 - if ( pCurrentProfileStatement == NULL ) - pRet->GenReturn( RET_ProfileInfo, 0, CUniString("SendProfile ohne InitProfile\n") ); -#endif - pCurrentProfileStatement = NULL; - } -} - -void StatementList::QueStatement(StatementList *pAfterThis) -{ - DBG_ASSERT(!bStatementInQue,"QueStatement f�r bereits eingetragenes Statement -> Abgebrochen"); - if ( bStatementInQue ) - return; - - bStatementInQue = sal_True; - if ( pAfterThis ) - { - if ( pAfterThis->bStatementInQue ) - { - pNext = pAfterThis->pNext; - pAfterThis->pNext = this; - } - else - { // pAfterThis not in que -> already dequed -> add to front of list - pNext = pFirst; - pFirst = this; - } - } - else // am Ende einf�gen - { - pNext = NULL; - if( !pFirst ) - pFirst = this; - else - { - StatementList *pList; - pList = pFirst; - while( pList->pNext ) - pList = pList->pNext; - pList->pNext = this; - } - } -} - -void StatementList::Advance() -{ // pFirst ist static! - pFirst = pNext; - bStatementInQue = sal_False; - pNext = NULL; -} - - -StatementList::~StatementList() -{ -#if OSL_DEBUG_LEVEL > 1 - m_pDbgWin->AddText( "Deleting \n" ); -#endif - DBG_ASSERT(!bReadingCommands,"Deleting commands while reading them!"); -} - -Window* StatementList::GetDocWin( sal_uInt16 nNr ) -{ - Window* pBase = Application::GetFirstTopLevelWindow(); - - while ( pBase ) - { - if ( IsDocWin( pBase ) ) - { - if ( !nNr ) - return pBase; - nNr--; - } - pBase = Application::GetNextTopLevelWindow( pBase ); - } - return NULL; -} - -sal_uInt16 StatementList::GetDocFrameCount() -{ - Window* pBase = Application::GetFirstTopLevelWindow(); - sal_uInt16 nCount = 0; - - while ( pBase ) - { - if ( IsDocFrame( pBase ) ) - nCount++; - pBase = Application::GetNextTopLevelWindow( pBase ); - } - return nCount; -} - -sal_uInt16 StatementList::GetDocWinCount() -{ - Window* pBase = Application::GetFirstTopLevelWindow(); - sal_uInt16 nCount = 0; - - while ( pBase ) - { - if ( IsDocWin( pBase ) ) - nCount++; - pBase = Application::GetNextTopLevelWindow( pBase ); - } - return nCount; -} - -Window* StatementList::SearchAllWin( Window *pBase, Search &aSearch, sal_Bool MaybeBase ) -{ - - if ( !pBase && !aSearch.HasSearchFlag( SEARCH_NO_TOPLEVEL_WIN ) ) - { - sal_Bool bSearchFocusFirst = aSearch.HasSearchFlag( SEARCH_FOCUS_FIRST ); - - Window *pControl = NULL; - if ( bSearchFocusFirst ) - { - // first test Parent of Focus Window - pBase = Application::GetFocusWindow(); - if ( pBase ) - { - DBG_ASSERT( WinPtrValid( pBase ), "GetFocusWindow is no valid WindowPointer" ); - Window *pPParent = pBase; - while ( pPParent->GET_REAL_PARENT() ) - pPParent = pPParent->GET_REAL_PARENT(); - - // get overlap window. Will be dialog else document itself - pBase = pBase->GetWindow( WINDOW_OVERLAP ); - - // set flag to find disabled elements. - // This is better than an enabled one on another Window - aSearch.AddSearchFlags( SEARCH_FIND_DISABLED ); - - // search on current Dialog first - pControl = SearchAllWin( pBase, aSearch ); - - // search on current Document - if ( !pControl && pBase != pPParent ) - pControl = SearchAllWin( pPParent, aSearch ); - - aSearch.RemoveSearchFlags( SEARCH_FIND_DISABLED ); - - if ( pControl ) - return pControl; - } - } - - pBase = Application::GetFirstTopLevelWindow(); - - while ( pBase ) - { - pControl = SearchAllWin( pBase, aSearch ); - if ( pControl ) - return pControl; - - pBase = Application::GetNextTopLevelWindow( pBase ); - } - return NULL; - } - - - Window *pResult = NULL; - pResult = SearchClientWin( pBase, aSearch, MaybeBase ); - if ( pResult ) - return pResult; - - if ( !aSearch.HasSearchFlag( SEARCH_NOOVERLAP ) ) - { - if ( pBase->GetWindow( WINDOW_FIRSTOVERLAP ) ) - pResult = SearchAllWin( pBase->GetWindow( WINDOW_FIRSTOVERLAP ), aSearch ); - - if ( !pResult && pBase->GetWindow( WINDOW_NEXT ) ) - pResult = SearchAllWin( pBase->GetWindow( WINDOW_NEXT ), aSearch ); - } - - return pResult; -} - - -Window* StatementList::SearchClientWin( Window *pBase, Search &aSearch, sal_Bool MaybeBase ) -{ - if ( !pBase ) - return NULL; - - if ( MaybeBase && aSearch.IsWinOK( pBase ) ) - return pBase; - - Window *pResult = NULL; - - sal_uInt16 i; - for( i = 0 ; i < pBase->GetChildCount() && !pResult; i++ ) - pResult = SearchClientWin( pBase->GetChild(i), aSearch ); - - return pResult; -} - - -sal_Bool SearchUID::IsWinOK( Window *pWin ) -{ - if ( aUId.equals( pWin->GetUniqueOrHelpId() ) ) - { - if ( ( pWin->IsEnabled() || HasSearchFlag( SEARCH_FIND_DISABLED ) ) && pWin->IsVisible() ) - return sal_True; - else - { - if ( !pMaybeResult ) - pMaybeResult = pWin; - return sal_False; - } - } - else if ( pWin->GetType() == WINDOW_TOOLBOX ) // Buttons and Controls on ToolBox. - { - ToolBox *pTB = ((ToolBox*)pWin); - sal_uInt16 i; - for ( i = 0; i < pTB->GetItemCount() ; i++ ) - { - if ( aUId.equals( Str2Id( pTB->GetItemCommand(pTB->GetItemId( i )) ) ) || aUId.equals( pTB->GetHelpId(pTB->GetItemId( i )) ) ) - { // ID matches. - Window *pItemWin; - pItemWin = pTB->GetItemWindow( pTB->GetItemId( i ) ); - - if ( bSearchButtonOnToolbox && pTB->GetItemType( i ) == TOOLBOXITEM_BUTTON && !pItemWin ) - { // We got a Control, see if its valid also. - // Same as above. - if ( ( pTB->IsEnabled() || HasSearchFlag( SEARCH_FIND_DISABLED ) ) && pTB->IsVisible() ) - { // We got a Button, see if its valid also. - if ( ( pTB->IsItemEnabled(pTB->GetItemId(i)) || HasSearchFlag( SEARCH_FIND_DISABLED ) ) - && pTB->IsItemVisible(pTB->GetItemId(i)) ) - return sal_True; // We got a Button. - else - { // better a disabled Button on a valid ToolBox than an invalid ToolBox as below - pMaybeResult = pTB; - return sal_False; - } - } - else if ( !pMaybeResult ) - { // invalid ToolBox - pMaybeResult = pTB; - return sal_False; - } - } - if ( pItemWin ) - { // We got a Control, see if its valid also. - // Same as above. - if ( ( pItemWin->IsEnabled() || HasSearchFlag( SEARCH_FIND_DISABLED ) ) && pItemWin->IsVisible() ) - { - if ( !pAlternateResult ) // only take the first found ItemWindow #i35365 - pAlternateResult = pItemWin; // since we cannot return a Window here - return sal_False; // continue searching to prefer a window with the right ID #i32292 - } - else if ( !pMaybeResult ) - { - pMaybeResult = pItemWin; - return sal_False; - } - } - } - } - return sal_False; - } - else - return sal_False; -} - -Window* StatementList::SearchTree( rtl::OString aUId ,sal_Bool bSearchButtonOnToolbox ) -{ - SearchUID aSearch(aUId,bSearchButtonOnToolbox); - - Window *pResult = SearchAllWin( NULL, aSearch ); - if ( pResult ) - return pResult; - else if ( aSearch.GetAlternateResultWin() ) - return aSearch.GetAlternateResultWin(); - else - return aSearch.GetMaybeWin(); -} - - -sal_Bool SearchWinPtr::IsWinOK( Window *pWin ) -{ - return pWin == pTest; -} - -sal_Bool StatementList::WinPtrValid(Window *pTest) -{ - SearchWinPtr aSearch( pTest ); - return SearchAllWin( NULL, aSearch ) != NULL; -} - - -sal_Bool SearchRT::IsWinOK( Window *pWin ) -{ - if ( pWin->IsVisible() && pWin->GetType() == mnRT ) - { - mnCount++; - if ( mnSkip ) - { - mnSkip--; - return sal_False; - } - else - return sal_True; - } - return sal_False; -} - -Window* StatementList::GetWinByRT( Window *pBase, WindowType nRT, sal_Bool MaybeBase, sal_uInt16 nSkip, sal_Bool bSearchAll ) -{ - SearchRT aSearch( nRT, 0, nSkip ); - if ( bSearchAll ) - aSearch.AddSearchFlags( SEARCH_FOCUS_FIRST | SEARCH_FIND_DISABLED ); - else - aSearch.AddSearchFlags( SEARCH_NOOVERLAP | SEARCH_NO_TOPLEVEL_WIN ); - - return SearchAllWin( pBase, aSearch, MaybeBase ); -} - -sal_uInt16 StatementList::CountWinByRT( Window *pBase, WindowType nRT, sal_Bool MaybeBase ) -{ - SearchRT aSearch( nRT, SEARCH_NOOVERLAP | SEARCH_NO_TOPLEVEL_WIN, 0xFFFF ); - - SearchAllWin( pBase, aSearch, MaybeBase ); - return aSearch.GetCount(); -} - -sal_Bool SearchScroll::IsWinOK( Window *pWin ) -{ - if ( SearchRT::IsWinOK( pWin ) ) - { - DBG_ASSERT( pWin->GetStyle() & ( WB_HORZ | WB_VERT ), "Nither WB_HORZ nor WB_VERT set on ScrollBar"); - return (( pWin->GetStyle() & WB_HORZ ) && ( nDirection == CONST_ALIGN_BOTTOM )) - || (( pWin->GetStyle() & WB_VERT ) && ( nDirection == CONST_ALIGN_RIGHT )); - } - return sal_False; -} - -ScrollBar* StatementList::GetScrollBar( Window *pBase, sal_uInt16 nDirection, sal_Bool MaybeBase ) -{ - SearchScroll aSearch( nDirection, SEARCH_NOOVERLAP | SEARCH_NO_TOPLEVEL_WIN ); - - return (ScrollBar*)SearchAllWin( pBase, aSearch, MaybeBase ); -} - - -sal_Bool SearchPopupFloatingWin::IsWinOK( Window *pWin ) -{ - return pWin->IsVisible() && pWin->GetType() == WINDOW_FLOATINGWINDOW && ((FloatingWindow*)pWin)->IsInPopupMode(); -} - -Window* StatementList::GetPopupFloatingWin( sal_Bool MaybeBase ) -{ - SearchPopupFloatingWin aSearch; - - return SearchAllWin( NULL, aSearch, MaybeBase ); -} - - -Menu* StatementList::GetMatchingMenu( Window* pWin, Menu* pBaseMenu ) -{ - if ( pBaseMenu ) - { - if ( pBaseMenu->GetWindow() == pWin ) - return pBaseMenu; - - sal_uInt16 i; - i = 0; - while ( i < pBaseMenu->GetItemCount() ) - { - PopupMenu* pPopup = pBaseMenu->GetPopupMenu( pBaseMenu->GetItemId( i ) ); - if ( pPopup && pPopup->GetWindow() ) - { - if ( pPopup->GetWindow() == pWin ) - return pPopup; - else - { - pBaseMenu = pPopup; - i = 0; - } - } - else - i++; - } - } - else - { - if ( PopupMenu::GetActivePopupMenu() ) - { - Menu* pMenu = GetMatchingMenu( pWin, PopupMenu::GetActivePopupMenu() ); - if ( pMenu ) - return pMenu; - } - - sal_uInt16 nSkip = 0; - Window* pMenuBarWin = NULL; - while ( (pMenuBarWin = GetWinByRT( NULL, WINDOW_MENUBARWINDOW, sal_True, nSkip++, sal_True )) != NULL ) - { - Window* pParent = pMenuBarWin->GET_REAL_PARENT(); - if ( pParent && pParent->GetType() == WINDOW_BORDERWINDOW && pParent->IsVisible() ) - { - Menu* pMenu = NULL; - // find Menu of MenuBarWindow - sal_uInt16 nCount; - for ( nCount = 0 ; nCount < pParent->GetChildCount() ; nCount++ ) - { - if ( pParent->GetChild( nCount )->GetType() == WINDOW_WORKWINDOW ) - pMenu = ((WorkWindow*)(pParent->GetChild( nCount )))->GetMenuBar(); - } - if ( pMenu ) - { - // check for menu bar in Task Window - if ( pMenuBarWin == pWin ) - return pMenu; - - // search submenues - pMenu = GetMatchingMenu( pWin, pMenu ); - if ( pMenu ) - return pMenu; - } - } - } - } - return NULL; -} - - -sal_Bool SearchActive::IsWinOK( Window *pWin ) -{ - // only matches ResID due to problems with UNIX Window Managers - return pWin->IsVisible() && ( (nRT == WINDOW_ANYTYPE && IsDialog(pWin) ) || pWin->GetType() == nRT ); -} - -Window* StatementList::GetActive( WindowType nRT, sal_Bool MaybeBase ) -{ - SearchActive aSearch( nRT ); - - return SearchAllWin( NULL, aSearch, MaybeBase ); -} - -sal_Bool SearchFadeSplitWin::IsWinOK( Window *pWin ) -{ -#if OSL_DEBUG_LEVEL > 1 - if ( pWin->GetType() == WINDOW_SPLITWINDOW ) - { - sal_Bool bResult; - WindowAlign aAlign; - bResult = pWin->IsVisible(); - bResult = ((SplitWindow*)pWin)->IsFadeInButtonVisible(); - bResult = ((SplitWindow*)pWin)->IsFadeOutButtonVisible(); - bResult = ((SplitWindow*)pWin)->IsAutoHideButtonVisible(); - aAlign = ((SplitWindow*)pWin)->GetAlign(); - } -#endif - return pWin->IsVisible() && ( pWin->GetType() == WINDOW_SPLITWINDOW ) - && (((SplitWindow*)pWin)->IsFadeInButtonVisible() || ((SplitWindow*)pWin)->IsFadeOutButtonVisible() ) - /*&& ((SplitWindow*)pWin)->IsAutoHideButtonVisible()*/ && ((SplitWindow*)pWin)->GetAlign() == nAlign; -} - -Window* StatementList::GetFadeSplitWin( Window *pBase, WindowAlign nAlign, sal_Bool MaybeBase ) -{ - SearchFadeSplitWin aSearch( nAlign ); - - if ( GetpApp()->GetAppWindow() == pBase && pBase->GetType() != WINDOW_BORDERWINDOW ) - pBase = pBase->GetWindow( WINDOW_OVERLAP ); - - return SearchAllWin( pBase, aSearch, MaybeBase ); -} - -Window* StatementList::GetMouseWin() -{ - Window *pBase = Application::GetFirstTopLevelWindow(); - Window *pControl = NULL; - while ( pBase ) - { - Window *pBaseFrame = pBase->GetWindow( WINDOW_OVERLAP ); - - Point aP = pBaseFrame->GetPointerPosPixel(); - pControl = pBaseFrame->FindWindow( aP ); - if ( pControl ) - return pControl; - - pBase = Application::GetNextTopLevelWindow( pBase ); - } - return NULL; -} - -Window* StatementList::GetFocus( WindowType nRT, sal_Bool MaybeBase ) -{ - - if ( nRT == WINDOW_TABCONTROL ) - { - Window *pResult = GetActive( WINDOW_TABDIALOG, MaybeBase); - for( sal_uInt16 i = 0 ; pResult && i < pResult->GetChildCount(); i++ ) - if ( pResult->GetChild(i)->GetType() == nRT ) - return pResult->GetChild(i); - } - - return NULL; -} - -Window* StatementList::GetAnyActive( sal_Bool MaybeBase ) -{ - Window *pControl; - - pControl = GetActive( WINDOW_MESSBOX, MaybeBase); - if ( !pControl ) - { - pControl = GetActive( WINDOW_INFOBOX, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_WARNINGBOX, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_ERRORBOX, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_QUERYBOX, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_BUTTONDIALOG, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_FILEDIALOG, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_PATHDIALOG, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_PRINTDIALOG, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_PRINTERSETUPDIALOG, MaybeBase); - } - if ( !pControl ) - { - pControl = GetActive( WINDOW_COLORDIALOG, MaybeBase); - } - if ( !pControl ) - { - pControl = GetFocus( WINDOW_TABCONTROL, MaybeBase); - } - - return pControl; -} - -void StatementList::SetFirstDocFrame( Window* pWin ) -{ - DBG_ASSERT( IsDocFrame( pWin ), "Non Document Frame set as first Document Frame" ); - pFirstDocFrame = pWin; -} - -Window* StatementList::GetFirstDocFrame() -{ - - if ( pFirstDocFrame && !WinPtrValid( pFirstDocFrame ) ) - pFirstDocFrame = NULL; - if ( pFirstDocFrame && !pFirstDocFrame->IsVisible() ) - pFirstDocFrame = NULL; - if ( pFirstDocFrame && !IsDocFrame( pFirstDocFrame ) ) - pFirstDocFrame = NULL; - if ( !pFirstDocFrame ) - { - Window* pBase = Application::GetFirstTopLevelWindow(); - while ( pBase && !IsDocFrame( pBase ) ) - pBase = Application::GetNextTopLevelWindow( pBase ); - - if ( pBase ) - SetFirstDocFrame( pBase ); - - if ( !pBase ) // find just something - { - pBase = Application::GetFirstTopLevelWindow(); - while ( pBase && !pBase->IsVisible() ) - pBase = Application::GetNextTopLevelWindow( pBase ); - - return pBase; // just for now, later we will hopefully have a Window - } - } - return pFirstDocFrame; -} - -sal_Bool StatementList::IsFirstDocFrame( Window* pWin ) -{ - return pWin && ( pWin == GetFirstDocFrame() || ( GetFirstDocFrame() && pWin == GetFirstDocFrame()->GetWindow( WINDOW_CLIENT ) ) ) && ( GetFirstDocFrame() && IsDocFrame( GetFirstDocFrame() ) ); -} - -MenuBar* StatementList::GetDocFrameMenuBar( Window* pWin ) -{ - if ( pWin && pWin->IsVisible() && pWin->GetType() == WINDOW_BORDERWINDOW ) - { - sal_uInt16 nCount; - for ( nCount = 0 ; nCount < pWin->GetChildCount() ; nCount++ ) - { - if ( pWin->GetChild( nCount )->GetType() == WINDOW_WORKWINDOW ) - return ((WorkWindow*)(pWin->GetChild( nCount )))->GetMenuBar(); - } - } - return NULL; -} - -// a Doc Frame is a Document or the Backing Window -sal_Bool StatementList::IsDocFrame( Window* pWin ) -{ - if ( pWin && pWin->IsVisible() && pWin->GetType() == WINDOW_BORDERWINDOW ) - { - sal_uInt16 nCount; - sal_Bool bHasWorkWindow = sal_False; - sal_Bool bHasMenuBar = sal_False; - // #91724# it is now necessary to sort out the IME WIndow in Solaris as well. - // so now we check for existence of WINDOW_WORKWINDOW and newly for - // WINDOW_MENUBARWINDOW which contains the Menu and the close/min/max buttons - for ( nCount = 0 ; nCount < pWin->GetChildCount() ; nCount++ ) - { - if ( pWin->GetChild( nCount )->GetType() == WINDOW_WORKWINDOW ) - bHasWorkWindow = sal_True; - if ( pWin->GetChild( nCount )->GetType() == WINDOW_MENUBARWINDOW ) - bHasMenuBar = sal_True; - } - return bHasWorkWindow && bHasMenuBar; - } - return sal_False; -} - -// a Doc Win is a real document (not the Backing Window) -sal_Bool StatementList::IsDocWin( Window* pWin ) -{ - if ( pWin && IsDocFrame( pWin ) ) - { - if ( GetDocFrameCount() != 1 ) - return sal_True; - else - { - // check for the close button to see if we are the last one or only the backing Window - if ( GetDocFrameMenuBar( pWin ) ) - return GetDocFrameMenuBar( pWin )->HasCloser(); - } - } - return sal_False; -} - -sal_Bool StatementList::IsIMEWin( Window* pWin ) // Input Window for CJK under Solaris -{ - if ( pWin && pWin->IsVisible() && pWin->GetType() == WINDOW_BORDERWINDOW ) - { - sal_uInt16 nCount; - sal_Bool bHasWorkWindow = sal_False; - sal_Bool bHasWindow = sal_False; - // #91724# it is now necessary to sort out the IME WIndow in Solaris as well. - // so now we check for existence of WINDOW_WORKWINDOW and newly for - // WINDOW_WINDOW which contains the Menu and the close/min/max buttons - for ( nCount = 0 ; nCount < pWin->GetChildCount() ; nCount++ ) - if ( pWin->GetChild( nCount )->GetType() == WINDOW_WORKWINDOW ) - bHasWorkWindow = sal_True; - for ( nCount = 0 ; nCount < pWin->GetChildCount() ; nCount++ ) - if ( pWin->GetChild( nCount )->GetType() == WINDOW_WINDOW ) - bHasWindow = sal_True; - return bHasWorkWindow && !bHasWindow; - } - return sal_False; -} - -UniString StatementList::Tree(Window *pBase, int Indent) -{ - - String aReturn, aSep; - if ( !pBase ) - { - aSep.AssignAscii("============================\n"); - aSep.ConvertLineEnd(); - pBase = Application::GetFirstTopLevelWindow(); - while ( pBase ) - { - Window *pBaseFrame = pBase->GetWindow( WINDOW_OVERLAP ); - - aReturn += aSep; - aReturn += Tree( pBaseFrame, Indent+1 ); - - pBase = Application::GetNextTopLevelWindow( pBase ); - } - return aReturn; - } - - - aSep.AssignAscii("----------------------------\n"); - aSep.ConvertLineEnd(); - - aReturn += ClientTree( pBase, Indent ); - - if ( pBase->GetWindow( WINDOW_FIRSTOVERLAP ) ) - { - aReturn += aSep; - aReturn += Tree( pBase->GetWindow( WINDOW_FIRSTOVERLAP ), Indent+1 ); - } - - if ( pBase->GetWindow( WINDOW_NEXT ) ) - { - aReturn += aSep; - aReturn += Tree( pBase->GetWindow( WINDOW_NEXT ), Indent ); - } - - return aReturn; -} - -String StatementList::ClientTree(Window *pBase, int Indent) -{ -#if OSL_DEBUG_LEVEL > 1 -#define WRITE(Text) { m_pDbgWin->AddText(Text); aReturn += Text; } -#define WRITEc(Text) { m_pDbgWin->AddText(Text); aReturn.AppendAscii(Text); } -#else -#define WRITE(Text) { aReturn += Text; } -#define WRITEc(Text) { aReturn.AppendAscii(Text); } -#endif - - String sIndent,aText,aReturn; - sIndent.Expand(sal::static_int_cast< xub_StrLen >(2*Indent)); - - aText = pBase->GetText(); - - - UniString t1,t2;t1 = CUniString("\n"); t2 = CUniString("\\n"); - aText.SearchAndReplaceAll(t1,t2 ); - - WRITE(sIndent); - - if (pBase->IsDialog()) - { - WRITEc("*(Dialog(TH))"); - } - if (IsDialog( pBase )) - { - WRITEc("*(Dialog(GH))"); - } - if (pBase->HasFocus()) - { - WRITEc("*(Focus)"); - } - if (!pBase->IsEnabled()) - { - WRITEc("*(Disab)"); - } - if (pBase->IsVisible()) - { - WRITEc("*(Visible)"); - } - if ( IsDialog(pBase) && ((SystemWindow*)pBase)->IsActive() ) - { - WRITEc("*(Active)"); - } - if ( pBase->GetStyle() & WB_CLOSEABLE ) - { - WRITEc("*(Closable)"); - } - if ( pBase->GetType() == WINDOW_DOCKINGWINDOW && - ((((DockingWindow*)pBase)->GetFloatStyle()) & WB_CLOSEABLE) ) - { - WRITEc("*(Closable Docking in Floatingstyle)"); - } - if ( pBase->GetStyle() & WB_DOCKABLE ) - { - WRITEc("*(Dockable)"); - } - if ( pBase->GetType() == WINDOW_SPLITWINDOW && - (((SplitWindow*)pBase)->IsFadeInButtonVisible() || ((SplitWindow*)pBase)->IsFadeOutButtonVisible()) ) - { - WRITEc("*(FadeIn/Out)"); - } - WRITEc("Text: "); - WRITE(aText); - WRITEc("\n"); - - WRITE(sIndent); - WRITEc("UId : "); - WRITE(Id2Str(pBase->GetUniqueOrHelpId())); - WRITEc(":0x"); - WRITE( - String::CreateFromInt64( - sal::static_int_cast< sal_Int64 >( - reinterpret_cast< sal_IntPtr >(pBase)), - 16 )); - WRITEc(":"); - WRITE(pBase->GetQuickHelpText()); - WRITEc(":"); - WRITE(pBase->GetHelpText()); - WRITEc("\n"); - - WRITE(sIndent); - WRITEc("RTyp: "); - WRITE(MakeStringNumber(TypeKenn,pBase->GetType())); - if ( pBase->GetType() == WINDOW_CONTROL ) - { - if ( dynamic_cast< svt::EditBrowseBox* >(pBase) ) - WRITEc("/BrowseBox") - else if ( dynamic_cast< ValueSet* >(pBase) ) - WRITEc("/ValueSet") - else if ( dynamic_cast< svt::ORoadmap* >(pBase) ) - WRITEc("/RoadMap") - else if ( dynamic_cast< svt::IExtensionListBox* >(pBase) ) - WRITEc("/ExtensionListBox") - else if ( dynamic_cast< svt::table::TableControl* >(pBase) ) - WRITEc("/TableControl") - else - WRITEc("/Unknown") - } - WRITEc("\n"); - - aReturn.ConvertLineEnd(); - sal_uInt16 i; - for (i = 0 ; i < pBase->GetChildCount() ; i++) - { - aReturn += ClientTree(pBase->GetChild(i),Indent+1); - } - return aReturn; -} - - -sal_Bool StatementList::CheckWindowWait() -{ - static Time StartTime = Time(0L); // Abbruch wenn Fenster absolut nicht schliesst. - if ( StartTime == Time(0L) ) - StartTime = Time(); - - if ( pWindowWaitPointer ) - { -#if OSL_DEBUG_LEVEL > 1 - m_pDbgWin->AddText( "Waiting for Window to close ... " ); -#endif - if ( WinPtrValid(pWindowWaitPointer) && IS_WINP_CLOSING(pWindowWaitPointer) ) - { -#if OSL_DEBUG_LEVEL > 1 - m_pDbgWin->AddText( Id2Str(aWindowWaitUId).AppendAscii(" Still Open. RType=") ); - m_pDbgWin->AddText( String::CreateFromInt32( pWindowWaitPointer->GetType() ).AppendAscii("\n") ); -#endif - - // Ist die Zeit schonn abgelaufen? - if ( StartTime + Time(0,0,10) < Time() ) // 10 Sekunden reichen wohl - { -#if OSL_DEBUG_LEVEL > 1 - m_pDbgWin->AddText( "Close timed out. Going on!! " ); -#endif - pWindowWaitPointer->SetHelpId(aWindowWaitOldHelpId); - pWindowWaitPointer->SetUniqueId(aWindowWaitOldUniqueId); - - aWindowWaitUId = rtl::OString(); - pWindowWaitPointer = NULL; - StartTime = Time(0L); - return sal_True; - } - - return sal_False; - } - pWindowWaitPointer = NULL; - aWindowWaitUId = rtl::OString(); -#if OSL_DEBUG_LEVEL > 1 - m_pDbgWin->AddText( "Closed, Going on.\n" ); -#endif - } - StartTime = Time(0L); - return sal_True; -} - -void StatementList::ReportError(String aMessage) -{ - ReportError ( rtl::OString(), aMessage ); -} - -void StatementList::ReportError(rtl::OString aUId, String aMessage) -{ - pRet->GenError ( aUId, aMessage ); - IsError = sal_True; -} - -void StatementList::ReportError(String aMessage, sal_uLong nWhatever) -{ - ReportError ( aMessage.AppendAscii(" ").Append(UniString::CreateFromInt32(nWhatever))); -} - -void StatementList::DirectLog( sal_uLong nType, String aMessage ) -{ - if ( pRet ) - pRet->GenReturn( RET_DirectLoging, (sal_uInt16) nType, aMessage ); -} - - -#define CALL_EVENT_WITH_NOTIFY( EventType, Event, WinP, Method ) \ -{ \ - if ( StatementList::WinPtrValid( WinP ) ) \ - { \ - NotifyEvent aNEvt( EventType, WinP, &Event ); \ - if ( !WinP->PreNotify( aNEvt ) ) \ - WinP->Method( Event ); \ - } \ -} - -void ImplKeyInput( Window* pWin, KeyEvent &aKEvnt, sal_Bool bForceDirect ) -{ - - if ( StatementList::bUsePostEvents && !bForceDirect ) - { - if ( StatementList::WinPtrValid( pWin ) ) - { - sal_uLong nID1; - sal_uLong nID2; - nID1 = Application::PostKeyEvent( VCLEVENT_WINDOW_KEYINPUT, pWin, &aKEvnt ); - nID2 = Application::PostKeyEvent( VCLEVENT_WINDOW_KEYUP, pWin, &aKEvnt ); - // wait after posting both events so deleting pWin will remove the second event also - ImplEventWait( nID1 ); - ImplEventWait( nID2 ); - } - } - else - { - if ( !Application::CallAccel( aKEvnt.GetKeyCode() ) ) - { - CALL_EVENT_WITH_NOTIFY( EVENT_KEYINPUT, aKEvnt, pWin, KeyInput ) - - KeyCode aCode = aKEvnt.GetKeyCode(); - if ( (aCode.GetCode() == KEY_CONTEXTMENU) || ((aCode.GetCode() == KEY_F10) && aCode.IsShift()) ) - { - if ( StatementList::WinPtrValid( pWin ) ) - { - Point aPos; - // simulate mouseposition at center of window - Size aSize = pWin->GetOutputSize(); - aPos = Point( aSize.getWidth()/2, aSize.getHeight()/2 ); - - CommandEvent aEvent( aPos, COMMAND_CONTEXTMENU, sal_False ); - ImplCommand( pWin, aEvent ); - } - } - } - - CALL_EVENT_WITH_NOTIFY( EVENT_KEYUP, aKEvnt, pWin, KeyUp ) - } -}; - -void ImplMouseMove( Window* pWin, MouseEvent &aMEvnt, sal_Bool bForceDirect ) -{ - if ( StatementList::bUsePostEvents && !bForceDirect ) - { - if ( StatementList::WinPtrValid( pWin ) ) - { - sal_uLong nID; - nID = Application::PostMouseEvent( VCLEVENT_WINDOW_MOUSEMOVE, pWin, &aMEvnt ); - ImplEventWait( nID ); - } - } - else - { - if ( pWin->IsTracking() ) - { - TrackingEvent aTEvt( aMEvnt ); - pWin->Tracking( aTEvt ); - } - else - CALL_EVENT_WITH_NOTIFY( EVENT_MOUSEMOVE, aMEvnt, pWin, MouseMove ) - } -}; - -void ImplMouseButtonDown( Window* pWin, MouseEvent &aMEvnt, sal_Bool bForceDirect ) -{ - if ( StatementList::bUsePostEvents && !bForceDirect ) - { - if ( StatementList::WinPtrValid( pWin ) ) - { - sal_uLong nID; - nID = Application::PostMouseEvent( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, pWin, &aMEvnt ); - ImplEventWait( nID ); - } - } - else - { - CALL_EVENT_WITH_NOTIFY( EVENT_MOUSEBUTTONDOWN, aMEvnt, pWin, MouseButtonDown ) - } -}; - -void ImplMouseButtonUp( Window* pWin, MouseEvent &aMEvnt, sal_Bool bForceDirect ) -{ - if ( StatementList::bUsePostEvents && !bForceDirect ) - { - if ( StatementList::WinPtrValid( pWin ) ) - { - sal_uLong nID; - nID = Application::PostMouseEvent( VCLEVENT_WINDOW_MOUSEBUTTONUP, pWin, &aMEvnt ); - ImplEventWait( nID ); - } - } - else - { - if ( pWin->IsTracking() ) - { - // siehe #64693 die Position ist f�r Toolboxen relevant - // #60020 Jetzt hoffentlich kein GPF mehr - // Zuerst Tracking beenden ohne Event - pWin->EndTracking( ENDTRACK_DONTCALLHDL ); - // dann eigenen Event mit richtigem Maus-Event senden - TrackingEvent aTEvt( aMEvnt, ENDTRACK_END ); - pWin->Tracking( aTEvt ); - } - else - CALL_EVENT_WITH_NOTIFY( EVENT_MOUSEBUTTONUP, aMEvnt, pWin, MouseButtonUp ) - } -}; - -void ImplEventWait( sal_uLong nID ) -{ - while ( !Application::IsProcessedMouseOrKeyEvent( nID ) ) - Application::Yield(); -} - -void ImplCommand( Window* pWin, CommandEvent &aCmdEvnt ) -{ - CALL_EVENT_WITH_NOTIFY( EVENT_COMMAND, aCmdEvnt, pWin, Command ) -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |