#A part of NonVisual Desktop Access (NVDA)
#Copyright (C) 2014 NVDA Contributors
#This file is covered by the GNU General Public License.
#See the file COPYING for more details.
class HeaderCellInfo(object):
__slots__=['rowNumber','columnNumber','rowSpan','colSpan','minRowNumber','maxRowNumber','minColumnNumber','maxColumnNumber','name','isRowHeader','isColumnHeader']
def __init__(self,**kwargs):
self.rowSpan=self.colSpan=1
self.minColumnNumber=self.maxColumnNumber=self.minRowNumber=self.maxRowNumber=None
for name,value in kwargs.iteritems():
setattr(self,name,value)
class HeaderCellTracker(object):
def __init__(self):
self.infosDict={}
self.listByRow=[]
self.listByColumn=[]
def addHeaderCellInfo(self,**kwargs):
info=HeaderCellInfo(**kwargs)
key=(info.rowNumber,info.columnNumber)
self.infosDict[key]=info
self.listByRow.append(key)
self.listByRow.sort(reverse=True)
self.listByColumn.append(key)
self.listByColumn.sort(key=lambda k: (k[1],k[0]),reverse=True)
def removeHeaderCellInfo(self,info):
key=(info.rowNumber,info.columnNumber)
self.listByRow.remove(key)
self.listByColumn.remove(key)
del self.infosDict[key]
def getHeaderCellInfoAt(self,rowNumber,columnNumber):
return self.infosDict.get((rowNumber,columnNumber))
def iterPossibleHeaderCellInfosFor(self,rowNumber,columnNumber,minRowNumber=None,maxRowNumber=None,minColumnNumber=None,maxColumnNumber=None,columnHeader=False):
for key in self.listByRow: #(self.listByColumn if columnHeader else self.listByRow):
info=self.infosDict[key]
if (info.minColumnNumber and info.minColumnNumber>columnNumber) or (info.maxColumnNumber and info.maxColumnNumberrowNumber) or (info.maxRowNumber and info.maxRowNumberinfo.columnNumber) or (maxColumnNumber and maxColumnNumberinfo.rowNumber) or (maxRowNumber and maxRowNumber