VDBAbstractListApplication.st
author Jan Vrany <jan.vrany@labware.com>
Fri, 29 Jul 2022 16:12:54 +0100
changeset 266 e21d777d076e
parent 264 23960fcb9dac
permissions -rw-r--r--
Fix `VDBInstructionListApplication` to analyze blocks for standalone instruction list ...that is, for instructions without any "disassemblable" (function, address range). This is used in some inspector goodies on Compiler's code buffer.

"
jv:libgdbs - GNU Debugger Interface Library
Copyright (C) 2015-now Jan Vrany
Copyright (C) 2021-2022 LabWare

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the 'Software'), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"
"{ Package: 'jv:vdb' }"

"{ NameSpace: Smalltalk }"

VDBAbstractContentsApplication subclass:#VDBAbstractListApplication
	instanceVariableNames:'internalListHolder internalListView internalSelectionHolder
		internalMessageView internalMessageTimeoutID'
	classVariableNames:''
	poolDictionaries:''
	category:'VDB-UI-Abstract'
!

!VDBAbstractListApplication class methodsFor:'documentation'!

copyright
"
jv:libgdbs - GNU Debugger Interface Library
Copyright (C) 2015-now Jan Vrany
Copyright (C) 2021-2022 LabWare

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the 'Software'), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"
! !

!VDBAbstractListApplication class methodsFor:'interface specs'!

columnsSpec
    ^ #()

    "Created: / 02-06-2017 / 07:26:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

windowSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:VDBAbstractListApplication andSelector:#windowSpec
     VDBAbstractListApplication new openInterface:#windowSpec
     VDBAbstractListApplication open
    "

    <resource: #canvas>

    ^ 
    #(FullSpec
       name: windowSpec
       uuid: '0f7dc3f0-3c2f-11e8-93ae-0021ccd5e3d3'
       window: 
      (WindowSpec
         label: 'VDBAbstractListApplication'
         name: 'VDBAbstractListApplication'
         uuid: '0f7dc3f1-3c2f-11e8-93ae-0021ccd5e3d3'
         min: (Point 10 10)
         bounds: (Rectangle 0 0 300 300)
       )
       component: 
      (SpecCollection
         collection: (
          (SelectionInListModelViewSpec
             name: 'SelectionInListModelView1'
             layout: (LayoutFrame 0 0 0 0 0 1 0 1)
             uuid: '0f7dc3f2-3c2f-11e8-93ae-0021ccd5e3d3'
             model: internalSelectionHolder
             menu: contextMenu
             hasHorizontalScrollBar: true
             hasVerticalScrollBar: true
             listModel: internalListHolder
             useIndex: false
             highlightMode: line
             doubleClickSelector: doDoubleClick
             selectConditionSelector: internalCanSelect:
             postBuildCallback: postBuildInternalListView:
           )
          )
        
       )
     )

    "Modified: / 09-04-2018 / 20:52:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication class methodsFor:'menu specs'!

contextMenu
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:VDBAbstractListApplication andSelector:#contextMenu
     (Menu new fromLiteralArrayEncoding:(VDBAbstractListApplication contextMenu)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
          (MenuItem
            label: 'Appl Menu Slice'
            isVisible: true
            submenuChannel: contextMenuApplSlice
            isMenuSlice: true
          )
         (MenuItem
            label: 'Item Menu Slice'
            isVisible: true
            submenuChannel: contextMenuItemSlice
            isMenuSlice: true
          )
         (MenuItem
            label: 'Copy Menu Slice'
            isVisible: true
            submenuChannel: contextMenuCopySlice
            isMenuSlice: true
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            label: 'Inspect Menu Slice'
            isVisible: true
            submenuChannel: contextMenuInspectSlice
            isMenuSlice: true
          )
         )
        nil
        nil
      )

    "Modified: / 01-09-2018 / 14:36:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

contextMenuApplSlice
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:VDBAbstractListApplication andSelector:#contextMenuSlice
     (Menu new fromLiteralArrayEncoding:(VDBAbstractListApplication contextMenuSlice)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        nil nil
        nil
      )

    "Created: / 01-09-2018 / 14:36:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

contextMenuCopySlice
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:VDBAbstractListApplication andSelector:#contextMenuCopySlice
     (Menu new fromLiteralArrayEncoding:(VDBAbstractListApplication contextMenuCopySlice)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            label: 'Copy Contents To Clipboard'
            itemValue: doCopyContents
            isVisible: true
          )
         (MenuItem
            enabled: hasSelection
            label: 'Copy Selection To Clipboard'
            itemValue: doCopySelection
            isVisible: true
          )
         )
        nil
        nil
      )
!

contextMenuInspectSlice
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:VDBAbstractListApplication andSelector:#contextMenuInspectSlice
     (Menu new fromLiteralArrayEncoding:(VDBAbstractListApplication contextMenuInspectSlice)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            enabled: hasSelection
            label: 'Inspect Model'
            itemValue: doInspectModel
            isVisible: true
          )
         (MenuItem
            label: 'Inspect Presenter'
            itemValue: doInspectPresenter
            isVisible: true
          )
         (MenuItem
            label: 'Inspect Application'
            itemValue: doInspectApplication
            isVisible: true
          )
         (MenuItem
            label: '-'
            isVisible: true
          )
         (MenuItem
            label: 'Update'
            itemValue: duUpdateList
            isVisible: true
          )
         )
        nil
        nil
      )
! !

!VDBAbstractListApplication class methodsFor:'plugIn spec'!

aspectSelectors
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this. If it is corrupted,
     the UIPainter may not be able to read the specification."

    "Return a description of exported aspects;
     these can be connected to aspects of an embedding application
     (if this app is embedded in a subCanvas)."

    ^ #(
        #debuggerHolder
      ).

! !

!VDBAbstractListApplication class methodsFor:'queries'!

isAbstract
    "Return if this class is an abstract class.
     True is returned here for myself only; false for subclasses.
     Abstract subclasses must redefine again."

    ^ self == VDBAbstractListApplication.
! !

!VDBAbstractListApplication methodsFor:'aspects'!

backgroundColorFor: aVDBPresenter
    "Returns an backgdound color for for given presenter.               
     If `nil` returned, a default is used"

    ^ nil

    "Created: / 01-02-2018 / 09:06:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (comment): / 26-06-2018 / 13:02:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

foregroundColorFor: aVDBPresenter
    "Returns an foreground (text) color for given presenter.
     If `nil` returned, a default is used"

    ^ nil

    "Created: / 26-06-2018 / 13:02:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'aspects-private'!

internalListHolder
    "return/create the 'listHolder' value holder (automatically generated)"

    internalListHolder isNil ifTrue:[
        internalListHolder := ValueHolder new.
    ].
    ^ internalListHolder

    "Created: / 27-02-2015 / 15:55:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

internalSelectionHolder
    "return/create the 'internalSelectionHolder' value holder (automatically generated)"

    internalSelectionHolder isNil ifTrue:[
        internalSelectionHolder := ValueHolder new.
        internalSelectionHolder addDependent:self.
    ].
    ^ internalSelectionHolder
! !

!VDBAbstractListApplication methodsFor:'change & update'!

enqueueDelayedInvalidateInternalList
    internalListView notNil ifTrue:[
        self enqueueMessage: #delayedInvalidateInternalList
    ]

    "Created: / 06-02-2018 / 12:43:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 18-02-2019 / 10:23:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

enqueueDelayedUpdateInternalList
   self enqueueMessage: #delayedUpdateInternalListInternal

    "Created: / 20-09-2014 / 23:05:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2018 / 06:51:55 / jv"
    "Modified: / 14-02-2019 / 16:44:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 18-02-2019 / 10:23:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

enqueueDelayedUpdateSelection
    self enqueueMessage: #delayedUpdateSelection

    "Created: / 27-02-2015 / 15:35:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2018 / 06:52:09 / jv"
    "Modified: / 18-02-2019 / 10:23:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

update:aspect with:param from:sender
    "Invoked when an object that I depend upon sends a change notification."
    sender == internalSelectionHolder ifTrue:[ 
        self enqueueDelayedUpdateSelection.
        ^ self
    ].

    super update:aspect with:param from:sender

    "Created: / 27-02-2015 / 15:44:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'change & update-delayed'!

delayedInvalidateInternalList
    | scrolledView |

    "/ Since this is an delayed update, we should check whether
    "/ the update still makes sense  The window may be already 
    "/ closed or (worse) in the middle of closing. Sigh.
    internalListView notNil ifTrue:[
        scrolledView := internalListView scrolledView.
        (scrolledView notNil and:[ scrolledView isVisible ]) ifTrue:[
            scrolledView invalidateRepairNow: true
        ]
    ].

    "Created: / 06-02-2018 / 12:43:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 03-10-2018 / 15:25:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

delayedUpdateContents
    self enqueueDelayedUpdateInternalList

    "Created: / 14-02-2019 / 16:29:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

delayedUpdateContentsInternal
    "/ For internal use, do not override!!"
    contentsValid := false.
    windowVisible ifTrue:[ 
        self showMessage: (resources string: 'Updating...') after: 500.
        self delayedUpdateContents.
    ].

    "Created: / 14-02-2019 / 16:43:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-06-2019 / 14:09:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 12-03-2021 / 17:46:19 / Jan Vrany <jan.vrany@labware.com>"
!

delayedUpdateInternalList
    "raise an error: must be redefined in concrete subclass(es)"

    ^ self subclassResponsibility
!

delayedUpdateInternalListInternal
    self delayedUpdateInternalList.
    self hideMessage.
    contentsValid := true.

    "Created: / 14-02-2019 / 16:44:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-06-2019 / 14:09:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

delayedUpdateSelection
    "raise an error: must be redefined in concrete subclass(es)"

    ^ self subclassResponsibility
! !

!VDBAbstractListApplication methodsFor:'help'!

activeHelpViewFor:text onDevice:aDevice
    | view |

    view := super activeHelpViewFor:text onDevice:aDevice.
    view font: self textFont.
    view subViews do:[:each | each font: self textFont ].
    view resizeToFit.
    ^ view

    "Created: / 01-09-2018 / 12:15:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'help texts'!

flyByHelpTextFor:aView at: aPoint
    | line item |

    line := internalListView yVisibleToLineNr: aPoint y.
    line notNil ifTrue:[ 
        item := internalListView list at: line ifAbsent:[ nil ].
        item notNil ifTrue:[
            | tooltip |

            tooltip := item tooltip.
            tooltip notNil ifTrue:[ ^ tooltip ]
        ].
    ].

    ^ super flyByHelpTextFor:aView

    "Created: / 29-07-2018 / 21:30:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'hooks'!

commonPostOpen
    "a common hook for postOpenWith:, postOpenAsSubcanvasWith: and postOpenAsDialogWith:."

    super commonPostOpen.
    self enqueueDelayedUpdateContents

    "Created: / 18-09-2014 / 00:29:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 22-02-2019 / 12:57:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

postBuildInternalListView: aView
    <resource: #uiCallback>

    | columns |

    internalListView := aView.
    internalListView font: self textFont.

    columns := self class columnsSpec.
    columns notEmptyOrNil ifTrue:[
        | renderer |

        renderer := aView setupTableRenderer.
        renderer columnDescriptors: columns.
        renderer columnDescriptors do:[:c|
            c dataSetColumnSpec foregroundSelector isNil ifTrue:[ 
                c dataSetColumnSpec foregroundSelector: #foregroundColor
            ].
        ].


    ].

    "Modified: / 20-08-2018 / 10:17:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'initialization'!

initializeMessageView
    | internalListViewParent internalListViewLayout |

    self assert: internalListView notNil.

    internalListViewLayout := internalListView layout copy.
    internalListViewParent := internalListView superView.
    internalListViewParent isScrollWrapper ifTrue:[ 
        internalListViewLayout := internalListViewParent layout copy.
        internalListViewParent := internalListView superView.
    ].
    internalMessageView := Label in: internalListViewParent.
    internalMessageView hiddenOnRealize: true.
    internalMessageView layout: internalListViewLayout.
    internalMessageView sizeFixed:true.   
    internalMessageView viewBackground: internalListView scrolledView viewBackground.
    internalMessageView font: internalListView scrolledView font.
    internalMessageView layout: internalListViewLayout.

    "Created: / 08-06-2019 / 09:53:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-08-2021 / 00:52:45 / Jan Vrany <jan.vrany@labware.com>"
! !

!VDBAbstractListApplication methodsFor:'menu'!

contextMenu
    ^ [
        (Menu decodeFromLiteralArray: self class contextMenu)
            receiver:self;
            findGuiResourcesIn:self;
            yourself
    ]

    "Created: / 16-01-2018 / 14:29:05 / jv"
    "Modified: / 16-01-2018 / 22:02:37 / jv"
    "Modified (comment): / 16-01-2018 / 23:26:46 / jv"
!

contextMenuItemSlice
    | item menu |

    item := self internalSelectionHolder value.
    item isNil ifTrue:[ 
        menu := Menu new.
    ] ifFalse:[ 
        menu := item contextMenu.
    ].
    ^ menu.

    "Created: / 16-01-2018 / 13:37:08 / jv"
    "Modified: / 16-01-2018 / 22:03:45 / jv"
! !

!VDBAbstractListApplication methodsFor:'menu actions'!

doCopy:aString 
    self window setClipboardText:aString

    "Created: / 15-06-2018 / 11:32:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doCopyContents
    | contents |

    contents := String streamContents:[:s | self printItemsFrom: 1 to: self internalList size on:s. ].
    self doCopy:contents.

    "Modified: / 10-08-2018 / 12:52:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doCopySelection
    | index contents |

    index := self internalList indexOf: self internalSelection.
    contents := String streamContents:[:s | self printItemsFrom: index to: index on:s. ].
    self doCopy:contents.

    "Modified: / 10-08-2018 / 12:54:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doDoubleClick
    "Invoked when user double-clicks to list item."

    | selectedVarObjPresenter |
    
    selectedVarObjPresenter := self internalSelectionHolder value. 
    selectedVarObjPresenter notNil ifTrue:[
        selectedVarObjPresenter doDoubleClick
    ].

    "Created: / 13-06-2017 / 17:09:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-01-2018 / 23:33:12 / jv"
    "Modified: / 05-02-2018 / 13:02:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doInspect: anObject
    | wnd |
    wnd := window.
    wnd notNil ifTrue:[
        wnd := wnd topView.
        (wnd application isKindOf:Tools::Inspector2) ifTrue:[
            wnd application inspect:anObject.
            ^ self.
        ].
    ].
    anObject inspect

    "Created: / 17-11-2021 / 13:08:23 / Jan Vrany <jan.vrany@labware.com>"
!

doInspectModel
    | selection |

    selection := self internalSelectionHolder value.
    selection notEmptyOrNil ifTrue:[ 
        self doInspect: selection subject
    ].

    "Modified: / 05-02-2018 / 13:07:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-11-2021 / 13:08:52 / Jan Vrany <jan.vrany@labware.com>"
!

doInspectPresenter
    self doInspect: self internalSelectionHolder value

    "Modified: / 22-09-2014 / 01:17:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-11-2021 / 13:09:07 / Jan Vrany <jan.vrany@labware.com>"
!

duUpdateList
    <resource: #uiCallback>

    self enqueueDelayedUpdateContents

    "Modified: / 14-02-2019 / 16:28:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'private'!

internalCanSelect: index
    | item |

    item := internalListHolder value at: index ifAbsent:[ ^ false ].
    ^self canSelect: item

    "Created: / 09-04-2018 / 20:52:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-10-2018 / 10:22:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

internalList
    ^ self internalListHolder value

    "Created: / 10-08-2018 / 12:51:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

internalSelection
    ^ self internalSelectionHolder value

    "Created: / 10-08-2018 / 12:54:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printItemsFrom: first to: last on:aStream  
    | list columns |

    list := self internalList.
    (internalListView listRenderer isKindOf:ListModelView::TableRenderer) ifTrue:[
        columns := internalListView listRenderer columnDescriptors.
    ] ifFalse:[
        columns := #().
    ].
    first to: last do:[:rownr |
        | item |

        item := list at: rownr.
        item isHierarchicalItem ifTrue:[
            aStream next:item level * 2 put:Character space.
            aStream nextPutAll:item label asString.
        ] ifFalse:[
            aStream nextPutAll:item asString.
        ].
        columns do:[:column | 
            | value |

            value := column 
                    extractColumnFrom:item
                    rowNr:rownr
                    on:internalListView.
            value notNil ifTrue:[
                aStream tab.
                aStream nextPutAll:value displayString.
            ].
        ].
        aStream cr.
    ].

    "Created: / 10-08-2018 / 12:50:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'queries'!

canSelect: anItem
    ^ true

    "Modified: / 09-04-2018 / 20:50:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

hasSelection
    ^ self internalSelectionHolder value notEmptyOrNil

    "Modified: / 22-09-2014 / 01:13:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'scrolling'!

scrollToListItem: presenter
    | index |

    internalListView isNil ifTrue:[ ^ self ].
    index := (internalListHolder value ? #()) indexOf: presenter.
    index ~~ 0 ifTrue:[ 
        internalListView scrolledView scrollToLine: index.
    ].

    "Created: / 07-08-2018 / 13:35:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication methodsFor:'utilities'!

hideMessage
    "Hide any message previously shown by #showMessage:"

    | timeoutId |

    internalMessageView notNil ifTrue:[
        internalMessageView beInvisible.
        internalMessageTimeoutID notNil ifTrue:[
            timeoutId := internalMessageTimeoutID.
            Processor removeTimeoutWithID:  timeoutId.
            internalMessageTimeoutID := nil.
        ].
    ]

    "Created: / 08-06-2019 / 10:09:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-06-2019 / 14:07:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showMessage: message
    "Show given `message` instead of list contents. To hide
     the message and show the list again, call #hideMessage.
     The caller is responsible for localizing `message` text."

     self showMessage: message after: 0

    "Created: / 08-06-2019 / 10:07:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-06-2019 / 11:12:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showMessage: text after: milliseconds
    "Show given `message` instead of list contents. 

     If `milliseconds` is non zero, the message is shown after
     given time. and if NO OTHER call to #showMessage:after or
     #hideMessage is made meanwhile.

     If `milliseconds` is zero, `message` is shown immediately.
    "
    | timeoutId |

    internalMessageView isNil ifTrue:[
        self initializeMessageView.
    ].
    internalMessageTimeoutID notNil ifTrue:[ 
        timeoutId := internalMessageTimeoutID.
        Processor removeTimeoutWithID: timeoutId.
        internalMessageTimeoutID := nil.
    ].

    internalMessageView label: text.

    milliseconds == 0 ifTrue:[ 
        internalMessageView beVisible.
    ] ifFalse:[ 
        internalMessageTimeoutID := 
            Processor 
                addTimedBlock: [ 
                    internalMessageTimeoutID := nil.
                    internalMessageView beVisible.
                ] afterMilliseconds: milliseconds
    ].

    "Created: / 09-06-2019 / 11:00:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-06-2019 / 14:08:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBAbstractListApplication class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !