NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

basicDynamicScroll.py (24485B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\control\basicDynamicScroll.py
      2 from contextlib import contextmanager
      3 import telemetry
      4 import uthread
      5 import _weakref
      6 import log
      7 import carbonui.const as uiconst
      8 from carbon.common.script.util.timerstuff import AutoTimer
      9 from carbonui.primitives.container import Container
     10 from carbonui.uicore import uicore
     11 from eve.client.script.ui.control.eveScroll import Scroll
     12 
     13 class BasicDynamicScroll(Scroll):
     14     isTabStop = 1
     15     scrollEnabled = True
     16     default_name = 'scroll'
     17     default_multiSelect = 1
     18     default_stickToBottom = 0
     19     default_state = uiconst.UI_NORMAL
     20     default_autoPurgeHiddenEntries = True
     21     default_entry_spacing = 0
     22 
     23     def ApplyAttributes(self, attributes):
     24         self.blockCreationOfNewUpdateThread = False
     25         self.entry_spacing = attributes.get('entry_spacing', None)
     26         if self.entry_spacing is None:
     27             self.entry_spacing = self.default_entry_spacing
     28         self._pushContent = attributes.get('pushContent', self.default_pushContent)
     29         self._innerPadding = self._sanitize_inner_padding_value(attributes.get('innerPadding', self.default_innerPadding))
     30         Container.ApplyAttributes(self, attributes)
     31         self.sr.maincontainer = Container(parent=self, name='maincontainer', clipChildren=True)
     32         self.sr.clipper = Container(name='__clipper', align=uiconst.TOALL, parent=self.sr.maincontainer, padding=self._get_clipper_padding(), clipChildren=True)
     33         self.sr.clipper._OnSizeChange_NoBlock = self.OnClipperResize
     34         self.sr.content = Container(name='__content', align=uiconst.RELATIVE, parent=self.sr.clipper, state=uiconst.UI_NORMAL)
     35         self.loadingWheel = None
     36         self.Release()
     37         self.multiSelect = attributes.get('multiSelect', self.default_multiSelect)
     38         self.stickToBottom = attributes.get('stickToBottom', self.default_stickToBottom)
     39         self.autoPurgeHiddenEntries = attributes.get('autoPurgeHiddenEntries', self.default_autoPurgeHiddenEntries)
     40         self.sr.selfProxy = _weakref.proxy(self)
     41         self.Prepare_()
     42         self._mouseHoverCookie = uicore.uilib.RegisterForTriuiEvents(uiconst.UI_MOUSEHOVER, self.OnGlobalMouseHover)
     43 
     44     def Close(self, *args, **kwds):
     45         self.cleanupTimer = None
     46         return Scroll.Close(self, *args, **kwds)
     47 
     48     def Release(self):
     49         self._loading = 0
     50         self._position = 0
     51         self._totalHeight = 0
     52         self.scrollingRange = 0
     53         self.sr.nodes = []
     54         self.visibleNodes = []
     55         self.sr.hint = None
     56         self.updatePositionThread = None
     57         self.debug = 0
     58         self.scrolling = 0
     59         self.scalingcol = 0
     60         self.lastSelected = None
     61         self.lastCharReceivedAt = 0
     62         self.currChars = ''
     63         self.hideBackground = False
     64         self.destroyInvisibleEntries = False
     65         self.lazyLoadNodes = False
     66 
     67     @telemetry.ZONE_METHOD
     68     def ShowNodeIdx(self, idx, *args, **kwds):
     69         if self.scrollingRange:
     70             node = self.GetNode(idx)
     71             if not node:
     72                 return
     73             fromTop = node.positionFromTop
     74             if fromTop is None:
     75                 self.UpdateNodesWidthAndPosition()
     76                 fromTop = node.positionFromTop
     77             if self._position > fromTop:
     78                 portion = fromTop / float(self.scrollingRange)
     79                 self.ScrollToProportion(portion)
     80             else:
     81                 clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
     82                 if fromTop + node.height > self._position + clipperHeight:
     83                     portion = (fromTop - clipperHeight + node.height) / float(self.scrollingRange)
     84                     self.ScrollToProportion(portion)
     85 
     86     @telemetry.ZONE_METHOD
     87     def ChangeNodeIndex(self, newIndex, node):
     88         oldIndex = None
     89         if node in self.sr.nodes:
     90             oldIndex = self.sr.nodes.index(node)
     91             self.sr.nodes.remove(node)
     92         if newIndex == -1:
     93             newIndex = len(self.sr.nodes)
     94         self.sr.nodes.insert(newIndex, node)
     95         clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
     96         self.UpdateNodesWidthAndPosition(clipperWidth)
     97         self.UpdatePosition()
     98 
     99     @telemetry.ZONE_METHOD
    100     def UpdateNodesWidthAndPosition(self, clipperWidth = None, forceUpdate = False):
    101         if self.destroyed:
    102             return
    103         _, inner_pad_top, _, inner_pad_bottom = self._innerPadding
    104         updateWidth = clipperWidth is not None
    105         fromTopPosition = inner_pad_top
    106         for nodeIndex, node in enumerate(self.sr.nodes):
    107             if nodeIndex > 0:
    108                 fromTopPosition += self.entry_spacing
    109             if updateWidth and not node.fixedHeight and node._lastClipperWidth != clipperWidth:
    110                 node.height = node.dynamicHeightFunction(node, clipperWidth)
    111                 node._lastClipperWidth = clipperWidth
    112             elif forceUpdate and not node.fixedHeight:
    113                 node.height = node.dynamicHeightFunction(node, node._lastClipperWidth)
    114             if node.panel and node.panel.state != uiconst.UI_HIDDEN:
    115                 node.panel.top = fromTopPosition
    116                 if updateWidth:
    117                     node.panel.width = clipperWidth
    118                 node.panel.height = node.height
    119             node.positionFromTop = fromTopPosition
    120             node.idx = nodeIndex
    121             fromTopPosition += node.height
    122 
    123         fromTopPosition += inner_pad_bottom
    124         if updateWidth:
    125             self.sr.content.width = clipperWidth
    126         self.SetTotalHeight(fromTopPosition)
    127 
    128     def SetOrderedNodes(self, nodes, loadNodes = True):
    129         self.sr.nodes = nodes
    130         self.UpdateNodesWidthAndPosition()
    131         return self.UpdatePosition(loadNodes=loadNodes)
    132 
    133     def SetFilteredNodes(self, nodes, loadNodes = True):
    134         for visNode in self.visibleNodes:
    135             if visNode in nodes:
    136                 continue
    137             displayScrollEntry = visNode.panel
    138             if displayScrollEntry and not displayScrollEntry.destroyed:
    139                 displayScrollEntry.Close()
    140             visNode.panel = None
    141 
    142         self.sr.nodes = nodes
    143         self.UpdateNodesWidthAndPosition()
    144         return self.UpdatePosition(loadNodes=loadNodes)
    145 
    146     def ReloadNodes(self, nodes, updateHeight = False):
    147         if updateHeight:
    148             for node in nodes:
    149                 node._lastClipperWidth = None
    150 
    151         clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
    152         self.UpdateNodesWidthAndPosition(clipperWidth)
    153         for node in nodes:
    154             if node.panel:
    155                 node.panel.Load(node)
    156 
    157         self.UpdatePosition(fromWhere='ReloadNodes')
    158 
    159     @telemetry.ZONE_METHOD
    160     def AddNodes(self, fromIdx, nodesData, updateScroll = True, *args, **kwds):
    161         if fromIdx == -1:
    162             fromIdx = len(self.sr.nodes)
    163         clipperWidth = None
    164         idx = fromIdx
    165         for node in nodesData:
    166             if node in self.sr.nodes:
    167                 continue
    168             node.panel = None
    169             node.scroll = self.sr.selfProxy
    170             node.selected = node.get('isSelected', 0)
    171             fixedHeight = getattr(node.decoClass, 'ENTRYHEIGHT', None)
    172             if fixedHeight:
    173                 node.fixedHeight = fixedHeight
    174                 node.height = fixedHeight
    175             else:
    176                 dynamicHeightFunction = getattr(node.decoClass, 'GetDynamicHeight', None)
    177                 if dynamicHeightFunction:
    178                     if clipperWidth is None:
    179                         clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
    180                     node.dynamicHeightFunction = dynamicHeightFunction
    181                     node.height = dynamicHeightFunction(node, clipperWidth)
    182                     node._lastClipperWidth = clipperWidth
    183                 else:
    184                     raise RuntimeError('Fatal error in baseScroll, nodeclass has to have either ENTRYHEIGHT or GetDynamicHeight function')
    185             preLoadFunction = getattr(node.decoClass, 'PreLoad', None)
    186             if preLoadFunction:
    187                 preLoadFunction(node)
    188                 if self.destroyed:
    189                     return
    190             self.sr.nodes.insert(idx, node)
    191             idx += 1
    192 
    193         if updateScroll:
    194             if clipperWidth is None:
    195                 clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
    196             self.UpdateNodesWidthAndPosition(clipperWidth)
    197             self.UpdatePosition(fromWhere='AddNodes')
    198 
    199     @telemetry.ZONE_METHOD
    200     def RemoveNodes(self, nodes, updateScroll = True):
    201         for node in nodes:
    202             if node.panel:
    203                 node.panel.Close()
    204             if node in self.sr.nodes:
    205                 self.sr.nodes.remove(node)
    206 
    207         if updateScroll:
    208             clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
    209             self.UpdateNodesWidthAndPosition(clipperWidth)
    210             self.UpdatePosition(fromWhere='RemoveNodes')
    211 
    212     @telemetry.ZONE_METHOD
    213     def Clear(self):
    214         self.sr.nodes = []
    215         self.visibleNodes = []
    216         self.sr.content.Flush()
    217         self.SetTotalHeight(0)
    218         self.UpdatePosition(fromWhere='RemoveNodes')
    219 
    220     @telemetry.ZONE_METHOD
    221     def PurgeInvisibleEntries(self, *args):
    222         self.cleanupTimer = None
    223         purgeCount = 0
    224         if self.sr.nodes:
    225             for node in self.sr.nodes:
    226                 if not node.panel:
    227                     continue
    228                 if node.panel.state != uiconst.UI_HIDDEN:
    229                     continue
    230                 panel = node.panel
    231                 node.panel = None
    232                 panel.Close()
    233                 purgeCount += 1
    234 
    235     @telemetry.ZONE_METHOD
    236     def SetTotalHeight(self, newTotalHeight):
    237         self._totalHeight = max(0, newTotalHeight)
    238         atBottom = self._position and self._position == self.scrollingRange
    239         clipperWidth, clipperHeight = self.sr.clipper.GetCurrentAbsoluteSize()
    240         if not clipperWidth or not clipperHeight:
    241             clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
    242         self.scrollingRange = max(0, self._totalHeight - clipperHeight)
    243         if self.scrollingRange and self.scrollEnabled:
    244             self._scrollbar_vertical.display = True
    245         else:
    246             self._scrollbar_vertical.display = False
    247         if not self.scrollingRange or atBottom or self.stickToBottom:
    248             self._position = self.scrollingRange
    249         self._position = min(self._position, self.scrollingRange)
    250         self.sr.content.height = max(clipperHeight, self._totalHeight)
    251         self.sr.content.width = clipperWidth
    252 
    253     @telemetry.ZONE_METHOD
    254     def UpdatePositionThreaded(self, *args, **kwds):
    255         killThread = self.updatePositionThread
    256         if self.blockCreationOfNewUpdateThread:
    257             self.updatePositionThread = None
    258         else:
    259             self.updatePositionThread = uthread.new(self.UpdatePosition)
    260         if killThread:
    261             killThread.kill()
    262 
    263     @contextmanager
    264     def KillUpdateThreadAndBlock(self):
    265         self.blockCreationOfNewUpdateThread = True
    266         try:
    267             if self.updatePositionThread:
    268                 self.updatePositionThread.kill()
    269                 self.updatePositionThread = None
    270             yield
    271         finally:
    272             self.blockCreationOfNewUpdateThread = False
    273 
    274     @telemetry.ZONE_METHOD
    275     def UpdatePosition(self, fromWhere = None, loadNodes = True):
    276         if self.destroyed:
    277             return
    278         clipperWidth, clipperHeight = self.sr.clipper.GetAbsoluteSize()
    279         self.sr.content.top = int(-self._position)
    280         self.UpdateScrollHandle(clipperHeight, fromWhere='UpdatePosition')
    281         scrollPosition = self._position
    282         UI_HIDDEN = uiconst.UI_HIDDEN
    283         while self.visibleNodes:
    284             node = self.visibleNodes.pop()
    285             displayScrollEntry = node.panel
    286             if not displayScrollEntry:
    287                 continue
    288             if displayScrollEntry.state != UI_HIDDEN:
    289                 aboveVisible = node.positionFromTop + displayScrollEntry.height < scrollPosition
    290                 belowVisible = scrollPosition + clipperHeight < node.positionFromTop
    291                 if aboveVisible or belowVisible:
    292                     if getattr(displayScrollEntry, '__notifyevents__', None) is not None:
    293                         sm.UnregisterNotify(displayScrollEntry)
    294                     displayScrollEntry.state = UI_HIDDEN
    295 
    296         positionFromTop = 0
    297         for node in self.sr.nodes:
    298             nodeheight = node.height
    299             positionFromTop = node.positionFromTop or 0
    300             displayScrollEntry = node.panel
    301             if scrollPosition > positionFromTop + nodeheight:
    302                 continue
    303             belowVisible = scrollPosition + clipperHeight < positionFromTop
    304             if belowVisible:
    305                 break
    306             if not displayScrollEntry:
    307                 decoClass = node.decoClass
    308                 displayScrollEntry = decoClass(parent=self.sr.content, align=uiconst.TOPLEFT, pos=(0,
    309                  positionFromTop,
    310                  clipperWidth,
    311                  nodeheight), state=uiconst.UI_NORMAL, node=node)
    312                 displayScrollEntry.sr.node = node
    313                 node.panel = displayScrollEntry
    314                 node.scroll = self.sr.selfProxy
    315                 if hasattr(displayScrollEntry, 'Startup'):
    316                     displayScrollEntry.Startup(self.sr.selfProxy)
    317             elif displayScrollEntry.display:
    318                 self.visibleNodes.append(node)
    319                 displayScrollEntry.top = positionFromTop
    320                 displayScrollEntry.height = nodeheight
    321                 continue
    322             self.visibleNodes.append(node)
    323             displayScrollEntry.state = uiconst.UI_NORMAL
    324             displayScrollEntry.top = positionFromTop
    325             displayScrollEntry.width = clipperWidth
    326             displayScrollEntry.height = nodeheight
    327             if loadNodes:
    328                 displayScrollEntry.Load(node)
    329             if getattr(displayScrollEntry, '__notifyevents__', None) is not None:
    330                 sm.RegisterNotify(displayScrollEntry)
    331 
    332         self.updatePositionThread = None
    333         if self.autoPurgeHiddenEntries:
    334             self.cleanupTimer = AutoTimer(1500, self.PurgeInvisibleEntries)
    335 
    336     @telemetry.ZONE_METHOD
    337     def GetNode(self, idx, *args, **kwds):
    338         allNodes = self.sr.nodes
    339         if allNodes:
    340             if idx == -1:
    341                 return allNodes[-1]
    342             if len(allNodes) > idx:
    343                 return allNodes[idx]
    344 
    345     @telemetry.ZONE_METHOD
    346     def OnContentResize(self, clipperWidth, clipperHeight, *args, **kw):
    347         if self.sr.hint:
    348             newWidth = clipperWidth - self.sr.hint.left * 2
    349             if abs(newWidth - self.sr.hint.width) > 12:
    350                 self.sr.hint.width = newWidth
    351         if self.sr.content:
    352             self.UpdateNodesWidthAndPosition(clipperWidth)
    353             self.UpdatePositionThreaded(fromWhere='OnContentResize')
    354         if not self.destroyed:
    355             self.Resizing()
    356 
    357     def GetScrollRange(self):
    358         return self.scrollingRange
    359 
    360     def Prepare_(self, *args, **kwds):
    361         return Scroll.Prepare_(self, *args, **kwds)
    362 
    363     def Prepare_Underlay_(self, *args, **kwds):
    364         return Scroll.Prepare_Underlay_(self, *args, **kwds)
    365 
    366     def Prepare_ScrollControls_(self, *args, **kwds):
    367         return Scroll.Prepare_ScrollControls_(self, *args, **kwds)
    368 
    369     def RemoveActiveFrame(self, *args, **kwds):
    370         return Scroll.RemoveActiveFrame(self, *args, **kwds)
    371 
    372     def HideBackground(self, *args, **kwds):
    373         return Scroll.HideBackground(self, *args, **kwds)
    374 
    375     HideUnderLay = HideBackground
    376 
    377     def SetNoBackgroundFlag(self, *args, **kwds):
    378         return Scroll.SetNoBackgroundFlag(self, *args, **kwds)
    379 
    380     def OnSetFocus(self, *args, **kwds):
    381         return Scroll.OnSetFocus(self, *args, **kwds)
    382 
    383     def OnKillFocus(self, *args, **kwds):
    384         return Scroll.OnKillFocus(self, *args, **kwds)
    385 
    386     def GetNodes(self, *args, **kwds):
    387         return self.sr.nodes
    388 
    389     def SetSelected(self, *args, **kwds):
    390         return Scroll.SetSelected(self, *args, **kwds)
    391 
    392     def ActivateIdx(self, *args, **kwds):
    393         return Scroll.ActivateIdx(self, *args, **kwds)
    394 
    395     def _SelectNode(self, *args, **kwds):
    396         return Scroll._SelectNode(self, *args, **kwds)
    397 
    398     def _DeselectNode(self, *args, **kwds):
    399         return Scroll._DeselectNode(self, *args, **kwds)
    400 
    401     def SelectNodes(self, *args, **kwds):
    402         return Scroll.SelectNodes(self, *args, **kwds)
    403 
    404     def SelectNode(self, *args, **kwds):
    405         return Scroll.SelectNode(self, *args, **kwds)
    406 
    407     def ReportSelectionChange(self, *args, **kwds):
    408         return Scroll.ReportSelectionChange(self, *args, **kwds)
    409 
    410     def DeselectAll(self, *args, **kwds):
    411         return Scroll.DeselectAll(self, *args, **kwds)
    412 
    413     def SelectAll(self, *args, **kwds):
    414         return Scroll.SelectAll(self, *args, **kwds)
    415 
    416     def ToggleSelected(self, *args, **kwds):
    417         return Scroll.ToggleSelected(self, *args, **kwds)
    418 
    419     def UpdateSelection(self, *args, **kwds):
    420         return Scroll.UpdateSelection(self, *args, **kwds)
    421 
    422     def ClearSelection(self, *args, **kwds):
    423         return Scroll.ClearSelection(self, *args, **kwds)
    424 
    425     def GetSelectedNodes(self, *args, **kwds):
    426         return Scroll.GetSelectedNodes(self, *args, **kwds)
    427 
    428     def GetSelected(self, *args, **kwds):
    429         return Scroll.GetSelected(self, *args, **kwds)
    430 
    431     def GetContentContainer(self, *args, **kwds):
    432         return Scroll.GetContentContainer(self, *args, **kwds)
    433 
    434     def OnKeyDown(self, *args, **kwds):
    435         return Scroll.OnKeyDown(self, *args, **kwds)
    436 
    437     def OnClipperResize(self, *args, **kwds):
    438         return Scroll.OnClipperResize(self, *args, **kwds)
    439 
    440     def GetContentWidth(self, *args, **kwds):
    441         return Scroll.GetContentWidth(self, *args, **kwds)
    442 
    443     def GetContentHeight(self, *args, **kwds):
    444         return Scroll.GetContentHeight(self, *args, **kwds)
    445 
    446     GetTotalHeight = GetContentHeight
    447 
    448     def GetContentParentSize(self, *args, **kwds):
    449         return Scroll.GetContentParentSize(self, *args, **kwds)
    450 
    451     def UpdatePositionLoop(self, *args, **kwds):
    452         Scroll.UpdatePositionLoop(self, *args, **kwds)
    453 
    454     def UpdateScrollHandle(self, *args, **kwds):
    455         return Scroll.UpdateScrollHandle(self, *args, **kwds)
    456 
    457     def OnChar(self, *args, **kwds):
    458         return Scroll.OnChar(self, *args, **kwds)
    459 
    460     def _OnCharThread(self, *args, **kwds):
    461         return Scroll._OnCharThread(self, *args, **kwds)
    462 
    463     def BrowseNodes(self, *args, **kwds):
    464         return Scroll.BrowseNodes(self, *args, **kwds)
    465 
    466     BrowseEntries = BrowseNodes
    467 
    468     def OnUp(self, *args, **kwds):
    469         return Scroll.OnUp(self, *args, **kwds)
    470 
    471     def OnDown(self, *args, **kwds):
    472         return Scroll.OnDown(self, *args, **kwds)
    473 
    474     def OnHome(self, *args, **kwds):
    475         return Scroll.OnHome(self, *args, **kwds)
    476 
    477     def OnEnd(self, *args, **kwds):
    478         return Scroll.OnEnd(self, *args, **kwds)
    479 
    480     def OnMouseWheel(self, *args, **kwds):
    481         return Scroll.OnMouseWheel(self, *args, **kwds)
    482 
    483     def Scroll(self, *args, **kwds):
    484         return Scroll.Scroll(self, *args, **kwds)
    485 
    486     def GetScrollProportion(self, *args, **kwds):
    487         return Scroll.GetScrollProportion(self, *args, **kwds)
    488 
    489     def ScrollToProportion(self, *args, **kwds):
    490         return Scroll.ScrollToProportion(self, *args, **kwds)
    491 
    492     def GetMinSize(self, *args, **kwds):
    493         return Scroll.GetMinSize(self, *args, **kwds)
    494 
    495     def GetNoItemNode(self, *args, **kwds):
    496         return Scroll.GetNoItemNode(self, *args, **kwds)
    497 
    498     def ShowHint(self, *args, **kwds):
    499         return Scroll.ShowHint(self, *args, **kwds)
    500 
    501     def GetNodeHeight(self, *args, **kwds):
    502         log.LogWarn('BasicDynamicScroll GetNodeHeight NOTACTIVE')
    503 
    504     def CheckOverlaysAndUnderlays(self, *args, **kwds):
    505         log.LogWarn('BasicDynamicScroll CheckOverlaysAndUnderlays NOTACTIVE')
    506 
    507     def RemoveEntries(self, *args, **kwds):
    508         log.LogWarn('BasicDynamicScroll RemoveEntries NOTACTIVE')
    509 
    510     def AddEntries(self, *args, **kwds):
    511         log.LogWarn('BasicDynamicScroll AddEntries NOTACTIVE')
    512 
    513     def CollectSubNodes(self, *args, **kwds):
    514         log.LogWarn('BasicDynamicScroll CollectSubNodes NOTACTIVE')
    515 
    516     def DrawHeaders(self, *args, **kwds):
    517         log.LogWarn('BasicDynamicScroll DrawHeaders NOT ACTIVE')
    518 
    519     def OnColumnChanged(self, *args, **kwds):
    520         log.LogWarn('BasicDynamicScroll OnColumnChanged NOT ACTIVE')
    521 
    522     def OnNewHeaders(self, *args, **kwds):
    523         log.LogWarn('BasicDynamicScroll OnNewHeaders NOT ACTIVE')
    524 
    525     def GetSortBy(self, *args, **kwds):
    526         log.LogWarn('BasicDynamicScroll GetSortBy NOTACTIVE')
    527 
    528     def GetSortDirection(self, *args, **kwds):
    529         log.LogWarn('BasicDynamicScroll GetSortDirection NOTACTIVE')
    530 
    531     def GetSmartSortDirection(self, *args, **kwds):
    532         log.LogWarn('BasicDynamicScroll GetSmartSortDirection NOTACTIVE')
    533 
    534     def ToggleSmartSortDirection(self, *args, **kwds):
    535         log.LogWarn('BasicDynamicScroll ToggleSmartSortDirection NOTACTIVE')
    536 
    537     def GetSortValue(self, *args, **kwds):
    538         log.LogWarn('BasicDynamicScroll GetSortValue NOTACTIVE')
    539 
    540     def _GetSortValue(self, *args, **kwds):
    541         log.LogWarn('BasicDynamicScroll _GetSortValue NOTACTIVE')
    542 
    543     def GetColumns(self, *args, **kwds):
    544         log.LogWarn('BasicDynamicScroll GetColumns NOTACTIVE')
    545 
    546     def GetHeaderMenu(self, *args, **kwds):
    547         log.LogWarn('BasicDynamicScroll GetHeaderMenu NOTACTIVE')
    548 
    549     def GetShowColumnMenu(self, *args, **kwds):
    550         log.LogWarn('BasicDynamicScroll GetShowColumnMenu NOTACTIVE')
    551 
    552     def MakePrimary(self, *args, **kwds):
    553         log.LogWarn('BasicDynamicScroll MakePrimary NOTACTIVE')
    554 
    555     def GetPrimaryColumn(self, *args, **kwds):
    556         log.LogWarn('BasicDynamicScroll GetPrimaryColumn NOTACTIVE')
    557 
    558     def SetColumnsHiddenByDefault(self, columns, *args):
    559         log.LogWarn('BasicDynamicScroll SetColumnsHiddenByDefault NOTACTIVE')
    560 
    561     def HideColumn(self, *args, **kwds):
    562         log.LogWarn('BasicDynamicScroll HideColumn NOTACTIVE')
    563 
    564     def ShowColumn(self, *args, **kwds):
    565         log.LogWarn('BasicDynamicScroll ShowColumn NOTACTIVE')
    566 
    567     def HideTriangle(self, *args, **kwds):
    568         log.LogWarn('BasicDynamicScroll HideTriangle NOTACTIVE')
    569 
    570     def Sort(self, *args, **kwds):
    571         log.LogWarn('BasicDynamicScroll Sort NOTACTIVE')
    572 
    573     def SortAsRoot(self, *args, **kwds):
    574         log.LogWarn('BasicDynamicScroll SortAsRoot NOTACTIVE')
    575 
    576     def GetStringFromNode(self, *args, **kwds):
    577         log.LogWarn('BasicDynamicScroll GetStringFromNode NOTACTIVE')
    578 
    579     def RefreshSort(self, *args, **kwds):
    580         log.LogWarn('BasicDynamicScroll RefreshSort NOTACTIVE')
    581 
    582     def ChangeSortBy(self, *args, **kwds):
    583         log.LogWarn('BasicDynamicScroll ChangeSortBy NOTACTIVE')
    584 
    585     def ChangeColumnOrder(self, *args, **kwds):
    586         log.LogWarn('BasicDynamicScroll ChangeColumnOrder NOTACTIVE')
    587 
    588     def HiliteSorted(self, *args, **kwds):
    589         log.LogWarn('BasicDynamicScroll HiliteSorted NOTACTIVE')
    590 
    591     def LoadHeaders(self, *args, **kwds):
    592         log.LogWarn('BasicDynamicScroll LoadHeaders NOTACTIVE')
    593 
    594     def __LoadHeaders(self, *args, **kwds):
    595         log.LogWarn('BasicDynamicScroll __LoadHeaders NOTACTIVE')
    596 
    597     def ResetColumnWidths(self, *args, **kwds):
    598         log.LogWarn('BasicDynamicScroll ResetColumnWidths NOTACTIVE')
    599 
    600     def ResetColumnWidth(self, *args, **kwds):
    601         log.LogWarn('BasicDynamicScroll ResetColumnWidth NOTACTIVE')
    602 
    603     def ApplyTabstopsToNode(self, *args, **kwds):
    604         log.LogWarn('BasicDynamicScroll ApplyTabstopsToNode NOTACTIVE')
    605 
    606     def UpdateTabStops(self, *args, **kwds):
    607         log.LogWarn('BasicDynamicScroll UpdateTabStops NOTACTIVE')
    608 
    609     def AddNode(self, *args, **kwds):
    610         log.LogWarn('BasicDynamicScroll AddNode NOTACTIVE')
    611 
    612     def PrepareSubContent(self, *args, **kwds):
    613         log.LogWarn('BasicDynamicScroll PrepareSubContent NOTACTIVE')
    614 
    615     def SetNodes(self, *args, **kwds):
    616         log.LogWarn('BasicDynamicScroll SetNodes NOTACTIVE')
    617 
    618     def RefreshNodes(self, *args, **kwds):
    619         log.LogWarn('BasicDynamicScroll RefreshNodes NOTACTIVE')
    620 
    621     def LoadContent(self, *args, **kwds):
    622         log.LogWarn('BasicDynamicScroll LoadContent NOTACTIVE')
    623 
    624     def Load(self, *args, **kwds):
    625         log.LogWarn('BasicDynamicScroll Load NOTACTIVE')