215 lines
10 KiB
Go
215 lines
10 KiB
Go
// Copyright 2010 The Walk Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build windows
|
|
|
|
package walk
|
|
|
|
import "github.com/lxn/win"
|
|
|
|
// AccState enum defines the state of the window/control
|
|
type AccState int32
|
|
|
|
// Window/control states
|
|
const (
|
|
AccStateNormal AccState = win.STATE_SYSTEM_NORMAL
|
|
AccStateUnavailable AccState = win.STATE_SYSTEM_UNAVAILABLE
|
|
AccStateSelected AccState = win.STATE_SYSTEM_SELECTED
|
|
AccStateFocused AccState = win.STATE_SYSTEM_FOCUSED
|
|
AccStatePressed AccState = win.STATE_SYSTEM_PRESSED
|
|
AccStateChecked AccState = win.STATE_SYSTEM_CHECKED
|
|
AccStateMixed AccState = win.STATE_SYSTEM_MIXED
|
|
AccStateIndeterminate AccState = win.STATE_SYSTEM_INDETERMINATE
|
|
AccStateReadonly AccState = win.STATE_SYSTEM_READONLY
|
|
AccStateHotTracked AccState = win.STATE_SYSTEM_HOTTRACKED
|
|
AccStateDefault AccState = win.STATE_SYSTEM_DEFAULT
|
|
AccStateExpanded AccState = win.STATE_SYSTEM_EXPANDED
|
|
AccStateCollapsed AccState = win.STATE_SYSTEM_COLLAPSED
|
|
AccStateBusy AccState = win.STATE_SYSTEM_BUSY
|
|
AccStateFloating AccState = win.STATE_SYSTEM_FLOATING
|
|
AccStateMarqueed AccState = win.STATE_SYSTEM_MARQUEED
|
|
AccStateAnimated AccState = win.STATE_SYSTEM_ANIMATED
|
|
AccStateInvisible AccState = win.STATE_SYSTEM_INVISIBLE
|
|
AccStateOffscreen AccState = win.STATE_SYSTEM_OFFSCREEN
|
|
AccStateSizeable AccState = win.STATE_SYSTEM_SIZEABLE
|
|
AccStateMoveable AccState = win.STATE_SYSTEM_MOVEABLE
|
|
AccStateSelfVoicing AccState = win.STATE_SYSTEM_SELFVOICING
|
|
AccStateFocusable AccState = win.STATE_SYSTEM_FOCUSABLE
|
|
AccStateSelectable AccState = win.STATE_SYSTEM_SELECTABLE
|
|
AccStateLinked AccState = win.STATE_SYSTEM_LINKED
|
|
AccStateTraversed AccState = win.STATE_SYSTEM_TRAVERSED
|
|
AccStateMultiselectable AccState = win.STATE_SYSTEM_MULTISELECTABLE
|
|
AccStateExtselectable AccState = win.STATE_SYSTEM_EXTSELECTABLE
|
|
AccStateAlertLow AccState = win.STATE_SYSTEM_ALERT_LOW
|
|
AccStateAlertMedium AccState = win.STATE_SYSTEM_ALERT_MEDIUM
|
|
AccStateAlertHigh AccState = win.STATE_SYSTEM_ALERT_HIGH
|
|
AccStateProtected AccState = win.STATE_SYSTEM_PROTECTED
|
|
AccStateHasPopup AccState = win.STATE_SYSTEM_HASPOPUP
|
|
AccStateValid AccState = win.STATE_SYSTEM_VALID
|
|
)
|
|
|
|
// AccRole enum defines the role of the window/control in UI.
|
|
type AccRole int32
|
|
|
|
// Window/control system roles
|
|
const (
|
|
AccRoleTitlebar AccRole = win.ROLE_SYSTEM_TITLEBAR
|
|
AccRoleMenubar AccRole = win.ROLE_SYSTEM_MENUBAR
|
|
AccRoleScrollbar AccRole = win.ROLE_SYSTEM_SCROLLBAR
|
|
AccRoleGrip AccRole = win.ROLE_SYSTEM_GRIP
|
|
AccRoleSound AccRole = win.ROLE_SYSTEM_SOUND
|
|
AccRoleCursor AccRole = win.ROLE_SYSTEM_CURSOR
|
|
AccRoleCaret AccRole = win.ROLE_SYSTEM_CARET
|
|
AccRoleAlert AccRole = win.ROLE_SYSTEM_ALERT
|
|
AccRoleWindow AccRole = win.ROLE_SYSTEM_WINDOW
|
|
AccRoleClient AccRole = win.ROLE_SYSTEM_CLIENT
|
|
AccRoleMenuPopup AccRole = win.ROLE_SYSTEM_MENUPOPUP
|
|
AccRoleMenuItem AccRole = win.ROLE_SYSTEM_MENUITEM
|
|
AccRoleTooltip AccRole = win.ROLE_SYSTEM_TOOLTIP
|
|
AccRoleApplication AccRole = win.ROLE_SYSTEM_APPLICATION
|
|
AccRoleDocument AccRole = win.ROLE_SYSTEM_DOCUMENT
|
|
AccRolePane AccRole = win.ROLE_SYSTEM_PANE
|
|
AccRoleChart AccRole = win.ROLE_SYSTEM_CHART
|
|
AccRoleDialog AccRole = win.ROLE_SYSTEM_DIALOG
|
|
AccRoleBorder AccRole = win.ROLE_SYSTEM_BORDER
|
|
AccRoleGrouping AccRole = win.ROLE_SYSTEM_GROUPING
|
|
AccRoleSeparator AccRole = win.ROLE_SYSTEM_SEPARATOR
|
|
AccRoleToolbar AccRole = win.ROLE_SYSTEM_TOOLBAR
|
|
AccRoleStatusbar AccRole = win.ROLE_SYSTEM_STATUSBAR
|
|
AccRoleTable AccRole = win.ROLE_SYSTEM_TABLE
|
|
AccRoleColumnHeader AccRole = win.ROLE_SYSTEM_COLUMNHEADER
|
|
AccRoleRowHeader AccRole = win.ROLE_SYSTEM_ROWHEADER
|
|
AccRoleColumn AccRole = win.ROLE_SYSTEM_COLUMN
|
|
AccRoleRow AccRole = win.ROLE_SYSTEM_ROW
|
|
AccRoleCell AccRole = win.ROLE_SYSTEM_CELL
|
|
AccRoleLink AccRole = win.ROLE_SYSTEM_LINK
|
|
AccRoleHelpBalloon AccRole = win.ROLE_SYSTEM_HELPBALLOON
|
|
AccRoleCharacter AccRole = win.ROLE_SYSTEM_CHARACTER
|
|
AccRoleList AccRole = win.ROLE_SYSTEM_LIST
|
|
AccRoleListItem AccRole = win.ROLE_SYSTEM_LISTITEM
|
|
AccRoleOutline AccRole = win.ROLE_SYSTEM_OUTLINE
|
|
AccRoleOutlineItem AccRole = win.ROLE_SYSTEM_OUTLINEITEM
|
|
AccRolePagetab AccRole = win.ROLE_SYSTEM_PAGETAB
|
|
AccRolePropertyPage AccRole = win.ROLE_SYSTEM_PROPERTYPAGE
|
|
AccRoleIndicator AccRole = win.ROLE_SYSTEM_INDICATOR
|
|
AccRoleGraphic AccRole = win.ROLE_SYSTEM_GRAPHIC
|
|
AccRoleStatictext AccRole = win.ROLE_SYSTEM_STATICTEXT
|
|
AccRoleText AccRole = win.ROLE_SYSTEM_TEXT
|
|
AccRolePushbutton AccRole = win.ROLE_SYSTEM_PUSHBUTTON
|
|
AccRoleCheckbutton AccRole = win.ROLE_SYSTEM_CHECKBUTTON
|
|
AccRoleRadiobutton AccRole = win.ROLE_SYSTEM_RADIOBUTTON
|
|
AccRoleCombobox AccRole = win.ROLE_SYSTEM_COMBOBOX
|
|
AccRoleDroplist AccRole = win.ROLE_SYSTEM_DROPLIST
|
|
AccRoleProgressbar AccRole = win.ROLE_SYSTEM_PROGRESSBAR
|
|
AccRoleDial AccRole = win.ROLE_SYSTEM_DIAL
|
|
AccRoleHotkeyfield AccRole = win.ROLE_SYSTEM_HOTKEYFIELD
|
|
AccRoleSlider AccRole = win.ROLE_SYSTEM_SLIDER
|
|
AccRoleSpinbutton AccRole = win.ROLE_SYSTEM_SPINBUTTON
|
|
AccRoleDiagram AccRole = win.ROLE_SYSTEM_DIAGRAM
|
|
AccRoleAnimation AccRole = win.ROLE_SYSTEM_ANIMATION
|
|
AccRoleEquation AccRole = win.ROLE_SYSTEM_EQUATION
|
|
AccRoleButtonDropdown AccRole = win.ROLE_SYSTEM_BUTTONDROPDOWN
|
|
AccRoleButtonMenu AccRole = win.ROLE_SYSTEM_BUTTONMENU
|
|
AccRoleButtonDropdownGrid AccRole = win.ROLE_SYSTEM_BUTTONDROPDOWNGRID
|
|
AccRoleWhitespace AccRole = win.ROLE_SYSTEM_WHITESPACE
|
|
AccRolePageTabList AccRole = win.ROLE_SYSTEM_PAGETABLIST
|
|
AccRoleClock AccRole = win.ROLE_SYSTEM_CLOCK
|
|
AccRoleSplitButton AccRole = win.ROLE_SYSTEM_SPLITBUTTON
|
|
AccRoleIPAddress AccRole = win.ROLE_SYSTEM_IPADDRESS
|
|
AccRoleOutlineButton AccRole = win.ROLE_SYSTEM_OUTLINEBUTTON
|
|
)
|
|
|
|
// Accessibility provides basic Dynamic Annotation of windows and controls.
|
|
type Accessibility struct {
|
|
wb *WindowBase
|
|
}
|
|
|
|
// SetAccelerator sets window accelerator name using Dynamic Annotation.
|
|
func (a *Accessibility) SetAccelerator(acc string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_KEYBOARDSHORTCUT, win.EVENT_OBJECT_ACCELERATORCHANGE, acc)
|
|
}
|
|
|
|
// SetDefaultAction sets window default action using Dynamic Annotation.
|
|
func (a *Accessibility) SetDefaultAction(defAction string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_DEFAULTACTION, win.EVENT_OBJECT_DEFACTIONCHANGE, defAction)
|
|
}
|
|
|
|
// SetDescription sets window description using Dynamic Annotation.
|
|
func (a *Accessibility) SetDescription(acc string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_DESCRIPTION, win.EVENT_OBJECT_DESCRIPTIONCHANGE, acc)
|
|
}
|
|
|
|
// SetHelp sets window help using Dynamic Annotation.
|
|
func (a *Accessibility) SetHelp(help string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_HELP, win.EVENT_OBJECT_HELPCHANGE, help)
|
|
}
|
|
|
|
// SetName sets window name using Dynamic Annotation.
|
|
func (a *Accessibility) SetName(name string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_NAME, win.EVENT_OBJECT_NAMECHANGE, name)
|
|
}
|
|
|
|
// SetRole sets window role using Dynamic Annotation. The role must be set when the window is
|
|
// created and is not to be modified later.
|
|
func (a *Accessibility) SetRole(role AccRole) error {
|
|
return a.accSetPropertyInt(a.wb.hWnd, &win.PROPID_ACC_ROLE, 0, int32(role))
|
|
}
|
|
|
|
// SetRoleMap sets window role map using Dynamic Annotation. The role map must be set when the
|
|
// window is created and is not to be modified later.
|
|
func (a *Accessibility) SetRoleMap(roleMap string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_ROLEMAP, 0, roleMap)
|
|
}
|
|
|
|
// SetState sets window state using Dynamic Annotation.
|
|
func (a *Accessibility) SetState(state AccState) error {
|
|
return a.accSetPropertyInt(a.wb.hWnd, &win.PROPID_ACC_STATE, win.EVENT_OBJECT_STATECHANGE, int32(state))
|
|
}
|
|
|
|
// SetStateMap sets window state map using Dynamic Annotation. The state map must be set when
|
|
// the window is created and is not to be modified later.
|
|
func (a *Accessibility) SetStateMap(stateMap string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_STATEMAP, 0, stateMap)
|
|
}
|
|
|
|
// SetValueMap sets window value map using Dynamic Annotation. The value map must be set when
|
|
// the window is created and is not to be modified later.
|
|
func (a *Accessibility) SetValueMap(valueMap string) error {
|
|
return a.accSetPropertyStr(a.wb.hWnd, &win.PROPID_ACC_VALUEMAP, 0, valueMap)
|
|
}
|
|
|
|
// accSetPropertyInt sets integer window property for Dynamic Annotation.
|
|
func (a *Accessibility) accSetPropertyInt(hwnd win.HWND, idProp *win.MSAAPROPID, event uint32, value int32) error {
|
|
accPropServices := a.wb.group.accessibilityServices()
|
|
if accPropServices == nil {
|
|
return newError("Dynamic Annotation not available")
|
|
}
|
|
var v win.VARIANT
|
|
v.SetLong(value)
|
|
hr := accPropServices.SetHwndProp(hwnd, win.OBJID_CLIENT, win.CHILDID_SELF, idProp, &v)
|
|
if win.FAILED(hr) {
|
|
return errorFromHRESULT("IAccPropServices.SetHwndProp", hr)
|
|
}
|
|
if win.EVENT_OBJECT_CREATE <= event && event <= win.EVENT_OBJECT_END {
|
|
win.NotifyWinEvent(event, hwnd, win.OBJID_CLIENT, win.CHILDID_SELF)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// accSetPropertyStr sets string window property for Dynamic Annotation.
|
|
func (a *Accessibility) accSetPropertyStr(hwnd win.HWND, idProp *win.MSAAPROPID, event uint32, value string) error {
|
|
accPropServices := a.wb.group.accessibilityServices()
|
|
if accPropServices == nil {
|
|
return newError("Dynamic Annotation not available")
|
|
}
|
|
hr := accPropServices.SetHwndPropStr(hwnd, win.OBJID_CLIENT, win.CHILDID_SELF, idProp, value)
|
|
if win.FAILED(hr) {
|
|
return errorFromHRESULT("IAccPropServices.SetHwndPropStr", hr)
|
|
}
|
|
if win.EVENT_OBJECT_CREATE <= event && event <= win.EVENT_OBJECT_END {
|
|
win.NotifyWinEvent(event, hwnd, win.OBJID_CLIENT, win.CHILDID_SELF)
|
|
}
|
|
return nil
|
|
}
|