xref: /AOO41X/main/automation/source/server/statemnt.hxx (revision 3398c5b8f929d4a01ef3102fbe10159ddc9a897b)
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 **
25 **       Von StatementList werden alle Statements abgeleitet.
26 **   Es gibt immer nur eine Statementliste, die verpointert ist.
27 **       jederzeit kann das der Anfang der Kette abgefragt werden.
28 **
29 **
30 **
31 **
32 **
33 **
34 **
35 ***************************************************************************/
36 #ifndef _STATEMNT_HXX
37 #define _STATEMNT_HXX
38 
39 #include <tools/wintypes.hxx>
40 #include <tools/string.hxx>
41 #include <tools/debug.hxx>
42 #include <tools/time.hxx>
43 #ifndef _SV_DRAG_HXX //autogen
44 //#include <vcl/drag.hxx>
45 #endif
46 #include <vcl/menu.hxx>
47 #include <vcl/svapp.hxx>
48 #include <tools/fsys.hxx>
49 #include <sot/storage.hxx>
50 #include <basic/sbstar.hxx>
51 #include <vcl/event.hxx>
52 #include <com/sun/star/beans/PropertyValue.hpp>
53 #include <automation/commtypes.hxx>
54 
55 class Window;
56 class SystemWindow;
57 class Point;
58 class SfxPoolItem;
59 
60 class ScrollBar;
61 
62 class SCmdStream;
63 class RetStream;
64 class ImplRemoteControl;
65 
66 class TTProfiler;
67 class TTProperties;
68 
69 class Dir;
70 
71 class CommunicationLink;
72 
73 #if OSL_DEBUG_LEVEL > 1
74 class EditWindow;
75 #endif
76 
77 #ifdef __cplusplus
78 extern "C"
79 {
80 #endif
81     void SAL_CALL osl_TestToolDebugPrint( const sal_Char *pString );
82 #ifdef __cplusplus
83 }
84 #endif
85 
86 
87 #define IsVisible IsReallyVisible
88 #define GET_REAL_PARENT() GetWindow( WINDOW_REALPARENT )
89 
90 // switch behaviour of ImplMouse* and ImplKeyInput
91 #define FORCE_DIRECT_CALL   sal_True
92 
93 typedef sal_uInt16 SearchFlags;
94 #define SEARCH_NOOVERLAP            ((SearchFlags) 0x0001)
95 #define SEARCH_NO_TOPLEVEL_WIN      ((SearchFlags) 0x0002)
96 #define SEARCH_FOCUS_FIRST          ((SearchFlags) 0x0004)
97 #define SEARCH_FIND_DISABLED        ((SearchFlags) 0x0008)
98 
99 class Search
100 {
101     SearchFlags nmSearchFlags;
102 public:
Search(SearchFlags nSearchFlags=0)103     Search( SearchFlags nSearchFlags = 0): nmSearchFlags(nSearchFlags) {}
~Search()104     virtual ~Search() {}
105 
106     virtual sal_Bool IsWinOK( Window *pWin ) = 0;
GetSearchFlags()107     SearchFlags GetSearchFlags() { return nmSearchFlags; }
AddSearchFlags(SearchFlags aNewFlags)108     void AddSearchFlags( SearchFlags aNewFlags ) { nmSearchFlags |= aNewFlags; }
RemoveSearchFlags(SearchFlags aRemoveFlags)109     void RemoveSearchFlags( SearchFlags aRemoveFlags ) { nmSearchFlags &= ( ~aRemoveFlags ); }
HasSearchFlag(SearchFlags aQueryFlag)110     sal_Bool HasSearchFlag( SearchFlags aQueryFlag ) { return (nmSearchFlags & aQueryFlag) == aQueryFlag; }
111 };
112 
113 sal_Bool IsDialog(Window *pWin);        // Ist *pWin von SystemWindow abgeleitet (Kann es Active sein)
114 sal_Bool IsAccessable(Window *pWin);    // Ist *pWin Zugreifbar (�ber IsEnabled und Parents gepr�ft)
115 
116 
117 //class SafePointer : CriticalSection
118 class SafePointer
119 {
120     SafePointer *pSelf;
121 public:
SafePointer()122     SafePointer()   { pSelf = this; }
~SafePointer()123     virtual ~SafePointer()  { DBG_ASSERT(pSelf==this,"Destructor von Nicht existierendem Objekt aufgerufen");
124                               pSelf = NULL; }
125 //  static sal_Bool IsValid( SafePointer *pThis ) { return pThis == pThis->pSelf; }
126 // virtual      operator -> (); { DBG_ASSERT(pMyself == this,"-> von Nicht existierendem Objekt aufgerufen"); }
127 };
128 
129 
130 class DisplayHidWin;
131 class StatementCommand;
132 class TranslateWin;
133 
134 struct TTSettings
135 {
136     // DisplayHID
137     StatementCommand *pDisplayInstance;
138     DisplayHidWin *pDisplayHidWin;
139     Window *Old;
140     Window *Act;
141     String aOriginalCaption;
142 
143     // Translate
144     TranslateWin *pTranslateWin;
145     sal_Bool bToTop;
146 };
147 
148 
149 TTSettings* GetTTSettings();
150 
151 
152 #define MAX_RETRIES 9
153 class StatementList : public SafePointer
154 {
155 private:
156     StatementList(const StatementList&);
157     StatementList & operator=(const StatementList&);
158 
159 protected:
160     StatementList();
161     sal_uInt16 nRetryCount;
162     void QueStatement(StatementList *pAfterThis);
163     sal_Bool bStatementInQue;
164     static sal_uInt16 nUseBindings;
165 
166     static TTProfiler *pProfiler;
167     void InitProfile();
168     void SendProfile( String aText );
169     static StatementList *pCurrentProfileStatement;
170 
171     static sal_Bool bIsInReschedule;
172         static sal_uInt16 nModalCount;
173     static Window *pLastFocusWindow;        // Wenn dieses sich �ndert wird Safe Reschedule abgebrochen
174     static sal_Bool bWasDragManager;            // Wenn dieses sich �ndert wird Safe Reschedule abgebrochen
175     static sal_Bool bWasPopupMenu;              // Wenn dieses sich �ndert wird Safe Reschedule abgebrochen
176     static sal_Bool bBasicWasRunning;
177 
178     static sal_uInt16 nMinTypeKeysDelay;                /// Verz�gerung der einzelnen Anschl�ge f�r TypeKeys
179     static sal_uInt16 nMaxTypeKeysDelay;
180     static sal_Bool bDoTypeKeysDelay;
181 
182     static Window* pFirstDocFrame;
183 
184     static sal_Bool bIsSlotInExecute;
185 
186 public:
IsInReschedule()187     static sal_Bool IsInReschedule() { return bIsInReschedule; }
SafeReschedule(sal_Bool bYield=sal_False)188     void SafeReschedule( sal_Bool bYield = sal_False )  // Setzt Flag, so da� nicht schon der n�chste Befehl ausgef�hrt wird
189     {
190         nModalCount = Application::GetModalModeCount();
191         bIsInReschedule = sal_True;
192         pLastFocusWindow = GetpApp()->GetFocusWindow();
193         bWasDragManager = false /*!= DragManager::GetDragManager()*/;
194         bWasPopupMenu = NULL != PopupMenu::GetActivePopupMenu();
195         bBasicWasRunning = StarBASIC::IsRunning();
196         bWasExecuting = bExecuting;
197         if ( bYield )
198             GetpApp()->Yield();
199         else
200             GetpApp()->Reschedule();
201         bExecuting = bWasExecuting;
202         bBasicWasRunning = sal_False;
203         bWasPopupMenu = sal_False;
204         bWasDragManager = sal_False;
205         pLastFocusWindow = NULL;
206         bIsInReschedule = sal_False;
207         nModalCount = 0;
208     }
MaybeResetSafeReschedule()209     static sal_Bool MaybeResetSafeReschedule()
210     {       // Implementierung mu� hier zwar nicht sein, ist aber �bersichtlicher so
211         if ( !bIsInReschedule )
212             return sal_False;
213 
214         if ( pLastFocusWindow != GetpApp()->GetFocusWindow()
215             || ( Application::GetModalModeCount() > nModalCount )
216 //          || ( DragManager::GetDragManager() && !bWasDragManager )
217             || ( PopupMenu::GetActivePopupMenu() && !bWasPopupMenu )
218             || ( StarBASIC::IsRunning() && !bBasicWasRunning ) )
219         {
220             bIsInReschedule = sal_False;
221             pLastFocusWindow = NULL;
222             return sal_True;
223         }
224         else
225             return sal_False;
226     }
NormalReschedule()227     static void NormalReschedule()  // Setzt das flag nicht
228     {
229         GetpApp()->Reschedule();
230     }
231 #define Reschedule RescheduleNichtBenutzen_StattdessenSafeRescheduleAnStatementList
232 
233     static Window* GetMouseWin();
234     static sal_Bool WinPtrValid(Window *pTest);
235     static Window* SearchAllWin( Window *pBase, Search &aSearch, sal_Bool MaybeBase = sal_True );
236 protected:
237     static Window* SearchClientWin( Window *pBase, Search &aSearch, sal_Bool MaybeBase = sal_True );
238 
239     Window* SearchTree( rtl::OString aUId, sal_Bool bSearchButtonOnToolbox = sal_False );
240     Window* GetActive( WindowType nRT, sal_Bool MaybeBase = sal_True );
241     Window* GetFocus( WindowType nRT, sal_Bool MaybeBase = sal_True );
242     Window* GetAnyActive( sal_Bool MaybeBase = sal_True );
243     ScrollBar* GetScrollBar( Window *pBase, sal_uInt16 nDirection, sal_Bool MaybeBase = sal_True );
244     Window* GetPopupFloatingWin( sal_Bool MaybeBase = sal_True );
245     Menu* GetMatchingMenu( Window* pWin, Menu* pBaseMenu = NULL );
246     Window* GetWinByRT( Window *pBase, WindowType nRT, sal_Bool MaybeBase = sal_True, sal_uInt16 nSkip = 0, sal_Bool bSearchAll = sal_False );
247     sal_uInt16 CountWinByRT( Window *pBase, WindowType nRT, sal_Bool MaybeBase = sal_True );
248     Window* GetDocWin( sal_uInt16 nNr );
249     sal_uInt16 GetDocWinCount();
250     Window* GetFadeSplitWin( Window *pBase, WindowAlign nAlign, sal_Bool MaybeBase = sal_True );
251     sal_Bool ValueOK(rtl::OString nId, String aBezeichnung, sal_uLong nValue, sal_uLong nMax);
252 
253     sal_uInt16 GetCurrentMenues( PopupMenu *&pPopup, MenuBar *&pMenuBar, Menu *&pMenu );
254 
255 public:
256 //  void AddStatement( StatementList *pNewStatement );
257 
258     virtual ~StatementList();
259     void Advance();
260     virtual sal_Bool Execute() = 0;
261 /***************************************************************************
262 ** Bestimmt erst den n�chsten Befehl, setzt Current
263 ** und f�hrt dann aus.
264 ** Returnwert gibt an, ob Befehl nochmal ausgef�hrt
265 ** werden soll. Dann mu� auch der UserEvent verlassen werden, um der Applikation
266 ** normales Arbeiten zu erm�glichen (Dialog schliessen)
267 ** sal_True bedeutet, dass alles klar gegangen ist
268 ** sal_False bedeutet nochmal Bitte
269 ***************************************************************************/
270 
271     void ReportError(String aMessage);
272     void ReportError(rtl::OString aUId, String aMessage);
273     void ReportError(String aMessage, sal_uLong nWhatever);
274 
275     static void DirectLog( sal_uLong nType, String aString );
276 
277     String Tree(Window *pBase, int Indent);
278     String ClientTree(Window *pBase, int Indent);
279 
280     StatementList *pNext;
281     static StatementList /**pCurrent,*/ *pFirst;
282     static sal_Bool bReadingCommands;
283     static rtl::OString aWindowWaitUId;
284     static Window *pWindowWaitPointer;
285     static rtl::OString aWindowWaitOldHelpId;
286     static rtl::OString aWindowWaitOldUniqueId;
287     static RetStream *pRet;
288     static sal_Bool IsError;
289     static sal_Bool bDying;
290     static sal_Bool bExecuting;             // Gesetzt, wenn ein Befehl rescheduled ohne einen neuen Befehl zu erlauben
291     sal_Bool bWasExecuting;                 // Wurde bei einem MaybeResetSafeReschedule resettet, so wird der Zustand danach wiederhergestellt
292     static sal_uInt16 aSubMenuId1;          // Untermen�s bei PopupMenus
293     static sal_uInt16 aSubMenuId2;          // erstmal 2-Stufig
294     static sal_uInt16 aSubMenuId3;          // and now even 3 levels #i31512#
295     static SystemWindow *pMenuWindow;   // when using MenuBar as base for MenuCommands
296     static TTProperties *pTTProperties; // Hier stehen die SlotIDs aus dem SFX drin
297 
298     sal_Bool CheckWindowWait();         //True heisst, dass Window noch existiert
299                                     //False -> Window weg;
300     static void SetFirstDocFrame( Window* pWin );
301     static Window* GetFirstDocFrame();
302     static sal_Bool IsFirstDocFrame( Window* pWin );
303     static sal_Bool IsDocWin( Window* pWin );
304     static sal_Bool IsIMEWin( Window* pWin );    // Input Window for CJK under Solaris
305     static sal_Bool IsDocFrame( Window* pWin );
306     static MenuBar* GetDocFrameMenuBar( Window* pWin );
307     static sal_uInt16 GetDocFrameCount();
308 
309     static sal_Bool bCatchGPF;
310 
311     static sal_Bool bUsePostEvents;         // use Application::Post*Event or own impl to handle key and mouseevents
312 
313 #if OSL_DEBUG_LEVEL > 1
314     static EditWindow *m_pDbgWin;
315 #endif
316 };
317 
318 class StatementSlot : public StatementList  //Slots aufrufen
319 {
320 protected:
321     sal_uInt16 nAnzahl;
322     SfxPoolItem **pItemArr;
323     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue> aArgs;
324     sal_uInt16 nFunctionId;     // can get removed when the old (numeric) slothandling is removed
325     String aUnoUrl;
326     sal_Bool bMenuClosed;
327 
328     StatementSlot();
329     void AddReferer();
330 public:
331     StatementSlot( SCmdStream *pIn );
332     StatementSlot( sal_uLong nSlot, SfxPoolItem* pItem = NULL );
333     virtual ~StatementSlot();
334     virtual sal_Bool Execute();
335 };
336 
337 class StatementUnoSlot : public StatementSlot   //Uno Slots aufrufen
338 {
339 public:
340     StatementUnoSlot(SCmdStream *pIn);
341 };
342 
343 class StatementCommand : public StatementList   // Befehl ausf�hren (wintree, resetaplication ...)
344 {
345     friend class ImplRemoteControl;
346 protected:
347     sal_uInt16 nMethodId;
348     sal_uInt16 nParams;
349     comm_USHORT nNr1,nNr2,nNr3,nNr4;
350     comm_ULONG nLNr1;
351     String aString1,aString2;
352     sal_Bool bBool1,bBool2;
353 
354     Window* GetNextOverlap( Window* pBase );
355     Window* GetNextRecoverWin();
356 
357     static sal_uInt16 nDirPos;
358     static Dir *pDir;
359     static pfunc_osl_printDebugMessage pOriginal_osl_DebugMessageFunc;
360 
361 
362     sal_Bool UnpackStorage( SotStorageRef xStorage, DirEntry &aBaseDir );
363 
364     void HandleSAXParser();
365 
366 public:
367     StatementCommand( SCmdStream *pIn );
368     StatementCommand( StatementList *pAfterThis, sal_uInt16 MethodId, sal_uInt16 Params, sal_uInt16 Nr1 );
369     virtual sal_Bool Execute();
370     sal_Bool DisplayHID();
371     void Translate();
372     void WriteControlData( Window *pBase, sal_uLong nConf, sal_Bool bFirst = sal_True );
373 
374 };
375 
376 
377 enum TTHotSpots  { MitteLinks, Mitte, MitteOben };
378 
379 class StatementControl : public StatementList
380 {
381 protected:
382     rtl::OString aUId;
383     sal_uInt16 nMethodId;
384     sal_uInt16 nParams;
385     comm_USHORT nNr1,nNr2,nNr3,nNr4;
386     comm_ULONG nLNr1;
387     String aString1,aString2;
388     sal_Bool bBool1,bBool2;
389     sal_Bool ControlOK( Window *pControl, const sal_Char* aBezeichnung );
390     void AnimateMouse( Window *pControl, TTHotSpots aWohin );
391     void AnimateMouse( Window *pControl, Point aWohin );
392 
393     sal_Bool MaybeDoTypeKeysDelay( Window *pTestWindow );
394 
395     sal_Bool HandleVisibleControls( Window *pControl );
396     sal_Bool HandleCommonMethods( Window *pControl );
397 
398 public:
399     StatementControl( SCmdStream *pIn, sal_uInt16 nControlType );
400     virtual sal_Bool Execute();
401 
402 };
403 
404 class StatementFlow : public StatementList      // Kommunikation mit Sequence
405 {
406     sal_uInt16 nArt;
407 
408     sal_uInt16 nParams;
409     comm_USHORT nSNr1;
410     comm_ULONG nLNr1;
411     String aString1;
412     sal_Bool bBool1;
413 
414 
415 public:
416     StatementFlow (sal_uLong nServiceId, SCmdStream *pIn, ImplRemoteControl *pRC );
417     StatementFlow( StatementList *pAfterThis, sal_uInt16 nArtP );
418     virtual sal_Bool Execute();
419     static CommunicationLink *pCommLink;
420     static sal_Bool bSending;
421 
422     static sal_Bool bUseIPC;    // Soll zur r�ckmeldung IPC verwendet werden?
423     static ImplRemoteControl *pRemoteControl;   // Static f�r 2. Constructor
424 
425 private:
426     void SendViaSocket();
427 };
428 
429 class SearchUID : public Search
430 {
431     Window *pMaybeResult;
432     Window *pAlternateResult;
433     rtl::OString aUId;
434     sal_Bool bSearchButtonOnToolbox;
435 public:
SearchUID(rtl::OString aUIdP,sal_Bool bSearchButtonOnToolboxP)436     SearchUID( rtl::OString aUIdP, sal_Bool bSearchButtonOnToolboxP ): Search( SEARCH_FOCUS_FIRST ), pMaybeResult(NULL), pAlternateResult(NULL), aUId(aUIdP), bSearchButtonOnToolbox(bSearchButtonOnToolboxP) {}
437     virtual sal_Bool IsWinOK( Window *pWin );
GetMaybeWin()438     Window* GetMaybeWin() { return pMaybeResult; }
GetAlternateResultWin()439     Window* GetAlternateResultWin() { return pAlternateResult; }
440 };
441 class SearchActive : public Search
442 {
443     WindowType nRT;
444 public:
SearchActive(WindowType nRTP)445     SearchActive( WindowType nRTP ): nRT(nRTP) {}
446     virtual sal_Bool IsWinOK( Window *pWin );
447 };
448 class SearchPopupFloatingWin : public Search
449 {
450 public:
SearchPopupFloatingWin()451     SearchPopupFloatingWin(): Search( SEARCH_FOCUS_FIRST ) {}
452     virtual sal_Bool IsWinOK( Window *pWin );
453 };
454 class SearchRT : public Search
455 {
456     WindowType mnRT;
457     sal_uInt16 mnSkip;
458     sal_uInt16 mnCount;
459 public:
SearchRT(WindowType nRTP,SearchFlags nSearchFlags,sal_uInt16 nSkip=0)460     SearchRT( WindowType nRTP, SearchFlags nSearchFlags, sal_uInt16 nSkip = 0 ): Search(nSearchFlags), mnRT(nRTP), mnSkip( nSkip ), mnCount( 0 ) {}
461     virtual sal_Bool IsWinOK( Window *pWin );
GetCount()462     sal_uInt16 GetCount(){ return mnCount; }
463 };
464 class SearchScroll : public SearchRT
465 {
466     sal_uInt16 nDirection;
467 public:
SearchScroll(sal_uInt16 nDir,SearchFlags nSearchFlags)468     SearchScroll( sal_uInt16 nDir, SearchFlags nSearchFlags ): SearchRT(WINDOW_SCROLLBAR, nSearchFlags), nDirection(nDir) {}
469     virtual sal_Bool IsWinOK( Window *pWin );
470 };
471 class SearchWinPtr : public Search
472 {
473     Window *pTest;
474 public:
SearchWinPtr(Window * pTestP)475     SearchWinPtr( Window *pTestP ): pTest(pTestP) {}
476     virtual sal_Bool IsWinOK( Window *pWin );
477 };
478 class SearchFadeSplitWin : public Search
479 {
480     WindowAlign nAlign;
481 public:
SearchFadeSplitWin(WindowAlign nAlignP)482     SearchFadeSplitWin( WindowAlign nAlignP ): nAlign(nAlignP) {}
483     virtual sal_Bool IsWinOK( Window *pWin );
484 };
485 
486 
487 void ImplKeyInput( Window* pWin, KeyEvent &aKEvnt, sal_Bool bForceDirect=sal_False );
488 void ImplMouseMove( Window* pWin, MouseEvent &aMEvnt, sal_Bool bForceDirect=sal_False );
489 void ImplMouseButtonDown( Window* pWin, MouseEvent &aMEvnt, sal_Bool bForceDirect=sal_False );
490 void ImplMouseButtonUp( Window* pWin, MouseEvent &aMEvnt, sal_Bool bForceDirect=sal_False );
491 void ImplCommand( Window* pWin, CommandEvent &aCmdEvnt );
492 void ImplEventWait( sal_uLong nID );
493 
494 #endif
495