This abstract class controls the way effort keys are related to logical column numbers. It supplies two functions:
It dictates which logical column in the main table displays data for which efforts.
It supplies the label for each logical column.
Here is the formal interface.
# - - - - - c l a s s C o l u m n L a y o u t class ColumnLayout(object): '''Base class for column dispatchers. Exports: ColumnLayout(effKeyList): [ effKeyList is an iterable containing EffortKey instances -> return a new ColumnLayout instance for those EffortKey instances ] .__len__(self): [ returns the number of logical columns in self ] .findColumn(effKey): [ effKey is an EffortKey instance -> if effKey is in self -> return the logical column index that displays data from the effort with key (effKey) else -> raise KeyError ] .label(colx): [ colx is an int -> if colx is a logical column in self -> return that column's label as a string else -> raise KeyError ] State/Invariants: ._nCols: [ number of logical columns in self ] ''' def __len__(self): return self._nCols def __init__(self, effKeyList): raise NotImplementedError("ColumnLayout.__init__ is a " "virtual method.") def findColumn(self, effKey): raise NotImplementedError("ColumnLayout.findColumn is a " "virtual method.") def label(self, effKey): raise NotImplementedError("ColumnLayout.label is a " "virtual method.")