Tipy pro vývoj pluginů pro Eclipse
V poslední době spolupracuji na vývoji nového produktu firmy JetMinds (který bude brzy uveden). Projekt zahrnuje sadu Eclipse pluginů s custom editory se zvýrazňováním syntaxe, outline pohledy, inteligentní asistenty a další nástroje podobné těm již dostupným ve standardním Eclipse Java editoru.
Během vývoje jsem narazil na mnoho problémů se složitostí Eclipse, nedostatku přehledné dokumentace, příkladů apod. Proto jsem začal psát tuto sérií článků, která se ale nebude snažit býti kompletní příručkou, spíše jen takovým vypíchnutím zajímavých konceptů a nápadů.
V tomto díle naleznete:
- Pozor na UI (SWT) vlákno
- Jak získat referenci na aktivní editor
- Poznámky k IFile
- Jak otevřít soubor v jeho editoru
Eclipse FAQ
Ze všeho nejdříve doporučuji navštívit Eclipse FAQ, což je pravděpodobně nejucelenější zdroj informací o vývoji pro Eclipse.
UI vlákno
- viz též FAQ
Mnoho metod, které manipulují s UI komponentami je nutno volat v rámci vlákna UI (UI-thread). První možností jak toho docílit (nízkoúrovňová) je využít SWT metodu Display.syncExec() nebo asyncExec():
//...Runnable with your code here...
);
Druhá možnost (vyšší úrovně) je využít UIJob:
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
//...your code here...
return Status.OK_STATUS;
}
}.schedule();
Získání aktivního editoru
- viz též FAQ
K získání aktivního editoru lze použít něco jako (kontroly na nenullovost jsou nutné):
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
editor = page.getActiveEditor();
}
}
Získání IFile z EditorInput
Občas je užitečné získat referenci na soubor otevřený v editoru. Velmi snadno toho lze dosáhnout pomocí adaptér patternu (rozhodně čistší přístup než přetypovávat EditorInput na FileEditorInput atd.).
if (file != null) {
//...we can use file here...
}
Získání absolutní cesty z IFile
Získání File z IFile
Otevření souboru v editoru
Otevření souboru v příslušném editoru je možné takto:
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
try {
return IDE.openEditor(page, file, activate);
} catch (PartInitException e) {
//...something bad went here...
}
}
}
V dalších článcích se budu snažit zaměřit na složitější problémy.
7. 1. 2008 at 22.31
[…] Sometimes it is needed to force the refresh of the decorations (e.g. when they depend on some internal state which has changed). It can be achieved by firing fireLabelProviderChanged() event of the decorator (if it is enabled). This has to be done in UI thread (as described here). […]