Edellä on huomattu, että JFace-käyttöliittymässä on perustuki, joka esittää tehtävien tilannetiedot valintaikkunassa (lisätietoja on ohjeaiheessa Pitkäkestoiset toiminnot). Ohjeaiheessa Samanaikaisuuden rakenne tarkasteltiin ympäristön ajonaikaista tukea samanaikaisuudelle ja pitkäkestoisille toiminnoille. Seuraavaksi tutkitaan, miten ympäristön käyttöliittymä parantaa tätä rakennetta
org.eclipse.ui.progress-paketissa. Tämä paketti toimittaa käyttöliittymälle työn tilannetietojen näyttämisen työympäristössä ja määrittää lisätuen töille, jotka ajetaan käyttöliittymän säikeessä.
Aluksi tarkastellaan erilaisia mahdollisesti ajossa olevia taustatoimintoja ja sitä, miten ne näkyvät työympäristön käyttöliittymässä:
Käyttäjän aloittamia töitä ovat ne, jotka käyttäjä on laukaissut. Työympäristö näyttää automaattisesti käyttäjän työt modaalisessa tilannetietojen valintaikkunassa. Ikkunassa olevan painikkeen avulla käyttäjä voi ajaa toiminnon taustalla ja jatkaa työskentelyä. Yleisoletuksella osoitetaan, tuleeko käyttäjän työt ajaa aina taustalla. Käyttäjän työt eritellään käyttäjän töiksi Job-sovellusohjelmaliittymässä (Job#setUser)-metodilla. Käyttäjän töitä ovat esimerkiksi koonti, projektin uloskuittaus, synkronointi tietovaraston kanssa, lisäosan vienti ja haku.
Automaattisesti liipaistuilla töillä on merkitystä käyttäjille, mutta ne eivät ole käyttäjän aloittamia. Nämä työt näkyvät tilannetietonäkymässä ja tilarivillä, mutta modaalista tilannetietojen valintaikkunaa ei tuoda näyttöön niiden ajon yhteydessä. Niitä ovat esimerkiksi automaattinen koonti ja ajoitettu synkronointi.
Järjestelmän toiminnot eivät ole käyttäjän liipaisemia, ja niitä voidaan pitää ympäristön toteutustietoina. Nämä työt luodaan asettamalla järjestelmämäärite (Job#setSystem)-metodilla. Järjestelmän töitä ovat esimerkiksi työt, jotka täyttävät tarvittaessa widget-objekteja tai laskevat näkymien koristeluja ja huomautuksia.
Kun ympäristössä voi tapahtua samaan aikaan useita asioita, käyttäjä tarvitsee
ilmoituksen siitä, että pitkäkestoinen toiminto on alkanut.
Käyttäjän työt näytetään käyttäjälle tilannetietojen valintaikkunassa, jossa on välitöntä palautetta, kun taas automaattisesti liipaistut työt näkyvät tilarivillä ja tilannetietonäkymässä. Työt, jotka vaikuttavat osaan, tulee ajoittaa tai rekisteröidä osaan niin, että työympäristö voi antaa käyttäjälle vihjeitä siitä, että taustalla on ajossa jotain, joka vaikuttaa osaan.
ilmoituksen siitä, että toiminto on päättynyt.
Käyttäjä saa helposti tietää, milloin käyttäjän työ päättyy, sillä tilannetietojen valintaikkuna sulkeutuu. Muille kuin käyttäjän töille on muutamia palautetoimintoja. Jos työ on ajoitettu tai rekisteröity osaan, osan tilannetietojen vihje näkyy, kun se on valmis. Jos työ palauttaa virheen, virheilmaisin tulee näkyviin tilannerivin oikeaan alareunaan osoituksena siitä, että on ilmennyt virhe.
ilmoituksen kiinnostavista uusista tuloksista tai uusista tiedoista viemättä tarkennusta valintaikkunalla.
Käyttäjän työ voi näyttää tulokset suoraan käyttäjälle, kun toiminto on valmis. Muiden kuin käyttäjän töiden suhteen on suositeltavaa käyttää tulosten näyttämiseen jotakin muuta kuin valintaikkunaa, ettei käyttäjää keskeytetä. Esimerkiksi näkymän voi avata, kun työ alkaa, ja tulokset voidaan näyttää kyseisessä näkymässä häiritsemättä käyttäjän käsittelyreittiä. Lisäksi työhön voi lisätä työn ominaisuuksia osoituksena siitä, että se tulee pitää tilannetietonäkymässä ja että se toimittaa tulokset näyttävän toiminnon. Tällöin varoitusilmaisin tulee tilarivin oikeaan alareunaan, kun työ on tilannetietonäkymässä ja sillä on käyttäjälle näytettäviä tuloksia.
tuntemuksen siitä, että hallitsee ajossa olevan, ja mahdollisuuden valvoa ja peruuttaa taustatoimintoja.
Kläyttäjän työt antavat käyttäjälle eniten mahdollisuuksia ohjaukseen, sillä ne voi helposti peruuttaa. Ne kertovat selvästi ajossa olevista lukitsevista tai samanaikaisista toiminnoista tilannetietojen valintaikkunan Lisätiedot-välilehdellä. Huomaa, että Lisätiedot-välilehden toimittava parannettu tilannetietojen valintaikkuna näkyy vain, kun lisäosat käyttävät IProgressService#busyCursorWhile- tai IProgressService#runInUI-metodia.
Lisäksi tilannetietonäkymästä pääsee ajossa oleviin töihin.
yhdenmukaisen ilmoituksen kaikkien asennettujen lisäosien tilannetiedoista.
Tilannetietopalvelun sovellusohjelmaliittymän käytön etuna on, että käyttäjät saavat yhdenmukaiset tilannetiedot.
Työympäristön tilannetietopalvelu (IProgressService) on ensisijainen rajapinta työympäristön tilannetietojen tuelle. Sen voi poimia työympäristöstä ja käyttää sitten näyttämään tilannetiedot sekä taustatoiminnoista että toiminnoista, jotka ajetaan käyttöliittymän säikeessä. Tämän luokan pääasiallisena tarkoituksena on tuottaa hyvät toimintojen ajomahdollisuudet, jolloin lisäosien kehittäjien ei tarvitse päättää, mitä mekanismia käytetään tilannetietojen näyttämiseen tietyssä tilanteessa. Etuna on myös se, että näillä metodeilla näyttöön tuotu tilannetietojen valintaikkuna tukee hyvin osoitusta siitä, milloin toinen toiminto lukitsee toiminnon, jolloin käyttäjä voi ratkaista ristiriidan. Pitkäkestoiset toiminnot tulisi ajaa IProgressService#busyCursorWhile-metodilla, jos se on mahdollista:
IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); progressService.busyCursorWhile(new IRunnableWithProgress(){ public void run(IProgressMonitor monitor) { //tee käyttöliittymään liittymätöntä työtä } });
Tämä metodi tulostaa aluksi varatun kohdistimen ja korvaa sen sitten tilannetietojen valintaikkunalla, jos toiminto kestää määritettyä aikaa kauemmin. Tämän metodin etuna tilannetietojen valintaikkunaan verrattuna on, että tilannetietojen valintaikkunaa ei näytetä, jos toiminto on lyhytaikainen. Jos toiminnon on päivitettävä käyttöliittymä, voit aina ajaa käyttöliittymää muuttavan koodin Display.asyncExec- tai Display.syncExec-metodilla.
Jos toiminto on ajettava kokonaan käyttöliittymän säikeessä, tulee käyttää IProgressService#runInUI-metodia. Tämä metodi tuo näyttöön myös tilannetietojen valintaikkunan, jos toiminto on lukittu, ja antaa hallinnan käyttäjälle.
progressService.runInUI( PlatformUI.getWorkbench().getProgressService(), new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { //tee käyttöliittymään liittyvää työtä } }, Platform.getWorkspace().getRoot());
Kolmas parametri voi olla null tai toiminnon ajoitussääntö. Tässä esimerkissä määritetään työympäristön juuri, joka lukitsee työympäristön tämän käyttöliittymätoiminnon ajon ajaksi.
Voit rekisteröidä tilannetietopalvelun sisältävälle työperheelle myös kuvakkeen niin, että tilannetietonäkymä voi näyttää kuvakkeen ajossa olevan perheen vieressä. Seuraavasta esimerkistä näkyy, miten automaattisen koonnin työperhe liitetään kuvakkeeseensa:
IProgressService service = PlatformUI.getWorkbench().getProgressService(); ImageDescriptor newImage = IDEInternalWorkbenchImages.getImageDescriptor( IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC); service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_MANUAL_BUILD); service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_AUTO_BUILD);
IWorkbenchSiteProgressService sisältää sovellusohjelmaliittymän sellaisten töiden ajoitusta varten, jotka muuttavat työympäristön osan ulkoasua työn ajon aikana. Jos lisäosa ajaa taustatoimintoja, jotka vaikuttavat osan tilaan, voit ajoittaa työn osan kautta, ja käyttäjä saa palautteen siitä, että osa on varattu. Esimerkki:
IWorkbenchSiteProgressService siteService = (IWorkbenchSiteProgressService)view.getSite().getAdapter(IWorkbenchSiteProgressService.class); siteService.schedule(job, 0 /* now */, true /* use the half-busy cursor in the part */);
Työympäristö määrittää töiden tilannetietoja koskevat ominaisuudet IProgressConstants-rajapinnassa. Niiden avulla voi ohjata, miten työ näkyy tilannetietonäkymässä. Niiden avulla voi määrätä tilannetietonäkymän pitämään (IProgressConstants#KEEP_PROPERTY) työn näkymässä sen päättymisen jälkeen tai pitämään yhden(IProgressConstants#KEEPONE_PROPERTY) työn kerrallaan näkymässä. Voit myös liittää toiminnon (IProgressConstants#ACTION_PROPERTY) työhön. Kun työhön on liitetty toiminto, tilannetietonäkymässä näkyy hyperlinkki, jolla käyttäjä voi ajaa toiminnon. Voit myös selvittää, näkyykö käyttäjän työ parhaillaan tilannetietojen valintaikkunassa (IProgressConstants#PROPERTY_IN_DIALOG). Tilarivin oikeassa alareunassa on vihje, kun toiminto on käytettävissä. Seuraava esimerkki käyttää näitä ominaisuuksia:
Job job = new Job("Do Work") { public IStatus run(IProgressMonitor monitor) { // tee jotain työtä. // Pidä valmis työ tilannetietonäkymässä vain, jos ei ole ajossa tilannetietojen valintaikkunassa Boolean inDialog = (Boolean)getProperty(IProgressConstants.PROPERTY_IN_DIALOG); if(!inDialog.booleanValue()) setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); } }; job.setProperty(IProgressConstants.ICON_PROPERTY, Plugin.getImageDescriptor(WORK_IMAGE)); IAction gotoAction = new Action("Results") { public void run() { // näytä tulokset } }; job.setProperty(IProgressConstants.ACTION_PROPERTY, gotoAction); job.setUser(true); job.schedule();
Pitkäkestoiset toiminnot tulisi tehdä käyttöliittymän säikeen ulkopuolella, jos se on mahdollista. Tätä ei voi kuitenkaan aina välttää, kun toiminnon tarkoituksena on päivittää käyttöliittymä. Ohjeaiheessa SWT-säikeet kerrotaan, miten tämän voi tehdä SWT-näytön avulla. Työympäristö määrittää erityisen työn UIJob, jonka ajometodi ajetaan SWT asyncExec -metodin sisällä. UIJob-työn aliluokkien tulee toteuttaa runInUIThread-metodi run-metodin sijaan.
WorkbenchJob laajentaa UIJob-luokan niin, että työn voi ajoittaa tai ajaa vain silloin, kun työympäristö on ajossa. Kuten aina, käyttöliittymän säikeen liiallista työtä tulee välttää, sillä käyttöliittymä ei päivity käyttöliittymätyön aikana.