LibreOffice Module vcl (master)  1
logger.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include <config_folders.h>
11 
12 #include <vcl/uitest/logger.hxx>
13 
14 #include <rtl/bootstrap.hxx>
15 #include <rtl/ustrbuf.hxx>
16 #include <osl/file.hxx>
17 #include <vcl/ctrl.hxx>
18 #include <vcl/event.hxx>
19 #include <vcl/uitest/uiobject.hxx>
21 #include <svdata.hxx>
22 #include <com/sun/star/beans/PropertyValue.hpp>
23 #include <memory>
24 
25 namespace
26 {
27 bool isDialogWindow(vcl::Window const* pWindow)
28 {
29  WindowType nType = pWindow->GetType();
30  if (nType == WindowType::DIALOG || nType == WindowType::MODELESSDIALOG)
31  return true;
32 
33  // MESSBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX
34  if (nType >= WindowType::MESSBOX && nType <= WindowType::QUERYBOX)
35  return true;
36 
37  if (nType == WindowType::TABDIALOG)
38  return true;
39 
40  return false;
41 }
42 
43 bool isTopWindow(vcl::Window const* pWindow)
44 {
45  WindowType eType = pWindow->GetType();
46  if (eType == WindowType::FLOATINGWINDOW)
47  {
48  return pWindow->GetStyle() & WB_SYSTEMFLOATWIN;
49  }
50  return false;
51 }
52 
53 vcl::Window* get_top_parent(vcl::Window* pWindow)
54 {
55  if (isDialogWindow(pWindow) || isTopWindow(pWindow))
56  return pWindow;
57 
58  vcl::Window* pParent = pWindow->GetParent();
59  if (!pParent)
60  return pWindow;
61 
62  return get_top_parent(pParent);
63 }
64 }
66  : maStream()
67  , mbValid(false)
68 {
69  static const char* pFile = std::getenv("LO_COLLECT_UIINFO");
70  if (pFile)
71  {
72  OUString aDirPath("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER
73  "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/uitest/");
74  rtl::Bootstrap::expandMacros(aDirPath);
75  osl::Directory::createPath(aDirPath);
76  OUString aFilePath = aDirPath + OUString::fromUtf8(pFile);
77 
78  maStream.Open(aFilePath, StreamMode::READWRITE | StreamMode::TRUNC);
79  mbValid = true;
80  }
81 }
82 
83 void UITestLogger::logCommand(const OUString& rAction,
84  const css::uno::Sequence<css::beans::PropertyValue>& rArgs)
85 {
86  if (!mbValid)
87  return;
88 
89  OUStringBuffer aBuffer(rAction);
90 
91  if (rArgs.hasElements())
92  {
93  aBuffer.append(" {");
94  for (const css::beans::PropertyValue& rProp : rArgs)
95  {
96  OUString aTypeName = rProp.Value.getValueTypeName();
97 
98  if (aTypeName == "long" || aTypeName == "short")
99  {
100  sal_Int32 nValue = 0;
101  rProp.Value >>= nValue;
102  aBuffer.append("\"").append(rProp.Name).append("\": ");
103  aBuffer.append(OUString::number(nValue)).append(", ");
104  }
105  else if (aTypeName == "unsigned long")
106  {
107  sal_uInt32 nValue = 0;
108  rProp.Value >>= nValue;
109  aBuffer.append("\"").append(rProp.Name).append("\": ");
110  aBuffer.append(OUString::number(nValue)).append(", ");
111  }
112  else if (aTypeName == "boolean")
113  {
114  bool bValue = false;
115  rProp.Value >>= bValue;
116  aBuffer.append("\"").append(rProp.Name).append("\": ");
117  if (bValue)
118  aBuffer.append("True, ");
119  else
120  aBuffer.append("False, ");
121  }
122  }
123  aBuffer.append("}");
124  }
125 
126  OUString aCommand(aBuffer.makeStringAndClear());
127  maStream.WriteLine(OUStringToOString(aCommand, RTL_TEXTENCODING_UTF8));
128 }
129 
130 namespace
131 {
132 // most likely this should be recursive
133 bool child_windows_have_focus(VclPtr<vcl::Window> const& xUIElement)
134 {
135  sal_Int32 nCount = xUIElement->GetChildCount();
136  for (sal_Int32 i = 0; i < nCount; ++i)
137  {
138  vcl::Window* pChild = xUIElement->GetChild(i);
139  if (pChild->HasFocus())
140  {
141  return true;
142  }
143  if (child_windows_have_focus(VclPtr<vcl::Window>(pChild)))
144  return true;
145  }
146  return false;
147 }
148 }
149 
150 void UITestLogger::logAction(VclPtr<Control> const& xUIElement, VclEventId nEvent)
151 {
152  if (!mbValid)
153  return;
154 
155  if (xUIElement->get_id().isEmpty())
156  return;
157 
158  std::unique_ptr<UIObject> pUIObject = xUIElement->GetUITestFactory()(xUIElement.get());
159  OUString aAction = pUIObject->get_action(nEvent);
160  if (!xUIElement->HasFocus() && !child_windows_have_focus(xUIElement))
161  {
162  return;
163  }
164 
165  if (!aAction.isEmpty())
166  maStream.WriteLine(OUStringToOString(aAction, RTL_TEXTENCODING_UTF8));
167 }
168 
169 void UITestLogger::logAction(vcl::Window* const& xUIWin, VclEventId nEvent)
170 {
171  if (!mbValid)
172  return;
173 
174  if (xUIWin->get_id().isEmpty())
175  return;
176 
177  std::unique_ptr<UIObject> pUIObject = xUIWin->GetUITestFactory()(xUIWin);
178  OUString aAction = pUIObject->get_action(nEvent);
179 
180  if (!aAction.isEmpty())
181  maStream.WriteLine(OUStringToOString(aAction, RTL_TEXTENCODING_UTF8));
182 }
183 
184 void UITestLogger::log(const OUString& rString)
185 {
186  if (!mbValid)
187  return;
188 
189  if (rString.isEmpty())
190  return;
191 
192  maStream.WriteLine(OUStringToOString(rString, RTL_TEXTENCODING_UTF8));
193 }
194 
195 void UITestLogger::logKeyInput(VclPtr<vcl::Window> const& xUIElement, const KeyEvent& rEvent)
196 {
197  if (!mbValid)
198  return;
199 
200  //We need to check for Parent's ID in case the UI Element is SubEdit of Combobox/SpinField
201  const OUString& rID
202  = xUIElement->get_id().isEmpty() ? xUIElement->GetParent()->get_id() : xUIElement->get_id();
203  if (rID.isEmpty())
204  return;
205 
206  sal_Unicode nChar = rEvent.GetCharCode();
207  sal_uInt16 nKeyCode = rEvent.GetKeyCode().GetCode();
208  bool bShift = rEvent.GetKeyCode().IsShift();
209  bool bMod1 = rEvent.GetKeyCode().IsMod1();
210  bool bMod2 = rEvent.GetKeyCode().IsMod2();
211  bool bMod3 = rEvent.GetKeyCode().IsMod3();
212 
213  std::map<OUString, sal_uInt16> aKeyMap
214  = { { "ESC", KEY_ESCAPE }, { "TAB", KEY_TAB }, { "DOWN", KEY_DOWN },
215  { "UP", KEY_UP }, { "LEFT", KEY_LEFT }, { "RIGHT", KEY_RIGHT },
216  { "DELETE", KEY_DELETE }, { "INSERT", KEY_INSERT }, { "BACKSPACE", KEY_BACKSPACE },
217  { "RETURN", KEY_RETURN }, { "HOME", KEY_HOME }, { "END", KEY_END },
218  { "PAGEUP", KEY_PAGEUP }, { "PAGEDOWN", KEY_PAGEDOWN } };
219 
220  OUString aFound;
221  for (const auto& itr : aKeyMap)
222  {
223  if (itr.second == nKeyCode)
224  {
225  aFound = itr.first;
226  break;
227  }
228  }
229 
230  OUString aKeyCode;
231  if (!aFound.isEmpty() || bShift || bMod1 || bMod2 || bMod3)
232  {
233  aKeyCode = "{\"KEYCODE\": \"";
234  if (bShift)
235  aKeyCode += "SHIFT+";
236 
237  if (bMod1)
238  aKeyCode += "CTRL+";
239 
240  if (bMod2)
241  aKeyCode += "ALT+";
242 
243  if (aFound.isEmpty())
244  aKeyCode += OUStringChar(nChar) + "\"}";
245  else
246  aKeyCode += aFound + "\"}";
247  }
248  else
249  {
250  aKeyCode = "{\"TEXT\": \"" + OUStringChar(nChar) + "\"}";
251  }
252 
253  std::unique_ptr<UIObject> pUIObject = xUIElement->GetUITestFactory()(xUIElement.get());
254 
255  VclPtr<vcl::Window> pParent = xUIElement->GetParent();
256 
257  while (!pParent->IsTopWindow())
258  {
259  pParent = pParent->GetParent();
260  }
261 
262  OUString aParentID = pParent->get_id();
263 
264  OUString aContent;
265 
266  if (pUIObject->get_type() == "EditUIObject")
267  {
268  if (aParentID.isEmpty())
269  {
270  VclPtr<vcl::Window> pParent_top = get_top_parent(xUIElement);
271  aParentID = pParent_top->get_id();
272  }
273  if (aParentID.isEmpty())
274  {
275  aContent += "Type on '" + rID + "' " + aKeyCode;
276  }
277  else
278  {
279  aContent += "Type on '" + rID + "' " + aKeyCode + " from " + aParentID;
280  }
281  }
282  else if (pUIObject->get_type() == "SwEditWinUIObject" && rID == "writer_edit")
283  {
284  aContent = "Type on writer " + aKeyCode;
285  }
286  else if (pUIObject->get_type() == "ScGridWinUIObject" && rID == "grid_window")
287  {
288  aContent = "Type on current cell " + aKeyCode;
289  }
290  else if (pUIObject->get_type() == "ImpressWindowUIObject" && rID == "impress_win")
291  {
292  aContent = "Type on impress " + aKeyCode;
293  }
294  else if (pUIObject->get_type() == "WindowUIObject" && rID == "math_edit")
295  {
296  aContent = "Type on math " + aKeyCode;
297  }
298  else if (rID == "draw_win")
299  {
300  aContent = "Type on draw " + aKeyCode;
301  }
302  else
303  {
304  if (aParentID.isEmpty())
305  {
306  VclPtr<vcl::Window> pParent_top = get_top_parent(xUIElement);
307  aParentID = pParent_top->get_id();
308  }
309  if (aParentID.isEmpty())
310  {
311  aContent = "Type on '" + rID + "' " + aKeyCode;
312  }
313  else
314  {
315  aContent = "Type on '" + rID + "' " + aKeyCode + " from " + aParentID;
316  }
317  }
318  maStream.WriteLine(OUStringToOString(aContent, RTL_TEXTENCODING_UTF8));
319 }
320 
321 namespace
322 {
323 OUString StringMapToOUString(const std::map<OUString, OUString>& rParameters)
324 {
325  if (rParameters.empty())
326  return "";
327 
328  OUStringBuffer aParameterString(static_cast<int>(rParameters.size() * 32));
329  aParameterString.append(" {");
330 
331  for (std::map<OUString, OUString>::const_iterator itr = rParameters.begin();
332  itr != rParameters.end(); ++itr)
333  {
334  if (itr != rParameters.begin())
335  aParameterString.append(", ");
336  aParameterString.append("\"")
337  .append(itr->first)
338  .append("\": \"")
339  .append(itr->second)
340  .append("\"");
341  }
342 
343  aParameterString.append("}");
344 
345  return aParameterString.makeStringAndClear();
346 }
347 
348 OUString GetValueInMapWithIndex(const std::map<OUString, OUString>& rParameters, sal_Int32 index)
349 {
350  sal_Int32 j = 0;
351 
352  std::map<OUString, OUString>::const_iterator itr = rParameters.begin();
353 
354  for (; itr != rParameters.end() && j < index; ++itr, ++j)
355  ;
356 
357  assert(itr != rParameters.end());
358 
359  return itr->second;
360 }
361 
362 OUString GetKeyInMapWithIndex(const std::map<OUString, OUString>& rParameters, sal_Int32 index)
363 {
364  sal_Int32 j = 0;
365 
366  std::map<OUString, OUString>::const_iterator itr = rParameters.begin();
367 
368  for (; itr != rParameters.end() && j < index; ++itr, ++j)
369  ;
370 
371  assert(itr != rParameters.end());
372 
373  return itr->first;
374 }
375 }
376 
377 void UITestLogger::logEvent(const EventDescription& rDescription)
378 {
379  OUString aParameterString = StringMapToOUString(rDescription.aParameters);
380 
381  //here we will customize our statements depending on the caller of this function
382  OUString aLogLine;
383  //first check on general commands
384  if (rDescription.aAction == "SET")
385  {
386  aLogLine = "Set Zoom to " + GetValueInMapWithIndex(rDescription.aParameters, 0);
387  }
388  else if (rDescription.aAction == "SIDEBAR")
389  {
390  aLogLine = "From SIDEBAR Choose " + aParameterString;
391  }
392  else if (rDescription.aKeyWord == "ValueSet")
393  {
394  aLogLine = "Choose element with position "
395  + GetValueInMapWithIndex(rDescription.aParameters, 0) + " in '"
396  + rDescription.aID + "' from '" + rDescription.aParent + "'";
397  }
398  else if (rDescription.aAction == "SELECT" && rDescription.aID.isEmpty())
399  {
400  aLogLine = "Select " + aParameterString;
401  }
402  else if (rDescription.aID == "writer_edit")
403  {
404  if (rDescription.aAction == "GOTO")
405  {
406  aLogLine = "GOTO page number " + GetValueInMapWithIndex(rDescription.aParameters, 0);
407  }
408  else if (rDescription.aAction == "SELECT")
409  {
410  OUString to = GetValueInMapWithIndex(rDescription.aParameters, 0);
411  OUString from = GetValueInMapWithIndex(rDescription.aParameters, 1);
412  aLogLine = "Select from Pos " + from + " to Pos " + to;
413  }
414  else if (rDescription.aAction == "CREATE_TABLE")
415  {
416  OUString size = GetValueInMapWithIndex(rDescription.aParameters, 0);
417  aLogLine = "Create Table with " + size;
418  ;
419  }
420  else if (rDescription.aAction == "COPY")
421  {
422  aLogLine = "Copy the Selected Text";
423  }
424  else if (rDescription.aAction == "CUT")
425  {
426  aLogLine = "Cut the Selected Text";
427  }
428  else if (rDescription.aAction == "PASTE")
429  {
430  aLogLine = "Paste in the Current Cursor Location";
431  }
432  else if (rDescription.aAction == "BREAK_PAGE")
433  {
434  aLogLine = "Insert Break Page";
435  }
436  }
437  else if (rDescription.aID == "grid_window")
438  {
439  if (rDescription.aAction == "SELECT")
440  {
441  OUString type = GetKeyInMapWithIndex(rDescription.aParameters, 0);
442  if (type == "CELL" || type == "RANGE")
443  {
444  aLogLine = "Select from calc" + aParameterString;
445  }
446  else if (type == "TABLE")
447  {
448  aLogLine = "Switch to sheet number "
449  + GetValueInMapWithIndex(rDescription.aParameters, 0);
450  }
451  }
452  else if (rDescription.aAction == "LAUNCH")
453  {
454  aLogLine = "Launch" + GetKeyInMapWithIndex(rDescription.aParameters, 2) + " from Col "
455  + GetValueInMapWithIndex(rDescription.aParameters, 2) + " and Row "
456  + GetValueInMapWithIndex(rDescription.aParameters, 1);
457  }
458  else if (rDescription.aAction == "DELETE_CONTENT")
459  {
460  aLogLine = "Remove Content from This " + aParameterString;
461  }
462  else if (rDescription.aAction == "DELETE_CELLS")
463  {
464  aLogLine = "Delete The Cells in" + aParameterString;
465  }
466  else if (rDescription.aAction == "INSERT_CELLS")
467  {
468  aLogLine = "Insert Cell around the " + aParameterString;
469  }
470  else if (rDescription.aAction == "CUT")
471  {
472  aLogLine = "CUT the selected " + aParameterString;
473  }
474  else if (rDescription.aAction == "COPY")
475  {
476  aLogLine = "COPY the selected " + aParameterString;
477  }
478  else if (rDescription.aAction == "PASTE")
479  {
480  aLogLine = "Paste in the " + aParameterString;
481  }
482  else if (rDescription.aAction == "MERGE_CELLS")
483  {
484  aLogLine = "Merge " + aParameterString;
485  }
486  else if (rDescription.aAction == "UNMERGE_CELL")
487  {
488  aLogLine = "Delete the merged " + aParameterString;
489  }
490  else if (rDescription.aAction == "Rename_Sheet")
491  {
492  aLogLine = "Rename The Selected Tab to \""
493  + GetValueInMapWithIndex(rDescription.aParameters, 0) + "\"";
494  }
495  else if (rDescription.aAction == "InsertTab")
496  {
497  aLogLine = "Insert New Tab ";
498  }
499  else if (rDescription.aAction == "COMMENT")
500  {
501  OUString type = GetKeyInMapWithIndex(rDescription.aParameters, 0);
502  if (type == "OPEN")
503  {
504  aLogLine = "Open Comment";
505  }
506  else if (type == "CLOSE")
507  {
508  aLogLine = "Close Comment";
509  }
510  }
511  }
512  else if (rDescription.aID == "impress_win_or_draw_win")
513  {
514  if (rDescription.aAction == "Insert_New_Page_or_Slide")
515  {
516  if (UITestLogger::getInstance().getAppName() == "impress")
517  {
518  aLogLine = "Insert New Slide at Position "
519  + GetValueInMapWithIndex(rDescription.aParameters, 0);
520  }
521  else if (UITestLogger::getInstance().getAppName() == "draw")
522  {
523  aLogLine = "Insert New Page at Position "
524  + GetValueInMapWithIndex(rDescription.aParameters, 0);
525  }
526  }
527  else if (rDescription.aAction == "Delete_Slide_or_Page")
528  {
529  if (UITestLogger::getInstance().getAppName() == "impress")
530  {
531  aLogLine
532  = "Delete Slide number " + GetValueInMapWithIndex(rDescription.aParameters, 0);
533  }
534  else if (UITestLogger::getInstance().getAppName() == "draw")
535  {
536  aLogLine
537  = "Delete Page number " + GetValueInMapWithIndex(rDescription.aParameters, 0);
538  }
539  }
540  else if (rDescription.aAction == "Duplicate")
541  {
542  aLogLine = "Duplicate The Selected Slide ";
543  }
544  else if (rDescription.aAction == "RENAME")
545  {
546  if (UITestLogger::getInstance().getAppName() == "impress")
547  {
548  aLogLine = "Rename The Selected Slide from \""
549  + GetValueInMapWithIndex(rDescription.aParameters, 1) + "\" to \""
550  + GetValueInMapWithIndex(rDescription.aParameters, 0) + "\"";
551  }
552  else if (UITestLogger::getInstance().getAppName() == "draw")
553  {
554  aLogLine = "Rename The Selected Page from \""
555  + GetValueInMapWithIndex(rDescription.aParameters, 1) + "\" to \""
556  + GetValueInMapWithIndex(rDescription.aParameters, 0) + "\"";
557  }
558  }
559  }
560  else if (rDescription.aKeyWord == "SwEditWinUIObject")
561  {
562  if (rDescription.aAction == "LEAVE")
563  {
564  aLogLine = "Leave '" + rDescription.aID + "'";
565  }
566  else if (rDescription.aAction == "SHOW")
567  {
568  aLogLine = "Show '" + rDescription.aID + "'";
569  }
570  else if (rDescription.aAction == "HIDE")
571  {
572  aLogLine = "Hide '" + rDescription.aID + "'";
573  }
574  else if (rDescription.aAction == "DELETE")
575  {
576  aLogLine = "Delete '" + rDescription.aID + "'";
577  }
578  else if (rDescription.aAction == "SETRESOLVED")
579  {
580  aLogLine = "Resolve '" + rDescription.aID + "'";
581  }
582  }
583  else if (rDescription.aParent == "element_selector")
584  {
585  aLogLine = "Select element no " + rDescription.aID + " From " + rDescription.aParent;
586  }
587  else if (rDescription.aKeyWord == "MenuButton")
588  {
589  if (rDescription.aAction == "OPENLIST")
590  {
591  aLogLine = "Open List From " + rDescription.aID;
592  }
593  else if (rDescription.aAction == "CLOSELIST")
594  {
595  aLogLine = "Close List From " + rDescription.aID;
596  }
597  else if (rDescription.aAction == "OPENFROMLIST")
598  {
599  aLogLine = "Select item no " + GetValueInMapWithIndex(rDescription.aParameters, 0)
600  + " From List of " + rDescription.aID;
601  }
602  }
603  else if (rDescription.aKeyWord == "VerticalTab")
604  {
605  aLogLine = "Choose Tab number " + GetValueInMapWithIndex(rDescription.aParameters, 0)
606  + " in '" + rDescription.aID + "' from " + rDescription.aParent;
607  }
608  else
609  {
610  aLogLine = rDescription.aKeyWord + " Action:" + rDescription.aAction + " Id:"
611  + rDescription.aID + " Parent:" + rDescription.aParent + aParameterString;
612  }
613  log(aLogLine);
614 }
615 
617 {
618  ImplSVData* const pSVData = ImplGetSVData();
619  assert(pSVData);
620 
621  if (!pSVData->maFrameData.m_pUITestLogger)
622  {
623  pSVData->maFrameData.m_pUITestLogger.reset(new UITestLogger);
624  }
625 
626  return *pSVData->maFrameData.m_pUITestLogger;
627 }
628 
629 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual FactoryFunction GetUITestFactory() const
Definition: window.cxx:3915
sal_uInt16 GetCode() const
Definition: keycod.hxx:51
void log(const OUString &rString)
Definition: logger.cxx:184
constexpr sal_uInt16 KEY_UP
Definition: keycodes.hxx:111
void logAction(VclPtr< Control > const &xUIElement, VclEventId nEvent)
Definition: logger.cxx:150
constexpr sal_uInt16 KEY_END
Definition: keycodes.hxx:115
static UITestLogger & getInstance()
Definition: logger.cxx:616
void logEvent(const EventDescription &rDescription)
Definition: logger.cxx:377
sal_uInt16 sal_Unicode
const OUString & get_id() const
Get the ID of the window.
Definition: window.cxx:3910
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
int nCount
constexpr sal_uInt16 KEY_PAGEUP
Definition: keycodes.hxx:116
UBlockCode from
VclEventId
Definition: vclevent.hxx:37
UBlockCode to
bool IsTopWindow() const
Definition: stacking.cxx:612
WinBits const WB_SYSTEMFLOATWIN
void Open(const OUString &rFileName, StreamMode eOpenMode)
UITestLogger()
Definition: logger.cxx:65
DocumentType eType
constexpr sal_uInt16 KEY_DOWN
Definition: keycodes.hxx:110
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:76
#define SAL_CONFIGFILE(name)
void logCommand(const OUString &rAction, const css::uno::Sequence< css::beans::PropertyValue > &rArgs)
Definition: logger.cxx:83
int i
bool WriteLine(const OString &rStr)
SvFileStream maStream
Definition: logger.hxx:33
constexpr sal_uInt16 KEY_HOME
Definition: keycodes.hxx:114
void logKeyInput(VclPtr< vcl::Window > const &xUIElement, const KeyEvent &rEvent)
Definition: logger.cxx:195
constexpr sal_uInt16 KEY_PAGEDOWN
Definition: keycodes.hxx:117
size
vcl::Window * GetParent() const
Definition: window2.cxx:1097
constexpr sal_uInt16 KEY_RETURN
Definition: keycodes.hxx:119
constexpr sal_uInt16 KEY_RIGHT
Definition: keycodes.hxx:113
OString OUStringToOString(const OUString &str, ConnectionSettings const *settings)
sal_uInt16 GetChildCount() const
Definition: stacking.cxx:1005
const vcl::KeyCode & GetKeyCode() const
Definition: event.hxx:54
std::unique_ptr< char[]> aBuffer
bool IsShift() const
Definition: keycod.hxx:56
WindowType
constexpr sal_uInt16 KEY_ESCAPE
Definition: keycodes.hxx:120
ImplSVFrameData maFrameData
Definition: svdata.hxx:391
std::unique_ptr< UITestLogger > m_pUITestLogger
Definition: svdata.hxx:241
sal_Unicode GetCharCode() const
Definition: event.hxx:53
bool IsMod1() const
Definition: keycod.hxx:58
OUString getAppName() const
Definition: logger.hxx:59
QPRO_FUNC_TYPE nType
bool mbValid
Definition: logger.hxx:35
constexpr sal_uInt16 KEY_BACKSPACE
Definition: keycodes.hxx:122
WindowType GetType() const
Definition: window2.cxx:974
reference_type * get() const
Get the body.
Definition: vclptr.hxx:143
ResultType type
OUString aCommand
WinBits GetStyle() const
Definition: window2.cxx:953
constexpr sal_uInt16 KEY_DELETE
Definition: keycodes.hxx:125
constexpr sal_uInt16 KEY_LEFT
Definition: keycodes.hxx:112
std::map< OUString, OUString > aParameters
constexpr sal_uInt16 KEY_INSERT
Definition: keycodes.hxx:124
bool HasFocus() const
Definition: window.cxx:2959
bool IsMod3() const
Definition: keycod.hxx:62
bool mbValid
constexpr sal_uInt16 KEY_TAB
Definition: keycodes.hxx:121
sal_Int16 nValue
vcl::Window * GetChild(sal_uInt16 nChild) const
Definition: stacking.cxx:1021
bool IsMod2() const
Definition: keycod.hxx:60