Sign in Join
Wiki copytemporary

Extending the IDE/sk: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Rozširovanie IDE
22
33## Úvod
44
55IDE podporuje niekoľko typov pluginov:
66
77Komponenty
88Sú to položky Palety komponentov. Napríklad TButton môžete použiť na vytváranie tlačidiel.
99
1010Editory komponentov
1111Tieto 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.
1212
1313Editory vlastností
1414Tieto sú použité riadkami v Inšpektorovi objektov (Object Inspector).
1515
1616Experti
1717Toto sú všetky ostatné typy.
1818
1919Existujú dva spôsoby, ako pridať svoj vlastný plugin do IDE Lazarus:
2020
21211. Napíšte balíček, nainštalujte ho a zaregistrujte svoj plugin v procedúre 'Register' jednotky.
22222. Rozšírte kód Lazarus a pošlite svoj CVS rozdiely do maillistu Lazarus.
2323
2424## Písanie komponentov
2525
2626Vytvorte nový komponent pomocou Editora balíčkov.
2727
2828## Editory komponentov
2929
3030Editory 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.
3131
3232Editor 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.
3333
3434Editor 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.
3535
3636Predvolený 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).
3737
3838Všetky Editory komponentov sú odvodené od virtuálnej abstraktnej triedy **TBaseComponentEditor**.
3939
4040### Triedy Editorov komponentov
4141
4242TDefaultComponentEditor
4343Editor, ktorý poskytuje predvolené správanie pre dvojkliknutie, ktoré opakovane prechádza vlastnosti, hľadajúc najvhodnejšiu metódu vlastnosti na editovanie.
4444
4545TComponentEditor
4646Tá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.
4747
4848TNotebookComponentEditor
4949Predvolený editor komponentu pre TCustomNotebook.
5050
5151TPageComponentEditor
5252Predvolený editor komponentu pre TCustomPage.
5353
5454TStringGridComponentEditor
5555Predvolený editor komponentu pre TStringGrid.
5656
5757TToolBarComponentEditor
5858Predvolený editor komponentu pre TToolBar.
5959
6060TFileDialogComponentEditor
6161Predvolený editor komponentu pre TFileDialog.
6262
6363### Metódy k predefinovaniu
6464
6565Na zmenu správania štandartného Editora vlastností môžete predefinovať tieto metódy:
6666
6767Create(AComponent, ADesigner)
6868Konš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.
6969
7070Edit
7171Metó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)).
7272
7373ExecuteVerb(Index)
7474Je volaná vybratím položky kontextového menu, zvolená položka je udávaná pomocou Index. Jej správanie je určené Editorom komponentu.
7575
7676GetVerb
7777Editor komponentu musí vrátiť reťazec, ktorý bude zobrazený v kontextovom menu. Editor komponentu je zodpovedný za vhodné umiestnenie znaku & a znakov '...'.
7878
7979GetVerbCount
8080Počet platných indexov pre GetVerb a ExecuteVerb. Index začína nulou (tj. 0..GetVerbCount - 1).
8181
8282PrepareItem
8383Pri 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.
8484
8585Copy
8686Je 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.
8787
8888IsInInlined
8989Urč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.
9090
9191GetComponent
9292Vracia editovaný komponent.
9393
9494GetDesigner
9595Vracia aktuálny Designer formulára vlastniaceho komponent.
9696
9797### Registrácia Editora komponentu
9898
9999Aby IDE vedelo, ktorý Editor komponentu má použiť, je nutné ho registrovať. Pre toto je v jednotke **componenteditors.pas** definovaný procedurálny typ:
100100
101-`type`\
102-`  TRegisterComponentEditorProc `\
103-`    = procedure (ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);`\
104-`var`\
105-`  RegisterComponentEditorProc: TRegisterComponentEditorProc;`
101+``` pascal
102+type
103+ TRegisterComponentEditorProc
104+ = procedure (ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
105+var
106+ RegisterComponentEditorProc: TRegisterComponentEditorProc;
107+```
106108
107109a jedna procedúra a jedna funkcia:
108110
109-` procedure RegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);`\
110-` function GetComponentEditor(Component: TComponent; const Designer: TComponentEditorDesigner): TBaseComponentEditor;`
111+``` pascal
112+ procedure RegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
113+ function GetComponentEditor(Component: TComponent; const Designer: TComponentEditorDesigner): TBaseComponentEditor;
114+```
111115
112116Registrá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.:
113117
114-` RegisterComponentEditor(TCustomNotebook, TNotebookComponentEditor);`
118+```text
119+ RegisterComponentEditor(TCustomNotebook, TNotebookComponentEditor);
120+```
115121
116122Čím je zaregistrovaný Editor kompentu TNotebookComponentEditor pre komponenty typu TCustomNotebook.
117123
118124## Editory vlastností
119125
120126Editory 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**.
121127
122128### Trieda TPropertyEditor
123129
124130Edituje 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.
125131
126132Nasledujúce metódy môžu byť predefinované na zmenu správania Editora vlastnosti:
127133
128134Activate
129135Je 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.
130136
131137Deactivate
132138Je volaná, keď vlastnosť v Inšpektore objektov prestáva byť vybratá.
133139
134140AllEqual
135141Je 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.
136142
137143AutoFill
138144Je 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.
139145
140146Edit
141147Je 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).
142148
143149GetAttributes
144150Vracia informáciu, ktorú Inšpektor objektov používa na zobrazenie príslušných nástrojov. GetAttributes vracia množinu typu TPropertyAttributes:
145151
146152- - **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.
147153 - **paSortList**: Inšpektor objektov zotriedi hodnoty vrátené z GetValues.
148154 - **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ý.
149155 - **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.
150156 - **paDialog**: Udáva, že metóda Edit vyvolá dialóg, tým bude zobrazené tlačítko '...' na pravej strane vlastnosti v Inšpektore objektov.
151157 - **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).
152158 - **paAutoUpdate**: Spôsobuje volanie metódy SetValue pri každej zmenu, čím sa prejaví v editore, narozdiel od volania po zmene (napr. vlastnosť Caption).
153159 - **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.
154160 - **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.
155161 - **paFullWidthName**: Vraví Inšpektoru objektov, že hodnotu nie je treba poskytovať a ako také meno môže byť poskytnuté na celú šírku Inšpektora.
156162 - **paVolatileSubProperties**: Všetky zmeny hodnoty vlastnosti spôsobia znovazostavenie sub-vlastností.
157163 - **paDisableSubProperties**: Všetky sub-vlastnosti sú len na čítanie (ani pomocou dialógu).
158164 - **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.
159165 - **paNotNestable**: Indikuje, že vlastnosť nie je bezpečné zobrazovať pri zobrazení vlastností rozbaleného odkazu.
160166
161167GetComponent
162168Vracia 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.
163169
164170GetEditLimit
165171Vracia 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.
166172
167173GetName
168174Vracia 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.
169175
170176GetProperties
171177Môž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.
172178
173179GetPropType
174180Vracia ukazovateľ typovej informácie editovanej vlastnosti.
175181
176182GetValue
177183Vracia reťazcovú hodnotu vlasntosti. Predvolene vracia '(unknown)'. Musí byť prepísaná, aby vracala príslušnú hodnotu.
178184
179185GetValues
180186Je 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.
181187
182188Initialize
183189Je volaná po vytvorení Editora vlastnosti, ale pred jeho prvým použitím. Veľakrát sú Editory vlastností vytvorené a pretože nemajú spoločnú vlastnosť vo výbere, sú vytvorené zbytočne. Initialize je volaná po určení, že Editor vlastností má byť použitý Inšpektorom objektov a nie zbytočne.
184190
185191SetValue(Value)
186192Je volaná na nastavenie hodnoty vlastnosti. Editor vlastnosti nusí byť schopný preložiť reťazec a volať jednu z metód SetXxxValue. Ak reťazec nemá správny formát alebo má nepovolenú hodnotu, Editor vlastnosti musí generovať výnimku popisujúcu problém. SetValue môže ignorovať všetky zmeny a dovoliť všetky úpravy vlastnosti urobené pomocou metódy Edit (napr. vlastnosť Picture).
187193
188194ListMeasureWidth(Value,Canvas,AWidth)
189195Je volaná počas výpočtu šírky rozbaľovacieho zoznamu.
190196
191197ListMeasureHeight(Value,Canvas,AHeight)
192198Je volaná počas výpočtu výšky položky/hodnoty rozbaľovacieho zoznamu. Je veľmi podobná OnMeasureItem triedy TListBox, len s inými parametrami.
193199
194200ListDrawValue(Value,Canvas,Rect,Selected)
195201Je volaná počas poskytovania položky/hodnoty rozbaľovacieho zoznamu. Je veľmi podobná OnDrawItem triedy TListBox, len s inými parametrami.
196202
197203PropMeasureHeight(Value,Canvas,AHeight)
198204Je volaná počas výpočtu výšky položky/vlastnosti riadku Inšpektora objektov. Je veľmi podobná OnMeasureItem triedy TListBox, len s inými parametrami.
199205
200206PropDrawName(Canvas,Rect,Selected)
201207Je volaná počas poskytovania stĺpca mena zoznamu vlastností. Je veľmi podobná OnDrawItem triedy TListBox, len s inými parametrami.
202208
203209PropDrawValue(Canvas,Rect,Selected)
204210Je volaná počas poskytovania stĺpca hodnôt zoznamu vlastností. Je veľmi podobná PropDrawName. Ak sú zvolené viaceré položky a ich hodnoty sú rôzne, táto procedúra posiela prázdnu hodnotu.
205211
206212Vlastnosti a metódy užitočné pri vytváraní nových tried TPropertyEditor:
207213
208214property Name
209215Vracia meno vlastnosti vrátené z GetName.
210216
211217property PrivateEditory
212218TKonfiguračný adresár Lazarus. Ak Editor vlastnosti potrebuje pomocné alebo stavové súbory (šablóny, príklady, atď.) môžu byť uložené tu.
213219
214220property Value
215221Aktuálny hodnota, v reťazcovom formáte, vlastnosti vrátená z GetValue.
216222
217223Modified
218224Volaná na indikovanie, že hodnota vlastnosti bola zmenená. Je volaná automaticky z metódy SetXxxValue, ak voláte metódu SetXxxValue priamo, musíte volať aj Modified.
219225
220226GetXxxValue
221227Vracia hodnotu prvej vlastnosti vo vlastnosti Properties. Volajte príslušnú metódu GetXxxValue na získanie hodnoty.
222228
223229SetXxxValue
224230Nastavuje hodnotu všetkých vlastností vo vlastnosti Properties. Volajte príslušné metódy SetXxxxValue na nastavenie hodnoty.
225231
226232GetVisualValue
227233Funkcia vráti zobraziteľnú hodnotu vlastnosti. Ak je vybratá len jedna položka alebo všetky položky viacnásobného výberu majú rovnakú hodnotu, potom táto funkcia vráti aktuálnu hodnotu vlastnosti. Inak vracia prázdny reťazec.
228234
229235## Registrovanie obslúh udalostí
230236
231237V 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.
232238
233239Príklady:
234240
235-` Pridanie svojej obsluhy (toto by mal vykonať konštruktor vášho objektu):`\
236-`   GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);`\
237-` Odstránenie vašej obsluhy:`\
238-`   GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);`\
239-` Môžete odstrániť všetky obsluhy naraz. Napríklad, je vhodé pridať do deštruktora objektu tentor riadok:`\
240-`   GlobalDesignHook.RemoveAllHandlersForObject(Self);`
241+```text
242+ Pridanie svojej obsluhy (toto by mal vykonať konštruktor vášho objektu):
243+ GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);
244+ Odstránenie vašej obsluhy:
245+ GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);
246+ Môžete odstrániť všetky obsluhy naraz. Napríklad, je vhodé pridať do deštruktora objektu tentor riadok:
247+ GlobalDesignHook.RemoveAllHandlersForObject(Self);
248+```
241249
242250Obsluhy GlobalDesignHook:
243251
244-` // lookup root`\
245-` ChangeLookupRoot`\
246-`   Je volaná pri zmene "LookupRoot". "LookupRoot" je vlastník objektu aktuálne vybratého komponentu. Zvyčajne to je TForm.`\
247-` // methods`\
248-` CreateMethod`\
249-` GetMethodName`\
250-` GetMethods`\
251-` MethodExists`\
252-` RenameMethod`\
253-` ShowMethod`\
254-` MethodFromAncestor`\
255-` ChainCall`\
256-` // components`\
257-` GetComponent`\
258-` GetComponentName`\
259-` GetComponentNames`\
260-` GetRootClassName`\
261-` ComponentRenamed`\
262-`   Volaná pri premenovaní komponentu`\
263-` ComponentAdded`\
264-`   Volaná pri priradní komponentu do LookupRoot`\
265-` ComponentDeleting`\
266-`   VOlaná pred uvoľnením komponentu.`\
267-` DeleteComponent`\
268-`   VOlaná pri odstráenní komponentu pomocou IDE.`\
269-` GetSelectedComponents`\
270-`   Vracia aktuálny výber komponentov.`\
271-` // persistent objects`\
272-` GetObject`\
273-` GetObjectName`\
274-` GetObjectNames`\
275-` // modifing`\
276-` Modified`\
277-` Revert`\
278-` RefreshPropertyValues`
252+```text
253+ // lookup root
254+ ChangeLookupRoot
255+ Je volaná pri zmene "LookupRoot". "LookupRoot" je vlastník objektu aktuálne vybratého komponentu. Zvyčajne to je TForm.
256+ // methods
257+ CreateMethod
258+ GetMethodName
259+ GetMethods
260+ MethodExists
261+ RenameMethod
262+ ShowMethod
263+ MethodFromAncestor
264+ ChainCall
265+ // components
266+ GetComponent
267+ GetComponentName
268+ GetComponentNames
269+ GetRootClassName
270+ ComponentRenamed
271+ Volaná pri premenovaní komponentu
272+ ComponentAdded
273+ Volaná pri priradní komponentu do LookupRoot
274+ ComponentDeleting
275+ VOlaná pred uvoľnením komponentu.
276+ DeleteComponent
277+ VOlaná pri odstráenní komponentu pomocou IDE.
278+ GetSelectedComponents
279+ Vracia aktuálny výber komponentov.
280+ // persistent objects
281+ GetObject
282+ GetObjectName
283+ GetObjectNames
284+ // modifing
285+ Modified
286+ Revert
287+ RefreshPropertyValues
288+```
279289
280290## Spolupracovníci a zmeny
281291
282292This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=ExtendingTheIde).
283293
284294This document was authored by Mattias Gaertner Initial import and formatted for Lazarus-CCR - VlxAdmin 9/26/2003
285295
286296- Prvotný preklad - Slavko 02:24, 26 Mar 2005 (PST)
287297- Doplnený preklad kapitoly Editory vlastností a komponentov - Slavko 10:54, 1 Apr 2005 (PST)
288298
289299---
290300*From the Free Pascal wiki, page "Extending the IDE/sk", as it stood on 2006-04-14 after a change by Swen, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history