xref: /trunk/main/automation/source/server/statemnt.cxx (revision ffd38472365e95f6a578737bc9a5eb0fac624a86)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_automation.hxx"
24 #include <com/sun/star/frame/XFramesSupplier.hpp>
25 #include <com/sun/star/frame/XDispatch.hpp>
26 #include <com/sun/star/frame/XDispatchProvider.hpp>
27 #include <com/sun/star/util/XURLTransformer.hpp>
28 #include <comphelper/processfactory.hxx>
29 #include <comphelper/uieventslogger.hxx>
30 
31 #include <tools/wintypes.hxx>
32 #include <vcl/dialog.hxx>
33 #include <vcl/button.hxx>
34 #include <vcl/menubtn.hxx>
35 #include <svtools/svtreebx.hxx>
36 #include <svtools/brwbox.hxx>
37 #include <vcl/msgbox.hxx>
38 #include <vcl/dockwin.hxx>
39 #include <vcl/floatwin.hxx>
40 #include <vcl/lstbox.hxx>
41 #include <vcl/combobox.hxx>
42 #include <vcl/morebtn.hxx>
43 #include <vcl/field.hxx>
44 #include <vcl/toolbox.hxx>
45 #include <vcl/tabctrl.hxx>
46 #include <vcl/tabpage.hxx>
47 #include <vcl/menu.hxx>
48 #include <vcl/status.hxx>
49 #include <svtools/prgsbar.hxx>
50 #include <svtools/editbrowsebox.hxx>
51 #include <vcl/splitwin.hxx>
52 #include <vcl/group.hxx>
53 #include <vcl/fixed.hxx>
54 #include <vcl/wrkwin.hxx>
55 #include <osl/diagnose.h>
56 #include <svtools/valueset.hxx>
57 #include <svtools/roadmap.hxx>
58 #include <svtools/table/tablecontrol.hxx>
59 #include <svtools/table/tablecontrolinterface.hxx>
60 #include <svl/poolitem.hxx>
61 #include <svtools/extensionlistbox.hxx>
62 #include <svtools/svtdata.hxx>
63 #include <tools/time.hxx>
64 #include <svtools/stringtransfer.hxx>
65 #include <tools/stream.hxx>
66 #include <tools/fsys.hxx>
67 #include <svl/stritem.hxx>
68 #include <svtools/ttprops.hxx>
69 #include <basic/ttstrhlp.hxx>
70 #include <basic/dispdefs.hxx>
71 #include <basic/sbuno.hxx>
72 #include <vos/socket.hxx>
73 #include <svl/pickerhistory.hxx>
74 #include <com/sun/star/util/XCancellable.hpp>
75 #include <sot/storage.hxx>
76 #include <sot/storinfo.hxx>
77 #include "statemnt.hxx"
78 #include "scmdstrm.hxx"
79 #include "retstrm.hxx"
80 #if OSL_DEBUG_LEVEL > 1
81 #include "editwin.hxx"
82 #endif
83 #include "rcontrol.hxx"
84 #include <automation/communi.hxx>
85 #include "testtool.hxx"
86 #include "profiler.hxx"
87 #include "recorder.hxx"
88 #include "testtool.hrc"
89 #include <basic/svtmsg.hrc>
90 #include <algorithm>
91 #include <vcl/dibtools.hxx>
92 
93 using namespace com::sun::star::frame;
94 using namespace com::sun::star::uno;
95 //using namespace com::sun::star::util; can't be done because of Color
96 using namespace com::sun::star::beans;
97 using namespace svt;
98 //using namespace svt::table;
99 
100 #ifndef SBX_VALUE_DECL_DEFINED
101 #define SBX_VALUE_DECL_DEFINED
102 SV_DECL_REF(SbxValue)
103 #endif
104 SV_IMPL_REF(SbxValue)
105 
106 CommunicationLink *StatementFlow::pCommLink = NULL;
107 sal_Bool StatementFlow::bUseIPC = sal_True;
108 sal_Bool StatementFlow::bSending = sal_False;
109 ImplRemoteControl *StatementFlow::pRemoteControl = NULL;
110 
111 sal_uInt16 StatementCommand::nDirPos = 0;
112 Dir *StatementCommand::pDir = NULL;
113 pfunc_osl_printDebugMessage StatementCommand::pOriginal_osl_DebugMessageFunc = NULL;
114 
115 #define RESET_APPLICATION_TO_BACKING_WINDOW
116 
117 #define SET_WINP_CLOSING(pWin) \
118     pWindowWaitPointer = pWin; \
119     aWindowWaitUId = pControl->GetUniqueOrHelpId(); \
120     aWindowWaitOldHelpId = pWin->GetHelpId(); \
121     aWindowWaitOldUniqueId = pWin->GetUniqueId(); \
122     pWin->SetHelpId( rtl::OString("TT_Win_is_closing_HID") ); \
123     pWin->SetUniqueId( rtl::OString("TT_Win_is_closing_UID") );
124 
125 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
126 
127 StatementFlow::StatementFlow( StatementList *pAfterThis, sal_uInt16 nArtP )
128 : nArt(nArtP)
129 , nParams(0)
130 , nSNr1(0)
131 , nLNr1(0)
132 , aString1()
133 , bBool1(sal_False)
134 {
135     QueStatement( pAfterThis );
136 }
137 
138 StatementFlow::StatementFlow( sal_uLong nServiceId, SCmdStream *pCmdIn, ImplRemoteControl *pRC )
139 : nArt(0)
140 , nParams(0)
141 , nSNr1(0)
142 , nLNr1(0)
143 , aString1()
144 , bBool1(sal_False)
145 {
146     QueStatement( NULL );
147     bUseIPC = (nServiceId == SI_IPCCommandBlock);
148     pRemoteControl = pRC;
149     pCmdIn->Read( nArt );
150     pCmdIn->Read( nParams );
151 
152     if( nParams & PARAM_USHORT_1 )  pCmdIn->Read( nSNr1 );
153     if( nParams & PARAM_ULONG_1 )   pCmdIn->Read( nLNr1 );
154     if( nParams & PARAM_STR_1 )     pCmdIn->Read( aString1 );
155     if( nParams & PARAM_BOOL_1 )    pCmdIn->Read( bBool1 ); // should never occur!!
156 
157 #if OSL_DEBUG_LEVEL > 1
158     m_pDbgWin->AddText( "Reading FlowControl: " );
159     m_pDbgWin->AddText( String::CreateFromInt32( nArt ) );
160     m_pDbgWin->AddText( " Params:" );
161     if( nParams & PARAM_USHORT_1 )  {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nSNr1 ) );}
162     if( nParams & PARAM_ULONG_1 )   {m_pDbgWin->AddText( " l1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
163     if( nParams & PARAM_STR_1 )     {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
164     if( nParams & PARAM_BOOL_1 )    {m_pDbgWin->AddText( " b2:" );m_pDbgWin->AddText( bBool1 ? "TRUE" : "FALSE" );}
165     m_pDbgWin->AddText( "\n" );
166 #endif
167 }
168 
169 void StatementFlow::SendViaSocket()
170 {
171     if ( bSending )
172     {
173 #if OSL_DEBUG_LEVEL > 1
174         m_pDbgWin->AddText( "SendViaSocket called recursively. Aborted!!!\n" );
175 #endif
176         DBG_ERROR("SendViaSocket called recursively. Aborted!!!");
177         return;
178     }
179     bSending = sal_True;
180     if ( pCommLink )
181     {
182         if ( !pCommLink->TransferDataStream( pRet->GetStream() ) )  // If an error occurs, it is deleted immediately. ...
183             pCommLink = NULL;
184     }
185     else
186     {
187         // It doesn't matter if there is no basic core for the testtool.
188         DBG_ERROR("Cannot send results to TestTool");
189     }
190 
191     pRet->Reset();
192     bSending = sal_False;
193     IsError = sal_False;
194 }
195 
196 sal_Bool StatementFlow::Execute()
197 {
198 #if OSL_DEBUG_LEVEL > 1
199     m_pDbgWin->AddText( "Executing Flow: " );
200     m_pDbgWin->AddText( String::CreateFromInt32( nArt ) );
201     m_pDbgWin->AddText( "\n" );
202 #endif
203     switch ( nArt )
204     {
205     case F_EndCommandBlock:
206         {
207 
208             if ( !bUseIPC )
209             {
210                 // bBool1 was initialized to sal_False in CTOR
211                 if ( !bBool1 )  // so first run
212                 {
213                     pRemoteControl->pRetStream = pRet->GetStream();
214                     bBool1 = sal_True;  // was initialized to sal_False in CTOR
215                     nRetryCount = nRetryCount * 4;
216                 }
217                 if ( pRemoteControl->pRetStream && (nRetryCount--) )    // unless you picked up it.
218                 {
219                     return sal_False;   // Please get off the call stack once.
220                 }
221             }
222 
223         }
224         break;
225     }
226 
227     Advance();
228     switch ( nArt )
229     {
230     case F_EndCommandBlock:
231         if ( !bUseIPC )
232         {   // is discussed above
233             pRet->Reset();
234             IsError = sal_False;
235         }
236         else
237             SendViaSocket();
238 
239         break;
240 
241     case F_Sequence:
242 
243         pRet->GenReturn(RET_Sequence,nLNr1);
244         #if OSL_DEBUG_LEVEL > 1
245         m_pDbgWin->AddText( "Sending Sequence Nr: " );
246         m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );
247         m_pDbgWin->AddText( "\n" );
248         #endif
249 
250         break;
251 //  case RET_:
252     default:
253         DBG_ERROR( "Unknown Flowcontrol" );
254         break;
255     }
256 
257     delete this;
258     return sal_True;
259 }
260 
261 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
262 
263 // new auxiliary function, which must be constantly extended
264 static short ImpGetRType( Window *pWin )
265 {
266     short nRT = C_NoType;
267     WindowType eRT = pWin->GetType();
268     switch( eRT ) {
269         case WINDOW_WINDOW:             nRT = C_Window            ; break;
270 
271         case WINDOW_TABCONTROL:         nRT = C_TabControl        ; break;
272         case WINDOW_RADIOBUTTON:        nRT = C_RadioButton       ; break;
273         case WINDOW_CHECKBOX:           nRT = C_CheckBox          ; break;
274         case WINDOW_TRISTATEBOX:        nRT = C_TriStateBox       ; break;
275         case WINDOW_EDIT:               nRT = C_Edit              ; break;
276         case WINDOW_MULTILINEEDIT:      nRT = C_MultiLineEdit     ; break;
277         case WINDOW_MULTILISTBOX:       nRT = C_MultiListBox      ; break;
278         case WINDOW_LISTBOX:            nRT = C_ListBox           ; break;
279         case WINDOW_COMBOBOX:           nRT = C_ComboBox          ; break;
280         case WINDOW_PUSHBUTTON:         nRT = C_PushButton        ; break;
281         case WINDOW_SPINFIELD:          nRT = C_SpinField         ; break;
282         case WINDOW_PATTERNFIELD:       nRT = C_PatternField      ; break;
283         case WINDOW_NUMERICFIELD:       nRT = C_NumericField      ; break;
284         case WINDOW_METRICFIELD:        nRT = C_MetricField       ; break;
285         case WINDOW_CURRENCYFIELD:      nRT = C_CurrencyField     ; break;
286         case WINDOW_DATEFIELD:          nRT = C_DateField         ; break;
287         case WINDOW_TIMEFIELD:          nRT = C_TimeField         ; break;
288         case WINDOW_IMAGERADIOBUTTON:   nRT = C_ImageRadioButton  ; break;
289         case WINDOW_NUMERICBOX:         nRT = C_NumericBox        ; break;
290         case WINDOW_METRICBOX:          nRT = C_MetricBox         ; break;
291         case WINDOW_CURRENCYBOX:        nRT = C_CurrencyBox       ; break;
292         case WINDOW_DATEBOX:            nRT = C_DateBox           ; break;
293         case WINDOW_TIMEBOX:            nRT = C_TimeBox           ; break;
294         case WINDOW_IMAGEBUTTON:        nRT = C_ImageButton       ; break;
295         case WINDOW_MENUBUTTON:         nRT = C_MenuButton        ; break;
296         case WINDOW_MOREBUTTON:         nRT = C_MoreButton        ; break;
297 
298 
299         case WINDOW_TABPAGE:            nRT = C_TabPage;        break;
300         case WINDOW_MODALDIALOG:        nRT = C_ModalDlg;       break;
301         case WINDOW_FLOATINGWINDOW:     nRT = C_FloatWin;       break;
302         case WINDOW_MODELESSDIALOG:     nRT = C_ModelessDlg;    break;
303         case WINDOW_WORKWINDOW:         nRT = C_WorkWin;        break;
304         case WINDOW_DOCKINGWINDOW:      nRT = C_DockingWin;     break;
305 
306         case WINDOW_MESSBOX:            nRT = C_MessBox;        break;
307         case WINDOW_INFOBOX:            nRT = C_InfoBox;        break;
308         case WINDOW_WARNINGBOX:         nRT = C_WarningBox;     break;
309         case WINDOW_ERRORBOX:           nRT = C_ErrorBox;       break;
310         case WINDOW_QUERYBOX:           nRT = C_QueryBox;       break;
311 #if 0 //ifndef VCL
312         case WINDOW_FILEDIALOG:         nRT = C_FileDlg;        break;
313         case WINDOW_PATHDIALOG:         nRT = C_PathDlg;        break;
314         case WINDOW_PRINTDIALOG:        nRT = C_PrintDlg;       break;
315         case WINDOW_PRINTERSETUPDIALOG: nRT = C_PrinterSetupDlg;break;
316         case WINDOW_COLORDIALOG:        nRT = C_ColorDlg;       break;
317 #endif
318         case WINDOW_TABDIALOG:          nRT = C_TabDlg;         break;
319 //      case WINDOW_TABDIALOG:          nRT = C_SingleTabDlg;   break;
320 
321         case WINDOW_PATTERNBOX:         nRT = C_PatternBox;     break;
322         case WINDOW_TOOLBOX:            nRT = C_ToolBox;        break;
323 // Doesn't exist       case WINDOW_VALUESET:            nRT = C_ValueSet;       break;
324         case WINDOW_CONTROL:            nRT = C_Control;        break;
325         case WINDOW_OKBUTTON:           nRT = C_OkButton;       break;
326         case WINDOW_CANCELBUTTON:       nRT = C_CancelButton;   break;
327         case WINDOW_BUTTONDIALOG:       nRT = C_ButtonDialog;   break;
328         case WINDOW_TREELISTBOX:        nRT = C_TreeListBox;    break;
329 
330         case WINDOW_DIALOG:             nRT = C_Dialog;         break;
331     }
332     return nRT;
333 }
334 
335 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
336 
337 StatementSlot::StatementSlot( SCmdStream *pCmdIn )
338 : pItemArr(NULL)
339 {
340     QueStatement( NULL );
341     pCmdIn->Read( nFunctionId );
342 #if OSL_DEBUG_LEVEL > 1
343     m_pDbgWin->AddText( "Reading Slot: " );
344     m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
345     m_pDbgWin->AddText( "\n" );
346 #endif
347     pCmdIn->Read( nAnzahl );
348     if ( nAnzahl )
349     {
350         switch ( pCmdIn->GetNextType() )
351         {
352             case BinUSHORT: // use old calling method
353                 {
354                     nAnzahl++;
355                     pItemArr = new SfxPoolItem*[nAnzahl];
356                     for (sal_uInt16 i = 0 ; i+1 < nAnzahl ; i++)
357                         pCmdIn->Read( pItemArr[i] );
358                     pItemArr[nAnzahl-1] = NULL;
359                 }
360                 break;
361             case BinString: // new Method
362                 {
363                     aArgs.realloc(nAnzahl);
364                     PropertyValue* pArg = aArgs.getArray();
365                     for (sal_uInt16 i = 0 ; i < nAnzahl ; i++)
366                         pCmdIn->Read( pArg[i] );
367                 }
368                 break;
369         }
370     }
371 }
372 
373 // Constructor for UnoSlot
374 StatementSlot::StatementSlot()
375 : nAnzahl( 0 )
376 , pItemArr(NULL)
377 , nFunctionId( 0 )
378 , bMenuClosed(sal_False)
379 {}
380 
381 StatementSlot::StatementSlot( sal_uLong nSlot, SfxPoolItem* pItem )
382 : pItemArr(NULL)
383 , bMenuClosed(sal_False)
384 {
385     QueStatement( NULL );
386     nFunctionId = sal_uInt16(nSlot);
387 #if OSL_DEBUG_LEVEL > 1
388     m_pDbgWin->AddText( "Reading Slot: " );
389     m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
390     m_pDbgWin->AddText( "\n" );
391 #endif
392     if ( pItem )
393     {
394         nAnzahl = 2;
395         pItemArr = new SfxPoolItem*[2];
396         pItemArr[0] = pItem;
397         pItemArr[1] = NULL;
398     }
399     else
400         nAnzahl = 0;
401 }
402 
403 StatementSlot::~StatementSlot()
404 {
405     if (nAnzahl)
406     {
407         if ( pItemArr )
408         {
409             for (sal_uInt16 i = 0 ; i+1 < nAnzahl ; i++)
410                 delete pItemArr[i];
411             delete[] pItemArr;
412         }
413 
414         aArgs.realloc( 0 );
415     }
416 }
417 
418 void StatementSlot::AddReferer()
419 {
420     HACK( "only to test!" );
421 // because slot 6102 /*SID_VERB_START*/ crashes when called with Property Referer
422 // We return to the previous behavior (which was a bug really) of not adding this Property to calls which have no properties at all
423 // according to MBA most likely this Property can be removed at all and is maybe only needed for Slots with URLs
424     if ( !nAnzahl )
425         return;
426 
427     PropertyValue* pArg;
428 
429     nAnzahl++;
430     aArgs.realloc(nAnzahl);
431     pArg = aArgs.getArray();
432     pArg[nAnzahl-1].Name = rtl::OUString::createFromAscii("Referer");
433     pArg[nAnzahl-1].Value <<= ::rtl::OUString::createFromAscii("private:user");
434 
435     nAnzahl++;
436     aArgs.realloc(nAnzahl);
437     pArg = aArgs.getArray();
438     pArg[nAnzahl-1].Name = rtl::OUString::createFromAscii("SynchronMode");
439     pArg[nAnzahl-1].Value <<= sal_Bool( sal_True );
440 }
441 
442 class SlotStatusListener : public cppu::WeakImplHelper1< XStatusListener >
443 {
444 public:
445     SlotStatusListener();
446 
447     // XStatusListener
448     virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw (::com::sun::star::uno::RuntimeException);
449     // XEventListener
450     virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
451 
452     // local Members
453     sal_Bool bDisposed;
454     sal_Bool bEnabled;
455 };
456 /*
457 struct FeatureStateEvent : public ::com::sun::star::lang::EventObject
458     ::com::sun::star::util::URL FeatureURL;
459     ::rtl::OUString FeatureDescriptor;
460     sal_Bool IsEnabled;
461     sal_Bool Requery;
462     ::com::sun::star::uno::Any State;
463 
464     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > Source;
465 */
466 
467 SlotStatusListener::SlotStatusListener()
468 : bDisposed( sal_False )
469 , bEnabled( sal_True )
470 {}
471 
472 // XStatusListener
473 void SAL_CALL SlotStatusListener::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw (::com::sun::star::uno::RuntimeException)
474 {
475 //    DBG_ERROR1("FeatureURL: %s", ByteString( String( Event.FeatureURL.Complete ), RTL_TEXTENCODING_UTF8 ).GetBuffer() );
476 //    DBG_ERROR1("FeatureDescriptor: %s", ByteString( String( Event.FeatureDescriptor ), RTL_TEXTENCODING_UTF8 ).GetBuffer() );
477     bEnabled = Event.IsEnabled;
478 //    DBG_ASSERT( Event.IsEnabled, "Not enabled" );
479 //    DBG_ASSERT( !Event.Requery, "Requery" );
480 }
481 
482 // XEventListener
483 void SAL_CALL SlotStatusListener::disposing( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException)
484 {
485     bDisposed = sal_True;
486 }
487 
488 sal_Bool StatementSlot::Execute()
489 {
490     if ( IsError )
491     {
492         #if OSL_DEBUG_LEVEL > 1
493         m_pDbgWin->AddText( "Skipping Slot: " );
494         m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
495         m_pDbgWin->AddText( "\n" );
496         #endif
497 
498         Advance();
499         delete this;
500         return sal_True;
501     }
502 
503     InitProfile();
504 #if OSL_DEBUG_LEVEL > 1
505     m_pDbgWin->AddText( "Executing Slot: " );
506     m_pDbgWin->AddText( String::CreateFromInt32( nFunctionId ) );
507     m_pDbgWin->AddText( "\n" );
508 #endif
509 
510     PopupMenu *pPopup = NULL;
511     MenuBar *pMenuBar = NULL;
512     Menu *pMenu;
513 
514     GetCurrentMenues( pPopup, pMenuBar, pMenu );
515     if ( pPopup )
516     {
517         if ( !bMenuClosed )
518         {
519             pPopup->EndExecute(0);
520             aSubMenuId1 = 0;
521             aSubMenuId2 = 0;
522             aSubMenuId3 = 0;
523             pMenuWindow = NULL;
524             bMenuClosed = sal_True;
525 #if OSL_DEBUG_LEVEL > 1
526             m_pDbgWin->AddText( "Closed contextmenu\n" );
527 #endif
528             return sal_False;
529         }
530         else if ( nRetryCount-- )
531         {
532 #if OSL_DEBUG_LEVEL > 1
533             m_pDbgWin->AddText( "Waiting for contextmenu to close\n" );
534 #endif
535             return sal_False;
536         }
537         else
538             ReportError( GEN_RES_STR0( S_MENU_NOT_CLOSING ) );
539     }
540 
541     Advance();
542 
543     if ( !IsError )
544     {
545         if ( ( nAnzahl == 0 && !getenv("OLDSLOTHANDLING") ) || aArgs.hasElements() )
546         {   // trying to call slots via uno
547             AddReferer();
548             if ( !aUnoUrl.Len() )
549                 aUnoUrl = CUniString("slot:").Append( String::CreateFromInt32( nFunctionId ) );
550             ::com::sun::star::util::URL aTargetURL;
551             aTargetURL.Complete = aUnoUrl;
552             Reference < XFramesSupplier > xDesktop = Reference < XFramesSupplier >( ::comphelper::getProcessServiceFactory()->createInstance( CUniString("com.sun.star.frame.Desktop") ), UNO_QUERY );
553             Reference < XFrame > xFrame;
554 
555             if ( xDesktop.is() )
556             {
557                 xFrame = xDesktop->getActiveFrame();
558                 if ( !xFrame.is() )
559                 {
560                     Reference < XFrames > xFrames;
561                     xFrames = xDesktop->getFrames();
562                     if ( xFrames.is() && xFrames->getCount() > 0 )
563                     {
564                         Any aFrame = xFrames->getByIndex( xFrames->getCount() -1 );
565                         aFrame >>= xFrame;
566                     }
567                 }
568                 if ( !xFrame.is() )
569                 {
570                     if ( GetFirstDocFrame() )
571                         GetFirstDocFrame()->ToTop();
572                     xFrame = xDesktop->getActiveFrame();
573                 }
574             }
575 
576             if ( xFrame.is() )
577                 xDesktop = Reference < XFramesSupplier >( xFrame, UNO_QUERY );
578             else
579                 xDesktop.clear();
580 
581             while ( xDesktop.is() && xDesktop->getActiveFrame().is() )
582             {
583                 xFrame = xDesktop->getActiveFrame();
584 #if OSL_DEBUG_LEVEL > 1
585                 ::rtl::OUString aName;
586                 if ( xFrame.is() )
587                     aName = xFrame->getName();
588 #endif
589                 xDesktop = Reference < XFramesSupplier >( xFrame, UNO_QUERY );
590             }
591 
592             if ( !xFrame.is() )
593                 ReportError( GEN_RES_STR1( S_UNO_URL_EXECUTE_FAILED_NO_FRAME, aTargetURL.Complete ) );
594             else
595             {
596                 Reference < ::com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( CUniString("com.sun.star.util.URLTransformer" )), UNO_QUERY );
597                 xTrans->parseStrict( aTargetURL );
598 
599                 Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
600                 Reference < XDispatch > xDisp;
601                 while ( xProv.is() && !xDisp.is() )
602                 {
603                     xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString(), 0 );
604                     if ( !xDisp.is() )
605                     {
606                         xFrame = Reference < XFrame > ( xFrame->getCreator(), UNO_QUERY );
607                         xProv = Reference < XDispatchProvider > ( xFrame, UNO_QUERY );
608                     }
609                 }
610 
611                 if ( xDisp.is() )
612                 {
613                     Reference < XStatusListener > xListener = ( XStatusListener* )new SlotStatusListener;
614                     xDisp->addStatusListener( xListener, aTargetURL );
615                     if ( static_cast< SlotStatusListener* >(xListener.get())->bEnabled )
616                     {
617                         if ( bIsSlotInExecute )
618                             ReportError( GEN_RES_STR0( S_SLOT_IN_EXECUTE ) );
619                         else
620                         {
621                             bIsSlotInExecute = sal_True;
622                             xDisp->dispatch( aTargetURL, aArgs );
623                             bIsSlotInExecute = sal_False;
624                         }
625                     }
626                     else
627                         ReportError( GEN_RES_STR1( S_UNO_URL_EXECUTE_FAILED_DISABLED, aTargetURL.Complete ) );
628                     xDisp->removeStatusListener( xListener, aTargetURL );
629                 }
630                 else
631                     ReportError( GEN_RES_STR1( S_UNO_URL_EXECUTE_FAILED_NO_DISPATCHER, aTargetURL.Complete ) );
632             }
633         }
634         else
635         {
636             DirectLog( S_QAError, GEN_RES_STR0( S_DEPRECATED ) );
637             if ( !pTTProperties )
638                 pTTProperties = new TTProperties();
639 
640             switch ( pTTProperties->ExecuteFunction( nFunctionId, pItemArr, EXECUTEMODE_DIALOGASYNCHRON | nUseBindings ) )
641             {
642             case TT_PR_ERR_NODISPATCHER:
643                 {
644                     ReportError( rtl::OString::valueOf((sal_Int32)nFunctionId), GEN_RES_STR0( S_SID_EXECUTE_FAILED_NO_DISPATCHER ) );
645                 }
646                 break;
647             case TT_PR_ERR_NOEXECUTE:
648                 {
649                     ReportError( rtl::OString::valueOf((sal_Int32)nFunctionId), GEN_RES_STR0( S_SID_EXECUTE_FAILED ) );
650                 }
651                 break;
652             }
653         }
654     }
655 
656 
657 /*  New method from the line 334!
658     New method for setting that modal dialogs are always called asynchronously
659     and a real return value, whether slot has worked
660     and testing whether slot can be called by UI at all       */
661 
662 
663     SendProfile( SlotString( nFunctionId ) );
664     delete this;
665     return sal_True;
666 }
667 
668 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
669 
670 StatementUnoSlot::StatementUnoSlot(SCmdStream *pIn)
671 {
672     QueStatement( NULL );
673 
674     pIn->Read( aUnoUrl );
675 
676 #if OSL_DEBUG_LEVEL > 1
677     StatementList::m_pDbgWin->AddText( "UnoUrl:" );
678     StatementList::m_pDbgWin->AddText( aUnoUrl );
679     StatementList::m_pDbgWin->AddText( "\n" );
680 #endif
681 
682 }
683 
684 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
685 
686 StatementCommand::StatementCommand( StatementList *pAfterThis, sal_uInt16 MethodId, sal_uInt16 Params, sal_uInt16 Nr1 )
687 : nMethodId( MethodId )
688 , nParams(Params)
689 , nNr1(Nr1)
690 , nNr2(0)
691 , nNr3(0)
692 , nNr4(0)
693 , nLNr1(0)
694 , aString1()
695 , aString2()
696 , bBool1(sal_False)
697 , bBool2(sal_False)
698 {
699     QueStatement( pAfterThis );
700 
701 #if OSL_DEBUG_LEVEL > 1
702     m_pDbgWin->AddText( "Directly adding Conmmand:" );
703     m_pDbgWin->AddText( " Methode: " );
704     m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
705     m_pDbgWin->AddText( " Params:" );
706     if( nParams & PARAM_USHORT_1 )  {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr1 ) );}
707     if( nParams & PARAM_USHORT_2 )  {m_pDbgWin->AddText( " n2:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr2 ) );}
708     if( nParams & PARAM_USHORT_3 )  {m_pDbgWin->AddText( " n3:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr3 ) );}
709     if( nParams & PARAM_USHORT_4 )  {m_pDbgWin->AddText( " n4:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr4 ) );}
710     if( nParams & PARAM_ULONG_1 )   {m_pDbgWin->AddText( " nl1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
711     if( nParams & PARAM_STR_1 )     {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
712     if( nParams & PARAM_STR_2 )     {m_pDbgWin->AddText( " s2:" );m_pDbgWin->AddText( aString2 );}
713     if( nParams & PARAM_BOOL_1 )    {m_pDbgWin->AddText( " b1:" );m_pDbgWin->AddText( bBool1 ? "TRUE" : "FALSE" );}
714     if( nParams & PARAM_BOOL_2 )    {m_pDbgWin->AddText( " b2:" );m_pDbgWin->AddText( bBool2 ? "TRUE" : "FALSE" );}
715     m_pDbgWin->AddText( "\n" );
716 #endif
717 }
718 
719 
720 StatementCommand::StatementCommand( SCmdStream *pCmdIn )
721 : nMethodId(0)
722 , nParams(0)
723 , nNr1(0)
724 , nNr2(0)
725 , nNr3(0)
726 , nNr4(0)
727 , nLNr1(0)
728 , aString1()
729 , aString2()
730 , bBool1(sal_False)
731 , bBool2(sal_False)
732 {
733     QueStatement( NULL );
734     pCmdIn->Read( nMethodId );
735     pCmdIn->Read( nParams );
736 
737     if( nParams & PARAM_USHORT_1 )  pCmdIn->Read( nNr1 );
738     if( nParams & PARAM_USHORT_2 )  pCmdIn->Read( nNr2 );
739     if( nParams & PARAM_USHORT_3 )  pCmdIn->Read( nNr3 );
740     if( nParams & PARAM_USHORT_4 )  pCmdIn->Read( nNr4 );
741     if( nParams & PARAM_ULONG_1 )   pCmdIn->Read( nLNr1 );
742     if( nParams & PARAM_STR_1 )     pCmdIn->Read( aString1 );
743     if( nParams & PARAM_STR_2 )     pCmdIn->Read( aString2 );
744     if( nParams & PARAM_BOOL_1 )    pCmdIn->Read( bBool1 );
745     if( nParams & PARAM_BOOL_2 )    pCmdIn->Read( bBool2 );
746 
747 #if OSL_DEBUG_LEVEL > 1
748     m_pDbgWin->AddText( "Reading Conmmand:" );
749     m_pDbgWin->AddText( " Methode: " );
750     m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
751     m_pDbgWin->AddText( " Params:" );
752     if( nParams & PARAM_USHORT_1 )  {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr1 ) );}
753     if( nParams & PARAM_USHORT_2 )  {m_pDbgWin->AddText( " n2:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr2 ) );}
754     if( nParams & PARAM_USHORT_3 )  {m_pDbgWin->AddText( " n3:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr3 ) );}
755     if( nParams & PARAM_USHORT_4 )  {m_pDbgWin->AddText( " n4:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr4 ) );}
756     if( nParams & PARAM_ULONG_1 )   {m_pDbgWin->AddText( " nl1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
757     if( nParams & PARAM_STR_1 )     {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
758     if( nParams & PARAM_STR_2 )     {m_pDbgWin->AddText( " s2:" );m_pDbgWin->AddText( aString2 );}
759     if( nParams & PARAM_BOOL_1 )    {m_pDbgWin->AddText( " b1:" );m_pDbgWin->AddText( bBool1 ? "TRUE" : "FALSE" );}
760     if( nParams & PARAM_BOOL_2 )    {m_pDbgWin->AddText( " b2:" );m_pDbgWin->AddText( bBool2 ? "TRUE" : "FALSE" );}
761     m_pDbgWin->AddText( "\n" );
762 #endif
763 
764     if ( nMethodId == RC_AppAbort )
765     {
766         #if OSL_DEBUG_LEVEL > 1
767         m_pDbgWin->AddText( "*Deleting all Commands:\n" );
768         #endif
769         bReadingCommands = sal_False;
770         while ( StatementList::pFirst != this ) // Delete everything except myself
771         {
772             StatementList *pDeQue = StatementList::pFirst;
773             pDeQue->Advance();
774             delete pDeQue;
775         }
776         bReadingCommands = sal_True;
777         #if OSL_DEBUG_LEVEL > 1
778         m_pDbgWin->AddText( "*Done deleting all Commands:\n" );
779         #endif
780     }
781 
782 }
783 
784 void StatementCommand::WriteControlData( Window *pBase, sal_uLong nConf, sal_Bool bFirst )
785 {
786 
787     if ( IsDialog(pBase) && !bFirst )
788         return;
789 
790     if ( bFirst )
791         pRet->GenReturn ( RET_WinInfo, rtl::OString(), (comm_ULONG)nConf | DH_MODE_DATA_VALID, UniString(), sal_True );
792 
793     if ( bFirst )
794     {
795         if ( pBase->GetType() == WINDOW_WINDOW && pBase->GetParent() && pBase->GetParent()->GetType() == WINDOW_CONTROL &&
796             dynamic_cast< svt::table::TableControl* > ( pBase->GetParent() ) )
797             pBase = pBase->GetParent();
798     }
799 
800     {   // KParentheses, so that the string does not persist during recursion.
801         String aName;
802         sal_Bool bSkip = sal_False;
803 
804         switch ( pBase->GetType() )
805         {
806             case WINDOW_RADIOBUTTON:
807             case WINDOW_CHECKBOX:
808             case WINDOW_TRISTATEBOX:
809             case WINDOW_PUSHBUTTON:
810             case WINDOW_OKBUTTON:
811             case WINDOW_CANCELBUTTON:
812             case WINDOW_IMAGERADIOBUTTON:
813             case WINDOW_IMAGEBUTTON:
814             case WINDOW_MENUBUTTON:
815             case WINDOW_MOREBUTTON:
816             case WINDOW_TABPAGE:
817             case WINDOW_MODALDIALOG:
818             case WINDOW_FLOATINGWINDOW:
819             case WINDOW_MODELESSDIALOG:
820             case WINDOW_WORKWINDOW:
821             case WINDOW_DOCKINGWINDOW:
822             case WINDOW_CONTROL:
823 
824             case WINDOW_FILEDIALOG:
825             case WINDOW_PATHDIALOG:
826             case WINDOW_PRINTDIALOG:
827             case WINDOW_PRINTERSETUPDIALOG:
828             case WINDOW_COLORDIALOG:
829             case WINDOW_TABDIALOG:
830 
831             case WINDOW_BUTTONDIALOG:
832 
833             case WINDOW_MENUBARWINDOW:
834                 aName = pBase->GetText().EraseAllChars('~');
835                 break;
836 
837             case WINDOW_EDIT:
838             case WINDOW_MULTILINEEDIT:
839             case WINDOW_MULTILISTBOX:
840             case WINDOW_LISTBOX:
841             case WINDOW_COMBOBOX:
842             case WINDOW_SPINFIELD:
843             case WINDOW_PATTERNFIELD:
844             case WINDOW_NUMERICFIELD:
845             case WINDOW_METRICFIELD:
846             case WINDOW_CURRENCYFIELD:
847             case WINDOW_DATEFIELD:
848             case WINDOW_TIMEFIELD:
849             case WINDOW_NUMERICBOX:
850             case WINDOW_METRICBOX:
851             case WINDOW_CURRENCYBOX:
852             case WINDOW_DATEBOX:
853             case WINDOW_TIMEBOX:
854             case WINDOW_PATTERNBOX:
855             case WINDOW_TOOLBOX:
856                 aName = pBase->GetQuickHelpText();
857                 break;
858 
859             case WINDOW_MESSBOX:
860             case WINDOW_INFOBOX:
861             case WINDOW_WARNINGBOX:
862             case WINDOW_ERRORBOX:
863             case WINDOW_QUERYBOX:
864                 aName = ((MessBox*)pBase)->GetMessText();
865                 break;
866 
867             default:
868                 if ( pBase->GetUniqueOrHelpId().isEmpty() && !( nConf & DH_MODE_ALLWIN ) )
869                     bSkip = sal_True;
870                 break;
871         }
872 
873         if ( !bSkip )
874         {
875             if ( aName.Len() == 0 )
876                 aName = pBase->GetQuickHelpText();
877             if ( aName.Len() == 0 )
878                 aName = pBase->GetHelpText();
879             if ( aName.Len() == 0 )
880                 aName = pBase->GetText();
881 
882 
883             String aTypeSuffix;
884             if ( pBase->GetType() == WINDOW_CONTROL )
885             {
886                 if ( dynamic_cast< EditBrowseBox* >(pBase) )
887                     aTypeSuffix.AppendAscii( "/BrowseBox", 10 );
888                 else if ( dynamic_cast< ValueSet* >(pBase) )
889                     aTypeSuffix.AppendAscii( "/ValueSet", 9 );
890                 else if ( dynamic_cast< ORoadmap* >(pBase) )
891                     aTypeSuffix.AppendAscii( "/RoadMap", 8 );
892                 else if ( dynamic_cast< IExtensionListBox* >(pBase) )
893                     aTypeSuffix.AppendAscii( "/ExtensionListBox" );
894                 else if ( dynamic_cast< svt::table::TableControl* >(pBase) )
895                     aTypeSuffix.AppendAscii( "/TableControl" );
896                 else
897                     aTypeSuffix.AppendAscii( "/Unknown", 8 );
898             }
899 
900             rtl::OString aId = pBase->GetUniqueOrHelpId();
901             pRet->GenReturn ( RET_WinInfo, aId, (comm_ULONG)pBase->GetType(),
902                 TypeString(pBase->GetType()).Append(aTypeSuffix).AppendAscii(": ").Append(aName), sal_False );
903 
904 
905             if ( pBase->GetType() == WINDOW_TOOLBOX )   // Buttons and Controls in Toolboxes.
906             {
907                 ToolBox *pTB = ((ToolBox*)pBase);
908                 sal_uInt16 i;
909                 for ( i = 0; i < pTB->GetItemCount() ; i++ )
910                 {
911                     aName = String();
912 //                  if ( aName.Len() == 0 )
913 //                      aName = pTB->GetQuickHelpText();
914                     if ( aName.Len() == 0 )
915                         aName = pTB->GetHelpText( pTB->GetItemId( i ) );
916                     if ( aName.Len() == 0 )
917                         aName = pTB->GetItemText( pTB->GetItemId( i ) );
918 
919                     Window *pItemWin;
920                     pItemWin = pTB->GetItemWindow( pTB->GetItemId( i ) );
921                     if ( pTB->GetItemType( i ) == TOOLBOXITEM_BUTTON && ( !pItemWin || !pItemWin->IsVisible() ) )
922                     {
923                         if ( pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
924                             pRet->GenReturn ( RET_WinInfo, Str2Id(pTB->GetItemCommand(pTB->GetItemId( i ))), (comm_ULONG)WINDOW_BUTTON,
925                                 TypeString(WINDOW_BUTTON).AppendAscii(": ").Append(aName), sal_False );
926                         if ( !pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
927                             pRet->GenReturn ( RET_WinInfo, pTB->GetHelpId(pTB->GetItemId( i )), (comm_ULONG)WINDOW_BUTTON,
928                                 TypeString(WINDOW_BUTTON).AppendAscii(": ").Append(aName), sal_False );
929                     }
930                     else
931                     {
932                         if ( pItemWin )
933                         {
934                             if ( pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
935                                 pRet->GenReturn ( RET_WinInfo, Str2Id(pTB->GetItemCommand(pTB->GetItemId( i ))), (comm_ULONG)pItemWin->GetType(),
936                                     TypeString(pItemWin->GetType()).AppendAscii(": ").Append(aName), sal_False );
937                             if ( !pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
938                                 pRet->GenReturn ( RET_WinInfo, pTB->GetHelpId(pTB->GetItemId( i )), (comm_ULONG)pItemWin->GetType(),
939                                     TypeString(pItemWin->GetType()).AppendAscii(": ").Append(aName), sal_False );
940                             sal_uInt16 ii;
941                             for( ii = 0 ; ii < pItemWin->GetChildCount(); ii++ )
942                                 WriteControlData( pItemWin->GetChild(ii), nConf, sal_False );
943                         }
944                         else
945                         {
946                             if ( nConf & DH_MODE_ALLWIN )
947                             {
948                                 String aToolBoxItemType;
949                                 switch ( pTB->GetItemType( i ) )
950                                 {
951                                 case TOOLBOXITEM_DONTKNOW:
952                                     aToolBoxItemType.AssignAscii("TOOLBOXITEM_DONTKNOW");
953                                     break;
954                                 case TOOLBOXITEM_BUTTON:
955                                     aToolBoxItemType.AssignAscii("TOOLBOXITEM_BUTTON");
956                                     break;
957                                 case TOOLBOXITEM_SPACE:
958                                     aToolBoxItemType.AssignAscii("TOOLBOXITEM_SPACE");
959                                     break;
960                                 case TOOLBOXITEM_SEPARATOR:
961                                     aToolBoxItemType.AssignAscii("TOOLBOXITEM_SEPARATOR");
962                                     break;
963                                 case TOOLBOXITEM_BREAK:
964                                     aToolBoxItemType.AssignAscii("TOOLBOXITEM_BREAK");
965                                     break;
966                                 default:
967                                     DBG_ERROR1( "Unknown TOOLBOXITEM %i", pTB->GetItemType( i ) );
968                                 }
969                                 if ( pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
970                                     pRet->GenReturn ( RET_WinInfo, Str2Id( pTB->GetItemCommand(pTB->GetItemId( i )) ), (comm_ULONG)WINDOW_BASE,
971                                         aToolBoxItemType.AppendAscii(": ").Append(aName), sal_False );
972                                 if ( !pTB->GetItemCommand(pTB->GetItemId( i )).Len() || ( nConf & DH_MODE_ALLWIN ) )
973                                     pRet->GenReturn ( RET_WinInfo, pTB->GetHelpId(pTB->GetItemId( i )), (comm_ULONG)WINDOW_BASE,
974                                         aToolBoxItemType.AppendAscii(": ").Append(aName), sal_False );
975                             }
976                         }
977                     }
978                 }
979 
980                 return; // ToolBox is already completely covered here..
981             }
982 
983 
984             if ( pBase->GetType() == WINDOW_BUTTONDIALOG    // Buttons on button dialogs with ID
985                 || pBase->GetType() == WINDOW_MESSBOX
986                 || pBase->GetType() == WINDOW_INFOBOX
987                 || pBase->GetType() == WINDOW_WARNINGBOX
988                 || pBase->GetType() == WINDOW_ERRORBOX
989                 || pBase->GetType() == WINDOW_QUERYBOX )
990             {
991                 ButtonDialog *pBD = ((ButtonDialog*)pBase);
992                 sal_uInt16 i;
993                 for ( i = 0; i < pBD->GetButtonCount() ; i++ )
994                 {
995                     aName = String();
996                     if ( aName.Len() == 0 )
997                         aName = pBD->GetPushButton( pBD->GetButtonId(i) )->GetText();
998                     ByteString aID;
999                     switch ( pBD->GetButtonId(i) )
1000                     {
1001                         case BUTTONID_OK:
1002                             aID.Assign("Ok");
1003                             break;
1004                         case BUTTONID_CANCEL:
1005                             aID.Assign("Cancel");
1006                             break;
1007                         case BUTTONID_YES:
1008                             aID.Assign("Yes");
1009                             break;
1010                         case BUTTONID_NO:
1011                             aID.Assign("No");
1012                             break;
1013                         case BUTTONID_RETRY:
1014                             aID.Assign("Retry");
1015                             break;
1016                         case BUTTONID_HELP:
1017                             aID.Assign("Help");
1018                             break;
1019                         default:
1020                             aID = ByteString::CreateFromInt32( pBD->GetButtonId(i) );
1021                             break;
1022                     }
1023 
1024                     pRet->GenReturn ( RET_WinInfo, aID, (comm_ULONG)pBD->GetPushButton( pBD->GetButtonId(i) )->GetType(),   // so the text is displayed!
1025                         TypeString(pBD->GetPushButton( pBD->GetButtonId(i) )->GetType()).AppendAscii(": ").Append(aName)
1026                         .AppendAscii(" ButtonId = ").AppendAscii( aID.GetBuffer() ), sal_False );
1027                 }
1028 
1029                 return; // ButtonDialog is already completely covered here.
1030             }
1031 
1032 
1033             Menu* pMenu = GetMatchingMenu( pBase );
1034 
1035             if ( pMenu )    // Menus
1036             {
1037                 sal_uInt16 i;
1038                 for ( i = 0; i < pMenu->GetItemCount() ; i++ )
1039                 {
1040                     sal_uInt16 nID = pMenu->GetItemId( i );
1041 
1042                     aName = String();
1043                     if ( aName.Len() == 0 )
1044                         aName = pMenu->GetHelpText( nID );
1045                     if ( aName.Len() == 0 )
1046                         aName = pMenu->GetItemText( nID );
1047 
1048 
1049                     if ( pMenu->GetItemType( i ) == MENUITEM_STRING || pMenu->GetItemType( i ) == MENUITEM_IMAGE || pMenu->GetItemType( i ) == MENUITEM_STRINGIMAGE || (nConf & DH_MODE_ALLWIN) )
1050                     {
1051                         String aMenuItemType;
1052                         switch ( pMenu->GetItemType( i ) )
1053                         {
1054                         case MENUITEM_STRING:
1055                             aMenuItemType.AssignAscii("MENUITEM_STRING");
1056                             break;
1057                         case MENUITEM_STRINGIMAGE:
1058                             aMenuItemType.AssignAscii("MENUITEM_STRINGIMAGE");
1059                             break;
1060                         case MENUITEM_IMAGE:
1061                             aMenuItemType.AssignAscii("MENUITEM_IMAGE");
1062                             break;
1063                         case MENUITEM_SEPARATOR:
1064                             aMenuItemType.AssignAscii("MENUITEM_SEPARATOR");
1065                             break;
1066                         case MENUITEM_DONTKNOW:
1067                             aMenuItemType.AssignAscii("MENUITEM_DONTKNOW");
1068                             break;
1069                         default:
1070                             DBG_ERROR1( "Unknown MENUITEM %i", pMenu->GetItemType( i ) );
1071                         }
1072                         if ( pMenu->GetItemCommand(nID).Len() || ( nConf & DH_MODE_ALLWIN ) )
1073                             pRet->GenReturn ( RET_WinInfo, Str2Id( pMenu->GetItemCommand(nID) ), (comm_ULONG)0,
1074                                 aMenuItemType.AppendAscii(": ").Append(aName), sal_False );
1075                         if ( !pMenu->GetItemCommand(nID).Len() || ( nConf & DH_MODE_ALLWIN ) )
1076                             pRet->GenReturn ( RET_WinInfo, rtl::OString::valueOf( (sal_Int32)nID ), (comm_ULONG)0,
1077                                 aMenuItemType.AppendAscii(": ").Append(aName), sal_False );
1078                     }
1079                 }
1080 
1081                 return; // Menu is already completely covered here
1082             }
1083         }
1084     }
1085 
1086     for( sal_uInt16 i = 0 ; i < pBase->GetChildCount(); i++ )
1087         WriteControlData( pBase->GetChild(i), nConf, sal_False );
1088 }
1089 
1090 class SysWinContainer : public WorkWindow
1091 {
1092 private:
1093     ToolBox *pClientWin;
1094     DockingWindow *pDock;
1095 public:
1096     SysWinContainer( ToolBox *pClient );
1097     ~SysWinContainer();
1098     virtual void    Resize();
1099     virtual void    Resizing( Size& rSize );
1100 };
1101 
1102 SysWinContainer::SysWinContainer( ToolBox *pClient )
1103 : WorkWindow( NULL, WB_BORDER | WB_SIZEMOVE | WB_CLOSEABLE )
1104 , pClientWin( pClient )
1105 {
1106     pDock = new DockingWindow( this );
1107     pClientWin->SetParent( pDock );
1108     pClientWin->SetFloatingMode( sal_False );
1109     SetText( pClient->GetText() );
1110     SetPosPixel( Point( 1,40 ) );
1111     Resize();
1112     pDock->Show();
1113     EnableAlwaysOnTop();
1114     Show();
1115 }
1116 
1117 SysWinContainer::~SysWinContainer()
1118 {
1119     delete pDock;
1120 }
1121 
1122 void SysWinContainer::Resize()
1123 {
1124     Size aSize( GetOutputSizePixel() );
1125     Resizing( aSize );
1126 //  aSize = pClientWin->GetSizePixel();
1127 //  aSize = pClientWin->CalcWindowSizePixel();
1128     if ( aSize != GetSizePixel() )
1129     {
1130         SetOutputSizePixel( aSize );
1131         pDock->SetSizePixel( aSize );
1132         pClientWin->SetSizePixel( aSize );
1133     }
1134 }
1135 
1136 void SysWinContainer::Resizing( Size& rSize )
1137 {
1138     Size aSize;
1139     Size aBestSize;
1140     sal_uInt16 i;
1141     sal_Bool bHasValue = sal_False;
1142     sal_uLong nBestValue = 0;
1143     sal_uLong nThisValue;
1144     for ( i=1 ; i<=1 ; i++ )
1145     {
1146         aSize = pClientWin->CalcWindowSizePixel( i );
1147         nThisValue = Abs( aSize.Width() - rSize.Width() ) + Abs( aSize.Height() - rSize.Height() );
1148         if ( !bHasValue || ( nThisValue < nBestValue ) )
1149         {
1150             nBestValue = nThisValue;
1151             aBestSize = aSize;
1152             bHasValue = sal_True;
1153         }
1154     }
1155     rSize = aBestSize;
1156 }
1157 
1158 class DisplayHidWin : public ToolBox
1159 {
1160     Edit    *pEdit;
1161     Size    aMinEditSize;
1162     sal_uInt16  nLastItemID;
1163     sal_Bool bIsDraging;
1164     sal_Bool bIsPermanentDraging;
1165     void SetDraging( sal_Bool bNewDraging );
1166     Image *pShow, *pShow2;
1167     sal_Bool bConfigChanged;
1168     void EnableButtons( sal_uLong nConf );
1169 
1170     sal_uLong nEventHookID;
1171     static long stub_VCLEventHookProc( NotifyEvent& rEvt, void* pData )
1172     {
1173         return ((DisplayHidWin*)pData)->VCLEventHook( rEvt );
1174     }
1175 
1176     long VCLEventHook( NotifyEvent& rEvt );
1177     Window *pLastMouseMoveWin;
1178 
1179     SysWinContainer *pContainer;
1180 
1181     // aborting by pressing shift twice
1182     sal_Bool bOldShift;
1183     Time aLatest;
1184     sal_uInt16 nShiftCount;
1185 
1186 public:
1187     DisplayHidWin();
1188     ~DisplayHidWin();
1189 
1190     virtual void    Tracking( const TrackingEvent& rTEvt );
1191     virtual void    Click();
1192     virtual void    Select();
1193     virtual void    SetText( const XubString& rStr );
1194 
1195     void SetDisplayText( const String &aNewText ){ pEdit->SetText(aNewText); }
1196     String GetDisplayText() const { return pEdit->GetText(); }
1197     sal_Bool IsDisplayTextModified() const { return pEdit->IsModified(); }
1198     void ClearDisplayTextModified() const { pEdit->ClearModifyFlag(); }
1199 
1200     void SetConfig( sal_uLong nConf );
1201     sal_uLong GetConfig();
1202 
1203     sal_Bool IsConfigChanged() { return bConfigChanged; }
1204     void ConfigSent() { bConfigChanged = sal_False; }
1205 
1206     sal_Bool IsSendData() { return GetItemState( TT_SEND_DATA ) == STATE_CHECK; }
1207 //  sal_Bool IsAllWin() { return GetItemState( TT_ALLWIN ) == STATE_CHECK; }
1208 
1209     sal_Bool IsDraging() { return bIsDraging; }
1210 
1211     Window* LastMouseMoveWin() { return pLastMouseMoveWin; }
1212 };
1213 
1214 DisplayHidWin::DisplayHidWin()
1215 : ToolBox( StatementList::GetFirstDocFrame(), TTProperties::GetSvtResId(DisplayHidToolBox) )
1216 , bIsDraging( sal_False )
1217 , bIsPermanentDraging( sal_False )
1218 , pShow( NULL )
1219 , pShow2( NULL )
1220 , pLastMouseMoveWin( NULL )
1221 , bOldShift( 0 )
1222 , nShiftCount( 0 )
1223 {
1224     SetOutStyle( TOOLBOX_STYLE_HANDPOINTER | TOOLBOX_STYLE_FLAT );
1225     pEdit = new Edit( this, WB_CENTER | WB_BORDER );
1226     aMinEditSize = GetItemRect( TT_OUTPUT ).GetSize();
1227 /**/    aMinEditSize=Size(20,20);
1228     aMinEditSize.Width() *= 12;
1229     pEdit->SetSizePixel( aMinEditSize );
1230     pEdit->Show();
1231     SetItemWindow( TT_OUTPUT, pEdit );
1232     Resize();
1233     pContainer = new SysWinContainer( this );
1234     nEventHookID = Application::AddEventHook( stub_VCLEventHookProc, this );
1235 }
1236 
1237 DisplayHidWin::~DisplayHidWin()
1238 {
1239     Application::RemoveEventHook( nEventHookID );
1240     Hide(); // so GetFirstDocFrame won't return ourselves (needed for SOPlayer)
1241     SetParent( StatementList::GetFirstDocFrame() );
1242     delete pContainer;
1243     delete pEdit;
1244 }
1245 
1246 void DisplayHidWin::SetDraging( sal_Bool bNewDraging )
1247 {
1248     if ( !pShow )
1249         pShow = new Image( GetItemImage( TT_SHOW ) );
1250     if ( !pShow2 )
1251         pShow2 = new Image( Bitmap( TTProperties::GetSvtResId( TT_SHOW2 ) ) );
1252 
1253     if ( bNewDraging )
1254         SetItemImage( TT_SHOW, *pShow2 );
1255     else
1256         SetItemImage( TT_SHOW, *pShow );
1257 
1258     bIsDraging = bNewDraging;
1259 }
1260 
1261 void DisplayHidWin::EnableButtons( sal_uLong nConf )
1262 {
1263     sal_Bool bSend = sal_Bool(nConf & DH_MODE_SEND_DATA);
1264     EnableItem( TT_ALLWIN, bSend );
1265     EnableItem( TT_KURZNAME, bSend );
1266     EnableItem( TT_LANGNAME, bSend );
1267 }
1268 
1269 void DisplayHidWin::Tracking( const TrackingEvent& rTEvt )
1270 {
1271 //  if ( nLastItemID == TT_SHOW && GetItemState( TT_SHOW ) == STATE_NOCHECK && ( rTEvt.IsTrackingEnded() || rTEvt.IsTrackingCanceled() ) )
1272 //      SetDraging( sal_False );
1273     if ( nLastItemID == TT_SHOW && GetItemState( TT_SHOW ) == STATE_NOCHECK )
1274         EndTracking( ENDTRACK_CANCEL );
1275     ToolBox::Tracking( rTEvt);
1276 }
1277 
1278 void DisplayHidWin::Click()
1279 {
1280     nLastItemID = GetCurItemId();
1281     if ( nLastItemID == TT_SHOW )
1282     {
1283         SetDraging( sal_True );
1284     }
1285     ToolBox::Click();
1286 }
1287 
1288 void DisplayHidWin::Select()
1289 {
1290     if ( GetItemState( GetCurItemId() ) == STATE_NOCHECK )
1291     {
1292         SetItemState( GetCurItemId(), STATE_CHECK );
1293         if ( GetCurItemId() == TT_SHOW )
1294         {
1295             bIsPermanentDraging = sal_True;
1296             SetDraging( sal_True );
1297         }
1298     }
1299     else
1300     {
1301         SetItemState( GetCurItemId(), STATE_NOCHECK );
1302         if ( GetCurItemId() == TT_SHOW )
1303         {
1304             bIsPermanentDraging = sal_False;
1305             SetDraging( sal_False );
1306         }
1307     }
1308     if ( GetCurItemId() == TT_SEND_DATA )
1309     {
1310         EnableButtons( GetConfig() );
1311     }
1312 }
1313 
1314 void DisplayHidWin::SetConfig( sal_uLong nConf )
1315 {
1316     SetItemState( TT_KURZNAME,  ( nConf & DH_MODE_KURZNAME )  ? STATE_CHECK : STATE_NOCHECK );
1317     SetItemState( TT_LANGNAME,  ( nConf & DH_MODE_LANGNAME )  ? STATE_CHECK : STATE_NOCHECK );
1318     SetItemState( TT_ALLWIN,    ( nConf & DH_MODE_ALLWIN )    ? STATE_CHECK : STATE_NOCHECK );
1319     SetItemState( TT_SEND_DATA, ( nConf & DH_MODE_SEND_DATA ) ? STATE_CHECK : STATE_NOCHECK );
1320     EnableButtons( nConf );
1321 }
1322 
1323 sal_uLong DisplayHidWin::GetConfig()
1324 {
1325     sal_uLong nConf = 0;
1326     if ( GetItemState( TT_KURZNAME ) == STATE_CHECK )
1327         nConf |= DH_MODE_KURZNAME;
1328     if ( GetItemState( TT_LANGNAME ) == STATE_CHECK )
1329         nConf |= DH_MODE_LANGNAME;
1330     if ( GetItemState( TT_ALLWIN ) == STATE_CHECK )
1331         nConf |= DH_MODE_ALLWIN;
1332     if ( IsSendData() )
1333         nConf |= DH_MODE_SEND_DATA;
1334 
1335     return nConf;
1336 }
1337 
1338 void DisplayHidWin::SetText( const XubString& rStr )
1339 {
1340     pContainer->SetText( rStr );
1341 }
1342 
1343 long DisplayHidWin::VCLEventHook( NotifyEvent& rEvt )
1344 {
1345     if ( EVENT_MOUSEMOVE == rEvt.GetType() )
1346     {
1347         pLastMouseMoveWin = rEvt.GetWindow();
1348 
1349         // check if abort with pressing shift twice
1350         MouseEvent* pMEvt = (MouseEvent*)rEvt.GetMouseEvent();
1351 
1352         if ( ( pMEvt->IsShift() && !bOldShift ) ) // Shift pressed
1353         {
1354             if ( aLatest < Time() )
1355             {
1356                 nShiftCount = 0;
1357                 aLatest = Time()+Time( 0, 0, 0, 50 );
1358             }
1359             nShiftCount++;
1360         }
1361         if ( ( !pMEvt->IsShift() && bOldShift ) ) // Shift released
1362         {
1363             nShiftCount++;
1364             if ( nShiftCount == 4 && aLatest > Time() )
1365             {
1366                 bIsPermanentDraging = sal_False;
1367                 SetDraging( sal_False );
1368                 SetItemState( TT_SHOW, STATE_NOCHECK );
1369             }
1370         }
1371         bOldShift = pMEvt->IsShift();
1372     }
1373     if ( ( ( EVENT_MOUSEBUTTONUP == rEvt.GetType() && rEvt.GetMouseEvent()->GetButtons() == MOUSE_LEFT) || ( EVENT_MOUSEMOVE == rEvt.GetType() && !rEvt.GetMouseEvent()->GetButtons() ) )
1374             && IsDraging() && !bIsPermanentDraging )
1375         SetDraging( sal_False );
1376     return 0;
1377 }
1378 
1379 
1380 sal_Bool StatementCommand::DisplayHID()
1381 {
1382     // Return sal_True -> reexecute command
1383 
1384     if ( !bBool2 )  // Wird auf sal_False initialisiert
1385     {
1386         bBool2 = sal_True;              // Wir sind initialisiert.
1387         GetTTSettings()->pDisplayInstance = this;   // Und haben die Macht (Alle anderen beenden sich)
1388 
1389         if ( !(nParams & PARAM_ULONG_1) )
1390         {
1391             if( GetTTSettings()->pDisplayHidWin )   // Nichts verändern
1392                 nLNr1 = GetTTSettings()->pDisplayHidWin->GetConfig();
1393             else    // Beim ersten Aufruf wollen wir alles richtig einstellen
1394                 nLNr1 = DH_MODE_KURZNAME | DH_MODE_LANGNAME;
1395 
1396             if( ((nParams & PARAM_BOOL_1) && bBool1) )
1397                 nLNr1 |= DH_MODE_SEND_DATA;
1398             else
1399                 nLNr1 &= ( ~DH_MODE_SEND_DATA );
1400         }
1401 
1402         if ( GetTTSettings()->pDisplayHidWin )
1403             GetTTSettings()->pDisplayHidWin->SetConfig( nLNr1 );
1404     }
1405 
1406     if ( GetTTSettings()->pDisplayInstance && GetTTSettings()->pDisplayInstance != this )
1407     {
1408         DBG_WARNING("Mehrere DisplayHID am laufen");
1409         return sal_False;       // Noch eine andere Instanz macht das gleiche!
1410     }
1411 
1412     if ( !GetTTSettings()->pDisplayHidWin )
1413     {
1414         GetTTSettings()->pDisplayHidWin = new DisplayHidWin();
1415         GetTTSettings()->aOriginalCaption = GetTTSettings()->pDisplayHidWin->GetText();
1416         GetTTSettings()->pDisplayHidWin->Show();
1417         if ( bBool1 )
1418             nLNr1 |= DH_MODE_SEND_DATA;
1419         GetTTSettings()->pDisplayHidWin->SetConfig( nLNr1 );
1420 
1421         GetTTSettings()->Old = NULL;
1422         GetTTSettings()->Act = NULL;
1423         GetTTSettings()->pDisplayInstance = this;
1424     }
1425     else
1426     {
1427         GetTTSettings()->pDisplayHidWin->GetWindow( WINDOW_OVERLAP )->Enable( sal_True, sal_True );
1428         GetTTSettings()->pDisplayHidWin->GetWindow( WINDOW_OVERLAP )->EnableInput( sal_True, sal_True );
1429     }
1430 
1431 
1432     if ( GetTTSettings()->pDisplayHidWin->IsVisible() && !bDying )
1433     {
1434 
1435         if ( GetTTSettings()->pDisplayHidWin->IsDraging() )
1436         {
1437 
1438 
1439 #define HIGHLIGHT_WIN( WinPtr )                                     \
1440         {                                                           \
1441             Color aLineColMem = WinPtr->GetLineColor();             \
1442             WinPtr->SetLineColor( Color( COL_WHITE ) );             \
1443             Color aFillColMem = WinPtr->GetFillColor();             \
1444             WinPtr->SetFillColor( Color( COL_LIGHTRED ) );          \
1445             RasterOp aROp = WinPtr->GetRasterOp();                  \
1446             WinPtr->SetRasterOp( ROP_XOR );                         \
1447             Size aSz = WinPtr->PixelToLogic( WinPtr->GetSizePixel() );\
1448             sal_uLong nMaxCornerRadius = WinPtr->PixelToLogic( Point( 80, 0 ) ).X();\
1449             sal_uLong iCorner = std::max ((sal_uLong) 8, (sal_uLong) std::min( nMaxCornerRadius, (sal_uLong) std::min((sal_uLong) (aSz.Width() / 6), (sal_uLong)(aSz.Height() / 6))));\
1450             WinPtr->DrawRect(Rectangle(Point(),aSz), iCorner, iCorner);\
1451             WinPtr->SetLineColor( aLineColMem );                    \
1452             WinPtr->SetFillColor( aFillColMem );                    \
1453             WinPtr->SetRasterOp( aROp );                            \
1454         }
1455 
1456 
1457 #define SET_WIN( WinPtr )                                           \
1458             if ( StatementList::WinPtrValid(WinPtr) )   \
1459             {                                                       \
1460                 HIGHLIGHT_WIN ( WinPtr );                           \
1461             }
1462 
1463 #define RESET_WIN( WinPtr )                                         \
1464             if ( StatementList::WinPtrValid(WinPtr) )   \
1465             {                                                       \
1466                 WinPtr->Invalidate( INVALIDATE_NOTRANSPARENT );     \
1467                 WinPtr->Update();       \
1468             }
1469 
1470 
1471             GetTTSettings()->Old = GetTTSettings()->Act;
1472 //          GetTTSettings()->Act = GetMouseWin();
1473             GetTTSettings()->Act = GetTTSettings()->pDisplayHidWin->LastMouseMoveWin();
1474 
1475             if ( !StatementList::WinPtrValid ( GetTTSettings()->Old ) )
1476                 GetTTSettings()->Old = NULL;
1477             if ( !StatementList::WinPtrValid ( GetTTSettings()->Act ) )
1478                 GetTTSettings()->Act = NULL;
1479 
1480             if ( GetTTSettings()->Act && GetTTSettings()->Act->GetType() == WINDOW_BORDERWINDOW )
1481                 GetTTSettings()->Act = GetTTSettings()->Act->GetWindow( WINDOW_CLIENT );
1482 
1483             if ( GetTTSettings()->Act != GetTTSettings()->Old )
1484             {
1485                 if ( GetTTSettings()->Old )
1486                 {
1487                     RESET_WIN(GetTTSettings()->Old);
1488                 }
1489                 if ( GetTTSettings()->Act )
1490                 {
1491                     SET_WIN(GetTTSettings()->Act);
1492                     GetTTSettings()->pDisplayHidWin->SetDisplayText( Id2Str(GetTTSettings()->Act->GetUniqueOrHelpId()).AppendAscii(" WinType: ")
1493                         .Append(UniString::CreateFromInt64(GetTTSettings()->Act->GetType())).AppendAscii("  ").Append(GetTTSettings()->Act->GetText()));
1494                     if ( GetTTSettings()->Act && !GetTTSettings()->Act->GetUniqueId().equals( GetTTSettings()->Act->GetHelpId() ) )
1495                         GetTTSettings()->pDisplayHidWin->SetText(UniString( TTProperties::GetSvtResId( TT_ALTERNATE_CAPTION ) ).AppendAscii(GetTTSettings()->Act->GetHelpId().getStr()));
1496                     else
1497                         GetTTSettings()->pDisplayHidWin->SetText( GetTTSettings()->aOriginalCaption );
1498                 }
1499                 else
1500                     GetTTSettings()->pDisplayHidWin->SetDisplayText(CUniString("Kein Window/Control gefunden"));
1501             }
1502             else if ( GetTTSettings()->Act )
1503             {
1504 //              SET_WIN(GetTTSettings()->Act);
1505                 // allow setting a HelpID manually (just enter the ID in the displayHID Window and terminate it by |
1506                 if ( GetTTSettings()->pDisplayHidWin->IsDisplayTextModified() && GetTTSettings()->pDisplayHidWin->GetDisplayText().GetTokenCount( '|' ) > 1 )
1507                 {
1508                     GetTTSettings()->Act->SetUniqueId( Str2Id( GetTTSettings()->pDisplayHidWin->GetDisplayText().GetToken( '|' ) ) );
1509                     GetTTSettings()->pDisplayHidWin->ClearDisplayTextModified();
1510                 }
1511             }
1512 /*          if ( Application::GetLastInputInterval() > 5000 )   // 5 Sekunden lang nichts geschehen
1513             {
1514                 GetTTSettings()->pDisplayHidWin->ToTop( TOTOP_NOGRABFOCUS );
1515             }
1516 */
1517             if ( GetTTSettings()->pDisplayHidWin->IsSendData() /*&& bBool2*/ && GetTTSettings()->Act )
1518             {
1519                 if ( !StatementFlow::bSending )
1520                 {   // Normalerweise syncronisierung über Protokoll. Hier ist das aber asyncron!!!
1521                     WriteControlData( GetTTSettings()->Act, GetTTSettings()->pDisplayHidWin->GetConfig() );
1522                     new StatementFlow( this, F_EndCommandBlock );   // Kommando zum Senden erzeugen und in que eintragen
1523                 }
1524             }
1525         }   //if ( GetTTSettings()->pDisplayHidWin->IsDraging() )
1526         else
1527         {
1528             if ( GetTTSettings()->Act )
1529             {
1530                 RESET_WIN(GetTTSettings()->Act);
1531                 GetTTSettings()->Act = NULL;
1532             }
1533         }
1534 
1535         if ( pFirst == this )   // Sollte immer so sein, aber besser ist es
1536             if ( pNext )        // Befehle warten auf Ausführung
1537             {                   // An Ende neu einsortieren
1538                 Advance();
1539                 QueStatement( NULL );
1540             }
1541 //          {                   // Ersten und 2. austauschen.
1542 //              pFirst = pNext;
1543 //              pNext = pNext->pNext;
1544 //              pFirst->pNext = this;
1545 //          }
1546 
1547     }
1548     else
1549     {
1550         delete GetTTSettings()->pDisplayHidWin;
1551         GetTTSettings()->pDisplayHidWin = NULL;
1552         GetTTSettings()->pDisplayInstance = NULL;
1553     }
1554 
1555     return GetTTSettings()->pDisplayHidWin != NULL;
1556 }
1557 
1558 class TranslateWin : public WorkWindow
1559 {
1560 private:
1561     DECL_LINK( DoAccept, PushButton* );
1562     DECL_LINK( DoNext, PushButton* );
1563     DECL_LINK( DoSelect, PushButton* );
1564     DECL_LINK( DoRestore, PushButton* );
1565     DECL_LINK( TranslationChanged, Edit* );
1566     DECL_LINK( ShowInplace, Timer* );
1567 
1568     Timer InplaceTimer;
1569 
1570 //  virtual void MouseButtonUp( const MouseEvent& rMEvt );
1571 //  virtual void MouseMove( const MouseEvent& rMEvt );
1572 
1573     PushButton PushButtonTT_PB_NEXT;
1574     GroupBox GroupBoxTT_GB_TRANSLATION;
1575     Edit EditTT_E_NEW;
1576     GroupBox GroupBoxTT_GB_COMMENT;
1577     Edit EditTT_E_COMMENT;
1578     PushButton PushButtonTT_PB_ACCEPT;
1579     FixedText FixedTextTT_FT_OLD;
1580     PushButton PushButtonTT_PB_SELECT;
1581     PushButton PushButtonTT_PB_RESTORE;
1582 
1583     Window *Old;
1584     Window *Act;
1585     Window *pTranslateWin;
1586     sal_Bool bSelecting;
1587 
1588     sal_Bool bAvailable;
1589     sal_Bool bNext;
1590 
1591     sal_Bool TestChangedDataSaved();
1592 
1593 
1594     sal_uLong nEventHookID;
1595     static long stub_VCLEventHookProc( NotifyEvent& rEvt, void* pData )
1596     {
1597         return ((TranslateWin*)pData)->VCLEventHook( rEvt );
1598     }
1599 
1600     long VCLEventHook( NotifyEvent& rEvt );
1601 
1602 public:
1603     TranslateWin();
1604     ~TranslateWin();
1605 
1606     static String MarkShortcutErrors( Window* pBase, sal_Bool bMark );
1607 
1608     sal_Bool IsTranslationAvailable(){ return bAvailable; }
1609     sal_Bool IsNextDialog(){ return bNext; }
1610     void ResetNextDialog(){ bNext = sal_False; }
1611 
1612     Window* GetTranslationWindow(){ return pTranslateWin; }
1613     String GetOriginalText(){ return FixedTextTT_FT_OLD.GetText(); }
1614     String GetTranslationText(){ return EditTT_E_NEW.GetText(); }
1615     String GetComment(){ return EditTT_E_COMMENT.GetText(); }
1616 
1617     void EnableTranslation();
1618 };
1619 
1620 TranslateWin::TranslateWin()
1621 : WorkWindow( NULL, TTProperties::GetSvtResId( TT_INLINE_TRANSLATION ) )
1622 , PushButtonTT_PB_NEXT( this, TTProperties::GetSvtResId( TT_PB_NEXT ) )
1623 , GroupBoxTT_GB_TRANSLATION( this, TTProperties::GetSvtResId( TT_GB_TRANSLATION ) )
1624 , EditTT_E_NEW( this, TTProperties::GetSvtResId( TT_E_NEW ) )
1625 , GroupBoxTT_GB_COMMENT( this, TTProperties::GetSvtResId( TT_GB_COMMENT ) )
1626 , EditTT_E_COMMENT( this, TTProperties::GetSvtResId( TT_E_COMMENT ) )
1627 , PushButtonTT_PB_ACCEPT( this, TTProperties::GetSvtResId( TT_PB_ACCEPT ) )
1628 , FixedTextTT_FT_OLD( this, TTProperties::GetSvtResId( TT_FT_OLD ) )
1629 , PushButtonTT_PB_SELECT( this, TTProperties::GetSvtResId( TT_PB_SELECT ) )
1630 , PushButtonTT_PB_RESTORE( this, TTProperties::GetSvtResId( TT_PB_RESTORE ) )
1631 , Old( NULL )
1632 , Act( NULL )
1633 , pTranslateWin( NULL )
1634 , bSelecting( sal_False )
1635 , bAvailable( sal_False )
1636 , bNext( sal_False )
1637 {
1638     FreeResource();
1639     PushButtonTT_PB_NEXT.SetClickHdl( LINK( this, TranslateWin, DoNext ) );
1640     PushButtonTT_PB_ACCEPT.SetClickHdl( LINK( this, TranslateWin, DoAccept ) );
1641     PushButtonTT_PB_SELECT.SetClickHdl( LINK( this, TranslateWin, DoSelect ) );
1642     PushButtonTT_PB_RESTORE.SetClickHdl( LINK( this, TranslateWin, DoRestore ) );
1643     EditTT_E_NEW.SetModifyHdl( LINK( this, TranslateWin, TranslationChanged ) );
1644     InplaceTimer.SetTimeout( 250 );
1645     InplaceTimer.SetTimeoutHdl( LINK( this, TranslateWin, ShowInplace ) );
1646     EnableAlwaysOnTop();
1647     nEventHookID = Application::AddEventHook( stub_VCLEventHookProc, this );
1648 }
1649 
1650 TranslateWin::~TranslateWin()
1651 {
1652     Application::RemoveEventHook( nEventHookID );
1653 }
1654 
1655 sal_Bool TranslateWin::TestChangedDataSaved()
1656 {
1657     if ( ( EditTT_E_NEW.GetText().CompareTo( FixedTextTT_FT_OLD.GetText() ) != COMPARE_EQUAL
1658             || EditTT_E_COMMENT.GetText().Len() )
1659         && PushButtonTT_PB_ACCEPT.IsEnabled() )
1660     {
1661         return MessBox( this, TTProperties::GetSvtResId( TT_DISCARD_CHANGED_DATA ) ).Execute() == RET_YES;
1662     }
1663     else
1664         return sal_True;
1665 }
1666 
1667 IMPL_LINK( TranslateWin, DoAccept, PushButton*, EMPTYARG )
1668 {
1669     PushButtonTT_PB_SELECT.Disable();
1670     PushButtonTT_PB_NEXT.Disable();
1671         PushButtonTT_PB_RESTORE.Disable();
1672     EditTT_E_NEW.Disable();
1673     EditTT_E_COMMENT.Disable();
1674     PushButtonTT_PB_ACCEPT.Disable();
1675     bAvailable = sal_True;
1676     return 0;
1677 }
1678 
1679 IMPL_LINK( TranslateWin, DoNext, PushButton*, EMPTYARG )
1680 {
1681     if ( TestChangedDataSaved() )
1682     {
1683         PushButtonTT_PB_SELECT.Disable();
1684         PushButtonTT_PB_NEXT.Disable();
1685         PushButtonTT_PB_RESTORE.Disable();
1686         EditTT_E_NEW.Disable();
1687         EditTT_E_COMMENT.Disable();
1688         PushButtonTT_PB_ACCEPT.Disable();
1689         bNext = sal_True;
1690     }
1691     return 0;
1692 }
1693 
1694 IMPL_LINK( TranslateWin, DoSelect, PushButton*, EMPTYARG )
1695 {
1696     if ( bSelecting )
1697     {
1698 //      ReleaseMouse();
1699         bSelecting = sal_False;
1700     }
1701     else
1702     {
1703         if ( TestChangedDataSaved() )
1704         {
1705             PushButtonTT_PB_RESTORE.Disable();
1706 //          CaptureMouse();
1707             bSelecting = sal_True;
1708         }
1709     }
1710     return 0;
1711 }
1712 
1713 IMPL_LINK( TranslateWin, DoRestore, PushButton*, EMPTYARG )
1714 {
1715     String sTT_E_OLD( FixedTextTT_FT_OLD.GetText());
1716     sTT_E_OLD.SearchAndReplaceAll( CUniString("\\n"), CUniString("\n") );
1717     sTT_E_OLD.SearchAndReplaceAll( CUniString("\\t"), CUniString("\t") );
1718 
1719     String sTT_E_NEW( EditTT_E_NEW.GetText());
1720     sTT_E_NEW.SearchAndReplaceAll( CUniString("\\n"), CUniString("\n") );
1721     sTT_E_NEW.SearchAndReplaceAll( CUniString("\\t"), CUniString("\t") );
1722 
1723     if ( StatementList::WinPtrValid( pTranslateWin ) && pTranslateWin->GetText().CompareTo( sTT_E_NEW ) == COMPARE_EQUAL )
1724     {   // Im ersten schritt nur in der UI zurück
1725         pTranslateWin->SetText( sTT_E_OLD );
1726     }
1727     else
1728     {   // Im zweite Schritt auch den eingegebenen Text
1729         EditTT_E_NEW.SetText( FixedTextTT_FT_OLD.GetText() );
1730         PushButtonTT_PB_RESTORE.Disable();
1731     }
1732     if ( StatementList::WinPtrValid( pTranslateWin ) )
1733         MarkShortcutErrors( pTranslateWin->GetWindow( WINDOW_OVERLAP ), sal_True );
1734     return 0;
1735 }
1736 
1737 IMPL_LINK( TranslateWin, TranslationChanged, Edit*, pEdit )
1738 {
1739     (void) pEdit; /* avoid warning about unused parameter */
1740     PushButtonTT_PB_RESTORE.Enable();
1741     InplaceTimer.Start();
1742     return 0;
1743 }
1744 
1745 IMPL_LINK( TranslateWin, ShowInplace, Timer*, EMPTYARG )
1746 {
1747     PushButtonTT_PB_RESTORE.Enable();
1748     if ( StatementList::WinPtrValid( pTranslateWin ) )
1749     {
1750         String sTT_E_NEW( EditTT_E_NEW.GetText());
1751         // alle CRs UnQuoten
1752         sTT_E_NEW.SearchAndReplaceAll( CUniString("\\n"), CUniString("\n") );
1753         // alle TABSs UnQuoten
1754         sTT_E_NEW.SearchAndReplaceAll( CUniString("\\t"), CUniString("\t") );
1755         pTranslateWin->SetText( sTT_E_NEW );
1756 
1757         MarkShortcutErrors( pTranslateWin->GetWindow( WINDOW_OVERLAP ), sal_True );
1758     }
1759     return 0;
1760 }
1761 
1762 long TranslateWin::VCLEventHook( NotifyEvent& rEvt )
1763 {
1764     if ( EVENT_MOUSEMOVE == rEvt.GetType() )
1765     {
1766         if ( bSelecting )
1767         {
1768             const MouseEvent *pMEvt = rEvt.GetMouseEvent();
1769             Old = Act;
1770             Act = rEvt.GetWindow();
1771 
1772             if ( Act )
1773             {
1774                 Window *pWin = Act;
1775                 sal_uInt16 i;
1776                 for ( i = 0 ; i < Act->GetChildCount() ; i++ )
1777                 {
1778                     pWin = Act->GetChild(i);
1779                     Rectangle aWinPosSize( pWin->GetPosPixel(), pWin->GetSizePixel() );
1780 
1781                     if ( ( pWin->IsMouseTransparent() || !pWin->IsEnabled() ) && aWinPosSize.IsInside( pMEvt->GetPosPixel() ) )
1782                     {
1783                         Act = pWin;
1784                         break;
1785                     }
1786                 }
1787             }
1788 
1789             if ( !StatementList::WinPtrValid ( Old ) )
1790                 Old = NULL;
1791 
1792             if ( Act != Old )
1793             {
1794                 if ( Old )
1795                 {
1796                     Window *pWin;
1797                     if ( Old->IsMouseTransparent() && Old->GET_REAL_PARENT() )
1798                         pWin = Old->GET_REAL_PARENT();
1799                     else
1800                         pWin = Old;
1801                     RESET_WIN(pWin);
1802                 }
1803                 if ( Act )
1804                 {
1805                     SET_WIN(Act);
1806                     FixedTextTT_FT_OLD.SetText( Act->GetText() );
1807                 }
1808                 else
1809                     FixedTextTT_FT_OLD.SetText( String() );
1810             }
1811             else if ( Act )
1812             {
1813     //          SET_WIN(Act);
1814             }
1815     /*      if ( Application::GetLastInputInterval() > 5000 )   // 5 Sekunden lang nichts geschehen
1816             {
1817                 ToTop();
1818             }
1819     */
1820         }   //if ( bSelecting )
1821         else
1822         {
1823             if ( Act )
1824             {
1825                 if ( Act->IsMouseTransparent() && Act->GET_REAL_PARENT() )
1826                     Act = Act->GET_REAL_PARENT();
1827                 RESET_WIN(Act);
1828                 Act = NULL;
1829             }
1830         }
1831     }
1832     else if ( EVENT_MOUSEBUTTONUP == rEvt.GetType() )
1833     {
1834         if ( bSelecting )
1835         {
1836             pTranslateWin = Act;
1837             if ( pTranslateWin )
1838             {
1839                 MarkShortcutErrors( pTranslateWin->GetWindow( WINDOW_OVERLAP ), sal_True );
1840                 // alle CRs quoten (NF)
1841                 String sTT_E_NEW( pTranslateWin->GetText());
1842                 sTT_E_NEW.SearchAndReplaceAll( CUniString("\n"), CUniString("\\n") );
1843                 // alle TABSs quoten ()
1844                 sTT_E_NEW.SearchAndReplaceAll( CUniString("\t"), CUniString("\\t") );
1845 
1846                 FixedTextTT_FT_OLD.SetText( sTT_E_NEW );
1847                 EditTT_E_NEW.SetText( sTT_E_NEW );
1848                 EditTT_E_NEW.Enable();
1849                 EditTT_E_NEW.GrabFocus();
1850                 EditTT_E_COMMENT.SetText( String() );
1851                 EditTT_E_COMMENT.Enable();
1852                 PushButtonTT_PB_ACCEPT.Enable();
1853             }
1854     //      ReleaseMouse();
1855             bSelecting = sal_False;
1856         }
1857     }
1858 
1859     return 0;
1860 }
1861 
1862 #define FDS_ACTION_COLLECT  1
1863 #define FDS_ACTION_MARK     2
1864 #define FDS_ACTION_UNMARK   3
1865 
1866 class FindShortcutErrors: public Search
1867 {
1868     String aShortcuts,aDoubleShortcuts;
1869     sal_uInt16 nAction;
1870 public:
1871     FindShortcutErrors();
1872     virtual sal_Bool IsWinOK( Window *pWin );
1873     void SetAction( sal_uInt16 nA );
1874     String GetDoubleShortcuts() { return aDoubleShortcuts; }
1875 };
1876 
1877 FindShortcutErrors::FindShortcutErrors()
1878 : Search( SEARCH_NOOVERLAP | SEARCH_NO_TOPLEVEL_WIN )
1879 {
1880     SetAction( FDS_ACTION_COLLECT );    // Wir fange immer mit sammeln an, ODER??
1881 }
1882 
1883 void FindShortcutErrors::SetAction( sal_uInt16 nA )
1884 {
1885     nAction = nA;
1886     if ( FDS_ACTION_COLLECT == nAction )
1887     {
1888         aShortcuts = UniString();
1889         aDoubleShortcuts = UniString();
1890     }
1891 }
1892 
1893 sal_Bool FindShortcutErrors::IsWinOK( Window *pWin )
1894 {
1895     if ( pWin->IsReallyVisible() )
1896     {
1897         String aText = pWin->GetText();
1898         xub_StrLen nPos = aText.Search('~');
1899         String aShortcut;
1900         sal_Bool bHasAccel = sal_False;
1901         if ( nPos != STRING_NOTFOUND )
1902         {
1903             aShortcut = aText.Copy( nPos+1, 1 );
1904             aShortcut.ToLowerAscii();
1905             bHasAccel = aShortcut.Len() == 1;
1906         }
1907 
1908         switch ( nAction )
1909         {
1910             case FDS_ACTION_COLLECT:
1911                 {
1912                     if ( aShortcuts.Search( aShortcut ) != STRING_NOTFOUND )
1913                         aDoubleShortcuts += aShortcut;
1914                     else
1915                         aShortcuts += aShortcut;
1916                 }
1917                 break;
1918             case FDS_ACTION_MARK:
1919                 {
1920                     sal_Bool bMissing = sal_False;
1921                     if ( !bHasAccel && aText.Len() )    // should there be an accelerator defined
1922                     {
1923 
1924                         Window*     pChild;
1925                         pChild = pWin->GetWindow( WINDOW_CLIENT );
1926 
1927                         if ( (pChild->GetType() == WINDOW_RADIOBUTTON) ||
1928                              (pChild->GetType() == WINDOW_IMAGERADIOBUTTON) ||
1929                              (pChild->GetType() == WINDOW_CHECKBOX) ||
1930                              (pChild->GetType() == WINDOW_TRISTATEBOX) ||
1931                              (pChild->GetType() == WINDOW_PUSHBUTTON) )
1932                         {
1933                             if ( !pChild->GetText().EqualsAscii( "..." ) )
1934                                 bMissing = sal_True;
1935                         }
1936 
1937                         if ( pChild->GetType() == WINDOW_FIXEDTEXT )
1938                         {
1939                             Window* pTempChild = pWin->GetWindow( WINDOW_NEXT );
1940                             if ( pTempChild )
1941                                 pTempChild = pTempChild->GetWindow( WINDOW_CLIENT );
1942 
1943                             if ( pTempChild && pChild->GetText().Len() )
1944                             {
1945                                 if ( (pTempChild->GetType() == WINDOW_EDIT) ||
1946                                      (pTempChild->GetType() == WINDOW_MULTILINEEDIT) ||
1947                                      (pTempChild->GetType() == WINDOW_SPINFIELD) ||
1948                                      (pTempChild->GetType() == WINDOW_PATTERNFIELD) ||
1949                                      (pTempChild->GetType() == WINDOW_NUMERICFIELD) ||
1950                                      (pTempChild->GetType() == WINDOW_METRICFIELD) ||
1951                                      (pTempChild->GetType() == WINDOW_CURRENCYFIELD) ||
1952                                      (pTempChild->GetType() == WINDOW_DATEFIELD) ||
1953                                      (pTempChild->GetType() == WINDOW_TIMEFIELD) ||
1954                                      (pTempChild->GetType() == WINDOW_LISTBOX) ||
1955                                      (pTempChild->GetType() == WINDOW_MULTILISTBOX) ||
1956                                      (pTempChild->GetType() == WINDOW_COMBOBOX) ||
1957                                      (pTempChild->GetType() == WINDOW_PATTERNBOX) ||
1958                                      (pTempChild->GetType() == WINDOW_NUMERICBOX) ||
1959                                      (pTempChild->GetType() == WINDOW_METRICBOX) ||
1960                                      (pTempChild->GetType() == WINDOW_CURRENCYBOX) ||
1961                                      (pTempChild->GetType() == WINDOW_DATEBOX) ||
1962                                      (pTempChild->GetType() == WINDOW_TIMEBOX) )
1963                                 {
1964                                     bMissing = sal_True;
1965                                 }
1966                             }
1967                         }
1968                     }
1969 
1970                     if ( bHasAccel && aDoubleShortcuts.Search( aShortcut ) != STRING_NOTFOUND )
1971                     {
1972                         if ( pWin->GetType() == WINDOW_GROUPBOX )
1973                             pWin->SetControlForeground( Color( COL_LIGHTRED ) );
1974                         else
1975                         {
1976                             pWin->SetControlBackground();
1977                             Color aCol(COL_GRAY);
1978                             aCol.SetRed( 0xff );
1979                             pWin->SetControlBackground( aCol );
1980                         }
1981                     }
1982                     else if ( bMissing )
1983                     {
1984                         pWin->SetControlBackground();
1985                         Color aCol(COL_GRAY);
1986                         aCol.SetRed( 0xff );
1987                         aCol.SetGreen( 0xff );
1988                         pWin->SetControlBackground( aCol );
1989                     }
1990                     else
1991                     {
1992                         pWin->SetControlForeground();
1993                         pWin->SetControlBackground();
1994                     }
1995                 }
1996                 break;
1997             case FDS_ACTION_UNMARK:
1998                 {
1999                     pWin->SetControlForeground();
2000                     pWin->SetControlBackground();
2001                 }
2002                 break;
2003         }
2004     }
2005     else
2006         if ( FDS_ACTION_MARK == nAction || FDS_ACTION_UNMARK == nAction )
2007         {
2008             pWin->SetControlForeground();
2009             pWin->SetControlBackground();
2010         }
2011 
2012     return sal_False;
2013 }
2014 
2015 String TranslateWin::MarkShortcutErrors( Window* pBase, sal_Bool bMark )
2016 {
2017     if ( pBase )
2018     {
2019         FindShortcutErrors aFinder;
2020         if ( bMark )
2021         {
2022             StatementList::SearchAllWin( pBase, aFinder, sal_True );    // collect Shortcuts first
2023             aFinder.SetAction( FDS_ACTION_MARK );
2024         }
2025         else
2026             aFinder.SetAction( FDS_ACTION_UNMARK );
2027         StatementList::SearchAllWin( pBase, aFinder, sal_True );
2028         return aFinder.GetDoubleShortcuts();
2029     }
2030     return UniString();
2031 }
2032 
2033 void TranslateWin::EnableTranslation()
2034 {
2035     PushButtonTT_PB_SELECT.Enable();
2036     PushButtonTT_PB_NEXT.Enable();
2037     bAvailable = sal_False;
2038     bNext = sal_False;
2039 }
2040 
2041 void StatementCommand::Translate()
2042 {
2043     // Es wurde eine initale UniqueId mitgegeben. Dann nur die dopelten Shortcuts liefern
2044     if( (nParams & PARAM_STR_1) && nLNr1 )
2045     {
2046         String aDouble;
2047         Window *pWin = SearchTree( Str2Id( aString1 ) ,sal_False );
2048         if ( pWin )
2049         {
2050             pWin = pWin->GetWindow( WINDOW_OVERLAP );
2051             aDouble = TranslateWin::MarkShortcutErrors( pWin, sal_True );
2052         }
2053         pRet->GenReturn ( RET_Value, nMethodId, aDouble );
2054         return;
2055     }
2056 
2057     if ( !GetTTSettings()->pTranslateWin )
2058     {
2059         GetTTSettings()->pTranslateWin = new TranslateWin;
2060         GetTTSettings()->bToTop = sal_True;
2061     }
2062 
2063     GetTTSettings()->pTranslateWin->Show();
2064     if ( GetTTSettings()->bToTop )
2065     {
2066         GetTTSettings()->pTranslateWin->ToTop();
2067         GetTTSettings()->bToTop = sal_False;
2068     }
2069 
2070 //  GetTTSettings()->pTranslateWin->GetWindow( WINDOW_OVERLAP )->Enable( sal_True, sal_True );
2071     GetTTSettings()->pTranslateWin->GetWindow( WINDOW_OVERLAP )->EnableInput( sal_True, sal_True );
2072 
2073     if ( GetTTSettings()->pTranslateWin->IsTranslationAvailable() )
2074     {
2075         String aTranslation;
2076         Window* pTranslationWindow = GetTTSettings()->pTranslateWin->GetTranslationWindow();
2077 
2078         DBG_ASSERT( pTranslationWindow, "Kein Translation Window" );
2079 
2080         if ( WinPtrValid( pTranslationWindow ) )
2081         {
2082             if ( pTranslationWindow->GetType() == WINDOW_BORDERWINDOW && pTranslationWindow->GetWindow( WINDOW_CLIENT ) )
2083             {
2084                 Window* pNew = pTranslationWindow->GetWindow( WINDOW_CLIENT );
2085                 // Bei Dockingwindows das ganze Geraffel von Docking Floating überspringen
2086                 while ( IsDialog( pNew ) && pNew->GetUniqueOrHelpId().isEmpty() && pNew->GetChildCount() == 1 )
2087                     pNew = pNew->GetChild( 0 );
2088                 pTranslationWindow = pNew;
2089             }
2090 
2091             aTranslation = CUniString("0;");
2092 
2093             aTranslation += Id2Str( pTranslationWindow->GetUniqueOrHelpId() );
2094             aTranslation += ';';
2095 
2096             aTranslation += TypeString( pTranslationWindow->GetType() );
2097             aTranslation += ';';
2098 
2099             Window* pParentDialog = pTranslationWindow;
2100             while ( pParentDialog && !IsDialog( pParentDialog ) )
2101             {
2102                 pParentDialog = pParentDialog->GET_REAL_PARENT();
2103             }
2104 
2105             if ( pParentDialog )
2106             {
2107                 aTranslation += Id2Str(pParentDialog->GetUniqueOrHelpId());
2108                 aTranslation += ';';
2109                 aTranslation += TypeString( pParentDialog->GetType() );
2110             }
2111             else
2112                 aTranslation.AppendAscii( "0;" ); // Zahl + leerer String
2113             aTranslation += ';';
2114 
2115             aTranslation += '\"';
2116             aTranslation += GetTTSettings()->pTranslateWin->GetOriginalText();
2117             aTranslation += '\"';
2118 
2119             aTranslation += ';';
2120 
2121             aTranslation += '\"';
2122             aTranslation += GetTTSettings()->pTranslateWin->GetTranslationText();
2123             aTranslation += '\"';
2124 
2125             aTranslation += ';';
2126 
2127             aTranslation += '\"';
2128             aTranslation += GetTTSettings()->pTranslateWin->GetComment();
2129             aTranslation += '\"';
2130 
2131             // alle CRs quoten (NF)
2132             aTranslation.SearchAndReplaceAll( CUniString("\n"), CUniString("\\n") );
2133             // alle TABSs quoten ()
2134             aTranslation.SearchAndReplaceAll( CUniString("\t"), CUniString("\\t") );
2135 
2136             pRet->GenReturn ( RET_Value, nMethodId, aTranslation );
2137             GetTTSettings()->pTranslateWin->EnableTranslation();
2138             GetTTSettings()->bToTop = sal_True;
2139         }
2140         else
2141         {
2142             pRet->GenReturn ( RET_Value, nMethodId, String() );
2143             GetTTSettings()->pTranslateWin->EnableTranslation();
2144             ErrorBox err( GetTTSettings()->pTranslateWin, TTProperties::GetSvtResId( TT_NO_CONTROL ));
2145             err.Execute();
2146             GetTTSettings()->bToTop = sal_True;
2147         }
2148 
2149     }
2150     else if ( GetTTSettings()->pTranslateWin->IsNextDialog() )
2151     {
2152         pRet->GenReturn ( RET_Value, nMethodId, CUniString("1") );
2153         GetTTSettings()->pTranslateWin->ResetNextDialog();
2154         GetTTSettings()->pTranslateWin->LoseFocus();
2155         GetTTSettings()->bToTop = sal_True;
2156     }
2157     else
2158     {
2159         GetTTSettings()->pTranslateWin->EnableTranslation();
2160         pRet->GenReturn ( RET_Value, nMethodId, String() );
2161     }
2162 }
2163 
2164 Window* StatementCommand::GetNextOverlap( Window* pBase )
2165 {   // Findet irgendwelche Overlap-Fenster, die schließbar aussehen
2166     // Eventuell muß noch die Auswahl verfeinert werden.
2167 
2168     if ( pBase->GetType() != WINDOW_BORDERWINDOW )
2169         pBase = pBase->GetWindow( WINDOW_OVERLAP );
2170 
2171     Window *pControl = NULL;
2172     if ( pBase->GetWindow( WINDOW_FIRSTOVERLAP ) )
2173     {
2174         pControl = GetNextOverlap( pBase->GetWindow( WINDOW_FIRSTOVERLAP ) );
2175     }
2176 
2177     if ( !pControl && pBase->GetWindow( WINDOW_NEXT ) )
2178     {
2179         pControl = GetNextOverlap( pBase->GetWindow( WINDOW_NEXT ) );
2180     }
2181 
2182     if ( !pControl )
2183     {
2184         Window *pTest = pBase->GetWindow( WINDOW_CLIENT );
2185         if ( IsAccessable (pTest)
2186             && pTest->IsEnabled()
2187             && pTest->IsVisible()
2188             && ((pTest->GetStyle() & WB_CLOSEABLE ) || (pBase->GetStyle() & WB_CLOSEABLE )) )
2189             return pTest;
2190         else
2191             return NULL;
2192     }
2193     else
2194         return pControl;
2195 }
2196 
2197 Window* StatementCommand::GetNextRecoverWin()
2198 {
2199     // über die TopLevelWindows der App iterieren
2200     Window* pBase = Application::GetFirstTopLevelWindow();
2201     Window *pControl = NULL;
2202     Window* pMyFirstDocFrame = NULL;
2203     while ( pBase )
2204     {
2205         // zuerst weitere Fenster auf dem Fenster suchen und schliessen
2206         pControl = GetNextOverlap( pBase );
2207         if ( pControl && pControl->GetType() == WINDOW_HELPTEXTWINDOW )
2208         {}  // skip it
2209         else
2210         {
2211             if ( pControl && pControl->IsVisible() && !IsFirstDocFrame( pControl ) && !IsIMEWin( pControl ) )
2212             {
2213                 Window* pTB = pControl->GetChild( 0 );
2214                 if ( pControl->GetChildCount() == 1 && pTB->GetType() == WINDOW_TOOLBOX )
2215 //                  return pTB;
2216                     ;   // do not act on floating toolboxes #i38796
2217                 else
2218                     return pControl;
2219             }
2220 
2221             // dann das Fenster selbst schliessen
2222             // erstes DocWin überspringen
2223             // Assumption that Doc Windows are Borderwindows and ButtonDialog and such are not
2224             if ( pBase->IsVisible() && !IsFirstDocFrame( pBase ) && pBase->GetType() != WINDOW_BORDERWINDOW && !IsIMEWin( pBase ) )
2225                 return pBase;
2226 
2227             if ( !pMyFirstDocFrame && IsFirstDocFrame( pBase ) )
2228                 pMyFirstDocFrame = pBase;
2229         }
2230 
2231         pBase = Application::GetNextTopLevelWindow( pBase );
2232     }
2233 #ifdef RESET_APPLICATION_TO_BACKING_WINDOW
2234     // close the FirstDocFrame last, It will not be closed, but the Document inside will be closed.
2235     if ( IsDocWin( pMyFirstDocFrame ) )
2236         return pMyFirstDocFrame;
2237 #endif // def RESET_APPLICATION_TO_BACKING_WINDOW
2238 
2239     return NULL;
2240 }
2241 
2242 sal_Bool StatementCommand::Execute()
2243 {
2244     if ( IsError )
2245     {
2246 #if OSL_DEBUG_LEVEL > 1
2247         m_pDbgWin->AddText( "Skipping Command: " );
2248         m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
2249         m_pDbgWin->AddText( "\n" );
2250         #endif
2251 
2252         Advance();
2253         delete this;
2254         return sal_True;
2255     }
2256 
2257     InitProfile();
2258 #if OSL_DEBUG_LEVEL > 1
2259     m_pDbgWin->AddText( "Executing Command: " );
2260     m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
2261     m_pDbgWin->AddText( "\n" );
2262 #endif
2263 
2264 
2265 
2266 
2267 
2268 #if OSL_DEBUG_LEVEL > 1
2269 #define REPORT_WIN_CLOSED(pControl, aInfo)          \
2270     _REPORT_WIN_CLOSED(pControl, aInfo)             \
2271     m_pDbgWin->AddText( aInfo.AppendAscii(" \"").Append( pControl->GetText() ).AppendAscii("\" geschlossen, RType = ").Append( TypeString(pControl->GetType()) ).AppendAscii(", UId = ").Append( UIdString( pControl->GetUniqueOrHelpId() ) ) );
2272 #else
2273 #define REPORT_WIN_CLOSED(pControl, aInfo) _REPORT_WIN_CLOSED(pControl, aInfo)
2274 #endif
2275 
2276 #define REPORT_WIN_CLOSEDc(pControl, aInfo )        \
2277     REPORT_WIN_CLOSED(pControl, CUniString(aInfo) )
2278 
2279 #define _REPORT_WIN_CLOSED(pControl, aInfo)         \
2280     if ( aString1.Len() )                           \
2281         aString1 += '\n';                           \
2282     aString1 += aInfo;                              \
2283     aString1.AppendAscii(" \"");                    \
2284     aString1 += pControl->GetText();                \
2285     aString1.AppendAscii("\" geschlossen, RType = ");\
2286     aString1 += TypeString(pControl->GetType());    \
2287     aString1.AppendAscii(", UId = ");               \
2288     aString1 += UIdString(pControl->GetUniqueOrHelpId());
2289 
2290 
2291     switch ( nMethodId )
2292     {
2293         case RC_AppDelay:
2294             if ( !bBool1 )
2295             {
2296                 nLNr1 = Time().GetTime() + nNr1/10;
2297                 bBool1 = sal_True;
2298             }
2299             if ( Time().GetTime() < long(nLNr1) )   // Aktuelle Zeit kleiner Endzeit
2300                 return sal_False;
2301             break;
2302         case RC_DisplayHid:
2303             if ( DisplayHID() )
2304                 return sal_False;
2305             break;
2306         case RC_ResetApplication:
2307             {
2308                 if ( !bBool1 )
2309                 {
2310                     nRetryCount = 150;      // das sollte reichen.
2311                     bBool1 = sal_True;      // Nur beim ersten mal!
2312                     nNr1 = 1;               // Welcher Button ist dran?
2313                     nLNr1 = 0;              // Speichern des AppWin
2314                     aString1 = UniString(); // Liste der geschlossenen Fenster
2315 
2316                     // So daß nacher auch wieder alles auf Default steht
2317                     nUseBindings = 0;
2318                     bCatchGPF = sal_True;
2319                     bUsePostEvents = sal_True;
2320 
2321                     aSubMenuId1 = 0;
2322                     aSubMenuId2 = 0;
2323                     aSubMenuId3 = 0;
2324                     pMenuWindow = NULL;
2325                 }
2326                 if ( !nRetryCount )
2327                     ReportError( GEN_RES_STR0( S_RESETAPPLICATION_FAILED_COMPLEX ) );
2328 
2329                 Window *pControl = GetNextRecoverWin();
2330 
2331                 if ( pControl )
2332                 {
2333                     bBool2 = sal_False; // flag for wait when all windows are closed
2334                     pControl->GrabFocus();
2335 
2336                     if (    pControl->GetType() != WINDOW_DOCKINGWINDOW
2337                          && pControl->GetType() != WINDOW_FLOATINGWINDOW
2338                          && pControl->GetType() != WINDOW_MODELESSDIALOG
2339                          && pControl->GetType() != WINDOW_WORKWINDOW
2340                          && pControl->GetType() != WINDOW_TOOLBOX
2341                          && pControl->GetType() != WINDOW_BORDERWINDOW
2342                          && nRetryCount-- )
2343                     {
2344                         short nRT = ImpGetRType( pControl );
2345 
2346                         if ( nRT == C_TabControl && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
2347                         {   // Bei Tabcontrol den zugehörigen Tabdialog nehmen
2348                             pControl = pControl->GET_REAL_PARENT();
2349                             nRT = ImpGetRType( pControl );
2350                         }
2351 
2352                         switch( nRT )
2353                         {
2354                             case C_ModalDlg:
2355                             case C_Dialog:
2356                             case C_TabDlg:
2357                                 REPORT_WIN_CLOSEDc(pControl, "Dialog");
2358                                 SET_WINP_CLOSING(pControl);
2359                                 ((SystemWindow*)pControl)->Close();
2360                                 break;
2361                             case C_WorkWin:
2362                                 break;
2363                             case C_MessBox:
2364                             case C_InfoBox:
2365                             case C_WarningBox:
2366                             case C_ErrorBox:
2367                             case C_QueryBox:
2368                             case C_ButtonDialog:
2369                                 {
2370                                     ButtonDialog* pBD = (ButtonDialog*)pControl;
2371                                     // nNr1 >= 10 bedeutet (Custom)-Buttons durchgehen
2372                                     if ( nNr1 >= 10+pBD->GetButtonCount() ) nNr1 = 1;
2373                                     switch( nNr1 )
2374                                     {
2375                                         case 5:
2376                                             if ( pBD->GetPushButton( BUTTONID_OK ) )
2377                                             {
2378                                                 REPORT_WIN_CLOSEDc(pControl, "Message Box (OK)");
2379                                                 SET_WINP_CLOSING(pControl);
2380                                                 pBD->EndDialog(RET_OK);
2381                                             }
2382                                             nNr1 = 10;  // Nochmal alle Buttons der Reihe nach
2383                                             break;
2384                                         case 4:
2385                                             if ( pBD->GetPushButton( BUTTONID_CANCEL ) )
2386                                             {
2387                                                 REPORT_WIN_CLOSEDc(pControl, "Message Box (Cancel)");
2388                                                 SET_WINP_CLOSING(pControl);
2389                                                 pBD->EndDialog(RET_CANCEL);
2390                                             }
2391                                             nNr1++;
2392                                             break;
2393                                         case 3:
2394                                             if ( pBD->GetPushButton( BUTTONID_YES ) )
2395                                             {
2396                                                 REPORT_WIN_CLOSEDc(pControl, "Message Box (Yes)");
2397                                                 SET_WINP_CLOSING(pControl);
2398                                                 pBD->EndDialog(RET_YES);
2399                                             }
2400                                             nNr1++;
2401                                             break;
2402                                         case 2:     // BUG 48239
2403                                         case 1:
2404                                             if ( pBD->GetPushButton( BUTTONID_NO ) )
2405                                             {
2406                                                 REPORT_WIN_CLOSEDc(pControl, "Message Box (No)");
2407                                                 SET_WINP_CLOSING(pControl);
2408                                                 pBD->EndDialog(RET_NO);
2409                                             }
2410                                             nNr1++;
2411                                             break;
2412                                         default:
2413                                             {
2414                                                 sal_uInt16 nID = pBD->GetButtonId( nNr1-10 );
2415                                                 if ( nID != BUTTONID_HELP )
2416                                                 {
2417                                                     REPORT_WIN_CLOSED(pControl, CUniString("Message Box (").Append( UniString::CreateFromInt32(nID) ).AppendAscii(")"));
2418                                                     SET_WINP_CLOSING(pControl);
2419                                                     pBD->EndDialog(nID);
2420                                                 }
2421                                                 nNr1++;
2422                                             }
2423                                     }
2424                                     break;
2425                                 }
2426                             default:
2427                                 DBG_ERROR( "Unknown Windowtype" );
2428                                 REPORT_WIN_CLOSEDc(pControl, "Unknown Windowtype");
2429                                 ReportError( GEN_RES_STR0( S_RESETAPPLICATION_FAILED_UNKNOWN ), pControl->GetType() );
2430                                 #if OSL_DEBUG_LEVEL > 1
2431                                 m_pDbgWin->AddText( " Unbekannter Objekttyp aus UId" );
2432                                 #endif
2433                                 break;
2434                         }
2435                         return sal_False;
2436                     }
2437                     else
2438                     {
2439                         if ( (pControl->GetType() == WINDOW_DOCKINGWINDOW || pControl->GetType() == WINDOW_TOOLBOX) && nRetryCount-- )
2440                         {
2441                             if ( (((DockingWindow*)pControl)->GetStyle() | ((DockingWindow*)pControl)->GetFloatStyle()) & WB_CLOSEABLE )
2442                             {
2443                                 REPORT_WIN_CLOSED(pControl, TypeString(pControl->GetType()));
2444                                 SET_WINP_CLOSING(pControl);
2445                                 ((DockingWindow*)pControl)->Close();
2446 
2447                                 // Eigentlich nur bei TaskWindows! Hoffen wir mal, daß keine anderen DockingWindows dazwischen hauen.
2448                                 if ( (Window*)nLNr1 != pControl )
2449                                     nNr1 = 1;       // Zum durchprobieren der Buttons beim schließen
2450                                 nLNr1 = (sal_uLong)pControl;
2451 
2452                                 return sal_False;
2453                             }
2454                         }
2455                         if ( nRetryCount--
2456                                 && (    (pControl->GetType() == WINDOW_FLOATINGWINDOW)
2457                                     ||  (pControl->GetType() == WINDOW_MODELESSDIALOG)
2458                                     ||  (pControl->GetType() == WINDOW_WORKWINDOW)
2459                                     ||  (pControl->GetType() == WINDOW_BORDERWINDOW) ) )
2460                         {
2461     //                      if ( pControl->GetStyle() & WB_CLOSEABLE )
2462                             {
2463 #ifdef RESET_APPLICATION_TO_BACKING_WINDOW
2464                                 // Special handling for last Document; do not close the Frame, only the Document
2465                                 if ( GetDocWinCount() == 1 && IsDocFrame( pControl ) )
2466                                 {
2467                                     if ( IsDocWin( pControl ) )
2468                                     {
2469                                         if ( GetDocFrameMenuBar( pControl ) )
2470                                         {
2471                                             MenuBar* pMenu = GetDocFrameMenuBar( pControl );
2472                                             if ( pMenu->HasCloser() )
2473                                             {
2474                                                 REPORT_WIN_CLOSED( pControl, TypeString(pControl->GetType()));
2475                                                 SET_WINP_CLOSING(pControl);
2476 
2477                                                 pMenu->GetCloserHdl().Call( pMenu );
2478 
2479                                                 // nur bei TaskWindows!
2480                                                 if ( (Window*)nLNr1 != pControl )
2481                                                     nNr1 = 1;       // Zum durchprobieren der Buttons beim Schließen
2482                                                 nLNr1 = (sal_uLong)pControl;
2483 
2484                                                 return sal_False;
2485                                             }
2486                                         }
2487                                     }
2488                                 }
2489                                 else
2490 #endif // def RESET_APPLICATION_TO_BACKING_WINDOW
2491                                 {
2492                                     REPORT_WIN_CLOSED( pControl, TypeString(pControl->GetType()));
2493                                     SET_WINP_CLOSING(pControl);
2494                                     ((SystemWindow*)pControl)->Close();
2495 
2496                                     // Eigentlich nur bei TaskWindows!
2497                                     if ( (Window*)nLNr1 != pControl )
2498                                         nNr1 = 1;       // Zum durchprobieren der Buttons beim Schließen
2499                                     nLNr1 = (sal_uLong)pControl;
2500 
2501                                     return sal_False;
2502                                 }
2503                             }
2504                         }
2505                     }
2506                 }
2507                 // wait for some time if more windows show up
2508                 // E.g.: Floating toolbars on a Task which was hidden by another Task before
2509                 if ( !bBool2 )
2510                 {
2511                     nLNr1 = Time().GetTime() + 100; // 100 = 1 Second
2512                     bBool2 = sal_True;
2513                 }
2514                 if ( Time().GetTime() < long(nLNr1) )   // Aktuelle Zeit kleiner Endzeit
2515                     return sal_False;
2516                 else
2517                     pRet->GenReturn ( RET_Value, nMethodId, aString1);
2518             }
2519             break;
2520         case RC_WaitSlot:
2521             {
2522                 if ( ! (nParams & PARAM_USHORT_1) )
2523                     nNr1 = 1000;    // defaults to 1000 = 1 Sec.
2524                 if ( !bBool1 )
2525                 {
2526                     nLNr1 = Time().GetTime() + nNr1/10;
2527                     bBool1 = sal_True;
2528                 }
2529 
2530                 if ( !bIsSlotInExecute )
2531                     pRet->GenReturn ( RET_Value, nMethodId, comm_USHORT(CONST_WSFinished) );
2532                 else
2533                 {
2534                     if ( Time().GetTime() < long(nLNr1) )   // Aktuelle Zeit kleiner Endzeit
2535                         return sal_False;
2536                     pRet->GenReturn ( RET_Value, nMethodId, comm_USHORT(CONST_WSTimeout) );
2537                 }
2538             }
2539             break;
2540     }
2541 
2542 
2543     Advance();
2544 
2545 
2546     switch ( nMethodId )
2547     {
2548         case RC_AppDelay:       // Diese Befehle werden anderswo behandelt
2549         case RC_DisplayHid:
2550         case RC_ResetApplication:
2551         case RC_WaitSlot:
2552 
2553         case RC_AppAbort:       // Sofortiges Löschen aller Befehle
2554             break;
2555         case RC_Assert:
2556             {
2557                 ByteString aAssertion( "Diese Assertion wurde vom Testtool per Befehl ausgelöst" );
2558                 aAssertion = ByteString( String( aAssertion, RTL_TEXTENCODING_MS_1252 ), RTL_TEXTENCODING_UTF8 );
2559                 DBG_ASSERT( !aString1.Len(), ByteString( aString1, RTL_TEXTENCODING_UTF8 ).GetBuffer() );
2560                 DBG_ASSERT(  aString1.Len(), aAssertion.GetBuffer() );
2561                 OSL_ENSURE( !aString1.Len(), ByteString( aString1, RTL_TEXTENCODING_UTF8 ).GetBuffer() );
2562                 OSL_ENSURE(  aString1.Len(), aAssertion.GetBuffer() );
2563             }
2564             break;
2565         case RC_CaptureAssertions:
2566 #ifdef DBG_UTIL
2567             if( !(nParams & PARAM_BOOL_1) || bBool1 )
2568             {
2569                 DBG_INSTOUTERROR( DBG_OUT_TESTTOOL );
2570                 osl_setDebugMessageFunc( osl_TestToolDebugPrint );
2571             }
2572             else
2573             {
2574                 DBG_INSTOUTERROR( DBG_OUT_MSGBOX );
2575                 osl_setDebugMessageFunc( pOriginal_osl_DebugMessageFunc );
2576             }
2577 #endif
2578             break;
2579         case RC_Translate:
2580             Translate();
2581             break;
2582         case RC_ApplicationBusy:
2583         {
2584             sal_Bool bWait = sal_False;
2585             ReportError( GEN_RES_STR0( S_NO_ACTIVE_WINDOW ) );
2586 //          if ( Application::GetAppWindow() )
2587 //              bWait = Application::GetAppWindow()->IsWait();
2588             pRet->GenReturn ( RET_Value, nMethodId, bWait );
2589             break;
2590         }
2591         case RC_GetClipboard:
2592             {
2593                 ::rtl::OUString aTemp;
2594                 ::svt::OStringTransfer::PasteString( aTemp, GetFirstDocFrame() );
2595                 pRet->GenReturn ( RET_Value, nMethodId, String( aTemp ) );
2596             }
2597             break;
2598         case RC_SetClipboard:
2599             ::svt::OStringTransfer::CopyString(aString1,GetFirstDocFrame());
2600             break;
2601         case RC_WinTree:
2602             pRet->GenReturn ( RET_Value, nMethodId, Tree( NULL, 0));
2603             break;
2604     #if OSL_DEBUG_LEVEL > 1
2605         case RC_NoDebug:
2606             m_pDbgWin->bQuiet = sal_True;
2607             m_pDbgWin->Hide();
2608             m_pDbgWin->Clear();
2609             break;
2610         case RC_Debug:
2611             m_pDbgWin->bQuiet = sal_False;
2612             m_pDbgWin->Show();
2613             break;
2614     #endif
2615         case RC_GPF:
2616             ((TabControl*)NULL)->SetCurPageId( 12345 );
2617             break;
2618         case RC_GetNextCloseWindow:
2619             {
2620                 Window *pWin = GetActive( WINDOW_BASE );      // WINDOW_ANYTYPE
2621                 if ( !pWin )
2622                     ReportError( GEN_RES_STR0( S_NO_ACTIVE_WINDOW ) );
2623                 else if ( !IsDialog(pWin) )
2624                     ReportError( GEN_RES_STR0( S_NO_DIALOG_IN_GETACTIVE ) );
2625                 else
2626                 {
2627                     pRet->GenReturn( RET_Value, nMethodId, Id2Str(pWin->GetUniqueOrHelpId()) );
2628                 }
2629             }
2630             break;
2631         case RC_UseBindings:
2632             if( !(nParams & PARAM_BOOL_1) || bBool1 )
2633                 nUseBindings = SFX_USE_BINDINGS;
2634             else
2635                 nUseBindings = 0;
2636             break;
2637         case RC_Profile:
2638             //  Bei folgenden Parametern passiert folgendes:
2639             //  ein boolean=false                   Alles Profiling stoppen (Ergebnisse liefern)
2640             //  ein boolean=true, 1-4 ints          Einteilung der Zeiten in Kästchen
2641             //  kein! boolean keine ints            loggen jeden Befehls
2642             //  kein! boolean 1 int                 loggen alle int Millisekunden
2643             //  ein String                          wird in das Logfile übernommen(sonst passiert nichts)
2644             if( !(nParams & PARAM_BOOL_1) || bBool1 )
2645             {
2646                 if ( !pProfiler )
2647                 {
2648                     pProfiler = new TTProfiler;
2649                     InitProfile();
2650                 }
2651 
2652                 if( !(nParams & PARAM_BOOL_1) && (nParams & PARAM_USHORT_1) )
2653                 {   // Autoprofiling: Profile nNr
2654                     if ( pProfiler->IsProfilingPerCommand() )
2655                     {
2656                         pProfiler->StopProfilingPerCommand();
2657                     }
2658                     pProfiler->StartAutoProfiling( nNr1 );
2659 
2660                     // Der Header ist abhängig vom Modus
2661                     pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetProfileHeader() );
2662                 }
2663                 else if ( nParams & PARAM_USHORT_1 )
2664                 {   // Partitioning initialisieren: Profile true [,nNr][,nNr][,nNr][,nNr]
2665                     comm_ULONG nAnzahl=0;
2666                     if ( nParams & PARAM_USHORT_1 ) { nAnzahl++; };
2667                     if ( nParams & PARAM_USHORT_2 ) { nAnzahl++; };
2668                     if ( nParams & PARAM_USHORT_3 ) { nAnzahl++; };
2669                     if ( nParams & PARAM_USHORT_4 ) { nAnzahl++; };
2670 
2671                     // Hier werden die Parameter ans Testtool zurück übertragen.
2672                     // Das ist zwar etwas eigenartig, aber ansonsten müsste man im Testtool
2673                     // die einfache Struktur der Remotebefehle aufbrechen.
2674                     pRet->GenReturn( RET_ProfileInfo, S_ProfileReset, nAnzahl );
2675 
2676                     // Und die einzelnen Grenzen
2677                     if ( nParams & PARAM_USHORT_1 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder1, (comm_ULONG)nNr1 ); };
2678                     if ( nParams & PARAM_USHORT_2 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder2, (comm_ULONG)nNr2 ); };
2679                     if ( nParams & PARAM_USHORT_3 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder3, (comm_ULONG)nNr3 ); };
2680                     if ( nParams & PARAM_USHORT_4 ) { pRet->GenReturn( RET_ProfileInfo, S_ProfileBorder4, (comm_ULONG)nNr4 ); };
2681 
2682                     pProfiler->StartPartitioning();
2683                 }
2684                 else if( nParams == PARAM_STR_1 )   // Genau ein String!
2685                 {   // Nur einen String ins Profiling aufnehmen
2686                     aString1 += '\n';
2687                     pRet->GenReturn( RET_ProfileInfo, 0, aString1 );
2688                 }
2689                 else
2690                 {   // Normales Profiling je Kommando: profile
2691                     if ( pProfiler->IsAutoProfiling() )
2692                     {
2693                         pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetAutoProfiling() );
2694                         pProfiler->StopAutoProfiling();
2695                     }
2696                     pProfiler->StartProfilingPerCommand();
2697 
2698                     // Der Header ist abhängig vom Modus
2699                     pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetProfileHeader() );
2700                 }
2701             }
2702             else        // Profiling wieder ausschalten: Profile false
2703                 if ( pProfiler )
2704                 {
2705                     if ( pProfiler->IsProfilingPerCommand() )
2706                         pProfiler->StopProfilingPerCommand();
2707 
2708                     if ( pProfiler->IsAutoProfiling() )
2709                     {
2710                         pRet->GenReturn( RET_ProfileInfo, 0, pProfiler->GetAutoProfiling() );
2711                         pProfiler->StopAutoProfiling();
2712                     }
2713 
2714                     if ( pProfiler->IsPartitioning() )
2715                     {
2716                         pRet->GenReturn( RET_ProfileInfo, S_ProfileDump, (comm_ULONG)0 );
2717                         pProfiler->StopPartitioning();
2718                     }
2719 
2720                     delete pProfiler;
2721                     pProfiler = NULL;
2722                 }
2723             break;
2724         case RC_MenuGetItemCount:
2725         case RC_MenuGetItemId:
2726         case RC_MenuGetItemPos:
2727         case RC_MenuIsSeperator:
2728         case RC_MenuIsItemChecked:
2729         case RC_MenuIsItemEnabled:
2730         case RC_MenuGetItemText:
2731         case RC_MenuGetItemCommand:
2732         case RC_MenuHasSubMenu:
2733         case RC_MenuSelect:
2734             {
2735                 PopupMenu *pPopup = NULL;
2736                 MenuBar *pMenuBar = NULL;
2737                 Menu *pMenu;
2738 
2739                 sal_uInt16 nErr = GetCurrentMenues( pPopup, pMenuBar, pMenu );
2740 
2741                 if ( !pMenu )
2742                 {
2743                     if ( nErr == 1 )
2744                         ReportError( GEN_RES_STR0( S_NO_POPUP ) );
2745                     else
2746                         ReportError( GEN_RES_STR0( S_NO_SUBMENU ) );
2747                     break;
2748                 }
2749 
2750                 sal_uInt16 nItemCount = 0;
2751                 switch ( nMethodId )
2752                 {
2753                     case RC_MenuGetItemCount:
2754                     case RC_MenuGetItemId:
2755                     case RC_MenuIsSeperator:
2756                         {
2757                             nItemCount = pMenu->GetItemCount();
2758                             if ( pMenu->GetMenuFlags() & MENU_FLAG_HIDEDISABLEDENTRIES )
2759                             {   // jep, we have to adjust the count
2760                                 sal_Bool bLastWasSeperator = sal_True;  // sal_True for Separator at the top
2761                                 for ( sal_uInt16 i = 0 ; i < pMenu->GetItemCount() ; i++ )
2762                                 {
2763                                     if ( !pMenu->IsItemEnabled( pMenu->GetItemId( i ) ) )
2764                                         nItemCount--;
2765                                     else
2766                                     {
2767                                         if ( pMenu->GetItemType( i ) == MENUITEM_SEPARATOR && bLastWasSeperator )
2768                                             nItemCount--;
2769                                         bLastWasSeperator = pMenu->GetItemType( i ) == MENUITEM_SEPARATOR;
2770                                     }
2771                                 }
2772                                 if ( bLastWasSeperator )    // Separator at bottom
2773                                     nItemCount--;
2774                             }
2775                         }
2776                         break;
2777                 }
2778 
2779                 // for certain methods calculate the physical index (reinserting the hidden entries)
2780                 sal_uInt16 nPhysicalIndex = 0;
2781                 switch ( nMethodId )
2782                 {
2783                     case RC_MenuGetItemId:
2784                     case RC_MenuIsSeperator:
2785                         {
2786                             nPhysicalIndex = nNr1;
2787                             if ( pMenu->GetMenuFlags() & MENU_FLAG_HIDEDISABLEDENTRIES )
2788                             {   // jep, we have to adjust the position
2789                                 sal_Bool bLastWasSeperator = sal_True;  // sal_True for Separator at the top
2790                                 sal_uInt16 nVisibleCount = 0;
2791                                 for ( sal_uInt16 i = 0 ; i < pMenu->GetItemCount() && nVisibleCount < nNr1 ; i++ )
2792                                 {
2793                                     if ( pMenu->IsItemEnabled( pMenu->GetItemId( i ) )
2794                                          && !( pMenu->GetItemType( i ) == MENUITEM_SEPARATOR && bLastWasSeperator ) )
2795                                     {
2796                                         nVisibleCount++;
2797                                         bLastWasSeperator = pMenu->GetItemType( i ) == MENUITEM_SEPARATOR;
2798                                     }
2799                                     else
2800                                         nPhysicalIndex++;
2801                                 }
2802                                 DBG_ASSERT( nVisibleCount == nNr1, "Adaption of Index failed: nVisibleCount != nNr1" );
2803                             }
2804                         }
2805                         break;
2806                 }
2807 
2808 
2809 
2810                 switch ( nMethodId )
2811                 {
2812                     case RC_MenuGetItemCount:
2813                         {
2814                             pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)nItemCount );
2815                         }
2816                         break;
2817                     case RC_MenuGetItemId:
2818                         {
2819                             if ( ValueOK( rtl::OString(), RcString( nMethodId ),nNr1,nItemCount) )
2820                                 pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)pMenu->GetItemId(nPhysicalIndex-1) );
2821                         }
2822                         break;
2823                     case RC_MenuGetItemPos:
2824                         {
2825                             sal_uInt16 nLogicalPos = pMenu->GetItemPos(nNr1);
2826                             if ( MENU_ITEM_NOTFOUND != nLogicalPos && pMenu->GetMenuFlags() & MENU_FLAG_HIDEDISABLEDENTRIES )
2827                             {   // jep, we have to adjust the position
2828                                 if ( !pMenu->IsItemEnabled( nNr1 ) )
2829                                     nLogicalPos = MENU_ITEM_NOTFOUND;
2830                                 else
2831                                 {
2832                                     sal_Bool bLastWasSeperator = sal_False;
2833                                     for ( int i = nLogicalPos ; i >= 0 ; i-- )
2834                                     {
2835                                         if ( !pMenu->IsItemEnabled( pMenu->GetItemId( sal::static_int_cast< sal_uInt16 >(i) ) ) ||
2836                                              ( pMenu->GetItemType( sal::static_int_cast< sal_uInt16 >(i) ) == MENUITEM_SEPARATOR && bLastWasSeperator ) )
2837                                             nLogicalPos--;
2838                                         bLastWasSeperator = pMenu->GetItemType( sal::static_int_cast< sal_uInt16 >(i) ) == MENUITEM_SEPARATOR;
2839                                     }
2840                                 }
2841                             }
2842                             pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)(nLogicalPos+1) );
2843                         }
2844                         break;
2845                     case RC_MenuIsSeperator:
2846                         {
2847                             if ( ValueOK( rtl::OString(), RcString( nMethodId ),nNr1,nItemCount) )
2848                                 pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)(pMenu->GetItemType(nPhysicalIndex-1) == MENUITEM_SEPARATOR) );
2849                         }
2850                         break;
2851                     case RC_MenuIsItemChecked:
2852                         {
2853                             pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)pMenu->IsItemChecked(nNr1) );
2854                         }
2855                         break;
2856                     case RC_MenuIsItemEnabled:
2857                         {
2858                             pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)pMenu->IsItemEnabled(nNr1) );
2859                         }
2860                         break;
2861                     case RC_MenuGetItemText:
2862                         {
2863                             pRet->GenReturn ( RET_Value, nMethodId, (String)pMenu->GetItemText(nNr1) );
2864                         }
2865                         break;
2866                     case RC_MenuGetItemCommand:
2867                         {
2868                             pRet->GenReturn ( RET_Value, nMethodId, (String)pMenu->GetItemCommand(nNr1) );
2869                         }
2870                         break;
2871                     case RC_MenuHasSubMenu:
2872                         {
2873                             pRet->GenReturn ( RET_Value, nMethodId, (sal_Bool)(pMenu->GetPopupMenu(nNr1) != NULL) );
2874                         }
2875                         break;
2876                     case RC_MenuSelect:
2877                         {
2878                             if ( pMenu->GetPopupMenu(nNr1) )
2879                             {
2880                                 if ( !aSubMenuId1 )
2881                                     aSubMenuId1 = nNr1;
2882                                 else if ( !aSubMenuId2 )
2883                                     aSubMenuId2 = nNr1;
2884                                 else if ( !aSubMenuId3 )
2885                                     aSubMenuId3 = nNr1;
2886 
2887                                 if ( pPopup )
2888                                     pPopup->SelectEntry(nNr1);
2889                                 else
2890                                     pMenuBar->SelectEntry(nNr1);
2891                             }
2892                             else
2893                             {
2894                                 if ( pPopup )
2895                                 {
2896                                     pPopup->EndExecute(nNr1);
2897                                     aSubMenuId1 = 0;
2898                                     aSubMenuId2 = 0;
2899                                     aSubMenuId3 = 0;
2900                                     pMenuWindow = NULL;
2901                                 }
2902                                 else
2903                                 {
2904                                     pMenuBar->SelectEntry(nNr1);
2905                                     aSubMenuId1 = 0;
2906                                     aSubMenuId2 = 0;
2907                                     aSubMenuId3 = 0;
2908                                     pMenuWindow = NULL;
2909                                 }
2910                             }
2911                         }
2912                         break;
2913                 }
2914             }
2915             break;
2916         case RC_SetControlType:
2917             {
2918                 DirectLog( S_QAError, GEN_RES_STR0( S_DEPRECATED ) );
2919             }
2920             break;
2921         case RC_Kill:
2922         case RC_RmDir:
2923         case RC_MkDir:
2924         case RC_FileCopy:
2925         case RC_Name:
2926         case RC_Dir:
2927         case RC_FileLen:
2928         case RC_FileDateTime:
2929             {
2930                 long nErrorcode = FSYS_ERR_OK;
2931                 switch ( nMethodId )
2932                 {
2933                     case RC_Kill:
2934                         {
2935                             DirEntry aFile( aString1 );
2936                             nErrorcode = aFile.GetError();
2937                             if ( FSYS_ERR_OK == nErrorcode && FileStat( aFile ).IsKind( FSYS_KIND_FILE ) )
2938                                 nErrorcode = aFile.Kill();
2939                             else
2940                                 nErrorcode = FSYS_ERR_NOTAFILE;
2941                         }
2942                         break;
2943                     case RC_RmDir:
2944                         {
2945                             DirEntry aDir( aString1 );
2946                             nErrorcode = aDir.GetError();
2947                             if ( FSYS_ERR_OK == nErrorcode && FileStat( aDir ).IsKind( FSYS_KIND_DIR ) )
2948                                 nErrorcode = aDir.Kill();
2949                             else
2950                                 nErrorcode = FSYS_ERR_NOTADIRECTORY;
2951                         }
2952                         break;
2953                     case RC_MkDir:
2954                         {
2955                             DirEntry aDir( aString1 );
2956                             nErrorcode = aDir.GetError();
2957                             if ( !nErrorcode && !aDir.MakeDir() )
2958                                 nErrorcode = FSYS_ERR_UNKNOWN;
2959 //  Workaround für Bug 60693
2960 //                              nErrorcode = aDir.GetError();
2961                         }
2962                         break;
2963                     case RC_FileCopy:
2964                         {
2965                             nErrorcode = DirEntry( aString1 ).CopyTo( DirEntry( aString2 ), FSYS_ACTION_COPYFILE );
2966                         }
2967                         break;
2968                     case RC_Name:
2969                         {
2970                             nErrorcode = DirEntry( aString1 ).MoveTo( DirEntry( aString2 ) );
2971                         }
2972                         break;
2973                     case RC_Dir:
2974                         {
2975 
2976                             String aPath;
2977                             sal_uInt16 nDirFlags = 0;
2978 // from basic/source/inc/runtime.hxx
2979 #define Sb_ATTR_NORMAL          0x0000
2980 #define Sb_ATTR_HIDDEN          0x0002
2981 #define Sb_ATTR_SYSTEM          0x0004
2982 #define Sb_ATTR_VOLUME          0x0008
2983 #define Sb_ATTR_DIRECTORY       0x0010
2984 #define Sb_ATTR_ARCHIVE         0x0020
2985                             // copied from Basic and adapted  basic/source/runtime/methods.cxx Revision 1.54
2986                             if ( (nParams & PARAM_STR_1) )
2987                             {
2988                                 delete pDir;
2989                                 pDir = NULL; // wg. Sonderbehandlung Sb_ATTR_VOLUME
2990                                 DirEntry aEntry( aString1 );
2991                                 FileStat aStat( aEntry );
2992                                 if(!aStat.GetError() && (aStat.GetKind() & FSYS_KIND_FILE))
2993                                 {
2994                                     // OK, only a filename
2995                                     // cut off path (VB4)
2996                                     aPath = aEntry.GetName();
2997                                 }
2998                                 else
2999                                 {
3000                                     sal_uInt16 nFlags = 0;
3001                                     if ( (nParams & PARAM_USHORT_1) )
3002                                         nDirFlags = nFlags = nNr1;
3003                                     else
3004                                         nDirFlags = nFlags = Sb_ATTR_HIDDEN | Sb_ATTR_SYSTEM | Sb_ATTR_DIRECTORY;
3005 
3006                                     // Nur diese Bitmaske ist unter Windows erlaubt
3007                                     // Sb_ATTR_VOLUME wird getrennt gehandelt
3008                                     if( nDirFlags & Sb_ATTR_VOLUME )
3009                                         aPath = aEntry.GetVolume();
3010                                     else
3011                                     {
3012                                         // Die richtige Auswahl treffen
3013                                         sal_uInt16 nMode = FSYS_KIND_FILE;
3014                                         if( nFlags & Sb_ATTR_DIRECTORY )
3015                                             nMode |= FSYS_KIND_DIR;
3016                                         if( nFlags == Sb_ATTR_DIRECTORY )
3017                                             nMode = FSYS_KIND_DIR;
3018                                         pDir = new Dir( aEntry, (DirEntryKind) nMode );
3019                                         nErrorcode = pDir->GetError();
3020                                         nDirPos = 0;
3021                                     }
3022                                 }
3023                             }
3024 
3025                             if( pDir )
3026                             {
3027                                 for( ;; )
3028                                 {
3029                                     if( nDirPos >= pDir->Count() )
3030                                     {
3031                                         delete pDir;
3032                                         pDir = NULL;
3033                                         aPath.Erase();
3034                                         break;
3035                                     }
3036                                     DirEntry aNextEntry=(*(pDir))[nDirPos++];
3037                                     aPath = aNextEntry.GetName(); //Full();
3038                                     break;
3039                                 }
3040                             }
3041                             if ( !nErrorcode )
3042                             {
3043                                 pRet->GenReturn ( RET_Value, nMethodId, aPath );
3044                             }
3045 
3046 /* keep old Implementation for now
3047                             // neues Verzeichnis einlesen
3048                             if ( (nParams & PARAM_STR_1) )
3049                             {
3050                                 if ( pDir )
3051                                 {
3052                                     delete pDir;
3053                                     pDir = NULL;
3054                                 }
3055                                 DirEntryKind aDirEntryKind = FSYS_KIND_FILE | FSYS_KIND_DIR;
3056                                 if ( (nParams & PARAM_USHORT_1) && nNr1 )
3057                                 {
3058                                     if ( nNr1 & 16 )
3059                                         aDirEntryKind = FSYS_KIND_DIR;
3060                                     else
3061                                         ReportError( GEN_RES_STR0( S_SELECTION_BY_ATTRIBUTE_ONLY_DIRECTORIES ) );
3062                                 }
3063 
3064                                 DirEntry aEntry( aString1 );
3065                                 nErrorcode = aEntry.GetError();
3066                                 if ( !nErrorcode )
3067                                 {
3068                                     nDirPos = 0;
3069                                     FileStat aFS( aEntry );
3070                                     if ( !aFS.IsKind( FSYS_KIND_WILD ) && !aFS.IsKind( FSYS_KIND_DIR ) && aEntry.Exists() )
3071                                     {   // Sonderbehandlung für genau einen Eintrag
3072                                         if ( !aFS.IsKind( FSYS_KIND_DIR ) && ( aDirEntryKind == FSYS_KIND_DIR ) )
3073                                             pRet->GenReturn ( RET_Value, nMethodId, String() );
3074                                         else
3075                                             pRet->GenReturn ( RET_Value, nMethodId, (String)(aEntry.GetName()) );
3076 
3077                                         break;
3078                                     }
3079                                     else
3080                                     {
3081                                         pDir = new Dir( aEntry, aDirEntryKind );
3082                                         nErrorcode = pDir->GetError();
3083                                     }
3084                                 }
3085                             }
3086 
3087                             if ( !pDir )
3088                                 pDir = new Dir;
3089 
3090                             if ( !nErrorcode && ValueOK( nMethodId, GEN_RES_STR0( S_NO_MORE_FILES ), nDirPos+1, pDir->Count()+1 ) )
3091                             {
3092                                 if ( nDirPos == pDir->Count() )
3093                                     pRet->GenReturn ( RET_Value, nMethodId, String() );
3094                                 else
3095                                     pRet->GenReturn ( RET_Value, nMethodId, (String)((*pDir)[ nDirPos ].GetName()) );
3096                                 nDirPos++;
3097                             }*/
3098                         }
3099                         break;
3100                     case RC_FileLen:
3101                         {
3102                             DirEntry aFile( aString1 );
3103                             nErrorcode = aFile.GetError();
3104                             if ( FSYS_ERR_OK == nErrorcode )
3105                             {
3106                                 FileStat aFS( aFile );
3107                                 pRet->GenReturn ( RET_Value, nMethodId, static_cast<comm_ULONG>(aFS.GetSize()) ); //GetSize() sal_uLong != comm_ULONG on 64bit
3108                                 nErrorcode = aFS.GetError();
3109                             }
3110                         }
3111                         break;
3112                     case RC_FileDateTime:
3113                         {
3114                             DirEntry aFile( aString1 );
3115                             nErrorcode = aFile.GetError();
3116                             if ( FSYS_ERR_OK == nErrorcode )
3117                             {
3118                                 FileStat aStat( aFile );
3119                                 Time aTime( aStat.TimeModified() );
3120                                 Date aDate( aStat.DateModified() );
3121                                 nErrorcode = aStat.GetError();
3122 
3123                                 double fSerial = (double)( aDate - Date(30,12,1899) );
3124                                 long nSeconds = aTime.GetHour();
3125                                 nSeconds *= 3600;
3126                                 nSeconds += aTime.GetMin() * 60;
3127                                 nSeconds += aTime.GetSec();
3128                                 double nDays = ((double)nSeconds) / (double)(24.0*3600.0);
3129                                 fSerial += nDays;
3130 
3131                                 SbxValueRef xValue = new SbxValue( SbxDATE );
3132                                 xValue->PutDate( fSerial );
3133 
3134                                 pRet->GenReturn ( RET_Value, nMethodId, *xValue );
3135                             }
3136                         }
3137                         break;
3138                 }
3139                 switch ( nErrorcode )
3140                 {
3141                     case FSYS_ERR_OK:
3142                         break;
3143                     case FSYS_ERR_MISPLACEDCHAR:
3144                         {
3145                             ReportError( CUniString("MISPLACEDCHAR") );
3146                         }
3147                         break;
3148                     case FSYS_ERR_INVALIDCHAR:
3149                         {
3150                             ReportError( CUniString("INVALIDCHAR") );
3151                         }
3152                         break;
3153                     case FSYS_ERR_NOTEXISTS:
3154                         {
3155                             ReportError( CUniString("NOTEXISTS") );
3156                         }
3157                         break;
3158                     case FSYS_ERR_ALREADYEXISTS:
3159                         {
3160                             ReportError( CUniString("ALREADYEXISTS") );
3161                         }
3162                         break;
3163                     case FSYS_ERR_NOTADIRECTORY:
3164                         {
3165                             ReportError( CUniString("NOTADIRECTORY") );
3166                         }
3167                         break;
3168                     case FSYS_ERR_NOTAFILE:
3169                         {
3170                             ReportError( CUniString("NOTAFILE") );
3171                         }
3172                         break;
3173                     case FSYS_ERR_INVALIDDEVICE:
3174                         {
3175                             ReportError( CUniString("INVALIDDEVICE") );
3176                         }
3177                         break;
3178                     case FSYS_ERR_ACCESSDENIED:
3179                         {
3180                             ReportError( CUniString("ACCESSDENIED") );
3181                         }
3182                         break;
3183                     case FSYS_ERR_LOCKVIOLATION:
3184                         {
3185                             ReportError( CUniString("LOCKVIOLATION") );
3186                         }
3187                         break;
3188                     case FSYS_ERR_VOLUMEFULL:
3189                         {
3190                             ReportError( CUniString("VOLUMEFULL") );
3191                         }
3192                         break;
3193                     case FSYS_ERR_ISWILDCARD:
3194                         {
3195                             ReportError( CUniString("ISWILDCARD") );
3196                         }
3197                         break;
3198                     case FSYS_ERR_NOTSUPPORTED:
3199                         {
3200                             ReportError( CUniString("NOTSUPPORTED") );
3201                         }
3202                         break;
3203                     case FSYS_ERR_UNKNOWN:
3204                         {
3205                             ReportError( CUniString("UNKNOWN") );
3206                         }
3207                         break;
3208                     default:
3209                         {
3210                             ReportError( CUniString("Not an FSYS Error") );
3211                         }
3212                 }
3213 
3214             }
3215             break;
3216         case RC_TypeKeysDelay:
3217             {
3218                 if( (nParams & PARAM_BOOL_1) )
3219                 {
3220                     bDoTypeKeysDelay = bBool1;
3221                 }
3222                 else if( nParams & PARAM_USHORT_1 )
3223                 {
3224                     nMinTypeKeysDelay = nNr1;
3225                     if( nParams & PARAM_USHORT_2 )
3226                         nMaxTypeKeysDelay = nNr2;
3227                     else
3228                         nMaxTypeKeysDelay = nMinTypeKeysDelay;
3229                 }
3230                 else
3231                     ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3232             }
3233             break;
3234         case RC_GetMouseStyle:
3235             {
3236                 Pointer aPointer;
3237 //              if ( DragManager::GetDragManager() )
3238 //                  aPointer = DragManager::GetDragManager()->GetDragPointer();
3239 //              else
3240                 {
3241                     Window *pActualWin = GetMouseWin();
3242                     if ( pActualWin )
3243                         aPointer = pActualWin->GetPointer();
3244                     else
3245                     {
3246                         ReportError( GEN_RES_STR1( S_POINTER_OUTSIDE_APPWIN, RcString( nMethodId ) ) );
3247                         aPointer = Pointer( POINTER_NULL );
3248                     }
3249                 }
3250                 pRet->GenReturn ( RET_Value, nMethodId, (comm_ULONG)aPointer.GetStyle() );
3251             }
3252             break;
3253         case RC_UnpackStorage:
3254             {
3255                 if( (nParams & PARAM_STR_1) )
3256                 {
3257                     String aFileName( aString1 );
3258                     DirEntry aDestPath;
3259                     if( (nParams & PARAM_STR_2) )
3260                         aDestPath = DirEntry( aString2 );
3261                     else
3262                     {
3263                         aDestPath = DirEntry( aFileName );
3264                         aDestPath.SetExtension( CUniString( "plaintext" ) );
3265                     }
3266 
3267 #if OSL_DEBUG_LEVEL > 1
3268                     sal_uInt16 nEntries = Dir( aDestPath, FSYS_KIND_FILE | FSYS_KIND_DIR ).Count();
3269                     (void) nEntries; /* avoid warning about unused parameter */
3270 #endif
3271                     // The Count is only larger than 2 is the path is a directory which is not empty
3272                     // the Count of 2 results from the "." and ".." directory
3273                     if ( Dir( aDestPath, FSYS_KIND_FILE | FSYS_KIND_DIR ).Count() > 2 )
3274                         DirectLog( S_QAError, GEN_RES_STR1( S_DIRECTORY_NOT_EMPTY, aDestPath.GetFull() ) );
3275 
3276                     SotStorageRef xStorage = new SotStorage( aFileName, STREAM_STD_READ );
3277                     if ( xStorage->GetError() )
3278                         ReportError( GEN_RES_STR2(S_UNPACKING_STORAGE_FAILED, aFileName, aDestPath.GetFull()) );
3279                     else
3280                         UnpackStorage( xStorage, aDestPath );
3281                 }
3282                 else
3283                     ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3284             }
3285             break;
3286         case RC_CloseSysDialog:
3287         case RC_ExistsSysDialog:
3288             {
3289                 if( (nParams & PARAM_USHORT_1) )
3290                 {
3291                     Reference < ::com::sun::star::util::XCancellable > xPicker;
3292                     switch( nNr1 )
3293                     {
3294                         case CONST_FilePicker:
3295                             {
3296                                 xPicker.set( Reference < ::com::sun::star::util::XCancellable >( svt::GetTopMostFilePicker(), UNO_QUERY ) );
3297                             }
3298                             break;
3299                         case CONST_FolderPicker:
3300                             {
3301                                 xPicker.set( Reference < ::com::sun::star::util::XCancellable >( svt::GetTopMostFolderPicker(), UNO_QUERY ) );
3302                             }
3303                             break;
3304                         default:
3305                             ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3306                     }
3307                     switch( nMethodId )
3308                     {
3309                         case RC_CloseSysDialog:
3310                             {
3311                                 if ( xPicker.is() )
3312                                     xPicker->cancel();
3313                                 else
3314                                     ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3315                             }
3316                             break;
3317                         case RC_ExistsSysDialog:
3318                             {
3319                                 pRet->GenReturn ( RET_Value, nMethodId, (comm_BOOL)xPicker.is() );
3320                             }
3321                             break;
3322                         default:
3323                             ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3324                     }
3325                 }
3326                 else
3327                     ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3328             }
3329             break;
3330         case RC_SAXCheckWellformed:
3331         case RC_SAXReadFile:
3332 
3333         case RC_SAXGetNodeType:
3334         case RC_SAXGetAttributeCount:
3335         case RC_SAXGetAttributeName:
3336         case RC_SAXGetAttributeValue:
3337         case RC_SAXGetChildCount:
3338         case RC_SAXGetElementName:
3339         case RC_SAXGetChars:
3340 
3341         case RC_SAXSeekElement:
3342         case RC_SAXHasElement:
3343         case RC_SAXGetElementPath:
3344 
3345         case RC_SAXRelease:
3346             {
3347                 HandleSAXParser();
3348             }
3349             break;
3350         case RC_RecordMacro:
3351             {
3352                 if ( ! (nParams & PARAM_BOOL_1) )
3353                     bBool1 = sal_True;
3354 
3355                 MacroRecorder::GetMacroRecorder()->SetActionRecord( bBool1 );
3356             }
3357             break;
3358         case RC_GetDocumentCount :
3359             {
3360                 pRet->GenReturn ( RET_Value, nMethodId, (comm_USHORT)GetDocWinCount() );
3361             }
3362             break;
3363         case RC_ActivateDocument :
3364             {
3365                 if( nParams & PARAM_USHORT_1 )
3366                 {
3367                     if ( ValueOK( rtl::OString(), RcString( nMethodId ), nNr1, GetDocWinCount() ) )
3368                     {
3369                         Window* pWin = GetDocWin( nNr1-1 );
3370                         if ( pWin )
3371                         {
3372                             pWin->ToTop();
3373                             pWin->GrabFocus();
3374                         }
3375                     }
3376                 }
3377                 else
3378                     ReportError( GEN_RES_STR0( S_INVALID_PARAMETERS ) );
3379             }
3380             break;
3381         case RC_GetSystemLanguage :
3382             {
3383                 pRet->GenReturn ( RET_Value, nMethodId, (comm_USHORT)Application::GetSettings().GetLanguage() );
3384             }
3385             break;
3386         case RC_CatchGPF :
3387             {
3388                 if( (nParams & PARAM_BOOL_1) )
3389                     bCatchGPF = bBool1;
3390                 else
3391                     bCatchGPF = sal_True;
3392             }
3393             break;
3394         case RC_IsProduct :
3395             {
3396                 sal_Bool bIsProduct;
3397                 #ifdef DBG_UTIL
3398                     bIsProduct = sal_False;
3399                 #else
3400                     bIsProduct = sal_True;
3401                 #endif
3402                 pRet->GenReturn ( RET_Value, nMethodId, (sal_Bool)bIsProduct );
3403             }
3404             break;
3405         case RC_UsePostEvents :
3406             {
3407                 if( (nParams & PARAM_BOOL_1) )
3408                     bUsePostEvents = bBool1;
3409                 else
3410                     bUsePostEvents = sal_True;
3411             }
3412             break;
3413         default:
3414             ReportError( GEN_RES_STR1( S_UNKNOWN_COMMAND, RcString( nMethodId ) ) );
3415     }
3416     SendProfile( RcString(nMethodId) );
3417     delete this;
3418     return sal_True;
3419 }
3420 
3421 
3422 sal_Bool StatementCommand::UnpackStorage( SotStorageRef xStorage, DirEntry &aBaseDir )
3423 {
3424     SvStorageInfoList aList;
3425     xStorage->FillInfoList( &aList );
3426 
3427     for( sal_uInt16 i = 0; i < aList.Count(); i++ )
3428     {
3429         SvStorageInfo& rInfo = aList.GetObject( i );
3430         String aName = rInfo.GetName();
3431         DirEntry aPath ( aBaseDir );
3432         aPath += DirEntry( aName );
3433         sal_Bool bIsStorage = xStorage->IsStorage( aName );
3434         if ( bIsStorage )
3435         {
3436             SotStorageRef xSubStorage = xStorage->OpenSotStorage( aName, STREAM_STD_READ );
3437                 if ( xSubStorage->GetError() )
3438                 {
3439                     ReportError( GEN_RES_STR2(S_UNPACKING_STORAGE_FAILED, aName, aPath.GetFull()) );
3440                     return sal_False;
3441                 }
3442                 UnpackStorage( xSubStorage, aPath );
3443         }
3444         else
3445         {
3446             if ( !aPath.MakeDir( sal_True ) )
3447             {
3448                 ReportError( GEN_RES_STR1(S_CANNOT_CREATE_DIRECTORY, aPath.GetFull()) );
3449                 return sal_False;
3450             }
3451             SotStorageStreamRef xStream = xStorage->OpenSotStream( aName, STREAM_STD_READ );
3452             SvFileStream aDestination( aPath.GetFull(), STREAM_STD_READWRITE | STREAM_TRUNC );
3453             (*xStream) >> aDestination;
3454             if ( aDestination.GetError() != ERRCODE_NONE )
3455             {
3456                 ReportError( GEN_RES_STR2(S_UNPACKING_STORAGE_FAILED, aName, aPath.GetFull()) );
3457                 return sal_False;
3458             }
3459             aDestination.Close();
3460         }
3461     }
3462     return sal_True;
3463 }
3464 
3465 
3466 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
3467 
3468 StatementControl::StatementControl( SCmdStream *pCmdIn, sal_uInt16 nControlIdType )
3469 : StatementList()
3470 , nNr1( 0 )
3471 , nNr2( 0 )
3472 , nNr3( 0 )
3473 , nNr4( 0 )
3474 , nLNr1( 0 )
3475 , aString1()
3476 , aString2()
3477 , bBool1(sal_False)
3478 , bBool2(sal_False)
3479 {
3480     QueStatement( NULL );
3481     //HELPID BACKWARD (SIControl is no longer needed)
3482     if ( nControlIdType == SIControl )
3483     {
3484         comm_ULONG nId;
3485         pCmdIn->Read( nId );
3486         aUId = rtl::OString( nId );
3487         if ( nId == 0 )
3488             aUId = UID_ACTIVE;
3489         else
3490             ReportError( aUId, GEN_RES_STR1c( S_INTERNAL_ERROR, "using numeric HelpID from old Testtool" ) );
3491     }
3492     else if ( nControlIdType == SIStringControl )
3493     {
3494         String aId;
3495         pCmdIn->Read( aId );
3496         aUId = Str2Id( aId );
3497     }
3498     else
3499     {
3500         DBG_ERROR( "Wrong ControlType" );
3501     }
3502 
3503     pCmdIn->Read( nMethodId );
3504     pCmdIn->Read( nParams );
3505 
3506     if( nParams & PARAM_USHORT_1 )  pCmdIn->Read( nNr1 );
3507     if( nParams & PARAM_USHORT_2 )  pCmdIn->Read( nNr2 );
3508     if( nParams & PARAM_USHORT_3 )  pCmdIn->Read( nNr3 );
3509     if( nParams & PARAM_USHORT_4 )  pCmdIn->Read( nNr4 );
3510     if( nParams & PARAM_ULONG_1 )   pCmdIn->Read( nLNr1 );
3511     if( nParams & PARAM_STR_1 )     pCmdIn->Read( aString1 );
3512     if( nParams & PARAM_STR_2 )     pCmdIn->Read( aString2 );
3513     if( nParams & PARAM_BOOL_1 )    pCmdIn->Read( bBool1 );
3514     if( nParams & PARAM_BOOL_2 )    pCmdIn->Read( bBool2 );
3515 
3516 #if OSL_DEBUG_LEVEL > 1
3517     m_pDbgWin->AddText( "Reading Control: UId: " );
3518     m_pDbgWin->AddText( Id2Str( aUId ) );
3519     m_pDbgWin->AddText( " Methode: " );
3520     m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
3521     m_pDbgWin->AddText( " Params:" );
3522     if( nParams & PARAM_USHORT_1 )  {m_pDbgWin->AddText( " n1:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr1 ) );}
3523     if( nParams & PARAM_USHORT_2 )  {m_pDbgWin->AddText( " n2:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr2 ) );}
3524     if( nParams & PARAM_USHORT_3 )  {m_pDbgWin->AddText( " n3:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr3 ) );}
3525     if( nParams & PARAM_USHORT_4 )  {m_pDbgWin->AddText( " n4:" );m_pDbgWin->AddText( String::CreateFromInt32( nNr4 ) );}
3526     if( nParams & PARAM_ULONG_1 )   {m_pDbgWin->AddText( " nl1:" );m_pDbgWin->AddText( String::CreateFromInt64( nLNr1 ) );}
3527     if( nParams & PARAM_STR_1 )     {m_pDbgWin->AddText( " s1:" );m_pDbgWin->AddText( aString1 );}
3528     if( nParams & PARAM_STR_2 )     {m_pDbgWin->AddText( " s2:" );m_pDbgWin->AddText( aString2 );}
3529 /*    if( nParams & PARAM_BOOL_1 )    pCmdIn->Read( bBool1 );
3530     if( nParams & PARAM_BOOL_2 )    pCmdIn->Read( bBool2 );*/
3531     m_pDbgWin->AddText( "\n" );
3532 #endif
3533 }
3534 
3535 sal_Bool IsDialog(Window *pWin)
3536 {   // Alles was von SystemWindow abgeleitet ist
3537     if ( !pWin )
3538         return sal_False;
3539 
3540     switch (pWin->GetType())
3541     {
3542         case WINDOW_FLOATINGWINDOW:
3543         case WINDOW_DOCKINGWINDOW:
3544         case WINDOW_MODELESSDIALOG:
3545         case WINDOW_DIALOG:
3546         case WINDOW_MODALDIALOG:
3547         case WINDOW_WORKWINDOW:
3548         case WINDOW_TABDIALOG:
3549 
3550         case WINDOW_MESSBOX:
3551         case WINDOW_INFOBOX:
3552         case WINDOW_WARNINGBOX:
3553         case WINDOW_ERRORBOX:
3554         case WINDOW_QUERYBOX:
3555         case WINDOW_BUTTONDIALOG:
3556         case WINDOW_FILEDIALOG:
3557         case WINDOW_PRINTDIALOG:
3558         case WINDOW_PRINTERSETUPDIALOG:
3559 
3560 // ab hier nicht ansprechbar (da nicht implementiert)
3561         case WINDOW_SYSWINDOW:
3562         case WINDOW_SYSTEMDIALOG:
3563         case WINDOW_COLORDIALOG:
3564         case WINDOW_FONTDIALOG:
3565         case WINDOW_PATHDIALOG:
3566 
3567 
3568             return sal_True;
3569 //          break;
3570         default:
3571             return sal_False;
3572 //          break;
3573     }
3574 }
3575 
3576 
3577 sal_Bool IsAccessable(Window *pWin)
3578 {
3579     if ( pWin == NULL )
3580         return sal_False;
3581 
3582     return pWin->IsEnabled() && pWin->IsInputEnabled();
3583 }
3584 
3585 
3586 
3587 // neue Hilfsfunktion
3588 static Window*ImpGetButton( Window *pBase, WinBits nMask, WinBits nWinBits )
3589 {
3590     sal_uInt16 n = pBase->GetChildCount();
3591     for( sal_uInt16 i = 0 ; i < n; i++ ) {
3592         Window *pChild = pBase->GetChild(i);
3593         if(    pChild->GetType() == WINDOW_OKBUTTON
3594             || pChild->GetType() == WINDOW_CANCELBUTTON
3595             || pChild->GetType() == WINDOW_HELPBUTTON
3596             || pChild->GetType() == WINDOW_PUSHBUTTON )
3597             if( !nMask || ( pChild->GetStyle() & nMask ) == nWinBits )
3598                 return pChild;
3599     }
3600     return NULL;
3601 }
3602 
3603 sal_Bool StatementControl::ControlOK( Window *pControl, const sal_Char* cBezeichnung )
3604 {
3605     if ( pControl && ( ( ( IsAccessable(pControl) || (nMethodId & M_WITH_RETURN) ) &&
3606                          pControl->IsVisible() ) ||
3607                          aUId.equals( UID_ACTIVE ) ) )
3608         return sal_True;
3609     else
3610     {
3611         UniString aBezeichnung( cBezeichnung, RTL_TEXTENCODING_ASCII_US );
3612         if ( aBezeichnung.Len() > 0 )
3613         {
3614             if (!pControl)
3615                 ReportError( aUId, GEN_RES_STR1( S_WIN_NOT_FOUND, aBezeichnung ) );
3616             else if ( !pControl->IsVisible() )
3617                 ReportError( aUId, GEN_RES_STR1( S_WIN_INVISIBLE, aBezeichnung ) );
3618             else
3619                 ReportError( aUId, GEN_RES_STR1( S_WIN_DISABLED, aBezeichnung ) );
3620         }
3621         #if OSL_DEBUG_LEVEL > 1
3622         m_pDbgWin->AddText( aBezeichnung.AppendAscii(" NotFound or Disabled or Invisible") );
3623         #endif
3624 
3625         return sal_False;
3626     }
3627 }
3628 
3629 
3630 sal_Bool StatementList::ValueOK( rtl::OString aId, String aBezeichnung, sal_uLong nValue, sal_uLong nMax )
3631 {
3632 
3633     if ( nMax < nValue )
3634     {
3635         if ( aBezeichnung.Len() > 0 )
3636             ReportError( aId, GEN_RES_STR3( S_NUMBER_TOO_BIG, aBezeichnung, UniString::CreateFromInt32( nValue ), UniString::CreateFromInt32( nMax ) ) );
3637         return sal_False;
3638     }
3639     if ( nValue < 1 )
3640     {
3641         if ( aBezeichnung.Len() > 0 )
3642             ReportError( aId, GEN_RES_STR3c3( S_NUMBER_TOO_SMALL, aBezeichnung, UniString::CreateFromInt32( nValue ), "1" ) );
3643         return sal_False;
3644     }
3645     return sal_True;
3646 }
3647 
3648 sal_uInt16 StatementList::GetCurrentMenues( PopupMenu *&pPopup, MenuBar *&pMenuBar, Menu *&pMenu )
3649 {
3650     if ( WinPtrValid( pMenuWindow ) )
3651         pMenuBar = pMenuWindow->GetMenuBar();
3652 
3653     if ( pMenuBar )     // use MenuBar as base
3654         pMenu = pMenuBar;
3655     else        // use contextmenu as base
3656     {
3657         pMenu = PopupMenu::GetActivePopupMenu();
3658         pPopup = PopupMenu::GetActivePopupMenu();
3659     }
3660 
3661     if ( !pMenu )
3662         return 1;
3663 
3664     if ( aSubMenuId1 )
3665     {
3666         pPopup = pMenu->GetPopupMenu( aSubMenuId1 );
3667         pMenu = pPopup;
3668     }
3669 
3670     if ( pMenu && aSubMenuId2 )
3671     {
3672         pPopup = pMenu->GetPopupMenu( aSubMenuId2 );
3673         pMenu = pPopup;
3674     }
3675 
3676     if ( pMenu && aSubMenuId3 )
3677     {
3678         pPopup = pMenu->GetPopupMenu( aSubMenuId3 );
3679         pMenu = pPopup;
3680     }
3681 
3682     return 0;
3683 }
3684 
3685 void StatementControl::AnimateMouse( Window *pControl, TTHotSpots aWohin )
3686 {
3687     Point aZiel;
3688 
3689     switch (aWohin)
3690     {
3691         case MitteLinks:
3692             {
3693                 long nHeight = pControl->GetSizePixel().Height();
3694                 aZiel.X() += 5;
3695                 aZiel.Y() += nHeight / 2;
3696             }
3697             break;
3698         case Mitte:
3699             {
3700                 Size aSize = pControl->GetOutputSizePixel();
3701                 aZiel.Move( aSize.Width() / 2, aSize.Height() / 2 );
3702             }
3703             break;
3704         case MitteOben:
3705             {
3706                 long nWidth = pControl->GetSizePixel().Width();
3707                 aZiel.X() += nWidth / 2;
3708                 aZiel.Y() += 5;
3709             }
3710             break;
3711     }
3712     AnimateMouse( pControl, aZiel );
3713 }
3714 
3715 
3716 void StatementControl::AnimateMouse( Window *pControl, Point aWohin )
3717 {
3718     Point aAkt = pControl->GetPointerPosPixel();
3719     Point aZiel = aWohin;
3720 
3721     long nSteps;
3722     Point aDiff = aAkt - aZiel;
3723 
3724     if ( Abs(aDiff.X()) < Abs(aDiff.Y()) )
3725         nSteps = Abs(aDiff.Y()) / 5;
3726     else
3727         nSteps = Abs(aDiff.X()) / 5;
3728     if ( nSteps == 0 )
3729         return;
3730 
3731     aDiff *= 1000;
3732     aDiff /= nSteps;
3733 
3734     StatementList::bExecuting = sal_True;       // Bah ist das ein ekliger Hack
3735                                                 // Das verhindert, daß schon der nächste Befehl ausgeführt wird.
3736 
3737     for ( ; nSteps ; nSteps-- )
3738     {
3739         if ( Abs((aAkt - pControl->GetPointerPosPixel()).X()) > 5 ||
3740              Abs((aAkt - pControl->GetPointerPosPixel()).Y()) > 5 )
3741             nSteps = 1;
3742         aAkt = aZiel + aDiff * nSteps / 1000;
3743         pControl->SetPointerPosPixel(aAkt);
3744         SafeReschedule();
3745     }
3746     pControl->SetPointerPosPixel(aZiel);
3747     StatementList::bExecuting = sal_False;  // Bah ist das ein ekliger Hack
3748 }
3749 
3750 
3751 sal_Bool StatementControl::MaybeDoTypeKeysDelay( Window *pTestWindow )
3752 {
3753     if ( bDoTypeKeysDelay )
3754     {
3755         sal_uLong nTimeWait = nMinTypeKeysDelay;
3756         if ( nMaxTypeKeysDelay != nMinTypeKeysDelay )
3757             nTimeWait  += Time::GetSystemTicks() % ( nMaxTypeKeysDelay - nMinTypeKeysDelay );
3758         Timer aTimer;
3759         aTimer.SetTimeout( nTimeWait );
3760         aTimer.Start();
3761         StatementList::bExecuting = sal_True;       // Bah ist das ein ekliger Hack
3762                                                     // Das verhindert, daß schon der nächste Befehl ausgeführt wird.
3763         while ( aTimer.IsActive() )
3764         {
3765             SafeReschedule( sal_True );
3766         }
3767         StatementList::bExecuting = sal_False;  // Bah ist das ein ekliger Hack
3768         if ( !WinPtrValid(pTestWindow ) )
3769         {
3770             ReportError( aUId, GEN_RES_STR1( S_WINDOW_DISAPPEARED, MethodString( nMethodId ) ) );
3771             return sal_False;
3772         }
3773     }
3774     return sal_True;
3775 }
3776 
3777 sal_Bool StatementControl::HandleVisibleControls( Window *pControl )
3778 {
3779     if( pControl )      // Also auch bei Disabled nicht jedoch bei Invisible
3780     {
3781         switch( nMethodId )
3782         {
3783         case M_IsEnabled:
3784             pRet->GenReturn ( RET_Value, aUId, IsAccessable(pControl) );
3785             break;
3786         case M_IsVisible:
3787             pRet->GenReturn ( RET_Value, aUId, pControl->IsVisible() );
3788             break;
3789         case M_GetPosX:
3790             if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
3791                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für FloatingWindows
3792             if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
3793                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für TabDialoge
3794             if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
3795                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für Border
3796             if ( (nParams & PARAM_BOOL_1) && bBool1 )
3797                 pControl = pControl->GetWindow( WINDOW_OVERLAP );
3798 
3799             if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_SPLITWINDOW )
3800             {
3801                 Point aPos = pControl->GetPosPixel();
3802                 aPos = pControl->GET_REAL_PARENT()->OutputToScreenPixel( aPos );
3803                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)aPos.X() );
3804             }
3805             else
3806                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetPosPixel().X() );
3807             break;
3808         case M_GetPosY:
3809             if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
3810                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für FloatingWindows
3811             if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
3812                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für TabDialoge
3813             if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
3814                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für Border
3815             if ( (nParams & PARAM_BOOL_1) && bBool1 )
3816                 pControl = pControl->GetWindow( WINDOW_OVERLAP );
3817 
3818             if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_SPLITWINDOW )
3819             {
3820                 Point aPos = pControl->GetPosPixel();
3821                 aPos = pControl->GET_REAL_PARENT()->OutputToScreenPixel( aPos );
3822                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)aPos.Y() );
3823             }
3824             else
3825                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetPosPixel().Y() );
3826             break;
3827         case M_GetSizeX:
3828             if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
3829                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für FloatingWindows
3830             if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
3831                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für TabDialoge
3832             if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
3833                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für Border
3834             if ( (nParams & PARAM_BOOL_1) && bBool1 )
3835                 pControl = pControl->GetWindow( WINDOW_OVERLAP );
3836 
3837             pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetSizePixel().Width() );
3838             break;
3839         case M_GetSizeY:
3840             if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
3841                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für FloatingWindows
3842             if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
3843                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für TabDialoge
3844             if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
3845                 pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für Border
3846             if ( (nParams & PARAM_BOOL_1) && bBool1 )
3847                 pControl = pControl->GetWindow( WINDOW_OVERLAP );
3848 
3849             pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetSizePixel().Height() );
3850             break;
3851         case M_SnapShot:
3852             {
3853                 if ( pControl->GetType() == WINDOW_DOCKINGWINDOW && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
3854                     pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für FloatingWindows
3855                 if ( pControl->GetType() == WINDOW_TABCONTROL && pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_TABDIALOG )
3856                     pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für TabDialoge
3857                 if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_BORDERWINDOW )
3858                     pControl = pControl->GET_REAL_PARENT();     // Sonderbehandlung für Border
3859                 if ( (nParams & PARAM_BOOL_1) && bBool1 )
3860                     pControl = pControl->GetWindow( WINDOW_OVERLAP );
3861 
3862                 Bitmap aBmp = pControl->SnapShot();
3863                 if ( pControl->GetType() == WINDOW_WORKWINDOW )
3864                 {
3865                     Point aStart = pControl->GetPosPixel();
3866                     if ( !(nParams & PARAM_USHORT_4) )
3867                     {
3868                         nParams |= PARAM_USHORT_1;
3869                         nParams |= PARAM_USHORT_2;
3870                         nParams |= PARAM_USHORT_3;
3871                         nParams |= PARAM_USHORT_4;
3872                         nNr1 = (sal_uInt16)-aStart.X();
3873                         nNr2 = (sal_uInt16)-aStart.Y();
3874                         nNr3 = (sal_uInt16)pControl->GetSizePixel().Width() + 2*(sal_uInt16)aStart.X();
3875                         nNr4 = (sal_uInt16)pControl->GetSizePixel().Height() + 2*(sal_uInt16)aStart.Y();
3876                     }
3877                     nNr1 = std::max((sal_uInt16)-aStart.X(),nNr1);
3878                     nNr2 = std::max((sal_uInt16)-aStart.Y(),nNr2);
3879                     nNr3 = std::min((sal_uInt16)(pControl->GetSizePixel().Width() + 2*(sal_uInt16)aStart.X()),nNr3);
3880                     nNr4 = std::min((sal_uInt16)(pControl->GetSizePixel().Height() + 2*(sal_uInt16)aStart.Y()),nNr4);
3881                 }
3882                 if( nParams & PARAM_USHORT_4 )
3883                 {   // Zuschneiden
3884                     Point aPt(-nNr1,-nNr2);
3885                     Size aSz(nNr3,nNr4);
3886                     VirtualDevice aVDev( *pControl );
3887 
3888                     aVDev.SetOutputSizePixel( aSz );
3889                     aVDev.DrawBitmap( aPt, aBmp );
3890                     aBmp = aVDev.GetBitmap( Point(), aSz );
3891                 }
3892 
3893                 SvFileStream fOut;
3894                 fOut.Open(aString1,STREAM_STD_WRITE);
3895                 WriteDIB(aBmp, fOut, true, true);
3896                 if ( fOut.GetError() )
3897                     ReportError( aUId, GEN_RES_STR1( S_ERROR_SAVING_IMAGE, UniString::CreateFromInt32( fOut.GetError() ) ) );
3898                 fOut.Close();
3899             }
3900             break;
3901         case M_GetFixedTextCount:
3902             {
3903                 pRet->GenReturn ( RET_Value, aUId, CountWinByRT( pControl, WINDOW_FIXEDTEXT, sal_True ) );
3904             }
3905             break;
3906         case M_GetFixedText:
3907             {
3908                 if( ( nParams & PARAM_USHORT_1 ) == 0 )
3909                     nNr1 = 1;
3910 
3911                 FixedText* pFixedText = (FixedText*)GetWinByRT( pControl, WINDOW_FIXEDTEXT, sal_True, nNr1-1 );
3912                 if ( pFixedText )
3913                     pRet->GenReturn ( RET_Value, aUId, pFixedText->GetText() );
3914                 else
3915                     ValueOK(aUId, MethodString( nMethodId ),nNr1,CountWinByRT( pControl, WINDOW_FIXEDTEXT, sal_True ) );
3916             }
3917             break;
3918         case M_HasFocus:
3919             {
3920                 pRet->GenReturn ( RET_Value, aUId, pControl->HasFocus() );
3921             break;
3922             }
3923         case M_GetScreenRectangle:
3924             {
3925                 Rectangle aRect =  bBool1 ? pControl->GetClientWindowExtentsRelative(NULL) : pControl->GetWindowExtentsRelative( NULL );
3926                 pRet->GenReturn ( RET_Value, aUId,
3927                     UniString::CreateFromInt32(aRect.Left()).
3928                     AppendAscii(",").Append(UniString::CreateFromInt32(aRect.Top())).
3929                     AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetWidth())).
3930                     AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetHeight()))
3931                     );
3932             }
3933             break;
3934         case M_GetHelpText:
3935             {
3936                 pRet->GenReturn ( RET_Value, aUId, pControl->GetHelpText());
3937             }
3938             break;
3939         case M_GetQuickHelpText:
3940             {
3941                 pRet->GenReturn ( RET_Value, aUId,pControl->GetQuickHelpText());
3942             }
3943             break;
3944         default:
3945             return sal_False;
3946         }
3947         SendProfile( UIdString( aUId ).Append('.').Append( MethodString( nMethodId ) ) );
3948         return sal_True;
3949     }
3950     return sal_False;
3951 }
3952 
3953 sal_Bool StatementControl::HandleCommonMethods( Window *pControl )
3954 {
3955     switch( nMethodId )     // Diese können an jedem Window ausgeführt werden
3956     {
3957         case M_Exists:          // Oben schon behandelt. Unterdrückt hier nur Fehler
3958         case M_NotExists:
3959         case M_IsEnabled:
3960         case M_IsVisible:
3961         case M_SnapShot:
3962             break;
3963         case M_Caption :
3964             {
3965                 if ( pControl->GetText().Len() == 0 && IsDocFrame( pControl->GetWindow( WINDOW_FRAME ) ) )
3966                     pRet->GenReturn ( RET_Value, aUId, pControl->GetWindow( WINDOW_FRAME )->GetText());
3967                 else
3968                     pRet->GenReturn ( RET_Value, aUId, pControl->GetText());
3969             }
3970             break;
3971         case M_GetRT:
3972             {
3973                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pControl->GetType() );
3974             }
3975             break;
3976         case M_TypeKeys:
3977             {
3978                 if( !(nParams & PARAM_USHORT_1) )   // Anzahl Wiederholungen
3979                     nNr1 = 1;
3980                 if( !(nParams & PARAM_BOOL_1) )     // Follow Focus
3981                     bBool1 = sal_False;     // so bleibt das bisherige Verhalten
3982 
3983                 if ( !bBool1 )          // Altes Verhalten
3984                     pControl->GrabFocus();
3985                 else    // If focus is not inside given control we grab it once.
3986                 {
3987                     Window *pFocus = GetpApp()->GetFocusWindow();
3988                     if ( !pFocus || !pControl->IsWindowOrChild( pFocus, sal_True ) )
3989                         pControl->GrabFocus();
3990                 }
3991 
3992 
3993                 // maybe this can get removed since we are using GetPreferredKeyInputWindow()
3994                 if ( pControl->GetType() == WINDOW_COMBOBOX )
3995                 {   // Bei COMBOBOX an das Edit direkt liefern
3996                     Window *pTemp = NULL;
3997                     for ( sal_uInt16 i = 0 ; i < pControl->GetChildCount() && !pTemp ; i++ )
3998                         if ( pControl->GetChild( i )->GetType() == WINDOW_EDIT )
3999                             pTemp = pControl->GetChild( i );
4000                     if ( pTemp )
4001                         pControl = pTemp;
4002                 }
4003 
4004                 Window *pDeliverHere = pControl;
4005                 for (int j = 0; j < nNr1; j++)
4006                     for (xub_StrLen i = 0; i < aString1.Len(); i++)
4007                     {
4008                         if ( StatementList::bUsePostEvents )
4009                         { // grab focus every time
4010                             Window *pFocus = GetpApp()->GetFocusWindow();
4011                             if ( !pFocus || !pControl->IsWindowOrChild( pFocus, sal_True ) )
4012                                 pControl->GrabFocus();
4013                         }
4014                         if ( bBool1 ) // Jedesmal das FocusWindow finden
4015                         {
4016                             Window *pFocus = GetpApp()->GetFocusWindow();
4017                             if ( pFocus && pControl->IsWindowOrChild( pFocus, sal_True ) )
4018                                 pDeliverHere = pFocus;
4019                             else // sonst Fallback auf das Basisfenster
4020                                 pDeliverHere = pControl;
4021                         }
4022                         pDeliverHere = pDeliverHere->GetPreferredKeyInputWindow();
4023                         KeyEvent aEvent;
4024                         if ( ((sal_uInt16)aString1.GetChar(i)) <= 7 )
4025                         {
4026                             sal_uInt16 nVal = 0;
4027                             switch (aString1.GetChar(i))
4028                             {
4029                                 case 1: nVal = aString1.GetChar(i+1) + (aString1.GetChar(i+2) << 8);
4030                                         i += 2;
4031                                         break;
4032                                 case 3: nVal = (aString1.GetChar(i+1) << 8);
4033                                         i++;
4034                                         break;
4035                                 case 5: nVal = aString1.GetChar(i+1);
4036                                         i++;
4037                                         break;
4038                                 case 7: nVal = 0;
4039                                         break;
4040                             }
4041                             // #105672#
4042                             // find out the keycode
4043                             sal_uInt16 nKeygroup = nVal & KEYGROUP_TYPE;
4044                             sal_uInt16 nKeyCode = nVal & KEY_CODE;
4045                             sal_Unicode aCh;
4046                             switch (nKeygroup)
4047                             {
4048                                 case KEYGROUP_NUM:
4049                                     aCh = nKeyCode - KEY_0 + '0';
4050                                     break;
4051                                 case KEYGROUP_ALPHA:
4052                                     aCh = nKeyCode - KEY_A;
4053                                     if ( nVal & KEY_MOD1 )
4054                                     {}
4055                                     else if ( nVal & KEY_SHIFT )
4056                                         aCh += 'A';
4057                                     else
4058                                         aCh += 'a';
4059                                 break;
4060                                 case KEYGROUP_MISC:
4061                                     {                           //  CR  ESC TAB BACK
4062                                         ByteString aPrintableMisc("\x0d\x1b\x09\x08 **+-*/.,<>=",16);
4063                                         if ( nKeyCode-KEY_RETURN < aPrintableMisc.Len()
4064                                             && nKeyCode != KEY_INSERT && nKeyCode != KEY_DELETE )
4065                                             aCh = aPrintableMisc.GetChar( nKeyCode-KEY_RETURN );
4066                                         else
4067                                             aCh = 0;
4068                                     }
4069                                     break;
4070                                 case KEYGROUP_CURSOR:
4071                                 case KEYGROUP_FKEYS:
4072                                 default:
4073                                     aCh = 0;
4074                             }
4075                             aEvent = KeyEvent(aCh,KeyCode(nVal & 0xFFF,nVal & 0xF000));
4076                         }
4077                         else
4078                         {
4079                                                             //   CR  ESC TAB BACK
4080                             String aPrintableMisc = CUniString("\x0d\x1b\x09\x08 xx+-*/.,<>=");
4081                             sal_Unicode aCh = aString1.GetChar(i);
4082                             if ( aCh >= 'a' && aCh <= 'z' )
4083                                 aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_ALPHA + aCh-'a', 0));
4084                             else if ( aCh >= 'A' && aCh <= 'Z' )
4085                                 aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_ALPHA + aCh-'a', KEY_SHIFT));
4086                             else if ( aCh >= '0' && aCh <= '9' )
4087                                 aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_NUM + aCh-'0', 0));
4088                             else if ( aPrintableMisc.Search(aCh) != STRING_NOTFOUND )
4089                                 aEvent = KeyEvent(aCh, KeyCode(KEYGROUP_MISC + (sal_uInt16)aPrintableMisc.Search(aCh), 0));
4090                             else    // Sollte eigentlich nicht auftreten
4091                                 aEvent = KeyEvent(aCh, KeyCode());
4092                         }
4093                         ImplKeyInput( pDeliverHere, aEvent );
4094                         if ( !MaybeDoTypeKeysDelay( pControl ) )
4095                             break;
4096                         else
4097                             SafeReschedule();SafeReschedule();SafeReschedule();
4098                     }
4099             }
4100             break;
4101 
4102 #define CalcMouseButton\
4103     sal_uInt16 nButton = MOUSE_LEFT;\
4104     if ( (nParams & PARAM_USHORT_3) )\
4105     {\
4106         switch ( nNr3 )\
4107         {\
4108             case 1: nButton = MOUSE_LEFT; break;\
4109             case 2: nButton = MOUSE_MIDDLE; break;\
4110             case 3: nButton = MOUSE_RIGHT; break;\
4111         }\
4112     }\
4113 
4114         case M_MouseDown:
4115             {
4116                 CalcMouseButton;
4117                 Size aS = pControl->GetOutputSizePixel();
4118                 Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
4119                 Window *pActualWin = pControl->FindWindow( aPos );
4120 //                  AnimateMouse( pControl, aPos );
4121 
4122                 if ( pActualWin )
4123                     aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
4124 //                  aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
4125                 else
4126                     pActualWin = pControl;
4127 
4128                 AnimateMouse( pActualWin, aPos );
4129                 pActualWin->GrabFocus();
4130                 MouseEvent aMEvnt(aPos,1,MOUSE_SIMPLECLICK|MOUSE_SELECT,nButton);
4131                 ImplMouseButtonDown( pActualWin, aMEvnt );
4132             }
4133             break;
4134         case M_MouseUp:
4135             {
4136                 CalcMouseButton;
4137                 Size aS = pControl->GetOutputSizePixel();
4138                 Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
4139                 Window *pActualWin = pControl->FindWindow( aPos );
4140 
4141                 if ( pActualWin )
4142                     aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
4143 //                  aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
4144                 else
4145                     pActualWin = pControl;
4146 
4147                 AnimateMouse( pActualWin, aPos );
4148 //                  pActualWin->GrabFocus();
4149                 MouseEvent aMEvt( aPos, 1, MOUSE_SIMPLECLICK|MOUSE_SELECT, nButton );
4150                 ImplMouseButtonUp( pActualWin, aMEvt );
4151             }
4152             break;
4153         case M_MouseMove:
4154             {
4155                 CalcMouseButton;
4156                 Size aS = pControl->GetOutputSizePixel();
4157                 Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
4158                 Window *pActualWin = pControl->FindWindow( aPos );
4159 
4160                 if ( pActualWin )
4161                 {
4162                     aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
4163 //                  aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
4164                 }
4165                 else
4166                     pActualWin = pControl;
4167 
4168                 AnimateMouse( pActualWin, aPos );
4169 //                  pActualWin->GrabFocus();
4170                 MouseEvent aMEvt( aPos, 0, MOUSE_SIMPLEMOVE|MOUSE_DRAGMOVE, nButton );
4171                 ImplMouseMove( pActualWin, aMEvt );
4172             }
4173             break;
4174         case M_MouseDoubleClick:
4175             {
4176                 CalcMouseButton;
4177                 Size aS = pControl->GetOutputSizePixel();
4178                 Point aPos = Point(aS.Width() * nNr1 / 100,aS.Height() * nNr2 / 100);
4179                 Window *pActualWin = pControl->FindWindow( aPos );
4180 
4181                 if ( pActualWin )
4182                 {
4183                     aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
4184 //                  aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
4185                 }
4186                 else
4187                     pActualWin = pControl;
4188 
4189                 AnimateMouse( pActualWin, aPos );
4190                 pActualWin->GrabFocus();
4191                 MouseEvent aMEvnt;
4192                 aMEvnt = MouseEvent(aPos,1,MOUSE_SIMPLECLICK|MOUSE_SELECT,nButton);
4193                 ImplMouseButtonDown( pActualWin, aMEvnt );
4194                 ImplMouseButtonUp  ( pActualWin, aMEvnt );
4195                 aMEvnt = MouseEvent(aPos,2,MOUSE_SIMPLECLICK|MOUSE_SELECT,nButton);
4196                 ImplMouseButtonDown( pActualWin, aMEvnt );
4197                 ImplMouseButtonUp  ( pActualWin, aMEvnt );
4198             }
4199             break;
4200         case M_DisplayPercent:
4201             {
4202                 ModelessDialog *pDlg = new ModelessDialog(NULL);
4203                 pDlg->SetOutputSizePixel(Size(100,30));
4204 
4205                 Edit *pMyEd = new Edit(pDlg,WB_CENTER | WB_BORDER );
4206                 pMyEd->SetSizePixel(Size(100,30));
4207                 pDlg->SetText(UniString("Schließen", RTL_TEXTENCODING_ISO_8859_1));
4208                 pDlg->Show();
4209                 pMyEd->Show();
4210                 sal_uLong nTime = Time().GetTime();
4211 
4212                 while (pDlg->IsVisible())
4213                 {
4214                     pDlg->ToTop();
4215                     for (int i = 1 ; i<10 ; i++)
4216                         SafeReschedule();
4217                     Point Pos = pControl->GetPointerPosPixel();
4218                     Size Siz=pControl->GetOutputSizePixel();
4219                     if ( Time().GetTime() - nTime > 10 )
4220                     {
4221                         nTime = Time().GetTime();
4222                         pMyEd->SetText(UniString::CreateFromInt32(Pos.X()*100/Siz.Width()).AppendAscii("%x").Append( UniString::CreateFromInt32(Pos.Y()*100/Siz.Height()) ).Append('%'));
4223                     }
4224                 }
4225 
4226                 delete pMyEd;
4227                 delete pDlg;
4228             }
4229             break;
4230         case M_OpenContextMenu:
4231             {
4232                 aSubMenuId1 = 0;
4233                 aSubMenuId2 = 0;
4234                 aSubMenuId3 = 0;
4235                 pMenuWindow = NULL;
4236                 Point aPos;
4237                 ToolBox* pTB = (ToolBox*)pControl;
4238                 if ( (pControl->GetType() == WINDOW_TOOLBOX) && pTB->IsMenuEnabled() )
4239                 {
4240                     pTB->ExecuteCustomMenu();
4241 /*                    Rectangle aRect = pTB->GetMenubuttonRect();
4242                     AnimateMouse( pControl, aRect.Center() );
4243                     MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
4244                     ImplMouseButtonDown( pTB, aMEvnt );*/
4245                 }
4246                 else
4247                 {
4248                     sal_Bool bAtMousePos = ( nParams & PARAM_BOOL_1 ) && bBool1;
4249                     if ( bAtMousePos )
4250                     {
4251                         aPos = pControl->GetPointerPosPixel();
4252                         Window *pActualWin = pControl->FindWindow( aPos );
4253 
4254                         if ( pActualWin )
4255                         {
4256                             aPos = pActualWin->AbsoluteScreenToOutputPixel( pControl->OutputToAbsoluteScreenPixel ( aPos ) );
4257     //                      aPos = pActualWin->ScreenToOutputPixel( pControl->OutputToScreenPixel ( aPos ) );
4258                             pControl = pActualWin;
4259                         }
4260                     }
4261                     CommandEvent aEvent( aPos, COMMAND_CONTEXTMENU, bAtMousePos );
4262                     ImplCommand( pControl, aEvent );
4263                 }
4264             }
4265             break;
4266         case M_UseMenu:
4267             {
4268                 aSubMenuId1 = 0;
4269                 aSubMenuId2 = 0;
4270                 aSubMenuId3 = 0;
4271                 pMenuWindow = NULL;
4272 
4273                 while ( pControl && !( ( pControl->GetType() == WINDOW_SYSWINDOW || pControl->GetType() == WINDOW_WORKWINDOW ) && ControlOK( pControl, "" ) ) )
4274                     pControl = pControl->GET_REAL_PARENT();
4275 
4276                 if ( pControl && ((SystemWindow*)pControl)->GetMenuBar() )
4277                     pMenuWindow = ((SystemWindow*)pControl);
4278                 else
4279                     ReportError( GEN_RES_STR1( S_NO_MENU, MethodString( nMethodId ) ) );
4280             }
4281             break;
4282         case M_FadeIn:
4283         case M_FadeOut:
4284         case M_Pin:
4285         case M_IsFadeIn:
4286         case M_IsPin:
4287             {
4288                 WindowAlign aWindowAlign = WINDOWALIGN_LEFT;
4289                 if ( (nParams & PARAM_USHORT_1) )
4290                 {
4291                     switch ( nNr1 )
4292                     {
4293                         case CONST_ALIGN_LEFT:
4294                             aWindowAlign = WINDOWALIGN_LEFT;
4295                             break;
4296                         case CONST_ALIGN_TOP:
4297                             aWindowAlign = WINDOWALIGN_TOP;
4298                             break;
4299                         case CONST_ALIGN_RIGHT:
4300                             aWindowAlign = WINDOWALIGN_RIGHT;
4301                             break;
4302                         case CONST_ALIGN_BOTTOM:
4303                             aWindowAlign = WINDOWALIGN_BOTTOM;
4304                             break;
4305                         default:
4306                             ReportError( aUId, GEN_RES_STR1( S_INVALID_POSITION, MethodString( nMethodId ) ) );
4307                     }
4308                 }
4309 
4310                 Window* pTemp = NULL;
4311                 while ( !pTemp && pControl )
4312                 {
4313                     pTemp = GetFadeSplitWin( pControl, aWindowAlign );
4314                     pControl = pControl->GET_REAL_PARENT();
4315                 }
4316 
4317                 if ( !pTemp )
4318                 {
4319                     ReportError( aUId, GEN_RES_STR1( S_SPLITWIN_NOT_FOUND, MethodString( nMethodId ) ) );
4320                     break;
4321                 }
4322 
4323                 pControl = pTemp;   // So daß wir unten ohne Fehler durchkommen
4324                 SplitWindow *pSW = (SplitWindow*) pTemp;
4325 
4326 //  Rectangle           GetAutoHideRect() const;
4327 //  Rectangle           GetFadeInRect() const;
4328 //  Rectangle           GetFadeOutRect() const;
4329 
4330                 switch( nMethodId )
4331                 {
4332                     case M_FadeIn:
4333                         if ( pSW->IsFadeInButtonVisible() )
4334                             pSW->FadeIn();
4335                         break;
4336                     case M_FadeOut:
4337                         if ( pSW->IsFadeOutButtonVisible() )
4338                             pSW->FadeOut();
4339                         break;
4340                     case M_Pin:
4341                         if (   ( pSW->GetAutoHideState() && bBool1 )
4342                             || ( !pSW->GetAutoHideState() && !bBool1 ) )
4343                         {
4344                             MouseEvent aMEvnt;
4345                             Point aPt( pSW->GetAutoHideRect().Center() );
4346                             aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
4347                             ImplMouseButtonDown( pControl, aMEvnt, FORCE_DIRECT_CALL );
4348                             ImplMouseButtonUp  ( pControl, aMEvnt, FORCE_DIRECT_CALL );
4349                         }
4350 //                              pSW->AutoHide();
4351                         break;
4352                     case M_IsFadeIn:
4353                         pRet->GenReturn ( RET_Value, aUId, pSW->IsFadeOutButtonVisible() );
4354                         break;
4355                     case M_IsPin:
4356                         pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)!pSW->GetAutoHideState() );
4357                         break;
4358                     default:
4359                         ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
4360                 }
4361                 SendProfile( UIdString( aUId ).Append('.').Append( MethodString( nMethodId ) ) );
4362             }
4363             break;
4364         case M_StatusGetText:
4365         case M_StatusIsProgress:
4366         case M_StatusGetItemCount:
4367         case M_StatusGetItemId:
4368             {
4369                 StatusBar *pStatus = NULL;
4370                 while ( !pStatus && pControl )
4371                 {
4372                     pStatus = (StatusBar*)GetWinByRT( pControl, WINDOW_STATUSBAR, sal_True );
4373                     pControl = pControl->GET_REAL_PARENT();
4374                 }
4375 
4376                 if ( !pStatus )
4377                 {
4378                     ReportError( aUId, GEN_RES_STR1( S_NO_STATUSBAR, MethodString( nMethodId ) ) );
4379                     break;
4380                 }
4381 
4382                 switch ( nMethodId )
4383                 {
4384                     case M_StatusGetText:
4385                         {
4386                             if ( (nParams & PARAM_USHORT_1) )
4387                             {
4388                                 if ( pStatus->AreItemsVisible() )
4389                                     pRet->GenReturn ( RET_Value, aUId, String(pStatus->GetItemText(nNr1)));
4390                                 else
4391                                     ReportError( aUId, GEN_RES_STR1( S_ITEMS_INVISIBLE, MethodString( nMethodId ) ) );
4392                             }
4393                             else
4394                             {
4395                                 if ( pStatus->AreItemsVisible() )
4396                                 {
4397                                     if ( pStatus->GetItemCount() == 1 )
4398                                     {
4399                                         pRet->GenReturn ( RET_Value, aUId, pStatus->GetItemText( pStatus->GetItemId(0) ));
4400                                     }
4401                                     else
4402                                     {
4403                                         pRet->GenReturn ( RET_Value, aUId, String() );
4404                                     }
4405                                 }
4406                                 else
4407                                     pRet->GenReturn ( RET_Value, aUId, (String)pStatus->GetText() );
4408                             }
4409                         }
4410                         break;
4411                     case M_StatusIsProgress:
4412                         {
4413                             pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)pStatus->IsProgressMode() );
4414                         }
4415                         break;
4416                     case M_StatusGetItemCount:
4417                         if ( pStatus->AreItemsVisible() )
4418                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pStatus->GetItemCount()));
4419                         else
4420                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
4421                         break;
4422                     case M_StatusGetItemId:
4423                         if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pStatus->GetItemCount()) )
4424                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pStatus->GetItemId(nNr1-1)));
4425                         break;
4426                 }
4427             }
4428             break;
4429         case M_HasScrollBar:
4430         case M_IsScrollBarEnabled:
4431             {
4432                 if ( (nParams | PARAM_USHORT_1) != PARAM_USHORT_1 )     // so there are other params
4433                 {
4434                     ReportError( aUId, GEN_RES_STR0( S_INVALID_PARAMETERS ) );
4435                     break;
4436                 }
4437 
4438                 if( !(nParams & PARAM_USHORT_1) )
4439                     nNr1 = CONST_ALIGN_RIGHT;       // default is right Scrollbar (vertical)
4440 
4441                 if ( (nNr1 != CONST_ALIGN_RIGHT) && (nNr1 != CONST_ALIGN_BOTTOM) )
4442                 {
4443                     ReportError( aUId, GEN_RES_STR1( S_INVALID_POSITION, MethodString( nMethodId ) ) );
4444                     break;
4445                 }
4446 
4447                 ScrollBar *pScroll = NULL;
4448 
4449                 sal_uInt16 nSteps = 2;
4450                 while ( !pScroll && pControl && nSteps-- )
4451                 {
4452                     pScroll = GetScrollBar( pControl, nNr1, sal_True );
4453                     pControl = pControl->GET_REAL_PARENT();
4454                 }
4455 
4456                 switch ( nMethodId )
4457                 {
4458                     case M_HasScrollBar:
4459                         {
4460                             if ( pScroll )
4461                                 pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_True );
4462                             else
4463                                 pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_False );
4464                         }
4465                         break;
4466                     case M_IsScrollBarEnabled:
4467                         {
4468                             if ( !pScroll )
4469                             {
4470                                 ReportError( aUId, GEN_RES_STR1( S_NO_SCROLLBAR, MethodString( nMethodId ) ) );
4471                                 break;
4472                             }
4473                             pRet->GenReturn ( RET_Value, aUId, pScroll->IsEnabled() );
4474                         }
4475                         break;
4476                 }
4477             }
4478             break;
4479         default:
4480             return sal_False;
4481     }
4482     return sal_True;
4483 }
4484 
4485 
4486 sal_Bool StatementControl::Execute()
4487 {
4488     Window *pControl;
4489     sal_Bool bStatementDone = sal_True;
4490 
4491 
4492     if ( IsError )
4493     {
4494         #if OSL_DEBUG_LEVEL > 1
4495         m_pDbgWin->AddText( "Skipping Window: " );
4496         m_pDbgWin->AddText( Id2Str( aUId ) );
4497         m_pDbgWin->AddText( " Method: " );
4498         m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
4499         m_pDbgWin->AddText( "\n" );
4500         #endif
4501         Advance();
4502         delete this;
4503         return sal_True;
4504     }
4505 
4506     InitProfile();
4507 #if OSL_DEBUG_LEVEL > 1
4508     m_pDbgWin->AddText( "Executing Window: " );
4509     m_pDbgWin->AddText( Id2Str( aUId ) );
4510     m_pDbgWin->AddText( " Method: " );
4511     m_pDbgWin->AddText( String::CreateFromInt32( nMethodId ) );
4512     m_pDbgWin->AddText( "\n" );
4513 #endif
4514 
4515 
4516     if ( aUId.equals( UID_ACTIVE ) )
4517         pControl = GetAnyActive();
4518     else
4519     {
4520         sal_Bool bSearchButtonOnToolbox = (nParams == PARAM_NONE) && ((M_Click == nMethodId) || (M_TearOff == nMethodId) || (M_IsEnabled == nMethodId) || (M_OpenMenu == nMethodId));
4521         bSearchButtonOnToolbox |= (nParams == PARAM_USHORT_1) && (M_GetState == nMethodId);
4522         if ( nMethodId == M_TypeKeys || nMethodId == M_MouseDown
4523             || nMethodId == M_MouseUp || nMethodId ==  M_MouseMove
4524             || nMethodId == M_SnapShot )
4525         {
4526             pControl = NULL;
4527             if ( /*(nMethodId == M_SnapShot || nMethodId == M_TypeKeys) &&*/ !pControl )
4528                 pControl = SearchTree( aUId ,bSearchButtonOnToolbox );
4529         }
4530         else
4531             pControl = SearchTree( aUId ,bSearchButtonOnToolbox );
4532     }
4533 
4534 
4535     if ( pControl && pControl->GetType() == WINDOW_TOOLBOX )
4536     {
4537         if ( !aUId.equals( pControl->GetUniqueOrHelpId() ) )
4538         {   // Also wenn wir irgendwas auf einer Toolbox gefunden haben
4539             switch ( nMethodId )
4540             {
4541                 case M_Click:
4542                 case M_TearOff:
4543                 case M_OpenMenu:
4544                 case M_GetState:
4545                     break;
4546                 case M_IsEnabled:
4547                     nMethodId = _M_IsEnabled;   // Umlabeln, da die Behandlung essentiell anders ist!
4548                     break;
4549                 default:
4550                     pControl = NULL;
4551             }
4552         }
4553     }
4554 
4555 
4556     switch ( nMethodId )
4557     {
4558         case M_Exists:
4559         case M_NotExists:
4560             Time aT;
4561             sal_uInt16 aSeconds = aT.GetMin()*60+aT.GetSec();
4562             if ( !bBool2 )          // wurde im Konstruktor auf sal_False gesetzt
4563             {
4564                 bBool2 = sal_True;
4565                 nNr2 = aSeconds;
4566                 if( !(nParams & PARAM_USHORT_1) )
4567                     nNr1 = 0;       // defaultmäßig sofort zurück
4568             }
4569             if ( aSeconds < nNr2 )          // Falls die Stunde umgesprungen ist
4570                 aSeconds += 60*60;
4571 
4572             if ( /* !IsAccessable(pControl)#87019# */ !pControl || !pControl->IsVisible() )
4573                 pControl = NULL;
4574             if ( ((nMethodId == M_Exists) && pControl) ||
4575                  ((nMethodId == M_NotExists) && !pControl) )
4576             {   // Wenn Bedingung erfüllt
4577                 pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_True );
4578             }
4579             else
4580                 if ( aSeconds <= nNr2 + nNr1 )      // Zeit ist noch nicht abgelaufen
4581                     return sal_False;
4582                 else
4583                     pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)sal_False );
4584 
4585             Advance();
4586             delete this;
4587             return sal_True;
4588 //          break;
4589     }
4590 
4591 
4592     short nRT = 0;
4593 
4594     if( pControl )          // Das Fenster existiert irgendwo, kann aber auch hidden sein!
4595     {
4596         nRT = ImpGetRType( pControl );
4597 #if OSL_DEBUG_LEVEL > 1
4598         m_pDbgWin->AddText( "Type is: " );
4599         m_pDbgWin->AddText( String::CreateFromInt32( nRT ) );
4600         m_pDbgWin->AddText( "\n" );
4601 #endif
4602     }
4603 
4604     if (   nRT == C_Window &&       // Search for WorkWindow to satisfy these commands
4605          ( nMethodId == M_Close
4606 //      || nMethodId == M_Size
4607 //      || nMethodId == M_Move
4608         || nMethodId == M_IsMax
4609         || nMethodId == M_IsMin
4610         || nMethodId == M_IsRestore
4611         || nMethodId == M_Minimize
4612         || nMethodId == M_Maximize
4613         || nMethodId == M_Restore ) )
4614     {
4615         Window* pNewControl = pControl;
4616         while ( pNewControl && pNewControl->GetType() != WINDOW_WORKWINDOW )
4617             pNewControl = pNewControl->GET_REAL_PARENT();
4618 
4619         if ( pNewControl )
4620         {
4621             pControl = pNewControl;
4622             nRT = C_WorkWin;
4623         }
4624     }
4625 
4626 
4627     if ( (!ControlOK( pControl, "" )) && ( nMethodId != M_SnapShot ) && (nRetryCount--))
4628     {
4629 #if OSL_DEBUG_LEVEL > 1
4630         m_pDbgWin->AddText( CUniString("Reschedule command (").Append( UniString::CreateFromInt32(nRetryCount) ).AppendAscii(")\n") );
4631 #endif
4632         return sal_False;
4633     }
4634 
4635     if( ControlOK( pControl, "" ) )
4636     {
4637         if ( nMethodId == M_OpenContextMenu && !bBool2 )
4638         {
4639             pControl->GrabFocus();  // to get asyncron focus on unix
4640             bBool2 = sal_True;
4641             return sal_False;
4642         }
4643         // TODO: handle GetFocus for all Methods and Windows like this (remove part below)
4644         //       See for impact of changed focus for HandleVisibleControls() (taking Snapshots might be different, possible exclude those methods)
4645         if (( (nRT == C_TreeListBox) && !bBool2 )
4646             && nMethodId != M_TypeKeys          // TypeKeys macht das selbst, falls eigenes Focushandling gewünscht
4647             && nMethodId != M_MouseDown
4648             && nMethodId != M_MouseUp
4649             && nMethodId != M_MouseMove
4650             /*&& nMethodId != M_MouseDoubleClick*/ )
4651         {
4652             if ( !pControl->HasFocus() )
4653             {
4654                 pControl->GrabFocus();
4655                 int i = 10;
4656                 while ( i-- && !pControl->HasFocus() )    // reschedule a bit
4657                 {
4658                     SafeReschedule();
4659                     if ( !WinPtrValid( pControl ) )
4660                         return sal_False;
4661                 }
4662                 if ( !pControl->HasFocus() )  // to get asynchronous focus
4663                 {
4664                     bBool2 = sal_True;
4665                     return sal_False;
4666                 }
4667             }
4668         }
4669     }
4670 
4671     Advance();
4672 
4673     if ( HandleVisibleControls( pControl ) )
4674     {
4675         delete this;
4676         return sal_True;
4677     }
4678     if( ControlOK( pControl, "Window/Control" ) )
4679     {
4680         if (((( nRT < C_TabPage && nRT > C_TabControl )
4681               || nRT == C_PatternBox
4682               || nRT == C_ToolBox
4683               || nRT == C_ValueSet
4684               || nRT == C_Control
4685               || nRT == C_TreeListBox
4686              )
4687             || nMethodId == M_OpenContextMenu )
4688             && nMethodId != M_TypeKeys          // TypeKeys macht das selbst, falls eigenes Focushandling gewünscht
4689             && nMethodId != M_MouseDown
4690             && nMethodId != M_MouseUp
4691             && nMethodId != M_MouseMove
4692             /*&& nMethodId != M_MouseDoubleClick*/ )
4693             pControl->GrabFocus();
4694 
4695 /*  leads to problems because settext sets the text whereas typekeys adds to the text.
4696         if ( bDoTypeKeysDelay && nMethodId == M_SetText && ( nParams & PARAM_STR_1 ) )
4697         {   // Here the statement is bent to a TypeKeys
4698             nMethodId = M_TypeKeys;
4699             nParams = PARAM_BOOL_1 | PARAM_STR_1;
4700             bBool1 = sal_True;
4701             pControl->GrabFocus();
4702         }
4703 */
4704         if ( !HandleCommonMethods( pControl ) )
4705         {
4706             switch( nRT )
4707             {
4708                 case C_TabControl:
4709                     switch( nMethodId )
4710                     {
4711                         case M_GetPageId:
4712                             if ( (nParams & PARAM_USHORT_1) )
4713                             {
4714                                 if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((TabControl*)pControl)->GetPageCount() ) )
4715                                     pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)((TabControl*)pControl)->GetPageId(nNr1-1));
4716                             }
4717                             else
4718                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)((TabControl*)pControl)->GetCurPageId());
4719                             break;
4720                         case M_GetPageCount:
4721                             pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)((TabControl*)pControl)->GetPageCount());
4722                             break;
4723                         case M_SetPageId:
4724                             if (((TabControl*)pControl)->GetCurPageId())
4725                                 ((TabControl*)pControl)->DeactivatePage();
4726                             ((TabControl*)pControl)->SetCurPageId( nNr1 );
4727                             ((TabControl*)pControl)->ActivatePage();
4728                             break;
4729                         case M_SetPageNr:
4730                             if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((TabControl*)pControl)->GetPageCount() ) )
4731                             {
4732                                 if (((TabControl*)pControl)->GetCurPageId())
4733                                     ((TabControl*)pControl)->DeactivatePage();
4734                                 ((TabControl*)pControl)->SetCurPageId( ((TabControl*)pControl)->GetPageId( nNr1-1 ) );
4735                                 ((TabControl*)pControl)->ActivatePage();
4736                             }
4737                             break;
4738                         case M_GetPage:
4739                             pRet->GenReturn ( RET_Value, aUId, Id2Str( ((TabControl*)pControl)->GetTabPage(((TabControl*)pControl)->GetCurPageId())->GetUniqueOrHelpId() ) );
4740                             break;
4741                         case M_SetPage :
4742                             {       // Due to local variables
4743                                 TabControl *pTControl = ((TabControl*)pControl);
4744                                 sal_uInt16 nActive = pTControl->GetCurPageId();
4745                                 sal_uInt16 i,anz;
4746                                 rtl::OString aID;
4747                                 rtl::OString aWantedID;
4748                                 //HELPID BACKWARD (No numbers please (remove PARAM_ULONG_1 part)
4749                                 if ( (nParams & PARAM_ULONG_1) )
4750                                 {
4751                                     //aWantedID = rtl::OString( nLNr1 );
4752                                     ReportError( aUId, GEN_RES_STR1c( S_INTERNAL_ERROR, "using numeric HelpID from old Testtool" ) );
4753                                 }
4754                                 else if ( (nParams & PARAM_STR_1) )
4755                                 {
4756                                     aWantedID = Str2Id( aString1 );
4757                                 }
4758                                 else
4759                                     ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
4760 
4761                                 i = pTControl->GetPagePos( pTControl->GetCurPageId() );
4762                                 for ( anz=0 ; anz < pTControl->GetPageCount() && !aID.equals( aWantedID ) ; anz++ )
4763                                 {
4764                                     pTControl->SelectTabPage( pTControl->GetPageId(i) );
4765                                     /*if (pTControl->GetCurPageId())
4766                                         pTControl->DeactivatePage();
4767                                     pTControl->SetCurPageId( pTControl->GetPageId(i) );
4768                                     pTControl->ActivatePage();*/
4769                                     aID = pTControl->GetTabPage(pTControl->GetCurPageId())->GetUniqueOrHelpId();
4770                                     i++;
4771                                     if ( i >= pTControl->GetPageCount() )
4772                                         i = 0;
4773                                     if ( !MaybeDoTypeKeysDelay( pTControl ) || !MaybeDoTypeKeysDelay( pTControl ) || !MaybeDoTypeKeysDelay( pTControl ) )   // Call up 3 times
4774                                         break;
4775                                 }
4776                                 if ( !aID.equals( aWantedID ) )
4777                                 {
4778                                     pTControl->SelectTabPage( nActive );
4779                                     /*if (pTControl->GetCurPageId())
4780                                         pTControl->DeactivatePage();
4781                                     pTControl->SetCurPageId( nActive );
4782                                     pTControl->ActivatePage();*/
4783                                     ReportError( aWantedID, GEN_RES_STR1( S_TABPAGE_NOT_FOUND, MethodString( nMethodId ) ) );
4784                                 }
4785                             }
4786                             break;
4787                         default:
4788                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TabControl" ) );
4789                             break;
4790                     }
4791                     break;
4792                 case C_RadioButton:
4793                 case C_ImageRadioButton:
4794                     switch( nMethodId )
4795                     {
4796                         case M_AnimateMouse :
4797                             AnimateMouse( pControl, MitteLinks);
4798                             break;
4799                         case M_IsChecked :
4800                             pRet->GenReturn ( RET_Value, aUId, ((RadioButton*)pControl)->IsChecked());
4801                             break;
4802                         case M_Check :
4803                             ((RadioButton*)pControl)->Check();
4804                             ((RadioButton*)pControl)->Click();
4805                             break;
4806                         default:
4807                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "RadioButton" ) );
4808                             break;
4809                     }
4810                     break;
4811                 case C_CheckBox:
4812                 case C_TriStateBox:
4813                     switch( nMethodId )
4814                     {
4815                         case M_AnimateMouse :
4816                             AnimateMouse( pControl, MitteLinks);
4817                             break;
4818                         case M_IsChecked :
4819                             pRet->GenReturn ( RET_Value, aUId, comm_BOOL( ((TriStateBox*)pControl)->GetState() == STATE_CHECK) );
4820                             break;
4821                         case M_IsTristate :
4822                             pRet->GenReturn ( RET_Value, aUId, comm_BOOL( ((TriStateBox*)pControl)->GetState() == STATE_DONTKNOW) );
4823                             break;
4824                         case M_GetState :
4825                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((TriStateBox*)pControl)->GetState()));
4826                             break;
4827                         case M_Check :
4828                             ((TriStateBox*)pControl)->SetState( STATE_CHECK );
4829                             ((TriStateBox*)pControl)->Click();
4830                             break;
4831                         case M_UnCheck :
4832                             ((TriStateBox*)pControl)->SetState( STATE_NOCHECK );
4833                             ((TriStateBox*)pControl)->Click();
4834                             break;
4835                         case M_TriState :
4836                             if ( ((TriStateBox*)pControl)->IsTriStateEnabled() )
4837                             {
4838                                 ((TriStateBox*)pControl)->SetState( STATE_DONTKNOW );
4839                                 ((TriStateBox*)pControl)->Click();
4840                             }
4841                             else
4842                             {
4843                                 ReportError( aUId, GEN_RES_STR0( S_TRISTATE_NOT_ALLOWED ) );
4844                             }
4845                             break;
4846                         case M_Click :
4847                             {
4848                                 TriStateBox *pTB = ((TriStateBox*)pControl);
4849                                 if ( pTB->GetState() == STATE_NOCHECK )
4850                                     pTB->SetState( STATE_CHECK );
4851                                 else if ( pTB->GetState() == STATE_CHECK )
4852                                 {
4853                                     if ( pTB->IsTriStateEnabled() )
4854                                         pTB->SetState( STATE_DONTKNOW );
4855                                     else
4856                                         pTB->SetState( STATE_NOCHECK );
4857                                 }
4858                                 else
4859                                     pTB->SetState( STATE_NOCHECK );
4860                                 pTB->Click();
4861                                 }
4862                             break;
4863                         default:
4864                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TriStateBox" ) );
4865                             break;
4866                     }
4867                     break;
4868                 case C_Edit:
4869                 case C_MultiLineEdit:
4870                     switch( nMethodId )
4871                     {
4872                         case M_AnimateMouse :
4873                             AnimateMouse( pControl, Mitte);
4874                             break;
4875                         case M_GetText :
4876                             pRet->GenReturn ( RET_Value, aUId, ((Edit*)pControl)->GetText());
4877                             break;
4878                         case M_IsWritable:
4879                             pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((Edit*)pControl)->IsReadOnly() );
4880                             break;
4881                         default:
4882                             if ( ! ((Edit*)pControl)->IsReadOnly() )
4883                             {
4884                                 switch( nMethodId )
4885                                 {
4886                                     case M_SetText :
4887                                         ((Edit*)pControl)->SetText( aString1 );
4888                                         if ( nRT == C_MultiLineEdit )   // since SetModifyFlag is not virtual we have to do this
4889                                             ((MultiLineEdit*)pControl)->SetModifyFlag();
4890                                         else
4891                                             ((Edit*)pControl)->SetModifyFlag();
4892                                         ((Edit*)pControl)->Modify();
4893                                         if ( ((Edit*)pControl)->GetText().CompareTo(aString1) != COMPARE_EQUAL )
4894                                             ReportError( aUId, GEN_RES_STR1( S_ERROR_IN_SET_TEXT, MethodString( nMethodId ) ) );
4895                                         break;
4896                                     default:
4897                                         ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "(MultiLine)Edit" ) );
4898                                         break;
4899                                 }
4900                             }
4901                             else
4902                                 ReportError( aUId, GEN_RES_STR1c( S_ATTEMPT_TO_WRITE_READONLY, "(MultiLine)Edit" ) );
4903                     }
4904                     break;
4905                 case C_MultiListBox:
4906                 case C_ListBox:
4907                     switch( nMethodId )
4908                     {
4909                         case M_AnimateMouse :
4910                             AnimateMouse( pControl, MitteOben);
4911                             break;
4912                         case M_GetSelCount :
4913                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ListBox*)pControl)->GetSelectEntryCount()));
4914                             break;
4915                         case M_GetSelIndex :
4916                             if ( ! (nParams & PARAM_USHORT_1) )
4917                             {
4918                                 if ( ((ListBox*)pControl)->GetSelectEntryCount() == 0 )
4919                                 {
4920                                     pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
4921                                     break;
4922                                 }
4923                                 nNr1 = 1;
4924                             }
4925                             ValueOK(aUId, MethodString( nMethodId ),nNr1,((ListBox*)pControl)->GetSelectEntryCount());
4926                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ListBox*)pControl)->GetSelectEntryPos(nNr1-1)) +1);
4927                             break;
4928                         case M_GetSelText :
4929                             if ( ! (nParams & PARAM_USHORT_1) )
4930                                 nNr1 = 1;
4931                             pRet->GenReturn ( RET_Value, aUId, ((ListBox*)pControl)->GetSelectEntry(nNr1-1));
4932                             break;
4933                         case M_GetItemCount :
4934                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ListBox*)pControl)->GetEntryCount()));
4935                             break;
4936                         case M_GetItemText :
4937                             pRet->GenReturn ( RET_Value, aUId, ((ListBox*)pControl)->GetEntry(nNr1-1));
4938                             break;
4939                         case M_Select:
4940                         case M_MultiSelect:
4941                             {
4942                                 sal_Bool bUnselectBeforeSelect = ( nMethodId == M_Select );
4943                                 sal_Bool bFehler = sal_False;
4944                                 if ( ! (nParams & PARAM_BOOL_1) )
4945                                     bBool1 = sal_True;
4946 
4947                                 if ( nMethodId == M_MultiSelect && nRT == C_ListBox )
4948                                 {
4949                                     ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ListBox" ) );
4950                                     bFehler = sal_True;
4951                                 }
4952 
4953                                 if ( !bBool1 && nMethodId == M_Select )
4954                                 {
4955                                     ReportError( aUId, GEN_RES_STR1( S_NO_SELECT_FALSE, MethodString( nMethodId ) ) );
4956                                     bFehler = sal_True;
4957                                 }
4958 
4959                                 if ( !bFehler )
4960                                 {
4961                                     if( nParams & PARAM_STR_1 )
4962                                     {
4963                                         ListBox *pLB = ((ListBox*)pControl);
4964                                         sal_uInt16 nPos;
4965                                         if ( (nPos = pLB->GetEntryPos( aString1 )) == LISTBOX_ENTRY_NOTFOUND )
4966                                             ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
4967                                         else
4968                                         {
4969                                             if ( bUnselectBeforeSelect )
4970                                                 pLB->SetNoSelection();
4971                                             pLB->SelectEntryPos( nPos, bBool1 );
4972                                             if ( pLB->IsEntryPosSelected( nPos ) ? !bBool1 : bBool1 )   // XOR into with BOOL
4973                                                 ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), aString1 ) );
4974                                         }
4975                                     }
4976                                     else
4977                                     {
4978                                         ListBox *pLB = ((ListBox*)pControl);
4979                                         pLB = static_cast<ListBox*>(pControl);
4980                                         if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pLB->GetEntryCount()) )
4981                                         {
4982                                             if ( bUnselectBeforeSelect )
4983                                                 pLB->SetNoSelection();
4984                                             pLB->SelectEntryPos( nNr1-1, bBool1 );
4985                                             if ( pLB->IsEntryPosSelected( nNr1-1 ) ? !bBool1 : bBool1 ) // XOR into with BOOL
4986                                                 ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), UniString::CreateFromInt32( nNr1 ) ) );
4987                                         }
4988                                     }
4989                                     ((ListBox*)pControl)->Select();
4990                                 }
4991                             }
4992                             break;
4993                         case M_SetNoSelection :
4994                             ((ListBox*)pControl)->SetNoSelection();
4995                             ((ListBox*)pControl)->Select();
4996                             break;
4997                         default:
4998                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "(Multi)ListBox" ) );
4999                             break;
5000                     }
5001                     break;
5002                 case C_ComboBox:
5003                 case C_PatternBox:
5004                 case C_NumericBox:
5005                 case C_MetricBox:
5006                 case C_CurrencyBox:
5007                 case C_DateBox:
5008                 case C_TimeBox:
5009                     switch( nMethodId )
5010                     {
5011                         case M_AnimateMouse :
5012                             AnimateMouse( pControl, MitteOben);
5013                             break;
5014                         case M_GetSelText :
5015                             pRet->GenReturn ( RET_Value, aUId, ((ComboBox*)pControl)->GetText());
5016                             break;
5017                         case M_GetSelIndex :
5018                             {
5019                                 sal_uInt16 nPos = ((ComboBox*)pControl)->GetEntryPos(((ComboBox*)pControl)->GetText());
5020                                 if ( nPos == COMBOBOX_ENTRY_NOTFOUND )
5021                                     nPos = 0;
5022                                 else
5023                                     nPos++;
5024                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG) nPos);
5025                             }
5026                             break;
5027                         case M_GetItemCount :
5028                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((ComboBox*)pControl)->GetEntryCount()));
5029                             break;
5030                         case M_GetItemText :
5031                             pRet->GenReturn ( RET_Value, aUId, ((ComboBox*)pControl)->GetEntry(nNr1-1));
5032                             break;
5033                         case M_IsWritable:
5034                             pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((ComboBox*)pControl)->IsReadOnly() );
5035                             break;
5036                         case M_Select :
5037                             if( nParams & PARAM_USHORT_1 )
5038                             {
5039                                 if ( !ValueOK(aUId, MethodString( nMethodId ),nNr1,((ComboBox*)pControl)->GetEntryCount()) )
5040                                     break;
5041                                 aString1 = ((ComboBox*)pControl)->GetEntry(nNr1-1);
5042                             }
5043                             else
5044                             {
5045                                 if ( ((ComboBox*)pControl)->GetEntryPos( aString1 ) == COMBOBOX_ENTRY_NOTFOUND )
5046                                 {
5047                                     ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
5048                                     break;
5049                                 }
5050                             }
5051 
5052 
5053                             ((ComboBox*)pControl)->SetText( aString1 );
5054                             ((ComboBox*)pControl)->SetModifyFlag();
5055                             ((ComboBox*)pControl)->Modify();
5056                             break;
5057                         case M_SetText :
5058                             if ( ! ((ComboBox*)pControl)->IsReadOnly() )
5059                             {
5060                                 if ( ! (nParams & PARAM_STR_1) )
5061                                     aString1 = String();
5062                                 ((ComboBox*)pControl)->SetText( aString1 );
5063                                 ((ComboBox*)pControl)->SetModifyFlag();
5064                                 ((ComboBox*)pControl)->Modify();
5065                             }
5066                             else
5067                                 ReportError( aUId, GEN_RES_STR1c( S_ATTEMPT_TO_WRITE_READONLY, "ComboBox" ) );
5068                             break;
5069                         default:
5070                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ComboBox" ) );
5071                             break;
5072                     }
5073                     break;
5074                 case C_PushButton:
5075                 case C_OkButton:
5076                 case C_CancelButton:
5077                 case C_ImageButton:
5078                     switch( nMethodId )
5079                     {
5080                         case M_AnimateMouse :
5081                             AnimateMouse( pControl, Mitte);
5082                             break;
5083                         case M_Click :
5084                             ((PushButton*)pControl)->Click();
5085                             break;
5086                         default:
5087                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "PushButton" ) );
5088                             break;
5089                     }
5090                     break;
5091                 case C_MoreButton:
5092                     switch( nMethodId )
5093                     {
5094                         case M_AnimateMouse :
5095                             AnimateMouse( pControl, Mitte);
5096                             break;
5097                         case M_IsOpen :
5098                             pRet->GenReturn ( RET_Value, aUId, ((MoreButton*)pControl)->GetState());
5099                             break;
5100                         case M_Click :
5101                             ((MoreButton*)pControl)->Click();
5102                             break;
5103                         case M_Open :
5104                             ((MoreButton*)pControl)->SetState(sal_True);
5105                             break;
5106                         case M_Close :
5107                             ((MoreButton*)pControl)->SetState(sal_False);
5108                             break;
5109                         default:
5110                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MoreButton" ) );
5111                             break;
5112                     }
5113                     break;
5114                 case C_SpinField:
5115                 case C_PatternField:
5116                 case C_NumericField:
5117                 case C_MetricField:
5118                 case C_CurrencyField:
5119                 case C_DateField:
5120                 case C_TimeField:
5121                     switch( nMethodId )
5122                     {
5123                         case M_AnimateMouse :
5124                             AnimateMouse( pControl, Mitte);
5125                             break;
5126                         case M_GetText :
5127                             pRet->GenReturn ( RET_Value, aUId, ((SpinField*)pControl)->GetText());
5128                             break;
5129                         case M_IsWritable:
5130                             pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((SpinField*)pControl)->IsReadOnly() );
5131                             break;
5132                         case M_SetText :
5133                             if ( ! ((SpinField*)pControl)->IsReadOnly() )
5134                             {
5135                                 ((SpinField*)pControl)->SetText( aString1 );
5136                                 ((SpinField*)pControl)->SetModifyFlag();
5137                                 ((SpinField*)pControl)->Modify();
5138                             }
5139                             else
5140                                 ReportError( aUId, GEN_RES_STR1c( S_ATTEMPT_TO_WRITE_READONLY, "SpinField" ) );
5141                             break;
5142                         case M_More :
5143                             {
5144                                 if ( !(nParams & PARAM_USHORT_1) )
5145                                     nNr1 = 1;
5146                                 for (int i = 1; i<= nNr1; i++)
5147                                 {
5148                                     ((SpinField*)pControl)->Up();
5149                                     ((SpinField*)pControl)->SetModifyFlag();
5150                                     ((SpinField*)pControl)->Modify();
5151                                 }
5152                             }
5153                             break;
5154                         case M_Less :
5155                             {
5156                                 if ( !(nParams & PARAM_USHORT_1) )
5157                                     nNr1 = 1;
5158                                 for (int i = 1; i<= nNr1; i++)
5159                                 {
5160                                     ((SpinField*)pControl)->Down();
5161                                     ((SpinField*)pControl)->SetModifyFlag();
5162                                     ((SpinField*)pControl)->Modify();
5163                                 }
5164                             }
5165                             break;
5166                         case M_ToMin :
5167                             ((SpinField*)pControl)->First();
5168                             ((SpinField*)pControl)->SetModifyFlag();
5169                             ((SpinField*)pControl)->Modify();
5170                             break;
5171                         case M_ToMax :
5172                             ((SpinField*)pControl)->Last();
5173                             ((SpinField*)pControl)->SetModifyFlag();
5174                             ((SpinField*)pControl)->Modify();
5175                             break;
5176                         default:
5177                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "SpinField" ) );
5178                             break;
5179                     }
5180                     break;
5181 
5182                 case C_MenuButton:
5183                         switch( nMethodId )
5184                         {
5185                         case M_AnimateMouse :
5186                             AnimateMouse( pControl, Mitte);
5187                             break;
5188                         case M_Click :
5189                             {
5190                                 MouseEvent aMEvnt;
5191                                 Point aPt( pControl->GetSizePixel().Width() / 2, pControl->GetSizePixel().Height() / 2 );
5192                                 aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
5193                                 ImplMouseButtonDown( pControl, aMEvnt, FORCE_DIRECT_CALL );
5194                                 ImplMouseButtonUp  ( pControl, aMEvnt, FORCE_DIRECT_CALL );
5195                             }
5196                             break;
5197                         case M_Open :
5198                         case M_OpenMenu :
5199                             {
5200                                 MouseEvent aMEvnt;
5201                                 Point aPt( pControl->GetSizePixel().Width() / 2, pControl->GetSizePixel().Height() / 2 );
5202                                 aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
5203                                 ImplMouseButtonDown( pControl, aMEvnt, FORCE_DIRECT_CALL );
5204 
5205                                 sal_uLong nStart = Time::GetSystemTicks();
5206                                 sal_uLong nDelay = pControl->GetSettings().GetMouseSettings().GetActionDelay();
5207                                 while ( ( Time::GetSystemTicks() - nStart ) < nDelay + 100 )
5208                                     SafeReschedule();
5209 
5210                                 ImplMouseButtonUp  ( pControl, aMEvnt, FORCE_DIRECT_CALL );
5211 
5212                                 aSubMenuId1 = 0;
5213                                 aSubMenuId2 = 0;
5214                                 aSubMenuId3 = 0;
5215                                 pMenuWindow = NULL;
5216                             }
5217                             break;
5218                         default:
5219                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MenuButton" ) );
5220                             break;
5221                     }
5222                     break;
5223                 case C_ToolBox:
5224                     {
5225                         ToolBox *pTB = ((ToolBox*)pControl);
5226                         if ( !aUId.equals( pTB->GetUniqueOrHelpId() ) ) // So we found a Button on the ToolBox
5227                         {
5228                             if ( (nParams == PARAM_NONE) || (nParams == PARAM_USHORT_1) )
5229                             {           // We fake a parameter
5230                                 nParams |= PARAM_STR_1;
5231                                 aString1 = Id2Str( aUId );
5232                             }
5233                             else
5234                                 ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
5235                         }
5236 
5237 #define FIND_ITEM\
5238     sal_uInt16 nItemPos = 0;\
5239     sal_Bool bItemFound = sal_False;\
5240     {\
5241         rtl::OString aButtonId;\
5242         if( nParams & PARAM_STR_1 )\
5243             aButtonId = Str2Id( aString1 );\
5244         else\
5245             ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );\
5246         for ( nItemPos = 0; nItemPos < pTB->GetItemCount() && !aButtonId.equals(Str2Id( pTB->GetItemCommand(pTB->GetItemId(nItemPos)) )) &&\
5247                                                       !aButtonId.equals(pTB->GetHelpId(pTB->GetItemId(nItemPos))) ; nItemPos++ ) {}\
5248         bItemFound = aButtonId.equals(Str2Id( pTB->GetItemCommand(pTB->GetItemId(nItemPos)) )) || aButtonId.equals(pTB->GetHelpId(pTB->GetItemId(nItemPos)));\
5249         if ( !bItemFound )\
5250             ReportError( aUId, GEN_RES_STR1( S_HELPID_ON_TOOLBOX_NOT_FOUND, MethodString( nMethodId ) ) );\
5251         else\
5252         {\
5253             if ( !pTB->IsItemEnabled( pTB->GetItemId(nItemPos) ) && nMethodId != _M_IsEnabled && nMethodId != M_GetState )\
5254             {\
5255                 ReportError( aUId, GEN_RES_STR1( S_BUTTON_DISABLED_ON_TOOLBOX, MethodString( nMethodId ) ) );\
5256                 bItemFound = sal_False;\
5257             }\
5258             else if ( !pTB->IsItemVisible( pTB->GetItemId(nItemPos) ) && nMethodId != M_GetState )\
5259             {\
5260                 ReportError( aUId, GEN_RES_STR1( S_BUTTON_HIDDEN_ON_TOOLBOX, MethodString( nMethodId ) ) );\
5261                 bItemFound = sal_False;\
5262             }\
5263             else\
5264             {\
5265                 if ( pTB->IsMenuEnabled() )\
5266                 {   /* button is in Menu */\
5267                 }\
5268                 else\
5269                 {   /* Try the multi line way */\
5270                     if ( pTB->GetItemRect(pTB->GetItemId(nItemPos)).IsEmpty() )\
5271                     {\
5272                         sal_uInt16 nLine = pTB->GetCurLine();\
5273                         do\
5274                         {\
5275                             pTB->ShowLine( sal_False );\
5276                             for ( int i = 1 ; i < 30 ; i++ )\
5277                                 SafeReschedule();\
5278                         }\
5279                         while ( pTB->GetCurLine() != nLine && pTB->GetItemRect(pTB->GetItemId(nItemPos)).IsEmpty() );\
5280                         pTB->Invalidate( pTB->GetScrollRect() );\
5281                     }\
5282                     if ( pTB->GetItemRect(pTB->GetItemId(nItemPos)).IsEmpty() )\
5283                     {\
5284                         ReportError( aUId, GEN_RES_STR1( S_CANNOT_MAKE_BUTTON_VISIBLE_IN_TOOLBOX, MethodString( nMethodId ) ) );\
5285                         bItemFound = sal_False;\
5286                     }\
5287                 }\
5288             }\
5289         }\
5290     }
5291 
5292                         switch( nMethodId )
5293                         {
5294                             case M_AnimateMouse :
5295                                 AnimateMouse( pControl, MitteLinks);
5296                                 break;
5297                             case M_Click :
5298                                 {
5299                                     FIND_ITEM;
5300                                     if ( bItemFound )   // FIND_ITEM successful
5301                                     {
5302                                         Rectangle aRect = pTB->GetItemRect(pTB->GetItemId(nItemPos));
5303                                         if ( aRect.IsEmpty() )
5304                                         {
5305                                             pTB->ExecuteCustomMenu();
5306 /*                                          aRect = pTB->GetMenubuttonRect();
5307                                             MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
5308                                             ImplMouseButtonDown( pTB, aMEvnt );*/
5309 
5310                                             aSubMenuId1 = 0;
5311                                             aSubMenuId2 = 0;
5312                                             aSubMenuId3 = 0;
5313                                             pMenuWindow = NULL;
5314 
5315                                             new StatementCommand( this, RC_MenuSelect, PARAM_USHORT_1, pTB->GetItemId(nItemPos) + TOOLBOX_MENUITEM_START );
5316                                         }
5317                                         else
5318                                         {
5319                                             aRect = pTB->GetItemRect(pTB->GetItemId(nItemPos));
5320                                             MouseEvent aMEvnt;
5321                                             aMEvnt = MouseEvent(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
5322                                             ImplMouseButtonDown( pTB, aMEvnt, FORCE_DIRECT_CALL );
5323                                             ImplMouseButtonUp  ( pTB, aMEvnt, FORCE_DIRECT_CALL );
5324                                         }
5325                                     }
5326                                 }
5327                                 break;
5328                             case M_TearOff :
5329                                 {
5330                                     FIND_ITEM;
5331                                     if ( bItemFound )   // FIND_ITEM successful
5332                                     {
5333                                         Rectangle aRect = pTB->GetItemPosDropDownRect( nItemPos );
5334                                         AnimateMouse( pControl, aRect.Center() );
5335                                         MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
5336                                         ImplMouseButtonDown( pTB, aMEvnt, FORCE_DIRECT_CALL );
5337 
5338                                         Window *pWin = NULL;
5339                                         // Wait for the window to open.
5340                                         StatementList::bExecuting = sal_True;       // Bah, that's a nasty hack.
5341                                         {                                           // This prevents the next command from being executed.
5342                                             Time aDelay;
5343                                             while ( !pWin && ( (pWin = GetPopupFloatingWin()) == NULL ) && ( Time() - aDelay ).GetSec() < 15 )
5344                                                 SafeReschedule();
5345                                         }
5346                                         StatementList::bExecuting = sal_False;  // Bah, that's a nasty hack.
5347 
5348                                         if ( pWin && pWin->GetType() == WINDOW_FLOATINGWINDOW )
5349                                         {
5350                                             aMEvnt = MouseEvent(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
5351                                             ImplMouseButtonUp( pTB, aMEvnt, FORCE_DIRECT_CALL );
5352                                             ((FloatingWindow*)pWin)->EndPopupMode( FLOATWIN_POPUPMODEEND_TEAROFF );
5353                                         }
5354                                         else
5355                                         {
5356                                             aMEvnt = MouseEvent(Point(1,-10), 1, MOUSE_SIMPLECLICK,MOUSE_LEFT);
5357                                             ImplMouseButtonUp( pTB, aMEvnt, FORCE_DIRECT_CALL );
5358                                             ReportError( aUId, GEN_RES_STR1( S_TEAROFF_FAILED, MethodString( nMethodId ) ) );
5359                                         }
5360                                     }
5361                                 }
5362                                 break;
5363                             case M_OpenMenu :
5364                                 {
5365                                     FIND_ITEM;
5366                                     if ( bItemFound ) // FIND_ITEM successful
5367                                     {
5368                                         Rectangle aRect = pTB->GetItemPosDropDownRect( nItemPos );
5369                                         AnimateMouse( pControl, aRect.Center() );
5370                                         MouseEvent aMEvnt(aRect.Center(),1,MOUSE_SIMPLECLICK,MOUSE_LEFT);
5371                                         ImplMouseButtonDown( pTB, aMEvnt);
5372                                         ImplMouseButtonUp( pTB, aMEvnt);
5373 
5374                                         // The window is open
5375                                         aSubMenuId1 = 0;
5376                                         aSubMenuId2 = 0;
5377                                         aSubMenuId3 = 0;
5378                                         pMenuWindow = NULL;
5379                                     }
5380                                 }
5381                                 break;
5382                             case _M_IsEnabled:
5383                                 {
5384                                     FIND_ITEM;
5385                                     if ( bItemFound ) // FIND_ITEM successful
5386                                     {
5387                                         pRet->GenReturn ( RET_Value, aUId, pTB->IsItemEnabled( pTB->GetItemId(nItemPos) ) );
5388                                     }
5389                                 }
5390                                 break;
5391                             case M_GetState :
5392                                 {
5393                                     FIND_ITEM;
5394                                     if ( bItemFound ) // FIND_ITEM successful
5395                                     {
5396                                         if ( ValueOK( aUId, CUniString("GetState"), nNr1, 4 ) )
5397                                             switch (nNr1)
5398                                             {
5399                                             case 0:
5400                                                 pRet->GenReturn ( RET_Value, aUId, Id2Str( pTB->GetHelpId(pTB->GetItemId(nItemPos)) ) );
5401                                                 break;
5402                                             case 1:
5403                                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemType(nItemPos));
5404                                                 break;
5405                                             case 2:
5406                                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemState(pTB->GetItemId(nItemPos)));
5407                                                 break;
5408                                             case 3:
5409                                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemId(nItemPos));
5410                                                 break;
5411                                             case 11:
5412                                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG) nItemPos + 1);
5413                                                 break;
5414                                             case 12:
5415                                                 pRet->GenReturn ( RET_Value, aUId, Id2Str(pTB->GetHelpId())); // The toolbox's help id
5416                                                 break;
5417                                             case 13:
5418                                             {
5419                                                 Rectangle aRect = pTB->GetItemPosRect( nItemPos );
5420                                                 Rectangle aTBRect = pTB->GetWindowExtentsRelative( NULL );
5421                                                 pRet->GenReturn ( RET_Value, aUId,
5422                                                 UniString::CreateFromInt32(aRect.Left()+aTBRect.Left()).
5423                                                     AppendAscii(",").Append(UniString::CreateFromInt32(aRect.Top()+aTBRect.Top())).
5424                                                     AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetWidth())).
5425                                                     AppendAscii(",").Append(UniString::CreateFromInt32(aRect.GetHeight()))
5426                                                 );
5427                                                 break;
5428                                             }
5429                                             default:
5430                                                 ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
5431                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
5432                                                 break;
5433                                             }
5434                                     }
5435                                 }
5436                                 break;
5437                             case M_GetItemHelpText :
5438                                 if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTB->GetItemCount() ))
5439                                     pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetHelpText(pTB->GetItemId(nNr1-1)));
5440                                 break;
5441                             case M_GetItemQuickHelpText :
5442                                 if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTB->GetItemCount() ))
5443                                     pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetQuickHelpText(pTB->GetItemId(nNr1-1)));
5444                                 break;
5445                             case M_GetItemText2:
5446                                 if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTB->GetItemCount() ))
5447                                     pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetItemText(pTB->GetItemId(nNr1-1)));
5448                                 break;
5449                             case M_GetItemText :
5450                                 pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetItemText(nNr1));
5451                                 break;
5452                             case M_GetText :
5453                                 pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetText());
5454                                 break;
5455                             case M_GetItemCount :
5456                                 pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTB->GetItemCount());
5457                                 break;
5458                             case M_SetNextToolBox :
5459                                 if ( (nParams & PARAM_STR_1) )
5460                                     pTB->SetNextToolBox( aString1 );
5461                                 else
5462                                     pTB->SetNextToolBox( pTB->GetNextToolBox() );
5463                                 pTB->NextToolBox();
5464                                 break;
5465                             case M_GetNextToolBox :
5466                                 pRet->GenReturn ( RET_Value, aUId, (String)pTB->GetNextToolBox());
5467                                 break;
5468                             case M_Dock :
5469                             case M_Undock :
5470                             case M_IsDocked :
5471                             case M_Close:
5472                             case M_Size:
5473                             case M_Move:
5474                             case M_IsMax:
5475                             case M_Minimize:
5476                             case M_Maximize:
5477                             case M_Help: // Everything to be treated below
5478                                 goto DockingWin;
5479                             default:
5480                                 ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ToolBox" ) );
5481                                 break;
5482                         }
5483                     }
5484                     break;
5485 
5486                 case C_TreeListBox:
5487                     switch( nMethodId )
5488                     {
5489 
5490 
5491 
5492 #define GET_NTH_ENTRY_LBOX( First, Next, Anzahl)    \
5493     SvLBoxEntry *pThisEntry = ((SvTreeListBox*)pControl)->First(); \
5494     { \
5495         int niTemp = Anzahl; \
5496         while ( niTemp-- ) \
5497         { \
5498             pThisEntry = ((SvTreeListBox*)pControl)->Next( pThisEntry ); \
5499         } \
5500     }
5501 
5502                         case M_GetText :               // Get the first text of the given (default=1) line
5503                             {                          // should get removed some time
5504                                 SvTreeListBox *pTree = (SvTreeListBox*)pControl;
5505                                 SvLBoxEntry *pThisEntry = pTree->GetCurEntry();
5506                                 if ( ! (nParams & PARAM_USHORT_1) )
5507                                     nNr1 = 1;
5508                                 if ( pThisEntry )
5509                                 {
5510                                     SvLBoxString* pItem = NULL;
5511                                     sal_uInt16 nValidTextItemCount = 0;
5512                                     {
5513                                         sal_uInt16 nIndex = 0;
5514                                         SvLBoxItem *pMyItem;
5515                                         while ( ( nValidTextItemCount < nNr1 ) && nIndex < pThisEntry->ItemCount() )
5516                                         {
5517                                             pMyItem = pThisEntry->GetItem( nIndex );
5518                                             if ( pMyItem->IsA() == SV_ITEM_ID_LBOXSTRING )
5519                                             {
5520                                                 pItem = (SvLBoxString*)pMyItem;
5521                                                 nValidTextItemCount++;
5522                                             }
5523                                             nIndex++;
5524                                         }
5525                                     }
5526                                     if ( ValueOK( aUId, CUniString("GetText"), nNr1, nValidTextItemCount ) )
5527                                         pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
5528                                 }
5529                                 else
5530                                     ReportError( aUId, GEN_RES_STR2c2( S_NO_SELECTED_ENTRY, MethodString( nMethodId ), "TreeListBox" ) );
5531                             }
5532                             break;
5533                         case M_GetSelCount :
5534                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetSelectionCount()));
5535                             break;
5536                         case M_GetItemCount :
5537                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetVisibleCount()) );
5538                             break;
5539                         case M_GetSelIndex :
5540                             if ( ! (nParams & PARAM_USHORT_1) )
5541                                 nNr1 = 1;
5542                             if ( ValueOK(aUId, CUniString("GetSelIndex"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
5543                             {
5544                                 nNr1--;
5545                                 GET_NTH_ENTRY_LBOX( FirstSelected, NextSelected, nNr1);
5546                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( ((SvTreeListBox*)pControl)->GetVisiblePos( pThisEntry )) +1 );
5547                             }
5548                             break;
5549                         case M_Select :
5550                             if ( ! (nParams & PARAM_BOOL_1) )
5551                                 bBool1 = sal_True;
5552                             if( nParams & PARAM_STR_1 )
5553                             {
5554 /*                                  ListBox *pLB = ((ListBox*)pControl);
5555                                 if ( pLB->GetEntryPos( aString1 ) == LISTBOX_ENTRY_NOTFOUND )
5556                                     ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
5557                                 else
5558                                 {
5559                                     pLB->SelectEntry( aString1, bBool1 );
5560                                     if ( pLB->IsEntrySelected( aString1 ) ? !bBool1 : bBool1 )  // XOR rein mit BOOL
5561                                         ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), aString1 ) );
5562                                 }
5563 */                                  ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
5564                             }
5565                             else
5566                             {
5567                                 if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5568                                 {
5569                                     SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
5570                                     ((SvTreeListBox*)pControl)->Select ( pEntry, bBool1 );
5571                                 }
5572                             }
5573                             break;
5574                         case M_Collapse :
5575                             if( nParams & PARAM_STR_1 )
5576                             {
5577                                 ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
5578                             }
5579                             else
5580                             {
5581                                 if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5582                                 {
5583                                     SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
5584                                     ((SvTreeListBox*)pControl)->Collapse ( pEntry );
5585                                 }
5586                             }
5587                             break;
5588                         case M_Expand :
5589                             if( nParams & PARAM_STR_1 )
5590                             {
5591                                 ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
5592                             }
5593                             else
5594                             {
5595                                 if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5596                                 {
5597                                     SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
5598                                     ((SvTreeListBox*)pControl)->Expand ( pEntry );
5599                                 }
5600                             }
5601                             break;
5602                         case M_GetSelText :
5603                             if ( ! (nParams & PARAM_USHORT_1) )
5604                                 nNr1 = 1;
5605                             if ( ! (nParams & PARAM_USHORT_2) )
5606                                 nNr2 = 1;
5607                             if ( ValueOK(aUId, CUniString("GetSelText"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
5608                             {
5609                                 nNr1--;
5610                                 GET_NTH_ENTRY_LBOX( FirstSelected, NextSelected, nNr1);
5611                                 if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
5612                                 {
5613                                     SvLBoxString* pItem = NULL;
5614                                     if ( ! (nParams & PARAM_USHORT_2) )
5615                                         pItem = (SvLBoxString*)pThisEntry->GetFirstItem( SV_ITEM_ID_LBOXSTRING );
5616                                     else
5617                                     {
5618                                         SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
5619                                         if ( pMyItem->IsA() == SV_ITEM_ID_LBOXSTRING )
5620                                             pItem = (SvLBoxString*)pMyItem;
5621                                     }
5622 
5623                                     if ( pItem )
5624                                         pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
5625                                     else
5626                                         ReportError( aUId, GEN_RES_STR1( S_NO_LIST_BOX_STRING, MethodString( nMethodId ) ) );
5627                                 }
5628                             }
5629                             break;
5630                         case M_GetItemText :
5631                             if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5632                             {
5633                                 SvLBoxEntry *pThisEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
5634                                 if ( ! (nParams & PARAM_USHORT_2) )
5635                                     nNr2 = 1;
5636                                 if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
5637                                 {
5638                                     SvLBoxString* pItem = NULL;
5639                                     if ( ! (nParams & PARAM_USHORT_2) )
5640                                         pItem = (SvLBoxString*)pThisEntry->GetFirstItem( SV_ITEM_ID_LBOXSTRING );
5641                                     else
5642                                     {
5643                                         SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
5644                                         if ( pMyItem->IsA() == SV_ITEM_ID_LBOXSTRING )
5645                                             pItem = (SvLBoxString*)pMyItem;
5646                                     }
5647 
5648                                     if ( pItem )
5649                                         pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
5650                                     else
5651                                         ReportError( aUId, GEN_RES_STR1( S_NO_LIST_BOX_STRING, MethodString( nMethodId ) ) );
5652                                 }
5653                             }
5654                             break;
5655                         case M_IsChecked :
5656                         case M_IsTristate :
5657                         case M_GetState :
5658                         case M_Check :
5659                         case M_UnCheck :
5660                         case M_TriState :
5661                             {
5662                                 SvTreeListBox *pTree = (SvTreeListBox*)pControl;
5663                                 SvLBoxEntry *pThisEntry = NULL;
5664 
5665                                 if ( ! (nParams & PARAM_USHORT_1) )
5666                                 {
5667                                     pThisEntry = pTree->GetCurEntry();
5668                                     if ( !pThisEntry )
5669                                         ReportError( aUId, GEN_RES_STR2c2( S_NO_SELECTED_ENTRY, MethodString( nMethodId ), "TreeListBox" ) );
5670                                 }
5671                                 else
5672                                 {
5673                                     if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5674                                     {
5675                                         pThisEntry = (SvLBoxEntry*)pTree->GetEntryAtVisPos( nNr1-1 );
5676                                     }
5677                                 }
5678 
5679                                 if ( ! (nParams & PARAM_USHORT_2) )
5680                                     nNr2 = 1;
5681 
5682                                 if ( pThisEntry )
5683                                 {
5684                                     if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
5685                                     {
5686                                         SvLBoxButton* pItem = NULL;
5687                                         if ( ! (nParams & PARAM_USHORT_2) )
5688                                             pItem = (SvLBoxButton*)pThisEntry->GetFirstItem( SV_ITEM_ID_LBOXBUTTON );
5689                                         else
5690                                         {
5691                                             SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
5692                                             if ( pMyItem->IsA() == SV_ITEM_ID_LBOXBUTTON )
5693                                                 pItem = (SvLBoxButton*)pMyItem;
5694                                         }
5695 
5696                                         if ( pItem )
5697                                         {
5698                                             switch( nMethodId )
5699                                             {
5700                                                 case M_IsChecked :
5701                                                     pRet->GenReturn ( RET_Value, aUId, comm_BOOL( pItem->IsStateChecked() ) );
5702                                                     break;
5703                                                 case M_IsTristate :
5704                                                     pRet->GenReturn ( RET_Value, aUId, comm_BOOL( pItem->IsStateTristate() ) );
5705                                                     break;
5706                                                 case M_GetState :
5707                                                     pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pItem->GetButtonFlags() & ~SV_STATE_MASK ));
5708                                                     break;
5709                                                 case M_Check :
5710                                                     if ( !pItem->IsStateChecked() )
5711                                                     {
5712                                                         pItem->SetStateChecked();
5713                                                         pTree->CheckButtonHdl();
5714                                                         pTree->InvalidateEntry( pThisEntry );
5715                                                     }
5716                                                     break;
5717                                                 case M_UnCheck :
5718                                                     if ( pItem->IsStateChecked() || pItem->IsStateTristate() )
5719                                                     {
5720                                                         pItem->SetStateUnchecked();
5721                                                         pTree->CheckButtonHdl();
5722                                                         pTree->InvalidateEntry( pThisEntry );
5723                                                     }
5724                                                     break;
5725                                                 case M_TriState :
5726                                                     if ( !pItem->IsStateTristate() )
5727                                                     {
5728                                                         pItem->SetStateTristate();
5729                                                         pTree->CheckButtonHdl();
5730                                                         pTree->InvalidateEntry( pThisEntry );
5731                                                     }
5732                                                     break;
5733                                                 default:
5734                                                     ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
5735                                                     break;
5736                                             }
5737                                         }
5738                                         else
5739                                             ReportError( aUId, GEN_RES_STR1( S_NO_LIST_BOX_BUTTON, MethodString( nMethodId ) ) );
5740                                     }
5741                                 }
5742                             }
5743                             break;
5744                         case M_GetItemType :
5745                             {
5746                                 SvTreeListBox *pTree = (SvTreeListBox*)pControl;
5747                                 SvLBoxEntry *pThisEntry = NULL;
5748 
5749                                 if ( ! (nParams & PARAM_USHORT_1) )
5750                                 {
5751                                     pThisEntry = pTree->GetCurEntry();
5752                                     if ( !pThisEntry )
5753                                         ReportError( aUId, GEN_RES_STR2c2( S_NO_SELECTED_ENTRY, MethodString( nMethodId ), "TreeListBox" ) );
5754                                 }
5755                                 else
5756                                 {
5757                                     if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5758                                     {
5759                                         pThisEntry = (SvLBoxEntry*)pTree->GetEntryAtVisPos( nNr1-1 );
5760                                     }
5761                                 }
5762 
5763                                 if ( pThisEntry )
5764                                 {
5765                                     if ( ! (nParams & PARAM_USHORT_2) )
5766                                         nNr2 = 1;
5767                                     if ( ValueOK( aUId, MethodString( nMethodId ),nNr2,pThisEntry->ItemCount() ) )
5768                                     {
5769                                         SvLBoxItem *pMyItem = pThisEntry->GetItem( nNr2-1 );
5770                                         comm_USHORT nType;
5771                                         switch ( pMyItem->IsA() )
5772                                         {
5773                                             case SV_ITEM_ID_LBOXSTRING: nType = CONST_ItemTypeText ; break;
5774                                             case SV_ITEM_ID_LBOXBMP: nType = CONST_ItemTypeBMP ; break;
5775                                             case SV_ITEM_ID_LBOXBUTTON: nType = CONST_ItemTypeCheckbox ; break;
5776                                             case SV_ITEM_ID_LBOXCONTEXTBMP: nType = CONST_ItemTypeContextBMP ; break;
5777                                             default: nType = CONST_ItemTypeUnknown;
5778                                         }
5779                                         pRet->GenReturn ( RET_Value, aUId, nType );
5780                                     }
5781                                 }
5782                             }
5783                             break;
5784                         default:
5785                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TreeListBox" ) );
5786                             break;
5787                     }
5788                     break;
5789                 case C_Control:
5790     {
5791                     sal_uInt16 nRealControlType = 0;
5792                     if ( dynamic_cast< EditBrowseBox* >(pControl) )
5793                         nRealControlType = CONST_CTBrowseBox;
5794                     else if ( dynamic_cast< ValueSet* >(pControl) )
5795                         nRealControlType = CONST_CTValueSet;
5796                     else if ( dynamic_cast< ORoadmap* >(pControl) )
5797                         nRealControlType = CONST_CTORoadmap;
5798                     else if ( dynamic_cast< IExtensionListBox* >(pControl) )
5799                         nRealControlType = CONST_CTIExtensionListBox;
5800                     else if ( dynamic_cast< ::svt::table::TableControl* >(pControl) )
5801                         nRealControlType = CONST_CTTableControl;
5802                     else
5803                         nRealControlType = CONST_CTUnknown;
5804 
5805                     switch( nMethodId )
5806                     {
5807                         case M_AnimateMouse :
5808                             AnimateMouse( pControl, MitteOben);
5809                             break;
5810                         default:
5811                             switch( nRealControlType )
5812                             {
5813                                 case CONST_CTBrowseBox:
5814                                     {
5815                                         EditBrowseBox* pEBBox = dynamic_cast< EditBrowseBox* >(pControl);
5816                                         switch( nMethodId )
5817                                         {
5818 
5819     /*
5820     sal_Bool            MakeFieldVisible( long nRow, sal_uInt16 nColId, sal_Bool bComplete = sal_False );
5821     // access to dynamic values of cursor row
5822     String          GetColumnTitle( sal_uInt16 nColumnId ) const;
5823     sal_uInt16          GetColumnId( sal_uInt16 nPos ) const;
5824     sal_uInt16          GetColumnPos( sal_uInt16 nColumnId ) const;
5825     // access and movement of cursor
5826     long            GetCurRow() const { return nCurRow; }
5827     sal_uInt16          GetCurColumnId() const { return nCurColId; }
5828     sal_Bool            GoToRow( long nRow );
5829     sal_Bool            GoToRowAndDoNotModifySelection( long nRow );
5830     sal_Bool            GoToColumnId( sal_uInt16 nColId );
5831     sal_Bool            GoToRowColumnId( long nRow, sal_uInt16 nColId );
5832     // selections
5833     void            SetNoSelection();
5834     void            SelectAll();
5835     void            SelectRow( long nRow, sal_Bool bSelect = sal_True, sal_Bool bExpand = sal_True );
5836     void            SelectColumnPos( sal_uInt16 nCol, sal_Bool bSelect = sal_True )
5837                         { SelectColumnPos( nCol, bSelect, sal_True); }
5838     void            SelectColumnId( sal_uInt16 nColId, sal_Bool bSelect = sal_True )
5839                         { SelectColumnPos( GetColumnPos(nColId), bSelect, sal_True); }
5840     long            GetSelectRowCount() const;
5841     sal_uInt16          GetSelectColumnCount() const;
5842     sal_Bool            IsRowSelected( long nRow ) const;
5843     sal_Bool            IsColumnSelected( sal_uInt16 nColumnId ) const;
5844     long            FirstSelectedRow( sal_Bool bInverse = sal_False );
5845     long            LastSelectedRow( sal_Bool bInverse = sal_False );
5846     long            PrevSelectedRow();
5847     long            NextSelectedRow();
5848     const MultiSelection* GetSelection() const
5849                     { return bMultiSelection ? uRow.pSel : 0; }
5850     void            SetSelection( const MultiSelection &rSelection );
5851 
5852     virtual String  GetCellText(long _nRow, sal_uInt16 _nColId) const;
5853     sal_uInt16 GetColumnCount() const { return ColCount(); }
5854 protected:
5855     virtual long    GetRowCount() const;
5856 
5857 
5858     EditBrowseBox
5859 
5860             sal_Bool IsEditing() const {return aController.Is();}
5861             void InvalidateStatusCell(long nRow) {RowModified(nRow, 0);}
5862             void InvalidateHandleColumn();
5863 
5864             CellControllerRef Controller() const { return aController; }
5865             sal_Int32   GetBrowserFlags() const { return m_nBrowserFlags; }
5866 
5867             virtual void ActivateCell(long nRow, sal_uInt16 nCol, sal_Bool bSetCellFocus = sal_True);
5868             virtual void DeactivateCell(sal_Bool bUpdate = sal_True);
5869     */
5870 
5871                                             case M_GetSelText :
5872                                                 {
5873                                                     pRet->GenReturn ( RET_Value, aUId, pEBBox->GetCellText( pEBBox->GetCurrRow(), pEBBox->GetColumnId( pEBBox->GetCurrColumn() )));
5874                                                 }
5875                                                 break;
5876                                             case M_GetColumnCount :
5877                                                 {
5878                                                     sal_uInt16 nColCount = pEBBox->GetColumnCount();
5879                                                     comm_USHORT nUnfrozenColCount = 0;
5880                                                     sal_uInt16 i;
5881                                                     for ( i=0 ; i < nColCount ; i++ )
5882                                                     {
5883                                                         if ( !pEBBox->IsFrozen( pEBBox->GetColumnId( i ) ) )
5884                                                             nUnfrozenColCount++;
5885                                                     }
5886                                                     pRet->GenReturn ( RET_Value, aUId, nUnfrozenColCount );
5887                                                 }
5888                                                 break;
5889                                             case M_GetRowCount :
5890                                                 {
5891                                                     pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pEBBox->GetRowCount() );
5892                                                 }
5893                                                 break;
5894                                             case M_IsEditing :
5895                                                 {
5896                                                     CellControllerRef aControler;
5897                                                     aControler = pEBBox->Controller();
5898                                                     pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)aControler.Is() );
5899                                                 }
5900                                                 break;
5901                                             case M_Select :
5902                                                 {
5903                                                     if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pEBBox->GetRowCount() ) )
5904                                                     {
5905                                                         sal_uInt16 nColCount = pEBBox->GetColumnCount();
5906                                                         comm_USHORT nUnfrozenColCount = 0;
5907                                                         sal_uInt16 i;
5908                                                         for ( i=0 ; i < nColCount ; i++ )
5909                                                         {
5910                                                             if ( !pEBBox->IsFrozen( pEBBox->GetColumnId( i ) ) )
5911                                                                 nUnfrozenColCount++;
5912                                                         }
5913                                                         if ( ValueOK(aUId, MethodString( nMethodId ),nNr2,nUnfrozenColCount ) )
5914                                                             pEBBox->GoToRowColumnId( nNr1-1, pEBBox->GetColumnId( nNr2 ) );
5915                                                     }
5916                                                 }
5917                                                 break;
5918 
5919                                                 /*
5920                                             case M_GetSelCount :
5921                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetSelectionCount()));
5922                                                 break;
5923                                             case M_GetSelIndex :
5924                                                 if ( ! (nParams & PARAM_USHORT_1) )
5925                                                     nNr1 = 1;
5926                                                 if ( ValueOK(aUId, CUniString("GetSelIndex"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
5927                                                 {
5928                                                     nNr1--;
5929                                                     COUNT_LBOX( FirstSelected, NextSelected, nNr1);
5930                                                     pRet->GenReturn ( RET_Value, aUId, comm_ULONG( ((SvTreeListBox*)pControl)->GetVisiblePos( pThisEntry )) +1 );
5931                                                 }
5932                                                 break;
5933                                             case M_GetSelText :
5934                                                 if ( ! (nParams & PARAM_USHORT_1) )
5935                                                     nNr1 = 1;
5936                                                 if ( ValueOK(aUId, CUniString("GetSelText"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
5937                                                 {
5938                                                     nNr1--;
5939                                                     COUNT_LBOX( FirstSelected, NextSelected, nNr1);
5940                                                     GetFirstValidTextItem( pThisEntry );
5941                                                     pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
5942                                                 }
5943                                                 break;
5944                                             case M_GetItemCount :
5945                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG(((SvLBox*)pControl)->GetVisibleCount()) );
5946                                                 break;
5947                                             case M_GetItemText :
5948                                                 if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5949                                                 {
5950                                                     SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
5951                                                     GetFirstValidTextItem( pEntry );
5952                                                     pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
5953                                                 }
5954                                                 break;
5955                                             case M_Select :
5956                                                 if ( ! (nParams & PARAM_BOOL_1) )
5957                                                     bBool1 = sal_True;
5958                                                 if( nParams & PARAM_STR_1 )
5959                                                 {
5960                 / *                                 ListBox *pLB = ((ListBox*)pControl);
5961                                                     if ( pLB->GetEntryPos( aString1 ) == LISTBOX_ENTRY_NOTFOUND )
5962                                                         ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
5963                                                     else
5964                                                     {
5965                                                         pLB->SelectEntry( aString1, bBool1 );
5966                                                         if ( pLB->IsEntrySelected( aString1 ) ? !bBool1 : bBool1 )  // XOR rein mit BOOL
5967                                                             ReportError( aUId, GEN_RES_STR2( S_METHOD_FAILED, MethodString( nMethodId ), aString1 ) );
5968                                                     }
5969                 * /                                 ReportError( aUId, GEN_RES_STR1( S_SELECT_DESELECT_VIA_STRING_NOT_IMPLEMENTED, MethodString( nMethodId ) ) );
5970                                                 }
5971                                                 else
5972                                                 {
5973                                                     if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,((SvLBox*)pControl)->GetVisibleCount()) )
5974                                                     {
5975                                                         SvLBoxEntry *pEntry = (SvLBoxEntry*)((SvTreeListBox*)pControl)->GetEntryAtVisPos( nNr1-1 );
5976                                                         ((SvTreeListBox*)pControl)->Select ( pEntry, bBool1 );
5977                                                     }
5978                                                 }
5979                                                 break;*/
5980                                             default:
5981                                                 ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "EditBrowseBox" ) );
5982                                                 break;
5983                                         }
5984                                     }
5985                                     break;
5986                                 case CONST_CTValueSet:
5987                                     {
5988                                         ValueSet *pVS = dynamic_cast< ValueSet* >(pControl);
5989                                         switch ( nMethodId )
5990                                         {
5991                                         case M_GetItemCount:
5992                                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pVS->GetItemCount()));
5993                                             break;
5994                                         case M_GetItemText:
5995                                             if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pVS->GetItemCount() ))
5996                                                 pRet->GenReturn ( RET_Value, aUId, pVS->GetItemText( pVS->GetItemId( nNr1-1 ) ) );
5997                                             break;
5998                                         case M_Select:
5999                                             if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pVS->GetItemCount() ))
6000                                                 pVS->SelectItem( pVS->GetItemId( nNr1-1 ) );
6001                                             break;
6002                                         case M_GetSelIndex :
6003                                             if ( pVS->IsNoSelection() )
6004                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG(0));
6005                                             else
6006                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pVS->GetItemPos( pVS->GetSelectItemId() ) +1));
6007                                             break;
6008                                         case M_GetSelText :
6009                                             if ( pVS->IsNoSelection() )
6010                                                 pRet->GenReturn ( RET_Value, aUId, String() );
6011                                             else
6012                                                 pRet->GenReturn ( RET_Value, aUId, pVS->GetItemText( pVS->GetSelectItemId() ) );
6013                                             break;
6014                                         case M_SetNoSelection :
6015                                             pVS->SetNoSelection();
6016                                             break;
6017                                         default:
6018                                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ValueSet" ) );
6019                                             break;
6020                                         }
6021                                     }
6022                                     break;
6023                                 case CONST_CTORoadmap:
6024                                     {
6025                                         ORoadmap *pRM = dynamic_cast< ORoadmap* >(pControl);
6026                                         switch ( nMethodId )
6027                                         {
6028                                         case M_GetItemCount:
6029                                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pRM->GetItemCount()));
6030                                             break;
6031                                         case M_GetItemText:
6032                                             if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pRM->GetItemCount() ))
6033                                                 pRet->GenReturn ( RET_Value, aUId, pRM->GetRoadmapItemLabel( pRM->GetItemID( nNr1-1 ) ) );
6034                                             break;
6035                                         case M_Select:
6036                                             if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pRM->GetItemCount() ))
6037                                             {
6038                                                 if ( pRM->IsRoadmapItemEnabled( pRM->GetItemID( nNr1-1 ) ) )
6039                                                     pRM->SelectRoadmapItemByID( pRM->GetItemID( nNr1-1 ) );
6040                                                 else
6041                                                     ReportError( aUId, GEN_RES_STR1c( S_WIN_DISABLED, "RoadmapItem" ) );
6042                                             }
6043                                             break;
6044                                         case M_GetSelIndex :
6045                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pRM->GetItemIndex( pRM->GetCurrentRoadmapItemID() ) +1));
6046                                             break;
6047                                         case M_GetSelText :
6048                                                 pRet->GenReturn ( RET_Value, aUId, pRM->GetRoadmapItemLabel( pRM->GetCurrentRoadmapItemID() ) );
6049                                             break;
6050                                         case M_IsItemEnabled :
6051                                             if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pRM->GetItemCount() ))
6052                                                 pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)pRM->IsRoadmapItemEnabled( pRM->GetItemID( nNr1-1 ) ) );
6053                                             break;
6054                                         default:
6055                                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "RoadMap" ) );
6056                                             break;
6057                                         }
6058                                     }
6059                                     break;
6060                                 case CONST_CTIExtensionListBox:
6061                                     {
6062                                         IExtensionListBox *pELB = dynamic_cast< IExtensionListBox* >(pControl);
6063                                         switch ( nMethodId )
6064                                         {
6065                                         case M_GetItemCount:
6066                                             pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pELB->getItemCount()));
6067                                             break;
6068                                         case M_GetItemText:
6069                                             if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pELB->getItemCount() ))
6070                                                 switch ( nNr2 )
6071                                                 {
6072                                                 case 1:
6073                                                     pRet->GenReturn ( RET_Value, aUId, pELB->getItemName( nNr1 -1 ) );
6074                                                     break;
6075                                                 case 2:
6076                                                     pRet->GenReturn ( RET_Value, aUId, pELB->getItemVersion( nNr1 -1 ) );
6077                                                     break;
6078                                                 case 3:
6079                                                     pRet->GenReturn ( RET_Value, aUId, pELB->getItemDescription( nNr1 -1 ) );
6080                                                     break;
6081                                                 case 4:
6082                                                     pRet->GenReturn ( RET_Value, aUId, pELB->getItemPublisher( nNr1 -1 ) );
6083                                                     break;
6084                                                 case 5:
6085                                                     pRet->GenReturn ( RET_Value, aUId, pELB->getItemPublisherLink( nNr1 -1 ) );
6086                                                     break;
6087                                                 default:
6088                                                     ValueOK( aUId, MethodString( nMethodId ).AppendAscii(" String Number"), nNr2, 5 );
6089                                                 }
6090                                             break;
6091                                         case M_Select:
6092                                             if ( (nParams & PARAM_USHORT_1) )
6093                                             {
6094                                                 if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pELB->getItemCount() ))
6095                                                 {
6096                                                     pELB->select( nNr1-1 );
6097                                                 }
6098                                             }
6099                                             else if ( (nParams & PARAM_STR_1) )
6100                                             {
6101                                                 pELB->select( aString1 );
6102                                                 sal_Bool bSuccess = sal_True;
6103                                                 if ( pELB->getSelIndex() == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
6104                                                     bSuccess = sal_False;
6105                                                 else
6106                                                 {
6107                                                     if ( !aString1.Equals( String( pELB->getItemName( pELB->getSelIndex() ) ) ) )
6108                                                         bSuccess = sal_False;
6109                                                 }
6110                                                 if ( !bSuccess )
6111                                                     ReportError( aUId, GEN_RES_STR2( S_ENTRY_NOT_FOUND, MethodString( nMethodId ), aString1 ) );
6112                                             }
6113                                             break;
6114                                         case M_GetSelCount :
6115                                             if ( pELB->getSelIndex() == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
6116                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( 0 ));
6117                                             else
6118                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( 1 ));
6119                                             break;
6120                                         case M_GetSelIndex :
6121                                             if ( pELB->getSelIndex() == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
6122                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( 0 ));
6123                                             else
6124                                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG( pELB->getSelIndex() +1));
6125                                             break;
6126 /*                                      xxxcase M_SetNoSelection :
6127                                             ((ListBox*)pControl)->SetNoSelection();
6128                                             ((ListBox*)pControl)->Select();
6129                                             break; */
6130                                         default:
6131                                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "RoadMap" ) );
6132                                             break;
6133                                         }
6134                                     }
6135                                     break;
6136 
6137                                 case CONST_CTTableControl:
6138                                     {
6139                                         ::svt::table::TableControl *pTC = dynamic_cast< ::svt::table::TableControl* >(pControl);
6140                                         switch ( nMethodId )
6141                                         {
6142                                            case M_GetItemType :
6143                                                 {
6144                                                     if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTC->GetColumnCount() ) &&
6145                                                          ValueOK( aUId, MethodString( nMethodId ), nNr2, pTC->GetRowCount() ))
6146                                                     {
6147                                                         ::svt::table::PTableModel pModel = pTC->GetModel();
6148                                                         Any aCell;
6149                                                         pModel->getCellContent( nNr1-1, nNr2-1, aCell );
6150                                                         pRet->GenReturn ( RET_Value, aUId, String( aCell.getValueTypeName() ));
6151                                                     }
6152                                                 }
6153                                                 break;
6154                                            case M_GetItemText :
6155                                                 {
6156                                                     if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTC->GetColumnCount() ) &&
6157                                                          ValueOK( aUId, MethodString( nMethodId ), nNr2, pTC->GetRowCount() ))
6158                                                     {
6159                                                         ::svt::table::PTableModel pModel = pTC->GetModel();
6160                                                         Any aCell;
6161                                                         pModel->getCellContent( nNr1-1, nNr2-1, aCell );
6162                                                         /* doesn't work ATM since it gets casted to SbxDATE in VCLTestTool unfortunately
6163                                                         SbxVariableRef xRes = new SbxVariable( SbxVARIANT );
6164                                                         unoToSbxValue( xRes, aCell );
6165                                                         pRet->GenReturn ( RET_Value, aUId, *xRes );*/
6166 
6167                                                         Type aType = aCell.getValueType();
6168                                                         TypeClass eTypeClass = aType.getTypeClass();
6169                                                         switch( eTypeClass )
6170                                                         {
6171                                                             /*case TypeClass_ENUM:
6172                                                                 {
6173                                                                     sal_Int32 nEnum = 0;
6174                                                                     enum2int( nEnum, aValue );
6175                                                                     pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)nEnum );
6176                                                                 }
6177                                                                 break;*/
6178                                                             case TypeClass_BOOLEAN:
6179                                                                 pRet->GenReturn ( RET_Value, aUId, *(sal_Bool*)aCell.getValue() );
6180                                                                 break;
6181                                                             case TypeClass_CHAR:
6182                                                                 {
6183                                                                     ::rtl::OUString aContent( *(sal_Unicode*)aCell.getValue() );
6184                                                                     pRet->GenReturn ( RET_Value, aUId, aContent );
6185                                                                 }
6186                                                                 break;
6187                                                             case TypeClass_STRING:
6188                                                                 {
6189                                                                     ::rtl::OUString aContent;
6190                                                                     aCell >>= aContent;
6191                                                                     pRet->GenReturn ( RET_Value, aUId, aContent );
6192                                                                 }
6193                                                                 break;
6194                                                             //case TypeClass_FLOAT:         break;
6195                                                             //case TypeClass_DOUBLE:        break;
6196                                                             //case TypeClass_OCTET:         break;
6197                                                             case TypeClass_BYTE:
6198                                                             case TypeClass_SHORT:
6199                                                             case TypeClass_LONG:
6200                                                             case TypeClass_HYPER:
6201                                                             case TypeClass_UNSIGNED_LONG:
6202                                                             case TypeClass_UNSIGNED_HYPER:
6203                                                                 {
6204                                                                     comm_ULONG val = 0;
6205                                                                     aCell >>= val;
6206                                                                     pRet->GenReturn ( RET_Value, aUId, val );
6207                                                                 }
6208                                                                 break;
6209                                                             //case TypeClass_UNSIGNED_OCTET:break;
6210                                                             case TypeClass_UNSIGNED_SHORT:
6211                                                                 {
6212                                                                     comm_USHORT val = 0;
6213                                                                     aCell >>= val;
6214                                                                     pRet->GenReturn ( RET_Value, aUId, val );
6215                                                                 }
6216                                                                 break;
6217                                                             default:
6218                                                                 pRet->GenReturn ( RET_Value, aUId, comm_USHORT(0) );
6219                                                                 break;
6220                                                         }
6221                                                     }
6222                                                 }
6223                                                 break;
6224                                             case M_GetColumnCount :
6225                                                 {
6226                                                     pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTC->GetColumnCount() );
6227                                                 }
6228                                                 break;
6229                                             case M_GetRowCount :
6230                                                 {
6231                                                     pRet->GenReturn ( RET_Value, aUId, (comm_ULONG)pTC->GetRowCount() );
6232                                                 }
6233                                                 break;
6234                                             case M_Select :
6235                                                 {
6236                                                     if ( ValueOK( aUId, MethodString( nMethodId ), nNr1, pTC->GetRowCount() ))
6237                                                     {
6238                                                         if ( pTC->GoToRow( ::svt::table::RowPos( nNr1-1 ) ) )
6239                                                         {
6240                                                             Size aSize( pTC->GetSizePixel() );
6241 //                                                            DirectLog( S_QAError, UniString::CreateFromInt32( aSize.Width() ).Append( UniString::CreateFromInt32( aSize.Height() ) ) );
6242                                                             Point aPos( aSize.Width() / 2, aSize.Height() / 2 );
6243                                                             long nStep = aSize.Height() / 4;
6244                                                             ::svt::table::RowPos nLastPos;
6245                                                             while ( ( nLastPos = pTC->getTableControlInterface().hitTest( aPos ).nRow ) != nNr1-1 && nStep > 0 )
6246                                                             {
6247                                                                 if ( nLastPos > nNr1-1 || nLastPos == ROW_INVALID )
6248                                                                     aPos.Y() -= nStep;
6249                                                                 else
6250                                                                     aPos.Y() += nStep;
6251                                                                 nStep /= 2;
6252                                                             }
6253                                                             if ( pTC->getTableControlInterface().hitTest( aPos ).nRow == nNr1-1 )
6254                                                             {
6255                                                                 MouseEvent aMEvnt(aPos,1,MOUSE_SIMPLECLICK|MOUSE_SELECT,MOUSE_LEFT,KEY_MOD1);
6256                                                                 pTC->getSelEngine()->SelMouseButtonDown( aMEvnt );
6257                                                                 pTC->getSelEngine()->SelMouseButtonUp( aMEvnt );
6258                                                                 if ( pTC->IsRowSelected( nNr1-1 ) )
6259                                                                     pTC->Select();
6260                                                             }
6261                                                             else
6262                                                                 ReportError( aUId, GEN_RES_STR2c2( S_METHOD_FAILED, MethodString( nMethodId ), "find pos" ) );
6263                                                         }
6264                                                         else
6265                                                             ReportError( aUId, GEN_RES_STR2c2( S_METHOD_FAILED, MethodString( nMethodId ), "GoTo" ) );
6266                                                     }
6267                                                 }
6268                                                 break;
6269                                             case M_GetSelCount :
6270                                                 pRet->GenReturn ( RET_Value, aUId, comm_USHORT( pTC->GetSelectedRowCount() ));
6271                                                 break;
6272                                             case M_GetSelIndex :
6273                                                 if ( ! (nParams & PARAM_USHORT_1) )
6274                                                     nNr1 = 1;
6275                                                 if ( ValueOK( aUId, CUniString("GetSelIndex"), nNr1, pTC->GetSelectedRowCount() ) )
6276                                                     pRet->GenReturn ( RET_Value, aUId, comm_USHORT( pTC->GetSelectedRowIndex( nNr1-1 ) +1 ) );
6277                                                 break;
6278 /*                                          case M_GetSelText :
6279                                                 if ( ! (nParams & PARAM_USHORT_1) )
6280                                                     nNr1 = 1;
6281                                                 if ( ValueOK(aUId, CUniString("GetSelText"),nNr1,((SvLBox*)pControl)->GetSelectionCount()) )
6282                                                 {
6283                                                     nNr1--;
6284                                                     COUNT_LBOX( FirstSelected, NextSelected, nNr1);
6285                                                     GetFirstValidTextItem( pThisEntry );
6286                                                     pRet->GenReturn ( RET_Value, aUId, pItem->GetText() );
6287                                                 }
6288                                                 break;
6289                                                 */
6290                                         default:
6291                                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "TableControl" ) );
6292                                             break;
6293                                         }
6294                                     }
6295                                     break;
6296 
6297                                 case CONST_CTUnknown:
6298                                     ReportError( aUId, GEN_RES_STR2( S_UNKNOWN_TYPE, UniString::CreateFromInt32( nRT ), MethodString(nMethodId) ) );
6299                                     break;
6300                                 default:
6301                                     ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
6302                                     break;
6303                             }
6304                     }
6305                     break;
6306                 }
6307                 case C_Window:
6308                     switch( nMethodId )
6309                     {
6310                         case M_AnimateMouse :
6311                             AnimateMouse( pControl, MitteOben);
6312                             break;
6313                         default:
6314                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "Window" ) );
6315                             break;
6316                     }
6317                     break;
6318 
6319                 case C_DockingWin:
6320                     DockingWin:
6321                     switch( nMethodId )
6322                     {
6323                         case M_AnimateMouse :
6324                             AnimateMouse( pControl, MitteOben);
6325                             break;
6326                         case M_Dock :
6327                             if ( ((DockingWindow*)pControl)->IsFloatingMode() )
6328                                 ((DockingWindow*)pControl)->SetFloatingMode(sal_False);
6329                             else
6330                                 ReportError( aUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_FLOATING_MODE, MethodString( nMethodId ) ) );
6331                             break;
6332                         case M_Undock :
6333                             if ( !((DockingWindow*)pControl)->IsFloatingMode() )
6334                                 ((DockingWindow*)pControl)->SetFloatingMode(sal_True);
6335                             else
6336                                 ReportError( aUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_FLOATING_MODE, MethodString( nMethodId ) ) );
6337                             break;
6338                         case M_IsDocked :
6339                             pRet->GenReturn ( RET_Value, aUId, (comm_BOOL) !((DockingWindow*)pControl)->IsFloatingMode());
6340                             break;
6341                         case M_Close:
6342                                 //aWindowWaitUId = aUId;
6343                             DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
6344                             SET_WINP_CLOSING(pControl);
6345                             ((DockingWindow*)pControl)->Close();
6346                             break;
6347                         case M_Size:
6348                         case M_Move:
6349                         case M_IsMax:
6350                         case M_Minimize:
6351                         case M_Maximize:
6352                             if ( ((DockingWindow*)pControl)->IsFloatingMode() )
6353                             {
6354                                 Window* pFloat = ((DockingWindow*)pControl)->GetFloatingWindow();
6355                                 if ( !pFloat && ((DockingWindow*)pControl)->IsFloatingMode() )
6356                                 {
6357                                     if ( pControl->GET_REAL_PARENT() && pControl->GET_REAL_PARENT()->GetType() == WINDOW_FLOATINGWINDOW )
6358                                         pFloat = pControl->GET_REAL_PARENT();
6359                                     else
6360                                     {
6361                                         DBG_ERROR("FloatingMode set but Parent is no FloatingWindow");
6362                                     }
6363                                 }
6364                                 if ( pFloat && pFloat->GetType() == WINDOW_FLOATINGWINDOW )
6365                                 {
6366                                     pControl = pFloat;
6367                                     goto FloatWin;
6368                                 }
6369                                 else
6370                                     ReportError( aUId, GEN_RES_STR1( S_CANNOT_FIND_FLOATING_WIN, MethodString( nMethodId ) ) );
6371                             }
6372                             else
6373                                 ReportError( aUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_DOCKING_MODE, MethodString( nMethodId ) ) );
6374                             break;
6375                         case M_Help:        // Everything to be treated below
6376                             goto MoreDialog;
6377 
6378                         default:
6379                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "DockingWindow" ) );
6380                             break;
6381                     }
6382                     break;
6383                 case C_FloatWin:
6384                     FloatWin:
6385                     switch( nMethodId )
6386                     {
6387                         case M_AnimateMouse :
6388                             AnimateMouse( pControl, MitteOben);
6389                             break;
6390                         case M_IsMax :
6391                             pRet->GenReturn ( RET_Value, aUId, (comm_BOOL)!((FloatingWindow*)pControl)->IsRollUp());
6392                             break;
6393                         case M_Minimize :
6394                             ((FloatingWindow*)pControl)->RollUp();
6395                             break;
6396                         case M_Maximize :
6397                             ((FloatingWindow*)pControl)->RollDown();
6398                             break;
6399                         case M_Size:
6400                         {
6401                             if ( pControl->GetStyle() & WB_SIZEABLE )
6402                             {
6403                                 Size aMin = ((FloatingWindow*)pControl)->GetMinOutputSizePixel();
6404                                 if ( aMin.Width() <= nNr1 && aMin.Height() <= nNr2 )
6405                                 {
6406                                     pControl->SetSizePixel(Size(nNr1,nNr2));
6407                                     pControl->Resize();
6408                                 }
6409                                 else
6410                                 {
6411                                     ReportError( aUId, GEN_RES_STR2( S_SIZE_BELOW_MINIMUM, String::CreateFromInt32( aMin.Width() ), String::CreateFromInt32( aMin.Height() ) ) );
6412                                 }
6413                             }
6414                             else
6415                                 ReportError( aUId, GEN_RES_STR1( S_SIZE_NOT_CHANGEABLE, MethodString( nMethodId ) ) );
6416                             break;
6417                         }
6418                         case M_Close:
6419                             DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
6420                             SET_WINP_CLOSING(pControl);
6421                             ((FloatingWindow*)pControl)->Close();
6422                             break;
6423                         case M_Help:        // Everything to be treated below
6424                         case M_Move:
6425                             goto MoreDialog;
6426                         default:
6427                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "FloatingWin" ) );
6428                             break;
6429                     }
6430                     break;
6431                 case C_ModelessDlg:
6432                 case C_ModalDlg:
6433                 case C_Dialog:
6434                 case C_TabDlg:
6435                     MoreDialog:
6436                     switch( nMethodId )
6437                     {
6438                         case M_AnimateMouse :
6439                             AnimateMouse( pControl, MitteOben);
6440                             break;
6441                         case M_Close:
6442                             DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
6443                             SET_WINP_CLOSING(pControl);
6444                             ((SystemWindow*)pControl)->Close();
6445                             break;
6446                         case M_OK:
6447                         {
6448                             Window *pChild = GetWinByRT( pControl, WINDOW_OKBUTTON );
6449                             if( ControlOK( pChild, "OK Button" ) )
6450                             {
6451                                 DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
6452                                 SET_WINP_CLOSING(pControl);
6453                                 ((Button*)pChild)->Click();
6454                             }
6455                             break;
6456                         }
6457                         case M_Cancel:
6458                         {
6459                             Window *pChild = GetWinByRT( pControl, WINDOW_CANCELBUTTON );
6460                             if( ControlOK( pChild, "Cancel Button" ) )
6461                             {
6462                                 DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
6463                                 SET_WINP_CLOSING(pControl);
6464                                 ((Button*)pChild)->Click();
6465                             }
6466                             break;
6467                         }
6468                         case M_Help:
6469                         {
6470                             Window *pChild = GetWinByRT( pControl, WINDOW_HELPBUTTON );
6471                             if( ControlOK( pChild, "Help Button" ) )
6472                                 ((Button*)pChild)->Click();
6473                             break;
6474                         }
6475                         case M_Default:
6476                         {
6477                             Window *pChild = ImpGetButton( pControl, WB_DEFBUTTON, WB_DEFBUTTON );
6478                             if( ControlOK( pChild, "Default Button" ) )
6479                                 ((Button*)pChild)->Click();
6480                             break;
6481                         }
6482                         case M_Move:
6483                         {
6484                             pControl->SetPosPixel(Point(nNr1,nNr2));
6485                             break;
6486                         }
6487                         default:
6488                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "Dialog" ) );
6489                             break;
6490                     }
6491                     break;
6492                 case C_WorkWin:
6493                     switch( nMethodId )
6494                     {
6495                         case M_AnimateMouse :
6496                             AnimateMouse( pControl, MitteOben);
6497                             break;
6498                         case M_Close:
6499                             DBG_ASSERT( aUId.equals( pControl->GetUniqueOrHelpId() ), "aUID != UniqueOrHelpId");
6500                             SET_WINP_CLOSING(pControl);
6501                             ((WorkWindow*)pControl)->Close();
6502                             break;
6503                         case M_Size:
6504                         case M_Move:
6505                             goto FloatWin;
6506 //                          break;
6507                         case M_IsMax :
6508                             pRet->GenReturn ( RET_Value, aUId, ((WorkWindow*)pControl)->IsMaximized() );
6509                             break;
6510                         case M_IsMin :
6511                             pRet->GenReturn ( RET_Value, aUId, ((WorkWindow*)pControl)->IsMinimized() );
6512                             break;
6513                         case M_IsRestore :
6514                             pRet->GenReturn ( RET_Value, aUId, comm_BOOL (!((WorkWindow*)pControl)->IsMaximized() && !((WorkWindow*)pControl)->IsMinimized()) );
6515                             break;
6516                         case M_Minimize :
6517                             ((WorkWindow*)pControl)->Maximize( sal_False );
6518                             ((WorkWindow*)pControl)->Minimize();
6519                             break;
6520                         case M_Maximize :
6521                             ((WorkWindow*)pControl)->Maximize();
6522                             break;
6523                         case M_Restore :
6524                             ((WorkWindow*)pControl)->Maximize( sal_False );
6525                             ((WorkWindow*)pControl)->Restore();
6526                             break;
6527                         case M_Help:        // Everything to be treated below
6528                             goto MoreDialog;
6529                         default:
6530                             ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "WorkWindow" ) );
6531                             break;
6532                     }
6533                     break;
6534                 case C_TabPage:
6535                     ReportError( aUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
6536                     break;
6537                 case C_MessBox:
6538                 case C_InfoBox:
6539                 case C_WarningBox:
6540                 case C_ErrorBox:
6541                 case C_QueryBox:
6542                     {
6543                         sal_Bool bDone = sal_True;
6544                         MessBox* pMB = (MessBox*)pControl;
6545                         switch( nMethodId )
6546                         {
6547                             case M_GetCheckBoxText:
6548                                 pRet->GenReturn ( RET_Value, aUId, pMB->GetCheckBoxText() );
6549                                 break;
6550                             case M_IsChecked :
6551                                 pRet->GenReturn ( RET_Value, aUId, comm_BOOL( pMB->GetCheckBoxState() == STATE_CHECK) );
6552                                 break;
6553                             case M_Check :
6554                                 pMB->SetCheckBoxState( sal_True );
6555                                 break;
6556                             case M_UnCheck :
6557                                 pMB->SetCheckBoxState( sal_False );
6558                                 break;
6559                             case M_GetText :
6560                                 pRet->GenReturn ( RET_Value, aUId, pMB->GetMessText());
6561                                 break;
6562 
6563                             default:
6564                                 bDone = sal_False;
6565                                 break;
6566                         }
6567                         if ( bDone )
6568                             break;  // break the case here else continue at C_ButtonDialog
6569                     }
6570                 case C_ButtonDialog:
6571                     {
6572                         ButtonDialog* pBD = (ButtonDialog*)pControl;
6573 #if OSL_DEBUG_LEVEL > 1
6574                         m_pDbgWin->AddText( "Working MessBox: " );
6575                         if (pControl->IsVisible())
6576                             m_pDbgWin->AddText("*(Visible)\n");
6577                         else
6578                             m_pDbgWin->AddText("*(nicht Visible)\n");
6579 #endif
6580                         switch( nMethodId )
6581                         {
6582                             case M_AnimateMouse :
6583                                 AnimateMouse( pControl, Mitte);
6584                                 break;
6585                             case M_OK:
6586                                 if ( pBD->GetPushButton( BUTTONID_OK ) )
6587                                 {
6588                                     SET_WINP_CLOSING(pControl);
6589                                     pBD->EndDialog(RET_OK);
6590                                 }
6591                                 else
6592                                     ReportError( aUId, GEN_RES_STR1( S_NO_OK_BUTTON, MethodString( nMethodId ) ) );
6593                                 break;
6594                             case M_Cancel:
6595                                 if ( pBD->GetPushButton( BUTTONID_CANCEL ) )
6596                                 {
6597                                     SET_WINP_CLOSING(pControl);
6598                                     pBD->EndDialog(RET_CANCEL);
6599                                 }
6600                                 else
6601                                     ReportError( aUId, GEN_RES_STR1( S_NO_CANCEL_BUTTON, MethodString( nMethodId ) ) );
6602                                 break;
6603                             case M_Yes:
6604                                 if ( pBD->GetPushButton( BUTTONID_YES ) )
6605                                 {
6606                                     SET_WINP_CLOSING(pControl);
6607                                     pBD->EndDialog(RET_YES);
6608                                 }
6609                                 else
6610                                     ReportError( aUId, GEN_RES_STR1( S_NO_YES_BUTTON, MethodString( nMethodId ) ) );
6611                                 break;
6612                             case M_No:
6613                                 if ( pBD->GetPushButton( BUTTONID_NO ) )
6614                                 {
6615                                     SET_WINP_CLOSING(pControl);
6616                                     pBD->EndDialog(RET_NO);
6617                                 }
6618                                 else
6619                                     ReportError( aUId, GEN_RES_STR1( S_NO_NO_BUTTON, MethodString( nMethodId ) ) );
6620                                 break;
6621                             case M_Repeat:
6622                                 if ( pBD->GetPushButton( BUTTONID_RETRY ) )
6623                                 {
6624                                     SET_WINP_CLOSING(pControl);
6625                                     pBD->EndDialog(RET_RETRY);
6626                                 }
6627                                 else
6628                                     ReportError( aUId, GEN_RES_STR1( S_NO_RETRY_BUTTON, MethodString( nMethodId ) ) );
6629                                 break;
6630                             case M_Help:
6631                                 if ( pBD->GetPushButton( BUTTONID_HELP ) )
6632                                 {
6633                                     SET_WINP_CLOSING(pControl);
6634                                     pBD->EndDialog(BUTTONID_HELP);
6635                                 }
6636                                 else
6637                                     ReportError( aUId, GEN_RES_STR1( S_NO_HELP_BUTTON, MethodString( nMethodId ) ) );
6638                                 break;
6639                             case M_Default:
6640                                 {
6641                                     WinBits Style = pControl->GetStyle();
6642                                     if ( Style & WB_DEF_OK )
6643                                     {
6644                                         SET_WINP_CLOSING(pControl);
6645                                         pBD->EndDialog(RET_OK);
6646                                     }
6647                                     else if ( Style & WB_DEF_CANCEL )
6648                                     {
6649                                         SET_WINP_CLOSING(pControl);
6650                                         pBD->EndDialog(RET_CANCEL);
6651                                     }
6652                                     else if ( Style & WB_DEF_YES )
6653                                     {
6654                                         SET_WINP_CLOSING(pControl);
6655                                         pBD->EndDialog(RET_YES);
6656                                     }
6657                                     else if ( Style & WB_DEF_NO )
6658                                     {
6659                                         SET_WINP_CLOSING(pControl);
6660                                         pBD->EndDialog(RET_NO);
6661                                     }
6662                                     else if ( Style & WB_DEF_RETRY )
6663                                     {
6664                                         SET_WINP_CLOSING(pControl);
6665                                         pBD->EndDialog(RET_RETRY);
6666                                     }
6667                                     else
6668                                         ReportError( aUId, GEN_RES_STR1( S_NO_DEFAULT_BUTTON, MethodString( nMethodId ) ) );
6669                                 }
6670                                 break;
6671                             case M_GetText :
6672                                 pRet->GenReturn ( RET_Value, aUId, pControl->GetText());
6673                                 break;
6674                             case M_Click:
6675                                 if ( nParams & PARAM_USHORT_1 )
6676                                 {
6677                                     if ( pBD->GetPushButton( nNr1 ) )
6678                                     {
6679                                         if ( nNr1 != BUTTONID_HELP )
6680                                         {
6681                                             SET_WINP_CLOSING(pControl);
6682                                         }
6683                                         pBD->GetPushButton( nNr1 )->Click();
6684                                     }
6685                                     else
6686                                         ReportError( aUId, GEN_RES_STR2( S_NO_DEFAULT_BUTTON, UniString::CreateFromInt32( nNr1 ), MethodString( nMethodId ) ) );
6687                                 }
6688                                 else
6689                                     ReportError( aUId, GEN_RES_STR1( S_BUTTONID_REQUIRED, MethodString( nMethodId ) ) );
6690                                 break;
6691                             case M_GetButtonCount :
6692                                 pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pBD->GetButtonCount()));
6693                                 break;
6694                             case M_GetButtonId :
6695                                 if ( ValueOK(aUId, MethodString( nMethodId ),nNr1,pBD->GetButtonCount()) )
6696                                     pRet->GenReturn ( RET_Value, aUId, comm_ULONG(pBD->GetButtonId(nNr1-1)));
6697                                 break;
6698                             default:
6699                                 ReportError( aUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MessageBox" ) );
6700                                 break;
6701                         }
6702                         break;
6703                     }
6704                 default:
6705                     DBG_ERROR( "Unknown object type from UId or Method not supported" );
6706                     ReportError( aUId, GEN_RES_STR2( S_UNKNOWN_TYPE, UniString::CreateFromInt32( nRT ), MethodString(nMethodId) ) );
6707 #if OSL_DEBUG_LEVEL > 1
6708                     m_pDbgWin->AddText( " Unknown object type from UId or Method not supported" );
6709 #endif
6710                     break;
6711             }
6712         }
6713         for( int i = 0; i < 32; i++ )
6714             SafeReschedule();
6715     }
6716 #if OSL_DEBUG_LEVEL > 1
6717     m_pDbgWin->AddText( "\n" );
6718 #endif
6719     if ( bStatementDone )
6720     {
6721         SendProfile( UIdString( aUId ).Append('.').Append( MethodString( nMethodId ) ) );
6722         delete this;
6723     }
6724     else
6725     {
6726         if ( nRetryCount-- )
6727         {
6728 #if OSL_DEBUG_LEVEL > 1
6729             m_pDbgWin->AddText( CUniString("Reschedule command (requed) (").Append( UniString::CreateFromInt32(nRetryCount) ).AppendAscii(")\n") );
6730 #endif
6731             QueStatement( this );   // will que at the start of the list
6732         }
6733         else
6734         {
6735             bStatementDone=sal_True;
6736         }
6737     }
6738     return bStatementDone;
6739 
6740 #define FINISH_NEXT
6741 #define FINISH_SAME
6742 
6743 }
6744 
6745 /* vim: set noet sw=4 ts=4: */
6746