WorkspaceCompletionSupport.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 29 Sep 2013 18:55:50 +0100
branchtext-view-selection-refactoring
changeset 4852 04fe7fca9320
parent 4802 a25143f6e512
child 4853 451f3b5f90bc
permissions -rw-r--r--
Merged 6cebb40eb268 and 87d60a4b098b (branch default - CVS HEAD)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4789
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'stx:libwidg' }"
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
EditTextViewCompletionSupport subclass:#WorkspaceCompletionSupport
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
	instanceVariableNames:''
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
	classVariableNames:''
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	poolDictionaries:''
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	category:'Interface-Smalltalk'
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!WorkspaceCompletionSupport class methodsFor:'documentation'!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
documentation
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
"
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
    A completion support using DWIM to complete code for Smalltalk (and JavaScript)
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    [author:]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
        Claus Gittinger
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
    [instance variables:]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
    [class variables:]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
    [see also:]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
        DoWhatIMeanSupport
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
"
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
! !
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
!WorkspaceCompletionSupport methodsFor:'private'!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
computeCompletions
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
    |suggestions implementations actions anyFound contextOrNil|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    "/ a hack
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
    (editView topView isKindOf: DebugView) ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
        contextOrNil := editView topView selectedContext.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
    UserInformation ignoreIn:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
        anyFound := false.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
        DoWhatIMeanSupport 
4802
a25143f6e512 Added codeAspect to EditTextView to signify what's being edited.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4789
diff changeset
    43
            codeCompletionFor: editView codeAspect
a25143f6e512 Added codeAspect to EditTextView to signify what's being edited.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4789
diff changeset
    44
            language: editView editedLanguage
4789
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
            method:editView editedMethod
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
            orClass:editView editedClass 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
            context:contextOrNil 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
            codeView:editView 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
            into:[:listOfSuggestions :listOfActions :titleWhenAsking |
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
"/ (listOfSuggestions contains:[:l | l isEmptyOrNil]) ifTrue:[self halt].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
                    suggestions := listOfSuggestions collect:[:entry | entry isArray ifTrue:[entry first] ifFalse:[entry]].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
                    implementations := listOfSuggestions collect:[:entry | entry isArray ifTrue:[entry second] ifFalse:[nil]].                            
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
                    actions := listOfActions.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
                    anyFound := true.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
                    nil "/ must return nil to avoid DWIM to do it itself (for now)
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
            ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
    "/ anyFound ifFalse:[self halt].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
    "/ Transcript show:'suggestions: '; showCR:suggestions.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
    "/ Transcript show:'actions: '; showCR:actions.  
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
    editView sensor
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
        pushUserEvent:#'suggestionsArrived:implementations:actions:autoSelect:'
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
        for:self
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
        withArguments:{suggestions . implementations . actions . autoSelect }
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
    "Created: / 26-09-2013 / 17:44:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
suggestionsArrived:suggestionsArg implementations:implementationsArg actions:actionsArg autoSelect:autoSelectArg
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
    "the background process has generated some suggestions"
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
    |v suggestions implementations actions suggestionOffset keyAndSnippet indexOfSnippet|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    (editView sensor hasKeyPressEventFor:nil) ifTrue:[ 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
        self closeCompletionView. 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
        ^ self
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
    implementations := implementationsArg.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
    actions := actionsArg.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
    suggestions := suggestionsArg ? #().
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
    suggestions size > 20 ifTrue:[ 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
        suggestions := suggestions copyTo:20.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
        implementations := implementations copyTo:20.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
        actions isArray ifTrue:[ actions := actions copyTo:20 ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
    "/ append snipplet, if any (can be easily reached via CRSR-up)
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
    suggestionOffset := 0.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
    indexOfSnippet := nil.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
    (keyAndSnippet := editView findAbbreviationKeyBeforeCursor) notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
        |abbrev sniplet i line|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
        abbrev := keyAndSnippet first.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
        sniplet := keyAndSnippet second.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
        "/ if the abbreviation is simply at the end of a longer word, ignore the abbrev.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
        line := editView lineStringBeforeCursor.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
        i := line findLast:[:ch | ch isLetterOrDigit not].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
        (i < (line size - abbrev size - 1)) ifFalse:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
            sniplet := sniplet copyWithout:$!!.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
            "/ true, false and self are often found in both lists
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
            (suggestions includes:sniplet) ifFalse:[   
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
                suggestions isEmpty ifFalse:[ suggestions := suggestions copyWith: '-' ]. 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
                suggestions := suggestions copyWith: ( '%1 %2'
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
                                        bindWith:(sniplet asStringCollection first "contractTo:25")
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
                                        with: ( ('("',abbrev,'" snippet)') colorizeAllWith:Color grey)).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
                indexOfSnippet := suggestions size.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
                "/ change below, when reversing the order in above code
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
                "/ suggestionOffset := 2.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
            ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
        ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
    suggestions isEmptyOrNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
        self closeCompletionView.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
        ^ self
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
    (v := completionView) isNil ifTrue: [
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
        ^ self
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
    v sensor
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
        pushUserEvent:#value
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
        for:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
            |top idx preselectIdx performCompletion|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
            (v == completionView) ifTrue: [
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
                top := v topView.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
                LastCompletions notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
                    "/ one of the last completions in list?
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
                    idx := LastCompletions findFirst:[:compl | suggestions includes:compl].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
                    idx ~~ 0 ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
                        preselectIdx := suggestions indexOf:(LastCompletions at:idx).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
                    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
                ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
                autoSelectArg ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
                    (preselectIdx isNil and:[suggestions size == 1]) ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
                        preselectIdx := 1.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
                    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
                ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
                preselectIdx notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
                    |pref|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
                    pref := suggestions at:preselectIdx.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
                    "/ for now, do not move to front (action needs the index)
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
                    suggestions at:preselectIdx put:(pref allBold).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
"/                    suggestions removeAtIndex:preselectIdx.                    
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
"/                    suggestions addFirst:(pref allBold).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
"/                    implementations notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
"/                        implementations removeAtIndex:preselectIdx.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
"/                        implementations addFirst:implementations.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
"/                    ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
                ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
                performCompletion :=
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
                    [:selectedListIndex | 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
                        |indexInSuggestions|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
                        self closeCompletionView.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
                        indexInSuggestions := selectedListIndex - suggestionOffset.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
                        (selectedListIndex == indexOfSnippet) ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
                            "/ replace the sniplet
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
                            editView sensor pushUserEvent:#expandAbbreviation for:editView
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
                        ] ifFalse:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
                            LastCompletions isNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
                                LastCompletions := OrderedCollection new.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   171
                            ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
                            LastCompletions add:(suggestions at:indexInSuggestions).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
                            LastCompletions size > 200 ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
                                LastCompletions removeLast
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
                            ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
                            actions notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
                                actions isBlock ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   179
                                    actions value:indexInSuggestions
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   180
                                ] ifFalse:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   181
                                    (actions at:indexInSuggestions) value
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
                                ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   183
                            ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
                        ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
                        "/ disabled - user has made his choice; so don't show more suggestions
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
                        "/ editView sensor pushUserEvent:#updateCompletionList for:self
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
                    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
                ((suggestions size == 1) and:[preselectIdx == 1]) ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
                    "/ do it, right here and now
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   191
                    performCompletion value:preselectIdx.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
                ] ifFalse:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
                    top open.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
                    v list:suggestions 
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
                            expandTabs:false scanForNonStrings:false
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
                            includesNonStrings:false redraw:true.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   198
                    implementations notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
                        implementations keysAndValuesDo:[:idx :impls |
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
                            |implsMenu|
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
                            impls notEmptyOrNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
                                implsMenu := Menu new.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
                                impls do:[:each |
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
                                    implsMenu addItem:(MenuItem new label:each name).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   206
                                ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   207
                                v subMenuAt:idx put:implsMenu
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
                            ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
                        ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   210
                    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
                    v enable:true.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
                    preselectIdx notNil ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   214
                        "/ very disturbing!!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
                        v selection:preselectIdx.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
                    ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   217
                    v extent:completionView preferredExtentForContents.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   218
                    v action:performCompletion.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   219
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
                    (top ~~ v) ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   221
                        top resizeToFit.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   222
                        top bottom > v device usableHeight ifTrue:[
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
                            top origin:((top origin x) @ (v device usableHeight - v height)).
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
                        ].
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
                        top raise.
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
                    ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
                ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   228
            ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   229
        ]
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   230
! !
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
!WorkspaceCompletionSupport class methodsFor:'documentation'!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
version
4852
04fe7fca9320 Merged 6cebb40eb268 and 87d60a4b098b (branch default - CVS HEAD)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4802
diff changeset
   235
    ^ '$Header: /cvs/stx/stx/libwidg/WorkspaceCompletionSupport.st,v 1.2 2013/09/27 09:26:43 vrany Exp $'
4789
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   236
!
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
version_CVS
4852
04fe7fca9320 Merged 6cebb40eb268 and 87d60a4b098b (branch default - CVS HEAD)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4802
diff changeset
   239
    ^ '$Header: /cvs/stx/stx/libwidg/WorkspaceCompletionSupport.st,v 1.2 2013/09/27 09:26:43 vrany Exp $'
4789
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
! !
8bc0605911b2 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241