Bidra med innholdstyper

Oppgi en ny innholdstype

Plattformen definerer noen grunnleggende innholdstyper, for eksempel ren tekst og XML. Disse innholdstypene defineres på samme måte som de som oppgis av andre plugin-moduler. Vi skal se hvordan plattformen definerer noen av innholdstypene for å få bedre forståelse for innholdstyperammeverket.

Plugin-moduler definerer innholdstyper ved å oppgi en utvidelse for utvidelsespunktet org.eclipse.core.runtime.contentTypes. I denne utvidelsen oppgir en plugin-modul en enkel ID og navn for innholdstypen (den fullstendige IDen er alltid den enkle IDen med et prefiks fra det gjeldende navneområdet). Følgende snutt viser en forenklet versjon av bidrag til innholdstype for org.eclipse.core.runtime.text:

	<extension point="org.eclipse.core.runtime.contentTypes">
		<content-type 
			id="text"
			name="%textContentTypeName">
			file-extensions="txt">
			<describer class="org.eclipse.core.internal.content.TextContentDescriber"/>
</content-type>		
		...

Attributtet file-extensions definerer hvilke filtyper som knyttes til innholdstypen (".txt" i dette eksempelet). Med attributtet file-names (brukes ikke her) kan du tilknytte fullstendige navn. Plattformen tar hensyn til begge attributter ved lokalisering og beskrivelse av innholdstyper (hvis klienten oppgir et filnavn).

Elementet beskriver brukes til å definere en innholdsbeskriver for innholdstypen.

Finne og beskrive innhold

En innholdstype skal oppgi en innholdsbeskriver hvis det finnes identifiserbare egenskaper som gjør det mulig med automatisk søking etter type eller interessante dataegenskaper for innholdstypen. Med org.eclipse.core.runtime.text er det ikke mulig å finne innholdstypen bare ved å se på innholdet. Tekstdatastrømmer kan imidlertid være tilføyd av en Byte Order Mark, som kan være en interessant egenskap og krever en innholdsbeskriver.

Beskriveren er en implementering av IContentDescriber eller ITextContentDescriber. Den siste er en spesialisering av førstnevnte som må implementeres av beskrivere av tekstorienterte innholdstyper. Uavhengig av hvilken innholdstype det dreier seg om, har beskriveren to ansvarsområder: fastsette om innholdstypen er egnet for en gitt datastrøm og trekke ut interessante egenskaper fra en datastrøm som tilhører innholdstypen.

Metoden describe(stream, description) kalles når plattformen forsøker å fastsette innholdstypen for en bestemt datastrøm eller beskrive innholdet. Beskrivelsen er null når det bare er søking som er forespurt. I motsatt fall kan beskriveren fylle ut innholdsbeskrivelsen med egenskaper som finnes ved å lese datastrømmen, og bare dem. Innholdstypekodetypen skal brukes til å deklarere egenskaper som har standardverdier (for eksempel vil org.eclipse.core.runtime.xml deklarere UTF-8 som standard tegnsett).

Når innholdsbeskriveren utfører sine oppgaver, forventes det at de utføres så raskt som mulig. Det gunstigste er å at datastrømmen som leses, er minst mulig. Det forventes også at implementeringen av innholdsbeskriveren skal deklareres i en pakke som er unntatt fra plugin-aktivering (se buntmanifeststartsekvensen i Eclipse-AutoStart). Siden det er opprettet forekomst av alle beskrivere når innholdstyperammeverket initialiseres, vil aktiveringen bli satt i gang for tidlig hvis dette kravet ikke oppfylles, noe som må unngås. Senere implementeringer av plattformen kan nekte å opprette forekomst av beskrivere hvis dette vil utløse aktivering av den tilhørende plugin-modulen.

Utvide en eksisterende innholdstype

Innholdstyper er hierarkiske typer. Dette gjør det mulig for nye innholdstyper å dra fordel av attributtene eller funksjonaliteten i mer generelle innholdstyper. For eksempel betraktes en innholdstype for XML-data som underordnet tekstinnholdstypen:

       <content-type 
	id="xml"
	name="%xmlContentTypeName"
	base-type="org.eclipse.core.runtime.text"
	file-extensions="xml">
	<describer class="org.eclipse.core.internal.content.XMLContentDescriber"/>
	<property name="charset" default="UTF-8"/>
</content-type>

En XML-fil anses som en slags tekstfil, derfor bør funksjoner for slike filer også gjelde for XML-filer.

Merk at XML-innholdstypen overstyrer flere innholdstypeattributter som opprinnelig var definert i tekstinnholdstypen, for eksempel filtilknytninger og beskriverimplementeringen. Denne innholdstypen deklarerer dessuten en standard egenskapsverdi for egenskapen charset. Dette betyr at hvis beskriveren ikke fyller ut denne egenskapen ved innholdsbeskrivelsen for en datastrøm som anses å tilhøre XML-innholdstypen, vil plattformen angi den som "UTF-8".

Et annet eksempel er at innholdstypen for org.eclipse.ant.core.antBuildFile (for Ant Build Scripts) utvider XML-innholdstypen:

       <content-type  
id="antBuildFile"
name="%antBuildFileContentType.name"
base-type="org.eclipse.core.runtime.xml"
file-names="build.xml"
file-extensions="macrodef,ent,xml">
<describer
class="org.eclipse.ant.internal.core.contentDescriber.AntBuildfileContentDescriber">
</describer>
</content-type>

Merk at standardverdien for tegnsettegenskapen er arvet. Det er mulig å avbryte en arvet egenskap eller beskriver ved å omdeklarere dem med den tomme strengverdien.

Flere filtilknytninger

Nye filtilknytninger kan tilføyes eksisterende innholdstyper. For eksempel tilknytter plugin-modulen for ressurser org.eclipse.core.runtime.xml til ".project"-filer:

<extension point="org.eclipse.core.runtime.contentTypes">
	<file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/>
	...

Innholdstypealias

Siden Eclipse er utvidbart, er det ikke sikkert at en innholdstype som en plugin-modul avhenger av, er tilgjengelig i en gitt produktkonfigurasjon. Dette kan omgås ved å bruke innholdstypealiaser. Et innholdstypealias er en plassholder for en annen foretrukket innholdstype som ikke garanteres å være tilgjengelig. For eksempel deklarerer kjøretiden et alias (org.eclipse.core.runtime.properties) for Java-egenskapsinnholdstypen som er oppgitt av Java Development Tooling (org.eclipse.jdt.core.javaProperties):

<!-- a placeholder for setups where JDT's official type is not available -->			
<content-type id="properties" name="%propertiesContentTypeName"
base-type="org.eclipse.core.runtime.text"
alias-for="org.eclipse.jdt.core.javaProperties"
file-extensions="properties">
<property name="charset" default="ISO-8859-1"/>
</content-type>

Dette oppgir en plassholder for plugin-moduler som de kan referere til, uavhengig av om foretrukket innholdstype er tilgjengelig eller ikke. Hvis den er tilgjengelig, holdes aliasinnholdstypen fra innholdstypekatalogen tilbake, og eventuelle referanser til den anses som referanser til målinnholdstypen. Hvis den ikke er tilgjengelig, blir aliaset brukt som en vanlig innholdstype.