Squak Smalltalk [6 * 9 = 42] whileTrue: [World run]
Stopařův průvodce jedním převážně neškodným programovacím jazykem
smalltalk
Swiki
  • Domů
  • Zpět
  • Tento server

    Squeak
  • Úvod
  • Smalltalk
  • Články
  • Knihy
  • Dokumentace
  • FAQ
  • Tutoriály
  • Download
  • Odkazy

    Komunita
  • CSSUG
  • Oznámení
  • Projekty
  • O nás
  • Fórum
  • Kontakt

     

  • Automatické doplňování identifikátorů

    Completion Morph

    Úvod

    Squeak v současné době disponuje pouze poměrně hodně omezenou funkcí na automatické doplňování identifikátorů pomocí klávesové zkratky Alt+q. Uživatel napíše část identifikátoru a pomocí opakovaného stisku této zkratky se postupně může dopracovat k identifikátoru, který zamýšlí.

    Toto řešení určitě není ideální systém používaný např. ve Visual Studiu by jistě uvítal nejeden programátor ve Squeaku.

    Existují pokusy, které se tento systém snaží rozšířit vyrolováním menu s možnými identifikátory, ale použitelnost není příliš vysoká. Viz např. http://minnow.cc.gatech.edu/squeak/3330.

    Cíl

    Rozšířit stávající editor Squeaku tak, aby se v průběhu psaní pod psaným textem automaticky vyrolovával seznam možných doplnění identifikátorů, pokud již jeho napsaná délka dosáhla určité hranice, např. 3.

    Do tohoto seznamu by mělo být možno přesunout se pomocí stisku klávesy dolů a klávesou enter správný konec identifikátoru vybrat. Funkčnost v MVC není nutná.

    Protože velká většina potřebných metod již je ve Squeku implementována, nemělo by se jednat o extrémně náročný úkol.

    Návrh řešení

    Jako nejideálnější místo pro zprávu doplňování se jeví metoda ParagraphEditor >> readKeyboard, kterou rozšíříme přidáním na její konec voláním vlastní metody completion

    self completion.

    Základ metod completion vypadá takto:

    ParagraphEditor >> completion
    
    	caret := startBlock stringIndex.
    	sym := self getPrecedingIdentifier; selection.
    	self selectAt: caret. 
    
    	sym size>=3 ifTrue: [
    		all := self symbolTables collect: [:each | each key 
    			-> (Symbol allSymbolStartingWith: sym in: each value)].
    
    		Transcript clear; show: all.
    
    		position := self morph owner fullBounds topLeft  
    			+ paragraph selectionRects first bottomLeft.
    
    		"position := ActiveHand position."
    
    		Display border: (position extent: 10@10) width: 2.
    	]

    Nejdříve získáme předchozí identifikátor a pokud je jeho velikost větší nebo rovna třem, vygenerujeme seznam možných identifikátorů do proměnné all a pro kontrolu vypíšeme do Transcriptu.

    Dále vypočítáme pozici, kam by měl být umisťován morph pro výběr. Zde je je potřeba tento výpočet doladit, protože sice např. u Workspace funguje, ale u MethodBrowseru, který má na začátku ještě podokno se seznamem metod, je tato pozice špatně posunutá. ParagrapEditor používá návrhový vzor Skladba (Composite).

    Ještě uvedu metodu getPrecedingIdentifier, která vznikla úpravou stávající metody selectPrecedingIdentifier.
    ParagraphEditor  >> getPrecedingIdentifier
    
    	| string sep stop tok |
    	tok _ false.
    	string _ paragraph text string.
    	stop _ stopBlock stringIndex - 1.
    	[stop > 0 and: [(string at: stop) isSeparator]] whileTrue: [stop _ stop - 1].
    	sep _ stop.
    	[sep > 0 and: [(string at: sep) tokenish]] whileTrue: [tok _ true. sep _ sep - 1].
    	tok ifTrue: [self selectInvisiblyFrom: sep + 1 to: stop]
    

    Bylo by vhodné, aby morph pro seznam množných identifikátorů byl jen jeden a definován na globální úrovni s tím, že by se skrýval, odkrýval a komunikoval s aktivním editorem. Kvůli multiuživatelským schopnostem Morphicu by mylo ale ještě vhodnější, aby tento morph byl přidán do ActiveHand.

    Na logice této funkce není moc co dalšího vymýšlet, zbývá jen vhodným způsobem vytvářet a spravovat morph pro vylistovávání alternativ.

    Pavel Křivánek

    Odkaz na tuto stránku

    • Projekty, poslední úprava dne 2 Červen 2005 v 12:30:24 uživatelem dotnet





    Administrátoři: Pavel Křivánek, Zbyněk Křivka