[Datagrid] How to manage the empty area outside the selectable lines?

Trevor DeVore lists at mangomultimedia.com
Mon Apr 26 14:09:16 EDT 2010

On Apr 24, 2010, at 6:31 PM, zryip theSlug wrote:

> What is my best alternative if I assume that I have seen nothing in
> the API to manage this empty area?

Hmm, it looks like a couple of additional properties would help here.  
You need to know if 1) you clicked on a row or 2) you clicked in the  
area where data is displayed.

I've added the following to the Data Grid in 4.5 :

the dgClickLine
the dgClickIndex
the dgClickedInDataView

To check if the user clicked in an empty area you would do the  
following in a data grid script:

if the dgClickedInDataView of me and the dgClickIndex of me is empty  
     ## clicked in empty area
end if

I'm including the relevant code to the end of this email if you want  
to add it to your own data grid script. Just edit the script of btn  
"Data Grid" of stack "revDataGridLibrary".

> About this, by testing this solution, I seen an odd behavior with
> inactive horizontal scrollbars. When you click on the scrollbar and
> have lines in the datagrid, you select the corresponding line. Is it
> totally normal?

No, not normal. I just tested this and noticed that rev does not  
report a scrollbar as the target of a mouseclick if the scrollbar  
thumb is not visible. I'm not sure why this is but it is what it  
is :-) I've added a workaround for this to the data grid code for 4.5.

Trevor DeVore
Blue Mango Learning Systems
ScreenSteps: http://www.screensteps.com
Releasable Revolution Resources for Developers: http://revolution.bluemangolearning.com


getprop dgClickLine
    put the dgClickIndex of me into theIndex
    if theIndex > 0 then return the dgLineOfIndex[theIndex] of me
    else return empty
end dgClickLine

getprop dgClickIndex
    ## figure out the index clicked on
    put empty into theIndex
    put _RowControlClickedOn() into theControl

    if theControl is not empty then
       put the dgIndex of theControl into theIndex
    end if
    return theIndex
end dgClickIndex

getprop dgClickedInDataView
    ## Note that Rev doesn't report scrollbars as mousecontrol if  
thumb is not
    ## showing. Hence the checks for visibility and click not within  
of vertical scrollbar
    ## (dglist overlaps with rect of vertical scrollbar)

    put the clickLoc into theClickLoc
    return theClickLoc is within the rect of group "dgListMask" of me \
           and (not the visible of scrollbar "dgScrollbar" of me \
           or (the visible of scrollbar "dgScrollbar" of me and  
theClickLoc is not within the rect of scrollbar "dgScrollbar" of me))
end dgClickedInDataView

private function _RowControlClickedOn
    local theControl

    ## figure out the index clicked on
    put the dgDataControl of the target into theControl

    ## Make sure user clicked in valid area.
    if theControl is empty and the dgClickedInDataView of me then
       ## Perhaps no column in clicked area or no mouse receiving  
controls in column
       put the clickV into theY
       repeat for each line thePotentialControl in  
          put the rect of thePotentialControl into theRect
          if theY >= item 2 of theRect and theY <= item 4 of theRect  
             put thePotentialControl into theControl
             exit repeat
          end if
       end repeat
    end if

    return theControl
end _RowControlClickedOn 

More information about the Use-livecode mailing list