När en standarddialogruta är för enkel för ditt insticksprogram kan du bygga en egen dialogruta med hjälp av klassen Dialog. Tidigare såg vi hur Readme-verktyget la till en "Öppna Readme-webbläsare"-åtgärd i en åtgärdsuppsättning. Denna åtgärdsuppsättning visas i arbetsmiljöns verktygsfält och i menyn för Fönster->Readme-filredigerare.
Nu kan vi titta närmare på implementeringen av denna åtgärd i Readme-verktygets WindowActionDelegate.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
I fönsteråtgärdsdelegaten för åtgärdsuppsättningen används aktuellt urval i resursnavigatorsvyn ( .readme-filen) för att få en lista över sektioner i readme-filen. Denna lista och arbetsmiljöns fönsterskal skickas till SectionsDialog.
När användaren väljer åtgärden, öppnas SectionsDialog.
SectionsDialog implementeras i insticksprogrammet för readme-verktyget genom att klassen Dialog subklassas i paketet org.eclipse.jface.dialogs.
Klassen Dialog ger grundstöd för att bygga ett dialogskalfönster, skapa gemensamma dialogknappar och öppna dialogrutan. Subklasserna ansvarar för hantering av innehållet i själva dialogrutan:
SectionsDialog skapar en SWT-lista för att visa listan över sektionerna. Ett JFace-visningsprogram används här för att fylla på listan. (JFace-visningsprogram beskrivs under Visningsprogram.) Observera att vår dialogruta inte behöver skapa några dialogknappar eftersom det görs av vår superklass.
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")); ... }
Dialogrutor kan vara hur enkla eller komplicerade som helst. När du implementerar en dialogruta, handlar den största delen av dialogkoden om skapandet av SWT-kontrollerna som representerar dess innehållsområde och hanteringen av händelser som erfordras när dialogrutan är öppen. När en användare trycker på en knapp, kan dialogrutan fråga efter status hos de olika kontrollerna (eller visningsprogram) som utgör dialogrutan för att bestämma vad som ska göras.
Det kan hända att du vill visa information om något i ett fönster men på ett sätt som är mer "lättvindigt" än att en vanlig dialogruta öppnas. Ett fönster kan vara ämnat att ge tillfällig information som användaren enkelt kan ignorera utan att bli distraherad i arbetet. I det fallet kan du använda klassen PopupDialog till att implementera meddelandefönstret. Ett meddelandefönster skiljer sig utseendemässigt från en vanlig dialogruta på flera sätt. Det finns inte några knappar längst ned i fönstret eller någon standardnamnlist och fönsterram, mellanrum och teckensnitt är mindre och kompaktare.
Trots att en PopupDialog ser väldigt annorlunda ut jämfört med en vanlig dialogruta är den kod i insticksprogrammets underklass som definierar dialogruteinnehållet nästan densamma. Du implementerar också createDialogArea-metoden för att skapa SWT-kontroller för dialogrutan. Den huvudsakliga skillnaden i tillämpningskoden är att den konstruktor som skapar dialogrutan har många fler parametrar än den vanliga Dialog-klassen. Till exempel kan SectionsDialog skapas om till en PopupDialog genom att superklassen för dialogrutan ändras och dialogrutan konfigureras i konstruktorn:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * En ny SectionsDialog skapas. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // tar inte fokus när den öppnas false, // behåller inte gränserna false, // visar inte en meny för storleksändring false, // visar inte ett menyalternativ för att behålla gränser null, // inget namn null); // ingen informationstext this.input = input; } ...