Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/jdk.accessibility/windows/native/jaccessinspector/jaccessinspector.cpp
40957 views
1
/*
2
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
/*
27
* A sample Assistive Technology which queries the JavaVM to get the Java
28
* Accessibility information available for a Java UI object, using the Java
29
* Access Bridge.
30
*/
31
32
#include <windows.h> // includes basic windows functionality
33
#include <jni.h>
34
35
#include "jaccessinspectorResource.h"
36
#include "AccessBridgeCalls.h"
37
#include "AccessBridgeCallbacks.h"
38
39
#include <stdio.h>
40
#include <time.h>
41
#include <string.h>
42
43
#include "jaccessinspector.h"
44
#include "AccessInfo.h"
45
#include "MessageHistory.h"
46
47
#define TIMER_ID 1
48
#define DISPLAY_INFO_MESSAGE WM_USER+1
49
#define DISPLAY_HWND_INFO_MESSAGE WM_USER+2
50
51
HWND theDialogWindow;
52
HWND theGoToDialogWindow;
53
HINSTANCE theInstance;
54
BOOL theAccessBridgeLoadedFlag;
55
56
HHOOK prevKbdHook;
57
HHOOK prevMouseHook;
58
59
BOOL updateMouse;
60
BOOL updateF1;
61
BOOL updateF2;
62
63
BOOL trackMouse;
64
BOOL trackMouseExited;
65
BOOL trackMouseClicked;
66
BOOL trackMousePressed;
67
BOOL trackMouseReleased;
68
69
BOOL trackFocus;
70
BOOL trackFocusLost;
71
BOOL trackCaret;
72
BOOL trackShutdown;
73
74
BOOL trackMenuSelected;
75
BOOL trackMenuDeselected;
76
BOOL trackMenuCanceled;
77
78
BOOL trackPopupVisible;
79
BOOL trackPopupInvisible;
80
BOOL trackPopupCanceled;
81
82
//BOOL trackPropertyChange;
83
84
BOOL trackPropertyNameChange;
85
BOOL trackPropertyDescriptionChange;
86
BOOL trackPropertyStateChange;
87
BOOL trackPropertyValueChange;
88
BOOL trackPropertySelectionChange;
89
BOOL trackPropertyTextChange;
90
BOOL trackPropertyCaretChange;
91
BOOL trackPropertyVisibleDataChange;
92
BOOL trackPropertyChildChange;
93
BOOL trackPropertyActiveDescendentChange;
94
BOOL trackPropertyTableModelChange;
95
96
97
FILE *logfile = NULL;
98
99
MessageHistory g_MessageHistory;
100
101
/**
102
* WinMain
103
*
104
*/
105
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd) {
106
MSG msg;
107
108
g_LogStringCallback = AddToMessageHistory;
109
theInstance = hInst;
110
theDialogWindow = NULL;
111
theGoToDialogWindow = NULL;
112
113
updateF1 = FALSE;
114
updateF2 = FALSE;
115
updateMouse = FALSE;
116
117
theAccessBridgeLoadedFlag = FALSE;
118
119
ReadActiveEventOptionsFromRegistry ();
120
121
if (InitWindow(hInst)) {
122
if (initializeAccessBridge() == TRUE) {
123
theAccessBridgeLoadedFlag = TRUE;
124
ApplyEventOptions(theDialogWindow);
125
EnableMessageNavButtons();
126
HACCEL hAccel =
127
::LoadAccelerators (theInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
128
129
while (GetMessage(&msg, NULL, 0, 0)) {
130
if ( FALSE == TranslateAccelerator(theDialogWindow, hAccel, &msg) ) {
131
if ( ( ( NULL == theDialogWindow ) ||
132
( FALSE == IsDialogMessage(theDialogWindow, &msg) ) ) &&
133
( ( NULL == theGoToDialogWindow ) ||
134
( FALSE == IsDialogMessage(theGoToDialogWindow, &msg) ) ) ) {
135
TranslateMessage(&msg);
136
DispatchMessage(&msg);
137
}
138
}
139
}
140
if (theAccessBridgeLoadedFlag == TRUE) {
141
shutdownAccessBridge();
142
}
143
SaveActiveEventOptionsToRegistry ();
144
}
145
}
146
return(0);
147
}
148
149
char szAppName [] = "JACCESSINSPECTORWINDOW";
150
151
/**
152
* Real(tm) MS-Windows window initialization
153
*
154
*/
155
BOOL InitWindow (HANDLE hInstance) {
156
theDialogWindow = CreateDialog((struct HINSTANCE__ *)hInstance,
157
szAppName,
158
NULL,
159
jaccessinspectorDialogProc);
160
161
// If window could not be created, return "failure".
162
if (!theDialogWindow)
163
return FALSE;
164
165
if (logfile == null) {
166
logfile = fopen(JACCESSINSPECTOR_LOG, "w"); // overwrite existing log file
167
logString(logfile, "Starting jaccessinspector.exe %s\n", getTimeAndDate());
168
}
169
170
// Make the window visible, update its client area, & return "success".
171
SetWindowText(theDialogWindow, "jaccessinspector");
172
ShowWindow(theDialogWindow, SW_SHOWNORMAL);
173
UpdateWindow(theDialogWindow);
174
175
return TRUE;
176
}
177
178
/**
179
* Display Accessible information about the object under the mouse
180
*/
181
void displayAccessibleInfo(long vmID, AccessibleContext ac, int x, int y) {
182
char buffer[HUGE_BUFSIZE];
183
184
getAccessibleInfo(vmID, ac, x, y, buffer, (int)(sizeof(buffer)));
185
displayAndLog(theDialogWindow, cjaccessinspectorText, logfile, (char *)buffer);
186
}
187
188
/**
189
* Display Java event info
190
*/
191
void displayJavaEvent(long vmID, AccessibleContext ac, char *announcement) {
192
char buffer[HUGE_BUFSIZE];
193
char *bufOffset;
194
195
strncpy(buffer, announcement, sizeof(buffer));
196
197
bufOffset = (char *)(buffer + strlen(buffer));
198
getAccessibleInfo( vmID, ac, -1, -1, bufOffset,
199
(int)(sizeof(buffer) - strlen(buffer)) );
200
displayAndLog(theDialogWindow, cjaccessinspectorText, logfile, (char *)buffer);
201
}
202
203
204
/**
205
* Display Accessible propertyChange event info
206
*/
207
void displayAccessiblePropertyChange(long vmID, AccessibleContext ac,
208
char *announcement) {
209
char buffer[HUGE_BUFSIZE];
210
char *bufOffset;
211
212
strncpy(buffer, announcement, sizeof(buffer));
213
214
bufOffset = (char *) (buffer + strlen(buffer));
215
getAccessibleInfo( vmID, ac, -1, -1, bufOffset,
216
(int)(sizeof(buffer) - strlen(buffer)) );
217
displayAndLog(theDialogWindow, cjaccessinspectorText, logfile, (char *)buffer);
218
}
219
220
221
/**
222
* Update display under mouse when it moves
223
*/
224
void echoMouseObject() {
225
long vmID;
226
AccessibleContext acParent;
227
AccessibleContext ac;
228
POINT p;
229
HWND hwnd;
230
RECT windowRect;
231
232
GetCursorPos(&p);
233
hwnd = WindowFromPoint(p);
234
if (GetAccessibleContextFromHWND(hwnd, &vmID, &acParent)) {
235
GetWindowRect(hwnd, &windowRect);
236
// send the point in global coordinates; Java will handle it!
237
if (GetAccessibleContextAt(vmID, acParent, (jint) p.x, (jint) p.y, &ac)) {
238
displayAccessibleInfo(vmID, ac, p.x, p.y); // can handle null
239
ReleaseJavaObject(vmID, ac);
240
}
241
}
242
}
243
244
245
/**
246
* Update display under HWND the mouse is in
247
*/
248
void echoMouseHWNDObject() {
249
long vmID;
250
AccessibleContext ac;
251
POINT p;
252
HWND hwnd;
253
254
GetCursorPos(&p);
255
hwnd = WindowFromPoint(p);
256
257
if (GetAccessibleContextFromHWND(hwnd, &vmID, &ac)) {
258
displayAccessibleInfo(vmID, ac, 0, 0); // can handle null
259
ReleaseJavaObject(vmID, ac);
260
}
261
}
262
263
/**
264
* Display Accessible information about the object that has focus in
265
* the topmost Java HWND
266
*
267
*/
268
void displayFocusedObject() {
269
HWND hWnd;
270
long vmID;
271
AccessibleContext ac;
272
273
hWnd = GetTopWindow(NULL);
274
while (hWnd != NULL) {
275
if (IsJavaWindow(hWnd)) {
276
if (GetAccessibleContextWithFocus(hWnd, &vmID, &ac) == TRUE) {
277
displayAccessibleInfo(vmID, ac, 0, 0);
278
ReleaseJavaObject(vmID, ac);
279
}
280
return;
281
} else {
282
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
283
}
284
}
285
}
286
287
/*
288
* Handle notification of the Java application shutting down
289
*/
290
void HandleJavaShutdown(long vmID) {
291
char s[1024];
292
wsprintf(s, "Java VM 0x%X terminated\r\n\r\n", vmID);
293
294
displayJavaEvent(vmID, null, s); // intentially passing null AccessibleContext
295
displayAndLog(theDialogWindow, cjaccessinspectorText, logfile, (char *)s);
296
}
297
298
/**
299
* Handle a FocusGained event
300
*/
301
void HandleJavaFocusGained(long vmID, FocusEvent event, AccessibleContext ac) {
302
303
char s[1024];
304
wsprintf(s, "FocusGained\r\n\r\n");
305
306
if (ac != (AccessibleContext) 0) {
307
displayJavaEvent(vmID, ac, s);
308
}
309
310
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
311
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
312
}
313
314
/**
315
* Handle a FocusLost event
316
*/
317
void HandleJavaFocusLost(long vmID, FocusEvent event, AccessibleContext ac) {
318
319
// NOTE: calling GetAccessibleContextWithFocus() after a FocusLost event
320
// would result in a null AccessibleContext being returned, since
321
// at that point, no object has the focus. If the topmost window
322
// does not belong to a JavaVM, then no component within a JavaVM
323
// will have the focus (and again, GetAccessibleContextWithFocus()
324
// will return a null AccessibleContext). You should always get
325
// a FocusLost event when a window not belonging to a JavaVM becomes
326
// topmost.
327
328
char s[1024];
329
wsprintf(s, "FocusLost\r\n\r\n");
330
331
if (ac != (AccessibleContext) 0) {
332
displayJavaEvent(vmID, ac, s);
333
}
334
/*
335
if (ac != (AccessibleContext) 0) {
336
displayAccessibleInfo(vmID, ac, 0, 0);
337
}
338
*/
339
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
340
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
341
}
342
343
/**
344
* Handle a CaretUpdate event
345
*/
346
void HandleJavaCaretUpdate(long vmID, CaretEvent event, AccessibleContext ac) {
347
if (ac != (AccessibleContext) 0) {
348
displayAccessibleInfo(vmID, ac, 0, 0);
349
}
350
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
351
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
352
}
353
354
/**
355
* Handle a MouseClicked event
356
*/
357
void HandleMouseClicked(long vmID, MouseEvent event, AccessibleContext ac) {
358
if (ac != (AccessibleContext) 0) {
359
displayAccessibleInfo(vmID, ac, 0, 0);
360
}
361
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
362
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
363
}
364
365
/**
366
* Handle a MouseEntered event
367
*/
368
void HandleMouseEntered(long vmID, MouseEvent event, AccessibleContext ac) {
369
if (ac != (AccessibleContext) 0) {
370
displayAccessibleInfo(vmID, ac, 0, 0);
371
}
372
373
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
374
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
375
}
376
377
/**
378
* Handle a MouseExited event
379
*/
380
void HandleMouseExited(long vmID, MouseEvent event, AccessibleContext ac) {
381
if (ac != (AccessibleContext) 0) {
382
displayAccessibleInfo(vmID, ac, 0, 0);
383
}
384
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
385
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
386
}
387
388
/**
389
* Handle a MousePressed event
390
*/
391
void HandleMousePressed(long vmID, MouseEvent event, AccessibleContext ac) {
392
if (ac != (AccessibleContext) 0) {
393
displayAccessibleInfo(vmID, ac, 0, 0);
394
}
395
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
396
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
397
}
398
399
/**
400
* Handle a MouseReleased event
401
*/
402
void HandleMouseReleased(long vmID, MouseEvent event, AccessibleContext ac) {
403
if (ac != (AccessibleContext) 0) {
404
displayAccessibleInfo(vmID, ac, 0, 0);
405
}
406
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
407
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
408
}
409
410
/**
411
* Handle a MenuCanceled event
412
*/
413
void HandleMenuCanceled(long vmID, MenuEvent event, AccessibleContext ac) {
414
if (ac != (AccessibleContext) 0) {
415
displayAccessibleInfo(vmID, ac, 0, 0);
416
}
417
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
418
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
419
}
420
421
/**
422
* Handle a MenuDeselected event
423
*/
424
void HandleMenuDeselected(long vmID, MenuEvent event, AccessibleContext ac) {
425
if (ac != (AccessibleContext) 0) {
426
displayAccessibleInfo(vmID, ac, 0, 0);
427
}
428
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
429
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
430
}
431
432
/**
433
* Handle a MenuSelected event
434
*/
435
void HandleMenuSelected(long vmID, MenuEvent event, AccessibleContext ac) {
436
if (ac != (AccessibleContext) 0) {
437
displayAccessibleInfo(vmID, ac, 0, 0);
438
}
439
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
440
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
441
}
442
443
/**
444
* Handle a PopupMenuCanceled event
445
*/
446
void HandlePopupMenuCanceled(long vmID, MenuEvent event, AccessibleContext ac) {
447
if (ac != (AccessibleContext) 0) {
448
displayAccessibleInfo(vmID, ac, 0, 0);
449
}
450
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
451
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
452
}
453
454
/**
455
* Handle a PopupMenuWillBecomeInvisible event
456
*/
457
void HandlePopupMenuWillBecomeInvisible(long vmID, MenuEvent event, AccessibleContext ac) {
458
if (ac != (AccessibleContext) 0) {
459
displayAccessibleInfo(vmID, ac, 0, 0);
460
}
461
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
462
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
463
}
464
465
/**
466
* Handle a PopupMenuWillBecomeVisible event
467
*/
468
void HandlePopupMenuWillBecomeVisible(long vmID, MenuEvent event, AccessibleContext ac) {
469
if (ac != (AccessibleContext) 0) {
470
displayAccessibleInfo(vmID, ac, 0, 0);
471
}
472
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
473
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
474
}
475
476
477
478
479
/**
480
* Handle a HandlePropertyNameChange event
481
*/
482
void HandlePropertyNameChange(long vmID, PropertyChangeEvent event, AccessibleContext ac,
483
wchar_t *oldName, wchar_t *newName) {
484
char s[1024];
485
wsprintf(s, "Name changed event: old = %ls; new = %ls\r\n\r\n", oldName, newName);
486
487
if (ac != (AccessibleContext) 0) {
488
displayAccessiblePropertyChange(vmID, ac, s);
489
}
490
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
491
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
492
}
493
494
/**
495
* Handle a HandlePropertyDescriptionChange event
496
*/
497
void HandlePropertyDescriptionChange( long vmID,
498
PropertyChangeEvent event,
499
AccessibleContext ac,
500
wchar_t *oldDescription,
501
wchar_t *newDescription ) {
502
char s[1024];
503
wsprintf( s, "Description changed event: old = %ls; new = %ls\r\n\r\n",
504
oldDescription, newDescription );
505
506
if (ac != (AccessibleContext) 0) {
507
displayAccessiblePropertyChange(vmID, ac, s);
508
}
509
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
510
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
511
}
512
513
/**
514
* Handle a HandlePropertyStateChange event
515
*/
516
void HandlePropertyStateChange( long vmID, PropertyChangeEvent event,
517
AccessibleContext ac,
518
wchar_t *oldState, wchar_t *newState ) {
519
char s[1024];
520
wsprintf( s, "State changed event: old = %ls; new = %ls\r\n\r\n",
521
oldState, newState );
522
523
if (ac != (AccessibleContext) 0) {
524
displayAccessiblePropertyChange(vmID, ac, s);
525
}
526
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
527
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
528
}
529
530
/**
531
* Handle a HandlePropertyValueChange event
532
*/
533
void HandlePropertyValueChange( long vmID, PropertyChangeEvent event,
534
AccessibleContext ac,
535
wchar_t *oldValue, wchar_t *newValue ) {
536
char s[1024];
537
wsprintf( s, "Value changed event: old = %ls; new = %ls\r\n\r\n",
538
oldValue, newValue );
539
540
if (ac != (AccessibleContext) 0) {
541
displayAccessiblePropertyChange(vmID, ac, s);
542
}
543
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
544
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
545
}
546
547
/**
548
* Handle a HandlePropertySelectionChange event
549
*/
550
void HandlePropertySelectionChange( long vmID, PropertyChangeEvent event,
551
AccessibleContext ac ) {
552
if (ac != (AccessibleContext) 0) {
553
displayAccessiblePropertyChange( vmID, ac,
554
"Selection changed event\r\n\r\n" );
555
}
556
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
557
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
558
}
559
560
/**
561
* Handle a HandlePropertyTextChange event
562
*/
563
void HandlePropertyTextChange( long vmID, PropertyChangeEvent event,
564
AccessibleContext ac ) {
565
if (ac != (AccessibleContext) 0) {
566
displayAccessiblePropertyChange(vmID, ac, "Text changed event\r\n\r\n");
567
}
568
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
569
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
570
}
571
572
/**
573
* Handle a HandlePropertyCaretChange event
574
*/
575
void HandlePropertyCaretChange( long vmID, PropertyChangeEvent event,
576
AccessibleContext ac,
577
int oldPosition, int newPosition ) {
578
char s[1024];
579
580
wsprintf( s, "Caret changed event: oldPosition = %d; newPosition = %d\r\n\r\n",
581
oldPosition, newPosition );
582
583
if (ac != (AccessibleContext) 0) {
584
displayAccessiblePropertyChange(vmID, ac, s);
585
}
586
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
587
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
588
}
589
590
/**
591
* Handle a HandlePropertyVisibleDataChange event
592
*/
593
void HandlePropertyVisibleDataChange( long vmID, PropertyChangeEvent event,
594
AccessibleContext ac ) {
595
if (ac != (AccessibleContext) 0) {
596
displayAccessiblePropertyChange( vmID, ac,
597
"VisibleData changed event\r\n\r\n" );
598
}
599
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
600
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
601
}
602
603
/**
604
* Handle a HandlePropertyChildChange event
605
*/
606
void HandlePropertyChildChange( long vmID, PropertyChangeEvent event,
607
AccessibleContext ac,
608
JOBJECT64 oldChild, JOBJECT64 newChild ) {
609
char buffer[HUGE_BUFSIZE];
610
char *bufOffset;
611
612
sprintf( buffer,
613
"Child property changed event:\r\n=======================\r\n\r\n" );
614
615
if (oldChild != 0) {
616
strncat(buffer, "Old Accessible Child info:\r\n\r\n", sizeof(buffer));
617
bufOffset = (char *) (buffer + strlen(buffer));
618
getAccessibleInfo( vmID, oldChild, 0, 0, bufOffset,
619
(int)(sizeof(buffer) - strlen(buffer)) );
620
strncat(buffer, "\r\n\r\n", sizeof(buffer));
621
}
622
623
if (newChild != 0) {
624
strncat(buffer, "New Accessible Child info:\r\n\r\n", sizeof(buffer));
625
bufOffset = (char *) (buffer + strlen(buffer));
626
getAccessibleInfo( vmID, newChild, 0, 0, bufOffset,
627
(int)(sizeof(buffer) - strlen(buffer)) );
628
strncat(buffer, "\r\n\r\n", sizeof(buffer));
629
}
630
631
if (ac != (AccessibleContext) 0) {
632
displayAccessiblePropertyChange(vmID, ac, buffer);
633
}
634
635
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
636
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
637
ReleaseJavaObject(vmID, oldChild); // must always release, to stave off memory leaks
638
ReleaseJavaObject(vmID, newChild); // must always release, to stave off memory leaks
639
}
640
641
/**
642
* Handle a HandlePropertyActiveDescendentChange event
643
*/
644
void HandlePropertyActiveDescendentChange( long vmID, PropertyChangeEvent event,
645
AccessibleContext ac,
646
JOBJECT64 oldActiveDescendent,
647
JOBJECT64 newActiveDescendent ) {
648
char buffer[HUGE_BUFSIZE];
649
650
sprintf( buffer,
651
"ActiveDescendent property changed event:\r\n=======================\r\n\r\n" );
652
653
#ifdef _notdef
654
char *bufOffset;
655
if (oldActiveDescendent != 0) {
656
strncat(buffer, "Old Accessible ActiveDescendent info:\r\n\r\n", sizeof(buffer));
657
bufOffset = (char *) (buffer + strlen(buffer));
658
getAccessibleInfo( vmID, oldActiveDescendent, 0, 0, bufOffset,
659
(int)(sizeof(buffer) - strlen(buffer)) );
660
strncat(buffer, "\r\n\r\n", sizeof(buffer));
661
}
662
663
if (newActiveDescendent != 0) {
664
strncat( buffer, "New Accessible ActiveDescendent info:\r\n\r\n",
665
sizeof(buffer) );
666
bufOffset = (char *) (buffer + strlen(buffer));
667
getAccessibleInfo( vmID, newActiveDescendent, 0, 0, bufOffset,
668
(int)(sizeof(buffer) - strlen(buffer)) );
669
strncat(buffer, "\r\n\r\n", sizeof(buffer));
670
}
671
#endif _notdef
672
673
if (newActiveDescendent != (AccessibleContext) 0) {
674
displayAccessiblePropertyChange(vmID, newActiveDescendent, buffer);
675
}
676
677
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
678
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
679
ReleaseJavaObject(vmID, oldActiveDescendent); // must always release, to stave off memory leaks
680
ReleaseJavaObject(vmID, newActiveDescendent); // must always release, to stave off memory leaks
681
}
682
683
684
/**
685
* Handle a HandlePropertyTableModelChange event
686
*/
687
void HandlePropertyTableModelChange( long vmID, PropertyChangeEvent event,
688
AccessibleContext ac,
689
wchar_t *oldValue, wchar_t *newValue ) {
690
691
char s[1024];
692
wsprintf( s, "Table Model Change: old = %ls; new = %ls\r\n\r\n",
693
oldValue, newValue );
694
695
if (ac != (AccessibleContext) 0) {
696
displayAccessiblePropertyChange(vmID, ac, s);
697
}
698
ReleaseJavaObject(vmID, ac); // must always release, to stave off memory leaks
699
ReleaseJavaObject(vmID, event); // must always release, to stave off memory leaks
700
}
701
702
703
704
#define DOWN_UP_FLAG 1<<31
705
706
void CALLBACK TimerProc(HWND hWnd, UINT uTimerMsg, UINT uTimerID, DWORD dwTime) {
707
// when mouse settles from movement
708
KillTimer(hWnd, uTimerID);
709
if (updateMouse == TRUE) {
710
PostMessage(theDialogWindow, DISPLAY_INFO_MESSAGE, 0, 0);
711
}
712
}
713
714
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
715
// on mouse-up of F1
716
if (code < 0) {
717
CallNextHookEx(prevKbdHook, code, wParam, lParam);
718
} else if (wParam == VK_F1 && lParam & DOWN_UP_FLAG && updateF1) {
719
PostMessage(theDialogWindow, DISPLAY_INFO_MESSAGE, wParam, lParam);
720
} else if (wParam == VK_F2 && lParam & DOWN_UP_FLAG && updateF2) {
721
PostMessage(theDialogWindow, DISPLAY_HWND_INFO_MESSAGE, wParam, lParam);
722
}
723
return 0;
724
}
725
726
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) {
727
// when mouse settles from movement
728
if (code < 0) {
729
CallNextHookEx(prevMouseHook, code, wParam, lParam);
730
} else {
731
// reset the timer every time the mouse moves
732
KillTimer(theDialogWindow, TIMER_ID);
733
SetTimer(theDialogWindow, TIMER_ID, 1000, (TIMERPROC)TimerProc);
734
}
735
return 0;
736
}
737
738
void exitjaccessinspector(HWND hWnd) {
739
EndDialog(hWnd, TRUE);
740
PostQuitMessage (0);
741
}
742
743
#define INSTALL_EVENT_LISTENER(toggleVal, setFP, handler) \
744
if (toggleVal) { \
745
setFP(handler); \
746
}
747
748
void reinstallEventListeners() {
749
INSTALL_EVENT_LISTENER(trackMouse, SetMouseEntered, HandleMouseEntered);
750
INSTALL_EVENT_LISTENER(trackMouseExited, SetMouseExited, HandleMouseExited);
751
INSTALL_EVENT_LISTENER(trackMouseClicked, SetMouseClicked, HandleMouseClicked);
752
INSTALL_EVENT_LISTENER(trackMousePressed, SetMousePressed, HandleMousePressed);
753
INSTALL_EVENT_LISTENER(trackMouseReleased, SetMouseReleased, HandleMouseReleased);
754
INSTALL_EVENT_LISTENER(trackShutdown, SetJavaShutdown, HandleJavaShutdown);
755
INSTALL_EVENT_LISTENER(trackFocus, SetFocusGained, HandleJavaFocusGained);
756
INSTALL_EVENT_LISTENER(trackFocusLost, SetFocusLost, HandleJavaFocusLost);
757
INSTALL_EVENT_LISTENER(trackCaret, SetCaretUpdate, HandleJavaCaretUpdate);
758
759
INSTALL_EVENT_LISTENER(trackMenuSelected, SetMenuSelected, HandleMenuSelected);
760
INSTALL_EVENT_LISTENER(trackMenuDeselected, SetMenuDeselected, HandleMenuDeselected);
761
INSTALL_EVENT_LISTENER(trackMenuCanceled, SetMenuCanceled, HandleMenuCanceled);
762
763
INSTALL_EVENT_LISTENER( trackPopupVisible, SetPopupMenuWillBecomeVisible,
764
HandlePopupMenuWillBecomeVisible );
765
INSTALL_EVENT_LISTENER( trackPopupInvisible, SetPopupMenuWillBecomeInvisible,
766
HandlePopupMenuWillBecomeInvisible );
767
INSTALL_EVENT_LISTENER( trackPopupCanceled, SetPopupMenuCanceled,
768
HandlePopupMenuCanceled );
769
770
INSTALL_EVENT_LISTENER( trackPropertyNameChange, SetPropertyNameChange,
771
HandlePropertyNameChange);
772
INSTALL_EVENT_LISTENER( trackPropertyDescriptionChange,
773
SetPropertyDescriptionChange,
774
HandlePropertyDescriptionChange );
775
INSTALL_EVENT_LISTENER( trackPropertyStateChange, SetPropertyStateChange,
776
HandlePropertyStateChange );
777
INSTALL_EVENT_LISTENER( trackPropertyValueChange, SetPropertyValueChange,
778
HandlePropertyValueChange );
779
INSTALL_EVENT_LISTENER( trackPropertySelectionChange,
780
SetPropertySelectionChange,
781
HandlePropertySelectionChange );
782
INSTALL_EVENT_LISTENER( trackPropertyTextChange, SetPropertyTextChange,
783
HandlePropertyTextChange );
784
INSTALL_EVENT_LISTENER( trackPropertyCaretChange, SetPropertyCaretChange,
785
HandlePropertyCaretChange );
786
INSTALL_EVENT_LISTENER( trackPropertyVisibleDataChange,
787
SetPropertyVisibleDataChange,
788
HandlePropertyVisibleDataChange );
789
INSTALL_EVENT_LISTENER( trackPropertyChildChange, SetPropertyChildChange,
790
HandlePropertyChildChange );
791
INSTALL_EVENT_LISTENER( trackPropertyActiveDescendentChange,
792
SetPropertyActiveDescendentChange,
793
HandlePropertyActiveDescendentChange );
794
INSTALL_EVENT_LISTENER( trackPropertyTableModelChange,
795
SetPropertyTableModelChange,
796
HandlePropertyTableModelChange );
797
}
798
799
800
#define TRACK_EVENT_TOGGLE(menuItem, toggleVal, setFP, handler) \
801
case menuItem: \
802
menu = GetMenu(hWnd); \
803
if (toggleVal) { \
804
toggleVal = FALSE; \
805
CheckMenuItem(menu, menuItem, \
806
MF_BYCOMMAND | MF_UNCHECKED); \
807
setFP(NULL); \
808
} else { \
809
toggleVal = TRUE; \
810
CheckMenuItem(menu, menuItem, \
811
MF_BYCOMMAND | MF_CHECKED); \
812
setFP(handler); \
813
} \
814
MaybeCheckMonitorTheSameEventsAsJAWS(menu); \
815
MaybeCheckMonitorAllEvents(menu); \
816
return TRUE
817
818
INT_PTR CALLBACK jaccessinspectorDialogProc( HWND hWnd, UINT message,
819
WPARAM wParam, LPARAM lParam ) {
820
const int minWindowWidth = 540;
821
const int minWindowHeight = 300;
822
static int titleBarHeight = ::GetSystemMetrics(SM_CYSIZE);
823
static int menuBarHeight = ::GetSystemMetrics(SM_CYMENU);
824
static int borderHeight = ::GetSystemMetrics(SM_CYBORDER);
825
static int borderWidth = ::GetSystemMetrics(SM_CXBORDER);
826
static int verticalScrollBarWidth = ::GetSystemMetrics(SM_CXVSCROLL);
827
int command;
828
short width, height;
829
HWND dlgItem;
830
RECT dlgItemRect;
831
RECT dialogBoxRect;
832
LONG lT;
833
HMENU menu;
834
DWORD lastError = 0;
835
836
switch (message) {
837
838
case WM_CREATE:
839
return 0;
840
841
case WM_INITDIALOG:
842
CheckMenuItem(GetMenu(hWnd), cAccessBridgeDLLLoaded, MF_BYCOMMAND | MF_CHECKED);
843
return TRUE;
844
845
case WM_CLOSE:
846
exitjaccessinspector(hWnd);
847
return TRUE;
848
849
case WM_SIZE:
850
width = LOWORD(lParam);
851
height = HIWORD(lParam);
852
dlgItem = GetDlgItem(theDialogWindow, cjaccessinspectorText);
853
::GetWindowRect(dlgItem, &dlgItemRect);
854
::GetWindowRect(theDialogWindow, &dialogBoxRect);
855
lT = dlgItemRect.top - dialogBoxRect.top - titleBarHeight -
856
menuBarHeight + (borderHeight * 4);
857
SetWindowPos( dlgItem, NULL, 0, 0,
858
width - (borderWidth * 2) - verticalScrollBarWidth,
859
height - lT, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
860
return FALSE; // let windows finish handling this
861
862
case WM_GETMINMAXINFO:
863
{
864
LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
865
lpMMI->ptMinTrackSize.x = minWindowWidth;
866
lpMMI->ptMinTrackSize.y = minWindowHeight;
867
return TRUE;
868
}
869
break;
870
871
case WM_COMMAND:
872
command = LOWORD(wParam);
873
874
switch(command) {
875
case cAccessBridgeDLLLoaded: // toggle; unload or load AccessBridge
876
if (theAccessBridgeLoadedFlag) {
877
shutdownAccessBridge();
878
theAccessBridgeLoadedFlag = FALSE;
879
CheckMenuItem( GetMenu(hWnd), cAccessBridgeDLLLoaded,
880
MF_BYCOMMAND | MF_UNCHECKED );
881
} else {
882
theAccessBridgeLoadedFlag = initializeAccessBridge();
883
if (theAccessBridgeLoadedFlag) {
884
CheckMenuItem( GetMenu(hWnd), cAccessBridgeDLLLoaded,
885
MF_BYCOMMAND | MF_CHECKED );
886
reinstallEventListeners();
887
}
888
}
889
return TRUE;
890
891
case cExitMenuItem:
892
exitjaccessinspector(hWnd);
893
return TRUE;
894
895
TRACK_EVENT_TOGGLE( cTrackMouseMenuItem, trackMouse, SetMouseEntered,
896
HandleMouseEntered );
897
TRACK_EVENT_TOGGLE( cTrackMouseExitedMenuItem, trackMouseExited,
898
SetMouseExited, HandleMouseExited );
899
TRACK_EVENT_TOGGLE( cTrackMouseClickedMenuItem, trackMouseClicked,
900
SetMouseClicked, HandleMouseClicked );
901
TRACK_EVENT_TOGGLE( cTrackMousePressedMenuItem, trackMousePressed,
902
SetMousePressed, HandleMousePressed );
903
TRACK_EVENT_TOGGLE( cTrackMouseReleasedMenuItem, trackMouseReleased,
904
SetMouseReleased, HandleMouseReleased );
905
TRACK_EVENT_TOGGLE( cTrackShutdownMenuItem, trackShutdown,
906
SetJavaShutdown, HandleJavaShutdown );
907
TRACK_EVENT_TOGGLE( cTrackFocusMenuItem, trackFocus, SetFocusGained,
908
HandleJavaFocusGained );
909
TRACK_EVENT_TOGGLE( cTrackFocusLostMenuItem, trackFocusLost,
910
SetFocusLost, HandleJavaFocusLost );
911
TRACK_EVENT_TOGGLE( cTrackCaretMenuItem, trackCaret, SetCaretUpdate,
912
HandleJavaCaretUpdate );
913
914
TRACK_EVENT_TOGGLE( cTrackMenuSelectedMenuItem, trackMenuSelected,
915
SetMenuSelected, HandleMenuSelected );
916
TRACK_EVENT_TOGGLE( cTrackMenuDeselectedMenuItem, trackMenuDeselected,
917
SetMenuDeselected, HandleMenuDeselected );
918
TRACK_EVENT_TOGGLE( cTrackMenuCanceledItem, trackMenuCanceled,
919
SetMenuCanceled, HandleMenuCanceled );
920
921
TRACK_EVENT_TOGGLE( cTrackPopupBecomeVisibleMenuItem, trackPopupVisible,
922
SetPopupMenuWillBecomeVisible,
923
HandlePopupMenuWillBecomeVisible );
924
TRACK_EVENT_TOGGLE( cTrackPopupBecomeInvisibleMenuItem,
925
trackPopupInvisible,
926
SetPopupMenuWillBecomeInvisible,
927
HandlePopupMenuWillBecomeInvisible );
928
TRACK_EVENT_TOGGLE( cTrackPopupCanceledItem, trackPopupCanceled,
929
SetPopupMenuCanceled, HandlePopupMenuCanceled );
930
931
TRACK_EVENT_TOGGLE( cTrackPropertyNameItem, trackPropertyNameChange,
932
SetPropertyNameChange, HandlePropertyNameChange );
933
TRACK_EVENT_TOGGLE( cTrackPropertyDescriptionItem,
934
trackPropertyDescriptionChange,
935
SetPropertyDescriptionChange,
936
HandlePropertyDescriptionChange );
937
TRACK_EVENT_TOGGLE( cTrackPropertyStateItem, trackPropertyStateChange,
938
SetPropertyStateChange, HandlePropertyStateChange );
939
TRACK_EVENT_TOGGLE( cTrackPropertyValueItem, trackPropertyValueChange,
940
SetPropertyValueChange, HandlePropertyValueChange );
941
TRACK_EVENT_TOGGLE( cTrackPropertySelectionItem,
942
trackPropertySelectionChange,
943
SetPropertySelectionChange,
944
HandlePropertySelectionChange );
945
TRACK_EVENT_TOGGLE( cTrackPropertyTextItem, trackPropertyTextChange,
946
SetPropertyTextChange, HandlePropertyTextChange );
947
TRACK_EVENT_TOGGLE( cTrackPropertyCaretItem, trackPropertyCaretChange,
948
SetPropertyCaretChange, HandlePropertyCaretChange );
949
TRACK_EVENT_TOGGLE( cTrackPropertyVisibleDataItem,
950
trackPropertyVisibleDataChange,
951
SetPropertyVisibleDataChange,
952
HandlePropertyVisibleDataChange );
953
TRACK_EVENT_TOGGLE( cTrackPropertyChildItem, trackPropertyChildChange,
954
SetPropertyChildChange, HandlePropertyChildChange );
955
TRACK_EVENT_TOGGLE( cTrackPropertyActiveDescendentItem,
956
trackPropertyActiveDescendentChange,
957
SetPropertyActiveDescendentChange,
958
HandlePropertyActiveDescendentChange );
959
TRACK_EVENT_TOGGLE( cTrackPropertyTableModelChangeItem,
960
trackPropertyTableModelChange,
961
SetPropertyTableModelChange,
962
HandlePropertyTableModelChange );
963
964
case cUpdateFromMouseMenuItem:
965
menu = GetMenu(hWnd);
966
if (updateMouse) {
967
updateMouse = FALSE;
968
CheckMenuItem( menu, cUpdateFromMouseMenuItem,
969
MF_BYCOMMAND | MF_UNCHECKED );
970
UnhookWindowsHookEx((HHOOK)MouseProc);
971
KillTimer(hWnd, TIMER_ID);
972
} else {
973
updateMouse = TRUE;
974
CheckMenuItem( menu, cUpdateFromMouseMenuItem,
975
MF_BYCOMMAND | MF_CHECKED );
976
prevMouseHook = SetWindowsHookEx( WH_MOUSE, MouseProc,
977
theInstance,
978
::GetCurrentThreadId() );
979
if (! prevMouseHook) {
980
lastError = ::GetLastError();
981
}
982
}
983
return TRUE;
984
985
case cUpdateWithF1Item:
986
menu = GetMenu(hWnd);
987
if (updateF1) {
988
updateF1 = FALSE;
989
CheckMenuItem( menu, cUpdateWithF1Item,
990
MF_BYCOMMAND | MFS_UNCHECKED );
991
UnhookWindowsHookEx((HHOOK)KeyboardProc);
992
} else {
993
updateF1 = TRUE;
994
CheckMenuItem( menu, cUpdateWithF1Item,
995
MF_BYCOMMAND | MFS_CHECKED );
996
prevKbdHook = SetWindowsHookEx( WH_KEYBOARD, KeyboardProc,
997
theInstance,
998
::GetCurrentThreadId() );
999
if (! prevKbdHook) {
1000
lastError = ::GetLastError();
1001
}
1002
}
1003
return TRUE;
1004
1005
case cUpdateWithF2Item:
1006
menu = GetMenu(hWnd);
1007
if (updateF2) {
1008
updateF2 = FALSE;
1009
CheckMenuItem( menu, cUpdateWithF2Item,
1010
MF_BYCOMMAND | MFS_UNCHECKED );
1011
UnhookWindowsHookEx((HHOOK)KeyboardProc);
1012
} else {
1013
updateF2 = TRUE;
1014
CheckMenuItem(menu, cUpdateWithF2Item,
1015
MF_BYCOMMAND | MFS_CHECKED);
1016
prevKbdHook = SetWindowsHookEx( WH_KEYBOARD, KeyboardProc,
1017
theInstance, ::GetCurrentThreadId() );
1018
if (! prevKbdHook) {
1019
lastError = ::GetLastError();
1020
}
1021
}
1022
return TRUE;
1023
1024
case cMonitorTheSameEventsAsJAWS:
1025
/*
1026
Causes jaccessinspetor to monitor the same events as JAWS. Useful
1027
when testing to determine if a bug is specific to JAWS or if it can
1028
be reproduced in jaccessinspector as well.
1029
*/
1030
trackMouse = FALSE;
1031
trackMouseExited = FALSE;
1032
trackMouseClicked = FALSE;
1033
trackMousePressed = FALSE;
1034
trackMouseReleased = FALSE;
1035
trackFocus = TRUE;
1036
trackFocusLost = TRUE;
1037
trackCaret = FALSE;
1038
trackShutdown = FALSE;
1039
1040
trackMenuSelected = FALSE;
1041
trackMenuDeselected = FALSE;
1042
trackMenuCanceled = FALSE;
1043
1044
trackPopupVisible = FALSE;
1045
trackPopupInvisible = FALSE;
1046
trackPopupCanceled = FALSE;
1047
1048
trackPropertyNameChange = TRUE;
1049
trackPropertyDescriptionChange = TRUE;
1050
trackPropertyStateChange = TRUE;
1051
trackPropertyValueChange = TRUE;
1052
trackPropertySelectionChange = TRUE;
1053
trackPropertyTextChange = TRUE;
1054
trackPropertyCaretChange = TRUE;
1055
trackPropertyVisibleDataChange = FALSE;
1056
trackPropertyChildChange = TRUE;
1057
trackPropertyActiveDescendentChange = TRUE;
1058
trackPropertyTableModelChange = FALSE;
1059
1060
ApplyEventOptions(hWnd);
1061
1062
return TRUE;
1063
1064
case cMonitorAllEvents:
1065
/*
1066
Causes jaccessinspector to monitor all Java Events and all
1067
Accessibility Events.
1068
*/
1069
trackMouse = TRUE;
1070
trackMouseExited = TRUE;
1071
trackMouseClicked = TRUE;
1072
trackMousePressed = TRUE;
1073
trackMouseReleased = TRUE;
1074
trackFocus = TRUE;
1075
trackFocusLost = TRUE;
1076
trackCaret = TRUE;
1077
trackShutdown = TRUE;
1078
1079
trackMenuSelected = TRUE;
1080
trackMenuDeselected = TRUE;
1081
trackMenuCanceled = TRUE;
1082
1083
trackPopupVisible = TRUE;
1084
trackPopupInvisible = TRUE;
1085
trackPopupCanceled = TRUE;
1086
1087
trackPropertyNameChange = TRUE;
1088
trackPropertyDescriptionChange = TRUE;
1089
trackPropertyStateChange = TRUE;
1090
trackPropertyValueChange = TRUE;
1091
trackPropertySelectionChange = TRUE;
1092
trackPropertyTextChange = TRUE;
1093
trackPropertyCaretChange = TRUE;
1094
trackPropertyVisibleDataChange = TRUE;
1095
trackPropertyChildChange = TRUE;
1096
trackPropertyActiveDescendentChange = TRUE;
1097
trackPropertyTableModelChange = TRUE;
1098
1099
ApplyEventOptions(hWnd);
1100
1101
return TRUE;
1102
1103
case cFirstMessage:
1104
{
1105
const char * messageText = g_MessageHistory.GetFirstMessage ();
1106
if ( ( NULL != messageText ) && ( 0 != messageText [0] ) ) {
1107
::SetDlgItemText( theDialogWindow, cjaccessinspectorText,
1108
messageText );
1109
}
1110
EnableMessageNavButtons();
1111
UpdateMessageNumber();
1112
return TRUE;
1113
}
1114
break;
1115
1116
case cPreviousMessage:
1117
{
1118
const char * messageText = g_MessageHistory.GetPreviousMessage ();
1119
if ( ( NULL != messageText ) && ( 0 != messageText [0] ) ) {
1120
::SetDlgItemText( theDialogWindow, cjaccessinspectorText,
1121
messageText );
1122
}
1123
EnableMessageNavButtons();
1124
UpdateMessageNumber();
1125
return TRUE;
1126
}
1127
break;
1128
1129
case cNextMessage:
1130
{
1131
const char * messageText = g_MessageHistory.GetNextMessage ();
1132
if ( ( NULL != messageText ) && ( 0 != messageText [0] ) ) {
1133
::SetDlgItemText( theDialogWindow, cjaccessinspectorText,
1134
messageText );
1135
}
1136
EnableMessageNavButtons();
1137
UpdateMessageNumber();
1138
return TRUE;
1139
}
1140
break;
1141
1142
case cLastMessage:
1143
{
1144
const char * messageText = g_MessageHistory.GetLastMessage();
1145
if ( ( NULL != messageText ) && ( 0 != messageText [0] ) ) {
1146
::SetDlgItemText( theDialogWindow, cjaccessinspectorText,
1147
messageText );
1148
}
1149
EnableMessageNavButtons();
1150
UpdateMessageNumber();
1151
return TRUE;
1152
}
1153
break;
1154
1155
case cResetAllEvents:
1156
trackMouse = FALSE;
1157
trackMouseExited = FALSE;
1158
trackMouseClicked = FALSE;
1159
trackMousePressed = FALSE;
1160
trackMouseReleased = FALSE;
1161
trackFocus = FALSE;
1162
trackFocusLost = FALSE;
1163
trackCaret = FALSE;
1164
trackShutdown = FALSE;
1165
1166
trackMenuSelected = FALSE;
1167
trackMenuDeselected = FALSE;
1168
trackMenuCanceled = FALSE;
1169
1170
trackPopupVisible = FALSE;
1171
trackPopupInvisible = FALSE;
1172
trackPopupCanceled = FALSE;
1173
1174
trackPropertyNameChange = FALSE;
1175
trackPropertyDescriptionChange = FALSE;
1176
trackPropertyStateChange = FALSE;
1177
trackPropertyValueChange = FALSE;
1178
trackPropertySelectionChange = FALSE;
1179
trackPropertyTextChange = FALSE;
1180
trackPropertyCaretChange = FALSE;
1181
trackPropertyVisibleDataChange = FALSE;
1182
trackPropertyChildChange = FALSE;
1183
trackPropertyActiveDescendentChange = FALSE;
1184
trackPropertyTableModelChange = FALSE;
1185
1186
ApplyEventOptions(hWnd);
1187
1188
return TRUE;
1189
1190
case cGoToMessage:
1191
InitGoToMessageDialogBox(theInstance);
1192
break;
1193
1194
case cClearMessageHistory:
1195
g_MessageHistory.clear();
1196
::SetDlgItemText(theDialogWindow, cjaccessinspectorText, NULL);
1197
EnableMessageNavButtons();
1198
UpdateMessageNumber();
1199
break;
1200
}
1201
break;
1202
1203
case DISPLAY_INFO_MESSAGE:
1204
echoMouseObject();
1205
return TRUE;
1206
1207
case DISPLAY_HWND_INFO_MESSAGE:
1208
echoMouseHWNDObject();
1209
return TRUE;
1210
}
1211
1212
return FALSE;
1213
}
1214
1215
#define SaveOptionToRegistry(optionVar) { \
1216
SetValue = RegSetValueEx( hKey, #optionVar, 0, REG_DWORD, \
1217
(LPBYTE)(&optionVar), sizeof(DWORD)); \
1218
if ( ERROR_SUCCESS != SetValue ) { \
1219
++ failureCount; \
1220
} \
1221
}
1222
1223
BOOL SaveActiveEventOptionsToRegistry() {
1224
LONG CreateKey = ERROR_SUCCESS;
1225
HKEY hKey = NULL;
1226
DWORD Disposition = 0;
1227
1228
CreateKey = ::RegCreateKeyEx( HKEY_CURRENT_USER,
1229
jaccessinspectorOptionsRegistryKey, 0, 0, 0,
1230
KEY_READ|KEY_WRITE, 0, &hKey, &Disposition );
1231
if ( ( ERROR_SUCCESS != CreateKey ) || ( NULL == hKey ) ) {
1232
return FALSE;
1233
}
1234
1235
LONG SetValue = ERROR_SUCCESS;
1236
unsigned long failureCount = 0;
1237
1238
SaveOptionToRegistry(trackMouse);
1239
SaveOptionToRegistry(trackMouseExited);
1240
SaveOptionToRegistry(trackMouseClicked);
1241
SaveOptionToRegistry(trackMousePressed);
1242
SaveOptionToRegistry(trackMouseReleased);
1243
SaveOptionToRegistry(trackShutdown);
1244
SaveOptionToRegistry(trackFocus);
1245
SaveOptionToRegistry(trackFocusLost);
1246
SaveOptionToRegistry(trackCaret);
1247
SaveOptionToRegistry(trackMenuSelected);
1248
SaveOptionToRegistry(trackMenuDeselected);
1249
SaveOptionToRegistry(trackMenuCanceled);
1250
SaveOptionToRegistry(trackPopupVisible);
1251
SaveOptionToRegistry(trackPopupInvisible);
1252
SaveOptionToRegistry(trackPopupCanceled);
1253
SaveOptionToRegistry(trackPropertyNameChange);
1254
SaveOptionToRegistry(trackPropertyDescriptionChange);
1255
SaveOptionToRegistry(trackPropertyStateChange);
1256
SaveOptionToRegistry(trackPropertyValueChange);
1257
SaveOptionToRegistry(trackPropertySelectionChange);
1258
SaveOptionToRegistry(trackPropertyTextChange);
1259
SaveOptionToRegistry(trackPropertyCaretChange);
1260
SaveOptionToRegistry(trackPropertyVisibleDataChange);
1261
SaveOptionToRegistry(trackPropertyChildChange);
1262
SaveOptionToRegistry(trackPropertyActiveDescendentChange);
1263
SaveOptionToRegistry(trackPropertyTableModelChange);
1264
1265
::RegFlushKey(hKey);
1266
::RegCloseKey(hKey);
1267
1268
if ( 0 == failureCount ) {
1269
return TRUE;
1270
}
1271
return FALSE;
1272
}
1273
1274
#define ReadOptionFromRegistry(optionVar) { \
1275
Type = Value = 0; \
1276
ValueSize = sizeof(DWORD); \
1277
QueryValue = ::RegQueryValueEx( hKey, #optionVar, NULL, &Type, \
1278
(LPBYTE)(&Value), &ValueSize); \
1279
if ( ( ERROR_SUCCESS == QueryValue ) && ( REG_DWORD == Type ) ) { \
1280
optionVar = static_cast<BOOL>(Value); \
1281
} else { \
1282
++ failureCount; \
1283
} \
1284
}
1285
1286
BOOL ReadActiveEventOptionsFromRegistry() {
1287
1288
trackMouse = FALSE;
1289
trackMouseExited = FALSE;
1290
trackMouseClicked = FALSE;
1291
trackMousePressed = FALSE;
1292
trackMouseReleased = FALSE;
1293
1294
trackShutdown = FALSE;
1295
trackFocus = FALSE;
1296
trackFocusLost = FALSE;
1297
trackCaret = FALSE;
1298
trackMenuSelected = FALSE;
1299
trackMenuDeselected = FALSE;
1300
trackMenuCanceled = FALSE;
1301
trackPopupVisible = FALSE;
1302
trackPopupInvisible = FALSE;
1303
trackPopupCanceled = FALSE;
1304
1305
trackPropertyNameChange = FALSE;
1306
trackPropertyDescriptionChange = FALSE;
1307
trackPropertyStateChange = FALSE;
1308
trackPropertyValueChange = FALSE;
1309
trackPropertySelectionChange = FALSE;
1310
trackPropertyTextChange = FALSE;
1311
trackPropertyCaretChange = FALSE;
1312
trackPropertyVisibleDataChange = FALSE;
1313
trackPropertyChildChange = FALSE;
1314
trackPropertyActiveDescendentChange = FALSE;
1315
trackPropertyTableModelChange = FALSE;
1316
1317
LONG OpenKey = ERROR_SUCCESS;
1318
HKEY hKey = NULL;
1319
OpenKey = ::RegOpenKeyEx( HKEY_CURRENT_USER,
1320
jaccessinspectorOptionsRegistryKey, 0,
1321
KEY_READ, &hKey );
1322
if ( ( ERROR_SUCCESS != OpenKey ) || ( NULL == hKey ) ) {
1323
return FALSE;
1324
}
1325
1326
LONG QueryValue = ERROR_SUCCESS;
1327
unsigned long failureCount = 0;
1328
DWORD Type, Value, ValueSize;
1329
1330
ReadOptionFromRegistry(trackMouse);
1331
ReadOptionFromRegistry(trackMouseExited);
1332
ReadOptionFromRegistry(trackMouseClicked);
1333
ReadOptionFromRegistry(trackMousePressed);
1334
ReadOptionFromRegistry(trackMouseReleased);
1335
ReadOptionFromRegistry(trackShutdown);
1336
ReadOptionFromRegistry(trackFocus);
1337
ReadOptionFromRegistry(trackFocusLost);
1338
ReadOptionFromRegistry(trackCaret);
1339
ReadOptionFromRegistry(trackMenuSelected);
1340
ReadOptionFromRegistry(trackMenuDeselected);
1341
ReadOptionFromRegistry(trackMenuCanceled);
1342
ReadOptionFromRegistry(trackPopupVisible);
1343
ReadOptionFromRegistry(trackPopupInvisible);
1344
ReadOptionFromRegistry(trackPopupCanceled);
1345
ReadOptionFromRegistry(trackPropertyNameChange);
1346
ReadOptionFromRegistry(trackPropertyDescriptionChange);
1347
ReadOptionFromRegistry(trackPropertyStateChange);
1348
ReadOptionFromRegistry(trackPropertyValueChange);
1349
ReadOptionFromRegistry(trackPropertySelectionChange);
1350
ReadOptionFromRegistry(trackPropertyTextChange);
1351
ReadOptionFromRegistry(trackPropertyCaretChange);
1352
ReadOptionFromRegistry(trackPropertyVisibleDataChange);
1353
ReadOptionFromRegistry(trackPropertyChildChange);
1354
ReadOptionFromRegistry(trackPropertyActiveDescendentChange);
1355
ReadOptionFromRegistry(trackPropertyTableModelChange);
1356
1357
::RegCloseKey(hKey);
1358
1359
if ( 0 == failureCount ) {
1360
return TRUE;
1361
}
1362
return FALSE;
1363
}
1364
1365
#define APPLY_EVENT_OPTION(menuItem, optionVar, setFP, handler) \
1366
{ \
1367
if ( optionVar ) { \
1368
::CheckMenuItem(menu, menuItem, MF_BYCOMMAND | MF_CHECKED); \
1369
setFP (handler); \
1370
} else { \
1371
::CheckMenuItem(menu, menuItem, MF_BYCOMMAND | MF_UNCHECKED); \
1372
setFP (NULL); \
1373
} \
1374
}
1375
1376
void ApplyEventOptions (HWND hWnd) {
1377
1378
HMENU menu = ::GetMenu (hWnd);
1379
APPLY_EVENT_OPTION( cTrackMouseMenuItem, trackMouse, SetMouseEntered,
1380
HandleMouseEntered );
1381
APPLY_EVENT_OPTION( cTrackMouseExitedMenuItem, trackMouseExited,
1382
SetMouseExited, HandleMouseExited );
1383
APPLY_EVENT_OPTION( cTrackMouseClickedMenuItem, trackMouseClicked,
1384
SetMouseClicked, HandleMouseClicked );
1385
APPLY_EVENT_OPTION( cTrackMousePressedMenuItem, trackMousePressed,
1386
SetMousePressed, HandleMousePressed );
1387
APPLY_EVENT_OPTION( cTrackMouseReleasedMenuItem, trackMouseReleased,
1388
SetMouseReleased, HandleMouseReleased );
1389
1390
APPLY_EVENT_OPTION( cTrackShutdownMenuItem, trackShutdown, SetJavaShutdown,
1391
HandleJavaShutdown );
1392
APPLY_EVENT_OPTION( cTrackFocusMenuItem, trackFocus, SetFocusGained,
1393
HandleJavaFocusGained );
1394
APPLY_EVENT_OPTION( cTrackFocusLostMenuItem, trackFocusLost, SetFocusLost,
1395
HandleJavaFocusLost );
1396
APPLY_EVENT_OPTION( cTrackCaretMenuItem, trackCaret, SetCaretUpdate,
1397
HandleJavaCaretUpdate );
1398
1399
APPLY_EVENT_OPTION( cTrackMenuSelectedMenuItem, trackMenuSelected,
1400
SetMenuSelected, HandleMenuSelected );
1401
APPLY_EVENT_OPTION( cTrackMenuDeselectedMenuItem, trackMenuDeselected,
1402
SetMenuDeselected, HandleMenuDeselected );
1403
APPLY_EVENT_OPTION( cTrackMenuCanceledItem, trackMenuCanceled,
1404
SetMenuCanceled, HandleMenuCanceled );
1405
1406
APPLY_EVENT_OPTION( cTrackPopupBecomeVisibleMenuItem, trackPopupVisible,
1407
SetPopupMenuWillBecomeVisible,
1408
HandlePopupMenuWillBecomeVisible );
1409
APPLY_EVENT_OPTION( cTrackPopupBecomeInvisibleMenuItem, trackPopupInvisible,
1410
SetPopupMenuWillBecomeInvisible,
1411
HandlePopupMenuWillBecomeInvisible );
1412
APPLY_EVENT_OPTION( cTrackPopupCanceledItem, trackPopupCanceled,
1413
SetPopupMenuCanceled, HandlePopupMenuCanceled );
1414
1415
APPLY_EVENT_OPTION( cTrackPropertyNameItem, trackPropertyNameChange,
1416
SetPropertyNameChange, HandlePropertyNameChange );
1417
APPLY_EVENT_OPTION( cTrackPropertyDescriptionItem,
1418
trackPropertyDescriptionChange,
1419
SetPropertyDescriptionChange,
1420
HandlePropertyDescriptionChange );
1421
APPLY_EVENT_OPTION( cTrackPropertyStateItem, trackPropertyStateChange,
1422
SetPropertyStateChange, HandlePropertyStateChange );
1423
APPLY_EVENT_OPTION( cTrackPropertyValueItem, trackPropertyValueChange,
1424
SetPropertyValueChange, HandlePropertyValueChange );
1425
APPLY_EVENT_OPTION( cTrackPropertySelectionItem,
1426
trackPropertySelectionChange,
1427
SetPropertySelectionChange,
1428
HandlePropertySelectionChange);
1429
APPLY_EVENT_OPTION( cTrackPropertyTextItem, trackPropertyTextChange,
1430
SetPropertyTextChange, HandlePropertyTextChange );
1431
APPLY_EVENT_OPTION( cTrackPropertyCaretItem, trackPropertyCaretChange,
1432
SetPropertyCaretChange, HandlePropertyCaretChange );
1433
APPLY_EVENT_OPTION( cTrackPropertyVisibleDataItem,
1434
trackPropertyVisibleDataChange,
1435
SetPropertyVisibleDataChange,
1436
HandlePropertyVisibleDataChange );
1437
APPLY_EVENT_OPTION( cTrackPropertyChildItem, trackPropertyChildChange,
1438
SetPropertyChildChange, HandlePropertyChildChange );
1439
APPLY_EVENT_OPTION( cTrackPropertyActiveDescendentItem,
1440
trackPropertyActiveDescendentChange,
1441
SetPropertyActiveDescendentChange,
1442
HandlePropertyActiveDescendentChange );
1443
APPLY_EVENT_OPTION( cTrackPropertyTableModelChangeItem,
1444
trackPropertyTableModelChange,
1445
SetPropertyTableModelChange,
1446
HandlePropertyTableModelChange );
1447
1448
MaybeCheckMonitorTheSameEventsAsJAWS(menu);
1449
MaybeCheckMonitorAllEvents(menu);
1450
}
1451
1452
BOOL EnableDlgItem(HWND hDlg, int nIDDlgItem, BOOL bEnable) {
1453
HWND dlgItem = ::GetDlgItem(hDlg, nIDDlgItem);
1454
if ( NULL == dlgItem ) {
1455
return FALSE;
1456
}
1457
return ::EnableWindow (dlgItem, bEnable);
1458
}
1459
1460
void EnableMessageNavButtons() {
1461
HWND FocusWindow = ::GetFocus();
1462
int FocusCtrlID = ::GetDlgCtrlID(FocusWindow);
1463
BOOL DisabledFocusWindow = FALSE;
1464
if ( 0 == g_MessageHistory.GetMessageCount () ) {
1465
EnableDlgItem(theDialogWindow, cFirstMessage, FALSE);
1466
EnableDlgItem(theDialogWindow, cPreviousMessage, FALSE);
1467
EnableDlgItem(theDialogWindow, cMessageNumber, FALSE);
1468
EnableDlgItem(theDialogWindow, cNextMessage, FALSE);
1469
EnableDlgItem(theDialogWindow, cLastMessage, FALSE);
1470
} else if ( g_MessageHistory.IsFirstMessage () ) {
1471
EnableDlgItem(theDialogWindow, cFirstMessage, FALSE);
1472
EnableDlgItem(theDialogWindow, cPreviousMessage, FALSE);
1473
EnableDlgItem(theDialogWindow, cMessageNumber, TRUE);
1474
EnableDlgItem(theDialogWindow, cNextMessage, TRUE);
1475
EnableDlgItem(theDialogWindow, cLastMessage, TRUE);
1476
if ( ( cFirstMessage == FocusCtrlID ) ||
1477
( cPreviousMessage == FocusCtrlID ) ) {
1478
DisabledFocusWindow = TRUE;
1479
}
1480
} else if ( g_MessageHistory.IsLastMessage () ) {
1481
EnableDlgItem(theDialogWindow, cFirstMessage, TRUE);
1482
EnableDlgItem(theDialogWindow, cPreviousMessage, TRUE);
1483
EnableDlgItem(theDialogWindow, cMessageNumber, TRUE);
1484
EnableDlgItem(theDialogWindow, cNextMessage, FALSE);
1485
EnableDlgItem(theDialogWindow, cLastMessage, FALSE);
1486
1487
if ( ( cNextMessage == FocusCtrlID ) ||
1488
( cLastMessage == FocusCtrlID ) ) {
1489
DisabledFocusWindow = TRUE;
1490
}
1491
} else {
1492
EnableDlgItem(theDialogWindow, cFirstMessage, TRUE);
1493
EnableDlgItem(theDialogWindow, cPreviousMessage, TRUE);
1494
EnableDlgItem(theDialogWindow, cMessageNumber, TRUE);
1495
EnableDlgItem(theDialogWindow, cNextMessage, TRUE);
1496
EnableDlgItem(theDialogWindow, cLastMessage, TRUE);
1497
}
1498
1499
if ( DisabledFocusWindow ) {
1500
/*
1501
We just disabled the window that had the focus. Set focus to the
1502
cjaccessinspectorText window. Otherwise it will no longer be possible
1503
to tab through the controls in jaccessinspector.
1504
*/
1505
HWND jaccessinspectorText =
1506
::GetDlgItem(theDialogWindow, cjaccessinspectorText);
1507
if ( jaccessinspectorText ) {
1508
::SetFocus(jaccessinspectorText);
1509
}
1510
}
1511
}
1512
1513
void WINAPI AddToMessageHistory(const char * message) {
1514
g_MessageHistory.AddMessage(message);
1515
EnableMessageNavButtons();
1516
UpdateMessageNumber();
1517
}
1518
1519
BOOL UpdateMessageNumber () {
1520
HWND dlgItem = ::GetDlgItem(theDialogWindow, cMessageNumber);
1521
if ( NULL == dlgItem ) {
1522
return FALSE;
1523
}
1524
1525
size_t messageCount = g_MessageHistory.GetMessageCount();
1526
size_t messageNumber = g_MessageHistory.GetCurrentMessageIndex() + 1;
1527
char text [32] = {0};
1528
if ( 0 != messageCount ) {
1529
::_snprintf(text, sizeof(text), "%d of %d", (int)messageNumber,
1530
(int) messageCount);
1531
}
1532
return ::SetWindowText(dlgItem, text);
1533
}
1534
1535
INT_PTR CALLBACK GoToMessageDialogProc( HWND hDlg, UINT message, WPARAM wParam,
1536
LPARAM lParam ) {
1537
BOOL ret_val = FALSE;
1538
switch ( message ) {
1539
case WM_INITDIALOG:
1540
{
1541
/*
1542
This code to center the Go To Message dialog box in the
1543
jaccessinspector window was taken from
1544
<http://msdn.microsoft.com/en-us/library/ms644996(VS.85).aspx>.
1545
*/
1546
HWND hwndOwner = NULL;
1547
RECT rcOwner = { 0, 0, 0, 0 };
1548
RECT rc = { 0, 0, 0, 0 };
1549
RECT rcDlg = { 0, 0, 0, 0 };
1550
1551
// Get the owner window and dialog box rectangles.
1552
if ( NULL == (hwndOwner = GetParent(hDlg)) ) {
1553
hwndOwner = GetDesktopWindow();
1554
}
1555
1556
GetWindowRect(hwndOwner, &rcOwner);
1557
GetWindowRect(hDlg, &rcDlg);
1558
CopyRect(&rc, &rcOwner);
1559
1560
// Offset the owner and dialog box rectangles so that right and
1561
// bottom values represent the width and height, and then offset
1562
// the owner again to discard space taken up by the dialog box.
1563
OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
1564
OffsetRect(&rc, -rc.left, -rc.top);
1565
OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);
1566
1567
// The new position is the sum of half the remaining space and the
1568
// owner's original position.
1569
SetWindowPos (hDlg,
1570
HWND_TOP,
1571
rcOwner.left + (rc.right / 2),
1572
rcOwner.top + (rc.bottom / 2),
1573
0, 0, // Ignores size arguments.
1574
SWP_NOSIZE);
1575
}
1576
break;
1577
1578
case WM_COMMAND:
1579
switch ( LOWORD (wParam) ) {
1580
case IDOK:
1581
{
1582
size_t GoToMessageNumber = 0;
1583
BOOL Translated = FALSE;
1584
GoToMessageNumber = GetDlgItemInt( hDlg, IDC_MESSAGE_NUMBER_EDIT,
1585
&Translated, FALSE );
1586
EndDialog (hDlg, IDOK);
1587
theGoToDialogWindow = NULL;
1588
1589
if ( ( Translated ) && ( GoToMessageNumber > 0 ) ) {
1590
const char * messageText = NULL;
1591
if ( (GoToMessageNumber - 1) <
1592
g_MessageHistory.GetMessageCount() ) {
1593
messageText =
1594
g_MessageHistory.GetMessage(GoToMessageNumber - 1);
1595
} else if ( (GoToMessageNumber - 1) >=
1596
g_MessageHistory.GetMessageCount() ) {
1597
messageText = g_MessageHistory.GetLastMessage();
1598
}
1599
if ( ( NULL != messageText ) && ( 0 != messageText [0] ) ) {
1600
::SetDlgItemText( theDialogWindow, cjaccessinspectorText,
1601
messageText );
1602
}
1603
EnableMessageNavButtons();
1604
UpdateMessageNumber();
1605
}
1606
}
1607
break;
1608
case IDCANCEL:
1609
EndDialog(hDlg, IDCANCEL);
1610
theGoToDialogWindow = NULL;
1611
break;
1612
}
1613
break;
1614
}
1615
return ret_val;
1616
}
1617
1618
BOOL InitGoToMessageDialogBox (HANDLE hInstance) {
1619
theGoToDialogWindow = CreateDialog (
1620
(struct HINSTANCE__ *)hInstance, MAKEINTRESOURCE(IDD_GO_TO_MESSAGE),
1621
theDialogWindow, GoToMessageDialogProc);
1622
1623
if ( NULL == theGoToDialogWindow ) {
1624
return FALSE;
1625
}
1626
1627
ShowWindow (theGoToDialogWindow, SW_SHOW);
1628
return TRUE;
1629
}
1630
1631
BOOL ShouldCheckMonitorTheSameEventsAsJAWS () {
1632
if (
1633
( FALSE == trackMouse )
1634
&& ( FALSE == trackMouseExited )
1635
&& ( FALSE == trackMouseClicked )
1636
&& ( FALSE == trackMousePressed )
1637
&& ( FALSE == trackMouseReleased )
1638
&& ( TRUE == trackFocus )
1639
&& ( TRUE == trackFocusLost )
1640
&& ( FALSE == trackCaret )
1641
&& ( FALSE == trackShutdown )
1642
&& ( FALSE == trackMenuSelected )
1643
&& ( FALSE == trackMenuDeselected )
1644
&& ( FALSE == trackMenuCanceled )
1645
&& ( FALSE == trackPopupVisible )
1646
&& ( FALSE == trackPopupInvisible )
1647
&& ( FALSE == trackPopupCanceled )
1648
&& ( TRUE == trackPropertyNameChange )
1649
&& ( TRUE == trackPropertyDescriptionChange )
1650
&& ( TRUE == trackPropertyStateChange )
1651
&& ( TRUE == trackPropertyValueChange )
1652
&& ( TRUE == trackPropertySelectionChange )
1653
&& ( TRUE == trackPropertyTextChange )
1654
&& ( TRUE == trackPropertyCaretChange )
1655
&& ( FALSE == trackPropertyVisibleDataChange )
1656
&& ( TRUE == trackPropertyChildChange )
1657
&& ( TRUE == trackPropertyActiveDescendentChange )
1658
&& ( FALSE == trackPropertyTableModelChange )
1659
)
1660
{
1661
return TRUE;
1662
}
1663
1664
return FALSE;
1665
}
1666
1667
void MaybeCheckMonitorTheSameEventsAsJAWS(HMENU menu) {
1668
UINT uCheck = MF_BYCOMMAND | MF_UNCHECKED;
1669
if ( ShouldCheckMonitorTheSameEventsAsJAWS() ) {
1670
uCheck = MF_BYCOMMAND | MF_CHECKED;
1671
}
1672
::CheckMenuItem(menu, cMonitorTheSameEventsAsJAWS, uCheck);
1673
}
1674
1675
BOOL ShouldCheckMonitorAllEvents() {
1676
if (
1677
( TRUE == trackMouse )
1678
&& ( TRUE == trackMouseExited )
1679
&& ( TRUE == trackMouseClicked )
1680
&& ( TRUE == trackMousePressed )
1681
&& ( TRUE == trackMouseReleased )
1682
&& ( TRUE == trackFocus )
1683
&& ( TRUE == trackFocusLost )
1684
&& ( TRUE == trackCaret )
1685
&& ( TRUE == trackShutdown )
1686
&& ( TRUE == trackMenuSelected )
1687
&& ( TRUE == trackMenuDeselected )
1688
&& ( TRUE == trackMenuCanceled )
1689
&& ( TRUE == trackPopupVisible )
1690
&& ( TRUE == trackPopupInvisible )
1691
&& ( TRUE == trackPopupCanceled )
1692
&& ( TRUE == trackPropertyNameChange )
1693
&& ( TRUE == trackPropertyDescriptionChange )
1694
&& ( TRUE == trackPropertyStateChange )
1695
&& ( TRUE == trackPropertyValueChange )
1696
&& ( TRUE == trackPropertySelectionChange )
1697
&& ( TRUE == trackPropertyTextChange )
1698
&& ( TRUE == trackPropertyCaretChange )
1699
&& ( TRUE == trackPropertyVisibleDataChange )
1700
&& ( TRUE == trackPropertyChildChange )
1701
&& ( TRUE == trackPropertyActiveDescendentChange )
1702
&& ( TRUE == trackPropertyTableModelChange )
1703
)
1704
{
1705
return TRUE;
1706
}
1707
1708
return FALSE;
1709
}
1710
1711
void MaybeCheckMonitorAllEvents(HMENU menu) {
1712
UINT uCheck = MF_BYCOMMAND | MF_UNCHECKED;
1713
if ( ShouldCheckMonitorAllEvents() ) {
1714
uCheck = MF_BYCOMMAND | MF_CHECKED;
1715
}
1716
::CheckMenuItem(menu, cMonitorAllEvents, uCheck);
1717
}
1718
1719