VDBVariableObjectPresenter.st
author Jan Vrany <jan.vrany@labware.com>
Tue, 17 Nov 2020 22:02:29 +0000
changeset 206 c606b8fc373f
parent 188 7080f4698aec
child 240 c5450baf51cd
permissions -rw-r--r--
UX: reimplement variable "Inspect" in more generic way ...by asking default pretty-printer for preferred "contents" visualizer. If pretty-printer specifies one, this one is used to inspect the contents of given variable. Otherwise, the default visualizer is used. This logic is implemented mostly in Python by mean of (new) `vdb.contents_visualizer`.

"
jv:vdb - Visual / VM Debugger
Copyright (C) 2015-now Jan Vrany
Copyright (C) 2020 LabWare

This software is licensed under 'Creative Commons Attribution-NonCommercial 4.0 International License'

You may find a full license text in LICENSE.txt or at http://creativecommons.org/licenses/by-nc/4.0/
"
"{ Package: 'jv:vdb' }"

"{ NameSpace: Smalltalk }"

VDBAbstractPresenter subclass:#VDBVariableObjectPresenter
	instanceVariableNames:'varobj'
	classVariableNames:''
	poolDictionaries:''
	category:'VDB-Presentation'
!

!VDBVariableObjectPresenter class methodsFor:'documentation'!

copyright
"
jv:vdb - Visual / VM Debugger
Copyright (C) 2015-now Jan Vrany
Copyright (C) 2020 LabWare

This software is licensed under 'Creative Commons Attribution-NonCommercial 4.0 International License'

You may find a full license text in LICENSE.txt or at http://creativecommons.org/licenses/by-nc/4.0/
"
! !

!VDBVariableObjectPresenter 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:VDBVariableObjectPresenter andSelector:#contextMenu
     (Menu new fromLiteralArrayEncoding:(VDBVariableObjectPresenter contextMenu)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu (
         (MenuItem
            label: 'Inspect'
            itemValue: doInspect
            isVisible: true
         )
         (MenuItem
            label: '-'
            isVisible: true
         )
         (MenuItem
            label: 'Copy Value'
            itemValue: doCopyValue
            isVisible: true
         )
         (MenuItem
            label: 'Copy Expression'
            itemValue: doCopyPath
            isVisible: true
         )
       ) nil
        nil
     )
! !

!VDBVariableObjectPresenter methodsFor:'accessing'!

label
    ^ varobj expression
"/    ^ (varobj parent notNil or:[varobj parentIsDynamic])
"/        ifTrue:[ varobj expression ] 
"/        ifFalse:[ varobj path ]

    "Created: / 27-02-2015 / 15:57:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-07-2019 / 23:10:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

subject
    "Return an instance of GDB object that this presenter displays."

    ^ varobj

    "Modified: / 05-02-2018 / 13:08:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

tooltip
    ^ self valueString

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

value
    ^ varobj value

    "Created: / 02-06-2017 / 07:32:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2018 / 22:49:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

valueString
    ^ varobj value

    "Created: / 11-06-2017 / 23:25:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-09-2018 / 00:55:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

varobj
    ^ varobj varobj

    "Created: / 28-01-2018 / 22:45:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-09-2019 / 01:30:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBVariableObjectPresenter methodsFor:'initialization'!

setVarobj:aGDBVariable 
    varobj := aGDBVariable

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

!VDBVariableObjectPresenter methodsFor:'menu'!

contextMenuBAST:aMenu 
    "Adds a Smalltalk/X debugging menu items to the context menu."

    <menuextension: #contextMenu>

    ((varobj type startsWith:'BAST::OOP') 
        or:[ varobj type includesSubString:'BAST::VM' ]) 
            ifTrue:[
                aMenu 
                    addItem:((MenuItem 
                            label:(self class classResources string:'Inspect Object')
                            itemValue:#doInspectBeeObject) receiver:self).
                aMenu addSeparator.
            ].

    "Created: / 21-09-2019 / 01:33:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-11-2019 / 23:30:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 11-11-2019 / 13:44:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

contextMenuBee: aMenu
    "Adds a Smalltalk/X debugging menu items to the context menu."

    <menuextension: #contextMenu>

    (varobj type endsWith: 'Bee::oop_t *') ifTrue:[ 
        aMenu addItem: (
            (MenuItem label: (self class classResources string: 'Inspect Object')
                 itemValue: #doInspectBeeObject)
                 receiver: self
        ).
        aMenu addSeparator.
    ].

    "Created: / 08-07-2019 / 21:54:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

contextMenuStX: aMenu
    "Adds a Smalltalk/X debugging menu items to the context menu."

    <menuextension: #contextMenu>

    (varobj type endsWith: 'OBJ') ifTrue:[ 
        aMenu addItem: (
            (MenuItem label: (self class classResources string: 'Inspect Object')
                 itemValue: #doInspectStXObject)
                 receiver: self
        ).
        aMenu addSeparator.
    ].

    "Created: / 10-02-2018 / 23:06:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-07-2019 / 22:52:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBVariableObjectPresenter methodsFor:'menu actions'!

doCopyPath
    self doCopy: varobj path.

    "Created: / 05-02-2018 / 22:32:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doCopyValue
    self doCopy: varobj value.

    "Created: / 16-01-2018 / 23:28:56 / jv"
    "Modified: / 28-01-2018 / 22:55:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

doDoubleClick
    self doInspect.

    "Created: / 19-02-2018 / 16:10:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-09-2019 / 01:29:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-11-2020 / 21:53:06 / Jan Vrany <jan.vrany@labware.com>"
!

doInspect
    self doInspect: 'vdb.contents_visualizer'
!

doInspect:visualizerExpr 
    "
     Open an inspector of a copy of varobj. If `visualizerExpr`
     is not nil then the visualizer of a *copy* is set to
     `visualizerExpr`
"
    
    | dup  app  wnd |

    dup := varobj duplicate.
    dup == varobj ifTrue:[
        dup := VDBVariableObject 
                evaluate:varobj path
                in:varobj frame
                using:varobj debugger.
    ].
    visualizerExpr notNil ifTrue:[
        dup visualizer:visualizerExpr
    ].
     
    "/ If used in Inspector2, open child in the same inspector windpow.
    
    app := self application.
    app notNil ifTrue:[
        wnd := app window.
        wnd notNil ifTrue:[
            wnd := wnd topView.
            (wnd application isKindOf:Tools::Inspector2) ifTrue:[
                wnd application inspect:dup.
                ^ self.
            ].
        ].
    ].
     
    "/ ...otherwise open a new inspector...            
    
    dup inspect.

    "Created: / 08-07-2019 / 20:17:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBVariableObjectPresenter methodsFor:'private'!

fetchChildren
    ^ varobj children collect:[ :each | self class new setVarobj:each; parent:self;yourself ]

    "Created: / 28-01-2018 / 22:46:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBVariableObjectPresenter methodsFor:'protocol-queries'!

hasChildren
    ^ varobj hasChildren

    "Created: / 28-01-2018 / 22:49:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBVariableObjectPresenter methodsFor:'testing'!

isVariablePresenter
    ^ true

    "Created: / 02-06-2017 / 00:05:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBVariableObjectPresenter class methodsFor:'documentation'!

version_HG

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