Changeset 2377 for trunk/source/NVDAObjects/IAccessible/edit.py
- Timestamp:
- 09/11/08 11:48:26 (4 months ago)
- Files:
-
- 1 modified
-
trunk/source/NVDAObjects/IAccessible/edit.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/NVDAObjects/IAccessible/edit.py
r2374 r2377 160 160 class EditTextInfo(NVDAObjectTextInfo): 161 161 162 def _getPoint(self): 163 self.expand(textHandler.UNIT_CHARACTER) 164 offset=self._startOffset 165 if self.obj.editAPIVersion==1: 166 processHandle=self.obj.editProcessHandle 167 internalP=winKernel.virtualAllocEx(processHandle,None,ctypes.sizeof(PointLStruct),winKernel.MEM_COMMIT,winKernel.PAGE_READWRITE) 168 p=PointLStruct(0,0) 169 winKernel.writeProcessMemory(processHandle,internalP,ctypes.byref(p),ctypes.sizeof(p),None) 170 winUser.sendMessage(self.obj.windowHandle,EM_POSFROMCHAR,internalP,self._startOffset) 171 winKernel.readProcessMemory(processHandle,internalP,ctypes.byref(p),ctypes.sizeof(p),None) 172 winKernel.virtualFreeEx(processHandle,internalP,0,winKernel.MEM_RELEASE) 173 point=textHandler.Point(p.x,p.y) 174 else: 175 res=winUser.sendMessage(self.obj.windowHandle,EM_POSFROMCHAR,self._startOffset,None) 176 point=textHandler.Point(winUser.LOWORD(res),winUser.HIWORD(res)) 177 (left,top,width,height)=self.obj.location 178 if point.x and point.y: 179 point.x=point.x+left 180 point.y=point.y+top 181 return point 182 else: 183 return None 184 162 185 def _getOffsetFromPoint(self,x,y): 163 186 (left,top,width,height)=self.obj.location … … 221 244 if formatConfig["reportLineNumber"]: 222 245 formatField["line-number"]=self._getLineNumFromOffset(offset)+1 246 if formatConfig["reportLinks"]: 247 if charFormat is None: charFormat=self._getCharFormat(offset) 248 formatField["link"]=bool(charFormat.dwEffects&CFM_LINK) 223 249 return formatField,(startOffset,endOffset) 224 250 … … 387 413 class ITextDocumentTextInfo(textHandler.TextInfo): 388 414 415 def _getPoint(self): 416 range=self._rangeObj.duplicate 417 range.collapse(True) 418 range.expand(comInterfaces.tom.tomCharacter) 419 p=textHandler.Point(0,0) 420 (p.x,p.y)=range.GetPoint(comInterfaces.tom.tomStart) 421 if p.x and p.y: 422 return p 423 else: 424 return None 425 426 def _getCharFormat(self,range): 427 oldSel=self.obj.ITextSelectionObject.duplicate 428 if not (oldSel.start==range.start and oldSel.end==range.end): 429 self.obj.ITextSelectionObject.start=range.start 430 self.obj.ITextSelectionObject.end=range.end 431 if self.obj.isWindowUnicode: 432 charFormatStruct=CharFormat2WStruct 433 else: 434 charFormatStruct=CharFormat2AStruct 435 charFormat=charFormatStruct() 436 charFormat.cbSize=ctypes.sizeof(charFormatStruct) 437 processHandle=self.obj.editProcessHandle 438 internalCharFormat=winKernel.virtualAllocEx(processHandle,None,ctypes.sizeof(charFormat),winKernel.MEM_COMMIT,winKernel.PAGE_READWRITE) 439 winKernel.writeProcessMemory(processHandle,internalCharFormat,ctypes.byref(charFormat),ctypes.sizeof(charFormat),None) 440 winUser.sendMessage(self.obj.windowHandle,EM_GETCHARFORMAT,SCF_SELECTION, internalCharFormat) 441 winKernel.readProcessMemory(processHandle,internalCharFormat,ctypes.byref(charFormat),ctypes.sizeof(charFormat),None) 442 winKernel.virtualFreeEx(processHandle,internalCharFormat,0,winKernel.MEM_RELEASE) 443 if not (oldSel.start==range.start and oldSel.end==range.end): 444 self.obj.ITextSelectionObject.start=oldSel.start 445 self.obj.ITextSelectionObject.end=oldSel.end 446 return charFormat 447 389 448 def _getFormatFieldAtRange(self,range,formatConfig): 390 449 formatField=textHandler.FormatField() 391 450 fontObj=None 392 451 paraFormatObj=None 452 charFormat=None 393 453 if formatConfig["reportAlignment"]: 394 454 if not paraFormatObj: paraFormatObj=range.para … … 415 475 formatField["italic"]=bool(fontObj.italic) 416 476 formatField["underline"]=bool(fontObj.underline) 477 formatField["strikethrough"]=bool(fontObj.StrikeThrough) 417 478 if fontObj.superscript: 418 479 formatField["text-position"]="super" 419 480 elif fontObj.subscript: 420 481 formatField["text-position"]="sub" 482 if formatConfig["reportLinks"]: 483 if charFormat is None: charFormat=self._getCharFormat(range) 484 formatField["link"]=bool(charFormat.dwEffects&CFM_LINK) 421 485 return formatField 422 486 … … 493 557 elif position==textHandler.POSITION_LAST: 494 558 self._rangeObj=self.obj.ITextDocumentObject.range(0,0) 495 self._rangeObj.move End(comInterfaces.tom.tomStory,1)496 self._rangeObj.move (comInterfaces.tom.tomCharacter,-1)559 self._rangeObj.move(comInterfaces.tom.tomStory,1) 560 self._rangeObj.moveStart(comInterfaces.tom.tomCharacter,-1) 497 561 elif isinstance(position,textHandler.Offsets): 498 562 self._rangeObj=self.obj.ITextDocumentObject.range(position.startOffset,position.endOffset) … … 626 690 else: 627 691 self.TextInfo=EditTextInfo 628 if self.TextInfo is EditTextInfo: 629 self.editProcessHandle=winKernel.openProcess(winKernel.PROCESS_VM_OPERATION|winKernel.PROCESS_VM_READ|winKernel.PROCESS_VM_WRITE,False,self.windowProcessID) 692 self.editProcessHandle=winKernel.openProcess(winKernel.PROCESS_VM_OPERATION|winKernel.PROCESS_VM_READ|winKernel.PROCESS_VM_WRITE,False,self.windowProcessID) 630 693 631 694 def __del__(self): 632 if self.TextInfo is EditTextInfo: 633 winKernel.closeHandle(self.editProcessHandle) 695 winKernel.closeHandle(self.editProcessHandle) 634 696 635 697 def _get_TextInfo(self): … … 681 743 ("ExtendedLeft","moveByCharacter"), 682 744 ("ExtendedRight","moveByCharacter"), 745 ("ExtendedPrior","moveByLine"), 746 ("ExtendedNext","moveByLine"), 683 747 ("Control+ExtendedLeft","moveByWord"), 684 748 ("Control+ExtendedRight","moveByWord"),

NVDA is supported by