commit 3aa8dafc5c87d848f99d3d22c96bfe9cc1f1dbfe Author: theadam Date: Sun Mar 30 14:31:46 2025 +0200 first script diff --git a/toggle-say-indent/DEFAULT.JSD b/toggle-say-indent/DEFAULT.JSD new file mode 100755 index 0000000..79de409 --- /dev/null +++ b/toggle-say-indent/DEFAULT.JSD @@ -0,0 +1,6 @@ +:script ToggleSayIndentation +:SearchRank 1 +:Synopsis Toggle indentation say on or off quickly! +:Description Toggle indentation say on or off quickly! +:Category Text + diff --git a/toggle-say-indent/DEFAULT.JSS b/toggle-say-indent/DEFAULT.JSS new file mode 100755 index 0000000..e8902ea --- /dev/null +++ b/toggle-say-indent/DEFAULT.JSS @@ -0,0 +1,27595 @@ +; Copyright 1995-2024 by Freedom Scientific, Inc. +; Freedom Scientific default script file + +; If you want to modify default.jss, ensure that the lines for ScriptFileVersion and for ScriptFile do not appear in the default script files saved to your user settings. +; If your user default script file include the ScriptFileVersion line and if that file is migrated to a different version of JAWS, +; JAWS will fail to load the default scripts when its version does not match the JAWS version. +; In general, any time you modify a script file from shared and save into the user area, +; the script file in the user area should only contain the functions or scripts which you wish to customize. +; Your customized scripts and functions should contain only the customized code to be executed, +; then they should call the script or function from the shared area when the customized situation does not apply. +; By following this set of rules, you greatly minimize the risk of failing to receive updates to the shared scripts. +;Do not localize the following two lines: +ScriptFileVersion 26 +ScriptFile "Freedom Scientific Default Script" + + +Include "HjGlobal.jsh" ; default HJ global variables +Include "hjconst.jsh" ; default HJ constants +include "MSAAConst.jsh" +include "iAccessible2.jsh" +include "UIA.jsh" +include "XMLDom.jsh" +include "FSIMouseSpeech.jsh" +Include "HjHelp.jsh" ; Help Topic Constants +include "locale.jsh" +Include "common.jsm" ; message file +include "MAGic.jsm" +Include "JTController.jsm" +;Next two includes for Personalize Web Setting and other IE info. +include "IECustomSettings.jsh" +include "IE.jsm";For Personalize Web Setting and other IE info. +Include "magic.jsh" +Include "magcodes.jsh" +include "WinStyles.jsh"; Win Style Bits Constants used by the GetWindowStyleBits function +include "ZoomSoftware.jsm" ; for Zoom Software alerts +Include "FSLog.jsh" + +use "UIA.jsb" +use "HomeRowWindows.jsb" +use "HomeRowMSAA.jsb" +use "HomeRowUIAObject.jsb" +use "HomeRowXMLDom.jsb" +use "magic.jsb" +use "say.jsb" +use "FSXMLDomFunctions.jsb" +use "touch.jsb" +use "Braille.jsb" +use "FSIMouseSpeech.jsb" +Use "Virtual.jsb" +use "TutorialHelp.jsb" +use "UserBufferTemp.jsb" +use "VKeyboard.jsb";For the Select Symbol To Print dialog. +use "htlib.jsb" +use "ph.jsb" +use "FileIO.jsb" ; CollectionToFile and FileToCollection (ini-style). +use "uoSayAllSchemes.jsb" +Use "UserOptions.jsb" +Use "VerbosityCore.jsb" +Use "VoIPHelper.jsb" +use "SkypeWatch.jsb"; Manages Skype Alerts in background. +use "LyncWatch.jsb" ; Skype for Business bakground alerts +use "myExtensions.jsb" +use "LiveResourceLookup.jsb" +Use "QuickSet.jsb" ; For Quick Settings functions / callbacks. +Use "deprecated.jsb" ;speak messages about deprecated script functions +use "SmartNav.jsb" +use "FSLog.jsb" +use "ZTUtil.jsb" +use "FaceInViewFunc.jsb" + +Const +; UT_OutputModes + UT_SayTypeAndText = 0, + UT_FOCUS = 1, + UT_CONTROLID = 2, + UT_CLASS = 3, + UT_TYPE = 4, + UT_SUBTYPE = 5, + UT_REALNAME = 6, + ut_ObjectName = 0, + ut_ObjectType = 1, + ut_ObjectSubType = 2, + ut_ObjectValue = 3, + ut_ObjectState = 4 + +Globals + string priorTopLineOfNewContent, ; Used to determine where to read when a webpage updates. +;for a short time after a focus change away from the JAWS find dialog, we want to keep OCR text available. + int JAWSFindComplete, +; for AdjustMAGicOptions dialog box: + int gbSupportsMAGicOptions, +;For scheduling mouse wheel speech. + int giFN_SpeakMagLevelMessage, + int giMagLevel, +;prevents multiple requests for OCRLanguages + string gstrOCRLangStrings, +;For enabling touch mode specific gestures + int gbPerModeGesturesEnabled, +; Used by the ShouldDoDeleteSayCharacterAfterDelete function. + IntArray g_ShouldSayCharacterAfterDeleteArray + +;For KeyboardLayoutChanged, +;Update and set by script and event: +const + DelayWhileKeyboardInputSwitching = 10 +globals + int gbKeyboardLayoutChange, + int ActiveLangId, + string ActiveLayoutName + +CONST +; for Zoom Software Alerts: + ZoomNotificationWindowClass = "zoom_acc_notify_wnd" + + +globals +; for TalkToJAWS keystroke, schedule internal function so that double press of the keystroke won't accidentally make it happen. +; Double Press = ToggleWakeWordSetting script function instead. + int GlobalTalkToJAWSTimer, +; For the RepeatLastNotification keystroke insert+Space&N + string LastSpokenNotificationForRepeat, + ; We want to no when the last notification occurred, so we don't repeat ourselves endlessly. + int LastSpokenNotificationTickCount, + ; Is Notification Manager enabled? + int g_NotificationManagerEnabled, + ;globals for limiting notifications from SnippingTool: + int giScheduledUIANotification, + string gsUIANotificationDisplayString, + string gsUIANotificationAppName + +globals +; for page elements announcement on page load, from same name in NonJCFOptions section. + int GlobalAnnouncePageElementsOnLoad, +; for the sound when entering a spelling mistake by typing: + string globalProofingErrorEnteredSound, + string globalProofingErrorExitedSound, +; for the sound when Microsoft automattically makes a correction when you type: + string globalAutocorrectSound, +; for Commands Search when Touch Cursor is on, +; so we turn it off, run the search, and then restore it once you exit. + int g_WasTouchCursorActiveBeforeJAWSSearch, +;The virtual cursor must be active for the JAWS search, +;so it is handled similarly to the touch cursor for pre and post JAWS search management: + int g_VirtualPCCursorSettingBeforeJAWSSearch, +;For sidebar, do not change. +;Also declared in sidebar.jss, unset upon AutostartEvent there should Sidebar gain focus. +;Do not use elsewhere: + int gbSideBarCheck,;bool + int WindowClosed, +; Voice and SayAll globals: + int globalVoiceChanges, + string globalVoiceName, +; vars to contain the current setting for each context + int GlobalPcRate, + int GlobalPcVolume, + int GlobalPcPitch, + int GlobalSayAllRate, + int GlobalSayAllVolume, + int GlobalSayAllPitch, + int GlobalJAWSRate, + int GlobalJAWSVolume, + int GlobalJAWSPitch, + int GlobalKeyboardRate, + int GlobalKeyboardVolume, + int GlobalKeyboardPitch, + int GlobalMessageRate, + int GlobalMessageVolume, + int GlobalMessagePitch, + int GlobalMenuDialogRate, + int GlobalMenuDialogVolume, + int GlobalMenuDialogPitch, + int globalVoiceRate, + int globalVoiceVolume, + int globalVoicePitch, +;For SelectAFrame and GetAllFramesText scripts: + int gbWantAllFrames, + string gstrFrameText, + string gstrFrameList, + int iSavedProgressBarAnnouncementInterval, +; For adding Context Help information to the Screen Sensitive Help message: + string g_strSSHContextHelp, +; Menu specific: + string g_strLastMenuName, + string g_strLastMenuGroupName, +;for setting the scheme back after SayAll scheme was used: + string gsSavedApplicationScheme, +;timer for the custom page summary: + int giCustomPageSummarySuppressor, +;timer for speak lost focus (ForegroundIconicEvent) + int giFN_SpeakLostFocusWindow, +;Timer for invisible, but focused, window - such as Skype invisible or antivirus software (WindowActivatedEvent) + int giFN_SpeakInvisibleWindow, +; for helper function to DescriptionChangedEvent, make sure caching and real are in sync. + int giFN_Helper, +;for bringing the Vista error dialog (WerFault.exe) into focus: + handle ghWndDirectUIWerFault, + int gbWinVista + + +;For detecting whether double speaking should be suppressed due to SayNext/PriorLine navigation and some other event also speaking: +const + NavigationByLineTickThreshold = 200 +globals + int LastLineNavigationTick + +;for detecting when to suppress announcement of menu inactive, +;see MenuInactiveProcessed: +const + MenuInactiveTickToleranceForNonVirtual = 50, + MenuInactiveTickToleranceForVirtual = 200 +globals +; private: OCR document + int globalDocumentOCR, + int MenuInactiveTickTime + +globals + string LastBackgroundNotificationText, ; from SkypeWatch and Skype + handle ghWndAutoCompleteSuggestionList, + collection InlineTableCellCoordinates + +;c_JAWSVersion and c_MAGicVersion are initialized at autostart to cache product version info: +globals + collection c_JAWSVersion, + collection c_MAGicVersion + +;for announcing Windows 10 notifications: +globals + handle ghNotificationClassWindow, +; For Zoom Software: + string zRepeat, + int ZAlert, + string zNotificationOutput, + int zChat, + int zTimer, + String zSText + +;For managing announcement of deselection in listboxes +const + ListBoxItemDeselectWaitTime = 2 ;tenths of a second +globals + int SayLBDeselectedItemScheduleID + +;For Windows 10 focusable progress bars and the event for the progress bar change: +const + FocusableProgressBar_Update_EventPrefix = "FocusableProgressBar" +globals + object gUIA_ProgressBarListener, + collection c_FocusableProgressBar + ; Contains data used by the progress bar listener, and by function to say and show the data in braille. + ; Members are: + ; string value -- The progress bar UIA element range value. + ; int ProgressBarUpdateInterval -- The value retrieved from the JCF option which specifies the minimal interval between announcements of progress bar updates. + ; int prevProgressBarAnnouncementTickCount -- The tick count when the previous progress bar update was announced. + +;To queue the function UIAReadBoxInTabOrderCallback, we must use a global treewalker. +;We use UIAReadBoxInTabOrderWindowElement to ensure that reading stops when the treewalker moves outside of the window. +globals + object UIAReadBoxInTabOrderTreewalker, + object UIAReadBoxInTabOrderWindowElement + +;for the desktop change listener: +const + fsUIA_Desktop_EventNamePrefix = "Desktop" +globals + object fsUIA_DesktopChangedListener + + +globals +; for suppressing volume change notifications: +; corresponds to the IgnoreNotificationsFromVolumeChange NonJCF Option stored in Default and managed by the VolumeControlNotifications script. + int GlobalIgnoreNotificationsFromVolumeChange + +;For Voice Assistant +globals + string g_voiceAssistant_scheduledPunchline + + globals + ; for SelectNext/PreviousSoundCards scripts + ; We have to wait for the speech driver to switch sound cards, + ; so we need to schedule a function to speak the name of the new sound card + int GlobalSwitchSoundCardTimerId, + string GlobalSoundCardName + + globals + ; We need to know if audio was ducked before sound was split + ; 0 = false, 1 = true + int GlobalAudioDuckingDisabledByRouting, + ; We need to know if sound is routed + ; 0 is false, 1 is true + int GlobalAudioIsRouted + +;A secondary focus may become active for auto suggestion. +;The SecondaryFocusChangedEvent uses a variable to detect whether the secondary focus is becoming active or inactive. +globals + int giScheduledSaySecondaryFocusSelectedItem, + int WasSecondaryFocusActive + +;A global is used in function VirtualCursorChangedEvent to detect whether the state is actually changing: +globals + int globalSavedVirtualCursorState + +globals + object goLinksListTetheredViewScenario + +const + DoNotShowMathEditorResultMessageAgain = "DoNotShowMathEditorResultMessageAgain", + DoNotShowMathViewerResultMessageAgain = "DoNotShowMathViewerResultMessageAgain" + +Void Function AutoStartEvent () +globalSavedVirtualCursorState = IsVirtualPCCursor() +globalSpeakHeaderOnCellChange = TABLE_NAV_NONE +let GlobalSharedDefaultJCFFile = GetSharedSettingsDirectory()+cScDoubleBackSlash+DefaultJCFFile +let GlobalUserDefaultJCFFile = GetUserSettingsDirectory()+cScDoubleBackSlash+DefaultJCFFile +Let gbWinVista = IsWinVista() +let gbSayAllTemporarilyToggledToSAPI = false +let gbAppendedToClipboard = FALSE +let gbPerModeGesturesEnabled = true +let g_JavaIgnoreNextActiveItemChange = 0 +let GlobalMousePixel = 3 +let g_bShowSoundMixerDiscoveryDialog = true +FrameClearValues () +VirtualStart () +If GetRunningFSProducts() & product_JAWS then + TandemStart() +EndIf +SkypeStart () +TouchAutoStart() +loadNonJCFOptions () ; for new Quick Settings. +let gbUsingRemotePACMate = UsingRemotePACMateBX() +;Make the following configurable once we have the new Options created. +Let gi_FOCUS_LOSS_TIMER = 30 +if DefaultFirstTime == 0 + DefaultFirstTime = 1 +endIf +If BrailleInUse () then + Let GIBrailleActive = on + BrailleStart () + if gbUsingRemotePACMate then + ScheduleFunction("ShowBrlMsgRemoteModeOn",5) + EndIf +EndIf +let BackForward=0 +let giRestoreFormsModeAfterVirtualizeCPS=FALSE +;For UAC dialog: +if giFN_SpeakInvisibleWindow then + unScheduleFunction (giFN_SpeakInvisibleWindow) +endIf +InitMouseSpeech() +InitFSProductVersionInfo() +if IsWindows10() + SpeakAnyVisibleWindowsNotification() + ;c_FocusableProgressBar holds data for progress bar update events, speech and braille: + if (!c_FocusableProgressBar) c_FocusableProgressBar = new collection endIf + StartListeningForDesktopChange() +endIf +InitFsUIAReservedGlobal() +globalProofingErrorEnteredSound = readSettingString (SECTION_OPTIONS, hKey_PROOFING_ERROR_ENTERED_SOUND, "", FT_DEFAULT_JCF, rsNoTransient) +globalProofingErrorExitedSound= readSettingString (SECTION_OPTIONS, hKey_PROOFING_ERROR_EXITED_SOUND, "", FT_DEFAULT_JCF, rsNoTransient) +globalAutocorrectSound = readSettingString (SECTION_OPTIONS, hKey_AUTO_CORRECT_SOUND, "", FT_DEFAULT_JCF, rsNoTransient) +g_NotificationManagerEnabled = IsNotificationManagerEnabled() +if IsZoomTextRunning() + InitZTReservedGlobal() +endIf +EndFunction + +Void Function AutoFinishEvent () +;Put code here that will be triggered when the application is finished. +;It also gets performed when the application is switched from or looses focus, as with ALT+TAB. +;SayFormattedMessage (ot_debug, cmsgDebugAppFinish1_L) +;for focus loss code, during Shut Down or between desktops. +gUIA_ProgressBarListener = Null() +CollectionRemoveAll(c_FocusableProgressBar) +if giFN_SpeakInvisibleWindow then + unScheduleFunction (giFN_SpeakInvisibleWindow) +endIf +BrailleString (cmsgJAWSUnloaded) +EndFunction + +void function InitFSProductVersionInfo() +c_JAWSVersion = new collection +c_MAGicVersion = new collection +var + int RunningFSProducts, + string sPath, + int iMajor, + int iMinor, + int iUpdate, + int iBuild +RunningFSProducts = GetRunningFSProducts() +if RunningFSProducts & product_JAWS + sPath = GetJAWSDirectory() + sPath = sPath+"\\jfw.exe" + GetFixedProductVersion(sPath,iMajor,iMinor,iUpdate,iBuild) + c_JAWSVersion.major = iMajor + c_JAWSVersion.minor = iMinor + c_JAWSVersion.update = iUpdate + c_JAWSVersion.build = iBuild +else + c_JAWSVersion.major = 0 + c_JAWSVersion.minor = 0 + c_JAWSVersion.update = 0 + c_JAWSVersion.build = 0 +endIf +if RunningFSProducts & product_magic + var handle hWnd = FindTopLevelWindow(cwc_MAGICUI,cscNull) + sPath = GetWindowOwner(hWnd) + GetFixedProductVersion(sPath,iMajor,iMinor,iUpdate,iBuild) + c_MAGicVersion.major = iMajor + c_MAGicVersion.minor = iMinor + c_MAGicVersion.update = iUpdate + c_MAGicVersion.build = iBuild +else + c_MAGicVersion.major = 0 + c_MAGicVersion.minor = 0 + c_MAGicVersion.update = 0 + c_MAGicVersion.build = 0 +endIf +EndFunction + +int function GetJAWSMajorVersionNumber() +return c_JAWSVersion.major +endFunction + +int function GetJAWSMinorVersionNumber() +return c_JAWSVersion.minor +EndFunction + +int function GetJAWSUpdateVersionNumber() +return c_JAWSVersion.update +EndFunction + +int function GetJAWSBuildVersionNumber() +return c_JAWSVersion.build +EndFunction + +int function GetMAGicMajorVersionNumber() +return c_MAGicVersion.major +endFunction + +int function GetMAGicMinorVersionNumber() +return c_MAGicVersion.minor +EndFunction + +int function GetMAGicUpdateVersionNumber() +return c_MAGicVersion.update +EndFunction + +int function GetMAGicBuildVersionNumber() +return c_MAGicVersion.build +EndFunction + +void function StoreSpokenNotificationForRepeat (string notificationText, optional string appName) +var string appNameToUse = cmsgUnknownApp +if !StringIsBlank(appName) then + appNameToUse = appName +endIf +if ! stringIsBlank (notificationText) +var int isRepeat = IsRepeatNotification(notificationText) +LastSpokenNotificationForRepeat = notificationText +LastSpokenNotificationTickCount = GetTickCount() +if g_NotificationManagerEnabled && !isRepeat then + StoreNotification(notificationText, appNameToUse) +endIf +endIf +endFunction + +string function GetStoredNotificationText () +return LastSpokenNotificationForRepeat +endFunction + +int function IsRepeatNotification (string notificationText) +var int isRepeat = StringCompare(notificationText, LastSpokenNotificationForRepeat) == 0 && GetTickCount() - LastSpokenNotificationTickCount <= 500 +return isRepeat +endFunction + +void function StartListeningForDesktopChange() +if IsSecureDesktop() +return +EndIf +fsUIA_DesktopChangedListener = Null() +fsUIA_DesktopChangedListener = CreateObjectEx ("FreedomSci.UIA", 0, "UIAScriptAPI.x.manifest" ) +if !fsUIA_DesktopChangedListener return false endIf +if !ComAttachEvents(fsUIA_DesktopChangedListener,fsUIA_Desktop_EventNamePrefix) return endIf +var object desktop = fsUIA_DesktopChangedListener.GetRootElement +fsUIA_DesktopChangedListener.AddPropertyChangedEventHandler(UIA_NamePropertyId, desktop, TreeScope_Element) +EndFunction + +void function DesktopPropertyChangedEvent(object element, int propertyID, variant newValue) +;we're only listening for the name change to the desktop element, +;so we don't need to test which condition fired this event: +Say(element.name,OT_NO_DISABLE) +EndFunction + +void function SpeechOn(optional int wasSynthesizerUnloaded) +var int iSpeechMode = GetDefaultJCFOption (OPT_SPEECH_MODE) +if iSpeechMode + PerformScript MuteSynthesizer () + if wasSynthesizerUnloaded + SpeechOn(wasSynthesizerUnloaded) + endIf +else + SpeechOn(wasSynthesizerUnloaded) +endIf +endFunction + +Void Function SpeechToggledEvent (int bSpeechOn) +EndFunction + +void Function VideoToggledEvent(INT bEnabled) +;Because the video may only be toggle when the JTController is in focus, +;this event is only relevant to the JTController scripts. +if bEnabled then + SayUsingVoice(vctx_message,msgVideoEnabled,ot_status) + BrailleMessage (msgVideoEnabled) +else + SayUsingVoice(vctx_message,msgVideoDisabled,ot_status) + BrailleMessage (msgVideoDisabled) +EndIf +EndFunction + +void function ShowBrlMsgRemoteModeOn() +BrailleMessage(cmsgRemoteModeOn_L) +EndFunction + +int function IsTableNavSupported() +;The default is to assume that table navigation is supported in the application. +;In an application where table navigation is not supported, +;overwrite this function to return false. +;This will allow table navigation scripts +;to notify the user that table navigation is not supported for the application. +return true +EndFunction + +int function TableErrorEncountered(optional int NavType) +var + int bPost +let bPost = (GetRunningFSProducts() == product_magic +; Now we are causing MAGic to post dialogs only if speech is disabled: +&& isSpeechOff ()) +;in applications where table navigation is limited and not all types of navigation is supported, +;use the optional NavType parameter to test for and handle those cases. +if !IsTableNavSupported() then + if bPost then + exMessageBox(cMSGTableNavNotSupported_L, cmsgTableNavErrorTitle, IDOK|MB_ICONASTERISK) + else + SayMessage (OT_error, cMSGTableNavNotSupported_L, cMSGTableNavNotSupported_S) + endIf + return true +endIf +if !InTable() then + if bPost then + exMessageBox(cMSGNotInTable_l, cmsgTableNavErrorTitle, IDOK|MB_ICONASTERISK) + else + SayMessage (OT_error, cMSGNotInTable_l, cMSGNotInTable_S) + endIf + Return true +endIf +return false +endFunction + +int function UnitMoveToTableNavDir(int UnitMoveDir) +if UnitMoveDir == UnitMove_Current then + return TABLE_NAV_NONE +elif UnitMoveDir == UnitMove_Next +|| UnitMoveDir == UnitMove_Prior then + return TABLE_NAV_HORIZONTAL +elif UnitMoveDir == UnitMove_First +|| UnitMoveDir == UnitMove_Last then + return TABLE_NAV_ROW_EXTENTS +elif UnitMoveDir == UnitMove_Up +|| UnitMoveDir == UnitMove_Down then + return TABLE_NAV_VERTICAL +elif UnitMoveDir == UnitMove_Top +|| UnitMoveDir == UnitMove_Bottom then + return TABLE_NAV_COLUMN_EXTENTS +elif UnitMoveDir == UnitMove_Start +|| UnitMoveDir == UnitMove_End then + return TABLE_NAV_TABLE_EXTENTS +;we currently don't have a UnitMove that corresponds to TABLE_NAV_SAY_ROW or TABLE_NAV_SAY_COLUMN +else + return -1 +endIf +EndFunction + +void Function SayCellEx () +var + int Columns, int Rows, + int iType, + string sCellText +Let sCellText = GetCell() +Let iType = GetWindowTypeCode(GetCurrentWindow ()) +If StringIsBlank (sCellText) then + if SayCellWhenOnTableBorderOrcaption() + return + endIf + if iType != WT_LINK + && iType != WT_BUTTON + && iType != wt_Checkbox + && iType != wt_RadioButton then + Let sCellText = cmsgBlank1 + ;Ensures that empty form fields still announce as form fields. + If iType == WT_EDIT + || iType == WT_LISTBOX + || iType == WT_COMBOBOX then + Say(GetObjectType (),OT_CONTROL_TYPE) + EndIf + SayUsingVoice(VCTX_MESSAGE, sCellText, OT_LINE) + Return + EndIf +EndIf +SayCell() +; ameliorate navigation confusion where moving by cell skips cells due to span. +GetCellSpan (Rows, Columns) +if Columns > 1 then + SayFormattedMessageWithVoice (VCTX_MESSAGE, OT_SCREEN_MESSAGE, cmsgSpansColumns_L, cmsgSpansColumns_S, Columns) +endIf + +SpeakRowSpanInfo() +EndFunction + +void Function SpeakRowSpanInfo() +var + int posInSpan, + int totalSpan +if (!GetRowSpanInfo(posInSpan,totalSpan)) + return +EndIf +SayFormattedMessageWithVoice (VCTX_MESSAGE, ot_JAWS_message, cmsgSpansRows_L, cmsgSpansRows_S, posInSpan,totalSpan) +EndFunction + +int function ShouldSpeakTableCellsOnScriptCall(int tableNavDir) +;Return false if an event is used to speak the table cells for table navigation +;to prevent double speaking due to the script calling SpeakTableCells in addition to the event announcing the cells. +if SupportsEditCallbacks () then + return false; +else + return true +endIf +EndFunction + +int function GetTableCoordinatesForSpeakTableCells(int ByRef nCol, int ByRef nRow, int tableNavDir) +nCol = 0 +nRow = 0 +return GetEditCellCoordinates(nCol, nRow) + || GetCellCoordinates(nCol, nRow) +EndFunction + +void function GetRowAndColumnHeadersForSpeakTableCells(int nCol, int nRow, int bMarkedHeader, + string ByRef sColHeader, string ByRef sRowHeader, string ByRef sColHeaderWithMarkup, string ByRef sRowHeaderWithMarkup) +var + int bJavaWindow, + string sLangCodeAbbrev +sRowHeader = cscNull +sColHeader = cscNull +sColHeaderWithMarkup = cscNull +sRowHeaderWithMarkup = cscNull +bJavaWindow = IsJavaWindow (GetCurrentWindow ()) +if bJavaWindow +|| nCol > 0 + sRowHeader = GetRowHeader (bMarkedHeader) +endIf +if bJavaWindow +|| nRow > 1 +; those rare instances where the header is outside the span of the table, e.g. Outlook Message tables: +|| GetColumnHeader (bMarkedHeader) != getCell () then + sColHeader = GetColumnHeader (bMarkedHeader) +endIf + +var int options=smmGetSpeechMarkupTextOptions(OT_NO_DISABLE) +sLangCodeAbbrev = GetLanguageCodeAtCursor() +sColHeaderWithMarkup = smmMarkupString (sColHeader, options, 0, 0, attrib_Text, cscNull, 0, 0, 0, sLangCodeAbbrev, cscNull) +sRowHeaderWithMarkup = smmMarkupString (sRowHeader, options, 0, 0, attrib_Text, cscNull, 0, 0, 0, sLangCodeAbbrev, cscNull) +EndFunction + +int function ShouldSpeakTableHeadersBeforeCellContent() +; 0 = header before content, 1 = content before header. +return GITblHeaderContentOrder == 0 +EndFunction + +void function SayTableHeadersForSpeakTableCells(int tableNavDir, int nRow, int nCol, int bCellCoordsValid) +;Must use OT_NONHIGHLIGHTED_SCREEN_TEXT instead of OT_SCREEN_MESSAGE to speak the table cells. +;The problem was that customers would turn off screen messages, +;while turning tables to Row. +;So using an output type which will not be accidentally disabled by users. +;In the case of OT_SCREEN_MESSAGE, +;customers disabled this in order to make some websites like Pandora function with less cluttered speech. +;Speaking header info using OT_NONHIGHLIGHTED_SCREEN_TEXT allows them to do so, since it cannot be disabled in Settings Center. +var + int bMarkedHeader, ;announce marked headers only + string sColHeader, + string sRowHeader, + string sColHeaderWithMarkup, + string sRowHeaderWithMarkup +bMarkedHeader = (GITblHeaders == TBL_HEADER_MARKED) +GetRowAndColumnHeadersForSpeakTableCells(nCol, nRow, bMarkedHeader, sColHeader, sRowHeader, sColHeaderWithMarkup, sRowHeaderWithMarkup) +if tableNavDir == TABLE_NAV_NONE +&& bCellCoordsValid + if (GITblHeaders == TBL_HEADER_MARKED && sRowHeader && sColHeader) + || GITblHeaders == TBL_HEADER_BOTH + if sRowHeaderWithMarkup || sColHeaderWithMarkup + SayUsingVoice (VCTX_MESSAGE, FormatString (cMSGColumnRowHeader, sRowHeaderWithMarkup, sColHeaderWithMarkup),OT_NONHIGHLIGHTED_SCREEN_TEXT, true) + endIf + elif (GITblHeaders == TBL_HEADER_MARKED & !sColHeader) + || GITblHeaders == TBL_HEADER_ROW + if sRowHeaderWithMarkup + SayUsingVoice (VCTX_MESSAGE, sRowHeaderWithMarkup, OT_NONHIGHLIGHTED_SCREEN_TEXT,true) + endIf + elif (GITblHeaders == TBL_HEADER_MARKED && !sRowHeader) + || GITblHeaders == TBL_HEADER_COL + if sColHeaderWithMarkup + SayUsingVoice (VCTX_MESSAGE, sColHeaderWithMarkup, OT_NONHIGHLIGHTED_SCREEN_TEXT, true) + endIf + EndIf +elif tableNavDir == TABLE_NAV_VERTICAL + if GITblHeaders == TBL_HEADER_MARKED + || GITblHeaders == TBL_HEADER_BOTH + || GITblHeaders == TBL_HEADER_ROW + if sRowHeaderWithMarkup + SayUsingVoice (VCTX_MESSAGE, sRowHeaderWithMarkup, OT_NONHIGHLIGHTED_SCREEN_TEXT,true) + endIf + endIf +elif tableNavDir == TABLE_NAV_HORIZONTAL + if GITblHeaders == TBL_HEADER_MARKED + || GITblHeaders == TBL_HEADER_BOTH + || GITblHeaders == TBL_HEADER_COL + if sColHeaderWithMarkup + SayUsingVoice (VCTX_MESSAGE, sColHeaderWithMarkup, OT_NONHIGHLIGHTED_SCREEN_TEXT,true) + endIf + endIf +elif tableNavDir == TABLE_NAV_TABLE_EXTENTS + if sRowHeaderWithMarkup + || sColHeaderWithMarkup + SayUsingVoice (VCTX_MESSAGE, FormatString (cMSGColumnRowHeader, sRowHeaderWithMarkup, sColHeaderWithMarkup),OT_POSITION, true) + endIf +endIf +EndFunction + +void function SayTableCoordinatesForSpeakTableCells(int tableNavDir, int nRow, int nCol, int bCellCoordsValid) +if !bCellCoordsValid return endIf +var string sMessage +if tableNavDir == TABLE_NAV_NONE + SayUsingVoice (VCTX_message,FormatString (cMSGColumnAndRow, IntToString (nRow), IntToString (nCol)), ot_position) +elif tableNavDir == TABLE_NAV_VERTICAL + if gbDefaultVCursorCellCoordinatesAnnouncement + sMessage = FormatString (cmsgRowHeader, IntToString (nRow)) + if sMessage + SayUsingVoice (VCTX_message, sMessage, ot_position) + endIf + endIf +elif tableNavDir == TABLE_NAV_HORIZONTAL + if gbDefaultVCursorCellCoordinatesAnnouncement + sMessage = FormatString (cmsgColumnHeader, IntToString (nCol)) + if sMessage + SayUsingVoice (VCTX_message, sMessage, ot_position) + endIf + endIf +elif tableNavDir == TABLE_NAV_TABLE_EXTENTS + SayUsingVoice (VCTX_message,FormatString (cMSGColumnAndRow, IntToString (nRow), IntToString (nCol)), ot_position) +endIf +EndFunction + +void function SayAnyRowOrColumnCountChangeForSpeakTableCells(int tableNavDir, int nNumRows, int nNumCols, int nPrevNumOfCells) +if tableNavDir == TABLE_NAV_VERTICAL +|| tableNavDir == TABLE_NAV_COLUMN_EXTENTS +|| tableNavDir == TABLE_NAV_TABLE_EXTENTS +|| tableNavDir == TABLE_NAV_SAY_ROW + if nNumCols != nPrevNumOfCells + && nPrevNumOfCells!=0 + if nNumCols != 1 + SayUsingVoice (VCTX_MESSAGE, FormatString (cMsgTableColumnsChanged, IntToString (nNumCols)), OT_status) + else + SayUsingVoice (VCTX_MESSAGE, FormatString (cMsgTableColumnChanged, IntToString (nNumCols)), OT_status) + endIf + endIf +elif tableNavDir == TABLE_NAV_SAY_COLUMN + if nNumRows != nPrevNumOfCells + && nPrevNumOfCells!=0 + if nNumRows != 1 + SayUsingVoice (VCTX_MESSAGE, FormatString (cMsgTableRowsChanged, IntToString (nNumRows)), OT_status) + else + SayUsingVoice (VCTX_MESSAGE, FormatString (cMsgTableRowChanged, IntToString (nNumRows)), OT_status) + endIf + endIf +endIf +EndFunction + +void function SayTableExtentLocationForSpeakTableCells(int tableNavDir, int nRow, int nCol, int nNumRows, int nNumCols) +if tableNavDir == TABLE_NAV_ROW_EXTENTS + if nCol == 1 + SayUsingVoice (VCTX_message, cMSGBeginningOfRow, OT_SCREEN_MESSAGE) ; beginning of row + elif nCol == nNumCols + SayUsingVoice (VCTX_message, cMSGEndOfRow, OT_SCREEN_MESSAGE) ;End of row + endIf +elif tableNavDir == TABLE_NAV_COLUMN_EXTENTS + if nRow == 1 + SayUsingVoice (VCTX_message, cMSGTopOfColumn, OT_SCREEN_MESSAGE); Top Of Column + elif nRow == nNumRows + SayUsingVoice (VCTX_message, cMSGBottomOfColumn, OT_SCREEN_MESSAGE) ; Bottom of column + endIf +endIf +EndFunction + +Void Function SpeakTableCells (int tableNavDir, int nPrevNumOfCells) +if !ShouldSpeakTableCellsOnScriptCall(tableNavDir) +|| TableErrorEncountered(tableNavDir) + Return +EndIf +var + int bCellCoordsValid, + int nRow, + int nCol, + int nNumCols, + int nNumRows +bCellCoordsValid = GetTableCoordinatesForSpeakTableCells(nCol,nRow,tableNavDir) +nNumCols = GetCurrentRowColumnCount () +nNumRows = GetTableRowCount () +if tableNavDir == TABLE_NAV_NONE + if bCellCoordsValid + SayTableCoordinatesForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + if ShouldSpeakTableHeadersBeforeCellContent() + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + SayCellEx () + else + SayCellEx () + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + endIf + else + /* + In some Java Swing based tables we are not able to get column and row information due + to limitations in the Java Access Bridge. This is especially the case if a customized + cell renderer is used to draw the current cell. This code block was added to ensure + that in this case, at least the cell contents would be spoken. + * + Before this change, absolutely nothing was spoken if focus landed on a Java Swing + table cell that used a customized cell renderer or any other table cell for which we + were unable to obtain the cell coordinates. + */ + SayCellEx () + endIf +elif tableNavDir == TABLE_NAV_VERTICAL + SayAnyRowOrColumnCountChangeForSpeakTableCells(tableNavDir, nNumRows, nNumCols, nPrevNumOfCells) + if ShouldSpeakTableHeadersBeforeCellContent() + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + SayCellEx () + else + SayCellEx () + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + endIf + SayTableCoordinatesForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) +elif tableNavDir == TABLE_NAV_HORIZONTAL + if ShouldSpeakTableHeadersBeforeCellContent() + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + SayCellEx () + else + SayCellEx () + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + endIf + SayTableCoordinatesForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) +elif tableNavDir == TABLE_NAV_ROW_EXTENTS + SayTableExtentLocationForSpeakTableCells(tableNavDir, nRow, nCol, nNumRows, nNumCols) + SayCellEx () +elif tableNavDir == TABLE_NAV_COLUMN_EXTENTS + SayAnyRowOrColumnCountChangeForSpeakTableCells(tableNavDir, nNumRows, nNumCols, nPrevNumOfCells) + SayTableExtentLocationForSpeakTableCells(tableNavDir, nRow, nCol, nNumRows, nNumCols) + SayCellEx () +elif tableNavDir == TABLE_NAV_TABLE_EXTENTS + SayAnyRowOrColumnCountChangeForSpeakTableCells(tableNavDir, nNumRows, nNumCols, nPrevNumOfCells) + if ShouldSpeakTableHeadersBeforeCellContent() + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + SayCellEx () + SayTableCoordinatesForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + else + SayCellEx () + SayTableCoordinatesForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + SayTableHeadersForSpeakTableCells(tableNavDir, nRow, nCol, bCellCoordsValid) + endIf +elif tableNavDir == TABLE_NAV_SAY_ROW + SayAnyRowOrColumnCountChangeForSpeakTableCells(tableNavDir, nNumRows, nNumCols, nPrevNumOfCells) + Say (GetRowText (cscNull, cscNull, cmsgBlank1), OT_line) +elif tableNavDir == TABLE_NAV_SAY_COLUMN + SayAnyRowOrColumnCountChangeForSpeakTableCells(tableNavDir, nNumRows, nNumCols, nPrevNumOfCells) + Say (GetColumnText (cscNull, cscNull, cmsgBlank1), OT_line) +endIf +EndFunction + +Script JAWSWindow() +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +JAWSWindow() +EndScript + +Script StartJAWSTaskList () +; 12-11-98 - TGS - Added this script that basically just calls the built in of the same name. +; Bring up the JAWS Task List Dialog. This function requires that JAWSTaskList.dll be in the JAWSdirectory +If UserBufferIsActive () then + UserBufferDeActivate () +EndIf +if InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +StartJAWSTaskList() +EndScript + +script TouchToggleSelectionMode() +TouchToggleSelectionMode() +EndScript + +int function WasSayObjectTypeAndTextExceptionProcessed(optional int nLevel, int includeContainerName) +;This function should only be called from within an overwritten SayObjectTypeAndText, +;to allow default behavior for exceptions known to exist before any application-specific condition testing. +;The app-specific SayObjectTypeAndText should exit if this function returns true. +If InHomeRowMode() +|| !IsPcCursor() +|| UserBufferIsActive() + SayObjectTypeAndText (nLevel,includeContainerName) + Return true +EndIf +return false +EndFunction + +int function SayCursorMovementException(int UnitMovement, optional int bMoved) +;Return true for conditions that should pass cursor movement management down to the next level JSB file. +;May be used for SayLineUnit, SayWordUnit, SayCharacterUnit, SayPageUpDownUnit, and SpeakHomeEndMovement. +return !IsPCCursor() + || UserBufferIsActive() + || InHJDialog() + || GetMenuMode() + || IsFormsModeActive() + || IsLeftButtonDown() + || IsRightButtonDown() + || SupportsEditCallbacks() + || RibbonsActive() +EndFunction + +void function SpeakHomeEndMovement() +var + handle hCurrentWindow, + int iWinType +if !IsPCCursor() then + return +EndIf +let hCurrentWindow = GetCurrentWindow () +let iWinType = GetWindowSubTypeCode (hCurrentWindow) +If !iWinType then + Let iWinType = GetObjectSubTypeCode () +EndIf +if ((iWinType ==WT_LEFTRIGHTSLIDER || iWinType ==WT_UPDOWNSLIDER) && + (GetWindowClass(hCurrentWindow)==cwcIEServer)) then + ; ARIA sliders in Internet explorer do not generate events to update the cached data + ;Thus we must forceably update the cache and wait for the update. + MSAARefresh() + delay(1) + ;drop through for normal logic to speak the value +endIf +if IsJavaWindow(hCurrentWindow) +&& !MenusActive() then + ;Because at the time JAWS processes the scripts, Java has not processed the + ;keystroke for the following objects, the responsibility of speaking the object + ;needs to be passed to either ActiveItemChangedEvent or ValueChangedEvent. + if WT_TABCONTROL == iWinType + || WT_UPDOWNSLIDER == iWinType + || WT_LEFTRIGHTSLIDER == iWinType + || WT_LEFTRIGHTSLIDER == iWinType + || WT_TREEVIEW == iWinType + || WT_TREEVIEWITEM == iWinType then + return + endIf +endIf +if IsSliderControl(iWinType) + ;ValueChangedEvent speaks the slider control if it is not spoken here. + if ShouldSayFunctionsSpeakSlider (iWinType) + delay(2) + SayWord() + endIf + return +elif iWinType == WT_TASKBAR then + delay(2) + SayWord() + return +elif iWinType ==wt_TABCONTROL then + If IsJavaWindow (hCurrentWindow) then + Return; return here because java will generate an event to speak the item + EndIf + ; only sayWord if IsMSAAWindow is false because ActiveItemChanged will speak this + if !IsMSAAWindow(hCurrentWindow) then + Delay(1) + sayWord() + return + endIf +endIf +EndFunction + +void function HomeEndMovement(int UnitMovement) +if UnitMovement == UnitMove_First then + JawsHome() +ElIf UnitMovement == UnitMove_Last then + JAWSEnd() +else ;no other movement is valid + return +EndIf +SpeakHomeEndMovement() +EndFunction + +script JAWSHome() +SayCurrentScriptKeyLabel() +HomeEndMovement(UnitMove_First) +EndScript + +script Home() +;MAGic scripts do not have JAWS as part of their name +SayCurrentScriptKeyLabel() +HomeEndMovement(UnitMove_First) +EndScript + +script TouchHome() +if IsTouchSelectionModeActive() + PerformScript SelectFromStartOfLine() +else + Say(cksHome,ot_JAWS_message) + HomeEndMovement(UnitMove_First) +endIf +EndScript + +Script JAWSEnd() +SayCurrentScriptKeyLabel() +HomeEndMovement(UnitMove_Last) +EndScript + +Script End() +;MAGic scripts do not have JAWS as part of their name +SayCurrentScriptKeyLabel() +HomeEndMovement(UnitMove_Last) +EndScript + +Script TouchEnd() +if IsTouchSelectionModeActive() + PerformScript SelectToEndOfLine() +else + Say(cksEnd,ot_JAWS_message) + HomeEndMovement(UnitMove_Last) +endIf +EndScript + +void Function CharacterValueHook (string ScriptName) +if ScriptName == "TouchSayNextCharacter" +&& !IsTouchSelectionModeActive() + if UIANextCharacter() + UIASayCharacterValue () + return False + else ;fall back to OSM: + ScriptName = "SayNextCharacter" + endIf +endIf +if ScriptName == "SayNextCharacter" + NextCharacter () + if GetWindowClass (GetFocus()) == cwc_Scintilla + if !IsKeyWaiting () + ScheduleFunction ("SayCharacterValue", 1, true) + endIf + else + SayCharacterValue () + endIf + return False +endIf +if ScriptName == "TouchSayPriorCharacter" +&& !IsTouchSelectionModeActive() + if UIAPriorCharacter() + UIASayCharacterValue () + return False + else ;fall back to OSM: + ScriptName = "SayPriorCharacter" + endIf +endIf +if ScriptName == "SayPriorCharacter" + PriorCharacter () + if GetWindowClass (GetFocus()) == cwc_Scintilla + if !IsKeyWaiting () + ScheduleFunction ("SayCharacterValue", 1, true) + endIf + else + SayCharacterValue () + endIf + return False +endIf +RemoveHook (HK_SCRIPT, "CharacterValueHook") +return True +EndFunction + +void Function PhoneticSpellHook (string ScriptName) +if ScriptName == "TouchSayNextCharacter" +&& !IsTouchSelectionModeActive() + if UIANextCharacter() + UIASayCharacterPhonetic () + return False + else ;fall back to OSM: + ScriptName = "SayNextCharacter" + endIf +endIf +if ScriptName == "SayNextCharacter" + NextCharacter () + SayCharacterPhonetic () + return False +endIf +if ScriptName == "TouchSayPriorCharacter" +&& !IsTouchSelectionModeActive() + if UIAPriorCharacter() + UIASayCharacterPhonetic () + return False + else ;fall back to OSM: + ScriptName = "SayPriorCharacter" + endIf +endIf +if ScriptName == "SayPriorCharacter" + PriorCharacter () + SayCharacterPhonetic () + return False +endIf +RemoveHook (HK_SCRIPT, "PhoneticSpellHook") +return True +EndFunction + +int function handleNoCurrentWindow() +var + handle hCurrentWindow +if userBufferIsActive() then + return False +endIf +let hCurrentWindow = GetCurrentWindow() +if (hCurrentWindow == 0) then ; No focus +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) then + SayFormattedMessage (OT_HELP, cmsg96_L, cmsg96_S) ; speak No Focus message +endIf + Return True +endIf +return False +endFunction + +Script SayCharacter() +var + int nTimesPressed +if handleNoCurrentWindow() then + return +endIf +if IsPCCursor() && IsBrailleOnlyRegion() then + SayFormattedMessageWithVoice (VCTX_MESSAGE, ot_help, cmsgBrlOnlyRegion_l, cmsgBrlOnlyRegion_s) + return +endIf +ResetSpeechMarkupAttributes(AttribFieldAll&~AttribFieldOutlineAndIndent) +if IsPCCursor() then + if (GetObjectTypeCode() == WT_SLIDER) then + if onViewSliderControl (getObjectSubtypeCode ()) then + ; These sliders' values when gotten direct are the text, e.g. details, list, tiles, etc. + say (getObjectValue(SOURCE_CACHED_DATA), OT_WORD) + else + SayWord() ; says the current setting + endIf + return + endIf +endIf +if isVirtualPcCursor () then +;Smart Navigation: + if DecrementSmartNavOnDoublePress() then + sayCharacter() + return + endIf +endIf +let nTimesPressed=IsSameScript () +if (nTimesPressed>=2) then + SayCharacterValue() + AddHook (HK_SCRIPT, "CharacterValueHook") +elif nTimesPressed == 1 then + SayCharacterPhonetic () + AddHook (HK_SCRIPT, "PhoneticSpellHook") +else + let globalSayingCurrentItem = 1 + SayCharacter() + let globalSayingCurrentItem = 0 +endIf +EndScript + +void function SayCharacterUnit(int UnitMovement) +var + int TheTypeCode, + handle hCurrentWindow, + string sClass, + string sMessage, + int ioSubType +if IsVirtualRibbonActive() then + return ;spoken by event +endIf +if IsLeftButtonDown() +|| IsRightButtonDown() then + SelectingText(TRUE) + pause () + SelectingText(false) + return +endIf +if SupportsEditCallbacks() then ;the CaretMovedEvent will handle this + return +EndIf +if !IsPCCursor() then + SayCharacter() + return +endIf +if IsBrailleOnlyRegion() then + return +endIf +let hCurrentWindow = GetCurrentWindow() +let TheTypeCode = GetWindowSubTypeCode (hCurrentWindow) +If !TheTypeCode then + Let TheTypeCode = GetObjectSubTypeCode () +EndIf +let ioSubType = GetObjectSubTypeCode(SOURCE_CACHED_DATA) +if IsJavaWindow(hCurrentWindow) Then + ;Because at the time JAWS processes the scripts, Java has not processed the + ;keystroke for the following objects, the responsibility of speaking the object + ;needs to be passed to either ActiveItemChangedEvent or ValueChangedEvent. + if WT_TABCONTROL == TheTypeCode + || WT_UPDOWNSLIDER == TheTypeCode + || WT_LEFTRIGHTSLIDER == TheTypeCode + || WT_LEFTRIGHTSLIDER == TheTypeCode + || WT_TREEVIEW == TheTypeCode + || WT_TREEVIEWITEM == TheTypeCode Then + return + elif MenusActive() then + return + endIf +endIf +if ((TheTypeCode==WT_LEFTRIGHTSLIDER || TheTypeCode==WT_UPDOWNSLIDER) && + (GetWindowClass(hCurrentWindow)==cwcIEServer)) then + ; ARIA sliders in Internet explorer do not generate events to update the cached data + ;Thus we must forceably update the cache and wait for the update. + MSAARefresh() + delay(1) + ;drop through for normal logic to speak the value +endIf +if IsSliderControl(theTypeCode) + ;ValueChangedEvent speaks the slider control if it is not spoken here. + if ShouldSayFunctionsSpeakSlider (theTypeCode) + delay(2) + SayWord() + endIf + return +elif TheTypeCode == WT_TASKBAR +&& ioSubType == WT_TABCONTROL + ; This is the windows 2000 task bar + SayWord() + return +endIf +if CaretVisible() then + SayCharacter() + Return +EndIf +;For ARIA grids in Forms or Application Mode when no caret visible: +if ioSubType == WT_TABLECELL +|| ioSubType == WT_ROWHEADER then + ;ActiveItemChangedEvent will speak the cell. + ;set whether the header should be spoken by ActiveItemChangedEvent: + if GetJCFOption (optTableIndication) + && (GITblHeaders == TBL_HEADER_COL || GITblHeaders == TBL_HEADER_BOTH || GITblHeaders == TBL_HEADER_MARKED) then + let globalSpeakHeaderOnCellChange = TABLE_NAV_HORIZONTAL + EndIf +endIf +EndFunction + +int function IsSliderControl(int theTypeCode) +return theTypeCode == WT_SLIDER + || theTypeCode == WT_LEFTRIGHTSLIDER + || theTypeCode == WT_UPDOWNSLIDER +EndFunction + +Int Function ShouldSayFunctionsSpeakSlider (int theTypeCode) +if !IsSliderControl(theTypeCode) + return false +EndIf +var + object slider = GetFocusObject (0) +if (!slider) then + return true +EndIf +if (slider.accRole() != ROLE_SYSTEM_SLIDER) then + return true +EndIf +var + string sliderValue = slider.accValue() +if StringLength (sliderValue) == 0 then + return true +EndIf +return false +EndFunction + +Script SayNextCharacter () +NextCharacter () +SayCharacterUnit(UnitMove_Next) +EndScript + +Script SayPriorCharacter () +PriorCharacter () +SayCharacterUnit(UnitMove_Prior) +EndScript + +Script TouchSayNextCharacter () +if IsTouchSelectionModeActive() + PerformScript SelectNextCharacter() +elif !UIASayNextCharacter() + PerformScript SayNextCharacter () +endIf +EndScript + +Script TouchSayPriorCharacter () +if IsTouchSelectionModeActive() + PerformScript SelectPriorCharacter() +elif !UIASayPriorCharacter () + PerformScript SayPriorCharacter () +endIf +EndScript + +void Function SpellWordHook (string ScriptName) +if ScriptName == "TouchSayNextWord" +&& !IsTouchSelectionModeActive() + if UIANextWord() + TouchSpellWord() + return false + else ;fall back to OSM: + ScriptName = "SayNextWord" + endIf +endIf +if ScriptName == "SayNextWord" + NextWord () + if (!SupportsEditCallbacks()) + SpellWord () + SayExpandedAcronymOrAbbreviation() + endIf + return false +endIf +if ScriptName == "TouchSayPriorWord" +&& !IsTouchSelectionModeActive() + if UIAPriorWord() + TouchSpellWord() + return false + else ;fall back to OSM: + ScriptName = "SayPriorWord" + endIf +endIf +if ScriptName == "SayPriorWord" + PriorWord () + if (!SupportsEditCallbacks()) + SpellWord () + SayExpandedAcronymOrAbbreviation() + endIf + return false +endIf +RemoveHook (HK_SCRIPT, "SpellWordHook") +return true +EndFunction + +Script SayWord() +if handleNoCurrentWindow() then + return +endIf +SetDocumentReadingStartLocation () +if IsPCCursor() && IsBrailleOnlyRegion() then + SayFormattedMessageWithVoice (VCTX_MESSAGE, ot_help, cmsgBrlOnlyRegion_l, cmsgBrlOnlyRegion_s) + return +endIf +ResetSpeechMarkupAttributes(AttribFieldAll&~AttribFieldOutlineAndIndent) +if isVirtualPcCursor () then +;Smart Navigation: + if DecrementSmartNavOnDoublePress() then + sayWord() + return + endIf +endIf +if isPcCursor () && onViewSliderControl (getObjectSubtypeCode ()) then + var string sliderVal = getObjectValue(SOURCE_CACHED_DATA) + if isSameScript () then + spellString (sliderVal) + else + say (sliderVal, OT_WORD) + endIf + return +endIf +If (IsSameScript ()) Then + SpellWord() + SayExpandedAcronymOrAbbreviation() + AddHook (HK_SCRIPT, "SpellWordHook") +Else + let globalSayingCurrentItem = 1 + SayWord() + let globalSayingCurrentItem = 0 +endIf +EndScript + +void function SayWordUnit(int UnitMovement) +var + string sClass, + int iSubtype +if IsLeftButtonDown() +|| IsRightButtonDown() then + SelectingText(TRUE) + pause() + SelectingText(false) + return +endIf +if SupportsEditCallbacks() then ;CaretMovedEvent will speak + return +EndIf +if RibbonsActive() +|| GetMenuMode() == MenuBar_Active then + ;The change event should speak: + return +EndIf +if IsBrailleOnlyRegion() then + return ; Do not speak anything. +endIf +let sClass = GetWindowClass(GetFocus()) +let iSubtype = GetObjectSubtypecode() +if sClass == cwc_NetUiHWnd +|| sClass == cwc_DirectUiHWnd then + ;The change event should speak: + if iSubtype == wt_Button Then + return + EndIf +EndIf +if iSubtype == wt_ListBoxItem +&& !IsvirtualPCCursor() + ;The change event should speak: + return +EndIf +If (IsPCCursor() && IsJavaWindow(GetFocus()) && iSubtype == WT_Table) + ; In a Java Swing table that supports multiple selections pressing + ; Control + Right Arrow or Control + Left Arrow makes the table cell + ; to the right or left the active item without removing existing + ; selections. This change in the active item will trigger an Active Item + ; Changed event which will cause JAWS to speak the active table cell. + ; Return here so that JAWS does not speak extraneous information. + return +EndIf +SayWord() +EndFunction + +Script SayNextWord() +NextWord() +SayWordUnit(UnitMove_Next) +EndScript + +Script SayPriorWord() +PriorWord() +SayWordUnit(UnitMove_Prior) +EndScript + +Script TouchSayNextWord() +if IsTouchSelectionModeActive() + PerformScript SelectNextWord() +elif !UIASayNextWord() + PerformScript SayNextWord() +endIf +EndScript + +Script TouchSayPriorWord() +if IsTouchSelectionModeActive() + PerformScript SelectPriorWord() +elif !UIASayPriorWord() + PerformScript SayPriorWord() +endIf +EndScript + +int function SayLineWithDocHandler(int iSubtype) +;When MAGic is running, +;if we think that we're in a document window, +;then let the doc handler say the line and return true. +;Otherwise, return false and let the scripts proceed with speaking the line. +var + int iType = getWindowSubtypeCode (getFocus ()) +if GlobalMenuMode then + return false +endIf +if inHjDialog () +&& (iType == WT_LISTVIEW || iType == WT_LISTBOX || iType == WT_TREEVIEW) then + return FALSE +endIf +if DialogActive() +&& iSubtype != wt_MultiLine_Edit +&& iSubtype != wt_ReadOnlyEdit then + return false +endIf +if UseDocumentServerReadingFunctionality() then + SetDocumentReadingStartLocation () + SayLine(2) + return true +endIf +if IsFormsModeActive() then + SetDocumentReadingStartLocation () + SayLine(2) + return true +endIf +if !iSubtype then + SetDocumentReadingStartLocation () + SayLine() + return true +EndIf +if CaretVisible() +|| iSubtype == wt_MultiLine_Edit +|| iSubtype == wt_ReadOnlyEdit then + SetDocumentReadingStartLocation () + SayLine() + return true +EndIf +return false +EndFunction + +int Function AllAppsClosedFromSystemTray(handle hwnd) +var + string sClass +let sClass = getWindowClass (hwnd) +if StringContains (cwnFocusLossExceptionsList, globalPrevRealName) +|| StringContains (cwnFocusLossExceptionsList, getWindowName (getRealWindow (hwnd))) then + return OFF +endIf +if isWindowVisible (ghwndToolTip) then + return FALSE +endIf +if ! GISuppressStartMenu && isPcCursor () && ! userBufferIsActive () +&& (sClass == cwcShellTray || sClass == cwcSysTrayParent) +&& ! getWindowSubtypeCode (hwnd) +&& ! getObjectSubtypeCode(SOURCE_CACHED_DATA) then + Return TRUE +endIf +return FALSE; +endFunction + +int function SayByTypeForScriptSayLine() +var + int shouldUseMSAA = IsMSAAWindow(GetFocus()), + int type, + string strVal, + int state +type = GetWindowSubTypeCode (GetFocus ()) +If !type + type = GetObjectSubTypeCode () +EndIf +state = GetObjectStateCode() +If type == WT_UPDOWNSLIDER +|| type == WT_LEFTRIGHTSLIDER then + if onViewSliderControl (type) then + ;We must pass TRUE to getObjectValue so that the text is read out for these controls: + indicateControlType (type, getObjectName (), getObjectValue(SOURCE_CACHED_DATA)) + else + SayObjectTypeAndText () + endIf + Return true +EndIf +If type == wt_ListBoxItem then + if (FocusWindowSupportsUIA() || shouldUseMSAA) + say(GetObjectName(),ot_line) + Say(GetObjectValue(),ot_line) + if (state & ctrl_checked) + IndicateControlState(wt_checkbox, ctrl_checked) + elif (state & ctrl_unchecked) + IndicateControlState(wt_checkbox, ctrl_unchecked) + endif + Say(PositionInGroup(),ot_position) + return true + EndIf +elif type == WT_MULTISELECT_LISTBOX +|| type == WT_EXTENDEDSELECT_LISTBOX +;|| type == WT_LISTVIEW ;don't include listview here! want sayLine internal to handle it. +|| type == WT_LISTBOX then + Let strVal = GetObjectValue () + If !strVal then + Let strVal = GetObjectName () + EndIf + SayMessage (OT_LINE, strVal) + if (type == WT_LISTBOX && shouldUseMSAA) + if (state & ctrl_checked) + IndicateControlState(wt_checkbox, ctrl_checked) + elif (state & ctrl_unchecked) + IndicateControlState(wt_checkbox, ctrl_unchecked) + endif + endIf + SayMessage (OT_POSITION, PositionInGroup ()) + Return true +elif type == WT_TREEVIEW && TreeWithColumns() then + SayTreeViewItem () + return true +elIf type == WT_TREEVIEW && inHjDialog () then + sayLine () + SayMessage (OT_SCREEN_MESSAGE, FlexibleWebNumberOfActiveRules ()) + Return true +elif type == wt_ButtonMenu + SayObjectTypeAndText() + return true +elif type == wt_ProgressBar +&& IsWindows10() + SayObjectTypeAndText() + return true +elif (type == WT_Split_Pane) + Say(GetObjectValue(), ot_line) + return true +EndIf +return false +EndFunction + +Script SayLine() +var + handle hwnd, + int TheTypeCode, + string sClass, + string sLine +let hwnd = getCurrentWindow () +if handleNoCurrentWindow() then + return +endIf +TheTypeCode = GetWindowSubTypeCode(hwnd) +If (!TheTypeCode) + TheTypeCode = GetObjectSubTypeCode() +EndIf +if IsPCCursor () && IsBrailleOnlyRegion() then + SayFormattedMessageWithVoice (VCTX_MESSAGE, ot_help, cmsgBrlOnlyRegion_l, cmsgBrlOnlyRegion_s) + return +endIf +ResetSpeechMarkupAttributes(AttribFieldAll) +if isVirtualPcCursor () then +;Smart Navigation: + if DecrementSmartNavOnDoublePress() then + sayLine() + return + endIf +endIf +if IsPCCursor () +&& ! UserBufferIsActive () +&& SpeakInvisibleWindow () then + Return +endIf +;All windows have closed, save the desktop and task bar +If AllAppsClosedFromSystemTray (hwnd) then + SayUsingVoice (vctx_message, cmsgFocusLoss, OT_SCREEN_MESSAGE) + Return TRUE +endIf +If GetRunningFSProducts() & product_JAWS +&& IsSameScript() then + SpellLine() + Return +EndIf +If !IsPcCursor() +|| IsVirtualPcCursor() then + SetDocumentReadingStartLocation () + SayLine(2) + Return +EndIf +If GlobalMenuMode then + if globalMenuMode==MENU_ACTIVE then + let sClass=GetWindowClass(GetParent(GetFocus())) + if StringContains(sClass,cwcXPStartMenuParentClassSubstring) then + sayObjectActiveItem() + return + endIf + endIf + SayLine () + Return +EndIf +if SayByTypeForScriptSayLine() + ;This module is for script SayLine to process controls according to their type. + return +endIf +if IsMAGicRunning() then + ;Place the SayLineWithDocHandler check after most known types, + ;Else we get problem where SayLine tries to move the slider when doing SayLine upon it, + ;After having clicked with the mouse. + if SayLineWithDocHandler(TheTypeCode) then + return + EndIf +EndIf +If CaretVisible() then + If TheTypeCode != WT_EDITCOMBO then;Edit combos should not speak FormatAndText info. + let globalSayingCurrentItem = 1 + EndIf +EndIf +SetDocumentReadingStartLocation () +SayLine() +let globalSayingCurrentItem = 0 +EndScript + +void function SayLineUnit(int unitMovement, optional int bMoved) +var + handle hCurrentWindow, + int WinType, + int objType, + int nState, + int bIsJava +if IsLeftButtonDown() then + SelectingText(TRUE) + pause() + SelectingText(false) + return +endIf +if SupportsEditCallbacks() then ;CaretMovedEvent will handle + return +EndIf +if IsVirtualRibbonActive() then + return ;spoken by event +endIf +if !IsPCCursor () then + if UsesUnderlyingDom() || !IsJAWSCursorInMenu() then + SayLine() + EndIf + return +endIf +if IsBrailleOnlyRegion() then + return ; Do not speak anything. +endIf +hCurrentWindow = GetCurrentWindow() +WinType = GetWindowSubTypeCode (hCurrentWindow) +objType = GetObjectSubTypeCode(SOURCE_CACHED_DATA) +If !WinType + WinType = objType +EndIf +if IsJavaWindow (hCurrentWindow) + bIsJava = TRUE + ;Because at the time JAWS processes the scripts, Java has not processed the + ;keystroke for the following objects, the responsibility of speaking the object + ;needs to be passed to either ActiveItemChangedEvent or ValueChangedEvent. + if WT_TABCONTROL == WinType + || WT_UPDOWNSLIDER == WinType + || WT_LEFTRIGHTSLIDER == WinType + || WT_LEFTRIGHTSLIDER == WinType + || WT_TREEVIEW == WinType + || WT_TREEVIEWITEM == WinType then + return + elif MenusActive() then + return + endIf +endIf +If WinType == WT_TASKBAR + SayWord() + Return +endIf +if IsSliderControl(WinType) + ;ValueChangedEvent speaks the slider control if it is not spoken here. + if ShouldSayFunctionsSpeakSlider (WinType) + if IsVirtualPCCursor() + SayObjectTypeAndText(0, true, true) + else + SayWord () + EndIf + endIf + return +endIf +if wt_edit_spinbox == WinType +|| wt_spinbox == WinType + if !bIsJava + Say(GetLine(),OT_LINE) + else + Say(GetObjectValue(),OT_LINE) + endIf + return +endIf +if objType == wt_editCombo +&& !IsVirtualPCCursor() + if AutoCompleteSuggestionListHasDeselectedItem() + SayObjectActiveItem() + BrailleRefresh() + endIf + return +endIf +if WinType==wt_editCombo +|| (GetWindowClass(GetFocus()) == cwc_RichEdit50w && !(objType == wt_multiline_edit || objType == wt_document || ObjType == WT_READONLYEDIT +|| WinType == wt_multiline_edit || WinType == wt_document || WinType == WT_READONLYEDIT)) + if !IsVirtualPCCursor() then + return + endIf +endIf +if WinType == wt_CheckBox +|| WinType == WT_RADIOBUTTON +|| WinType == WT_Switch then + if IsVirtualPCCursor() then + If (DocumentPresentationMode_SimpleLayout == GetJcfOption(optHTMLDocumentPresentationMode)) + SayObjectTypeAndText(0, false, true) + Else + SayLine(2, true) + EndIf + EndIf + ;Do nothing for non-virtual windows, since for some apps where checkboxes are successive, + ;focus will change and arrow can be used to navigate between the checkboxes. + ;The Say will then cause either double speaking of the new checkbox, + ;or speaking of the checkbox losing focus before the focus change announces the new one with focus. + return +EndIf +if WinType == WT_MENU then + if !IsVirtualPCCursor() + && GetWindowClass(GlobalFocusWindow) == cwcIEServer then + return + EndIf +EndIf +if (WinType == WT_Split_Pane) + Say(GetObjectValue(), ot_line) + return +endIf +if CaretVisible() then + If GetWindowClass(GetFocus()) == cwc_ConsoleWindow + ;Currently, this is used only by SayNonHighlightedText to test if the speech should be suppressed + ;when navigating through a console window command history with up/down arrow. + ;We allow the SayLine and suppress the nonhighlighted text, + ;since not all cases of navigation by line causes new text to appear. + LastLineNavigationTick = GetTickCount() + endIf + if IsVirtualPcCursor() && !UserBufferIsActive() + SayLine(2,true) + else + if !IsMAGicRunning() && !IsZoomTextRunning() then + IndicateInconsistenciesInRange(CheckLine) + endIf + SayLine(0,true) + endIf + return +endIf +;For ARIA grids in Forms or Application mode with no caret visible: +if WinType == WT_TABLECELL +|| WinType == WT_COLUMNHEADER then + ;ActiveItemChangedEvent will speak the cell. + ;set whether the header should be spoken by ActiveItemChangedEvent: + if GetJCFOption (optTableIndication) + && (GITblHeaders == TBL_HEADER_Row || GITblHeaders == TBL_HEADER_BOTH || GITblHeaders == TBL_HEADER_MARKED) then + let globalSpeakHeaderOnCellChange = TABLE_NAV_VERTICAL + EndIf +endIf +EndFunction + +Script SayNextLine() +var + int bMoved +let bMoved=NextLine() +SayLineUnit(UnitMove_Next,bMoved) +EndScript + +Script SayPriorLine () +var + int bMoved +let bMoved=PriorLine() +SayLineUnit(UnitMove_Prior,bMoved) +EndScript + +Script TouchSayNextLine() +if IsTouchSelectionModeActive() + PerformScript SelectNextLine() +elif !UIASayNextLine() + PerformScript SayNextLine() +endIf +EndScript + +Script TouchSayPriorLine () +if IsTouchSelectionModeActive() + PerformScript SelectPriorLine() +elif !UIASayPriorLine () + PerformScript SayPriorLine () +endIf +EndScript + +void function UnitMoveControlNav(int UnitMovement) +var + HANDLE hwnd, + int isJavaWindow, + int TheTypeCode, + int MenuMode +hwnd = GetFocus () +isJavaWindow = IsJavaWindow(hwnd) +TheTypeCode = GetObjectSubTypeCode () +MenuMode = GlobalMenuMode +if IsJAWSCursor() +|| IsInvisibleCursor() +|| (IsVirtualPCCursor() && !isJavaWindow) then + if UnitMovement == UnitMove_Next then + PerformScript SayNextParagraph() + ElIf UnitMovement == UnitMove_Prior then + PerformScript SayPriorParagraph() + EndIf + return +endIf +if !isJavaWindow then + if TheTypeCode == WT_TREEVIEWITEM + || TheTypeCode == wt_TreeView + || TheTypeCode == WT_LISTBOXITEM + || TheTypecode == wt_ListView + || TheTypeCode == wt_edit + || TheTypeCode == wt_PassWordEdit + || theTypeCode == WT_ROW + || theTypeCode == WT_COLUMN + || theTypeCode == WT_ROWHEADER + || theTypeCode == WT_COLUMNHEADER + || theTypeCode == WT_GRID then + if UnitMovement == UnitMove_Next then + TypeKey(cksControlDownArrow) ; move without removing selection + ElIf UnitMovement == UnitMove_Prior then + TypeKey(cksControlUpArrow) ; move without removing selection + EndIf + return + EndIf +EndIf +if DialogActive () +|| TheTypeCode == WT_TREEVIEW +|| TheTypeCode == WT_TREEVIEWITEM +|| TheTypeCode == WT_LISTVIEW +|| TheTypeCode == WT_LISTVIEWITEM +|| TheTypeCode == WT_Listbox +|| TheTypeCode == WT_LISTBOXITEM +|| TheTypeCode == WT_Combobox +|| TheTypeCode == WT_EDITCOMBO +|| TheTypeCode == WT_MULTISELECT_LISTBOX +|| TheTypeCode == WT_EXTENDEDSELECT_LISTBOX +|| GetWindowClass(hWnd) == cwcMsoCmd then + if UnitMovement == UnitMove_Next then + TypeKey(cksControlDownArrow) ; move without removing selection + ElIf UnitMovement == UnitMove_Prior then + TypeKey(cksControlUpArrow) ; move without removing selection + EndIf + pause () + if isJavaWindow then + ; The Java Access Bridge does not send a Property + ; Active Descendent Change event or a Property + ; Selection Change event when navigating through a + ; List control or a Tree control when using Control + ; + Up Arrow or Control + Down Arrow. Because of this + ; the Java Focus Nav Area is not updated to reflect the + ; new active item. In order to work around this problem + ; we must call RefreshWindow here. + Delay (2, TRUE) + RefreshWindow(hwnd) + endIf + return +endIf +if TheTypeCode == WT_TABCONTROL then + if UnitMovement == UnitMove_Next then + TypeKey(cksControlDownArrow) + EndIf + SayWord() + return +endIf +if MenuMode then + If UnitMovement == UnitMove_Next then + TypeKey(cksControlDownArrow) + EndIf + return +endIf +If (isJavaWindow && TheTypeCode == WT_Table) + If (UnitMovement == UnitMove_Next) + ; In a Java Swing table that supports multiple selections, this makes + ; the table cell that is one cell down the active item without removing + ; existing selections. This will trigger an active item changed event. + ; JAWS will speak the selection change in response to this event. + TypeKey(cksControlDownArrow) + return + ElIf (UnitMovement == UnitMove_Prior) + ; In a Java Swing table that supports multiple selections, this makes + ; the table cell that is one cell up the active item without removing + ; existing selections. This will trigger an active item changed event. + ; JAWS will speak the selection change in response to this event. + TypeKey(cksControlUpArrow) + return + EndIf +EndIf +If (IsZoomTextReaderEnabled()) + ; Pass the keys on to ZoomText. + If (UnitMovement == UnitMove_Next) + TypeKey(cksControlDownArrow) + return + ElIf (UnitMovement == UnitMove_Prior) + TypeKey(cksControlUpArrow) + return + EndIf +EndIf +If UnitMovement == UnitMove_Next then + PerformScript SayNextParagraph() +ElIf UnitMovement == UnitMove_Prior then + PerformScript SayPriorParagraph() +EndIf +EndFunction + +Script ControlUpArrow () +if IsFormsModeActive () && isPcCursor () +&& getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () +endIf +UnitMoveControlNav(UnitMove_Prior) +EndScript + +Script ControlDownArrow () +var + handle hWnd, + int iSubtype +if IsFormsModeActive() + let hWnd = GetcurrentWindow() + let iSubtype = GetSubtypeCode(hWnd) + if IsOpenListBoxApplicable(hWnd, iSubtype) then + ProcessOpenListBox(hWnd,iSubtype,true) + return + elif isPcCursor () + && getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + EndIf +endIf +UnitMoveControlNav(UnitMove_Next) +EndScript + +Script TouchSayNextParagraph() +if IsTouchSelectionModeActive() + PerformScript SelectNextParagraph() +elif !UIASayNextParagraph() + PerformScript ControlDownArrow() +endIf +EndScript + +Script TouchSayPriorParagraph() +if IsTouchSelectionModeActive() + PerformScript SelectPriorParagraph() +elif !UIASayPriorParagraph() + PerformScript ControlUpArrow() +endIf +EndScript + +Int Function ShouldSayPageUpDownUnitSayLineVirtualCursor(int javaWindow, int winType, int nState) +if (javaWindow) + if (winType == WT_TABCONTROL || winType == WT_UPDOWNSLIDER + || winType == WT_LEFTRIGHTSLIDER || winType == WT_TREEVIEW + || winType == WT_TREEVIEWITEM) + return false + endif + if (winType == WT_EDIT && nState & CTRL_SINGLELINE) + return false + endIf +endif +return true +EndFunction + +Int Function ShouldSayPageUpDownUnitSayLineNonVirtualCursor(int winType, int nState) +if (winType == WT_EDIT && nState & CTRL_SINGLELINE) + return false +endIf +return (winType == WT_EDIT || winType == WT_MULTILINE_EDIT) +EndFunction + +void function SayPageUpDownUnit(int UnitMovement) +var + handle hCurrentWindow, + int winType, + int objType, + int nState +if IsVirtualRibbonActive() then + return ;spoken by event +EndIf +hCurrentWindow = GetCurrentWindow () +winType = GetWindowSubTypeCode (hCurrentWindow) +objType = GetObjectSubTypeCode(SOURCE_CACHED_DATA) +If !winType then + winType = objType +EndIf +nState = GetControlAttributes() +if (winType == WT_LEFTRIGHTSLIDER || winType == WT_UPDOWNSLIDER) +&& GetWindowClass(hCurrentWindow)==cwcIEServer + ; ARIA sliders in Internet explorer do not generate events to update the cached data + ;Thus we must forceably update the cache and wait for the update. + MSAARefresh() + delay(2) + ;drop through for normal logic to speak the value +endIf +if IsVirtualPCCursor() then + SayCurrentScriptKeyLabel () + if (ShouldSayPageUpDownUnitSayLineVirtualCursor(IsJavaWindow(hCurrentWindow), winType, nState)) + SayLine() + endIf + return +endIf +if !IsPCCursor() + SayCurrentScriptKeyLabel () + return +endIf +if objType == wt_editCombo + if AutoCompleteSuggestionListHasDeselectedItem() + SayObjectActiveItem() + BrailleRefresh() + endIf + return +endIf +if IsSliderControl(winType) + ;ValueChangedEvent speaks the slider control if it is not spoken here. + if ShouldSayFunctionsSpeakSlider (winType) + delay(2) + SayWord() + endIf + return +elif WT_TABCONTROL == winType + delay (2) + SayWord () + return +endIf +SayCurrentScriptKeyLabel () +if (ShouldSayPageUpDownUnitSayLineNonVirtualCursor(winType, nState)) + SayLine() +endIf +EndFunction + +void function DoPageDown() +JAWSPageDown() +SayPageUpDownUnit(UnitMove_Next) +EndFunction + +Script JAWSPageDown() +DoPageDown() +EndScript + +Script PageDown() +DoPageDown() +EndScript + +void function DoPageUp() +JAWSPageUp() +SayPageUpDownUnit(UnitMove_Prior) +EndFunction + +Script JAWSPageUp() +DoPageUp() +EndScript + +Script PageUp() +DoPageUp() +EndScript + +Script TouchPageDown() +if UIANextPage() + UIASayLine() + return +endIf +DoPageDown() +EndScript + +Script TouchPageUp() +if UIAPriorPage() + UIASayLine() + return +endIf +DoPageUp() +EndScript + +Script PCCursor () +var + int bTurnOffFormsMode +If IsOBUtil() then + return +endIf +let bTurnOffFormsMode = + IsFormsModeActive() + && !IsJAWSCursor() + && !IsInvisibleCursor() + && !IsTouchCursor() + +if (bTurnOffFormsMode +&& IsInsideARIAApplication () +&& !IsSameScript()) then + BeginFlashMessage() + sayMessage(OT_Status,cmsgApplicationMode_L,cmsgApplicationMode_L) + if ShouldItemSpeak(ot_tutor) + ;tutor messages are normally off for braile, + ;but we want to make sure this is shown in braille: + Say(cmsgApplicationModeDeactivateTutorMessage,ot_status) + endIf + EndFlashMessage() + return +EndIf + +if IsObjectNavigationActive() then + if IsSameScript() + || CurrentScriptWasInvokedByGesture() + ExitTouchNavigation() + else + BeginFlashMessage() + sayMessage(OT_Status,cmsgTouchCursor_L,cmsgTouchCursor_L) + if ShouldItemSpeak(ot_tutor) + ;tutor messages are normally off for braile, + ;but we want to make sure this is shown in braille: + Say(cmsgTouchCursorDeactivateTutorMessage,ot_status) + endIf + EndFlashMessage() + return + endIf +EndIf +ResetSynth () +PCCursor () +If bTurnOffFormsMode +|| IsVirtualPCCursor() then + TurnOffFormsMode() +endIf +if BrailleInUse () then + RouteBrailleToPC () + BrailleRefresh () +endIf +If IsVirtualPCCursor () then + SayFormattedMessage (ot_status, cMSG288_L, cMSG288_S) ; virtual pc cursor +else + SayFormattedMessage (ot_status, cmsg9_L, cmsg9_S) ; "PC Cursor" +endIf +EndScript + +script JAWSCursor () +If IsOBUtil() then + return +endIf +If UserBufferIsActive () then + SayFormattedMessage (OT_status, cmsgVirtualViewer) + Return +EndIf +if IsObjectNavigationActive() then + ExitTouchNavigation() +EndIf +ResetSynth () +if (IsSameScript ()) then + InvisibleCursor(true) + if IsInvisibleUIACursor() + SayFormattedMessage (OT_STATUS, cmsgInvisibleScanCursor_L, cmsgInvisibleScanCursor_S) + else + SayFormattedMessage (OT_STATUS, cmsg10_L, cmsg10_S) ;"invisible Cursor" + endIf + BrailleRefresh () + Return +endIf +JAWSCursor (true) +if IsJawsUIACursor() + SayFormattedMessage (OT_STATUS, cmsgJawsScanCursor_L, cmsgJawsScanCursor_S) +else + SayFormattedMessage (ot_status, cmsg11_L, cmsg11_S) ;"JAWS Cursor" +endIf +if BrailleInUse () then + RouteBrailleToJAWS () + BrailleRefresh () +endIf +EndScript + +Void Function SetActiveCursor (int nCursor) +if (nCursor == CURSOR_JAWS) then + JAWSCursor () +elif (nCursor == CURSOR_INVISIBLE) then + InvisibleCursor() +else + PcCursor () +endIf +EndFunction + +script GraphicsLabeler() +GraphicsLabeler() +EndScript + +Script SayDriveLetter () +var + int x +let x=0 +InvisibleCursor () +RouteInvisibleToPc () +while ((GetCharacter () != "(") && (x<5)) + NextWord () + let x=x+1 +endwhile +if (x != 5) then + NextCharacter () + SayCharacter () +endIf +PcCursor () +EndScript + +script SaySpecialWindowClasses() +var + handle WinHandle, + string sMessageShort, + string sMessageLong, + string sClass, + string sSpell +let winHandle = GetCurrentWindow () +If (winHandle) then ;window handle is not 0 + if (TimesPressedDefault < 4) then + let TimesPressedDefault = TimesPressedDefault + 1 + else + let TimesPressedDefault = 1 ; reset it + endIf ; if times Pressed +if TimesPressedDefault == 1 then + while (GetParent (WinHandle)) ; loop until 0 + let WinHandle = GetParent (WinHandle) + let sClass = GetWindowClass (winHandle) + let sSpell = GetSpellString (sClass) + let sMessageShort = FormatString (cmsg18_S, sClass, sSpell) + let sMessageLong = FormatString (cmsg18_L, sClass, sSpell) + SayFormattedMessage (ot_help, sMessageLong, sMessageShort) ;"Parents class =" + EndWhile + SayFormattedMessage (ot_help, cmsg19_L) ; Top level window + return +endIf ; times pressed =1 +if (TimesPressedDefault == 2) then + let WinHandle = GetPriorWindow (WinHandle) + let sClass = GetWindowClass (winHandle) + let sSpell = GetSpellString (sClass) + let sMessageShort = FormatString (cmsg20_S, sClass, sSpell) + let sMessageLong = FormatString (cmsg20_L, sClass, sSpell) + SayFormattedMessage (ot_help, sMessageLong, sMessageShort) ;"Parents class =" + return +endIf ; times pressed = 2 +if (TimesPressedDefault == 3) then + let WinHandle = GetNextWindow (WinHandle) + let sClass = GetWindowClass (winHandle) + let sSpell = GetSpellString (sClass) + let sMessageShort = FormatString (cmsg21_S, sClass, sSpell) + let sMessageLong = FormatString (cmsg21_L, sClass, sSpell) + SayFormattedMessage (ot_help, sMessageLong, sMessageShort) ;"Parents class =" + return +endIf ; times pressed = 3 +if (TimesPressedDefault == 4) then + let WinHandle = GetFirstChild (WinHandle) + let sClass = GetWindowClass (winHandle) + let sSpell = GetSpellString (sClass) + let sMessageShort = FormatString (cmsg22_S, sClass, sSpell) + let sMessageLong = FormatString (cmsg22_L, sClass, sSpell) + SayFormattedMessage (ot_help, sMessageLong, sMessageShort) ;"Parents class =" + return +endIf ; times pressed = 4 +else ; handle = 0 + SayFormattedMessage (ot_help, cmsg23_L, cmsg23_S) ;"the window handle is 0" +endIf +EndScript + +int Function WantMarkupForJAWSBackspace () +if (FocusWindowSupportsUIA()) + return SupportsEditCallbacks () +endIf +return TRUE +EndFunction + +void function GetCharacterInfoForBackSpace(string byRef strChar, int byRef ContainsMarkup) +ContainsMarkup = false +strChar = GetPriorCharacter (WantMarkupForJAWSBackspace ()) +If strChar == cScNull then + strChar = cMsgBlank1 +ElIf StringCompare(strChar, cScSpace) == 0 then + strChar = cMsgSpace1 +EndIf +if WantMarkupForJAWSBackspace() +&& StringLength (strChar) > 2 then + if (stringContains(strChar,"<") && stringContains(strChar,">")) + || (stringContains(strChar,"&") && stringContains(strChar,";")) then + containsMarkup = TRUE + endIf +endIf +EndFunction + +void function DoBackSpace() +var int bRestore, +int textSelected = !StringIsBlank(GetSelectedText()) +if CURSOR_PC != GetActiveCursor() then + bRestore = TRUE + SaveCursor () + PCCursor () +endIf +If IsVirtualPcCursor () + If UserBufferIsActive () + Return; Do not process unless so directed in app-specific script file + EndIf + ;Allow backspace, since it typically goes back a page: + TypeKey(cksBackspace) + if (bRestore) RestoreCursor () endIf + return +EndIf +if IsReadOnlyEditObject() + if (bRestore) RestoreCursor () EndIf + Return +endIf +var + string strChar, + int TheTypeCode, + string sClass, + int containsMarkup +TheTypeCode = GetObjectSubtypeCode() +If TheTypeCode < 1 then + SClass = GetWindowClass (GetFocus ()) + If sClass == cwcTTY || sClass == cwcTTYGrab then + BackSpaceMSDos () + if bRestore then + RestoreCursor () + endIf + Return + endIf +endIf +If TheTypeCode == WT_TREEVIEW +|| TheTypeCode == WT_LISTVIEW +|| TheTypeCode == wt_ListBox +|| TheTypeCode == wt_listBoxItem + TypeKey(cksBackspace) + if bRestore then + RestoreCursor () + endIf + return +endIf +GetCharacterInfoForBackSpace(strChar,ContainsMarkup) +TypeKey (cksBackspace) +if TheTypeCode != WT_STATIC then + Say(strChar, OT_CHAR, containsMarkup) + if textSelected then + SayFormattedMessage(OT_MESSAGE, cMsgSelectionDeleted, cmsgSilent) + endIf +endIf +if bRestore then + RestoreCursor () +endIf +endFunction + +Script JAWSBackspace() +DoBackSpace() +EndScript + +Script Backspace() +DoBackSpace() +EndScript + +Void Function BackSpaceMSDos () +; Handles special character recognition in dos windows +; The code here does not calculate resolution +; into the mix, because DOS windows appear to be resolution-independent +var + int iRow, + int iCol, + int iNewCol +SaveCursor () +PcCursor () +let iRow = getCursorRow () +let iCol = getCursorCol () +InvisibleCursor () +;Fixed calculation works here, because DOS windows appear to be static +MoveTo (iCol-9, iRow+3) +SayCharacter () +RestoreCursor () +TypeKey(cksBackspace) +EndFunction + +int Function WantMarkupForJAWSDelete () + return TRUE +EndFunction + +void function InitDoNotSayCharacterAfterDeleteControlTypeArray() +if (g_ShouldSayCharacterAfterDeleteArray) + return +endIf +g_ShouldSayCharacterAfterDeleteArray = new IntArray[WT_CUSTOM_CONTROL_BASE] +var int i +For i = 1 to WT_CUSTOM_CONTROL_BASE + g_ShouldSayCharacterAfterDeleteArray[i] = True +EndFor +g_ShouldSayCharacterAfterDeleteArray[WT_BUTTON] = False +g_ShouldSayCharacterAfterDeleteArray[WT_BUTTONDROPDOWN] = False +g_ShouldSayCharacterAfterDeleteArray[WT_BUTTONDROPDOWNGRID] = False +g_ShouldSayCharacterAfterDeleteArray[WT_BUTTONLISTBOX] = False +g_ShouldSayCharacterAfterDeleteArray[WT_CHECKBOX] = False +g_ShouldSayCharacterAfterDeleteArray[WT_COMBOBOX] = False +g_ShouldSayCharacterAfterDeleteArray[WT_EXTENDEDSELECT_LISTBOX] = False +g_ShouldSayCharacterAfterDeleteArray[WT_LEFTRIGHTSLIDER] = False +g_ShouldSayCharacterAfterDeleteArray[WT_LISTBOX] = False +g_ShouldSayCharacterAfterDeleteArray[WT_LISTBOXITEM] = False +g_ShouldSayCharacterAfterDeleteArray[WT_LISTVIEW] = False +g_ShouldSayCharacterAfterDeleteArray[WT_LISTVIEWITEM] = False +g_ShouldSayCharacterAfterDeleteArray[WT_MULTISELECT_LISTBOX] = False +g_ShouldSayCharacterAfterDeleteArray[WT_OUTLINEBUTTON] = False +g_ShouldSayCharacterAfterDeleteArray[WT_RADIOBUTTON] = False +g_ShouldSayCharacterAfterDeleteArray[WT_SLIDER] = False +g_ShouldSayCharacterAfterDeleteArray[WT_SPLITBUTTON] = False +g_ShouldSayCharacterAfterDeleteArray[WT_STARTBUTTON] = False +g_ShouldSayCharacterAfterDeleteArray[WT_STATIC] = False +g_ShouldSayCharacterAfterDeleteArray[WT_TREEVIEW] = False +g_ShouldSayCharacterAfterDeleteArray[WT_TREEVIEWITEM] = False +g_ShouldSayCharacterAfterDeleteArray[WT_UPDOWNSLIDER] = False +EndFunction + +int function ShouldDoDeleteSayCharacterAfterDelete(int typeCode) +InitDoNotSayCharacterAfterDeleteControlTypeArray() +if (typeCode <= 0 || typeCode > ArrayLength(g_ShouldSayCharacterAfterDeleteArray)) + return True +endIf +return g_ShouldSayCharacterAfterDeleteArray[typeCode] +EndFunction + +void function DoDelete() +var int bRestore, +int textSelected = !StringIsBlank(GetSelectedText()) +if (CURSOR_PC != GetActiveCursor()) + bRestore = TRUE + SaveCursor() + PCCursor() +endIf +If (IsVirtualPcCursor()) + if (bRestore) RestoreCursor() EndIf + Return +EndIf +if (IsReadOnlyEditObject()) + if (bRestore) RestoreCursor() EndIf + Return +endIf +var int TheTypeCode = GetWindowSubTypeCode(GetFocus()) +If (! TheTypeCode) + TheTypeCode = GetObjectSubtypeCode() +EndIf +TypeKey(cksDelete) +if (ShouldDoDeleteSayCharacterAfterDelete(TheTypeCode)) + delay(1) + SayCharacter(WantMarkupForJAWSDelete()) + if (textSelected) + SayFormattedMessage(OT_MESSAGE, cMsgSelectionDeleted, cmsgSilent) + endIf +endIf +if (bRestore) + RestoreCursor() +EndIf +EndFunction + +Script JAWSDelete() +DoDelete() +EndScript + +Script Delete() +DoDelete() +EndScript + +script RestrictJAWSCursor() +;This script is no longer current +;Please use the updated script RestrictCurrentCursor +if ToggleRestriction() then + SayFormattedMessage (ot_status, cmsg24_L, cmsg24_S) ;"Restriction on JAWS Cursor" +else + SayFormattedMessage (ot_status, cmsg25_L) ;"restriction off JAWS Cursor" +endIf +EndScript + +script ShutDownJAWS() +if IsUserShutdownAllowed() then + EnsureNoUserBufferActive() + SayFormattedMessage (ot_JAWS_message, cmsg26_L) ;"Unloading JAWS" + ShutDownJAWS() +endIf +EndScript + +script LaunchMagic() +EnsureNoUserBufferActive() +TypeCurrentScriptKey() +EndScript + +Script ShutDownMagic() +var + int iBtn +EnsureNoUserBufferActive() +let iBtn = ExMessageBox(cmsgQuitMAGicDlgMessageText, cmsgQuitMAGicDlgMessageTitle, MB_OKCANCEL) +if iBtn == 1 then + if ShutDownMAGic() then + Say(cmsgMagicUnloaded,OT_MESSAGE) + endif +EndIf +EndScript + +int function IsInvalidForSayWindowTitle() +if handleNoCurrentWindow() then + return true +endIf +if SpeakInvisibleWindow () then + Return TRUE +endIf +return false +EndFunction + +int function SayUserBufferWindowTitle() +If UserBufferIsActive () then + If IsVirtualPcCursor () then + SayMessage (OT_status, cmsgVirtualViewer) + Return true + EndIf +EndIf +return false +EndFunction + +void function SayAnyHTMLTitleInformation() +var + string sFrame, + string sHeading, + string regionName, + string regionType, + int regionLevel + +if IsVirtualPCCursor() then + let sFrame=GetHTMLFrameName() + let sHeading=GetCurrentHeading() + let regionName = GetCurrentRegionName() + let regionType = GetCurrentRegionType() + let regionLevel = GetCurrentRegionLevel() + if (regionName) then + SayMessage(ot_user_requested_information, + FormatString(msgRegionNameIs_L,regionName), + FormatString(msgRegionNameIs_S,regionName)) + endIf + if (regionType ) then + SayMessage(ot_user_requested_information, + FormatString(msgRegionTypeIs_L,regionType), + FormatString(msgRegionTypeIs_S,regionType)) + endIf + if (regionLevel > 1 ) then + SayMessage(ot_user_requested_information, + FormatString(msgRegionLevelIs_L,regionLevel), + FormatString(msgRegionLevelIs_S,regionLevel)) + endIf + if (sHeading) then + SayMessage(ot_user_requested_information, + FormatString(msgHeadingIs_L,sHeading), + FormatString(msgHeadingIs_S,sHeading)) + endIf + if sFrame then + SayMessage(ot_user_requested_information, + FormatString(msgFrameIs_L,sFrame), + FormatString(msgFrameIs_S,sFrame)) + endIf +elIf IsInsideARIAApplication() + var object oAriaApplicationElement = GetAriaApplicationElement () + if (oAriaApplicationElement.name) then + SayMessage(ot_user_requested_information, + FormatString(msgRegionNameIs_L,oAriaApplicationElement.name), + FormatString(msgRegionNameIs_S,oAriaApplicationElement.name)) + endIf + if (oAriaApplicationElement.localizedControlType) then + SayMessage(ot_user_requested_information, + FormatString(msgRegionTypeIs_L,oAriaApplicationElement.localizedControlType), + FormatString(msgRegionTypeIs_S,oAriaApplicationElement.localizedControlType)) + endIf +endIf +EndFunction + +Object Function GetAriaApplicationElement () +if !IsInsideARIAApplication () return Null() endIf +var + object oTreeWalker = FSUIARawViewWalker () +oTreeWalker.currentElement = FSUIAGetFocusedElement () +while oTreeWalker.GoToParent() + if oTreeWalker.currentElement.ariaRole == ARIA_ROLE_APPLICATION + return oTreeWalker.currentElement + endIf +endWhile +return Null() +EndFunction + +int function SayStartMenuOrButtonTitle(handle hWnd, int iTypeCode) +var + string sText +If iTypeCode == WT_STARTBUTTON then + SayMessage(ot_user_requested_information, + FormatString(cmsg27_L, cmsg31_L), + FormatString(cmsg27_S, cmsg31_L)) + Return true +elif iTypeCode == WT_STARTMENU then + let sText = GetWindowText(hWnd,true) + SayMessage(ot_user_requested_information, + FormatString(cmsg28_L, cmsg4_L, sText), + FormatString(cmsg28_S, cmsg4_L, sText)) + Return true +endIf +return false +EndFunction + +int function SayWindowTitleForMenus(handle hAppWnd, handle hCurWnd, int iTypeCode) +var + string sAppText, + string sMenuText +if RibbonsActive() + var + int ribbonState, + string ribbonTabName, + string ribbonGroupName, + string ribbonDesc + sAppText = GetWindowName(hAppWnd) + GetRibbonStatus(ribbonState,ribbonTabName,ribbonGroupName,ribbonDesc) + if IsVirtualRibbonActive() + SayMessage(ot_user_requested_information, + formatString(cMsgSayWindowTitleInVirtualRibbons_L,sAppText, ribbonTabname), + formatString(cMsgSayWindowTitleInVirtualRibbons_S,sAppText, ribbonTabname)) + else + SayMessage(ot_user_requested_information, + formatString(cMsgSayWindowTitleInRibbons_L,sAppText, ribbonTabname), + formatString(cMsgSayWindowTitleInRibbons_S,sAppText, ribbonTabname)) + endIf + return true +endIf +If GlobalMenuMode == menubar_Active + ; the menubar is active but the menus haven't dropped down + sAppText = GetWindowName(hAppWnd) + sMenuText = getMenuName() + if sMenuText == cscNull then + sMenuText = getWord() + endIf + SayMessage(ot_user_requested_information, + formatString(cMsgMenubarItem_L,sAppText, sMenuText), + formatString(cMsgMenubarItem_S,sAppText, sMenuText)) + Return true +EndIf +If iTypeCode == WT_MENU then + ; the menu has dropped down + sAppText = getWindowName(hAppWnd) + sMenuText = GetMenuName() + SayMessage(ot_user_requested_information, + FormatString (cmsgMenuItem_L, sAppText, sMenuText), + FormatString (cmsgMenuItem_S, sAppText, sMenuText)) + Return true +elif iTypeCode == WT_CONTEXTMENU then + sMenuText = GetWindowText(hCurWnd, true) + SayMessage(ot_user_requested_information, + FormatString (cmsg28_L, cmsg6_L, sMenuText), + FormatString (cmsg28_S, cmsg6_L, sMenuText)) + Return true +endIf +return false +EndFunction + +int function SayWindowTitleForTaskBarOrSysTray(int iTypeCode) +If iTypeCode == WT_TASKBAR +|| (IsWindows7() && GetWindowClass(GetFocus()) == cwc_MSTaskListWClass) then + SayMessage(ot_user_requested_information, + FormatString (cmsg27_L, cmsg32_L), + FormatString (cmsg27_S, cmsg32_L)) + return true +elif iTypeCode == wt_sysTray then + SayMessage(ot_user_requested_information, + formatString(cMsg28_L, cMsgSysTray_L, getObjectName()), + formatString(cMsg28_S, cMsgSystray_S, getObjectName())) + return true +endIf +return false +EndFunction + +int function SayWindowTitleForDesktopToolBar(handle hCurWnd, int iTypeCode) +if (iTypeCode == wt_button || iTypeCode == wt_toolbar) +&& getWindowClass(getParent(getParent(hCurWnd)))==cwcShellTray then + SayMessage(ot_user_requested_information, + formatString(cMsg28_L, cMsgDesktopToolbar_L, getObjectName()), + formatString(cMsg28_S, cMsgDesktopToolbar_S, getObjectName())) + return true +endIf +return false +EndFunction + +void function GetWindowTitleForApplication(handle hAppWnd, handle hRealWnd, handle hCurWnd, int iTypeCode, + string ByRef sTitle, string ByRef sSubTitle, int ByRef bHasPage) +var + string sText1, + string sText2, + string sText3 +let bHasPage = false +if IsWindowDisabled (hAppWnd) +&& IsWinFormsWindow(hAppWnd) + sText1 = GetWindowName(hRealWnd) +else + sText1 = GetWindowName(hAppWnd) +endIf +if hRealWnd != hAppWnd then + if hRealWnd != hCurWnd + ; An SDM window is a window with subcontrols that take focus, + ; so here we allow them to act like subwindows of a main window. + || stringStartsWith(getWindowClass(hCurWnd), cwc_Bosa_sdm_) then + if IsJavaWindow(hCurWnd) then + let sText2 = navGetObjectName (navGetRealObjectID (navGetFocusObjectID (), hCurWnd), hCurWnd) + else + let sText2 = GetWindowName(hRealWnd) + endif + endif +endif +if StringLength(sText2) == 0 +&& IsJavaWindow(hCurWnd) then + let sText2 = navGetObjectName (navGetRealObjectID (navGetFocusObjectID (), hCurWnd), hCurWnd) +endif +If IsMultiPageDialog() then + if !sText2 then + let sText2 = sText1 + endIf + let sText3 = GetDialogPageName () + let bHasPage = true + let sTitle = sText2 + let sSubTitle = sText3 + return +endIf +if sText2 +&& stringContains(sText1, sText2) then + ; app window title contains document name + let sText2 = cscNull +endIf +if focusWindowSupportsUIA() +&& StringContains (GetActiveConfiguration (), "outlook") +; Outlook misreads the title of the window, precluding the word "message" : +&& GetWindowClass (hCurWnd) != cwc_Word_Document +;avoid ghost title speaking, e.g. "title is" followed by nothing else. +&& ! StringIsBlank (GetWindowName(hCurWnd)) then + let sText1=GetWindowName(hCurWnd) + let sText2=cscNull +endIf +let sTitle = sText1 +let sSubTitle = sText2 +EndFunction + +void function SayWindowTitleForApplication(handle hAppWnd, handle hRealWnd, handle hCurWnd, int iTypeCode) +var + string sTitle, + string sSubTitle, + int bHasPage +GetWindowTitleForApplication(hAppWnd, hRealWnd, hCurWnd, iTypeCode, + sTitle, sSubTitle, bHasPage) +if bHasPage then + SayMessage(ot_user_requested_information, + FormatString (cmsg30_L, sTitle, sSubTitle), + FormatString (cmsg30_S, sTitle, sSubTitle)) +else + SayMessage(ot_USER_REQUESTED_INFORMATION, + FormatString (cmsg29_L, sTitle, sSubTitle), + FormatString (cMsg29_S, sTitle, sSubTitle)) +EndIf +EndFunction + +int function SayWin8AppWindowTitle() +if !IsMetroApp() return false endIf +var string sTitle = GetWin8AppWindowTitle() +SayMessage(ot_USER_REQUESTED_INFORMATION, + FormatString (cmsg29_L, sTitle, cscNull), + FormatString (cMsg29_S, sTitle, cscNull)) +return true +EndFunction + +Script SayWindowTitle() +if IsSameScript () + SayWindowVisualState() + return +endIf +var + handle hCurrentWindow, + handle hRealWindow, + handle hAppWindow, + int iTypeCode +if IsInvalidForSayWindowTitle() +|| SayUserBufferWindowTitle() +|| SayWin8AppWindowTitle() + return +endIf +let hCurrentWindow = GetCurrentWindow() +; we use window subtype code as object subtype code doesn't distinguish sys tray from other toolbars +Let iTypeCode = GetWindowSubTypeCode (hCurrentWindow) +if !iTypeCode then + let iTypeCode=getObjectSubtypeCode() +endIf +let hRealWindow = GetRealWindow (hCurrentWindow) +let hAppWindow = GetAppMainWindow (hCurrentWindow) +if SayStartMenuOrButtonTitle(hCurrentWindow,iTypeCode) +|| SayWindowTitleForMenus(hAppWindow,hCurrentWindow,iTypeCode) +|| SayWindowTitleForTaskBarOrSysTray(iTypeCode) +|| SayWindowTitleForDesktopToolBar(hCurrentWindow, iTypeCode) then + return +EndIf +SayWindowTitleForApplication(hAppWindow, hRealWindow, hCurrentWindow, iTypeCode) +SayAnyHTMLTitleInformation() +SpeakPersonalizeSettings() +EndScript + +Void Function SpeakWindowInformation (handle hWnd) +var + handle hNextWindow, + int iType,; For subtypecode of hWnd, to keep tab controls and other undesirables from speaking. + int iNextType +If (GetWindowSubTypeCode (hWnd) == WT_COMBOBOX) then + If (GetWindowSubTypeCode (GetFirstChild (hWnd)) == WT_EDITCOMBO) then + ;The appropriate prompt will get spoken when the child is processed. + Return + EndIf + EndIf +Let hNextWindow = GetNextWindow (hWnd) +If GetWindowSubTypeCode (hWnd) == WT_STATIC then + If GetWindowSubTypeCode (hNextWindow) == WT_Static || + StringLength (GetWindowText (hWnd, false)) > 5 then + Let iNextType = GetWindowSubTypeCode (hNextWindow) + If iNextType == WT_EDIT || + iNextType == WT_READONLYEDIT || + iNextType == WT_EDITCOMBO || + iNextType == WT_SLIDER || + iNextType == WT_UPDOWNSLIDER || + iNextType == WT_UPDOWNSLIDER || + iNextType == WT_COMBOBOX then + ;Do nothing, Type and Text on the next window picks this static up. + SayFormattedMessage (OT_CONTROL_NAME, cscNull) + Else + SayWindow (hWnd, READ_EVERYTHING) + endIf + endIf +Else; Not static + If iType == WT_DIALOG || + iType == WT_TABCONTROL then + SayFormattedMessage (OT_CONTROL_NAME, cscNull) + Else + SayWindowTypeAndText (hWnd) + endIf +endIf +EndFunction + +Void Function DoChildWindowsOld (handle hWnd) +var + handle hPos +Let hPos = hWnd +While (hPos) + If IsWindowVisible (hPos) then + SpeakWindowInformation (hPos) + endIf + Let hPos = GetNextWindow (hPos) +EndWhile +EndFunction + +void function ReadToolbarObjects(handle hWnd) +var + string sObjList, + int iObjCount, + int i, + string sName, + int iType +if GetWindowSubtypeCode(hWnd) != wt_toolbar then + return +EndIf +let sObjList = GetListOfObjects(hWnd) +If StringLength(sObjList) <= 2 Then + return +EndIf +let iObjCount = StringSegmentCount(sObjList,LIST_ITEM_SEPARATOR) +let i = 1 +while i <= iObjCount + let sName = StringSegment(sObjList,LIST_ITEM_SEPARATOR,i) + GetObjectInfoByName(hWnd,sName,1,iType) + IndicateControlType(iType,sName,cscSpace) + let i = i+1 +EndWhile +EndFunction + +int function isWindowActuallyVisible(handle hwnd) +; Returns True if hwnd is actually (at least partially) visible on screen. + +; If its style says it's invisible, it is. +if !isWindowVisible(hwnd) then + return False +endIf + +; If it's all the way off at least one screen edge, it's invisible. +; Some applications hide windows in this way. +; Similarly if it has 0 width and/or height, it's not visible. +var int left, int right, int top, int bottom +if getWindowRect(hwnd, left, right, top, bottom) && ( + right-left <= 0 || bottom-top <= 0 + || right < 1 || left > screenGetWidth() + || bottom < 1 || top > screenGetHeight() +) then + return False +endIf + +; Sometimes a window whose styileBits say visible can still be +; invisible according to its MSAA Window or Client object. [DGL, 2012-02-14] +; Outlook 2010 actually requires both Window and Client objects to be checked. +var object o, int childID +let o = getObjectFromEvent(hwnd, ObjID_Window, 0, childID) +if o then + if o.accState(childID) & State_System_Invisible then + return False + endIf +endIf +let o = getObjectFromEvent(hwnd, ObjID_Client, 0, childID) +if o then + if o.accState(childID) & State_System_Invisible then + return False + endIf +endIf + +return True +endFunction + +int Function DoChildWindows (handle hWnd) +var + int iSubtype, + handle hTemp, + string sName, + string sCtrlLabel1, + string sCtrlLabel2, + string sControlValue = getWindowText (hWnd, READ_EVERYTHING) +If !IsWindowActuallyVisible (hWnd) then + Return TRUE +EndIf +let iSubtype = GetWindowSubtypeCode(hWnd) +let sName = GetWindowName(hWnd) +;attempt to determine if we should avoid double speaking of control names +;due to the static text name label preceding the control: +if iSubtype == wt_EditCombo then + let hTemp = GetPriorWindow(GetParent(GetParent(hWnd))) + if hTemp + && GetWindowSubtypeCode(hTemp) == wt_static then + let sCtrlLabel1 = GetWindowName(hTemp) + EndIf +ElIf iSubtype == wt_Edit +|| iSubtype == wt_ReadOnlyEdit +|| iSubtype == wt_PasswordEdit then + let hTemp = GetPriorWindow(hWnd) + if hTemp + && GetWindowSubtypeCode(hTemp) == wt_static then + let sCtrlLabel1 = GetWindowName(hTemp) + EndIf +ElIf iSubtype == wt_ComboBox then + let hTemp = GetFirstChild(hWnd) + if hTemp + && GetWindowSubtypeCode(hTemp) == wt_EditCombo then + ;suppress double speaking of the edit combo name and type + return true + EndIf + let hTemp = GetPriorWindow(hWnd) + if hTemp + && GetWindowSubtypeCode(hTemp) == wt_static then + let sCtrlLabel1 = GetWindowName(hTemp) + EndIf +ElIf iSubtype == wt_LeftRightSlider +|| iSubtype == wt_UpDownSlider then + ;Sliders may have 1 or 2 static text label fields preceding the control + let hTemp = GetPriorWindow(hWnd) + if hTemp + && GetWindowSubtypeCode(hTemp) == wt_static then + let sCtrlLabel2 = GetWindowName(hTemp) + let hTemp = GetPriorWindow(hWnd) + if hTemp + && GetWindowSubtypeCode(hTemp) == wt_static then + let sCtrlLabel1 = GetWindowName(hTemp) + else + let sCtrlLabel1 = sCtrlLabel2 + let sCtrlLabel2 = cscNull + EndIf + EndIf +EndIf +;now speak the window: +if (sCtrlLabel1 && StringCompare(sCtrlLabel1,sName) == 0) +|| (sCtrlLabel2 && StringCompare(sCtrlLabel2,sName) == 0) +|| (sCtrlLabel2 && !stringStripAllBlanks(StringDiff(StringDiff(sName,sCtrlLabel1),sCtrlLabel2))) then + ;Substitute blank for the control name here, + ;since we spoke it earlier when we spoke the label preceding it + if iSubtype == WT_READONLYEDIT + || iSubType == WT_EDIT + ;|| iSubtype == SomeOtherTypeWithTextInItThatMisSpeaks + && ! stringIsBlank (sControlValue) then + if stringCompare (sCtrlLabel1, sName) != 0 then + if stringIsBlank (sCtrlLabel1) then + indicateControlType (iSubtype, sName, sControlValue) + else + indicateControlType (iSubtype, sCtrlLabel1, sControlValue) + endIf + else + indicateControlType (iSubtype, cscNull, sControlValue) + endIf + else + SayControlEx(hWnd,cscSpace) + endIf +ElIf iSubtype == wt_toolbar then + ;announce the toolbar, then list it's objects + IndicateControlType(wt_toolbar,GetWindowName(hWnd),cscSpace) + ReadToolbarObjects(hWnd) +elIf iSubtype == WT_READONLYEDIT +|| iSubType == WT_EDIT +;|| iSubtype == SomeOtherTypeWithTextInItThatMisSpeaks +&& ! stringIsBlank (sControlValue) then + if stringCompare (sCtrlLabel1, sName) != 0 then + if ! stringIsBlank (sName) then + indicateControlType (iSubtype, sName, sControlValue) + else + indicateControlType (iSubtype, sCtrlLabel1, sControlValue) + endIf + else + indicateControlType (iSubtype, cscNull, sControlValue) + endIf +else + SayWindowTypeAndText (hWnd) +EndIf +;for edits and multiline read-only edits which don't read their text via sayWindowTypeAndText: +if (iSubtype == WT_EDIT || iSubtype == WT_READONLYEDIT || iSubtype == WT_MULTILINE_EDIT) + if (getWindowStyleBits (hWnd) & ES_MULTILINE) + ;it's the multiline windows who fail to announce the screen-visible text. + ;Only the text which is visible to the user on the screen will be announced. + sayWindow (hwnd, READ_EVERYTHING) + endIf +endIf +Return TRUE +EndFunction + +int function UserBufferReadBoxInTabOrder() +if !UserBufferIsActive() return false endIf +JAWSTopOfFile () +SayAll () +return true +endFunction + +void function UIAReadBoxInTabOrder() +var + object oUIA, + object element, + object condition +oUIA = CreateObjectEx ("FreedomSci.UIA", 0, "UIAScriptAPI.x.manifest" ) +if !oUIA return false endIf +element = GetUIAFocusElement(oUIA).BuildUpdatedCache() +condition = oUIA.CreateIntPropertyCondition( UIA_ProcessIdPropertyId, element.processId) +UIAReadBoxInTabOrderTreewalker = oUIA.CreateTreeWalker(condition) +if !UIAReadBoxInTabOrderTreewalker return false endIf +UIAReadBoxInTabOrderTreewalker.currentElement = element +while UIAReadBoxInTabOrderTreewalker.currentElement.controlType != UIA_WindowControlTypeId && UIAReadBoxInTabOrderTreewalker.gotoParent() endWhile +if UIAReadBoxInTabOrderTreewalker.currentElement.controlType != UIA_WindowControlTypeId return false endIf +UIAReadBoxInTabOrderWindowElement = UIAReadBoxInTabOrderTreewalker.currentElement +UIASayElement(UIAReadBoxInTabOrderTreewalker.currentElement, true) +QueueFunction("UIAReadBoxInTabOrderCallback") +return true +EndFunction + +int function IsChildTextElementOfSameName (object element) +var string elementName = element.name +elementName = StringTrimLeadingBlanks (StringTrimTrailingBlanks (elementName)) +if ! element || stringIsBlank (elementName) return FALSE endIf +; we want to ignore the text child. +if element.controlType != UIA_TextControlTypeID then + return FALSE +endIf +; for the case where the child is a link, ignore the parent if it's text and has the same name: +var object childElement = FSUIAGetFirstChildOfElement (element) +if childElement.controlType == UIA_HYPERLINKControlTypeID +&& stringContains (childElement.name, ElementName) + return TRUE +endIf +var object parentElement = FSUIAGetParentOfElement (element) +if ! parentElement return FALSE endIf +var string parentName = parentElement.name +parentName = StringTrimLeadingBlanks (StringTrimTrailingBlanks (parentName)) +if stringIsBlank (parentName) return FALSE endIf +;exclude title bars where named the same as the window. +; title bar contains a value, not a name: +var int controlType = parentElement.ControlType +var int ParentHasDuplicateTextChild = controlType == UIA_HYPERLINKControlTypeID +|| controlType == UIA_ButtonControlTypeID +; or any other control type that matters +; some we don't want to ignore, +; such as a pane with the same name as a text field. +return ParentHasDuplicateTextChild +&& (stringContains (ParentName, ElementName) +|| stringContains (elementName, ParentName)) +endFunction + +void function UIAReadBoxInTabOrderCallback() +if !UIAReadBoxInTabOrderTreewalker return endif +if !UIAGoToNextInSubtree(UIAReadBoxInTabOrderTreewalker,UIAReadBoxInTabOrderWindowElement) return EndIf +var int ShouldSkipTitleBar = UIAReadBoxInTabOrderTreewalker.currentElement.ControlType == UIA_TitleBarControlTypeID +if ShouldSkipTitleBar then + if !UIAReadBoxInTabOrderTreewalker.GoToNextSibling() return EndIf +endIf +while ShouldSkipUIAElementOnSayAll(UIAReadBoxInTabOrderTreewalker.currentElement) +|| IsChildTextElementOfSameName (UIAReadBoxInTabOrderTreewalker.currentElement) +|| UIAReadBoxInTabOrderTreewalker.currentElement.isOffScreen +|| !UIAReadBoxInTabOrderTreewalker.currentElement.isEnabled + if !UIAGoToNextInTree(UIAReadBoxInTabOrderTreewalker) return EndIf +endWhile +;Because this function is queued rather than directly called by a script, +;we must call functions to allow speech output when Speech On Demand is active: +var int isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) +if (isSODActive) JAWSSpeechOnDemandOn() endIf +UIASayElement(UIAReadBoxInTabOrderTreewalker.currentElement, true) +if (isSODActive) JAWSSpeechOnDemandOff() endIf +QueueFunction("UIAReadBoxInTabOrderCallback") +EndFunction + +int function MetroAppReadBoxInTabOrder() +if !IsMetroApp() return false endIf +if IsVirtualPcCursor() || IsFormsModeActive() return false endIf +UIAReadBoxInTabOrder() +return true +EndFunction + +int function WPFReadBoxInTabOrder(handle hWnd) +if !StringStartsWith(GetWindowClass(hWnd),cwc_HwndWrapper) return false endIf +UIAReadBoxInTabOrder() +return true +EndFunction + +int function WinFormsReadBoxInTabOrder(handle hWnd, handle hCurrent) +;Special handling of .Net WinForms +var string class = GetWindowClass(hWnd) +if stringContains( class, "WindowsForms") +|| class == cwc_DirectUIhWND +|| GetWindowClass( GetFirstChild ( hwnd ) ) == cwc_DirectUIhWND + UIAReadBoxInTabOrder() + return true +endIf +;the hwnd window may not be visible so try hCurrent: +if !IsWindowVisible (hwnd) +&& stringContains(getWindowClass(hCurrent),"WindowsForms") + UIAReadBoxInTabOrder() + return true +EndIf +return false +EndFunction + +int function JavaReadBoxInTabOrder(handle hCurrent) +var + HANDLE FocusedObjectID, + HANDLE TopLevelObjectID +if !IsJavaWindow(hCurrent) return false EndIf +let FocusedObjectID = navGetFocusObjectID () +let TopLevelObjectID = navGetTopLevelObjectID (FocusedObjectID, hCurrent) +navSayObjectTypeAndText (TopLevelObjectID, hCurrent) +SayFocusedObject () +return true +EndFunction + +int function readBoxInTabOrderUsingAccessibilityInfrastructure (handle realWindow, handle focusWindow) +; the case inside or outside a dialog where MSAA text is not useful: +var int validWindow = getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_DIALOG +|| stringIsBlank (getWindowTextEX (focusWindow, READ_EVERYTHING, TRUE)) +if validWindow then + Say(GetTypeAndTextStringsForWindow(getFocus()),ot_USER_REQUESTED_INFORMATION) +endIf +return validWindow +endFunction + +Script ReadBoxInTabOrder() +;The order in which these tests are placed must be preserved. +if UserBufferReadBoxInTabOrder() return endIf +if MetroAppReadBoxInTabOrder() return endIf +var + handle hCurrent, + handle hRealWnd +hCurrent = GetCurrentWindow () +hRealWnd = GetRealWindow (hCurrent) +if WPFReadBoxInTabOrder(hRealWnd) return endIf +if WinFormsReadBoxInTabOrder(hRealWnd, hCurrent) return endIf +if !DialogActive() then + if readBoxInTabOrderUsingAccessibilityInfrastructure (hRealWnd, hCurrent) then + ; single-window dialogs are not dialogs, e.g. JAWS does not report DialogActive for these windows + return + endIf + SayMessage(ot_message, GetWindowTextEx(getAppMainWindow(hRealWnd),read_everything, TRUE)) + return +EndIf +if JavaReadBoxInTabOrder(hCurrent) return EndIf +SayMessage(OT_ERROR, formatString(cMsg33_L,getWindowName(hRealWnd)), cMsgSilent) ; dialog +If IsVirtualPcCursor() + JAWSTopOfFile () + SayAll () + Let gIVirtualDialogInsertB = TRUE + Return +EndIf +If IsFormsModeActive() then + If GetWindowClass (hRealWnd) == cWcHtmlDlg then + Say(GetWindowTextEX (hRealWnd, FALSE, TRUE), ot_message) + EndIf +EndIf +If !GetDialogStaticText () then + Say(MSAAGetDialogStaticText (), OT_DIALOG_TEXT) +EndIf +if getWindowTypeCode(hRealWnd) == wt_dialog +&& getWindowTypeCode(getFirstChild(hRealWnd)) == wt_dialog +&& isDescendedFromWindow(getFirstChild(hRealWnd),hCurrent) then + EnumerateChildWindows (getFirstChild(GetRealWindow (hCurrent)), "DoChildWindows") + return +EndIf +EnumerateChildWindows (GetRealWindow (GlobalFocusWindow), "DoChildWindows") +EndScript + +Void Function ItemNotFoundEvent (int hwnd) +; event indicating that the requested item can't be found in the OSM +;beep() +EndFunction + +void function GestureEvent(string gestureName, int IsAssignedToScript) +SetMostRecentJAWSGestureName(gestureName) +if gbKeyboardHelp +&& !IsAssignedToScript + var int ticks = GetTickCount() + if ticks - c_KeyboardHelpData.lastGestureTickCount > ContinuousGestureTickCountThreshold + var int isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) + if (isSODActive) JAWSSpeechOnDemandOn() endIf + Say(GetGestureLabel(gestureName),ot_user_requested_information) + if (isSODActive) JAWSSpeechOnDemandOff() endIf + endIf + c_KeyboardHelpData.lastGestureTickCount = ticks +endIf +EndFunction + +void function ProcessBXModifiedKey(string strKeyName) +if gsBXSimulateKey +|| gbBXFunctionKey then + DoBXModifiedKey(strKeyName) + let gsBXSimulateKey = cscNull + let gbBXFunctionKey = false + if !gbKeyboardHelp then + TrapKeys(false) + EndIf +EndIf +EndFunction + +int function KeyIsSpacebar(int nKey, string strKeyName, int nIsBrailleKey) +return nKey == KEY_SPACEBAR + || (nIsBrailleKey && (gbUsingRemotePACMate || BrailleGetTypeKeysMode ()) + && StringCompare(strKeyName,cksBrlSpace,0) == 0) +EndFunction + +int function ProcessUserBufferKeyTrapExemption(int nKey) +If !(UserBufferIsActive() && UserBufferIsTrappingKeys()) then + return false +EndIf +If !(NKey == KEY_LEFT_WINDOWS +|| nKey == KEY_RIGHT_WINDOWS +|| nKey == KEY_CONTEXT +|| nKey == KEY_LEFT_ALT_TAB +|| nKey == KEY_RIGHT_ALT_TAB +|| nKey == KEY_ALT_TAB) then + return false +EndIf +UserBufferDeactivate() +;The following keys would have been eaten, so send them through: +If nKey == KEY_LEFT_WINDOWS +|| nKey == KEY_RIGHT_WINDOWS then + ActivateStartMenu () +ElIf NKey == KEY_CONTEXT then + TypeKey(cksShiftF10) +EndIf +return true +EndFunction + +int function PreProcessKeyPressedEvent(int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) +let WindowClosed = false +let ClipboardTextChanged = false +Let gbSideBarCheck = FALSE +ProcessBXModifiedKey(strKeyName) +if DiagnosticTestingKeys(nKey,strKeyName) then + return true +endIf +If !nIsScriptKey then + ;Do not remove this line! + ;Necessary to reset all relevant options for the insert tab under Virtual Cursor feature + ResetVirtualHook() + if gbLockedKeyboard then + if nKey == key_Insert + || nKey == key_CapsLock + || nKey == key_Control then + ;wait to see if this is part of an allowable key combination, + ;since these keys trigger the KeyPressedEvent on key down. + ;Timer should allow for slow fingering of the key conbination. + let giScheduleNotifyLockedKeyboard = ScheduleFunction("NotifyLockedKeyboard",15) + else + NotifyLockedKeyboard() + EndIf + return true + EndIf +EndIf +if gbKeyboardHelp +|| ProcessUserBufferKeyTrapExemption(nKey) then + return true +EndIf +return false +EndFunction + +int function ProcessHJDialogKeyPressed(int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) +;All KeyPressedEvent code specific to HJDialogs should be in this function. +var + handle hFocus +If !InHjDialog() then + ;allow KeyPressedEvent to continue by returning false + return false +EndIf +If KeyIsSpacebar(nKey,strKeyName,nIsBrailleKey) then + let hFocus=getFocus() + if GetWindowClass(hFocus) == cWcListView then + ;customize list views could be named anything, + ;but they have multiple columns in them. + if lvGetNumOfColumns (hFocus) > 1 + || GetWindowName(GetParent(GetParent(hFocus))) == wn_CustomizeListViewHeaders then + Delay(1) + SayLine () + EndIf + EndIf + BrailleRefresh() +EndIf +;stop KeyPressedEvent from further processing, +;so that other function called by KeyPressedEvent do not need to exception if inHJDialog +return true +EndFunction + +int function ProcessSpaceBarKeyPressed(int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) +var + handle hFocus, + int iAttrib +If !KeyIsSpacebar(nKey,strKeyName,nIsBrailleKey) then + return false +EndIf +let hFocus=getFocus() +If GetWindowClass(hFocus) == cwc_Listview20wndclass Then + let iAttrib = getControlAttributes() + If iAttrib & ctrl_checked then + IndicateControlState(wt_checkbox,ctrl_checked) + Elif iAttrib & ctrl_unchecked then + IndicateControlState(wt_checkbox,ctrl_unchecked) + EndIf + return true +elif GetWindowSubtypeCode(hFocus) == WT_LISTBOX then + Delay (1) + DoStateForGraphics () + return true +;For the Nullsoft Install systems, or any other OSM-based tree views. +;These respond to TreeViewCheckBoxes, but do not respond to MSAA (objStateChangedEvent) +elIf controlCanBeChecked() +&& GetWindowSubtypeCode(hFocus) == WT_TREEVIEW +;MSAA must not be valid state for these to work. +;Where getObjectState (MSAA / .Net / UIA or anything else modern is handled in objStateChangedEvent +&& !getObjectState (TRUE) then + delay (2, TRUE) + ;Because these are OSM-based, ControlCanBeChecked and bits from getControlAttributes for + ;checked and unchecked will work. + ;But this must not be used where objStateChangedEvent picks up the state change (more modern controls). + ;hensce there is no default, we only do checked or unchecked. + let iAttrib = getControlAttributes() + if iAttrib & CTRL_CHECKED then + sayMessage (OT_ITEM_STATE, cMSG_checked) + elIf iAttrib & CTRL_UNCHECKED then + sayMessage (OT_ITEM_STATE, cmsg_notchecked) + endIf + return true +EndIf +;returning false will allow succeeding KeyPressedEvent functions to run: +return false +EndFunction + +void function ProcessKeyPressed(int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) +;This function can be used to specify behavior in KeyPressedEvent which does not belong in any of the other functions called by that event. +;Currently, the other function are: +;PreProcessKeyPressedEvent, intended for all code which must be processed before any other +;ProcessHJDialogKeyPressed, handles all special processing for HJ dialogs +;ProcessSpaceBarKeyPressed, intended to be overwritten for any behavior tied to the spacebar +if ((!nIsScriptKey +&& StringLength (strKeyName) == 1) +|| StringCompare (strKeyName, "backspace", false) == 0) +&& IsSecondaryFocusActive () + giScheduledSaySecondaryFocusSelectedItem = ScheduleFunction ("SaySecondaryFocusSelectedItem", 3, true) +endIf +EndFunction + +Void Function KeyPressedEvent (int nKey, string strKeyName, int nIsBrailleKey, int nIsScriptKey) +;Do not rearrange the code in this event, +;the tests must occur in the order listed. +if PreProcessKeyPressedEvent(nKey, strKeyName, nIsBrailleKey, nIsScriptKey) + return +EndIf +if ProcessHJDialogKeyPressed(nKey,strKeyName,nIsBrailleKey,nIsScriptKey) + return +EndIf +if ProcessSpaceBarKeyPressed(nKey,strKeyName,nIsBrailleKey,nIsScriptKey) + return +EndIf +ProcessKeyPressed(nKey,strKeyName,nIsBrailleKey,nIsScriptKey) +EndFunction + +void Function DoStateForGraphics () +var + int nState, + string sGraphic, + string sStateMessage;Only for "partially checked" +if (IsJavaWindow (GetFocus ())) then + return +endIf +SaveCursor () +InvisibleCursor () +RouteInvisibleToPC () +PriorWord () +If ! (GetCharacterAttributes () & ATTRIB_GRAPHIC) then + Return +EndIf +Let sGraphic = StringLower(GetCharacter ()) +RestoreCursor () +If ! (StringContains(sGraphic, StringTrimTrailingBlanks(cMSG_checked))) then;This is not a graphic that indicates State. + Return +EndIf +If StringContains(sGraphic, StringTrimTrailingBlanks(cmsg294_S)) +|| StringContains(sGraphic, StringTrimTrailingBlanks(cscUnchecked)) then + Let nState = CTRL_UNCHECKED +Else + Let nState = CTRL_CHECKED +EndIf +;The subtype we use here is WT_CHECKBOX, +;Because most list controls don't treat these like radio buttons. +;Now in those rare instances, such as Add/Remove Windows Components, +;We have to monitor for "Partially" and pass graphic name as optional parameter. +If StringContains(sGraphic, StringTrimTrailingBlanks(cMSG_partiallyChecked)) then + IndicateControlState (WT_CHECKBOX, nState, sGraphic) +Else + IndicateControlState (WT_CHECKBOX, nState) +EndIf +EndFunction +int function PlayJCFSoundFile(string jcfSection, string jcfSoundFileKey) +var + string sSoundFile +let sSoundFile = GetSoundFileLocation( + IniReadString(jcfSection, jcfSoundFileKey, cscNull, + GetActiveConfiguration()+cScPeriod+jcfFileExt)) +if !sSoundFile then + let sSoundFile = GetSoundFileLocation( + IniReadString(jcfSection, jcfSoundFileKey, cscNull, DefaultJcfFile)) +EndIf +if sSoundFile then + PlaySound(sSoundFile) + return true +else + return false +EndIf +EndFunction + +void function KeymapChangedEvent(int iKeyCode, string sKeyName, int iKeyStatus) +var + string sSoundFile +if iKeyStatus == KeySequenceStart +|| iKeyStatus == KeySequenceRestarted then + let GlobalActiveLayer = BasicLayerActive + PlayJCFSoundFile(section_options,hKey_KeyLayerSound) + return +elif iKeyStatus == KeySequencePending then + if GlobalActiveLayer == BasicLayerActive + HandleBasicLayerKeys(sKeyName) + elIf GlobalActiveLayer == VolumeLayerActive then + HandleVolumeLayerKeys(sKeyName) + elIf GlobalActiveLayer == FaceInViewLayerActive then + HandleFaceInViewLayerKeys(sKeyName) + else + let GlobalActiveLayer = NoLayerActive + endIf +elif iKeyStatus == KeySequenceComplete + if GlobalActiveLayer == TableLayerActive then + PlayJCFSoundFile(section_options,hKey_TableLayerExitSound) + EndIf + let GlobalActiveLayer = NoLayerActive +ElIf iKeyStatus == KeySequenceCanceled + if GlobalActiveLayer == TableLayerActive + || GlobalActiveLayer == OCRLayerActive + || GlobalActiveLayer == EchoLayerActive + || GlobalActiveLayer == VolumeLayerActive + || GlobalActiveLayer == JAWSVolumeLayerActive + || GlobalActiveLayer == SystemVolumeLayerActive + || GlobalActiveLayer == SoundBalanceLayerActive + PlayJCFSoundFile(section_options,hKey_TableLayerExitSound) + EndIf + let GlobalActiveLayer = NoLayerActive +EndIf +EndFunction + +void function HandleBasicLayerKeys(string sKeyName) +if StringCompare(sKeyname,KeyLayer_Table) == 0 then + if InTable () + || gbKeyboardHelp + let GlobalActiveLayer = TableLayerActive + SayMessage(ot_status,cmsgTableLayerStart_L,cmsgTableLayerStart_S) + else; Table layer outside of tables was confusing users. + let GlobalActiveLayer = NoLayerActive + sayFormattedMessage (OT_ERROR, cMSGNotInTable_l) + CancelLayeredKeySequence() + endIf +elif StringCompare(sKeyName,KeyLayer_OCR) == 0 then + if !(GetRunningFSProducts() & product_JAWS) then + let GlobalActiveLayer = NoLayerActive + CancelLayeredKeySequence() + return + endIf + let GlobalActiveLayer = OCRLayerActive + SayMessage(ot_status,cmsgOCRLayer_Start) +elif StringCompare(sKeyName,KeyLayer_Inspect) == 0 then + ;this block is only true for browsers. + let GlobalActiveLayer = InspectLayerActive + SayMessage(ot_status,cmsgInspectLayer_Start) +elif StringCompare(sKeyName,KeyLayer_Skype) == 0 then + ;this block is only true for browsers. + let GlobalActiveLayer = SkypeLayerActive + SayMessage(ot_status,cmsgSkypeLayer_Start) + +elif StringCompare(sKeyName,KeyLayer_Picture) == 0 then + if (IsPictureSmartEnabled()) then + let GlobalActiveLayer = DescribeLayerActive + SayMessage(ot_status, cmsgPictureSmartLayer_Start) + endif +elif StringCompare(sKeyName,KeyLayer_SkypeDesktop) == 0 then + let GlobalActiveLayer = SkypeDesktopLayerActive + SayMessage(ot_status, cmsgSkypeDesktopLayer_Start) +elif StringCompare(sKeyName,KeyLayer_Echo) == 0 then + let GlobalActiveLayer = EchoLayerActive + SayMessage(ot_status,cmsgMouseEchoLayerStart_L,cmsgMouseEchoLayerStart_S) +elif StringCompare(sKeyName,KeyLayer_Viewer) == 0 then + let GlobalActiveLayer = ViewerLayerActive + SayMessage(ot_status,cmsgViewerLayer_Start) +elif StringCompare(sKeyName,KeyLayer_Volume) == 0 then + let GlobalActiveLayer = VolumeLayerActive + SayMessage(ot_status,cmsgVolumesLayer_Start) +elif StringCompare(sKeyName,KeyLayer_FaceInView) == 0 then + GlobalActiveLayer = FaceInViewLayerActive + SayMessage(ot_status,cmsgFaceInViewLayer_Start) +endIf +EndFunction + +void function HandleVolumeLayerKeys(string sKeyName) + +; Volume layer has four secondary layers, JAWS volume, System volume, sound balance and sound cards: +if StringCompare(sKeyName,KeyLayer_Volume_JAWS) == 0 then + let GlobalActiveLayer = JAWSVolumeLayerActive + SayMessage(ot_status,cmsgJAWSVolumeLayer_Start) +elIf StringCompare(sKeyName,KeyLayer_Volume_System) == 0 then + let GlobalActiveLayer = SystemVolumeLayerActive + SayMessage(ot_status,cmsgSystemVolumeLayer_Start) +elIf StringCompare(sKeyName,KeyLayer_Volume_Balance) == 0 then + let GlobalActiveLayer = SoundBalanceLayerActive + SayMessage(ot_status,cmsgSoundBalanceLayer_Start) +elIf StringCompare(sKeyName,KeyLayer_Volume_SoundCards) == 0 then + let GlobalActiveLayer = SoundCardsLayerActive + SayMessage(ot_status,cmsgSoundCardsLayer_Start) +endIf + +EndFunction + +script ExitTableLayer() +PlayJCFSoundFile(section_options,hKey_TableLayerExitSound) +EndScript + +script ExitVolumeLayer() +PlayJCFSoundFile(section_options,hKey_TableLayerExitSound) +EndScript + +script VolumesLayerHelp () +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgVolumeLayerHelpScreenTitle) +UserBufferAddTextResultsViewer(cmsgVolumeLayerHelp) +EndScript + +script SystemVolumeLayerHelp () +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgSystemVolumeLayerHelpScreenTitle) +UserBufferAddTextResultsViewer (cmsgSystemVolumeLayerFirstLine) +UserBufferAddTextResultsViewer(cmsgJAWSAndSystemVolumesLayerHelp) +EndScript + +script JAWSVolumeLayerHelp () +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgJAWSVolumeLayerHelpScreenTitle) +UserBufferAddTextResultsViewer (cmsgJAWSVolumeLayerFirstLine) +UserBufferAddTextResultsViewer(cmsgJAWSAndSystemVolumesLayerHelp) +EndScript + +void function setVolume (int whichVolume, int moveValue, int VolumeDirection) +var + int volumeSetting, int min, int max + + if WhichVolume == VOLUME_SYSTEM then + min = 10 + max = 100 + VolumeSetting = getSystemVolume () + if VolumeDirection == V_Up then + VolumeSetting = VolumeSetting + moveValue + elIf VolumeDirection == V_Down then + VolumeSetting = VolumeSetting - moveValue + endIf + if VolumeSetting < min then VolumeSetting = min endIf + if VolumeSetting > max then VolumeSetting = max endIf + setSystemVolume (VolumeSetting) +elIf WhichVolume == VOLUME_JAWS then + GetVoiceVolumeRange (min, max) + VolumeSetting = getVoiceVolume (VCTX_GLOBAL) + if VolumeDirection == V_Up then + VolumeSetting = VolumeSetting + moveValue + elIf VolumeDirection == V_Down then + VolumeSetting = VolumeSetting - moveValue + endIf + min = 10 + if VolumeSetting < min then VolumeSetting = min endIf + if VolumeSetting > max then VolumeSetting = max endIf + setVoiceVolume (VCTX_GLOBAL, volumeSetting, TRUE) +endIf +Say (FormatString (cmsgPercentage, volumeSetting),ot_status) +endFunction + +script SystemVolumeDownSmall () +setVolume (VOLUME_SYSTEM, VOLUME_SMALL, V_Down) +endScript + +script SystemVolumeUpSmall () +setVolume (VOLUME_SYSTEM, VOLUME_SMALL, V_Up) +endScript + +script SystemVolumeDownLarge () +setVolume (VOLUME_SYSTEM, VOLUME_LARGE, V_Down) +endScript + +Script SystemVolumeUpLarge () +setVolume (VOLUME_SYSTEM, VOLUME_LARGE, V_Up) +endScript + +script JAWSVolumeDownSmall () +setVolume (VOLUME_JAWS, VOLUME_SMALL, V_Down) +endScript + +script JAWSVolumeUpSmall () +setVolume (VOLUME_JAWS, VOLUME_SMALL, V_Up) +endScript + +script JAWSVolumeDownLarge () +setVolume (VOLUME_JAWS, VOLUME_LARGE, V_Down) +endScript + +script JAWSVolumeUpLarge () +setVolume (VOLUME_JAWS, VOLUME_LARGE, V_Up) +endScript + +string function GetCurrentListViewItemName() +var + handle hWnd +let hWnd = GetCurrentWindow() +if lvIsCustomized(hWnd) then + return lvGetUserDefinedItemText(hWnd,lvGetFocusItem(hWnd)) +ElIf IsMSAAWindow(hWnd) then + return GetObjectName() +else + return GetObjectValue() +EndIf +EndFunction + +int function rangeOverlapPercent(int left1, int right1, int left2, int right2) +; Returns the maximum percentage of the two given ranges shared by both ranges. +; The order of the ranges does not matter, but left1<=right1 and left2<=right2 are assumed. +; Of course, left/right are for convenience; the orientation of the line is immaterial. +var + int l1, int l2, int l3 +let l1 = right1-left1 +let l2 = right2-left2 +let left1 = max(left1, left2) +let right1 = min(right1, right2) +let l3 = right1-left1 +if l3 < 0 then + return 0 +endIf +return max( 100*l3/l1, 100*l3/l2) +endFunction + +globals + collection cLastLVFInfo + +collection function getListViewFieldInfo(handle hwnd) +; Returns info about the given ListView field or null if not applicable. +; Collection properties returned: hwnd, left, right, top, bottom, name, value, colno, colcount, rowno, rowcount, tickcount. +var collection info, collection null + +; Check structure of controls first. +if !isTrueListView(getParent(hwnd)) +|| getWindowTypeCode(getFirstWindow(hwnd)) != WT_HeaderBar +then + return null +endIf + +; If we cached this recently, just use that. +; This helps with Braille and lets Braille and speech calls share results. +if cLastLVFInfo then + if cLastLVFInfo.hwnd == hwnd + && getTickCount() -cLastLVFInfo.tickcount < 500 + then + return cLastLVFInfo + endIf +endIf + +; Get the left edge and width of the given field. +var object oField, int childID +let oField = getObjectFromEvent(hwnd, ObjID_Client, 0, childID) +if !oField then + return null +endIf +var int fLeft, int fTop, int fWidth, int fHeight +oField.accLocation(intRef(fLeft), intRef(fTop), intRef(fWidth), intRef(fHeight), childID) +if !fLeft && !fTop && !fWidth && !fHeight then + return null +endIf + +; Get the header object and that of the list itself (for later). +var object oHeader = getObjectFromEvent(getFirstWindow(hwnd), ObjID_Client, 0, childID) +if !oHeader then + return null +endIf +var object oList = getObjectFromEvent(getParent(hwnd), ObjID_Client, 0, childID) +if !oList then + return null +endIf + +; Scan headers for a significant left/width match. +var int hLeft, int hTop, int hWidth, int hHeight +var int n = oHeader.accChildCount +let childID = 1 +while childID <= n + let hLeft = 0 + let hTop = 0 + let hWidth = 0 + let hHeight = 0 + oHeader.accLocation(intRef(hLeft), intRef(hTop), intRef(hWidth), intRef(hHeight), childID) + if hLeft || hTop || hWidth || hHeight then + if rangeOverlapPercent(fLeft, fLeft+fWidth, hLeft, hLeft+hWidth) > 50 then + ; We finally found what we need. + info = new collection + info.hwnd = hwnd + ; MSAA coordinates are 0-based but JAWS coordinates are 1-based. + info.left = fLeft +1 + info.right = info.left +fWidth + info.top = fTop +1 + info.bottom = info.top +fHeight + info.name = oHeader.accName(childID) + ; This can help because getObjectValue() can miss what's not on screen. + info.value = oField.accValue(0) + info.colno = childID + info.colcount = n + if !info.colcount then + ; This may not happen but is here in case. + info.colcount = oHeader.accNavigate(NavDir_LastChild, 0) + endIf + info.rowno = oList.accSelection +0 + info.rowcount = oList.accChildCount +0 + if !info.rowcount then + ; ListViews have been seen to have no row count. [DGL, 2012-02-14] + info.rowcount = oList.accNavigate(NavDir_LastChild, 0) + endIf + info.tickcount = getTickCount() + cLastLVFInfo = info + return info + endIf + endIf + let childID = childID +1 +endWhile +return null +endFunction + +int function HJDialogObjStateChangeSpoken(handle hObj, int iObjType, int nChangedState, int nState, int nOldState) +var + int iCtrl, + handle hTemp, + int i, + string sText +if !InHJDialog() then + return false +EndIf +;For tree views: +If iObjType == WT_TREEVIEW || +iObjType == WT_TREEVIEWITEM then + SayTreeViewLevel (FALSE) + Return TRUE; +EndIf +if GetWindowName(GetRealWindow(hObj)) == wn_CustomizeListViewHeaders then + if iObjType == wt_button + && !nState + && nOldState == CTRL_PRESSED then + let iCtrl = GetControlID(hObj) + if iCtrl == ID_ToggleSpeechBtn + || iCtrl == ID_ToggleBrailleBtn then + let hTemp = GetFirstWindow(hObj) + let i = 1 + let sText = LVGetItemText(hTemp,LVGetFocusItem(hTemp),i) + while sText && i<=32 + Say(sText,ot_screen_message) + let i = i+1 + let sText = LVGetItemText(hTemp,LVGetFocusItem(hTemp),i) + EndWhile + return true + EndIf + EndIf +EndIf +if iObjType == wt_button then + if GetControlID(hObj) == id_JAWSOptionsExecuteButton then + if !nState then + ;Announce the change in the Options tree when the Execute button toggles it: + Say(tvGetFocusItemText(GetFirstWindow(hObj)),ot_line) + return true + EndIf + EndIf +EndIf +return false +EndFunction + +int function ShouldWinformsControlBeSilent (handle hControl) +; for .Net applications, +; either the focus window or its parent will be winForms. +; Where the focus is an edit, check parent as winForms for edit combobox who are dropped down for the first time. +if IsWinFormsWindow (hControl) +|| (IsWinFormsWindow (getParent (hControl)) && getWindowClass (hControl) == cwc_Edit) +|| stringStartsWith (getWindowClass (hControl), "WindowsForms") +|| stringStartsWith (getWindowClass (getParent (hControl)), "WindowsForms") then + var int winformsSubtype = getObjectSubtypeCode(SOURCE_CACHED_DATA) ; window subtype is invalid for this test. + if winformsSubtype == wt_editcombo + || winformsSubtype == WT_COMBOBOX + || winformsSubtype == WT_LISTBOXITEM + || winformsSubtype == WT_LISTBOX + || winformsSubtype == WT_LISTVIEW then + return TRUE + endIf +endIf +endFunction + +globals string prevWinFormsListItemName, string prevWinFormsListItemPosition; + +int function IsWinFormListItemUnchanged () +var int result, string name = getObjectName(SOURCE_CACHED_DATA), string position = positionInGroup () +result = (name == prevWinFormsListItemName +&& position == prevWinFormsListItemPosition) +prevWinFormsListItemName = name prevWinFormsListItemPosition = position +return result +endFunction + +void function dumpWinformsListItemGlobals () +prevWinFormsListItemName = cscNull +prevWinFormsListItemPosition = cscNull +endFunction + +void function ObjStateChangedEvent(handle hObj, optional int iObjType, int nChangedState, int nState, int nOldState) +dumpWinformsListItemGlobals () ; alt+up and down arrow in winForms list boxes +if hObj != GetFocus() then + return +EndIf +if nSelectingText then + return +EndIf +if HJDialogObjStateChangeSpoken(hObj,iObjType,nChangedState,nState,nOldState) then + return +EndIf +if ShouldWinformsControlBeSilent (hObj) return endIf +var string windowClass = GetWindowClass(hObj) +;Announce the list item when it changes state: +if iObjType == wt_ListBoxItem +|| iObjType == wt_ExtendedSelect_ListBox +|| iObjType == wt_MultiSelect_ListBox then + if (!nState || nChangedState == CTRL_SELECTED) + && !InHJDialog() + && windowClass != cwc_ComboLBox + return ObjStateChangedForListBoxxes(hObj, iObjType, nChangedState, nState, nOldState) + EndIf +EndIf +if iObjType == wt_ListViewItem + ;a listview item may have a control state of 0 if the item is not selected, + ;which causes nothing to be spoken for the control state. + ;Since it would be useful to announce the item is being deselected, + ;we'll test the old state to determine if we should announce deselection: + if !nChangedState && (nOldState & CTRL_SELECTED) + Say(cscNotSelected, ot_item_state) + else + IndicateControlState(iObjType, nChangedState) + endIf + return +endIf +;For the rest of the object types, do not announce change to unavailable state: +if nState == CTRL_GRAYED then + return +EndIf +if iObjType == wt_RadioButton then + ;if the radio buttons are items in a treeview, + ;then speak them as we would speak a treeview item: + if GetObjectSubtypeCode(SOURCE_CACHED_DATA) == wt_TreeView then + SayTreeViewItem() + elif IsJavaWindow(hObj) then + IndicateControlState(iObjType, nChangedState) + elif IsVirtualPCCursor() then + ;when the button has focus but the state has not been toggled, + ;as in after using MoveToField script, + ;obj state changed event will fire when the state changes. + ;If the button has been arrowed to, + ;the focus changes event fires and the obj state changed event does not. + ;To be consistent with the way the button is announced when the focus change happens, + ;the entire object is announced on state change, + ;not merely the state change. + SayObjectTypeAndText() + EndIf + ;For all other radio buttons, focusChangedEvent should announce when radio buttons gain focus. + return +EndIf +if iObjType == WT_TREEVIEW +|| iObjType == WT_TREEVIEWITEM then + ;don't do this if the old state is selected and the new state is not selected + if ((nOldState&CTRL_SELECTED) && !(nState&CTRL_SELECTED)) then + ;do nothing + else + SayTreeViewLevel (InHjDialog ()) + EndIf +ElIf iObjType == wt_button +|| iObjType == wt_StartButton +|| iObjType == wt_Checkbox then + ;for buttons, we do not want announcement of the pressed state. + if !(nState & ctrl_pressed) then + if nState & CTRL_Indeterminate then + ;announce only partially checked, not the checked which is also set + ;Must also indicate required or invalid states so can't just pass CONTROL_INDETERMINATE, instead, + ;mask off checked and unchecked + IndicateControlState(iObjType,nState&~(CTRL_CHECKED|CTRL_UNCHECKED)) + else + IndicateControlState(iObjType,(nState & ~ctrl_selected)) + EndIf + EndIf +elif ( iObjType == WT_TOGGLE_BUTTON +&& nOldState == CTRL_PRESSED ) then + IndicateControlState(iObjType, 0, cmsgNotPressed_l ) +else + ;Add check for menus of header bar controls: + if iObjType == WT_MENU + && ! ( nState & ( CTRL_UNCHECKED | CTRL_CHECKED ) ) + && nOldState & CTRL_CHECKED then + Let nChangedState = ( nChangedState | CTRL_UNCHECKED ) + Let iObjType = WT_CHECKBOX ; so state indication will be right + endIf + IndicateControlState(iObjType, nChangedState) +endIf +EndFunction + +void function ObjStateChangedForListBoxxes(handle hObj, optional int iObjType, int nChangedState, int nState, int nOldState) +if SayLBDeselectedItemScheduleID != 0 + UnscheduleFunction(SayLBDeselectedItemScheduleID) + SayLBDeselectedItemScheduleID = 0 +endIf +;When the item becomes selected, we only announce the name, not the state. +;Must fill out all parameters for Say, so that speech markup is honored for customize list view: +;When the item becomes deselected, "Not Selected" is part of the name, so we don't need to explicitly announce it. +if nChangedState == CTRL_SELECTED + Say(GetCurrentListViewItemName(),ot_line, lvIsCustomized (hObj)) + return +endIf +; When some listboxes are navigated, +; the current list item becomes deselected before focus moves to the next list item. +; To prevent announcement of the deselection in these cases +; we schedule announcement of the deselected listbox item, +; and retest before announcing to determine if we really should announce the deselection. +SayLBDeselectedItemScheduleID = ScheduleFunction("SayLBDeselectedItem", ListBoxItemDeselectWaitTime) +EndFunction + +void function SayLBDeselectedItem() +SayLBDeselectedItemScheduleID = 0 +if GetObjectStateCode() & STATE_SYSTEM_SELECTED + return +endIf +Say(GetCurrentListViewItemName(),ot_line, lvIsCustomized (GetFocus())) +EndFunction + +Void Function FocusPointMovedEvent (int nX, int nY, int nOldX, int nOldY, int nUnit, int nDir, int nTimeElapsed) +; Add your code for FocusPointMovedEvent here. +; Changes made here apply to all applications. +; To make your changes application specific, copy this function to an +; application script file. +EndFunction + +void function MonitorNewTextEventAlerts(handle hFocus, handle hwnd, string buffer, int nAttributes, + int nTextColor, int nBackgroundColor, int nEcho, string sFrameName) +;used to monitor special alerts such as chat programs +EndFunction + +int function NewTextEventShouldBeSilent(handle hFocus, handle hwnd, string buffer, int nAttributes, + int nTextColor, int nBackgroundColor, int nEcho, string sFrameName) +;overwrite this function to silence new text +var + int iSubtype, + string sClass, + int objectSubtypeCode +if (nAttributes&ATTRIB_OCR_TEXT) && (GetScreenEcho () == ECHO_ALL) then + return false +endIf +; Prevent the clock from continuously announcing the hour. +; This was a change caused by an updated vid. +if GetScreenEcho () < ECHO_ALL && getWindowSubtypeCode (hwnd) == WT_CLOCK then return TRUE endIf +if GetMenuMode() != MENU_INACTIVE +&& !sFrameName then + return true +EndIf +if ProcessSelectText(nAttributes,buffer) then + return true +endIf +if (UsingEnhancedEditSupport(hWnd) || IsVirtualPcCursor ()) +&& (sFrameName==cscNull || (sFrameName!=cscNull && (nAttributes&attrib_highlight)))then + ; determine if selected text is coming from action of selecting + ; selection is handled internally but other highlights are not! + if GetTickCount() -nLastSelectUnitTime < 750 + ;SelectEntireDocument fails the timer test, + ;and it will fire once per each line that was selected: + || !DialogActive() then + return true ; handled by internal code which calls TextSelectedEvent + endIf +endIf +iSubtype = GetWindowSubtypeCode(hFocus) +sClass = GetWindowClass(hWnd) +objectSubtypeCode = GetObjectSubtypeCode() +if ShouldWinformsControlBeSilent (hwnd) +&& not isWindows8 () ; win 8 or higher, 7 uses valueChangedEvent in this context. + return TRUE +endIf +if hWnd == hFocus + if sClass == cwcListView + || stringContains (sClass, cwcListView) ; winForms listView controls + || sClass == cwc_SysTreeView32 + || sClass == cwc_ListBox + || iSubtype == wt_ComboBox + || iSubtype == wt_Edit_SpinBox + || objectSubtypeCode == WT_Calendar + || GetWindowClass(GlobalFocusWindow) == cwc_ComboLBox then + return true + EndIf +EndIf +If hWnd != hFocus + if sClass == cwc_ComboLBox then + ; Avoids double speech on arrowing in open combos and edit combos + return true + elif sClass == cWcListView + && iSubtype == wt_editCombo + if GetWindowClass(GetParent(hWnd)) == cwc_AutoSuggestDropdown + ; Avoids double speaking for edit combo dropdown lists + return true + endIf + elif (sClass == cwc_ListBox && isWindows8()) + return true + endIf + If iSubtype == WT_TASKBAR then + ;Probably, this is a new conversation. + ;Failing to bail out will make JAWS repeat. + Return true + EndIf +EndIf +; Ignore new text from windows on nonfocused threads. +; Override this function to change that behavior. +if (!DoesWindowBelongToFocusedThread(hwnd)) then + return true +EndIf +return false +EndFunction + +Void Function ProcessSpeechOnNewTextEvent(handle hFocus, handle hwnd, string buffer, int nAttributes, + int nTextColor, int nBackgroundColor, int nEcho, string sFrameName) +;overwrite this function to handle the way new text is spoken +if nAttributes& ATTRIB_HIGHLIGHT then + SayHighlightedText(hwnd,buffer) +else + SayNonHighlightedText(hwnd,buffer) +endIf +EndFunction + +Void Function NewTextEvent(handle hwnd, string buffer, int nAttributes, + int nTextColor, int nBackgroundColor, int nEcho, string sFrameName) +var + handle hFocus +;Handles all newly written text. +;If the text is contained in a frame, then the frame name is passed as a parameter. +;For most compatible results, overwrite the functions called in this function rather than overwriting this function itself. +let hFocus = GetFocus() +MonitorNewTextEventAlerts(hFocus, hwnd, buffer, nAttributes, nTextColor, nBackgroundColor, nEcho, sFrameName) +if NewTextEventShouldBeSilent(hFocus, hwnd, buffer, nAttributes, nTextColor, nBackgroundColor, nEcho, sFrameName) then + return +EndIf +ProcessSpeechOnNewTextEvent(hFocus, hwnd, buffer, nAttributes, nTextColor, nBackgroundColor, nEcho, sFrameName) +EndFunction + +Void Function SayHighLightedText (handle hwnd, string buffer) +; HighlightedText Function for speaking all newly written highlighted +; text. +var + int iWinType, + string strVal, + string sClass +If GlobalMenuMode > 1 +&& IsMSAAWindow(hWnd) then + If hWnd != GetCurrentWindow() then + Return;Let ActiveItemChangedEvent do its job. + EndIf +EndIf +if hwnd == GetFocus() +&& SupportsEditCallbacks() + return; text will be spoken by SelectionChangedEvent +EndIf +if GetScreenEcho() then + Say(buffer, OT_HIGHLIGHTED_SCREEN_TEXT) +endIf +EndFunction + +Void Function SayNonHighlightedText (handle hwnd, string buffer) +; NonHighlightedText Function for speaking all newly written nonhighlighted +; text. +If GetScreenEcho () > ECHO_NONE +&& hWnd == GetFocus() + If GetWindowClass(GetFocus()) == cwc_ConsoleWindow + && GetTickCount()-LastLineNavigationTick > NavigationByLineTickThreshold + ;New text should be spoken only if it is not a result of navigation by line. + ;This prevents double speaking when navigating through a command history, + ;since the SayLineUnit will already have spoken the new text. + Say(buffer, OT_NONHIGHLIGHTED_SCREEN_TEXT) + ;Now clear LastLineNavigationTick, just in case more new text appears shortly after the navigation. + LastLineNavigationTick = 0 + Return + endIf +endIf +if (GetScreenEcho() > 1) then + Say (buffer, OT_NONHIGHLIGHTED_SCREEN_TEXT) +endIf +EndFunction + +void function SayTextselection(string Select, string sText, int bUseOTChar, optional int bContainsSpeechMarkup) +var + int OT +;OT should be Word unless selecting by char so that each unit selected doesn't have its case indicated +;unless the user has requested the indication for Words +if bUseOTChar then + let OT = OT_CHAR +else + let OT = OT_WORD +endIf +if GetRunningFSProducts() == product_MAGic then + Say(sText,OT,bContainsSpeechMarkup) +else + If nSaySelectAfter then + Say(sText,OT,bContainsSpeechMarkup) + SayMessage(OT_SELECT, select) + Else + SayMessage(OT_SELECT, select) + Say(sText,OT,bContainsSpeechMarkup) + EndIf +EndIf +EndFunction + +Void Function SelectingText(int nMode) +; handles setting up for and finishing the process of selecting text +; called by each of the scripts which does text selection +var + string strHighlightAfterSelect, + string strUnselected, + string strNewlySelected, + int nChanged, + int nStart, + int nChars, + int nLen, + int nLeft, + int nTop, + int nRight, + int nBottom +if UsingEnhancedEditSupport(GetFocus()) then + if (nMode) then + let nLastSelectUnitTime=GetTickCount() + endIf + return ; handled by internal code which calls TextSelectedEvent +endIf +if nMode then + let g_strHighlightBeforeSelect = GetSelectedText() + let nSelectingText = nMode +else + delay(1) + ProcessNewText() + let nSelectingText = 0 + if IsVirtualPCCursor() + && IsJavaWindow (GetFocus ()) == FALSE then + return + endIf + let strHighlightAfterSelect = GetSelectedText() + let strUnselected = StringDiff(g_strHighlightBeforeSelect,strHighlightAfterSelect) + if strUnselected then + ; if there's highlighted text prior to the selection command that + ; doesn't exist after the command, this is either because the command + ; deselected the text or the text scrolled off of the screen. + ; We assume that if the text was at the beginning of the old buffer + ; and it isn't in the new buffer, then it scrolled off. + ; This should be true except when selecting text from bottom to top, + ; and deselecting from top to bottom, + ; something that most people probably don't do + if ! StringsOverlap(g_strHighlightBeforeSelect,strHighlightAfterSelect,nStart,nChars) + || nStart<2 then + let nLen = stringLength(strUnSelected) + SayTextSelection(cmsg214_L,strUnSelected,nLen==1) + let nChanged = nChanged+1 + endIf + endIf + let strNewlySelected = StringDiff(strHighlightAfterSelect,g_strHighlightBeforeSelect) + if strNewlySelected then + let nLen = stringLength(strNewlySelected) + SayTextSelection(cmsg215_L,strNewlySelected, + nLen==1 || (nLen<=3 && stringContains(strNewlySelected,"\r"))) + let nChanged = nChanged+1 + endIf + if !nChanged then + ;screen probably scrolled + let nLen = stringLength(strHighlightAfterSelect) + if StringsOverlap(g_strHighlightBeforeSelect,strHighlightAfterSelect,nStart,nChars) then + let strNewlySelected = stringRight(strHighlightAfterSelect,nLen-nChars) + let nLen = stringLength(strNewlySelected) + ; Fixes problem where + ; string contained a newline char causing the word blank or a newline to be + ; indicated prior to speaking the newly selected text + if stringLeft(strNewlySelected,1)==cScBufferNewLine + && nLen > 1 + && substring(strNewlySelected,2,1) !=cScBufferNewLine then + let strNewlySelected=stringChopLeft(strNewlySelected,1) + let nLen=nLen-1; + endIf + SayTextSelection(cmsg215_L,strNewlySelected, nLen==1) + else + ; strings didn't overlap, just speak the current line as being selected + if GetItemRect (GetCursorCol(), GetCursorRow(), nLeft, nRight, nTop, nBottom, it_Line) then + let strNewlySelected=GetTextInRect (nLeft, nTop, nRight, nBottom, attrib_Highlight, ignoreColor, ignoreColor, FALSE, FALSE) + else + let strNewlySelected=getLine() + endIf + let nLen = stringLength(strNewlySelected) + SayTextSelection(cmsg215_L,strNewlySelected, nLen==1) + endIf + endIf +endIf +EndFunction + +Int Function ProcessSelectText(int nAttributes,string buffer) +; called at the beginning of the NewTextEvent to check for and +; handle speaking of text being selected/unselected. If this function +; returns TRUE, then the NewTextEvent abandons regular processing. +var + string smyBuf +if nSelectingText == 1 then + ;return TRUE to indicate that this text requires no further + ;handling in NewTextEvent + return TRUE +else + if nAttributes & ATTRIB_UNSELECTED then + ;only relevant when text is being selected/unselected + ;return TRUE to indicate that this text requires no further handling + return TRUE + else + return false ; allow regular processing + endIf +endIf +if nAttributes & ATTRIB_HIGHLIGHT +|| nAttributes & ATTRIB_UNSELECTED then + let smyBuf = Buffer + if nAttributes & ATTRIB_UNSELECTED + && nSelectingText != 2 then + let nSelectingText = 2 + if GetRunningFSProducts() & product_JAWS + && ShouldItemSpeak (ot_select) then + let smyBuf = FormatString (cmsg214_L, buffer);unselected + endIf + elif nAttributes & ATTRIB_HIGHLIGHT + && nSelectingText != 4 then + let nSelectingText = 4 + if GetRunningFSProducts() & product_JAWS + && ShouldItemSpeak (ot_select) then + let smyBuf = FormatString (cmsg215_L, buffer);selected + endIf + endIf + Say(smyBuf, ot_select) + return true +else + return FALSE +endIf +EndFunction + +void function SayTopBottomUnit(int UnitMovement) +var + int iSubtype +if SupportsEditCallbacks() then ;CaretMovedEvent will speak + return +EndIf +let iSubtype = GetObjectSubtypeCode() +if iSubtype == wt_ListView +|| iSubtype == wt_ListBox +|| iSubtype == wt_ListBoxItem +|| iSubtype == wt_ExtendedSelect_ListBox +|| iSubtype == wt_MultiSelect_ListBox +|| iSubtype == wt_TreeView +|| iSubtype == wt_TreeViewItem +|| IsVirtualRibbonActive() then + return +EndIf +delay (1) +if IsVirtualPCCursor () then + SayLine () + return +endIf +if UnitMovement == UnitMove_Top then + SayMessage(ot_JAWS_message, cmsg36_L, cmsg36_S) ;"top of file" +ElIf UnitMovement == UnitMove_Bottom then + SayMessage(ot_JAWS_message, cmsg37_L, cmsg37_S) ;"bottom of file" +EndIf +SayLine() +EndFunction + +Script TopOfFile() +JAWSTopOfFile() +SayTopBottomUnit(UnitMove_Top) +EndScript + +Script BottomOfFile() +JAWSBottomOfFile() +SayTopBottomUnit(UnitMove_bottom) +EndScript + +Script TouchTopOfFile() +if IsTouchSelectionModeActive() + PerformScript SelectFromTop() +else + PerformScript TopOfFile() +endIf +EndScript + +Script TouchBottomOfFile() +if IsTouchSelectionModeActive() + PerformScript SelectToBottom() +else + PerformScript BottomOfFile() +endIf +EndScript + +Script SayFont () +; Identify Font +var + string sFont, + string sMessageLong +;If IsVirtualPcCursor () then ; No longer needed as we now support font info in Virtual Cursor +let sFont = GetFont () +If ! sFont then + SayMessage (ot_user_requested_information, cmsg38_S) + Return +EndIf +If IsSameScript () then + Let sFont = (FormatString (cMsgFontInformation, sFont)) + If UserBufferIsActive () then + UserBufferClear () + EndIf + SayMessage (OT_USER_BUFFER, sFont) + AddHotKeyLinks () + Return +EndIf +let sMessageLong = FormatString (cmsg38_L, sFont) +SayFormattedMessage (ot_user_requested_information, sMessageLong, sFont) ;"Font is" +EndScript + +void function lvSaySelectedText () +var + int bSpell, + int nSpeak, + int nBits, + int iLvItem, + int iLvSelectCount, + handle hWnd, + string sMessageLong, + string sMessageShort +Let hWnd = GetFocus () +Let iLvSelectCount = lvGetSelectionCount () +If iLvSelectCount >= 2 then + Let sMessageLong = FormatString (cmsgLVNumOfSelection_L, IntToString (iLvSelectCount)) + Let sMessageShort = FormatString (cmsgLVNumOfSelection_S, IntToString (iLvSelectCount)) + SayFormattedMessage (OT_USER_REQUESTED_INFORMATION, sMessageLong, sMessageShort) +EndIf +Let sMessageShort = GetSelectedText () +Let sMessageLong = FormatString (cmsg39_L, sMessageShort) +Let bSpell = IsSameScript () +If bSpell then + Let nSpeak = OT_SPELL + ;'fool' the message methods: + Let sMessageLong = sMessageShort +Else + Let nSpeak = ot_user_requested_information +EndIf +SayFormattedMessage (nSpeak, sMessageLong, sMessageShort) +EndFunction + +Script SaySelectedText() +var + int StartRow, int StartCol, int EndRow, int EndCol, string StartName, string EndName, + int bSpell, + string sSelectedText, + string sMessageLong, + int bUsingMarkup +If IsTrueListView(GetFocus()) +&& GetSelectedText() then + Return lvSaySelectedText () +EndIf +if GetTableSelectionRange( StartRow, StartCol, StartName, EndRow, EndCol, EndName ) then + let sMessageLong = FormatString( cmsgSelectedCells_L, StartName, EndName ) + sayFormattedMessage( ot_user_requested_information,sMessageLong ) +EndIf +let bSpell = (IsSameScript() && GetRunningFSProducts() != product_MAGic) +if IsWindows7() +&& StringCompare(GetWindowName(GetRealWindow(GetFocus())),cWnStartMenu) == 0 then + let sSelectedText = GetObjectName(SOURCE_CACHED_DATA) +else + let sSelectedText = GetSelectedText (!bSpell);include markup in text if not spelling +EndIf +if IsPCCursor() && IsBrailleOnlyRegion() then + SayFormattedMessageWithVoice (VCTX_MESSAGE, ot_help, cmsgBrlOnlyRegion_l, cmsgBrlOnlyRegion_s) + return +endIf +If ! sSelectedText then + SayMessage (ot_error, cmsgNothingSelected) + Return +EndIf +if bSpell then + SayFormattedMessage(OT_SPELL,sSelectedText) + return +EndIf +let sMessageLong = FormatString(cmsg39_L,sSelectedText) +SayMessageWithMarkup(ot_user_requested_information,sMessageLong,sSelectedText) +EndScript + +; **/1 Start of Selecting Text +Script SelectToEndOfLine() +if IsVirtualRibbonActive() then + ;Just pass the key through so JAWS can process it + ;The Virtual Ribbon code will speak the new item. + TypeKey(cksSelectToEndOfLine) + return +endIf +Let nSaySelectAfter = FALSE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectToEndOfLine () +else + SelectingText(TRUE) + SelectToEndOfLine () + SelectingText(FALSE) +EndIf +EndScript + +Script SelectFromStartOfLine() +if IsVirtualRibbonActive() then + ;Just pass the key through so JAWS can process it + ;The Virtual Ribbon code will speak the new item. + TypeKey(cksSelectToStartOfLine) + return +endIf +Let nSaySelectAfter = FALSE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectFromStartOfLine () +else + SelectingText(TRUE) + SelectFromStartOfLine () + SelectingText(FALSE) +EndIf +EndScript + +Script SelectNextLine() +var + handle hWnd, + int nSubType, + int shouldCallSelectingText = True +let hWnd = GetFocus() +Let nSubType = GetWindowSubTypeCode (hWnd) +If !nSubType then + Let nSaySelectAfter = FALSE +ElIf nSubType == WT_LISTVIEW then + Let nSaySelectAfter = TRUE +ElIf nSubType == WT_TREEVIEW then + Let nSaySelectAfter = TRUE +ElIf nSubType == WT_LISTBOX then + Let nSaySelectAfter = TRUE +ElIf nSubType == WT_MULTISELECT_LISTBOX then + shouldCallSelectingText = False +ElIf nSubType == WT_EXTENDEDSELECT_LISTBOX then + Let nSaySelectAfter = TRUE +Else + Let nSaySelectAfter = FALSE +EndIf +if (!IsJavaWindow(hWnd) && (IsVirtualPCCursor() || IsFormsModeActive())) + shouldCallSelectingText = False +EndIf +if (!shouldCallSelectingText) + SelectNextLine() +else + SelectingText(TRUE) + SelectNextLine() + SelectingText(FALSE) +EndIf +EndScript + +Script SelectPriorLine() +var + handle hWnd, + int nSubType, + int shouldCallSelectingText = True +let hWnd = GetFocus() +Let nSubType = GetWindowSubTypeCode (hWnd) +If !nSubType then + Let nSaySelectAfter = FALSE +ElIf nSubType == WT_LISTVIEW then + Let nSaySelectAfter = TRUE +ElIf nSubType == WT_TREEVIEW then + Let nSaySelectAfter = TRUE +ElIf nSubType == WT_LISTBOX then + Let nSaySelectAfter = TRUE +ElIf nSubType == WT_MULTISELECT_LISTBOX then + Let nSaySelectAfter = TRUE + shouldCallSelectingText = False +ElIf nSubType == WT_EXTENDEDSELECT_LISTBOX then + Let nSaySelectAfter = TRUE +Else + Let nSaySelectAfter = FALSE +EndIf +if (!IsJavaWindow(hWnd) && (IsVirtualPCCursor() || IsFormsModeActive())) + shouldCallSelectingText = False +EndIf +if (!shouldCallSelectingText) + SelectPriorLine() +else + SelectingText(TRUE) + SelectPriorLine() + SelectingText(FALSE) +EndIf +EndScript + +Script SelectNextCharacter() +if IsVirtualRibbonActive() || RibbonsActive() then + ;Just pass the key through so JAWS can process it + ;The Virtual Ribbon code will speak the new item. + TypeKey(cksSelectNextCharacter) + return +endIf +Let nSaySelectAfter = TRUE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectNextCharacter () +else + SelectingText(TRUE) + SelectNextCharacter () + SelectingText(FALSE) +EndIf +if !SupportsEditCallbacks() then + ;Only clear the flag if the selection speaking is not handled by SelectionChangedEvent. + let nSaySelectAfter = false +endIf +EndScript + +Script SelectPriorCharacter() +if IsVirtualRibbonActive() || RibbonsActive() then + ;Just pass the key through so JAWS can process it + ;The Virtual Ribbon code will speak the new item. + TypeKey(cksSelectPriorCharacter) + return +endIf +Let nSaySelectAfter = TRUE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectPriorCharacter () +else + SelectingText(TRUE) + SelectPriorCharacter () + SelectingText(FALSE) +EndIf +if !SupportsEditCallbacks() then + ;Only clear the flag if the selection speaking is not handled by SelectionChangedEvent. + let nSaySelectAfter = false +endIf +EndScript + +Script SelectNextWord() +Let nSaySelectAfter = TRUE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectNextWord () +else + SelectingText(TRUE) + SelectNextWord () + SelectingText(FALSE) +EndIf +if !SupportsEditCallbacks() then + ;Only clear the flag if the selection speaking is not handled by SelectionChangedEvent. + let nSaySelectAfter = false +endIf +EndScript + +Script SelectPriorWord() +Let nSaySelectAfter = TRUE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectPriorWord () +else + SelectingText(TRUE) + SelectPriorWord () + SelectingText(FALSE) +EndIf +if !SupportsEditCallbacks() then + ;Only clear the flag if the selection speaking is not handled by SelectionChangedEvent. + let nSaySelectAfter = false +endIf +EndScript + +script SelectNextParagraph() +if IsVirtualRibbonActive() || RibbonsActive() then + ;Just pass the key through so JAWS can process it + ;The Virtual Ribbon code will speak the new item. + TypeKey(cksSelectNextParagraph) + return +endIf +Let nSaySelectAfter = TRUE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectNextParagraph() +else + SelectingText(TRUE) + SelectNextParagraph() + SelectingText(FALSE) +EndIf +if !SupportsEditCallbacks() then + ;Only clear the flag if the selection speaking is not handled by SelectionChangedEvent. + let nSaySelectAfter = false +endIf +EndScript + +script SelectPriorParagraph() +if IsVirtualRibbonActive() || RibbonsActive() then + ;Just pass the key through so JAWS can process it + ;The Virtual Ribbon code will speak the new item. + TypeKey(cksSelectPriorParagraph) + return +endIf +Let nSaySelectAfter = TRUE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectPriorParagraph() +else + SelectingText(TRUE) + SelectPriorParagraph() + SelectingText(FALSE) +EndIf +if !SupportsEditCallbacks() then + ;Only clear the flag if the selection speaking is not handled by SelectionChangedEvent. + let nSaySelectAfter = false +endIf +EndScript + +Script SelectNextScreen() +Let nSaySelectAfter = FALSE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectNextScreen () +else + SelectingText(TRUE) + SelectNextScreen () + SelectingText(FALSE) +EndIf +EndScript + +script SelectPriorScreen() +Let nSaySelectAfter = FALSE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectPriorScreen () +else + SelectingText(TRUE) + SelectPriorScreen () + SelectingText(FALSE) +EndIf +EndScript + +script SelectToBottom() +Let nSaySelectAfter = FALSE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectToBottom () +else + SelectingText(TRUE) + SelectToBottom () + SelectingText(FALSE) +EndIf +EndScript + +script SelectFromTop() +Let nSaySelectAfter = FALSE +if !IsJavaWindow(GetFocus()) +&& (IsVirtualPCCursor() || IsFormsModeActive()) then + SelectFromTop () +else + SelectingText(TRUE) + SelectFromTop () + SelectingText(FALSE) +EndIf +EndScript + +; **/2 End of Selecting Text Scripts + +Script CloseDocumentWindow () +TypeKey(cksControlF4) +If (! DialogActive ()) then + ; Only initialize variable if child window was actually closed + let WindowClosed = true +endIf +EndScript + +int function ShouldMoveBySentence(int moveDir) +var + int isJava +let isJava = IsJavaWindow (GetCurrentWindow ()) +if IsJAWSCursor() then + if !isJava then + if MoveDir == UnitMove_Next then + PerformScript SayNextSentence() + elif MoveDir == UnitMove_Prior then + PerformScript SayPriorSentence() + EndIf + return true + EndIf +elif IsVirtualPCCursor() +&& MoveDir == UnitMove_Prior +&& False == isJava +then + PerformScript SayPriorSentence() + return true +elif GetWindowClass(GetFocus()) == cwcIEServer +&& GetObjectSubtypeCode() == wt_dialog_page then + if MoveDir == UnitMove_Next then + PerformScript SayNextSentence() + elif MoveDir == UnitMove_Prior then + PerformScript SayPriorSentence() + EndIf + return true +EndIf +; Manage multiline read-only windows especially in dialogs. +;Situations such as QuickSettings, Settings Center, or even Research It are good examples of where this happens. +if dialogActive () && getWindowStyleBits (getFocus ()) & ES_MULTILINE then + if MoveDir == UnitMove_Next then + PerformScript SayNextSentence() + elif MoveDir == UnitMove_Prior then + PerformScript SayPriorSentence() + EndIf + return true +endIf +return false +EndFunction + +void function DoOpenListBoxKeyStroke() +TypeKey(cksAltDownArrow) +EndFunction + +void function DoCloseListBoxKeyStroke() +TypeKey(cksAltUpArrow) +EndFunction + +int function OpeningFormsModeComboBox() +if !IsVirtualPCCursor() || IsJavaWindow(GetFocus()) then + return false +EndIf +if GetObjectSubtypeCode() == wt_comboBox then + LeftMouseButton() + SayMessage (ot_JAWS_message, cmsg41_L, cmsgSilent) ;open list box + let gbShouldExitFormsModeOnComboBoxClose = true + DoOpenListBoxKeyStroke() + return true +EndIf +return false +EndFunction + +int function ClosingFormsModeComboBox() +var + handle hWnd, + handle hParent, + string sClass, + string sParentClass, + int iObjType +if !gbShouldExitFormsModeOnComboBoxClose then + return false +EndIf +if IsFormsModeActive() then + let hWnd = GetCurrentWindow() + let sClass = GetWindowClass(hWnd) + let hParent = GetParent(hWnd) + let sParentClass = GetWindowClass(hParent) + let iObjType = GetObjectSubtypeCode() + if sClass == cwc_ComboLBox + && sParentClass != cwc_IE6DropDownComboBox then + if GetWindowStyleBits(hParent) & CBS_DROPDOWN then + let gbShouldExitFormsModeOnComboBoxClose = false + SendMessage(hParent,CB_SHOWDROPDOWN,0, 0) + SayMessage(ot_JAWS_message, cmsg42_L, cmsgSilent) ;close listbox + TurnOffFormsMode() + return true + EndIf + elif sClass == cwc_IE6DropDownComboBox then + ;The user pressed Alt+DownArrow too many times: + let gbShouldExitFormsModeOnComboBoxClose = false + SayMessage(ot_JAWS_message, cmsg42_L, cmsgSilent) ;close listbox + TurnOffFormsMode() + return true + ElIf iObjType == wt_ListBoxItem + || iObjType == wt_ComboBox then + let gbShouldExitFormsModeOnComboBoxClose = false + DoCloseListBoxKeyStroke() + SayMessage(ot_JAWS_message, cmsg42_L, cmsgSilent) ;close listbox + TurnOffFormsMode() + return true + EndIf +EndIf +return false +EndFunction + +int function IsOpenListBoxApplicable(handle hWnd, int iSubtype) +var + object o, + int iObj, + int iChild, + int v, + int left, + int top, + int right, + int bottom +;for edit, check the MSAA state for has popup: +if iSubtype == wt_edit then + if hWnd == GlobalFocusWindow then + ;GetObjectAtPoint is more reliable than GetFocusObject: + let o = GetObjectAtPoint(iChild,GetcursorCol(),GetCursorRow()) + else + ;Do not use this test for a non-focus window where the window has multiple objects. + GetWindowRect(hWnd,left,right,top,bottom) + let o = GetObjectAtPoint(iChild,(left+right)/2,(top+bottom)/2) + if !o then + let o = GetObjectFromEvent(hWnd,iObj,iChild,V) + EndIf + EndIf + return o && (o.accState & STATE_SYSTEM_HASPOPUP) +EndIf +return ((DialogActive() || IsFormsModeActive()) + && !(iSubtype == wt_static + || iSubtype == wt_edit + || iSubtype == wt_multiline_edit + || iSubtype == wt_readOnlyEdit + || iSubType==wt_document +|| iSubType==WT_PARAGRAPH +|| (iSubType>=WT_HTML_HEADING1 && iSubType <=WT_HTML_HEADING6))) + || iSubtype == WT_EDITCOMBO + || iSubtype == WT_Listbox + || iSubtype == WT_MULTISELECT_LISTBOX + || iSubtype == WT_EXTENDEDSELECT_LISTBOX + || iSubtype == WT_Combobox + || GetWindowClass(hWnd) == cwcMsoCmd +EndFunction + +int function OpenVirtualRibbonDropDownControl() +var + int iSubtype +if !IsVirtualRibbonActive() then + return false +EndIf +let iSubtype = GetObjectSubtypeCode(SOURCE_CACHED_DATA) +if iSubtype == wt_EditCombo +|| iSubtype == wt_ComboBox then + SayCurrentScriptKeyLabel() + LeftMouseButton() + Delay(2) + TypeKey(cksAltDownArrow) + return true +EndIf +return false +EndFunction + +int function CloseVirtualRibbonDropDownControl() +var + int iSubtype +if GlobalMenuMode != Menu_Active +|| !IsFormsModeActive() +|| !IsRibbonControl(GetFocus()) then + return false +EndIf +let iSubtype = GetObjectSubtypeCode(SOURCE_CACHED_DATA) +if iSubtype == wt_EditCombo then + SayCurrentScriptKeyLabel() + TypeKey(cksAltUpArrow) + Delay(2) + TurnOffFormsMode() + return true +EndIf +return false +EndFunction + +void function ProcessOpenListBox(handle hWnd, int iSubtype, int bIsFormsMode) +;If this is a combobox that supports dropdown then send the show dropdown message else just use the keystroke +if GetWindowStyleBits(hWnd) & CBS_DROPDOWN then + SendMessage(hWnd, CB_SHOWDROPDOWN, 1, 0) + SayMessage (ot_JAWS_message, cmsg41_L, cmsgSilent) ;open list box + if bIsFormsMode + && GetJCFOption(OPT_AUTO_FORMS_MODE) then + let gbShouldExitFormsModeOnComboBoxClose = true + EndIf +else + DoOpenListBoxKeyStroke() + if iSubtype == WT_Combobox + || iSubtype == wt_EditCombo then + SayMessage (ot_JAWS_message, cmsg41_L, cmsgSilent) ;open list box + elif iSubtype == wt_DateTime then + SayMessage (ot_JAWS_message, cmsgOpenCalendar_L, cmsgSilent) + EndIf + if bIsFormsMode + && GetJCFOption(OPT_AUTO_FORMS_MODE) + && iSubtype == WT_Combobox then + let gbShouldExitFormsModeOnComboBoxClose = true + EndIf +EndIf +EndFunction + +Script OpenListBox() +var + handle hCurWnd, + int TheTypeCode, + int IsFormsMode, + string sClass +if OpenVirtualRibbonDropDownControl() then + return +elif OpeningFormsModeComboBox() then + return +EndIf +hCurWnd = GetCurrentWindow () +TheTypeCode = GetObjectSubtypeCode() +IsFormsMode = IsFormsModeActive() +;Make single-line edits turn off Forms Mode on web pages. +if IsFormsMode +&& isPcCursor() +&& getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + IsFormsMode = FALSE +endIf +sClass = GetWindowClass(hCurWnd) +if TheTypecode == WT_TREEVIEW +|| sClass == cwc_SysTreeView32 +|| TheTypecode == WT_LISTVIEW +|| sClass == cWcListView then + SayCurrentScriptKeyLabel() + TypeCurrentScriptKey() + return +EndIf +if IsOpenListBoxApplicable(hCurWnd, TheTypeCode) then + ProcessOpenListBox(hCurWnd,TheTypecode,IsFormsMode) + return +endIf +SayCurrentScriptKeyLabel() +TypeCurrentScriptKey() +EndScript + +int function IsCloseListBoxApplicable(handle hWnd, int iSubtype) +return DialogActive() + || IsFormsModeActive() + || iSubtype == WT_EDITCOMBO + || iSubtype == WT_Listbox + || iSubtype == WT_ListboxItem + || iSubtype == WT_LISTVIEWITEM + || iSubtype == WT_MULTISELECT_LISTBOX + || iSubtype == WT_EXTENDEDSELECT_LISTBOX + || iSubtype == WT_Combobox + || GetWindowClass(hWnd) == cwcMsoCmd +EndFunction + +void function ProcessCloseListBox(handle hWnd, int iSubtype, int bIsFormsMode) +;If this is a combobox that supports dropdown then send the show dropdown message else just use the keystroke +if GetWindowStyleBits(hWnd) & CBS_DROPDOWN +&& GetWindowClass(hWnd) != cwc_IE6DropDownComboBox then + SendMessage(hWnd,CB_SHOWDROPDOWN,0, 0) + SayMessage(ot_JAWS_message, cmsg42_L, cmsgSilent) ;close listbox +else + DoCloseListBoxKeyStroke() + if bIsFormsMode then + if (iSubtype == WT_EDITCOMBO || iSubtype == wt_ListBoxItem || iSubtype == WT_Combobox) then + SayMessage(ot_JAWS_message, cmsg42_L, cmsgSilent) ;close listbox + EndIf + return + EndIf + ;IsComboExpanded may not return accurate information after closing the box, + ;so just assume the box has closed and announce it: + SayMessage(ot_JAWS_message, cmsg42_L, cmsgSilent) ;close listbox +EndIf +EndFunction + +int function MoveToParentFolder() +var handle hWnd = GetFocus() +if GetWindowClass(hWnd) != cwc_DirectUIhWNd +&& GetWindowClass(GetParent(hWnd)) != cwc_ShellDLL_DefView + return false +endIf +var object treeWalker = CreateUIATreeWalkerForFocusProcessId(Null(),true) +var int iType = GetObjectSubtypeCode() +;MSAA type will normally be listbox if the folder is empty, +;but if in a dialog and the focus has shifted away from the list and back to it then this is unreliable. +;the UIA depth will be 1 less than if the folder is populated. +;MSAA object type will be listboxItem if in the name column and the folder is not empty, +;and will be static if not in the name column and the folder is not empty. +;if in a column other than the name column, the UIA depth will be 1 level deeper than if in the name column. +if iType == wt_static + treeWalker.gotoParent() + if treeWalker.currentElement.className != UIAClass_UIItem return false endIf + treeWalker.gotoParent() + if treeWalker.currentElement.className != UIAClass_UIItemsView return false endIf +elif iType == wt_listBoxItem + treeWalker.gotoParent() + if treeWalker.currentElement.className != UIAClass_UIItemsView + && treeWalker.currentElement.className != UIAClass_UIGroupItem + return false + endIf +endIf +TypeKey(cksAltUpArrow) +return true +EndFunction + +Script CloseListBox() +var + handle hWnd, + int TheTypeCode, + int IsFormsMode, + string sClass +if !GetFocus() || menusActive () then + SayCurrentScriptKeyLabel() + TypeCurrentScriptKey() + return +elif CloseVirtualRibbonDropDownControl() then + return +elif ClosingFormsModeComboBox() then + return +elif MoveToParentFolder() + return +EndIf +let TheTypeCode = GetObjectSubtypeCode() +let IsFormsMode = IsFormsModeActive() +;Make single-line edits turn off Forms Mode on web pages. +if IsFormsMode +&& isPcCursor () +&& getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + Let IsFormsMode = FALSE +endIf +let hWnd = GetCurrentWindow() +let sClass = GetWindowClass(hWnd) +if TheTypecode == WT_TREEVIEW +|| sClass == cwc_SysTreeView32 +|| TheTypecode == WT_LISTVIEW +|| sClass == cWcListView then + SayCurrentScriptKeyLabel() + TypeCurrentScriptKey() + return +EndIf +if IsCloseListBoxApplicable(hWnd,TheTypecode) then + if GetWindowClass(hWnd) == cwc_ComboLBox then + let hWnd = GetParent(hWnd) + EndIf + ProcessCloseListBox(hWnd,TheTypeCode,IsFormsMode) + return +endIf +SayCurrentScriptKeyLabel() +TypeCurrentScriptKey() +EndScript + +Script SelectAll () +var + handle hWnd, + int iSubtype, + string sSelection, + int RunningProducts +let hWnd = GetCurrentWindow () +let iSubtype = GetWindowSubtypeCode(hWnd) +if !iSubtype then + let iSubtype = GetObjectSubtypeCode() +EndIf +let RunningProducts = GetRunningFSProducts() +if RunningProducts == product_MAGic +&& IsVirtualPcCursor() then + TypeKey(cksSelectAll) + return +EndIf +SelectEntireDocument() +if !(RunningProducts & product_JAWS) then + return +endIf +if iSubtype == wt_ListView +|| iSubtype == wt_ListBox +|| iSubtype == wt_MultiSelect_ListBox +|| iSubtype == wt_ExtendedSelect_ListBox +|| iSubtype == wt_ListBoxItem then + Pause() + let sSelection = GetSelectedText() + if !sSelection then + let sSelection = GetWindowText(hWnd, true) + EndIf + If nSaySelectAfter then + Say(sSelection,ot_line) + Say(cmsg215_L,OT_SELECT) + Else + Say(cmsg215_L,OT_SELECT) + Say(sSelection,ot_line) + EndIf +EndIf +EndScript + +script PassKeyThrough() +;cmsg43_L = "Enter key to pass thru" +SayFormattedMessage (ot_JAWS_message, cmsg43_L, cmsg43_S) +PassKeyThrough() +EndScript + +void function ProcessBoundaryStrike(handle hWnd, int edge) +var + int iType +Let iType = GetWindowSubTypeCode(hWnd) +;Exclude List Views in Windows Vista: +If (IsWinVista () && iType == WT_LISTVIEW) then + ;Return if not desktop or folder list view: + If (GetWindowClass (GetParent (hWnd)) == cwc_ShellDll_DefView) then + Return + EndIf +EndIf +if lvIsCustomized(hWnd) then + Beep () + return +endIf +if iType == wt_MultiLine_edit then + Beep() + return +EndIf +if IsVirtualPCCursor() +&& !IsFormsModeActive() then + Beep() + return +EndIf +if iType == WT_MULTISELECT_LISTBOX +|| iType == WT_EXTENDEDSELECT_LISTBOX +|| iType == WT_LISTBOX +|| iType == WT_LISTVIEW +|| iType == WT_BUTTONLISTBOX +|| iType == wt_TreeView +|| iType == wt_TreeViewItem then + Beep () + Return +endIf +EndFunction + +Void Function TopEdgeEvent (handle WindowHandle) +If BrailleFHPTopEdge () then + Return +EndIf +ProcessBoundaryStrike(WindowHandle,TopEdge) +EndFunction + +Void Function BottomEdgeEvent(handle WinHandle) +If BrailleFhpBottomEdge () then + Return +EndIf +ProcessBoundaryStrike(WinHandle,BottomEdge) +EndFunction + +int Function HandleCustomAppWindows (handle hWnd) +var + handle hReadOnly = FindDescendantWindow (hwnd, 1300) +if inHjDialog () then + if hReadOnly && getWindowSubtypeCode (hReadOnly) == WT_READONLYEDIT then + sayWindowTypeAndText (hwnd) + sayWindow (hReadOnly, READ_EVERYTHING) + return TRUE + endIf +endIf +if IsWindowDisabled (hwnd) +&& (getWindowClass (hwnd) == "JFWUI2" +|| IsWinFormsWindow(hwnd));keep JAWS from saying both the title of the disabled window and the title of the active window + ; Keep JAWS from erroneously saying 'jaws' when dialogs like Flexible Web come up. + ;Instance occurs when JAWS is not set to run in System Tray. + return TRUE +endIf +Return FALSE +EndFunction + +int Function HandleCustomRealWindows (handle hWnd) +; Where JAWS is run as window and not system tray, +; Flexible Web dialog repeats the static text as it does the SayWindowTypeAndText for the control. +if FlexibleWebDialogActive () then + SayControlEXWithMarkup (hwnd, GetWindowName (hWnd), GetWindowType (hwnd)) + return TRUE +endIf +Return FALSE +EndFunction + +int Function HandleCustomWindows (handle hWnd) +var + int iSubtype +unScheduleFunction (giFN_SpeakInvisibleWindow) +;HjDialogs should always use older WindowTypeAndText code, +;So that on Windows 9X PositionInGroup info never misreports items +If InHjDialog () then + SayWindowTypeAndText (hWnd) + let iSubtype = GetWindowSubtypeCode (hWnd) + ;Announce tree item parent node: + if iSubtype == wt_TreeView + || iSubtype == wt_TreeViewItem then + if GetTreeViewLevel() > 0 then + SayUsingVoice(vctx_message,tvGetItemText(hWnd, tvGetParent(hWnd,tvGetSelection(hWnd))),ot_position) + EndIf + SayMessage (OT_SCREEN_MESSAGE, FlexibleWebNumberOfActiveRules ()) + EndIf + ;For input edit boxes: + If iSubtype == WT_MULTILINE_EDIT then + SayWindow (hWnd, TRUE) + EndIf + Return TRUE +EndIf +if sayFocusedObjectViewSliders () then return TRUE endIf +; for internal FS windows, +; where they may briefly gain focus and then go away, we don't want to speak: +if ! iSubtype +&& StringContains (GetWindowClass (hwnd), "fsExternalVideoClass") + return TRUE +endIf +if menusActive () && isPcCursor () then + Let iSubtype = getWindowSubtypeCode (hwnd) + if iSubtype == WT_LISTVIEW + && getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_MENU then + indicateControlType (wt_menu, getObjectName(SOURCE_CACHED_DATA)) + Return TRUE + endIf +endIf +;The current ap is no longer, or the window is invisible: +;All windows have closed, save the desktop and task bar +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) +&& AllAppsClosedFromSystemTray (hwnd) then + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) + Return TRUE +endIf +Return FALSE +EndFunction + +int function JavaFocusChangedEvent_ShouldIgnoreEvent( + handle FocusWindow, handle FocusedObjectID, + handle PrevWindow, handle PrevObjectID) +if ( + ! GlobalWasHjDialog + && navIsSameObject(FocusWindow, FocusedObjectID, PrevWindow, PrevObjectID) + ) + return TRUE +endIf +Return FALSE +EndFunction + +int function JavaFocusChangedEvent_ShouldSpeakAppMainObject( + handle FocusWindow, handle PrevWindow, + handle AppMainObjectID, handle PrevAppMainObjectID, + handle TopLevelObjectID, handle PrevTopLevelObjectID, + handle RealObjectID, handle PrevRealObjectID) +if ( + ! GlobalWasHjDialog + && ! navIsSameObject(FocusWindow, RealObjectID, FocusWindow, AppMainObjectID) + && ! navIsSameObject(FocusWindow, TopLevelObjectID, FocusWindow, AppMainObjectID) + && ! navIsSameObject(GetAppMainWindow(FocusWindow), AppMainObjectID, GetAppMainWindow(PrevWindow), PrevAppMainObjectID) + ) + return TRUE +endIf +Return FALSE +EndFunction + +int function JavaFocusChangedEvent_ShouldSpeakTopLevelObject( + handle FocusWindow, handle PrevWindow, + handle AppMainObjectID, handle PrevAppMainObjectID, + handle TopLevelObjectID, handle PrevTopLevelObjectID, + handle RealObjectID, handle PrevRealObjectID) +if ( + ! GlobalWasHjDialog + && ! navIsSameObject(GetTopLevelWindow(FocusWindow), TopLevelObjectID, GetTopLevelWindow(PrevWindow), PrevTopLevelObjectID) + ) + return TRUE +endIf +Return FALSE +EndFunction + +int function JavaFocusChangedEvent_ShouldSpeakRealObject( + handle FocusWindow, handle PrevWindow, + handle AppMainObjectID, handle PrevAppMainObjectID, + handle TopLevelObjectID, handle PrevTopLevelObjectID, + handle RealObjectID, handle PrevRealObjectID) +if ( + ! GlobalWasHjDialog + && ! navIsSameObject(FocusWindow, AppMainObjectID, FocusWindow, RealObjectID) + && ! navIsSameObject(FocusWindow, TopLevelObjectID, FocusWindow, RealObjectID) + && ! navIsSameObject(GetRealWindow(FocusWindow), RealObjectID, GetRealWindow(PrevWindow), PrevRealObjectID) + ) + return TRUE +endIf +Return FALSE +EndFunction + +void function JavaFocusChangedEvent_UpdateObjectIDs( + handle AppMainObjectID, handle TopLevelObjectID, + handle RealObjectID, handle FocusedObjectID) +let g_PrevAppMainObjectID = AppMainObjectID +let g_PrevTopLevelObjectID = TopLevelObjectID +let g_PrevRealObjectID = RealObjectID +let g_PrevFocusedObjectID = FocusedObjectID +EndFunction + +Void Function JavaFocusChangedEvent (handle FocusWindow, handle PrevWindow) + var + HANDLE FocusedObjectID, + HANDLE AppMainObjectID, + HANDLE TopLevelObjectID, + HANDLE RealObjectID + let GlobalFocusWindow = FocusWindow + let FocusedObjectID = navGetFocusObjectID () + if (JavaFocusChangedEvent_ShouldIgnoreEvent(FocusWindow, FocusedObjectID, PrevWindow, g_PrevFocusedObjectID)) + JavaFocusChangedEvent_UpdateObjectIDs(AppMainObjectID, TopLevelObjectID, RealObjectID, FocusedObjectID) + return + endIf + let AppMainObjectID = navGetAppMainObjectID (FocusedObjectID, FocusWindow) + let TopLevelObjectID = navGetTopLevelObjectID (FocusedObjectID, FocusWindow) + let RealObjectID = navGetRealObjectID (FocusedObjectID, FocusWindow) + if ( + JavaFocusChangedEvent_ShouldSpeakAppMainObject( + FocusWindow, PrevWindow, AppMainObjectID, g_PrevAppMainObjectID, + TopLevelObjectID, g_PrevTopLevelObjectID, + RealObjectID, g_PrevRealObjectID) + ) + navSayObjectTypeAndText(AppMainObjectID, FocusWindow) + endIf + if ( + JavaFocusChangedEvent_ShouldSpeakTopLevelObject( + FocusWindow, PrevWindow, AppMainObjectID, g_PrevAppMainObjectID, + TopLevelObjectID, g_PrevTopLevelObjectID, + RealObjectID, g_PrevRealObjectID) + ) + navSayObjectTypeAndText(TopLevelObjectID, FocusWindow) + endIf + if ( + JavaFocusChangedEvent_ShouldSpeakRealObject( + FocusWindow, PrevWindow, AppMainObjectID, g_PrevAppMainObjectID, + TopLevelObjectID, g_PrevTopLevelObjectID, + RealObjectID, g_PrevRealObjectID) + ) + navSayObjectTypeAndText(RealObjectID, FocusWindow) + endIf + SayFocusedObject () + JavaFocusChangedEvent_UpdateObjectIDs(AppMainObjectID, TopLevelObjectID, RealObjectID, FocusedObjectID) +EndFunction + +void function EnsureVistaDesktopTrackingInMagic(handle hWnd, int nType) +var + int lvItem, + int Rect, + int nLeft, + int nTop, + int nBottom, + int nRight +If nType != WT_LISTBOXITEM +|| GetWindowClass(GetParent(hwnd)) != cwc_ShellDll_DefView +|| !IsMAGicRunning() then + return +EndIf +Let lvItem = lvGetFocusItem (hwnd) +If lvItem then + Let Rect = lvGetItemRect(hwnd,lvItem,nLeft,nRight,nTop,nBottom) +EndIf +If Rect then + MagSetFocusToRect(nLeft,nRight,nTop,nBottom) +EndIf +EndFunction + +string function PositionInGroupForSecondaryFocus() +if !IsSecondaryFocusActive() return cscNull endIf +var int setLevel, int sizeOfSet, int positionInSet +GetSecondaryFocusSelectionGroupPosition(setLevel, sizeOfSet, positionInSet) +if !positionInSet || !sizeOfSet return cscNull endIf +return FormatString(cmsgPosInGroup1, positionInSet, sizeOfSet) +EndFunction + +int function ShouldIgnoreSaySecondaryFocusSelectedItem() +return GetObjectIsEditable () +&& StringIsBlank(GetObjectValue ()) +endFunction + +void function SaySecondaryFocusSelectedItem(int includePosition) +if giScheduledSaySecondaryFocusSelectedItem + UnScheduleFunction (giScheduledSaySecondaryFocusSelectedItem) + giScheduledSaySecondaryFocusSelectedItem = 0 +endIf +var string text = GetSecondaryFocusSelectionText() +if !text +|| ShouldIgnoreSaySecondaryFocusSelectedItem() + return +endIf +Say(text,ot_screen_message) +if !includePosition return endIf +var string positionInGroup = PositionInGroupForSecondaryFocus() +if positionInGroup + Say(positionInGroup, ot_position) +endIf +EndFunction + +Void Function SecondaryFocusChangedEvent() +if !IsSecondaryFocusActive() + WasSecondaryFocusActive = false + return SecondaryFocusDeactivatedEvent() +elif !WasSecondaryFocusActive + ;do not return when becoming active, + ;the focus event needs to process the code below this block for the focus change. + WasSecondaryFocusActive = true + SecondaryFocusActivatedEvent() +endIf +SaySecondaryFocusSelectedItem(true) +BrailleRefresh() +EndFunction + +Void Function SecondaryFocusActivatedEvent() +;Add here only the code which should run when a secondary focus appears. +;The SecondaryFocusChangedEvent function will handle the normal focus change code. +EndFunction + +Void Function SecondaryFocusDeactivatedEvent() +;Add any code here which should run when the secondary focus goes away. +if giScheduledSaySecondaryFocusSelectedItem + UnScheduleFunction (giScheduledSaySecondaryFocusSelectedItem) + giScheduledSaySecondaryFocusSelectedItem = 0 +endIf +EndFunction + +void function ClearFocusChangeMenuGlobals() +gstrListViewGroupName = cscNull +g_strLastMenuName = cscNull +g_strLastMenuGroupName = cscNull +EndFunction + +int function MenuProcessedOnFocusChangedEventEx( + handle hwndFocus, handle hwndPrevFocus, + int nType, optional int nChangeDepth) +var + int nCurMenuMode, + string strCurMenuName, + string strMenuGroupName, + string strListGroupName +nCurMenuMode = GetMenuMode () +GlobalMenuMode = nCurMenuMode +if nCurMenuMode == MENU_INACTIVE + ClearFocusChangeMenuGlobals() + return false +endIf +GlobalFocusWindow = hwndPrevFocus +if IsVirtualRibbonActive() then + SayVirtualRibbonItem() + return true +EndIf +if nType == wt_ContextMenu +&& !(GetObjectName(SOURCE_CACHED_DATA) || GetObjectValue()) then + ;Don't announce the item if it has no name or value, + ;since announcement would cause position infor to be spoken, + ;thus causing a position of a non-speakable item. + ;This happens if the Menu triggered an extra focus change on Start Menu + ;before the focus changed to the first item on the Start Menu. + return true +EndIf +strCurMenuName = GetMenuName () +if strCurMenuName != g_strLastMenuName then + if StringLength (strCurMenuName) != 0 + Say (FormatString (cmsg193_L, strCurMenuName), OT_CONTROL_NAME) + EndIf + g_strLastMenuName = strCurMenuName +EndIf +if GetObjectSubtypeCode(false,1) == wt_GroupBox + strMenuGroupName = GetObjectName(false,1) + if strMenuGroupName + && strMenuGroupName != g_strLastMenuGroupName + IndicatecontrolType(wt_GroupBox, strMenuGroupName) + endIf + g_strLastMenuGroupName = strMenuGroupName +endIf +If nType == WT_EDIT +|| GetWindowSubtypeCode (hWndFocus) == WT_STARTMENU + MagTrackCustomMenus (hwndFocus) +EndIf +if nType == wt_treeviewItem || getWindowSubtypeCode (hwndFocus) == WT_TREEVIEW + SayTreeViewLevel (TRUE) +elif nType != WT_LISTBOXITEM + if nChangeDepth > 0 + nChangeDepth = 0 + endIf + SayObjectTypeAndText(nChangeDepth) +else + SayObjectActiveItem (FALSE) ; with no position info + strListGroupName = lvGetGroupName (hWndFocus, lvGetFocusItem (hWndFocus)) + If strListGroupName != gstrListViewGroupName then + SayMessage (OT_POSITION,FormatString (cmsgListGroupName, strListGroupName)) + EndIf + gstrListViewGroupName = strListGroupName +endIf +if stringContains (getObjectClassName (), "NetUIAnchor") then +; Say any object help such as path information etc for Microsoft Office. + SayUsingVoice(VCTX_MESSAGE, GetObjectHelp(), OT_SCREEN_MESSAGE) +endIf +return true +EndFunction + +void function ProcessEventOnFocusChangedEventEx( + handle hwndFocus, int nObject, int nChild, + handle hwndPrevFocus, int nPrevObject, int nPrevChild, + int nChangeDepth, string sClass, int nType) +var + int nParentType +if stringIsBlank (sClass) + sClass = getWindowClass (hwndFocus) +endIf +if nChangeDepth == -1 then + ; If edit callbacks are enabled, suppress double speaking when arrowing to a cell if it generates a focus event. + if (SupportsEditCallbacks () && GetObjectTypeCode (true)==WT_TABLECELL) then + return; + endIf + + if ShouldWinformsControlBeSilent (hwndFocus) + && IsWinFormListItemUnchanged () then + ; filter out double-speaking in winForms drop-down list boxes from combo and edit combo boxes: + return + endIf + return ActiveItemChangedEvent(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild) +EndIf +;if nChangeDepth == 0 +if hwndFocus == hwndPrevFocus then + if sClass == cwc_SysTreeView32 then + return ActiveItemChangedEvent(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild) + elif sClass == cWc_Toolbar then + ;Address ToolBar: + if nType == WT_SPLITBUTTON then + return ActiveItemChangedEvent(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild) + EndIf + elif sClass == cwc_DirectUIhWND then + let nParentType = GetObjectSubtypeCode(SOURCE_CACHED_DATA,1) + ;File and folder list: + if nType == wt_ReadOnlyEdit + && nParentType == wt_ListBoxItem then + return ActiveItemChangedEvent(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild) + ;Header ListBox SplitButtons: + elif nType == WT_SPLITBUTTON + && nParentType == wt_ListBox then + return ActiveItemChangedEvent(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild) + EndIf + elif (nType == wt_DateTime && stringStartsWith(sClass, cWc_Winforms, true)) + /* If the author of a Windows Forms application does not explicitly set the + Accessible Name of a System.Windows.Forms.DateTimePicker control the name + will be set to the value. This name will be updated every time the value + changes. This causes FocusChangedEventEx to be called when no focus change + occurred resulting in extraneous speech. To resolve this issue return here. */ + return + elif (nType == WT_Calendar) + return ActiveItemChangedEvent(hwndFocus, nObject, nChild, hwndPrevFocus, nPrevObject, nPrevChild) + EndIf +EndIf + +;Handle tree views where depth changes but the window does not. +;Object remains the same as the child id is the only change that affects selection +;in IE, the object IDs actually change but we still want to speak using active item +if (nType == WT_TREEVIEW || nType == WT_TREEVIEWITEM) + if ((sClass== cwcIEServer || nObject == nPrevObject) && hwndFocus == hwndPrevFocus) + ; In Java tree views, GetObjectValue returns the text of the selected object in the + ; tree view. If GetObjectValue returns an empty string, that means that no object is + ; selected. JAWS should not process this event as an active item change in this case. + if (!IsJavaWindow(hwndFocus) || (IsJavaWindow(hwndFocus) && !StringIsBlank(GetObjectValue()))) + return ActiveItemChangedEvent(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild) + endIf + endIf +endIf + +FocusChangedEvent(hwndFocus,hwndPrevFocus) +EndFunction + +int function ProcessTaskSwitchList(handle hwndFocus) +;Process list that appears when Alt+Tab is used to switch apps +if GetWindowClass(hwndFocus) == cwc_Win10_AltTabWindow || ; Windows 10 + GetObjectAutomationId(1) == UIAAutomationID_TaskSwitchingWindow ; Windows 11 + if GetObjectSubTypeCode(SOURCE_CACHED_DATA) == WT_LISTBOXITEM then + Say(GetObjectName(), OT_WINDOW_NAME) + endIf + return true +EndIf +return false +EndFunction + +void function ManageWindows10FocusableProgressBarListener() +if !IsWindows10() return endIf +SaveCursor() +PCCursor() +var int typeCode = GetObjectSubtypeCode() +RestoreCursor() +if typeCode != WT_ProgressBar + gUIA_ProgressBarListener = Null() + CollectionRemoveAll(c_FocusableProgressBar) + return +endIf +gUIA_ProgressBarListener = CreateObjectEx ("FreedomSci.UIA", 0, "UIAScriptAPI.x.manifest") +if !ComAttachEvents(gUIA_ProgressBarListener, FocusableProgressBar_Update_EventPrefix) + gUIA_ProgressBarListener = Null() + return +endIf +var object element = gUIA_ProgressBarListener.GetFocusedElement().buildUpdatedCache() +if element.controlType != UIA_ProgressBarControlTypeId +|| !gUIA_ProgressBarListener.AddPropertyChangedEventHandler(UIA_RangeValueValuePropertyId, element, TreeScope_Element) + gUIA_ProgressBarListener = Null() + return +endIf +c_FocusableProgressBar.name = element.Name +c_FocusableProgressBar.value = element.buildUpdatedCache().GetRangeValuePattern().value +c_FocusableProgressBar.prevProgressBarAnnouncementTickCount = GetTickCount() +c_FocusableProgressBar.ProgressBarUpdateInterval = GetJCFOption(OPT_PROGRESSBAR_UPDATE_INTERVAL) +EndFunction + +void function FocusableProgressBarPropertyChangedEvent(object element, int propertyID, variant newValue) +;use the progress bar update interval JCF option to control how often this event announces: +if GetTickCount()-c_FocusableProgressBar.prevProgressBarAnnouncementTickCount >= c_FocusableProgressBar.ProgressBarUpdateInterval + Say(FormatString(cmsgPercentage,newValue),ot_screen_message) + c_FocusableProgressBar.prevProgressBarAnnouncementTickCount = GetTickCount() +endIf +c_FocusableProgressBar.value = newValue +BrailleRefresh() +EndFunction + +void function PreProcessFocusChangedEventEx( + handle hwndFocus, int nObject, int nChild, + handle hwndPrevFocus, int nPrevObject, int nPrevChild, + int nChangeDepth) +;Use this function to update variables and states before the rest of the code from FocusChangedEventEx runs. +UIAFocusChangedEventEx() +;; Stop speech if all of the following conditions are true. +;; 1. The "Interrupt Speech When A Dialog Box Is Created" option is enabled. +;; 2. The current real window is different from the previous real window. +;; 3. The current real window is either a dialog box or a Windows Forms window. +var handle realWindow = GetRealWindow(hwndFocus) +if ( + gbInterruptSpeechWhenADialogBoxIsCreated + && realWindow != GlobalPrevReal + && (DialogActive() || IsWinFormsWindow(realWindow)) + ) + OutputDebugStringL("Interrupt Speech For Dialog or Windows Forms Creation", LEVEL_ALWAYS) + + StopSpeech() +EndIf +if SayLBDeselectedItemScheduleID != 0 + UnscheduleFunction(SayLBDeselectedItemScheduleID) + SayLBDeselectedItemScheduleID = 0 +endIf +if giFN_SpeakInvisibleWindow then + unScheduleFunction (giFN_SpeakInvisibleWindow) +endIf +ProcessGestureSelectionModeOnFocusChange(hwndFocus, nObject, nChild, hwndPrevFocus, nPrevObject, nPrevChild, nChangeDepth) +MonitorFormsModeComboBox(hwndFocus,hwndPrevFocus,nChild) +if nChangeDepth > -1 || hwndFocus != hwndPrevFocus then +; destroy cache used to filter extra speaking in winForms drop-down list boxes from combo boxes: + dumpWinformsListItemGlobals () +endIf +ManageWindows10FocusableProgressBarListener() +HandleSplitBrailleCommandPrompt(hwndFocus, hwndPrevFocus) +HandleBackgroundOCR(hwndFocus, hwndPrevFocus) +EndFunction + +int function FocusRedirectedOnFocusChangedEventEx ( + handle hwndFocus, int nObject, int nChild, + handle hwndPrevFocus, int nPrevObject, int nPrevChild, + int nChangeDepth) +;Return true to prevent anything after this function is called in FocusChangedEventEx from running, false otherwise. +if (hwndFocus != hwndPrevFocus +&& ! nObject && ! nChild && ! nChangeDepth) then + if GetWindowClass (hwndFocus) == cwc_DirectUIhWND + && GetObjectName(SOURCE_CACHED_DATA) == cwnEmptyFolderInDialog then + MSAARefresh () + BrailleRefresh () + return TRUE + endIf +endIf +; Only speak focus changes which result from the tab key if focusFollowsVirtualCursor is on, otherwise we'll get double speaking. +if GetJCFOption(optFocusFollowsVirtualCursor) && IsVirtualPCCursor() +&& FocusChangeTriggeredByUserNavigation() then + return true +endIf +var string sClass = GetObjectClassName () +if GetObjectSubTypeCode () == WT_CONTEXTMENU + if sClass == "Microsoft.UI.Content.DesktopChildSiteBridge" + ;Focus first item when opening context menu + UIARefresh (false) + return true + elIf sClass == "MenuFlyout" + && !GetObjectName () + ;Focus first item in submenu of context menu + FSUIAGetFirstChildOfElement (FSUIAGetFocusedElement ()).SetFocus() + return true + endIf +endIf +return FALSE +endFunction + +void function RunningProcessDetectedEvent (string ProcessName) +; runs for each application running when JAWS starts, +;and once for each application process who starts during a JAWS session. +; since this runs for every process, +; it's recommended your supporting function first verifies the name of the process before expensive activity. +;AppendToScriptCallStackLog () +;AppendToScriptCallStackLogEx (FormatString ("ProcessName is: %1", ProcessName)) +AddMainUIALyncEventHandler (ProcessName) +endFunction + +void function FocusChangedEventEx ( + handle hwndFocus, int nObject, int nChild, + handle hwndPrevFocus, int nPrevObject, int nPrevChild, + int nChangeDepth) +PreProcessFocusChangedEventEx(hwndFocus, nObject, nChild, hwndPrevFocus, nPrevObject, nPrevChild, nChangeDepth) +if FocusRedirectedOnFocusChangedEventEx (hwndFocus, nObject, nChild, + hwndPrevFocus, nPrevObject, nPrevChild, nChangeDepth) then + return +endIf +var + handle hwndNull, + string sClass, + int nType +let sClass = GetWindowClass(hwndFocus) +let nType = GetObjectSubTypeCode(SOURCE_CACHED_DATA) +if MenuProcessedOnFocusChangedEventEx(hwndFocus,hwndPrevFocus,nType,nChangeDepth) then + return +EndIf +if ProcessTaskSwitchList(hWndFocus) then + return +EndIf +EnsureVistaDesktopTrackingInMagic(hWndFocus,nType) +ProcessEventOnFocusChangedEventEx(hwndFocus,nObject,nChild,hwndPrevFocus,nPrevObject,nPrevChild,nChangeDepth,sClass,nType) +EndFunction + +void function ProcessSayAppWindowOnFocusChange(handle AppWindow, handle FocusWindow) +var + handle hWndPage +if IsMacToolTipWindow (FocusWindow) + return +endIf +if GlobalPrevApp == AppWindow +|| AppWindow == FocusWindow + ;We will catch this change when we speak the focus window, so just return. + return +EndIf +if GlobalWasHjDialog + ;Do not speak the app name when exiting from an HJDialog back to the application. + if !InHjDialog() then + return + else + ;due to timing issues with the JAWS Find dialog, + ;we cannot depend on the value returned by InHJDialog to tell if the dialog has cleared. + ;So, we test the previous hj dialog name: + if GlobalPrevRealName == cwn_JAWS_Find then + return + EndIf + EndIf +EndIf +var int appWindowSubtypeCode = GetWindowSubtypeCode (appWindow) +if getRunningFSProducts () & Product_Fusion +&& inHjDialog () +&& ! appWindowSubtypeCode then +; in browsers, insert f2 and insert f3 read the full application title and they should not. + return +endIf +If !HandleCustomAppWindows(AppWindow) then + SayWindowTypeAndText(AppWindow) +EndIf +;Now do Dialog, check for first page of wizzard: +If appWindowSubtypeCode == WT_DIALOG then + ;Check for dialog page in wizards: + Let hWndPage = GetFirstWindow (FocusWindow) + If GetWindowSubtypeCode (hWndPage) == WT_DIALOG_PAGE + && GetTypeAndTextStringsForWindow(AppWindow) != GetTypeAndTextStringsForWindow(hwndPage) then + SayWindowTypeAndText (hWndPage) + EndIf +EndIf +EndFunction + +int function ProcessSayRealWindowOnFocusChangeFromHJDialog(handle AppWindow, handle RealWindow, string RealWindowName, handle FocusWindow) +if !GlobalWasHjDialog then + return false +EndIf +if GISuppressStartMenu then + ;The GISuppressStartMenu function set to TRUE on account of the Real Window Name in Windows XP. + return false +EndIf +;Do not speak the real name when exiting from an HJDialog back to the application, +;unless we are exiting an HJDialog back to the start menu. +if !InHjDialog() then + ;GlobalWasHjDialog prevents over chatter, especially when exiting a list box and returning to a client area. + ;Set GlobalWasHJDialog to FALSE when one HjDialog follows another, + ;For example, the AddBrailleColors function. + return true +else + ;due to timing issues with the JAWS Find dialog, + ;we cannot depend on the value returned by InHJDialog to tell if the dialog has cleared. + ;So, we test the previous hj dialog name: + if GlobalPrevRealName == cwn_JAWS_Find then + return true + EndIf +EndIf +return false +EndFunction + +void function ProcessSayRealWindowOnFocusChange( + handle AppWindow, handle RealWindow, string RealWindowName, handle FocusWindow) +var + string functionName = "ProcessSayRealWindowOnFocusChange", + handle hChild +if (IsMacToolTipWindow(FocusWindow)) + FormattedOutputDebugStringL( + "%1 status: IsMacToolTipWindow(0x%1) returned true; returning without speaking the real window.", + LEVEL_DEBUG, functionName, DecToHex(FocusWindow)) + return +endIf +If (GlobalPrevRealName == RealWindowName && GlobalPrevReal == RealWindow) + FormattedOutputDebugStringL( + "%1 status: The real window did not change; returning without speaking the real window.", + LEVEL_DEBUG, functionName) + return +EndIf +FormattedOutputDebugStringL( + "%1 status: RealWindowName is '%2', GlobalPrevRealName is %3, RealWindow is 0x%4, GlobalPrevReal is 0x%5", + LEVEL_DEBUG, functionName, RealWindowName, GlobalPrevRealName, DecToHex(RealWindow), DecToHex(GlobalPrevReal)) +If (RealWindow == AppWindow +&& AppWindow != GlobalPrevApp) +|| (RealWindow == FocusWindow && !DoesWindowContainFocusedObject(focusWindow)) + ;We will catch this change either in the app window or the focus window processing, so just return. + return +EndIf +if ProcessSayRealWindowOnFocusChangeFromHJDialog(AppWindow, RealWindow, RealWindowName, FocusWindow) then + return +EndIf +If !HandleCustomRealWindows(RealWindow) then + SayWindowTypeAndText(RealWindow) + let hChild = GetFirstChild(RealWindow) + if GetWindowClass(hChild) == cWc_dlg32770 then + if GetWindowSubtypeCode(hChild) == wt_dialog_page + && GetTypeAndTextStringsForWindow(RealWindow) != GetTypeAndTextStringsForWindow(hChild) then + SayWindowTypeAndText(hChild) + EndIf + EndIf +endIf +EndFunction + +int function IsEmbeddedInternetExplorerWindow(handle window) +var string windowClass = GetWindowClass(window) +if (StringCompare(windowClass, cwcIEServer) != 0) + return false +endIf +var handle parentWindow = GetParent(window) +if (!parentWindow) + return false +endIf +var handle grandParentWindow = GetParent(parentWindow) +if (!grandParentWindow) + return false +endIf +var string grandParentWindowClass = GetWindowClass(grandParentWindow) +return (StringCompare(grandParentWindowClass, cwc_ShellEmbedding) == 0) +EndFunction + +/* Determine whether the window is an embedded web browser window. Currently +this function will only detect an embedded Internet Explorer window. It is +written so that it can be extended to support other web browsers in the future +by just adding another if statement before the final return statement. */ +int function IsEmbeddedWebBrowserWindow(handle window) +if (IsEmbeddedInternetExplorerWindow(window)) + return true +endIf +/* Add if statements for other web browsers above this line. */ +return false +EndFunction + +/* This function determines whether focus just landed in an embedded web browser +window; that is the previous focus window was not an embedded web browser window +and the current focus is an embedded web browser window. This function uses and +updates the GlobalPrevFocusWasEmbeddedWebBrowserWindow global variable. */ +int function IsEmbeddedWebBrowserWindowFocusTransition(handle FocusWindow, int ByRef shouldRefresh) +shouldRefresh = false +var int isEmbeddedWebBrowser = IsEmbeddedWebBrowserWindow(FocusWindow) +var string DialogIdentifier = cscNull +if (!isEmbeddedWebBrowser) + isEmbeddedWebBrowser = IsEmbeddedWebBrowserWindow(GetFirstChild(FocusWindow)) +endIf +var int ret = (isEmbeddedWebBrowser != GlobalPrevFocusWasEmbeddedWebBrowserWindow) +if (isEmbeddedWebBrowser && !ret) + DialogIdentifier = GetDialogIdentifier() + if (StringCompare(DialogIdentifier, GlobalPrevDialogIdentifier) != 0) + ret = true + shouldRefresh = true + endIf +endIf +GlobalPrevFocusWasEmbeddedWebBrowserWindow = isEmbeddedWebBrowser +return ret +EndFunction + +void function HandleEmbeddedWebBrowserWindowFocusTransition(handle FocusWindow) +var int shouldRefresh = false +if (!IsEmbeddedWebBrowserWindowFocusTransition(FocusWindow, shouldRefresh)) + return +endIf +if (shouldRefresh) + Refresh() +endIf +var string objectClassName = GetObjectClassName(0) +if (StringCompare(objectClassName, cWcShellObject) != 0) + return +endIf +/* Sometimes when focus moves to the an embedded web browser window the focused +window according to the cached MSAA data is the "Shell DocObject View" window +and not the "Internet Explorer_Server" window. When the cached data focused +window is the "Internet Explorer_Server" JAWS speaks correctly. When the cached +data focused window is the "Shell DocObject View" window JAWS fails to speak the +title. Compensate for this by speaking the title here. */ +var string documentTitle = GetDocumentTitle() +if (StringIsBlank(documentTitle)) + return +endIf +Say(documentTitle, OT_CONTROL_NAME) +EndFunction + +void function ProcessSayFocusWindowOnFocusChange(string RealWindowName, handle FocusWindow) +If GetWindowSubTypeCode (FocusWindow) == WT_STARTMENU +;Windows XP, the Type code is ListView, so: +|| RealWindowName == cWnStartMenu then + ;If in Start Menu, and not in Win NT or 95, + ;Speak Object Name instead of the whole Object Type And Text information: + If GISuppressStartMenu then + SayObjectActiveItem() + EndIf + ;Solve Japan problem where Exit Documents menus was not reporting accurate state. + Let GISuppressStartMenu = TRUE + return +EndIf +;Ensure Start Menu flag is off, since we are not in the Start Menu: +Let GISuppressStartMenu = FALSE +If SayFocusedHJDialogWindow(FocusWindow) then + return +EndIf +if (HandleWebDialogFocusTransition()) + if (DialogActive ()) then + return; The transition function will handle the speaking. + endIf +endIf +if HandleWebDocumentFocusTransition() + return; The transition function will handle the speaking. +endIf +HandleEmbeddedWebBrowserWindowFocusTransition(FocusWindow) +If !HandleCustomWindows(FocusWindow) then + SayFocusedWindow() +EndIf +EndFunction + +void function SayFocusedHJDialogWindow(handle FocusWindow) +var + int bSayTopLineOfEdit, + int iSubtype, + handle hWnd +If !InHjDialog() + return false +EndIf +iSubtype = GetWindowSubtypeCode(FocusWindow) +if getRunningFSProducts () & Product_Fusion +&& iSubtype == WT_STATIC +; this window pops in and out of visibility +&& isWindowObscured (FocusWindow) +; This is Fusion when an HJ dialog is coming into foreground: + return TRUE +endIf +If iSubtype == WT_READONLYEDIT + TypeKey (cksControlHome) + bSayTopLineOfEdit = TRUE +EndIf +SayFocusedObject() +If bSayTopLineOfEdit + SaveCursor () + PcCursor () + SayLine () + RestoreCursor () +elIf iSubtype == WT_TREEVIEW + sayMessage (OT_SCREEN_MESSAGE, FlexibleWebNumberOfActiveRules ()) +EndIf +return true +EndFunction + +int function ExplorerPaneFocusChangedEvent(handle FocusWindow, handle PrevWindow) +;special processing for the common Explorer Pane components which appears in many Windows 7 dialogs +;such as Open and Save As: +var + int nLevel, + int iType, + string sName, + int iNameLength, + string sDesc, + string sPromptAndName, + string sPrompt, + int Left, int Right, int Top, int Bottom, + int ParentLeft, int ParentRight, int ParentTop, int Parentbottom +if GetWindowClass(FocusWindow) != cwc_DirectUIhWND then + return false +EndIf +if GetObjectName(SOURCE_CACHED_DATA,2) != objn_ExplorerPane then + return false +EndIf +;processing is like that done in FocusChangedEventProcessAncestors, but some controls require special handling. +let nLevel = GetFocusChangeDepth() +while (nLevel >= 0) + let sName = getObjectName(SOURCE_CACHED_DATA,nLevel) + let sDesc = GetObjectDescription(SOURCE_CACHED_DATA,nLevel) + ;firtst speak any labels which are not obtained with SayObjectTypeAndText: + if nLevel == 0 then + let iType = GetObjectSubtypeCode(SOURCE_CACHED_DATA,nLevel) + if iType == wt_dialog_Page then + let iNameLength = StringLength(sName) + GetObjectRect(left,right,top,bottom,true,nLevel) + let sPromptAndName = GetTextInRect(left,top,right,bottom) + if iNameLength > 0 + && stringLength(sPromptAndName) > iNameLength + && StringRight(sPromptAndName,iNameLength) == sName then + Say(StringChopRight(sPromptAndName,iNameLength),ot_control_name) + EndIf + elif iType == wt_button + && GetObjectSubtypeCode(SOURCE_CACHED_DATA,nLevel+1) == wt_dialog_page then + GetObjectRect(Left,Right,Top,Bottom,true,nLevel) + GetObjectRect(ParentLeft,ParentRight,ParentTop,ParentBottom,true,nLevel+1) + let sPrompt = GetTextInRect(ParentLeft,Top,Left,Bottom) + if sPrompt then + Say(sPrompt,ot_control_name) + EndIf + EndIf + EndIf + ;now speak the object: + if StringCompare(sName,sDesc) == 0 then + Say(sName,ot_control_name) + elif nLevel == 0 + && iType == wt_dialog_page then + IndicateControltype(wt_button,sName) + else + sayobjectTypeAndText(nLevel) + EndIf + let nLevel= nLevel-1 +EndWhile +return true +EndFunction + +int function FocusChangedEventShouldProcessAncestors(handle FocusWindow, optional handle PrevFocusWindow) +var string functionName = "FocusChangedEventShouldProcessAncestors" +if (ShouldOutputDebugString(LEVEL_HIDEBUG)) + FormattedOutputDebugStringL( + "%1 status: UserBufferIsActive returned %2, InHJDialog returned %3, IsWinFormsWindow returned %4, FocusWindowSupportsUIA returned %5, GetJCFOption(OPT_MSAA_MODE) returned %6, GlobalRibbonState is %7.", + LEVEL_HIDEBUG, functionName, UserBufferIsActive(), InHJDialog(), IsWinFormsWindow(FocusWindow), + FocusWindowSupportsUIA(), GetJCFOption(OPT_MSAA_MODE), GlobalRibbonState) +endif +if (UserBufferIsActive() || InHJDialog()) + FormattedOutputDebugStringL("%1 status: returning false.", LEVEL_HIDEBUG, functionName) + return false +endIf +var int ret = ( + IsWinFormsWindow(FocusWindow) + || FocusWindowSupportsUIA() + || GetJCFOption(OPT_MSAA_MODE) > 2 + || GlobalRibbonState) +FormattedOutputDebugStringL("%1 status: returning %2.", LEVEL_HIDEBUG, functionName, ret) +return ret +EndFunction + +void function ProcessEventOnFocusChangedEvent(handle AppWindow, handle RealWindow, string RealWindowName, + handle FocusWindow, handle PrevWindow) +var int ForceSetupStuffForNewPage +if appWindow != globalPrevApp then + ;we've loaded a new app, and in case no local loadNonJCFOptions gets called, + ;but user has set something in QuickSettings and it is a NonJCF Option: + loadNonJCFOptions () + ; Update JCF with Global settings, purge out all prior personalized settings that were loaded. + ; This is only relevant when switching between two browser windows of the same application, + ; e.g two pages loaded in Internet Explorer or Firefox, loaded as separated windows. + if IsMetroApp () then + ;explicitly do no Personalized Settings code, + ; even though the subsequent app window owner conditions can otherwise come true: + ForceSetupStuffForNewPage = FALSE + else + ForceSetupStuffForNewPage = (StringCompare (GetWindowOwner (AppWindow), GetWindowOwner (GlobalPrevApp)) + == 0) + EndIf + if ForceSetupStuffForNewPage then + SetUpStuffForNewPage (TRUE) + endIf +endIf +let GlobalRibbonState = RibbonsActive() +if FocusChangedEventShouldProcessAncestors(FocusWindow,PrevWindow) + if GetWindowClass (GetFocus()) == cwc_Windows_UI_Core_CoreWindow + || IsWinFormsWindow(AppWindow) + ProcessSayAppWindowOnFocusChange(AppWindow, FocusWindow) + endIf + if IsWinFormsWindow(AppWindow) + ProcessSayRealWindowOnFocusChange(AppWindow,RealWindow,RealWindowName,FocusWindow) + endIf + FocusChangedEventProcessAncestors(FocusWindow, PrevWindow) + return +elif IsJavaWindow(FocusWindow) then + JavaFocusChangedEvent (FocusWindow, PrevWindow) + return +elif ExplorerPaneFocusChangedEvent(FocusWindow,PrevWindow) then + return +EndIf +if GlobalRibbonState != GlobalPrevRibbonState then + SpeakRibbonStatus(true) +EndIf +ProcessZTTetheredViewFocusChange (FocusWindow, RealWindow, RealWindowName) +ProcessSayAppWindowOnFocusChange(AppWindow,FocusWindow) +ProcessSayRealWindowOnFocusChange(AppWindow,RealWindow,RealWindowName,FocusWindow) +ProcessSayFocusWindowOnFocusChange(RealWindowName,FocusWindow) +EndFunction + +int function ReturningFromResearchItDialog () +if ! inHjDialog () +&& getWindowSubtypeCode (getFocus ()) != WT_WINSWITCH +&& (globalPrevRealName == cwn_ResearchIt_Input_dlg +|| getWindowName (globalPrevApp) == cwn_ResearchIt_Input_dlg) then + return TRUE +endIf +endFunction + +Void Function FocusChangedEvent (handle FocusWindow, handle PrevWindow) +var + string functionName = "FocusChangedEvent", + HANDLE FocusedObjectID, + HANDLE AppMainObjectID, + HANDLE TopLevelObjectID, + HANDLE RealObjectID, + handle RealWindow, + string RealWindowName, + string RealWindowClass, + handle AppWindow +let RealWindow = GetRealWindow (FocusWindow) +let RealWindowName = GetWindowName (RealWindow) +RealWindowClass = GetWindowClass(RealWindow) +let AppWindow = GetAppMainWindow (FocusWindow) +let GlobalFocusWindow = FocusWindow +let FocusedObjectID = navGetFocusObjectID () +let AppMainObjectID = navGetAppMainObjectID (FocusedObjectID, FocusWindow) +let TopLevelObjectID = navGetTopLevelObjectID (FocusedObjectID, FocusWindow) +let RealObjectID = navGetRealObjectID (FocusedObjectID, FocusWindow) +FormattedOutputDebugStringL( + "%1 status: RealWindow is 0x%2, RealWindowName is '%3', RealWindowClass is '%4', AppWindow is 0x%5, FocusWindow is 0x%6", + LEVEL_DEBUG, functionName, DecToHex(RealWindow), RealWindowName, RealWindowClass, + DecToHex(AppWindow), DecToHex(FocusWindow)) +;suppress focus change when returning from ResearchIt, where +;the focus returns to the application before the viewer is properly spawned and receives the focus. +if ! ReturningFromResearchItDialog () then +ProcessEventOnFocusChangedEvent(AppWindow, RealWindow, RealWindowName, FocusWindow, PrevWindow) +endIf +;now set all the global variables for next time. +let GlobalPrevRibbonState = GlobalRibbonState +let GlobalPrevReal = RealWindow +let GlobalPrevRealName = RealWindowName +let GlobalPrevApp = AppWindow +let GlobalPrevFocus = FocusWindow +Let GlobalWasHjDialog = InHjDialog () +if ( ( False == GlobalWasHjDialog ) && ( IsMacToolTipWindow (RealWindow) ) ) +then + Let GlobalWasHjDialog = True +EndIf +GlobalPrevDialogIdentifier = GetDialogIdentifier() +let g_PrevAppMainObjectID = AppMainObjectID +let g_PrevTopLevelObjectID = TopLevelObjectID +let g_PrevRealObjectID = RealObjectID +let g_PrevFocusedObjectID = FocusedObjectID +EndFunction + +int function IgnoreObjectAtLevel (int level) +; by default, handles only panes where no name is present. +; overwrite locally if all of a particular ancestor or type should just not speak, does not apply to focus / level 0 objects. +if getObjectRole (level) == ROLE_SYSTEM_PANE +&& stringIsBlank (getObjectName(0, level)) then + return TRUE +endIf +; remove redundant name speaking. +; example is where a static control is the parent of an element such as a link, and the two name strings are an exact match. +var int subtypeCodeAtLevel = getObjectSubtypeCode(FALSE, level) +if level > 0 +&& subtypeCodeAtLevel == WT_STATIC +&& subtypeCodeAtLevel != getObjectSubtypeCode () +&& stringCompare (getObjectName(FALSE, level), getObjectName (), TRUE) == 0 then +; This is by nature redundant, +; stringCompare ensure s we're getting an exact case-sensitive match: + return TRUE +endIf +return FALSE +endFunction + +int function SetDepthForFocusChangedEventProcessAncestors(handle FocusWindow, handle PrevWindow) +;App-specific scripts may wish to limit the depth of ancestors processed by FocusChangedEventProcessAncestors +return GetFocusChangeDepth() +EndFunction + +String Function GetHeaderToSpeakForSayColumnAndRowHeaders(String columnHeader, String rowHeader) +var string headerToSpeak = cscNull +headerToSpeak = columnHeader +if (!StringIsBlank(rowHeader)) + if (!StringIsBlank(headerToSpeak)) + headerToSpeak = headerToSpeak + cScSpace + endIf + headerToSpeak = headerToSpeak + rowHeader +endIf +return headerToSpeak +EndFunction + +/* This function is called from FocusChangedEventProcessAncestors and from ActiveItemChangedEvent. It speaks +the column header or row header if it is appropriate to do so. The decision is based on the object type and the +value of the globalSpeakHeaderOnCellChange variable. */ +Void Function SpeakTableHeaderOnCellChangeHelper(int type, int isActiveItemChanged) +var string functionName = "SpeakTableHeaderOnCellChangeHelper" +var int earlyReturnNum = 0 +FSLog("%1 called: type is %2; isActiveItemChanged is %3; globalSpeakHeaderOnCellChange is %4.", + functionName, type, isActiveItemChanged, globalSpeakHeaderOnCellChange) +if (isActiveItemChanged) + if (type != WT_TABLECELL && type != WT_COLUMNHEADER && type != WT_ROWHEADER) + earlyReturnNum = earlyReturnNum + 1 + FSLog("%1 status: early return %2.", functionName, earlyReturnNum) + return + EndIf +else + if (type != WT_TABLECELL) + earlyReturnNum = earlyReturnNum + 1 + FSLog("%1 status: early return %2.", functionName, earlyReturnNum) + return + EndIf +EndIf +var + string columnHeader = GetColumnHeader(TRUE), + string rowHeader = GetRowHeader(TRUE), + string headerToSpeak = cscNull +if (globalSpeakHeaderOnCellChange == TABLE_NAV_HORIZONTAL) + headerToSpeak = columnHeader +elif (globalSpeakHeaderOnCellChange == TABLE_NAV_VERTICAL) + headerToSpeak = rowHeader +elif (globalSpeakHeaderOnCellChange == TABLE_NAV_SAY_COLUMN_AND_ROW_HEADERS) + headerToSpeak = GetHeaderToSpeakForSayColumnAndRowHeaders(columnHeader, rowHeader) +else + earlyReturnNum = earlyReturnNum + 1 + FSLog("%1 status: early return %2.", functionName, earlyReturnNum) + return +EndIf +FSLog("%1 status: headerToSpeak is '%2'.", functionName, headerToSpeak) +Say(headerToSpeak, OT_SCREEN_MESSAGE) +EndFunction + +Void Function SpeakTableColumnAndRowHelper(int type) +var string functionName = "SpeakTableColumnAndRowHelper" +var int earlyReturnNum = 0 +FSLog("%1 called: type is %2.", functionName, type) +if (type != WT_TABLECELL) + earlyReturnNum = earlyReturnNum + 1 + FSLog("%1 status: early return %2.", functionName, earlyReturnNum) + return +EndIf +var + int column = 0, + int row = 0, + int cellCoordinatesAreValid = False +cellCoordinatesAreValid = GetTableCoordinatesForSpeakTableCells(column, row, TABLE_NAV_NONE) +FSLog("%1 status: cellCoordinatesAreValid is %2.", functionName, cellCoordinatesAreValid) +if (cellCoordinatesAreValid) + FSLog("%1 status: column is %2; row is %3.", functionName, column, row) + SayUsingVoice(VCTX_message, FormatString(cMSGColumnAndRow, IntToString(row), IntToString(column)), ot_position) +endIf +EndFunction + +Void Function FocusChangedEventProcessAncestors(handle FocusWindow, handle PrevWindow) +var string functionName = "FocusChangedEventProcessAncestors" +var int earlyReturnNum = 0 +var + int nLevel = SetDepthForFocusChangedEventProcessAncestors(FocusWindow, PrevWindow), + int iType = 0 +FSLog("%1 called: FocusWindow is 0x%2; PrevWindow is 0x%3; nLevel is %4.", + functionName, DecToHex(FocusWindow), DecToHex(PrevWindow), nLevel) +while (nLevel >= 0) + iType = GetObjectSubtypecode(SOURCE_CACHED_DATA, nLevel) + if (nLevel > 0) + if (!IgnoreObjectAtLevel(nLevel)) + if (nLevel == 1) + SpeakTableHeaderOnCellChangeHelper(iType, false) + EndIf + sayObjectTypeAndText(nLevel) + SpeakTableColumnAndRowHelper(iType) + if nLevel == 1 + && iType == WT_LISTBOXITEM + && GetObjectName(false, 3) == cwn_ShellFolderView + ;break out of loop early to prevent extra speaking when navigating up or down a column + nLevel = earlyReturnNum + endIf + endIf + else ;at level 0: + SpeakTableHeaderOnCellChangeHelper(iType, false) + if ( + iType == wt_groupbox + && GetObjectSubTypeCode(SOURCE_CACHED_DATA, nLevel + 1) == wt_listview + ) + SayControlEx(0, GetObjectName(SOURCE_CACHED_DATA), cmsgGrouping); + else + sayObjectTypeAndText(nLevel) + if iType==WT_MULTILINE_EDIT&& stringLength(getObjectValue(2,0)) >= 1 && + !IsEmptyEditFormField () + SayUsingVoice(vctx_message,msgContainsText,ot_line) + endIf + endIf + SpeakTableColumnAndRowHelper(iType) + EndIf + nLevel = nLevel - 1 +EndWhile +EndFunction + +int function SilenceNonFocusedSeekBarsForMagic(handle hWnd, int nObjType) +if GetRunningFSProducts() != product_MAGic then + ;only silence seek bars if MAGic is the only running product + return false +endIf +;Check for seek bars in media apps not in focus +If hwnd == GetFocus() then + return false +EndIf +return nObjType == WT_UPDOWNSLIDER + || nObjType == WT_LEFTRIGHTSLIDER + || nObjType == WT_SLIDER +endFunction + +void function AutoCompleteWindowShowEvent(handle hwnd) +ghWndAutoCompleteSuggestionList = FindWindow(hWnd,cWcListView) +EndFunction + +void function AutoCompleteWindowHideEvent(handle hwnd) +; Do not null ghWndAutoCompleteSuggestionList here, that is done in WindowDestroyedEvent. +EndFunction + +int function AutoCompleteSuggestionListIsVisible() +return ghWndAutoCompleteSuggestionList + && IsWindowVisible(ghWndAutoCompleteSuggestionList) +EndFunction + +int function AutoCompleteSuggestionListHasDeselectedItem() +return AutoCompleteSuggestionListIsVisible() + && lvGetItemState(ghWndAutoCompleteSuggestionList,lvGetFocusItem(ghWndAutoCompleteSuggestionList)) == 0 +endFunction + +void function AutoCompleteWindowItemSelectedEvent(handle hwnd) +Say(lvGetItemText(ghWndAutoCompleteSuggestionList,lvGetFocusItem(ghWndAutoCompleteSuggestionList),1),ot_line) +EndFunction + +Void Function ActiveItemChangedEvent (handle curHwnd, int curObjectId, int curChildId, + handle prevHwnd, int prevObjectId, int prevChildId) +var + int iWinType, + int iObjType, + int iObjState +if nSelectingText then + return +EndIf +SaveCursor () +PCCursor () +Let iObjType = GetObjectSubtypeCode () +iObjState = GetObjectStateCode() +if IsJavaWindow (curHwnd) then + if g_JavaIgnoreNextActiveItemChange then + let g_JavaIgnoreNextActiveItemChange = 0 + RestoreCursor () + return + EndIf + if WT_TABLE == iObjType + || WT_TABLECELL == iObjType then + if !InTable() then + let g_JavaPrevNumOfCells = 0 + let g_JavaTableNavDir = TABLE_NAV_NONE + else + SpeakTableCells (g_JavaTableNavDir, g_JavaPrevNumOfCells) + let g_JavaPrevNumOfCells = 0 + let g_JavaTableNavDir = TABLE_NAV_NONE + RestoreCursor () + return + endif + endIf +endIf +if SilenceNonFocusedSeekBarsForMagic(curHWnd, iObjType) then + Return +endIf +if iObjType == wt_ListBoxItem +&& FocusWindowSupportsUIA() then + say(GetObjectName(),ot_line) +if (iObjState & ctrl_checked) + IndicateControlState(wt_checkbox, ctrl_checked) + elif (iObjState & ctrl_unchecked) + IndicateControlState(wt_checkbox, ctrl_unchecked) + endif + if ShouldItemSpeak(OT_ANNOUNCE_POSITION_AND_COUNT) then + SayMessage(OT_POSITION, PositionInGroup()) + endIf + return +elif (WT_TREEVIEW == iObjType +|| WT_TREEVIEWITEM == iObjType +|| GetWindowClass(curHwnd) == cwc_SysTreeview32) +&& !MenusActive() then + SayTreeViewLevel (true) + RestoreCursor () + return +elif iObjType == WT_TABLECELL +|| iObjType == WT_COLUMNHEADER +|| iObjType == WT_ROWHEADER then + SpeakTableHeaderOnCellChangeHelper(iObjType, true) + ;Winforms windows contain their own row / column header data. + ;Example are stand-alone databases copiled as exe. + if IsWinFormsWindow (curHwnd) + && StringIsBlank (GetRowHeader (TRUE) ) + && StringIsBlank (GetColumnHeader (TRUE)) then + sayObjectActiveItem () + SpeakTableColumnAndRowHelper(iObjType) + else + sayCell() + endIf + RestoreCursor () + return +endIf +let iWinType = getWindowSubtypeCode (curHwnd) +if iWinType != WT_TASKBAR && iWinType != WT_SYSTRAY +&& (iObjType == wt_button +|| iObjType == wt_CheckBox +|| iObjType == wt_RadioButton) then + if iWinType == WT_LISTVIEW || iWinType == WT_LISTBOX + || getWindowClass (CurHwnd) == cwc_ListBox then + ; checkable lists , read just the changing item and not the name and type of the list while navigating in it. + SayObjectActiveItem (ShouldItemSpeak (OT_ANNOUNCE_POSITION_AND_COUNT)) + else + SayObjectTypeAndText() + endIf +else + ; removed code from this spot for special handling of list view items + ; in favor of the internal handling using SayObjectActiveItem() + ;special case for SWT_Window0 (probably should apply to all cases but for safety) + if StringCompare (GetWindowClass (GetTopLevelWindow (curHwnd)),"SWT_Window0",false) == 0 + && curHwnd != prevHwnd then + SayObjectTypeAndText (0) + else + SayObjectActiveItemWithDescription(ShouldItemSpeak (OT_ANNOUNCE_POSITION_AND_COUNT)) ; for lists when navigating + ProcessZTTetheredViewItemChange (curHwnd) + EndIf +EndIf +RestoreCursor () +EndFunction + +String Function GetObjectPositionString(handle hwnd, int nObjType) +if (nObjType == WT_COMBOBOX) + var int currentItem = GetCurrentItem(hwnd) + var int itemCount = GetItemCount(hwnd) + if (itemCount <= 0) + ; The GetItemCount function returns -1 when it is not able to get the item count + ; (the window is not a list view, combo box, edit combo box, or tool bar). In addition, + ; the GetItemCount function returns 0 for an empty list view, combo box, edit combo box, + ; or tool bar. If the item count cannot be obtained or the control is empty, JAWS + ; should not attempt to speak the position string. Thus return an empty string here. + return cscNull + endIf + return (FormatString(cmsgPosInGroup1, IntToString(currentItem), IntToString(itemCount))) +endIf +return cscNull +EndFunction + +Void Function ValueChangedEvent (handle hwnd, int objId, int childId, int nObjType, string sObjName, string sObjValue,optional int bIsFocusObject) +if IsJavaWindow (hwnd) then + if (WT_UNKNOWN == nObjType) + || (WT_LEFTRIGHTSLIDER == nObjType) + || (WT_PROGRESSBAR == nObjType) + || (WT_SLIDER == nObjType) + || (WT_STATIC == nObjType) + || (WT_UPDOWNSLIDER == nObjType) then + Say(sObjValue,ot_line) + elif WT_EDIT_SPINBOX == nObjType + || WT_SPINBOX == nObjType + ;Do Nothing. Otherwise the value will be spoken twice, once by SayLineUnit and + ;once in response to the Value Changed Event. + else + Say(GetObjectValue(),ot_line) + endIf +endIf +if SilenceNonFocusedSeekBarsForMagic(hWnd, nObjType) then + Return +endIf +if bIsFocusObject + if nObjType == WT_COMBOBOX + Say(sObjValue, ot_line, smartMarkupDetection) + var string sObjPosition = GetObjectPositionString(hWnd, nObjType) + if (!StringIsBlank(sObjPosition)) + Say(sObjPosition, OT_POSITION, smartMarkupDetection) + endIf + return + elif (nObjType == wt_edit || nObjType == wt_editCombo) + && GetObjectSubtypeCode(SOURCE_CACHED_DATA) == wt_editCombo + if !AutoCompleteSuggestionListIsVisible() + && GetWindowClass(GetFocus()) != cwc_ChromeWindowClass + Say(sObjValue, ot_line, smartMarkupDetection) + var int parentObjType=GetObjectSubTypeCode (SOURCE_DEFAULT, 1) + if nObjType==WT_EDIT && parentObjType==WT_COMBOBOX then + sObjPosition = GetObjectPositionString(hWnd, parentObjType) + if (!StringIsBlank(sObjPosition)) + Say(sObjPosition, OT_POSITION, smartMarkupDetection) + endIf + endIf + return + endIf + elif nObjType==WT_SLIDER ; this is a slider with either role of slider or that supports UIA + if (!ShouldSayFunctionsSpeakSlider (nObjType) || FocusWindowSupportsUIA()) + ; sliders whose text actually contains the associated view name selected. + if onViewSliderControl (getObjectSubtypeCode ()) then + ; custom views sliders where when you change, the new value is expressed in a name such as tiles, etc.: + Say(getObjectValue(SOURCE_CACHED_DATA), ot_line, smartMarkupDetection) + else + Say(sObjValue, ot_line, smartMarkupDetection) + endIf + return + endIf + elif (nObjType == wt_DateTime) + Say(sObjValue, ot_line, smartMarkupDetection) + EndIf +else ;!bIsFocusObject + if nObjType == wt_comboBox + && GetWindowClass(hWnd) == cwc_NetUIHwnd + && GetWindowClass(GetFocus()) == cwc_Richedit50W + ;Make sure focus is not in the document area: + var int nFocusObjType = GetObjectSubtypeCode(SOURCE_CACHED_DATA) + if nFocusObjType == wt_edit + || nFocusObjType == wt_editCombo + ;Do not use sObjValue, if the line is empty due to editing + ;the sObjValue contains unwanted extraneous text: + Say(GetLine(),ot_line) + endIf + endIf +endIf +EndFunction + +Void Function NameChangedEvent (handle hwnd, int objId, int childId, int nObjType, + string sOldName, string sNewName) +if !GetParent (hwnd) +&& "SunAwtFrame" == GetWindowClass (hwnd) +&& IsJavaWindow (hwnd) +&& "IEXPLORE.EXE" == GetAppFileName () then + ;This is most likely an Oracle Forms applet + var + int navObjectType, + handle navFocusObjectId, + int navFocusObjectType + let navObjectType = navGetObjectTypeCode (objId, hwnd) + let navFocusObjectId = navGetFocusObjectID () + let navFocusObjectType = navGetObjectTypeCode (navFocusObjectId, hwnd) + if ( objId != navFocusObjectId ) then + if ( WT_EDIT == navObjectType ) then + return + elif WT_STATIC == navObjectType + && WT_RADIOBUTTON == navFocusObjectType then + return + endIf + endIf +endIf +if SilenceNonFocusedSeekBarsForMagic(hWnd, nObjType) then + Return +endIf +Say (sNewName, OT_WINDOW_INFORMATION) +EndFunction + +void Function GetDescriptionForRibbons () +;We don't use the cached description here because that description is technically the wrong one. +;The event sets a timer before calling this. +var string sHelp = GetObjectDescription(SOURCE_CACHED_DATA) +unscheduleFunction (giFN_Helper) +Say (sHelp, OT_WINDOW_INFORMATION) +endFunction + +Void Function DescriptionChangedEvent (handle hwnd, int objId, int childId, int nObjType, string sOldDescription, string + sNewDescription,optional int bFromFocusObject) +if hwnd != GetFocus() then + if bFromFocusObject + && IsJavaWindow(hwnd) then + ;Do nothing. Description changed events must be processed for Java windows even if + ;the window handle for the event is not the same as the focused window handle if the + ;bFromFocusObject parameter is true. + ;This can happen if the window for the event is the ancestor of the focus window. + else + return + EndIf +EndIf +if IsVirtualRibbonActive() then + ;eliminate spew of description when navigating virtual ribbons into a new submenu: + return +EndIf +unscheduleFunction (giFN_Helper) +if !GetParent (hwnd) +&& "SunAwtFrame" == GetWindowClass (hwnd) +&& IsJavaWindow (hwnd) +&& "IEXPLORE.EXE" == GetAppFileName () then + ;This is most likely an Oracle Forms applet + var + int navObjectType, + handle navFocusObjectId, + int navFocusObjectType + let navObjectType = navGetObjectTypeCode (objId, hwnd) + let navFocusObjectId = navGetFocusObjectID () + let navFocusObjectType = navGetObjectTypeCode (navFocusObjectId, hwnd) + if ( objId != navFocusObjectId ) then + if ( WT_EDIT == navObjectType ) then + return + elif WT_STATIC == navObjectType + && WT_RADIOBUTTON == navFocusObjectType then + return + endIf + endIf +endIf +if !bFromFocusObject then + return +EndIf +if GlobalRibbonState +|| menusActive () +|| globalMenuMode == 2 then + ;The following delay is critical, because the drop down menu in this instance must be drawn. When this event is first pushed to us, the first menu drop down item still shows as a page tab. + ;delay (1) + var int iSubtype = getObjectSubtypeCode(SOURCE_CACHED_DATA) + if (iSubtype == WT_MENU + ;or still shows as a ribbon tab but the menu is preparing to drop down: + || iSubtype == WT_TABCONTROL) then + let giFN_Helper = scheduleFunction ("GetDescriptionForRibbons", 2) + Return + endIf +endIf +Say (sNewDescription, OT_WINDOW_INFORMATION) +EndFunction + +void function AnnounceDocumentElements() +var + int nFrames, + string sFrames, + int nRegions, + string sRegions, + int nHeadings, + string sHeadings, + int nLinks, + string sLinks, + string sInfo, + string sMessage, + int iSpeakMode, + int glanceHighlightCount, + string SmartGlanceMsg + +AnnounceVisperoConnectedLinkForPageLoad () +if ! GlobalAnnouncePageElementsOnLoad then return endIf +let nFrames = GetHTMLFrameCount() +if GetRunningFSProducts() & product_JAWS then + let nRegions = GetRegionCount(WT_LandmarkRegion) +endIf +Let nHeadings = GetHeadingCount (0) +let nLinks = GetLinkCount() +;The following section provides the messages to be formatted into the string for each element type: +;Frames, landmarks, applications, headings and links. +If nFrames == 0 then + Let sFrames = cScNull +ElIf nFrames == 1 then + let sFrames = IntToString (nFrames) + cMsgFrame +Else + let sFrames = IntToString (nFrames) + cMsgFrames +EndIf +If nRegions == 0 then + Let sRegions = cScNull +ElIf nRegions == 1 then + let sRegions = IntToString (nRegions) + cMsgRegion +Else + let sRegions = IntToString (nRegions) + cMsgRegions +EndIf +If nHeadings == 0 then + Let sHeadings = cScNull +ElIf nHeadings == 1 then + Let sHeadings = IntToString (nHeadings)+cMsgHeading +Else + Let sHeadings = IntToString (nHeadings)+cMsgHeadings +EndIf +If nLinks == 0 then + ;Use specific no link message. + Let sLinks = cMsgNoLinks +ElIf nLinks == 1 then + Let sLinks = IntToString (nLinks)+cMsgLink +Else + Let sLinks = IntToString (nLinks)+cMsgLinks +EndIf +let sInfo = FormatOneTwoAndThree( sFrames, sRegions, sHeadings, sLinks ) +let iSpeakMode = ShouldItemSpeak(OT_SCREEN_MESSAGE) +if iSpeakMode == message_long then + Let sMessage = FormatString (cmsgDocumentLoaded3_L, sInfo ) +else + Let sMessage = FormatString (cmsgDocumentLoaded3_S, sInfo ) +EndIf + +if GETJcfOption(optSmartGlanceHighlightIndication) & 1 then + let glanceHighlightCount=GetCountOfGlanceHighlights() + if glanceHighlightCount > 0 then + if iSpeakMode == message_long then + let SmartGlanceMsg=formatString(cmsgSmartGlanceHighlightIndicate_L, IntToString(glanceHighlightCount)) + else + let SmartGlanceMsg=formatString(cmsgSmartGlanceHighlightIndicate_S, intToString(glanceHighlightCount)) + endIf + let sMessage = sMessage +cScBufferNewLine + let sMessage=sMessage+SmartGlanceMsg + endIf +endIf + + +SayUsingVoice(vctx_message,sMessage,OT_SCREEN_MESSAGE) +EndFunction + +string function SelectStringUsingBit( int bit, string p1, string p2, string p3, string p4, + string p5, string p6, string p7, string p8 ) +var + string s +if bit == 0 then + return cscNull +EndIf +if bit & 0x01 then + let s = p1 +ElIf bit & 0x02 then + let s = p2 +ElIf bit & 0x04 then + let s = p3 +ElIf bit & 0x08 then + let s = p4 +ElIf bit & 0x10 then + let s = p5 +ElIf bit & 0x20 then + let s = p6 +ElIf bit & 0x40 then + let s = p7 +ElIf bit & 0x80 then + let s = p8 +EndIf +return s +EndFunction + +string function FormatOneTwoAndThree( string p1,optional string p2, string p3, string p4, + string p5, string p6, string p7, string p8 ) +var + int validStrings, + int count, + int flags, + string s1, + string s2, + string s3, + string s4, + string s5, + string s6, + string s7, + string s8, + string text +; first count the number of valid strings passed in +if p1 then + let flags = flags | 0x01 + let validStrings = validStrings + 1 +EndIf +if p2 then + let flags = flags | 0x02 + let validStrings = validStrings + 1 +EndIf +if p3 then + let flags = flags | 0x04 + let validStrings = validStrings + 1 +EndIf +if p4 then + let flags = flags | 0x08 + let validStrings = validStrings + 1 +EndIf +if p5 then + let flags = flags | 0x10 + let validStrings = validStrings + 1 +EndIf +if p6 then + let flags = flags | 0x20 + let validStrings = validStrings + 1 +EndIf +if p7 then + let flags = flags | 0x40 + let validStrings = validStrings + 1 +EndIf +if p8 then + let flags = flags | 0x80 + let validStrings = validStrings + 1 +EndIf +if validStrings < 1 +|| !flags then + return cscNull +EndIf +var + int i, + int found, + string temp +let i = 1 +let count = 1 +while count <= 8 + if flags & i then + let found = found + 1; + let temp = SelectStringUsingBit( i, p1, p2, p3, p4, p5, p6, p7, p8 ); + if found == 1 then let s1 = temp EndIf + if found == 2 then let s2 = temp EndIf + if found == 3 then let s3 = temp EndIf + if found == 4 then let s4 = temp EndIf + if found == 5 then let s5 = temp EndIf + if found == 6 then let s6 = temp EndIf + if found == 7 then let s7 = temp EndIf + if found == 8 then let s8 = temp EndIf + let temp = cscNull + EndIf + let count = count + 1 + let i = i * 2 +EndWhile +if validStrings == 1 then + let text = FormatString( cmsgFormatList1, s1 ); +ElIf validStrings == 2 then + let text = FormatString( cmsgFormatList2, s1, s2 ); +ElIf validStrings == 3 then + let text = FormatString( cmsgFormatList3, s1, s2, s3 ); +ElIf validStrings == 4 then + let text = FormatString( cmsgFormatList4, s1, s2, s3, s4 ); +ElIf validStrings == 5 then + let text = FormatString( cmsgFormatList5, s1, s2, s3, s4, s5 ); +ElIf validStrings == 6 then + let text = FormatString( cmsgFormatList6, s1, s2, s3, s4, s5, s6 ); +ElIf validStrings == 7 then + let text = FormatString( cmsgFormatList7, s1, s2, s3, s4, s5, s6, s7 ); +ElIf validStrings == 8 then + let text = FormatString( cmsgFormatList8, s1, s2, s3, s4, s5, s6, s7, s8 ); +EndIf +return text +EndFunction + +void function ClearCustomPageSummarySuppressor() +let giCustomPageSummarySuppressor = 0 +EndFunction + +int function ShouldCheckForCustomPageSummary() +return !giCustomPageSummarySuppressor +EndFunction + +int function CustomPageSummaryReported() +var + int nPlaceMarkerCount, + int nPriorFormsModeState, + int iCustomPageSummaryOption +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +;Since either or both DocumentLoadedEvent and DocumentUpdate may fire, +;we attempt to keep the custom summary from being reported more than once: +let iCustomPageSummaryOption = GetJCFOption(OPT_CUSTOM_PAGE_SUMMARY) +let giCustomPageSummarySuppressor = ScheduleFunction("ClearCustomPageSummarySuppressor",30) +; Forms mode must be off to get the placemarker count +let nPriorFormsModeState = IsFormsModeActive() +if IsFormsModeActive() then + TurnOffFormsMode(FormsModeEventSpeechSilent) +endIf +let nPlaceMarkerCount=GetPlaceMarkerCount () +if nPriorFormsModeState then + TurnOnFormsMode(FormsModeEventSpeechSilent) +endIf +if nPlaceMarkerCount then + if iCustomPageSummaryOption == CPSSpeak then + SpeakCustomPageSummary() + return true + elif iCustomPageSummaryOption == CPSVirtualize then + VirtualizeCustomPageSummary() + return true + endIf +endIf +return false +EndFunction + +int function DocumentLoadedAtFormField() +var + int iSubtype +let iSubtype = GetObjectTypeCode() +if iSubtype == WT_EDIT +|| iSubtype == wt_Multiline_Edit +|| iSubtype == wt_PassWordEdit +|| iSubtype == wt_EditCombo +|| iSubtype == wt_ComboBox +|| iSubtype == wt_ListBox +|| iSubtype == wt_MultiSelect_ListBox +|| iSubtype == wt_ExtendedSelect_ListBox then + if GetRunningFSProducts() != product_MAGic then + ;Speak appropriate tutor message: + ;but only if we haven't spoken the message within 2000 ticks + if GetTickCount()-giLastDocumentLoadTime > 2000 + && giLastFormsModeState != IsFormsModeActive() then + If IsVirtualPcCursor () then + SayUsingVoice(VCTX_MESSAGE, cMsgPressEnterForFormsMode, OT_SMART_HELP) + ElIf IsFormsModeActive() then + SayUsingVoice(VCTX_MESSAGE, cMsgFormsMode, OT_SMART_HELP) + EndIf + let giLastFormsModeState=IsFormsModeActive() + endIf + endIf + let giLastDocumentLoadTime=GetTickCount() + Return true +ElIf iSubtype == wt_Button +|| iSubtype == wt_CheckBox +|| iSubtype == wt_RadioButton then + if GetRunningFSProducts() != product_MAGic then + ;Speak appropriate tutor message: + ;but only if we haven't spoken the message within 2000 ticks + if GetTickCount()-giLastDocumentLoadTime > 2000 + && giLastFormsModeState != IsFormsModeActive() then + If IsFormsModeActive() then + SayUsingVoice(VCTX_MESSAGE, cMsgFormsMode, OT_SMART_HELP) + EndIf + let giLastFormsModeState=IsFormsModeActive() + endIf + EndIf + let giLastDocumentLoadTime=GetTickCount() + Return true +EndIf +return false +EndFunction + +int function ProcessDocumentLoadAppAlerts() +;Overwrite this function in applications where special alerts are processed during DocumentLoadedEvent. +;Return true if an alert is displayed in the user buffer, +;false if no alerts are displayed in the user buffer or if no alerts are processed. +;DocumentLoadedEvent will use the return value to determine +;if the following default actions should be processed immediately or postponed until the user buffer is dismissed. +return false +EndFunction + +int function IsBrowserClassWindowOrDocument() +var string sClass = GetWindowClass(GetFocus()) +return sClass == cwcChromeBrowserClass + || sClass==cwcIEServer + || sClass==cwcFireFoxBrowserClass + || sClass == cwcFireFox4BrowserClass + || (sClass==cwcAdobeDocClass && GetWindowName(GetCurrentWindow ()) ==wnAdobeDocName) + || sClass == cwcFoxitDocClass +EndFunction + +int function ShouldSayAllOnDocumentLoad() +if !IsBrowserClassWindowOrDocument() return false endIf +; Ensure dialogs in the virtual buffer read using sayAll +if IsVirtualPCCursor() +&& dialogActive () +&& !(GetRunningFSProducts() & product_Fusion) + return true +endIf +return gbDefaultSayAllOnDocumentLoad +EndFunction + +void function DoDefaultDocumentLoadActions() +if ShouldCheckForCustomPageSummary() +&& GetJCFOption(OPT_CUSTOM_PAGE_SUMMARY) then + CustomPageSummaryReported() + return +EndIf +if DocumentLoadedAtFormField() then + return +EndIf +let giLastDocumentLoadTime=GetTickCount() +if IsBrowserClassWindowOrDocument() + PCCursor() + if IsVirtualPCCursor() + && !SayAllInProgress() then + if !(GetRunningFSProducts() & product_Fusion) + AnnounceDocumentElements() + endIf + if ShouldSayAllOnDocumentLoad() + QueueFunction( "SayAll()" ) + EndIf + endIf +endIf +EndFunction + +Void Function DocumentLoadedEvent () +if IsBackgroundOCREnabled() +&& c_BackgroundOCRRect.restrictedToCustomRect + PerformScript StopBackgroundRecognition() +endIf +Delay (5);Wait to check focus. +priorTopLineOfNewContent=cscNull +if GetJCFOption(OPT_AUTO_FORMS_MODE) == 0 +&& GetJCFOption(optFormsModeAutoOff) == 1 then + TurnOffFormsMode() +EndIf +if BackForward == 1 then + SayLine() + let BackForward=0 + return +endIf +let gbDocumentLoadAppAlertShowing = ProcessDocumentLoadAppAlerts() +if !gbDocumentLoadAppAlertShowing then + DoDefaultDocumentLoadActions() + ;otherwise DoDefaultDocumentLoadActions is called when the user buffer is dismissed +EndIf +EndFunction + +void function TurnOffFormsMode(optional int bFormsModeEventSpeechSilent) +let GiIgnoreFormsModeSpeak = bFormsModeEventSpeechSilent +TurnOffFormsMode() +EndFunction + +void function TurnOnFormsMode(optional int bFormsModeEventSpeechSilent) +let GiIgnoreFormsModeSpeak = bFormsModeEventSpeechSilent +TurnOnFormsMode() +EndFunction + +void function FormsModeEvent(int bEntering, optional int lastMovementUnit) +var int SpeakFormsModeSetting, int FSProducts = getRunningFSProducts (); +;First get relevant data for SpeakFormsModeSetting, since the JCF setting doesn't actually work with both products working together: +if ! (FSProducts & PRODUCT_MAGic) then + SpeakFormsModeSetting = GetJcfOption(OPT_SPEAK_FORMS_MODE_CHANGES) +else + if stringIsBlank (iniReadString ("FormsMode", "SpeakFormsModeChanges", "", GetActiveConfiguration()+".jcf")) + SpeakFormsModeSetting = iniReadInteger ("FormsMode", "SpeakFormsModeChanges", 0, "Default.jcf") + else + SpeakFormsModeSetting = iniReadInteger ("FormsMode", "SpeakFormsModeChanges", 0, GetActiveConfiguration()+".jcf") + endIf +endIf +if GiIgnoreFormsModeSpeak == FormsModeEventSpeechSilent +|| GetJCFOption(OPT_USE_SOUNDS_TO_INDICATE_FORMSMODE) == true +|| SpeakFormsModeSetting == false then + Let GiIgnoreFormsModeSpeak = FormsModeEventSpeechNormal + if (bEntering) then + BrailleRefresh () + endIf + Return +EndIf +;wrap the speech in condition to determine if only JAWS, +;MAGic is not to speak this. +if FSProducts & product_JAWS then + if (bEntering) then + SayFormattedMessage (OT_status, cmsg286_L) + BrailleRefresh () + if StringCompare(StringSegment(GetDocumentPath(),cscColon,1),cscHttps) == 0 then + SayUsingVoice(vctx_message,cmsgSecureConnection,OT_help) + EndIf + else + SayFormattedMessage (OT_status, cmsg287_L) + endIf +endIf +EndFunction + +void function TextSelectedEvent(string strText, int bUnSelecting, optional int bContainsSpeechMarkup) +var + int iStringLength, + string strChopped, + string strNoMarkup, + int noMarkupLen +if gbSelectingTextBetweenMarkedPlaceAndCurrentPosition then + ;the script will announce that text was selected between marked place and current position, + ;so do not speak the selected text: + return +endIf +if (bContainsSpeechMarkup) then + let strNoMarkup=smmStripMarkup(strText) +else + let strNoMarkup=strText +endIf +let noMarkupLen=stringLength(strNoMarkup) +;First, check to see if we've selected a huge amount of text. +;Without this test, it is possible to overrun speech. +if bUnSelecting then + If noMarkupLen >= 1000 + && !(GetRunningFSProducts() == product_MAGic) then + SayFormattedMessage (OT_SELECT,cmsg214_L) + SayMessage (OT_NO_DISABLE, FormatString (cmsg380, IntToString ((noMarkupLen-20)))) + let strChopped=StringChopRight (strNoMarkup, (noMarkupLen-20)) + SayMessage (OT_WORD, strChopped) + else + SayTextSelection(cmsg214_L,strText, + noMarkupLen==1,bContainsSpeechMarkup) + EndIf +else + If noMarkupLen >= 1000 + && !(GetRunningFSProducts() == product_MAGic) then + SayFormattedMessage (OT_SELECT,cmsg215_L) + SayMessage (OT_NO_DISABLE, FormatString (cmsg380, IntToString ((noMarkupLen-20)))) + let strChopped=StringChopLeft(strNoMarkup, (noMarkupLen-20)) + SayMessage (OT_WORD, strChopped) + Return; + else + SayTextSelection(cmsg215_L,strText, + noMarkupLen==1,bContainsSpeechMarkup) + EndIf +endIf +EndFunction + +Void Function ClipboardChangedEvent () +if ClipboardTextChanged == CLIPBOARD_APPENDED then + SayMessage(OT_JAWS_MESSAGE, cmsgAppendedTextToClipboard_L, cmsgAppendedTextToClipboard_S) +ElIf ClipboardTextChanged == CLIPBOARD_COPIED then + SayMessage(OT_JAWS_MESSAGE, cmsg52_L, cmsg52_S) +ElIf ClipboardTextChanged == CLIPBOARD_CUT then + SayMessage(OT_JAWS_MESSAGE, cmsg51_L, cmsg51_S) +endIf +let ClipBoardTextChanged = false +EndFunction + +Void Function SayFocusedWindow () +SayFocusedObject () +EndFunction + +int function onViewSliderControl (int subtypeCode) +if (subtypeCode != WT_LEFTRIGHTSLIDER&& subtypeCode != WT_UPDOWNSLIDER) +|| getObjectClassName (1) != "ViewControlClass" then + ; not in custom slider where views are specified: + return FALSE +endIf +return TRUE +endFunction + +int function sayFocusedObjectViewSliders () +if ! isPcCursor () || inHjDialog () || UserBufferIsActive () return FALSE endIf +var int subtypeCode = getObjectSubtypeCode () +if ! onViewSliderControl (subtypeCode) then return FALSE endIf +indicateControlType (subtypeCode, getObjectName (), getObjectValue(SOURCE_CACHED_DATA)) +return TRUE +endFunction + +string function GetLongestOfObjectNameOrValue() +var + string name = GetObjectName(), + int nameLen = StringLength(name), + string value = GetObjectValue(), + int valueLen = StringLength(value) +if (nameLen > valueLen) + return name +elif (valueLen > nameLen) + return value +endIf +;; If they are the same length return name. +return name +EndFunction + +string function SmartGetTreeViewObjectValue() +if (StringCompare(GetWindowClass(GetTopLevelWindow(GetFocus())), "SWT_Window0", false) == 0) + return GetLongestOfObjectNameOrValue() +endIf +return GetObjectValue() +EndFunction + +Void Function SayFocusedObject () +var + int bRestore +if GetActiveCursor() != CURSOR_PC then + let bRestore = TRUE + SaveCursor () + PCCursor () +endIf +if sayFocusedObjectViewSliders () then return endIf +if (!TreeWithColumns()) then + SayObjectTypeAndText () +else + ;this allows alt+tabbing to speak treeview item in eclipse multi column treeview + var + string description, + string value, + string position, + handle currentWindow + Let value = SmartGetTreeViewObjectValue() + let description = GetObjectDescription(SOURCE_CACHED_DATA, 0) + if (StringLength(description) && StringContains(value, description) == 0) + let value = value + cscSpace + description + EndIf + let currentWindow = GetFocus ( ) + let position = PositionInGroup() + SayControlExWithMarkup (currentWindow, GetWindowName(currentWindow), GetWindowType (currentWindow), "", "", "", value, position, "") +EndIf +if bRestore then + RestoreCursor() +endIf +NotifyIfContextHelp() +EndFunction + +int function IsFocusObjectDescendantOfmenu() +var + int i, + int count, + int type +count = GetAncestorCount() +for i = 1 to count + type = GetObjectSubtypecode(false,i) + if type == wt_menu + || type == wt_ContextMenu + return true + endIf +endFor +return false +EndFunction + +int function MenuInactiveProcessed(int mode, int PrevMenuMode) +var + int nonVirtualRibbonState, + int ticks, + int elapsedTicks, + int usingvirtualRibbons +If mode != MENU_INACTIVE then + return false +EndIf +if !mode + ;If not using virtual ribbons, + ;MenuModeEvent may fire twice if leaving a menu item on the lower ribbon and returning to the document. + ;The current and prev menu mode may both be 0 when leaving the lower ribbons. + ;The event fires once when leaving the lower ribbon where the lower ribbon item was not a menu item, + ;but fires twice when leaving the lower ribbon where the item was a menu item. + ;If using virtual ribbons and leaving the upper ribbon the event fires twice, + ;on the first firing the prev menu mode is menu bar active, but on the second firing it is 0. + ;so we use a test for the elapsed ticks to suppress announcement of the second instance of the event + ;when virtual ribbons are not active and when simultaneously leaving both a menu item and the lower ribbon, + ;or when virtual ribbons are active and leaving the virtual upper ribbon. + Ticks = GetTickCount() + elapsedTicks = ticks-MenuInactiveTickTime + MenuInactiveTickTime = ticks + usingVirtualRibbons = getJCFOption(OPT_VIRTUAL_RIBBON_SUPPORT) + if !PrevMenuMode + if (!usingVirtualRibbons && elapsedTicks <= MenuInactiveTickToleranceForNonVirtual) + || (usingVirtualRibbons && elapsedTicks <= MenuInactiveTickToleranceForVirtual) + return true + endIf + endIf +endIf +nonVirtualRibbonState = GetNonVirtualRibbonState() +if nonVirtualRibbonState == LowerRibbon_Active + ;Don't indicate menu active or inactive when moving to or from a menu item on the lower ribbon: + return true +endIf +if GetRunningFSProducts() & product_JAWS then + If PrevMenuMode == MENUBAR_ACTIVE then + SayFormattedMessage (OT_CONTROL_TYPE, cmsg48_L, cmsg48_S) ;"leaving menu bar" + else + if IsFocusObjectDescendantOfmenu() + ;The menus are not really inactive: + return true + endIf + SayFormattedMessage (OT_CONTROL_TYPE, cmsg48_S) ;"Leaving menus" + endIf +EndIf +return true +EndFunction + +int function ContextMenuProcessed(handle hWnd) +var + int iSubtype, + string sOwner, + int injectDownArrow = false +if GetObjectSubTypeCode() != WT_CONTEXTMENU +|| GetWindowSubTypeCode(hwnd) == WT_STARTMENU then + return false +EndIf +let sOwner = GetWindowOwner(hWnd) +if sOwner then + let sOwner = StringSegment(sOwner,cScDoubleBackSlash,StringSegmentCount(sOwner,cScDoubleBackSlash)) + if sOwner == cscAppJFWExecutable then + let sOwner = cscAppJFWFriendly + ElIf sOwner == cscAppMagicExecutable then + let sOwner = cscAppMagicFriendly + ElIf sOwner == cscMAGUtilExecutable then + if gbAnnounceVoiceProfilesContextMenu then + let sOwner = cmsgVoiceProfilesContextMenuName + else + let sOwner = cmsgMagicContextMenuName + EndIf + else + let sOwner = cscNull + EndIf +EndIf +IndicateControlType(WT_CONTEXTMENU,sOwner,cscSpace) +let gbAnnounceVoiceProfilesContextMenu = false +let iSubtype = GetObjectSubTypeCode() +if !(iSubtype == wt_Menu) then + if ! giFN_Helper && !IsZoomTextRunning() then + injectDownArrow = true + endIf +EndIf +if GlobalMenuMode == MENUBAR_ACTIVE && GlobalPrevMenuMode == MENU_ACTIVE Then + injectDownArrow = false +EndIf +var string sClass = GetObjectClassName () +if sClass == Windows11SysTrayIconsClass + injectDownArrow = false + UIARefresh(false) +EndIf +if sClass == "Microsoft.UI.Content.DesktopChildSiteBridge" + injectDownArrow = false +endIf +if injectDownArrow Then + TypeKey (cksDownArrow); Select first item in menus +EndIf +MenuModeHook () +return true +EndFunction + +int function MenuBarActiveProcessed(int mode) +If mode != MENUBAR_ACTIVE then + return false +EndIf +if RibbonsActive() then + if IsVirtualRibbonActive() then + Say(cmsgVirtualRibbonsActive,OT_CONTROL_TYPE) + else + IndicateControlType(wt_UpperRibbon) + IndicateControlState (wt_UpperRibbon, GetObjectStateCode (true, 1)) + EndIf +else + IndicateControlType(WT_MENUBAR) +EndIf +MenuModeHook () +return true +EndFunction + +int function MenuActiveProcessed(int mode, handle hWnd) +If mode != MENU_ACTIVE then + return false +EndIf +If GetWindowSubTypeCode(hWnd) == WT_STARTMENU then + IndicateControlType(WT_STARTMENU,cscSpace,cscSpace) + if !(GetCharacterAttributes() & ATTRIB_HIGHLIGHT) then + TypeKey(cksDownArrow) + EndIf + BrailleMenuModeHelper () + Let GISuppressStartMenu = TRUE; +elif getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_HEADERBAR then + ;Vista: any list view, tab to header bar controls, then use DownArrow: + Let GlobalMenuMode = 2;'force' menus to show as active for Braille: + IndicateControlType (WT_MENU,cscSpace,cscSpace) + TypeKey (cksDownArrow) +else + if RibbonsActive() then + ;only announce the lower ribbons when entering them, + ;not when navigating in and out of groups: + if GlobalPrevMenuMode != GlobalMenuMode then + IndicateControlType(WT_LowerRibbon,cscSpace,cscSpace) + EndIf + else + if IsFocusObjectDescendantOfmenu() + ;The menus are already active: + return true + endIf + IndicateControlType(WT_MENU,cscSpace,cscSpace) + EndIf +endIf +MenuModeHook () +return true +EndFunction + +void function DoExtraMenuProcessing() +var + handle FocusWindow, + handle RealWindow, + handle AppWindow, + string RealWindowName +let FocusWindow = GetFocus() +If FocusWindow == GlobalPrevFocus then + let RealWindow = GetRealWindow(FocusWindow) + let RealWindowName = GetWindowName (RealWindow) + let AppWindow = GetAppMainWindow(FocusWindow) + if RealWindow != FocusWindow then + SayWindowTypeAndText(RealWindow) + endIf + SayWindowTypeAndText(FocusWindow) +endIf +MenuModeHook() +EndFunction + +Void Function MenuModeEvent (handle WinHandle, int mode) +;The Mode parameter indicates whether the menuBar has become active, a +;Menu has become active, or the menus are going away. These are +;represented by the constants MENUBAR_ACTIVE, MENU_ACTIVE, and +;MENU_INACTIVE. +Var + handle FocusWindow, + int PrevMenuMode, + int NCurrentMSAAMode +let g_PrevFocusedObjectID = FocusWindow +let g_JavaIgnoreNextActiveItemChange = 0 +let PrevMenuMode = GlobalMenuMode +let GlobalPrevMenuMode = PrevMenuMode +let GlobalMenuMode=mode +let NCurrentMSAAMode=GetJCFOption ( OPT_MSAA_MODE) +if MenuInactiveProcessed(mode,PrevMenuMode) then + return +EndIf +if ContextMenuProcessed(WinHandle) then + return +EndIf +if MenuBarActiveProcessed(mode) then + return +EndIf +if MenuActiveProcessed(mode,WinHandle) then + return +EndIf +DoExtraMenuProcessing() +; processing for minimized icons when exiting context menu after closing an app, system tray or application menu: +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) then + UnscheduleFunction (giFN_SpeakInvisibleWindow) + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) +endIf +EndFunction + +void function MagMenuModeHook() +var + handle hWnd +if GetRunningFSProducts() & product_MAGic +&& GlobalMenuMode == 2 then + let hwnd = getFocus() + If GetWindowSubtypeCode(hWnd) == WT_EDIT then + MagTrackCustomMenus(hWnd) + EndIf +EndIf +EndFunction + +Void Function MenuModeHook () +; This Script can be added to application Script files to add onto menu mode. +magMenuModeHook() +ResetVirtualHook () +EndFunction + +;**/3 start of cut/paste Scripts +Script Undo() +TypeKey (cksUndo) +SayFormattedMessage (OT_JAWS_MESSAGE, cmsg50_L) +EndScript + +int function ClipboardUpdateInConsoleWindow(int nMethod) +var + string theClass +let TheClass = GetWindowClass (GlobalFocusWindow) +if !UserBufferIsActive() +&& (theClass == cwcTTY +|| theClass == cwcTTYGrab +|| TheClass == cwc_ConsoleWindow) then + ;Don't add Overwrite Clipboard code here, because + ;Clipboard isnot in use with control c or control x whenin a console window. + SayCurrentScriptKeyLabel () + if nMethod == CLIPBOARD_CUT then + TypeKey (cksCut) + else + CopySelectionToClipboard () + endIf + Return true +EndIf +return false +EndFunction + +int function IsNoSelectionForClipboard() +var + handle hWnd, + string sClass, + int iWintype, + int iObjtype, + int mode +hWnd = GetFocus() +sClass = GetWindowClass(hWnd) +iWintype = GetWindowSubtypeCode(hWnd) +iObjtype = GetObjectSubtypeCode() +;for some treeviews and lists, +;selected text and highlight cannot be used to determine if there is a selected item: +if iObjType == wt_listBoxItem +&& sClass ==cscListviewClass + if lvGetItemState(hWnd,lvGetFocusItem(hWnd)) & state_system_selected + return false + endIf +elif iObjType == wt_treeViewItem +&& sClass ==cwc_SysTreeView32 + if GetControlAttributes()&CTRL_SELECTED + return false + else + ;may need to switch MSAA mode: + mode = GetJCFOption(opt_msaa_mode) + SetJCFOption(opt_msaa_mode,2) + if GetControlAttributes()&CTRL_SELECTED + SetJCFOption(opt_msaa_mode,mode) + return false + endIf + SetJCFOption(opt_msaa_mode,mode) + endIf +endIf +return (!GetSelectedText () + && !(GetCharacterAttributes () & ATTRIB_HIGHLIGHT)) + && (iWinType == wt_edit + || iWinType == wt_MultiLine_Edit + || iWinType == wt_ReadOnlyEdit + || iWinType == wt_PasswordEdit + || iWinType == wt_Upload_Edit + || iWinType == wt_EditCombo + || iWinType == wt_ListView + || iWinType == wt_ListViewItem + || iWinType == wt_TreeView + || iWinType == wt_TreeViewItem + || iWinType == wt_Static + || (!iWinType && sClass==cwcIEServer)) +EndFunction + +int function MayOnlyCopyToClipboard() +var + int iSubtype +let iSubtype = GetWindowSubtypecode(GlobalFocusWindow) +if !iSubtype then + let iSubtype = GetObjectSubtypeCode() +EndIf +return IsVirtualPcCursor() + || iSubtype == wt_ReadOnlyEdit +EndFunction + +int function WillOverwriteClipboard() +var + int iShouldOverwrite, + int bUserBuffer +if gbAppendedToClipboard then + let bUserBuffer = UserBufferIsActive() + If bUserBuffer then + UserBufferDeactivate () + EndIf + let iShouldOverwrite = ExMessageBox (cmsgOverwriteClipboard,cmsgOverwriteClipboardName,MB_YESNO|MB_DEFBUTTON1|MB_ICONASTERISK) + If bUserBuffer then + UserBufferActivate () + EndIf + if iShouldOverwrite != IDYES then + Return false + else + let gbAppendedToClipboard = FALSE + endIf +endIf +return true +EndFunction + +void function updateClipboard(int nMethod) +if !(GetRunningFSProducts() & product_JAWS|product_MAGic) then + return +endIf +;the following If-ElIf-EnIf block must test the conditions in the order listed: +if ClipboardUpdateInConsoleWindow(nMethod) then + return +elif IsNoSelectionForClipboard() then + SayMessage (OT_ERROR, cmsgNothingSelected) + return +elif MayOnlyCopyToClipboard() +&& nMethod == CLIPBOARD_CUT then + ;just pass the key through + SayCurrentScriptKeyLabel () + TypeKey (cksCut) + return +elif !WillOverwriteClipboard() then + return +EndIf +if nMethod == CLIPBOARD_CUT then + let ClipboardTextChanged = Clipboard_Cut + TypeKey (cksCut) +else + let ClipboardTextChanged = Clipboard_Copied + CopySelectionToClipboard () +endIf +endFunction + +Script CutToClipboard() +var + int iRunningFSProducts +let iRunningFSProducts = GetRunningFSProducts() +if iRunningFSProducts == product_MAGic then + SayCurrentScriptKeyLabel () + TypeKey(cksCut) + return +endIf +updateClipboard(CLIPBOARD_CUT) +EndScript + +Script CopySelectedTextToClipboard () +var + int iRunningFSProducts +let iRunningFSProducts = GetRunningFSProducts() +if iRunningFSProducts == product_MAGic +; virtual viewer was not allowing a copy. +&& ! UserBufferIsActive ()then + SayCurrentScriptKeyLabel () + ; some virtual cursor windows like Firefox don't automatically copy the way you'd expect, + ; so copy from JAWS function instead of the keyboard: + if IsVirtualPcCursor () then + CopySelectionToClipboard () + else + TypeKey(cksCopy) + endIf + return +EndIf +updateClipboard(CLIPBOARD_COPIED) +EndScript + +int function InTextWindow() +var + int iWndSubtype, + string sWndClass, + int iObjSubtype +let iWndSubtype = GetWindowSubtypeCode(GlobalFocusWindow) +let sWndClass = GetWindowClass(GlobalFocusWindow) +let iObjSubtype = GetObjectSubtypeCode() +return + !GlobalMenuMode + && (UserBufferIsActive() + || CaretVisible() + || iWndSubtype == wt_edit + || iWndSubtype == wt_multiline_edit + || iWndSubtype == wt_ReadOnlyEdit + || iWndSubtype == wt_static + || iObjSubtype == wt_edit + || iObjSubtype == wt_multiline_edit + || iObjSubtype == wt_ReadOnlyEdit + || iObjSubtype == wt_static + || sWndClass == cwcIEServer) +EndFunction + +Script AppendSelectedTextToClipboard () +var + string sSelectedText, + string sClipboardText, + int bAlreadyAppended, + int bResult +if !InTextWindow() then + SayMessage(ot_error,cmsgNotInATextWindow) + return +EndIf +let sSelectedText = GetSelectedText () +let sClipboardText=GetTextFromClipboard() +let bResult =FALSE +let bAlreadyAppended = FALSE +if sSelectedText +|| GetCharacterAttributes() & ATTRIB_HIGHLIGHT then + CopySelectionToClipboard() + ;We delay so that the Windows clipboard can propogate the event notification to other apps + Delay(1) + let sSelectedText = GetTextFromClipboard() ; get plain text + let gbAppendedToClipboard = TRUE + let ClipboardTextChanged = CLIPBOARD_APPENDED + if sClipboardText then + let bAlreadyAppended = WasTextAlreadyAppended ( sClipboardText, sSelectedText ) + if bAlreadyAppended + || !sSelectedText then + CopyToClipboard(sClipboardText) ;replace original text + let bResult = TRUE + else + CopyToClipboard (sClipboardText) ;replace original text to make sure it's in plain text format + Delay(1) + let bResult=AppendToClipboard( sSelectedText, TRUE) ; put selection at the end + endIf + else + ;Clipboard is empty + CopyToClipboard (sClipboardText) ;replace original text to make sure it's in plain text format + let bResult = TRUE + ;This copy will not fire the ClipboardChangedEvent, so we call it ourselves: + ClipboardChangedEvent() + endIf +else + let ClipboardTextChanged = false + SayMessage (OT_ERROR, cmsgNothingSelected) + return +endIf +if !bResult then + let ClipboardTextChanged = false + let gbAppendedToClipboard = false +endIf +EndScript + +Script PasteFromClipboard() +TypeKey (cksPaste) +if GetRunningFSProducts() == product_MAGic then + SayCurrentScriptKeyLabel() +else +SayFormattedMessage (OT_JAWS_MESSAGE, cmsg53_L, cmsg53_S) +endIf +EndScript + +; **/4 End of cut and paste scripts + +Script RefreshScreen () +;Used to refresh the screen +ReloadSystemColors() +Refresh () +MSAARefresh ();So Refresh accurately reloads all cached data +BrailleRefresh();All Braille segments, allows BrailleCallbackObjectIdentify and helpers to use new MSAA data if necessary. +ResetVoiceSettings () +EscapeFromApplet () +if GetRunningFSProducts() & product_MAGic then + MagSendKeyEvent (KI_REFRESH_SCREEN) +endIf +UnmuteJawsSoundcard() +if IsVirtualPCCursor () then + SayFormattedMessage (ot_JAWS_message, cmsg290_L) +else + ;cmsg54_L = "Screen Refreshed" + SayFormattedMessage (ot_JAWS_message, cmsg54_L, cmsg54_S) +endIf +EndScript + +Int Function IsPointInWindow (handle hwnd, int x, int y) +var + int top, + int left, + int bottom, + int right +let top = GetWindowTop (hwnd) +let left = GetWindowLeft (hwnd) +let bottom = GetWindowBottom (hwnd) +let right = GetWindowRight (hwnd) +if (left <= x && x <= right && top <= y && y <= bottom) then + return true +else + return false +endIf +EndFunction + +int Function ReadContextLine () +var + int iRestriction, + handle appWindow, + handle realWindow, + handle focusedWindow, + int iCounter, + string sMessage +let focusedWindow = GetFocus () +let RealWindow = GetRealWindow (focusedWindow) +let appWindow = GetAppMainWindow (focusedWindow) +InvisibleCursor () +; try to find the highlighted word starting at the top of the window +MoveToWindow (appWindow) +let iCounter = 0; +while (FindNextAttribute (attrib_highlight) && +(iCounter < 20)) + let iCounter = iCounter + 1 + if (!IsPointInWindow (realWindow, getCursorCol (), getCursorRow ()) && + (GetCurrentWindow () != appWindow)) then + RouteJAWSToInvisible () + JAWSCursor () + SayLine () +; RestoreCursor () + ;above "restore" moves the invisible cursor away from the context + PCCursor () +; to read in context turn on the JAWS cursor + return TRUE; so we don't try to drag a dialog + endIf +EndWhile +;start of 2nd block, search from bottom +MoveTo (GetWindowRight (appWindow) - 3, GetWindowBottom (appWindow) - 3) +;above move may not go to right spot every time, cause search to fail? +let iCounter = 0; +while (FindPriorAttribute (attrib_highlight) && (iCounter < 10)) + let iCounter = iCounter + 1 + if (!IsPointInWindow (realWindow, getCursorCol (), getCursorRow ()) && (GetCurrentWindow () != appWindow)) then + RouteJAWSToInvisible () + JAWSCursor () + SayLine () ;found it + PCCursor () + return TRUE; So we won't drag the dialog + endIf +EndWhile +;start of block 3, search from top, different criteria? +Let iRestriction = GetRestriction () +SetRestriction (RESTRICTNONE) +JAWSPageUp () ;start at top of app +Let iCounter = 0; +while (FindNextAttribute (attrib_highlight) && (iCounter < 10)) + Let iCounter = iCounter+1 + If GetCurrentWindow () != FocusedWindow && + GetCurrentWindow () != RealWindow && + GetCurrentWindow () != AppWindow && + GetRealWindow(GetCurrentWindow ()) != RealWindow then + RouteJAWSToInvisible () + JAWSCursor () + SayLine () ;found it + PCCursor () + Return TRUE + EndIf +EndWhile +;start of block 4, search from bottom +InvisibleCursor () +RouteInvisibleToPc () +SetRestriction (RestrictAppWindow) +JAWSPageDown () ;go to bottom of spell check window +SetRestriction (RestrictNone) +NextLine () ;go beyond spell check window +NextLine () ;go beyond spell check window 2 lines +SetRestriction (RestrictappWindow) +JAWSPageDown() ;go to bottom of app window +JAWSEnd() ;go to bottom right corner of app window +Let iCounter = 0; +while (FindPriorAttribute (attrib_highlight) && (iCounter < 10)) + Let iCounter = iCounter+1 + If GetCurrentWindow () != FocusedWindow && + GetCurrentWindow () != RealWindow && + GetRealWindow (GetCurrentWindow ()) != RealWindow && ;added this, T.H. + GetCurrentWindow () != AppWindow then + RouteJAWSToInvisible () + JAWSCursor () + SayLine () + PcCursor () + Return TRUE; + EndIf +EndWhile +PcCursor () +Return FALSE; +EndFunction + +void function DragDialogWindow () +var + int DragFromX, + int DragFromY, + int iJAWSCol, + int iJAWSRow, + string DragObject, + int x, + int y, + String strObject +JAWSCursor () +Let iJAWSCol = GetCursorCol ();For JAWSCursor +Let iJAWSRow = GetCursorRow () +MoveToWindow (GetRealWindow (GetFocus ())) +let DragFromX = getCursorCol () +let DragFromY = getCursorRow () ;save position of spell dialog +let DragObject = GetWord () +;now move to the top of the app +MoveToWindow (GetAppMainWindow (GetFocus ())) +let x = getCursorCol () +let y = getCursorRow () ;save position to move to +;don't allow the dialog to be dragged off-screen: +if x>DragFromX ||Y>DragFromY then + return +EndIf +; make sure that the left mouse button is unlocked +If IsLeftButtonDown () then + LeftMouseButtonLock () + pause () +endIf +MoveTo (DragFromX, DragFromY) ;go back to spell dialog +Pause () +let strObject = GetWord() +LeftMouseButtonLock () ; lock it down +pause () +MoveTo (x,y) ;drag it +Pause () +pause () +pause () +;cmsg172_L = "dragging " +;let sMessage = FormatString (cmsg172_L, strObject, GetWord ()) +;SayFormattedMessage (ot_JAWS_message, sMessage); dragging x to y +LeftMouseButtonLock () ;unlock +;Put the JAWSCursor back where it was: +MoveTo (iJAWSCol, iJAWSRow) +PCCursor () +EndFunction + +int function IsReadWordInContextValid() +;Attempts to determine whether we are in a dialog where the ReadWordInContext script is valid. +;Spellchecker, Find, Replace and the like are good candidates for valid dialogs. +var + handle hDlg, + string sDlgName, + string sDlgWndText +if !DialogActive() then + return false +EndIf +let hDlg = GetRealWindow(GetFocus()) +let sDlgName = GetWindowName(hDlg) +let sDlgWndText = GetWindowTextEx(hDlg,0,0) +return StringContains(sDlgName,cscSpell) + || StringContains(sDlgName,cscFind) + || StringContains(sDlgName,cscReplace) + || StringContains(sDlgWndText,cscSpell) + || StringContains(sDlgWndText,cscFind) + || StringContains(sDlgWndText,cscReplace) +EndFunction + +Script ReadWordInContext () +; read word in context, for spell check, find, replace, etc. +If !IsReadWordInContextValid() then + SayFormattedMessage (ot_error, cmsgwordInContextError_l, cmsgWordInContextError_s) ; "Word in context not found " + Return;Not available outside of dialog windows. +EndIf +If ReadContextLine () then + Return;Found +EndIf +;now the word has not been found, move the dialog +PcCursor () +DragDialogWindow () +Pause() +If ! ReadContextLine () then + SayFormattedMessage (ot_error, cmsg216_L, cmsg216_S) ; "Word in context not found " +EndIf +EndScript + +int Function RedisplayPrevField(String sPrevVWName) +;Scripts can override this function to redisplay a virtual buffer that was active prior to the display of a help buffer. +;This function is called if a user buffer is active and its associated window name (returned by +;UserBufferWindowName) is null. It is called from CloseButton after the +;current user buffer has been deactivated and immediately before UpALevel exits. +;If it does not wish to redisplay a field it should call the default version of RedisplayPrevField before returning. +;Parameters: +;String/sPrevVWName The value of UserBufferPrevWindowName() prior to the call to UserBufferDeactivate(). +return false +EndFunction + +void function SayFocusAfterExitUserBuffer() +if GetWindowSubTypeCode (GetCurrentWindow ()) != WT_TASKBAR +&& !(GetCharacterAttributes () & ATTRIB_HIGHLIGHT) then + SayLine () +EndIf +EndFunction + +int function UserBufferVirtualWindowDeactivate(string vwName) +;Called by ExitUserBuffer, +;to deactivate user buffers with virtual window names. +;Return false if deactivation is not allowed and therefore did not happen, +;otherwise deactivate and return true to notify the ExitUserBuffer function that deactivation occurred and it may proceed. +;The string parameter is the name of the virtual window which is asking for deactivation. +UserBufferDeactivate() +return true +EndFunction + +int function ExitUserBuffer() +var + int UserBufferIsActive = UserBufferIsActive(), + int UserBufferIsActiveResultsViewer = UserBufferIsActiveResultsViewer() +If !UserBufferIsActive +&& !UserBufferIsActiveResultsViewer + return false +EndIf +If UserBufferIsActive + var String sPrevVWName = UserBufferPrevWindowName() + if !UserBufferWindowName() + UserBufferDeactivate() + if sPrevVWName + Delay(2) + RedisplayPrevField(sPrevVWName) + endIf + else ;The user buffer has a name: + if !UserBufferVirtualWindowDeactivate(sPrevVWName) + ;Deactivation was not allowed, + ;probably because the focus control is portrayed as virtual text. + ;Return false to allow Escape key to work. + return false + endIf + endIf +ElIf UserBufferIsActiveResultsViewer + UserBufferDeactivateResultsViewer() +EndIf +var + handle hwnd, + int TheTypeCode, + string sMessage +if giRestoreFormsModeAfterVirtualizeCPS + TurnOnFormsMode() + giRestoreFormsModeAfterVirtualizeCPS=FALSE; +endIf +if gbDocumentLoadAppAlertShowing then + gbDocumentLoadAppAlertShowing = false + DoDefaultDocumentLoadActions() + return true +EndIf +Delay(4) +If IsTouchNavigationModeActive() +|| IsObjectNavigationSuspended() + ;Object navigation resumes when this user buffer window is gone, + ;so do not speak the focus item. + ;Both current and suspended states are tested, + ;because the resumption of object navigation may be immediate or may be scheduled. + return +endIf +SayFocusAfterExitUserBuffer() +; don't want to pass the Esc key on to the app. +return true +EndFunction + +int function ExitFormsModeHelper() +var +handle hAutoSuggest +if ! getJcfOption (OPT_VIRTUAL_PC_CURSOR) +|| !IsFormsModeActive() || !IsPCCursor () then + return FALSE +EndIf +; If the autosuggest dropdown is visible, then return FALSE +; This will cause an escape to be sent through to the application and close the dropdown. +let hAutoSuggest=FindWindow (0, cwc_AutoSuggestDropdown, "") +if (hAutoSuggest && IsWindowVisible(hAutoSuggest)) then +return FALSE +EndIf +;return FALSE if menus are active so that the menu is exited. +;This is possible in ARIA enabled menus. +if GetMenuMode() then + return FALSE +endIf +if IsComboExpanded() then + DoCloseListBoxKeyStroke() +EndIf +TurnOffFormsMode() +if BrailleInUse () then + RouteBrailleToPC () + BrailleRefresh () +endIf +;it doesn't make sense to have JAWS saying 'Virtual PC Cursor' if inside a dialog, +;such as New Folder or Rename Folder under Organize Favorites in Internet Explorer. +if ! dialogActive () then + SayFormattedMessage (ot_status, cMSG288_L, cMSG288_S) ; virtual pc cursor +endIf +return TRUE +endFunction + +Script UpALevel() +SayCurrentScriptKeyLabel () +if ExitUserBuffer() then + return +EndIf +if IsMetroApp() then + EscapeKey(); + return; +endIf +if ( IsFormsModeActive() +&& ! IsInsideARIAApplication() ) then +if ExitFormsModeHelper() then + return +endIf +EndIf +EscapeKey(); +EndScript + +script SayDefaultButton () +var + string DefaultButtonName, + string sMessage +if (DialogActive ()) then + let DefaultButtonName = GetDefaultButtonName () + if (DefaultButtonName != cscNull) then + let sMessage = FormatString (cmsg55_L, DefaultButtonName) + SayFormattedMessage (ot_user_requested_information, sMessage, DefaultButtonName) + else + SayFormattedMessage (ot_error, cmsg192_L, cmsg192_S) ; "Can not determine default button in this dialog box " + endIf +else + SayFormattedMessage (ot_error, cmsg56_L, cmsg56_S) ;"not in a dialog box" +endIf +EndScript + +;**/5 MOUSE FUNCTIONS + +script MouseLeft() +;MouseLeft Script +if ! IsJAWSCursor () then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + return +endIf +MouseLeft (GlobalMousePixel) +SayFormattedMessage (ot_status, cmsg57_L, cmsg57_S) ;"Mouse Left" +EndScript + +script MouseRight() +;MouseRight Script +if ! IsJAWSCursor () then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + return +endIf +MouseRight (GlobalMousePixel) +SayFormattedMessage (ot_status, cmsg58_L, cmsg58_S) ;"Mouse Right" +EndScript + +script MouseDown() +;MouseDown Script +if ! IsJAWSCursor () then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + return +endIf +MouseDown (GlobalMousePixel) +SayFormattedMessage (ot_status, cmsg59_L, cmsg59_S) ;"Mouse Down" +EndScript + +script MouseUp() +;MouseUp Script +if ! IsJAWSCursor () then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + return +endIf +MouseUp (GlobalMousePixel) +SayFormattedMessage (ot_status, cmsg60_L, cmsg60_S) ;"Mouse Up" +EndScript + +script ControlLeftMouseClick() +;Control Left Mouse Click +ControlLeftMouseClick () +SayFormattedMessage (ot_status, cmsg61_L) ;"Control Mouse Click" +EndScript + +script ShiftLeftMouseClick() +;Shift Left Mouse Click +ShiftLeftMouseClick () +SayFormattedMessage (ot_status, cmsg62_L) ;"Shift Mouse Click" +EndScript + +script AltLeftMouseClick() +AltLeftMouseClick () +SayFormattedMessage (ot_status, cmsg63_L) ;"Alt Mouse Click" +EndScript +; **/6 End of Mouse Functions + +void function DoJAWSFind(optional int bReverse) +var + int bIsVirtualPCCursor +let InJAWSFind = TRUE ;flag that can be observed by other scripts +;We need to check for the virtual PC cursor before we put up the +; Find dialog, because if we check after the dialog is closed, the focus may +; not have returned to the browser window and we'd get the wrong answer +let bIsVirtualPCCursor = IsVirtualPCCursor() +if JAWSFind(bReverse) then + Delay(2) ;make sure the screen has redrawn + if (bIsVirtualPCCursor) then + SayLine(2) + else + SayWord() + endIf +endIf +let InJAWSFind = FALSE +let JAWSFindComplete=GetTickCount() +EndFunction + +Script JAWSFind () +DoJAWSFind(false) +EndScript + +Script MAGicFind () +DoJAWSFind(false) +EndScript + +void function DoJAWSFindNext() +var + int found +if (SayAllInProgress()) then + ; Just position to the location of the next occurance of the search string + JAWSFindNext () + return +EndIf +if IsFormsModeActive() Then + TurnOffFormsMode() +EndIf +if !GetJAWSFindText() then + DoJAWSFind(false) + return +EndIf +let found = JAWSFindNext () +if (found==FALSE) then + SayFormattedMessage (ot_error, cmsg64_L, cmsg64_S) +else + ;SayFormattedMessage (ot_JAWS_message, cmsg65_L) + SayLine(2) +endIf ; ["Found", "search string NOT found"] +EndFunction + +Script JAWSFindNext () +DoJAWSFindNext() +EndScript + +Script MAGicFindNext () +DoJAWSFindNext() +EndScript + +void function DoJAWSFindPrior() +var + int found +if (SayAllInProgress()) then + ; Just position to the location of the next occurance of the search string + JAWSFindNext (TRUE) + return +EndIf +if IsFormsModeActive() Then + TurnOffFormsMode() +EndIf +if !GetJAWSFindText() then + ;Perform a JAWSFind with the search direction set to reverse by default: + DoJAWSFind(true) + return +EndIf +let found = JAWSFindNext (TRUE) +if (found==FALSE) then + SayFormattedMessage (ot_error, cmsg64_L, cmsg64_S) +else + ;SayFormattedMessage (ot_JAWS_message, cmsg65_L) + SayLine(2) +endIf ; ["Found", "search string NOT found"] +EndFunction + +Script JAWSFindPrior() +DoJAWSFindPrior() +EndScript + +Script MAGicFindPrior() +DoJAWSFindPrior() +EndScript + +Script GraphicsMode () +var + int GraphicsMode +let GraphicsMode = GetJcfOption (OPT_GRAPHICS_MODE) +If (GraphicsMode == 0) then + If (SetJcfOption (OPT_GRAPHICS_MODE, 1) == WAS_SUCCESSFUL) then + SayFormattedMessage (ot_status, cmsg76_L, cmsg76_S) ;"Active Graphics Mode" + Else + SayFormattedMessage (ot_error, cmsg77_L) ;"Active Graphics Mode could not be set" + endIf ; WAS_SUCCESSFUL +Else + If (SetJcfOption (OPT_GRAPHICS_MODE, 0) == WAS_SUCCESSFUL) then + SayFormattedMessage (ot_status, cmsg78_L, cmsg78_S) ;"Standard Graphics Mode" + Else + SayFormattedMessage (ot_error, cmsg79_L) ;"Standard Graphics Mode could not be set" + endIf ; WAS_SUCCESSFUL +endIf ; GraphicsMode == 0 +EndScript + +Script SayColor() +var +int bSpeakRGB, +int textColor, +int backgroundColor, +string textColorName, +string backgroundColorName, +string sMessage + +if IsSameScript() then + let bSpeakRGB=TRUE +else + let bSpeakRGB=FALSE +endIf +let textColor=GetColorText() +let backgroundColor=GetColorBackground() +if bSpeakRGB then + let textColorName=ColorToRGBString(textColor) + let backgroundColorName=ColorToRGBString(backgroundColor) +else + let textColorName=StringMixedCaseToMultiword(GetColorName(textColor)) +let backgroundColorName=StringMixedCaseToMultiword(GetColorName(backgroundColor)) +endIf +let sMessage=FormatString(cmsgColorInfo,textColorName,backgroundColorName) +SayMessage(OT_USER_REQUESTED_INFORMATION,sMessage) +EndScript + +Script MinimizeAllApps () +MinimizeAllApps () +SayFormattedMessage (ot_JAWS_message, cmsg80_L, cmsgSilent) ;"minimize all apps" +EndScript + +Script MenuBar () +ActivateMenuBar () +Refresh () +EndScript + +Script StartMenu () +; Note, this script is not called if defined in [Quick Navigation Keys] with Legacy keyboard enabled +If UserBufferIsActive () then + UserBufferDeactivate () + ActivateStartMenu () + return +EndIf +if GetCurrentScriptKeyName () != cksWindows + ActivateStartMenu () +endIf +EndScript + +; Keep JAWS from saying "space" in an extended select list box +Script SelectCurrentItem () +var + int TheTypeCode +SayCurrentScriptKeyLabel () +TypeKey(cksSelectCurrentItem) +let TheTypeCode = GetObjectSubtypeCode() +if (TheTypeCode == WT_EXTENDEDSELECT_LISTBOX) then + SayLine() +endIf +EndScript + +Int Function IsSelectScriptDlg() +var + HANDLE hExecute +If InHjDialog () then + If (GetControlID(GetFirstChild(GetRealWindow(GetFocus()))) == ID_SELECT_DLG_LIST) then + ;cwn10 = "JAWS" + ;If (GetWindowName (GetAppMainWindow (GetCurrentWindow ())) == cwn10) then + let hExecute = FindDescendantWindow (GetParent (GetCurrentWindow ()), ID_SELECT_DLG_EXECUTE) + return (IsWindowVisible (hExecute)) + endIf +endIf +return FALSE +EndFunction + +Int Function IsSelectItemDlg () +var + HANDLE hExecute +If (GetControlID(GetFirstChild(GetRealWindow(GetFocus()))) == ID_SELECT_DLG_LIST) then + ;cwn10 = "JAWS" + If (GetWindowName (GetAppMainWindow (GetCurrentWindow ())) == cwn10) then + let hExecute = FindDescendantWindow (GetParent (GetCurrentWindow ()), ID_SELECT_DLG_EXECUTE) + return !(IsWindowVisible (hExecute)) + endIf +endIf +return FALSE +EndFunction + +Void Function AddHotKeyLinks () +VAR + String strContextHelpMsg +let strContextHelpMsg = "" +;This is just intended to make adding a link to HotKeyHelp and WindowKeysHelp simpler +UserBufferAddText (cScBufferNewLine); Put a blank line in to ensure accurate spacing in the buffer +UserBufferAddText (FormatString(cMsgHotKeysLink), cFuncHotKey, FormatString(cMsgHotKeysFunc), + cFont_Aerial, 12, ATTRIB_UNDERLINE, rgbStringToColor(cColor_BLUE), rgbStringToColor(cColor_White)) +If IsWinKeyHelp () then ; Only do this if WindowKeysHelp is appropriate + UserBufferAddText (cMsgWindowKeysLink, cFuncWinHotKey, cMsgWindowKeysFunc, cFont_Aerial, 12, ATTRIB_UNDERLINE, rgbStringToColor(cColor_BLUE), rgbStringToColor(cColor_White)) +EndIf +if (!stringIsBlank (g_strSSHContextHelp)) then + UserBufferAddText (cScBufferNewLine, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) + let strContextHelpMsg = FormatString (cmsgContextHelpF, g_strSSHContextHelp) + let g_strSSHContextHelp = "" + UserBufferAddText (strContextHelpMsg, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) + UserBufferAddText (cScBufferNewLine, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) +endIf +UserBufferAddText (cMsgBuffExit, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) +EndFunction + +Int Function ScreenSensitiveHelpForJAWSDialogs() +var + handle hWnd, + int id, + int SubType, + string sRealName +If !InHjDialog() then + return false +EndIf +let hWnd = GetCurrentWindow() +let sRealName = GetWindowName(GetRealWindow(hWnd)) +if sRealName == AdjustJAWSOptionsDialogName +|| sRealName == cStrBrailleDlgName +|| sRealName == cstrBrailleMarkingDlgName +|| sRealName == StringChopRight(WNPersonalSettings,2) then + ScreenSensitiveHelpForJAWSOptionsDialog() +ElIf sRealName == cwn11 then + ScreenSensitiveHelpForColorsDialog() +Elif sRealName == cwn12 then + ScreenSensitiveHelpForSysTray() +ElIf sRealName == cwn13 then + ScreenSensitiveHelpForJAWSManager() +ElIf sRealName == cwn15 then + ScreenSensitiveHelpForFramesListDialog () +ElIf sRealName == cWn16 then + ScreenSensitiveHelpForHeadingListDialog () +ElIf sRealName == cWn17 then; customize listview dialog + ScreenSensitiveHelpForCustomizeListViewDialog () +ElIf sRealName == cWn18 Then; Select Voice Alias dialog + ScreenSensitiveHelpForSelectVoiceAliasDialog () +ElIf sRealName == cWn19 Then; Skim Reading dialog + ScreenSensitiveHelpForSkimReadingDialog () +ElIf sRealName == cWn20 Then; Add rules dialog + ScreenSensitiveHelpForAddRulesDialog () +ElIf sRealName == cWn21 Then; JAWS find + ScreenSensitiveHelpForJAWSFindDialog () +ElIf StringCompare(sRealName,cwn_LinksList) == 0 then + ScreenSensitiveHelpForLinksListDialog() +ElIf StringCompare (sRealName,cwnCustomizeListViewDefault) == 0 +|| StringCompare (sRealName, cwnCustomizeListViewOutlook) == 0 then + ScreenSensitiveHelpForCustomizeListViewDialog () +elIf StringCompare (sRealName,cwn_ResearchIt_Input_dlg) == 0 then + ScreenSensitiveHelpForResearchItDialog () +elif StringCompare (sRealName,cscSelectBrailleViewDLGTitle) == 0 then + ScreenSensitiveHelpForSetBrailleViewDialog() +elif StringCompare (sRealName,cmsgManageCall_Title) == 0 then + ScreenSensitiveHelpForManageCallDialog() +elif PlaceMarkerDialogActive() + ScreenSensitiveHelpForPlaceMarkerDialog() +elIf FlexibleWebDialogActive () then + ScreenSensitiveHelpForFlexibleWebDialog() +else + return false +EndIf +return true +EndFunction + +Void Function ScreenSensitiveHelpVirtualCursor (int iWinType) +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +var string URL = GetURLForFocusedLink () +if ! stringIsBlank (URL) then + ; add an extra blank line to format for viewer on top of generalized link messages: + URL = URL + cscBufferNewLine +endIf +If iWinType == WT_BUTTON then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp1_L,cmsgScreenSensitiveHelp1_S,1) +elif iWinType == WT_CHECKBOX then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp2_L,cmsgScreenSensitiveHelp2_S,1) +ElIf iWinType == WT_RADIOBUTTON then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp3_L,cmsgScreenSensitiveHelp3_S,1) +elif iWinType == WT_EDIT +|| iWinType == WT_MULTILINE_EDIT then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp4_L,cmsgScreenSensitiveHelp4_S,1) +ElIf iWinType == WT_EDITCOMBO then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp5_L,cmsgScreenSensitiveHelp5_S,1) +ElIf iWinType == WT_COMBOBOX then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp6_L,cmsgScreenSensitiveHelp6_S,1) +ElIf iWinType == WT_SPINBOX then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp7_L,cmsgScreenSensitiveHelp7_S,1) +ElIf iWinType == WT_UPLOAD_EDIT then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp61_L,cmsgScreenSensitiveHelp61_S,1) +elif iWinType == WT_MAILTO_LINK then + ShowScreenSensitiveHelp(URL+cmsgScreenSensitiveHelp8_L,URL+cmsgScreenSensitiveHelp8_S,1) +ElIf iWinType == wt_ImageMap_link then + ShowScreenSensitiveHelp(URL+cmsgScreenSensitiveHelp9_L,URL+cmsgScreenSensitiveHelp9_S,1) +ElIf iWinType == WT_BITMAP then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp10_L,cmsgScreenSensitiveHelp10_S,1) +ElIf iWinType == WT_LINK then + ShowScreenSensitiveHelp(URL+cmsgScreenSensitiveHelp11_L,URL+cmsgScreenSensitiveHelp11_S,1) +ElIf iWinType == WT_THISPAGE_LINK then + ShowScreenSensitiveHelp(URL+cmsgScreenSensitiveHelp12_L,URL+cmsgScreenSensitiveHelp12_S,1) +ElIf iWinType == wt_ftp then + ShowScreenSensitiveHelp(URL+cmsgScreenSensitiveHelp13_L,URL+cmsgScreenSensitiveHelp13_S,1) +ElIf iWinType >= WT_HTML_HEADING1 && iWinType <= WT_HTML_HEADING6 then + ShowScreenSensitiveHelp(URL+FormatString (cMsgHtmlHeading,IntToString(GetCurrentHeadingLevel())),cscNull,1) +else ;Unknown Types + SayNumOfPageElements () + return +EndIf +AddVisperoConnectedLink() +UserBufferAddText (cScBufferNewLine) +UserBufferAddText (cMsgBuffExit, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) +EndFunction + +string function GetCustomScreenSensitiveHelpForKnownClasses(int nSubTypeCode) +;Use this function in application scripts +;to enable Function ScreenSensitiveHelpForKnownClasses to use a custom screen sensitive help message. +return cscNull +EndFunction + +Void Function ScreenSensitiveHelpForKnownClasses (int nSubTypeCode) +var + int iCtrl, + handle hWnd, + string RealName, + string sMessageLong, + string sMessageShort, + string sTreeLevel +If (IsVirtualPCCursor ()) then + If !IsJavaWindow (GetCurrentWindow ()) then + If (nSubTypeCode > 0) then + ScreenSensitiveHelpVirtualCursor (nSubTypeCode) + Return + endIf + endIf +endIf +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +var string sCustomScreenSensitiveHelpMsg = GetCustomScreenSensitiveHelpForKnownClasses (nSubTypeCode) +if sCustomScreenSensitiveHelpMsg + ShowScreenSensitiveHelp(sCustomScreenSensitiveHelpMsg) + return +endIf +if (nSubTypeCode == WT_BUTTON) then ;#1 + If InHjDialog() then + let hWnd = GetFocus() + let RealName = GetWindowName(GetRealWindow(hWnd)) + if RealName == AdjustJAWSOptionsDialogName + || RealName == cStrBrailleDlgName + || RealName == cstrBrailleMarkingDlgName then + let iCtrl = GetControlID(hWnd) + if iCtrl == id_JAWSOptionsCloseButton then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsCloseButton) + ElIf iCtrl == id_JAWSOptionsExecuteButton then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsExecuteButton) + EndIf + return + EndIf + EndIf + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp14_L) + Return +ElIf (nSubTypeCode == WT_COMBOBOX) then ;#2 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp15_L) + Return +Elif (nSubTypeCode == WT_EDIT) ||;#3 +nSubTypeCode == WT_MULTILINE_EDIT then ; #66 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp16_L) + Return +endIf +if (nSubTypeCode == WT_LISTBOX) then ;#4 + if (IsSelectScriptDlg()) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp17_L) + elif (IsSelectItemDlg()) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp18_L) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp19_L) + endIf + Return +endIf +if (nSubTypeCode == WT_SCROLLBAR) || (nSubTypeCode ==WT_LEFTRIGHTSCROLLBAR) then ;#5 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp20_L) + Return +elif (nSubTypeCode ==WT_UPDOWNSCROLLBAR) Then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp21_L) + return +endIf +if (nSubTypeCode == WT_STATIC) then ;#6 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp22_L) + Return +elif (nSubTypeCode == WT_TOOLBAR) then ;#7 + if IsJAWSCursor() + || IsInvisibleCursor() then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpToolBarJAWSCursor_L) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp23_L) + EndIf + Return +elif (nSubTypeCode == WT_STATUSBAR) then ;#8 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp24_L) + Return +elif (nSubTypeCode == WT_HEADERBAR) then ;#9 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp25_L) + Return +elif (nSubTypeCode == WT_SPINBOX) then ;#12 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp26_L) + Return +elif (nSubTypeCode == WT_MENU) then + if IsHorizontalMenu() then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp27a_L) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp27_L) + endIf + Return +elif (nSubTypeCode == WT_DESKTOP) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp28_L) + Return +elif (nSubTypeCode == WT_ICONTITLE) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp29_L) + return +elif (nSubTypeCode == WT_MDICLIENT) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp30_L) + Return +elif (nSubTypeCode == WT_DIALOG) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp31_L) + Return +elif (nSubTypeCode == WT_RADIOBUTTON) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp32_L) + Return +elif (nSubTypeCode == WT_CHECKBOX) then + If InHjDialog() + && GetControlID(GetFocus()) == id_JAWSOptionsCheckBox then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsCheckBox) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp33_L) + EndIf + Return +elif (nSubTypeCode == WT_GROUPBOX) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp34_L) + Return +elif (nSubTypeCode == WT_SDM) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp35_L) + Return +elif (nSubTypeCode == WT_GENERALPICTURE) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp36_L) + Return +elif (nSubTypeCode == WT_HOTKEY) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp37_L) + Return +elif (nSubTypeCode == WT_TABCONTROL) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp38_L) + Return +elif (nSubTypeCode == WT_LISTVIEW) then + let RealName = GetWindowName (GetRealWindow (GetCurrentWindow())) + ;cwn4="Desktop" + if RealName == cwn4 then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp39_L) + Return + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp40_L) + Return + endIf +elif nSubTypeCode == WT_TREEVIEW +|| nSubTypeCode == WT_TREEVIEWItem then + If (InHjDialog ()) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsTreeView) + Else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp41_L) + EndIf + Return +elif (nSubTypeCode == WT_STARTBUTTON) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp42_L) + Return +elif (nSubTypeCode == WT_STARTMENU) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp43_L) + Return +elif (nSubTypeCode == WT_CONTEXTMENU) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp44_L) + Return +elif (nSubTypeCode == WT_TASKBAR) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp45_L) + Return +elif (nSubTypeCode == WT_MULTISELECT_LISTBOX) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp46_L) + Return +elif (nSubTypeCode == WT_EXTENDEDSELECT_LISTBOX) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp47_L) + Return +elif (nSubTypeCode == WT_LEFTRIGHTSLIDER) then ;#39 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp48_L) + Return +elif (nSubTypeCode == WT_UPDOWNSLIDER) then ;#40 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp49_L) + Return +elif (nSubTypeCode == WT_EDITCOMBO) then ;#41 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp50_L) + Return +elif (nSubTypeCode == WT_PASSWORDEDIT) then ;#42 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp51_L) + Return +elif (nSubTypeCode == WT_READONLYEDIT) then ;#43 + If InHjDialog() + && GetControlID(GetFocus()) == id_JAWSOptionsReadOnlyEdit then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsReadOnlyEdit) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp52_L) + EndIf + Return +elif (nSubTypeCode == WT_COMMANDBAR) then ;#44 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp53_L) + return +elif nSubTypeCode==WT_SYSTray then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp54_L) + return +ElIf nSubTypeCode == WT_CLOCK then + ShowScreenSensitiveHelp(cMsgScreenSensitiveHelpClock) + return +elif (GlobalMenuMode == MENUBAR_ACTIVE) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp55_L) + return +elIf (nSubTypeCode == WT_EDIT_SPINBOX) then ; #62 + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp56_L) + Return +elIf (nSubTypeCode == WT_UPLOAD_EDIT) then + if (CaretVisible()) then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp59_L) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp60_L) + EndIf + Return +ElIf nSubTypeCode == WT_LINK then + ShowScreenSensitiveHelp(cMsgScreenSensitiveHelp63) + Return +ElIf nSubTypeCode == WT_BUTTONDROPDOWN +|| nSubTypeCode == WT_BUTTONDROPDOWNGRID then +;|| nSubTypeCode == WT_SPLITBUTTON then; split buttons use a directional arrow to open. + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp14_L) + Return +elIf nSubTypeCode == WT_SPLITBUTTON then + ;state uses a vertical arrow, wheras no state uses horizontal. + ;example of state is the header controls for the list in Windows Explorer, where you change the value and the list sort is changed. + if ! stringIsBlank (getObjectState ()) then + ShowScreenSensitiveHelp (cmsgScreenSensitiveHelpSplitButtonWithState) + else + ShowScreenSensitiveHelp (cmsgScreenSensitiveHelpSplitButton) + endIf + Return +ElIf nSubTypeCode == WT_OUTLINEBUTTON then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp62); + Return +ElIf nSubTypeCode == wt_3State then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_3State) + return +elif nSubTypeCode == WT_ButtonMenu then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_ButtonMenu) + return +elif nSubtypeCode == wt_ListBoxItem then + if GetObjectSubtypeCode(SOURCE_CACHED_DATA,1) == WT_COMBOBOX + || GetObjectSubtypeCode(SOURCE_CACHED_DATA,2) == WT_COMBOBOX then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp15_L) + else + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp19_L) + EndIf + Return +elif nSubtypeCode == wt_grid then + ShowScreenSensitiveHelp(cMsgScreenSensitiveHelpGrid) + return +;This should be the last case, so place all new cases for various type codes above this line: +elIf (! stringIsBlank (g_strSSHContextHelp)) then + let sMessageLong = FormatString (cmsgContextHelpF, g_strSSHContextHelp) + let sMessageLong = sMessageLong + cScBufferNewLine + cScBufferNewLine + cMsgBuffExit + let g_strSSHContextHelp = "" + SayFormattedMessage (OT_USER_BUFFER, sMessageLong); + Return +endIf +;if it gets this far it did not recognize the type code. +let sMessageLong = FormatString (cmsgScreenSensitiveHelp57_L, IntToString (nSubTypeCode)) +let sMessageShort = FormatString (cmsgScreenSensitiveHelp57_S, IntToString (nSubTypeCode)) +SayFormattedMessage (OT_USER_BUFFER, sMessageLong) +ScreenSensitiveHelpForUnknownClasses (); catch everything not yet handled +EndFunction + +int Function ScreenSensitiveHelpWinforms () +;var +If GlobalMenuMode || InHjDialog () then + Return FALSE +EndIf +if ! StringContains(GetWindowClass(GetFocus()), cWc_Winforms) then + Return FALSE +EndIf +If getObjectSubtypeCode(SOURCE_CACHED_DATA, 0)==WT_TableCell then + If getObjectSubtypeCode(SOURCE_CACHED_DATA,1)==wt_Row then + ;Data Grid control + ShowScreenSensitiveHelp (cMsgScreenSensitiveHelpWinformsDataGrid) + Return TRUE + ;ElIf NextConditionInDotNetControls + Else + Return FALSE + EndIf;End of .Net controls + Return FALSE +EndIf;End of classname Winforms. +Return FALSE +EndFunction + +int function ScreenSensitiveHelpForRibbons() +if UserBufferIsActive () return false endIf +var int state = RibbonsActive() +if state == ribbons_inactive return false endIf +if IsVirtualRibbonActive() then + ShowScreenSensitiveHelpForVirtualRibbon(GlobalMenuMode==1) + return true +endIf +var int iObjType = GetObjectSubtypeCode() +if iObjType == wt_TabControl + ShowScreenSensitiveHelp(msgRibbonBarScreenSensitiveHelp) +else + return false +endIf +return true +EndFunction + +Script ScreenSensitiveHelp () +if (IsSameScript ()) then + AppFileTopic(0) ; Don't display a topic + return +endIf +If UserBufferIsActive () then + JAWSTopOfFile () + SayAll () + Return +EndIf +If (ScreenSensitiveHelpWinforms() ; Special Case .Net Winforms and grids +|| ScreenSensitiveHelpForRibbons() +|| ScreenSensitiveHelpForFusionQuickAccessBar()) then + return +endIf +If GlobalMenuMode == 1 + ScreenSensitiveHelpForKnownClasses (wt_MenuBar); + return +endIf +if ScreenSensitiveHelpForJAWSDialogs () then + return +endIf +var + handle WinHandle, + string sRealName +sRealName = GetWindowName(GetRealWindow(WinHandle )) +;for window list +If sRealName == cwn14 then + ScreenSensitiveHelpWindowList() + return +;For OCR Camera Recognition dialog: +elif StringCompare(sRealName,cwn_OCR_CameraRecognition_DLG) == 0 +|| StringCompare(sRealName,cwn_OCR_CameraRecognition_AdvancedSettings_DLG) == 0 +|| StringCompare(sRealName,cwn_OCR_CameraRecognition_AdvancedScannerSettings_DLG) == 0 + ScreenSensitiveHelpForCameraRecognitionDialog(sRealName) + return +EndIf +var + int TheTypeCode, + String TheClass +WinHandle = GetCurrentWindow () +TheTypeCode = GetWindowSubTypeCode (WinHandle) +If !TheTypeCode then + TheTypeCode = GetObjectSubtypeCode() +;for windows of class / type button who are really buttons with the horizontal arrow. +;Example: Shut down button in Windows Vista / 7 +elIf TheTypeCode == WT_BUTTON && getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_SPLITBUTTON then + TheTypeCode = getObjectSubtypeCode(SOURCE_CACHED_DATA) +EndIf +if theTypeCode != WT_PASSWORDEDIT then + g_strSSHContextHelp=GetObjectHelp () +endIf +If TheTypeCode > wt_unknown + ScreenSensitiveHelpForKnownClasses (theTypeCode); known types + return +endIf +TheClass = GetWindowClass (GetFocus ()) +If (theClass == cwcTTY +|| theClass == cwcTTYGrab +|| TheClass ==cwc_ConsoleWindow) then + If UserBufferIsActive () then + UserBufferDeactivate() + EndIf + SayFormattedMessage (OT_USER_BUFFER, cmsg175_L) ;"This is a DOS Window" + return +endIf +If IsVirtualPcCursor () then + SayFormattedMessage (OT_USER_BUFFER, GetNumOfPageElements ()) + AddVisperoConnectedLink() + AddIENavigationKeystrokes() + Return +EndIf +ScreenSensitiveHelpForUnknownClasses() ; handle unknown window types and classes +EndScript + +Int Function ScreenSensitiveHelpForFusionQuickAccessBar () + If GetAppFileName () == QuickAccessBarExe + var handle hCurrentWindow = GetCurrentWindow () + var int iWinType = GetWindowSubTypeCode (hCurrentWindow) + If !iWinType then + Let iWinType = GetObjectSubTypeCode () + EndIf + + if iWinType == WT_UNKNOWN + ShowScreenSensitiveHelp(cmsgQuickAccessBarDoubleShortcut) + return true + EndIf + EndIf + return false +EndFunction + +Void Function ScreenSensitiveHelpForUnknownClasses () +var + handle hwnd, + string sMessage +let TimesPressedDefault = 0 +let hwnd = GetCurrentWindow () +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +If (hwnd) then ;window handle is not 0 + let sMessage = cmsg84_L + SayFormattedMessage (OT_USER_BUFFER, sMessage) ;"This is a custom window type" +else ; handle = 0 + SayFormattedMessage (OT_USER_BUFFER, cmsg96) ;"there is currently no item with focus" +endIf +EndFunction + +script ScreenSensitiveHelpTechnical() +var + handle hwnd, + String TheClass, + string sControl, + string sMessage +let hwnd = GetCurrentWindow () +let TheClass = GetWindowClass (hwnd) +let sControl = IntToString (GetControlID (hwnd)) +let sMessage = FormatString (cmsg85_L, sControl, theClass, IntToString (hwnd)) +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +SayFormattedMessage (OT_USER_BUFFER, sMessage) ;"This is a custom window type" +UserBufferAddText (cScBufferNewLine) +UserBufferAddText (cMsgBuffExit, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) +EndScript + +Void Function ScreenSensitiveHelpForColorsDialog() +var + handle hWnd, + int id, + int SubType +let hWnd = GetCurrentWindow() +let SubType = GetWindowSubtypeCode (hWnd) +let id = GetControlId(hWnd) +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +if SubType == WT_LISTBOX then + if id == id_ListBox_colorDlg then + SayFormattedMessage(OT_USER_BUFFER, cmsg367_L) + return + Else + ScreenSensitiveHelpForKnownClasses(SubType) + return + EndIf +ElIf SubType == WT_BUTTON then + if id == id_OK then + SayFormattedMessage(OT_USER_BUFFER, cmsg365_L) + return + ElIf id == id_CANCEL then + SayFormattedMessage(OT_USER_BUFFER, cmsg366_L) + return + ELSE + ScreenSensitiveHelpForKnownClasses(SubType) + return + ENDIF +Else + PerFormScript ScreenSensitiveHelp() + return +EndIf +EndFunction + +void Function ScreenSensitiveHelpForSysTray() +var + handle hWnd, + int id, + int SubType +let hWnd = GetCurrentWindow() +let SubType = GetWindowSubtypeCode (hWnd) +let id = GetControlId(hWnd) +if SubType == WT_LISTBOX then + if id == id_listBox_systemTray then + ShowScreenSensitiveHelp(cmsg368_L) + Else + ScreenSensitiveHelpForKnownClasses(SubType) + EndIf + return +ElIf SubType == WT_BUTTON then + if id == iD_RightSingleClick then + ShowScreenSensitiveHelp(cmsg369_L) + ElIf id == iD_LeftSingleClick then + ShowScreenSensitiveHelp(cmsg370_L) + ElIf id == iD_LeftDoubleClick then + ShowScreenSensitiveHelp(cmsg371_L) + ElIf id == id_CANCEL then + ShowScreenSensitiveHelp(cmsg366_L) + Else + ScreenSensitiveHelpForKnownClasses(SubType) + EndIf + return +EndIf +PerformScript ScreenSensitiveHelp() +EndFunction + +void Function ScreenSensitiveHelpForJAWSManager() +var + handle hWnd, + int id, + int SubType +let hWnd = GetCurrentWindow() +let SubType = GetWindowSubtypeCode (hWnd) +let id = GetControlId(hWnd) +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +if SubType == WT_LISTVIEW then + if id == ID_ListView_JAWSManager then + ShowScreenSensitiveHelp (FormatString (cmsg372_L)) + return + Else + ScreenSensitiveHelpForKnownClasses(SubType) + return + EndIf +ElIf SubType == WT_BUTTON then + if Id == id_ok then + SayFormattedMessage(OT_USER_BUFFER, cmsg365_L) + return + ElIf id == id_cancel then + SayFormattedMessage(OT_USER_BUFFER, cmsg366_L) + return + Else + ScreenSensitiveHelpForKnownClasses(SubType) + return + EndIf +Else + ; Former call to Script ScreenSensitiveHelp caused a recursive loop, causing this function to throw. + ScreenSensitiveHelpForKnownClasses(SubType) + return +EndIf +EndFunction + +Void Function ScreenSensitiveHelpWindowList() +var + handle hWnd, + int id, + int SubType +let hWnd = GetCurrentWindow() +let SubType = GetWindowSubtypeCode (hWnd) +let id = GetControlId(hWnd) +If SubType == WT_LISTBOX then + if id == id_ListBoxWindowList then + ShowScreenSensitiveHelp(cmsg373_L) + Else + ScreenSensitiveHelpForKnownClasses(SubType) + EndIf + return +ElIf SubType == WT_BUTTON then + if id == id_SwitchTo_btn then + ShowScreenSensitiveHelp(cmsg374_L) + ElIf id == id_About_btn then + ShowScreenSensitiveHelp(cmsg375_L) + ElIf id == id_cancel then + ShowScreenSensitiveHelp(cmsg366_L) + Else + ScreenSensitiveHelpForKnownClasses(SubType) + EndIf + return +ElIf SubType == WT_Checkbox then + if id == id_OnlyIncludeOnTopWindows then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_OnlyIncludeOnTopWindows) + else + ScreenSensitiveHelpForKnownClasses(SubType) + EndIf + return +EndIf +ScreenSensitiveHelpForKnownClasses(SubType) +EndFunction + +void Function ScreenSensitiveHelpForFramesListDialog () +var + handle hWnd, + int id, + int SubType +let hWnd = GetCurrentWindow() +let SubType = GetWindowSubtypeCode (hWnd) +let id = GetControlId(hWnd) +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +if SubType == WT_LISTBOX then + if id == id_lisbox_JAWSManager then + SayFormattedMessage(OT_USER_BUFFER, cMsg377_L) + return + Else + ScreenSensitiveHelpForKnownClasses(SubType) + return + EndIf +ElIf SubType == WT_BUTTON then + if Id == id_ok then + SayFormattedMessage(OT_USER_BUFFER, cmsg378_L) + return + ElIf id == id_cancel then + SayFormattedMessage(OT_USER_BUFFER, cmsg379_L) + return + Else + ScreenSensitiveHelpForKnownClasses(SubType) + return + EndIf +Else + PerformScript ScreenSensitiveHelp() + return +EndIf +EndFunction + +void function ScreenSensitiveHelpForHeadingListDialog () +var + handle hWnd, + int iControl, + int iTypeCode, + string strGroupName;Handle radio button groups, especially for the display of headings 1 through 6 +Let hWnd = GetCurrentWindow () +Let iTypeCode = GetWindowSubTypeCode (hWnd) +If iTypeCode == WT_LISTVIEW then + SayFormattedMessage (OT_USER_BUFFER, cmsgHtmlHeadingsList) + Return +EndIf +If iTypeCode == WT_RADIOBUTTON then + Let strGroupName = GetGroupBoxName () + If strGroupName == cWnGroup1 then + SayFormattedMessage (OT_USER_BUFFER, cmsgHtmlHeadingOrder) + Return + ElIf strGroupName == cWnGroup2 then + SayFormattedMessage (OT_USER_BUFFER, cmsgHtmlHeadingLevels) + Return + EndIf + Return +ElIf iTypeCode == WT_BUTTON then + Let iControl = GetControlID (hWnd) + If (iControl == ID_HEADING_MOVE_TO) then + SayFormattedMessage (OT_USER_BUFFER, cmsgHtmlHeadingMoveToButton) + Return + ElIf iControl ==ID_CANCEL then + SayFormattedMessage (OT_USER_BUFFER, cmsgHtmlHeadingCancelButton) + Return + EndIf +Else + PerformScript ScreenSensitiveHelp () +EndIf +EndFunction + +void function ScreenSensitiveHelpForCustomizeListViewDialog () +Var + handle hWnd, + int iControl, + int iTypeCode, + string sDlgPageName +Let hWnd = GetCurrentWindow () +Let iTypeCode = GetWindowSubTypeCode (hWnd) +let sDlgPageName = GetDialogPageName () +If sDlgPageName == cWnSpeech Then + If iTypeCode == WT_TABCONTROL Then; Speech page tab + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSpeechPage) + ElIf iTypeCode == WT_LISTVIEW Then; headings list view + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpHeadingsList) + ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + If iControl == ID_MoveUpBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpMoveUpButton) + ElIf iControl == ID_MoveDownBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpMoveDownButton) + ElIf iControl == ID_ToggleSpeechBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpToggleSpeechButton) + ElIf iControl == ID_SelectVoiceAliasBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpVoiceAliasButton) + ElIf iControl == id_DeleteCustomizationBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDeleteCustomizationButton) + ElIf iControl == id_ok Then + SayFormattedMessage (OT_USER_BUFFER, cmsg365_L) + ElIf iControl == id_cancel Then + SayFormattedMessage (OT_USER_BUFFER, cmsg366_L) + EndIf + ElIf iTypeCode == WT_EDIT Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpCustomTextEdit) + ElIf iTypeCode == WT_RADIOBUTTON Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpColumnHeaderRadioButtons) + EndIf +ElIf sDlgPageName == cWnBraille Then + If iTypeCode == WT_TABCONTROL Then; Braille page tab + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBraillePage) + ElIf iTypeCode == WT_LISTVIEW then; headings list + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBrlHeadingsList) + ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + If iControl == 7029 Then; Braille move up button + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBrlMoveUpButton) + ElIf iControl == 7048 Then; Braille move down button + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBrlMoveDownButton) + ElIf iControl == 7030 Then; Toggle Braille button + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpToggleBrailleButton) + ElIf iControl == id_ok Then + SayFormattedMessage (OT_USER_BUFFER, cmsg365_L) + ElIf iControl == id_cancel Then + SayFormattedMessage (OT_USER_BUFFER, cmsg366_L) + EndIf + ElIf iTypeCode == WT_RADIOBUTTON Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBrlColumnHeaderRadioButtons) + ElIf iTypeCode == WT_EDIT Then; custom text edit + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBrlCustomTextEdit) + EndIf +ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + If iControl == id_ok Then + SayFormattedMessage (OT_USER_BUFFER, cmsg365_L) + ElIf iControl == id_cancel Then + SayFormattedMessage (OT_USER_BUFFER, cmsg366_L) + EndIf +else + ScreenSensitiveHelpForKnownClasses (iTypeCode) + return +EndIf +UserBufferAddText(cscBufferNewLine+cMsgBuffExit, cScNull, cScNull, cFont_Aerial, 12, 0, rgbStringToColor(cColor_BLACK), rgbStringToColor(cColor_White)) +EndFunction + +Void Function ScreenSensitiveHelpForSelectVoiceAliasDialog () +Var + handle hWnd, + int iControl, + int iTypeCode +let hWnd = GetCurrentWindow () +let iTypeCode = GetWindowSubTypeCode (hWnd) +If iTypeCode == WT_LISTVIEW Then; voice alias list view + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpVoiceAliasListView) + return +ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + If iControl == id_ok Then + SayFormattedMessage (OT_USER_BUFFER, cmsg365_L) + return + ElIf iControl == id_cancel Then + SayFormattedMessage (OT_USER_BUFFER, cmsg366_L) + return + EndIf +EndIf +EndFunction + +Void Function ScreenSensitiveHelpForSkimReadingDialog () +Var + handle hWnd, + handle hwndParent, + int iControl, + int iTypeCode, + int iParentTypeCode +let hWnd = GetCurrentWindow () +let iTypeCode = GetWindowSubTypeCode (hWnd) +let hWndParent = GetParent(hWnd) +let iParentTypeCode = GetWindowSubTypeCode (hWndParent) +If iTypeCode == WT_RADIOBUTTON Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpUseRuleTypeRadioButtons) + return +ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + If iControl == ID_AddRuleBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpAddRulesButton) + return + ElIf iControl == ID_ModifyRuleBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpModifyRuleButton) + return + ElIf iControl == ID_DeleteRuleBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDeleteRuleButton) + return + ElIf iControl == ID_DeleteAllRulesBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDeleteAllRulesButton) + return + ElIf iControl == ID_StartSkimReadBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpStartSkimReadBtn) + return + ElIf iControl == id_SummarizeSkimReadBtn then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSummarizeSkimReadBtn) + return + ElIf iControl == ID_CloseSkimReadBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgCloseSkimReadBtn) + return + ElIf iControl == ID_SkimReadHelpBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSkimReadingHelpBtn) + return + EndIf +ElIf iTypeCode == WT_CHECKBOX Then + let iControl = GetControlID (hWnd) + If IControl == id_SkimReadingIndicationChkBx Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSkimReadingIndicationChkBox) + return + ElIf iControl == id_UseRegularExpressionChkBx Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpUseRegularExpressionCheckBox_L) + return + ElIf iControl == id_BoldCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBoldCheckBox_l) + return + ElIf iControl == id_ItalicCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpItalicCheckBox_L) + return + ElIf iControl == id_UnderLineCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpUnderlineCheckBox_L) + return + ElIf iControl == id_StrikeOutCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpStrikeOUtCheckBox_L) + return + ElIf iControl == id_DoubleStrikeOutCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDoubleStrikeoutCheckBox_L) + return + ElIf iControl == id_SuperScriptCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSuperScriptCheckBox_L) + return + ElIf iControl == id_SubScriptCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSubScriptCheckBox_L) + return + ElIf iControl == id_ShadowCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpShadowCheckBox_L) + return + ElIf iControl == id_OutlineCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpOutlineCheckBox_L) + return + EndIf +ElIf iTypeCode == WT_COMBOBOX +;or if the combo box has been opened with Alt+DownArrow: +|| (iTypecode == wt_ListBox && iParentTypecode == wt_ComboBox) Then + if iTypeCode == wt_ComboBox then + let iControl = GetControlID (hWnd) + elif iParentTypecode == wt_ComboBox then + let iControl = GetControlID (hWndParent) + EndIf + If iControl == ID_TextRulesCombo Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpTextRulesComboBox) + return + ElIf iControl == ID_SpeakUnitCombo Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpSpeakUnitComboBox) + return + ElIf iControl == id_TextColorCombo Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpTextColorCombo_l) + return + ElIf iControl == id_BackgroundColorCombo Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpBackgroundColorCombo_L) + return + Else + SayFormattedMessage (OT_USER_BUFFER, cmsgScreenSensitiveHelp15_L) + return + EndIf +ElIf iTypeCode == WT_EDIT Then + let iControl = GetControlID (hWnd) + If iControl == Id_TextSearchPatternEdit Then + SayFormattedMessage (OT_USER_BUFFER, MsgScreenSensitiveHelpTextSearchPattern_L) + return + ElIf iControl == id_TextRuleNameEdit Then + SayFormattedMessage (OT_USER_BUFFER, MsgScreenSensitiveHelpRuleName_L) + return + EndIf +EndIf +ScreenSensitiveHelpForKnownClasses(iTypeCode) +EndFunction + +Void Function ScreenSensitiveHelpForAddRulesDialog () +Var + handle hWnd, + int iControl, + int iTypeCode +let hWnd = GetCurrentWindow () +let iTypeCode = GetWindowSubTypeCode (hWnd) +If iTypeCode == WT_EDIT Then + let iControl = GetControlID (hWnd) + If iControl == ID_TextRuleEdit Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpTextRuleEdit) + return + ElIf iControl == ID_RuleNameEdit Then; rule name edit + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpRuleNameEdit) + return + EndIf +ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + If iControl == id_ok Then + SayFormattedMessage (OT_USER_BUFFER, cmsg365_L) + return + ElIf iControl == id_cancel Then + SayFormattedMessage (OT_USER_BUFFER, cmsg366_L) + Return + EndIf +EndIf +PerformScript ScreenSensitiveHelp () +EndFunction + +Void Function ScreenSensitiveHelpForJAWSFindDialog () +Var + handle hWnd, + int iControl, + int iTypeCode +let hWnd = GetCurrentWindow () +let iTypeCode = GetWindowSubTypeCode (hWnd) +If iTypeCode == WT_EDITCOMBO Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpFindWhatEditCombo_L) + return +ElIf iTypeCode == wT_RADIOBUTTON Then + let iControl = GetControlID (hWnd) + If iControl == id_FindForwardRabioBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDirectionForwardRadioButton_L) + return + ElIf iControl == id_FindBackwardRadioBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDirectionBackwardRadioButton_L) + return + EndIf +ElIf iTypeCode == WT_BUTTON then + let iControl = GetControlID (hWnd) + If iControl == id_StartFindBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpFindButton_L) + return + ElIf iControl == id_DeleteFindBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpDeleteButton_L) + return + ElIf iControl == id_ClearHistoryBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpClearFindHistoryButton_L) + return + ElIf iControl == id_CancelFindBtn Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpCancelFindButton_L) + return + EndIf +ElIf iTypeCode == WT_CHECKBOX Then + let iControl = GetControlID (hWnd) + If iControl == id_ContextSpecificHistoryCheckbox then + SayFormattedMessage (OT_USER_BUFFER,cMsgScreenSensitiveHelpContextSpecificHistoryCheckBox_L) + return + elif iControl == id_ClearHistoryCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpMainTainHistoryCheckBox_L) + return + ElIf iControl == id_IgnoreCaseCheckBox Then + SayFormattedMessage (OT_USER_BUFFER, cMsgScreenSensitiveHelpIgnoreCaseCheckBox_L) + return + EndIf +EndIf +PerformScript ScreenSensitiveHelp () +EndFunction + +void function ScreenSensitiveHelpForJAWSOptionsDialog() +var + handle hWnd, + int iCtrl +let hWnd = GetFocus() +let iCtrl = GetControlID(hWnd) +if iCtrl == id_JAWSOptionsCloseButton then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsCloseButton) +ElIf iCtrl == id_JAWSOptionsExecuteButton then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsExecuteButton) +ElIf iCtrl == id_JAWSOptionsCheckBox then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsCheckBox) +elif iCtrl == id_JAWSOptions_TreeView then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsTreeView) +ElIf iCtrl == id_JAWSOptionsReadOnlyEdit then + ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpJAWSOptionsReadOnlyEdit) +EndIf +EndFunction + +void function ScreenSensitiveHelpForResearchItDialog () +var + handle hwnd, + int iTypeCode, + int iControl +let hwnd = getCurrentWindow () +let iControl = GetControlID (hWnd) +let iTypeCode = getWindowSubtypeCode (hwnd) +if iTypeCode == WT_EDITCOMBO then + SayMessage (OT_USER_BUFFER, cmsgResearchItWordOrPhraseEditCombo) +elIf iTypeCode == WT_LISTVIEW then + SayFormattedMessage (OT_USER_BUFFER, cmsgResearchItLookupSourcesList) +elIf iTypeCode == WT_READONLYEDIT then + SayFormattedMessage (OT_USER_BUFFER, cmsgResearchItLookupSourceDescription) +elIf iTypeCode == WT_CHECKBOX then + let iControl = GetControlID (hWnd) + if iControl == ID_ResearchIt_MaintainHistory then + SayMessage (OT_USER_BUFFER, cmsgResearchItMaintainHistoryCheckbox) + else + SayMessage (OT_USER_BUFFER, cmsgResearchItIgnoreHistoryCaseCheckBox) + endIf +ElIf iTypeCode == WT_BUTTON Then + let iControl = GetControlID (hWnd) + if iControl == ID_ResearchIt_ClearHistoryItem then + SayMessage (OT_USER_BUFFER, cmsgResearchItClearHistoryItem) + elIf iControl == ID_ResearchIt_ClearAllHistoryItems then + SayMessage (OT_USER_BUFFER, cmsgResearchItClearAllHistoryItems) + elIf iControl == ID_ResearchIt_Options then + SayMessage (OT_USER_BUFFER, cmsgResearchItOptions) + elIf iControl == id_ok Then + SayFormattedMessage (OT_USER_BUFFER, cmsgScreenSensitiveHelpResearchItDialogOKButton) + ElIf iControl == id_cancel Then + SayFormattedMessage (OT_USER_BUFFER, cmsgScreenSensitiveHelpResearchItDialogCancelButton) + EndIf +EndIf +AddHotKeyLinks () +endFunction + +void function ScreenSensitiveHelpForSetBrailleViewDialog() +var + handle hwnd, + int iTypeCode, + int iControl + +let hwnd = getCurrentWindow () +let iControl = GetControlID (hWnd) +let iTypeCode = getWindowSubtypeCode (hwnd) +if iControl == ID_ListView_JAWSManager then + SayMessage (OT_USER_BUFFER, cmsgSetBrailleViewSSHList) +ElIf iTypeCode == WT_READONLYEDIT Then + SayMessage (OT_USER_BUFFER, cmsgSetBrailleViewSSHDesc) +ElIf iTypeCode == WT_BUTTON Then + if iControl == ID_SetBrailleView_Default + SayMessage (OT_USER_BUFFER, cmsgSetBrailleViewSSHDefault) + elif iControl == ID_SetBrailleView_SwapSplit + SayMessage (OT_USER_BUFFER, cmsgSetBrailleViewSSHSwap) + elif iControl == ID_SetBrailleView_Options + SayMessage (OT_USER_BUFFER, cmsgSetBrailleViewSSHOptions) + else + SayMessage (OT_USER_BUFFER, cmsgScreenSensitiveHelpButtonSpacebar_L) + EndIf +EndIf +AddHotKeyLinks () +endFunction + +void function ScreenSensitiveHelpForCameraRecognitionDialog(string dlgName) +var + handle hwnd, + int id +hwnd = getCurrentWindow () +id = GetControlID (hWnd) +;The main dialog: +if StringCompare(dlgName,cwn_OCR_CameraRecognition_DLG) == 0 + if id == ID_CameraRecognition_Camera_ComboBox + SayMessage(OT_USER_BUFFER, cmsg_CameraRecognition_Camera_ComboBox_ScreenSensitiveHelp) + elif id == ID_CameraRecognition_Light_ComboBox + SayMessage(OT_USER_BUFFER, cmsg_CameraRecognition_Light_ComboBox_ScreenSensitiveHelp) + elif id == ID_CameraRecognition_MotionDetectMultiPageRecognition_Checkbox + SayMessage(OT_USER_BUFFER, cmsg_CameraRecognition_MotionDetectMultiPageRecognition_Checkbox_ScreenSensitiveHelp) + elif id == ID_CameraRecognition_Timeout_Checkbox + SayMessage(OT_USER_BUFFER, cmsg_CameraRecognition_Timeout_Checkbox_ScreenSensitiveHelp) + elif id == id_ScannerRecognition_UseAutoDocumentFeed_CheckBox + SayMessage(OT_USER_BUFFER,cmsg_ScannerRecognition_UseAutoDocumentFeed_Checkbox_ScreenSensitiveHelp) + elif id == ID_CameraRecognition_AdvancedSettings_Button + SayMessage (OT_USER_BUFFER, cmsg_CameraRecognition_AdvancedSettings_Button_ScreenSensitiveHelp) + elif id == ID_CameraRecognition_Recognize_Button + SayMessage (OT_USER_BUFFER, cmsg_CameraRecognition_Recognize_Button_ScreenSensitiveHelp) + elif id == id_cancel + SayMessage (OT_USER_BUFFER, cmsg366_L) + EndIf +else ;In the advanced settings dialog: + if id == ID_CameraRecognition_LightingCorrection_ComboBox + SayMessage(OT_USER_BUFFER, cmsg_CameraRecognition_LightingCorrection_ComboBox_ScreenSensitiveHelp) + elif id == id_ScannerRecognition_FriendlyName_ReadOnlyEdit + SayMessage(OT_USER_BUFFER,cmsg_ScannerRecognition_AdvancedSettings_UserFriendlyName_ReadOnlyEdit_ScreenSensitiveHelp) + elif id == id_ScannerRecognition_InterruptCurrentScanWhenCancelingRecognition_CheckBox + SayMessage(OT_USER_BUFFER,cmsg_ScannerRecognition_AdvancedSettings_Interrupt_CheckBox_ScreenSensitiveHelp) + elif id == id_ScannerRecognition_ContrastAdjustmentUsesBrightness_CheckBox + SayMessage(OT_USER_BUFFER,cmsg_ScannerRecognition_AdvancedSettings_ContrastAdjustment_CheckBox_ScreenSensitiveHelp) + elif id == id_ScannerRecognition_CloseTWAINAfterEachScan_CheckBox + SayMessage(OT_USER_BUFFER,cmsg_ScannerRecognition_AdvancedSettings_CloseTwain_CheckBox_ScreenSensitiveHelp) + elif id == id_ScannerRecognition_UseDuplexScanMode_CheckBox + SayMessage(OT_USER_BUFFER,cmsg_ScannerRecognition_AdvancedSettings_UseDuplex_CheckBox_ScreenSensitiveHelp) + elif id == id_ok + SayMessage (OT_USER_BUFFER, cmsg365_L) + elif id == id_cancel + SayMessage (OT_USER_BUFFER, cmsg366_L) + endIf +endIf +SayMessage (OT_USER_BUFFER, cscBufferNewLine+cMsgBuffExit) +endFunction + +int function PlaceMarkerDialogActive() +var string sRealName = getWindowName (getRealWindow (getFocus ())) +if !inHjDialog () then Return FALSE endIf +return StringCompare(sRealName,cwn_PlaceMarker_List_dlg) == 0 + || StringCompare(sRealName,cwn_Add_PlaceMarker_dlg) == 0 + || StringCompare(sRealName,cwn_Change_PlaceMarker_dlg) == 0 + || StringCompare(sRealName,cwn_PlaceMarker_RemoveAll_Warning_dlg) == 0 +EndFunction + +void function ScreenSensitiveHelpForPlaceMarkerDialog() +var + handle hWnd = getCurrentWindow (), + int iCtrl = GetControlID(hWnd) +if iCtrl == id_PlaceMarker_ListView + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_ListView) +elif iCtrl == id_PlaceMarker_Add_Button + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_Add_Button) +elif iCtrl == id_PlaceMarker_MoveTo_Button + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_MoveTo_Button) +elif iCtrl == id_PlaceMarker_Change_Button + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_Change_Button) +elif iCtrl == id_PlaceMarker_Remove_Button + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_Remove_Button) +elif iCtrl == id_PlaceMarker_RemoveAll_Button + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_RemoveAll_Button) +elif iCtrl == id_PlaceMarker_DisplayFor_All_RadioButton +|| iCtrl == id_PlaceMarker_DisplayFor_Domain_RadioButton +|| iCtrl == id_PlaceMarker_DisplayFor_URL_RadioButton + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_DisplayFor_RadioButtons) +elif iCtrl == id_PlaceMarker_Name_Edit + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_Name_Edit) +elif iCtrl == id_PlaceMarker_DefineForAllPages_Checkbox + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_DefineForAllPages_Checkbox) +elif iCtrl == id_PlaceMarker_AnchorToText_Checkbox + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_AnchorToText_Checkbox) +elif iCtrl == id_PlaceMarker_AnchorText_Edit + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_AnchorText_Edit) +elif iCtrl == id_PlaceMarker_OK_Button + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelp_PlaceMarker_OK_Button) +endIf +ScreenSensitiveHelpForKnownClasses(getWindowSubtypeCode (hwnd)) +EndFunction + +void function ScreenSensitiveHelpForFlexibleWebDialog() +var + handle hwnd, + int iTypeCode, + int iControl +let hwnd = getCurrentWindow () +let iControl = GetControlID (hWnd) +let iTypeCode = getWindowSubtypeCode (hwnd) +if iTypecode == wt_RadioButton then + if iControl == id_FlexibleWeb_CreateNew_RadioButton + || iControl == id_FlexibleWeb_Retry_RadioButton + || iControl == id_FlexibleWeb_SaveTemporary_RadioButton + || iControl == id_FlexibleWeb_Undo_RadioButton + || iControl == id_FlexibleWeb_ViewOrChange_RadioButton then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebWhatWouldYouLikeToDoRadioButtons) + elif iControl == id_FlexibleWeb_HideElement_RadioButton + || iControl == id_FlexibleWeb_StartReadingAtElement_RadioButton then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebCreateRuleRadioButtons) + EndIf +elif iTypecode == wt_CheckBox then + if iControl == id_FlexibleWeb_Enable_CheckBox then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebEnableFlexibleWebCheckBox) + EndIf +elif iTypecode == wt_ListBox then + if iControl == id_FlexibleWeb_ElementsToCustomize_ListBox then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebCustomizeElementListBox) + elif iControl == id_FlexibleWeb_SelectCustomization_ListBox then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebSelectCustomizationListBox) + EndIf +elif iTypecode == wt_ListView then + if iControl == id_FlexibleWeb_Rules_CheckableListView then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebSaveCustomizationsCheckableListView) + elif iControl == id_FlexibleWeb_ViewOrChangeRules_ListView then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebViewOrChangeRulesList) + EndIf +elif iTypecode == wt_ComboBox then + if iControl == id_FlexibleWeb_ApplyThisRuleTo_ComboBox then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebSaveRuleAppliesToComboBox) + EndIf +elif iTypecode == wt_Treeview then + if iControl == id_FlexibleWeb_ViewOrChangeRules_Treeview then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebViewOrChangeRulesTreeview) + EndIf +elif iTypecode == wt_Edit then + if iControl == id_FlexibleWeb_RuleName_Edit then + return ShowScreenSensitiveHelp(cmsgScreenSensitiveHelpFlexibleWebSaveRuleNameEdit) + EndIf +EndIf +ScreenSensitiveHelpForKnownClasses(iTypecode) +EndFunction + +void function ScreenSensitiveHelpForLinksListDialog() +var + handle hWnd, + int iType, + int iCtrl, + string SName +let hWnd = GetCurrentWindow() +let iType = GetWindowSubTypeCode(hWnd) +if iType == WT_LISTVIEW then + SayMessage(ot_user_buffer,sshcmsg_LinksList_LinksList) +elif iType == WT_BUTTON then + let iCtrl = GetControlID(hWnd) + if iCtrl == iD_LinksList_MoveToLink then + SayMessage (ot_user_buffer,sshcmsg_LinksList_MoveToLinkButton) + elif iCtrl == ID_LinksList_ActivateLink then + SayMessage (ot_user_buffer,sshcmsg_LinksList_ActivateLinkButton) + elif iCtrl == ID_Cancel then + SayMessage (ot_user_buffer,sshcmsg_LinksList_CancelButton) + else + ScreenSensitiveHelpForKnownClasses (WT_BUTTON) + EndIf +elif iType == WT_RADIOBUTTON then + let sName = GetGroupBoxName() + if sName == scSortLinks then + SayMessage (ot_user_buffer,sshcmsg_LinksList_SortLinks) + elif sName == scDisplayLinks then + SayMessage(ot_user_buffer,sshcmsg_LinksList_DisplayLinks) + else + ScreenSensitiveHelpForKnownClasses (WT_RADIOBUTTON) + EndIf +else + ScreenSensitiveHelpForKnownClasses(iType) +EndIf +EndFunction + +void function ScreenSensitiveHelpForManageCallDialog() +var + handle hWnd = GetCurrentWindow(), + int iType = GetWindowSubTypeCode(hWnd), + int iCtrl, + string SName +if iType == WT_LISTVIEW + SayMessage(ot_user_buffer,sshcmsg_ManageCall_AppList) +elif iType == WT_BUTTON + iCtrl = GetControlID(hWnd) + if iCtrl == iD_ManageCall_AcceptWithAudio + || iCtrl == ID_Ok + SayMessage (ot_user_buffer,sshcmsg_ManageCall_AcceptWithAudioButton) + elif iCtrl == ID_ManageCall_AcceptWithVideo + SayMessage (ot_user_buffer,sshcmsg_ManageCall_AcceptWithVideoButton) + elif iCtrl == ID_ManageCall_Decline + SayMessage (ot_user_buffer,sshcmsg_ManageCall_DeclineButton) + elif iCtrl == ID_ManageCall_HangUp + SayMessage (ot_user_buffer,sshcmsg_ManageCall_HangUpButton) + elif iCtrl == ID_ManageCall_MakePrimary + SayMessage (ot_user_buffer,sshcmsg_ManageCall_MakePrimaryButton) + elif iCtrl == ID_Cancel + SayMessage (ot_user_buffer,sshcmsg_ManageCall_CancelButton) + else + ScreenSensitiveHelpForKnownClasses (WT_BUTTON) + EndIf +else + ScreenSensitiveHelpForKnownClasses(iType) +EndIf +EndFunction + +void function ShowScreenSensitiveHelp(string sHelpMsg_L,optional string sHelpMsg_S, int bOmitHotKeyLinks) +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +if sHelpMSG_S then + SayFormattedMessage(OT_USER_BUFFER,sHelpMsg_L,sHelpMSG_S) +else + SayFormattedMessage(OT_USER_BUFFER,sHelpMsg_L) +EndIf + +AddVisperoConnectedLink() + +if bOmitHotKeyLinks then + ;HotKeyLinks are usually omitted if other text will be appended to this help text. + return +EndIf +AddHotKeyLinks() +EndFunction + +void function ShowScreenSensitiveHelpForVirtualRibbon(optional int bIsUpperRibbon) +if bIsUpperRibbon then + ShowScreenSensitiveHelp( + FormatString(cmsgScreenSensitiveHelpForVirtualUpperRibbon, + cmsgScreenSensitiveHelpForVirtualRibbon_IntoParagraph, + cmsgScreenSensitiveHelpForVirtualRibbon_LegacyMode)) +else + ShowScreenSensitiveHelp( + FormatString(cmsgScreenSensitiveHelpForVirtualLowerRibbon, + cmsgScreenSensitiveHelpForVirtualRibbon_IntoParagraph, + cmsgScreenSensitiveHelpForVirtualRibbon_LegacyMode)) +EndIf +EndFunction + +int Function IsWinKeyHelp () +var + int iShouldHelp, + int iTypeCode, + handle hWnd, + string sClass +Let hWnd = GetCurrentWindow () +Let iTypeCode = GetWindowSubTypeCode (hWnd) +If iTypeCode == WT_TASKBAR || +iTypeCode == WT_DESKTOP || +GetWindowName (GetRealWindow (hWnd)) == cwn4 || ; Desktop RealName +iTypeCode == WT_STARTBUTTON || +iTypeCode == WT_STARTMENU || +iTypeCode == WT_SYSTRAY then + Let iShouldHelp = TRUE +Else + Let iShouldHelp = FALSE +EndIf +Return iShouldHelp +EndFunction + +Script WindowKeysHelp () +WindowKeysHelpDefault (Text_replaceUserBuffer) +EndScript + +; List of some basic Windows keyboard commands +Void Function WindowKeysHelpDefault (optional int addToBuffer) +If addToBuffer == Text_ReplaceUserBuffer Then ;0 + If UserBufferIsActive() then + UserBufferDeactivate() + EndIf + SayFormattedMessage (OT_USER_BUFFER, cmsgWindowKeysHelp1_L) + UserBufferAddText(cscBufferNewLine+cmsgBuffExit) +ElIf addToBuffer == Text_PrependToUserBuffer Then ;1 + If UserBufferIsActive() then + UserBufferDeactivate() + EndIf + SayFormattedMessage (OT_USER_BUFFER, cmsgWindowKeysHelp1_L) +ElIf addToBuffer == Text_InsertInUserBuffer Then ;2 + UserBufferAddText(cmsgWindowKeysHelp1_L) +ElIf addToBuffer == Text_AppendToUserBuffer Then ;3 + UserBufferAddText(cmsgWindowKeysHelp1_L) + UserBufferAddText(cscBufferNewLine+cmsgBuffExit) +EndIf +EndFunction + +Void Function CursorShapeChangedEvent (string CursorType) +let GlobalCursorType = CursorType +PerformScript SayCursorType () +EndFunction + +String Function ConvertCursorShape (string CursorType) +let GlobalCursorType = CursorType +If (GlobalCursorType == cscNormal) then + SayUsingVoice (VCTX_MESSAGE, cmsg97_L, ot_status) ;"Arrow Cursor" + Return +endIf +If (GlobalCursorType == cscEditCursor) then + SayUsingVoice (VCTX_MESSAGE, cmsg98_L, ot_status) ;"I beam cursor" + Return +endIf +If (GlobalCursorType ==cscWAIT) then + SayUsingVoice (VCTX_MESSAGE, cmsg99_L, ot_status) + Return +endIf +If (GlobalCursorType ==cscCROSS) then + SayUsingVoice (VCTX_MESSAGE, cmsg100_L, ot_status) ;"cross hair cursor" + Return +endIf +SayUsingVoice (VCTX_MESSAGE, GlobalCursorType, ot_status) ;"Cursor Changed" +EndFunction + +Script SayCursorType() +convertCursorShape(getCursorShape()) +EndScript + +String function HotKeyHelpDefaultLoopHelper (handle hwnd, int iBool) +var + handle hNull, + int WinTypeCode, + string sPrompt, + string sHotKey, + string sMessageLong, + string sMessageShort, + string strText, + int FoundHotKey +While (hwnd != hNull) + If (IsWindowVisible (hwnd)) then + let WinTypeCode = GetWindowSubTypeCode (hwnd) + If ((WinTypeCode == WT_BUTTON) || + (WinTypeCode == WT_STATIC) || + (WinTypeCode == WT_RADIOBUTTON) || + (WinTypeCode == WT_CHECKBOX) || + (WinTypeCode == WT_GROUPBOX) || + (WinTypeCode == WT_3STATE) || + (WinTypeCode == WT_TABCONTROL)) then + let sHotKey = GetHotKey (hwnd) + ;cscNull ="" + if (sHotKey != cscNull) then + if (FoundHotKey == 0) then + if (iBool == true) then + ;SayFormattedMessage (OT_USER_BUFFER, cmsg101_L) ;"Hot keys are as follows" + Let strText = FormatString (cmsg101_L, GetWindowName (GetRealWindow (GetFocus ())))+cScBufferNewLine + endIf + let FoundHotKey = 1 + endIf + let sPrompt = GetWindowTextEx (hwnd, false, false) + let strText = strText + FormatString (cmsgHotKeyDefaultHelpLoopPrompt1_L, sPrompt, sHotKey)+cScBufferNewLine + let sMessageShort = FormatString (cmsgHotKeyDefaultHelpLoopPrompt1_S, sPrompt, sHotKey) + ;SayFormattedMessage (OT_USER_BUFFER, sMessageLong) + endIf + endIf ; condition for static text or button + endIf ; Window visible + let hwnd = GetNextWindow (hwnd) +EndWhile +If (FoundHotKey == 0) then + ;SayFormattedMessage (OT_USER_BUFFER, cmsg198_L);"unable to determine hot keys in this dialog" + Let strText = strText + cmsg198_L +endIf +Return strText +EndFunction + +Void Function HotKeyHelpDefaultLoop () +var + handle hwnd, + handle hTemp, + int iSpeakIntro, + string strHotKeys +let hwnd = GetRealWindow (GetFocus ()) +let hwnd = GetFirstChild (hwnd) +let iSpeakIntro = true +Let strHotKeys = cScNull; +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +If (IsMultiPageDialog ()) then + let hTemp = GetFirstChild (hwnd) + Let strHotKeys = strHotKeys+ HotKeyHelpDefaultLoopHelper (hTemp, iSpeakIntro) + let iSpeakIntro = false +endIf +Let strHotKeys = strHotKeys + HotKeyHelpDefaultLoopHelper (hwnd, iSpeakIntro) +SayFormattedMessage (OT_USER_BUFFER, strHotKeys) +EndFunction + +Void Function GeneralJAWSHotKeys () +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +SayFormattedMessage (OT_USER_BUFFER, cmsgHotKeyHelp1_L, cmsgHotKeyHelp1_S) +EndFunction + +int Function JAWSHotKeys () +if TouchNavigationHotKeys() then + return true +endIf +if (IsSelectScriptDlg ()) then + If UserBufferIsActive () then + UserBufferDeactivate () + EndIf + SayFormattedMessage (OT_USER_BUFFER, cMsg207) + return TRUE +elif (IsSelectItemDlg ()) then + If UserBufferIsActive () then + UserBufferDeactivate () + EndIf + SayFormattedMessage (OT_USER_BUFFER, cmsg212) + return TRUE +endIf +return FALSE +EndFunction + +; Insert H help messages +Script HotKeyHelp() +if !JAWSHotKeys() then + GeneralJAWSHotKeys () +endIf +EndScript + +string function FindHotKey(optional string ByRef sPrompt) +var + int nChildID, + handle hWnd, + int iType, + string sHotKey, + int iPrefixLength +let hwnd = GetCurrentWindow () +if RibbonsActive() && ! IsVirtualRibbonActive() then + sHotKey = stringTrimLeadingBlanks (stringTrimTrailingBlanks (getCurrentObject(nChildID).accHotKey(nChildID))) + if ! stringIsBlank (sHotKey) then + return sHotKey + endIf + ; try accKeyboardShortcut. + ; This is for the BCGSoft lower ribbon. + sHotKey = stringTrimLeadingBlanks (stringTrimTrailingBlanks (GetHotKey())) + if ! stringIsBlank (sHotKey) then + return sHotKey + endIf +endIf +let sPrompt = cscNull +If GlobalMenuMode +&& !IsJavaWindow(hwnd) then + let sHotKey = GetHotKey() + if sHotKey then + let iPrefixLength = StringLength(cksAltPlusHotKeyPrefixWithSpaces) + if StringCompare(StringLeft(sHotKey,iPrefixLength),cksAltPlusHotKeyPrefixWithSpaces) == 0 then + let sHotKey = StringChopLeft(sHotKey,iPrefixLength) + else + let iPrefixLength = StringLength(cksAltPlusHotKeyPrefix) + if StringCompare(StringLeft(sHotKey,iPrefixLength),cksAltPlusHotKeyPrefix) == 0 then + let sHotKey = StringChopLeft(sHotKey,iPrefixLength) + EndIf + EndIf + elif (gbUseInferredAccessKeys) + let sHotKey = getCharacter() + EndIf + Return sHotKey +endIf +let iType = GetObjectSubtypeCode() +If iType == WT_EDITCOMBO +|| iType == wt_combobox +|| iType == wt_spinbox +|| iType == wt_edit +|| iType == wt_listbox +|| iType == wt_scrollbar +|| iType == wt_slider +|| iType == wt_listview +|| iType == wt_treeview +|| iType == wt_multiselect_listbox +|| iType == wt_extendedselect_listbox +|| iType == wt_leftrightslider +|| iType == wt_updownslider +|| iType == wt_passwordedit +|| iType == wt_readonlyedit +|| iType == wt_edit_spinbox +|| iType == WT_MULTILINE_EDIT then + let sHotKey = GetHotKey() + If sHotKey then + let sPrompt = GetWindowName (hwnd) + return sHotKey + EndIf + let hwnd = GetPriorWindow (hwnd) + let iType = GetWindowSubTypeCode (hwnd) + if iType == wt_static + || iType == WT_GROUPBOX then + let sHotKey = GetHotKey (hwnd) + let sPrompt = GetWindowTextEx (hwnd, false, false) + If !sHotKey then + let hwnd = GetPriorWindow (hwnd) + let iType = GetWindowSubTypeCode (hwnd) + if iType == WT_GROUPBOX then + let sHotKey = GetHotKey (hwnd) + endIf + endIf + endIf + if !sHotKey then + let sPrompt = cscNull + EndIf + return sHotKey +ElIf iType == WT_BUTTON +|| iType == WT_RADIOBUTTON +|| iType == WT_CHECKBOX +|| iType == WT_GROUPBOX +|| iType == WT_3STATE +|| iType == WT_MENUBAR +|| iType == WT_MENU +|| iType == WT_TABCONTROL then + let sHotKey = GetHotKey() + let sPrompt = GetWindowTextEx (hwnd, false, false) + If !sHotKey then + if ! StringIsBlank (getGroupBoxName ()) then + While (hwnd && getWindowSubtypeCode (hwnd) != WT_GROUPBOX) + Let hwnd = getPriorWindow (hwnd) + endWhile + Let sHotKey = getHotKey (hwnd) + else + let hwnd = GetPriorWindow (hwnd) + let iType = GetWindowSubTypeCode (hwnd) + endIf + if iType == WT_GROUPBOX then + let sHotKey = GetHotKey (hwnd) + endIf + endIf + if !sHotKey then + let sPrompt = cscNull + EndIf + return sHotKey +endIf +return sHotKey +EndFunction + +Script SayCurrentAccessKey() +var + string sHotKey, + string sPrompt +let sHotKey = FindHotKey(sPrompt) +if sHotKey then + SayMessage(ot_help, + FormatString (cmsgHotKeyDefaultHelpLoopPrompt1_L, sPrompt, sHotKey), + FormatString (cmsgHotKeyDefaultHelpLoopPrompt1_S, sPrompt, sHotKey)) +else + Say(cmsg124_L,ot_error) ;"no hot key" +EndIf +EndScript + +Void Function MoveToFirstSdmControl () +var + int SDMControl, + handle winhandle +let winhandle = GetRealWindow (GetFocus()) +let SDMControl = SDMGetFirstControl (winhandle) +MoveToControl (winhandle, SDMControl) +let GlobalSDMControl = SDMControl +EndFunction + +Void Function MoveToNextSdmControl () +var + int SDMControl, + handle winhandle +let winhandle = GetRealWindow (GetFocus()) +let SDMControl = SDMGetNextControl (GetCurrentWindow(), GlobalSDMControl) +MoveToControl (GetCurrentWindow(), SDMControl) +let GlobalSDMControl = SDMControl +EndFunction + +;Copyright 1996-2017 by Freedom Scientific BLV Group, LLC + +;default Script file for desk tops +; 2/12/95, added SDM windows, focus change & insert+f1 Scripts. +; 4/27, added PassKeyThrough +; & separated to use include file. +; added hjglobal.jmh header file +;and new Focus Change,8/8/95, th. + + +Script ScriptFileName() +ScriptAndAppNames(cmsg238_L) ;"default" +EndScript + +string function GetActiveCursorRestrictionName(int MessageLengthType) +var + int nRestriction +let nRestriction = GetRestriction() +if nRestriction == RestrictAppWindow +|| nRestriction == RestrictAppElement + if MessageLengthType == message_short then + return cmsg315_S + EndIf + return cmsg315_L +elif nRestriction == RestrictRealWindow then + if MessageLengthType == message_short then + return cMSG316_S + EndIf + return cMSG316_L +elif nRestriction == RestrictWindow then + if MessageLengthType == message_short then + return cMSG317_S + EndIf + return cMSG317_L +elif nRestriction == RestrictFocusWindow then + if MessageLengthType == message_short then + return cmsgRestrictFocusWindow_S + EndIf + return cmsgRestrictFocusWindow_L +elif nRestriction == RestrictNone then + return cmsg318_L +elif nRestriction == RestrictRect then + if MessageLengthType == message_short then + return cMSG319_S + EndIf + return cMSG319_L +elif nRestriction == RestrictContainerElement + if MessageLengthType == message_short then + return cmsgContainerRestriction_S + EndIf + return cmsgContainerRestriction_L +elif nRestriction == RestrictElement + if MessageLengthType == message_short then + return cmsgElementRestriction_S + EndIf + return cmsgElementRestriction_L +endIf +return cscNull +EndFunction + +void function SayRestrictionName(int nRestriction) +if nRestriction == RestrictAppWindow +|| nRestriction == RestrictAppElement + SayMessage (OT_status, cmsg315_L, cmsg315_S) ;Application window restriction +elif nRestriction == RestrictRealWindow + SayMessage (OT_status, cMSG316_L, cMSG316_S) ;"Real window restriction" +elif nRestriction == RestrictWindow + SayMessage (OT_status, cmsg317_L, cmsg317_S) ;"Current window restriction" +elif nRestriction == RestrictFocusWindow + SayMessage (OT_status, cmsgRestrictFocusWindow_L, cmsgRestrictFocusWindow_S) +elif nRestriction == RestrictNone + SayMessage (OT_status, cmsg318_L) ;"unrestricted" +elif nRestriction == RestrictRect + SayMessage (OT_status, cmsg319_L, cmsg319_S) ;"Frame restriction" +elif nRestriction == RestrictContainerElement + SayMessage (OT_status, cmsgContainerRestriction_L, cmsgContainerRestriction_S) ;"Frame restriction" +elif nRestriction == RestrictElement + SayMessage (OT_status, cmsgElementRestriction_L, cmsgElementRestriction_S) ;"Frame restriction" +endIf +EndFunction + +string function GetButtonLockedNotification(int messageLengthType) +var + string sMsg +if IsLeftButtonDown() then + if MessageLengthType == message_short then + let sMsg = cmsgLeftMouseButtonIsLocked_S + else + let sMsg = cmsgLeftMouseButtonIsLocked_L + EndIf +endIf +If IsRightButtonDown() then + if sMsg then + let sMsg = sMsg+cScBufferNewLine + endIf + if MessageLengthType == message_short then + let sMsg = sMsg+cmsgRightMouseButtonLocked_S + else + let sMsg = sMsg+cmsgRightMouseButtonLocked_L + EndIf +endIf +if sMsg then + let sMsg = sMsg+cScBufferNewLine +endIf +return sMsg +EndFunction + +void function SayObjectNavigationCursor() +var + int nRow, + int nCol, + int nPercent, + string sPercent +BeginFlashMessage() +if IsTouchCursor() then + sayMessage(OT_USER_REQUESTED_INFORMATION,cmsgTouchCursor_L,cmsgTouchCursor_L) + if IsAdvancedObjectNavigationModeActive() then + sayMessage(OT_USER_REQUESTED_INFORMATION,cmsgAdvancedObjectNavigationOn_L,cmsgAdvancedObjectNavigationOn_L) + EndIf + UIAGetPoint(nCol,nRow) + sayMessage(OT_USER_REQUESTED_INFORMATION, + FormatString(cmsgTouchElementClickablePoint, + IntToString(nCol),IntToString(nRow))) +elif IsObjectTextReviewModeActive() then + sayMessage(OT_USER_REQUESTED_INFORMATION,cmsgTouchTextReviewActive,cmsgTouchTextReviewActive) + let nRow = getCursorRow() + let nCol = GetCursorCol() + let nPercent = GetDocumentPercentage() + if nPercent >= 0 then + let sPercent = FormatString(cmsgDocumentPercentage,intToString(nPercent)) + endIf + sayMessage(OT_USER_REQUESTED_INFORMATION, + FormatString(cmsgTouchTextReviewCursorPosition, + IntToString(nCol), IntToString(nRow), sPercent)) +EndIf +EndFlashMessage() +EndFunction + +int function GetDocumentRowAndColumnForSayActiveCursor(int byRef nRow, int byRef nCol) +var + string sTitle, + string SPageName, + string sPageNumber, + string sTotalPages, + string sLineNumber, + string sCharacterPosition, + string sColumnNumber, + string sTotalColumns +if !GetDocumentProperties(sTitle, sPageName, + sPageNumber, sTotalPages, sLineNumber, + sCharacterPosition, sColumnNumber, sTotalColumns ) + return false +endIf +if !sLineNumber + sLineNumber = "1" +EndIf +nRow = StringToInt (sLineNumber) +nCol = StringToInt (sCharacterPosition) +return true +EndFunction + +string function GetDesiredCursorNameForScriptSayActiveCursor(string sActiveCursorName, int bWantExtendedInformation, int bIsAceOrFSDomEditArea, int isSmartNavActive) +if IsJawsUIACursor() + return cmsgJawsScanCursor_L +elif IsInvisibleUIACursor() + return cmsgInvisibleScanCursor_L +EndIf +if !bIsAceOrFSDomEditArea + return sActiveCursorName +endIf +if !bWantExtendedInformation + if IsFormsModeActive() + return FormatString(cmsgFormsModeCursorInfo,cmsgPCCursorActive) + ElIf sActiveCursorName == "FSDom Edit2 cursor" + return cmsg9_l ;PC Cursor + elif !isSmartNavActive + return cmsgVirtualPCCursorActive + else ;smart mode level will be announced, do not include cursor name: + return cscNull + EndIf +else ;Comment out this else block if you want the real internal name reported for the Ace cursor on double tap. + ;Here we are not allowing the real internal name to be reported for the Ace cursor: + if StringStartsWith(sActiveCursorName ,cscAceCursorName) + if IsFormsModeActive() + return FormatString(cmsgFormsModeCursorInfo,cmsgPCCursorActive) + else + return cmsgVirtualPCCursorActive + endIf + endIf +EndIf +return sActiveCursorName +EndFunction + +Script SayActiveCursor() +if IsObjectNavigationActive() then + SayObjectNavigationCursor() + return +endIf +var + string sMessageShort, + string sMessageLong +sMessageLong = GetButtonLockedNotification(message_long) +sMessageShort = GetButtonLockedNotification(message_short) +var + string sRestrictionLong, + string sRestrictionShort +if IsJAWSCursor() +|| IsInvisibleCursor() then + sRestrictionLong = GetActiveCursorRestrictionName(message_long) + sRestrictionShort = GetActiveCursorRestrictionName(message_short) +endIf +var + int nPercent, + string sPercent +if !IsFormsModeActive() then + nPercent = GetDocumentPercentage() + if nPercent >= 0 then + sPercent = FormatString(cmsgDocumentPercentage,intToString(nPercent)) + endIf +EndIf +var + string sActiveCursorName, + string sDesiredCursorName, + int bWantExtendedInformation, + int bIsAceOrFSDomEditArea, + int bSmartNavActive +sActiveCursorName = GetActiveCursorName() +bIsAceOrFSDomEditArea = + (StringContains(sActiveCursorName,cscFSDomCursorName) + || StringStartsWith(sActiveCursorName ,cscAceCursorName)) +bSmartNavActive = IsSmartNavActive() +bWantExtendedInformation = IsSameScript() +sDesiredCursorName = GetDesiredCursorNameForScriptSayActiveCursor(sActiveCursorName, bWantExtendedInformation, bIsAceOrFSDomEditArea, bSmartNavActive) +var + int nRow, + int nCol +nRow = getCursorRow() +nCol = GetCursorCol() +if IsUIAReviewCursor() + var string sRect + if bWantExtendedInformation + sRect = FormatString(cmsgRect, "x1", "y1", "x2", "y2") + endIf + sMessageShort = sMessageShort + +FormatString(cmsgActiveUIAReviewCursorInfo, + sDesiredCursorName, + intToString(nCol), + intToString(nRow), + sRestrictionShort, + sRect) + sMessageLong = sMessageLong + +FormatString(cmsgActiveUIAReviewCursorInfo, + sDesiredCursorName, + intToString(nCol), + intToString(nRow), + sRestrictionLong, + sRect) + if bWantExtendedInformation + EnsureNoUserBufferActive() + if ShouldItemSpeak(ot_user_buffer) == message_short + UserBufferAddText(sMessageShort) + else + UserBufferAddText(sMessageLong) + endIf + UserBufferActivate() + JAWSTopOfFile() + SayAll() + else + sayMessage(OT_USER_REQUESTED_INFORMATION,sMessageLong,sMessageShort) + endIf + return +endIf +var + string insideApplicationRegion +if bIsAceOrFSDomEditArea +&& !bWantExtendedInformation + GetDocumentRowAndColumnForSayActiveCursor(nRow,nCol) + if (IsInsideARIAApplication ()) then + insideApplicationRegion = cmsgInsideApplicationRegion + EndIf +EndIf +sMessageLong = sMessageLong + +formatString(cmsgActiveCursorInfo_L, + sDesiredCursorName, + intToString(nCol), + intToString(nRow), + sRestrictionLong, + sPercent) + +insideApplicationRegion +sMessageShort = sMessageShort + +formatString(cmsgActiveCursorInfo_S, + sDesiredCursorName, + intToString(nCol), + intToString(nRow), + sRestrictionShort, + sPercent) + +insideApplicationRegion +; Indicate if Background OCR is enabled for this cursor at the moment. +if IsBackgroundOCREnabled() then + sMessageLong = sMessageLong + cScBufferNewLine + sMessageLong= sMessageLong + cmsgBackgroundOCRInProgress_L + sMessageShort = sMessageShort + cScBufferNewLine + sMessageShort = sMessageShort + cmsgBackgroundOCRInProgress_S +endIf + +BeginFlashMessage () +if bSmartNavActive +&& ! IsSameScript () then + speakSmartNavLevelSetting() +endIf +sayMessage(OT_USER_REQUESTED_INFORMATION,sMessageLong,sMessageShort) +EndFlashMessage () +EndScript + +Script TetherJAWSToPC () +var + int iTetherOption, + int iNewChoice +let iTetherOption = GetDefaultJCFOption (OPT_TETHER_JAWS_TO_PC) +If iTetherOption == 0 then + let iNewChoice = (iTetherOption + 1) +Else + let iNewChoice = 0 +endIf +SetDefaultJCFOption ( OPT_TETHER_JAWS_TO_PC, iNewChoice) +If (iNewChoice == 0) then + SayFormattedMessage (OT_STATUS, cmsgNoFollowPC1_L, cmsgNoFollowPC1_S); "The JAWS cursor will not follow the PC Cursor" +Else + SayFormattedMessage (OT_STATUS, cmsgFollowPC1_L, cmsgFollowPC1_S); "The JAWS cursor will follow the PC Cursor" +endIf +If (IsSameScript ()) then + ; Make sure the setting the user last heard got saved + ; Thus letting the reset logic process first + If (! IniWriteInteger (SECTION_OPTIONS, hKEY_TETHER, iNewChoice, DefaultJCFFile)) then + SayFormattedMessage (OT_ERROR, cmsgSettingError1_L, cmsgSettingError1_S); "Error saving setting\bJAWS will not remember this setting next time you restart" + Return + endIf + SayFormattedMessage (OT_JAWS_MESSAGE, cmsgSettingSaved1_L, cmsgSettingSaved1_S); "JAWS will remember this setting until you decide to re save it" + Return +endIf +EndScript + +Script RouteJAWSCursorToPc() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +If UserBufferIsActive () then + SayFormattedMessage (ot_status, cmsgVirtualViewer) + Return +EndIf +if IsInvisibleCursor () + RouteInvisibleToPc () + BrailleRefresh () + if IsInvisibleUIACursor() + SayFormattedMessage (OT_STATUS, cmsgRouteInvisibleScanToPC_L, cmsgRouteInvisibleScanToPC_S) + else + SayFormattedMessage (OT_STATUS, cmsg146_L, cmsg146_S) ;"Route invisible to p c" + endIf + return +endIf +RouteJAWSToPc () +JAWSCursor (true) +BrailleRefresh () +if IsVirtualPCCursor () + if IsJawsUIACursor() + SayFormattedMessage (OT_STATUS, cmsgRouteJAWSScanToVirtualPC_L, cmsgRouteJAWSScanToVirtualPC_S) + else + SayFormattedMessage (OT_STATUS, cMSG289_L, cMSG289_S) + endIf +else + if IsJawsUIACursor() + SayFormattedMessage (OT_STATUS, cmsgRouteJAWSScanToPC_L, cmsgRouteJAWSScanToPC_S) + else + SayFormattedMessage (OT_STATUS, cmsg147_L, cmsg147_S) ;"Route JAWS to p c" + endIf +endIf +EndScript + +script RouteMouseToCursor() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +JAWSCursor() +RouteJAWSToPc() +PCCursor() +SayMessage(OT_STATUS,cmsgMouseToCursor_L,cmsgMouseToCursor_S) +EndScript + +Script RoutePCCursorToJAWS() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +if IsVirtualPCCursor () then + If UserBufferIsActive () then + SayFormattedMessage (ot_status, cmsgVirtualViewer) + Return + EndIf + RoutePcToJAWS() + BrailleRefresh () + SayFormattedMessage(ot_status,cmsgVirtualToJAWS_l,cmsgVirtualToJAWS_s) ;"Route p c to JAWS" + return +endIf +if IsInvisibleCursor () then + RoutePCToInvisible () + BrailleRefresh () + SayFormattedMessage (ot_status, cmsg149_L, cmsg149_S) ;"Route p c to invisible" +else + RoutePcToJAWS() + BrailleRefresh () + SayFormattedMessage (ot_status, cmsg148_L, cmsg148_S) ;"Route p c to JAWS" +endIf +PCCursor() +EndScript + +script RouteCursorToMouse() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +if IsVirtualPCCursor() then + RouteVirtualToMouse () +else + JAWSCursor () + RoutePCToJaws() + PCCursor() + PCCursor() +endIf +SayMessage(ot_status,cmsgCursorToMouse_L,cmsgCursorToMouse_S) +EndScript + +int Function ClickLastAlert () +var + int bJAWSCursor, + int bClicked +If (! ghwndToolTip || +! IsWindowVisible (ghwndToolTip)) then + Return bClicked; +EndIf +Let bJAWSCursor = IsJAWSCursor () +SaveCursor () +If ! bJAWSCursor then + JAWSCursor () + ;Keep existing JAWSCursor location. + SaveCursor () +EndIf +MoveToWindow (ghwndToolTip) +If (ghwndToolTip == GetWindowAtPoint(GetCursorCol(),GetCursorRow())) then + LeftMouseButton () + Let bClicked = TrUe +EndIf +RestoreCursor () +If ! bJAWSCursor then + RestoreCursor (); If was not JAWSCursor to start, + ;first restore put JAWSCursor / mouse back where it belonged. + ;This restore turns the PC or Invisible Cursor back on. +EndIf +Return bClicked; +EndFunction + +script LeftMouseButton() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +SayMessage(ot_status,cmsg150_L,cmsg150_s) +If ClickLastAlert () then + Return +EndIf +LeftMouseButton() +EndScript + +Script UtilityLeftMouseButton() +PerformScript LeftMouseButton() +EndScript + +script RightMouseButton() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +SayFormattedMessage (ot_status, cmsg151_L, cmsg151_S) ;"right mouse button" +RightMouseButton() +EndScript + +; toggle the pressed/released state of the left mouse button +script LeftMouseButtonLock() +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +if LeftMouseButtonLock () then + SayFormattedMessage (ot_status, cmsg152_L, cmsg152_S) ;"left button locked" +else + SayFormattedMessage (ot_status, cmsg153_L, cmsg153_S) ;"Left button unlocked" +endIf +EndScript + +Globals + collection c_DragAndDropSource, + collection c_DragAndDropDest + ; Members are: + ; x -- The X coordinate of the drag location + ; y -- The Y coordinate of the drag location + ; text -- The text at the drag location, probably obtained via GetWord if using OSM, or UIA name if using UIA + ; element -- If UIA is being used, The object at the drag location + +void function GetDragAndDropCollectionData(collection dragItem) +var int x, int y +if IsObjectNavigationActive() + ;use the touch cursor object and its clickable point if it has one: + UIAGetPoint(x,Y) + dragItem.element = TouchCursorObject() +elif isWindows8() + ;We cannot depend on having an OSM, + ;so use the UIA focus object: + var object element = CreateUIAFocusElement(true) + element.GetClickablePoint(intRef(x),intRef(y)) + dragItem.element = element +endIf +if X && Y + ;the UIA element had a clickable point: + dragItem.x = x + dragItem.y = y + dragItem.text = dragItem.element.name + return +endIf +;either the touch cursor is not active, +;or a UIA point was not retrieved, +;so try to get the OSM cursor location: +dragItem.element = Null() +dragItem.x = getCursorCol () +dragItem.y = getCursorRow () +dragItem.text = GetWord () +EndFunction + +int function DoSetUpSourceForDragAndDrop() +if (c_DragAndDropSource.x) return false endIf +if (!c_DragAndDropSource) c_DragAndDropSource = new collection endIf +DragAndDropClearValues () +GetDragAndDropCollectionData(c_DragAndDropSource) +var string sMessage = FormatString (cmsgSettingUpForDragAndDrop_L, GetCurrentScriptKeyName ()) +SayFormattedMessage (ot_JAWS_message, sMessage, cmsg170_S) +return true +EndFunction + +int function IsReadyToDragSourceToTarget() +if c_DragAndDropSource.element +&& c_DragAndDropDest.element + ;The touch cursor was used for setting both source and destination, + ;so make sure that source and destination are different elements, + ;and that the source is still at the original location: + return !CompareUIAElements(c_DragAndDropSource.element,c_DragAndDropDest.element) + && CompareUIAElements(GetUIAElementAtPoint(c_DragAndDropSource.x,c_DragAndDropSource.y),c_DragAndDropSource.element) +elif c_DragAndDropSource.element + ;The touch cursor was used to set the source but not the destination, + ;so make sure that the destination location is not at the source element, + ;and that the source is still at the original location: + return !CompareUIAElements(c_DragAndDropSource.element,GetUIAElementAtPoint(c_DragAndDropDest.x,c_DragAndDropDest.y)) + && CompareUIAElements(GetUIAElementAtPoint(c_DragAndDropSource.x,c_DragAndDropSource.y),c_DragAndDropSource.element) +elif c_DragAndDropDest.element + ;The touch cursor was used to set the destination but not the source, + return !CompareUIAElements(GetUIAElementAtPoint(c_DragAndDropSource.x,c_DragAndDropSource.y),c_DragAndDropDest.element) +endIf +;OSM was used, or touch cursor was used but failed to get any element at point: +var string strObject = GetWord() +return strObject + && strObject == c_DragAndDropSource.text +EndFunction + +Script DragAndDrop() +if DoSetUpSourceForDragAndDrop() return endIf +if !c_DragAndDropDest c_DragAndDropDest = new collection endIf +GetDragAndDropCollectionData(c_DragAndDropDest) +SaveCursor () +JAWSCursor () +; make sure that the left mouse button is unlocked +If IsLeftButtonDown () + LeftMouseButtonLock () + pause () +endIf +MoveTo (c_DragAndDropSource.x, c_DragAndDropSource.y) +Pause () +if !IsReadyToDragSourceToTarget() + DragAndDropClearValues () + SayFormattedMessage (ot_error, cmsg171_L, cmsg171_S) ; "Object to be dragged not found" + return +endIf +LeftMouseButtonLock () ; lock it down +pause () +MoveTo(c_DragAndDropDest.x,c_DragAndDropDest.y) +Pause () +;cmsg172_L = "dragging " +var string sMessage = FormatString (cmsg172_L, c_DragAndDropSource.Text, c_DragAndDropDest.Text) +SayFormattedMessage (ot_JAWS_message, sMessage); dragging x to y +LeftMouseButtonLock () +RestoreCursor () +DragAndDropClearValues() +EndScript + +void Function DragAndDropClearValues () +CollectionRemoveAll(c_DragAndDropSource) +CollectionRemoveAll(c_DragAndDropDest) +EndFunction + +; toggle the pressed/released state of the right mouse button +Script RightMouseButtonLock () +if IsObjectNavigationActive() then + NotifyNotAvailableForTouchCursor() + return +EndIf +if RightMouseButtonLock () then + SayFormattedMessage (ot_status, cmsg154_L, cmsg154_S) ;"right button locked" +else + SayFormattedMessage (ot_status, cmsg155_L, cmsg155_S) ;"right button unlocked" +endIf +EndScript + +Script SayTopLineOfWindow() +var + int iVPC +Let iVPC = GetJcfOption (OPT_VIRTUAL_PC_CURSOR) +If IsVirtualPcCursor () then + If UserBufferIsActive () then + SayFormattedMessage (ot_user_requested_information, cmsgVirtualViewer) + Return + EndIf +EndIf +SaveCursor() +InvisibleCursor() +MoveToWindow (GetFocus ()) +JAWSPageUp() +Say (GetLine(), ot_user_requested_information);Ignore all attributes and font +RestoreCursor() +EndScript + +string function GetBottomLineOfWindow() +var + handle hWnd, + string sWindowText, + int iLeft, + int iTop, + int iRight, + int iBottom, + int iLast +if DialogActive() then + let hWnd = GetRealWindow(GetFocus()) +else + let hWnd = GetAppMainWindow(GetFocus()) +EndIf +GetWindowRect(hWnd,iLeft,iRight,iTop,iBottom) +let sWindowText = GetTextInRect(iLeft,iTop,iRight,iBottom,0,IgnoreColor,IgnoreColor,1,0) +if !sWindowText return cscNull endIf +let iLast = StringSegmentCount(sWindowText,"\n") +return StringSegment(sWindowText,"\n",iLast) +EndFunction + +object function FindStatusBarUIAElement() +var object element = FSUIAGetElementFromHandle(GetForegroundWindow()) +if !element return Null() endIf +var object condition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyId,UIA_StatusBarControlTypeId) +if !condition return Null() endIf +return element.FindFirst(TreeScope_Descendants,condition) +endFunction + +string function GetStatusBarTextFromUIA () +var object statusBar = FindStatusBarUIAElement() +if !statusBar return cscNull endIf +var object element = FSUIAGetFirstChildOfElement(statusBar) +if !element return cscNull endIf +var string text, string name +while element + if element.controltype == UIA_TextControlTypeID + && element.name + if text text = text+cscSpace endIf + name = element.name + text = text+name + endIf + element = FSUIAGetNextSiblingOfElement(element) +endWhile +return text +endFunction + +script SayBottomLineOfWindow() +var string sText +if IsMetroApp() +|| IsWPFApplication() + sText = GetStatusBarTextFromUIA () +else + sText = GetBottomLineOfWindow() +endIf +if sText + Say(sText,ot_user_requested_information) +endIf +EndScript + +Script SayToCursor() +SetDocumentReadingStartLocation () +If IsSameScript () then + SpellToCursor () + Return +EndIf +SayToCursor() +EndScript + +script SayFromCursor() +SetDocumentReadingStartLocation () +If IsSameScript () then + SpellFromCursor () + Return +EndIf +SayFromCursor() +EndScript + +void Function SayLastTipFromEvent () +If ghwndToolTip && IsWindowVisible (ghwndToolTip) then + SayMessage (OT_USER_REQUESTED_INFORMATION, gStrLastTipFromEvent) +EndIf +EndFunction + +int function IsTextAnalysisValid() +;Add condition where window subtype code is actually single-line where objects are multiline: +;This should fix dialogs and email header fields. +if getWindowSubtypeCode (getFocus ()) == WT_EDIT + return FALSE; text analysis on single-lines is generally invalid. +endIf +return (GetObjectSubtypeCode() == wt_multiline_edit + || GetWindowSubtypeCode(GetFocus()) == wt_multiline_edit) + && !InHJDialog() +EndFunction + +void function AnalyzeTextLine() +var + int iSavedSetting +if !(GetRunningFSProducts() & product_JAWS) +|| !IsTextAnalysisValid() then + return +EndIf +let iSavedSetting = GetJCFOption(OPT_TEXT_ANALYSER) +SetJCFOption(OPT_TEXT_ANALYSER,TextAnalyserDescribeAllInconsistencies) +PerformScript IndicateInconsistenciesForLine() +SetJCFOption(OPT_TEXT_ANALYSER,iSavedSetting) +EndFunction + +void function SayFolderLocationForDialog () +if ! dialogActive () then return endIf +var object element = FSUIAGetElementFromHandle (getRealWindow (getFocus ())) +if ! element then return endIf +var object ControlTypeCondition = FSUIACreateIntPropertyCondition (UIA_ControlTypePropertyId, UIA_ToolBarControlTypeId) +var object AutomationIDCondition = FSUIACreateStringPropertyCondition (UIA_AutomationIDPropertyId, "1001") +var object searchCriteria = FSUIACreateAndCondition (ControlTypeCondition, AutomationIDCondition) +element = element.findFirst (TreeScope_Subtree, searchCriteria) +if ! element then return endIf +sayUsingVoice (vctx_message, element.name, OT_USER_REQUESTED_INFORMATION) +endFunction + +void function SayWindowPromptAndTextPostProcess(handle hWnd, int iSubtype, int nTrainingMode, optional int ProcessFlags) +smmToggleTrainingMode(nTrainingMode) +if dialogActive () then +; open or Save As dialogs will read the toolbar describing location + SayFolderLocationForDialog () +endIf +if ProcessFlags & SayWindowPromptAndText_TutorialHelp then + SayTutorialHelp(GetSubtypeCodeForTutorialHelp(hWnd), TRUE) + SayTutorialHelpHotKey(hWnd,TRUE) +EndIf +if ProcessFlags & SayWindowPromptAndText_IndicateComputerBraille then + IndicateComputerBraille(hwnd) +EndIf +if ProcessFlags & SayWindowPromptAndText_AnalyzeTextLine then + AnalyzeTextLine() +EndIf +if ProcessFlags & SayWindowPromptAndText_SayLastTipFromEvent then + SayLastTipFromEvent() +EndIf +if ProcessFlagS & SayWindowPromptAndText_SpeakProgressBarInfo then + SpeakProgressBarInfo(TRUE) +EndIf +EndFunction + +void function SayParentGroupboxForWindowPromptAndText() +if GetObjectSubTypeCode(FALSE,1) == WT_GROUPBOX then + if !(GetObjectSubTypeCode() == WT_GROUPBOX + && StringContains(GetObjectName(),GetObjectName(false,1))) then + SayObjectTypeAndText (1) + EndIf +EndIf +EndFunction + +Script SayWindowPromptAndText() +var + handle hWnd, + int iSubType, + int nMode +if handleNoCurrentWindow() then + return +endIf +Let hWnd = GetCurrentWindow () +Let iSubType = GetWindowSubTypeCode (hWnd) +If !iSubType then + Let iSubType = GetObjectSubTypeCode () +EndIf +If UserBufferIsActive () then + If !iSubType then + SayFormattedMessage (ot_user_requested_information, cmsgVirtualViewer) + Return + EndIf +EndIf +let nMode = smmTrainingModeActive() +smmToggleTrainingMode(TRUE) +;Any code in HandleCustomWindows should make both +;SayFocusedWindow and insert tab speak consistently. +If HandleCustomWindows (hWnd) then + SayWindowPromptAndTextPostProcess(hWnd, iSubtype, nMode, SayWindowPromptAndText_AllProcesses) + Return +EndIf +If IsVirtualPCCursor() +&& !IsJavaWindow(hWnd) then + PerformScript VirtualSayWindowPromptAndText () + SayWindowPromptAndTextPostProcess(hWnd, iSubtype, nMode, SayWindowPromptAndText_SayLastTipFromEvent) + Return +EndIf +If GlobalMenuMode +&& IsWinVista() +&& gstrListViewGroupName +&& iSubType == WT_LISTVIEW then + ;Customize List Views, + ;Windows Vista Start Menu: + SayMessage (OT_CONTROL_TYPE, cmsg4_L);Start menu. + SayMessage (OT_CONTROL_NAME, GetObjectName ()) + SayMessage (OT_SCREEN_MESSAGE, FormatString (cmsgListGroupName, gstrListViewGroupName)) + SayMessage (OT_POSITION, PositionInGroup ()) + SayWindowPromptAndTextPostProcess(hWnd, iSubtype, nMode, + SayWindowPromptAndText_TutorialHelp | SayWindowPromptAndText_SpeakProgressBarInfo) + Return +EndIf +SayParentGroupboxForWindowPromptAndText() +if ( GetObjectSubTypeCode(SOURCE_CACHED_DATA) == wt_groupbox +&& GetObjectSubTypeCode(SOURCE_CACHED_DATA, 1 ) == wt_listview ) + SayControlEx( 0, GetObjectName(SOURCE_CACHED_DATA), cmsgGrouping ); + return; +EndIf +SayObjectTypeAndText () +SayWindowPromptAndTextPostProcess(hWnd, iSubtype, nMode, SayWindowPromptAndText_AllProcesses) +EndScript + +void Function Unknown (string TheName, int IsScript, optional int IsDueToRecursion) +var + string sCallStack +if StringIsBlank (TheName) then return endIf +if IsDueToRecursion return endIf +if (HandleDeprecatedFunction(TheName)) then + return +EndIf +TheName = StringLower (TheName) +If StringContains(TheName,"willoverwriteclipboard") != 0 +|| StringContains(TheName,"pointneedsmarking") != 0 +|| StringContains(TheName, "magsetfocus") != 0 +|| StringContains(TheName, "getlinerect") != 0 +|| StringContains(theName,"brailleaddobject") != 0 +|| StringContains(TheName,"wdapp_") != 0 +;in MAGic if trying to launch QuickSettings dialog right after closing, +;but the dialog has not yet gone away, press very quickly to make happen. +|| stringContains(TheName, "adjustmagicoptions") != 0 +|| stringContains(TheName, "quicksettings") !=0 +|| StringContains(TheName,cfn_establishquicknavstate)!=0 ;When some apps, like MS Word, gains focus you may get unknown function due to timing +|| StringContains(TheName, "postcomment") != 0 +|| StringContains(TheName, "listcolumn") != 0 +|| StringContains(TheName, "listrow") != 0 +|| StringContains(TheName, "frameloadedevent") != 0 +|| StringContains(TheName, "checkforskypealerts") > 0 +|| StringContains(TheName, "destroyoldskypealerts") > 0 +|| StringContains(TheName, "ismessageslist") != 0 +|| StringContains(TheName,"clearfocuschangemenuglobals") +|| StringContains(TheName, "getdocumenttitle") + return +endIf +;unknown function call notification suppression should be done for debug purposes only: +if IsSuppressingUnknownFunctionCallNotification() then + return +EndIf +;only save the names of function we haven't planned for: +SaveLastUnknownFunctionName(TheName,IsScript) +if IsScript +&& (InHJDialog() +|| GetAppFileName()=="JFW.exe") then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) +elIf ShouldShowUnknownFunctionCallStack() +&& TheName > cScNull then + let sCallStack = GetScriptCallStack() + UserBufferDeactivate() + UserBufferClear() + if IsScript then + UserBufferAddText(FormatString(cmsgErr_UnknownScriptCallWithStackOutput,TheName, + StringReplaceChars(sCallStack,"\t","\n"))) + else + UserBufferAddText(FormatString(cmsgErr_UnknownFunctionCallWithStackOutput,TheName, + StringReplaceChars(sCallStack,"\t","\n"))) + EndIf + UserBufferAddText(cmsgClose,"UserBufferDeactivate()",cmsgClose) + UserBufferActivate() + JAWSTopOfFile() + SayLine() +else + if IsScript then + SayMessage(ot_error, FormatString(cmsgErr_UnknownScriptCall,TheName)) + SayUsingVoice(VCTX_MESSAGE, TheName, OT_SPELL) + else + If TheName > cScNull then + SayMessage(ot_error, FormatString(cmsgErr_UnknownFunctionCall,TheName)) + SayUsingVoice(VCTX_MESSAGE, TheName, OT_SPELL) + EndIf + EndIf +endIf +EndFunction + +string function GetMostRecentFunctionNameFromCallStack() +var + string sStack = GetScriptCallStack(), + int iCallCount = StringSegmentCount (sStack, "\n"), + string sCall, + int i +for i = 2 to iCallCount + sCall = StringTrimTrailingBlanks (StringSegment (sStack, "\n", i)) + sCall = StringSegment (sCall, TAB_SEPARATOR, -1) + if StringSegment (sCall, cscSpace, 1) == "function" + return stringChopRight (StringSegment (sCall, cscSpace, -1), 2) + endIf +endFor +return cscNull +endFunction + +;************************* +; Utility Scripts * +;************************* + +Script UtilityTestKeys() +ToggleDiagnosticTestKeyState() +EndScript + +script UtilitySayMenuMode() +SayMenuMode() +EndScript + +script UtilityShowLastUnknownFunctionName() +ShowLastUnknownFunctionName() +EndScript + +script UtilityToggleShowUnknownFunctionCallStack() +ToggleShowUnknownFunctionCallStack() +EndScript + +script UtilityToggleSuppressUnknownFunctionCallNotification() +ToggleSuppressUnknownFunctionCallNotification() +EndScript + +script UtilitySayCurrentMSAAMode() +SayCurrentMSAAMode() +EndScript + +script UtilityTreeCapture() +UtilityTreeCapture() +EndScript + +script UtilityNodeCapture() +UtilityNodeCapture() +EndScript + +script UtilityShowUIATopObjectTreeInfo() +ShowUIATopObjectTreeInfo() +EndScript + +script UtilityShowUIAFocusParentObjectTreeInfo() +ShowUIAFocusParentObjectTreeInfo() +EndScript + +script UtilityShowUIAFocusObjectTreeInfo() +ShowUIAFocusObjectTreeInfo() +EndScript + +script UtilityShowUIAObjectFocusInfo() +ShowUIAObjectFocusInfo() +EndScript + +script UtilityShowUIAObjectFocusAncestorsInfo() +ShowUIAObjectFocusAncestorsInfo() +EndScript + +script UtilityToggleUIAObjectBrowserMode() +UtilityToggleUIAObjectBrowserMode() +EndScript + +script UtilityShowSDMControls() +UtilityShowSDMControls() +EndScript + +script UtilityToggleUseMSAA() +UtilityToggleUseMSAA() +EndScript + +script UtilityShowObjectHierarchyInfo() +UtilityShowObjectHierarchyInfo() +EndScript + +script UtilityShowObjectList() +UtilityShowObjectList() +EndScript + +script UtilityShowObjectListInfoByName() +UtilityShowObjectListInfoByName() +EndScript + +script UtilityShowCachedMSAAFocusInfo() +UtilityShowCachedMSAAFocusInfo(false) +EndScript + +script UtilityShowCachedMSAAFocusInfoEx() +UtilityShowCachedMSAAFocusInfo(true) +EndScript + +script UtilityShowCachedAltFocusInfo() +UtilityShowCachedAltFocusInfo() +EndScript + +script UtilityToggleXMLDomDocBrowserMode() +UtilityToggleXMLDomDocBrowserMode() +EndScript + +Script UtilityDumpEntireOSM () +Say (cmsgDumpingOSM, OT_STATUS) +DumpEntireOSM () +EndScript + +Script UtilityDumpScreenOSM () +Say (cmsgDumpingOSM, OT_STATUS) +DumpOSMWindow () +EndScript + +script HomeRowToggle() +if !(GetRunningFSProducts() & product_JAWS) then + If isSpeechOff() then + return + elif !IsScriptingEditionAuthorized() then + SayMessage(ot_error,cmsg_ScriptUtilityModeNotAuthorized) + return + EndIf +EndIf +HomeRowToggle() +EndScript + +script MouseMovementDefault() +MouseMovementDefault() +EndScript + +Script MouseMovementDecrement () +MouseMovementDecrement () +EndScript + +script MouseMovementIncrement() +MouseMovementIncrement() +EndScript + +Script SayMouseAndAnsiSettings() +SayMouseAndAnsiSettings() +EndScript + +script UtilityHelp() +;{homerow + insert+ h} +SayFormattedMessage (ot_help, cmsgUtilityHotKeys1_L, cmsgUtilityHotKeys1_S) +EndScript + +; Find the next requested attribute after the caret +Script UtilityInitializeHomeRowPosition () +;HomeRow+F5 +UtilityInitializeHomeRowPosition() +EndScript + +Script UtilityToggleSpeakWindowVisibility () +UtilityToggleSpeakWindowVisibility() +EndScript + +Script UtilitySpeakWindowVisibility () +UtilitySpeakWindowVisibility() +EndScript + +script UtilityToggleNotifyIfWinFormsClass() +UtilityToggleNotifyIfWinFormsClass() +EndScript + +script UtilityNextAttribute() +;{homerow+grave accent} +UtilityNextAttribute() +EndScript + +; Find the prior requested attribute before the caret +script UtilityPriorAttribute() +;{homerow+shift+grave accent} +UtilityPriorAttribute() +EndScript + +; Find the first requested attribute +script UtilityFindFirstAttribute() +;{homerow + control + grave accent} +UtilityFindFirstAttribute() +EndScript + +; Find the last requested attribute +script UtilityFindLastAttribute() +;{homerow + shift+control + grave accent} +UtilityFindLastAttribute() +EndScript + +; produces the requested ouput on the current window +script UtilitySayInfoAccess() +;{homerow+f1} +UtilitySayInfoAccess() +EndScript + +Script UtilitySayMSAAObjectInfoAccess () +;{homerow+f9} +UtilitySayMSAAObjectInfoAccess() +EndScript + +script UtilityPutInfoInBox() +;{homerow + Insert + f1} +UtilityPutInfoInBox() +EndScript + +Script UtilityPutMSAAObjectInfoInBox () +;{homerow + Insert + f9} +UtilityPutMSAAObjectInfoInBox() +EndScript + +script UtilityMoveToNextWindow() +UtilityMoveToNextWindow() +EndScript + +script UtilityMoveToPriorWindow() +UtilityMoveToPriorWindow() +EndScript + +script UtilityMoveToLastWindow() +UtilityMoveToLastWindow() +EndScript + +script UtilityMoveToFirstWindow() +UtilityMoveToFirstWindow() +EndScript + + +;Move down one level +script UtilityMoveToChild() +;{homerow+f2} +UtilityMoveToChild() +EndScript + +;Move up one level +script UtilityMoveToParent() +;{homerow+shift+f2} +UtilityMoveToParent() +EndScript + +;Adjust UT_OutputMode +Script UtilitySetOutputMode() +;{homerow+f3} +UtilitySetOutputMode() +EndScript + +Script UtilitySetOutputModeReverseOrder() +;{Homerow+Shift+F3} +UtilitySetOutputModeReverseOrder() +EndScript + +script UtilityJumpToOutputMode() +;{homerow+control+f3} +UtilityJumpToOutputMode() +EndScript + +script UtilityJumpToOutputModeReverseOrder() +;{homerow+control+shift+f3} +UtilityJumpToOutputModeReverseOrder() +EndScript + + +Script UtilitySayOutputMode() +UtilitySayOutputMode() +EndScript + +Script UtilitySetMSAAObjectOutputMode () +;{homerow+f10} +UtilitySetMSAAObjectOutputMode () +EndScript + +Script UtilitySetMSAAObjectOutputModeReverseOrder () +;{Homerow+Shift+F10} +UtilitySetMSAAObjectOutputModeReverseOrder () +EndScript + +Script UtilitySayMSAAObjectOutputMode () +;HomeRow+F12 +UtilitySayMSAAObjectOutputMode () +EndScript + +;Adjust UT_FontMode +script UtilitySetFontMode() +;{homerow+f4} +UtilitySetFontMode() +EndScript + +Script UtilityCopyInfo () +;HomeRow+Control+F1 +UtilityCopyInfo () +EndScript + +Script UtilityCopyMSAAObjectInfo () +;HomeRow+Control+F9 +UtilityCopyMSAAObjectInfo () +EndScript + +Script UtilitySayWindow () +UtilitySayWindow () +EndScript + +Script UtilityResetOutputMode () +UtilityResetOutputMode () +EndScript + +Script UtilitySayWindowPromptAndText () +UtilitySayWindowPromptAndText () +EndScript + +Script UtilityRouteJAWSCursorToPc () +UtilityRouteJAWSCursorToPc () +EndScript + +Script UtilityWindowClassReassign () +UtilityWindowClassReassign () +EndScript + +Script AnsiCharsDecrement () +UtilityAnsiCharsDecrement () +EndScript + +Script SetAnsiCharsIncrement () +UtilityAnsiCharsIncrement () +EndScript + +Script UtilityToggleSpeakingOfDebugMessages() +ToggleSpeakingOfDebugMessages() +EndScript + +Script UtilityChangeDebugLevel() +ChangeDebugLevel() +EndScript + +;***End of Utility scripts + +script SayFrame(string FrameName) +SayFrame (FrameName) +EndScript + +script SayFrameAtCursor() +SayFrameAtCursor () +EndScript + +Void Function ScriptAndAppNames (string sFileName) +var + string sMessageShort, + string sMessageLong, + string sUserBuffer, + string sApp, + string activeConfiguration = GetActiveConfiguration (TRUE) +if stringIsBlank (activeConfiguration) then +; not a web specific script + activeConfiguration = GetActiveConfiguration () +endIf + if IsMetroApp() then + let sApp = GetMetroAppName() + EndIf + if (!sApp) then + let sApp = GetAppFileName () + EndIf + If UserBufferIsActive ()then + SayFormattedMessage (ot_user_requested_information, cMsgVirtualViewerSettings) + Return + EndIf + If IsSameScript () then + If bWereCustomSettingsLoaded then + Let sUserBuffer = msgPagePersonalized + cScPeriod + cScBufferNewLine + EndIf + Let sUserBuffer = sUserBuffer + (FormatString (cmsgSettingsInformation, sFileName, sApp, activeConfiguration, GetCurrentSchemeName ())) + SayMessage (OT_USER_BUFFER, sUserBuffer) + AddHotKeyLinks () + Return + EndIf + let sMessageLong = FormatString (cmsg145_L, sFileName, sApp, GetSpellString (sApp)) + let sMessageShort = FormatString (cmsg145_S, sFileName, sApp, GetSpellString (sApp)) + SayFormattedMessage (ot_user_requested_information, sMessageLong, sMessageShort) + SpeakPersonalizeSettings() +EndFunction + +Script ClearValues() +FrameClearValues () +DragAndDropClearValues () +BrailleSelectTextClearValues () +SayFormattedMessage (ot_status, cmsg185_L, cmsg185_S) ; "Values Cleared" +EndScript + +;********************************** +; Extended Key Scripts * +;********************************** + +script SayNextCharacterPCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript SayNextCharacter() +EndScript + +script SayPriorCharacterPCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript SayPriorCharacter() +EndScript + +script SayNextLinePCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript SayNextLine() +EndScript + +script SayPriorLinePCCursor() +If !GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC) then + SaveCursor () +endIf +PcCursor () +PerformScript SayPriorLine() +EndScript + +script SayNextWordPCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript SayNextWord() +EndScript + +script SayPriorWordPCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript SayPriorWord() +EndScript + +script ControlDownArrowPCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript ControlDownArrow() +EndScript + +script ControlUpArrowPCCursor() +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript ControlUpArrow() +EndScript + +Script JAWSHomePcCursor () +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript JAWSHome () +EndScript + +Script JAWSEndPcCursor () +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript JAWSEnd () +EndScript + +Script JAWSPageUpPcCursor () +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript JAWSPageUp () +EndScript + + +Script JAWSPageDownPcCursor () +If ( ! GetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC)) then + SaveCursor () +endIf +PcCursor () +PerformScript JAWSPageDown () +EndScript + + + + +;************************* +; Braille Scripts * +;************************* + +Script BrailleToggleMode (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetActiveBrailleMode () +EndScript + +Script BrailleGrade2Translation (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBrailleGradeTwoMode () +EndScript + +Script ChangeContractedBrailleSetting (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SayBrailleContractedState(ToggleBrailleContractedState()) +EndScript + +Script BrailleGrade2ExpandCurrentWord (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBrailleExpandCurrentWord () +EndScript + +Script BrailleMovesActive (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBrailleMovesActive () +EndScript + +Script ActiveMovesBraille (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +; Determins wether or not the braille display follows the active cursor +SetActiveMovesBraille () +EndScript + +Script BrailleToggleSpeechInterrupt (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBrailleSpeechInterrupt () +EndScript + +Script BrailleToggleCharactersAndAttributes(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBrailleCharactersOrAttributes () +EndScript + +Script BrailleTab(optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +;If is Virtual Pc Cursur, suppress echo of highlighted Text: +Let nLastSelectUnitTime = (GetTickCount()*IsVirtualPCCursor()) +BrailleTabKey () +EndScript + +Script BrailleShiftTab (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +;If is Virtual Pc Cursur, suppress echo of highlighted Text: +Let nLastSelectUnitTime = (GetTickCount()*IsVirtualPCCursor()) +BrailleShiftTabKey () +EndScript + +Script BrailleEnter(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleEnterKey () +EndScript + +Script BrailleEscape(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleEscapeKey () +EndScript + +Script BrailleToggleCursor(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +; Toggle between the JAWS and PC cursor +if (IsPCCursor ()) then + PerformScript JAWSCursor () +else + PerformScript PCCursor () +endIf +EndScript + +Script BrailleAltTab (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleAltTabKey () +EndScript + +Script BraillePriorLine (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleNavPriorLine () +EndScript + +Script BrailleNextLine (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleNavNextLine () +EndScript + +Script BraillePanLeft(optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +; If there is more text to the left on the current line, display it. +; If not, display the final segment of the previous line. +BrailleNavPanLeft () +EndScript + +Script BraillePanRight (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +; If there is more text on the current line, then display it. +; Otherwise, display the first segment of the next line. +BrailleNavPanRight () +EndScript + +Script BrailleMoveLeft (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleNavMoveLeft () +EndScript + +Script BrailleMoveRight (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleNavMoveRight () +EndScript + +Script BrailleToggle8PixelsPerSpace () +BrailleSet8OrUnlimitedPixels () +EndScript + +Script BrailleRouting() +if DoBrailleRoutingPriorityAction() return endIf +var int nCell = GetLastBrailleRoutingKey () +BrailleRoutingButton(nCell) +DoBrailleRoutingClickAfterAction() +EndScript + +int Function BrailleBuildLine () +;Note this is only here for backward compatibility. +;JAWS 4.0 no longer uses it but it will still be called before other Braille +;functions. If this function returns true then the new functionality will not +;be used. +return false +EndFunction + +Script BrailleTop (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +if not BrailleIsStructuredLine () || IsVirtualPCCursor() then + SaveCursor () + BrailleCursor () + RouteBrailleToPC () + JAWSPageUp () + JAWSHome () + SayFormattedMessage (ot_JAWS_message, cmsg44_L, cmsg44_S) ; "top of window" +elif not BrailleIsMessageBeingShown() then +; if a message is being shown, Braille panning always returns TRUE +;otherwise if it didn't you'd dismiss a message if you panned too far + while (BraillePanLeft ()) + EndWhile + SayFormattedMessage (ot_JAWS_message, cmsg220_L, cmsg220_S) ; "Beginning of line" +endIf +EndScript + +Script BrailleBottom (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +if not BrailleIsStructuredLine () || IsVirtualPCCursor() then + SaveCursor () + BrailleCursor () + RouteBrailleToPC () + JAWSPageDown () + JAWSEnd () + SayFormattedMessage (ot_JAWS_message, cmsg45_L, cmsg45_S) ; "bottom of window" +elif not BrailleIsMessageBeingShown() then +; if a message is being shown, Braille panning always returns TRUE +;otherwise if it didn't you'd dismiss a message if you panned too far + while (BraillePanright ()) + EndWhile + SayFormattedMessage (ot_JAWS_message, cmsg221_L, cmsg221_S) ; "End of line" +endIf +EndScript + +Script BrailleSet8PixelsPerSpace(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBraille8PixelsPerSpace () +EndScript + +Script BrailleSetUnlimittedPixelsPerSpace(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetBrailleUnlimitedPixelsPerSpace () +EndScript + +Script BrailleToggleMarking(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +ShowBrailleMarkingOptions() +EndScript + +script BrailleTurnMarkingOff(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +TurnOffBrailleMarking () +EndScript + +script BrailleDescribeFont(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleDescribeFontAtCursor () +EndScript + +script BrailleToggle8Dots(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +Set6Or8Dots () +EndScript + +script BrailleSet6Dots(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetSixDotBraille () +EndScript + +Script BrailleSet8Dots(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SetEightDotBraille () +EndScript + +Script RouteBrailleToPC (optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +RouteBrailleToPC () +EndScript + +Script RouteBrailleToJAWS (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +RouteBrailleToJAWS () +EndScript + +Script RouteBrailleToActiveCursor (optional int index) +var + int ActiveCursor +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +let activeCursor = GetActiveCursor () +if (ActiveCursor == cursor_JAWS) then + RouteBrailleToJAWS () +ElIf (ActiveCursor == cursor_pc) then + RouteBrailleToPC () +endIf +EndScript + +Script BrailleSelectText (int index) +;This also uses Selection by routing button, so one should probably not use it as an upper navRow by itself. +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SelectTextWithBraille () +EndScript + +script BrailleControlLeftMouseClick(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleControlLeftMouseClick() +endScript + +Script BrailleToggleSpeechHistory(int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +ToggleSpeechHistoryMode () +EndScript + +Script BrailleToggleBrailleLineMode (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleSetToLineMode () +EndScript + +Script BrailleDescribeItem (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleDescribeItemAtCursor () +EndScript + +Script BrailleRightMouseClick (int index) +;not especially a good idea to assign to anything that's not a (lower) routing button in combo with something else, +;since LastRoutingKey is used to determine where we are to click. +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +; for touch cursor right click: +if IsTouchCursor() then + TouchRightClick() + return +endIf +RightClickWithBraille () +EndScript + +Script BrailleChangeCursorShape (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +ToggleShapeOfCursors () +EndScript + +Script BrailleLineCursorShapeOff (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleToggleCursorBlinking () +EndScript + +; The following set of scripts are intended for Papenmeier Braille Displays + +; Announcement for Switches and Toggles + +Script FHPBraille2DTogglePCMode () + FHPBraille2DTogglePCMode () +EndScript + +Script FHPBraille2DToggleReadingMode () + FHPBraille2DToggleReadingMode () +EndScript + +Script FHPBrailleKeyPCMode () + FHPBrailleKeyPCMode () +EndScript + +Script FHPBrailleKeyNavigationMode () + FHPBrailleKeyNavigationMode () +EndScript + +Script FHPBrailleKeyReadingMode () + FHPBrailleKeyReadingMode () +EndScript + +Script FHPBrailleKeySpeechMode () + FHPBrailleKeySpeechMode () +EndScript + +Script FHPBrailleKeyBrailleMode () + FHPBrailleKeyBrailleMode () +EndScript + +Script FHPBrailleKeyBrailleSpeechMode () + FHPBrailleKeyBrailleSpeechMode () +EndScript + + +; PC key simulation +; Braillex EL right switch in rear position = PC Mode +script FHPcursorup() + + FHPcursorup() +EndScript + +script FHPcursordown() + FHPcursordown() +EndScript + +script FHPcursorright() + FHPcursorright() +EndScript + +script FHPcursorleft() + FHPcursorleft() +EndScript + +Script FHPBrailleTab() + FHPBrailleTab() +EndScript + +Script FHPBrailleShiftTab() + FHPBrailleShiftTab() +EndScript + +Script FHPBrailleEscape() + FHPBrailleEscape() +EndScript + +Script FHPBrailleEnter() + FHPBrailleEnter() +EndScript + + +; Navigation Mode +; Braillex EL right switch in central position +Script FHPBraillePriorLine() + FHPBraillePriorLine() +EndScript + +Script FHPBrailleNextLine() + FHPBrailleNextLine() +EndScript + +Script FHPBraillePanLeft() + FHPBraillePanLeft() +EndScript + +Script FHPBraillePanRight() + FHPBraillePanRight() +EndScript + + +; Combined Mode +; Braillex EL right key in front position +Script FHPBrailleSpeechPriorLine () + FHPBrailleSpeechPriorLine () +EndScript + +Script FHPBrailleSpeechNextLine () + FHPBrailleSpeechNextLine () +EndScript + +Script FHPBrailleSpeechPanLeft() + FHPBrailleSpeechPanLeft() +EndScript + +Script FHPBrailleSpeechPanRight() + FHPBrailleSpeechPanRight() +EndScript + + +; routing +; +Script FHPRouting() + FHPRouting() +EndScript + +Script FHPLineRouting() + FHPLineRouting() +EndScript + +Script FHPRoutingAux () + FHPRoutingAux () +EndScript + +; Attribute handling +; +Script FHPBrailleTurnMarkingOff() + FHPBrailleTurnMarkingOff() +EndScript + +Script FHPBrailleShowBoldMarking() + FHPBrailleShowBoldMarking() +EndScript + +Script FHPBrailleShowHighlightMarking() + FHPBrailleShowHighlightMarking() +EndScript + +Script FHPBrailleShowItalicMarking() + FHPBrailleShowItalicMarking() +EndScript + +Script FHPBrailleShowUnderlineMarking() + FHPBrailleShowUnderlineMarking() +EndScript + +Script FHPBrailleShowAllMarking () + + FHPBrailleShowAllMarking () +EndScript + +Script FHPBrailleToggleCharactersAndAttributes () + FHPBrailleToggleCharactersAndAttributes () +EndScript + +Script FHPBrailleToggleAttributeUp () + FHPBrailleToggleAttributeUp () +EndScript + +Script FHPBrailleToggleAttributeDown () + FHPBrailleToggleAttributeDown () +EndScript + +; +; +Script FHPBrailleShowWindowsTop () + FHPBrailleShowWindowsTop () +EndScript + +Script FHPBrailleShowWindowsBottom () + FHPBrailleShowWindowsBottom () +EndScript + +Script FHPBrailleToggle68Dots () + FHPBrailleToggle68Dots () +EndScript + +Script FHPToggleCursorMode () + FHPToggleCursorMode () +EndScript + +Script FHPBrailleToggleCursorShape () + FHPBrailleToggleCursorShape () +EndScript + +Script FHPBrailleActiveCursorTracking () + FHPBrailleActiveCursorTracking () +EndScript + +Script FHPBrailleSelectText () + FHPBrailleSelectText () +EndScript + +Script FHPBrailleToggleVertical () + FHPBrailleToggleVertical () +EndScript + +Script FHPBrailleLineMode () + FHPBrailleLineMode () +EndScript + +Script FHPBrailleStructuredMode () + FHPBrailleStructuredMode () +EndScript + +Script FHPActivateTaskList () + FHPActivateTaskList () +EndScript + +Script FHPBrailleManager () + FHPBrailleManager () +EndScript + +Script FHP_RunJAWSManager () + FHP_RunJAWSManager () +EndScript + +; scripts for new Braillex EL slimline series + +Script FHPAttributSettings () + ScheduleFunction("FHPAttributSettings",3) +EndScript + +Script FHPBrailleSettings () + ScheduleFunction("FHPBrailleSettings",3) +EndScript + +Script FHPWorkingMode () + ScheduleFunction("FHPWorkingMode",3) +EndScript + +Script FHPBraillexEL1R () + FHPBraillexEL1R () +EndScript + +Script FHPBraillexEL1L () + FHPBraillexEL1L () +EndScript + +Script FHPBraillexEL1U () + FHPBraillexEL1U () +EndScript + +Script FHPBraillexEL1D () + FHPBraillexEL1D () +EndScript + +Script FHPBraillexEl2R () + FHPBraillexEl2R () +EndScript + +Script FHPBraillexEl2L () + FHPBraillexEL2L () +EndScript + +Script FHPBraillexEL2D () + FHPBraillexEL2D () +EndScript + +Script FHPBraillexEL2U () + FHPBraillexEL2U () +EndScript + +; dummy scripts for further extension + +Script FHPBrailleActiveMovesBraille () + FHPBrailleActiveMovesBraille () +EndScript + +Script FHPBrailleFuncLURU () + FHPBrailleFuncLURU () +EndScript + +Script FHPBrailleFuncLURD () + FHPBrailleFuncLURD () +EndScript + +Script FHPBrailleFuncLDRU () + FHPBrailleFuncLDRU () +EndScript + +Script FHPBrailleFuncLDRD () + FHPBrailleFuncLDRD () +EndScript + +; dummy scripts for braille split mode + +Script FHPBrailleSplitMode () + FHPBrailleSplitMode () +EndScript + +Script FHPBrailleSplitToggleSide () + FHPBrailleSplitToggleSide () +EndScript + +Script FHPBrailleSplitPriorLine () + FHPBrailleSplitPriorLine () +EndScript + +Script FHPBrailleSplitNextLine () + FHPBrailleSplitNextLine () +EndScript + +Script FHPBrailleSplitPanLeft () + FHPBrailleSplitPanLeft () +EndScript + +Script FHPBrailleSplitPanRight () + FHPBrailleSplitPanRight () +EndScript + +; EndPapenmeier + + +;******* + +Script KeyboardHelp() +if GetRunningFSProducts() & product_MAGic +&& IsSpeechOff() then + return +EndIf +let gbKeyboardHelp = true +if !c_KeyboardHelpData then + let c_KeyboardHelpData = new collection +EndIf +; save and set to infinite prior to speaking the keyboard help on msg +let c_KeyboardHelpData.SavedBrlMessagesMode = GetJcfOption(OPT_BRL_MESSAGES) +let c_KeyboardHelpData.SavedMessageTime=GetJCFOption(OPT_BRL_MESSAGE_TIME) +let c_KeyboardHelpData.SavedTypingEcho = GetJCFOption(OPT_TYPING_ECHO) +Let c_KeyboardHelpData.SavePunctuation = GetJcfOption (OPT_PUNCTUATION) +;c_KeyboardHelpData.lastGestureTickCount is used in GestureEvent to detect continuous gestures, +;so that the gesture is not repeatedly announced while the gesture continues: +let c_KeyboardHelpData.lastGestureTickCount = 0 +SetJcfOption(OPT_BRL_MESSAGES,1) ;make sure that braille will flash the keyboard help messages +setJCFOption(OPT_BRL_MESSAGE_TIME,0) ;so keyboard help stays on the display +SayFormattedMessage (ot_status, cmsg167_L, cmsg_on) ; "Keyboard Help on" +SetJcfOption(OPT_TYPING_ECHO,1) ; echo characters +SetJcfOption (OPT_PUNCTUATION, 1); Almost no punctuation spoken but normal inflection +AddHook (HK_SCRIPT, "KeyboardHelpHook") +; ignore any keys not attached to scripts +TrapKeys(TRUE) +CaptureAllGestures(TRUE) +EndScript + +void function SpeakKeyboardHelp() +let c_KeyboardHelpData.TimerSchedule = 0 +var int isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) +if (isSODActive) JAWSSpeechOnDemandOn() endIf +if c_KeyboardHelpData.HelpType == KeyboardHelpType_Name then + Say(c_KeyboardHelpData.HelpMessage,ot_user_requested_information) + SpellString(c_KeyboardHelpData.HelpMessage) +ElIf c_KeyboardHelpData.HelpType == KeyboardHelpType_Synopsis then + BeginFlashMessage() + SetJcfOption(OPT_PUNCTUATION,3) ;we want all punctuation when speaking the keystroke + Say(c_KeyboardHelpData.KeyName,ot_user_requested_information) + SetJcfOption(OPT_PUNCTUATION,1) + Say(c_KeyboardHelpData.HelpMessage,ot_user_requested_information) + EndFlashMessage() +ElIf c_KeyboardHelpData.HelpType == KeyboardHelpType_Description then + if IsKeystrokeReserved (c_KeyboardHelpData.KeyName) then + SayFormattedMessage (OT_USER_REQUESTED_INFORMATION, cmsgReservedWebAppKeysDescriptionKeyboardHelp) + else + Say(c_KeyboardHelpData.HelpMessage,ot_user_requested_information) + endIf +elif c_KeyboardHelpData.HelpType == KeyboardHelpType_Gesture + StopSpeech() + BeginFlashMessage() + Say(c_KeyboardHelpData.KeyName,ot_user_requested_information) + Say(c_KeyboardHelpData.HelpMessage,ot_user_requested_information) + EndFlashMessage() +EndIf +if (isSODActive) JAWSSpeechOnDemandOff() endIf +EndFunction + +void function LookupKeyboardHelpMessage() +var + string sKey, + string sText, + string sFrameName, + string sScriptName, + string sCmd, + string sHelpMessage +sFrameName = c_KeyboardHelpData.FrameName +sScriptName = c_KeyboardHelpData.ScriptName +sCmd = c_KeyboardHelpData.Cmd +if c_KeyboardHelpData.HelpType == KeyboardHelpType_Gesture + c_KeyboardHelpData.KeyName = GetGestureLabel(GetCurrentScriptKeyName()) + sHelpMessage = GetScriptSynopsis(sScriptName) +elif c_KeyboardHelpData.HelpType >= KeyboardHelpType_Name then + c_KeyboardHelpData.HelpType = KeyboardHelpType_Name + if sFrameName then + sHelpMessage = c_KeyboardHelpData.FrameName + else ;script name + sHelpMessage = sScriptName + EndIf +ElIf c_KeyboardHelpData.HelpType == KeyboardHelpType_Description then + if sFrameName + && GetFrameDescription (sFrameName) then + sHelpMessage = FormatString (cmsg173_L,GetFrameDescription (sFrameName)) + else + sHelpMessage = GetScriptDescription(sScriptName) + endIf +else ;first press of keystroke + ;The tandem keys are mapped internally, + ;so we must explicitly set the key name if it is a tandem key: + if GetRunningFSProducts() & product_JAWS then + if sScriptName == StartOrEndTandemSessionScript then + sKey = StartOrEndTandemSessionKey + elif sScriptName == ToggleTandemModeScript then + sKey = ToggleTandemModeKey + elif sScriptName == PauseTandemVideoScript then + sKey = PauseTandemVideoKey + EndIf + endIf + if sScriptName == LaunchWindowsShortcutScript then + sText = KeyboardHelp_LaunchWindowsShortcut(sFrameName) + sKey = GetCurrentScriptKeyName() + elif sScriptName == WindowsCmdScript then + sText = KeyboardHelp_WindowsCmd(sCmd) + sKey = GetCurrentScriptKeyName() + else + ;make sure we don't step on sKey assignments from earlier in this block: + if !sKey + sKey = GetCurrentScriptKeyName() + endIf + EndIf + c_KeyboardHelpData.KeyName = ReformatKeyName(sKey) + if sText then + sHelpMessage = sText + else + if sFrameName then + sHelpMessage = FormatString (cmsg174_L, c_KeyboardHelpData.FrameName) + +cscSpace + +GetFrameSynopsis (sFrameName) + else + sHelpMessage = GetScriptSynopsis(sScriptName) + endIf + endIf +endIf +if IsKeystrokeReserved (sKey) then + let sHelpMessage = GetKeyboardHelpForReservedKey (sKey) +endIf +let c_KeyboardHelpData.HelpMessage = sHelpMessage +EndFunction + +void function SetKeyboardHelpScriptNameData(string ScriptName, string FrameName) +let c_KeyboardHelpData.Cmd = FrameName +; When scripts have numerical arguments, this is mistaken for frame names. +; This converts the script numerical argument to an integer, checks that it is a valid integer, +; then nulls the frame name argument if it is a script parameter. +let c_KeyboardHelpData.FrameNumber = StringToInt(FrameName) +If (c_KeyboardHelpData.FrameNumber == 0 && GetCharacterValue(FrameName)==48) +|| c_KeyboardHelpData.FrameNumber > 0 Then + let FrameName=cscNull +EndIf +let c_KeyboardHelpData.FrameName = FrameName +let c_KeyboardHelpData.ScriptName = ScriptName +EndFunction + +void function UnhookKeyboardHelp() +let gbKeyboardHelp = false +;restore flash message time so that flash messages don't display indefinitely +setJCFOption(OPT_BRL_MESSAGE_TIME,c_KeyboardHelpData.SavedMessageTime) +var int isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) +if (isSODActive) JAWSSpeechOnDemandOn() endIf +SayMessage (ot_status, cmsg168_L, cmsg_off) ; "Keyboard Help off" +if (isSODActive) JAWSSpeechOnDemandOff() endIf +RemoveHook (HK_SCRIPT, "KeyboardHelpHook") +TrapKeys(FALSE) +CaptureAllGestures(FALSE) +SetJcfOption(OPT_TYPING_ECHO,c_KeyboardHelpData.SavedTypingEcho) +SetJcfOption (OPT_PUNCTUATION, c_KeyboardHelpData.SavePunctuation) +SetJcfOption(OPT_BRL_MESSAGES,c_KeyboardHelpData.SavedBrlMessagesMode) +CollectionRemoveAll(c_KeyboardHelpData) +BrailleRefresh() +EndFunction + +Void Function KeyboardHelpHook (string ScriptName, string FrameName) +if c_KeyboardHelpData.TimerSchedule then + UnscheduleFunction(c_KeyboardHelpData.TimerSchedule) + let c_KeyboardHelpData.TimerSchedule = 0 +EndIf +if ScriptName == "BXBuildModifyer" then + PerformScript BXBuildModifyer() + return +ElIf ScriptName == "BXBuildFKeyModifyer" then + PerformScript BXBuildFKeyModifyer() + return +EndIf +if ScriptName == "KeyboardHelp" then + UnhookKeyboardHelp() + return FALSE +endIf +if StringContains(ScriptName,"BraillePan") +&& !StringContains(ScriptName,"BySegment") then + return TRUE; allow to run so message can be panned +endIf +;Split Braille case +if StringContains(ScriptName,"HWThum") && BrailleCanPanLinesIndependently() then + return TRUE; allow to run so message can be panned +endIf +; Non-split Braille case. +if ScriptName=="HWThum2" || ScriptName=="HWThum3" then + return TRUE; allow to run so message can be panned +endIf + +if StringContains(ScriptName,"BXBuildModifyer") +|| StringContains(ScriptName,"BXBuildFKeyModifyer") then + return true ;allow the BX modifyer to build +EndIf +SetKeyboardHelpScriptNameData(ScriptName,FrameName) +if CurrentScriptWasInvokedByGesture() + c_KeyboardHelpData.HelpType = KeyboardHelpType_Gesture +else + c_KeyboardHelpData.HelpType = IsSameScript ()+1 +endIf +LookupKeyboardHelpMessage() +if ScriptName == "UpALevel" + SpeakKeyboardHelp() + UnhookKeyboardHelp() + return FALSE +endIf +let c_KeyboardHelpData.TimerSchedule = ScheduleFunction("SpeakKeyboardHelp",2) +; by returning FALSE, a hook function can prevent a script from being run +return FALSE +EndFunction + +Int Function RoutePCToInvisible () +var + int Row, + int Column, + int nSuccess +InvisibleCursor() +let Row = getCursorRow () +let Column = getCursorCol () +PCCursor() +let nSuccess = MoveTo (Column, Row) +return nSuccess +EndFunction + +string function GetFocusedApplicationVersionInfo () +; largely unchanged from SayAppVersionScript, +; this function is now just to return the focused app info, +; so Voice Assistant can use it in two new scripts as well. +var + string sProduct, + string sVersion, + string sMessage, + string sNavModule + if IsMetroApp() then + let sProduct = GetMetroAppName() + let sVersion = GetMetroAppVersion() + EndIf + ; Some apps like explorer return true for IsMetroApp but don't use the Metro naming/versioning scheme. + ; That's why the standard way of getting the version is not in an else block of the Metro branch + ;but instead is done unconditionally if no name has already been retrieved. + if (!sProduct) then + let sProduct = GetVersionInfoString (GetAppFilePath (), cmsg282_L) + let sVersion = GetVersionInfoString (GetAppFilePath (), cmsg283_L) + EndIf + let sMessage = FormatString (cmsg239_L, sProduct, sVersion) + let sNavModule = GetNavModuleVersionInfo(GetCurrentWindow()) + ; May need to work on some translation here. Presently, + ; the string is passed back by the actual NavModule and is + ; not subject to translation. + if (sNavModule != "") then + let sMessage = sMessage + "\n" + let sMessage = sMessage + GetNavModuleVersionInfo ((GetCurrentWindow())) + endIf + return sMessage +endFunction + +string function GetJAWSVersionInfo () +var string JAWSVersionInfoString, string JAWSPath = FindJAWSUtilityProgram ("jfw.exe") +JAWSVersionInfoString = GetVersionInfoString (JAWSPath, cmsg283_L) +return formatString (cmsgJAWSVersion, JAWSVersionInfoString) +endFunction + +string function getZoomTextVersionInfo () +if ! (getRunningFSProducts () & (Product_Fusion || product_ZoomText)) then return cscNull endIf +var string ZTVersionString, string ZtAppObjName = "Zoomtext.application" +var object zt = CreateObjectEx (ZtAppObjName, FALSE) +if ! ZT then return cscNull endIf +var handle ztWindow = zt.WindowHandle() +if ! ztWindow then return cscNull endIf +var string Path = getWindowOwner (ztWindow) +ZTVersionString = GetVersionInfoString (path, cmsg283_L) +ZTVersionString = formatString (cmsgZoomTextVersion, ZTVersionString) +ZT = null () +return ZTVersionString +endFunction + +string function GetFusionVersionInfo() +if ! (getRunningFSProducts() & Product_Fusion) then return cscNull endIf +return FormatString (cmsgFusionVersion, GetFusionVersion()) +endFunction + +string function GetMAGicVersionInfo () +if ! GetRunningFSProducts () & product_MAGic then return cscNull endIf +var handle window = findTopLevelWindow (cwc_MAGICUI, "") +if ! window then return cscNull endIf +var string path = getWindowOwner (window) +var string MAGicVersionInfoString = GetVersionInfoString (path, cmsg283_L) +return formatString (cmsgMAGicVersion, MAGicVersionInfoString) +endFunction + +string function GetActiveConfigurationInfo () +var + string ConfigDetails, + string app, + string activeConfiguration = GetActiveConfiguration (TRUE), + string settings +if stringIsBlank (activeConfiguration) then +; not a web specific script + activeConfiguration = GetActiveConfiguration () +endIf +settings = FileNameList (activeConfiguration+".*") +settings = StringTrimLeadingBlanks (StringTrimTrailingBlanks (settings)) +if stringIsBlank (settings) then + settings = cmsg238_L +else + settings = stringSegment (settings, LIST_ITEM_SEPARATOR, 1) +endIf +if IsMetroApp() then + app = GetMetroAppName() +EndIf +if ! app then + app = GetAppFileName () +EndIf +If UserBufferIsActive ()then + return cMsgVirtualViewerSettings +EndIf +ConfigDetails = FormatString (cmsgActiveConfigurationInfo, settings, app, activeConfiguration, GetCurrentSchemeName ()) +If bWereCustomSettingsLoaded then + ConfigDetails = ConfigDetails+cScBufferNewLine+msgPagePersonalized + cScPeriod +EndIf +Return ConfigDetails +endFunction + +string function GetSystemType () +var string systemType + +if IsSystemX64 () then + systemType = Architecture_x64 +elIf IsSystemARM64 () then + systemType = Architecture_arm64 +endIf + +return systemType +endFunction + +string function GetOSVersionInfo () +var string Path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" +var string winVersion +;if isWindows12 () then + ; winVersion = "12" +if isWindows11 () then + winVersion = "11" +elIf IsWindows10 () then + winVersion = "10" +elIf IsWindows8 () then + winVersion = "8" +else + winVersion = "7" +endIf +var int CurrentMajorVersionNumber = GetRegistryEntryDword (2, path, "CurrentMajorVersionNumber") +var int CurrentMinorVersionNumber = GetRegistryEntryDword (2, path, "CurrentMinorVersionNumber") +var string OSVersion = formatString ("%1.%2", CurrentMajorVersionNumber, CurrentMinorVersionNumber) +var string CurrentBuildNumber = GetRegistryEntryString (2, path, "CurrentBuild") +var string DisplayVersion = GetRegistryEntryString (2, path, "DisplayVersion") +var string ProductVersion = GetRegistryEntryString (2, path, "CurrentVersion") +var string EditionID = GetRegistryEntryString (2, path, "EditionID") +var int RevisionNumber +var string build +var string SystemType = GetSystemType () +if IsWindows10 () + RevisionNumber = GetRegistryEntryDword (2, path, "UBR");Update Build Revision + return formatString (cmsgMicrosoftWindows10AndHigherVersionTemplate, + winVersion, DisplayVersion, RevisionNumber, EditionID, CurrentBuildNumber, SystemType) +else + RevisionNumber = GetRegistryEntryDword (2, path, "BaseBuildRevisionNumber") + build = formatString ("%1.%2", CurrentBuildNumber, RevisionNumber) + return formatString (cmsgMicrosoftWindowsVersionTemplate, + winVersion, DisplayVersion, build, EditionID, OSVersion) +endIf +endFunction + +string function GetExtendedVersionDetailsInfo () +var string VersionDetails = cmsgVersionDetails +var string JAWSVersionInfo = GetJAWSVersionInfo () +var int scriptsRevision = GetScriptsRevision() +var string ZoomTextVersionInfo = GetZoomTextVersionInfo () +var string fusionVersionInfo = GetFusionVersionInfo() +var string MAGicVersionInfo = GetMAGicVersionInfo () +var string applicationVersionInfo = GetFocusedApplicationVersionInfo () +var string ActiveConfigurationInfo = GetActiveConfigurationInfo () +var string OSVersionInfo = GetOSVersionInfo () +if ! stringIsBlank (applicationVersionInfo)then + versionDetails = versionDetails + cscBufferNewLine + applicationVersionInfo +endIf +if ! stringIsBlank (JAWSVersionInfo) then + versionDetails = versionDetails + cscBufferNewLine + JAWSVersionInfo +endIf +if (scriptsRevision > 0) then + var string revisionInfo = FormatString(cmsgScriptsRevision, IntToString(scriptsRevision)) + versionDetails = versionDetails + cscBufferNewLine + revisionInfo +endIf +if ! stringIsBlank (MAGicVersionInfo) then + versionDetails = versionDetails + cscBufferNewLine + MAGicVersionInfo +endIf +if ! stringIsBlank (ZoomTextVersionInfo) then + versionDetails = versionDetails + cscBufferNewLine + ZoomTextVersionInfo +endIf +if ! stringIsBlank (fusionVersionInfo) then + versionDetails = versionDetails + cscBufferNewLine + fusionVersionInfo +endIf +if ! stringIsBlank (ActiveConfigurationInfo) then + versionDetails = versionDetails + cscBufferNewLine + ActiveConfigurationInfo +endIf +if ! stringIsBlank (OSVersionInfo) then + versionDetails = versionDetails + cscBufferNewLine + OSVersionInfo +endIf +return versionDetails +endFunction + +script PutVersionDetailsOnClipboard () +copyToClipboard (GetExtendedVersionDetailsInfo ()) +sayMessage (OT_STATUS, cmsgVersionDetailsCopiedToClipboard) +endScript + +script ShowVersionDetails () +UserBufferClear () +SayMessage (OT_USER_BUFFER, GetExtendedVersionDetailsInfo ()) +endScript + +Script SayAppVersion () +if IsSameScript() then + PerformScript ShowVersionDetails () + return +endIf +var string message = GetFocusedApplicationVersionInfo () +SayFormattedMessage (ot_help, message) +EndScript + +Script SayProgramComments () +SayFormattedMessage (ot_help, GetVersionInfoString (GetAppFilePath (), cmsg284_L)) +EndScript + +Void Function RestrictCursor (int nStatus) +if (nStatus == on) then + SetRestriction(RestrictWindow) +else + SetRestriction(RestrictAppWindow) +endIf +EndFunction + +void function SayWindows7TaskBar () +var + handle hWnd, + string sTaskBarText +let hWnd = FindTopLevelWindow(cwcShellTray,cscNull) +if !hWnd then + SayFormattedMessage (OT_error, cmsg190_L, cmsg190_S) ; "Task bar is not visible" + return +EndIf +let hWnd = FindWindow(hWnd,cwc_MSTaskListWClass) +if !hWnd then + SayFormattedMessage (OT_error, cmsg190_L, cmsg190_S) ; "Task bar is not visible" + return +EndIf +let sTaskBarText = GetListOfObjects (hWnd) +if !sTaskBarText then + SayFormattedMessageWithVoice(VCTX_Message, OT_ERROR, cMsgTaskBarEmpty_l, cMsgTaskBarEmpty_s) +else + Say(sTaskBarText,ot_line) +EndIf +EndFunction +Script SayTaskBar () +var + handle hWnd +if IsWindows7() then + SayWindows7TaskBar () + return +EndIf +let hWnd = FindTopLevelWindow (cwcShellTray, cscNull) +let hWnd = GetFirstChild(hWnd) +if (hWnd) then + while (hWnd && GetWindowClass (hWnd) != cwcMSTask) + if GetWindowClass (hWnd) == cwcRebarWnd then ; Win_98 + let hWnd = GetFirstChild(hWnd) + else + let hWnd = GetNextWindow(hWnd) + endIf + EndWhile + let hWnd = GetFirstChild(hWnd) + If GetWindowText(hWnd,Read_Everything)==cscNull Then + ; The task bar is empty... + SayFormattedMessageWithVoice(VCTX_Message, OT_ERROR, cMsgTaskBarEmpty_l, cMsgTaskBarEmpty_s) + Return + EndIf + If GetWindowClass(hWnd) == cwcNewStartMenu + && !IsWindowObscured(hWnd) Then ; Windows XP class for the Taskbar. + SayWindow(hWnd, READ_EVERYTHING) + return + EndIf + while (hWnd && GetWindowClass (hWnd) != cwcSysTabCtrl32) + let hWnd = GetNextWindow(hWnd) + EndWhile + if (GetWindowClass(hWnd) == cwcSysTabCtrl32 && !IsWindowObscured (hWnd)) then + SayWindow(hWnd, READ_EVERYTHING) + return + endIf +endIf +SayFormattedMessage (OT_error, cmsg190_L, cmsg190_S) ; "Task bar is not visible" +EndScript + +Script SaySystemTray () +var + handle hWnd +let hWnd = FindTopLevelWindow (cwcShellTray, cscNull) +let hWnd = FindDescendantWindow (hWnd, 303) +if (hWnd) then + SayWindow(hWnd, READ_EVERYTHING) +else + SayFormattedMessage (ot_error, cmsg191_L, cmsg191_S) ; "system tray is not visible" +endIf +EndScript + +String Function IntToAttribName (int attrib) +if (attrib == attrib_bold) then + return cmsg139_L ;"Bold" +endIf +if (attrib == attrib_italic) then + return cmsg140_L ;"Italic" +endIf +if (attrib == attrib_underline) then + return cmsg141_L ;"Underline" +endIf +if (attrib == attrib_highlight) then + return cmsg142_L ;"Highlight" +endIf +if (attrib == attrib_strikeout) then + return cmsg143_L ;"Strikeout" +endIf +if (attrib == attrib_graphic) then + return cmsg144_L ;"Graphic" +endIf +return cscNull + +EndFunction + +Void Function AttributesChanged (int attributes, int attributesFound) +var + int attrib +if attributes == 1 then ; this is normal text + if attributesFound >= ATTRIB_BOLD then + SayUsingVoice (VCTX_MESSAGE, cmsg244_L, ot_help) ;" Normal " + endIf + return +endIf +let attrib = attrib_bold +while (attrib <= attrib_highlight) + if attributes & attrib then + SayUsingVoice (VCTX_MESSAGE, IntToAttribName (attrib), ot_help) + endIf + let attrib = attrib * 2 +EndWhile +EndFunction + +Script SayTextAndAttributes () +var + int x, + int y, + handle WinHandle, + int prevAttrib, + int curAttrib +let WinHandle = GetFocus () +SaveCursor () +InvisibleCursor () +MoveToWindow (WinHandle) +SetRestriction(RestrictAppWindow) +let prevAttrib = 1 +let curAttrib = GetCharacterAttributes () +while ((x != getCursorCol ()) || (y != getCursorRow ())) + let x = getCursorCol () + let y = getCursorRow () + SayAttributesChanges (prevAttrib, curAttrib) + SayField () + NextChunk () + let prevAttrib = curAttrib + let curAttrib = GetCharacterAttributes () + delay (1) +EndWhile +RestoreCursor () +EndScript + +Void Function SayAttributesChanges (int prevAttrib, int curAttrib) +var + int attrib, + string sAttrib +let attrib = attrib_bold +while (attrib <= attrib_highlight) + if ((prevAttrib & attrib) != (curAttrib & attrib)) then + if (curAttrib & attrib) then + let sAttrib = IntToAttribName (attrib) + let sAttrib = FormatString (cmsg240_L, sAttrib) + SayFormattedMessage (ot_help, sAttrib) + else + let sAttrib = IntToAttribName (attrib) + let sAttrib = FormatString (cmsg241_L, sAttrib) + SayFormattedMessage (ot_help, sAttrib) + endIf + endIf + let attrib = attrib * 2 +EndWhile +EndFunction + +void Function MouseMovedEvent (int x, int y) +;Cancel selection if MAGic is the only product running +; and user starts to select with the mouse. +if getRunningFSProducts () == product_MAGic +&& (isLeftMouseButtonDown () || isLeftButtonDown ()) +&& (isVirtualPcCursor () || IsFormsModeActive ()) +&& ! stringIsBlank (biltin::GetSelectedText ()) then + CancelSelection () +endIf +; Add your code for MouseMovedEvent here. +; Changes made here apply to all applications. +; To make your changes application specific, copy this function to an +; application script file. +EndFunction + +void Function MouseButtonEvent (int eventID, int x, int y) +; Add your code for MouseButtonEvent here. +; Changes made here apply to all applications. +; To make your changes application specific, copy this function to an +; application script file. +; Possible event identifiers are as follows: +; WM_LBUTTONDOWN = 0x0201 +; WM_LBUTTONUP = 0x0202 +; WM_LBUTTONDBLCLK = 0x0203 +; WM_RBUTTONDOWN = 0x0204 +; WM_RBUTTONUP = 0x0205 +; WM_RBUTTONDBLCLK = 0x0206 +; WM_MBUTTONDOWN = 0x0207 +; WM_MBUTTONUP = 0x0208 +; WM_MBUTTONDBLCLK = 0x0209 +; WM_MOUSEWHEEL = 0x020A +if eventID == WM_LBUTTONDOWN + if GetWindowClass(GetWindowAtPoint(x,y)) == cwc_VirtViewHelp + ;run the code to exit the virtual viewer when the mouse is used to close it: + var object element = GetUIAElementAtPoint(x,y) + if element.controlType == UIA_ButtonControlTypeId + && (element.name == cscButton_Minimize || element.name == cscButton_Close) + ExitUserBuffer() + endIf + EndIf +endIf +EndFunction + +Int Function GetWordWidth () +var + int nLength, + int nPixels, + int nSafety +let nSafety = 0 +let nPixels = 0 +let nLength = StringLength (GetWord()) +if (nLength == 0) then + return 0 +endIf +SaveCursor() +InvisibleCursor() +RouteInvisibleToPc () +while (nSafety < nLength) + let nPixels = nPixels + GetCharacterWidth() + if (IsWordDelimiter(GetCharacter())) then + return nPixels + endIf + NextCharacter() + let nSafety = nSafety + 1 +endwhile +return nPixels +EndFunction + +Int Function IsWordDelimiter (string strChar) +if (StringLength(strChar) > 1) then + return 0 +endIf +return (StringContains (WORD_DELIMITERS, strChar) != 0) +EndFunction + +Int Function GetBrailleMode () +return GetJCFOption(OPT_BRL_MODE) +EndFunction + +Void Function SetBrailleMode (int nMode) +SetDefaultJcfOption(OPT_BRL_MODE,nMode) +EndFunction + +; *** +; Run Manager section +; *** + +Script WindowClassReassign () + var + string TheApp, + string TheClass, + string RunIt + Let TheApp = GetActiveConfiguration () + let TheClass = GetWindowClass( GetCurrentWindow() ) + ;cwn2="Invalid Window Handle" + If (TheClass == cwn2) then + ;cwn3="Invalid" + let TheClass = cwn3 + endIf + ;RunIt = SettingsCenter.exe -a[Application] + -c[Class Name] + d[Dialog mode] + Let RunIt = FormatString (SettingsCenter_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, TheApp, + FLAG_CLASS, TheClass, + FLAG_CLASS_MODE) + Run (RunIt) +EndScript + +Void Function DoCustomHighlightColors (string strForeground, string strBackground, string sApp) +var + int nIndex, + string RunIt +;Protect the FocusChangedEvent from misinterpreting the two successive HJ Dialogs +Let GlobalWasHjDialog = FALSE +let nIndex = DlgSelectItemInList (cmsgCustomHighlight1, cmsgCustomHighlight2, false) +If (nIndex == 0) then + return +endIf +If (nIndex == 1) then + RunIt = FormatString (SettingsCenter_Color_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, sApp, + FLAG_FOREGROUND_COLOR, strForeground, + FLAG_BACKGROUND_COLOR, strBackground, + FLAG_HIGHLIGHTS_MODE) + ElIf (nIndex == 2) then + Let RunIt = FormatString (SettingsCenter_Color_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, sApp, + FLAG_FOREGROUND_COLOR, strForeground, + cScNull, cScNull, + FLAG_HIGHLIGHTS_MODE) + ElIf (nIndex == 3) then + Let RunIt = FormatString (SettingsCenter_Color_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, sApp, + cScNull, cScNull, + FLAG_BACKGROUND_COLOR, strBackground, + FLAG_HIGHLIGHTS_MODE) + endIf + Run(RunIt) +EndFunction + +Void Function AddBrailleColors (string strForeground, string strBackground, string sApp) + var + int nIndex, + string RunIt + ;Protect the FocusChangedEvent from misinterpreting the two successive HJ Dialogs + Let GlobalWasHjDialog = FALSE + let nIndex = DlgSelectItemInList (cmsgCustomHighlight1, cmsgCustomHighlight2, false) + If (nIndex == 0) then + return + endIf + If (nIndex == 1) then + Let RunIt = FormatString (SettingsCenter_Color_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, sApp, + FLAG_BRL_FOREGROUND_COLOR, strForeground, + FLAG_BRL_BACKGROUND_COLOR, strBackground, + FLAG_BRAILLE_COLORS_MODE) + ElIf (nIndex == 2) then + Let RunIt = FormatString (SettingsCenter_Color_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, sApp, + FLAG_BRL_FOREGROUND_COLOR, strForeground, + cScNull, cScNull, + FLAG_BRAILLE_COLORS_MODE) + ElIf (nIndex == 3) then + Let RunIt = FormatString (SettingsCenter_Color_Run_Ex, + FindJAWSUtilityProgram (Utility_SettingsCenter), + FLAG_APP, sApp, + cScNull, cScNull, + FLAG_BRL_BACKGROUND_COLOR, strBackground, + FLAG_BRAILLE_COLORS_MODE) + endIf + Run(RunIt) +EndFunction + +Script CustomHighlightAssign () +var + string TheApp, + string strForeground, + string strBackground +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +Let TheApp = GetActiveConfiguration () +let strForeground = ColorToRGBString(GetColorText()) +let strBackground = ColorToRGBString(GetColorBackground()) +DoCustomHighlightColors (strForeground, strBackground, TheApp) +EndScript + +Script BrailleColorMarkingAssign (int index) + var + string TheApp, + string strForeground, + string strBackground +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf + Let TheApp = GetActiveConfiguration () + SaveCursor () + BrailleCursor () + let strForeground = ColorToRGBString(GetColorText()) + let strBackground = ColorToRGBString(GetColorBackground()) + RestoreCursor () + AddBrailleColors (strForeground, strBackground, TheApp) +EndScript + +Script SettingsCenter () +var + Handle hCurrent, + string sApplication, + string TheDomain, + string sClass, + string sCommandLine +let sApplication = GetActiveConfiguration () +let TheDomain = GetActiveConfiguration (TRUE) +let hCurrent = GetCurrentWindow () +If hCurrent then + let sClass = GetWindowClass (hCurrent) +Else + ;cwn3="Invalid" + let sClass = cwn3 +EndIf +sCommandLine = FormatString (SettingsCenter_Run, FindJAWSUtilityProgram (Utility_SettingsCenter), FLAG_APP, sApplication, FLAG_CLASS, sClass, cScNull) + +if TheDomain != cscNull then + ; add the domain option to the command line + let sCommandLine = sCommandLine + " " + FLAG_DOMAIN + "\"" + TheDomain + "\"" +endIf + + Run (sCommandLine) +EndScript + +Script MessageCenter () +RunMessageCenter() +EndScript + +String Function CreateDictionaryCommandLine (int bDoAddDialog) +var + string theword, + int HighlightFound, + string TheApp, + string TheDomain, + string Runit, + HANDLE CurrentWindow +let theword = GetWord() +Let TheApp = GetActiveConfiguration () +Let TheDomain = GetActiveConfiguration (TRUE) +let CurrentWindow = GetCurrentWindow() +if (GetCharacterAttributes() & ATTRIB_GRAPHIC) +&& !IsVirtualPCCursor() then + SayMessage (ot_error, cmsg177_L) ; "Use the Graphics Labeler to label graphics" + return cscNull +endIf +;See if there is highlighted text +if CurrentWindow +&& IsPCCursor() +;Verify that we're not in a Enhanced Edit document: +&& GetDocumentPercentage () < 0 +&& ! IsVirtualPcCursor() then + SaveCursor() + InvisibleCursor () + RouteInvisibleToPc () + if (GetCharacterAttributes () & ATTRIB_HIGHLIGHT) then + let theWord = GetField() + else + PriorCharacter () + if (GetCharacterAttributes () & ATTRIB_HIGHLIGHT) then + let theWord = GetField() + endIf + endIf + RestoreCursor() +ElIf IsVirtualPcCursor () +|| GetDocumentPercentage () >= 0 then + If GetSelectedText () then;Honor selection of multiple words + Let TheWord = GetSelectedText () + Else + Let TheWord = GetWord () + EndIf +EndIf +if (theword != cscNull) then + ;RunIt = "JDiction.exe -a[Application] -r[Rule] + Let RunIt = FormatString (JDiction_Run_Ex, + FindJAWSUtilityProgram (MGR_DICTION), + FLAG_APP, TheApp, + FLAG_RULE, TheWord) + if (bDoAddDialog == TRUE) then + let Runit = Runit + " -d" + endIf +else + ;RunIt = "JDiction.exe -a[Application] + Let RunIt = FormatString (JDiction_Run, + FindJAWSUtilityProgram (MGR_DICTION), + FLAG_APP, TheApp) + if (bDoAddDialog == TRUE) then + let Runit = Runit + " -d" + endIf +endIf +if TheDomain != cscNull then + ; add the domain option to the command line + let Runit = Runit + " " + FLAG_DOMAIN + " \"" + TheDomain + "\"" + +endIf +return RunIt +EndFunction + +Script DictionaryManager (optional string strCommandLine) +var + String RunIt +;Start dictionary Manager +if StringIsBlank (strCommandline) then + let RunIt = CreateDictionaryCommandLine (FALSE) +else + let RunIt = strCommandLine +EndIf +if (RunIt != cscNull) then + Run (RunIt) +endIf +EndScript + +Void Function FrameClearValues () +let GlobalFrameTop = VALUE_NOT_READY +let GlobalFrameLeft = VALUE_NOT_READY +let GlobalFrameBottom = VALUE_NOT_READY +let GlobalFrameRight = VALUE_NOT_READY +let GlobalFrameParentTop = VALUE_NOT_READY +let GlobalFrameParentLeft = VALUE_NOT_READY +let GlobalFrameParentBottom = VALUE_NOT_READY +let GlobalFrameParentRight = VALUE_NOT_READY +EndFunction + +void function CreateFrameOrPromptForRegion() +var + int iChoice, + int iTask, + int nMode, + int iHasPrompt, + handle hMenu, + string sMenuClass +let iHasPrompt=(GetFramePrompt()!=cscNull || BrailleGetFramePrompt()!=cscNull || + GetFrameTutorMessage()!=cscNull) +Let nMode = GlobalMenuMode +If nMode > 1 then + Let hMenu = GetCurrentWindow () +EndIf +If hMenu then + Let sMenuClass = GetWindowClass (hMenu) +EndIf +if iHasPrompt then + let iTask = FRAMEVIEW_ModifyPrompt + let iChoice=dlgSelectItemInList(cModifyFrameOrPromptMenu,cCreateFrameOrPromptTitle,FALSE) +else + let iTask = FRAMEVIEW_CreatePrompt + let iChoice=dlgSelectItemInList(cCreateFrameOrPromptMenu,cCreateFrameOrPromptTitle,false) +endIf +if iChoice==1 then + frameManagerRun(FRAMEVIEW_ShowActiveFrames|FRAMEVIEW_CreateFrame,nMode,hMenu,sMenuClass) +elif iChoice==2 then + FrameManagerRun(iTask) +endIf +endFunction + +Script FrameGetTopLeft () +if (IsSameScript ()) then + FrameSetOnWindow (GetCurrentWindow()) +else + ;JAWSCursor () + let GlobalFrameLeft = getCursorCol () + let GlobalFrameTop = GetLineTop () + if (!GlobalFrameTop) then + let GlobalFrameTop = getCursorRow() + endIf + SayFormattedMessage (ot_status, cmsg183_L, cmsg183_S) ; "Setting Frame top left corner " +endIf +SetParentDims() +if ((GlobalFrameBottom != VALUE_NOT_READY) && (GlobalFrameRight != VALUE_NOT_READY)) then + CreateFrameOrPromptForRegion() + ; reset GlobalVariables + FrameClearValues() +endIf +EndScript + +Script FrameGetBottomRight () +;JAWSCursor () +let GlobalFrameRight = getCursorCol () + GetCharacterWidth () +let GlobalFrameBottom = GetLineBottom ()+1;Fudge by 1 pixel to ensure accuracy +; format Top Left Dimensions to a string +SayFormattedMessage (ot_status, cmsg184_L, cmsg184_S) ; "Setting Frame bottom right corner " +SetParentDims() +if ((GlobalFrameTop != VALUE_NOT_READY) && (GlobalFrameLeft != VALUE_NOT_READY)) then + CreateFrameOrPromptForRegion() + ; reset GlobalVariables + FrameClearValues() +endIf +EndScript + +Script QuickViewSetTopLeft () +if QuickViewFramesUnsupported() then + return +EndIf +if IsSameScript() then + FrameSetOnWindow(GetWindowAtPoint(GetCursorCol(CURSOR_JAWS), GetCursorRow(CURSOR_JAWS))) +else + ;use rectangles instead of specific functions for coordinates: + ;let GlobalFrameLeft = getCursorCol (CURSOR_JAWS) + ;let GlobalFrameTop = GetLineTop (CURSOR_JAWS) + saveCursor () + JAWSCursor () + globalFrameLeft = getCursorCol () + getItemRect (GlobalFrameLeft, getCursorRow (), 0, 0, GlobalFrameTop, 0, IT_LINE) + restoreCursor () + if !GlobalFrameTop then + let GlobalFrameTop = getCursorRow(CURSOR_JAWS) + endIf + Say(cmsgQVSetTopLeftCorner,ot_status) +endIf +if GlobalFrameBottom != VALUE_NOT_READY +&& GlobalFrameRight != VALUE_NOT_READY then + FrameManagerRun(FRAMEVIEW_ShowActiveFrames|FRAMEVIEW_CreateFrame) + ; reset GlobalVariables + FrameClearValues() +endIf +EndScript + +Script QuickViewSetBottomRight () +if QuickViewFramesUnsupported() then + return +EndIf +;Use the rectangle to set the frame instead of the specific functions for a given coordinate +let GlobalFrameRight = getCursorCol (CURSOR_JAWS) + GetCharacterWidth () +;let GlobalFrameBottom = GetLineBottom (CURSOR_JAWS)+1;Fudge by 1 pixel to ensure accuracy +saveCursor () + JAWSCursor () + getItemRect (GlobalFrameRight, getCursorRow (), 0, 0, 0, GlobalFrameBottom, IT_LINE) +restoreCursor () +; format Top Left Dimensions to a string +Say(cmsgQVSetBottomRightCorner,ot_status) +if GlobalFrameTop != VALUE_NOT_READY +&& GlobalFrameLeft != VALUE_NOT_READY then + FrameManagerRun(FRAMEVIEW_ShowActiveFrames|FRAMEVIEW_CreateFrame) + ; reset GlobalVariables + FrameClearValues() +endIf +EndScript + +Void Function FrameSetOnObject ();Useful for SDM windows +var + int iLeft, int iTop, int iRight, int iBottom +GetObjectRect (iLeft, iRight, iTop, iBottom) +let GlobalFrameTop = iTop +let GlobalFrameLeft = iLeft +let GlobalFrameBottom = iBottom +let GlobalFrameRight = iRight +EndFunction + +Void Function FrameSetOnWindow (handle CurrentWindow) +if (!CurrentWindow) then + let CurrentWindow = GetCurrentWindow() +endIf +;For SDM Dialogs +If StringContains (GetWindowClass (CurrentWindow),cWcSdmDlg) then + FrameSetOnObject () + Return +EndIf +let GlobalFrameTop = GetWindowTop (CurrentWindow) +let GlobalFrameLeft = GetWindowLeft (CurrentWindow) +let GlobalFrameBottom = GetWindowBottom (CurrentWindow) +let GlobalFrameRight = GetWindowRight (CurrentWindow) +EndFunction + +Void Function FrameManagerRun (int nAction, optional int nMode, handle hMenu, string sMenuClass) +var + HANDLE hRealWindow, + string sRealName, + string sClass, + string sPrompt, + int nPeriod, + int nLength +if GlobalFrameTop == VALUE_NOT_READY +|| GlobalFrameLeft == VALUE_NOT_READY +|| GlobalFrameBottom == VALUE_NOT_READY +|| GlobalFrameRight == VALUE_NOT_READY then + return +endIf +if GetRunningFSProducts() == product_MAGic then + PcCursor() + QuickViewManager(nAction, + VALUE_NOT_READY, VALUE_NOT_READY, VALUE_NOT_READY, VALUE_NOT_READY, + GlobalFrameTop, GlobalFrameLeft, GlobalFrameBottom, GlobalFrameRight, + cScNull, cScNull, cScNull) + return +endIf +If nMode then + Let hRealWindow = hMenu; Handle of Menu window + let sClass = sMenuClass;Class of the menu + Let sRealName = cScNull;Do not pass real window name in for menus +Else + let hRealWindow = GetTopLevelWindow (GetCurrentWindow()) + let sClass = GetWindowClass(hRealWindow) + let sRealName = GetWindowName(hRealWindow) +EndIf +let nLength = StringLength(sRealName) +; Make sure that the last character of the RealName does not end with a single slash. +; If it does, then add another slash to it. One slash alone, combined with the +; end quote, will make an escape sequence. +if (StringRight(sRealName, 1) == "\\" && StringRight(sRealName, 2) != "\\\\") then + let sRealName = sRealName + "\\" +endIf +; Prompt Code +if (nAction == FRAMEVIEW_CreatePrompt) then + let sPrompt = GetWindowName(GetCurrentWindow()) +else + let sPrompt = cScNull +EndIf +PcCursor () +FrameViewer(nAction, + GlobalFrameParentTop, GlobalFrameParentLeft, GlobalFrameParentBottom, GlobalFrameParentRight, + GlobalFrameTop, GlobalFrameLeft, GlobalFrameBottom, GlobalFrameRight, + sRealName, sClass, sPrompt) +EndFunction + +Script CreatePrompt() +var + int nIsWinValid, + int iShouldClass, + int iWinType, + int iTask +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +If !AreUtilitiesAllowed() then + return +endIf +Let nIsWinValid = PromptValidator () +;Kill if creating prompt is not appropriate +If ! nIsWinValid then + SayFormattedMessage (OT_ERROR, cMsg376_L);"Cannot create prompt" + Return +EndIf +if ShouldUseCustomLabler(getCurrentWindow()) then + dlgCustomLabel() + return +endIf +let iShouldClass = FALSE +if (GetFrameNameAtCursor()) then + let iTask = FRAMEVIEW_ModifyPrompt +else + let iTask = FRAMEVIEW_CreatePrompt +endif + +if (iTask == FRAMEVIEW_CreatePrompt) then + Let iWinType = GetWindowSubTypeCode (GetCurrentWindow ()) + If ! iWinType then + Let iShouldClass = ExMessageBox( + FormatString(cMsgPromptDlg), + cMsgPromptDlgName, + MB_YESNOCANCEL|MB_DEFBUTTON1|MB_ICONASTERISK) + If iShouldClass == IDCANCEL then + Return + EndIf + + Else + Let iShouldClass = FALSE + EndIf + If iShouldClass != IDYES then + Let iShouldClass = FALSE + EndIf +endif + +If ! iShouldClass then + FrameSetOnWindow (GetCurrentWindow()) + SetParentDims() + FrameManagerRun(iTask,0,0,cScNull) + ; reset GlobalVariables + FrameClearValues() +Else + PerformScript WindowClassReassign () +EndIf +EndScript + +Function SetParentDims () +var +HANDLE hRealWindow + +let hRealWindow = GetTopLevelWindow (GetCurrentWindow ()) +let GlobalFrameParentLeft = GetWindowLeft (hRealWindow) +let GlobalFrameParentTop = GetWindowTop (hRealWindow) +let GlobalFrameParentRight = GetWindowRight (hRealWindow) +let GlobalFrameParentBottom = GetWindowBottom (hRealWindow) +EndFunction + +Script FrameManager () +FrameSetOnWindow (GetCurrentWindow()) +SetParentDims() +if ((GlobalFrameBottom != VALUE_NOT_READY) && (GlobalFrameRight != VALUE_NOT_READY)) then + FrameManagerRun(FRAMEVIEW_ShowActiveFrames, GlobalMenuMode,0,cScNull) + ; reset GlobalVariables + FrameClearValues() +endIf +EndScript + +Script KeyboardManager () +var + string TheApp, + string TheDomain, + string Runit, + HANDLE CurrentWindow +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +let TheApp = GetActiveConfiguration () +let TheDomain = GetActiveConfiguration (TRUE) +;RunIt = "JKey.exe -a[Application]" ;;; must have space between -a and appname +if TheDomain == cscNull then +Let RunIt = FormatString (JKey_Run, + FindJAWSUtilityProgram (MGR_KEYBRD), + FLAG_APP, TheApp) +else + Let RunIt = FormatString(JKey_Run_Domain, + FindJAWSUtilityProgram (MGR_KEYBRD), + FLAG_APP, TheApp, + FLAG_DOMAIN, TheDomain) + +endif +Run (Runit) +EndScript + +Void Function RunJAWSScriptManager () + var + string TheApp, + string TheDomain, + string Runit, + HANDLE CurrentWindow + let TheApp = GetActiveConfiguration () + let TheDomain = GetActiveConfiguration (TRUE) + ;RunIt = "JScript.exe -a [Application]" ;;; must have space between -a and appname + Let RunIt = FormatString (JScript_Run, + FindJAWSUtilityProgram (MGR_SCRIPT), + FLAG_APP, TheApp) + + if TheDomain != cscNull then + ; add the domain option to the command line + let Runit = Runit + " " + FLAG_DOMAIN + " \"" + TheDomain + "\"" + endIf + + Run (Runit) +EndFunction + +void Function RunMAGicScriptManager () +var + string TheApp, + string Runit, + HANDLE CurrentWindow + if (! IsScriptingEditionAuthorized()) + then + SayMessage(ot_error,cmsg_MAGicScriptingNotAuthorized) + return +endIf +let TheApp = GetActiveConfiguration () +;RunIt = "JScript.exe -a [Application]" ;;; must have space between -a and appname + Let RunIt = FormatString(JScript_Run, FindJAWSUtilityProgram(MGR_SCRIPT), FLAG_APP, TheApp) +Run (Runit) +EndFunction + +Script ScriptManager () +var + int RunningProducts +let RunningProducts = GetRunningFSProducts() +If RunningProducts & product_JAWS then + ;only scripts from the JAWS settings are used when JAWS is run with another FS product: + RunJAWSScriptManager () +elIf RunningProducts == product_MAGic then + RunMAGicScriptManager () +EndIf +EndScript + +script ScriptManagerDefault() +var + string RunIt +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +let RunIt = "\"" + FindJAWSUtilityProgram(MGR_SCRIPT) + "\" default.jss" +Run(RunIt) +EndScript + +void function RunNavQuickKeysManager() +NavigationQuickKeysManager (0) +EndFunction + +int function IsCustomizeListViewApplicable(handle hWnd) +;Overwrite for application areas where Customize Listview should not appear in the Run JAWS Manager dialog: +return true +EndFunction + +Script RunJAWSManager () +var + handle hWnd = getFocus (), + string sClass, + string strForeground, + string strBackground, + string strBrlForeground, + string strBrlBackground, + string sApp, + string RunIt, + string sQuery, + string managersList, + int bModifyFrame, + int nMenuMode, + int index, + string selectedListItem, + int bUseCustomLabeler, + int bViewCustomSummary +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +If !AreUtilitiesAllowed() then + return +endIf +If BrailleRunManagerHelper () then + Return +EndIf +Let nMenuMode = GlobalMenuMode +If InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +let bUseCustomLabeler=ShouldUseCustomLabler(GetCurrentWindow()) +let bViewCustomSummary=ShouldShowCustomSummary(GetCurrentWindow()) +if GetFrameNameAtCursor() +&& !bUseCustomLabeler then + let bModifyFrame = TRUE; +else + let bModifyFrame = FALSE; +endif +;get the command line for the dictionary manager so it retains currently selected word +let RunIt = CreateDictionaryCommandLine (false) +if GetSelectedText () +&& (! isJAWSCursor () && ! isInvisibleCursor ()) then + let sQuery = getSelectedText () +else + let sQuery = getWord () +endIf + +let managersList = + SettingsCenterItem + +WindowClassItem + +DictionManItem + +FrameManItem + +KeyManItem + +ScriptManItem + +GraphicsLabelerItem + +CustomHighlightAssignItem + +BrailleAddColorsItem +if ShouldJawsManagerAddMessageCenter() + let managersList = managersList +MessageCenterItem +endif +if IsCustomizeListViewApplicable(hWnd) + let managersList = managersList+CustomizeListViewItem +endIf +let managersList = managersList + +SkimReadingToolItem + +AdjustJAWSOptionsItem + +QuickNavigationKeysItem + +FlexibleWebItem +;We place the Prompt item here since it may or may not appear in the list, +;and if not added, the list index must not then be off by 1. +If PromptValidator()==TRUE +|| CustomSummaryValidator()==true then + if bViewCustomSummary then + let managersList=ManagersList+CustomSummaryDialog + Elif bUseCustomLabeler then + Let ManagersList = ManagersList +CreateCustomLabelItem + Let ManagersList = ManagersList + DeleteCustomLabelItem + Let ManagersList = ManagersList + DeleteAllCustomLabelsItem + else + if bModifyFrame then + Let ManagersList = ManagersList + ModifyPromptItem + else + Let ManagersList = ManagersList + CreatePromptItem + EndIf + endIf +EndIf +; for Excel only at this time: +If CustomSummaryValidator() then + if bViewCustomSummary then + let ManagersList=ManagersList+ViewCustomSummaryItem + EndIf +EndIf +let ManagersList = ManagersList+ResearchItItem +let ManagersList = ManagersList+JAWSSearchItem +if g_NotificationManagerEnabled then + let ManagersList = ManagersList+NotificationHistoryItem +endif +let sClass = GetWindowClass (hWnd) +Let sApp = GetActiveConfiguration () +let strForeground = ColorToRGBString(GetColorText()) +let strBackground = ColorToRGBString(GetColorBackground()) +;No matter what, Get it at Braille Cursor +;As the Braille cursor can be anywhere. +SaveCursor () +BrailleCursor () +Let strBrlForeground = ColorToRGBString(GetColorText()) +Let strBrlBackground = ColorToRGBString(GetColorBackground()) +RestoreCursor () +let index = DlgSelectItemInList (ManagersList, RunManagerDialogTitle, TRUE) +If Index == 0 then + Return +endIf +if stringStartsWith (ManagersList, cscListSeparator) then + ManagersList = stringChopLeft (ManagersList, 1) +endIf +selectedListItem = StringSegment (ManagersList, cscListSeparator, index) +; add the list separator to compare against items in list: +selectedListItem = cscListSeparator+selectedListItem +; all filtering has been done when building the list. +; So all that needs doing is add new items at the end with functions / scripts to run. +If selectedListItem == SettingsCenterItem + PerformScript SettingsCenter () +elif selectedListItem == WindowClassItem + PerformScript WindowClassReassign () +elif selectedListItem == DictionManItem + PerformScript DictionaryManager (RunIt) +elif selectedListItem == FrameManItem + PerformScript FrameManager () +elif selectedListItem == CreatePromptItem + PerformScript CreatePrompt () +elif selectedListItem == ModifyPromptItem + FrameSetOnWindow (GetCurrentWindow()) + SetParentDims() + FrameManagerRun(FRAMEVIEW_ModifyPrompt,nMenuMode,0,cScNull) + ; reset GlobalVariables + FrameClearValues() +elif selectedListItem == CreateCustomLabelItem + PerformScript CreatePrompt () +elif selectedListItem == DeleteCustomLabelItem + pause();give dialog time to be dismissed + DeleteCustomLabel() +elif selectedListItem == DeleteAllCustomLabelsItem + pause();give dialog time to be dismissed + DeleteAllCustomLabels () +elif selectedListItem == ViewCustomSummaryItem + Pause() ; allow time for dialog to be dismissed. + CustomSummary(sApp) +elif selectedListItem == CustomSummaryDialog + pause () + PerformScript CreatePrompt() +elif selectedListItem == KeyManItem + PerformScript KeyboardManager () +elif selectedListItem == ScriptManItem + PerformScript ScriptManager () +elif selectedListItem == GraphicsLabelerItem + PerformScript GraphicsLabeler () +elif selectedListItem == CustomHighlightAssignItem + Delay (2) + DoCustomHighlightColors (strForeground, strBackground, sApp) +elif selectedListItem == BrailleAddColorsItem + Delay (2) + AddBrailleColors (strBrlForeground, strBrlBackground, sApp) +elif selectedListItem == CustomizeListViewItem + PerformScript CustomizeListView() +elif selectedListItem == SkimReadingToolItem + PerformScript SkimReadDialog() +ElIf selectedListItem == AdjustJAWSOptionsItem + PerformScript QuickSettings () +elif selectedListItem ==QuickNavigationKeysItem + RunNavQuickKeysManager() +elif selectedListItem ==FlexibleWebItem + PerformScript DoFlexibleWebDialog(); +elif selectedListItem == ResearchItItem + RunLookupModuleQueryUsingLRL_Dialog (sQuery) +ElIf selectedListItem == JAWSSearchItem + LaunchCommandsSearchViewer (hWnd) +elif selectedListItem == NotificationHistoryItem + PerformScript ShowNotificationHistory(Script_InvokedBy_Script) +ElIf selectedListItem == MessageCenterItem + PerformScript MessageCenter(); + ;ElIf selectedListItem == SomeNewItem + ;functionHere() +EndIf +EndScript + +; *** +; Window event functions +; *** + +Void Function ForegroundWindowChangedEvent (handle newWindow) +EndFunction + +int Function SpeakInvisibleWindow () +var + handle hFocus, + string sCursorShape, + string sProgressName, + string sProgress +;conditions in which this function should not speak: +let sCursorShape = getCursorShape () +if sCursorShape == cscWAIT || sCursorShape == cscAppStart then + return FALSE +endIf +Let hFocus = getFocus () +;previous or current window in exceptions list, e.g. no announce: +if hFocus +&& (stringContains (cwnFocusLossExceptionsList, globalPrevRealName) +|| StringContains (cwnFocusLossExceptionsList, getWindowName (getRealWindow (globalFocusWindow)))) then + return +endIf +;tool tip, help balloon: actions are in progress, so not really "out of focus" +if isWindowVisible (ghwndToolTip) then + return FALSE +endIf +;If a progress bar is running, prevent this from speaking: +if isWindowVisible (GetProgressBarInfo (sProgressName, sProgress)) +|| ! StringIsBlank (sProgressName) +|| ! StringIsBlank (sProgress) then + return FALSE +endIf +if ! hFocus;no foreground +|| (hFocus && ! isWindowVisible (hFocus);foreground is invisible, +;this invalid circumstance mans the whole app's hierarchy is invisible, out of scope but still has keyboard focus. +&& ! isWindowVisible (getParent (hFocus))) then +if hFocus && StringStartsWith(GetWindowClass(hFocus),"Chrome") +return False +EndIf + SayUsingVoice (vctx_message, cmsgFocusLoss, OT_SCREEN_MESSAGE) + if hFocus then + BrailleMessage (cmsgBrlLostFocus, OFF, 10000);keep message up until user can act + endIf + ;Tutor message goes here, as the event does not go off, and we don't want to create timing problems with duplicate (forced) event calls, resulting in an unknown function call. + SayUsingVoice (vctx_message, cmsgFocusLossTutor, OT_TUTOR) + Return TRUE +;All windows have closed, save the desktop and task bar +elIf AllAppsClosedFromSystemTray (hFocus) then + SayUsingVoice (vctx_message, cmsgFocusLoss, OT_SCREEN_MESSAGE) + if hFocus then + BrailleMessage (cmsgBrlLostFocus, OFF, 10000);keep message up until user can act + endIf + ;Tutor message goes here, as the event does not go off, and we don't want to create timing problems with duplicate (forced) event calls, resulting in an unknown function call. + if ShouldItemSpeak(OT_TUTOR) == TUTOR_ALL then + SayMessage (OT_TUTOR, cmsgFocusLossTutor) + EndIf + Return TRUE +endIf +endFunction + +void Function WindowActivatedEvent(handle hWnd) +unScheduleFunction (giFN_SpeakInvisibleWindow); +;Handle focused window who is invisible: +;Skype and some antivirus software can get in this state, and the user has no way of knowing. +;Also handle ShellTrayWnd window, another "No Man's land" in which we want to say the previous app that lost focus. +;This must be at least half a second, as if the window focused upon is a list or other such window where items are being drawn, it may not be visible for a few hundred milliseconds. +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) then + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) +endIf +EndFunction + +globals handle hHomeRowPos +Void Function WindowCreatedEvent (handle hWindow, int nLeft, int nTop, int nRight, int nBottom) +var + handle hFocus +; It is best to override this function in application specific script files. +; Any code placed here will be processed very frequently. +LyncAddConversationToCollection (hWindow) +CheckForWinVistaErrorDialog(hWindow) +CheckForReminderDialog (hWindow) +;If a window is created after focus loss, either User or Application has acted and focus is no longer lost: +UnscheduleFunction (giFN_SpeakInvisibleWindow) +Let giFN_SpeakInvisibleWindow = 0; +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) then + let hFocus = getFocus () + if AllAppsClosedFromSystemTray (hFocus) + || (hFocus && ! isWindowVisible (hFocus)) then + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) + endIf +endIf +EndFunction + +Function WindowDestroyedEvent (handle hWindow) +;This event is most reliable for changing a system tray item. +DestroyOldSkypeAlerts (hWindow) +RemoveUIALyncConversationWindowData (hWindow) +RemoveMainUIALyncEventHandler (hWindow) +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) +&& AllAppsClosedFromSystemTray (getFocus ()) then + unScheduleFunction (giFN_SpeakInvisibleWindow) + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) + Return +endIf +If (WindowClosed == true) then + SayFormattedMessage (OT_JAWS_MESSAGE, cmsg40_L, cmsg40_S) + let WindowClosed = false +endIf +if hWindow == ghWndAutoCompleteSuggestionList + ghWndAutoCompleteSuggestionList = ghNull +elif hWindow == ghWndResultsViewer then + ghWndResultsViewer = ghNull +; Nulls ToggleOutlookReminder-related window variables. +elif hWindow==ghOutlookWindow Then + ghOutlookWindow=ghNull + ghReminderDialog=ghNull +ElIf hWindow==ghReminderDialog Then + ghReminderDialog=ghNull +ElIf hWindow==ghReminderReturn Then + ghReminderReturn=ghNull +EndIf +EndFunction + +void Function WindowMinMaxEvent (handle hWindow, int nMinMaxRest, int nShow) +;Prevent speaking of focus loss, the user or an application has acted: +unScheduleFunction (giFN_SpeakInvisibleWindow) +EndFunction + +void Function WindowsToastEvent(string notificationText, string sender) + ProcessNotificationTextAndSpeakIfAllowed(notificationText, sender) +EndFunction + +void Function WindowResizedEvent (handle hWindow, int nLeft, int nTop, int nRight, int nBottom) +if IsBackgroundOCREnabled() + ;The Background OCR rectangle will have changed if the window is resized. + ;Set c_BackgroundOCRRect.shouldUpdateRect to true so that an updated rectangle will be retrieved. + c_BackgroundOCRRect.shouldUpdateRect = true +endIf +if IsWindows11Version24H2 () + ;handled through UIANotificationEvent + return +endIf +if hWindow == c_WinArrow.hWindow +&& (GetTickCount() - c_WinArrow.lastPress) < WinArrowThreshhold + var int iVisualState = FSUIAGetWindowVisualState(hWindow) + if iVisualState == WindowVisualState_Normal + if !SayWindowSnap(hWindow, nLeft, nTop, nRight, nBottom) + Say (cmsgWindowRestored, OT_STATUS) + endIf + elIf iVisualState == WindowVisualState_Maximized + Say (cmsgWindowMaximized, OT_STATUS) + elIf iVisualState == WindowVisualState_Minimized + Say (cmsgWindowMinimized, OT_STATUS) + endIf + ClearWinArrowGlobals() +endIf +EndFunction + +void Function ProcessNotificationTextAndSpeakIfAllowed(string notificationText, string sender) +var collection notificationRuleActions +if notificationText + ; We don't want to repeat notifications endlessly. If we've previously said the same thing, no need to repeat ourselves. + if !IsRepeatNotification(notificationText) + notificationRuleActions = ProcessNotification(notificationText, sender) + if GetJCFOption(OPT_ENABLE_TOAST_NOTIFICATION_PROCESSING) != 0 then + SayNotification(notificationRuleActions, ot_toasts) + endIf + endIf + ; We want to store the original notification to view + ; in the notification Viewer, + ; if the user wants to see the notification there + if !notificationRuleActions.ExcludeFromNotificationHistory then + StoreSpokenNotificationForRepeat (notificationText, sender) ; for new insert+Space&N keystroke. + endIf +endIf +; Skype 8 and later can use toasts, so update the insert+space&r keystroke: +if stringContains (notificationText, "Skype") then LastBackgroundNotificationText = notificationText endIf +EndFunction + +void function SpeakAnyVisibleWindowsNotification(optional handle hWnd) +;WindowResizedEvent should supply a window handle when calling, +;AutoStart should not supply a window handle when calling. +if ghNotificationClassWindow && hWnd +&& hWnd != ghNotificationClassWindow + ;A notification was detected at some prior time, so we know the window handle to use, + ;and this handle does not match the notification handle. + return +endIf +var string notificationText, string sender +if !ghNotificationClassWindow + ;This is being called from AutoStartEvent, + ;or from WindowResizedEvent and no visible notification has yet been detected. + ;We must determine if a notification window is actually visible, + ;and if so, cache the notification windows handle. + if hWnd + ;Called by WindowResizedEvent, + ;we don't yet have a handle, this may be the first notification: + if GetWindowsNotificationTextFromHandle(hWnd,notificationText, sender) + ghNotificationClassWindow = hWnd + endIf + else + ;Called by AutoStart or some other function where we don't have a window handle to use: + hWnd = GetFirstWindow(GetTopLevelWindow(GetFocus())) + while hWnd && !notificationText + if GetWindowClass(hWnd) == cwc_Windows_UI_Core_CoreWindow + && GetWindowsNotificationTextFromHandle(hWnd,notificationText, sender) + ghNotificationClassWindow = hWnd + endIf + hWnd = GetNextWindow(hWnd) + endWhile + endIf +else + ;A notification has previously been detected, + ;so we know that this is the notification window. + GetWindowsNotificationTextFromHandle(hWnd,notificationText, sender) +endIf +ProcessNotificationTextAndSpeakIfAllowed(notificationText, sender) +EndFunction + +int function GetWindowsNotificationTextFromHandle(handle hWnd, string byRef NotificationText, optional string byRef Sender) +NotificationText = cscNull +Sender = cscNull +var object element = FSUIAGetElementFromHandle(hWnd) +if !element return false endIf +var object child = FSUIAGetFirstChildOfElement(element) +if !child return false endIf +if child.controlType == UIA_WindowControlTypeId +&& child.automationID == UIAAutomationID_NormalToastView + NotificationText = child.name +endIf +if !notificationText return false endIf +var object notificationElement = FSUIAGetFirstChildOfElement(child) +while(notificationElement) + if notificationElement.automationID == UIAAutomationID_SenderName then + Sender = notificationElement.name + return true + endIf + notificationElement = FSUIAGetNextSiblingOfElement(notificationElement) +endWhile +return true +EndFunction + +Script SetVERBOSITYLevel () +SayFormattedMessage (OT_STATUS, VerbosityLevelToggle (FALSE)) +EndScript + +Script SetBrailleVerbosity (int index) +;List box function: +;AdjustBrailleOptions is tree view version. +var + string sList +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +Let sList = cStrBrailleList() +if DeviceHasWhizWheels() then + let sList = sList+cStrBrailleListWhizOption +EndIf +If IsVirtualPcCursor () then + Let sList = sList+cStrTableBrailleList() +EndIf +If BrailleSupportsTypeKeysMode() then + Let sList = sList+cStrBrailleTypeKeysModeOption +EndIf +let sList = StringChopLeft(sList,1) +DlgSelectFunctionToRun (sList, cStrBrailleDlgName, false) +EndScript + +Script AdjustBrailleOptions (int index);Tree view: +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +if InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +QuickSettingsPreProcess () +LaunchQuickSettings () +delay (2, TRUE) +loadNonJCFOptions (); update application-wide options. +QuickSettingsLoadDocumentSettings () +EndScript + +Script SetScreenEcho () +SayFormattedMessage(OT_STATUS, ScreenEchoToggle (FALSE)) +EndScript + +script SpellMode() +SayMessage (OT_STATUS, SpellModeToggle (FALSE)) +EndScript + +Script SetTypingEcho () +SayFormattedMessage(OT_STATUS, TypingEcho(FALSE)) +EndScript + +script ToggleTypingEcho() +var + int nNewTypingEcho, + int bSuccess +bSuccess = MagTypingEchoToggle(nNewTypingEcho) +if bSuccess then + if nNewTypingEcho then + Say(cmsgKeyboardEchoOn,ot_status) + else + Say(cmsgKeyboardEchoOff,ot_status) + EndIf +else + beep() +endif +EndScript + +Script SetGraphicsVerbosity () +SayFormattedMessage (OT_STATUS, GraphicsVerbosity (FALSE)) +EndScript + +;User Verbosity Dialog, legacy: +Script AdjustJAWSVerbosity () +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +JAWSVerbosityCore (cscNull) +EndScript + +;Options Dialog with Tree View: +Script AdjustJAWSOptions () +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +;This function call sends the optional TRUE parameter as second +;so that we retain node settings that we define, +;including those at level 0. +;If you want us to create nodes for you, call the below function in your own copy of this script, +;and include the following: +;Second parameter (optional) = false, or ignore. +;If second parameter is filled in as FALSE, optionally fill in third parameter, +;with a name for the node under which we will place all your options that do not have node paths. +;Otherwise, call this function with just the parameter with your options like this: +;OptionsTreeCore(strMyOptionsLinst) +;And at the top of the Adjust JAWS Options dialog, you will see a node as follows: +;ConfigurationName Options +;Where ConfigurationName is the name of your configuration, +;e.g. Skype Options +if InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +OptionsTreeCore (cScNull, FALSE, cscNull) +EndScript + +int function inQuickSettingsDialog () +;Only return TRUE from the QuickSettings script file, +; since that gets pushed onto the stack on QuickSettingsLoad, +;and popped on QuickSettings Exit: +return FALSE +endFunction + +void function QuickSettingsPreProcess () +;Code goes here which runs before loading the Quick Settings tool. +EnsureOcrLanguageStrings() +; update the global variable for current language used by Braille tranlation rules: +UpdateBrlLanguageAndMode () +; Turn off Forms Mode to ensure all internal functions that depend upon the virtual cursor can work. +if IsFormsModeActive () then + TurnOffFormsMode (FormsModeEventSpeechSilent) +endIf +endFunction + +void function QuickSettingsPostProcess () +;Code goes here which runs after QuickSettings and before loading the document-specific settings.. +;FlushTouchNavigationConfiguration allows the touch navigation configuration cache for the current config to update: +FlushTouchNavigationConfiguration(GetActiveConfiguration()) +SmartNavSettingsReloadFromQuickSettings () +endFunction + +void function QuickSettingsLoadDocumentSettings () +;Do not add LoadNonJCFOptions, that is already done for you. +;Add your iniRead code from document-specific files, e.g. Personalized settings. +endFunction + +Script QuickSettings () +if getRunningFSProducts () == product_MAGic then + ;do nothing if MAGic-specific limitations are not met: + if ! gbSupportsMAGicOptions && ! isVirtualPcCursor () && ! IsFormsModeActive () then + return + endIf +endIf +If !AreUtilitiesAllowed() then + return +endIf +if InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +var +int oldSplitMode=BrailleGetSplitMode() +BrailleSplitMode(0) +QuickSettingsPreProcess () +LaunchQuickSettings () +delay (2, TRUE) +loadNonJCFOptions (); update application-wide options. +SetUpStuffForNewPage (TRUE) +QuickSettingsPostProcess () +QuickSettingsLoadDocumentSettings () +BrailleSplitMode(oldSplitMode) +endScript + +Script PersonalizeSettings () +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +;To launch Qick Settings and point specifically to the Document Settings node. +if InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +QuickSettingsPreProcess () +LaunchQuickSettings () +delay (2, TRUE) +loadNonJCFOptions (); update application-wide options. +LoadDocumentSettings () +EndScript + +void Function SayExtendedHelpHotKey () +var + string sMessageLong, + string sMessageShort, + string sAppName +let sAppName = GetWindowName (GetAppMainWindow (GetCurrentWindow ())) +let sMessageLong = FormatString (cmsg213_L, sAppName) +let sMessageShort = FormatString (cmsg213_S, sAppName) +SayFormattedMessage (OT_APP_START, sMessageLong, sMessageShort) +EndFunction + +String Function GetCorrespondingHelpFile (string strApp) +var + string strHelpFile +let strHelpFile = FindJAWSHelpFile (strApp) +return strHelpFile +EndFunction + +Void Function AppFileTopic (int iTopic) +var + string strHelpFile +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +let strHelpFile = "JFW" +If iTopic then + ShowHelpByID (strHelpFile, iTopic) +Else + SayFormattedMessage (ot_error, cmsg201_L, cmsg201_S); "There is no JAWS specific help for this application " + ShowHelpByID (strHelpFile, 0);Kill Virtual Buffer and close help window ... +endIf +EndFunction + +Void Function AppWillNotSpeakEvent (string strApp) +var + string sMessage +let sMessage = FormatString (cmsg202_L, strApp) +SayFormattedMessage (ot_JAWS_message, sMessage) +EndFunction + +Script ListTaskTrayIcons () +If !(GetRunningFSProducts() & product_JAWS) + return +endIf +if InHJDialog () + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +if IsWindows10() + ListWin10TaskTrayIcons () +else + ListWin7TaskTrayIcons () +endIf +EndScript + +void function ListWin7TaskTrayIcons () +var int nItems = SysTrayGetItemCount () +if nItems <= 0 + Say (cmsgListTaskTrayIconsError1, OT_ERROR) + return +endIf +var + string strTip, + string GraphicList, + int nIdx +for nIdx = 1 to nItems + strTip = SysTrayGetItemToolTip (nIdx) + ;NOTE: The item should be added to the GraphicList even if it is an empty string. + GraphicList = GraphicList + LIST_ITEM_SEPARATOR + strTip +EndFor +if !GraphicList + Say (cmsgListTaskTrayIconsError1, OT_ERROR) + return +endIf +var + int ScreenHeight = ScreenGetHeight (), + int ScreenWidth = ScreenGetWidth (), + int MagicState = MagGetState (), + int iTetherOption = GetDefaultJCFOption (OPT_TETHER_JAWS_TO_PC), + int nButton +; Temporarily turn off the Tether JAWS to PC option and the virtual cursor: +SetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC, 0) +nButton = DlgSysTray (GraphicList, nIdx) +if nIdx > 0 && nButton > 7000 + SaveCursor () + JAWSCursor () + SaveCursor () + if (MagicState > 0) + MoveTo (ScreenWidth - 2, ScreenHeight - 2) + Delay (10, TRUE) + endIf + SysTrayMoveToItem (nIdx) + if MagicState > 0 + Delay (10, TRUE) + endIF + if nButton == iD_RightSingleClick + RightMouseButton () + elif nButton == iD_LeftSingleClick + LeftMouseButton () + elif nButton == iD_LeftDoubleClick + LeftMouseButton () + LeftMouseButton () + endIf + Delay(5) + RestoreCursor() + RestoreCursor() +endIf +Pause () +SetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC, iTetherOption) +EndFunction + +void function ListWin10TaskTrayIcons () +var + handle hWndTray, + handle hWndTop +hWndTop = FindTopLevelWindow(ShellTrayClass,cscNull) +if !hWndTop + Say (cmsgListTaskTrayIconsError1, OT_ERROR) + return +endIf +var + object element, + int iTreeScope = TreeScope_Children +hWndTray = FindWindow(hWndTop,cwc_TrayNotifyWnd) +if hWndTray + element = FSUIAGetElementFromHandle (hWndTray) + ;It is expected that hWndTray for className cwc_TrayNotifyWnd will be found in all three cases, Win10, early Win11, and newer Win11. + ;However, it is only useful for Win10 and early versions of Win11 + if FSUIAGetFirstChildOfElement (element) + ;Win 10 and Early versions of Win11 + ;Need all descendant buttons of hWndTray (className=cwc_TrayNotifyWnd) + iTreeScope = TreeScope_Descendants + else + ;Newer versions of Win11 + ;hWndTray for className=cwc_TrayNotifyWnd has no children + ;Set hWndTray to Null so that it can be set to the neded window in the next if statement + hWndTray = Null() + endIf +endIf +if !hWndTray + ;Windows11SysTrayIconsClass is found in earlier versions of Win11, but it is only an ancestor of a portion of the needed buttons + ;This is why cwc_TrayNotifyWnd is checked before Windows11SysTrayIconsClass + hWndTray = FindWindow(hWndTop,Windows11SysTrayIconsClass) + if hWndTray + element = FSUIAGetElementFromHandle (hWndTray) + endIf +endIf +if !hWndTray +|| !element +|| !iTreeScope + Say (cmsgListTaskTrayIconsError1, OT_ERROR) + return +endIf +var + object condition = FSUIACreateIntPropertyCondition (UIA_ControlTypePropertyId,UIA_ButtonControlTypeID), + object buttons +if condition + buttons = element.findAll(iTreeScope,condition) +endIf +if !buttons.count + ;in case UIA fails, fallback to legacy: + ListWin7TaskTrayIcons () + return +endIf +var + variantArray buttonArray, + collection c, + int x, int y, + int i, int j, int n +n = buttons.count +buttonArray = new variantArray[n] +for i = 0 to n-1 + if buttons(i).classNAMe != UIAClass_TrayShowDesktopButtonWClass + buttons(i).GetClickablePoint( intRef(x), intRef(y)) + c = new collection + c.name = StringTrimLeadingAndTrailingBlanks (buttons(i).name) + c.x = x + c.y = y + j = j+1 + buttonArray[j] = c + endIf +endFor +var string dlgList, string dlgListItem +for i = 1 to j + dlgListItem = buttonArray[i].name + dlgList = dlgList+LIST_ITEM_SEPARATOR+dlgListItem +endFor +var + int nIdx, + int ScreenHeight = ScreenGetHeight (), + int ScreenWidth = ScreenGetWidth (), + int MagicState = MagGetState (), + int iTetherOption = GetDefaultJCFOption (OPT_TETHER_JAWS_TO_PC), + int nButton +;Temporarily turn off the Tether JAWS to PC option and the virtual cursor: +SetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC, 0) +nButton = DlgSysTray (dlgList,nIdx) +if nIdx > 0 && nButton > 7000 + SaveCursor () + JAWSCursor () + SaveCursor () + if MagicState > 0 + MoveTo (ScreenWidth - 2, ScreenHeight - 2) + Delay (10, TRUE) + endIf + MoveTo(buttonArray[nIdx].x,buttonArray[nIdx].y) + if MagicState > 0 + Delay (10, TRUE) + endIF + if nButton == iD_RightSingleClick + RightMouseButton () + elif nButton == iD_LeftSingleClick + LeftMouseButton () + elif nButton == iD_LeftDoubleClick + LeftMouseButton () + LeftMouseButton () + endIf + Delay(5) + RestoreCursor() + RestoreCursor() +endIf +Pause () +SetDefaultJcfOption (OPT_TETHER_JAWS_TO_PC, iTetherOption) +EndFunction + +string function tvGetPathToSelection(handle hWnd) +var + int iSubtype, + int iTVLevel, + int iTVItem, + string sTVPath +let iSubtype = GetWindowSubtypeCode(hWnd) +if iSubtype != wt_TreeView +&& iSubtype != wt_TreeViewItem then + return cscNull +EndIf +let iTVItem = tvGetSelection(hWnd) +let iTVLevel = GetTreeviewLevel() +while iTVLevel + let iTVItem = tvGetParent(hWnd,iTVItem) + let sTVPath = tvGetItemText(hWnd,iTVItem)+List_item_separator+sTVPath + let iTVLevel = iTVLevel-1 +EndWhile +return sTVPath +EndFunction + +int function GetTreeViewItemState() +var int State = GetControlAttributes() & ~CTRL_SELECTED +;All windows whose class name contains the text UI are suspect to not handle closed controls properly: +if stringContains (getWindowClass (getFocus ()), "UI") + if State && !(State & CTRL_OPENED) ;closed but using different state bits. 0x0000l attributes = selection normal, leaf node. + State = (State & CTRL_CLOSED) + endIf +endIf +return state +EndFunction + +void function SayTreeViewItem() +var + int bIsMSAAWindow = IsMSAAWindow(getFocus()), + int nSubtype = GetObjectSubtypeCode() +if bIsMSAAWindow +&& (nSubtype == WT_CHECKBOX || nSubtype == WT_RADIOBUTTON) + SayObjectActiveItem() + return +endIf +var + int nOutputType, + int nState, + string sValue, + string sDescription +;Hj Dialogs set options, so don't use line: +If InHjDialog () then + nOutputType = OT_TEXT +Else + nOutputType = OT_LINE +EndIf +if bIsMSAAWindow +&& nSubtype == WT_TREEVIEWITEM + sValue = GetObjectName () + If !sValue + sValue = (tvGetFocusItemText (GetFocus ())) + EndIf + SayMessage (nOutputType, sValue) + nState = GetTreeViewItemState() + if (nState) IndicateControlState (nSubtype, nState) endIf + sDescription = GetObjectDescription () + if sDescription + Say (sDescription, OT_CONTROL_DESCRIPTION) + endIf +else + sValue = SmartGetTreeViewObjectValue() + if (!sValue) + sValue = (tvGetFocusItemText (GetFocus ())) + endif + ; eclipse has treeviews with columns and these columns are in the AccDescription, so if this is a + ; TreeviewWithColumns, append description + if TreeWithColumns () + var string description = GetObjectDescription(SOURCE_CACHED_DATA, 0) + if (StringLength(description) && StringContains(sValue, description) == 0) + sValue = sValue + cscSpace + description + EndIf + EndIf + SayMessage (nOutputType, sValue) + nState = GetTreeViewItemState() + if (!bIsMSAAWindow) + ; remove open / closed / haschildren properties so only checked and unchecked related states are spoken. + nState = nState&~(CTRL_HASCHILDREN|CTRL_EXPANDED|CTRL_COLLAPSED|CTRL_OPENED|CTRL_CLOSED) + endIf + if (nState) IndicateControlState (nSubtype, nState) endIf + ;FlexibleWebNumberOfActiveRules already checks to ensure we're in in the right place to get any text, otherwise returns null: + sayMessage (OT_SCREEN_MESSAGE, FlexibleWebNumberOfActiveRules ()) +endIf +EndFunction + +void Function SayTreeViewLevel(optional int IntelligentPositionAnnouncement) +var + handle hWnd, + string sMessage, + int iLevel, + int bLevelChanged, + string sLevel, + int iItem, + int iItemParent, + string sItemParentText, + string sPath, + string sPosition +let iLevel = GetTreeviewLevel() +If iLevel != PreviousTreeviewLevel then + let bLevelChanged = true + let sLevel = IntToString (iLevel) + let sMessage = FormatString (cmsg233_L, sLevel) + SayMessage (OT_POSITION, sMessage, sLevel) ; "level " + let PreviousTreeViewLevel= iLevel +endIf +let hWnd = GetFocus() +let sPosition = PositionInGroup() +if ( False == IsJavaWindow (hWnd) ) then + let iItem = tvGetSelection(hWnd) + let iItemParent = tvGetParent(hWnd,iItem) + let sPath = tvGetPathToSelection(hWnd) + if iLevel > 0 then + if iItemParent != giSayTreeViewLevelPrevItemParent then + let sItemParentText = tvGetItemText(hWnd, iItemParent) + EndIf + EndIf + let giSayTreeViewLevelPrevItemParent = iItemParent +EndIf +If !IsPcCursor () then + SayLine () + Return +EndIf +SayTreeViewItem() +if !sItemParentText +&& IntelligentPositionAnnouncement +&& !bLevelChanged then + ;we don't want to announce the position or the parent node. + return +EndIf +if sPath != gsTvPathToPrevSelection +|| sPosition != gsTVPrevPositionInGroup then + SayMessage(OT_POSITION, sPosition) + If InHjDialog () then + if sItemParentText then + SayUsingVoice(vctx_message,sItemParentText,ot_position) + EndIf + EndIf +EndIf +let gsTvPathToPrevSelection = sPath +let gsTVPrevPositionInGroup = sPosition +EndFunction + +Void Function TooltipEvent (handle hWnd, string strText, string appName) +if strText == GetObjectName() then + ;Ignore this, otherwise double speaking occurs when tooltips are announced as an item gains focus. + ;Also, these aren't the kind of tooltips we need to keep track of and report to the user on request. + return +endIf +strLastTooltip = strText +;if we're on the clock, we need some different text: +if StringContains (strText, cscDateTimeToolTip) then + strLastTooltip = SysGetTime () + cscBufferNewLine + SysGetDate () +endIf +gStrLastTipFromEvent = strText +ghwndToolTip = hWnd +;Trim away any text already spoken by mouse echo. +;Save the untrimmed text for recalling the tooltip text, +;but avoid any double speaking by only speaking the trimmed text. +var string strToolTipTextToSpeak = StringTrimSpokenMouseEchoTextFromToolTipText(strLastTooltip ) +var int outputType +var collection notificationRuleActions +if GetWindowClass(GetParent(hWnd)) == cwc_ToastChildWindowClass + outputType = ot_toasts + notificationRuleActions = ProcessNotification(strToolTipTextToSpeak, appName) + ; Skype 8 and later can use toasts, so update the insert+space&r keystroke: + if stringContains (strToolTipTextToSpeak, "Skype") then LastBackgroundNotificationText = strToolTipTextToSpeak endIf + if !notificationRuleActions.ExcludeFromNotificationHistory then + StoreSpokenNotificationForRepeat (strToolTipTextToSpeak, appName) ; for new insert+Space&N keystroke. + endIf + SayNotification(notificationRuleActions, outputType) + ; We need to clear the last notification sender to avoid misattributing notifications to apps + ClearLastNotificationSender() +else +; Tooltips are not stored in history. +; Do not use collection unnecessarily, creating a new object only to destroy it immediately + sayMessage(OT_TOOL_TIP, strToolTipTextToSpeak) +endIf +EndFunction + +; Auto Graphics labeler section +globals + int g_AutoLabeledGraphics + +String Function GetGraphicNameAtPoint (int iX, int iY) +SaveCursor () +JAWSCursor () +MoveTo (iX + 1, iY - 1) +If (GetCharacterAttributes () & ATTRIB_GRAPHIC) Then + return GetCharacter () ; Use GetWord () if this fails +Else + return "" +endIf +EndFunction + +void Function AutoGraphicsLabelerHelper(int nLeft,int nTop,int nRight,int nBottom) +var + Int iX, + Int iY, + int nGraphicIdNoMouseOnIt, + int nGraphicIdWithMouseOnIt, + int nLoops, + int nAttributes, + String strLabel, + String strGraphicName, + String strTemp +;SaveCursor();No longer needed. +InvisibleCursor() +let iX = nLeft+(nRight-nLeft)/2 +let iY = nTop+(nBottom-nTop)/2 +MoveTo (iX, iY) +let nGraphicIdNoMouseOnIt = GetGraphicID() +JAWSCursor() +RouteJAWSToInvisible() +let nLoops = 0 +while (nLoops < 15 && strLastTooltip == "") + delay(1) + let nLoops = nLoops+1 +EndWhile +If (strLastTooltip != "") then + let strLabel = strLastTooltip + let nGraphicIdWithMouseOnIt = GetGraphicID() + if (nGraphicIdWithMouseOnIt) then + let nAttributes = GetControlAttributes() + if (nAttributes & CTRL_GRAYED) then + let strLabel = strLabel + cScSpace +cmsgGrayedGraphic1_L + endIf + if (nAttributes & CTRL_PRESSED) then + let strLabel = strLabel + cScSpace +cmsgPressedGraphic1_L + endIf + SetGraphicLabel(nGraphicIdWithMouseOnIt, strLabel, TRUE) + if (nGraphicIdWithMouseOnIt != nGraphicIdNoMouseOnIt && + nGraphicIdNoMouseOnIt != 0) then + SetGraphicLabel(nGraphicIdNoMouseOnIt,strLabel, TRUE) + endIf + let g_AutoLabeledGraphics = g_AutoLabeledGraphics+1 + endIf + endIf +;RestoreCursor() ; No longer needed. +let strLastTooltip = "" +Delay(2) +if (IsKeyWaiting ()) then + return 0 +else + return 1 +endIf +EndFunction + +Script AutoLabelGraphics () +var + int bProcessTooltipEvent, + int nIncludeGraphics, + string sMessageLong, + string sMessageShort, + string sLabeled +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +;cmsg242_L = "Starting auto graphic labeler" +SayFormattedMessage (ot_status, cmsg242_L, cmsg242_S) +Delay(2) +Refresh() +Delay(10) +SaveCursor() +JAWSCursor() +MoveTo(1,1) +let strLastTooltip = cScNull +let bProcessTooltipEvent = GetJcfOption (OPT_PROCESSTOOLTIPEVENT) +let nIncludeGraphics = GetJcfOption(OPT_INCLUDE_GRAPHICS) +SetJcfOption (OPT_PROCESSTOOLTIPEVENT, TRUE) +SetJcfOption (OPT_INCLUDE_GRAPHICS, 2) +let g_AutoLabeledGraphics = 0 +GraphicsEnumerate(GetAppMainWindow(GetFocus()),"AutoGraphicsLabelerHelper") +SetJcfOption (OPT_PROCESSTOOLTIPEVENT, bProcessTooltipEvent) +SetJcfOption (OPT_INCLUDE_GRAPHICS, nIncludeGraphics) +RestoreCursor() +;cmsg243_L = "Auto labeler finished" +let sLabeled = IntToString (g_AutoLabeledGraphics) +let sMessageShort = FormatString (cmsg243_S, sLabeled) +let sMessageLong = FormatString (cmsg243_L, sLabeled) +SayFormattedMessage (ot_status, sMessageLong, sMessageShort) +EndScript + +globals + int g_AutoLabeledGraphics, + string g_strGraphicsList, + string g_strGraphicsListX, + string g_strGraphicsListY + +void Function GraphicsListHelper(int nLeft,int nTop,int nRight,int nBottom) +SaveCursor() +InvisibleCursor() +MoveTo (nLeft,nBottom-1) +if GetControlAttributes() & CTRL_GRAYED then + ;skip this graphic + return TRUE +endIf +let g_strGraphicsList = g_strGraphicsList+LIST_ITEM_SEPARATOR+GetWord() +let g_strGraphicsListX = g_strGraphicsListX + LIST_ITEM_SEPARATOR+ +IntToString(getCursorRow()) +let g_strGraphicsListY = g_strGraphicsListY + LIST_ITEM_SEPARATOR+ +IntToString(getCursorCol()) +RestoreCursor() +return 1 +EndFunction + +void function ClickAtPoint(int nCol, int nRow, optional int bUseJAWSCursor) +;In applications where the JAWS cursor must be used to click the graphic, +;then pass true to parameter bUseJAWSCursor. +;In most applications, RoutePCToInvisible will click the graphic. +var + int savedRestriction +SaveCursor() +if bUseJAWSCursor then + JAWSCursor() + savedRestriction = GetRestriction() + SetRestriction(RestrictNone) + SaveCursor() + MoveTo(nCol,nRow) + SetRestriction(savedRestriction) + Delay(10) + LeftMouseButton() + RestoreCursor() +else + InvisibleCursor() + savedRestriction = GetRestriction() + SetRestriction(RestrictNone) + SaveCursor() + MoveTo(nCol,nRow) + RoutePCToInvisible() + SetRestriction(savedRestriction) + RestoreCursor() +EndIf +RestoreCursor() +EndFunction + +void function RightClickAtPoint(int nCol, int nRow) +var + int savedRestriction +SaveCursor() +JAWSCursor() +savedRestriction = GetRestriction() +SetRestriction(RestrictNone) +SaveCursor() +MoveTo(nCol,nRow) +SetRestriction(savedRestriction) +Delay(10) +RightMouseButton() +RestoreCursor() +RestoreCursor() +EndFunction + +Script GraphicsList () +var + int nIncludeGraphics, + int nIndex, + int nRowToClick, + int nColToClick +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +Refresh() +Delay(10) +SaveCursor() +let nIncludeGraphics = GetJcfOption(OPT_INCLUDE_GRAPHICS) +SetJcfOption (OPT_INCLUDE_GRAPHICS, 1) ; labeld graphics only +let g_strGraphicsList = cscNull +let g_strGraphicsListX = cscNull +let g_strGraphicsListY = cscNull +GraphicsEnumerate(GetAppMainWindow(GetFocus()),"GraphicsListHelper") +; remove leading delimiters +let g_strGraphicsList =stringChopLeft(g_strGraphicsList,1) +let g_strGraphicsListX = stringChopLeft(g_strGraphicsListX,1) +let g_strGraphicsListY =stringChopLeft(g_strGraphicsListY,1) +SetJcfOption (OPT_INCLUDE_GRAPHICS, nIncludeGraphics) +if g_strGraphicsList then + let nIndex = DlgSelectItemInList (g_strGraphicsList,cMsgSelectGraphic, FALSE); + if !nIndex then + return + endIf + let nRowToClick = StringToInt(StringSegment(g_strGraphicsListX,LIST_ITEM_SEPARATOR,nIndex)) + let nColToClick = StringToInt(StringSegment(g_strGraphicsListY,LIST_ITEM_SEPARATOR,nIndex)) + ClickAtPoint(nColToClick,nRowToClick,TRUE) +Else + SayFormattedMessage (OT_ERROR, cmsgNoGraphics1_L, cmsgNoGraphics1_S) +endIf +EndScript + +Script SayPriorSentence() +if IsFormsModeActive() +&& isPcCursor() then + if getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + EndIf +endIf +PriorSentence () + +if SupportsEditCallbacks() then ;CaretMovedEvent will handle + return +endIf + +delay(1) +SaySentence () +EndScript + +Script SayNextSentence() +if IsFormsModeActive() +&& isPcCursor() then + if getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + EndIf +endIf +NextSentence () + +if SupportsEditCallbacks() then ;CaretMovedEvent will handle + return +endIf + +delay(1) +SaySentence () +EndScript + +Script SaySentence () +var + int iType +If IsJAWSCursor() +|| IsInvisibleCursor() +|| IsVirtualPcCursor() then + indicateInconsistenciesInRange(CheckSentence) + SaySentence() + Return +EndIf +Let iType = GetWindowSubtypeCode(GetCurrentWindow ()) +If !iType then + Let iType = GetObjectSubtypeCode() +EndIf +if IsFormsModeActive() then + if !iType + || iType == wt_dialog_page + || iType == wt_static + || iType == wt_ReadOnlyEdit + || iType == wt_multiline_edit then + indicateInconsistenciesInRange(CheckSentence) + SaySentence() + else + indicateInconsistenciesInRange(CheckLine) + SayLine() + EndIf + return +EndIf +if DialogActive() +|| iType == WT_TREEVIEW +|| iType == WT_Listview +|| iType == WT_EDITCOMBO +|| iType == WT_Listbox +|| iType == WT_MULTISELECT_LISTBOX +|| iType == WT_EXTENDEDSELECT_LISTBOX +|| iType == WT_Combobox +|| GetWindowClass (GetCurrentWindow()) == cwcMsoCmd then + indicateInconsistenciesInRange(CheckLine) + SayLine () + Return +EndIf +SetDocumentReadingStartLocation () +indicateInconsistenciesInRange(CheckSentence) +SaySentence() +EndScript + +Script SayPriorParagraph() +; for web applications who "borrow" quick navigation keys +if ProcessKeystrokeAsReserved (GetCurrentScriptKeyName ()) then return endIf +if IsFormsModeActive() +&& isPcCursor() then + if getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + EndIf +endIf +if FocusWindowSupportsUIA () then + TypeKey(cksControlUpArrow) +else + PriorParagraph() +EndIf +If SayAllInProgress() then + Return +EndIf +indicateInconsistenciesInRange(CheckParagraph) +if !SayParagraph() then + SayMessage(OT_error, cMSG276_L) + SayMessage(OT_error, cMSG277_L, cmsgSilent) +endIf +EndScript + +Script SayParagraph () +SetDocumentReadingStartLocation () +if !SayParagraph() then + SayMessage (OT_error, cMSG276_L) + SayMessage(OT_error, cMSG277_L, cmsgSilent) +endIf +EndScript + +Script SayNextParagraph() +; for web applications who "borrow" quick navigation keys +if ProcessKeystrokeAsReserved (GetCurrentScriptKeyName ()) then return endIf +if IsFormsModeActive() +&& isPcCursor() then + if getObjectSubtypeCode(SOURCE_CACHED_DATA) == WT_EDIT then + TurnOffFormsMode () + EndIf +endIf +if FocusWindowSupportsUIA () then + TypeKey(cksControlDownArrow) +else + NextParagraph() +EndIf +If SayAllInProgress() then + Return +EndIf +indicateInconsistenciesInRange(CheckParagraph) +if !SayParagraph() then + SayMessage(OT_error, cMSG276_L) + SayMessage(OT_error, cMSG277_L, cmsgSilent) +endIf +EndScript + +void function GetTextInfoForControlBackSpace(string byRef sText) +SaveCursor() +InvisibleCursor () +RouteInvisibleToPc () +SaveCursor() +PriorWord () +if GetCurrentWindow() == GetFocus() then + sText = GetWord() +EndIf +PCCursor() +RestoreCursor () +RestoreCursor () +EndFunction + +Script ControlBackSpace () +If IsVirtualPcCursor () then + If UserBufferIsActive () then + Return; Do not process unless so directed in app-specific script file + EndIf +EndIf +var string sText +GetTextInfoForControlBackSpace(sText) +if sText + SayMessage(ot_line,sText) +endIf +TypeCurrentScriptKey () +EndScript + +Script SaySystemTime () +var + string sTimeOrDate +if GetRunningFSProducts() == product_MAGic +&& IsSpeechOff() then + ExMessageBox(FormatString(cMsgGetSysTimeAndDate,SysGetTime(),SysGetDate()), + cscNull,MB_ICONINFORMATION) + return +endIf +If (IsSameScript ()) then + Let sTimeOrDate = FormatString (cmsgGetSysDate, SysGetDate ()) +Else + Let sTimeOrDate = FormatString (cmsgGetSysTime, SysGetTime ()) +endIf +SayUsingVoice ( VCTX_MESSAGE, sTimeOrDate, ot_user_requested_information) +EndScript + +Script SaySystemTimeWithSeconds () +var + string sTime +If (IsSameScript ()) + sTime = FormatString (cmsgSysGetWeekNumber, SysGetWeekNumber ()) +else + sTime = FormatString (cmsgGetSysTimeWithSeconds, SysGetTime (GetSystemLocaleInfo (LOCALE_STIMEFORMAT))) +endIf +SayUsingVoice ( VCTX_MESSAGE, sTime, ot_user_requested_information) +EndScript + +Script Enter () +SayCurrentScriptKeyLabel () +enterKey() +EndScript + +Script ShiftEnter () +SayCurrentScriptKeyLabel () +ShiftEnterKey() +EndScript + +script ControlShiftEnter () +SayCurrentScriptKeyLabel () +ControlShiftEnterKey() +EndScript + +script ControlEnter () +PerformScript ControlEnter () +EndScript + +script MoveToFirstTable () +MoveToFirstTable () +EndScript + +script MoveToNextTable () +MoveToNextTable () +EndScript + +script MoveToPriorTable () +MoveToPriorTable () +EndScript + +script MoveToLastTable () +MoveToLastTable () +EndScript + +void function SayTableCellCoordinates() +var +int nCurCol, +int nCurRow, +string sMessage + +GetCellCoordinates (nCurCol, nCurRow) +let sMessage = FormatString (cMSGColumnAndRow, IntToString (nCurRow), IntToString (nCurCol)) +SayMessage(OT_POSITION,sMessage) +endFunction + +void function CrossedTableBoundaryEvent(int iPrevTableIndex, int iPrevTableLevel, int iCurTableIndex, int iCurTableLevel) +; Prevent speaking of table boundaries crossing when using the Braille display: +if StringStartsWith (GetScriptAssignedTo(GetCurrentScriptKeyName()), "BraillePan") then return endIf +if iCurTableIndex >=1 then + if iCurTableLevel > 0 && iCurTableLevel != iPrevTableLevel && iPrevTableLevel >=0 then + ; we've changed table nesting level + SayUsingVoice(VCTX_MESSAGE,formatString(cmsgEnteringNestedTable_L, IntToString(iCurTableLevel)), OT_POSITION) + SayTableCellCoordinates() + elif (iCurTableIndex >=1 && iCurTableIndex != iPrevTableIndex) then + ;we've moved into a table, announce it + SayUsingVoice(VCTX_MESSAGE, formatString(CMSGInTable,GetTableCaption()), OT_CONTROL_GROUP_NAME) + SayTableCellCoordinates() + EndIf +elif GetJCFOption(optSmartNavigation)==smartNavControlsAndTables && builtin::InTableCell() then +; indicate that we've just moved into a table. +; Schedule the function, however, so it runs after the script which speaks the result of the navigation. + scheduleFunction("SayTableCellCoordinates", 1) +else ;not in a table + if iPrevTableIndex >=1 then + ; we've moved out of a top-level table + SayUsingVoice(VCTX_MESSAGE,CMSGOutOfTable, OT_POSITION) + EndIf +endIf +EndFunction + +Script Tab () +globalSpeakHeaderOnCellChange = TABLE_NAV_SAY_COLUMN_AND_ROW_HEADERS +If (InHomeRowMode()) then + PerformScript UtilityMoveToNextWindow () + Return +EndIf +SayCurrentScriptKeyLabel () +if UserBufferIsActive() then + If MoveToControlType(s_next,wt_link) then + SayLine() + endIf + return +EndIf +;If is Virtual Pc Cursur, suppress echo of highlighted Text: +Let nLastSelectUnitTime = (GetTickCount()*IsVirtualPCCursor()) +TabKey () +If IsVirtualPcCursor() +&& !IsJavaWindow(GetCurrentWindow()) then + NotifyIfContextHelp() +EndIf +EndScript + +Script ShiftTab () +globalSpeakHeaderOnCellChange = TABLE_NAV_SAY_COLUMN_AND_ROW_HEADERS +If (InHomeRowMode()) then + PerformScript UtilityMoveToPriorWindow () + Return +EndIf +SayCurrentScriptKeyLabel () +if UserBufferIsActive() then + If MoveToControlType(s_prior,wt_link) then + SayLine() + return + EndIf +EndIf +;If is Virtual Pc Cursur, suppress echo of highlighted Text: +Let nLastSelectUnitTime = (GetTickCount()*IsVirtualPCCursor()) +ShiftTabKey () +If IsVirtualPcCursor() +&& !IsJavaWindow(GetCurrentWindow()) then + NotifyIfContextHelp() +EndIf +EndScript + +script MoveToFirstList() +MoveToFirstList() +EndScript + +script MoveToNextList() +MoveToNextList() +EndScript + +script MoveToPriorList() +MoveToPriorList() +EndScript + +script MoveToLastList() +MoveToLastList() +EndScript + +script MoveToFirstVisitedLink() +MoveToFirstVisitedLink() +EndScript + +script MoveToLastVisitedLink() +MoveToLastVisitedLink() +EndScript + +script MoveToNextVisitedLink() +MoveToNextVisitedLink() +EndScript + +script MoveToPriorVisitedLink() +MoveToPriorVisitedLink() +EndScript + +script MoveToFirstUnvisitedLink() +MoveToFirstUnvisitedLink() +EndScript + +script MoveToLastUnvisitedLink() +MoveToLastUnvisitedLink() +EndScript + +script MoveToNextUnvisitedLink() +MoveToNextUnvisitedLink() +EndScript + +script MoveToPriorUnvisitedLink() +MoveToPriorUnvisitedLink() +EndScript + +script MoveToAnyNextLink() +MoveToAnyNextLink() +EndScript + +script MoveToAnyPriorLink() +MoveToAnyPriorLink() +EndScript + +Script MoveToNextNonLinkText () +MoveToNextNonLinkText () +EndScript + +Script MoveToPriorNonLinkText () +MoveToPriorNonLinkText () +EndScript + +int function GetJCFOptionFromFile(string Section, string JCFKey) +return ReadSettingInteger(section,JCFKey, + ReadSettingInteger(Section,JCFKey,1,FT_DEFAULT_JCF,rsNoTransient), + FT_CURRENT_JCF,rsNoTransient) +endFunction + +void function VirtualPCCursorToggle () +var + int iSetting, + int iJCFSetting +let iSetting = GetJCFOption (OPT_VIRTUAL_PC_CURSOR) +let iJCFSetting = GetJCFOptionFromFile(SECTION_OSM,hkey_UseVirtualPCCursor) +if IsSameScript () then + ;The setting of 2 is for Win8 apps where it has been specified in the JCF file, + ;and setting default memory to 2 is not generally desirable and so is not allowed. + if iJCFSetting < 2 then + SetDefaultJCFOption(OPT_VIRTUAL_PC_CURSOR, iSetting) + if GetJCFOption (OPT_VIRTUAL_PC_CURSOR)==0 then + Refresh() + SayFormattedMessage (OT_status, cMSG338_L, cMSG338_S) ;"The virtual cursor will be turned off for all applications" + else + SayFormattedMessage (OT_status, cMSG339_L, cMSG339_S) ;"The virtual cursor will be turned on for all applications" + endIf + else + SayMessage(ot_error,cmsgUseVirtualPCCursorGlobalToggleNotAvailable) + ;now say what it is currently set to: + if iSetting == 1 then + SayFormattedMessage(ot_status, cMSG291_L, cMSG_on) + else + SayFormattedMessage(ot_status, + FormatString(cmsgUseVPCResetForApp,GetActiveConfiguration ())) + EndIf + EndIf + ;update the global used by VirtualCursorChangedEvent, since it doesn't fire when the script is used to toggle the state: + globalSavedVirtualCursorState = IsVirtualPCCursor() + return +endIf +;For Win8 apps where the JCF is set to 2, +;only allow toggle between 1 and 2. +;Otherwise, only allow toggle between 0 and 1. +if iSetting == 0 +|| iSetting == 2 then + SetJCFOption(OPT_VIRTUAL_PC_CURSOR, 1) + SayFormattedMessage(ot_status, cMSG291_L, cMSG_on) + if iSetting == 2 then + ;Refresh if setting was 2, + ;to insure focus is updated to current virtual location: + refresh() + BrailleRefresh() + EndIf +else + if iJCFSetting == 2 then + SetJCFOption(OPT_VIRTUAL_PC_CURSOR, 2) + SayFormattedMessage(ot_status, + FormatString(cmsgUseVPCResetForApp,GetActiveConfiguration ())) + else + refresh() + SetJCFOption(OPT_VIRTUAL_PC_CURSOR, 0) + SayFormattedMessage(ot_status, cmsg292_l, cmsg_off) + BrailleRefresh() + EndIf +endIf +;update the global used by VirtualCursorChangedEvent, since it doesn't fire when the script is used to toggle the state: +globalSavedVirtualCursorState = IsVirtualPCCursor() +EndFunction + +void function VirtualUIACursorToggle () +var int setting = GetJCFOption(OPT_USE_VIRTUAL_CURSOR_FOR_UWP_APPS) +setting = !setting +SetJCFOption(OPT_USE_VIRTUAL_CURSOR_FOR_UWP_APPS,setting) +if setting + SayFormattedMessage(ot_status, cMSG_UseVPCForUWP_On_L, cMSG_on) +else + SayFormattedMessage(ot_status, cMSG_UseVPCForUWP_Off_L, cmsg_off) +endIf +EndFunction + +Script VirtualPCCursorToggle () +if IsUIAVirtualCursorApplicable() + VirtualUIACursorToggle () +else + VirtualPCCursorToggle () + if IsVirtualPCCursor () && DialogActive(false) then + RestrictViewToEnclosingType(wt_dialog) + endIf +endIf +EndScript + +Script AdjustHTMLSettings () +var + string list +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if InHJDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +if (IsSpeechOff ()) then + ;Note that function MuteSynthesizerToggle is no longer being used to turn off speech. + JAWSProcessorSpeechOn() + return +endIf +let list = GraphicsToggleItem + + LinksToggleItem + + ImageMapToggleItem + + LinkTypeToggleItem + + SamePageLinkToggleItem + + IncrementMaxLineLengthItem + + DecrementMaxLineLengthItem + + IncrementMaxBlockLengthItem + + DecrementMaxBlockLengthItem + + FrameIndicationToggleItem + + ScreenFollowsVCursorToggleItem + + SkipPastRepeatedTextToggleItem + + TextLinksVerbosityItem + + IncrementLinesPerPageItem + + DecrementLinesPerPageItem+ + IndicateHeadingsItem +DlgSelectFunctionToRun (list, HTMLOptionsDialogName, false) +EndScript + +Script SayCell () +var + int iNestingLevel +if (FALSE == InTable ()) then + SayFormattedMessage (OT_error, cMSGNotInTable_L, cMSGNotInTable_S) + Return; +EndIf +SpeakTableCells (TABLE_NAV_NONE, 0) +let iNestingLevel = GetTableNestingLevel() +if iNestingLevel > 0 then + SayUsingVoice(VCTX_MESSAGE,formatString(cmsgEnteringNestedTable_L, IntToString(iNestingLevel)), OT_POSITION) +EndIf +EndScript + +Script SayNextRow () +var + int nPrevNumOfCols, + int nNumRows, + int nCurCol, + int nCurRow +; Virtual Cursor only +if !IsVirtualPcCursor() then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + Return +endIf +if TableErrorEncountered(TABLE_NAV_SAY_ROW) then + Return +endIf +Let nPrevNumOfCols = GetCurrentRowColumnCount () +;; Deal with Java JTable objects +if (TRUE == IsJavaWindow (GetCurrentWindow ())) then + if (TRUE == SayAllInProgress ()) then + return + endIf + let nNumRows = GetTableRowCount () + GetCellCoordinates (nCurCol, nCurRow) + if (nCurRow == nNumRows) then + SayFormattedMessage (OT_ERROR, cMsgLastRow_L, cMsgLastRow_S) + else + let g_JavaPrevNumOfCells = nPrevNumOfCols + let g_JavaTableNavDir = TABLE_NAV_SAY_ROW + SaveCursor () + PcCursor () + TypeKey (cksDownArrow) ; down arrow + endIf + return +endIf +if (FALSE == DownCell ()) then + SayFormattedMessage (OT_ERROR, cMsgLastRow_L, cMsgLastRow_S) + Return +endIf +if (FALSE == SayAllInProgress ()) then + SpeakTableCells (TABLE_NAV_SAY_ROW, nPrevNumOfCols) +else ;In SayAll + StartOfRow () +endIf +EndScript + +Script SayPriorRow () +var + int nPrevNumOfCols, + int nNumRows, + int nCurCol, + int nCurRow +; Virtual Cursor only +if !IsVirtualPcCursor() then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + Return +endIf +if TableErrorEncountered(TABLE_NAV_SAY_ROW) then + Return +endIf +Let nPrevNumOfCols = GetCurrentRowColumnCount () +;; Deal with Java JTable objects +if (TRUE == IsJavaWindow (GetCurrentWindow ())) then + if (TRUE == SayAllInProgress ()) then + return + endIf + let nNumRows = GetTableRowCount () + GetCellCoordinates (nCurCol, nCurRow) + if (1 == nCurRow) then + SayFormattedMessage (OT_ERROR, cMsgFirstRow_L, cMsgFirstRow_S) + else + let g_JavaPrevNumOfCells = nPrevNumOfCols + let g_JavaTableNavDir = TABLE_NAV_SAY_ROW + SaveCursor () + PcCursor () + TypeKey (cksUpArrow) ; up arrow + endIf + return +endIf +if (FALSE == UpCell ()) then + SayFormattedMessage (OT_ERROR, cMsgFirstRow_L, cMsgFirstRow_S) + Return +endIf +if (FALSE == SayAllInProgress ()) then + SpeakTableCells (TABLE_NAV_SAY_ROW, nPrevNumOfCols) +else ;In SayAll + StartOfRow () +endIf +EndScript + +Script SayNextColumn() +var + int nPrevNumOfRows, + int nNumCols, + int nCurRow, + int nCurCol +if !IsVirtualPcCursor() then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + Return +endIf +if TableErrorEncountered(TABLE_NAV_SAY_COLUMN) then + Return +endIf +Let nPrevNumOfRows = GetTableRowCount() +if IsJavaWindow (GetCurrentWindow()) then + if SayAllInProgress() then + return + endIf + let nNumCols = GetCurrentRowColumnCount () + GetCellCoordinates (nCurCol, nCurRow) + if nCurCol == nNumCols then + SayFormattedMessage (OT_ERROR, cMsgLastColumn_L, cMsgLastColumn_S) + else + let g_JavaPrevNumOfCells = nPrevNumOfRows + let g_JavaTableNavDir = TABLE_NAV_SAY_COLUMN + SaveCursor () + PcCursor () + TypeKey (cksRightArrow) + endIf + return +endIf +if !NextCell() then + SayFormattedMessage (OT_ERROR, cMsgLastColumn_L, cMsgLastColumn_S) + Return +endIf +if !SayAllInProgress() then + SpeakTableCells (TABLE_NAV_SAY_COLUMN, nPrevNumOfRows) +else + TopOfColumn() +endIf +EndScript + +Script SayPriorColumn() +var + int nPrevNumOfRows, + int nNumCols, + int nCurRow, + int nCurCol +if !IsVirtualPcCursor() then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey () + Return +endIf +if TableErrorEncountered(TABLE_NAV_SAY_COLUMN) then + Return +endIf +Let nPrevNumOfRows = GetTableRowCount() +if IsJavaWindow (GetCurrentWindow()) then + if SayAllInProgress() then + return + endIf + let nNumCols = GetCurrentRowColumnCount () + GetCellCoordinates (nCurCol, nCurRow) + if nCurCol == 1 then + SayFormattedMessage (OT_ERROR, cMsgFirstColumn_L, cMsgFirstColumn_S) + else + let g_JavaPrevNumOfCells = nPrevNumOfRows + let g_JavaTableNavDir = TABLE_NAV_SAY_COLUMN + SaveCursor () + PcCursor () + TypeKey(cksLeftArrow) + endIf + return +endIf +if !PriorCell() then + SayFormattedMessage (OT_ERROR, cMsgFirstColumn_L, cMsgFirstColumn_S) + Return +endIf +if !SayAllInProgress() then + SpeakTableCells (TABLE_NAV_SAY_COLUMN, nPrevNumOfRows) +else + TopOfColumn() +endIf +EndScript + +int function NavigateJavaTable(int UnitMovement) +var + int nCurCol, + int nCurRow, + int iCurCellLoc, + int iBoundaryCellNumber, + int iBoundaryRowNumber, + int iBoundaryColNumber +if !IsJavaWindow(GetCurrentWindow()) then + return false +EndIf +GetCellCoordinates(nCurCol, nCurRow) +if UnitMovement == UnitMove_Prior then + let iBoundaryCellNumber = 1 + let iCurCellLoc = nCurCol +ElIf UnitMovement == UnitMove_Next then + let iBoundaryCellNumber = GetCurrentRowColumnCount() + let iCurCellLoc = nCurCol +ElIf UnitMovement == UnitMove_First then + let iBoundaryCellNumber = 1 + let iCurCellLoc = nCurCol +ElIf UnitMovement == UnitMove_Last then + let iBoundaryCellNumber = GetCurrentRowColumnCount() + let iCurCellLoc = nCurCol +ElIf UnitMovement == UnitMove_Up then + let iBoundaryCellNumber = 1 + let iCurCellLoc = nCurRow +ElIf UnitMovement == UnitMove_Down then + let iBoundaryCellNumber = GetTableRowCount() + let iCurCellLoc = nCurRow +ElIf UnitMovement == UnitMove_Top then + let iBoundaryCellNumber = 1 + let iCurCellLoc = nCurRow +ElIf UnitMovement == UnitMove_Bottom then + let iBoundaryCellNumber = GetTableRowCount() + let iCurCellLoc = nCurRow +ElIf UnitMovement == UnitMove_Start then + let iBoundaryColNumber = 1 + let iBoundaryRowNumber = 1 +ElIf UnitMovement == UnitMove_End then + let iBoundaryColNumber = GetCurrentRowColumnCount() + let iBoundaryRowNumber = GetTableRowCount() +EndIf +if iCurCellLoc == iBoundaryCellNumber then + if UnitMovement == UnitMove_Prior then + SayUsingVoice (VCTX_message, cMSGBeginningOfRow, OT_JAWS_message) + SayCell() + ElIf UnitMovement == UnitMove_Next then + SayUsingVoice (VCTX_message, cMSGEndOfRow, OT_JAWS_message) + SayCell() + ElIf UnitMovement == UnitMove_First then + SpeakTableCells (TABLE_NAV_ROW_EXTENTS, 0) + ElIf UnitMovement == UnitMove_Last then + SpeakTableCells (TABLE_NAV_ROW_EXTENTS, 0) + ElIf UnitMovement == UnitMove_Up then + SayUsingVoice (VCTX_message, cMSGTopOfColumn, OT_JAWS_message) + SayCell() + ElIf UnitMovement == UnitMove_Down then + SayUsingVoice (VCTX_message, cMSGBottomOfColumn, OT_JAWS_message) + SayCell() + ElIf UnitMovement == UnitMove_Top then + SpeakTableCells (TABLE_NAV_COLUMN_EXTENTS,GetCurrentRowColumnCount()) + ElIf UnitMovement == UnitMove_Bottom then + SpeakTableCells (TABLE_NAV_COLUMN_EXTENTS,GetCurrentRowColumnCount()) + EndIf +ElIf nCurCol == iBoundaryColNumber +&& nCurRow == iBoundaryRowNumber then + if UnitMovement == UnitMove_Start then + SpeakTableCells(TABLE_NAV_TABLE_EXTENTS,GetCurrentRowColumnCount()) + ElIf UnitMovement == UnitMove_End then + SpeakTableCells(TABLE_NAV_TABLE_EXTENTS,GetCurrentRowColumnCount()) + EndIf +else + SaveCursor () + PCCursor () + if UnitMovement == UnitMove_Prior then + let g_JavaPrevNumOfCells = 0 + let g_JavaTableNavDir = TABLE_NAV_HORIZONTAL + TypeKey(cksLeftArrow) + ElIf UnitMovement == UnitMove_Next then + let g_JavaPrevNumOfCells = 0 + let g_JavaTableNavDir = TABLE_NAV_HORIZONTAL + TypeKey(cksRightArrow) + ElIf UnitMovement == UnitMove_First then + let g_JavaPrevNumOfCells = 0 + let g_JavaTableNavDir = TABLE_NAV_ROW_EXTENTS + TypeKey (cksHome) ; Home + ElIf UnitMovement == UnitMove_Last then + let g_JavaPrevNumOfCells = 0 + let g_JavaTableNavDir = TABLE_NAV_ROW_EXTENTS + TypeKey(cksEnd) + ElIf UnitMovement == UnitMove_Up then + let g_JavaPrevNumOfCells = GetCurrentRowColumnCount () + let g_JavaTableNavDir = TABLE_NAV_VERTICAL + TypeKey(cksUpArrow) + ElIf UnitMovement == UnitMove_Down then + let g_JavaPrevNumOfCells = GetCurrentRowColumnCount () + let g_JavaTableNavDir = TABLE_NAV_VERTICAL + TypeKey(cksDownArrow) + ElIf UnitMovement == UnitMove_Top then + let g_JavaPrevNumOfCells = GetCurrentRowColumnCount () + let g_JavaTableNavDir = TABLE_NAV_COLUMN_EXTENTS + TypeKey(cksControlHome) + ElIf UnitMovement == UnitMove_Bottom then + let g_JavaPrevNumOfCells = GetCurrentRowColumnCount () + let g_JavaTableNavDir = TABLE_NAV_COLUMN_EXTENTS + TypeKey(cksControlEnd) + ElIf UnitMovement == UnitMove_Start then + let g_JavaPrevNumOfCells = GetCurrentRowColumnCount() + let g_JavaTableNavDir = TABLE_NAV_TABLE_EXTENTS + let g_JavaIgnoreNextActiveItemChange = 1 + TypeKey(cksControlHome) + TypeKey(cksHome) + ElIf UnitMovement == UnitMove_End then + let g_JavaPrevNumOfCells = GetCurrentRowColumnCount() + let g_JavaTableNavDir = TABLE_NAV_TABLE_EXTENTS + let g_JavaIgnoreNextActiveItemChange = 1 + TypeKey(cksControlEnd) + TypeKey(cksEnd) + EndIf +endIf +return true +EndFunction + +int function SayCellUnit(int UnitMovement) +SayCellUnitEx(UnitMovement, true, false) +endFunction + +int function NavigateForSayCellUnitEx(int UnitMovement, int wantErrors, int nextOrPriorCellShouldWrap, + int byRef iNavDir, int byRef nPrevNumOfCells) +nPrevNumOfCells = 0 +if UnitMovement == UnitMove_Prior + if PriorCell(nextOrPriorCellShouldWrap) + iNavDir = TABLE_NAV_HORIZONTAL + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayUsingVoice (VCTX_message, cMSGBeginningOfRow, OT_JAWS_message) + endIf + endIf + return false +ElIf UnitMovement == UnitMove_Next + if NextCell(nextOrPriorCellShouldWrap) + iNavDir = TABLE_NAV_HORIZONTAL + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayUsingVoice (VCTX_message, cMSGEndOfRow, OT_JAWS_message) + endIf + endIf + return false +ElIf UnitMovement == UnitMove_First + if StartOfRow () + iNavDir = TABLE_NAV_ROW_EXTENTS + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayUsingVoice (VCTX_message, cMsgStartOfRowFailed, OT_JAWS_message) + endIf + endIf + return false +ElIf UnitMovement == UnitMove_Last + if EndOfRow() + iNavDir = TABLE_NAV_ROW_EXTENTS + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayUsingVoice(VCTX_message, cMsgEndOfRowFailed, OT_JAWS_message) + endIf + EndIf + return false +ElIf UnitMovement == UnitMove_Up + if UpCell() + iNavDir = TABLE_NAV_VERTICAL + nPrevNumOfCells = GetCurrentRowColumnCount() + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayUsingVoice (VCTX_message, cMSGTopOfColumn, OT_JAWS_message) + endIf + EndIf + return false +ElIf UnitMovement == UnitMove_Down + if DownCell() + || MoveFromHTMLTableStartOrCaptionToFirstTableCell() + iNavDir = TABLE_NAV_VERTICAL + nPrevNumOfCells = GetCurrentRowColumnCount() + return true + elif wantErrors + ;Test for border or caption error, because we cannot provide a way to move when at the end string: + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayUsingVoice (VCTX_message, cMSGBottomOfColumn, OT_JAWS_message) + endIf + EndIf + return false +ElIf UnitMovement == UnitMove_Top + if TopOfColumn () + iNavDir = TABLE_NAV_COLUMN_EXTENTS + nPrevNumOfCells = GetCurrentRowColumnCount () + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayFormattedMessage(OT_error, cMsgTopOfColumnFailed, cMSGNotInTable_S) ; Could not move to Top of column + endIf + EndIf + return false +ElIf UnitMovement == UnitMove_Bottom + if BottomOfColumn() + iNavDir = TABLE_NAV_COLUMN_EXTENTS + nPrevNumOfCells = GetCurrentRowColumnCount () + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayFormattedMessage (OT_error, cMsgBottomOfColumnFailed, cMSGNotInTable_s) ; Could not move to Bottom of column + endIf + EndIf + return false +ElIf UnitMovement == UnitMove_Start + if FirstCell () + || MoveFromHTMLTableStartOrCaptionToFirstTableCell() + iNavDir = TABLE_NAV_TABLE_EXTENTS + nPrevNumOfCells = GetCurrentRowColumnCount () + return true + elif wantErrors + ;Test for border or caption error, because we cannot provide a way to move when at the end string: + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayFormattedMessage (OT_ERROR, cMSGNotInTable_l, cMSGNotInTable_S) + endIf + EndIf + return false +ElIf UnitMovement == UnitMove_End + if LastCell () + iNavDir = TABLE_NAV_TABLE_EXTENTS + nPrevNumOfCells = GetCurrentRowColumnCount () + return true + elif wantErrors + if !SpeakHTMLTableBorderOrCaptionCursorNavigationError() + SayFormattedMessage (OT_ERROR, cMSGNotInTable_L, cMSGNotInTable_S) + endIf + EndIf + return false +endIf +return false +EndFunction + +int function SayCellUnitEx(int UnitMovement, int wantErrors, int nextOrPriorCellShouldWrap) +if wantErrors && TableErrorEncountered(UnitMoveToTableNavDir(UnitMovement)) + Return false +endIf +if NavigateJavaTable(UnitMovement) + return false +EndIf +var + int iNavDir, + int nPrevNumOfCells, + int iPrevTableLevel +iPrevTableLevel = GetTableNestingLevel() +if !NavigateForSayCellUnitEx(UnitMovement, wantErrors, nextOrPriorCellShouldWrap, iNavDir, nPrevNumOfCells) + ;When Smart Navigation is set to Controls And Tables, arrowing left from the start of the first row or right from the end of the last row will fail. + ;If we returned true from here, the Smart Navigation hook function would simply prevent the next/prior character script from running, + ;presuming that the table navigation succeeded. + ;Since we want to allow prior/next character to still work to move to whatever comes before or after this object in the virtual + ;document, we must return FALSE from here. + ;Note that because we are returning if no navigation occurs, + ;The SayCell script does not use this function to speak the current cell. + return false +endIf +var + int iTableLevel, + int iSpeakPosition, + string sNestingMsg +SpeakTableCells(iNavDir,nPrevNumOfCells) +iTableLevel = GetTableNestingLevel() +if iTableLevel > 0 +&& iTableLevel != iPrevTableLevel +&& iPrevTableLevel >= 0 + iSpeakPosition =ShouldItemSpeak(ot_position) + if iSpeakPosition == message_long + sNestingMsg = formatString(cmsgNestedTableWithColumnAndRowCount_L, + IntToString(iTableLevel), + IntToString(GetTableColumnCount()), + IntToString(GetTableRowCount())) + ElIf iSpeakPosition == message_short + sNestingMsg = formatString(cmsgNestedTableWithColumnAndRowCount_S, + IntToString(iTableLevel), + IntToString(GetTableColumnCount()), + IntToString(GetTableRowCount())) + EndIf + if sNestingMsg + SayUsingVoice(VCTX_MESSAGE, sNestingMsg, OT_POSITION) + EndIf +EndIf +return true +EndFunction + +Script NextCell () +SayCellUnit(UnitMove_Next) +EndScript + +script MoveToEndOfRow () +SayCellUnit(UnitMove_Last) +EndScript + +Script PriorCell () +SayCellUnit(UnitMove_Prior) +EndScript + +script MoveToStartOfRow () +SayCellUnit(UnitMove_First) +EndScript + +Script UpCell () +SayCellUnit(UnitMove_Up) +EndScript + +script MoveToTopOfColumn () +SayCellUnit(UnitMove_Top) +EndScript + +Script DownCell () +SayCellUnit(UnitMove_Down) +EndScript + +script MoveToBottomOfColumn () +SayCellUnit(UnitMove_Bottom) +EndScript + +Script FirstCellInTable () +SayCellUnit(UnitMove_Start) +EndScript + +Script LastCellInTable () +SayCellUnit(UnitMove_End) +EndScript + +int function isChromeWindow(handle hWnd) +var string class = GetWindowClass(hWnd) +return class == cwc_Chrome_WidgetWin_1 + || class == cwc_ChromeWindowClass +EndFunction + +int function isFirefoxWindow(handle hWnd) +var string class = GetWindowClass(hWnd) +return class == cwc_MozillaWindowClass +EndFunction + +int function GetWebDocumentUniqueID() +var handle hWnd = GetFocus() +if !isFirefoxWindow(hWnd) && !isChromeWindow(hWnd) return 0 endIf +var int count = GetAncestorCount() +var int i, int documentCount +var int ID +for i = 0 to count + if GetObjectRole(i) == role_system_document + if !documentCount + ID = GetObjectIA2UniqueID(i) + endIf + documentCount = documentCount+1 + endIf +endFor +;Since we are looking for a document inside a web page and not the one which encloses the entire web page: +if documentCount <= 1 return 0 endIf +return ID +EndFunction + +void function SayDialogNameForvirtualCursorRestrictedEvent() +MSAARefresh (true, 20) +var string currentDialogIdentifier = GetDialogIdentifier() +IndicateControlType (WT_DIALOG, currentDialogIdentifier, cscNull) +GlobalPrevDialogIdentifier = currentDialogIdentifier +EndFunction + +void function SayDialogTextForvirtualCursorRestrictedEvent() +var string text = MSAAGetDialogStaticText () +if text + Say(text,ot_dialog_text) +endIf +EndFunction + +void function SayFocusAndAncestorsInDialogFromLevelForvirtualCursorRestrictedEvent() +; This speaks the focus object and its ancestors below the level of the dialog. +var int type = GetObjectSubtypeCode() +if type == wt_dialog return endIf +var int level = FindAncestorOfRole(ROLE_SYSTEM_DIALOG) +if level <= 0 return endIf +DoSayObjectTypeAndTextFromLevel(level-1) +EndFunction + +void function SayDialogForvirtualCursorRestrictedEvent(optional string unused) +SayDialogNameForvirtualCursorRestrictedEvent() +SayDialogTextForvirtualCursorRestrictedEvent() +SayFocusAndAncestorsInDialogFromLevelForvirtualCursorRestrictedEvent() +EndFunction + +void function virtualCursorRestrictedEvent() +; This is called when the virtual cursor is restricted due to the focus changing, rather than the user toggling restriction with JAWSKey+r. +; Thus we need to speak the new dialog. +if virtualCursorRestrictionType == virtualCursorRestriction_Dialog + SayDialogForvirtualCursorRestrictedEvent() +elif virtualCursorRestrictionType == virtualCursorRestriction_Document + if (GetObjectSubtypeCode () == WT_DOCUMENT + || GetObjectRole () == ROLE_SYSTEM_DOCUMENT) + && GetCursorRow () > 1 + GotoLineNumber (1) + endIf + SayLine() + GlobalPrevDocumentIdentifier = GetWebDocumentUniqueID() +endIf +endFunction + +void function UserToggleVirtualCursorRestriction() +; This is called when the user toggles restriction with Insert+R. +; See function virtualCursorRestrictedEvent for when the restriction toggles due to a focus change. +if IsVirtualDocumentViewRestricted() + sayMessage(OT_STATUS, cmsg318_L) + Refresh() ; this will unrestrict the document. + virtualCursorRestrictionType = virtualCursorRestriction_Off + return +endIf +if !inWebDialog() && !InDocumentInAppRegion() + sayMessage(OT_error, cmsgRestrictVirtualError_L, cmsgRestrictVirtualError_S) + return +endIf +if DialogActive() && RestrictViewToEnclosingType(wt_dialog) + virtualCursorRestrictionType = virtualCursorRestriction_Dialog + GlobalPrevDialogIdentifier = GetDialogIdentifier() + sayMessage(OT_STATUS, cmsgRestrictToWebDialog_L, cmsgRestrictToWebDialog_S) +elif InDocumentInAppRegion() && RestrictViewToEnclosingType(wt_document) + virtualCursorRestrictionType = virtualCursorRestriction_Document + sayMessage(OT_STATUS, cmsgRestrictToWebDocument_L, cmsgRestrictToWebDocument_S) + GlobalPrevDocumentIdentifier = GetWebDocumentUniqueID() +else + SayMessage(ot_error, cmsgRestrictVirtualError_L, cmsgRestrictVirtualError_S) +endIf +EndFunction + +int function ShouldHandleWebDialogFocusTransition() +if InHJDialog () + return false +endIf +if !IsVirtualPCCursor() && !IsFormsModeActive() + if isChromeWindow(getFocus()) || isFirefoxWindow(getFocus()) + return dialogActive(true) + else + return false + endIf +endIf +return true +endFunction + +int function ShouldHandleWebDocumentFocusTransition() +if !IsVirtualPCCursor() && !IsFormsModeActive() return false endIf +var handle hWnd = GetFocus() +return isChromeWindow(hWnd) || isFirefoxWindow(hWnd) +EndFunction + +int function DidWebDialogJustOpenOrClose() +;; This function detects whether a web page dialog was just opened or closed. +;; * Because this function is called while processing a focus change it should +;; use the DialogActive function rather than the InWebDialog function. +;; * When calling the DialogActive function the useTopWindowControlType parameter +;; should be false so that this function will work properly if a Internet Explorer +;; window is embedded within a ThunderRT6FormDC window. +var int inDialog = DialogActive(false) +var int isRestricted = IsVirtualDocumentViewRestricted() +if (inDialog && !isRestricted) +|| (!inDialog && isRestricted && virtualCursorRestrictionType == virtualCursorRestriction_Dialog) + return true +endIf +if inDialog + ; Did focus move from one dialog to another? + var string DialogIdentifier = GetDialogIdentifier() + if (StringCompare(DialogIdentifier, GlobalPrevDialogIdentifier) != 0) + return true + endIf +endIf +return false +endFunction + +int function DidFocusMoveToOrFromWebDocument() +var int restricted = IsVirtualDocumentViewRestricted() +var int inDocument = InDocumentInAppRegion() +if (inDocument && !restricted) +|| (!inDocument && restricted && virtualCursorRestrictionType == virtualCursorRestriction_Document) +|| (inDocument && restricted && virtualCursorRestrictionType != virtualCursorRestriction_Document) + return true +endIf +if inDocument + ; Did focus move from one document to another? + var int DocumentIdentifier = GetWebDocumentUniqueID() + if DocumentIdentifier != GlobalPrevDocumentIdentifier + return true + endIf +endIf +return false +endFunction + +void function HandleWebDialogRestriction() +;For automatic virtual cursor restriction resulting from navigation. +var string currentDialogIdentifier = cscNull +if IsVirtualDocumentViewRestricted() + Refresh() ; this will unrestrict the document. + virtualCursorRestrictionType = virtualCursorRestriction_Off + ; Note: Focus may have moved from one web dialog to another. In this case, we + ; need to re-enable restriction for the new web dialog here. + If (inWebDialog() && RestrictViewToEnclosingType(wt_dialog)) + virtualCursorRestrictionType = virtualCursorRestriction_Dialog + virtualCursorRestrictedEvent() + endIf +else ; not restricted. + ; At this point, the virtual cursor is somewhere in a web dialog (the real focus may or may not be in the dialog). + if RestrictViewToEnclosingType(wt_dialog) then + virtualCursorRestrictionType = virtualCursorRestriction_Dialog + virtualCursorRestrictedEvent() + elif !isVirtualPCCursor() && dialogActive() + currentDialogIdentifier = GetDialogIdentifier() + DoSayObjectTypeAndTextFromLevel(GetFocusChangeDepth()) + GlobalPrevDialogIdentifier = currentDialogIdentifier + endIf +endIf +endFunction + +void function HandleWebDocumentRestriction() +;For automatic virtual cursor restriction resulting from navigation. +if IsVirtualDocumentViewRestricted() + var int inDocument = InDocumentInAppRegion() + Refresh() ; this will unrestrict the document. + virtualCursorRestrictionType = virtualCursorRestriction_Off + ; Note: Focus may have moved from one web dialog to another. In this case, we + ; need to re-enable restriction for the new web dialog here. + If InDocument + MSAARefresh() ;Make sure that we get the current document rather than the prior one. + if RestrictViewToEnclosingType(wt_document) + virtualCursorRestrictionType = virtualCursorRestriction_Document + virtualCursorRestrictedEvent() + return + endIf + endIf + ;focus has moved outside of any document + MSAARefresh() ;Make sure that we get the current document rather than the prior one. + SayObjectTypeAndText() + return +else ; not restricted. + if RestrictViewToEnclosingType(wt_document) + virtualCursorRestrictionType = virtualCursorRestriction_Document + virtualCursorRestrictedEvent() + endIf +endIf +endFunction + +int function HandleWebDialogFocusTransition() +if !ShouldHandleWebDialogFocusTransition() +|| !DidWebDialogJustOpenOrClose() + return false +endIf +if IsVirtualDocumentViewRestricted() +&& virtualCursorRestrictionType != virtualCursorRestriction_Dialog + prevVirtualCursorRestrictionType = virtualCursorRestrictionType +endIf +HandleWebDialogRestriction() +return true +endFunction + +int function HandleWebDocumentFocusTransition() +if !ShouldHandleWebDocumentFocusTransition() +|| !DidFocusMoveToOrFromWebDocument() + return false +endIf +if IsVirtualDocumentViewRestricted() +&& virtualCursorRestrictionType != virtualCursorRestriction_Document + prevVirtualCursorRestrictionType = virtualCursorRestrictionType +endIf +HandleWebDocumentRestriction() +return true +endFunction + +script VirtualDialogRestrictionToggle () +if (isVirtualPCCursor() || IsFormsModeActive()) + UserToggleVirtualCursorRestriction() +else + sayMessage (OT_ERROR, cmsgMagicWebDialogRestrictionError) +endIf +endScript + +Script RestrictCurrentCursor () +var int isUIAScanCursor = (IsJawsUIACursor() || IsInvisibleUIACursor()) +if !isUIAScanCursor +&& (isVirtualPCCursor() || IsFormsModeActive()) + UserToggleVirtualCursorRestriction() + return +endIf +if (IsPCCursor()) + SayFormattedMessage (ot_error, cmsgRestrict1_L, cmsgRestrict1_S) + return +endIf +var int nCurrent = getRestriction() +;UIA cursors and OSM cursors have different valid restrictions. +if isUIAScanCursor + if nCurrent < FirstUIACursorRestriction || nCurrent > LastUIACursorRestriction + nCurrent = FirstUIACursorRestriction + elif nCurrent == LastUIACursorRestriction + nCurrent = FirstUIACursorRestriction + else + nCurrent = nCurrent +1 + EndIf +else ;handle the OSM cursor restriction + if nCurrent < FirstOSMCursorRestriction || nCurrent > LastOSMCursorRestriction + nCurrent = FirstOSMCursorRestriction + elif nCurrent == LastOSMCursorRestriction + nCurrent = FirstOSMCursorRestriction + else + nCurrent = nCurrent +1 + EndIf +endIf +SetRestriction(nCurrent) +SayRestrictionName(nCurrent) +EndScript + +Script RestrictBrailleCursor (int index) +var + int nCurrent +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +let nCurrent = GetBrailleRestriction() +if (nCurrent == RestrictNone) then + let nCurrent = RestrictAppWindow +elif (nCurrent == RestrictAppWindow) then + let nCurrent = RestrictWindow +elif (nCurrent == RestrictWindow) then + Let nCurrent = RestrictRect +ElIf (nCurrent == RestrictRect) then + let nCurrent = RestrictNone +endIf +SetBrailleRestriction (nCurrent) +;Update restriction globals as well: +giDefaultBrlCursorRestriction = GetBrailleRestriction () +SayFormattedMessage (OT_STATUS, cmsgBraille1_L, cmsgBraille1_S); "Braille Cursor" +SayRestrictionName(nCurrent) +EndScript + +Int Function IsHJTrackEngine () +Var + Int bSpeechInUse, + Int bBrailleInUse, + Handle hwndMAGicUI +let hwndMAGicUI = FindTopLevelWindow ("JFWUI60", "") +if (hwndMAGicUI == 0) Then + return 0 +Else + let bSpeechInUse = SpeechInUse () + let bBrailleInUse = BrailleInUse () + If (bSpeechInUse == FALSE && bBrailleInUse == FALSE) Then + return 1 + endIf +endIf +return 0 +EndFunction + +Void Function ResetVoiceSettings () +if globalVoiceChanges then + if globalVoiceChanges & V_RATE then + SetAllVoicesToGlobals (V_RATE) + endIf + if globalVoiceChanges & V_VOLUME then + SetAllVoicesToGlobals (V_VOLUME) + endIf + if globalVoiceChanges & V_Pitch then + SetAllVoicesToGlobals (V_PITCH) + endIf + ;NullAllGlobalSettings () + let globalVoiceChanges = 0 + let globalVoiceName = "" +endIf +EndFunction + +Void Function SetVoiceGlobalSettings (int iSetting, string ContextName, int CurrentSetting) +If GlobalVoiceName == "" then + let GlobalVoiceName = ContextName + If iSetting == V_RATE then + If ! (GlobalVoiceChanges & V_RATE) then + let globalVoiceChanges = (globalVoiceChanges | V_RATE) + InitializeGlobalVoiceSettings (V_RATE) + Return + endIf + ElIf iSetting == V_VOLUME then + If ! (GlobalVoiceChanges & V_VOLUME) then + let globalVoiceChanges = globalVoiceChanges | V_VOLUME + InitializeGlobalVoiceSettings (V_VOLUME) + Return + endIf + ElIf iSetting == V_PITCH then + If ! (GlobalVoiceChanges & V_PITCH) then + let globalVoiceChanges = globalVoiceChanges | V_PITCH + InitializeGlobalVoiceSettings (V_PITCH) + Return + endIf + endIf +endIf +EndFunction + +Int Function GetSettingInformation (int Setting, string ContextName, + Int ByRef MinSetting, Int ByRef MaxSetting) +; Helper function to grab current voice parameter setting +var + int Information +If Setting == V_RATE then + let Information = GetVoiceRate (ContextName) + GetSynthRateRange (MinSetting, MaxSetting) +ElIf Setting == V_Volume then + let Information = GetVoiceVolume (ContextName) + GetVoiceVolumeRange (MinSetting, MaxSetting) +ElIf Setting == V_Pitch then + let Information = GetVoicePitch (ContextName) + GetSynthPitchRange (MinSetting, MaxSetting) +endIf +;If GlobalVoiceName == "" then +If ! GlobalVoiceChanges then + SetVoiceGlobalSettings (Setting, ContextName, Information) +endIf +Return Information +EndFunction + +Void Function NullAllGlobalSettings (optional int iParamToSet) +If iParamToSet == V_RATE then + let GlobalPcRate = 0 + let GlobalSayAllRate = 0 + let GlobalJAWSRate = 0 + let GlobalKeyboardRate = 0 + let GlobalMessageRate = 0 + let GlobalMenuDialogRate = 0 +ElIf iParamToSet == V_VOLUME then + let GlobalPcVolume = 0 + let GlobalSayAllVolume = 0 + let GlobalJAWSVolume = 0 + let GlobalKeyboardVolume = 0 + let GlobalMessageVolume = 0 + let GlobalMenuDialogVolume = 0 +ElIf iParamToSet == V_PITCH then + let GlobalPcPitch = 0 + let GlobalSayAllPitch = 0 + let GlobalJAWSPitch = 0 + let GlobalKeyboardPitch = 0 + let GlobalMessagePitch = 0 + let GlobalMenuDialogPitch = 0 +endIf +EndFunction + +Void Function InitializeGlobalVoiceSettings (int iParamToSet) +If iParamToSet == V_RATE then + let GlobalPcRate = GetVoiceRate (VCTX_PCCURSOR) + let GlobalSayAllRate = GetVoiceRate (VCTX_SAY_ALL) + let GlobalJAWSRate = GetVoiceRate (VCTX_JAWSCURSOR) + let GlobalKeyboardRate = GetVoiceRate (VCTX_KEYBOARD) + let GlobalMessageRate = GetVoiceRate (VCTX_MESSAGE) + let GlobalMenuDialogRate = GetVoiceRate (VCTX_MENU_AND_DIALOG) +ElIf iParamToSet == V_VOLUME then + let GlobalPcVolume = GetVoiceVolume (VCTX_PCCURSOR) + let GlobalSayAllVolume = GetVoiceVolume (VCTX_SAY_ALL) + let GlobalJAWSVolume = GetVoiceVolume (VCTX_JAWSCURSOR) + let GlobalKeyboardVolume = GetVoiceVolume (VCTX_KEYBOARD) + let GlobalMessageVolume = GetVoiceVolume (VCTX_MESSAGE) + let GlobalMenuDialogVolume = GetVoiceVolume (VCTX_MENU_AND_DIALOG) +ElIf iParamToSet == V_PITCH then + let GlobalPcPitch = GetVoicePitch (VCTX_PCCURSOR) + let GlobalSayAllPitch = GetVoicePitch (VCTX_SAY_ALL) + let GlobalJAWSPitch = GetVoicePitch (VCTX_JAWSCURSOR) + let GlobalKeyboardPitch = GetVoicePitch (VCTX_KEYBOARD) + let GlobalMessagePitch = GetVoicePitch (VCTX_MESSAGE) + let GlobalMenuDialogPitch = GetVoicePitch (VCTX_MENU_AND_DIALOG) +endIf +EndFunction + +Void Function SetAllVoicesToGlobals (int iParamSet) +If iParamSet == V_RATE then + SetVoiceRate (VCTX_PCCURSOR, GlobalPCRate) + SetVoiceRate (VCTX_SAY_ALL, GlobalSayAllRate) + SetVoiceRate (VCTX_JAWSCURSOR, GlobalJAWSRate) + SetVoiceRate (VCTX_KEYBOARD, GlobalKeyboardRate) + SetVoiceRate (VCTX_MESSAGE, GlobalMessageRate) + SetVoiceRate (VCTX_MENU_AND_DIALOG, GlobalMenuDialogRate) +ElIf iParamSet == V_VOLUME then + SetVoiceVolume (VCTX_PCCURSOR, GlobalPcVolume) + SetVoiceVolume (VCTX_SAY_ALL, GlobalSayAllVolume) + SetVoiceVolume (VCTX_JAWSCURSOR, GlobalJAWSVolume) + SetVoiceVolume (VCTX_KEYBOARD, GlobalKeyboardVolume) + SetVoiceVolume (VCTX_MESSAGE, GlobalMessageVolume) + SetVoiceVolume (VCTX_MENU_AND_DIALOG, GlobalMenuDialogVolume) +ElIf iParamSet == V_PITCH then + SetVoicePitch (VCTX_PCCURSOR, GlobalPcPitch) + SetVoicePitch (VCTX_SAY_ALL, GlobalSayAllPitch) + SetVoicePitch (VCTX_JAWSCURSOR, GlobalJAWSPitch) + SetVoicePitch (VCTX_KEYBOARD, GlobalKeyboardPitch) + SetVoicePitch (VCTX_MESSAGE, GlobalMessagePitch) + SetVoicePitch (VCTX_MENU_AND_DIALOG, GlobalMenuDialogPitch) +endIf +EndFunction + +Void Function SetVoiceRatePercentByVoiceCommand (int iPercent) +var + int InSayAll, + string ContextNameLocal +let InSayAll = SayAllInProgress () +let ContextNameLocal = VCTX_GLOBAL +if InSayAll +&& UseSapi5ForSayAll() then + let ContextNameLocal = VCTX_SAY_ALL +endIf +SetVoiceRatePercent (ContextNameLocal, iPercent) +if !InSayAll + SayFormattedMessage (OT_STATUS, FormatString (cmsgVoiceRatePercent, iPercent)) +endIf +EndFunction + +Void Function SetVoiceSetting (int ParameterToSet, int Setting, string ContextName, + int UpOrDown, int InSayAll, optional int bSaveNewSetting) +var + string ContextNameLocal +let ContextNameLocal = VCTX_GLOBAL +if InSayAll +&& UseSapi5ForSayAll() then + let ContextNameLocal = VCTX_SAY_ALL +endIf +If ParameterToSet == V_PITCH then + SetVoicePitch (ContextNameLocal, Setting) + If ! InSayAll then + If UpOrDown == V_Down then + SayFormattedMessage (OT_STATUS, cmsg354_L); "Lower" + ElIf UpOrDown == V_UP then + SayFormattedMessage (OT_STATUS, cmsg355_L); "Higher" + endIf + endIf +ElIf ParameterToSet == V_RATE then + SetVoiceRate (ContextNameLocal, Setting,bSaveNewSetting) + If ! InSayAll then + If UpOrDown == V_DOWN then + SayFormattedMessage (OT_STATUS, cmsg356_L); "Slower" + ElIf UpOrDown == V_Up then + SayFormattedMessage (OT_STATUS, cmsg357_L); "Faster", cmsgSilent) + endIf + endIf +ElIf ParameterToSet == V_Volume then + SetVoiceVolume (ContextNameLocal, Setting) + If ! InSayAll then + If UpOrDown == V_DOWN then + SayFormattedMessage (OT_STATUS, cmsg358_L); "Softer" + ElIf UpOrDown == V_UP then + SayFormattedMessage (OT_STATUS, cmsg359_L); "Louder" + endIf + endIf +endIf +EndFunction + +Void Function ChangeVoiceSettingByPercent (int iSetting, int iDirection, int iPercent, int InSayAll, int bSaveNewSetting) +var + string contextName, + int CurrentSetting, + int minSetting, + int maxSetting, + int increment +if InSayAll +&& UseSapi5ForSayAll() then + let contextName = VCTX_SAY_ALL +else + If IsJAWSCursor() then + let contextName = VCTX_JAWSCURSOR + else + let contextName = VCTX_PCCURSOR + endIf +endif +let CurrentSetting = GetSettingInformation (iSetting, ContextName, MinSetting, MaxSetting) +If iDirection == V_Down then + let increment = (maxSetting-minSetting)*iPercent/100 + if increment <= 0 then + let increment = 1 ; for those synthesizers with a short range + endIf + let CurrentSetting = max(minSetting,currentSetting-increment) ; keeps the current value within range +ElIf iDirection == V_Up then + let increment = ((maxSetting-minSetting)*iPercent)/100 + if increment <= 0 then + let increment = 1 ; for those synthesizers with a short range + endIf + let currentSetting = min(maxSetting,currentSetting+increment) +endIf +SetVoiceSetting (iSetting, CurrentSetting, ContextName, iDirection, InSayAll, bSaveNewSetting) +EndFunction + +Void Function ChangeVoiceSetting (int iSetting, int iDirection, int InSayAll, int bSaveNewSetting) +ChangeVoiceSettingByPercent (iSetting, iDirection, 5, InSayAll, bSaveNewSetting) +EndFunction + +Script DecreaseVoiceRateTemporaryByVoiceCommand() +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSettingByPercent (V_RATE, V_DOWN, 20, InSayAll, (false & !InSayAll)) +EndScript + +Script IncreaseVoiceRateTemporaryByVoiceCommand() +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSettingByPercent (V_RATE, V_UP, 20, InSayAll, (false & !InSayAll)) +EndScript + +Script DecreaseVoiceRateTemporary() +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_RATE, V_DOWN, InSayAll, (false & !InSayAll)) +EndScript + +Script DecreaseVoiceRatePermanent() +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_RATE, V_DOWN, InSayAll, (GetRunningFSProducts () & product_MAGic) || (!InSayAll)) +EndScript + +Script IncreaseVoiceRateTemporary() +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_RATE, V_UP, InSayAll, (false & !InSayAll)) +EndScript + +Script IncreaseVoiceRatePermanent() +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_RATE, V_UP, InSayAll, (GetRunningFSProducts () & product_MAGic) || (!InSayAll)) +EndScript + +Script DecreaseVoiceRate () +;This script is deprecated, but is here for backwards compatibility +PerformScript DecreaseVoiceRateTemporary() +EndScript + +Script IncreaseVoiceRate () +;This script is deprecated, but is here for backwards compatibility +PerformScript IncreaseVoiceRateTemporary() +EndScript + +Script DecreaseVoiceVolume () +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_VOLUME, V_DOWN, InSayAll) +EndScript + +Script IncreaseVoiceVolume () +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_VOLUME, V_UP, InSayAll) +EndScript + +Script DecreaseVoicePitch () +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_PITCH, V_DOWN, InSayAll) +EndScript + +Script IncreaseVoicePitch () +var + int InSayAll +let InSayAll = SayAllInProgress () +ChangeVoiceSetting (V_PITCH, V_UP, InSayAll) +EndScript + +Script RestoreVoiceSettings () +ResetVoiceSettings () +SayFormattedMessage (OT_STATUS, cmsg360_L, cmsg360_S); "Voice Settings Restored" +EndScript + +int function SayLineInsteadOfSayAll() +var + int iType, + string sClass +Let iType = GetWindowSubtypeCode (GetFocus ()) +IF iType == WT_EDIT_SPINBOX then + PerformScript SayLine () + return true +endIf +If IsPcCursor() +&& !IsVirtualPcCursor() +&& DialogActive() then + If !(GetWindowStyleBits(GetFocus()) & ES_MULTILINE) + || !iType then + PerformScript SayLine () + return true + EndIf +EndIf +If GlobalMenuMode then + PerformScript SayLine () + return true +EndIf +let sClass = GetWindowClass(GetFocus()) +if sClass == cwc_DirectUIhWND then + if GetObjectSubtypeCode() == wt_Edit then + PerformScript SayLine () + return true + EndIf +elif sClass == cwc_SysMonthCal32 then + PerformScript SayLine () + return true +EndIf +return false +EndFunction + +void function SetSayAllScheme() +var + string sScheme +let sScheme = GetCurrentSayAllScheme() +if sScheme then + let gsSavedApplicationScheme = GetCurrentSchemeName() + SwitchToScheme(sScheme) +EndIf +EndFunction + +void function ClearSayAllScheme() +var + string sScheme +if GetCurrentSayAllScheme() != gsSavedApplicationScheme then + SwitchToScheme(gsSavedApplicationScheme) + let gsSavedApplicationScheme = cscNull +EndIf +EndFunction + +void function SetSAPILoadedVarForSayALL() +if !gbSAPILoaded then + let gbSAPILoaded = true + Say(cmsgLoadingSAPI,ot_help) +EndIf +EndFunction + +Script SayAllFromLocation () +if !IsZoomTextRunning() then + return +endIf +If SayLineInsteadOfSayAll() then + return +endIf +SayAll(true) +EndScript + +Script SayAll (optional int bIgnoreUseSAPI5DuringSayAllOption) +if SayLineInsteadOfSayAll() then + return +EndIf +;SetSayAllScheme() +;Uncomment following block if the initial load of SAPI 5 takes too long: +;if GetDefaultJCFOption(OPT_Use_SAPI5_During_Say_All) then +; SetSAPILoadedVarForSayALL() +;EndIf +SayAll(!bIgnoreUseSAPI5DuringSayAllOption) +EndScript + +Void Function SayAllStarted () +;; This function is called by the built in script function SayAll just before the +;; Speak method of the SAYALL object is called for the first time. +;; It is intended that this function be overridden in a given application's scripts to provide a method +;; of performing actions (such as setting JCF options) just before a Say All is started. This +;; complements the preexisting SayAllStoppedEvent which is called whenever a Say All process is +;; stopped. +SetSayAllScheme() +EndFunction + +Void Function SayAllStoppedEvent () +if gbSayAllTemporarilyToggledToSAPI then + SetDefaultJCFOption (OPT_Use_SAPI5_During_Say_All, 0) +endIf +let gbSayAllTemporarilyToggledToSAPI = false +ClearSayAllScheme() +VirtualSayAllStops () +EndFunction + +void function DialogListHelper (handle ByRef hwnd, string ByRef sList, string ByRef sControlsList, int ByRef iIndex) +var + handle hNull, + int iWinType, + string sWinType, + string sTemp +While (hwnd != hNull) + let iWinType = GetWindowSubTypeCode (hwnd) + While (hwnd != hNull && + (!IsWindowVisible (hwnd) || iWinType == wt_static || iWinType == wt_unknown || iWinType == wt_tabcontrol || iWinType == wt_dialog || iWinType == wt_groupbox || iWinType == wt_scrollbar || iWinType == wt_toolbar)) + let hwnd = GetNextWindow (hwnd) + let iWinType = GetWindowSubTypeCode (hwnd) + EndWhile + If (hwnd != hNull) then + let sWinType = GetWindowType (hwnd) + If (iWinType == wt_edit || iWinType == wt_listbox || iWinType == wt_listview || iWinType == wt_combobox) then + let sTemp = GetWindowText (GetPriorWindow (hwnd), false) + else + let sTemp = GetWindowText (hwnd, false) + endIf + let sList = sList+sTemp+" "+sWinType+LIST_ITEM_SEPARATOR + let sControlsList = sControlsList+IntToString (hwnd)+LIST_ITEM_SEPARATOR + let iIndex = iIndex+1 + let hwnd = GetNextWindow (hwnd) + endIf +EndWhile +;remove trailing delimiters +let sList =stringChopRight(sList,1) +let sControlsList =stringChopRight(sControlsList,1) +EndFunction + +Void Function DialogList () +var + handle hwnd, + handle hTemp, + string sList, + string sTemp, + string sControlsList, + int iIndex, + int iButton +If !(DialogActive ()) then + SayFormattedMessage (ot_error, cmsg34_L) ; "Not in a dialog box", + return +endIf +let hwnd = GetRealWindow (GetFocus ()) +let hwnd = GetFirstChild (hwnd) +If (IsMultiPageDialog ()) then + let hTemp = GetFirstChild (hwnd) + DialogListHelper (hTemp, sList, sControlsList, iIndex) + DialogListHelper (hwnd, sList, sControlsList, iIndex) +else + DialogListHelper (hwnd, sList, sControlsList, iIndex) +endIf +let sList = StringLeft (sList, StringLength (sList)-1) +let sControlsList = StringLeft (sControlsList, StringLength (sControlsList)-1) +let iButton = DlgSelectControls (sList, iIndex, cmsgListOfControls1_L, bt_LeftSingleClick|bt_MoveTo, bt_MoveTo) +If (iIndex == 0) then + return +endIf +let sTemp = StringSegment (sControlsList, LIST_ITEM_SEPARATOR, iIndex) +let hwnd = StringToHandle (sTemp) +If (iButton == iD_MoveTo) then + SetFocus (hwnd) + return +ElIf (iButton == iD_LeftSingleClick) then + SaveCursor () + SpeechOff () + + JAWSCursor () + MoveToWindow (hwnd) + Delay (1) + LeftMouseButton () + SpeechOn () + RestoreCursor () + return +endIf +EndFunction + +Void function DialogPageChangedEvent(HANDLE hwndNewPage,HANDLE hwndOldPage) +if GetObjectSubTypeCode () == wt_tabcontrol then + return +EndIf +SayWindowTypeAndText(hwndNewPage) +If BrailleInUse () then + RefreshBraille () +endIf +EndFunction +; For those keystrokes on Braille displays which perform the function NextDocumentWindow and PreviousDocumentWindow + +Script NextDocumentWindow () +If UserBufferIsActive () then + UserBufferDeActivate () +EndIf +TypeKey(cksControlTab) +; Since this causes double-speaking in most apps, +; recommend it be localized in those special cases mentioned. +; Handle the special case in which the user calls the NextDocumentWindow script when focus +; is positioned on the Tab Control. In this special case FocusChangedEvent is not called +; and as a result JAWS does not announce the page change. +;If IsPCCursor() Then +; Pause () +; Delay(1) +; If GetObjectTypeCode() == WT_TABCONTROL Then +; SayFocusedObject () +; EndIf +;EndIf +EndScript + +Script PreviousDocumentWindow () +If UserBufferIsActive () then + UserBufferDeActivate () +EndIf +TypeKey(cksControlShiftTab) +; Since this causes double-speaking in most apps, +; recommend it be localized in those special cases mentioned. +; Handle the special case in which the user calls the NextDocumentWindow script when focus +; is positioned on the Tab Control. In this special case FocusChangedEvent is not called +; and as a result JAWS does not announce the page change. +;If IsPCCursor() Then +; Pause () +; Delay(1) +; If GetObjectTypeCode() == WT_TABCONTROL Then +; SayFocusedObject () +; EndIf +;EndIf +EndScript + +Script NextDocumentWindowByPage () +TypeKey (cksControlPageDown) +EndScript + +Script PreviousDocumentWindowByPage () +TypeKey (cksControlPageUp) +EndScript + +; SelectAllItems and UnselectAllButCurrent +; For those braille displays which still use these scripts + +Script SelectAllItems () +TypeKey(cksControlSlash) +EndScript + +Script UnselectAllButCurrent () +TypeKey(cksControlBackslash) +EndScript + +; ***** +; Following scripts for +; JAWS and MAGIc + +Script MagSayNextLine () +TypeCurrentScriptKey () +EndScript + +Script MagSayPriorLine () +TypeCurrentScriptKey () +EndScript + +Script MagSayPriorCharacter () +TypeCurrentScriptKey () +EndScript + +Script MagSayNextCharacter () +TypeCurrentScriptKey () +EndScript + +Script MagSelectNextCharacter () +TypeCurrentScriptKey () +EndScript + +Script MagSelectPriorCharacter () +TypeCurrentScriptKey () +EndScript + +; MAG Selection scripts +Script MagSelectToEndOfLine () +TypeCurrentScriptKey () +EndScript + +Script MagSelectFromStartOfLine () +TypeCurrentScriptKey () +EndScript + +Script SayToPunctuation() +SayToPunctuation() +EndScript + +void function ScreenStabilizedEvent(handle hwndLastScreenWrite) +; override this event in Application specific script files to process information when the screen +;becomes stable after a series of writes. You can determine where the last write occured by +;checking the handle passed to this event. You can thus ignore triggers caused by writing to +;windows for which you are not interested. +endFunction + +void Function IndicateComputerBraille (handle hFocus) +var + int iType, + int iInput, int iG2Trans +;Because TypeKeysMode and SupportsTypeKeys doesn't work anymore. +if (! BrailleInUse ()) +;|| ! BrailleGetTypeKeysMode () ) + return +endIf +if ! ShouldItemSpeak (OT_TUTOR) +&& GetScriptAssignedTo (GetCurrentScriptKeyName ()) != "SayWindowPromptAndText" then +; Avoids Braille viewer speaking this message when tutor is off. + return +endIf +;the end game here is to make the output minimalist. +iG2Trans = getJCFOption (OPT_BRL_G2TRANSLATION) +if (! iG2Trans) + ;Alert user if they've switched to an app that won't support contracted input. + iG2Trans = getDefaultJCFOption (OPT_BRL_G2TRANSLATION) +endIf +if (! iG2Trans) + return +endIf +iInput = getJcfOption (OPT_BRL_CONTRACTED_INPUT) +if (! iInput) + ;Alert user if they've switched to an app that won't support contracted input. + iInput = getDefaultJCFOption (OPT_BRL_CONTRACTED_INPUT) +endIf +if (! iInput) + return +endIf +;Only process if the focused type is some sort of edit. +;doesn't make sense to say 'computer Braille' on a list or button. +iType = getObjectTypeCode ();generalize all edit types +if (iType == WT_EDIT && getObjectSubtypeCode () != WT_READONLYEDIT +; exclude read-only where window shows state but object doesn't: +&& GetWindowSubtypeCode (hFocus) != WT_READONLYEDIT +&& GetObjectSubtypeCode(SOURCE_CACHED_DATA) != WT_READONLYEDIT) + if (ShouldForceComputerBraille (hFocus)) + ;The say should use a type which does not flash, since showing the message in braille is conditional: + SayFormattedMessageWithVoice (vctx_message, OT_line, cmsgComputerBraille) + if !BrailleIsStructuredLine() + BrailleMessage (cmsgComputerBraille) + endIf + endIf +endIf +endFunction + +int function GetSubtypeCodeForTutorialHelp(handle hwndFocus) +var int subtypeCode = getWindowSubtypeCode(hwndFocus) +If (!subtypeCode || IsMSAAWindow(hwndFocus)) + subtypeCode = GetObjectSubTypeCode() +EndIf +return subtypeCode +endFunction + +void function tutorMessageEvent(handle hwndFocus, int nMenuMode) +var + int iTutorSpeak, + int iAccessKeySpeak, + int iObjType, + string sCustomTutor +Let iTutorSpeak = ShouldItemSpeak (OT_TUTOR) +Let iAccessKeySpeak = ShouldItemSpeak (OT_ACCESS_KEY) +if GetLastInputSource() == InputSource_Touch + If iTutorSpeak + var string sGestureMsg = GetGestureTutorMessage() + if sGestureMsg + Say(sGestureMsg,GetTutorialHelpOutputType()) + endIf + endIf + return +endIf +iObjType = GetSubtypeCodeForTutorialHelp(hwndFocus) +;Not done here, as the events may be out of sync. +;See ForegroundIconicEvent, WindowActivatedEvent, and HandleCustomWindows for usage: +;if ! isWindowVisible (hwndFocus) then + ;SayMessage (OT_TUTOR, cmsgAppLostFocusTutor) +;endIf +If nMenuMode > 0 +|| iObjType == WT_CONTEXTMENU +|| iObjType == WT_STARTMENU then + If nMenuMode != GlobalPrevTutorMenuMode then + If iTutorSpeak == TUTOR_ALL then + SayTutorialHelp(iObjType,false) + EndIf + Let GlobalPrevTutorMenuMode = GlobalMenuMode; Accurately monitor the state of the menu + EndIf + If iAccessKeySpeak == ACCESS_KEY_ALL || + iAccessKeySpeak == ACCESS_KEY_MENUS then + SayTutorialHelpHotKey(hwndFocus,false) + EndIf + Return +Else; Speak it, but not twice during the menus. + Let sCustomTutor = GetFrameTutorMessage () + If iTutorSpeak == TUTOR_CUSTOM_ONLY then + ;avoid potential for braille flashing empty messages: + If sCustomTutor + SayMessage (OT_TUTOR, sCustomTutor) + endIf + Else + SayTutorialHelp(iObjType,false) + EndIf +EndIf +If iAccessKeySpeak == ACCESS_KEY_ALL || +iAccessKeySpeak == ACCESS_KEY_DIALOGS then + SayTutorialHelpHotKey(hwndFocus,false) +EndIf +;alert user where contracted input doesn't work: +IndicateComputerBraille (hwndFocus) +Let GlobalPrevTutorMenuMode = GlobalMenuMode; Accurately monitor the state of the menu +endFunction + +Script SelectAVoiceProfile () +if TandemIsConnected() then + SayUsingVoice(vctx_message,cmsgSelectAVoiceProfileUnavailableDuringTandem,ot_error) + return +EndIf +if InFSVoiceSettingsDialogBox () then + SayFormattedMessage (ot_error, cmsgInFSVoiceSettingsDialogBox_L, cmsgInFSVoiceSettingsDialogBox_S) + return +endIf +if RemoteAccessIsConnected () then + SayFormattedMessage (ot_error, cmsgNoVoiceProfilesInRemoteJAWSSession_l, cmsgNoVoiceProfilesInRemoteJAWSSession_s) + return +endIf +DlgSelectAVoiceProfile() +EndScript + +script SelectALanguage() +var + string List, + string Language, + int choice, + int CurrentIndex +let List=GetSynthLanguages (LIST_ITEM_SEPARATOR) +If ! List then + SayFormattedMessage (OT_ERROR, cMsgNoLanguages) + Return +EndIf +let CurrentIndex = StringSegmentIndex (List, LIST_ITEM_SEPARATOR, GetActiveSynthLanguage()) +let choice = dlgSelectItemInList (List, cDlgSelectALanguageTitle, FALSE, CurrentIndex) +if choice <=0 then + return +endIf +let Language = stringSegment (List, LIST_ITEM_SEPARATOR, choice) +SetSynthLanguage (Language) +SetJcfOption (OPT_LANGUAGE_DETECTION, 0) +endScript + +Script Insert() +if GetJAWSMode() == jawsMode_MagUtil then + TypeCurrentScriptKey () +EndIf +EndScript + +Script MagicKey() +if (IsSameScript()) then + TypeCurrentScriptKey() + ;The key toggle is spoken either internally or by function ToggleKeyEvent +endif +EndScript + +Script JAWSKey() +if (IsSameScript()) then + TypeCurrentScriptKey() + ;The key toggle is spoken either internally or by function ToggleKeyEvent +endif +EndScript + +Script ScrollLockKey() +if (IsSameScript()) then + TypeCurrentScriptKey() + ;The key toggle is spoken either internally or by function ToggleKeyEvent +endif +EndScript + +void Function ToggleKeyEvent(int vkKey, string strName, int nState) +if GetLastInputSource() == InputSource_Braille +&& strName == "CapsLock" then +; Where inputting capslock key from the Braille keyboard: + return +endIf +; Certain keys have a toggle state as well as an up/down state. The three +; toggle keys are capsLock, scrollLock, and numLock. When the toggle state +; of any one of these keys changes, this event is called. +; vkKey has the following possible values as defined in hjConst.h. +; VK_CAPITAL 20 //capsLock +; VK_NUMLOCK 144 //numLock +; VK_SCROLL 145 //scrollLock +var + int RunningFSProducts, + String sKeyAlias +; NumLock toggle is spoken internally by both JAWS and MAGic, both when running separately or together. +; CapsLock toggle is spoken internally by JAWS when MAGic is not running, +; except when it is the JAWSKey. +; ScrollLock toggle is spoken internally by MAGic when JAWS is not running. +let RunningFSProducts = GetRunningFSProducts() +let sKeyAlias = FindKeyAliasMatch("MAGicKey") +if RunningFSProducts & product_MAGic +&& strName == sKeyAlias then + if nState == 1 then + Say(FormatString(cmsgMAGicKeyOn,StrName),ot_status) + else + Say(FormatString(cmsgMAGicKeyOff,StrName),ot_status) + endif +elif RunningFSProducts & product_JAWS then + if vkKey == VK_CAPITAL then + ; announce capslock toggle if it's the JAWSKey + ; In case of ZoomText or Fusion also announce it because JAWS doesn't announce modifiers + let sKeyAlias = FindKeyAliasMatch("JAWSKey") + if RunningFSProducts & product_ZoomText || strName == sKeyAlias then + if nState == 1 then + Say(mscCapsLockOn_L,ot_status) + else + Say(mscCapsLockOff_L,ot_status) + endIf + endIf + elif vkKey == VK_SCROLL then + ;the ScrollLock name is not passed in the strName param + let strName = FindKeyAliasMatch("ScrollLock") + if nState == 1 then + Say(cmsgScrollLockOn_L,ot_status) + else + Say(cmsgScrollLockOff_L,ot_status) + endIf + endIf +endIf +EndFunction + +Void Function BrailleSelectTextClearValues () +BrailleSelectTextClearValues () +EndFunction + +;Freedom Scientific NoteTaker Scripts + +Script FSLeftRockerDown () +FSLeftRockerDown () +EndScript + +Script FSLeftRockerUp () +FSLeftRockerUp () +EndScript + +Script FSRightRockerDown () +FSRightRockerDown () +EndScript + +Script FSRightRockerUp () +FSRightRockerUp () +EndScript + +Script WhizWheelsOnOff () +WhizWheelsOnOff () +EndScript + +Script NavRockersOnOff () +WhizWheelsOnOff () +EndScript + +Script PressLeftWhizWheel () +PressLeftWhizWheel () +EndScript + +Script LeftWhizWheelUp () +LeftWhizWheelUp () +EndScript + +Script LeftWhizWheelDown () +LeftWhizWheelDown () +EndScript + +Script PressRightWhizWheel () +PressRightWhizWheel () +EndScript + +Script RightWhizWheelUp () +RightWhizWheelUp () +EndScript + +Script RightWhizWheelDown () +RightWhizWheelDown () +EndScript + +Script RightFocusWhizWheelDown () +if BrailleCanPanLinesIndependently() then + performScript BrailleSplitPanRight() +else + RightFocusWhizWheelDown () +endIf +EndScript + +Script RightFocusWhizWheelUp () +if BrailleCanPanLinesIndependently() then + performScript BrailleSplitPanLeft() +else + RightFocusWhizWheelUp () +endIf +EndScript + +Script LeftFocusWhizWheelUp () +LeftFocusWhizWheelUp () +EndScript + +Script LeftFocusWhizWheelDown () +LeftFocusWhizWheelDown () +EndScript + +Script PressRightFocusWheel () +PressRightFocusWheel () +EndScript + +Script PressRightFocusNavButton () +PressRightFocusWheel () +EndScript + +Script PressLeftFocusWheel () +PressLeftFocusWheel () +EndScript + +Script PressLeftFocusNavButton () +PressLeftFocusWheel () +EndScript + +script LeftWheelSpeechMode () +LeftWheelSpeechModeToggle () +endScript + +script RightWheelSpeechMode () +RightWheelSpeechModeToggle () +endScript + +script FocusGDBHelpMessage () +;Provides general information about the use of these buttons +;Located between the advance bars of the Focus Braille displays +;From Freedom Scientific +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +SayFormattedMessage (OT_USER_BUFFER, cMsgFocusGDB) +AddHotKeyLinks () +EndScript + +int Function ShowFramesTextOnlyHelper(string sFrameName) +var + string sText +let sText = GetTextInFrame(sFrameName,TRUE) +if sText then + UserBufferAddText(sText) +EndIf +Return TRUE +EndFunction + +script ShowFramesTextOnly() +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +If UserBufferIsActive () then + SayFormattedMessage (OT_STATUS, cmsgVirtualViewer) + Return +EndIf +UserBufferClear () +FramesEnumerate ("ShowFramesTextOnlyHelper") +If UserBufferGetLength () <= 2 then + SayFormattedMessage (OT_ERROR, cMsgNoFrames); + Return +EndIf +UserBufferActivate () +JAWSTopOfFile () +SayAll () +EndScript + +void Function PCCursorFrameMoveHelper(string sFrameName) +var + int x, + int y +If UserBufferIsActive() then + UserBufferDeactivate() + Delay(10) +EndIf +SaveCursor() +InvisibleCursor() +if MoveToFrame (sFrameName) then + let x = GetCursorCol() + let y = GetCursorRow() +EndIf +RestoreCursor() +PCCursor() +if MoveTo(x,y) then +; Delay(2) +; if GetFrameNameAtCursor() == sFrameName then + SayUsingVoice(vctx_message,FormatString(cMsgPCToFrameSuccessful, sFrameName),ot_help) + return +; EndIf +EndIf +SayUsingVoice(vctx_message,FormatString(cMsgPCToFrameFailed, sFrameName),ot_help) +EndFunction + +void Function FrameMoveHelper(string sFrameName) +var + string sFrameSpeak +If UserBufferIsActive() then + UserBufferDeactivate() + Delay(2) +EndIf +JAWSCursor () +MoveToFrame (sFrameName) +if GetRunningFSProducts() & product_JAWS then + Let sFrameSpeak = (FormatString (cMsgJAWSToFrame, sFrameName)) + SayFormattedMessage (OT_SMART_HELP, sFrameSpeak) +else + PCCursor() +endIf +EndFunction + +int function FramesListHelper (string sFrameName, int iTopLeft, int iTopRight, int iBLeft, int iBRight) +Let gstrFrameList = gstrFrameList + LIST_ITEM_SEPARATOR + sFrameName +Return TRUE; +EndFunction + +int Function ShowFrameTextHelper (string sFrameName, int iTopLeft, int iTopRight, int iBLeft, int iBRight) +var + string sFuncTitle, + string sFuncText, ;for the embedded function + string sFrameText +let sFrameText = GetTextInFrame(sFrameName,TRUE) +if !gbWantAllFrames then + if !sFrameText then + return true + EndIf +EndIf +Let sFuncTitle = StringMixedCaseToMultiword(sFrameName) +Let sFuncText = FormatString (cFuncFrame, sFrameName) +UserBufferAddText(sFuncTitle,sFuncText,sFuncTitle, + cFont_Aerial,14,ATTRIB_UNDERLINE,RGBStringToColor(cColor_Blue),RGBStringToColor(cColor_White),TRUE) +UserBufferAddText (sFrameText+cScBufferNewLine, + cScNull,cScNull,cFont_Aerial, + 12,0,RGBStringToColor(cColor_Black),RGBStringToColor(cColor_White),TRUE) +Return TRUE; +EndFunction + +void function ShowFrameText() +If UserBufferIsActive () then + SayFormattedMessage (OT_STATUS, cmsgVirtualViewer) + Return +EndIf +UserBufferClear () +FramesEnumerate ("ShowFrameTextHelper") +If UserBufferGetLength () <= 2 then + SayFormattedMessage (OT_ERROR, cMsgNoFrames); + Return +EndIf +UserBufferActivate () +JAWSTopOfFile () +SayAll () +EndFunction + +Script ShowAllFrames() +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +let gbWantAllFrames = true +ShowFrameText() +let gbWantAllFrames = false +EndScript + +Script ShowFramesWithText() +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +let gbWantAllFrames = false +ShowFrameText() +EndScript + +Script SelectAFrame () +var + int index, + string sFrame +if QuickViewFramesUnsupported() then + return +EndIf +if IsVirtualPCCursor() then + VirtualSelectAFrame () + return +endIf +FramesEnumerate ("FramesListHelper") +If gstrFrameList == cscNull then + SayFormattedMessage (OT_ERROR, cMsgNoFrames) + Return +EndIf +Let gstrFrameList = StringChopLeft (gstrFrameList, 1) +Let Index = dlgSelectItemInList (gstrFrameList,cwn15,TRUE) +Delay (2) +If index == 0 then + Let gstrFrameList = cScNull + Return +EndIf +Let sFrame = StringSegment (gstrFrameList, LIST_ITEM_SEPARATOR, index) +FrameMoveHelper(sFrame) +Let gstrFrameList = cScNull +EndScript + +int function SpeakLostFocusWindow () +unScheduleFunction (giFN_SpeakInvisibleWindow) +if stringContains (cwnFocusLossExceptionsList, globalPrevRealName) +|| StringContains (cwnFocusLossExceptionsList, getWindowName (getRealWindow (globalFocusWindow))) then + return +endIf +Let giFN_SpeakLostFocusWindow = 0; +;If no window has focus, indicate: +if ! getFocus () || ! isWindowVisible (getFocus ()) then + ;Tutor message goes here, as the event does not go off, and we don't want to create timing problems with duplicate (forced) event calls, resulting in an unknown function call. + unScheduleFunction (giFN_SpeakInvisibleWindow) + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) + Return TRUE +endIf +endFunction + +void Function ForegroundIconicEvent (HANDLE hwndForeground) +;SayMessage (OT_ERROR, formatString (cmsgAppLostFocus, GlobalPrevRealName)) +if GetDefaultJCFOption (OPT_FOCUS_LOSS_ANNOUNCE) then + unScheduleFunction (giFN_SpeakInvisibleWindow) + Let giFN_SpeakInvisibleWindow = ScheduleFunction ("SpeakInvisibleWindow", gi_FOCUS_LOSS_TIMER) +endIf +EndFunction + +;*************************************************** +;Stubs for FSReader, +;in 64-bit Windows where the window gains focus and FSReader scripts have not yet loaded, +;but JAWS calls the events anyway: +void function FSReaderRateChangedEvent(int rate) +;Rate is a percentage of the normal rate (e.g. 100%, 80%, 150%). +;This event is called when the application sets the reducing of pauses. This occurs each time a document is opened. +; If the FSReader application is used to change this, focus will have gotten to the window and the config loaded in time. +;Just preventing startup config loading problems in 64-bit Windows. +EndFunction + +void function FSReaderUserChangedRateEvent(int rate) +;Rate is a percentage of the normal rate (e.g. 100%, 80%, 150%). +;This event is called when the user uses the key, toolbar, or menu commands to change the rate. +; when the user actually does this, the FSReader scripts will have been loaded by that time. +endFunction + +void function FSReaderReducedPausesEvent(int ReducingPauses) +;ReducingPauses indicates the state of the Reduce Pauses option. 1 = reducing pauses, 0 indicates no pause reduction. +;This event is called when the application changes the reduce pauses option. This occurs each time a document is opened. +;Just preventing startup config loading problems in 64-bit Windows. +EndFunction + +void function FSReaderUserReducedPausesEvent(int ReducingPauses) +;ReducingPauses indicates the state of the Reduce Pauses option. 1 = reducing pauses, 0 indicates no pause reduction. +;This event is called when the user uses the key, toolbar, or menu command to change the option. +; when the user actually does this, the FSReader scripts will have been loaded by that time. +EndFunction + +void function FSReaderAudioEvent(int state) +;State represents the current state of the audio. 0 = stopped, 1 = playing, 2 = paused. +;Just preventing startup config loading problems in 64-bit Windows. +EndFunction + +void function SayBatteryLevelInfo () +var + int iPercentage, + string sPercentage, + int iLevel, + string sLevel, + int iPowerAC, + string sPowerAC, + string sTimeRemaining, + string sMsg +let iLevel = GetBatteryChargeStatus() +if iLevel & 128 then + Say(cmsgBatteryStatus_ChargeNoSystemBattery,ot_error) + return +elif iLevel == 255 then + Say(cmsgBatteryStatus_ChargeUnknown,ot_error) + return +elif iLevel & 1 then + let sLevel = cmsgBatteryStatus_ChargeHigh +elif iLevel & 2 then + let sLevel = cmsgBatteryStatus_ChargeLow +elif iLevel & 4 then + let sLevel = cmsgBatteryStatus_ChargeCritical +EndIf +let iPercentage = GetSystemPowerStatus() +if iPercentage == BATTERY_STATUS_UNKNOWN then + Say(cmsgBatteryStatus_PercentageUnknown,ot_error) + return +else + let sPercentage = FormatString(cmsgBatteryStatus_Percentage,IntToString(iPercentage)) +EndIf +let iPowerAC = GetPowerACLineStatus() +if iPowerAC == 255 then + Say(cmsgBatteryStatus_PowerACUnknown,ot_error) + return +elif iPowerAC == 1 then + let sPowerAC = cmsgBatteryStatus_PowerACOnline + if iLevel & 8 then + let sPowerAC = sPowerAC+cscBufferNewLine+cmsgBatteryStatus_ChargeCharging + EndIf +EndIf +let sTimeRemaining = FormatString(cmsgBatteryStatus_TimeRemaining, + GetBatteryLifeTimeRemainingString()) +if sPowerAC then + let sMsg = sPowerAC+cscBufferNewLine + +sLevel+cscBufferNewLine + +sPercentage +else + let sMsg = sLevel+cscBufferNewLine + +sPercentage+cscBufferNewLine + +sTimeRemaining +EndIf +SayMessage(ot_user_requested_information,sMsg) +endFunction + +Script SayBatteryLevel () +beginFlashMessage () +SayBatteryLevelInfo () +sayConnectionStatusInfo () +endFlashMessage () +EndScript + +void function HelpBalloonEvent(handle hwnd, string sText) +; Windows XP Help Balloons +;For repeat speaking of tips, and storage foh clicking: +Let ghwndToolTip = hWnd +Let gStrLastTipFromEvent = sText +Say(sText,ot_help_balloon) +endFunction + +Script FocusToFirstField () +FocusToFirstField () +EndScript + +Script FocusToNextField () +FocusToNextField () +EndScript + +Script FocusToPriorField () +FocusToPriorField () +EndScript + +Script FocusToLastField () +FocusToLastField () +EndScript + +Script SelectAFormField() +PerformScript SelectAFormField() +EndScript + +Script SelectALink () +SelectALinkDialog() +EndScript + +Script MoveToMainRegion () +PerformScript MoveToMainRegion() +EndScript + +Script MoveToNextRegion () +PerformScript MoveToNextRegion() +EndScript + +Script MoveToPriorRegion () +PerformScript MoveToPriorRegion() +EndScript + +Script MoveToNextHeading() +MoveToNextHeading() +EndScript + +Script MoveToPriorHeading() +MoveToPriorHeading() +EndScript + +Script MoveToFirstHeading() +MoveToFirstHeading() +EndScript + +Script MoveToLastHeading() +MoveToLastHeading() +EndScript + +Script MoveToNextHeadingLevelN(optional int iLevel) +MoveToNextHeadingLevelN(iLevel) +EndScript + +Script MoveToPriorHeadingLevelN(optional int iLevel) +MoveToPriorHeadingLevelN(iLevel) +EndScript + +Script MoveToNextHeadingLevelOne () +PerformScript MoveToNextHeadingLevelN(1) +endScript + +Script MoveToPriorHeadingLevelOne () +PerformScript MoveToPriorHeadingLevelN(1) +endScript + +Script MoveToNextHeadingLevelTwo () +PerformScript MoveToNextHeadingLevelN(2) +endScript + +Script MoveToPriorHeadingLevelTwo () +PerformScript MoveToPriorHeadingLevelN(2) +endScript + +Script MoveToNextHeadingLevelThree () +PerformScript MoveToNextHeadingLevelN(3) +endScript + +Script MoveToPriorHeadingLevelThree () +PerformScript MoveToPriorHeadingLevelN(3) +endScript + +Script MoveToNextHeadingLevelFour () +PerformScript MoveToNextHeadingLevelN(4) +endScript + +Script MoveToPriorHeadingLevelFour () +PerformScript MoveToPriorHeadingLevelN(4) +endScript + +Script MoveToNextHeadingLevelFive () +PerformScript MoveToNextHeadingLevelN(5) +endScript + +Script MoveToPriorHeadingLevelFive () +PerformScript MoveToPriorHeadingLevelN(5) +endScript + +Script MoveToNextHeadingLevelSix () +PerformScript MoveToNextHeadingLevelN(6) +endScript + +Script MoveToPriorHeadingLevelSix () +PerformScript MoveToPriorHeadingLevelN(6) +endScript + +Script MoveToFirstHeadingLevelN() +MoveToFirstHeadingLevelN(stringToInt(StringRight(getCurrentScriptKeyName(),1))) +EndScript + +Script moveToLastHeadingLevelN() +moveToLastHeadingLevelN(stringToInt(StringRight(getCurrentScriptKeyName(),1))) +EndScript + +Script SelectAHeading() +SelectAHeadingDialog() +EndScript + +script MoveToNextFrame() +MoveToNextFrame() +EndScript + +script MoveToPriorFrame() +MoveToPriorFrame() +EndScript + +script MoveToFirstFrame() +MoveToFirstFrame() +EndScript +script MoveToLastFrame() +MoveToLastFrame() +EndScript + +script MoveToFrameByNumber() +;When this was originally implemented, +;the frame number was obtained by parsing the key assignment +;rather than using a parameter passed to the script. +;Those key assignments have been commented out for several versions of JAWS, +;but this script continues to use the key assignment parsing +;for backwards compatibilty in case someone still uses the old key assignments. +MoveToFrameByNumber(stringToInt(StringRight(getCurrentScriptKeyName(),1))) +EndScript + +script SelectAnArticle() +PerformScript SelectAnArticle() +endScript + +script SelectAButtonFormField() +performScript SelectAButtonFormField() +endScript + +Script SelectAComboFormField() +PerformScript SelectAComboFormField() +endScript + +Script SelectAnEditFormField() +PerformScript SelectAnEditFormField() +endScript + +Script SelectARadioButtonFormField() +PerformScript SelectARadioButtonFormField() +endScript + +script SelectACheckboxFormField() +performScript SelectACheckboxFormField() +endScript + +script SelectATabFormField() +PerformScript SelectATabFormField() +endScript + +Script SelectATable() +PerformScript SelectATable() +endScript + +script SelectAGraphic() +performScript SelectAGraphic() +endScript + +script SelectAListItem() +performScript SelectAListItem() +endScript + +script SelectAList() +performScript SelectAList() +endScript + +script SelectAParagraph() +performScript SelectAParagraph() +endScript + +script SelectAnObject() +performScript SelectAnObject() +endScript + +script SelectABlockQuote() +performScript SelectABlockQuote() +endScript + +script SelectADivision() +performScript SelectADivision() +endScript + +script SelectASpan() +performScript SelectASpan() +endScript + +script SelectAnOnMouseOverElement() +performScript SelectAnOnMouseOverElement() +endScript + +Script SelectaRegion () +performScript SelectaRegion () +endScript + +Script SelectAMailToLink() +performScript SelectAMailToLink() +endScript + +Script SelectaDropTarget() +performScript SelectaDropTarget() +endScript + +string function GetAdditionalSysTrayIconNames () +Var + Int TrayIconsCount, + Int i, + Handle hTop = FindTopLevelWindow (cwc_ShellNotify, Null ()), + Handle hTool = FindWindow (hTop, Windows11SysTrayIconsClass), + Object window = FSUIAGetElementFromHandle (hTool), + object trayIcons, object trayIcon, + String Name, string names +if ! hTool || ! window return cscNull endIf +var object condition = FSUIACreateStringPropertyCondition(UIA_AutomationIdPropertyId, + UIA_AutomationID_Windows_11_Tray_Icon) +if ! condition return cscNull endIf +trayIcons = window.FindAll(TreeScope_Subtree, condition) +if ! TrayIcons || ! TrayIcons.count return cscNull endIf +TrayIconsCount = TrayIcons.count +For i = 0 To TrayIconsCount-1 + trayIcon = trayIcons(i) + Name = trayIcon.name + if ! stringIsBlank (name) then + names = names+cscBufferNewLine+name +endIf +EndFor +; pad the beginning so it can be added to the list of names we get already the old way. +if ! stringIsBlank (names) then names = cscBufferNewLine+names endIf +return names +endFunction + +Script ViewSysTrayItems () +; BY: Stephen Dawes +Var + int iMax, + int index, + string strTemp, + String strMessage +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +Let iMax = 0 +Let index = 0 +Let strTemp = "" +Let strMessage = "" +; Initialize the necessary variables +; Get the number of items on the system tray. +Let iMax = SysTrayGetItemCount () +;Must give user error message if no items found in system tray +If ( 0 == iMax ) then + SayFormattedMessage (OT_ERROR, cMsgNoSysTrayItems) + return +EndIf +;; +; Index must start as 1, as 0 would return no item. +Let index = 1 +; The SysTrayGetItemToolTip function returns the bubble help that would be displayed if the user +; were to hover over the icon with the mouse. +While (index <= iMax) + if ( 0 != StringLength (strTemp) ) then + Let strTemp = strTemp + cScBufferNewLine ;; Adding NewLine so each item is on separate line. + endIf + Let strTemp = strTemp + SysTrayGetItemToolTip (index) + Let index = index + 1 +EndWhile +; now grab the new ones from Windows 11. +; The old ones are still there, or at least some, but many have moved to a new location: +strTemp = strTemp + GetAdditionalSysTrayIconNames () ; will pad if they're there. +;Now put items in string for Virtual Viewer +Let strMessage = FormatString (cmsgSysTrayItems,strTemp) +;Standard Virtual Viewer posting: +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +SayMessage (OT_USER_BUFFER, strMessage) +EndScript + +Script MuteSynthesizer () +; When toggling the Speech mode via the script, we want this setting to remain +; in effect until either the user invokes it again or restarts JAWS. +; Otherwise, random Default.jcf writes will undo our temporary changes. +; To accomplish this, we'll set the speech mode as a transient session setting. +var + string message, + int suppressAnnouncement = GetMostRecentFunctionNameFromCallStack() == "speechon", + int onDemand = (getJCFOption (OPT_LESS_SPEECH) == 0) +if IsSpeechOff() + JAWSProcessorSpeechOn() + setDefaultJCFOption (OPT_SPEECH_MODE, 0) + WriteSettingInteger (Section_Options, "SpeechMode", 0, FT_DEFAULT_JCF, wdSession) + if !suppressAnnouncement + SayMessage(ot_status,cmsgFullSpeech) + endIf +else + ;only if invoked through this script, + ;tell the user if speech is being turned off or on demand: + if onDemand then + message = cmsgSpeechOnDemand + else + message = cmsgSpeechMute + endIf + setDefaultJCFOption (OPT_SPEECH_MODE, 1) + WriteSettingInteger (Section_Options, "SpeechMode", 1, FT_DEFAULT_JCF, wdSession) + if !suppressAnnouncement + SayMessage(ot_status,message) + endIf + Delay(5) + JAWSProcessorSpeechOff() +EndIf +EndScript + +script SpeechOnDemandToggle() +if getJCFOption (OPT_SPEECH_MODE) == 0 then ; full speech is active + sayMessage (OT_ERROR, cmsgSpeechOnDemandKeystrokeUnavailable) + return +endIf +var + string msg, + int onDemand = (getJCFOption (OPT_LESS_SPEECH) == 0) +if onDemand + msg = cmsgSpeechOnDemandOff + setDefaultJCFOption (OPT_LESS_SPEECH, 1) +else + msg = cmsgSpeechOnDemandOn + setDefaultJCFOption (OPT_LESS_SPEECH, 0) +endIf +;temporarily turn on synthesizer and speak the message: +JAWSProcessorSpeechOn() +SayMessage(ot_status,msg) +JAWSProcessorSpeechOff() +EndScript + +script ReadCurrentRow() +if TableErrorEncountered(TABLE_NAV_SAY_ROW) then + return +endIf +Say(GetRowText(cscNull,cscNull,cmsgBlank1), ot_line) +endScript + +script ReadFromCurrentCell() +var + int nCurCol, + int nCurRow +if TableErrorEncountered(TABLE_NAV_SAY_ROW_PARTIAL) then + return +endIf +GetCellCoordinates(nCurCol,nCurRow) +Say(GetRowText(cscNull,cscNull,cmsgBlank1,nCurCol,0),ot_line) +endScript + +script ReadToCurrentCell() +var + int nCurCol, + int nCurRow +if TableErrorEncountered(TABLE_NAV_SAY_ROW_PARTIAL) then + return +endIf +GetCellCoordinates(nCurCol,nCurRow) +Say(GetRowText(cscNull,cscNull,cmsgBlank1,0,nCurCol),ot_line) +endScript + +script ReadCurrentColumn() +if TableErrorEncountered(TABLE_NAV_SAY_COLUMN) then + return +endIf +Say(GetColumnText(cscNull, cscNull, cmsgBlank1), ot_line) +endScript + +script ReadToBottomOfColumn() +var + int nCurCol, + int nCurRow +if TableErrorEncountered(TABLE_NAV_SAY_COLUMN_PARTIAL) then + return +endIf +GetCellCoordinates(nCurCol,nCurRow) +Say(GetColumnText(cscNull,cscNull,cmsgBlank1,nCurRow,0),ot_line) +endScript + +script ReadFromTopOfColumn() +var + int nCurCol, + int nCurRow +if TableErrorEncountered(TABLE_NAV_SAY_COLUMN_PARTIAL) then + return +endIf +GetCellCoordinates(nCurCol,nCurRow) +Say(GetColumnText(cscNull,cscNull,cmsgBlank1,0,nCurRow),ot_line) +endScript + +script SelectHTMLElement() +var + string sMsgLong, + string sMsgShort, + string sElementDescription +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if not IsVirtualPCCursor() then + SayFormattedMessage(ot_error, cmsgFeatureRequiresVirtualCursor_L, cmsgFeatureRequiresVirtualCursor_S) + return +endIf +let sElementDescription=GetElementDescription() +Let sElementDescription = (StringLower (sElementDescription)) +If (sElementDescription == TAG_TABLE || +sElementDescription == TAG_LIST_ORDERED || +sElementDescription == TAG_LIST_DEFINITION) then + ;let sMsgLong=FormatString(cmsgSelectHTMLElement_L, GetLine ()) + ;let sMsgShort=FormatString(cmsgSelectHTMLElement_S, GetLine ()) + ;SayFormattedMessage(OT_SELECT, sMsgLong, sMsgShort) + SelectHierarchicalElement() + Return +EndIf +;let sMsgLong=FormatString(cmsgSelectHTMLElement_L,cScNull) +;let sMsgShort=FormatString(cmsgSelectHTMLElement_S,cScNull) +;SayFormattedMessage(OT_SELECT, sMsgLong, sMsgShort) +SelectHierarchicalElement() +;SayFormattedMessage (OT_SELECTED_ITEM, GetSelectedText ()) +EndScript + +script StepToEndOfElement () +If !(GetRunningFSProducts() & product_JAWS | product_MAGic) then + return +endIf +if not IsVirtualPCCursor() then + SayFormattedMessage(ot_error, cmsgFeatureRequiresVirtualCursor_L, cmsgFeatureRequiresVirtualCursor_S) + return +endIf +; for web applications who "borrow" quick navigation keys +if ProcessKeystrokeAsReserved (GetCurrentScriptKeyName ()) then return endIf +;Enter TRUE for first parameter +; default second parameter is 0 which means use internal logic to determine number of levels +StepOutOfCurrentElement (TRUE) +If SayAllInProgress () then + Return +EndIf +SayLine () +EndScript + +Script StepToStartOfElement () +If !(GetRunningFSProducts() & product_JAWS | product_MAGic) then + return +endIf +if not IsVirtualPCCursor() then + SayFormattedMessage(ot_error, cmsgFeatureRequiresVirtualCursor_L, cmsgFeatureRequiresVirtualCursor_S) + return +endIf +; for web applications who "borrow" quick navigation keys +if ProcessKeystrokeAsReserved (GetCurrentScriptKeyName ()) then return endIf +;Enter FALSE for first parameter to go backward +; default second parameter is 0 which means use internal logic to determine number of levels +StepOutOfCurrentElement (FALSE) +If SayAllInProgress () then + Return +EndIf +SayLine () +EndScript + +script MoveToFirstSameElement () +MoveToFirstSameElement () +EndScript + +script MoveToNextSameElement () +MoveToNextSameElement () +EndScript + +Script MoveToPriorSameElement () +MoveToPriorSameElement () +EndScript + +Script MoveToLastSameElement () +MoveToLastSameElement () + EndScript + +Script MoveToNextDifferentElement () +MoveToNextDifferentElement () +EndScript + +Script MoveToPriorDifferentElement () +MoveToPriorDifferentElement () +EndScript + +script MoveToFirstButton() +MoveToFirstButton() +EndScript + +script MoveToLastButton() +MoveToLastButton() +EndScript + +script MoveToNextButton() +MoveToNextButton() +EndScript + +script MoveToPriorButton() +MoveToPriorButton() +EndScript + +script MoveToNextCheckbox() +MoveToNextCheckbox() +EndScript + +script MoveToPriorCheckbox() +MoveToPriorCheckbox() +EndScript + +script MoveToNextRadioButton() +MoveToNextRadioButton() +EndScript + +script MoveToPriorRadioButton() +MoveToPriorRadioButton() +EndScript + +script MoveToNextEdit() +MoveToNextEdit() +EndScript + +script MoveToPriorEdit() +MoveToPriorEdit() +EndScript + +script MoveToNextMailToLink() +MoveToNextMailToLink() +EndScript + +script MoveToPriorMailToLink() +MoveToPriorMailToLink() +EndScript + +script MoveToNextObject() +MoveToNextObject() +EndScript + +script MoveToPriorObject() +MoveToPriorObject() +EndScript + +script MoveToFirstObject() +MoveToFirstObject() +EndScript + +script MoveToLastObject() +MoveToLastObject() +EndScript + +script MoveToNextBlockQuote() +MoveToNextBlockQuote() +EndScript + +script MoveToPriorBlockQuote() +MoveToPriorBlockQuote() +EndScript + +script MoveToFirstBlockquote() +MoveToFirstBlockquote() +EndScript + +script MoveToLastBlockquote() +MoveToLastBlockquote() +EndScript + +script MoveToNextGraphic() +MoveToNextGraphic() +EndScript + +script MoveToPriorGraphic() +MoveToPriorGraphic() +EndScript + +script MoveToFirstGraphic() +MoveToFirstGraphic() +EndScript + +script MoveToLastGraphic() +MoveToLastGraphic() +EndScript + +script MoveToNextForm () +MoveToNextForm () +EndScript + +script MoveToPriorForm () +MoveToPriorForm () +EndScript + +script MoveToFirstForm () +MoveToFirstForm () +EndScript + +script MoveToLastForm () +MoveToLastForm () +EndScript + +script MoveToNextCombo() +MoveToNextCombo() +EndScript + +script MoveToPriorCombo() +MoveToPriorCombo() +EndScript + +script MoveToNextAnchor() +MoveToNextAnchor() +EndScript + +script MoveToPriorAnchor() +MoveToPriorAnchor() +EndScript + +script MoveToNextListItem() +MoveToNextListItem() +EndScript + +script MoveToPriorListItem() +MoveToPriorListItem() +EndScript + +script MoveToNextSeparator() +MoveToNextSeparator() +EndScript + +script MoveToPriorSeparator() +MoveToPriorSeparator() +EndScript + +script MoveToNextSlider() +MoveToNextSlider() +EndScript + +script MoveToPriorSlider() +MoveToPriorSlider() +EndScript + +script MoveToNextDivision() +MoveToNextDivision() +EndScript + +script MoveToPriorDivision() +MoveToPriorDivision() +EndScript + +script MoveToNextSpan() +MoveToNextSpan() +EndScript + +script MoveToPriorSpan() +MoveToPriorSpan() +EndScript + +script MoveToNextOnClickElement() +MoveToNextOnClickElement() +EndScript + +script MoveToPriorOnClickElement() +MoveToPriorOnClickElement() +EndScript + +script MoveToNextOnMouseOverElement() +MoveToNextOnMouseOverElement() +EndScript + +script MoveToPriorOnMouseOverElement() +MoveToPriorOnMouseOverElement() +EndScript + +script MoveToFirstTab() +MoveToFirstTab() +EndScript + +script MoveToLastTab() +MoveToLastTab() +EndScript + +script MoveToNextTab() +MoveToNextTab() +EndScript + +script MoveToPriorTab() +MoveToPriorTab() +EndScript + +script MoveToFirstArticle() +MoveToArticle(s_top) +EndScript + +script MoveToLastArticle() +MoveToArticle(s_bottom) +EndScript + +script MoveToNextArticle() +MoveToArticle(s_next) +EndScript + +script MoveToPriorArticle() +MoveToArticle(s_prior) +EndScript + +Script BrailleToggleTableHeaders (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleToggleTableHeaders () +EndScript + +Script BrailleToggleTableReading (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleToggleTableReading () +EndScript + +Script DisplayBasicElementInfo () +PerformScript DisplayBasicElementInfo () +EndScript + +Script DisplayAdvancedElementInfo () +PerformScript DisplayAdvancedElementInfo () +EndScript + +Script IEFind () +PerformScript IEFind () +EndScript + +int function PointNeedsMarking(int x, int y) +;This function is only called if the OPT_BRL_CHECK_EXT_MARKING jcf option is on. +;This must then return true if the character at the supplied point needs +;marking on the display +return PointNeedsMarking (x, y) +endFunction + +void function PageRefreshPrewarning(int nSeconds, string sURL) +var +string sSeconds +let sSeconds=intToString(nSeconds) + +SayFormattedMessage(OT_SMART_HELP, formatString(cmsgPageRefreshPrewarning_L,sSeconds), formatString(cmsgPageRefreshPrewarning_S,sSeconds)) +endFunction + +void function QuickKeyNavigationModeChanged(int bEnabled) +if SayAllInProgress() +|| UserBufferIsActive () then + return; +endIf +;if bEnabled then +; SayFormattedMessage(OT_JAWS_MESSAGE, cmsgNavigationModeOn_L, cmsgNavigationModeOn_S) +;else +; SayFormattedMessage(OT_JAWS_MESSAGE, cmsgNavigationModeOff_L, cmsgNavigationModeOff_S) +;endIf +endFunction + +Script NavigationModeToggle () +PerformScript NavigationModeToggle () +EndScript + +string function GetTextInWindow(handle hWnd) +var + int tlx, + int tly, + int brx, + int bry +let tlx=GetWindowLeft(hwnd) +let tly=getWindowTop(hwnd) +let brx=GetWindowRight(hwnd) +let bry=getWindowBottom(hwnd) +return GetTextInRect(tlx,tly,brx,bry,0,IgnoreColor,IgnoreColor,1) +EndFunction + +script VirtualizeCurrentControl() +var + string sText +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsVirtualPCCursor() then + SayMessage(OT_ERROR,cmsgAlreadyVirtualized_L,cmsgAlreadyVirtualized_S) + return +elif IsFormsModeActive() then + SayMessage(OT_ERROR,cmsgVirtualizeUnavailableInFormsMode_L,cmsgVirtualizeUnavailableInFormsMode_S) + return +endIf +let sText = GetTextInWindow(GetCurrentWindow()) +if !sText then + let sText=GetTypeAndTextStringsForWindow(getFocus()) +endIf +if !sText then + SayMessage(OT_ERROR,cmsgNoTextToVirtualize_L,cmsgNoTextToVirtualize_S) + return +endIf +SayMessage(ot_JAWS_Message,cmsgVirtualizeControl_L,cmsgVirtualizeControl_S) +UserBufferClear() +UserBufferAddText(sText) +UserBufferActivate() +SayLine() +endScript + +script SendControlTextToClipboard () +var + string sText +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsFormsModeActive() then + SayMessage(OT_ERROR,cmsgVirtualizeUnavailableInFormsMode_L,cmsgVirtualizeUnavailableInFormsMode_S) + return +endIf +let sText = GetTextInWindow(GetCurrentWindow()) +if !sText then + let sText=GetTypeAndTextStringsForWindow(getFocus()) +endIf +if !sText then + SayMessage(OT_ERROR,cmsgNoTextToVirtualize_L,cmsgNoTextToVirtualize_S) + return +endIf +CopyToClipboard (sText) +SayMessage(ot_JAWS_Message,cmsgCopyControl_L,cmsgCopyControl_S) +endScript + +script VirtualizeWindow() +var + string sText +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsVirtualPCCursor() then + SayMessage(OT_ERROR,cmsgAlreadyVirtualized_L,cmsgAlreadyVirtualized_S) + return +elif IsFormsModeActive() then + SayMessage(OT_ERROR,cmsgVirtualizeUnavailableInFormsMode_L,cmsgVirtualizeUnavailableInFormsMode_S) + return +endIf +let sText = GetTextInWindow(GetRealWindow(GetCurrentWindow())) +if !sText then + let sText=GetTypeAndTextStringsForWindow(getFocus()) +endIf +if !sText then + SayMessage(OT_ERROR,cmsgNoTextToVirtualize_L,cmsgNoTextToVirtualize_S) + return +endIf +SayMessage(ot_JAWS_Message,cmsgVirtualizeWindow_L,cmsgVirtualizeWindow_S) +UserBufferClear() +UserBufferAddText(sText) +UserBufferActivate() +SayLine() +endScript + +script SendWindowTextToClipboard () +var + string sText +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsFormsModeActive() then + SayMessage(OT_ERROR,cmsgVirtualizeUnavailableInFormsMode_L,cmsgVirtualizeUnavailableInFormsMode_S) + return +endIf +let sText = GetTextInWindow(GetRealWindow(GetCurrentWindow())) +if !sText then + let sText=GetTypeAndTextStringsForWindow(getFocus()) +endIf +if !sText then + SayMessage(OT_ERROR,cmsgNoTextToVirtualize_L,cmsgNoTextToVirtualize_S) + return +endIf +CopyToClipboard (sText) +SayMessage(ot_JAWS_Message,cmsgCopyWindow_L,cmsgCopyWindow_S) +endScript + +Script SetPunctuationLevel () +SayFormattedMessage (OT_STATUS, PunctuationToggle (false)) +EndScript + +Script BrailleSelectBlock (int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +SelectFromBrailleToPCCursor () +EndScript + +script JumpReturnFromTableCell() +JumpReturnFromTableCell() +EndScript + +script JumpToTableCell() +JumpToTableCell() +endScript + +script JumpReturnFromLine() +JumpReturnFromLine() +EndScript + +script JumpToLine() +JumpToLine() +EndScript + +Script JumpTo () +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +If InTable () then + JumpToTableCell() +Else + JumpToLine () +EndIf +EndScript + +void function NavigationWrappedEvent(int bForward) +if bForward then + SayFormattedMessage(OT_STATUS,cmsgWrappingToTop_L,cmsgWrappingToTop_S) + beep() +else + sayFormattedMessage(OT_STATUS,cmsgWrappingToBottom_L,cmsgWrappingToBottom_S) + beep() +endIf +EndFunction + +void function SayCharacterValue() +var + int nFlags + ;nFlags: see cvf constants +let nFlags=cvfWantMarkup; use markup +if GetJCFOption(OPT_USE_HEX_FOR_SAY_CHARACTER_VALUE) then + let nFlags=nFlags|cvfWantHex +endIf +If getJCFOption( OPT_CONVERT_UNICODE_CHAR_TO_MULTIBYTE_SEQ)==FALSE then + let nFlags=nFlags|cvfWantValueOfWideChar +endIf +SayMessageWithMarkup (OT_USER_REQUESTED_INFORMATION,GetCharacterValueString(getCharacter(),nFlags),cscNull) +/* +var + string hex +if IsUnicodeJAWS() then +SayFormattedMessage(ot_user_requested_information, FormatString(cmsgCharacterValue_L,GetSpellString( DecToHex(GetCharacterValue(GetCharacter())))), + formatString(cmsgCharacterValue_S,GetSpellString( DecToHex(GetCharacterValue(GetCharacter()))))) + +else +SayFormattedMessage(ot_user_requested_information, FormatString(cmsgCharacterValue_L,IntToString(GetCharacterValue(GetCharacter()))), + formatString(cmsgCharacterValue_S,IntToString(GetCharacterValue(GetCharacter())))) +endIf +*/ +endFunction + +Script SelectAPlaceMarker() +If !(GetRunningFSProducts() & product_JAWS) then + return +endIf +EnsureNoUserBufferActive(false) +if (IsVirtualPCCursor()) then + DlgListOfPlaceMarkers(0) +endif +EndScript + +script SelectAScheme() +var + string sFileList, + string sSchemeFile, + int iSchemeFileCount, + string sNameList, + string sSchemeName, + int iIndex, + string sMessageLong, + string sMessageShort, + int nCurrentIndex, + string jcfFileName, + string jcfSchemeName +let sFileList=FileNameList(cSchemeMask,LIST_ITEM_SEPARATOR) +let iSchemeFileCount = StringSegmentcount(sFileList,LIST_ITEM_SEPARATOR) +for iIndex = 1 to iSchemeFileCount + let sSchemeFile = stringSegment(sFileList,LIST_ITEM_SEPARATOR,iIndex) + let sSchemeName = IniReadString(SMF_Section_Information,smf_hKey_Title,sSchemeFile,sSchemeFile+".smf") + if iIndex < iSchemeFileCount then + let sNameList = sNameList+sSchemeName+LIST_ITEM_SEPARATOR + else + let sNameList = sNameList+sSchemeName + EndIf +EndFor +if smmTrainingModeActive() then + let sNameList = cmsgToggleSMMTrainingModeOff_L+LIST_ITEM_SEPARATOR+sNameList +else + let sNameList=cmsgToggleSMMTrainingModeOn_L+LIST_ITEM_SEPARATOR+sNameList +endIf +let nCurrentIndex=StringSegmentIndex(sFileList,LIST_ITEM_SEPARATOR,GetCurrentSchemeName(),TRUE) +let iIndex=dlgSelectItemInList(sNameList,cDlgSelectASchemeTitle,FALSE,nCurrentIndex+1) +if iIndex <=0 then + return +endIf +if iIndex==1 then + toggleSMMTrainingMode() + return +endIf +let sSchemeFile = stringSegment(sFileList,LIST_ITEM_SEPARATOR,iIndex-1) +let sSchemeName = stringSegment(sNameList,LIST_ITEM_SEPARATOR,iIndex) +let jcfFileName = StringChopRight(GetScriptFilename(true),3)+jcfFileExt +let jcfSchemeName = IniReadString(section_options,hKeySchemeName,jcfSchemeName,jcfFilename) +if SwitchToScheme(sSchemeFile) then + let sMessageLong=FormatString(cmsgSwitchToScheme_L,sSchemeName) + let sMessageShort=FormatString(cmsgSwitchToScheme_S,sSchemeName) + SayFormattedMessage(OT_STATUS,sMessageLong,sMessageShort) + If StringCompare(sSchemeFile,jcfSchemeName) != 0 then + IniWriteString(section_options,hKeySchemeName,sSchemeFile,jcfFilename) + EndIf +Else + let sMessageLong=FormatString(cmsgSwitchToSchemeError_L,sSchemeName) + let sMessageShort=FormatString(cmsgSwitchToSchemeError_S,sSchemeName) + SayFormattedMessage(OT_ERROR,sMessageLong,sMessageShort) +endIf +EndScript + +script VirtualHTMLFeatures () +var + int Index, + string sDlgListItems +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let sDlgListItems = cStrVirtHTMLDlgLst1 + cStrVirtHTMLDlgLst2+cStrVirtHTMLDlgLst3 +Let index = dlgSelectItemInList (sDlgListItems , cStrVirtHTMLDlgName, TRUE) +Delay (2) +Let GlobalWasHjDialog = FALSE +If index == 0 then + Return +EndIf +Let GlobalWasHjDialog = FALSE +If Index == 1 then + PerformScript SelectAPlaceMarker() + Return +ElIf Index == 2 then + PerformScript SelectAFormField () + Return +ElIf index == 3 Then + PerformScript SelectAHeading () + return +ElIf index == 4 Then + PerformScript SelectALink () + return +ElIf index == 5 Then + PerformScript SelectAButtonFormField () + return +ElIf index == 6 Then + PerformScript SelectAnEditFormField () + return +ElIf index == 7 Then + PerformScript SelectAList () + return +ElIf index == 8 Then + PerformScript SelectACheckboxFormField () + return +ElIf index == 9 Then + PerformScript SelectATable () + return +ElIf index == 10 Then + PerformScript SelectARadioButtonFormField () + return +ElIf index == 11 Then + PerformScript SelectABlockQuote () + return +ElIf index == 12 Then + PerformScript SelectAListItem () + return +ElIf index == 13 Then + PerformScript SelectADivision () + return +ElIf index == 14 Then + PerformScript SelectAComboFormField () + return +ElIf index == 15 Then + PerformScript SelectAFrame () + return +ElIf index == 16 Then + PerformScript SelectAParagraph () + return +ElIf index == 17 Then + PerformScript SelectAnAnchor () + return +ElIf index == 18 Then + PerformScript SelectAGraphic () + return +ElIf index == 19 Then + PerformScript SelectAnArticle () + return +ElIf index == 20 Then + PerformScript SelectARegion() + return +ElIf index == 21 Then + PerformScript SelectATabFormfield() + return +ElIf index == 22 Then + PerformScript SelectAGlanceHighlight() + return +EndIf +EndScript + + +;Next two contributions by JC +;For skipping long strings of numbers and punctuation. +Script NumericDataSayNextAsSingleUnit () +var + string strCurrentWord, + int nCount +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let nCount = 0 +let strCurrentWord = GetWord () +While ((GetWord () == strCurrentWord) && nCount < 10) + NextWord () + let nCount = nCount + 1 +EndWhile +SayWord () +EndScript + +Script NumericDataSayPriorAsSingleUnit () +var + string strCurrentWord, + int nCount +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let nCount = 0 +let strCurrentWord = GetWord () +While ((GetWord () == strCurrentWord) && nCount < 10) + PriorWord () +let nCount = nCount +1 +EndWhile +SayWord () +EndScript + +; This is just an example of how the InternalFrameChangedEvent +; is used to speak the frame name before the FocusChangedEvent +; is called to speak the FocusObject +void Function InternalFrameChangedEvent (handle hwnd, handle idFrame, string strFrameName) +SayString(strFrameName) +EndFunction + +script SpeakNthPlaceMarker() +var + int nIndex, + int iNumOfPlaceMarkers, + int bMoveToPlaceMarker +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +if IsSameScript() then + let bMoveToPlaceMarker=TRUE +else + let bMoveToPlaceMarker=FALSE +endIf +let nIndex=stringToInt(stringRight(GetCurrentScriptKeyName(),1)) +if nIndex==0 then + let nIndex=10 +endIf +If ! SpeakPlaceMarkerByIndex(nIndex,bMoveToPlaceMarker) then + ;Speak relevant error messages. + Let iNumOfPlaceMarkers = GetPlaceMarkerCount () + If ! iNumOfPlaceMarkers then + SayFormattedMessage (OT_ERROR, cMsgNoPlaceMarkers_L, cMsgNoPlaceMarkers_S) + Return + ElIf iNumOfPlaceMarkers == 1 then + SayFormattedMessage (OT_ERROR, cmsgOnePlaceMarker_L, cmsgOnePlaceMarker_S) + Return + Else + SayFormattedMessage (OT_ERROR, FormatString (cmsgNumOfPlaceMarkers_L, + IntToString (iNumOfPlaceMarkers)), FormatString (cmsgNumOfPlaceMarkers_S, IntToString (iNumOfPlaceMarkers))) + Return + EndIf +EndIf +endScript + +script SpeakPlaceMarkerN(optional int nPlaceMarker) +SpeakPlaceMarkerN(nPlaceMarker) +EndScript + +script MoveToPlaceMarkerN(optional int nPlaceMarker) +MoveToPlaceMarkerN(nPlaceMarker) +EndScript + +Script MoveToNextPlaceMarker() +MoveToNextPlaceMarker() +EndScript + +Script MoveToPriorPlaceMarker() +MoveToPriorPlaceMarker() +EndScript + +Script DefineATempPlaceMarker() +PerformScript DefineATempPlaceMarker() +EndScript + +void function SpeakCustomPageSummary() +var + int bPriorFormsMode +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let bPriorFormsMode=IsFormsModeActive() +if IsFormsModeActive() then + TurnOffFormsMode(FormsModeEventSpeechSilent) +endIf +;SayFormattedMessage(OT_SMART_HELP,cmsgCustomPageSummary_L,cmsgCustomPageSummary_S) +Refresh() +placeMarkersEnumerate("PlaceMarkersEnumerateCallback",true) +if bPriorFormsMode then + TurnOnFormsMode(FormsModeEventSpeechSilent) +endIf +endFunction + +void function VirtualizeCustomPageSummary() +var + int bPriorFormsMode +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let bPriorFormsMode=IsFormsModeActive() +let giRestoreFormsModeAfterVirtualizeCPS=IsFormsModeActive() +if IsFormsModeActive() then + TurnOffFormsMode(FormsModeEventSpeechSilent) +endIf +Refresh() +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (MSG_CustomSummaryResultsTitle) +if (placeMarkersEnumerate("PlaceMarkersEnumerateCallbackVirtual",false)) + UserBufferAddTextResultsViewer (cMsgBuffExit) +endIf +;UserBufferActivate() +endFunction + +int function PlaceMarkersEnumerateCallback(int nIndex, string sName, string sText) +if (sName!=smmStripMarkup(sText)) then + say(sName,OT_JAWS_MESSAGE) +endIf +say(sText,ot_LINE,TRUE) +return TRUE +endFunction + +int function PlaceMarkersEnumerateCallbackVirtual(int nIndex, string sName, string sText) +UserBufferAddTextResultsViewer (sName, "MoveToPlaceMarkerByIndex("+intToString(nIndex)+")",sName) +if (stringLength(sName)==StringLength(sText) && sName==sText) then + return TRUE; don't want to duplicate info +else + UserBufferAddTextResultsViewer (SText) +endIf +return TRUE +endFunction + +void function MoveToPlaceMarkerByIndex(int n) +UserBufferDeactivate() +SpeakPlaceMarkerByIndex(n,TRUE) +if giRestoreFormsModeAfterVirtualizeCPS then + let GiIgnoreFormsModeSpeak = FormsModeEventSpeechSilent + EnterKey(); ensure new placemarker gets properly activated rather than Formsmode just being re-enabled + if IsFormsModeActive() == FALSE then + TurnOnFormsMode(FormsModeEventSpeechSilent); in case Enterkey didn't do it. + endIf + let giRestoreFormsModeAfterVirtualizeCPS=FALSE; +endIf +endFunction + +script SpeakPlaceMarkers() +If !(GetRunningFSProducts() & product_JAWS) +|| !(IsVirtualPCCursor() || IsFormsModeActive()) then + ;This may be a native keystroke in some apps: + SayCurrentScriptKeyLabel() + TypeCurrentScriptKey() + return +EndIf +if !GetPlaceMarkerCount () then + sayMessage (OT_ERROR, cMsgNoPlaceMarkers_L, cMsgNoPlaceMarkers_S) + Return +endIf +if IsSameScript() then + VirtualizeCustomPageSummary() +else + SpeakCustomPageSummary() +endIf +endScript +void function ToggleSMMTrainingMode() +var + int nMode +let nMode=smmTrainingModeActive() +let nMode=!nMode +smmToggleTrainingMode(nMode) +if nMode then + SayMessage(OT_STATUS,cmsg_on) ;ToggleSMMTrainingModeOn_S +else + SayMessage(OT_STATUS,cmsg_off) ;ToggleSMMTrainingModeOff_S) +endIf +EndFunction + +int function SayListViewCheckBoxObjectState() +;here we catch listviews whose child objects are actually checkboxes, and announce the state if we can. +var + string sState, + int iMSAAMode +; Don't want to do this for the Desktop since it doesn't have checkboxes and switching on MSAA mode unnecessarily is expensive. +;(other half of fix to track defect 21587) highlight not updating on the desktop +if GetWindowClass(GetRealWindow(globalFocusWindow))==cwcProgman then + return false +endIf +let iMSAAMode = GetJCFOption(opt_msaa_mode) +SetJCFOption(opt_msaa_mode,2) +if GetObjectSubtypeCode() == wt_CheckBox then + let sState = GetObjectState() + SetJCFOption(opt_msaa_mode,iMSAAMode) + if sState then + ;the state string may contain leading blanks. + ;be sure to execute the following if statement in this order: + if StringContains(sState,cmsg_notChecked) then + Say(smmGetStartMarkupForControlState(wt_ListView,CTRL_UNCHECKED),ot_item_state,true) + return true + ElIf StringContains(sState,cMSG_checked) then + Say(smmGetStartMarkupForControlState(wt_ListView,CTRL_CHECKED),ot_item_state,true) + return true + EndIf + EndIf +EndIf +SetJCFOption(opt_msaa_mode,iMSAAMode) +return false +EndFunction + +void function SayLVItemCheckStatus(handle hWnd) +var + int iState +let iState = lvGetItemState(hWnd,lvGetFocusItem(hWnd)) +if iState & lv_ItemChecked then + Say(smmGetStartMarkupForControlState(wt_ListView,CTRL_CHECKED),ot_item_state,true) +ElIf iState & lv_ItemNotChecked then + Say(smmGetStartMarkupForControlState(wt_ListView,CTRL_UNCHECKED),ot_item_state,true) +else + SayListViewCheckBoxObjectState() +EndIf +EndFunction + +script BrailleAutoAdvance(optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +; toggle the mode. +var int mode = BrailleAutoadvanceModeActive() +mode =! mode +BrailleAutoAdvanceMode( mode ) +EndScript + +Script IncreaseBrailleAutoAdvanceSpeed(optional int index) +var + int nValue +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +let nValue=getJCFOption(OPT_BRL_AUTOADVANCE_INTERVAL) +if nValue > 500 then + let nValue=nValue-500; decrease by half a second + SetJCFOption(OPT_BRL_AUTOADVANCE_INTERVAL,nValue); save the new value so when we query it again we get the saved value +endIf +EndScript + +Script DecreaseBrailleAutoAdvanceSpeed(optional int index) +var + int nValue +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +let nValue=getJCFOption(OPT_BRL_AUTOADVANCE_INTERVAL) +if nValue < 10000 then + let nValue=nValue+500; increase by half a second + SetJCFOption(OPT_BRL_AUTOADVANCE_INTERVAL,nValue); save the new value so when we query it again we get the saved value +endIf +EndScript + +void function SpeakProgressBarInfo(int bSpeakPrompt, optional int bSpeakZeroPercent) +var + handle hProgress, + string sName, + string sValue, + string sMessage +let hProgress=GetProgressBarInfo(sName,sValue) +if hProgress then + if !bSpeakZeroPercent then + if sValue == cmsgZeroPercentProgress then + return + EndIf + EndIf + if bSpeakPrompt then + let sMessage=FormatString(CMSGProgressBar,sName,sValue) + else + let sMessage=sValue + endIf + sayMessage(OT_USER_REQUESTED_INFORMATION,sMessage) +endIf +endFunction + +void function ProgressBarChangedEvent(handle hProgress, string sName, string sValue) +sayMessage(OT_POSITION,sValue) +endFunction + +int function IsTrueListView(handle hWnd) +var + string sClass +let sClass = GetWindowClass(hWnd) +return GetWindowTypeCode (hWnd) == WT_LISTVIEW || +StringContains (StringLower(sClass), cwcListViewGeneric) ||; list view controls with different class +sClass == cWcListView || sClass == cwcATLListView +EndFunction + +script CustomizeListView() +var + handle hCurrent +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let hCurrent=GetCurrentWindow() +if !IsTrueListView(hCurrent) then + SayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S) + return +Endif +DlgCustomizeListview(hCurrent) +endScript + +script ReadListviewColumn() +var + int nCol, + int nMaxCols, + string sHeader, + string sText, + handle hCurrent, + int nCurrent +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let hCurrent=getCurrentWindow() +if !IsTrueListView(hCurrent) then + sayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S) + return +endIf +let nCol=StringToInt(stringRight(GetCurrentScriptKeyName(),1)) +let nCurrent=lvGetFocusItem(hCurrent) +if (nCol==0) then + let nCol=10 +endIf +if (nCol < 1) then + let nCol=1 +endIf +let nMaxCols=lvGetNumOfColumns(hCurrent) +if (nCol > nMaxCols) then + SayFormattedMessage(OT_ERROR,formatString(cmsgListviewContainsXColumns_L,intToString(nCol),intToString(nMaxCols)),formatString(cmsgListviewContainsXColumns_S,intToString(nCol))) + return +endIf +let sHeader=lvGetColumnHeader(hCurrent,nCol) +let sText=lvGetItemText(hCurrent,nCurrent,nCol) +say(sHeader,OT_NO_DISABLE) +say(sText,OT_NO_DISABLE) +endScript + +void function SayControlAttribBits(int Value) +var + int FlagSet, + int bit +let FlagSet = GetControlAttributes() +let bit = 0 +while bit<16 + if FlagSet & 1<=0 it is valid and should be used +if (nDocOffset >=0) then + let functNameAndParams="SkimReadMoveToDocOffset("+IntToString(nDocOffset)+")" +else + let functNameAndParams="SkimReadMoveToDocLine("+IntToString(nDocLine)+")" +endIf +let displayName=formatString(cmsgSkimReadMoveToMatch,intToString(nMatch)) +let sText = FormatString(cmsgSkimReadSummaryLink,IntToString(nMatch),sText) +UserBufferAddTextResultsViewer (sText, functNameAndParams, displayName, cFont_Times, 12, attrib_Text, 0, 0xffffff, TRUE) +endFunction + +void function SkimReadStoppedEvent(int nSkimReadingMode, int nMatches, int bSummarize) +;if creating a summary, this fires once for each match. +;otherwise, it fires when the skim reading is stopped. +var + string sLong, + string sShort +if !bSummarize +&& nSkimReadingMode >= srmTextMatchingRegularExpression then +let sLong=FormatString(CMSGSkimReadStopped_L,intToString(nMatches)) +let sShort=FormatString(CMSGSkimReadStopped_L,intToString(nMatches)) + SayFormattedMessage(OT_JAWS_MESSAGE,sLong,sShort) +endIf +endFunction + +script RepeatLastFlashMessage(optional int index) +if gbBrailleStudyModeActive && index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) + return +EndIf +BrailleMessageRepeatLast() +endScript + + +Function CheckForReminderDialog (handle hWindow) +; Is newly created window the Outlook Reminder dialog? +If (!ghReminderDialog +&& ghOutlookWindow) Then +; Outlook is open and Reminder dialog is not. + If GetWindowClass(hWindow)==cwc290 + && StringContains(GetWindowName(hWindow),cscSnooze) Then + ; It is a button with the name of "Snooze." + let ghReminderDialog=hWindow + EndIf +EndIf +EndFunction + +; To find the reminder window if the reminder handle is empty. +Int Function EnumToFindReminder (handle hWnd) +If IsWindowVisible (hWnd) + && GetWindowTypeCode (hWnd) == WT_DIALOG + && StringContains (GetWindowName (hWnd), "Reminder") then + let ghReminderDialog = hWnd + Return (FALSE) +EndIf +Return (TRUE) +EndFunction + +Script ToggleOutlookReminder () +var + Handle hNull, + handle hParent, + handle hWnd +let hWnd=GetFocus() +let hParent=GetParent(hWnd) +If Not ghReminderDialog then + EnumerateChildWindows (hNull, "EnumToFindReminder") +EndIf +If (GetRealWindow(hWnd)!=GetRealWindow(ghReminderDialog)) Then +; Current window is not Reminder dialog. + If (ghReminderDialog && IsWindowVisible (ghReminderDialog)) Then + ; Reminder dialog is open and visible, so save current locale and move to that window. + If hWnd==GetAppMainWindow(hWnd) Then + ; Current focus is main app window... + let ghReminderReturn=hWnd + Else ; Get the parent of the current focus. + let ghReminderReturn=hParent + EndIf + SetFocus(ghReminderDialog) + Else + ; Reminder is not open or is not visible. + SayFormattedMessage(OT_ERROR,cmsgReminderNotVisible_L,cmsgReminderNotVisible_S) + Return + EndIf +ElIf (hWnd!=ghReminderReturn && IsWindowVisible(ghReminderReturn)) Then +; Reminder return is not the current window, and it is visible. + SetFocus(ghReminderReturn) +EndIf +EndScript + +/* +Script ToggleOutlookReminder () +var + handle hParent, + handle hWnd +let hWnd=GetFocus() +let hParent=GetParent(hWnd) +If (GetRealWindow(hWnd)!=GetRealWindow(ghReminderDialog)) Then +; Current window is not Reminder dialog. + If (ghReminderDialog && IsWindowVisible (ghReminderDialog)) Then + ; Reminder dialog is open and visible, so save current locale and move to that window. + If hWnd==GetAppMainWindow(hWnd) Then + ; Current focus is main app window... + let ghReminderReturn=hWnd + Else ; Get the parent of the current focus. + let ghReminderReturn=hParent + EndIf + SetFocus(ghReminderDialog) + Else + ; Reminder is not open or is not visible. + SayFormattedMessage(OT_ERROR,cmsgReminderNotVisible_L,cmsgReminderNotVisible_S) + Return + EndIf +ElIf (hWnd!=ghReminderReturn && IsWindowVisible(ghReminderReturn)) Then +; Reminder return is not the current window, and it is visible. + SetFocus(ghReminderReturn) +EndIf +EndScript +*/ + +void function OnMouseOverActivated(int nx, int ny, int bElementAttributesChanged, int nTextChangedAtLineNumber, int bTitleChanged) +var +string sMessageLong, +string sMessageShort +if (bElementAttributesChanged==FALSE && nTextChangedAtLineNumber ==-1 && bTitleChanged==FALSE) then + SayFormattedMessage(OT_STATUS,cmsgOnMouseOverNoChange_l,cmsgOnMouseOverNoChange_S) + return +endIf +BeginFlashMessage() +if (bTitleChanged) && nTextChangedAtLineNumber !=1 then + SayMessage(OT_STATUS,cmsgOnMouseOverElementPageTitleChanged_L,cmsgOnMouseOverElementPageTitleChanged_S) +endIf +if (bElementAttributesChanged) then + SayMessage(OT_STATUS,cmsgOnMouseOverElementAttributesChanged_L,cmsgOnMouseOverElementAttributesChanged_S) +endIf +if (nTextChangedAtLineNumber > 0) then + sayFormattedMessage(OT_STATUS,formatString(cmsgOnMouseOverTextCHANGE_L,intToString(nTextChangedAtLineNumber)),formatString(cmsgOnMouseOverTextCHANGE_S,intToString(nTextChangedAtLineNumber))) +endIf +EndFlashMessage() +endFunction + +script SettingsPackager() +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +run("\""+FindJAWSUtilityProgram (MGR_SETTINGS_PACKAGER)+"\"") +endScript + +string function LookupBXKeyNames(string sBXKeyName) +var + int iFirst, + int iLast, + int iMiddle, + int iCompare +let iFirst = 1 +let iLast = cicBXKeyNames +While iLast >= iFirst + let iMiddle = (iFirst+iLast)/2 + let iCompare = StringCompare(sBXKeyName,StringSegment(cscBxKeyDotPatternList,cscBXKeyListSeparator,iMiddle),0) + if iCompare == 0 then + return StringSegment(cscBXKeyNameList,cscBXKeyListSeparator,iMiddle) + ElIf iCompare > 0 then + let iFirst = iMiddle+1 + Else + let iLast = iMiddle-1 + EndIf +EndWhile +return cscNull +EndFunction + +string function StripBXKeyNamePrefix(string sBXKeyName) +var + int iLength, + string sBXK +let gbBXKeyIsAlpha = false +let iLength = StringLength(cscBXKeyNameBrailleDotPrefix) +;First, obliterate Focus key name Prefix, turn into BX key names. +;let sBXKeyName = (StringReplaceSubstrings (sBXKeyName, cscFocusDotMulti, cscBXKeyNameBrailleDotPrefix)) +;let sBXKeyName = (StringReplaceSubstrings (sBXKeyName, cscFocusDot1, cscBXKeyNameBrailleDotPrefix)) +if StringCompare(SubString(sBXKeyName,1,iLength),cscBXKeyNameBrailleDotPrefix,0) == 0 then + let sBXK = stringChopLeft(sBXKeyName, iLength) +else + let iLength = StringLength(cscBXKeyNameBraillePrefix) + if StringCompare(SubString(sBXKeyName,1,iLength),cscBXKeyNameBraillePrefix,0) == 0 then + let sBXK = stringChopLeft(sBXKeyName, iLength) + if StringLength(sBXK) == 1 then + let gbBXKeyIsAlpha = true + EndIf + EndIf +EndIf +return sBXK +EndFunction + +int Function DoBXModifiedKey (string sBXKeyName) +var + int i, + string sBXKey, + int IsSODActive +;Focus keys are sent as letters, +;when passed in Typing Keys Mode, so don't strip or process as Braille keys: +;If (!BrailleGetTypeKeysMode ()) Then + let sBXKeyName = StripBXKeyNamePrefix(sBXKeyName) +;EndIf +if gbBXKeyIsAlpha then + ;Do we need to translate the key name into the name of a function key: + if gbBXFunctionKey then + let i = StringContains(cscBXFunctionKeys,sBXKeyName) + if !i then + return 0 + else + let sBXKeyName = StringSegment(cscBXFunctionKeyNames,cscBXKeyListSeparator,i) + EndIf + EndIf + let gsBXSimulateKey = gsBXSimulateKey+sBXKeyName + If InHomeRowMode() then + Let gsBXSimulateKey = (cscHomeRowPrefix+ + cscKeyNameComponentSeparator+gsBXSimulateKey) + EndIf + if !gbKeyboardHelp then + return SimulateKey(gsBXSimulateKey) + else + if IsScriptKey(gsBXSimulateKey) then + SetLastScriptKey(gsBXSimulateKey) + KeyboardHelpHook(GetScriptAssignedTo(gsBXSimulateKey),cscNull) + else + isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) + if (isSODActive) JAWSSpeechOnDemandOn() endIf + Say(gsBXSimulateKey,ot_line) + if (isSODActive) JAWSSpeechOnDemandOff() endIf + EndIf + EndIf +else + if gbBXFunctionKey then + return 0 + EndIf + ;look it up and match for a key name: + let sBXKey = LookupBXKeyNames(sBXKeyName) + if sBXKey then + let gsBXSimulateKey = gsBXSimulateKey+sBXKey + if !gbKeyboardHelp then + return SimulateKey(gsBXSimulateKey) + else + if IsScriptKey(gsBXSimulateKey) then + SetLastScriptKey(gsBXSimulateKey) + KeyboardHelpHook(GetScriptAssignedTo(gsBXSimulateKey),cscNull) + else + isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) + if (isSODActive) JAWSSpeechOnDemandOn() endIf + Say(gsBXSimulateKey,ot_line) + if (isSODActive) JAWSSpeechOnDemandOff() endIf + EndIf + EndIf + EndIf +EndIf +return 0 +EndFunction + +script BXBuildModifyer() +var + string sScriptKey, + string sControl, + string sAlt, + string sShift, + string sWindows, + string sJAWSKey +Let sScriptKey = GetCurrentScriptKeyName () +let sScriptKey = StripBXKeyNamePrefix(sScriptKey) +let sScriptKey = StringChopRight(sScriptKey,StringLength(cscBXKeyNameDot8ChordSuffix)) +if !sScriptKey then + return +EndIf +if StringContains(sScriptKey,cscBXControlDot) then + ;let sControl = cscControlModifyer+cscKeyNameComponentSeparator + Let gsBXSimulateKey = cscControlModifyer+cscKeyNameComponentSeparator +EndIf +if StringContains(sScriptKey,cscBXAltDot) then + ;let sAlt = cscAltModifyer+cscKeyNameComponentSeparator + Let gsBXSimulateKey = gsBXSimulateKey+cscAltModifyer+cscKeyNameComponentSeparator +EndIf +if StringContains(sScriptKey,cscBXShiftDot) then + ;let sShift = cscShiftModifyer+cscKeyNameComponentSeparator + Let gsBXSimulateKey = gsBXSimulateKey+cscShiftModifyer+cscKeyNameComponentSeparator +EndIf +if StringContains(sScriptKey,cscBXWindowsDot) then + ;let sWindows = cscWindowsModifyer+cscKeyNameComponentSeparator + Let gsBXSimulateKey = gsBXSimulateKey+cscWindowsModifyer+cscKeyNameComponentSeparator +EndIf +if StringContains(sScriptKey,cscBXJAWSKeyDot) then + Let gsBXSimulateKey = gsBXSimulateKey+cscJAWSKeyModifyer+cscKeyNameComponentSeparator +else ;allow either JAWSKey or Insert as modifyers, but not both: + if StringContains(sScriptKey,cscBXInsertDot) then + let gsBXSimulateKey = gsBXSimulateKey+cscInsertModifyer+cscKeyNameComponentSeparator + EndIf +EndIf +;let gsBXSimulateKey = sControl+sAlt+sShift+sWindows+sJAWSKey +TrapKeys(true) +EndScript + +script BXBuildFKeyModifyer() +let gbBXFunctionKey = true +PerformScript BXBuildModifyer() +EndScript + +Script SendAltKey() +If UserBufferIsActive () then + UserBufferDeactivate () +EndIf +if !UseUnifiedKeyboardProcessing() Then + TypeKey(cksAlt) +EndIf +EndScript + +script SendApplicationKey() +TypeKey(cksShiftF10) +EndScript + +script ToggleCapsLock() +var + int iUpDown, + int iToggle +GetKeyState ("Capslock", iUpDown, iToggle) +TypeKey(cksCapsLock) +;instead of dealing with timing issues which may arise by getting the state after the toggle, +;we get the state before the toggle and announce the opposite. +if iToggle then + SayMessage(OT_status,mscCapsLockOff_L,cmsg_off) +else + SayMessage(OT_status,mscCapsLockOn_L,cmsg_on) +EndIf +EndScript + +script PausePACMateRemote() + ; This function purposely says nothing. If the user is not in a PACMate + ; remote session, this function should not be bound, but if it is, the keystroke + ; will do nothing. If it is in a PACMate session and is successfully paused, + ; the PACMate will receive a PausePACMateRemote event and will speak appropriate + ; text there. + PausePACMateRemote() +EndScript + +script showEntireListView() +var + handle hWnd, + string sText +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +let hWnd = GetCurrentWindow() +if !IsTrueListView(hWnd) then + SayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S) + return +EndIf +let sText = GetListViewText(hWnd) +if !sText then + SayMessage(ot_error,cmsgNoTextInListview_L,cmsgNoTextInListview_S) + return +EndIf +if UserBufferIsActive() then + UserBufferDeactivate() +EndIf +UserBufferClear() +UserBufferAddText(sText) +UserBufferActivate() +JAWSTopOfFile() +SayLine() +EndScript + +string function GetListViewText(handle hWnd, optional int iColFlags, int bSkipEmptyListItems) +var + int iLVCount, + int iLVCols, + int i, + int j, + string sListItem, + string sBuffer +let iLVCount = lvGetItemCount(hWnd) +if !iLVCount then + return cscNull +EndIf +let iLVCols = lvGetNumOfColumns(hWnd) +if !iColFlags then + ;default is all columns + let iColFlags = 0xffffffff +EndIf +let i = 1 +while i <= iLVCount + let j = 1 + let sListItem = cscNull + while j <= iLVCols + if 1<<(j-1) & iColFlags then + let sListItem = sListItem+lvGetItemText(hWnd,i,j)+cscSpace + EndIf + let j = j+1 + EndWhile + let sListItem = StringTrimTrailingBlanks(sListItem) + if !(bSkipEmptyListItems && !sListItem) then + let sBuffer = sBuffer+sListItem+"\r\n" + EndIf + let i = i+1 +EndWhile +if sBuffer then + let sBuffer = StringChopRight(sBuffer,2) +EndIf +return sBuffer +EndFunction + +script StopSpeech() + StopSpeech() +EndScript + +int function IsDescendedFromWindow(handle hAncestor, handle hDescendant) +var + handle hTemp +let hTemp = hDescendant +while hTemp && hTemp != hAncestor + let hTemp = GetParent(hTemp) +EndWhile +return hTemp == hAncestor +EndFunction + +Script ExitFormsMode() +ExitFormsModeHelper() +EndScript + +void function CrossedListBoundaryEvent() +;called from internal code when using a quick nav key to move by list item takes you out of the current list in order to find the next list item +beep() +sayMessage(OT_SMART_HELP, cmsgCrossingListBoundary_L, cmsgCrossingListBoundary_S) +endFunction + +void Function ZoomSoftwareSpeakMessagesOnly (string appName) +if StringContains (zRepeat, scChatMessageIndicator) then ; we want it if the user has selected chat only. + if StringIsBlank (zNotificationOutput) then + let zNotificationOutput = zRepeat + else + let zNotificationOutput = zNotificationOutput+"|"+zRepeat + endIf +endIf +if ZAlert== 1 then + var collection notificationRuleActions = ProcessNotification(zRepeat, appName) + SayNotification(notificationRuleActions, ot_message) + BrailleMessage (zRepeat) +endIf +EndFunction + +int function ProcessAlertAsZoomAlert (handle window, string text, string appName) +if getWindowClass (window) != ZoomNotificationWindowClass then + return FALSE +endIf +var + string sMsgLong, + string sMsgShort; +Let sMsgLong = Text +; Process the alerts and chats. +let zRepeat = Text +if zChat == 1 then + ZoomSoftwareSpeakMessagesOnly (appName) + return TRUE +endIf +if StringIsBlank (zNotificationOutput) then + let zNotificationOutput = zRepeat +else + let zNotificationOutput = zNotificationOutput+"|"+zRepeat +endIf +if ZAlert== 1 then + var collection notificationRuleActions = ProcessNotification(zRepeat, appName) + SayNotification (notificationRuleActions, ot_message) + brailleMessage (zRepeat) + ; We don't want to save chat messages, or alerts excluded from history by the user + if !notificationRuleActions.ExcludeFromNotificationHistory && !StringStartsWith(zRepeat, scChatMessageIndicator) then + StoreSpokenNotificationForRepeat (zRepeat, appName) ; for new insert+Space&N keystroke. + endIf +endIf +return TRUE +endFunction + +void function InterruptSpeechIfAppropriateForMSAAAlertEvent() +;If multiple MSAA alerts are received in rapid succession, we want to allow each of them to speak, +;otherwise we will interrupt the speech. +var int currentAlertTime = GetTickCount() +if currentAlertTime-LastMSAAAlertTime > MSAAAlertTimerThreshold + StopSpeech() +endIf +LastMSAAAlertTime = currentAlertTime +EndFunction + +void function MSAAAlertEvent(handle hwnd, int nTime, string sText, int nAlertLevel, string appName) +if ProcessAlertAsZoomAlert (hwnd, sText, appName) then +; Zoom Alert settings from Zoom Scripts now understood globally. + return +endIf +InterruptSpeechIfAppropriateForMSAAAlertEvent() +var collection notificationRuleActions = ProcessNotification(sText, appName) +; We want to avoid endless repitions of the same alerts +; So we check if we haven't said the same thing within the last 500 ticks +if !IsRepeatNotification(sText) + SayNotification(notificationRuleActions, OT_HELP) +endIf +;Because this event gets called when WindowCreatedEvent may not, +; for new versions of Skype: +CheckForSkypeAlerts (hwnd, sText) +if !notificationRuleActions.ExcludeFromNotificationHistory then + StoreSpokenNotificationForRepeat (sText, appName) ; for new insert+Space&N keystroke. +endIf +endFunction + +script AnnounceLastAlert() +var + string sText, + int nAlertLevel +if (!GetLastMSAAAlertInfo(sText,nAlertLevel)) then + SayMessage(OT_ERROR,cmsgNoLastAlert_L,cmsgNoLastAlert_S) + return +endIf +BeginFlashMessage() +SayMessage(OT_JAWS_MESSAGE,cmsgAlert) +sayMessage(OT_SCREEN_MESSAGE, sText) +EndFlashMessage() +endScript + +void function SayTVFocusItemExpandState(handle hWnd) +var + int iState +if GetWindowSubtypeCode(hWnd) != wt_TreeView then + return +EndIf +let iState = tvGetFocusItemExpandState(hWnd) +if iState == -1 then + ;item has no children, so it has no expand state + return +ElIf iState then + Say(cmsgControlStateOpened,OT_ITEM_STATE) +else + Say(cmsgControlStateClosed,OT_ITEM_STATE) +EndIf +EndFunction + +void function DocumentUpdated(int nLineNumberOfChange, int bUserInvoked) +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +;Note don't want to toggle forms mode if typing in an edit field! +if bUserInvoked==FALSE then + var int iSubtype = GetObjectSubtypeCode() + if !IsFormsModeActive() + && iSubtype == wt_Edit + && iSubtype == wt_multiline_edit then + return + EndIf +endIf +if ShouldCheckForCustomPageSummary() +&& GetJCFOption(OPT_CUSTOM_PAGE_SUMMARY) then + CustomPageSummaryReported() +EndIf + +if IsFormsModeActive () +|| !bUserInvoked +|| nLineNumberOfChange == 1 +|| !GetJCFOption (OPT_ALLOW_USER_INVOKED_LOCATION_UPDATE) then + return +endif + +gotoLineNumber(nLineNumberOfChange) +var string currentLine = GetLine () +if priorTopLineOfNewContent != currentLine + sayline() + priorTopLineOfNewContent = currentLine +endif +endFunction + +script RoutePCToVirtual() +PCCursor() +SayMessage(OT_JAWS_MESSAGE, CMSGRoutePCToVirtual_L, CMSGRoutePCToVirtual_S) +RoutePCToVirtual() +endScript + +Script DoNativeKey() +SayCurrentScriptKeyLabel() +TypeCurrentScriptKey() +EndScript + +string function GetOwningAppName(handle hWnd) +var + string sOwner +let sOwner = GetWindowOwner(hWnd) +if sOwner then + let sOwner = StringSegment(sOwner,cScDoubleBackSlash,StringSegmentCount(sOwner,cScDoubleBackSlash)) +EndIf +return sOwner +EndFunction + +void function PageChangedEvent(handle hWnd, string PageName ) +;fires when switching to a new page tab in IE. +EndFunction + +Script FSReaderFastForward () +TypeKey (cksFSReaderFastForward ) +EndScript + +Script FSReaderRewind () +TypeKey (cksFSReaderRewind ) +EndScript + +Script FSReaderPlay () +TypeKey (cksFSReaderPlay ) +EndScript + +script JAWSMemDmp() +;This script exits JAWS and outputs a memory dump. +;Any code in the body of the script is ignored. +EndScript + +Script SwitchInputLanguageAndKeyboardLayout () +var + handle hWnd +TypeCurrentScriptKey () +SayCurrentScriptKeyLabel () +Let gbKeyboardLayoutChange=TRUE +ScheduleFunction("KillgbKeyboardLayoutChange",DelayWhileKeyboardInputSwitching) +EndScript + +int function IsMAGicRunning() +return 0 != (GetRunningFSProducts() & product_MAGic) +EndFunction + +int function IsZoomTextRunning() +return 0 != (GetRunningFSProducts() & product_ZoomText) +EndFunction + +void function KeyboardLanguageChangedEvent(string sLayoutName, int nLangId, string sLangAbbrev) +var + string sMsg +if GetJCFOption(OPT_DETECT_KEYBOARD_INPUT_LANGUAGE) + if (sLangAbbrev!=cscNull) then + ;need to use sAbbrev in call to SetTypingEchoLanguage + SetTypingEchoLanguage(sLangAbbrev) + endIf +EndIf +if UseUnifiedKeyboardProcessing() Then + PerformScript SwitchInputLanguage() +EndIf +If ! gbKeyboardLayoutChange then + Return +EndIf +ScheduleFunction("KillgbKeyboardLayoutChange", DelayWhileKeyboardInputSwitching) +if sLayoutName != cscNull && ActiveLayoutName != cscNull +&& (ActiveLangId != nLangId || ActiveLayoutName != sLayoutName) + if UseUnifiedKeyboardProcessing() && GetDefaultJCFOption (OPT_TYPING_INTERRUPT) + ; Legacy keyboard has keyboard switching as JAWS script and executing script interrupts speech. + ; Unified doesn't have a script for this and just passes it to the system so we'll need to StopSpeech manually. + StopSpeech() + Endif + let sMsg = FormatString (cKeyboardLayout_L, sLayoutName) + ;Cause OT_STATUS message to be short where it applies: + SayFormattedMessage(OT_STATUS, sMsg, sLayoutName) +endIf +ActiveLangId = nLangId +ActiveLayoutName = sLayoutName +endFunction + +int function lvMoveByLineUnit(int LineMoveUnit, optional int bMayWrap) +var + handle hWnd, + int lvCount, + int lvCurrent +let hWnd = GetFocus() +if LineMoveUnit == lvLineMoveUnitFirst then + return SetCurrentItem(hWnd,1) +EndIf +let lvCount = lvGetItemCount(hWnd) +if LineMoveUnit == lvLineMoveUnitLast then + return SetCurrentItem(hWnd,lvCount) +EndIf +let lvCurrent = lvGetFocusItem(hWnd) +if LineMoveUnit == lvLineMoveUnitNext then + if lvCurrent < lvCount then + return SetCurrentItem(hWnd,lvCurrent+1) + ElIf lvCurrent == lvCount + && bMayWrap then + return SetCurrentItem(hWnd,1) + else + return 0 + EndIf +ElIf LineMoveUnit == lvLineMoveUnitPrior then + if lvCurrent > 1 then + return SetCurrentItem(hWnd,lvCurrent-1) + ElIf lvCurrent == 1 + && bMayWrap then + return SetCurrentItem(hWnd,lvCount) + else + return 0 + EndIf +else + ;requested move unit was invalid + return 0 +endIf +EndFunction + +void function SelectionContextChangedEvent(int nSelectionContextFlags, int nPrevSelectionContextFlags, int nData1, int nData2, +string sDesc1, string sDesc2, string sDesc3, string sDesc4, string sDesc5) +; this event function is triggered when any of the enabled selection context data flags changes as one navigates in +;supported applications. +;where extra contextual information is required to report the change in context, relevant flags and strings are filled in +;with data. +;For example, navigating into a formfield, nData1 will be the type(see WT_CONSTANTS), nData2 will be the state, +;sDesc1 the prompt, sDesc2 the value, sDesc3 the positional information and sDesc4 the extra help information if available. +;For comments, sDesc1 is the author's name, sDesc2 the initials, sDesc3 the text of the actual comment. +;For footnotes or endnotes, sDesc1 is the reference id and sDesc2 the text of the note. +;For bookmarks and smart tags, sDesc1 is the name of the item. +;For revisions, nData1 is the type of revision, sDesc1 the author, sDesc2 the initials and sDesc3 the text. +;For shapes or objects, nData1 is a type specifier, nData2 a builtin shape type, sDesc1 the name of the object, sDesc2 the text, and sDesc3 the dimentions. +; The units of measure used for the dimentions are in the current desired units of measure as defined by the smmSetDesiredUnitsOfMeasure function. +;For selCtxPageSectionColumnBreaks, nData1=column number, nData2=number of text columns +;sDesc1=page n, sDesc2=sectiony , sDesc3=z text columns (text column count) +;sDesc4=column j (where j is the number of the text column) +; For other contextual information such as spelling and grammar, the relevant bit of the context flags will be set in the +;new and cleared in the old to indicate moving into an error, or vice versa when exiting. +;Table info should be gathered from the table specific events. +;See hjconsnt.jsh for the selCtx constant bit values. +endFunction + +void function TabStopEvent(string sNewPos) +;this function gets called in supported apps when the tab key causes the position of the caret to change (ie to move to the next tab stop). +;It is to be used to automatically announce the new caret position. +;Currently this is only enabled in MSWord. +SayMessage(OT_CURSOR, sNewPos) +EndFunction + +void Function KillgbKeyboardLayoutChange () +Let gbKeyboardLayoutChange = FALSE +EndFunction + +Function UseUnifiedKeyboardProcessing () + if getJCFOption (OPT_USE_LEGACY_KEYBOARD) != 0 Then + return false + EndIf + return true +EndFunction + +Script SwitchInputLanguage(int bAltKey); +if !UseUnifiedKeyboardProcessing() Then + ;Updates global bool for InputLanguageChanged: + ;Force key through if using that for language change: + ;Alt key doesn't go through, whereas control key does. + If bAltKey then + TypeCurrentScriptKey () + EndIf +EndIf +Let gbKeyboardLayoutChange=TRUE +ScheduleFunction("KillgbKeyboardLayoutChange",DelayWhileKeyboardInputSwitching) +EndScript + +void function FrameLoadedEvent(handle hDoc, string sFrameName, int nFrameIndex) +;This function fires whenever an HTML frame updates, +;and is currently implemented only in Internet Explorer scripts. +endFunction + +int function HasVirtualEnhancedClipboard() +return GetWindowClass(GetFocus()) == cwcIEServer +EndFunction + +int function xx_InHJDialog() +; Override of built-in function to make the JAWS Startup Wizard an "HJ Dialog" [DGL] +; This is aimed at making speech/Braille handling identical across all apps instead of depending on app-specific script code. +var + int result +let result = InHJDialog() +if result then + return result +endIf +if !DialogActive() then + return False +endIf +if stringCompare(getWindowName(getTopLevelWindow(getFocus())), cWnJAWSStartup, False) != 0 then + return False +endIf +return True +/* Replace the above line with the following block if the window name is not to be considered sufficient. +var + handle hwnd +let hwnd = getFocus() +; JFW.ENU (or other language module) owns some but not all controls in this dialog: +; Some are owned by ComCtl32.dll, and the top-level window is owned by the currently focused app. +if getOwningAppName(hwnd) == "jfw." then + return True +endIf +; The first child, as of JAWS 9.0.354 or so at least, is a #32770 dialog page owned by JFW. +; I don't want a FindWindow call here for performance reasons; keep this up to date with respect to the structure of the Startup Wizard dialog. [DGL, 2007-10-05] +let hwnd = getFirstChild(getTopLevelWindow(hwnd)) +if getOwningAppName(hwnd) == "jfw." then + return True +endIf +return False +*/ +endFunction + +script SpeakBrailleStudyCharacterInfo() +if IsBSMCapableBrlDisplay() then + SALModeButton(GetLastBrailleRoutingKey (),sal_SayCharacter) +EndIf +EndScript + +script SpeakBrailleStudyWordInfo(int index) +if IsBSMCapableBrlDisplay() +&& index then + SALModeButton(GetNavRowCellOffset(index),sal_SpellWord) +elif IsBSMCapableBrlDisplay() + SALModeButton (GetLastBrailleRoutingKey (), sal_SpellWord) +EndIf +EndScript + +int function IsToolbarWindow(handle hWnd) +return GetWindowClass(hWnd) == cWc_Toolbar + || GetWindowSubtypeCode(hWnd) == wt_toolbar + || GetObjectSubtypeCode() == wt_Toolbar +EndFunction + +string function GetSingleBitControlAttributeString(int attribute) +var + int i, + int count +let count = StringSegmentCount(csList_SingleBitControlAttributes,cscListSeparator) +let i = 0 +while i < count +&& 1<0 +|| GetWindowClass(GetFocus())==cwc_NetUIHwnd then + return +endIf +let sList = GetWordList(LIST_ITEM_SEPARATOR,TRUE) +if sList == cscNULL then + return +endIf +;Do not sort, the list will be sorted by highest occurrance first and then in alphabetical order. +let nIndex = DlgSelectItemInList(sList, WordListDlgTitle, FALSE, 1,WordListCustomButtons,iButton) +if nIndex==0 then + return +endIf +let sWord = StringSegment (sList, LIST_ITEM_SEPARATOR, nIndex) +; strip off the occurrence count, if any +let nOccurrenceIndex = stringContains(sWord,cscSpace) +if nOccurrenceIndex then + let sWord = stringLeft(sWord,nOccurrenceIndex-1) +endIf +let GlobalCurrentWordFromList = sWord +pause() +if iButton == dlgSelectItemInList_ID_OK then + if FindString (GetFocus(), sWord, s_NEXT, S_RESTRICTED,TRUE) then + sayLine() + endIf +elif iButton == dlgSelectItemInList_ID_Custom1 then + PresentAllOccurrences(sWord, Occurrence_Sentence) +EndIf +endScript + +script PresentAllOccurrencesOfWord() +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +EnsureNoUserBufferActive(false) +if !GlobalCurrentWordFromList then + PerformScript WordList() +else + ;if the user has changed documents, PresentAllOccurrences may not find the desired word in the new document: + if !PresentAllOccurrences(GlobalCurrentWordFromList,Occurrence_Sentence) then + PerformScript WordList() + EndIf +EndIf +EndScript + +int function UsesUnderlyingDom() +return StringContains(GetActiveCursorName(),cscFSDomCursorName) +EndFunction + +int function IsRibbonControl(handle hWnd) +var + handle hTemp +let hTemp = hWnd +while hTemp + if GetWindowClass(hTemp) == cwc_UIRibbonCommandBar then + return true + EndIf + let hTemp = GetParent(hTemp) +endWhile +return false +EndFunction + +int function GetNonVirtualRibbonState() +var + int iState, + string sTab, + string sGroup, + string sDesc +GetRibbonStatus(iState,sTab,sGroup,sDesc) +return iState +endFunction + +int function RibbonsActive() +var + int iState, + string sTab, + string sGroup, + string sDesc +if UserBufferIsActive() + return Ribbons_Inactive +endIf +GetRibbonStatus(iState,sTab,sGroup,sDesc) +if iState +&& IsVirtualRibbonActive() then + ;when virtual ribbons are active, GetRibbonStatus + ;cannot be used to determine if the cursor is on the lower ribbon: + if GetObjectSubtypecode() == wt_menuBar then + return RibbonTabs_Active + else + return LowerRibbon_Active + EndIf +EndIf +return iState +EndFunction + +int function InRibbons() +return RibbonsActive() != Ribbons_Inactive +EndFunction +void function SpeakRibbonStatus(int bIncludeInactiveState) +if !bIncludeInactiveState && GlobalRibbonState == Ribbons_Inactive then + return +EndIf +Say(StringSegment(RibbonMessages,cscListSeparator,GlobalRibbonState+1),ot_control_type) +EndFunction + +Script SkypeRepeatLastCallInfo () +SayLastCallInfo () +EndScript + +string Function getTermForResearchIt () +var + collection here +let here = new collection +;Basic demonstration of how collections work within JAWS. +;This is of course a bit simplistic and the uses are far more wide-ranging than here, but at least the basic idea gets conveyed. +;final note on collections in general - there is no arraycopy or collectioncopy so if you pass it around, it's byref / the address to the original. +;You'd need to for / forEach through it and independently make your own copy if that's what you want, +; but could be memory-intensive. +;this is really simplistic collection. +;We never want selected text anywhere if the JAWS or invisible cursor is active: +if ! isJAWSCursor () && ! isInvisibleCursor () then + let here.selectedText = stringTrimLeadingBlanks (stringTrimTrailingBlanks (getSelectedText ())) +endIf +let here.word = stringTrimTrailingBlanks (getWord ()) +let here.window = getFocus () +let here.class = getWindowClass (here.window) +let here.type = getWindowSubtypeCode (here.window) +if ! here.type then + let here.type = getObjectSubtypeCode(SOURCE_CACHED_DATA) +endIf +let here.isMultiline = (here.type == wt_MULTILINE_EDIT + || getWindowStyleBits (here.window) & ES_MULTILINE + ;|| stringContains (getActiveCursorName (), cscFSDomCursorName); FSDom can run in single-line edit controls + || here.class == cwc_Word_Document || here.class == cwc_Word_Document2 || here.class == cwc_WordPerfect_Document +); +let here.AcceptsSelection = isVirtualPcCursor () || (isPcCursor () && here.isMultiline) +if here.AcceptsSelection then + if here.selectedText then + return here.selectedText + else + return here.word + endIf +elIf ! here.selectedText && (here.type == WT_EDIT || here.type == WT_READONLYEDIT || stringContains (here.class, "edit")) then + return here.word +elIf !isPcCursor () then + return here.word +else + return cscNull +endIf +;not necessary for a local script call but invaluable if the collection has been passed around. +;The last pointer that drops the collection causes internal garbage collection, aka no scrubbing needed by you +;Obviously since collections / arrays are done byref only dereference when you or whoever's using your collection doesn't need it anymore. +let here = null();variant nothing = dump it +endFunction + +Script ResearchIt () +performScript ResearchItByEnteringTerm () +endScript + +Script ResearchItByEnteringTerm () +var + string strTerm +let strTerm = getTermForResearchIt () +;Use to run term lookup using LRL_Dialog +if inHjDialog () then + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return; +endIf +RunLookupModuleQueryUsingLRL_Dialog (strTerm) +endScript + +script ResearchItDefaultLookup () +var + string sQuery +if InHJDialog () then +; Failure to do this will cause all HJ Dialogs to no longer work until you restart JAWS. + SayFormattedMessage (OT_error, cMSG337_L, cMSG337_S) + return +endIf +if isPCCursor () || isVirtualPcCursor () then + ;because there may be selection, but User wants to use the JAWSCursor to query + ;something other than Selection. + let sQuery = stringTrimLeadingBlanks (stringTrimTrailingBlanks (getSelectedText ())) +endIf +if StringIsBlank (sQuery) then + let sQuery = getWord () +endIf +;Optionally, user may use below function and pass module and rule set parameters - params 2 and 3. +;With only the query param filled in, the primary lookup module is used. +if isJAWSCursor () || isInvisibleCursor () then + PcCursor () +endIf +RunLookupModuleQuery (sQuery) +endScript + +script ResearchItUsingPrimaryLocation () +performScript ResearchItDefaultLookup () +endScript + +Script UtilityDebugResearchItRuleSet () +if InHomeRowMode () then + performScript HomeRowToggle () +endIf +DebugLookupModuleQueryUsingLRL_Dialog () +endScript + +script UtilityDomainSpecificConfiguration () +ShowUtilityDomainSpecificConfigurationInfo () +endScript + +int Function ValidateZipCodeData (string byRef strZipCode, int bPromptForever) +var + int iChoice, ; for messageBog + int bUpdateZip +let bUpdateZip = StringIsBlank (strZipCode) +if ! bUpdateZip then + ;Validate string as valid zip + ;not sure if Weather supports international zips and / or if strlen is longer than American zip +endIf +if bUpdateZip then + let GlobalWasHjDialog = FALSE + if ! inputBox (cwn_ZIPCODE_INPUT_PROMPT, cwn_ZIPCODE_INPUT_TITLE, strZipCode) then + return 0 + endIf + if stringIsBlank (strZipCode) then + return 0 + endIf + let GlobalWasHjDialog = TRUE + let strZipCode = stringTrimTrailingBlanks (StringTrimLeadingBlanks (strZipCode)) + let iChoice = ExMessageBox (formatString (cwn_ZIPCODE_UPDATE_LOCATION_PROMPT, strZipCode), cwn_ZIPCODE_UPDATE_LOCATION_TITLE, MB_YESNOCANCEL|MB_DEFBUTTON1 ) + while (bPromptForever &&iChoice != IDYES && iChoice != IDCANCEL) + let GlobalWasHjDialog = FALSE + if ! inputBox (cwn_ZIPCODE_INPUT_PROMPT, cwn_ZIPCODE_INPUT_TITLE, strZipCode) then + return 0 + endIf + if stringIsBlank (strZipCode) then + return 0 + endIf + let GlobalWasHjDialog = TRUE + let strZipCode = stringTrimTrailingBlanks (StringTrimLeadingBlanks (strZipCode)) + let iChoice = ExMessageBox (formatString (cwn_ZIPCODE_UPDATE_LOCATION_PROMPT, strZipCode), cwn_ZIPCODE_UPDATE_LOCATION_TITLE, MB_YESNOCANCEL|MB_DEFBUTTON1 ) + endWhile + if iChoice == IDYES then + iniWriteString (SECTION_LOCATION, HKEY_ZIPCODE, strZipCode, FILE_MY_LOCATION) + endIf +endIf +let strZipCode = stringTrimTrailingBlanks (StringTrimLeadingBlanks (strZipCode)) +return ! StringIsBlank (strZipCode) ;&& StringLength (strZipCode) > 4 +endFunction + +Script WeatherWidget () +;A useful example of combining both scripts and Resource Lookup Rule Sets: +var + string strWeatherResource, + string strRuleFile, + string strZipCode +let strZipCode = iniReadString (SECTION_LOCATION, HKEY_ZIPCODE, cscNull, FILE_MY_LOCATION) +if ! ValidateZipCodeData (strZipCode, FALSE) then + return; +endIf +let strWeatherResource = csfsWeatherRule +RunLookupModuleQuery (strZipCode, strWeatherResource) +endScript + +Script WeatherWidgetClearLocationInfo () +var + int iChoice +if iniRemoveKey (SECTION_LOCATION, HKEY_ZIPCODE, FILE_MY_LOCATION) then + let iChoice = ExMessageBox (cwnClearWeatherWidgetDlgStatic, cwnClearWeatherWidgetDlgTitle, MB_YESNOCANCEL|MB_DEFBUTTON1 ) +else + ;let iChoice = ExMessageBox (cwnClearWeatherWidgetDlgStatic, cwnClearWeatherWidgetDlgTitle, MB_YESNOCANCEL|MB_DEFBUTTON1 ) + let iChoice = IDYES +endIf +if iChoice == IDYES then + ValidateZipCodeData (cscNull, TRUE);forced validate. +endIf +endScript + +int function IsKeyboardLayoutChanging() +return gbKeyboardLayoutChange == true +EndFunction + +int function IsMacToolTipWindow (handle window) +var + handle hNull, + handle RealWindow, + handle FirstChild, + int FirstChildControlId +let RealWindow = GetRealWindow (window) +if ( + ( cWc_dlg32770 == GetWindowClass (RealWindow) ) + && ( cscNull == GetWindowName (RealWindow) ) + ) +then + let FirstChild = GetFirstChild (RealWindow) + if ( hNull == GetNextWindow (FirstChild) ) + then + let FirstChildControlId = GetControlID (FirstChild) + if ( 7155 == FirstChildControlId ) + then + return True + endIf + endIf +endIf +return False +EndFunction + +int function ContractedBrailleInputAllowedNow() +;Called by internal code to give the scripts an opportunity to disallow Contracted Braille Input +;Override to return FALSE for example if in MSWord's quick navigation mode etc. +;Note if internal code already determines that it is not possible to support Contracted Braille Input in this context, +;this function won't be called. +return ContractedBrailleInputAllowedNow() ; from Braille.jss +endFunction + +void function ContractedBrailleInputModeChanged(int bEntering) +; This event function is fired when the user either begins to input Contracted Braille or when the current edit has just +;been committed. +;bEntering is TRUE if the edit has just begun, FALSE if the edit was just committed. +endFunction + +void function SetKeyboardLock(int LockStatus) +let gbLockedKeyboard = LockStatus +if LockStatus then + SayMessage(ot_status, cmsgLockedKeyboard_L, cmsgLockedKeyboard_S) + let gbLockedSavedActiveFollowsBraille = GetJcfOption (OPT_BRL_MOVE_ACTIVE_CURSOR) + SetJcfOption (OPT_BRL_MOVE_ACTIVE_CURSOR,0) + AddHook (HK_SCRIPT, "LockedKeyboardHook") +else + SayMessage(ot_status, cmsgUnlockedKeyboard_L, cmsgUnlockedKeyboard_S) + SetJcfOption (OPT_BRL_MOVE_ACTIVE_CURSOR,gbLockedSavedActiveFollowsBraille) + RemoveHook (HK_SCRIPT, "LockedKeyboardHook") + BrailleRefresh() +EndIf +TrapKeys(LockStatus) +EndFunction + +Script LockKeyboard() +SetKeyboardLock(true) +EndScript + +void Function LockedKeyboardHook(string ScriptName, string FrameName) +var + string sKey +;if any keyboard lock notification was scheduled as a result of KeyPressedEvent, then cancel it: +if giScheduleNotifyLockedKeyboard then + UnScheduleFunction(giScheduleNotifyLockedKeyboard) + let giScheduleNotifyLockedKeyboard = 0 +EndIf +if giScheduledSayLockedKeyboardHelp then + UnScheduleFunction(giScheduledSayLockedKeyboardHelp) + let giScheduledSayLockedKeyboardHelp = 0 +EndIf +if StringCompare(ScriptName,"LockKeyboard") == 0 then + SetKeyboardLock(false) + return false +elif StringCompare(ScriptName,"BrailleRouting") == 0 then + if BrailleIsMessageBeingShown() then + brailleClearMessage() + return true + EndIf +elif StringContains(lockedKeyboardPassThroughScripts, scriptNameDelimiter+ScriptName+scriptNameDelimiter) then + return true +elif IsInvisibleCursor() +&& StringContains(lockedKeyboardPassThroughNavScripts, scriptNameDelimiter+ScriptName+scriptNameDelimiter) then + return true +elif StringContains(LockKeyboardReleaseAndRunScripts, scriptNameDelimiter+ScriptName+scriptNameDelimiter) then + SetKeyboardLock(false) + return true +endIf +NotifyLockedKeyboard() +return false +EndFunction + +void function SayLockedKeyboardHelp() +let giScheduledSayLockedKeyboardHelp = 0 +SayFormattedMessage(ot_help, cmsgLockedKeyboardHelp_L, cmsgLockedKeyboardHelp_S) +EndFunction + +void function NotifyLockedKeyboard() +let giScheduleNotifyLockedKeyboard = 0 +SayMessage(ot_error, cmsgLockedKeyboard_L, cmsgLockedKeyboard_S) +if giScheduledSayLockedKeyboardHelp then + UnScheduleFunction(giScheduledSayLockedKeyboardHelp) +EndIf +let giScheduledSayLockedKeyboardHelp = ScheduleFunction("SayLockedKeyboardHelp",7) +EndFunction + +int function IsVirtualRibbonActive() +if GetJCFOption(OPT_VIRTUAL_RIBBON_SUPPORT)==0 then + return false +endIf +if getActiveCursorName()==cscVirtualRibbonPCCursor then + return true +endIf +return false +endFunction + +int function FlagChangedState(int Source, int Target, int Flag, int ByRef ChangedState) +if (Source&Flag) == (Target&Flag) then + return false +EndIf +let ChangedState = (Target&Flag)>0 +return true +EndFunction + +string function GetDetailedFontChangesInfo(collection cFont) +var + int iInfo, + int iChangedState, + string sInfo, + string sDetails +if cFont.flags & IndicateFontName then + let sInfo = GetCharacterFont() + if cFont.name != sInfo then + let sDetails = sInfo+cscSpace + EndIf +EndIf +if cFont.flags & IndicateFontSize then + let iInfo = GetCharacterPoints() + if cFont.points != iInfo + let sInfo = FormatString(cmsgFontPoints,IntToString(iInfo)) + let sDetails = sDetails+sInfo+cscSpace + EndIf +EndIf +if cFont.flags & IndicateTextAttributes then + let iInfo = GetCharacterAttributes() + if cFont.attrib != iInfo then + let sInfo = cscNull + if FlagChangedState(cFont.attrib, iInfo, attrib_bold, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsg139_L) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsg139_L) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_italic, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsg140_L) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsg140_L) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_underline, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsg141_L) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsg141_L) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_strikeout, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsg143_L) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsg143_L) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_lrm_arabic, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_LRM_Arabic) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_LRM_Arabic) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_rtl_text, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_RTL_Text) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_RTL_Text) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_double_strikeout, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Double_Strikeout) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Double_Strikeout) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_superscript, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Superscript) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Superscript) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_subscript, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Subscript) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Subscript) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_shadow, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Shadow) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Shadow) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_outline, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Outline) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Outline) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_extended, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Extended) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Extended) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_emboss, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Emboss) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Emboss) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_engrave, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Engrave) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Engrave) + +cscSpace + EndIf + EndIf + if FlagChangedState(cFont.attrib, iInfo, attrib_smallcaps, iChangedState) then + if iChangedState == On then + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_On,cmsgFont_Smallcaps) + +cscSpace + else + let sInfo = sInfo+ + FormatString(cmsgFontAttrib_Off,cmsgFont_Smallcaps) + +cscSpace + EndIf + EndIf + if sInfo then + let sDetails = sDetails+sInfo + EndIf + EndIf +EndIf +if cFont.flags & IndicateColorChanges then + let iInfo = GetColorText() + if cFont.color != iInfo then + let sInfo = GetColorName(iInfo) + let sDetails = sDetails+sInfo+cscSpace + EndIf + let iInfo = GetColorBackground() + if cFont.background != iInfo then + let sInfo = GetColorName(iInfo) + let sDetails = sDetails+sInfo+cscSpace + EndIf +EndIf +return StringTrimTrailingBlanks(sDetails) +EndFunction + +void function IndicateInconsistency(int nType, string sChars, int nOffset, optional collection cPrevFont) +var + string msgShort, + string msgLong, + int nOldPuncLevel +if nType==MismatchedSymbolPairUnopened then + let msgLong=cmsgMismatchedSymbolPairUnopened_L + let msgShort=cmsgMismatchedSymbolPairUnopened_S +elif nType==MismatchedSymbolPairUnclosed then + let msgLong=cmsgMismatchedSymbolPairUnclosed_L + let msgShort=cmsgMismatchedSymbolPairUnclosed_S +elif nType==StrayPunctuationSymbol then + let msgLong=cmsgStrayPunctuationSymbol_L + let msgShort=cmsgStrayPunctuationSymbol_S +elif nType==UnspacedPunctuationSymbol then + let msgLong=cmsgUnspacedPunctuationSymbol_L + let msgShort=cmsgUnspacedPunctuationSymbol_S +elif nType==WhitespaceRun then + let msgLong=cmsgWhitespaceRun_L + let msgShort=cmsgWhitespaceRun_S +elif nType==FontChange then + if CollectionItemExists(cPrevFont,"flags") then + SayFormattedMessageWithVoice(VCTX_MESSAGE, OT_no_disable, + FormatString(cmsgFontChangeDetails, GetDetailedFontChangesInfo(cPrevFont))) + SayWord() + return + else ;just report it changed, without any details: + let msgLong=cmsgFontChange_L + let msgShort=cmsgFontChange_S + EndIf +elif nType==MissingInitialCapital then + let msgLong=cmsgMissingInitialCapital_L + let msgShort=cmsgMissingInitialCapital_S +elif nType==InvertedCaps then + let msgLong=cmsgInvertedCaps_L + let msgShort=cmsgInvertedCaps_S +endIf +; Change punctuation level so that symbols are actually spoken. +let nOldPuncLevel=getJCFOption(opt_punctuation) +setJCFOption(opt_punctuation,3) +SayFormattedMessageWithVoice(VCTX_MESSAGE, OT_no_disable, formatString(msgLong, sChars,intToString(nOffset+1)), formatString(msgShort, sChars,intToString(nOffset+1))) +;Restore the punctuation level to what it was before. +setJCFOption(opt_punctuation, nOldPuncLevel) +endFunction + +void function IndicateInconsistenciesInRange(int nRange) +var + int nCount=0, + int nFlags=0xffff, + int nPairedSymbolCategories=0xff, + int nIdx=0, + int nType=0, + string sChars, + int nOffset=0, + int nOpt=0 +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +let nOpt=GetJCFOption(OPT_TEXT_ANALYSER) +if nOpt==TextAnalyserOff then + return +endIf +let nFlags=GetJCFOption(OPT_TEXT_ANALYSER_TYPE_FLAGS) +let nPairedSymbolCategories=GetJCFOption(OPT_TEXT_ANALYSER_SYMBOL_FLAGS) +let nCount=GetRangeInconsistencyCount(nRange,nFlags,nPairedSymbolCategories) +if nCount==0 then + return +endIf +if nOpt==TextAnalyserIndicateWithSound then + PlaySound(GetSoundFileLocation("InconsistencyBuzzer.wav")) + return +endIf +if nOpt==TextAnalyserSpeakCount then + SayFormattedMessageWithVoice(VCTX_MESSAGE, OT_no_disable, formatString(cmsgInconsistencyCount, intToString(nCount))) + return +endIf +;must be TextAnalyserDescribeAllInconsistencies=3, +for nIdx=0 to nCount-1 + if GetRangeInconsistencyByIndex(nRange, nIdx, nFlags, nPairedSymbolCategories, nType, sChars, nOffset) then + IndicateInconsistency(nType, sChars, nOffset) + endIf +endFor +endFunction + +script IndicateInconsistenciesForLine() +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +indicateInconsistenciesInRange(CheckLine) +endScript + +script IndicateInconsistenciesForSentence() +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +indicateInconsistenciesInRange(CheckSentence) +endScript + +script IndicateInconsistenciesForParagraph() +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +indicateInconsistenciesInRange(CheckParagraph) +endScript + +collection function GetCurrentFontData(int nFlags) +var + collection cFont +let cFont = new collection +if nFlags & IndicateFontChanges then + ;make sure all font changes are flagged in the collection: + let cFont.flags = IndicateFontName|IndicateFontSize|IndicateTextAttributes|IndicateColorChanges +else + let cFont.flags = nFlags +EndIf +if nFlags & IndicateFontName then + let cFont.name = GetCharacterFont() +EndIf +if nFlags & IndicateFontSize then + let cFont.points = GetCharacterPoints() +EndIf +if nFlags & IndicateTextAttributes then + let cFont.attrib = GetCharacterAttributes() +EndIf +if nFlags & IndicateColorChanges then + let cFont.color = GetColorText() + let cFont.background = GetColorBackground() +EndIf +return cFont +EndFunction + +script MoveToNextInconsistency() +var + int iSavedOption, + int nFlags=0xffff, + int nPairedSymbolCategories=0xff, + int nType=0, + string sChars, + int nOffset=0, + collection cFont +If !(GetRunningFSProducts() & product_JAWS) then + return +EndIf +;if off, turn it on temporarily. +let iSavedOption=getJCFOption(OPT_TEXT_ANALYSER) +if !iSavedOption then + setJCFOption(OPT_TEXT_ANALYSER,TextAnalyserDescribeAllInconsistencies) +endIf +let nFlags = GetJCFOption(OPT_TEXT_ANALYSER_TYPE_FLAGS) +let nPairedSymbolCategories=GetJCFOption(OPT_TEXT_ANALYSER_SYMBOL_FLAGS) +if nFlags & IndicateFontChanges +|| nFlags & (IndicateFontName|IndicateFontSize|IndicateTextAttributes|IndicateColorChanges) then + let cFont = GetCurrentFontData(nFlags) +endIf +;Check inconsistency by paragraph to ensure we properly match paired symbols. +if MoveToRangeInconsistency(CheckParagraph,s_next,nFlags, nPairedSymbolCategories, nType, sChars, nOffset) then + if nType == FontChange + && (nFlags & IndicateFontChanges + || nFlags & (IndicateFontName|IndicateFontSize|IndicateTextAttributes|IndicateColorChanges)) then + IndicateInconsistency(nType, sChars, nOffset, cFont) + else + IndicateInconsistency(nType, sChars, nOffset) + EndIf +else + SayMessage(OT_ERROR, cmsgNoNextInconsistency_L, cmsgNoNextInconsistency_S) +endIf +if iSavedOption 0) && ((iBottom - iTop) > 0) + If (!bValidRect) + ; Use the app main window if the real window is not valid. + bValidRect = GetWindowRect (hApp, iLeft, iRight, iTop, iBottom) && ((iRight - iLeft) > 0) && ((iBottom - iTop) > 0) + EndIf + If bValidRect + ; Only OCR if the rect has non-zero width and height. + GlobalOCRJobID = OCRScreenArea (iLeft, iTop, iRight, iBottom, iPrimary, iSecondary, useMicrosoftOcr, microsoftOcrLanguage) + SayScreenOcrStarted(useMicrosoftOcr) + Return + EndIf + SayMessage (OT_JAWS_MESSAGE, MSG_OCRNoWindow_L, MSG_OCRNoWindow_S) +Else + SayFormattedMessage (OT_JAWS_MESSAGE, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) +EndIf +EndScript + +Script RecognizeControl () +var + Handle hCurrent = GetCurrentWindow (), + Int iLeft, + Int iRight, + Int iBottom, + Int iTop, + Int iPrimary = ReadSettingInteger (section_OCR, hKey_PrimaryRecognitionLanguage, 1033, FT_DEFAULT_JCF), + Int iSecondary = ReadSettingInteger (section_OCR, hKey_SecondaryRecognitionLanguage, 1033, FT_DEFAULT_JCF), + Int useMicrosoftOcr = ReadSettingInteger (section_OCR, hKey_UseMicrosoftRecognitionLanguageForScreenArea, 0, FT_CURRENT_JCF), + Int microsoftOcrLanguage = ReadSettingInteger (section_OCR, hKey_MicrosoftRecognitionLanguage, 1033, FT_CURRENT_JCF), + Int iCanRecognize +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_OCR_Unavailable_Screen_Shade) + return +endIf +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf +Let iCanRecognize = CanRecognize () +If iCanRecognize == OCR_NOT_SUPPORTED + Return +EndIf +If iCanRecognize == OCR_SUCCESS + + If GetWindowRect (hCurrent, iLeft, iRight, iTop, iBottom) + GlobalOCRJobID = OCRScreenArea (iLeft, iTop, iRight, iBottom, iPrimary, iSecondary, useMicrosoftOcr, microsoftOcrLanguage) + SayScreenOcrStarted(useMicrosoftOcr) + Return + EndIf +Else + SayFormattedMessage (OT_JAWS_MESSAGE, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) +EndIf +EndScript + +Script RecognizeScreen () +var + Int iRight = ScreenGetWidth (), + Int iBottom = ScreenGetHeight (), + Int iPrimary = ReadSettingInteger (section_OCR, hKey_PrimaryRecognitionLanguage, 1033, FT_DEFAULT_JCF), + Int iSecondary = ReadSettingInteger (section_OCR, hKey_SecondaryRecognitionLanguage, 1033, FT_DEFAULT_JCF), + Int useMicrosoftOcr = ReadSettingInteger (section_OCR, hKey_UseMicrosoftRecognitionLanguageForScreenArea, 0, FT_CURRENT_JCF), + Int microsoftOcrLanguage = ReadSettingInteger (section_OCR, hKey_MicrosoftRecognitionLanguage, 1033, FT_CURRENT_JCF), + Int iCanRecognize +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_OCR_Unavailable_Screen_Shade) + return +endIf +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf +Let iCanRecognize = CanRecognize () +If iCanRecognize == OCR_NOT_SUPPORTED + Return +EndIf +If iCanRecognize == OCR_SUCCESS + GlobalOCRJobID = OCRScreenArea (0, 0, iRight, iBottom, iPrimary, iSecondary, useMicrosoftOcr, microsoftOcrLanguage) + gbRecognizingScreenAreaa = TRUE ; so proper unrestricted state can be set for JAWSCursor + SayScreenOcrStarted(useMicrosoftOcr) + Return +Else + SayFormattedMessage (OT_JAWS_MESSAGE, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) +EndIf +EndScript + +Script RecognizeCamera () +var + Int iCanRecognize, + Int recognitionResult +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +If GlobalOCRJobID + if OCR_Camera_MotionDetect == GlobalOCRJobType then + CancelOCR (GlobalOCRJobID) + GlobalOCRJobID = 0 + else + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Endif + Return +EndIf +Let iCanRecognize = CanRecognize () +If iCanRecognize == OCR_NOT_SUPPORTED + Return +EndIf +If iCanRecognize == OCR_SUCCESS + recognitionResult = OCRCamera () + if recognitionResult == OCRResult_NoDevicesAvailable then + SayFormattedMessage (OT_ERROR, msg_OCR_NoDevicesAvailable) + elif recognitionResult != OCRResult_Success then + SayFormattedMessage (OT_ERROR, MSG_OCR_PDF_FAILED_TO_Start) + EndIf + Return +Else + SayFormattedMessage (OT_JAWS_MESSAGE, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) +EndIf +EndScript + +Script CancelRecognition () +var + Int iCanRecognize +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsBackgroundOCREnabled() + PerformScript StopBackgroundRecognition() + return +endIf +If Not GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRCanNotCancel_L, MSG_OCRCanNotCancel_S) + Return +EndIf +Let iCanRecognize = CanRecognize () +If iCanRecognize == OCR_NOT_SUPPORTED + Return +EndIf +If iCanRecognize == OCR_SUCCESS +CancelOCR (GlobalOCRJobID) + SayMessage (OT_JAWS_MESSAGE, MSG_OCRCancelled_L, MSG_OCRCancelled_S) +Else + SayFormattedMessage (OT_JAWS_MESSAGE, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) +EndIf +GlobalOCRJobID = 0 +CancelLayeredKeySequence () +EndScript + +script OCRLayerHelp() +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgOCRLayerHelpScreenTitle) +UserBufferAddTextResultsViewer(cmsgOCRLayerHelp) +EndScript + +int Function JAWSFindActive() +return InJAWSFind || (JAWSFindComplete!=0 && GetTickCount()-JAWSFindComplete < 500) +endFunction + +int function ShouldInvalidateOCRDataOnPCCursor() +if JAWSFindActive() then + return false ; Do not invalidate if the JAWS Find dialog is active +else + return (TRUE) +endIf +endFunction + +Int Function ShouldInvalidateOCRDataOnFocusChange () +if JAWSFindActive() then + return false ; Do not invalidate if the JAWS Find dialog is active +else + return (TRUE) +endIf +EndFunction + +; End of OCR section. + +;Activate Search Edit Box stub for QuickSettings: + +Script ActivateSearchBox () +SayCurrentScriptKeyLabel () +TypeCurrentScriptKey () +endScript + +script TableLayerHelp() +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgTableLayerHelpScreenTitle) +UserBufferAddTextResultsViewer(cmsgTableLayerHelp) +EndScript +string function ConvertTextToLinesWithHTMLLineBreak(string text) +return StringReplaceSubstrings (text,"\n","
")+"
" +EndFunction + +string function MarkupLayerHelpSectionTextAsHeading(string sText) +return "

"+sText+"

" +endFunction + +string function GetBasicLayerHelpTextGeneral() +var + string sHeading, + string sMsg +sHeading = MarkupLayerHelpSectionTextAsHeading(cmsgBasicLayerHelpScreen_Heading_General) +if !IsWindows10() + sMsg = ConvertTextToLinesWithHTMLLineBreak(cmsgBasicLayerHelpScreen_General_Win7) +else + sMsg = ConvertTextToLinesWithHTMLLineBreak(cmsgBasicLayerHelpScreen_General_Win10) +endIf +return sHeading+"
"+sMsg+"
" +EndFunction + +string function GetBasicLayerHelpTextEditor() +var + string sHeading, + string sMsg +sHeading = MarkupLayerHelpSectionTextAsHeading(cmsgBasicLayerHelpScreen_Heading_Editor) +sMsg = ConvertTextToLinesWithHTMLLineBreak(cmsgBasicLayerHelpScreen_Editor) +return sHeading+"
"+sMsg+"
" +EndFunction + +string function GetBasicLayerHelpTextMessaging() +var + string sHeading, + string sMsg +sHeading = MarkupLayerHelpSectionTextAsHeading(cmsgBasicLayerHelpScreen_Heading_Messaging) +sMsg = ConvertTextToLinesWithHTMLLineBreak(cmsgBasicLayerHelpScreen_Messaging) +return sHeading+"
"+sMsg+"
" +EndFunction + +string function GetBasicLayerHelpTextSecondaryLayer() +var + string sHeading, + string sMsg +sHeading = MarkupLayerHelpSectionTextAsHeading(cmsgBasicLayerHelpScreen_Heading_SecondaryLayer) +sMsg = cmsgBasicLayerHelpScreen_SecondaryLayer +if stringCompare (getActiveConfiguration (), "Skype") == 0 then +; add the Skype layer only when the application has focus: + sMsg = sMsg+cscBufferNewLine+cmsgBasicLayerHelpScreen_SecondaryLayerSkype +elIf stringCompare (getActiveConfiguration (true), "Google Docs") == 0 then + ; add the Google Docs Quick Key layer only when Google Docs has focus: + sMsg = sMsg+cscBufferNewLine+cmsgBasicLayerHelpScreen_SecondaryLayerGoogleDocsQuickKeys +endIf +sMsg = ConvertTextToLinesWithHTMLLineBreak(sMsg) +return sHeading+"
"+sMsg+"
" +EndFunction + +int function ShouldAddBasicLayerHelpTextBrowser() +;return true in applications where the basic layer key features for browsers are supported. +return false +EndFunction + +string function GetBasicLayerHelpTextBrowser() +if !ShouldAddBasicLayerHelpTextBrowser() return cscNull endIf +var + string sHeading, + string sMsg +sHeading = MarkupLayerHelpSectionTextAsHeading(cmsgBasicLayerHelpScreen_Heading_Browser) +sMsg = ConvertTextToLinesWithHTMLLineBreak(cmsgBasicLayerHelpScreen_Browser) +return sHeading+"
"+sMsg+"
" +EndFunction + +string function GetBasicLayerHelpScreenText() +;You can overwrite this function to rearrange, add or remove groups of messages which appear in the basic layer help screen. +;note that GetBasicLayerHelpTextBrowser will return null except in web browsers where the features are supported. +return GetBasicLayerHelpTextBrowser() + +GetBasicLayerHelpTextGeneral() + +GetBasicLayerHelpTextEditor() + +GetBasicLayerHelpTextMessaging() + +GetBasicLayerHelpTextSecondaryLayer() +EndFunction + +script BasicLayerHelp() +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgBasicLayerHelpScreenTitle) +UserBufferAddTextResultsViewer(GetBasicLayerHelpScreenText()) +EndScript + +Int Function TreeWithColumns () +var + handle currentWindow, + handle priorWindow + +let currentWindow = GetFocus() +if (StringCompare (GetWindowClass (currentWindow), cwc_SysTreeView32) != 0) then + return false; +EndIf + +let priorWindow = GetPriorWindow (currentWindow) +if (!priorWindow || StringCompare (GetWindowClass (priorWindow), cwc_SysHeader32) != 0) then + return false +EndIf + +return true +EndFunction + +int function DoJavaControlException(int iSubtype) +if iSubtype == WT_TABCONTROL +|| iSubtype == WT_UPDOWNSLIDER +|| iSubtype == WT_LEFTRIGHTSLIDER +|| iSubtype == WT_LEFTRIGHTSLIDER +|| iSubtype == WT_TREEVIEW +|| iSubtype == WT_TREEVIEWITEM then + return true +elif iSubtype == WT_EDIT then + if GetControlAttributes () & CTRL_SINGLELINE then + return true + endIf +elif MenusActive() then + return true +endIf +return false +EndFunction + +script DisplayMagicContextMenu() +MagSendKeyEvent(KI_SHOW_MAGIC_CONTEXT_MENU) +EndScript + +Script SayColumnFromCurrentPosition() +if UseDocumentServerReadingFunctionality() then + SetDocumentReadingStartLocation () + SayAll () + return +endIf +if IsFormsModeActive() then + SetDocumentReadingStartLocation () + SayAll () + return +endIf +MagSendKeyEvent(KI_READ_COLUMN_FROM_POSITION) +EndScript + +Script PopMagicWindow() +MagSendKeyEvent(KI_POP_MAGIC_WINDOW) +EndScript + +Script MagicToolbarShowHide () +MagSendKeyEvent(KI_POP_MAGIC_WINDOW) +endScript + +Script MAGicWindow() +if !MagSendKeyEvent(KI_POP_MAGIC_WINDOW) then + Say(mag017, OT_MESSAGE) +endif +EndScript + +script OverviewUnmagnifiedEnhancementsToggle() +var + int iResult +if !(GetRunningFSProducts() & product_MAGic) then + return +endIf +let iResult = MagSendKeyEvent(KI_OVERVIEW_UNMAG_ENH_TOGGLE) +; 0 = on, 1 = off: +if ! iResult then + Say(cmsgUnmagnifiedEnhancementsOn,ot_status) +else + Say(cmsgUnmagnifiedEnhancementsOff,ot_status) +endIf +EndScript + +Script OverviewUnmagnifiedMouseToggle () +var + int iResult +if !(GetRunningFSProducts() & product_MAGic) then + return +endIf +iResult = MagSendKeyEvent (KI_OVERVIEW_UNMAG_MOUSE_TOGGLE) +; 0 = on, 1 = off: +if ! iResult then + Say (cmsgUnmagnifiedMouseOn,ot_status) +else + Say (cmsgUnmagnifiedMouseOff,ot_status) +endIf +EndScript + +Script SpeechToggle() +if GetRunningFSProducts() != product_MAGic then + ;for JAWS, see MuteSynthesizer script + return +endIf +if !IsSpeechOff() then + ;Turning off. Speak state before turning off. + Say(cmsgSpeechOnDemand,ot_status) +endIf +MagSendKeyEvent (KI_SPEECH_TOGGLE) +if !IsSpeechOff() then + ;Turning on. Now that speech is on, speak state. + Say(cmsgFullSpeech,ot_status) +endIf +EndScript + +Script ProgressBarAnnouncement() +Say(ProgressBarAnnouncementToggle(false),ot_status) +EndScript + +Script ExitPanningMode() +;do nothing, here for the hook exit +EndScript + +Script PanUp () +if (IsSecureDesktop()) then + return +ENDIF +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + EnterPanningMode() + MagStartPanning(KI_PAN_UP) +else + Beep () +ENDIF +EndScript + +Script PanDown() +if (IsSecureDesktop()) then + return +ENDIF +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + EnterPanningMode() + MagStartPanning(KI_PAN_DOWN) +else + Beep () +ENDIF +EndScript + +Script PanLeft () +if (IsSecureDesktop()) then + return +ENDIF +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + EnterPanningMode() + MagStartPanning(KI_PAN_LEFT) +else + Beep () +ENDIF +EndScript + +Script PanRight () +if (IsSecureDesktop()) then + return +ENDIF +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + EnterPanningMode() + MagStartPanning(KI_PAN_RIGHT) +else + Beep () +ENDIF +EndScript + +Script PanLeftIncrement() +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + MagSendKeyEvent(KI_PAN_LEFT_INCREMENT) +else + Beep () +endIf +EndScript + +Script PanRightIncrement() +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + MagSendKeyEvent(KI_PAN_RIGHT_INCREMENT) +else + Beep () +endIf +EndScript + +Script PanUpIncrement() +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + MagSendKeyEvent(KI_PAN_UP_INCREMENT) +else + Beep () +endIf +EndScript + +Script PanDownIncrement() +;Mag levels are in hundreds: +if MagGetOption (MID_LEVEL) > 100 +&& MagGetOption(MID_ON) then + MagSendKeyEvent(KI_PAN_DOWN_INCREMENT) +else + Beep () +endIf +EndScript + +Script IncreaseSpeedDuringPanning () +;when not in panning mode, turn off forms mode +;for laptop keys, we don't ever want to do the FormsMode action here. +;These are real keys which the user may want to type into a form text box. +if ! StringContains (stringLower (getCurrentScriptKeyName ()), "numpad") then + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey() + return +endIf +If IsFormsModeActive() +|| IsVirtualPCCursor() then + TurnOffFormsMode() + SayMessage(ot_status, cMSG288_L, cMSG288_S) ; virtual pc cursor +else + SayCurrentScriptKeyLabel () + TypeCurrentScriptKey() +endIf +EndScript + +Script DecreaseSpeedDuringPanning () +TypeCurrentScriptKey() +SayCurrentScriptKeyLabel () +EndScript + +Script PanNextLine() +TypeCurrentScriptKey() +SayCurrentScriptKeyLabel () +EndScript + +Script MoveToBeginningOfCurrentLine () +MagSendKeyEvent(KI_GO_TO_HOME) +EndScript + +Script MoveToEndOfCurrentLine () +MagSendKeyEvent(KI_GO_TO_END) +EndScript + +Script MoveToTopOfScreen () +MagSendKeyEvent(KI_GO_TO_TOP) +EndScript + +Script MoveToBottomOfScreen () +MagSendKeyEvent(KI_GO_TO_BOTTOM) +EndScript + +Script MoveToBeginningOfNextLine () +MagSendKeyEvent(KI_GO_TO_HOME_NEXT_LINE) +EndScript + +Script MouseEnhancementToggle() +if MagSendKeyEvent(KI_CUSTOM_MOUSE_TOGGLE) == mske_toggle_on then + Say(cmsgCustomMouseOn,OT_STATUS) +else + Say(cmsgCustomMouseOff,OT_STATUS) +endif +EndScript + +Script SetMouseEcho() +var int iEcho = SetMouseEcho() +if iEcho == MouseEcho_Character + Say(cmsgMouseEchoCharacter,ot_status) + MagSendKeyEvent (KI_MOUSE_ECHO_CHARACTER) +ElIf iEcho == MouseEcho_Word + Say(cmsgMouseEchoWord,ot_status) + MagSendKeyEvent (KI_MOUSE_ECHO_WORD) +elif iEcho == MouseEcho_Line + Say(cmsgMouseEchoLine,ot_status) + MagSendKeyEvent (KI_MOUSE_ECHO_LINE) +elif iEcho == MouseEcho_Paragraph + Say(cmsgMouseEchoParagraph,ot_status) + MagSendKeyEvent (KI_MOUSE_ECHO_PARAGRAPH) +ElIf iEcho == MouseEcho_Off + Say(cmsgMouseEchoOff,ot_status) + MagSendKeyEvent (KI_MOUSE_ECHO_OFF) +EndIf +EndScript + +script ToggleMouseEchoFromLayer() +var int toggle = MouseEchoToggle() +if toggle == ScriptFunctionReturnError return endIf +if toggle == On + Say(cmsgMouseEchoLayerChoiceOn,ot_status) +else + Say(cmsgMouseEchoLayerChoiceOff,ot_status) +endIf +MagSendKeyEvent (KI_MOUSE_ECHO_TOGGLE) +EndScript + +script SetMouseEchoToCharacter() +if !SetMouseEchoToUnit(MouseSpeechUnit_Character) + beep() + return +endIf +Say(cmsgMouseEchoLayerChoiceCharacter,ot_status) +MagSendKeyEvent (KI_MOUSE_ECHO_CHARACTER) +EndScript + +script SetMouseEchoToWord() +if !SetMouseEchoToUnit(MouseSpeechUnit_Word) + beep() + return +endIf +Say(cmsgMouseEchoLayerChoiceWord,ot_status) +MagSendKeyEvent (KI_MOUSE_ECHO_WORD) +EndScript + +script SetMouseEchoToLine() +if !SetMouseEchoToUnit(MouseSpeechUnit_Line) + beep() + return +endIf +Say(cmsgMouseEchoLayerChoiceLine,ot_status) +MagSendKeyEvent (KI_MOUSE_ECHO_LINE) +EndScript + +script SetMouseEchoToParagraph() +if !SetMouseEchoToUnit(MouseSpeechUnit_Paragraph) + beep() + return +endIf +Say(cmsgMouseEchoLayerChoiceParagraph,ot_status) +MagSendKeyEvent (KI_MOUSE_ECHO_PARAGRAPH) +EndScript + +script EchoLayerHelp() +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgEchoLayerHelpScreenTitle) +UserBufferAddTextResultsViewer(cmsgEchoLayerHelp) +EndScript + +Script AutoSwitchToggle() +if MagSendKeyEvent(KI_AUTO_SWITCH) == mske_toggle_on then + Say(cmsgAutoSwitchOn,ot_status) +else + Say(cmsgAutoSwitchOff,ot_status) +EndIf +EndScript + +Script LineLockToggle() +if MagSendKeyEvent(KI_LINE_LOCK) == mske_toggle_on then + Say(cmsgLineLockOn,ot_status) +else + Say(cmsgLineLockOff,ot_status) +EndIf +EndScript + +Script MouseToFromDisplay() +MagSendKeyEvent (KI_MOUSE_TO_FROM_DISPLAY) +EndScript + +script MoveViewToCursor() +ResetSynth () +PCCursor () +MagSetFocusToPoint(GetCursorCol(),GetCursorRow()) +Say(cmsgCursorActive,ot_status) +EndScript + +script MoveViewToMouse() +ResetSynth () +JAWSCursor () +MagSetFocusToPoint(GetCursorCol(),GetCursorRow()) +PCCursor() +Say(cmsgMouseActive,ot_status) +EndScript + +Script QuickViewManager() +if QuickViewFramesUnsupported() then + return +EndIf +FrameSetOnWindow(GetWindowAtPoint(GetCursorCol(CURSOR_JAWS), GetCursorRow(CURSOR_JAWS))) +if GlobalFrameBottom != VALUE_NOT_READY +&& GlobalFrameRight != VALUE_NOT_READY then + FrameManagerRun(FRAMEVIEW_ShowActiveFrames) + ; reset GlobalVariables + FrameClearValues() +endIf +EndScript + +Script QuickViewFrameToggle() +if QuickViewFramesUnsupported() then + return +EndIf +if MagSendKeyEvent(KI_QUICKVIEW_TOGGLE) == mske_toggle_on then + Say(cmsgQuickViewFramesOn,ot_status) +else + Say(cmsgQuickViewFramesOff,ot_status) +EndIf +EndScript + +Script SmoothingToggle() +Var + Int ret, + String message +Let ret = MagSendKeyEvent(KI_SMOOTH_TOGGLE) +if IsWindows8 () then + if ret == ui_SmoothingNone then + message = cmsgSmoothingDisabled + else; could be 0 or 1, but 0 = HD not available in Windows 8: + message = cmsgSmoothingEnabled + endIf +else; classic / Windows 7 smoothing, where we respect 3 states. + If (ui_SmoothingHD == ret) then + message = cmsgSmoothingHD + ElIf (ui_SmoothingClassic == ret) then + message = cmsgSmoothingClassic + ElIf (ui_SmoothingNone == ret) then + message = cmsgSmoothingNone + EndIf +endIf +Say(message, ot_status) +EndScript + +void function SpeakMagLevelMessage () +Say(GetMagLevelMessage(giMagLevel),OT_STATUS) +endFunction + +Script IncreaseMagnification() +unScheduleFunction (giFN_SpeakMagLevelMessage) +if MagGetOption(MID_LEVEL) == MAG_MAX_LEVEL then + Beep() + Return +endIf +let giMagLevel = MagSendKeyEvent(KI_INCREASE_MAG_LEVEL) +giFN_SpeakMagLevelMessage = scheduleFunction ("SpeakMagLevelMessage", 1) +EndScript + +Script DecreaseMagnification() +unScheduleFunction (giFN_SpeakMagLevelMessage) +if MagGetOption(MID_LEVEL) == 100 then + Beep() + Return +endIf +let giMagLevel= MagSendKeyEvent(KI_DECREASE_MAG_LEVEL) +giFN_SpeakMagLevelMessage = scheduleFunction ("SpeakMagLevelMessage", 1) +EndScript + +Script VisualEnhancementToggle() +if MagSendKeyEvent(KI_MAGNIFY_TOGGLE) then + Say(cmsgVisualEnhancementsOn,OT_STATUS) + Say(GetMagLevelMessage(MagGetOption(MID_LEVEL)),OT_STATUS) +else + Say(cmsgVisualEnhancementsOff,OT_STATUS) +EndIf +EndScript + +Script VisualEnhancementsToggle() +PerformScript VisualEnhancementToggle () +EndScript + +Script MagLevelToggle() +let gbAnnounceNewMagLevel = true +MagSendKeyEvent(KI_MAG_LEVEL_TOGGLE) +EndScript + +Script OneXToggle () +let gbAnnounceNewMagLevel = true +MagSendKeyEvent(KI_MAG_LEVEL_TOGGLE) +EndScript + +Script ColorEnhancementToggle() +if MagSendKeyEvent(KI_CUSTOM_COLORS_TOGGLE) == mske_toggle_on then + say(cmsgCustomColorsOn,ot_status) +else + say(cmsgCustomColorsOff,ot_status) +EndIf +EndScript + +;Now named TrackingToggle: +Script TrackingToggle () +ToggleTracking () +EndScript + +Script DisplayLocator() +if MultiMonEnabled() then + SayMessage(ot_error,cmsgLocatorNotSupportedInMultiMonitorMode_L,cmsgNotSupportedInMultiMonitorMode_S) + return +EndIf +ToggleLocatorMode() +Say(cmsgLocatorsOn,OT_STATUS) +EndScript + +Script AcceptLocator() +ToggleLocatorMode() +EndScript + +Script CancelLocator() +var + int bOn +let bOn = MagGetOption(LOC_ON) +if bOn then + ToggleLocatorMode(1) + Say(cmsgLocatorsOff,OT_STATUS) +endif +EndScript + +Script LocatorUp() +MagSendKeyEvent(KI_LOCATOR_UP) +EndScript + +Script LocatorDown() +MagSendKeyEvent(KI_LOCATOR_DOWN) +EndScript + +Script LocatorLeft() +MagSendKeyEvent(KI_LOCATOR_LEFT) +EndScript + +Script LocatorRight() +MagSendKeyEvent(KI_LOCATOR_RIGHT) +EndScript + +Script LocatorNext() +MagSendKeyEvent(KI_LOCATOR_NEXT) +EndScript + +Script LocatorPrior() +MagSendKeyEvent(KI_LOCATOR_PRIOR) +EndScript + +Script LocatorHome() +MagSendKeyEvent(KI_LOCATOR_HOME) +EndScript + +Script LocatorEnd() +MagSendKeyEvent(KI_LOCATOR_END) +EndScript + +Script SwitchToNextMagicView() +Say(ToggleView(false,Cycle_Next),ot_status) +EndScript + +Script SwitchToPriorMagicView() +Say(ToggleView(false,Cycle_Prior),ot_status) +EndScript + +Script FullView() +if (MultiMonEnabled()) then + Say(cmsgMultiMonVFull, OT_MESSAGE) + return +endIf +MagSetMagnifiedView(MV_FULL) +Delay(2) +if MagGetMagnifiedView() == MV_FULL then + Say(cmsgMVFull,ot_status) +EndIf +EndScript + +script LensView() +if (MultiMonEnabled()) then + Say(cmsgMultiMonVFull, OT_MESSAGE) + return +endIf +MagSetMagnifiedView(MV_LENS) +Delay(2) +if MagGetMagnifiedView() == MV_LENS then + Say(cmsgMVLens,ot_status) +EndIf +EndScript + +Script OverlayView() +if (MultiMonEnabled()) then + Say(cmsgMultiMonVFull, OT_MESSAGE) + return +endIf +MagSetMagnifiedView(MV_OVERLAY) +Delay(2) +if MagGetMagnifiedView() == MV_OVERLAY then + Say(cmsgMVOverlay,ot_status) +EndIf +EndScript + +Script SplitView() +if (MultiMonEnabled()) then + Say(cmsgMultiMonVFull, OT_MESSAGE) + return +endIf +MagSetMagnifiedView(MV_SPLIT) +Delay(2) +if MagGetMagnifiedView() == MV_SPLIT then + Say(cmsgMVSplit,ot_status) +EndIf +EndScript + +Script ResizeView() +var + int nView, + int nMagState +if (MultiMonEnabled()) then + Say(cmsgMultiMonVFull, OT_MESSAGE) + return +endIf +let nMagState = MagGetState() +let nView = MagGetMagnifiedView() +if !nMagState then + Say(mag023,OT_MESSAGE) + return +elif nView == MV_FULL then + Say(mag047,OT_MESSAGE) + return +EndIf +MagSendKeyEvent (KI_SIZE_MAGIC_VIEW) +Say(cmsgResizingTool,OT_MESSAGE) +EndScript + +script TetherMouseToDisplayToggle() +If MagSendKeyEvent(KI_TETHER_MOUSE) == mske_toggle_on then + SayMessage(OT_STATUS,cmsgMouseFollowCursor_L,cmsgMouseFollowCursor_S) +Else + SayMessage(OT_STATUS,cmsgMouseNotFollowCursor_L,cmsgMouseNotFollowCursor_S) +endIf +EndScript + +Script CursorEnhancementToggle() +if MagSendKeyEvent(KI_CUSTOM_CURSOR_TOGGLE) == mske_toggle_on then + Say(cmsgCustomCursorOn,ot_status) +else + Say(cmsgCustomCursorOff,ot_status) +EndIf +EndScript + +Script JumpToNextDisplay() +ToggleDisplay(Cycle_Next) +EndScript + +script TypingEchoToggle() +var + int nNewTypingEcho, + int bSuccess +bSuccess = MagTypingEchoToggle(nNewTypingEcho) +if bSuccess then + if nNewTypingEcho then + Say(cmsgKeyboardEchoOn,ot_status) + else + Say(cmsgKeyboardEchoOff,ot_status) + EndIf +else + beep() +endif +EndScript + +script MouseEchoToggle() +var int toggle = MouseEchoToggle() +if toggle == ScriptFunctionReturnError return endIf +if toggle == On + Say(cmsgMouseEchoOn,ot_status) +else + Say(cmsgMouseEchoOff,ot_status) +endIf +EndScript + +Script AdjustMAGicOptions() +if GetRunningFSProducts() & product_JAWS then + ;do not allow to run if JAWS and MAGic are running together + return +EndIf +if InHJDialog () then + SayMessage (OT_error, cMSGOpenMAGicDlgError_L, cMSGOpenMAGicDlgError_S) + return +endIf +if gbSupportsMAGicOptions || isVirtualPcCursor () || IsFormsModeActive () then + PerformScript QuickSettings () +endIf +EndScript + +script ViewLock() +;StartViewLocking() +;This script is needed as a place holder for the View Locking key. The code +;to toggle view locking is internal. +EndScript + +int function GetOwningAppNameAndVersionNumberForWindow(handle hWnd, string byRef sApp, int byRef version) +version = 0 +sApp = GetWindowOwner(hWnd) +if sApp + version = GetProgramVersion(sApp) +endIf +return (sApp && version) +EndFunction + +Script IncreaseSystemVolume() +var + int volume = GetSystemVolume() + ; No point in trying to set system volume higher than 100% and having Windows reset it to 100% +if volume >= 95 + SetSystemVolume(100) +else +; We change the system volume in increments of 5 - similar to iOS behavior + ChangeSystemVolume(V_UP,5) +endIf +volume = GetSystemVolume() +Say(FormatString(cmsgPercentage,IntToString(volume)),ot_status) +EndScript + +Script DecreaseSystemVolume() +var + int volume = GetSystemVolume() + ; The minimum volume should be 10 +if volume <= 15 + SetSystemVolume(10) +else +; We change the system volume in increments of 5 - similar to iOS behavior + ChangeSystemVolume(V_DOWN,5) +endIf +volume = GetSystemVolume() +if volume + Say(FormatString(cmsgPercentage,IntToString(volume)),ot_status) +endIf +EndScript + +Script LaunchWindowsShortcut(string value) +LaunchShortcut(value) +EndScript + +Script WindowsCmd(int value) +AppCommand(value) +EndScript + +Script DisplayVoiceProfilesContextMenu() +var + int Message, + HANDLE hwnd +if GetRunningFSProducts() != product_MAGic then + return +EndIf +if !HasUserDefinedVoiceProfiles() then + SayMessage(ot_error,cmsgNoUserDefinedVoiceProfiles) + return +EndIf +let hwnd = FindTopLevelWindow("JFWUI2",cscNull) +let Message = RegisterWindowMessage(VoiceProfilesContextMenu_MessageStr) +if hwnd +&& Message then + let gbAnnounceVoiceProfilesContextMenu = true + PostMessage (hwnd,Message,0,0) +endIf +EndScript + +script RestrictMouseToActiveMonitorToggle() +var + int bResult +let bResult = RestrictMouseToActiveMonitorHandler() +if bResult < 0 then + beep() +elif bResult == 1 then + Say(cmsg_RestrictMouseToActiveMonitor_on,ot_status) +elif !bResult then + Say(cmsg_RestrictMouseToActiveMonitor_off,ot_status) +EndIf +EndScript + +Script FocusEnhancementToggle() +if MagSendKeyEvent(KI_FOCUS_ENHANCEMENT_TOGGLE) == mske_toggle_on then + Say(cmsgFocusEnhancementOn,ot_status) +else + Say(cmsgFocusEnhancementOff,ot_status) +EndIf +EndScript + +script IndicateCaps() +Say(IndicateCapByToggle(false),ot_status) +EndScript + +Script ReportMagState() +If (MagGetState () > 0) then + Say (mag001 + mag002 + IntToString (MagGetOption (MID_LEVEL)), ot_message) +Else + Say (mag004, ot_message) +EndIf +EndScript + +Script CenterMouseInView() +;mag012 = "Mouse Centered" +CenterMouseInView () +Say (mag012, OT_STATUS) +EndScript + +Script MagDecrementMagnificationLevel() +var + int nLevel +if !IsMAGicRunning() then + Say(mag017, OT_MESSAGE) +EndIf +if MagGetOption(MID_LEVEL) == 100 then + Beep() + Return +endif +let nLevel = MagSendKeyEvent(KI_DECREASE_MAG_LEVEL) +Say(GetMagLevelMessage(nLevel),OT_STATUS) +EndScript + +Script MagIncrementMagnificationLevel() +var + int nLevel +if !IsMAGicRunning() then + Say(mag017, OT_MESSAGE) +EndIf +if MagGetOption(MID_LEVEL) == MAG_MAX_LEVEL then + Beep() + Return +endif +let nLevel = MagSendKeyEvent(KI_INCREASE_MAG_LEVEL) +Say(GetMagLevelMessage(nLevel),OT_STATUS) +EndScript + +Script MagLocatorsToggle() +var + int bOn +if !IsMAGicRunning() then + Say(mag017, OT_MESSAGE) +EndIf +let bOn = MagGetOption (LOC_ON) +ToggleLocatorMode(1) +if bOn then + Say(mag025, OT_STATUS) +else + Say(mag024, OT_STATUS) +endif +EndScript + +Script MagnificationToggle() +if !IsMAGicRunning() then + Say(mag017, OT_MESSAGE) +EndIf +if MagSendKeyEvent (KI_MAGNIFY_TOGGLE) then + Say(mag026, OT_STATUS) +else + Say(mag027, OT_STATUS) + Say(GetMagLevelMessage(MagGetOption(MID_LEVEL)),OT_STATUS) +endif +EndScript + +Script MagNextMAGicView() +var + int nView +let nView = MagGetOption (MID_VIEW) +if (nView == 5) then + let nView = 0 +else + let nView = nView + 1 +endif +if (MagSendKeyEvent (KI_NEXT_MAGIC_VIEW)) then + ;If the MAGic Window has focus, and the focus is actually + ;in the MAGicView window, then don't speak the change. + ;Highlighted text event will catch it. + if (GetWindowClass(GetAppMainWindow (GetFocus())) == sc1) + && (GetControlID(GetFocus()) == 1026 /*MAGicView ID*/) then + ;Don't say anything. Highlighted text will pick it up. + return + endIf + if (nView == 0) then + Say(mag033, OT_STATUS) + elif (nView == 1) then + Say(mag034, OT_STATUS) + elif (nView == 2) then + Say(mag035, OT_STATUS) + elif (nView == 3) then + Say(mag036, OT_STATUS) + elif (nView == 4) then + Say(mag037, OT_STATUS) + elif (nView == 5) then + Say(mag038, OT_STATUS) + endif +else + Say(mag017, OT_MESSAGE) +endif +EndScript + +Script MagResizeMAGicView() +var + int nView, + int nMagState +let nMagState = MagGetState() +let nView = MagGetOption (MID_VIEW) +if (nMagState == -1) then + Say (mag017, OT_MESSAGE) +elif (nMagState < 1) then + Say (mag023, OT_MESSAGE) +elif (nView == 2 /*full screen*/ || nView == 5 /*tracking lens*/ ) then + Say (mag047, OT_MESSAGE) +elif (MagSendKeyEvent (KI_SIZE_MAGIC_VIEW)) then + Say (mag046, OT_MESSAGE) +else + Say (mag017, OT_MESSAGE) +endif +EndScript + +Script MagSmoothToggle() +; mag017 = "MAGic Not running" +; mag052 = "Smoothing On", +; mag053 = "Smoothing Off" +Var + Int nSpeechStatus, + Int ret, + String message +Let nSpeechStatus = SpeechInUse () +Let ret = MagSendKeyEvent(KI_SMOOTH_TOGGLE) +If (mske_Error == ret) then + message = mag017 +ElIf (ui_SmoothingHD == ret) then + message = cmsgSmoothingHD +ElIf (ui_SmoothingClassic == ret) then + message = cmsgSmoothingClassic +ElIf (ui_SmoothingNone == ret) then + message = cmsgSmoothingNone + EndIf + If (nSpeechStatus) then + Say(message, ot_status) + EndIf +EndScript + +Script MagTrackToggle() +; mag017 = "MAGic Not running" +; mag062 = "Tracking On", +; mag063 = "Tracking Off" +Var + Int nSpeechStatus, + Int bOn +Let nSpeechStatus = SpeechInUse () +Let bOn = MagGetOption (TID_ON) +If (MagSendKeyEvent (KI_TRACK_TOGGLE)) then + If (bOn) then + If (nSpeechStatus) then + Say (mag063, ot_status) + EndIf + Else + If (nSpeechStatus) then + Say (mag062, ot_status) + EndIf + EndIf +Else + If (nSpeechStatus) then + Say (mag017, OT_MESSAGE) + EndIf +EndIf +EndScript + +int function FocusFollowsMouse() +var + int MouseX, + int MouseY, + handle Window +if GetMenuMode() < menu_active then + return false +endIf +GetCursorPos(CURSOR_JAWS, smmPixels, MouseX, MouseY) +Window = GetWindowAtPoint(MouseX, MouseY) +If (IsStartMenu(Window)) Then + return false +EndIf +return true +EndFunction + +void function CopyMAGicScreenShot(int ShotType) +SayCurrentScriptKeyLabel () +if MagGetState() <= 0 then + TypeCurrentScriptKey() + return +EndIf +MagCaptureScreenShot(ShotType) +if ShotType == MAGic_ScreenCaptureMode_FullMAGicViewPort then + SayMessage(ot_jaws_message,cmsgCopyScreenImage_L,cmsgCopyScreenImage_S) +elif ShotType == MAGic_ScreenCaptureMode_VisibleMagnifiedArea then + SayMessage(ot_jaws_message,cmsgCopyVisibleMagnifiedWindow_L,cmsgCopyVisibleMagnifiedWindow_S) +EndIf +EndFunction + +script CopyScreenImage() +CopyMAGicScreenShot(MAGic_ScreenCaptureMode_FullMAGicViewPort) +EndScript + +script CopyVisibleMagnifiedWindow() +CopyMAGicScreenShot(MAGic_ScreenCaptureMode_VisibleMagnifiedArea) +EndScript + +script NavigationQuickKeysToggle () +var int nSetting = getJCFOption (OPT_QUICK_KEY_NAVIGATION_MODE) +if ! isVirtualPcCursor () && ! IsFormsModeActive() then + SayMessage (OT_ERROR, cmsgQuickKeysNotAvailable, cmsgNotAvailable) + return +endIf +nSetting = ! nSetting +setJCFOption (OPT_QUICK_KEY_NAVIGATION_MODE, nSetting) +if nSetting == OFF then + sayMessage (OT_STATUS, cmsgQuickKeysOff, cmsgOff) +else + sayMessage (OT_STATUS, cmsgQuickKeysOn, cmsgOn) +endIf +endScript + +int function ClipboardTextViewerIsActive() +return ghWndResultsViewer + && GetWindowName(ghWndResultsViewer) == cmsgClipboardTextTitle +EndFunction + +void function ShowClipboardTextInResultsViewer() +var + string sText, + int bClipboardTextViewerIsActive +let sText = GetClipboardText() +if !sText then + SayMessage(ot_error,cmsgNoTextOnClipboard) + return +endIf +let bClipboardTextViewerIsActive = ClipboardTextViewerIsActive() +if UserBufferIsActiveResultsViewer() +&& !bClipboardTextViewerIsActive then + UserBufferDeactivateResultsViewer () +EndIf +UserBufferClearResultsViewer() +if !bClipboardTextViewerIsActive then + UpdateResultsViewerTitle(cmsgClipboardTextTitle) +endIf +let sText=sText+cScBufferNewLine; +let sText=sText+cScBufferNewLine; +let sText=sText+cMsgViewClipboardTextExit; +UserBufferAddTextResultsViewer(TextToHTML(sText, cmsgClipboardTextTitle)) +if !bClipboardTextViewerIsActive then + UserBufferActivate() +else + if GetTopLevelWindow(GetFocus()) != ghWndResultsViewer then + SetFocus(ghWndResultsViewer) + EndIf +endIf +EndFunction + +script ViewClipboardText() +var + int bOverwrite +if ClipboardTextViewerIsActive() then + let bOverwrite = ExMessageBox(cmsgClipboardTextViewerOverwritePrompt, cmsgClipboardTextViewerOverwriteTitle, MB_YESNO) + if bOverwrite == idNo then + return + EndIf +endIf +ShowClipboardTextInResultsViewer() +EndScript + +script DoFlexibleWebDialog() + SayMessage(ot_error, msgFlexibleWebNotAvailable) +EndScript + +int function FlexibleWebDialogActive () +var string sRealName = getWindowName (getRealWindow (getFocus ())) +if !inHjDialog () then + Return FALSE +endIf +return (StringCompare(sRealName,cwn_FlexibleWeb_dlg) == 0 +|| StringCompare(sRealName,cwn_ChooseAnAction_dlg) == 0 +|| StringCompare(sRealName,cwn_ChooseAnElement_dlg) == 0 +|| StringCompare(sRealName,cwn_ChooseACustomization_dlg) == 0 +|| StringCompare(sRealName,cwn_SaveTemporaryCustomizations_dlg) == 0 +|| StringCompare(sRealName,cwn_SaveTemporaryCustomizationsFinish_dlg) == 0 +|| StringCompare(sRealName,cwn_ViewOrChangeWhereRulesAreApplied_dlg) == 0) +endFunction + +string function FlexibleWebNumberOfActiveRules () +var + handle hwnd = getFocus () +if ! FlexibleWebDialogActive () || getWindowSubtypeCode (hwnd) != WT_TREEVIEW +|| getControlID (hwnd) != id_FlexibleWeb_ViewOrChangeRules_Treeview then + return cscNull +endIf +return formatString (cmsgFlexibleWebActiveRules, FlexibleWebGetActiveRulesNumberForSelectedLocation ()) +endFunction + +object function GetMSAAObjectTree(optional handle hWnd) +var + object oTree +if ! hWnd then + let hWnd = GetAppMainWindow (GetFocus ()) +EndIf +let oTree = CreateObjectEx ("FreedomSci.AccessibleTree", 0, "AccessibleObjectTools.x.manifest") +if oTree then + return oTree.BuildUsingMSAA(hWnd) + EndIf + return 0 +EndFunction + +object function GetUIAObjectTree(optional handle hWnd) +var + object oTree +if !hWnd then + let hWnd = GetAppMainWindow(GetFocus()) +EndIf +let oTree = CreateObjectEx("FreedomSci.AccessibleTree",0,"AccessibleObjectTools.x.manifest") +if oTree then + return oTree.Build(hWnd) +EndIf +return 0 +EndFunction + +object function GetUIAObjectFocusItem() +var + object oTree, + object oItem +let oTree = GetUIAObjectTree(GetFocus()) +if !oTree then + return 0 +EndIf +let oItem = oTree.FindByKeyboardFocus(1) +if !oItem then + return 0 +EndIf +;Sometimes, what is reported as the focus object is actually an ancestor to the focus object. +;If we look further down, we may find a descendent is really the focus object: +while oItem + let oTree = oItem + let oItem = oItem.FirstChild.FindByKeyboardFocus(1) +EndWhile +return oTree +EndFunction + +object function GetFocusedUIAObjectSubtree() +var + object oTree +let oTree = CreateObjectEx("FreedomSci.AccessibleTree",0,"AccessibleObjectTools.x.manifest") +if oTree then + return oTree.BuildFocusSubtreeUsingUIA(getFocus()) +EndIf +return 0 +EndFunction + +void function RibbonStatusChangedEvent(int nStatus, handle hRibbon) +if (nStatus) then + sayMessage(OT_STATUS, cmsgRibbonExpanded_l, cmsgRibbonExpanded_s) +else + sayMessage(OT_STATUS, cmsgRibbonCollapsed_l, cmsgRibbonCollapsed_s) +endIf +endFunction + +int function GetNavigationQuickKeysSettingFromFile () +var + int FileType = FT_CURRENT_JCF, + int value = readSettingInteger (SECTION_OPTIONS, hKey_QuickKeyNavigationMode, -1, FileType, rsStandardLayering) +if value == -1 then + FileType = FT_DEFAULT_JCF + value = readSettingInteger (SECTION_OPTIONS, hKey_QuickKeyNavigationMode, 0, FileType, rsStandardLayering) +endIf +return value +endFunction + +Script QuickNavigationKeysSuspendOrResume () +var + int nSettingFromFile = GetNavigationQuickKeysSettingFromFile (), + int iOption = getJCFOption (OPT_QUICK_KEY_NAVIGATION_MODE); +if ! nSettingFromFile then + return SayMessage (OT_STATUS, cmsgQuickKeysAlreadyDisabled) +endIf +if iOption == 0 then + iOption = nSettingFromFile +else + iOption = 0 +endIf +setJCFOption (OPT_QUICK_KEY_NAVIGATION_MODE, iOption) +if iOption == 0 then + return sayMessage (OT_STATUS, cmsgQuickKeysSuspended) +else + return sayMessage (OT_STATUS, cmsgQuickKeysResume) +endIf +EndScript + +Script RepeatLastSkypeNotification () +SkypeWatch::RepeatLastSkypeNotification () +endScript + +script RepeatLastNotification () +var string notification = GetStoredNotificationText () +if stringIsBlank (notification) then + SayMessage (OT_ERROR, cmsgNoNotification) +else + sayMessage (OT_USER_REQUESTED_INFORMATION, notification) +endIf +endScript + +script ShowNotificationHistory (optional int invokedBy) +if g_NotificationManagerEnabled then + ShowNotificationHistory(invokedBy) +else + PerformScript RepeatLastNotification() +endIf +endScript + +void function VirtualCursorSynchronizedEvent() +;Called when Outlook or another app moves the VPC to the location of the onscreen caret or cursor +var +string selectedText= GetSelectedText() +if GetObjectSubtypeCode()==wt_static then + if selectedText!=cscNull then + say(selectedText, OT_SCREEN_MESSAGE) + else + sayWord() + endIf +else + if selectedText!=cscNull then + say(selectedText, OT_SCREEN_MESSAGE) + else + sayObjectTypeAndText() + endIf +endIf +endFunction + +globals int gbJAWSFindDialogIsRunning + +int function JAWSFindDialogIsRunning() +return gbJAWSFindDialogIsRunning +EndFunction + +int function JAWSFind(optional int bFindDirection) +; InHJDialog is false when JAWS find is searching, +; and variables InJAWSFind and JAWSFindComplete are used +; for specific purposes that extend a short time beyond the actual running of the JAWSFind. +; Variable gbJAWSFindDialogIsRunning is true only during the time that the JAWSFind dialog is active. +var + int result +let gbJAWSFindDialogIsRunning = true +let result = JAWSFind(bFindDirection) +let gbJAWSFindDialogIsRunning = false +return result +EndFunction + +Void Function ApplicationRegionEvent(int enteringRegion) +;if virtual or pc cursor enters or leaves application region, this event is fired. +EndFunction + +Void Function RegionBoundaryEvent(string regionType, int enteringRegion) +;if virtual cursor enters or leaves a region, this event is fired. +if (regionType != "details") then + return +EndIf + +;if (enteringRegion) then + ;SayMessage(ot_message, cmsgEnteringDetailsRegion) +;Else + ;SayMessage(ot_message, cmsgLeaving) +;EndIf +EndFunction + +string function StringDeleteBlankFields(string sSource, string sFieldDelim) +var + int FieldCount, + int i, + string s, + string sResult +let FieldCount = StringSegmentCount(sSource,sFieldDelim) +For i = 1 to FieldCount + let s = StringSegment(sSource,sFieldDelim,i) + if !StringIsBlank(s) then + sResult = StringConcatenate (sResult, s, sFieldDelim) + EndIf +EndFor +return StringChopRight(sResult,StringLength(sFieldDelim)) +EndFunction + +string Function StringContainsCaseInsensitive(string s1, string s2) +s1 = StringLower (s1) +s2 = StringLower (s2) +return StringContains (s1, s2) +EndFunction + +string Function StringConcatenate(string s1, string s2, optional string s3, string s4, string s5, string s6, string s7, string s8, string s9) +return FormatString ("%1%2%3%4%5%6%7%8%9", s1, s2, s3, s4, s5, s6, s7, s8, s9) +EndFunction + +string Function StringCharAt(string s, int position) +if !position return Null() endIf +if position < 0 + position = position + StringLength(s) + 1 +endIf +return SubString (s, position, 1) +EndFunction + +script BraillepanRightBySegment() +var +int nOldPanMode +let nOldPanMode=getJCFOption(OPT_BRL_PAN_MODE) +setJCFOption(OPT_BRL_PAN_MODE, brlUserPanBySegment) +BraillepanRight() +setJCFOption(OPT_BRL_PAN_MODE,nOldPanMode) +endScript + +script BraillePanLeftBySegment() +var +int nOldPanMode +let nOldPanMode=getJCFOption(OPT_BRL_PAN_MODE) +setJCFOption(OPT_BRL_PAN_MODE, brlUserPanBySegment) +BraillepanLeft() +setJCFOption(OPT_BRL_PAN_MODE,nOldPanMode) +endScript + +int function SpeechHistoryWindowIsActive() +return ghWndResultsViewer + && GetWindowName(ghWndResultsViewer) == cmsgSpeechHistoryTitle +EndFunction + +void function ShowTextInResultsViewer(string text, string title, bool isWindowActive) +if UserBufferIsActiveResultsViewer() +&& !isWindowActive then + UserBufferDeactivateResultsViewer() +EndIf +UserBufferClearResultsViewer() +if !isWindowActive then + UpdateResultsViewerTitle(title) +endIf +if text then + UserBufferAddTextResultsViewer(text) +else + UserBufferAddTextResultsViewer(HTML_EmptyDocument) + let global_EmptyResultsViewerDocument = true +EndIf +if !isWindowActive then + UserBufferActivate() +else + if GetTopLevelWindow(GetFocus()) != ghWndResultsViewer then + SetFocus(ghWndResultsViewer) + EndIf +endIf +EndFunction + +void function ShowSpeechHistoryInResultsViewer() +var string sText = StringTrimTrailingBlanks(GetSpeechHistory()) +ShowTextInResultsViewer(sText, cmsgSpeechHistoryTitle, SpeechHistoryWindowIsActive()) +EndFunction + +script ShowSpeechHistory() +if !GetIntOptionUserSetting(Section_Options, hKey_SpeechHistory) then + Say(cmsgSpeechHistoryNotAvailable,ot_error) + return +EndIf +ShowSpeechHistoryInResultsViewer() +EndScript + +script ClearSpeechHistory() +Say(cmsgClearSpeechHistory,ot_status) +ClearSpeechHistory() +EndScript + +Script CopySpeechHistoryToClipboard() +if (!GetIntOptionUserSetting(Section_Options, hKey_SpeechHistory)) +Say(cmsgSpeechHistoryNotAvailable, ot_error) + return +EndIf +CopyToClipboard(StringTrimTrailingBlanks(GetSpeechHistory())) +Say(cmsgCopySpeechHistory, ot_status) +EndScript + +void function ConfigurationChangedEvent(string newConfiguration) +if newConfiguration == "JawsDialog" +|| newConfiguration == "SettingsCenter" then + if IsObjectNavigationActive() then + SuspendObjectNavigation(true) + SayUsingVoice(vctx_message,cmsgTouchCursorSuspended,ot_status) + endIf + globalPrevConfiguration = NewConfiguration + return +endIf +if globalPrevConfiguration == "SettingsCenter" then +;some settings, such as Smart Navigation,may be modified by Settings Center +; without their new values be added into globals memory cache. + QuickSettingsPostProcess () +endIf +; Always load Smart navigation global variable as it can be application-specific: +SmartNavStart() +UpdateObjectNavigationMode(newConfiguration) +if IsTouchCursor() then + SayMessage (ot_status, cmsgTouchCursor_L, cmsgTouchCursor_S) +EndIf +globalPrevConfiguration = NewConfiguration +; Personalized Settings when a domain set of settings is also in use: +CustomSettingsStart () +EndFunction + +script TouchCursor() +ActivateTouchCursor() +if IsTouchCursor() then + SayMessage (ot_status, cmsgTouchCursor_L, cmsgTouchCursor_S) +EndIf +EndScript + +script TouchTextReviewOn() +if IsObjectNavigationActive() +&& IsTouchCursor() then + TurnOnTouchNavigationTextReview() +EndIf +EndScript + +script TouchTextReviewOff() +if IsObjectNavigationActive() +&& !IsTouchCursor() then + TurnOffTouchNavigationTextReview() +elif CurrentScriptWasInvokedByGesture() + PerformScript UpALevel() +endIf +EndScript + +script TouchTextReviewNext() +if IsObjectTextReviewModeActive() then + TurnOffTouchNavigationTextReview() + if !UsingTouchNavigationSounds() then + SayMessage(ot_status, cmsgTouchTextReviewOff, cmsgTouchTextReviewOff) + endIf + if IsTouchNavigationModeActive() then + PerformScript TouchNextElement() + elif IsAdvancedObjectNavigationModeActive() + PerformScript ObjectNavigateToNextSibling() + endIf +EndIf +EndScript + +script TouchTextReviewPrior() +if IsObjectTextReviewModeActive() then + TurnOffTouchNavigationTextReview() + if !UsingTouchNavigationSounds() then + SayMessage(ot_status, cmsgTouchTextReviewOff, cmsgTouchTextReviewOff) + endIf + if IsTouchNavigationModeActive() then + PerformScript TouchPriorElement() + elif IsAdvancedObjectNavigationModeActive() + PerformScript ObjectNavigateToPriorSibling() + endIf +EndIf +EndScript + +script AdvancedObjectNavigationModeToggle() +if IsAdvancedObjectNavigationModeActive() then + UseAdvancedObjectNavigationMode(false) + SayMessage(ot_status, cmsgAdvancedObjectNavigationOff_L, cmsgAdvancedObjectNavigationOff_S) +elif IsTouchNavigationModeActive() then + UseAdvancedObjectNavigationMode(true) + SayMessage(ot_status, cmsgAdvancedObjectNavigationOn_L, cmsgAdvancedObjectNavigationOn_S) +EndIf +EndScript + +script ObjectNavigateToNextSibling() +UIAGoTo(TouchNavigate_NextSibling) +EndScript + +script ObjectNavigateToPriorSibling() +UIAGoTo(TouchNavigate_PriorSibling) +EndScript + +script ObjectNavigateToFirstChild() +UIAGoTo(TouchNavigate_FirstChild) +EndScript + +script ObjectNavigateToParent() +UIAGoTo(TouchNavigate_Parent) +EndScript + +script ShowUIAElementProperties() +UIASayElementProperties() +EndScript + +script ShowUIAElementAndDescendantProperties() +ShowArrayOfUIAElementPropertiesForSubtree() +EndScript + +script SayUIARect() +UIASayRect() +EndScript + +script SayUIAPoint() +UIASayPoint() +EndScript + +Script KillUIAObject() +KillUIAObject() +EndScript + +script TouchGoToNextButton() +UIAGoToButton(true) +EndScript + +script TouchGoToPriorButton() +UIAGoToButton(false) +EndScript + +script TouchGoToNextRadioButton() +UIAGoToRadioButton(true) +EndScript + +script TouchGoToPriorRadioButton() +UIAGoToRadioButton(false) +EndScript + +script TouchGoToNextComboBox() +UIAGoToComboBox(true) +EndScript + +script TouchGoToPriorComboBox() +UIAGoToComboBox(false) +EndScript + +script TouchGoToNextDocument() +UIAGoToDocument(true) +EndScript + +script TouchGoToPriorDocument() +UIAGoToDocument(false) +EndScript + +script TouchGoToNextEdit() +UIAGoToEdit(true) +EndScript + +script TouchGoToPriorEdit() +UIAGoToEdit(false) +EndScript + +script TouchGoToNextFormControl() +UIAGoToFormControl(true) +EndScript + +script TouchGoToPriorFormControl() +UIAGoToFormControl(false) +EndScript + +script TouchGoToNextImage() +UIAGoToImage(true) +EndScript + +script TouchGoToPriorImage() +UIAGoToImage(false) +EndScript + +script TouchGoToNextHeading() +UIAGoToHeading(true) +EndScript + +script TouchGoToPriorHeading() +UIAGoToHeading(false) +EndScript + +script TouchGoToNextListItem() +UIAGoToListItem(true) +EndScript + +script TouchGoToPriorListItem() +UIAGoToListItem(false) +EndScript + +script TouchGoToNextHyperlink() +UIAGoToHyperlink(true) +EndScript + +script TouchGoToPriorHyperlink() +UIAGoToHyperlink(false) +EndScript + +script TouchGoToNextLandmark() +UIAGoToLandmark(true) +EndScript + +script TouchGoToPriorLandmark() +UIAGoToLandmark(false) +EndScript + +script TouchGoToNextList() +UIAGoToList(true) +EndScript + +script TouchGoToPriorList() +UIAGoToList(false) +EndScript + +script TouchGoToNextMenu() +UIAGoToMenu(true) +EndScript + +script TouchGoToPriorMenu() +UIAGoToMenu(false) +EndScript + +script TouchGoToNextToolBar() +UIAGoToToolBar(true) +EndScript + +script TouchGoToPriorToolBar() +UIAGoToToolBar(false) +EndScript + +script TouchGoToNextPane() +UIAGoToPane(true) +EndScript + +script TouchGoToPriorPane() +UIAGoToPane(false) +EndScript + +script TouchGoToNextTab() +UIAGoToTab(true) +EndScript + +script TouchGoToPriorTab() +UIAGoToTab(false) +EndScript + +script TouchGoToNextRegion() +UIAGoToRegion(true) +EndScript + +script TouchGoToPriorRegion() +UIAGoToRegion(false) +EndScript + +script TouchGoToNextStaticText() +UIAGoToStaticText(true) +EndScript + +script TouchGoToPriorStaticText() +UIAGoToStaticText(false) +EndScript + +script TouchGoToNextTable() +UIAGoToTable(true) +EndScript + +script TouchGoToPriorTable() +UIAGoToTable(false) +EndScript + +script TouchGoToNextGroup() +UIAGoToGroup(true) +EndScript + +script TouchGoToPriorGroup() +UIAGoToGroup(false) +EndScript + +script TouchGoToNextTree() +UIAGoToTree(true) +EndScript + +script TouchGoToPriorTree() +UIAGoToTree(false) +EndScript + +script TouchGoToNextCheckBox() +UIAGoToCheckBox(true) +EndScript + +script TouchGoToPriorCheckBox() +UIAGoToCheckBox(false) +EndScript + +script TouchGoToNextStatusBar() +UIAGoToStatusBar(true) +EndScript + +script TouchGoToPriorStatusBar() +UIAGoToStatusBar(false) +EndScript + +script InvalidTouchCursorAction() +NotifyNotAvailableForTouchCursor() +EndScript + +void function UserBufferActivatedEvent() +SaveGestureMode() +SetGestureModeForTextReading() +if IsObjectNavigationActive() +&& !CurrentlyActivatingObjectTextReviewMode() + SuspendObjectNavigation() + SayUsingVoice(vctx_message,cmsgTouchCursorSuspended,ot_status) +endIf +EndFunction + +void function UserBufferDeactivatedEvent() +RestoreGestureMode() +if IsObjectNavigationSuspended() +&& !CurrentlyDeactivatingObjectTextReviewMode() + if IsObjectTextReviewModeSuspended() + ;resuming too quickly may result in an empty user buffer for the text review: + ScheduleFunction("ResumeObjectNavigation",1) + else + ResumeObjectNavigation() + endIf +endIf +EndFunction + +script TouchSayCurrentElement() +TouchSayCurrentElement() +EndScript + +script RouteTouchToFocus() +Say(cmsgRouteTouchToFocus,ot_status) +RouteTouchToFocus() +TouchSayCurrentElement() +EndScript + +script TouchSetFocus() +UIASetFocus() +EndScript + +script BrailleTouchTapCurrentElement(int x, int y) +if BrailleIsMessageBeingShown() then + brailleClearMessage() + return +endIf +; We know this was invoked by Braille routing, not a gesture. +; Thus we do not need the block testing CurrentScriptWasInvokedByGesture +TouchTapCurrentElement(x,y) +endScript + +script TouchTapCurrentElement(int x, int y) +if CurrentScriptWasInvokedByGesture() + var int mode = GetGestureMode() + if mode == GestureMode_TextReading + if IsObjectTextReviewModeActive() + PlayTouchNavigationErrorSound() + return + elif UserBufferIsActive() + PerformScript Enter() + return + EndIf + endIf +endIf +TouchTapCurrentElement(x,y) +EndScript + +script DoSecondaryActionForCurrentElement() +DoSecondaryActionForCurrentElement() +EndScript + +script TouchTwoFingersSplitTap() +TouchTwoFingersSplitTap() +EndScript + +script TouchTwoFingersSplitDoubleTap() +TouchTwoFingersSplitDoubleTap() +EndScript + +script TouchSayCharacter() +if UserBufferIsActive() PerformScript SayCharacter() return endIf +if TrySplitTapForVirtualKeyboard() return endIf +if UIASayCharacterAtExploreLocation() return endIf +if !TouchExploreLocationHasFocus() TrySetFocusToElementAtExploreLocation() endIf +if !TouchExploreLocationHasFocus() PlayTouchNavigationErrorSound() return endIf +PerformScript SayCharacter() +EndScript + +script TouchSayWord() +if UserBufferIsActive() PerformScript SayWord() return endIf +if TrySplitDoubleTapForVirtualKeyboard() return endIf +if UIASayWordAtExploreLocation() return endIf +if !TouchExploreLocationHasFocus() TrySetFocusToElementAtExploreLocation() endIf +if !TouchExploreLocationHasFocus() PlayTouchNavigationErrorSound() return endIf +PerformScript SayWord() +EndScript + +script TouchNextElement() +TouchNextElement() +EndScript + +script TouchPriorElement() +TouchPriorElement() +EndScript + +script TouchMoveToFirstElement() +TouchMoveToFirstElement() +EndScript + +script TouchMoveToLastElement() +TouchMoveToLastElement() +EndScript + +script ObjectNavigateToFirstElementInProcessID() +TouchMoveToFirstElementInProcessID() +EndScript + +script ObjectNavigateToLastElementInProcessID() +TouchMoveToLastElementInProcessID() +EndScript + +script TouchMoveToNextElementByType() +TouchMoveToNextElementByType() +EndScript + +script TouchMoveToPriorElementByType() +TouchMoveToPriorElementByType() +EndScript + +script TouchChangeElementMovementPrior() +TouchChangeElementMovementType(0) +EndScript + +script TouchChangeElementMovementNext() +TouchChangeElementMovementType(1) +EndScript + +script TouchScrollLeft() +TouchScroll(Screen_Move_Left) +EndScript + +script TouchScrollRight() +TouchScroll(Screen_Move_Right) +EndScript + +script TouchScrollUp() +TouchScroll(Screen_Move_Up) +EndScript + +script TouchScrollDown() +TouchScroll(Screen_Move_Down) +EndScript + +script TouchCloseApp() +TouchCloseApp() +EndScript + +script TouchSayAll() +;This version of SayAll uses UIA to read through all UIA elements, +;rather than performing a traditional SayAll which reads all text of a single control. +TouchSayAll() +EndScript + +script GestureSayAll() +;This version of SayAll performs the traditional SayAll which reads all text of a control, +;unlike the TouchSayAll which uses UIA to read through all UIA elements. +;This version of SayAll is only valid for text reading gesture mode. +if !GestureModeIsTextReading() return endIf +;The element must have focus for SayAll to perform: +if !TouchExploreLocationHasFocus() + TrySetFocusToElementAtExploreLocation() + if !TouchExploreLocationHasFocus() + PlayTouchNavigationErrorSound() + return + endIf +endIf +PerformScript SayAll() +EndScript + +script TouchStopCurrentSpeechOutput() +TouchStopCurrentSpeechOutput() +EndScript + +script TouchExplore(int x, int y) +TouchExplore(x,y) +EndScript + +script TouchExploreEnded(int x, int y) +if SayAllInProgress() + return +endIf +TouchExploreEnded(x,y) +EndScript + +script TouchRightClick() +TouchRightClick() +EndScript + +script SetGestureModeNext() +CycleAvailableGestureMode(true) +AnnounceCurrentGestureMode() +EndScript + +script SetGestureModePrior() +CycleAvailableGestureMode(false) +AnnounceCurrentGestureMode() +EndScript + +script TrySetGestureModeForTextReading() +if SetGestureModeForTextReading() + AnnounceCurrentGestureMode() +else + PlayTouchNavigationErrorSound() +endIf +EndScript + +script GestureListHelp() +ShowGestureListHelp() +EndScript + +script GestureContextHelp() +if GetLastInputSource() == InputSource_Touch +&& GestureModeIsSpeechSettings() + return +endIf +EnsureNoUserBufferActive() +UserBufferAddText(GetTouchContextHelpMessage()) +UserBufferAddLink( + FormatString(cmsgGestureCommandListLink,GetGestureLabel(GetGestureName("GestureListHelp"))), + "ShowGestureListHelp()") +UserBufferActivate() +JAWSTopOfFile() +SayAll() +EndScript + +script EnableSemanticZoom() +if GetLastInputSource() == InputSource_Touch +&& GestureModeIsSpeechSettings() + return +endIf +var int toggle = SetSemanticZoom(true) +if !toggle + PlayTouchNavigationErrorSound() +endIf +EndScript + +script DisableSemanticZoom() +if GetLastInputSource() == InputSource_Touch +&& GestureModeIsSpeechSettings() + return +endIf +var int toggle = SetSemanticZoom(false) +if !toggle + PlayTouchNavigationErrorSound() +endIf +EndScript + +script GestureToggleTextReview() +GestureToggleTextReview() +EndScript + +script GestureRunJAWSManager() +if !GestureModeIsTouchNavigation() + SetGestureModeForTouchNavigation() +endIf +PerformScript RunJAWSManager() +endScript + +script GestureJAWSWindow() +if !GestureModeIsTouchNavigation() + SetGestureModeForTouchNavigation() +endIf +PerformScript JAWSWindow() +EndScript + +script GestureShutDownJAWS() +if !GestureModeIsTouchNavigation() + SetGestureModeForTouchNavigation() +endIf +PerformScript ShutDownJAWS() +EndScript + +script GestureF6() +TypeKey(cksF6) +EndScript + +script GestureShiftF6() +TypeKey(cksShiftF6) +EndScript + +script GestureEscape() +var int mode = GetGestureMode() +if mode == GestureMode_TouchNavigation + PerformScript UpALevel() + TouchNavNotifyByPlayOrSay(GetGestureEscapeSoundFileName(),ot_JAWS_message,cmsgGestureAction_Escape) +elif mode == GestureMode_TextReading + PerformScript TouchTextReviewOff() + ;script has its own logic for play sound or say message +endIf +;Nothing happens for the speech settings mode. +EndScript + +script GestureCloseApp() +var int mode = GetGestureMode() +if mode == GestureMode_TouchNavigation +|| mode == GestureMode_TextReading + PerformScript TouchCloseApp() + TouchNavNotifyByPlayOrSay(GetGestureCloseAppSoundFileName(),ot_JAWS_message,cmsgGestureAction_CloseApp) +endIf +;Nothing happens for the speech settings mode. +EndScript + +script GestureToggleTouchCursor() +if !GestureModeIsSpeechSettings() + PlayTouchNavigationErrorSound() + return +endIf +if IsObjectNavigationActive() then + PerformScript PCCursor () +else + PerformScript TouchCursor() +endIf +;To allow the script to act like a toggle in speech settings gesture mode, +;make sure gesture mode is now set to speech, +;since toggling touch nav on or off may automatically change the gesture mode. +SetGestureModeForSpeechSettings() +EndScript + +script TouchQuickNavEnableToggle() +SetTouchQuickKeyNavigationMode(!IsTouchQuickNavEnabled()) +;This script is expected to run only if touch cursor is active, +;but we add the case of someone running it when touch cursor is not active. +if IsTouchCursor() + if IsTouchQuickNavActive() + Say(cmsgTouchQuickNavActive,ot_status) + else + Say(cmsgTouchQuickNavInactive,ot_status) + endIf +else ;touch cursor is off: + if IsTouchQuickNavEnabled() + Say(cmsgTouchQuickNavEnabled,ot_status) + else + Say(cmsgTouchQuickNavDisabled,ot_status) + EndIf +EndIf +EndScript + +Script FHPBraillexELCDirectStart1 () + FHPBraillexELCDirectStart(1) +EndScript + +Script FHPBraillexELCDirectStart2 () + FHPBraillexELCDirectStart(2) +EndScript + +Script FHPBraillexELCDirectStart3 () + FHPBraillexELCDirectStart(3) +EndScript + +Script FHPBraillexELCDirectStart4 () + FHPBraillexELCDirectStart(4) +EndScript + +Script FHPBraillexELCDirectStartInit () + FHPBraillexELCDirectStartInit() +EndScript + +Script TextViewerToggle () +if ! (GetRunningFSProducts () & product_MAGic) then + SayMessage (OT_ERROR, cmsgTextViewerNotAvailable) +endIf +var int textViewerOn = ToggleTextViewer() +if textViewerOn then + SayMessage (OT_STATUS, cMsgTextViewerEnabled) +else + SayMessage (OT_STATUS, cmsgTextViewerDisabled) +endIf +endScript + +Script SwitchMonitorTextViewer () +SwitchTextViewerMonitor() +endScript + +Script ToggleTextViewerPosition () +SwitchTextViewerPosition() +endScript + +Script PanLeftTextViewer () +PanTextLeft() +endScript + +Script PanRightTextViewer () +PanTextRight() +endScript + +Script LaunchCommandsSearch() +if IsTouchCursor() then + g_WasTouchCursorActiveBeforeJAWSSearch = ON + ExitTouchNavigation () +endIf +g_VirtualPCCursorSettingBeforeJAWSSearch = GetJCFOption (OPT_VIRTUAL_PC_CURSOR) +if g_VirtualPCCursorSettingBeforeJAWSSearch != 1 + SetJcfOption (OPT_VIRTUAL_PC_CURSOR, 1) +endIf +LaunchCommandsSearchViewer() +EndScript + +int function stringsMatchExcludingWhitespace(string s1, string s2) +var +string s1WhitespaceRemoved, +string s2WhitespaceRemoved + +s1WhitespaceRemoved=StringRemoveCharsInRange(s1, 9, 32) +s2WhitespaceRemoved=StringRemoveCharsInRange(s2, 9, 32) + +return s1WhitespaceRemoved==s2WhitespaceRemoved +endFunction + +int function StringEndsWith(string first, string second, optional int caseSensitive) +var int firstLength = StringLength(first) +var int secondLength = StringLength(second) +if (firstLength == secondLength) + return (StringCompare(first, second, caseSensitive) == 0) +endIf +if (firstLength < secondLength) + return false +endIf +var string test = StringRight(first, secondLength) +return (StringCompare(test, second, caseSensitive) == 0) +endFunction + +Void Function SayObjectActiveItemWithDescription (optional int AnnouncePosition) +SayObjectActiveItem (announcePosition) +SayObjectDescription(true) +EndFunction + +int Function SayObjectDescription(optional int suppressDuplication, optional int level) +var + string name = GetObjectName(SOURCE_CACHED_DATA, level), + string description = GetObjectDescription(SOURCE_CACHED_DATA, level) + +if StringLength (description) == 0 then + return false +EndIf + +if suppressDuplication + ; Make sure name and desc are not the same (excluding whitespace) + if stringsMatchExcludingWhitespace(name, description) + return false + EndIf + + ;make sure description doesn't start with name + if (StringStartsWith (description, name, false)) then + return false + EndIf + + ; Make sure the name doesn't end with the description. This is necessary for + ; list view items in SysListview32 windows. In these windows the + ; CAccessibleObjectInfo::Name function will append the list item description to + ; the name. If we do not include this test, there will be double speaking when + ; speaking of the OT_CONTROL_DESCRIPTION output type is enabled. + if (StringEndsWith(name, description, false)) + return false + EndIf +endIf + +Say(description, OT_CONTROL_DESCRIPTION, false) +return true +EndFunction + +void function SelectionRectChangedEvent(int newLeft, int newTop, int newRight, int newBottom, int oldLeft, int oldTop, int oldRight, int oldBottom, int navUnit) +; This event is called when the selCtxSelectionRect flag is set in MSWord when navigating or selecting text. +;It is primarily used for MAGic. +; Note this event is called before any other Selection Context events. +MagSetFocusToRect (newLeft, newRight, newTop, newBottom, MTO_CARET) +EndFunction + +int function StringIsAlpha(string s) +return StringLength(s) > 0 + && (StringRemoveCharsInRange(StringRemoveCharsInRange(s,65,90),97,122) == cscNull) +endFunction + +int function StringIsPunctuation(string s) +return StringLength(s) > 0 + && (StringRemoveCharsInRange(StringRemoveCharsInRange(StringRemoveCharsInRange(StringRemoveCharsInRange(s,33,47),58,64),91,96),123,126) == cscNull) +endFunction + +int function StringIsNumeric(string s) +return StringLength(s) > 0 +&& (StringRemoveCharsInRange(s,48,57) == cscNull) +endFunction + +void function BrailleOnlyRegionBoundaryEvent(int entering, int unit) +var +int oldFlashMessages +if entering then + let oldFlashMessages=getJCFOption(OPT_BRL_MESSAGES) + setJCFOption(OPT_BRL_MESSAGES,0) ; Do not flash this message! + SayFormattedMessageWithVoice (VCTX_MESSAGE, ot_help, cmsgEnteringBrlOnlyRegion_l, cmsgEnteringBrlOnlyRegion_s) + SetJCFOption(OPT_BRL_MESSAGES,oldFlashMessages) +endIf +;No need to indicate when exiting since regular reading will resume. +endFunction + +stringArray function StringArrayCompact(stringArray arrayParam) +var + int l = ArrayLength(arrayParam), + stringArray a, + int i, +int n, + int j +for i = 1 to l + if arrayParam[i] != cscNull n = n+1 endIf +endFor +if !n return Null() endIf +a = new StringArray[n] +j = 1 +for i = 1 to l + if arrayParam[i] != cscNull + a[j] = arrayParam[i] +j = j+1 + endIf +endFor +return a +endFunction + +stringArray function StringArrayConcat(stringArray arrayParam1, stringArray arrayParam2, optional int bCompact) +var + stringArray a1, int l1, + stringArray a2, int l2, + stringArray a, int l, int i +if bCompact + a1 = StringArrayCompact(arrayParam1) + a2 = StringArrayCompact(arrayParam2) +else + a1 = arrayParam1 + a2 = arrayParam2 +endIf +l1 = ArrayLength(a1) +l2 = ArrayLength(a2) +l = l1+l2 +a = new stringArray[l] +for i =1 to l1 + a[i] = a1[i] +endFor +for i = l1+1 to l + a[i] = a2[i-l1] +endFor +return a +EndFunction + +string Function StringJoin(stringArray sArray, optional string sDelimiter) +var + int iArrayLength = ArrayLength (sArray), + string sString, + int i +For i = 1 to iArrayLength + sString = StringConcatenate (sString, sArray[i], sDelimiter) +EndFor +return stringChopRight (sString, StringLength(sDelimiter)) +EndFunction + +string Function StringSegmentReplace(string sString, string sDelimiter, int iIndex, string sReplacement) +var int iSegmentCount = StringSegmentCount (sString, sDelimiter) +if abs (iIndex) > iSegmentCount return sString endIf +var stringArray sArray = StringSplit (sString, sDelimiter, false) +if iIndex < 0 + iIndex = iSegmentCount + iIndex + 1 +endIf +sArray[iIndex] = sReplacement +return StringJoin(sArray, sDelimiter) +EndFunction + +string Function StringSegmentRemove(string sString, string sDelimiter, int iIndex) +var int iSegmentCount = StringSegmentCount (sString, sDelimiter) +if abs (iIndex) > iSegmentCount return sString endIf +var + stringArray sArray = StringSplit (sString, sDelimiter, false), + stringArray sNewArray, + int i, + int j = 1 +if iIndex < 0 + iIndex = iSegmentCount + iIndex + 1 +endIf +sNewArray = new stringArray[iSegmentCount-1] +for i = 1 to iSegmentCount + if i != iIndex + sNewArray[j] = sArray[i] + j = j + 1 + endIf +EndFor +return StringJoin(sNewArray, sDelimiter) +EndFunction + +string Function StringRemoveNonNumericChars(string s) +s = StringRemoveCharsInRange (s, 0x01, 0x2f) +s = StringRemoveCharsInRange (s, 0x3a, 0xffff) +return s +EndFunction + +string Function StringRemoveNumericChars(string s) +return StringRemoveCharsInRange (s, 0x30, 0x39) +EndFunction + +string Function StringRemoveNonAlphanumericChars(string s) +s = StringRemoveCharsInRange (s, 0x01, 0x2f) +s = StringRemoveCharsInRange (s, 0x3a, 0x40) +s = StringRemoveCharsInRange (s, 0x5b, 0x60) +s = StringRemoveCharsInRange (s, 0x7b, 0xffff) +return s +EndFunction + +string Function StringRemoveNonAlphaChars(string s) +s = StringRemoveCharsInRange (s, 0x01, 0x40) +s = StringRemoveCharsInRange (s, 0x5b, 0x60) +s = StringRemoveCharsInRange (s, 0x7b, 0xffff) +return s +EndFunction + +string Function StringRemoveAlphaChars(string s) +s = StringRemoveCharsInRange (s, 0x41, 0x5a) +s = StringRemoveCharsInRange (s, 0x61, 0x7a) +return StringRemoveCharsInRange (s, 0x30, 0x39) +EndFunction + +string Function StringRemovePrivateUseChars(string s) +s = StringRemoveCharsInRange (s, 57344, 63743);Private Use Area +s = StringRemoveCharsInRange (s, 983040, 1048573);Supplementary Private Use Area-A +s = StringRemoveCharsInRange (s, 1048576, 1114109);Supplementary Private Use Area-B +return s +EndFunction + +string Function StringRemoveZeroWidthSpaceChars(string s) +s = StringRemoveCharsInRange (s, 0x200b, 0x200d);zero width space, zero width non-joiner, and zero width joiner +s = StringRemoveCharsInRange (s, 0x2060, 0x2060);word joiner +s = StringRemoveCharsInRange (s, 0xfeff, 0xfeff);zero width no-break space +return s +EndFunction + +string Function StringRemoveControlChars(string s) +s = StringRemoveCharsInRange (s, 0x00, 0x1f);C0 +s = StringRemoveCharsInRange (s, 0x7f, 0x7f);delete +s = StringRemoveCharsInRange (s, 0x80, 0x9f);C1 +return s +EndFunction + +script GestureToggleShowTouchKeyboard() +ToggleShowTouchKeyboard() +EndScript + +Script VirtualRibbonToggle() +if GetMenuMode() +|| RibbonsActive() + Say(cmsgNotAvailableInRibbonsOrMenus_error,ot_error) + return +endIf +var + handle hFocus, + string sApp +hFocus = GetFocus() +sApp = GetWindowOwner(hFocus) +sApp = StringSegment(sApp,cScDoubleBackSlash,StringSegmentCount(sApp,cScDoubleBackSlash)) +if (InHJDialog() && StringStartsWith(GetWindowName(GetTopLevelWindow(hFocus)),"QuickSettings")) +|| StringStartsWith(sApp,"SettingsCenter") + Say(cmsgNotAvailableInQuickSettingsOrSettingsCenter_Error,ot_error) + return +endIf +;Get the current value, +;and set to the opposite state in memory for both the default and the app-specific, +;just in case there is an app-specific setting in the JCF file. +var int setting = !(GetJCFOption (OPT_VIRTUAL_RIBBON_SUPPORT)) +SetDefaultJCFOption(OPT_VIRTUAL_RIBBON_SUPPORT,setting) +SetJCFOption(OPT_VIRTUAL_RIBBON_SUPPORT,setting) +if setting + SayMessage(ot_status,cmsgVRStatus_On_L) +else + SayMessage(ot_status,cmsgVRStatus_Off_L) +endIf +EndScript + +void function ShiftedCharacterPressedWithCapsLockEvent() +PlaySound(FindJAWSSoundFile("CapsLockWithShiftWarning.wav")) +EndFunction + +function TableRowChangedEvent(int oldRow, int newRow) +;Called when arrowing left or right at a row extremity to allow scripts to indicate that the cursor has wrapped to the prior or next table row. +var +string sMessage +if newRow > oldRow then + playSound(FindJAWSSoundFile("Ascend.wav")) +else + playSound(FindJAWSSoundFile("descend.wav")) +endIf +if gbDefaultVCursorCellCoordinatesAnnouncement then + let sMessage = FormatString (cmsgRowHeader, IntToString (newRow)) + SayUsingVoice (VCTX_message, sMessage, ot_position) +endIf +endFunction + +Script SmartNavToggle () +ToggleSmartNavLevelAndResetDocPresentation () +endScript + +void function SpeakMagicEnhancementScheme () +var string scheme = iniReadStringEx ("scheme", globalEnhancementSchemeType, "", FLOC_USER_SETTINGS, "Default.mcf") +if stringIsBlank (scheme) then +;then we have not updated for some reason. + scheme = iniReadStringEx ("scheme", globalEnhancementSchemeType, "", FLOC_SHARED_SETTINGS, "Default.mcf") +endIf +if scheme && stringContains (scheme, "+") then +; scheme name from file is tokenized in two segments containing the name and the type. + scheme = stringSegment (scheme, "+", + (StringSegmentCount (scheme, "+")-1) + ) +endIf +if ! StringIsBlank (scheme) then + say (scheme, ot_status) +endIf +endFunction + +Script SwitchToNextMouseEnhancementScheme () +unscheduleFunction (GlobalSpeakEnhancementsTimer) +SwitchToNextMouseScheme () +globalEnhancementSchemeType = MouseEnhancementScheme +GlobalSpeakEnhancementsTimer = ScheduleFunction ("SpeakMagicEnhancementScheme", 1) +endScript + +Script SwitchToPriorMouseEnhancementScheme () +unscheduleFunction (GlobalSpeakEnhancementsTimer) +SwitchToPriorMouseScheme () +globalEnhancementSchemeType = MouseEnhancementScheme +GlobalSpeakEnhancementsTimer = ScheduleFunction ("SpeakMagicEnhancementScheme", 1) +endScript + +Script SwitchToNextCursorEnhancementScheme () +unscheduleFunction (GlobalSpeakEnhancementsTimer) +SwitchToNextCursorScheme () +globalEnhancementSchemeType = CursorEnhancementScheme +GlobalSpeakEnhancementsTimer = ScheduleFunction ("SpeakMagicEnhancementScheme", 1) +endScript + +Script SwitchToPriorCursorEnhancementScheme () +unscheduleFunction (GlobalSpeakEnhancementsTimer) +SwitchToPriorCursorScheme () +globalEnhancementSchemeType = CursorEnhancementScheme +GlobalSpeakEnhancementsTimer = ScheduleFunction ("SpeakMagicEnhancementScheme", 1) +endScript + +Script SwitchToNextColorEnhancementScheme () +unscheduleFunction (GlobalSpeakEnhancementsTimer) +SwitchToNextColorScheme () +globalEnhancementSchemeType = ColorEnhancementScheme +GlobalSpeakEnhancementsTimer = ScheduleFunction ("SpeakMagicEnhancementScheme", 1) +endScript + +Script SwitchToPriorColorEnhancementScheme () +unscheduleFunction (GlobalSpeakEnhancementsTimer) +SwitchToPriorColorScheme () +globalEnhancementSchemeType = ColorEnhancementScheme +GlobalSpeakEnhancementsTimer = ScheduleFunction ("SpeakMagicEnhancementScheme", 1) +endScript + +Script ToggleDefaultUserMode() +var + int currentMode, + int newMode +currentMode = GetAlternateUserDirectoryMode() +newMode = AlternateUserDirMode_Default +if (currentMode != AlternateUserDirMode_Off) + newMode = AlternateUserDirMode_Off +endIf +SetAlternateUserDirectoryMode(newMode) +endScript + +Void Function AlternateUserDirectoryModeChangedEvent() +var + int currentMode, + string longMessage, + string shortMessage +currentMode = GetAlternateUserDirectoryMode() +if (currentMode == AlternateUserDirMode_Default) + longMessage = cmsgDefaultAlternateUserDirectoryMode_L + shortMessage = cmsgDefaultAlternateUserDirectoryMode_S +elif (currentMode == AlternateUserDirMode_Roam) + longMessage = cmsgRoamAlternateUserDirectoryMode_L + shortMessage = cmsgRoamAlternateUserDirectoryMode_S +else + longMessage = cmsgAlternateUserDirectoryModeOff_L + shortMessage = cmsgAlternateUserDirectoryModeOff_S +endIf +SayMessage(ot_status, longMessage, shortMessage) +EndFunction + +int function sayConnectionStatusInfoWindows11 () +Var + Int TrayIconsCount, + Int i, + Handle hTop = FindTopLevelWindow (cwc_ShellNotify, Null ()), + Handle hTool = FindWindow (hTop, Windows11SysTrayIconsClass), + Object window = FSUIAGetElementFromHandle (hTool), + object trayIcons, object trayIcon, + String Name +if ! hTool || ! window return FALSE endIf +var object condition = FSUIACreateStringPropertyCondition(UIA_AutomationIdPropertyId, + UIA_AutomationID_Windows_11_Tray_Icon) +if ! condition return FALSE endIf +trayIcons = window.FindAll(TreeScope_Subtree, condition) +if ! TrayIcons || ! TrayIcons.count return FALSE endIf +TrayIconsCount = TrayIcons.count +For i = 0 To TrayIconsCount-1 + trayIcon = trayIcons(i) + Name = trayIcon.name + If StringContains (Name, csc_Network) + || StringContains (Name, csc_Access) + || StringContains (Name, csc_Connected) + Say (Name, OT_USER_REQUESTED_INFORMATION) + return TRUE + EndIf +EndFor +return FALSE +endFunction + +void function sayConnectionStatusInfo () +if sayConnectionStatusInfoWindows11 () return endIf +Var + Int iChild, + Int i, + Handle hTop = FindTopLevelWindow (cwc_ShellNotify, Null ()), + Handle hTool = FindWindowWithClassAndId (hTop, cwc_ShellNotifyToolBar, cID_ShellNotifyToolBar), + Object oTool = GetObjectFromEvent (hTool, OBJID_CLIENT, 0, iChild), + String sName +if oTool == null () then +;The parent is also a tool bar without a relevant MSAA object. + hTool = getParent (hTool) + hTool = FindWindow (hTool, "SysPager") + hTool = FindWindowWithClassAndId (hTool, cwc_ShellNotifyToolBar, cID_ShellNotifyToolBar) + oTool = GetObjectFromEvent (hTool, OBJID_CLIENT, 0, iChild) +endIf +For i = 1 To oTool.accChildCount + sName = oTool.accName (i) + If StringContains (sName, csc_Network) + || StringContains (sName, csc_Access) + || StringContains (sName, csc_Connected) + Say (sName, OT_USER_REQUESTED_INFORMATION) + EndIf +EndFor +endFunction + +Script SayConnectionStatus () +If Not IsSameScript () + SayBatteryLevelInfo () + Return +EndIf +sayConnectionStatusInfo () +EndScript + +int function RouteTouchToJAWS() +var int x, int y +GetCursorPos(CURSOR_JAWS,smmPixels,x,y) +if !x && !y return false endIf +var object oUIA = CreateObjectEx ("FreedomSci.UIA", 0, "UIAScriptAPI.x.manifest" ) +var object element = oUIA.GetElementFromPoint(X,Y).BuildUpdatedCache() +if !element return false endIf +if IsJAWSCursor() then PCCursor() endIf +ActivateTouchCursor() +SetTouchNavigationMode(2) ;ObjectNavigation_Advanced +g_UIATreeWalker.currentElement = element +BrailleRefresh() +return true +EndFunction + +int function RouteJAWSToTouch() +var int x, int y +UIAGetPoint(x,y) +;x or y can be negative if the element is off screen: +if x<=0 || y<=0 return false endIf +if IsTouchCursor() ExitTouchNavigation() endIf +JAWSCursor() +MoveTo(x,y) +return true +EndFunction + +script RouteTouchCursorToJAWS() +if !RouteTouchToJAWS() + Beep() + return +endIf +SayMessage(ot_status,cmsgRouteTouchToJAWS_L,cmsgRouteTouchToJAWS_S) +EndScript + +script RouteJAWSCursorToTouch() +if !RouteJAWSToTouch() + Beep() + return +endIf +SayMessage(ot_status,cmsgRouteJAWSToTouch_L,cmsgRouteJAWSToTouch_S) +EndScript + +script RouteTouchToMouse() +if !RouteTouchToJAWS() + Beep() + return +endIf +SayMessage(ot_status,cmsgRouteTouchToMouse_L,cmsgRouteTouchToMouse_S) +EndScript + +script RouteMouseToTouch() +if !RouteJAWSToTouch() + Beep() + return +endIf +SayMessage(ot_status,cmsgRouteMouseToTouch_L,cmsgRouteMouseToTouch_S) +EndScript + +void function ClearRect(int byRef left, int byRef top, int byRef right, int byRef bottom) +left = 0 +top = 0 +right = 0 +bottom = 0 +EndFunction + +Script PassThroughNextGesture() +Say(cmsgPassThroughNextGesture,ot_JAWS_message) +SetPassThroughNextGesture(1) +EndScript + +Script TogglePerModeGestures () +gbPerModeGesturesEnabled = !gbPerModeGesturesEnabled +EnablePerModeGestures(gbPerModeGesturesEnabled) +if (gbPerModeGesturesEnabled) + SayMessage(ot_Status,cmsgJAWSHandlesGestures_L,cmsgJAWSHandlesGestures_S) +else + SayMessage(ot_Status,cmsgWindowsHandlesGestures_L,cmsgWindowsHandlesGestures_S) +endIf +EndScript + +script AnnounceCurrentGestureModeAsError() +;To handle scenarios where the call is from a continuous gesture, +;schedule the announcement to occur only once: +ScheduleAnnounceCurrentGestureModeAsError() +EndScript + +script ToggleAudioDucking() +if !IsWindows8() + Say(msgAudioDuckingOSError,ot_error) + return +endIf + +; To avoid every random write to the default JCF file resetting this setting, +; we save this setting as a transient setting. +var int setting = GetJCFOption(OPT_LOWER_OTHER_APPS_VOLUME) +if setting + Say(msgAudioDucking_Off,ot_status) + SetDefaultJCFOption(OPT_LOWER_OTHER_APPS_VOLUME,Off) + WriteSettingInteger (Section_Options, hKey_LowerAppVolumeWhileJAWSIsRunning, 0, FT_DEFAULT_JCF, wdSession) + if GlobalAudioDuckingDisabledByRouting == 1 then + GlobalAudioDuckingDisabledByRouting = 0 + endIf +else + if GlobalAudioIsRouted == 1 then + Say(cMsgAudioDuckingDisabledByRoutingError, ot_error) + else + SetDefaultJCFOption(OPT_LOWER_OTHER_APPS_VOLUME,On) + WriteSettingInteger (Section_Options, hKey_LowerAppVolumeWhileJAWSIsRunning, 1, FT_DEFAULT_JCF, wdSession) + Say(msgAudioDucking_On,ot_status) + endIf +endIf +EndScript + +object function CreateXMLDomDoc() +var object XMLDomDoc +XMLDomDoc = CreateObject("msxml2.DOMDocument.6.0") +if (!XMLDomDoc) return Null() EndIf +XMLDomDoc.async = false +XMLDomDoc.resolveExternals = false +return XMLDomDoc +EndFunction + +int function LoadAndParseXML(object XMLDomDoc, string XML) +XMLDomDoc.loadXML(xml) +If XMLDomDoc.parseError.errorCode + return false +endIf +return true +EndFunction + +object function GetFSXMLDomDoc(optional string byRef XMLString) +var object XMLDomDoc = CreateXMLDomDoc() +if !XMLDomDoc return Null() EndIf +XMLString = cscNull +var string xml = getDocumentXML() +if !xml return Null() endIf +XMLString = XML +LoadAndParseXML(XMLDomDoc,XML) +return XMLDomDoc +EndFunction + +object function GetFSXMLDomDocUnrestricted(optional string byRef XMLString) +var object XMLDomDoc = CreateXMLDomDoc() +if !XMLDomDoc return Null() EndIf +XMLString = cscNull +var string xml = getDocumentXMLUnrestricted() +if !xml return Null() endIf +XMLString = XML +LoadAndParseXML(XMLDomDoc,XML) +return XMLDomDoc +EndFunction + +object function GetFSXMLElementNode(optional int AncestorCount) +var object XMLDomElement = CreateXMLDomDoc() +if !XMLDomElement return Null() endIf +var string xml = getElementXML(AncestorCount) +if !xml return Null() endIf +if !LoadAndParseXML(XMLDomElement,XML) return Null() endIf +var object node = XMLDomElement.SelectSingleNode("/*") +return node +endFunction + +string function GetStateInfoFromXMLDomNodeAttributes(object attribs) +if !attribs return cscNull endIf +if attribs.GetNamedItem("aria-disabled").nodeValue=="true" + return cMsgNotAvailable ; grayed +endIf +if attribs.GetNamedItem("aria-selected").nodeValue=="true" + return cmsg215_L ; selected +elif attribs.GetNamedItem("aria-pressed").nodeValue=="true" + return cmsgPressedGraphic1_L ; pressed +elif attribs.GetNamedItem("aria-checked").nodeValue=="true" +|| (attribs.GetNamedItem("checkable").nodeValue == "true" && attribs.GetNamedItem("checked").nodeValue =="true") + return cMSG_checked ; checked +elif attribs.GetNamedItem("aria-checked").nodeValue=="false" +|| (attribs.GetNamedItem("checkable").nodeValue == "true" && attribs.GetNamedItem("checked").nodeValue =="false") + return cmsg_notchecked ; not checked +else + return cscNull +endIf +endFunction + +string function GetTextFromXMLDomTextChildNodes(object node) +if !node return cscNull endIf +;node.nodeValue may retrieve too much information, +;since it may retrieve text from all descendants. +;This gets the text from any text child nodes. +var object nodes = node.childNodes +if !nodes return cscNull endIf +var object o, string s, string text +forEach o in nodes + if o.nodeType == XML_TEXT_NODE + s = o.text + if !StringIsBlank(s) + text = text+s+cscBufferNewLine + endIf + endIf +endForEach +return StringChopRight(text,1) +EndFunction + +string function GetXMLDomNodeText(object node) +if !node return cscNull endIf +var string text = GetTextFromXMLDomTextChildNodes(node) +if !text + text = node.text +endIf +if StringIsBlank(text) + text = node.attributes.GetNamedItem("fsText").nodeValue +endIf +return text +EndFunction + +string function GetXMLDomNodeID(object node) +if !node return cscNull endIf +return node.attributes.GetNamedItem("id").nodeValue +EndFunction + +string function GetXMLNodeTypeString(object node) +if !node return cscNull endIf +return GetControlTypeName(node.attributes.GetNamedItem("fsType").nodeValue) +EndFunction + +string function GetXMLDomNodeTypeAndText(object node) +if !node return cscNull endIf +var + string typeString, + string state, + string text, + int type +type = node.attributes.GetNamedItem("fsType").nodeValue +typeString = GetControlTypeName(type) +state = GetStateInfoFromXMLDomNodeAttributes(node.attributes) +text = GetXMLDomNodeText(node) +if type == wt_edit +|| type == wt_multiline_edit + return state+cscSpace+typeString+cscSpace+text +endIf +return text+cscSpace+typeString+cscSpace+state +EndFunction + +int function ShouldProcessLiveRegion(string text, string attribs) +; Note: this gets called prior to sending to Braille or speech queue. +; Override this to filter out live regions based on text or attributtes. +; return TRUE if you want the live region to be processed, FALSE to ignore it. +return TRUE +endFunction + +void function BrailleLiveRegionEventText (string text, int OutputType) +if ! ShouldItemBraille (OutputType) +|| stringIsBlank (text) then + return ; no blank messages. +endIf +var string StatusCellsMessage = GetOutputModeName (OutputType, OutputToBrailleDevice) +handleSetBrailleMessageStatusText (StatusCellsMessage) +handleBrailleMessage(text,ShouldAppendFlashMessage()) +endFunction + +int function SpeakLiveRegionEvent(string text, int suggestedOutputType, int containsSpeechMarkup) +; Note: this gets called at the time the speech queue element is spoken. +; You may override the Output type but do not Flash this in Braille if structured mode is enabled +;as it may be presented in the structured data. +; return true if we speak from here, false to defer to internals. +; Update Braille display as a help balloon, because screenMessage doesn't show in Braille. +var string appName = GetAppFileNameWithoutExtension() +var collection notificationRuleActions = ProcessNotification(smmStripMarkup(text), appName) +if !notificationRuleActions.ExcludeFromNotificationHistory then + StoreSpokenNotificationForRepeat (smmStripMarkup(text), appName) +endIf + if StringCompare(notificationRuleActions.SpeechActionType, NotificationProcessing_GlobalActionNoAction) == 0 then + notificationRuleActions.SpeechActionParameter = text + elif StringCompare(notificationRuleActions.SpeechActionType, NotificationProcessing_SpeechActionShortenSpeechMessage) == 0 then + var string languageCode = ExtractLanguageCodeFromMarkup(text) + if !StringIsBlank(languageCode) then + notificationRuleActions.SpeechActionParameter = AddMarkupForLanguage(languageCode, notificationRuleActions.SpeechActionParameter) + endIf + endIf + SayNotification(notificationRuleActions, suggestedOutputType, containsSpeechMarkup) +return TRUE +endFunction + +void function OCRFileWithType (string byRef documentPath, int type) +var + int PrimaryLanguage = ReadSettingInteger (section_OCR, hKey_PrimaryRecognitionLanguage, 1033, FT_DEFAULT_JCF), + int SecondaryLanguage = ReadSettingInteger (section_OCR, hKey_SecondaryRecognitionLanguage, 1033, FT_DEFAULT_JCF), + int result = OCRResult_Success; +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if CanRecognize () != OCR_SUCCESS then + SayFormattedMessage (OT_ERROR, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) + Return +endIf +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf +result = RecognizeFile (documentPath, PrimaryLanguage, SecondaryLanguage, GlobalOCRJobID, type) +if result == OCRResult_Success then + SayMessage (OT_JAWS_MESSAGE, msg_OCRDocumentStarted_L, MSG_OCRStarted_S) + globalDocumentOCR = TRUE +Else + StopSpeech() + If result == OCRResult_NoFileSelected then + MessageBox(msgOCRNoFileSelected) + ElIf result == OCRResult_MultipleFilesSelected then + MessageBox(msgOCRMultipleFilesSelected) + ElIf result == OCRResult_UnsupportedFileSelected then + MessageBox(msgOCRUnsupportedFileSelected) + else + MessageBox(MSG_OCR_PDF_FAILED_TO_Start) + endIf +endif +endFunction + +void function OCRFile (string byRef documentPath) +OCRFileWithType(documentPath, csConvientientOCR) +endFunction + +void function OCRFileToWord (string byRef documentPath) +OCRFileWithType(documentPath, csConvientientOCRToWord) +endFunction + +void function OCRReportMultipleFilesSelected() + MessageBox(msgOCRMultipleFilesSelected) +endFunction + +script OCRAllInOne (optional int serviceOptions) +if IsBackgroundOCREnabled() + HandleBackgroundOCR(0, hwndGlobalOCRBackgroundRecognition) +endIf +if SetCustomBackgroundOCRRect() + c_BackgroundOCRRect.restrictedToCustomRect = true + PerformScript StartBackgroundRecognition(serviceOptions) + return +endIf +PerformScript RecognizeRealWindow() +EndScript + +script OCRAllInOneWithSound () +PerformScript OCRAllInOne (BackgroundOCRServiceOptions_PlaySound) +EndScript + +Script OCRSelectedFile () +Say(cmsgOCRSelectedFileNotAvailable,ot_error) +endScript + +Script OCRSelectedFileToWord () +Say(cmsgOCRSelectedFileNotAvailable,ot_error) +endScript + +Script OCRDocument () +Say(cmsgOCRDocumentNotAvailable,ot_error) +EndScript + +Void Function OcrAcquisitionRotated(Int iJobID, Int degreesRotated) +If GlobalOCRJobID != iJobID then + Return +Endif +If 0 == degreesRotated then + SayMessage(OT_JAWS_MESSAGE, msg_OCRAcquisitionOrientation_Normal, msg_OCRAcquisitionOrientation_Normal) +ElIf 90 == degreesRotated then + SayMessage(OT_JAWS_MESSAGE, msg_OCRAcquisitionOrientation_Sideways, msg_OCRAcquisitionOrientation_Sideways) +ElIf 180 == degreesRotated then + SayMessage(OT_JAWS_MESSAGE, msg_OCRAcquisitionOrientation_UpSideDown, msg_OCRAcquisitionOrientation_UpSideDown) +ElIf 270 == degreesRotated then + SayMessage(OT_JAWS_MESSAGE, msg_OCRAcquisitionOrientation_SidewaysUpSideDown, msg_OCRAcquisitionOrientation_SidewaysUpSideDown) +Endif +endFunction + +string function getScreenShadeUnavailableMessageByProduct () +var int fsProducts = getRunningFSProducts () +If fsProducts & product_ZoomText return cmsgScreenShadeUnavailableZoomText +elIf fsProducts & product_MAGic return cmsgScreenShadeUnavailableMAGic +else return cmsgScreenShadeUnavailable endIf +endFunction + +script ScreenShadeToggle() +if ! isScreenShadeAvailable () then ; from quickSet.jss + var string msg + if IsSecureDesktop () then + msg = cmsgScreenShadeUnavailableSecureDesktop + elif ! IsWindows8 () then + msg = cmsgScreenShadeUnavailableWindows7 + else + msg = getScreenShadeUnavailableMessageByProduct () + endIf + sayMessage (OT_ERROR, msg) + return +endIf +ToggleScreenShade () +var int screenShade = IsScreenShadeOn () +var string shortMessage, string longMessage; +if screenShade then + shortMessage = cmsgOn + longMessage = cmsgScreenShadeOn_L +else + shortMessage = cmsgOff + longMessage = cmsgScreenShadeOff_L +endIf +sayMessage (OT_STATUS, longMessage, shortMessage) +endScript + +int function IsReadOnlyEditObject() +var int theType = GetObjectSubtypeCode() +if theType == wt_ReadOnlyEdit return true endIf +;Testing window subtypecode will catch some multiline edits which were not caught by the object type code test: +if (GetWindowSubtypeCode(GetFocus()) == wt_ReadOnlyEdit) return true endIf +;additionally check UIA: +if theType != wt_edit +&& TheType != wt_multiline_Edit +&& theType != wt_unknown +&& TheType != wt_document + return false +endIf +var object element = FSUIAGetFocusedElement().buildUpdatedCache() +return element.GetValuePattern().IsReadOnly == UIATrue +endFunction + +void function UIATextEditTextChangedEvent(int changeType, string text) +;This event is generated by JAWS when UIA raises the TextEditTextChangedEvent, when the editor modifies the text. +;An example is when MSWord autocorrects or autocompletes text. +; The changeType and first text change is passed to the script event. +; changeTypes include: +; TextEditChangeType_None = 0, +; TextEditChangeType_AutoCorrect = 1, +; TextEditChangeType_Composition = 2, +; TextEditChangeType_CompositionFinalized = 3, +; TextEditChangeType_AutoComplete = 4 +endFunction + +void function UIANotificationEvent(int notificationKind, int notificationProcessing, string displayString, string activityId, string appName) +; This event is generated by JAWS when UIA raises the NotificationEvent. +;All UIA parameters are passed unchanged to this event. +;Valid values for the notificationKind parameter include: +; NotificationKind_ItemAdded = 0, +; NotificationKind_ItemRemoved = 1, +; NotificationKind_ActionCompleted = 2, +; NotificationKind_ActionAborted = 3, +; NotificationKind_Other = 4 +;Valid values for the notificationProcessing parameter include: +; NotificationProcessing_ImportantAll = 0, +; NotificationProcessing_ImportantMostRecent = 1, +; NotificationProcessing_All = 2, +; NotificationProcessing_MostRecent = 3, +; NotificationProcessing_CurrentThenMostRecent = 4 +; For now, all notifications are indicated as Toast mesages (speech and Braille) dependent on the new JCF option: +; OPT_ENABLE_ACCESSIBLE_NOTIFICATION_EVENTS +if getJCFOption (OPT_ENABLE_ACCESSIBLE_NOTIFICATION_EVENTS) then + if (GlobalIgnoreNotificationsFromVolumeChange + && (ActivityID == Activity_ID_Notification_Volume + || ActivityID == Activity_ID_Notification_Volume_Win11)) + || ActivityID == Activity_ID_Notification_InputSwitch ;Ignore UIA notifications for keyboard switching in favor of KeyboardLanguageChangedEvent + || activityId == "TerminalTextOutput" + return + endIf + if notificationKind == NotificationKind_ActionCompleted + && activityId == Activity_ID_Notification_WindowSnap + ClearWinArrowGlobals() + if StringEndsWith (displayString, cmsgWindowMinimized) + displayString = cmsgWindowMinimized;remove window title + else + var string sWindowName = GetWindowName (GetAppMainWindow (GetFocus ())) + if sWindowName + && StringStartsWith (displayString, sWindowName) + displayString = StringDiff (displayString, sWindowName);remove window title + endIf + endIf + endIf + if activityId == "HandleMoved" + ;A flood of notifications is produced when using the SnippingTool + ;Schedule function to only speak/store the most recent notification. + if giScheduledUIANotification + UnScheduleFunction (giScheduledUIANotification) + endIf + gsUIANotificationDisplayString = displayString + gsUIANotificationAppName = appName + giScheduledUIANotification = ScheduleFunction ("ScheduledUIANotification", 2, false) + return + endIf + var collection notificationRuleActions = ProcessNotification(displayString, appName) + ; We need to make sure notifications aren't repeated endlessly. + ; To that end, we check if we've said the same thing less than 500 miliseconds ago + if !IsRepeatNotification(displayString) + SayNotification(notificationRuleActions, OT_TOASTS) + endIf + ; We want to store even if we don't speak, to avoid repititions + if !notificationRuleActions.ExcludeFromNotificationHistory then + StoreSpokenNotificationForRepeat (displayString, appName) ; for new insert+Space&N keystroke. + endIf +endIf +endFunction + +void function ScheduledUIANotification() +var collection notificationRuleActions = ProcessNotification(gsUIANotificationDisplayString, gsUIANotificationAppName) +if !IsRepeatNotification(gsUIANotificationDisplayString) + SayNotification(notificationRuleActions, OT_TOASTS) +endIf +if !notificationRuleActions.ExcludeFromNotificationHistory then + StoreSpokenNotificationForRepeat (gsUIANotificationDisplayString, gsUIANotificationAppName) +endIf +giScheduledUIANotification = 0 +gsUIANotificationDisplayString = cscNull +gsUIANotificationAppName = cscNull +endFunction + +void function UIAChangesEvent(int type, string payload, string extraInfo) +;This event is generated by JAWS when UIA raises the ChangesEvent for one of the below properties: +; UIA_AnnotationType_SpellingError = 60001; +; UIA_AnnotationType_GrammarError = 60002; +; UIA_AnnotationType_AdvancedProofingIssue = 60020; +; UIA_AnnotationType_DataValidationError = 60021; +;UIA_AnnotationType_Author = 60019 +; This event should play the spelling error sound. +if type == UIA_AnnotationType_SpellingError then + WordMisspelledEvent() +elif type==UIA_AnnotationType_Author then +; This attribute changes when a colaborating author navigates to the same line this user is editing. +; The payload is "author" and extraInfo is the author's name. ExtraInfo may however be empty. + if extraInfo==cscNull then + extraInfo=cmsgUnknownAuthor + endIf + SayFormattedMessage(OT_JAWS_MESSAGE, cmsgNamedCoAuth_l, cmsgNamedCoAuth_s, extraInfo) +endIf +endFunction + +void function SayCharacter(optional int wantMarkup) +var +int pauseTime=GetJCFOption(OPT_PHONETIC_CHAR_AFTER_PAUSE) +if pauseTime > 0 then + ScheduleFunction("SayCharacterPhoneticAfterPause", pauseTime, true) +endIf +builtin::SayCharacter(wantMarkup) +endFunction + +void function SayCharacterPhoneticAfterPause() +if GetCharacterPhonetic()!=cscNull && stringLength(stringStripAllBlanks(getCharacter()))==1 then + sayCharacterPhonetic() +endIf +endFunction + +int function PictureSmartWithSelectedFileCommon (string filename, int serviceOptions) +var + int result = OCRResult_Success, + string question = cscNULL +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if !IsPictureSmartEnabled() then + Return +endif + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +result = IsTelemetryEnabled(TRUE); +If result == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif result != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +result = DescribeFile(filename, serviceOptions, question) +If result == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +ElIf result == PSResult_NoFileSelected then + SayFormattedMessage (OT_ERROR, msg_picturesmart_nofileselected) +ElIf result == PSResult_MultipleFilesSelected then + SayFormattedMessage (OT_ERROR, msg_picturesmart_multiplefileselected) +ElIf result == PSResult_UnsupportedFileSelected then + SayFormattedMessage (OT_ERROR, msg_picturesmart_unsupportedformat) +elif result != PSResult_Success then + SayFormattedMessage (OT_ERROR, msg_picturesmart_failedtostart) +endIf +endFunction + +; Describe an image previously captured in DescribeCursorEx. The image is taken at the current location +; of the virtual cursor and stored in the internal cache in the Picture Smart controller. +; To identify the image, its md5 sum is calculated and passed to the Results Viewer. +; param imageHash - an identifier of the image cached in the Picture Smart controller. +; param serviceOptions - additional Picture Smart service options, see PSServiceOptions_* in HJConst +int function PictureSmartWithCachedArea (string imageHash, int serviceOptions) +var + int result = OCRResult_Success, + string question = cscNULL +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if !IsPictureSmartEnabled() then + Return +endif + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +result = IsTelemetryEnabled(TRUE); +If result == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif result != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +result = DescribeCachedArea(imageHash, serviceOptions, question) +If result == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +ElIf result == PSResult_NoFileSelected then + SayFormattedMessage (OT_ERROR, msg_picturesmart_nofileselected) +ElIf result == PSResult_MultipleFilesSelected then + SayFormattedMessage (OT_ERROR, msg_picturesmart_multiplefileselected) +ElIf result == PSResult_UnsupportedFileSelected then + SayFormattedMessage (OT_ERROR, msg_picturesmart_unsupportedformat) +elif result != PSResult_Success then + SayFormattedMessage (OT_ERROR, msg_picturesmart_failedtostart) +endIf +endFunction + +Int Function PictureSmartWithCameraCommon (int serviceOptions) +var + Int iCanRecognize, + Int recognitionResult, + string question = cscNULL +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if !IsPictureSmartEnabled() then + Return +endif +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +recognitionResult = IsTelemetryEnabled(TRUE); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +Let iCanRecognize = CanRecognize () +If iCanRecognize == OCR_NOT_SUPPORTED + Return +EndIf +If iCanRecognize == OCR_SUCCESS + recognitionResult = DescribeCamera (serviceOptions, question) + If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) + elif recognitionResult == PSResult_NoDevicesAvailable then + SayFormattedMessage (OT_ERROR, msg_OCR_NoDevicesAvailable) + elif recognitionResult != PSResult_Success then + SayFormattedMessage (OT_ERROR, MSG_OCR_PDF_FAILED_TO_Start) + EndIf +Else + SayFormattedMessage (OT_JAWS_MESSAGE, MSG_OCRNotInstalled_L, MSG_OCRNotInstalled_S) +EndIf +EndFunction + +Script PictureSmartWithCamera (optional int serviceOptions) +PictureSmartWithCameraCommon (PSServiceOptions_Single | serviceOptions) +EndScript + +Script PictureSmartWithCameraAskPrelim () +PerformScript PictureSmartWithCamera (PSServiceOptions_AskPrelim) +EndScript + +Script PictureSmartWithCameraMultiService (optional int serviceOptions) +PictureSmartWithCameraCommon (PSServiceOptions_Multi | serviceOptions) +EndScript + +Script PictureSmartWithCameraMultiServiceAskPrelim () +PerformScript PictureSmartWithCameraMultiService (PSServiceOptions_AskPrelim) +EndScript + +int function PictureSmartWithControlCommon (int serviceOptions, int forceCursor) +var + Handle hCurrent = GetCurrentWindow (), + Int iLeft, + Int iRight, + Int iBottom, + Int iTop, + Int recognitionResult, + string question = cscNULL +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_picturesmart_UnavailableScreenShade) + return +endIf +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf +if !IsPictureSmartEnabled() then + Return +endIf + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +recognitionResult = IsTelemetryEnabled(TRUE); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +if forceCursor || IsVirtualPCCursor() then + recognitionResult = DescribeCursorEx(serviceOptions, question) +elif GetObjectRect(iLeft, iRight, iTop, iBottom) + recognitionResult = DescribeAreaEx (iLeft, iTop, iRight, iBottom, serviceOptions, question) +elif GetWindowRect (hCurrent, iLeft, iRight, iTop, iBottom) + recognitionResult = DescribeAreaEx (iLeft, iTop, iRight, iBottom, serviceOptions, question) +endIf + +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult == PSResult_CursorModeIncorrect then + sayMessage (OT_ERROR, msg_picturesmart_controlnotgraphic) +elif recognitionResult == PSResult_NoArea then + sayMessage (OT_ERROR, msg_picturesmart_noarea) +elif recognitionResult != PSResult_Success then + sayMessage (OT_ERROR, msg_picturesmart_failedtostart) +EndIf +EndFunction + +script PictureSmartWithControl (optional int serviceOptions) +var int forceCursor = 0 +PictureSmartWithControlCommon (PSServiceOptions_Single | serviceOptions, forceCursor) +endScript + +script PictureSmartWithControlAskPrelim () +PerformScript PictureSmartWithControl (PSServiceOptions_AskPrelim) +endScript + +script PictureSmartWithControlMultiService (optional int serviceOptions) +var int forceCursor = 0 +PictureSmartWithControlCommon (PSServiceOptions_Multi | serviceOptions, forceCursor) +endScript + +script PictureSmartWithControlMultiServiceAskPrelim () +PerformScript PictureSmartWithControlMultiService (PSServiceOptions_AskPrelim) +endScript + +Script PictureSmartWithSelectedFile (optional int serviceOptions) +if !IsPictureSmartEnabled() then + Return +endif +Say(msg_picturesmart_selectederror, ot_error) +endScript + +Script PictureSmartWithSelectedFileAskPrelim () +PerformScript PictureSmartWithSelectedFile (PSServiceOptions_AskPrelim) +endScript + +Script PictureSmartWithSelectedFileMultiService (optional int serviceOptions) +if !IsPictureSmartEnabled() then + Return +endif +Say(msg_picturesmart_selectederror, ot_error) +endScript + +Script PictureSmartWithSelectedFileMultiServiceAskPrelim () +PerformScript PictureSmartWithSelectedFileMultiService (PSServiceOptions_AskPrelim) +endScript + +int function PictureSmartWithScreenShared (int serviceOptions) +var + Int recognitionResult, + string question = cscNULL +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_picturesmart_UnavailableScreenShade) + return +endIf +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf +if !IsPictureSmartEnabled() then + Return +endif + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +recognitionResult = IsTelemetryEnabled(TRUE); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +var int screenWidth = ScreenGetWidth(); +var int screenHeight = ScreenGetHeight(); + +recognitionResult = DescribeAreaEx(0, 0, screenWidth, screenHeight, serviceOptions, question); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + sayMessage (OT_ERROR, msg_picturesmart_failedtostart) +EndIf +endFunction + +script PictureSmartWithScreen (optional int serviceOptions) +PictureSmartWithScreenShared (PSServiceOptions_Single | serviceOptions) +endScript + +script PictureSmartWithScreenAskPrelim () +PerformScript PictureSmartWithScreen (PSServiceOptions_AskPrelim) +endScript + +script PictureSmartWithScreenMultiService (optional int serviceOptions) +PictureSmartWithScreenShared (PSServiceOptions_Multi | serviceOptions) +endScript + +script PictureSmartWithScreenMultiServiceAskPrelim () +PerformScript PictureSmartWithScreenMultiService (PSServiceOptions_AskPrelim) +endScript + +int function PictureSmartWithWindowShared (int serviceOptions) +var + Handle hCurrent = GetCurrentWindow (), + Handle hReal = GetRealWindow (hCurrent), + Handle hApp = GetAppMainWindow (hCurrent), + Int iLeft, + Int iRight, + Int iBottom, + Int iTop, + Int bValidRect, + Int recognitionResult, + string question = cscNULL +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_picturesmart_UnavailableScreenShade) + return +endIf +If GlobalOCRJobID + SayMessage (OT_JAWS_MESSAGE, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf +if !IsPictureSmartEnabled() then + Return +endif + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +recognitionResult = IsTelemetryEnabled(TRUE); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +bValidRect = GetWindowRect (hReal, iLeft, iRight, iTop, iBottom) && ((iRight - iLeft) > 0) && ((iBottom - iTop) > 0) +If (!bValidRect) + ; Use the app main window if the real window is not valid. + bValidRect = GetWindowRect (hApp, iLeft, iRight, iTop, iBottom) && ((iRight - iLeft) > 0) && ((iBottom - iTop) > 0) +EndIf +If (!bValidRect) + sayMessage (OT_ERROR, msg_picturesmart_noarea) + return +EndIf + +recognitionResult = DescribeAreaEx(iLeft, iTop, iRight, iBottom, serviceOptions, question); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + sayMessage (OT_ERROR, msg_picturesmart_failedtostart) +EndIf +endFunction + +script PictureSmartWithWindow (optional int serviceOptions) +PictureSmartWithWindowShared (PSServiceOptions_Single | serviceOptions) +endScript + +script PictureSmartWithWindowAskPrelim () +PerformScript PictureSmartWithWindow (PSServiceOptions_AskPrelim) +endScript + +script PictureSmartWithWindowMultiService (optional int serviceOptions) +PictureSmartWithWindowShared (PSServiceOptions_Multi | serviceOptions) +endScript + +script PictureSmartWithWindowMultiServiceAskPrelim () +PerformScript PictureSmartWithWindowMultiService (PSServiceOptions_AskPrelim) +endScript + +int function PictureSmartWithAreaShared (int serviceOptions, int iLeft, int iTop, int iRight, int iBottom) +var + Int recognitionResult, + string question = cscNULL +if !IsPictureSmartEnabled() then + SayMessage (OT_ERROR, msg_picturesmart_notenabled) + Return +endIf +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_picturesmart_UnavailableScreenShade) + return +endIf +If GlobalOCRJobID + SayMessage (OT_ERROR, MSG_OCRAlreadyInProgress_L, MSG_OCRAlreadyInProgress_S) + Return +EndIf + +if(serviceOptions & PSServiceOptions_AskPrelim) then + if !PictureSmartPromptPreliminaryQuestion(question) then + return + EndIf +EndIf + +recognitionResult = IsTelemetryEnabled(TRUE); +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult != PSResult_Success then + ; no message needed since the function prompts + return +EndIf + +recognitionResult = DescribeAreaEx (iLeft, iTop, iRight, iBottom, serviceOptions, question) + +If recognitionResult == PSResult_DemoMode then + sayMessage (OT_ERROR, msg_picturesmart_demomode) +elif recognitionResult == PSResult_CursorModeIncorrect then + sayMessage (OT_ERROR, msg_picturesmart_controlnotgraphic) +elif recognitionResult == PSResult_NoArea then + sayMessage (OT_ERROR, msg_picturesmart_noarea) +elif recognitionResult != PSResult_Success then + sayMessage (OT_ERROR, msg_picturesmart_failedtostart) +EndIf +EndFunction + +script PictureSmartAllInOne (optional int serviceOptions) +PerformScript PictureSmartWithControl(serviceOptions) +endScript + +script PictureSmartAllInOneAskPrelim () +PerformScript PictureSmartAllInOne(PSServiceOptions_AskPrelim) +endScript + +script PictureSmartAllInOneMultiService (optional int serviceOptions) +PerformScript PictureSmartWithControlMultiService(serviceOptions) +endScript + +script PictureSmartAllInOneMultiServiceAskPrelim () +PerformScript PictureSmartAllInOneMultiService(PSServiceOptions_AskPrelim) +endScript + +script PictureSmartLayerHelp() +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if !IsPictureSmartEnabled() then + Return +endif +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (msg_picturesmart_helpscreentitle) +UserBufferAddTextResultsViewer(msg_picturesmart_helptext) +EndScript + +void function PictureSmartProgress(Int state) +if state == PSStatus_Started then + SayFormattedMessage (OT_STATUS, msg_picturesmart_inprogress) ; starting +elIf state == PSStatus_Processing then + PlaySound(GetSoundFileLocation("Click2.wav")) ; same sound as OCR (see RecognitionDefinitions.h) +elIf state == PSStatus_StartError then + SayFormattedMessage (OT_STATUS, msg_picturesmart_failedtostart) ; play generic error +endIf +endFunction + +void function PictureSmartChatProgress() +PlaySound(GetSoundFileLocation("Click2.wav")); +endFunction + +void function WordMisspelledEvent() +if getJCFOption(OPT_INDICATE_MISTYPED_WORD) then + playSound(GetSoundFileLocation (globalProofingErrorEnteredSound)) +endIf +endFunction + + +void function WordCorrectedEvent() +if getJCFOption(OPT_INDICATE_MISTYPED_WORD) && !IsCurrentWordMisspelled() then + playSound(GetSoundFileLocation (globalProofingErrorExitedSound)) +endIf +endFunction + +void function CheckLineAfterEdit() +; This function is called if the current word is misspelled and the user begins to type. +; It will schedule WordCorrectedEvent which if allowed to run, will play the corrected sound if the word is no longer misspelled. +scheduleFunction("WordCorrectedEvent", 2, 1); +endFunction + +;This event is triggered when a numrow heading quick nav key causes navigation to move into a new section, +; that is, pass a lower level heading. +void function NewSectionEvent(string headingContext) +; string is of the form digit 1 to 6 for heading level, then text of heading, then 007 delimiter, etc, for each heading in the new section. +; If you move to an h3 in a new section containing an h1 and h2 above this heading three, then the h1 and h2 will be included in the context. +var +int count, +string segment, +int level, +string heading, +int len, +int i + if (GetJCFOption(optHeadingNavigation)==newSectionPlaySound) then + playSound(GetSoundFileLocation("NewGroupNav.wav")) + return +endIf + +count=StringSegmentCount (headingContext, LIST_ITEM_SEPARATOR) +for i=1 to count + segment=StringSegment (headingContext, LIST_ITEM_SEPARATOR, i) + level=stringToInt(stringLeft(segment,1)) + heading=stringChopLeft(segment,1) + if (GetJCFOption(optHeadingNavigation)==newSectionSpeakHeadings) then + IndicateControlType (WT_HTML_HEADING1+level-1, heading, cscNull) + endIf +endFor +endFunction + +script ToggleScreenCaptureMethod() +var + int mode +; short messages "on" and "off" match the Accessibility Driver setting. +; The reason for this is the Settings Center option is called "Use Accessibility Driver". +mode = ReadSettingInteger (SECTION_OSM, hKey_HookingMode, 0, FT_DEFAULT_JCF) +if mode == 0 then + writeSettingInteger (SECTION_OSM, hKey_HookingMode, 1, FT_DEFAULT_JCF, wdUser) + SayMessage (OT_STATUS, cmsgUsingGDI, cmsgOff) +else + writeSettingInteger (SECTION_OSM, hKey_HookingMode, 0, FT_DEFAULT_JCF, wdUser) + SayMessage (OT_STATUS, cmsgUsingDDI, cmsgOn) +endIf + +EndScript + +Script SkypeDesktopDisconnectCall () +SkypeDesktopEndCall () +EndScript + +Script SkypeDesktopAnswerCall () +SkypeDesktopAnswerCall () +EndScript + +Script SkypeDesktopFocusSkypeWindow () +SkypeFocus () +EndScript + +Script SkypeDesktopLayerHelp () +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (msg_SkypeDesktop_HelpScreenTitle) +UserBufferAddTextResultsViewer(msg_SkypeDesktop_HelpText) +endScript + + +void function VirtualCursorChangedEvent(int vCursorSetting) +;Although vCursorSetting is passed, +;this does not tell us whether or not the virtual cursor is active if the setting is set to 3. +;We will there fore test the state of the virtual cursor against a saved state. +var int state = IsVirtualPCCursor() +if state && state != globalSavedVirtualCursorState + SayFormattedMessage(ot_status, cMSG291_L, cMSG_on) +elif !state && state != globalSavedVirtualCursorState + SayFormattedMessage(ot_status, cmsg292_l, cmsg_off) +EndIf +globalSavedVirtualCursorState = state +EndFunction + +Script ToggleBrailleViewerEnable () +var + int prevEnabled +prevEnabled = IsBrailleViewerEnabled() +if (prevEnabled == 1) + SayMessage (ot_status, cmsg_Braille_Viewer_Disabling) +Else + SayMessage (ot_status, cmsg_Braille_Viewer_Enabling) +EndIf +ToggleBrailleViewerEnable() +EndScript + +int function InHJDialogError() +if !InHJDialog () return false endIf +SayFormattedMessage (OT_ERROR, cmsg337_L, cmsg337_S) +return true +EndFunction + +Script PanBrailleViewerLeft () +var + int enabled +enabled = IsBrailleViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Braille_Viewer_ActionFailedDisabled) +Else + PerformScript BraillePanLeft() +EndIf +EndScript + +Script PanBrailleViewerRight () +var + int enabled +enabled = IsBrailleViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Braille_Viewer_ActionFailedDisabled) +Else + PerformScript BraillePanRight() +EndIf +EndScript + +Script PanBrailleViewerLeftLine2 () +var + int enabled +enabled = IsBrailleViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Braille_Viewer_ActionFailedDisabled) +Else + PerformScript BrailleSplitPanLeft() +EndIf +EndScript + +Script PanBrailleViewerRightLine2 () +var + int enabled +enabled = IsBrailleViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Braille_Viewer_ActionFailedDisabled) +Else + PerformScript BrailleSplitPanRight() +EndIf +EndScript + +Script BrailleViewerPriorLine () +var + int enabled +enabled = IsBrailleViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Braille_Viewer_ActionFailedDisabled) +Else + PerformScript BraillePriorLine() +EndIf +EndScript + +Script BrailleViewerNextLine () +var + int enabled +enabled = IsBrailleViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Braille_Viewer_ActionFailedDisabled) +Else + PerformScript BrailleNextLine() +EndIf +EndScript + +Script ToggleTextViewerEnable () +var + int prevEnabled +prevEnabled = IsTextViewerEnabled() +if (prevEnabled == 1) + SayMessage (ot_status, cmsg_Text_Viewer_Disabling) +Else + SayMessage (ot_status, cmsg_Text_Viewer_Enabling) +EndIf +ToggleTextViewerEnable() +EndScript + +Script PanTextViewerLeft () +var + int enabled +enabled = IsTextViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Text_Viewer_ActionFailedDisabled) +Else + PanTextViewerLeft() +EndIf +EndScript + +Script PanTextViewerRight () +var + int enabled +enabled = IsTextViewerEnabled() +if (enabled == 0) + SayMessage (ot_error, cmsg_Text_Viewer_ActionFailedDisabled) +Else + PanTextViewerRight() +EndIf +EndScript + +;This event is fired when the container of the caret changes, e.g. when arrowing from the main document body in MSWord to the footnote pane, or when arrowing from page to page. +;Such a change may or may not correspond to a focus changed event. +void function CaretContainerChangedEvent(int index, string name, string description, int type) +SayUsingVoice(vctx_message, name, OT_CONTROL_GROUP_NAME) +endFunction + +Script BrailleAndTextViewerLayerHelp () +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgBrailleAndTextViewerHelpScreenTitle) +UserBufferAddTextResultsViewer(cmsgBrailleAndTextViewerHelpText) +endScript + +void function ToggleWakeWordSetting () +if CheckAndHandleVoiceAssistantAvailability() then + var int setting = GetWakeWordEnabled() + var string WakeWord = GetCurrentWakeWord() + setting = ! setting + var string message + if setting then + message = formatString (cmsgToggleWakeWordListen, WakeWord) + else + message = formatString (cmsgToggleWakeWordIgnore, WakeWord) + endIf + sayMessage (OT_USER_REQUESTED_INFORMATION, message) + SetWakeWordEnabled(setting) +endIf +endFunction + +Script TalkToJAWS () +unscheduleFunction (GlobalTalkToJAWSTimer) +if isSameScript () then + ToggleWakeWordSetting () +else + GlobalTalkToJAWSTimer = ScheduleFunction ("TalkToJAWS", 5) +endIf +EndScript + +void function VoiceAssistantFeedbackEvent(Int feedbackID) +var int isSpeechOnDemandActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) +if (isSpeechOnDemandActive) + JAWSSpeechOnDemandOn() +endIf + +if feedbackID == VAFeedback_Error_Unknown then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_UnknownError) +elIf feedbackID == VAFeedback_Error_NotInitialized then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_NotInitialized) +elIf feedbackID == VAFeedback_Error_NotEnabled then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailedDisabled) +elIf feedbackID == VAFeedback_Error_NoMicrophone then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_NoMicrophone) +elIf feedbackID == VAFeedback_Error_SpeechService then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_SpeechService) +elIf feedbackID == VAFeedback_Error_SpeechRecognition then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_SpeechRecognition) +elIf feedbackID == VAFeedback_Processing_AuthenticationError then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_AuthenticationFailure) +elIf feedbackID == VAFeedback_Processing_ConnectionFailure then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_ConnectionFailure) +elIf feedbackID == VAFeedback_Processing_ServiceTimeout then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_ServiceTimeout) +elIf feedbackID == VAFeedback_Processing_ServiceError then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_ServiceError) +elIf feedbackID == VAFeedback_Processing_ServiceUnavailable then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_ServiceUnavailable) +elIf feedbackID == VAFeedback_Processing_KeyServiceError then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_ActionFailed_KeyServiceError) +elIf feedbackID == VAFeedback_SpeechRecognized_Empty then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_Empty) +elIf feedbackID == VAFeedback_SpeechRecognized_Unknown then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_Unknown) +elIf feedbackID == VAFeedback_SpeechRecognized_RequiresMSWord then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_RequiresMSWord) +elIf feedbackID == VAFeedback_SpeechRecognized_RequiresMSOutlook then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_RequiresMSOutlook) +elIf feedbackID == VAFeedback_SpeechRecognized_RequiresMSWordOrOutlook then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_RequiresMSWordOrOutlook) +elIf feedbackID == VAFeedback_SpeechRecognized_InvalidVoiceRate then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_InvalidVoiceRate) +elIf feedbackID == VAFeedback_SpeechRecognized_ExitJawsDialog then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_ExitJawsDialog) +elIf feedbackID == VAFeedback_SpeechRecognized_NoJokeAvailable then + SayFormattedMessage (ot_error, cmsg_Voice_Assistant_SpeechRecognized_NoJokeAvailable) +endIf + +if (isSpeechOnDemandActive) + JAWSSpeechOnDemandOff() +endIf +endFunction + +void function TellAJoke (string setup, string punchline) +if setup == cScNull then + SayString(punchline) +else + SayString(setup) + g_voiceAssistant_scheduledPunchline = punchline + ; queue function to make sure the speaking of the setup is complete before scheduling the speaking of the punchline + QueueFunction("ScheduleSayJokePunchline") +endIf +endFunction + +void function ScheduleSayJokePunchline() +var int isSpeechOnDemandActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) +if (isSpeechOnDemandActive) + JAWSSpeechOnDemandOn() +endIf + +ScheduleFunction("SayJokePunchline", 15, true) ;tenths of a second + +if (isSpeechOnDemandActive) + JAWSSpeechOnDemandOff() +endIf +EndFunction + +void function SayJokePunchline() +SayString(g_voiceAssistant_scheduledPunchline) +EndFunction + +script VolumeControlNotifications () +if ! GetDefaultJCFOption (OPT_ENABLE_ACCESSIBLE_NOTIFICATION_EVENTS) then +sayMessage (OT_ERROR, cmsgNotificationsDisabled) +return +endIf +GlobalIgnoreNotificationsFromVolumeChange = ! GlobalIgnoreNotificationsFromVolumeChange +if GlobalIgnoreNotificationsFromVolumeChange then ; suppress + sayMessage (OT_USER_REQUESTED_INFORMATION, cmsgIgnoreVolumeControlNotifications) +else + sayMessage (OT_USER_REQUESTED_INFORMATION, cmsgAllowVolumeControlNotifications) +endIf +writeSettingInteger (Section_NonJCFOptions, "IgnoreNotificationsFromVolumeChange", GlobalIgnoreNotificationsFromVolumeChange, FT_Default_JCF) +endScript + +script PanTextByParagraphOnOrOff () +var + int setting, + string longMessage, + string shortMessage +setting = getJCFOption (OPT_BRL_NAV_BY_PARA) +setting = ! setting +setJCFOption (OPT_BRL_NAV_BY_PARA, setting) +if setting then + longMessage = formatString (cmsgPanTextByParagraphOnOrOff, cmsgOn) + shortMessage = cmsgOn +else + longMessage = formatString (cmsgPanTextByParagraphOnOrOff, cmsgOff) + shortMessage = cmsgOff +endIf +sayMessage (OT_STATUS, longMessage, shortMessage) +endScript + +void function SayScreenOcrStarted(int useMicrosoftOcr) +if useMicrosoftOcr + SayMessage (OT_JAWS_MESSAGE, MSG_OCRStarted_MicrosoftOcr_L, MSG_OCRStarted_MicrosoftOcr_S) +else + SayMessage (OT_JAWS_MESSAGE, MSG_OCRStarted_OmniPage_L, MSG_OCRStarted_OmniPage_S) +endif +endFunction + +int function ScriptPerformanceHistoryWindowIsActive() +return ghWndResultsViewer + && GetWindowName(ghWndResultsViewer) == cmsgScriptPerformanceHistoryTitle +EndFunction + +void function ShowScriptPerformanceHistoryInResultsViewer() +var string sText = StringTrimTrailingBlanks(GetScriptPerformanceHistory()) +ShowTextInResultsViewer(sText, cmsgScriptPerformanceHistoryTitle, ScriptPerformanceHistoryWindowIsActive()) +EndFunction + +script ShowScriptPerformanceHistory() +var +int userAnswer +if InHomeRowMode() Then + PerformScript HomeRowToggle() +endIf +if !GetIntOptionUserSetting(Section_StabilityAndPerformance, hKey_ScriptPerformanceHistoryEnabled) then + userAnswer = ExMessageBox(cmsgScriptPerformanceHistoryEnableQuestion, cmsgScriptPerformanceHistoryTitle, MB_YESNO|MB_ICONQUESTION) + if (userAnswer == IDNO) Then + return + endIf + IniWriteIntegerEx(Section_StabilityAndPerformance, hKey_ScriptPerformanceHistoryEnabled, true, FLOC_USER_SETTINGS, file_default_jcf, true) + SayMessage(OT_STATUS, cmsgScriptPerformanceHistoryEnabledInformation) + return +EndIf +ShowScriptPerformanceHistoryInResultsViewer() +EndScript + +script ClearScriptPerformanceHistory() +ClearScriptPerformanceHistory() +SayMessage(OT_STATUS, cmsgScriptPerformanceHistoryClearedInformation) +EndScript + +Script IndicateLinkSourceURL () +var string URL +if IsLinkOrHeadingUnderVirtualCursor () then +; headings may contain links. + URL = GetURLForFocusedLink () +endIf +if stringIsBlank (URL) then + return sayMessage (OT_ERROR, cmsgURLNotFound_L, cmsgURLNotFound_S) +endIf +if isSameScript () then + UserBufferDeactivate () + UserBufferClear () + SayMessage (OT_USER_BUFFER, URL) + return +endIf +sayMessage (OT_USER_REQUESTED_INFORMATION, URL) +endScript + +string function GetMathEditorResultText(int result) +if (result == MathEditorResult_FailedToLaunch) + return msgMathEditorError_FailedToLaunch +elif (result == MathEditorResult_ContractedBrailleNotEnabled) + return msgMathEditorError_ContractedBrailleNotEnabled +elif (result == MathEditorResult_Windows10Required) + return msgMathEditorError_Windows10Required +elif (result == MathEditorResult_LanguageNotSupported) + return msgMathEditorError_LanguageNotSupported +elif (result == MathEditorResult_NotEnabled) + return msgMathEditorError_NotEnabled +endIf +return cscNull +EndFunction + +void function NotifyUserOfMathEditorResult(int result) +var string errorMessage = GetMathEditorResultText(result) +if (StringIsBlank(errorMessage)) + return +endIf +DisplayOrSpeakMessage(ShowMathEditorErrorTitle, errorMessage, OT_ERROR, DoNotShowMathEditorResultMessageAgain) +EndFunction + +void function ShowMathEditorHelper(string requestor) +var int result = ShowMathEditor(requestor); +NotifyUserOfMathEditorResult(result) +EndFunction + +script ShowMathEditor() +ShowMathEditorHelper(MathEditorRequestor_Default) +EndScript + +string function GetMathViewerResultText(int result) +if (result == MathViewerResult_NoMathML) + return msgMathViewerError_NoMathML +elif (result == MathViewerResult_NotEnabled) + return msgMathViewerError_NotEnabled +endIf +return cscNull +EndFunction + +void function NotifyUserOfMathViewerResult(int result) +var string errorMessage = GetMathViewerResultText(result) +if (StringIsBlank(errorMessage)) + return +endIf +DisplayOrSpeakMessage(ShowMathViewerErrorTitle, errorMessage, OT_ERROR, DoNotShowMathViewerResultMessageAgain) +EndFunction + +void function ShowMathViewerHelper(string requestor) +var int result = ShowMathViewer(requestor); +NotifyUserOfMathViewerResult(result) +EndFunction + +Script OpenQuickAccessBar() + OpenQuickAccessBar() +EndScript + +script LockWorkStation() +LockWorkStation() +EndScript + +Script SimulateAltCtrlDelete() +SimulateAltCtrlDelete() +EndScript + +script BrailleSelectAProfile() +var +string profileList, +string profileListEntry, +string profileName, +string langIDList, +int index, +int count, +int curIndex + +let langIDList=readSettingString (SECTION_BRAILLE, HKey_PREFERRED_BRL_PROFILE_LIST, "", FT_CURRENT_JCF) +let count=StringSegmentCount (langIDList, "|") +if count==0 then + sayFormattedMessage(OT_ERROR, cmsgNoPreferredBrailleProfileListConfigured_L, cmsgNoPreferredBrailleProfileListConfigured_S) + return +endIf + +for index=1 to count + let profileName = GetLocaleNameForLangID(StringSegment (langIDList, "|", index)) + if profileName == BrailleGetCurrentProfileName() then + curIndex=index + endIf + profileListEntry=profileName+"|" + profileList=profileList+profileListEntry +endFor +let index=DlgSelectItemInList (profileList, cscBrlProfileListTitle, FALSE, curIndex) +if index then +; Must load using langID. + BrailleSetCurrentProfile(StringSegment (langIDList, "|", index), wdSession) +endIf +if BrailleGetSplitMode()==brlSplitTranslation then + SetSplitTranslationParameters() +endIf +BrailleRefresh() +endScript + +script BrailleCycleProfile() +var +string profileList, +string profileListEntry, +string profileName, +string langIDList, +int index, +int count, +int curIndex + +let langIDList=readSettingString (SECTION_BRAILLE, HKey_PREFERRED_BRL_PROFILE_LIST, "", FT_CURRENT_JCF) +let count=StringSegmentCount (langIDList, "|") + +if count==0 then + sayFormattedMessage(OT_ERROR, cmsgNoPreferredBrailleProfileListConfigured_L, cmsgNoPreferredBrailleProfileListConfigured_S) + return +endIf + +for index=1 to count + + let profileName = GetLocaleNameForLangID(StringSegment (langIDList, "|", index)) + if profileName == BrailleGetCurrentProfileName() then + curIndex=index + endIf + profileListEntry=profileName+"|" + profileList=profileList+profileListEntry +endFor +let index=curIndex +if index < count then + let index=index+1 +else + let index=1 +endIf +let profileName=StringSegment (profileList, "|", index) +sayMessage(OT_JAWS_MESSAGE, profileName) +; Must load using langID, not Profile name. +BrailleSetCurrentProfile(StringSegment (langIDList, "|", index), wdSession) +if BrailleGetSplitMode()==brlSplitTranslation then + SetSplitTranslationParameters() +endIf +BrailleRefresh() +endScript + +Script RouteJAWSSoundLeft() +var int setting = GetJCFOption(OPT_LOWER_OTHER_APPS_VOLUME) +if setting + GlobalAudioDuckingDisabledByRouting = 1 + SetDefaultJCFOption(OPT_LOWER_OTHER_APPS_VOLUME,Off) + WriteSettingInteger (Section_Options, hKey_LowerAppVolumeWhileJAWSIsRunning, 0, FT_DEFAULT_JCF, wdSession) +else + GlobalAudioDuckingDisabledByRouting = 0 +endIf +RouteJAWSSoundLeft() +EndScript + +Script RouteJAWSSoundRight() +var int setting = GetJCFOption(OPT_LOWER_OTHER_APPS_VOLUME) +if setting + GlobalAudioDuckingDisabledByRouting = 1 + SetDefaultJCFOption(OPT_LOWER_OTHER_APPS_VOLUME,Off) + WriteSettingInteger (Section_Options, hKey_LowerAppVolumeWhileJAWSIsRunning, 0, FT_DEFAULT_JCF, wdSession) +else + GlobalAudioDuckingDisabledByRouting = 0 +endIf +RouteJAWSSoundRight() +EndScript + +Script RestoreSoundBalance() +if GlobalAudioDuckingDisabledByRouting == 1 then + SetDefaultJCFOption(OPT_LOWER_OTHER_APPS_VOLUME,On) + WriteSettingInteger (Section_Options, hKey_LowerAppVolumeWhileJAWSIsRunning, 0, FT_DEFAULT_JCF, wdSession) + ; we no longer route, so turn off the flag that audio ducking is disabled + GlobalAudioDuckingDisabledByRouting = 0 +endIf +RestoreSoundBalance() +EndScript + +void function SpeakSoundMixerFeedback(int code) +if code == SoundMixerFeedback_RoutedLeft then + GlobalAudioIsRouted = 1 + SayFormattedMessage(OT_STATUS, cMsgRoutedLeft_l, cMsgRoutedLeft_s) +elIf code == SoundMixerFeedback_RoutedRight then + GlobalAudioIsRouted = 1 + SayFormattedMessage(OT_STATUS, cMsgRoutedRight_l, cMsgRoutedRight_s) +elIf code == SoundMixerFeedback_RestoredBalance then +GlobalAudioIsRouted = 0 + SayFormattedMessage(OT_STATUS, cMsgRestoredBalance_l, cMsgRestoredBalance_s) +endIf +endFunction + +void function SpeakSoundMixerError(int errorCode) +if (errorCode == SoundMixerError_UnsupportedAudioDevice) then + SayMessage(OT_ERROR, cMsgSoundMixerError_UnsupportedDevice) +else + SayMessage(OT_ERROR, FormatString(cMsgSoundMixerError_GenericError, IntToString(errorCode))) +endIf +endFunction + +Script SoundBalanceHelp() +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cMsgSoundBalanceLayerHelpScreen) +UserBufferAddTextResultsViewer(cMsgSoundBalanceLayerHelp) +EndScript + +void function ShowSoundMixerDiscoveryDialog() +var + int showOption +if (g_bShowSoundMixerDiscoveryDialog == true) then + let g_bShowSoundMixerDiscoveryDialog = false + let showOption = ReadSettingInteger (Section_Options, hKey_ShowSoundMixerDiscoveryDialog, 1, FT_DEFAULT_JCF) + if (showOption == true) then + ShowSoundMixerDiscoveryDialog() + endIf +endIf +endFunction + +void function SpeakSoundCardName() +var int isSODActive = (IsSpeechOff() && getJCFOption(OPT_LESS_SPEECH) == 0) +if !stringIsBlank(GlobalSoundCardName) then + if (isSODActive) JAWSSpeechOnDemandOn() endIf + SayFormattedMessage(OT_STATUS, GlobalSoundCardName) + if (isSODActive) JAWSSpeechOnDemandOff() endIf +endIf +unScheduleFunction(GlobalSwitchSoundCardTimerId) +GlobalSwitchSoundCardTimerId = 0 + +endFunction + +script SelectNextSoundCard() + +GlobalSoundCardName = SelectNextSoundCard() +if GlobalSwitchSoundCardTimerId != 0 then +unScheduleFunction(GlobalSwitchSoundCardTimerId) +GlobalSwitchSoundCardTimerId = 0 +endIf +GlobalSwitchSoundCardTimerId = ScheduleFunction("SpeakSoundCardName", 1) + +endScript + +script SelectPreviousSoundCard() + +GlobalSoundCardName = SelectPreviousSoundCard() +if GlobalSwitchSoundCardTimerId != 0 then +unScheduleFunction(GlobalSwitchSoundCardTimerId) +GlobalSwitchSoundCardTimerId = 0 +endIf +GlobalSwitchSoundCardTimerId = ScheduleFunction("SpeakSoundCardName", 1) +endScript + +Script SoundCardsHelp() +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +UserBufferClearResultsViewer () +UpdateResultsViewerTitle (cmsgSoundCardsLayerHelpScreen) +UserBufferAddTextResultsViewer(cmsgSoundCardsLayerHelp) +EndScript + +script RestartWithoutDump() + RestartProductWithoutDump(); +EndScript + +script BrailleToggleShowTimeInStatusCells() +var +string state, +int val=GetDefaultJCFOption(OPT_BRL_SHOW_TIME_IN_STATUS_CELLS) +; Do not disturb the format in bit 1, only toggle bit 0. +if (val&scTmOn) ; toggle it off. + val = (val&~scTmOn) + state=cmsgOff +else + val = (val | scTmOn) ; toggle it on without disturbing the format. + state=cmsgOn +endIf +SetDefaultJCFOption(OPT_BRL_SHOW_TIME_IN_STATUS_CELLS, val) +IniWriteInteger (SECTION_BRAILLE, hKEY_Braille_SHOW_TIME_IN_STATUS_CELLS, val, DefaultJCFFile) +sayFormattedMessage(OT_JAWS_MESSAGE, formatString(cmsgShowTimeInStatusCells_L, state), formatString(cmsgShowTimeInStatusCells_S, state)) +endScript + +string function GetVisperoConnectedLink() +var + string currentAppOrWebsite, + string connectedLink + + currentAppOrWebsite= GetObjectProcessName() +if !currentAppOrWebsite return cscNull endIf +if IsVisperoConnectEnabledForSite(currentAppOrWebsite,connectedLink) + return connectedLink +endIf +; try URL +currentAppOrWebsite=GetDocumentPath() +if IsVisperoConnectEnabledForSite(currentAppOrWebsite,connectedLink) + return connectedLink +endIf + +return cscNull +EndFunction + +script LaunchVisperoConnectedLink() +var +string VisperoConnectedLink=GetVisperoConnectedLink() +if VisperoConnectedLink != CSCNull then + run(VisperoConnectedLink) +else + SayMessage(OT_ERROR, cmsgNoVisperoConnectLink_l, cmsgNoVisperoConnectLink_S) +endIf +endScript + +script ToggleToastNotificationAnnouncement() + +var int toastProcessingEnabled = GetDefaultJCFOption(OPT_ENABLE_TOAST_NOTIFICATION_PROCESSING) +if toastProcessingEnabled then + SetDefaultJCFOption(OPT_ENABLE_TOAST_NOTIFICATION_PROCESSING, Off) + WriteSettingInteger(Section_Options, hKey_Enable_Toast_Notification_Processing, Off, FT_DEFAULT_JCF, wdSession) + SayMessage(Ot_Status, cMsgToastNotificationProcessingDisabled_l, cMsgToastNotificationProcessingDisabled_s) + SendToggleNotificationTelemetryDataPoint(Off) +else + SetDefaultJCFOption(OPT_ENABLE_TOAST_NOTIFICATION_PROCESSING, On) + WriteSettingInteger(Section_Options, hKey_Enable_Toast_Notification_Processing, On, FT_DEFAULT_JCF, wdSession) + SayMessage(Ot_Status, cMsgToastNotificationProcessingEnabled_l, cMsgToastNotificationProcessingEnabled_s) + SendToggleNotificationTelemetryDataPoint(On) +endIf + +endScript + +Void Function ProcessZTTetheredViewItemChange (handle hWnd) +if !IsZoomTextRunning() +|| !ZTIsTetheredViewEnabled () + return +endIf +if InHJDialog() +&& GetWindowName (GetRealWindow (hWnd)) == cwn_LinksList + var + handle hReal = GetRealWindow (hWnd), + handle hAddress = FindDescendantWindow (hReal, iD_LinksList_Address) + if StringIsBlank (GetWindowText (hAddress, false)) + ZTHideTetheredViewScenario (goLinksListTetheredViewScenario) + else + var object oFocusRect = ZTCreateRectFromUIAElement (FSUIAGetFocusedElement ()) + ZTTetheredViewUpdateLocations (goLinksListTetheredViewScenario, oFocusRect) + if ZTCurrentTetheredViewScenario () != goLinksListTetheredViewScenario.Name + ZTShowTetheredViewScenario (goLinksListTetheredViewScenario) + endIf + endIf +endIf +EndFunction + +Void Function ProcessZTTetheredViewFocusChange (handle hFocus, handle hReal, string sRealWindowName) +if !IsZoomTextRunning() +|| !ZTIsTetheredViewEnabled () + return +endIf +if !goLinksListTetheredViewScenario + goLinksListTetheredViewScenario = ZTGetTetheredViewScenario (cmsgZTTetheredViewScenarioLinksListAddress) +endIf +var + handle hAddress = FindDescendantWindow (hReal, iD_LinksList_Address) +if InHJDialog() +&& sRealWindowName == cwn_LinksList +&& GetWindowTypeCode (hFocus) == WT_LISTVIEW +&& !StringIsBlank (GetWindowText (hAddress, false)) + var + object oFocusRect = ZTCreateRectFromUIAElement (FSUIAGetFocusedElement ()), + object oSourceRect = ZTCreateRectFromWindow (hAddress) + ZTTetheredViewUpdateLocations (goLinksListTetheredViewScenario, oFocusRect, oSourceRect) + ZTShowTetheredViewScenario (goLinksListTetheredViewScenario) +else + ZTHideTetheredViewScenario (goLinksListTetheredViewScenario) +endIf +EndFunction + +script MoveToNextGlanceHighlight() +MoveToGlanceHighlight(s_next, false) +endScript + +script MoveToPriorGlanceHighlight() +MoveToGlanceHighlight(s_prior, false) +endScript + +script MoveToNextMostRecentGlanceHighlight() +MoveToGlanceHighlight(s_next, true) +endScript + +script MoveToPriorMostRecentGlanceHighlight() +MoveToGlanceHighlight(s_prior, true) +endScript + +script SelectAGlanceHighlight() +SelectAGlanceHighlightDialog () +endScript + +void function MessageCenterNotification(string msg) +SayMessage (OT_MESSAGE, msg) +BrailleMessage (msg, 0) +endFunction + +script FollowDetailsRelation() +FollowDetailsRelation() +EndScript + +Object Function GetNotificationWindow () +if IsSecureDesktop () return Null() endIf +var + object oDesktop = FSUIAGetRootElement (), + object oTypeCondition = FSUIACreateIntPropertyCondition (UIA_ControlTypePropertyID, UIA_WindowControlTypeId), + object oClassCondition = FSUIACreateStringPropertyCondition (UIA_ClassNamePropertyID, cwc_Windows_UI_Core_CoreWindow), + object oAndCondition = FSUIACreateAndCondition (oTypeCondition, oClassCondition) +return oDesktop.findFirst(TreeScope_Children, oAndCondition) +EndFunction + +object function TeamsFindFirst(object oCondition) +var + object oElement, + object oRoot, + handle hWnd, + handle hRoot +hWnd = FindWindow (0, cwc_TeamsWebView) +while hWnd + if GetWindowClass (hWnd) == cwc_TeamsWebView + hRoot = FindWindow (hWnd, cwc_ChromeWindowClass) + if hRoot + oRoot = FSUIAGetElementFromHandle (hRoot) + oElement = oRoot.findFirst(TreeScope_Descendants, oCondition) + if oElement + return oElement + endIf + endIf + endIf + hWnd = GetNextWindow (hWnd) +endWhile +return Null() +endFunction + +Object Function GetTeamsNotificationWindow () +if IsSecureDesktop () return Null() endIf +var + object oDesktop = FSUIAGetRootElement (), + object oTypeCondition = FSUIACreateIntPropertyCondition (UIA_ControlTypePropertyID, UIA_PaneControlTypeId), + object oClassCondition = FSUIACreateStringPropertyCondition (UIA_ClassNamePropertyID, cwc_TeamsWebView), + object oAndCondition = FSUIACreateAndCondition (oTypeCondition, oClassCondition) +return oDesktop.findFirst(TreeScope_Children, oAndCondition) +EndFunction + +Int Function RespondToIncomingCall (object oNotificationWnd, string sResponse, optional string sAlternativeResponse) +var + object oTypeCondition = FSUIACreateIntPropertyCondition (UIA_ControlTypePropertyID, UIA_ButtonControlTypeID), + object oNameCondition = FSUIACreateStringPropertyCondition (UIA_NamePropertyID, sResponse), + object oAlternativeNameCondition, + object oAndCondition, + object oButton +if !StringIsBlank (sAlternativeResponse) + oAlternativeNameCondition = FSUIACreateStringPropertyCondition (UIA_NamePropertyID, sAlternativeResponse) + oNameCondition = FSUIACreateOrCondition(oNameCondition, oAlternativeNameCondition) +endIf +oAndCondition = FSUIACreateAndCondition (oTypeCondition, oNameCondition) +oButton = oNotificationWnd.findFirst(TreeScope_Descendants, oAndCondition) +if oButton + oButton.GetInvokePattern().invoke + return true +else + return false +endIf +EndFunction + +Script AcceptAudioCall () +var + object oTeamsCall = GetTeamsNotificationWindow () +if oTeamsCall + if RespondToIncomingCall(oTeamsCall, cwnAcceptWithAudio, cwnAccept) + return + endIf +endIf +oTeamsCall = GetNotificationWindow () +if oTeamsCall + if RespondToIncomingCall(oTeamsCall, cwnAcceptWithAudio, cwnAccept) + return + endIf +endIf +TypeKey (cksTeamsAcceptWithAudio) +EndScript + +Script ExecuteZoomTextCommand(string command) +ExecuteZoomTextCommand(command) +EndScript + +Script DeclineCall () +var + object oTeamsCall = GetTeamsNotificationWindow () +if oTeamsCall + if RespondToIncomingCall(oTeamsCall, cwnDeclineCall, cwnDecline) + return + endIf +endIf +oTeamsCall = GetNotificationWindow () +if oTeamsCall + if RespondToIncomingCall(oTeamsCall, cwnDeclineCall, cwnDecline) + return + endIf +endIf +TypeKey (cksTeamsDecline) +EndScript + +Script AcceptVideoCall () +var + object oTeamsCall = GetTeamsNotificationWindow () +if oTeamsCall + if RespondToIncomingCall(oTeamsCall, cwnAcceptWithVideo, cwnAccept) + return + endIf +endIf +oTeamsCall = GetNotificationWindow () +if oTeamsCall + if RespondToIncomingCall(oTeamsCall, cwnAcceptWithVideo, cwnAccept) + return + endIf +endIf +TypeKey (cksTeamsAcceptWithVideo) +EndScript + +Object Function GetPhoneLinkCallWindow () +if IsSecureDesktop () return Null() endIf +var + object oPhoneLinkCondition = FSUIACreateStringPropertyCondition(UIA_NamePropertyId, cwnPhoneLink), + object oWindowCondition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeID), + object oAndCondition = FSUIACreateAndCondition(oPhoneLinkCondition, oWindowCondition), + object oWindow = FSUIAGetRootElement ().findFirst(TreeScope_Children, oAndCondition) +if oWindow.GetPropertyValue(UIA_WindowIsTopmostPropertyId) + return oWindow +endIf +return Null() +EndFunction + +Script AcceptPhoneLinkCall () +var + object oNotificationWindow = GetNotificationWindow () +if !oNotificationWindow return endIf +RespondToIncomingCall(oNotificationWindow, cwnAccept) +EndScript + +Script DeclinePhoneLinkCall () +var + object oNotificationWindow = GetNotificationWindow () +if !oNotificationWindow return endIf +RespondToIncomingCall(oNotificationWindow, cwnDecline) +EndScript + +Script EndPhoneLinkCall () +var + object oCallWindow = GetPhoneLinkCallWindow () +if !oCallWindow return endIf +var + object oEndCallCondition = FSUIACreateStringPropertyCondition(UIA_NamePropertyID, cwnEndCall), + object oButtonCondition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyID, UIA_ButtonControlTypeID), + object oAndCondition = FSUIACreateAndCondition(oButtonCondition, oEndCallCondition), + object oEndCallButton = oCallWindow.findFirst(TreeScope_Descendants, oAndCondition) +if !oEndCallButton return endIf +oEndCallButton.GetInvokePattern().invoke +EndScript + +Object Function GetTeamsWindows () +if IsSecureDesktop () return Null() endIf +var + object oNameCondition = FSUIACreateStringPropertyCondition(UIA_ClassNamePropertyId, cwc_TeamsWebView), + object oTypeCondition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeID), + object oAndCondition = FSUIACreateAndCondition(oNameCondition, oTypeCondition), + object oElements = FSUIAGetRootElement ().findAll(TreeScope_Children, oAndCondition) +if oElements.count > 0 + return oElements +endIf +oNameCondition = FSUIACreateStringPropertyCondition(UIA_NamePropertyId, cwnMicrosoftTeams, PropertyConditionFlags_MatchSubstring) +oTypeCondition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyId, UIA_PaneControlTypeID) +oAndCondition = FSUIACreateAndCondition(oNameCondition, oTypeCondition) +oElements = FSUIAGetRootElement ().findAll(TreeScope_Children, oAndCondition) +if oElements.count > 0 + return oElements +endIf +return Null() +EndFunction + +object function GetTeamsMuteButton() +var + object oAutomationIDCondition = FSUIACreateStringPropertyCondition(UIA_AutomationIDPropertyID, UIAAutomationID_TeamsMuteButton), + object oButtonCondition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyID, UIA_ButtonControlTypeID), + object oAndCondition = FSUIACreateAndCondition(oAutomationIDCondition, oButtonCondition), + object oMuteButton = TeamsFindFirst(oAndCondition) +if oMuteButton + return oMuteButton +endIf +;The remainder of this script is being left in to support Teams 1 +var + object oTeamsWindows = GetTeamsWindows () +if !oTeamsWindows return endIf +var + object oWindow, + string sOwner +ForEach oWindow in oTeamsWindows + sOwner = StringSegment (GetWindowOwner (oWindow.nativeWindowHandle), cScDoubleBackSlash, -1) + if StringContainsCaseInsensitive(sOwner, cscOwnerApp_Teams) + oMuteButton = oWindow.findFirst(TreeScope_Descendants, oAndCondition) + if oMuteButton + return oMuteButton + endIf + endIf +EndForEach +EndFunction + +Script LeaveTeamsCall () +var + object oAutomationIDCondition = FSUIACreateStringPropertyCondition(UIA_AutomationIDPropertyID, UIAAutomationID_TeamsLeaveButton), + object oAlternativeCondition = FSUIACreateStringPropertyCondition(UIA_NamePropertyID, cwnLeave, PropertyConditionFlags_MatchSubstring), + object oOrCondition = FSUIACreateOrCondition(oAutomationIDCondition, oAlternativeCondition), + object oButtonCondition = FSUIACreateIntPropertyCondition(UIA_ControlTypePropertyID, UIA_ButtonControlTypeID), + object oAndCondition = FSUIACreateAndCondition(oOrCondition, oButtonCondition), + object oLeaveButton = TeamsFindFirst(oAndCondition) +if oLeaveButton + oLeaveButton.GetInvokePattern().invoke + return +endIf +;The remainder of this script is being left in to support Teams 1 +var + object oTeamsWindows = GetTeamsWindows () +if !oTeamsWindows return endIf +var + object oWindow, + string sOwner +ForEach oWindow in oTeamsWindows + sOwner = StringSegment (GetWindowOwner (oWindow.nativeWindowHandle), cScDoubleBackSlash, -1) + if StringContainsCaseInsensitive(sOwner, cscOwnerApp_Teams) + oLeaveButton = oWindow.findFirst(TreeScope_Descendants, oAndCondition) + if oLeaveButton + oLeaveButton.GetInvokePattern().invoke + return + endIf + endIf +EndForEach +EndScript + +Script ManageCall() +var + string sApp, + string sResponse, + int iResponse, + int iApp, + string sAppList = cscManageCall_Apps, + string sPrimary = IniReadString (SECTION_NonJCFOptions, hKey_ManageCallPrimaryApp, cscNull, file_default_jcf, rsNoTransient) +if !StringIsBlank (sPrimary) +&& StringContains (cscManageCall_Apps, sPrimary) + sAppList = sPrimary + JAWS_DLG_LIST_SEPARATOR + cscManageCall_Apps + sAppList = StringReplaceSubstrings (sAppList, JAWS_DLG_LIST_SEPARATOR+sPrimary, cscNull) +endIf +iApp = DlgSelectItemInList (sAppList, cmsgManageCall_Title, false, 1, cscManageCall_Buttons, iResponse) +if !iApp return endIf +sApp = StringSegment (sAppList, JAWS_DLG_LIST_SEPARATOR, iApp) +if iResponse == ManageCall_HangUp + if sApp == cscManageCall_PhoneLink + PerformScript EndPhoneLinkCall () + elIf sApp == cscManageCall_Teams + PerformScript LeaveTeamsCall () + elIf sApp == cscManageCall_Skype + PerformScript SkypeDesktopDisconnectCall() + endIf + return +endIf +if iResponse == ManageCall_MakePrimary + IniWriteString (SECTION_NonJCFOptions, hKey_ManageCallPrimaryApp, sApp, file_default_jcf, true, wdUser) + return +endIf +if sApp == cscManageCall_Skype + if iResponse == ManageCall_Decline + Say (msgManageCall_SkypeDeclineNotSupported, OT_ERROR) + else + PerformScript SkypeDesktopAnswerCall() + endIf + return +endIf +if sApp == cscManageCall_Teams + if iResponse == ManageCall_Decline + PerformScript DeclineCall() + elIf iResponse == ManageCall_AcceptWithVideo + PerformScript AcceptVideoCall() + else + PerformScript AcceptAudioCall() + endIf +elIf sApp == cscManageCall_PhoneLink + if iResponse == ManageCall_Decline + PerformScript DeclinePhoneLinkCall() + else + PerformScript AcceptPhoneLinkCall() + endIf +endIf +EndScript + +Script MeetingStatus() +var + object oMuteButton = GetTeamsMuteButton(), + object oCameraButton, + object oShareButton, + object oRoot, + object oCondition, + string sMuteStatus, + string sCameraStatus, + string sShareStatus +if !oMuteButton + Say (cmsgMeetingStatus_Unavailable, OT_ERROR) + return +endIf +oRoot = FSUIAGetAncestorOfControlType (oMuteButton, UIA_ToolBarControlTypeId) +oRoot = FSUIAGetParentOfElement(oRoot) +oCondition = FSUIACreateStringPropertyCondition (UIA_AutomationIDPropertyID, UIAAutomationID_TeamsCameraButton) +oCameraButton = oRoot.findFirst(TreeScope_Descendants, oCondition) +oCondition = FSUIACreateStringPropertyCondition (UIA_AutomationIDPropertyID, UIAAutomationID_TeamsShareButton) +oShareButton = oRoot.findFirst(TreeScope_Descendants, oCondition) +if StringContainsCaseInsensitive (oMuteButton.name, cwnUnmute) + sMuteStatus = cmsgMeetingStatus_Muted +else + sMuteStatus = cmsgMeetingStatus_Unmuted +endIf +if StringContainsCaseInsensitive (oCameraButton.name, cwnTurnCameraOn) + sCameraStatus = cmsgOff +else + sCameraStatus = cmsgOn +endIf +if StringContainsCaseInsensitive (oShareButton.name, cwnStopSharing) + sShareStatus = cmsgMeetingStatus_Sharing +else + sShareStatus = cmsgMeetingStatus_NotSharing +endIf +SayFormattedMessage (OT_USER_REQUESTED_INFORMATION, msgTeamsMeetingStatus_L, msgTeamsMeetingStatus_S, sMuteStatus, sCameraStatus, sShareStatus) +EndScript + +Int Function IsWPFApplication() +return FSUIAGetFocusedElement ().frameworkID == FrameworkID_WPF +EndFunction + +void function HandleFaceInViewLayerKeys(string sKeyName) +; FaceInView layer has one secondary layer, camera: +If StringCompare(sKeyName,KeyLayer_FaceInView_Cameras ) == 0 then + let GlobalActiveLayer = CamerasLayerActive + SayMessage(ot_status,cmsgCamerasLayer_Start) +endIf +EndFunction + +string Function GetJAWSScriptLangDirectory() +var string sSettingsDirectory = GetJAWSSettingsDirectory () +return StringSegmentReplace(sSettingsDirectory, cScDoubleBackSlash, -2, FolderName_Scripts) +EndFunction + +collection Function ParseAttributes (string attributes) +var + collection cAttributes, + StringArray attribsAndValues, + StringArray attribAndValue, + int i + +cAttributes = new collection +attribsAndValues = StringSplit (attributes, ";", true) +For i = 1 To ArrayLength (attribsAndValues) + attribAndValue = StringSplit (attribsAndValues[i], ":", true) + cAttributes[attribAndValue[1]] = attribAndValue[2] +EndFor +return cAttributes +EndFunction + +string Function GetObjectIA2Attribute (string attributeName, optional int level) +if !attributeName +|| level < 0 + return cscNull +endIf +var collection cAttributes = ParseAttributes(GetObjectAttributes(level)) +return cAttributes[attributeName] +EndFunction + +int Function HasExplicitName(optional int level) +if GetObjectIA2Attribute ("explicit-name", level) + return true +EndIf +return false +EndFunction + +script ToggleSplitBufferedRefreshOnEnter() +ToggleSplitBufferedRefreshOnEnter() +endScript + +;Equivalent of KeyMapChangedEvent but for Braille +void function BrailleKeySequenceEvent(string keyName, int status) +if status==KeySequencePending then + if BrailleGetSplitMode() == brlSplitBufferedDocument then + BrailleMessage(cmsgBrlSplitBufLayerFlash,0, -1) + else + ; If split mode is not enabled, we should cancel the layered sequence + sayMessage(OT_ERROR, cmsgBrailleSplitBufferError) + CancelLayeredKeySequence() + endIf +endIf +endFunction + +script BrlSetSplitBufferBookmark(int n) +var +string msg +if BrailleIsMessageBeingShown () then + BrailleClearMessage () +endIf +if BrailleSetSplitBufferBookmark(n) then + let msg=FormatString(cmsgSplitBufferBookmark,n) + sayMessage(OT_JAWS_MESSAGE, msg) +else + sayMessage(OT_ERROR, cmsgBrailleSplitBufferError) +endIf +endScript + +script BraillePanToSplitBufferBookmark(int n) +if BrailleIsMessageBeingShown () then + BrailleClearMessage () +endIf +if BraillePanToSplitBufferBookmark(n) then +; The last two indices 255 and 256 are reserved for bookmarks to move to start and end of buffer + if n==255 then + sayMessage(OT_JAWS_MESSAGE, cmsgStartOfBuffer_L, cmsgStartOfBuffer_S, true) + elif n==256 then + sayMessage(OT_JAWS_MESSAGE, cmsgEndOfBuffer_L, cmsgEndOfBuffer_S, true) + else + sayinteger(n) + endIf +elif BrailleGetSplitMode()==brlSplitBufferedDocument then + var string msg=formatString(cmsgSplitBufferBookmarkNotSet,n) + sayMessage(OT_ERROR, msg) +else + sayMessage(OT_ERROR, cmsgBrailleSplitBufferError) +endIf +endScript + +int function InModalDialog() +if !dialogActive() return false endIf +var int level = FindAncestorOfType(wt_dialog) +if !level return false endIf +if GetObjectIA2State(level) & IA2_STATE_MODAL return true endIf +return false +EndFunction + +handle function GetNextWindowOfSameClass(handle hWnd) +if !hWnd return Null() endIf +var string class = GetWindowClass(hWnd) +hWnd = GetNextWindow(hWnd) +while hWnd + if GetWindowClass(hWnd) == class + return hWnd + endIf + class = GetWindowClass(hWnd) + hWnd = GetNextWindow(hWnd) +endWhile +return Null() +EndFunction + +void function InitBackgroundOCRRectCollection() +if !c_BackgroundOCRRect c_BackgroundOCRRect = new collection endIf +endFunction + +int function HasBackgroundOCRRectChanged(int iNewLeft, int iNewTop, int iNewRight, int iNewBottom) +return iNewLeft != c_BackgroundOCRRect.left +|| iNewTop != c_BackgroundOCRRect.top +|| iNewRight != c_BackgroundOCRRect.right +|| iNewBottom != c_BackgroundOCRRect.bottom +endFunction + +int function IsValidRect(int iLeft, int iTop, int iRight, int iBottom) +return (iRight - iLeft) > 0 +&& (iBottom - iTop) > 0 +endFunction + +int function ShouldUpdateBackgroundOCRRect() +return c_BackgroundOCRRect.shouldUpdateRect +|| !c_BackgroundOCRRect.rectCached +endFunction + +int function UpdateBackgroundOCRRectCollection(int iNewLeft, int iNewTop, int iNewRight, int iNewBottom) +if !IsValidRect(iNewLeft, iNewTop, iNewRight, iNewBottom) return false endIf +InitBackgroundOCRRectCollection() +if HasBackgroundOCRRectChanged(iNewLeft, iNewTop, iNewRight, iNewBottom) + c_BackgroundOCRRect.rectCached = true + c_BackgroundOCRRect.shouldUpdateRect = false + c_BackgroundOCRRect.hasRectChanged = true + c_BackgroundOCRRect.left = iNewLeft + c_BackgroundOCRRect.top = iNewTop + c_BackgroundOCRRect.right = iNewRight + c_BackgroundOCRRect.bottom = iNewBottom +endIf +return true +endFunction + +int function SetCustomBackgroundOCRRect() +;If you want to restrict Background OCR to a specific rectangle when the OCRAllInOne script is invoked, +;override this function to return the result of calling UpdateBackgroundOCRRectCollection with the custom rectangle coordinates. +return false +endFunction + +int function SetBackgroundOCRRect() +if !ShouldUpdateBackgroundOCRRect() + return true +endIf +if c_BackgroundOCRRect.restrictedToCustomRect + if SetCustomBackgroundOCRRect() + return true + else + PerformScript StopBackgroundRecognition() + return false + endIf +endIf +var + Int iLeft, + Int iRight, + Int iBottom, + Int iTop +if !GetWindowRect (hwndGlobalOCRBackgroundRecognition, iLeft, iRight, iTop, iBottom) + return false +endIf +return UpdateBackgroundOCRRectCollection(iLeft, iTop, iRight, iBottom) +endFunction + +; This function is called on schedule from OCRCompletedEvent +;ifHandleBackgroundOCR returns true. +void function BackgroundRecognitionHelper() +var + Int iCanRecognize + +If GlobalOCRJobID then + Return +EndIf +Let iCanRecognize = CanRecognize () +If iCanRecognize == OCR_NOT_SUPPORTED + Return +EndIf +If iCanRecognize != OCR_SUCCESS + Return +EndIf +If !SetBackgroundOCRRect() + PerformScript StopBackgroundRecognition() + return +endIf +if gBackgroundOCRSound + ; Play a discrete sound to let the user know this feature is on in the background. + playsound(gBackgroundOCRSound) +endIf +GlobalOCRJobID = OCRScreenArea (c_BackgroundOCRRect.left, c_BackgroundOCRRect.top, c_BackgroundOCRRect.right, c_BackgroundOCRRect.bottom, gOCRPrimaryLang, gOCRSecondaryLang, gUseMicrosoftOcr, gMicrosoftOCRLang) +if giBackgroundOCRJustStarted + giBackgroundOCRJustStarted = false + if c_BackgroundOCRRect.restrictedToCustomRect + InvisibleCursor (false) + MoveTo (c_BackgroundOCRRect.left+1, c_BackgroundOCRRect.top+1) + endIf +endIf +if c_BackgroundOCRRect.hasRectChanged +&& IsInvisibleCursor () + SetRestrictionToRect (c_BackgroundOCRRect.left, c_BackgroundOCRRect.top, c_BackgroundOCRRect.right, c_BackgroundOCRRect.bottom) +endIf +c_BackgroundOCRRect.hasRectChanged = false +EndFunction + +; This function is called from the following functions: +;OCRCompletedEvent (to reschedule OCR), +;FocusChangedEventEx (to Cancel if alt tabbing away from this window), +;and from both StartBackgroundRecognition and StopBackgroundRecognition. +int function HandleBackgroundOCR(handle hwndFocus, handle hwndPrevFocus) +hwndFocus = GetTopLevelWindow (hwndFocus) +hwndPrevFocus = GetTopLevelWindow (hwndPrevFocus) +if !hwndGlobalOCRBackgroundRecognition + return false +endIf +if hwndFocus==hwndPrevFocus then + return true +endIf +if hwndPrevFocus !=0 && hwndPrevFocus==hwndGlobalOCRBackgroundRecognition + unscheduleFunction(scheduleGlobalOCRBackgroundRecognitionID) + CancelOCR (GlobalOCRJobID) + SendBackgroundOCRTelemetryDataPoint(0) + GlobalOCRJobID = 0 + ClearBackgroundOCRGlobals() + return true +endIf +if hwndFocus && hwndFocus == hwndGlobalOCRBackgroundRecognition + scheduleGlobalOCRBackgroundRecognitionID=scheduleFunction("BackgroundRecognitionHelper", 5) +endIf +return true +endFunction + +; This should be called from the OCR layer to start background recognition for the focused window. +script StartBackgroundRecognition(optional int serviceOptions) +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +if IsScreenShadeOn () then + sayMessage (OT_ERROR, msg_OCR_Unavailable_Screen_Shade) + return +endIf +giBackgroundOCRJustStarted = true +; If it is already running, restart. +if IsBackgroundOCREnabled() then + HandleBackgroundOCR(0, hwndGlobalOCRBackgroundRecognition) +endIf + +if(serviceOptions & BackgroundOCRServiceOptions_PlaySound) + gBackgroundOCRSound=GetSoundFileLocation ("TouchClick.wav") +else + gBackgroundOCRSound = cscNull +endIf + +sayMessage(OT_JAWS_MESSAGE, cmsgBackgroundOCRStarted_l, cmsgBackgroundOCRStarted_S) + +hwndGlobalOCRBackgroundRecognition=GetTopLevelWindow (GetFocus()) +; We may force Microsoft OCR for this feature since it is far superior for screen recognition. +gOCRPrimaryLang = ReadSettingInteger (section_OCR, hKey_PrimaryRecognitionLanguage, 1033, FT_DEFAULT_JCF) +gOCRSecondaryLang= ReadSettingInteger (section_OCR, hKey_SecondaryRecognitionLanguage, 1033, FT_DEFAULT_JCF) +gUseMicrosoftOcr = TRUE; ReadSettingInteger (section_OCR, hKey_UseMicrosoftRecognitionLanguageForScreenArea, 0, FT_CURRENT_JCF) +gMicrosoftOCRLang= ReadSettingInteger (section_OCR, hKey_MicrosoftRecognitionLanguage, 1033, FT_CURRENT_JCF) +SendBackgroundOCRTelemetryDataPoint(1) +HandleBackgroundOCR(hwndGlobalOCRBackgroundRecognition, 0) +endScript + +script StartBackgroundRecognitionWithSound() +PerformScript StartBackgroundRecognition(BackgroundOCRServiceOptions_PlaySound) +EndScript + +;This should be called from the q OCR layer script if need be to cancel Background OCR. +script StopBackgroundRecognition() +if !(GetRunningFSProducts() & product_JAWS) then + return +endIf +sayMessage(OT_JAWS_MESSAGE, cmsgBackgroundOCRCancelled_l, cmsgBackgroundOCRCancelled_s) +HandleBackgroundOCR(0, hwndGlobalOCRBackgroundRecognition) +ClearBackgroundOCRGlobals() +endScript + +void function ClearBackgroundOCRGlobals() +collectionRemoveAll(c_BackgroundOCRRect) +giBackgroundOCRJustStarted = false +gBackgroundOCRSound = cscNull +scheduleGlobalOCRBackgroundRecognitionID = 0 +hwndGlobalOCRBackgroundRecognition = ghNull +endFunction + +; This is called from the SayActiveCursor script to indicate when Background OCR is enabled for the JAWS cursor. +int function IsBackgroundOCREnabled() +return hwndGlobalOCRBackgroundRecognition +endFunction + +string Function GetMessage (int iOutputType, string sLong, string sShort) +var + int iSpeak = ShouldItemSpeak (iOutputType) +if iSpeak == message_long + return sLong +elIf iSpeak == message_short + return sShort +else + return cscNull +EndIf +EndFunction + +int function IsLink( int type ) +return ( type == WT_LINK +|| type == WT_MailTo_link +|| type == wt_ftp +|| type == wt_ImageMap_link +|| type == WT_News_link +|| type == WT_THISPAGE_LINK ); +EndFunction + +Object Function GetAriaGridElement () +return FSUIAGetAncestorOfARIARole (FSUIAGetFocusedElement (), ARIA_ROLE_GRID) +EndFunction + +void function SayNameAndSizeOfGrid() +if !InAriaGrid() return endIf +var + object oGrid = GetAriaGridElement (), + string sName = oGrid.name +if sName + SayMessage(OT_CONTROL_NAME,sName) +EndIf +SayTableOrGridColumnAndRowCountInfo() +SayTableCaptionAndSummary() +EndFunction + +int Function ShouldSayAncestorAtLevel(int level, int type, int parentType, int focusRole, int focusType) +if level == 1 + if type == WT_LISTBOXITEM + return false + elif type == WT_LISTBOX + && FindAncestorOfType(WT_COMBOBOX) != -1 + return false + endIf +endIf +if type == WT_TABLECELL +|| type == WT_COMBOBOX +|| type == WT_EDITCOMBO +|| type == WT_EDIT +|| type == WT_MULTILINE_EDIT +|| type == WT_DOCUMENT + return false +elif type == WT_TABLE +&& focusType != WT_TABLECELL + return false +elif type == WT_ROW + return (GetObjectMSAAState(level) & STATE_SYSTEM_SELECTED) +elif type == WT_TREEVIEWITEM +&& (focusType == WT_TABLECELL || level > 0) + return false +ElIf type == WT_LISTBOX +&& focusType == WT_LISTBOXITEM +&& StringContains(GetObjectName(SOURCE_DEFAULT, level), GetObjectName(SOURCE_DEFAULT, 0)) + ; This is a hack based on a poorly coded page + ; fixes bug 63271 -- PB: Firefox 5: verbose combobox on - http://harkin.senate.gov/contact_opinion.cfm + return false +elif type == WT_LISTBOXITEM +&& IsLink(focusType) + return false +elif GetObjectRole(level) == IA2_ROLE_SECTION +&& !HasExplicitName(level) + return false +endIf +return true +EndFunction + +void function SayAncestorAtLevel(int level, int type, int parentType, int focusRole, int focusType) +if type == WT_LISTBOX +&& focusType != WT_LISTITEM +&& focusType != WT_LISTBOXITEM +&& GetObjectName(SOURCE_DEFAULT, level) != cscNull + ; this is an HTML list, not a list box. + ; but we still try to speak the list name, if there is one. + SayControlEx(0, GetObjectName(SOURCE_DEFAULT, level)) +ElIf type == WT_SEPARATOR + Say(GetObjectName(SOURCE_DEFAULT, level), OT_CONTROL_NAME, false) +ElIf type == WT_ROW + IndicateControlType (GetObjectSubTypeCode(SOURCE_DEFAULT, level), "", "") + IndicateControlState (GetObjectSubTypeCode(SOURCE_DEFAULT, level), GetObjectStateCode (true, level), "") +elIf type == WT_GRID + SayNameAndSizeOfGrid() +elif type == wt_table +&& !IsVirtualPCCursor() + var string xmlRole = GetObjectIA2Attribute("xml-roles",level) + if StringContains(StringLower(xmlRole), "grid") + SayNameAndSizeOfGrid() + endIf +elif type == wt_tabControl +&& GetObjectRole(level) == role_system_PageTabList + ;To be consistent with the virtual buffer, we will call this a group: + IndicatecontrolType(wt_groupBox, GetObjectName(SOURCE_DEFAULT, level), cmsgSilent) +elif type == wt_toolbar + SayObjectTypeAndText(level) + SayTutorialHelpForObjectAtLevel(type, level) +Else + SayObjectTypeAndText(level) +EndIf +EndFunction + +int function inListDescendedFromCombo (int focusType) +return ((FocusType == WT_LISTBOX || focusType == WT_LISTBOXITEM) +&& FindAncestorOfType(WT_COMBOBOX) != -1) +endFunction + +void function SayFocusAtLevel() +; DoSayObjectTypeAndTextFromLevel calls this after processing the ancestors. +; +; When focus moves to a combobox, we get a focus changed event moving focus to the listbox +; to handle this, we added the following statement. +; for drop down lists descended from edit combos, the type ends up as 0: +var int type = getObjectSubtypeCode(SOURCE_DEFAULT) ; explicitly set to focus +if InListDescendedFromCombo(type) + if type == WT_LISTBOXITEM + ; SayObjectActiveItem causes the control to say "Read-only" instead of + ; just reading the name on up and down navigation. + say(getObjectName(SOURCE_DEFAULT), OT_CONTROL_NAME) + else + SayObjectActiveItem(false) + endIf + return +EndIf +if HandleCustomWindows(GetCurrentWindow()) + NotifyIfContextHelp() + return +EndIf +type = GetObjectSubtypeCode(2) +if type == wt_tabControl +&& GetObjectRole(1) == role_system_PageTabList + ;Do not include the container name when speaking the focus, that was already spoken: + SayObjectTypeAndText(0,false) + NotifyIfContextHelp() + return +endIf +SayObjectTypeAndText() +NotifyIfContextHelp() +EndFunction + +void function DoSayObjectTypeAndTextFromLevel(int level) +var + int parentType, + ;FocusType and focusRole allow us to skip next selection event + int focusType = GetObjectSubtypeCode(SOURCE_DEFAULT, 0), + int focusRole = GetCurrentObject(0).accRole(0), + int type = focusType +while level > 0 + parentType = type ; type will now be set to current type + type = GetObjectSubtypeCode(SOURCE_DEFAULT, level) + if ShouldSayAncestorAtLevel(level, type, parentType, focusRole, focusType) + SayAncestorAtLevel(level, type, parentType, focusRole, focusType) + EndIf + level = level - 1 +EndWhile +SayFocusAtLevel() +EndFunction + +bool function PictureSmartPromptPreliminaryQuestion(string ByRef question) +if IsPictureSmartRestricted() + Say (msg_picturesmart_restricted, OT_ERROR) + return false +endIf +if InputBox(msg_picturesmart_preliminaryquestionprompt, cmsgPictureSmartLayer_Start, question) then + return true +endIf +return false +EndFunction + +void function ClearWinArrowGlobals() +if c_WinArrow.scheduleID + UnScheduleFunction (c_WinArrow.scheduleID) +endIf +CollectionRemoveAll (c_WinArrow) +endFunction + +void function ProcessWindowsPlusArrowKeyPress() +if !c_WinArrow c_WinArrow = new collection endIf +c_WinArrow.hWindow = GetAppMainWindow (GetFocus ()) +c_WinArrow.display = GetDisplay(c_WinArrow.hWindow) +var + object oWindow = FSUIAGetElementFromHandle(c_WinArrow.hWindow), + object oWindowPattern = oWindow.GetWindowPattern(), + string sScriptName +if oWindowPattern + sScriptName = GetScriptAssignedTo (GetCurrentScriptKeyName ()) + if !oWindowPattern.canMaximize + && oWindowPattern.visualState == WindowVisualState_Normal + && sScriptName == "WindowsUpArrow" + SayMessage (OT_ERROR, cmsgCannotMaximize_L, cmsgCannotMaximize_S) + elIf !oWindowPattern.canMinimize + && sScriptName == "WindowsDownArrow" + SayMessage (OT_ERROR, cmsgCannotMinimize_L, cmsgCannotMinimize_S) + elIf !oWindow.GetTransformPattern() + SayMessage (OT_ERROR, cmsgWindowNotResizable_L, cmsgWindowNotResizable_S) + else + c_WinArrow.scheduleID = ScheduleFunction ("SayWindowVisualState", 2, true) + endIf +else + SayMessage (OT_ERROR, cmsgWindowNotResizable_L, cmsgWindowNotResizable_S) +endIf +c_WinArrow.lastPress = GetTickCount () +TypeCurrentScriptKey () +endFunction + +Script WindowsUpArrow() +ProcessWindowsPlusArrowKeyPress() +EndScript + +Script WindowsDownArrow() +ProcessWindowsPlusArrowKeyPress() +EndScript + +Script WindowsLeftArrow() +ProcessWindowsPlusArrowKeyPress() +EndScript + +Script WindowsRightArrow() +ProcessWindowsPlusArrowKeyPress() +EndScript + +void function SayWindowVisualState() +var + handle hWindow, + object oWindow, + object oWindowPattern, + string sVisualState, + string sDisplay, + int iOutputType = OT_STATUS, + int iVisualState, int iLeft, int iTop, int iRight, int iBottom +if c_WinArrow.hWindow + hWindow = c_WinArrow.hWindow +else + hWindow = GetAppMainWindow(GetFocus()) +endIf +oWindow = FSUIAGetElementFromHandle(hWindow) +oWindowPattern = oWindow.GetWindowPattern() +if !oWindowPattern + SayMessage (OT_ERROR, cmsgWindowNotResizable_L, cmsgWindowNotResizable_S) + return +endIf +iVisualState = oWindowPattern.visualState +iLeft = oWindow.BoundingRectangle.left +iTop = oWindow.BoundingRectangle.top +iRight = oWindow.BoundingRectangle.right +iBottom = oWindow.BoundingRectangle.bottom +if iVisualState == WindowVisualState_Normal + if SayWindowSnap(hWindow, iLeft, iTop, iRight, iBottom) + ClearWinArrowGlobals() + return + endIf + sVisualState = cmsgWindowRestored +elIf iVisualState == WindowVisualState_Maximized + sVisualState = cmsgWindowMaximized +elIf iVisualState == WindowVisualState_Minimized + sVisualState = cmsgWindowMinimized +endIf +if GetScriptAssignedTo (GetCurrentScriptKeyName ()) == "SayWindowTitle" + sDisplay = FormatString (cmsgWindowDisplay, IntToString(GetDisplay(hWindow))) + sVisualState = FormatString (cmsgWindowVisualState, sVisualState, sDisplay) + iOutputType = OT_USER_REQUESTED_INFORMATION +endIf +Say (sVisualState, iOutputType) +ClearWinArrowGlobals() +endFunction + +int function SayWindowSnap(handle hWindow, int iNewLeft, int iNewTop, int iNewRight, int iNewBottom) +var + int iWorkAreaLeft, int iWorkAreaTop, int iWorkAreaRight, int iWorkAreaBottom, + int iWorkAreaWidth, int iWorkAreaHeight, + int iWindowWidth, int iWindowHeight, + int iNewDisplay, + string sNewDisplay, + string sSnapped + +GetWorkAreaRect(hWindow, iWorkAreaLeft, iWorkAreaRight, iWorkAreaTop, iWorkAreaBottom) +iWorkAreaWidth = iWorkAreaRight - iWorkAreaLeft +iWorkAreaHeight = iWorkAreaBottom - iWorkAreaTop +iWindowWidth = iNewRight - iNewLeft +iWindowHeight = iNewBottom - iNewTop +iNewDisplay = GetDisplay(hWindow) +if iNewDisplay != c_WinArrow.display + sNewDisplay = FormatString (cmsgWindowDisplay, IntToString(iNewDisplay)) +endIf + +if iNewLeft <= iWorkAreaLeft +&& iNewRight >= iWorkAreaRight +&& ((iWindowHeight*100)/iWorkAreaHeight) <= VerticalSnapPercentage + ;Full width, not full height + if iNewTop <= iWorkAreaTop + && iNewBottom < iWorkAreaBottom + ;Snapped to top + if ((iWindowHeight/2)*3) >= iWorkAreaHeight + sSnapped = FormatString (cmsgWindowSnappedTwoThirds, cmsgWindowSnapTop, sNewDisplay) + elIf iWindowHeight <= (iWorkAreaHeight/3) + sSnapped = FormatString (cmsgWindowSnappedThird, cmsgWindowSnapTop, sNewDisplay) + else + sSnapped = FormatString (cmsgWindowSnappedHalf, cmsgWindowSnapTop, sNewDisplay) + endIf + elIf iNewBottom >= iWorkAreaBottom + && iNewTop > iWorkAreaTop + ;Snapped to bottom + if ((iWindowHeight/2)*3) >= iWorkAreaHeight + sSnapped = FormatString (cmsgWindowSnappedTwoThirds, cmsgWindowSnapBottom, sNewDisplay) + elIf iWindowHeight <= (iWorkAreaHeight/3) + sSnapped = FormatString (cmsgWindowSnappedThird, cmsgWindowSnapBottom, sNewDisplay) + else + sSnapped = FormatString (cmsgWindowSnappedHalf, cmsgWindowSnapBottom, sNewDisplay) + endIf + elIf iNewBottom < iWorkAreaBottom + && iNewTop > iWorkAreaTop + ;Snapped to middle + sSnapped = FormatString (cmsgWindowSnappedThird, cmsgWindowSnapMiddle, sNewDisplay) + endIf +elIf iNewTop <= iWorkAreaTop +&& iNewBottom >= iWorkAreaBottom +&& ((iWindowWidth*100)/iWorkAreaWidth) <= HorizontalSnapPercentage + ;Full height, not full width + if iNewLeft <= iWorkAreaLeft + && iNewRight < iWorkAreaRight + ;Snapped to left + sSnapped = FormatString (cmsgWindowSnappedHalf, cmsgWindowSnapLeft, sNewDisplay) + elIf iNewLeft > iWorkAreaLeft + && iNewRight >= iWorkAreaRight + ;Snapped to right + sSnapped = FormatString (cmsgWindowSnappedHalf, cmsgWindowSnapRight, sNewDisplay) + endIf +elIf ((iWindowWidth*100)/iWorkAreaWidth) <= HorizontalSnapPercentage +&& ((iWindowHeight*100)/iWorkAreaHeight) <= VerticalSnapPercentage + ;Not full height or width + if iNewLeft <= iWorkAreaLeft + && iNewTop <= iWorkAreaTop + && iNewRight < iWorkAreaRight + && iNewBottom < iWorkAreaBottom + ;Snapped to top left + sSnapped = FormatString (cmsgWindowSnappedQuarter, cmsgWindowSnapTop, cmsgWindowSnapLeft, sNewDisplay) + elIf iNewLeft > iWorkAreaLeft + && iNewTop <= iWorkAreaTop + && iNewRight >= iWorkAreaRight + && iNewBottom < iWorkAreaBottom + ;Snapped to top right: + sSnapped = FormatString (cmsgWindowSnappedQuarter, cmsgWindowSnapTop, cmsgWindowSnapRight, sNewDisplay) + elIf iNewLeft <= iWorkAreaLeft + && iNewTop > iWorkAreaTop + && iNewRight < iWorkAreaRight + && iNewBottom >= iWorkAreaBottom + ;Snapped to bottom left: + sSnapped = FormatString (cmsgWindowSnappedQuarter, cmsgWindowSnapBottom, cmsgWindowSnapLeft, sNewDisplay) + elIf iNewLeft > iWorkAreaLeft + && iNewTop > iWorkAreaTop + && iNewRight >= iWorkAreaRight + && iNewBottom >= iWorkAreaBottom + ;Snapped to bottom right: + sSnapped = FormatString (cmsgWindowSnappedQuarter, cmsgWindowSnapBottom, cmsgWindowSnapRight, sNewDisplay) + endIf +endIf +if sSnapped + Say (sSnapped, OT_STATUS) + return true +endIf +return false +endFunction + +void function ListEnteredEvent(int itemCount, int nestingLevel) +var + string message, + string itemCountStr + +if (itemCount < 1) then + message = cmsgEnteringListNoItemCount + else + itemCountStr = IntToString(itemCount) + if (nestingLevel > 0) then + message = FormatString( cmsgEnteringNestedList, itemCountStr, IntToString ( nestingLevel)) + else + message = FormatString(cmsgEnteringList,itemCountStr) + EndIf +endIf +SayMessage( OT_ANNOUNCE_POSITION_AND_COUNT, message ); +EndFunction + +void function ListExitedEvent(int itemCount, int nestingLevel) +var + string message +if (nestingLevel > 0) then + message = FormatString( cmsgLeavingNestedList, IntToString ( nestingLevel)) +else + message = cmsgLeavingList +EndIf +SayMessage( OT_ANNOUNCE_POSITION_AND_COUNT, message ); +EndFunction + +void function MouseToTopLeft() +SaveCursor () +JAWSCursor () +MoveTo (1, 1) +RestoreCursor () +endFunction + +void function SpeakFSCompanionError(int status) +if (status == FSCompanionStatus_FailedToLaunch) + SayMessage(OT_ERROR, msgFSCompanionError_FailedToLaunch) +elif (status == FSCompanionStatus_Restricted) + SayMessage(OT_ERROR, msgFSCompanionError_Restricted) +elif (status == FSCompanionStatus_NotUserDesktop) + SayMessage(OT_ERROR, msgFSCompanionError_NotUserDesktop) +elif (status == FSCompanionStatus_NotConnected) + SayMessage(OT_ERROR, msgFSCompanionError_NotConnected) +endIf +endFunction + +Script LaunchFSCompanion() +var int status = builtin::LaunchFSCompanion(); +if (status != FSCompanionStatus_Ok) + SpeakFSCompanionError(status) +endIf +EndScript + +void function AddAskFSCompanionHotKeyLink() +UserBufferAddText(FormatString(msgAskFSCompanionHotKeyLink), + cFuncLaunchFSCompanion, + FormatString(msgAskFSCompanionHotKeyLink), + cFont_Aerial, 12, ATTRIB_UNDERLINE, rgbStringToColor(cColor_BLUE), rgbStringToColor(cColor_White)) +endFunction + + +script ToggleSayIndentation() +var int status = GetJCFOption (OPT_INDICATE_INDENTATION) +if status == 0 +; turn it on +Say ("Indentation echo on", OT_JAWS_MESSAGE, false) +SetJCFOption (OPT_INDICATE_INDENTATION, 1) +else +; turn it off +Say ("Indentation echo off", OT_JAWS_MESSAGE, false) +SetJCFOption (OPT_INDICATE_INDENTATION, 0) +endif +EndScript + diff --git a/toggle-say-indent/default.JKM b/toggle-say-indent/default.JKM new file mode 100755 index 0000000..471eb54 --- /dev/null +++ b/toggle-say-indent/default.JKM @@ -0,0 +1,2 @@ +[Common Keys] +Shift+JAWSKey+I=ToggleSayIndentation