Cześć, od Eclipse 3.3 spellchecking powinien być we wszystkich edytorach
tekstowych. Co więcej, standardowo jak uruchamiasz Eclipse, opcja ta
jest włączona i dostarczany jest słownik angielski.
W starszych wersjach, spellchecking był dostępny tylko w edytorze javy,
oraz był domyślnie wyłączony.
Inicjalizacja spellcheckingu jest w klasie
org.eclipse.ui.editors.text.TextSourceViewerConfiguration, w metodach:
org.eclipse.ui.editors.text.TextSourceViewerConfiguration.getReconciler(ISourceViewer)
oraz
org.eclipse.ui.editors.text.TextSourceViewerConfiguration.getQuickAssistAssistant(ISourceViewer)
(obie od wersji 3.3)
Swoją drogą od 3.3 w Eclipse pisowania jest sprawdzana w
najprzeróżniejszych miejscach, gdzie jest wykorzystywany TextViewer, jak
np. w ticketach Mylyn, czy komentarzach commitów do CVS. Może i w Twoim
RCP warto dodać taką funkcjonalność.
Możesz także także zobaczyć np. tego buga:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=155280
Są tam patche z kodem włączającym spellchecking w jednym z pól
tekstowych - dobre żeby zacząć.
Co do słownika, to musiałbyś zobaczyć jak są skonstruowane te słowniki
angielskie w Eclipse i przygotować polski odpowiednik.
Pozdr
Jarek
są słowniki polskie np. dla skrablistów, słownik do firefoxa, albo do
OpenOffice.
Wszystkie chyba nawet bazują na tym samym zestawie słów.
Właśnie widzę że słowniki są w org.eclipse.jdt.ui. W podkatalogu
dictionaries, pliki mają format słowo na wiersz - więc typowy, jest też
licencja ispell.
Pozostaje tylko zarejestrować własny słownik :)
Cześć,
okazuje się że nie tak łatwo podpiąć zewnętrzny słownik do zestawu
standardowych angielskich GB i US. Tutaj są szczegóły na ten temat:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=201085
Puki co można co najwyżej korzystać z opcji User dictionary w Window ->
Preferences.
Dla developerów RCP rozwiązaniem może być napisanie własnej klasy
SearchEngine (analogicznej do tej z jdt.ui) i w niej ładowanie własnego
słownika.
Witam!!
Jacek czy moglbys mi podac jakies linki do dokumentacji ew. jakies
tutoriale w jakis sposob moglbym przepisac tak klase SearchEngine tak
zebym mogl dodawac dowolny slownik ?? Jestem poczatkujacym programista
w sferze Eclipse RCP i kazda pomoc sie przyda :).
Czy ten spellchecker z Eclipse 3.3 dziala tak jak np. w Wordzie ?? To
znaczy czy po zazanczeniu blednego slowa mozna kliknac na nie prawym
klawiszem myszy i pokaza sie podpowiedzi ?? I czy jest mozliwe dodanie
slow kluczowych ktore nie beda brane pod uwage przy sprawdzaniu
pisowni ??
Pozdrawiam
Jarek
hej,
jest tak jak mówisz, tzn. mechanizm sprawdzania pisowni istniał już
przed 3.3, ale dopiero w 3.3 dodano domyślnie słowniki i dopiero wtedy
też zmodyfikowano standardowy edytor tekstowy
(AbstractDecoratedTextEditor) by obsługiwał spellchecking.
Podobnie z searchEnginem, najwygodniej zrobić nowy i zarejestrować go w
punkcie rozszerzeń org.eclipse.ui.workbench.texteditor.spellingEngine
Napewno będzie działać - niżej przykładowy spellingEngine zamieniający
słowa na "kur", na "XXX" :)
Lepiej jednak wzorować się na słowniku z org.eclipse.jdt.ui, który
znajduje się w pakietach:
org.eclipse.jdt.internal.ui.text.spelling i
org.eclipse.jdt.internal.ui.text.spelling.engine
Najlepiej zacząć od
org.eclipse.jdt.internal.ui.text.spelling.DefaultSpellingEngine
Możesz albo skopiować część klas, albo wybrać tylko co ciekawsze
elementy, bo tamten mechanizm jest dosyć rozbudowany - ma różne silniki
dla różnych typów tekstów, języków, preferencje, itp.
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.ui.texteditor.spelling.ISpellingEngine;
import org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector;
import org.eclipse.ui.texteditor.spelling.SpellingContext;
import org.eclipse.ui.texteditor.spelling.SpellingProblem;
public class SpellingEngine implements ISpellingEngine {
private class ExampleSpellingProblem extends SpellingProblem {
private int offset;
private int length;
private String message;
private String fix;
public ExampleSpellingProblem(int offset, int length, String message,
String fix) {
this.offset = offset;
this.length = length;
this.message = message;
this.fix = fix;
}
@Override
public int getLength() {
return length;
}
@Override
public String getMessage() {
return message;
}
@Override
public int getOffset() {
return offset;
}
@Override
public ICompletionProposal[] getProposals() {
return new ICompletionProposal[] { new CompletionProposal(fix,
offset, length, fix.length()) };
}
}
public SpellingEngine() {
// TODO Auto-generated constructor stub
}
@Override
public void check(IDocument document, IRegion[] regions,
SpellingContext context, ISpellingProblemCollector collector,
IProgressMonitor monitor) {
for (IRegion region : regions) {
int offset = region.getOffset();
try {
StringTokenizer st = new
StringTokenizer(document.get(region.getOffset(), region.getLength()));
while (st.hasMoreElements()) {
String word = (String) st.nextElement();
if (word.startsWith("kur")) {
collector.accept(new ExampleSpellingProblem(offset, word.length(),
"This is Bad!", "XXX"));
}
offset += word.length() + 1;
}
} catch (BadLocationException e) {
// bad location -> ignore region
}
}
}
}
niestety nie możesz dziedziczyć po tym SpellCheckEngine bo ma prywatny
konstruktor, a nawet gdyby Ci się udało, to wszędzie są odwołania do tej
klasy, a nie do Twojej, więc trzeba by się samemu do niej odwoływać = za
dużo roboty.
Ewentualnie możesz w metodzie start w aktywatorze swojego plugina
zarejestrować własny słownik w SpellCheckEngine:
Locale pl = new Locale("pl", "PL");
URL url = ...; // url do slownika
LocaleSensitiveSpellDictionary dictionary = new
LocaleSensitiveSpellDictionary(pl, url);
SpellCheckEngine.getInstance().registerGlobalDictionary(pl, dictionary);
Jeśli natomiast możesz poczekać i akceptujesz pluginy w wersji 3.3.1,
lada dzień wspominany błąd
https://bugs.eclipse.org/bugs/show_bug.cgi?id=201085 powinien zostać
naprawiony i trafić do builda dostępnego z eclipse downloads.
Wtedy będzie można łatwo dodać dowolny słownik tak jak w tym przykładzie:
https://bugs.eclipse.org/bugs/attachment.cgi?id=76905
Inny problem to taki że w każdym z powyższych przypadków musiałbyś w
swoim RCP załączyć plug-in org.eclipse.jdt.ui który jest dosyć ciężki
(bo wymaga jeszcze innych wtyczek) :|
Tego unikniesz tylko tworząc własny spellingEngine.
tak,
jeśli twój edytor tekstowy dzidziczy po AbstractDecoratedTextEditor -
masz to za darmo. Podpowiedzi wyświetlają się tak jak w Eclipse, czyli
na Ctrl+1.
Z gory dzieki
Yaros
Yaros,
tutoriale do RCP pokazują głównie jak zacząć, tzn. jak od pierwszego
zetknięcia z Eclipsem doprowadzić do prostej aplikacji RCP.
Jeśli szukasz rozwiązania konkretnego problemu, najlepiej szukać
ogólniej w kategoriach pluginów do Eclipse.
Jako szczególnie dobre źródła informacji polecam:
0. zapomniana dokumentacja w menu Help, lub
http://help.eclipse.org/help33/index.jsp a w niej rozdział "Platform
Plug-in Developer Guide"
Jest tam np.
http://help.eclipse.org/help33/topic/org.eclipse.platform.doc.isv/guide/editors.htm
Niestety nie piszą bezpośrednio o formatowaniu. Ale tu jest też
wyszukiwarka, na hasło "formatter" znalazłem m.in. taki link:
http://help.eclipse.org/help33/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/text/formatter/package-summary.html
1. http://www.google.pl/search?q=site%3Aeclipse.org - wyszukiwanie
Google tylko w ramach eclipse.org daje rewelacyjne wyniki, bo najwięcej
cennych zasobów prędzej czy później trafia na eclipse.org.
Np. dot. formatowania w edytorze tekstowym:
http://www.google.pl/search?q=site%3Aeclipse.org+text+editor+formatter
(pierwszy wynik jest ciekawy)
2. grupy dyskusyjne news.eclipse.org - w archiwach jest duża szansa
znaleźć odpowiedź na podobne pytania do własnych.
Jeszcze lepiej się zarejestrować i samemu pytać - chętnie odpowiadają
zarówno developerzy Eclipse jak i integratorzy innych RCP. Żeby dostać
hasło:
http://www.eclipse.org/newsgroups/register.php
Na początek szczególnie dobra jest grupa eclipse.newcomer, a dla średnio
zaawansowanego adepta RCP: eclipse.platform oraz eclipse.platform.rcp
3. inne fajne źródło to np. materiały z corocznych EclipseCon.
Tutaj najlepiej wejść na stronę www.eclipsecon.org/ i poprzeglądać
archiwa z ostatnich lat, żeby się zorientować co do treści.
Są świetne pdfy, czasem na bardzo mało udokumentowane tematy, jak np.
rozszerzanie kompilatora, albo pisanie procesorów adnotacji :)
Np. na eclipseCon 2006 był ciekawy artykuł o budowie edytora tekstowego:
www.eclipse.org/eclipse/platform-text/eclipseCon/2006/texteditorrecipes.pdf
Aha, znalazłem jeszcze takie coś:
http://www.realsolve.co.uk/site/tech/jface-text.php
Bardzo interesujący artykuł, m.in. też, jak w edytorze tekstowym zrobić
formatowanie.
Owocnej lektury!
Jeszcze raz wielkie dzieki!!
Pozdrawiam
Yaros
Z tego co widzę, RCP bardzo szybko zdobywa popularność, np. w porównaniu
do stycznia, teraz jest więcej Polaków na news.eclipse.org, a także
tutaj jest więcej pytań. Na mojej uczelni (Politechnika Poznańska) też
widać to zainteresowanie, np. w propozycjach firm na tematy
inżynierskie, w konkursach, pytaniach itp.
Także ludzie się przekonują do RCP, no ale też wielu (i tu już nie mówię
tylko o Polsce) decyduje się na nie ze względu na inne projekty, np.
Equinox (dający zupełnie nowe możliwości w zarządzaniu aplikacją).
Jeszcze z aktualności Eclipsowych w Polsce, np. teraz we wrześniu będzie
ciekawa impreza o RCP i kilku innych technologiach Eclipse, które
świetnie współgrają z RCP i ułatwiają pisanie aplikacji. Zobacz sam:
http://www.eclipsesummerschool.com/
- moje edytor dziedziczy po TextEditor, klasa z konfiguracja edytora
dziedziczy po TextSourceViewerConfiguration
- w klasie konfiguracji tak jak napisales na poczatku metody
odpowiedzialne za spelling to getReconciler(ISourceViewer) i
getQuickAssistAssistant(ISourceViewer), mok problem polega na tym ze
mam napisana swoja klase ReconcilingStrategy ktora jest zwracana w
metodie getReconciler(ISourceViewer) tym samym nadpisuje metode z
TextSourceViewerConfiguration ktora jak sie domyslam zwraca klase
IReconciler odpowiedzialna za spelling.
I teraz moje pytania:
- jak moge sie dostac do zrodla metody getReconciler z klasy
TextSourceViewerConfiguration tak zeby dopisac kod odpowiedzialny za
spelling do swojej klasy tworzacej klase IReconciler
- czy musze dodac rozszerzenie ze enginem spellingu do mojego
plugina ?? Bo w tej chwili na strone preferencji mojego edytora w
sekcji spelling jest komunikat "The selecting spelling engine doesn't
exist"
- w jaki sposob potem po podlaczeniu engine moge usunac slowa kluczowe
z tekstu ktory bedzie sprawdzany ??
Sorki ze zadaje tyle pytan ale pogubilem sie totalnie w tym :).
Dzieki za wyrozumialosc
z tego co wcześniej piszesz rozumiem że masz własną klasę dziedziczącą
po TextSourceViewerConfiguration i własną implementację metody
getReconciler() która zwraca Twój własny reconciler nie obsługujący
spellcheckingu. tak?
Reconciler możesz mieć jeden, ale podpiąć do niego wiele strategii -
wtedy osobną strategią mogłaby być twoja bieżąca funkcjonalność
reconcilera, a kolejną strategią - standardowa SpellingReconcileStrategy.
Podobnie robią autorzy JDT - zobacz klasę
org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy - jak oni
to zaimplementowali.
> - czy musze dodac rozszerzenie ze enginem spellingu do mojego
> plugina ?? Bo w tej chwili na strone preferencji mojego edytora w
> sekcji spelling jest komunikat "The selecting spelling engine doesn't
> exist"
tak - mechanizm preferencji pokazuje tylko to spelling engine'y
zarejestrowane przez punkt rozszerzeń.
> - w jaki sposob potem po podlaczeniu engine moge usunac slowa kluczowe
> z tekstu ktory bedzie sprawdzany ??
musiałbyś to uwzględnić w swoim spellingEngine