Difference between revisions of "Extending the IDE/sk"

From Free Pascal wiki
Jump to navigationJump to search
Line 9: Line 9:
 
; Editory komponentov : Tieto sú použité pri dvojkliku na komponent v návrhu alebo pridaním niektorých ďalších položiek do kontextového menu návrhu, ktoré vyvoláte pravým kliknutím na komponentu.
 
; Editory komponentov : Tieto sú použité pri dvojkliku na komponent v návrhu alebo pridaním niektorých ďalších položiek do kontextového menu návrhu, ktoré vyvoláte pravým kliknutím na komponentu.
  
; Editory vlastností : Tieto sú použité riadkymi v Object Inspectore.
+
; Editory vlastností : Tieto sú použité riadkami v Inšpektorovi objektov (Object Inspector).
  
 
; Experti : Toto sú všetky ostatné typy.
 
; Experti : Toto sú všetky ostatné typy.

Revision as of 03:39, 2 April 2005

Rozširovanie IDE

Úvod

IDE podporuje niekoľko typov pluginov:

Komponenty
Sú to položky Palety komponentov. Napríklad TButton môžete použiť na vytváranie tlačidiel.
Editory komponentov
Tieto sú použité pri dvojkliku na komponent v návrhu alebo pridaním niektorých ďalších položiek do kontextového menu návrhu, ktoré vyvoláte pravým kliknutím na komponentu.
Editory vlastností
Tieto sú použité riadkami v Inšpektorovi objektov (Object Inspector).
Experti
Toto sú všetky ostatné typy.


Existujú dva spôsoby, ako pridať svoj vlastný plugin do IDE Lazarus:

  1. Napíšte balíček, nainštalujte ho a zaregistrujte svoj plugin v procedúre 'Register' jednotky.
  2. Rozšírte kód Lazarus a pošlite svoj CVS rozdiely do maillistu Lazarus.

Písanie komponentov

Vytvorte nový komponent pomocou Editora balíčkov.

Editory komponentov

Editory komponentov poskytované s Lazarus sú definované v jednotke componenteditors.pas. Editor komponentu je plugin použitý vývojárom na pridanie špeciálnych funkcií pre triedy komponentov.

Editor komponenty je vytvorený pre každý komponent, ktorý je vybratý v návrhu formulára a je založený na type komponentu (viz GetComponentEditor a RegisterComponentEditor). Pri dvojkliku na komponent je volaná metóda Edit. Pri vyvolaní kontextového menu komponentu, sú volané metódy GetVerbCount a GetVerb, ktoré vybudujú položky menu. Ak je niektorá položka vybratá, je volaná metóda ExecuteVerb. Metóda Paste je volaná vždy keď je komponent vložený do schránky.

Editor komponentu potrebujete vytvoriť len ak chcete pridať položku/y do kontextového menu, zmeniť predvolené správanie sa pri dvojkliku na komponent alebo pridať rozšírený formát schránky.

Predvolený editor komponentu (TDefaultEditor) implementuje metódu Edit na vyhľadávanie vlastností komponentu a generovanie (alebo navigádiu do) udalostí OnCreate, OnChanged alebo OnClick (ktorú nájde prvú). Vždy keď Editor komponentu modifikuje komponent, musí volať Designer.Modified na informovanie návrhára, že formulár bol modifikovaný. (Or else the user can not save the changes).

Všetky Editory komponentov sú odvodené od virtuálnej abstraktnej triedy TBaseComponentEditor.

Triedy Editorov komponentov

TDefaultComponentEditor
Editor, ktorý poskytuje predvolené správanie pre dvojkliknutie, ktoré opakovane prechádza vlastnosti, hľadajúc najvhodnejšiu metódu vlastnosti na editovanie.
TComponentEditor
Táto trieda poskytuje základnú implementáciu pre rozhranie IComponentEditor. Nie je podmienkou odvodiť váš Editor vlastností od tejto triedy. IDE vyžaduje len dediť od TBaseComponentEditor a implementovať IComponentEditor, táto trieda pomáha pri implementácii triedy, ktorá vyhovuje týmto podmienkam.
TNotebookComponentEditor
Predvolený editor komponentu pre TCustomNotebook.
TPageComponentEditor
Predvolený editor komponentu pre TCustomPage.
TStringGridComponentEditor
Predvolený editor komponentu pre TStringGrid.
TToolBarComponentEditor
Predvolený editor komponentu pre TToolBar.
TFileDialogComponentEditor
Predvolený editor komponentu pre TFileDialog.

Metódy k predefinovaniu

Na zmenu správania štandartného Editora vlastností môžete predefinovať tieto metódy:

Create(AComponent, ADesigner)
Konštruktor triedy je volaný na vytvorenie Editora komponentu. AComponent je komponent, ktorý má byť editovaný v editore. ADesigner je rozhranie pre nájdenie prvku a vytvorenie metód (často nie je použitý). Ak Editor komponentu akokoľvek modifikuje komponent, musí volať ADesigner.Modified.
Edit
Metóda je volaná pri dvojkliku na komponent. Editor komponenty môže vyvolať v tejto metóde napríkald vyvolať dialóg alebo nejaký typ návrhového experta. Ak je GetVerbCount väčší ako nula, Edit spustí obsluhu prvej položky (ExecuteVerb(0)).
ExecuteVerb(Index)
Je volaná vybratím položky kontextového menu, zvolená položka je udávaná pomocou Index. Jej správanie je určené Editorom komponentu.
GetVerb
Editor komponentu musí vrátiť reťazec, ktorý bude zobrazený v kontextovom menu. Editor komponentu je zodpovedný za vhodné umiestnenie znaku & a znakov '...'.
GetVerbCount
Počet platných indexov pre GetVerb a ExecuteVerb. Index začína nulou (tj. 0..GetVerbCount - 1).
PrepareItem
Pri vytváraní kontextového menu je pre každú položku volaná PrepareItem. Editor komponentu môže vhodne prispôsobovať položky menu, vrátane pridávania podpoložiek. Ak niektorú položku nechcete zobraziť, neuvoľňujte ju, jednoducho nastavte vlastnosť Visible na False.
Copy
Je volaná pri kopírovaní komponentu do schránky. Aj obrázok komponentu je vložený do schránky. Poskytuje možnosť Editoru komponentu vložiť iný typ formátu, ktorý je ignorovaný v Designer, ale môže byť podporovaný inou aplikáciou.
IsInInlined
Určuje či je komponent v Designer, ktorý ho vlastní. V podstate, komponenty nemôžu byť pridané do inštancie Frame (collections are fine though) tak táto funkcia určuje, či aktuálne vybratý komponent je nvútri inštancie Frame alebo nie.
GetComponent
Vracia editovaný komponent.
GetDesigner
Vracia aktuálny Designer formulára vlastniaceho komponent.

Registrácia Editora komponentu

Aby IDE vedelo, ktorý Editor komponentu má použiť, je nutné ho registrovať. Pre toto je v jednotke componenteditors.pas definovaný procedurálny typ:

type
  TRegisterComponentEditorProc 
    = procedure (ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
var
  RegisterComponentEditorProc: TRegisterComponentEditorProc;

a jedna procedúra a jedna funkcia:

 procedure RegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
 function GetComponentEditor(Component: TComponent; const Designer: TComponentEditorDesigner): TBaseComponentEditor;

Registráciu Editora komponentu urobíte jednoducho volaním funkcie RegisterComponentEditor, pričom do ComponentClass zadáte triedu komponentu a do ComponentEditor zadáte triedu Editora komponentu, napr.:

 RegisterComponentEditor(TCustomNotebook, TNotebookComponentEditor);

Čím je zaregistrovaný Editor kompentu TNotebookComponentEditor pre komponenty typu TCustomNotebook.

Editory vlastností

Editory vlastností sú používané v Object Inspectore, pre editáciu jednotlivých vlastností. Sú vlastne rozhraním medzi riadkymi Inšpektora Objektov a vlastnosťou v RTTI. V jednotke propedits.pp je definovaných niekoľko základných Editorov vlastností, ktorých základom je TPropertyEditor.

Trieda TPropertyEditor

Edituje vlastnosť komponentu alebo zoznamu komponentov, vybratú v Inšpektore objektov. Príslušný Editor vlastnosti je vytvorený v závislosti na type editovanej vlastnosti, ktorý je určený registrácii Editora vlastností pomocou RegisterPropertyEditor. Inšpektor objektov používa TPropertyEditor pre všetky modifikácie vlastnosti. GetName a GetValue sú volané na zobrazenie mena a hodnoty vlastnosti. SetValue je volaná vždy, keď užívateľ požaduje zmeniť hodnotu vlastnosti. Edit je volaná keď užívateľ dvojklikne na vlastnosť v Inšpektore objektov. GetValues je volaná pri zobrazení rozbaľovacieho zoznamu. GetProperties pri rozbalení vlastnosti pre zobrazenie pod-vlastností. AllEqual je volané na určenie, či bude zobrazená hodnota vlastnosti prei výbere viac ako jedného komponentu.

Nasledujúce metódy môžu byť predefinované na zmenu správania Editora vlastnosti:

Activate
Je volaná keď sa vlastnosť v Inšpektore objektov stáva vybratou. Je užitočná na povolenie určitých atribútov vlastnosti určených len keď je vlastnosť vybratá v Inšpektore objektov. Len paSubProperties a paMultiSelect, vrátené z GetAttributes, je vyžadované pred volaním tejto metódy.
Deactivate
Je volaná, keď vlastnosť v Inšpektore objektov prestáva byť vybratá.
AllEqual
Je volaná, keď je vybratý viac ako jeden komponent. Ak táto metóda vracia True, je volaná GetValue, inak je v Inšpektore objektov zobrazené prázdne políčko. Je volaná, len ak GetAttributes vracia paMultiSelect.
AutoFill
Je volaná na určenie či hodnoty vrátené pomocou GetValues môžu byť prírastkovo vybraté v Inšpektore objektov. Je volaná len keď GetAttributes vracia paValueList.
Edit
Je volaná pri stlačení tlačítka '...' alebo dvojkliku na vlastnosť. Môže, napríklad, vyvolať dialóg na editovanie komponentu v nejakom výstižnejšom štýle ako je textový (napr. vlastnosť Font).
GetAttributes
Vracia informáciu, ktorú Inšpektor objektov používa na zobrazenie príslušných nástrojov. GetAttributes vracia množinu typu TPropertyAttributes:
    • paValueList: Editor vlastnosti môže vrátiť vymenovaný zoznam hodnôt pre vlastnosť. Ak GetValues volá Proc s hodnotami, potom musí byť tento atribút nastavený. Táto hodnota spôsobuje zobrazenie tlačítka rozbaľovacieho zoznamu na pravej strane vlastnosti v Inšpektore objektov.
    • paSortList: Inšpektor objektov zotriedi hodnoty vrátené z GetValues.
    • paSubProperties: Editor vlastnosti má sub-vlastnosti, ktoré budú zobrazené odsadené pod aktuálnou vlastnosťou v štandartnom formáte. Ak GetProperties bude generovať objektové vlastnosti, potom musí byť tento atribút nastavený.
    • paDynamicSubProps: Sub-vlastnosti možno zmeniť. Všetky návrhové nástroje (tj. Editory vlastností, Editory komponentov), ktoré zmenia zoznam, musia volať UpdateListPropertyEditors, aby Inšpektor objektov znova načítal sub-vlastnosti.
    • paDialog: Udáva, že metóda Edit vyvolá dialóg, tým bude zobrazené tlačítko '...' na pravej strane vlastnosti v Inšpektore objektov.
    • paMultiSelect: Dovoľuje zobrazenie vlastnosti, keď je vybratý viac ako jeden komponent. Niektoré vlastnosti nie sú vhodné pre viacnásobný výber (napr. vlastnosť Name).
    • paAutoUpdate: Spôsobuje volanie metódy SetValue pri každej zmenu, čím sa prejaví v editore, narozdiel od volania po zmene (napr. vlastnosť Caption).
    • paReadOnly: Hodnota nemôže byť menená, ale ak je nastavené paDialog môže hodnotu meniť dialóg. Táto voľba zakazuje len zmenu v políčku Inšpektora objektov.
    • paRevertable: Umožňuje vrátiť hodnotu vlastnosti na pôvodnú hodnotu. Návrat k pôvodnej hodnote nie je možný pre vnorené vlastnosti (ako Fonts) a prvky zložených vlastností, ako množina hodnôt prvkov.
    • paFullWidthName: Vraví Inšpektoru objektov, že hodnotu nie je treba poskytovať a ako také meno môže byť poskytnuté na celú šírku Inšpektora.
    • paVolatileSubProperties: Všetky zmeny hodnoty vlastnosti spôsobia znovazostavenie sub-vlastností.
    • paDisableSubProperties: Všetky sub-vlastnosti sú len na čítanie (ani pomocou dialógu).
    • paReference: Vlastnosť obsahujúca odkaz na niečo iné. Pri použití spolu s paSubProperties môže byť odkazovaný objekt zobrazený ako sub-vlastnosti tejto vlastnosti.
    • paNotNestable: Indikuje, že vlastnosť nie je bezpečné zobrazovať pri zobrazení vlastností rozbaleného odkazu.
GetComponent
Vracia Index-tý komponent, ktorý je editovaný Editorom vlastností. Je použitá na získanie komponentu. Editor vlastností môže odkazovať na viac komponentov len ak GetAttributes vracia paMultiSelect.
GetEditLimit
Vracia počet znakov, ktoré môže užívateľ zadať ako hodnotu. Príslušný editor Inšpektora objektov bude potrebovať obmedzenie pre svoj text nastavený na vrátenú hodnotu. Predvolený limit je 255.
GetName
Vracia meno vlastnosti. Predvolená hodnota je získaná z typovej informácie so všetkými podtržítkami '_' nahradenými medzerami. Táto metóda môže byť predefinovaná ak meno vlastnosti nie je menom, ktoré sa má objaviť v Inšpektore objektov.
GetProperties
Môže byť prepísaná na volanie PropertyProc pre každú sub-vlastnosť (alebo vnorenú vlastnosť) editovanej vlastnosti a poslaním nového TPropertyEdtior pre každú sub-vlastnosť. Predvolene nie je PropertyProc volaná a nie sú predpokladané sub-vlastnosti. TClassPropertyEditor pošle nový Editor vlastnosti pre každú publikovanú vlastnosť triedy. TSetPropertyEditor posiela nový editor pre každý prvok množiny.
GetPropType
Vracia ukazovateľ typovej informácie editovanej vlastnosti.
GetValue
Vracia reťazcovú hodnotu vlasntosti. Predvolene vracia '(unknown)'. Musí byť prepísaná, aby vracala príslušnú hodnotu.
GetValues
Je volaná keď GetAttributes vrátila paValueList. Musí volať Proc pre každú hodnotu, ktorá je akceptovateľná pre túto vlastnosť. TEnumPropertyEditor budeposielať každý vymenovaný prvok.
Initialize
Je volaná po vytvorení Editora vlastnosti, ale pred jeho prvým použitím. Many times property editors are created and because they are not a common property across the entire selection they are thrown away. Initialize is called after it is determined the property editor is going to be used by the object inspector and not just thrown away.
SetValue(Value)
Called to set the value of the property. The property editor should be able to translate the string and call one of the SetXxxValue methods. If the string is not in the correct format or not an allowed value, the property editor should generate an exception describing the problem. Set value can ignore all changes and allow all editing of the property be accomplished through the Edit method (e.g. the Picture property).
ListMeasureWidth(Value,Canvas,AWidth)
This is called during the width calculation phase of the drop down list preparation.
ListMeasureHeight(Value,Canvas,AHeight)
This is called during the item/value height calculation phase of the drop down list's render. This is very similar to TListBox's OnMeasureItem, just slightly different parameters.
ListDrawValue(Value,Canvas,Rect,Selected)
This is called during the item/value render phase of the drop down list's render. This is very similar to TListBox's OnDrawItem, just slightly different parameters.
PropMeasureHeight(Value,Canvas,AHeight)
This is called during the item/property height calculation phase of the object inspectors rows render. This is very similar to TListBox's OnMeasureItem, just slightly different parameters.
PropDrawName(Canvas,Rect,Selected)
Called during the render of the name column of the property list. Its functionality is very similar to TListBox's OnDrawItem,but once again it has slightly different parameters.
PropDrawValue(Canvas,Rect,Selected)
Called during the render of the value column of the property list. Its functionality is similar to PropDrawName. If multiple items are selected and their values don't match this procedure will be passed an empty value.

Properties and methods useful in creating new TPropertyEditor classes:

property Name
Returns the name of the property returned by GetName
property PrivateEditory
This is the configuration directory of lazarus. If the property editor needs auxiliary or state files (templates, examples, etc) they should be stored in this editory.
property Value
The current value,as a string,of the property as returned by GetValue.
Modified
Called to indicate the value of the property has been modified. Called automatically by the SetXxxValue methods. If you call a TProperty SetXxxValue method directly,you *must* call Modified as well.
GetXxxValue
Gets the value of the first property in the Properties property. Calls the appropriate TProperty GetXxxValue method to retrieve the value.
SetXxxValue
Sets the value of all the properties in the Properties property. Calls the approprate TProperty SetXxxxValue methods to set the value.
GetVisualValue
This function will return the displayable value of the property. If only one item is selected or all the multi-selected items have the same property value then this function will return the actual property value. Otherwise this function will return an empty string.

Registrovanie obslúh udalostí

V IDE je niekoľko udalostí, pre ktoré môže plugin pridať svoju vlastnú obsluhu. V súbore propedits.pp sa nachádza objekt GlobalDesignHook", ktorý obsluhuje neikoľko udalostí pre navrhovanie. Každá udalosť volá zoznam obslúh. Predvolené obsluhy sú pridané samotným IDE. Svoje vlastné obsluhy môžete pridať pomocou metód AddHandlerXXX a RemoveHandlerXXX. Tieto budú volané pred predvolenými obsluhami.

Príklady:

 Pridanie svojej obsluhy (toto by mal vykonať konštruktor vášho objektu):
   GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);
 Odstránenie vašej obsluhy:
   GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);
 Môžete odstrániť všetky obsluhy naraz. Napríklad, je vhodé pridať do deštruktora objektu tentor riadok:
   GlobalDesignHook.RemoveAllHandlersForObject(Self);

Obsluhy GlobalDesignHook:

 // lookup root
 ChangeLookupRoot
   Je volaná pri zmene "LookupRoot". "LookupRoot" je vlastník objektu aktuálne vybratého komponentu. Zvyčajne to je TForm.
 // methods
 CreateMethod
 GetMethodName
 GetMethods
 MethodExists
 RenameMethod
 ShowMethod
 MethodFromAncestor
 ChainCall
 // components
 GetComponent
 GetComponentName
 GetComponentNames
 GetRootClassName
 ComponentRenamed
   Volaná pri premenovaní komponentu
 ComponentAdded
   Volaná pri priradní komponentu do LookupRoot
 ComponentDeleting
   VOlaná pred uvoľnením komponentu.
 DeleteComponent
   VOlaná pri odstráenní komponentu pomocou IDE.
 GetSelectedComponents
   Vracia aktuálny výber komponentov.
 // persistent objects
 GetObject
 GetObjectName
 GetObjectNames
 // modifing
 Modified
 Revert
 RefreshPropertyValues


Spolupracovníci a zmeny

This page has been converted from the epikwiki version.

This document was authored by Mattias Gaertner Initial import and formatted for Lazarus-CCR - VlxAdmin 9/26/2003

  • Prvotný preklad - Slavko 02:24, 26 Mar 2005 (PST)
  • Doplnený preklad kapitoly Editory vlastností a komponentov - Slavko 10:54, 1 Apr 2005 (PST)