Implementera en strukturvisning

I ett visningsprogram för struktursammanslagning utförs en tvåvägs- eller trvägsjämförelse av indata. Resultatet presenteras i en hierarkisk vy. Användare kan sammanfoga inmatningar. Dessa visningsprogram är gemensamma för arbetsyteresurser och medlemmar av en arkivfil.

Visning i trädstruktur

Eftersom implementering av många visningsprogram för strukturjämförelse baseras på ett träd, har insticksprogrammet för jämförelse ett allmänt trädbaserat StructureDiffViewer. I ditt insticksprogram ska det finnas en strukturskapare som bryter upp ett indataobjekt i en hierarkisk struktur. StructureDiffViewer utför jämförelsen på den resulterande strukturen och visar resultatet som ett träd.

Du tilldelar en strukturskapare för ditt insticksprogram med hjälp av tillägget org.eclipse.compare.structureCreators. En strukturskapare kan liksom visningsprogram för innehåll, specificeras för en uppsättning filtillägg, eller så kan en contentTypeBinding användas till att associera en innehållstyp med en viss strukturskapare. Vi kommer inte att ta upp kodstycket här eftersom det är i stort sett identiskt med det för visningsprogram för innehåll. JDT-insticksprogrammet definierar många bidrag för org.eclipse.compare.structureCreators.

Andra visningsprogram i hierarkisk struktur

I vissa fall kanske inte det trädbaserade StructureDiffViewer är lämpligt för ditt insticksprogram. Med utökningspunkten org.eclipse.compare.structureMergeViewers kan du definiera en egen implementering för ett visningsprogram för struktursammanslagning. En strukturskapare kan specificeras för filtillägg, eller så kan en contentTypeBinding användas till att associera en innehållstyp med ett visst visningsprogram för struktursammanslagning. JDT-insticksprogrammet visar exempel på org.eclipse.compare.structureMergeViewers-bidrag.

I insticksprogrammet för sökning finns flera hjälpklasser för att underlätta din implementering av sådant insticksprogram.

Differensmotor 

Differencer är en differensmotor för hierarkiskt strukturerade data. En tvåvägs- eller trevägsjämförelse utförs på två eller tre inmatningar.

Om indataelementen till differensmotorn implementerar gränssnittet IStructureComparator, tillämpas motorn rekursivt på indataelementets underordnade element. Bladelement måste implementera gränssnittet IStreamContentAccessor så att differensmotorn kan utföra en bytebaserad jämförelse på innehållet.

Det finns flera bra exempel på differensmotorer som ingår i plattformsimplementeringen:

Som standard returnerar differensmotorn resultatet av en jämförelse som ett träd med DiffNode-objekt. En DiffNode beskriver förändringarna mellan två eller tre inmatningar. Resultatnodtypen kan ändras genom att en enstaka metod hos motorn förbigås.

Differensvisning

Ett träd med DiffNode kan visas i en DiffTreeViewer. För DiffTreeViewer krävs att trädets inre noder implementerar gränssnittet IDiffContainer och bladen implementerar gränssnittet IDiffElement.

De typiska stegen för att jämföra hierarkiskt strukturerade data och visa skillnader är enligt följande:

  1. Avbilda indata i ett objektträd som implementerar båda gränssnitten IStructureComparator och IStreamContentAccessor.
  2. Utför jämförelsen med hjälp av differensmotorn
  3. Mata in differensresultatet i DiffTreeViewer

StructureDiffViewer är en specialanpassad DiffTreeViewer som automatiserar de tre stegen ovan. Ett enstaka indataobjekt av typen ICompareInput från vilket två eller tre indataelement hämtas för jämförelse. En IStructureCreator används för att extrahera ett träd som innehåller IStructureComparator- och IStreamContentAccessor-objekt från dem. Dessa träd jämförs därefter med differensmotorn och resultatet visas i en trädvisning.

ZipFileStructureCreator är en implementering av gränssnittet IStructureCreator och gör innehållet i ett zipparkiv tillgängligt som en hierarkisk struktur av IStructureComparators som enkelt kan jämföras av differensmotorn (Differencer). Detta är ett bra exempel på hur man gör strukturerade filer tillgängliga för den hierarkiska funktionen i insticksprogrammet för jämförelse.