xref: /AOO41X/main/automation/source/server/recorder.cxx (revision 144e4e6270fa3bc429c7c0bbb90998a8c234dfbf)
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 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_automation.hxx"
26 #include <osl/mutex.hxx>
27 
28 #include <vcl/window.hxx>
29 #include <vcl/vclevent.hxx>
30 #include <vcl/button.hxx>
31 #include <vcl/edit.hxx>
32 #include <vcl/spinfld.hxx>
33 #include <vcl/msgbox.hxx>
34 #include <vcl/toolbox.hxx>
35 #include <vcl/lstbox.hxx>
36 #include <vcl/sound.hxx>
37 #include <vcl/combobox.hxx>
38 #include <vcl/floatwin.hxx>
39 #include <basic/ttstrhlp.hxx>
40 #include "statemnt.hxx"
41 #include "retstrm.hxx"
42 #include "rcontrol.hxx"
43 #include "recorder.hxx"
44 
45 #include <comphelper/uieventslogger.hxx>
46 
47 MacroRecorder* MacroRecorder::pMacroRecorder = NULL;
48 
MacroRecorder()49 MacroRecorder::MacroRecorder()
50 : pLastWin( NULL )
51 , pEditModify( NULL )
52 , pActionParent( NULL )
53 , aKeyUniqueID()
54 , pKeyWin( NULL )
55 , bKeyFollowFocus( sal_False )
56 , m_bRecord( sal_False )
57 , m_bLog( sal_False )
58 {
59     aHookRefresh.SetTimeout( 500 );
60     aHookRefresh.SetTimeoutHdl( LINK( this, MacroRecorder, HookRefreshHdl) );
61     aHookRefresh.Start();
62     aEventListenerHdl = LINK( this, MacroRecorder, EventListener );
63     AddEventHooks();
64 }
65 
~MacroRecorder()66 MacroRecorder::~MacroRecorder()
67 {
68     aHookRefresh.Stop();
69     RemoveEventHooks();
70 }
71 
AddEventHooks()72 void MacroRecorder::AddEventHooks()
73 {
74     Window *pTopLevel = Application::GetFirstTopLevelWindow();
75     while ( pTopLevel )
76     {
77         Window *pParent = pTopLevel;
78         while ( pParent->GetParent() )
79             pParent = pParent->GetParent();
80 
81         pParent->RemoveChildEventListener( aEventListenerHdl );     // might be instrumented already
82         pParent->AddChildEventListener( aEventListenerHdl );
83 
84         pTopLevel = Application::GetNextTopLevelWindow( pTopLevel );
85     }
86 }
87 
RemoveEventHooks()88 void MacroRecorder::RemoveEventHooks()
89 {
90     Window *pTopLevel = Application::GetFirstTopLevelWindow();
91     while ( pTopLevel )
92     {
93         pTopLevel->RemoveChildEventListener( aEventListenerHdl );
94         pTopLevel = Application::GetNextTopLevelWindow( pTopLevel );
95     }
96 }
97 
IMPL_LINK(MacroRecorder,HookRefreshHdl,void *,EMPTYARG)98 IMPL_LINK( MacroRecorder, HookRefreshHdl, void*, EMPTYARG )
99 {
100     AddEventHooks();
101     return 0;
102 }
103 
LogVCL(rtl::OString aParentID,sal_uInt16 nVCLWindowType,rtl::OString aID,String aMethod,sal_uInt16 nParam)104 void MacroRecorder::LogVCL( rtl::OString aParentID, sal_uInt16 nVCLWindowType, rtl::OString aID, String aMethod, sal_uInt16 nParam )
105 {
106     ::comphelper::UiEventsLogger::logVcl( Id2Str( aParentID ), nVCLWindowType, Id2Str( aID ), aMethod, nParam );
107 }
108 
LogVCL(rtl::OString aParentID,sal_uInt16 nVCLWindowType,rtl::OString aID,String aMethod)109 void MacroRecorder::LogVCL( rtl::OString aParentID, sal_uInt16 nVCLWindowType, rtl::OString aID, String aMethod )
110 {
111     ::comphelper::UiEventsLogger::logVcl( Id2Str( aParentID ), nVCLWindowType, Id2Str( aID ), aMethod );
112 }
113 
GetParentWithID(Window * pThis)114 Window* MacroRecorder::GetParentWithID( Window* pThis )
115 {
116     Window *pOverlap = pThis->GetWindow( WINDOW_OVERLAP );
117     while ( pOverlap != pThis && pThis->GetUniqueOrHelpId().isEmpty() && pThis->GET_REAL_PARENT() )
118         pThis = pThis->GET_REAL_PARENT();
119     return pThis;
120 }
121 
GetParentID(Window * pThis)122 rtl::OString MacroRecorder::GetParentID( Window* pThis )
123 {
124     if ( pThis->GetParent() )
125         return pThis->GetParent()->GetUniqueOrHelpId();
126     else
127         return rtl::OString();
128 }
129 
IMPL_LINK(MacroRecorder,EventListener,VclSimpleEvent *,pEvent)130 IMPL_LINK( MacroRecorder, EventListener, VclSimpleEvent*, pEvent )
131 {
132     sal_Bool bSendData = sal_False;
133 
134     if ( pEvent->ISA( VclWindowEvent ) )
135     {
136         VclWindowEvent* pWinEvent = ( VclWindowEvent* ) pEvent;
137         Window* pWin = pWinEvent->GetWindow();
138         sal_uLong nEventID = pWinEvent->GetId();
139 #if OSL_DEBUG_LEVEL > 1
140         if ( nEventID >= 1001 && nEventID != VCLEVENT_WINDOW_KEYUP )
141             nEventID = pWinEvent->GetId();  // Just something to set a breakpoint
142         else
143             return 0;
144 #endif
145 
146 // check for different action after collecting keys
147         // send if there_is_something_to_send
148         // and eather event_is_not_of_interest
149         //     or ( new_window and new_window_is_interesting )    ( ignore interesting events to uninteresting window )
150 
151         if (  aKeyString.Len()
152             && (  ( nEventID != VCLEVENT_WINDOW_KEYINPUT
153                  && nEventID != VCLEVENT_WINDOW_MOUSEMOVE
154                  && nEventID != VCLEVENT_WINDOW_COMMAND
155                  && nEventID != VCLEVENT_WINDOW_KEYUP )
156                 || ( pKeyWin != pWin
157                     && ( pWin->GetType() == WINDOW_CONTROL || pWin->GetType() == WINDOW_WINDOW )
158                    )
159                )
160            )
161         {
162             if ( m_bRecord )
163             {
164                 // we cannot access pKeyWin since it might have dissapeared
165                 if ( bKeyFollowFocus )
166                     StatementList::pRet->GenReturn( RET_MacroRecorder, aKeyUniqueID, (sal_uInt16)M_TypeKeys, aKeyString, bKeyFollowFocus );
167                 else
168                     StatementList::pRet->GenReturn( RET_MacroRecorder, aKeyUniqueID, (sal_uInt16)M_TypeKeys, aKeyString );
169 #if OSL_DEBUG_LEVEL > 1
170                 StatementList::pRet->GenReturn( RET_MacroRecorder, aKeyUniqueID, (sal_uInt16)M_TypeKeys, String::CreateFromInt32( nEventID ) );
171 #endif
172                 bSendData = sal_True;
173             }
174             if ( m_bLog )
175             {
176 //  HACK Too many KeyEvents generated              LogVCL( rtl::OString(), 0, aKeyUniqueID, CUniString("TypeKeys"), aKeyString.Len() );
177             }
178             // cleanup
179             aKeyString.Erase();
180             pKeyWin = NULL;
181             bKeyFollowFocus = sal_False;
182         }
183 
184         switch ( pWin->GetType() )
185         {
186             case WINDOW_TABPAGE:
187                 switch( nEventID )
188                 {
189                     case VCLEVENT_WINDOW_ACTIVATE:
190                         if ( m_bRecord )
191                         {
192                             StatementList::pRet->GenReturn( RET_MacroRecorder, rtl::OString(), (comm_USHORT)(M_SetPage|M_RET_NUM_CONTROL), Id2Str( pWin->GetUniqueOrHelpId() ) );
193                             bSendData = sal_True;
194                         }
195                         if ( m_bLog )
196                         {
197                             LogVCL( rtl::OString(), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("SetPage") );
198                         }
199                         break;
200                 }
201                 break;
202             case WINDOW_RADIOBUTTON:
203             case WINDOW_IMAGERADIOBUTTON:
204                 switch( nEventID )
205                 {
206                     case VCLEVENT_BUTTON_CLICK:  // VCLEVENT_RADIOBUTTON_TOGGLE
207                         {
208                             if ( ((RadioButton*)pWin)->IsChecked() )
209                             {
210                                 if ( m_bRecord )
211                                 {
212                                     StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), (comm_USHORT)M_Check );
213                                     bSendData = sal_True;
214                                 }
215                                 if ( m_bLog )
216                                 {
217                                     LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("Check") );
218                                 }
219                             }
220                         }
221                         break;
222                 }
223                 break;
224             case WINDOW_CHECKBOX:
225             case WINDOW_TRISTATEBOX:
226                 switch( nEventID )
227                 {
228                     case VCLEVENT_BUTTON_CLICK: //VCLEVENT_CHECKBOX_TOGGLE:
229                         {
230                             comm_USHORT nMethod;
231                             String aMethod;
232                             switch ( ((TriStateBox*)pWin)->GetState() )
233                             {
234                                 case STATE_CHECK: nMethod = M_Check; aMethod = CUniString("Check"); break;
235                                 case STATE_NOCHECK: nMethod = M_UnCheck; aMethod = CUniString("UnCheck"); break;
236                                 case STATE_DONTKNOW: nMethod = M_TriState; aMethod = CUniString("TriState"); break;
237                                 default: nMethod = M_Check;
238                                     DBG_ERROR( "Unknown state in TriStateBox::GetState()" );
239                             }
240                             if ( m_bRecord )
241                             {
242                                 StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), nMethod );
243                                 bSendData = sal_True;
244                             }
245                             if ( m_bLog )
246                             {
247                                 LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), aMethod );
248                             }
249                         }
250                         break;
251                 }
252                 break;
253             case WINDOW_EDIT:
254             case WINDOW_MULTILINEEDIT:
255                 switch( nEventID )
256                 {
257                     case VCLEVENT_EDIT_MODIFY:
258                         pEditModify = pWin;
259                         aEditModifyString = ((Edit*)pWin)->GetText();
260                         break;
261                 }
262                 break;
263             case WINDOW_MULTILISTBOX:
264                 switch( nEventID )
265                 {
266                     case VCLEVENT_LISTBOX_SELECT:
267                         Sound::Beep();
268                 }
269             case WINDOW_LISTBOX:
270                 switch( nEventID )
271                 {
272 //                    case VCLEVENT_LISTBOX_DOUBLECLICK:
273                     case VCLEVENT_LISTBOX_SELECT:
274                         if ( m_bRecord )
275                         {
276                             StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), (comm_USHORT)M_Select, comm_ULONG( ((ListBox*)pWin)->GetSelectEntryPos() +1 ) );
277                             bSendData = sal_True;
278                         }
279                         if ( m_bLog )
280                         {
281                             LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("Select"), ((ListBox*)pWin)->GetSelectEntryPos() );
282                         }
283                         break;
284                 }
285                 break;
286             case WINDOW_COMBOBOX:
287             case WINDOW_PATTERNBOX:
288             case WINDOW_NUMERICBOX:
289             case WINDOW_METRICBOX:
290             case WINDOW_CURRENCYBOX:
291             case WINDOW_DATEBOX:
292             case WINDOW_TIMEBOX:
293                 switch( nEventID )
294                 {
295                     case VCLEVENT_EDIT_MODIFY:
296                         pEditModify = pWin;
297                         aEditModifyString = ((Edit*)pWin)->GetText();
298                         break;
299                     case VCLEVENT_COMBOBOX_SELECT:
300                         {
301                             pEditModify = NULL;
302                             aEditModifyString.Erase();
303 
304                             sal_uInt16 nPos = ((ComboBox*)pWin)->GetEntryPos(((ComboBox*)pWin)->GetText());
305                             if ( m_bRecord )
306                             {
307                                 if ( nPos == COMBOBOX_ENTRY_NOTFOUND )
308                                     Sound::Beep();
309                                 else
310                                 {
311                                     StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), (comm_USHORT)M_Select, (comm_ULONG) nPos+1 );
312                                     bSendData = sal_True;
313                                 }
314                             }
315                             if ( m_bLog )
316                             {
317                                 LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("Select"), nPos );
318                             }
319                         }
320                 }
321                 break;
322             case WINDOW_PUSHBUTTON:
323             case WINDOW_OKBUTTON:
324             case WINDOW_CANCELBUTTON:
325             case WINDOW_IMAGEBUTTON:
326             case WINDOW_MOREBUTTON:
327             case WINDOW_HELPBUTTON:
328                 switch( nEventID )
329                 {
330                     case VCLEVENT_BUTTON_CLICK:
331                         Window* pParent = pWin->GetParent();
332                         sal_Bool bDone = sal_False;
333                         if ( pParent->IsDialog() && pWin->GetUniqueOrHelpId().isEmpty() )
334                         {
335                             switch ( pParent->GetType() )
336                             {
337                                 case WINDOW_MESSBOX:
338                                 case WINDOW_INFOBOX:
339                                 case WINDOW_WARNINGBOX:
340                                 case WINDOW_ERRORBOX:
341                                 case WINDOW_QUERYBOX:
342                                 case WINDOW_BUTTONDIALOG:
343                                     {
344                                         comm_USHORT nMethod;
345                                         String aMethod;
346                                         ButtonDialog* pBD = (ButtonDialog*)pParent;
347 
348                                         // we have to find the current Button ID ourselves since it is not generated at this point :-(
349                                         sal_uInt16 nCurrentButtonId = 0xffff;    // Some wild value to wak up people
350                                         sal_uInt16 i;
351                                         for ( i = 0; i < pBD->GetButtonCount() ; i++ )
352                                         {
353                                             if ( pBD->GetPushButton( pBD->GetButtonId(i) ) == pWin )
354                                             {
355                                                 nCurrentButtonId = pBD->GetButtonId(i);
356                                                 break;
357                                             }
358                                         }
359 
360                                         switch ( nCurrentButtonId )
361                                         {
362                                             case BUTTONID_OK: nMethod = M_OK; aMethod = CUniString("OK"); break;
363                                             case BUTTONID_CANCEL: nMethod = M_Cancel; aMethod = CUniString("Cancel"); break;
364                                             case BUTTONID_YES: nMethod = M_Yes; aMethod = CUniString("Yes"); break;
365                                             case BUTTONID_NO: nMethod = M_No; aMethod = CUniString("No"); break;
366                                             case BUTTONID_RETRY: nMethod = M_Repeat; aMethod = CUniString("Repeat"); break;
367                                             case BUTTONID_HELP: nMethod = M_Help; aMethod = CUniString("Help"); break;
368                                             default: nMethod = M_Click; aMethod = CUniString("Click");
369                                         }
370                                         if ( m_bRecord )
371                                         {
372                                             if ( nMethod != M_Click )
373                                                 StatementList::pRet->GenReturn( RET_MacroRecorder, UID_ACTIVE, nMethod );
374                                             else
375                                                 StatementList::pRet->GenReturn( RET_MacroRecorder, UID_ACTIVE, nMethod, (comm_ULONG)nCurrentButtonId );
376                                             bSendData = sal_True;
377                                         }
378                                         if ( m_bLog )
379                                         {
380                                             if ( nMethod != M_Click )
381                                                 LogVCL( rtl::OString(), pWin->GetType(), pWin->GetUniqueOrHelpId(), aMethod );
382                                             else
383                                                 LogVCL( rtl::OString(), pWin->GetType(), pWin->GetUniqueOrHelpId(), aMethod, nCurrentButtonId );
384                                             bDone = sal_True;
385                                         }
386                                     }
387                                     break;
388                                 default:
389                                     {
390                                         comm_USHORT nMethod;
391                                         String aMethod;
392                                         switch ( pWin->GetType() )
393                                         {
394                                             case WINDOW_OKBUTTON: nMethod = M_OK; aMethod = CUniString("OK"); break;
395                                             case WINDOW_CANCELBUTTON: nMethod = M_Cancel; aMethod = CUniString("Cancel"); break;
396                                             case WINDOW_HELPBUTTON: nMethod = M_Help; aMethod = CUniString("Help"); break;
397                                             default: nMethod = M_Default;aMethod = CUniString("Unknown Button");
398                                                 DBG_ERROR( "Unknown Button" );
399                                         }
400                                         if ( m_bRecord )
401                                         {
402                                             StatementList::pRet->GenReturn( RET_MacroRecorder, pParent->GetUniqueOrHelpId(), nMethod );
403                                             bSendData = sal_True;
404                                         }
405                                         if ( m_bLog )
406                                         {
407                                             LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), aMethod );
408                                             bDone = sal_True;
409                                         }
410                                     }
411                                     break;
412                             }
413                         }
414                         if ( m_bRecord )
415                         {
416                             if ( !bSendData && !pWin->GetUniqueOrHelpId().isEmpty() )
417                             {
418                                 StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), (comm_USHORT)M_Click );
419                                 bSendData = sal_True;
420                             }
421                         }
422                         if ( m_bLog )
423                         {
424                             if ( !bDone )
425                                 LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("Click") );
426                         }
427                 }
428                 break;
429 /*          case C_MoreButton:
430                 switch( nEventID )
431                 {
432                     case M_IsOpen :
433                         pRet->GenReturn ( RET_Value, nUId, ((MoreButton*)pControl)->GetState());
434                         break;
435                     case M_Click :
436                         ((MoreButton*)pControl)->Click();
437                         break;
438                     case M_Open :
439                         ((MoreButton*)pControl)->SetState(sal_True);
440                         break;
441                     case M_Close :
442                         ((MoreButton*)pControl)->SetState(sal_False);
443                         break;
444                     default:
445                         ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MoreButton" ) );
446                         break;
447                 }
448                 break;*/
449             case WINDOW_SPINFIELD:
450             case WINDOW_PATTERNFIELD:
451             case WINDOW_NUMERICFIELD:
452             case WINDOW_METRICFIELD:
453             case WINDOW_CURRENCYFIELD:
454             case WINDOW_DATEFIELD:
455             case WINDOW_TIMEFIELD:
456                 switch( nEventID )
457                 {
458                     case VCLEVENT_SPINFIELD_UP:
459                     case VCLEVENT_SPINFIELD_DOWN:
460                     case VCLEVENT_SPINFIELD_FIRST:
461                     case VCLEVENT_SPINFIELD_LAST:
462                         {
463                             pEditModify = NULL;
464                             aEditModifyString.Erase();
465 
466                             comm_USHORT nMethod;
467                             String aMethod;
468                             switch ( nEventID )
469                             {
470                                 case VCLEVENT_SPINFIELD_UP: nMethod = M_More; aMethod = CUniString("More"); break;
471                                 case VCLEVENT_SPINFIELD_DOWN: nMethod = M_Less; aMethod = CUniString("Less"); break;
472                                 case VCLEVENT_SPINFIELD_FIRST: nMethod = M_ToMin; aMethod = CUniString("ToMin"); break;
473                                 case VCLEVENT_SPINFIELD_LAST: nMethod = M_ToMax; aMethod = CUniString("ToMax"); break;
474                                 default: nMethod = M_ToMin; aMethod = CUniString("Unknown");
475                                     DBG_ERROR( "Unknown EventID in Spinfield" );
476                             }
477                             if ( m_bRecord )
478                             {
479                                 StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), nMethod );
480                                 bSendData = sal_True;
481                             }
482                             if ( m_bLog )
483                             {
484                                 LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), aMethod );
485                             }
486                         }
487                         break;
488                     case VCLEVENT_EDIT_MODIFY:
489                         pEditModify = pWin;
490                         aEditModifyString = ((SpinField*)pWin)->GetText();
491                         break;
492                 }
493                 break;
494 
495             case WINDOW_MENUBUTTON:
496                     switch( nEventID )
497                     {
498                     case VCLEVENT_BUTTON_CLICK:
499                         if ( m_bRecord )
500                         {
501                             StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), (comm_USHORT)M_Click );
502                             bSendData = sal_True;
503                         }
504                         if ( m_bLog )
505                         {
506                             LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("Click") );
507                         }
508                         break;
509 /*      Keyevent or Timeout
510                     case M_Open :
511                         {
512                             MouseEvent aMEvnt;
513                             Point aPt( pControl->GetSizePixel().Width() / 2, pControl->GetSizePixel().Height() / 2 );
514                             aMEvnt = MouseEvent( aPt,1,MOUSE_SIMPLECLICK,MOUSE_LEFT );
515                             ImplMouseButtonDown( pControl, aMEvnt );
516 
517                             sal_uLong nStart = Time::GetSystemTicks();
518                             sal_uLong nDelay = pControl->GetSettings().GetMouseSettings().GetActionDelay();
519                             while ( ( Time::GetSystemTicks() - nStart ) < nDelay + 100 )
520                                 SafeReschedule();
521 
522                             ImplMouseButtonUp  ( pControl, aMEvnt );
523                         }
524                         break;*/
525                     }
526                 break;
527             case WINDOW_TOOLBOX:
528                 {
529                     ToolBox *pTB = ((ToolBox*)pWin);
530                     switch( nEventID )
531                     {
532                         case VCLEVENT_TOOLBOX_SELECT:
533                             {   // a Button has been clicked
534                                 // so this cannot be a tearoff or OpenMenu anymore
535                                 pActionParent = NULL;
536                                 // compare to 1 for floating ToolBoxes
537                                 if ( m_bRecord )
538                                 {
539                                     if ( pWin->GetUniqueOrHelpId().isEmpty() /* || pWin->GetUniqueOrHelpId().Matches( 1 ) */ )
540                                         // generate direct Button access
541                                         StatementList::pRet->GenReturn( RET_MacroRecorder, Str2Id( pTB->GetItemCommand( pTB->GetCurItemId() ) ), (comm_USHORT)(M_Click) );
542                                     else
543                                         // access via Toolbox
544                                         StatementList::pRet->GenReturn( RET_MacroRecorder, pTB->GetUniqueOrHelpId(), (comm_USHORT)(M_Click|M_RET_NUM_CONTROL), Id2Str( pTB->GetHelpId( pTB->GetCurItemId() ) ) );
545                                     bSendData = sal_True;
546                                 }
547 /* not needed                               if ( m_bLog )
548                                 {
549                                 }*/
550                             }
551                             break;
552                         case VCLEVENT_TOOLBOX_CLICK:  /// ATTENTION this is called during initialisation of toolbox. whoever 'invented' this
553                             pActionParent = pTB;
554                             break;
555 //                        case VCLEVENT_WINDOW_SHOW:        // not usable ATM. see above
556 //                            if ( pActionParent )
557 //                            {   // a new toolbox opens up, might be a tearoff
558 //                                if ( pActionParent != pWin )
559 //                                {   // it IS a tearoff not an undock
560 //                                    // compare to 1 for floating ToolBoxes
561 //                                  if ( m_bRecord )
562 //                                  {
563 //                                      if ( !pWin->GetSmartUniqueOrHelpId().HasAny() || pWin->GetSmartUniqueOrHelpId().Matches( 1 ) )
564 //                                          // generate direct Button access
565 //                                          StatementList::pRet->GenReturn( RET_MacroRecorder, rtl::OString( pActionParent->GetHelpId( pActionParent->GetCurItemId() ) ), (comm_USHORT)(M_TearOff) );
566 //                                      else
567 //                                          // access via Toolbox
568 //                                          StatementList::pRet->GenReturn( RET_MacroRecorder, pActionParent->GetSmartUniqueOrHelpId(), (comm_USHORT)(M_TearOff|M_RET_NUM_CONTROL), static_cast<comm_ULONG>(pActionParent->GetHelpId( pActionParent->GetCurItemId() )) ); // GetHelpId() sal_uLong != comm_ULONG on 64bit
569 //                                      bSendData = sal_True;
570 //                                  }
571 //                                    if ( m_bLog )
572 //                                    {
573 //                                        LogVCL( pActionParent->GetSmartUniqueOrHelpId(), pWin->GetType(), pActionParent->GetHelpId( pActionParent->GetCurItemId() ), CUniString("TearOff") );
574 //                                    }
575 //                                }
576 //                                pActionParent = NULL;
577 //                            }
578 //                            break;
579                         case VCLEVENT_TOOLBOX_DEACTIVATE:
580                             pActionParent = NULL;
581                             break;
582                     }
583                 }
584                 break;
585 /*                  ToolBox *pTB = ((ToolBox*)pControl);
586                     if ( pTB->GetUniqueOrHelpId() != nUId ) // Also Button auf der ToolBox gefunden
587                     {
588                         if ( nParams == PARAM_NONE )
589                         {           // Wir f�lschen einen Parameter
590                             nParams = PARAM_USHORT_1;
591                             nNr1 = nUId;
592                         }
593                         else
594                             ReportError( nUId, GEN_RES_STR1( S_INTERNAL_ERROR, MethodString( nMethodId ) ) );
595                     }
596 
597 #define FIND_HELP\
598 {\
599     if( nParams == PARAM_USHORT_1 )\
600         nLNr1 = nNr1;\
601     for ( nNr1 = 0; nNr1 < pTB->GetItemCount() && nLNr1 != pTB->GetHelpId(pTB->GetItemId(nNr1)) ; nNr1++ ) {}\
602     bBool1 = nLNr1 == pTB->GetHelpId(pTB->GetItemId(nNr1));\
603     if ( !bBool1 )\
604         ReportError( nUId, GEN_RES_STR1( S_HELPID_ON_TOOLBOX_NOT_FOUND, MethodString( nMethodId ) ) );\
605     else\
606     {\
607         if ( !pTB->IsItemEnabled( pTB->GetItemId(nNr1) ) && nMethodId != _M_IsEnabled )\
608         {\
609             ReportError( nUId, GEN_RES_STR1( S_BUTTON_DISABLED_ON_TOOLBOX, MethodString( nMethodId ) ) );\
610             bBool1 = sal_False;\
611         }\
612         else if ( !pTB->IsItemVisible( pTB->GetItemId(nNr1) ) )\
613         {\
614             ReportError( nUId, GEN_RES_STR1( S_BUTTON_HIDDEN_ON_TOOLBOX, MethodString( nMethodId ) ) );\
615             bBool1 = sal_False;\
616         }\
617         else\
618         {\
619             if ( pTB->GetItemRect(pTB->GetItemId(nNr1)).IsEmpty() )\
620             {\
621                 sal_uInt16 nLine = pTB->GetCurLine();\
622                 do\
623                 {\
624                     pTB->ShowLine( sal_False );\
625                     for ( int i = 1 ; i < 30 ; i++ )\
626                         SafeReschedule();\
627                 }\
628                 while ( pTB->GetCurLine() != nLine && pTB->GetItemRect(pTB->GetItemId(nNr1)).IsEmpty() );\
629                 pTB->Invalidate( pTB->GetScrollRect() );\
630             }\
631             if ( pTB->GetItemRect(pTB->GetItemId(nNr1)).IsEmpty() )\
632             {\
633                 ReportError( nUId, GEN_RES_STR1( S_CANNOT_MAKE_BUTTON_VISIBLE_IN_TOOLBOX, MethodString( nMethodId ) ) );\
634                 bBool1 = sal_False;\
635             }\
636         }\
637     }\
638 }\
639 
640                     switch( nEventID )
641                     {
642                         case M_SetNextToolBox :
643                             if ( (nParams & PARAM_STR_1) )
644                                 pTB->SetNextToolBox( aString1 );
645                             else
646                                 pTB->SetNextToolBox( pTB->GetNextToolBox() );
647                             pTB->NextToolBox();
648                             break;
649                         case M_GetNextToolBox :
650                             pRet->GenReturn ( RET_Value, nUId, (String)pTB->GetNextToolBox());
651                             break;
652                         default:
653                             ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "ToolBox" ) );
654                             break;
655                     }
656                 }
657                 break;
658 */
659             case WINDOW_CONTROL:
660             case WINDOW_WINDOW:
661                 switch( nEventID )
662                 {
663                     case VCLEVENT_WINDOW_COMMAND:
664                         break;
665                     case VCLEVENT_WINDOW_KEYINPUT:
666                         {
667                             const KeyEvent *pKeyEvent = ((KeyEvent*)pWinEvent->GetData());
668                             const KeyCode aKeyCode = pKeyEvent->GetKeyCode();
669                             if ( pKeyEvent )
670                             {
671                                 pKeyWin = pWin;
672                                 Window *pIdWin = GetParentWithID( pWin );
673                                 if ( pIdWin != pWin )
674                                    bKeyFollowFocus = sal_True;
675                                 aKeyUniqueID = pIdWin->GetUniqueOrHelpId();
676                                 if ( m_bLog )
677                                 {
678 //   HACK Too many KeyEvents generated                                 if ( aKeyString.Len() == 0 )
679 //   HACK Too many KeyEvents generated                                     LogVCL( rtl::OString(), 0, aKeyUniqueID, CUniString("TypeKeysStart") );
680                                 }
681                                 if ( ( !aKeyCode.IsMod1() && !aKeyCode.IsMod2() ) &&
682                                       (( aKeyCode.GetGroup() == KEYGROUP_NUM)   ||
683                                        ( aKeyCode.GetGroup() == KEYGROUP_ALPHA) ||
684                                        ( aKeyCode.GetCode() == KEY_SPACE) ||
685                                        ( aKeyCode.GetCode() == KEY_ADD) ||
686                                        ( aKeyCode.GetCode() == KEY_SUBTRACT) ||
687                                        ( aKeyCode.GetCode() == KEY_MULTIPLY) ||
688                                        ( aKeyCode.GetCode() == KEY_DIVIDE) ||
689                                        ( aKeyCode.GetCode() == KEY_POINT) ||
690                                        ( aKeyCode.GetCode() == KEY_COMMA) ||
691                                        ( aKeyCode.GetCode() == KEY_EQUAL) ||
692                                        ( aKeyCode.GetCode() == 0) ) )
693                                 {
694                                     DBG_ASSERT( pKeyEvent->GetCharCode(), "no charcode found" );
695                                     aKeyString += pKeyEvent->GetCharCode();
696                                 }
697                                 else
698                                 {   // not a regular key, transfer KeyCode
699                                     aKeyString += sal_Unicode(1);   // mask it
700                                     // extra for '>' which is coded as <SHIFT GREATER>
701                                     if ( pKeyEvent->GetCharCode() == '>' )
702                                         aKeyString += sal_Unicode( KEY_GREATER | (aKeyCode.GetAllModifier() & ~KEY_SHIFT) );
703                                     else
704                                         aKeyString += sal_Unicode( aKeyCode.GetCode() | aKeyCode.GetAllModifier() );
705                                 }
706                             }
707                         }
708                         break;
709 
710                     case VCLEVENT_WINDOW_MOUSEMOVE:
711                     case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
712                     case VCLEVENT_WINDOW_MOUSEBUTTONUP:
713                         {
714                         }
715                         break;
716 
717 
718                 }
719                 break;
720             case WINDOW_DOCKINGWINDOW:
721 //                switch( nEventID )
722                 {
723 //                  case 1 .. 0xffff:
724     DBG_TRACE3( "TT_VCLMessage %u %u  %X",nEventID, pWin->GetType(), pWin );
725 //                      sal_Bool bx = ((DockingWindow*)pWin)->IsFloatingMode();
726 //                      break;
727 /*                  case M_Dock :
728                         if ( ((DockingWindow*)pControl)->IsFloatingMode() )
729                             ((DockingWindow*)pControl)->SetFloatingMode(sal_False);
730                         else
731                             ReportError( nUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_FLOATING_MODE, MethodString( nMethodId ) ) );
732                         break;
733                     case M_Undock :
734                         if ( !((DockingWindow*)pControl)->IsFloatingMode() )
735                             ((DockingWindow*)pControl)->SetFloatingMode(sal_True);
736                         else
737                             ReportError( nUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_FLOATING_MODE, MethodString( nMethodId ) ) );
738                         break;
739                     case M_IsDocked :
740                         pRet->GenReturn ( RET_Value, nUId, (comm_BOOL) !((DockingWindow*)pControl)->IsFloatingMode());
741                         break;
742                     case M_Close:
743                             //nWindowWaitUId = nUId;
744                         DBG_ASSERT( nUId == pControl->GetUniqueOrHelpId(), "nUID != UniqueOrHelpId");
745                         SET_WINP_CLOSING(pControl);
746                         ((DockingWindow*)pControl)->Close();
747                         break;
748                     case M_Size:
749                     case M_Move:
750                     case M_IsMax :
751                     case M_Minimize :
752                     case M_Maximize :
753                         if ( ((DockingWindow*)pControl)->IsFloatingMode() )
754                         {
755                             pControl = ((DockingWindow*)pControl)->GetFloatingWindow();
756                             goto FloatWin;
757                         }
758                         else
759                             ReportError( nUId, GEN_RES_STR1( S_ALLOWED_ONLY_IN_DOCKING_MODE, MethodString( nMethodId ) ) );
760                         break;
761                     case M_Help:        // Alles was unten weiterbehandelt werden soll
762                         goto MoreDialog;
763 
764                     default:
765                         ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "DockingWindow" ) );
766                         break;*/
767                 }
768                 break;
769 
770 
771 
772 
773 
774 
775             case WINDOW_FLOATINGWINDOW:
776                 {
777     DBG_TRACE3( "TT_VCLMessage %u %u  %X",nEventID, pWin->GetType(), pWin );
778 //                    FloatingWindow *pFW = ((FloatingWindow*)pWin);
779 /*                  switch( nEventID )
780                     {
781 
782 // M_OpenMenu an einem ToolboxButton
783                         case VCLEVENT_WINDOW_SHOW:
784                             if ( pActionParent )
785                             {   // a new FloatingWindow opens up, so we assume an OpenMenu
786                                 // compare to 1 for floating ToolBoxes
787                                 if ( ( pActionParent->GetUniqueOrHelpId() == 0 || pActionParent->GetUniqueOrHelpId() == 1 ) )
788                                     // generate direct Button access
789                                     StatementList::pRet->GenReturn( RET_MacroRecorder, pActionParent->GetHelpId( pActionParent->GetCurItemId() ), (comm_USHORT)(M_OpenMenu) );
790                                 else
791                                     // access via Toolbox
792                                     StatementList::pRet->GenReturn( RET_MacroRecorder, pActionParent->GetUniqueOrHelpId(), (comm_USHORT)(M_OpenMenu|M_RET_NUM_CONTROL), pActionParent->GetHelpId( pActionParent->GetCurItemId() ) );
793                                 bSendData = sal_True;
794                             }
795                             break;
796 
797                     }
798   */              }
799                 break;
800 /*
801                     case M_AnimateMouse :
802                         AnimateMouse( pControl, MitteOben);
803                         break;
804                     case M_IsMax :
805                         pRet->GenReturn ( RET_Value, nUId, (comm_BOOL)!((FloatingWindow*)pControl)->IsRollUp());
806                         break;
807                     case M_Minimize :
808                         ((FloatingWindow*)pControl)->RollUp();
809                         break;
810                     case M_Maximize :
811                         ((FloatingWindow*)pControl)->RollDown();
812                         break;
813                     case M_Size:
814                     {
815                         if ( pControl->GetStyle() & WB_SIZEABLE )
816                         {
817                             pControl->SetSizePixel(Size(nNr1,nNr2));
818                             pControl->Resize();
819                         }
820                         else
821                             ReportError( nUId, GEN_RES_STR1( S_SIZE_NOT_CHANGEABLE, MethodString( nMethodId ) ) );
822                         break;
823                     }
824                     case M_Close:
825                         DBG_ASSERT( nUId == pControl->GetUniqueOrHelpId(), "nUID != UniqueOrHelpId");
826                         SET_WINP_CLOSING(pControl);
827                         ((FloatingWindow*)pControl)->Close();
828                         break;
829                     case M_Help:        // Alles was unten weiterbehandelt werden soll
830                     case M_Move:
831                         goto MoreDialog;
832                     default:
833                         ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "FloatingWin" ) );
834                         break;
835                 }
836                 break;*/
837 
838 
839 
840 
841 
842 
843 
844 
845 /*
846             case C_ModelessDlg:
847             case C_Dlg:
848             case C_TabDlg:
849                 MoreDialog:
850                 switch( nEventID )
851                 {
852 
853                     // (Rect GetRect)
854 
855                     case M_AnimateMouse :
856                         AnimateMouse( pControl, MitteOben);
857                         break;
858                     case M_Close:
859                         DBG_ASSERT( nUId == pControl->GetUniqueOrHelpId(), "nUID != UniqueOrHelpId");
860                         SET_WINP_CLOSING(pControl);
861                         ((SystemWindow*)pControl)->Close();
862                         break;
863                     case M_Move:
864                     {
865                         pControl->SetPosPixel(Point(nNr1,nNr2));
866                         break;
867                     }
868                     default:
869                         ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "Dialog" ) );
870                         break;
871                 }
872                 break;*/
873 
874 
875 
876 
877 
878 
879 
880 
881 
882 
883 
884 
885 
886 /*
887             case C_WorkWin:
888                 switch( nEventID )
889                 {
890                     case M_Close:
891                         DBG_ASSERT( nUId == pControl->GetUniqueOrHelpId(), "nUID != UniqueOrHelpId");
892                         SET_WINP_CLOSING(pControl);
893                         ((WorkWindow*)pControl)->Close();
894                         break;
895                     case M_Size:
896                     case M_Move:
897                         goto FloatWin;
898                         break;
899                     case M_Help:        // Alles was unten weiterbehandelt werden soll
900                         goto MoreDialog;
901                     default:
902                         ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "WorkWindow" ) );
903                         break;
904                 }
905                 break;
906   */
907 
908 
909 /*          case C_TabPage:
910                 switch( nEventID )
911                 {
912                 }
913                 break;*/
914 
915 
916 
917 
918 
919 
920 
921 
922 
923 
924 
925 
926 
927 /*
928             case C_MessBox:
929             case C_InfoBox:
930             case C_WarningBox:
931             case C_ErrorBox:
932             case C_QueryBox:
933                 {
934                     sal_Bool bDone = sal_True;
935                     MessBox* pMB = (MessBox*)pControl;
936                     switch( nEventID )
937                     {
938                         case M_GetCheckBoxText:
939                             pRet->GenReturn ( RET_Value, nUId, pMB->GetCheckBoxText() );
940                             break;
941                         case M_IsChecked :
942                             pRet->GenReturn ( RET_Value, nUId, comm_BOOL( pMB->GetCheckBoxState() == STATE_CHECK) );
943                             break;
944                         case M_GetState :
945                             pRet->GenReturn ( RET_Value, nUId, comm_ULONG( pMB->GetCheckBoxState() ));
946                             break;
947                         case M_Check :
948                             pMB->SetCheckBoxState( STATE_CHECK );
949                             break;
950                         case M_UnCheck :
951                             pMB->SetCheckBoxState( STATE_NOCHECK );
952                             break;
953                         case M_GetText :
954                             pRet->GenReturn ( RET_Value, nUId, pMB->GetMessText());
955                             break;
956 
957                         default:
958                             bDone = sal_False;
959                             break;
960                     }
961                     if ( bDone )
962                         break;  // break the case here else continue at C_ButtonDialog
963                 }
964             case C_ButtonDialog:
965                 {
966                     ButtonDialog* pBD = (ButtonDialog*)pControl;
967 #if OSL_DEBUG_LEVEL > 1
968                     m_pDbgWin->AddText( "Working MessBox: " );
969                     if (pControl->IsVisible())
970                         m_pDbgWin->AddText("*(Visible)\n");
971                     else
972                         m_pDbgWin->AddText("*(nicht Visible)\n");
973 #endif
974                     switch( nEventID )
975                     {
976                         case M_GetText :
977                             pRet->GenReturn ( RET_Value, nUId, pControl->GetText());
978                             break;
979                         case M_Click:
980                             if ( nParams & PARAM_USHORT_1 )
981                             {
982                                 if ( pBD->GetPushButton( nNr1 ) )
983                                 {
984                                     if ( nNr1 != BUTTONID_HELP )
985                                     {
986                                         SET_WINP_CLOSING(pControl);
987                                     }
988                                     pBD->GetPushButton( nNr1 )->Click();
989                                 }
990                                 else
991                                     ReportError( nUId, GEN_RES_STR2( S_NO_DEFAULT_BUTTON, UniString::CreateFromInt32( nNr1 ), MethodString( nMethodId ) ) );
992                             }
993                             else
994                                 ReportError( nUId, GEN_RES_STR1( S_BUTTONID_REQUIRED, MethodString( nMethodId ) ) );
995                             break;
996                         case M_GetButtonCount :
997                             pRet->GenReturn ( RET_Value, nUId, comm_ULONG(pBD->GetButtonCount()));
998                             break;
999                         case M_GetButtonId :
1000                             if ( ValueOK(nUId, MethodString( nMethodId ),nNr1,pBD->GetButtonCount()) )
1001                                 pRet->GenReturn ( RET_Value, nUId, comm_ULONG(pBD->GetButtonId(nNr1-1)));
1002                             break;
1003                         default:
1004                             ReportError( nUId, GEN_RES_STR2c2( S_UNKNOWN_METHOD, MethodString(nMethodId), "MessageBox" ) );
1005                             break;
1006                     }
1007                     break;
1008 
1009 
1010                  */
1011 
1012 
1013         }
1014 
1015 
1016         switch( nEventID )
1017         {
1018             case VCLEVENT_CONTROL_LOSEFOCUS:
1019                 if ( pEditModify == pWin )
1020                 {
1021                     if ( m_bRecord )
1022                     {
1023                         StatementList::pRet->GenReturn( RET_MacroRecorder, pWin->GetUniqueOrHelpId(), M_SetText, aEditModifyString );
1024                         bSendData = sal_True;
1025                     }
1026                     if ( m_bLog )
1027                     {
1028                         LogVCL( GetParentID( pWin ), pWin->GetType(), pWin->GetUniqueOrHelpId(), CUniString("Modify") );
1029                     }
1030                     pEditModify = NULL;
1031                     aEditModifyString.Erase();  //could be somewhat lengthy
1032                 }
1033                 break;
1034         }
1035 
1036         pLastWin = pWin;
1037 
1038     }  // if
1039     else if ( pEvent->ISA( VclMenuEvent ) )
1040     {
1041 //        VclMenuEvent* pMenuEvent = ( VclMenuEvent* ) pEvent;
1042     }
1043 
1044 
1045     if ( bSendData )
1046         new StatementFlow( NULL, F_EndCommandBlock );   // Kommando zum Senden erzeugen und in que eintragen
1047 
1048     return 0;
1049 }
1050 
1051 
1052 
getRecorderMutex()1053 static ::osl::Mutex * getRecorderMutex()
1054 {
1055     static ::osl::Mutex * pMutex  = NULL;
1056     if(pMutex==NULL)
1057     {
1058         ::osl::MutexGuard aGuard(::osl::Mutex::getGlobalMutex());
1059         if(pMutex==NULL)
1060             pMutex = new ::osl::Mutex();
1061     }
1062     return pMutex;
1063 }
1064 
1065 
CheckDelete()1066 void MacroRecorder::CheckDelete()
1067 {
1068     ::osl::MutexGuard aGuard( getRecorderMutex() );
1069     if ( !m_bRecord && !m_bLog )
1070     {
1071         pMacroRecorder = NULL;
1072         delete this;
1073     }
1074 }
1075 
1076 
GetMacroRecorder()1077 MacroRecorder* MacroRecorder::GetMacroRecorder()
1078 {
1079     ::osl::MutexGuard aGuard( getRecorderMutex() );
1080     if ( !pMacroRecorder )
1081         pMacroRecorder = new MacroRecorder;
1082 
1083     return pMacroRecorder;
1084 }
1085 
HasMacroRecorder()1086 sal_Bool MacroRecorder::HasMacroRecorder()
1087 {
1088     ::osl::MutexGuard aGuard( getRecorderMutex() );
1089     return pMacroRecorder != NULL;
1090 }
1091 
1092