Tartalomkiemelők

A szerkesztők gyakran rendelkeznek megfelelő tartalomkiemelőkkel, amelyek a szerkesztőtartalom strukturált nézetét biztosítják, és segítséget nyújtanak a felhasználó számára a szerkesztő tartalmában navigáláshoz.

A munkaterület egy általános Kiemelő nézetet biztosít ezen célra.  A munkaterület-felhasználó az Ablak > Nézet megjelenítése menü segítségével szabályozhatja a nézet láthatóságát.

Mivel az általános TextEditor nem tud semmit a szöveg struktúrájáról, nem biztosíthat jellemzőket az érintett kiemelőnézethez. Az alább látható alapértelmezett Kiemelő nézet nem tesz sokmindent.

Alapértelmezett tartalomkiemelő

 

A szövegkeretrendszer szerkesztői saját tartalomkiemelőt biztosíthatnak a kiemelő nézethez. A szerkesztő kiemelője akkor van megadva, ha a munkaterület egy IContentOutlinePage típusú adaptert kér.

public Object getAdapter(Class required) {
	if (IContentOutlinePage.class.equals(required)) {
		if (fOutlinePage == null) {
			fOutlinePage= new JavaContentOutlinePage(getDocumentProvider(), this);
			if (getEditorInput() != null)
				fOutlinePage.setInput(getEditorInput());
		}
		return fOutlinePage;
	}
	return super.getAdapter(required);
}

A tartalomkiemelő oldalnak meg kell valósítani az IContentOutlinePage elemet.  Ez a felület egyesíti a kiválasztásmódosítási figyelők értesítésének képességét (ISelectionProvider) azzal a jellemzővel, hogy az oldal egy nézetben legyen (IPage).   Tartalomkiemelők jellemzően JFace megjelenítők segítségével kerülnek megvalósításra. A tartalomkiemelő alapértelmezett megvalósítása (ContentOutlinePage) a JFace famegjelenítőt használja a kiemelő hierarchikus ábrázolásának megjelenítéséhez. Ez az ábrázolás számos strukturált kiemelőhöz megfelelő, a JavaContentOutlinePage elemet is beleértve.

Tekintsük meg az oldal megvalósítását. Ha a kiemelőoldalt a szerkesztő a fenti kódrészletben létrehozta, akkor a bemeneti elem a szerkesztő bemeneti elemére van beállítva. Ez a bemenet gyakran közvetlenül átadható a kiemelőoldal megjelenítőjének az alábbi módon.

public void createControl(Composite parent) {

	super.createControl(parent);

	TreeViewer viewer= getTreeViewer();
	viewer.setContentProvider(new ContentProvider());
	viewer.setLabelProvider(new LabelProvider());
	viewer.addSelectionChangedListener(this);

	if (fInput != null)
		viewer.setInput(fInput);
}

A famegjelenítő létrehozása a ContentOutlinePage elemből öröklődik. A rendszer a szabványos címkeszolgáltatót használja. A tartalomszolgáltató a JavaContentOutlinePage elemen belül kerül biztosításra, és a szerkesztőbemenet egyedi szegmensekre bontásáért felelős, amennyiben módosul.

		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
			...
			if (newInput != null) {
				IDocument document= fDocumentProvider.getDocument(newInput);
				if (document != null) {
					document.addPositionCategory(SEGMENTS);
					document.addPositionUpdater(fPositionUpdater);
					parse(document);
				}
			}
		}

A szöveg tartományokra van osztva a dokumentumon belül, amelyeket szegmenseknek hívnak.  Ezeket a szegmenseket a név jeleníti meg a vázlat nézetben.

Java példakiemelő

Ha a kiválasztás változásakor, akkor a kiválasztott szegmens lekérésre kerül. Az eltolások beállítják a kiemelési tartományt a szerkesztőben.

public void selectionChanged(SelectionChangedEvent event) {

	super.selectionChanged(event);

	ISelection selection= event.getSelection();
	if (selection.isEmpty())
		fTextEditor.resetHighlightRange();
	else {
		Segment segment= (Segment) ((IStructuredSelection) selection).getFirstElement();
		int start= segment.position.getOffset();
		int length= segment.position.getLength();
		try {
			fTextEditor.setHighlightRange(start, length, true);
		} catch (IllegalArgumentException x) {
			fTextEditor.resetHighlightRange();
		}
	}
}