Jos vakiovalintaikkuna on lisäosalle liian yksinkertainen, voit luoda oman valintaikkunan Dialog-luokan avulla. Edellä kuvattiin, kuinka Readme-työkalu lisäsi toimintojoukossa "Avaa Readme-työkalun selain"-toiminnon. Kyseinen toimintojoukko näkyy työympäristön työkalurivissä ja Ikkuna->Readme-tiedoston muokkausohjelma-valikossa.
Seuraavassa perehdytään tämän toiminnon toteutukseen Readme-työkalun WindowActionDelegate-luokassa.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
Toimintojoukon ikkunan toiminnon delegaatti käyttää resurssien navigaattorinäkymän valintaa (.readme-tiedosto) saadakseen luettelon Readme-tiedoston osista. Luettelo ja työympäristön ikkunan komentoliittymä välitetään SectionsDialog-valintaikkunaan.
Kun käyttäjä valitsee toiminnon, SectionsDialog avautuu.
Readme-työkalun lisäosa toteuttaa SectionsDialog-valintaikkunan tekemällä luokasta Dialog aliluokan org.eclipse.jface.dialogs-pakettiin.
Dialog-luokka tukee valintaikkunan komentoliittymän ikkunan luomista, yleisten valintaikkunan painikkeiden luomista ja valintaikkunan aloittamista. Aliluokat vastaavat valintaikkunan sisällön käsittelystä:
SectionsDialog luo Widget-vakiotyökalujen luettelon, jolla esitetään osien luettelo. Luettelon täyttämisessä se käyttää JFace-katseluohjelmaa. (JFace-katseluohjelmiin perehdytään kohdassa Katseluohjelmat). Huomaa, että valintaikkunan ei tarvitse luoda painikkeita, sillä tämän hoitaa yliluokka.
protected Control createDialogArea(Composite parent) { Composite composite = (Composite)super.createDialogArea(parent); List list = new List(composite, SWT.BORDER); ... ListViewer viewer = new ListViewer(list); ... return composite; }
protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(MessageUtil.getString("Readme Sections")); ... }
Valintaikkunat voivat olla tarpeen mukaan yksinkertaisia tai monimutkaisia. Kun valintaikkunaa toteutetaan, suurin osa valintaikkunan koodista luo widget-vakiotyökalujen ohjausobjekteja, jotka edustavat sisältöaluetta, ja käsittelee tarvittavia tapahtumia sinä aikana, kun valintaikkuna on toiminnassa. Kun käyttäjä painaa jotakin painiketta, valintaikkuna voi tehdä kyselyn niiden ohjausobjektien (tai katseluohjelmien) tilasta, jotka muodostavat valintaikkunan, ja määrittää sitten, mitä pitäisi tehdä.
Joissakin tapauksissa haluat ehkä näyttää jotakin asiaa koskevia tietoja valintaikkunassa, mutta tavalla, joka on "kevyempi" kuin tavallisen valintaikkunan käyttö. Valintaikkunan voi esimerkiksi olla tarkoitus antaa väliaikaisia tietoja, jotka eivät edellytä huomion poistamista käyttäjän työstä. Tällaisessa tapauksessa voit toteuttaa valintaikkunan PopupDialog-luokan avulla. PopupDialog-valintaikkunan ulkoasu eroaa tavallisen Dialog-valintaikkunan ulkoasusta monella tavalla. Siinä ei ole painikkeita alaosassa eikä siinä ole tavallista ikkunan otsikkopalkkia. Sen reunat, riviväli ja fontti ovat tavallista pienempiä ja tiiviimpiä.
Vaikka PopupDialog-valintaikkuna näyttää hyvin erilaiselta kuin tavallinen valintaikkuna, valintaikkunan sisällön määrittävä lisäosan aliluokan koodi on lähes sama. Siinäkin luodaan valintaikkunan SWT-ohjausobjektit toteuttamallacreateDialogArea-metodi. Pääasiallinen ero sovelluskoodissa on, että valintaikkunan luovalla konstruktorilla on useampia parametreja kuin tavallisella Dialog-luokalla. Esimerkiksi SectionsDialog voidaan muuttaa PopupDialog-kohteeksi yksinkertaisesti muuttamalla valintaikkunan yliluokkaa ja määrittämällä valintaikkuna konstruktorissa:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Luo uuden SectionsDialog-kohteen. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // ei saa tarkennusta avauksen yhteydessä false, // rajoja ei tehdä pysyviksi false, // koon muuton taulukkoa ei näytetä false, // rajojen pysyviksi tekemisen valikkokohdetta ei näytetä null, // ei otsikkoa null); // ei tietotekstiä this.input = input; } ...