Zoals is beschreven in de vorige sectie, gebruikt de toepassing Filter Workbench een instantie van de klasse FilterWorkbenchController (waarnaar verder wordt verwezen als de ‘bedieningsinstantie’), die de filters daadwerkelijk op het geselecteerde zichtbare object toepast. Voordat de bedieningsinstantie een filter kan toepassen, moet deze eerst weten op welke afbeelding of zichtbare inhoud het filter moet worden toegepast. Wanneer de gebruiker een afbeelding selecteert, roept de toepassing de methode
setFilterTarget()
in de klasse FilterWorkbenchController aan, waarbij één van de constanten wordt doorgegeven die in de klasse ImageType is gedefinieerd:
public function setFilterTarget(targetType:ImageType):void
{
...
_loader = new Loader();
...
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, targetLoadComplete);
...
}
Met behulp van die informatie laadt de bedieningsinstantie het opgegeven bestand en slaat dit op in een instantievariabele met de naam
_currentTarget
zodra het is geladen:
private var _currentTarget:DisplayObject;
private function targetLoadComplete(event:Event):void
{
...
_currentTarget = _loader.content;
...
}
Wanneer de gebruiker een filter selecteert, roept de toepassing de methode
setFilter()
van de bedieningsinstantie aan en geeft hierbij een verwijzing aan de bedieningsinstantie door naar het relevante filterfabrieksobject, die het opslaat in een instantievariabele met de naam
_filterFactory
.
private var _filterFactory:IFilterFactory;
public function setFilter(factory:IFilterFactory):void
{
...
_filterFactory = factory;
_filterFactory.addEventListener(Event.CHANGE, filterChange);
}
Zoals eerder beschreven, weet de bedieningsinstantie niet wat het specifieke gegevenstype is van de filterfabrieksinstantie die eraan wordt gegeven; de instantie weet alleen dat het object de instantie IFilterFactory implementeert, met andere woorden, het heeft een methode
getFilter()
en verzendt een gebeurtenis
change
(
Event.CHANGE
) wanneer het filter wordt gewijzigd.
Wanneer de gebruiker de eigenschappen van een filter wijzigt in het filterdeelvenster, ziet de bedieningsinstantie dat het filter is gewijzigd via de filterfabrieksgebeurtenis
change
, die de methode
filterChange()
van de bedieningsinstantie aanroept. Die methode roept vervolgens de methode
applyTemporaryFilter()
aan:
private function filterChange(event:Event):void
{
applyTemporaryFilter();
}
private function applyTemporaryFilter():void
{
var currentFilter:BitmapFilter = _filterFactory.getFilter();
// Add the current filter to the set temporarily
_currentFilters.push(currentFilter);
// Refresh the filter set of the filter target
_currentTarget.filters = _currentFilters;
// Remove the current filter from the set
// (This doesn't remove it from the filter target, since
// the target uses a copy of the filters array internally.)
_currentFilters.pop();
}
Het toepassen van het filter op het weergaveobject gebeurt binnen de methode
applyTemporaryFilter()
. De bedieningsinstantie haalt eerst een verwijzing op naar het filterobject door de filterfabrieksmethode
getFilter()
aan te roepen.
var currentFilter:BitmapFilter = _filterFactory.getFilter();
De bedieningsinstantie bevat een instantievariabele Array met de naam
_currentFilters
, waarin deze alle filters opslaat die op het weergaveobject zijn toegepast. De volgende stap bestaat uit het toevoegen van het recent bijgewerkte filter aan die array:
_currentFilters.push(currentFilter);
Vervolgens wijst de code de array van
filters
toe aan de eigenschap filters van het weergaveobject, die de filters daadwerkelijk op de afbeelding toepast:
_currentTarget.filters = _currentFilters;
Ten slotte, omdat het laatst toegevoegde filter nog steeds het ‘werkende’ filter is, moet het niet permanent worden toegepast op het weergaveobject, daarom wordt het verwijderd uit de array
_currentFilters
:
_currentFilters.pop();
Het verwijderen van dit filter uit de array heeft geen effect op het gefilterde weergaveobject, omdat een weergaveobject een kopie maakt van de array filters wanneer deze wordt toegewezen aan de eigenschap
filters
en het gebruikt die interne array in plaats van de oorspronkelijke array. Daarom hebben wijzigingen in de array van filters geen effect op het weergaveobject totdat de array nogmaals wordt toegewezen aan de eigenschap
filters
van het weergaveobject.