[comp.lang.smalltalk] A Double-Click ListPane for ST V

MUHRTH@tubvm.cs.tu-berlin.de (Thomas Muhr) (08/06/90)

The following implements a subclass of ListPane to differentiate between
a first and a second click on an item. Useful in complex interactive
applications.
To file it in without modifications, you should have Max Ott's Category
Browser or a copy of the 'methods'-method in Behavior named:
methodsInCategory: aCat
"****************************
 *   1 Aug 1990  15:15:03
 *
 *   Project: DoubleClickList
 *

    Smalltalk at: #FileInDir put: Disk.
    (Disk file: 'DblClckL.cls') fileIn; close.
    Smalltalk removeKey: #FileInDir

"!

ListPane subclass: #LiListPane
  instanceVariableNames: '
    changeSelectorAt2ndClick
    lastAction'
  classVariableNames: ''
  poolDictionaries: '' !

!LiListPane class methodsInCategory: 'Doc'!

classInfo
  "Autor: Th. Muhr, Datum: 16 Jun 1990
   Kommentar: "

^'
LiListPanes differentiates between first and second click on a list item.
First click activates what was made available via the changeSelector-block.
Second click on the already inversed item activates the
changeSelectorAt2ndClick-block.If specification of 2nd process via
changeAt2ndClick
is omitted the pane behaves like a normal ListPane.
Example: (this is not a working example, but shows the use within an
open-method)

    fragPane:= (LiListPane new
        model: self;
        menu: #fragMenu;
        name: #fragArray;
        change: #showTextFragment:;
        changeAt2ndClick:#showReferences:;
        font: self listFont;
        framingRatio: zlfr).
'! !


!LiListPane methodsInCategory: 'etc'!

changeAt2ndClick: aBlock
  "Autor: Th. Muhr, Datum: 16 Jun 1990
   Kommentar: "
    changeSelectorAt2ndClick := aBlock!

selectAtCursor
  "Autor: Th. Muhr, Datum: 16 Jun 1990
   Kommentar:
"

    self findCurrentLine.
    self topPane textModified
        ifTrue: [^self].
    currentLine isNil
        ifTrue: [^self]
        ifFalse: [
            currentLine > list size
                ifTrue: [^self]].
    ((currentLine == selection)
            and: [(lastAction == #firstSelector)
            and: [changeSelectorAt2ndClick isNil not]]  )
         ifTrue:[lastAction:= #secondSelector.
                    model
                    perform: changeSelectorAt2ndClick
                    with: (returnIndex
                                ifTrue: [selection]
                                ifFalse: [list at: selection])]

        ifFalse: [lastAction:= #firstSelector.
            self hideSelection.
            self boldLine: currentLine.
            selection := currentLine.
            model
                perform: changeSelector
                with:
                    (returnIndex
                    ifTrue: [selection]
                    ifFalse: [list at: selection])]! !