\r
\r
\r
- def _expandToLine(self,rangeObj):\r
- sel=self.obj.WinwordSelectionObject\r
- oldSel=sel.range\r
- sel.SetRange(rangeObj.start,rangeObj.end)\r
- sel.Expand(wdLine)\r
- rangeObj.SetRange(sel.Start,sel.End)\r
- sel.SetRange(oldSel.Start,oldSel.End)\r
+ def _expandToLineFromCaret(self):\r
+ info=winUser.getGUIThreadInfo(self.obj.windowThreadID)\r
+ caretPoint=ctypes.wintypes.POINT(info.rcCaret.left,info.rcCaret.top)\r
+ ctypes.windll.user32.ClientToScreen(self.obj.windowHandle,ctypes.byref(caretPoint))\r
+ caretY=caretPoint.y\r
+ clientLeft,clientTop,clientWidth,clientHeight=self.obj.location\r
+ tempRange=self.obj.WinwordDocumentObject.application.activeWindow.rangeFromPoint(clientLeft,caretY)\r
+ self._rangeObj.Start=tempRange.Start\r
+ tempRange=self.obj.WinwordDocumentObject.application.activeWindow.rangeFromPoint(clientLeft+clientWidth,caretY)\r
+ self._rangeObj.End=tempRange.Start\r
\r
def _getFormatFieldAtRange(self,range,formatConfig):\r
formatField=textInfos.FormatField()\r
if unit==textInfos.UNIT_LINE and self.basePosition not in (textInfos.POSITION_CARET,textInfos.POSITION_SELECTION):\r
unit=textInfos.UNIT_SENTENCE\r
if unit==textInfos.UNIT_LINE:\r
- self._expandToLine(self._rangeObj)\r
+ self._expandToLineFromCaret()\r
elif unit==textInfos.UNIT_CHARACTER:\r
self._rangeObj.moveEnd(wdCharacter,1)\r
elif unit in NVDAUnitsToWordUnits:\r
log.debugWarning("", exc_info=True)\r
\r
def update(self):\r
- caret = self._getSelection()\r
- caret.collapse()\r
+ # HACK: Some TextInfos only support UNIT_LINE properly if they are based on POSITION_CARET,\r
+ # so use the original caret TextInfo for line and copy for caret.\r
+ self._line = line = self._getSelection()\r
+ line.collapse()\r
+ caret = line.copy()\r
# Get the line at the caret.\r
- self._line = line = caret.copy()\r
line.expand(textInfos.UNIT_LINE)\r
# Not all text APIs support offsets, so we can't always get the offset of the caret relative to the start of the line.\r
# Therefore, grab the line in two parts.\r