Dialogdesign med Java Swing – del 4

De data som ska visas för en komponent ska alltid listas sorterade på samma sätt, vilket i sin tur gör att vi inte alls behöver uppdatera listorna för respektive komponent när ett element blir valt eller bortvalt, utan allt vi behöver göra är att be varje komponent att på nytt hämta data från dialogens modell. För det behöver vi två saker – en fasad mot dialogen (för att inte exponera alla metoder i dialogmodellen) och lyssnare (som kan bli notifierade när data i modellen har uppdaterats).

Fasaden behöver dessutom två metoder (valj och valjBort) som tar en sammansatt nyckel och använder den för att flagga om det elementet är valt eller inte. Välj-knapparna i de två panelerna med valbara element kan nu enkelt använda samma metod för att flagga sitt markerade element som valt och valda-komponenten använder valjBort antingen för ett markerat element (Ta bort markerad) eller för samtliga (Rensa).

Vidare behöver fasaden en möjlighet att låta lyssnare registrera sig som intresserade av att bli notifierade när förändringar inträffar.

Dessutom behöver den tillhandahålla en metod för att låta komponenterna hämta de data de ska visa, både när de initieras och när modellen uppdateras (där de får uppge ett filter för vilken komponent de vill hämta data för).

Slutligen behöver den också stöd för att uppdatera egna intervall när vi får nya data från en ”redigerare”, även om vi ännu inte har designat en sådan utan kommer att överlåta det till de implementationer som väljer att använda våra byggstenar i sina egna dialoger.

Vi vet inget om hur andra system väljer att lösa redigeringen av egendefinierade tider (vi vet varken hur de sparas eller vilken användare som ska få läsa vad från vilket underliggande system). Det vi vet är att vi vill att de ska implementera ett interface som gör det möjligt för oss att ropa på en ”redigerare” och från den få en ny lista av egendefinierade element. Så det enda vi kan definiera i det här läget är vårt kodkontrakt, vår redigerar-interface.

Dialogmodellens fasad

package com.golcher.tidsintervall.dialoger;

import com.golcher.tidsintervall.komponenter.data.KomponentFilter;
import com.golcher.tidsintervall.komponenter.data.TidsintervallNyckel;
import com.golcher.tidsintervall.komponenter.data.TidsintervallVo;
import com.golcher.tidsintervall.komponenter.data.TidsintervallWrapper;

import java.util.ArrayList;

public interface ITidsintervallModellFasad
{
    ArrayList<TidsintervallWrapper> hamtaModellFor(KomponentFilter filter);
    void registreraLyssnare(ITidsintervallModellLyssnare lyssnare);
    void valj(TidsintervallNyckel nyckel);
    void valjBort(TidsintervallNyckel nyckel);
    void uppdateraEgnaIntervallFranRedigerare(ArrayList<TidsintervallVo> egnaIntervall);
}

Komponentfiltret (som gör att komponenterna kan hämta sina egna data från modellen)

package com.golcher.tidsintervall.komponenter.data;

public enum KomponentFilter
{
    Standard,
    Egen,
    Valda
}

Lyssnarinterfacet

package com.golcher.tidsintervall.dialoger;

public interface ITidsintervallModellLyssnare
{
    void modellenHarUppdaterats();
}

Redigerarinterfacet

package com.golcher.tidsintervall.redigerare;

import com.golcher.tidsintervall.komponenter.data.TidsintervallVo;

import java.util.ArrayList;

public interface IEgnaIntervallRedigerare
{
    ArrayList<TidsintervallVo> visaRedigeringsDialog();
}