Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "Eclipse Plug-in Development FAQ/TitleAreaDialogWithRadioButtons"
(→Source code) |
|||
Line 11: | Line 11: | ||
=== Source code === | === Source code === | ||
<source lang="java"> | <source lang="java"> | ||
+ | /******************************************************************************* | ||
+ | * Copyright (c) 2014 Red Hat, Inc. | ||
+ | * All rights reserved. This program and the accompanying materials | ||
+ | * are made available under the terms of the Eclipse Public License v1.0 | ||
+ | * which accompanies this distribution, and is available at | ||
+ | * http://www.eclipse.org/legal/epl-v10.html | ||
+ | * | ||
+ | * Contributors: | ||
+ | * lufimtse : Leo Ufimtsev lufimtse@redhat.com | ||
+ | *******************************************************************************/ | ||
+ | |||
//package org.eclipse.linuxtools.profiling.ui; //Set to your own package. | //package org.eclipse.linuxtools.profiling.ui; //Set to your own package. | ||
Line 151: | Line 162: | ||
} | } | ||
</source> | </source> | ||
− | |||
=== Example usage === | === Example usage === |
Revision as of 11:14, 20 June 2014
Title Area Dialog With Radio Buttons
This is useful if you need to ask the user to choose one of multiple options instead of a 'yes/no'.
It also looks cleaner than having multiple buttons at the bottom of the screen.
When instantiated, it looks like this:
Source code
/******************************************************************************* * Copyright (c) 2014 Red Hat, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * lufimtse : Leo Ufimtsev lufimtse@redhat.com *******************************************************************************/ //package org.eclipse.linuxtools.profiling.ui; //Set to your own package. import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; /** <h1> Dialogue with radio options. <h1> * <p> This is useful if you need to ask the user to choose one of multiple options instead of a 'yes/no'. <br> * It also looks cleaner than having multiple buttons at the bottom of the screen. </p> * * <p> * Please see the <a href="https://wiki.eclipse.org/File:TitleAreaDialogWithRadioButtonsExample.png">Screen shot</a> * to see what it looks like.</p> * * <p> Please see * * @author lufimtse : Leo Ufimtsev lufimtse@redhat.com * */ public class TitleAreaDialogWithRadioButtons extends TitleAreaDialog { private String selectedButton; private String title, bodyMsg; private int msgType; //IMessageProvider //LTD -- create enum for this. private List<Entry<String, String>> userButtonList; // ButtonID , Button Label private List<Button> widgetButtonList; //LTD - document this bussiness. public TitleAreaDialogWithRadioButtons( Shell parentShell, String title, String bodyMsg, List<Entry<String, String>> userButtonList, int msgType) { //for type see: IMessageProvider super(parentShell); // Set the Buttons that will be used listed. this.userButtonList = userButtonList; //Set labels. this.title = title; this.bodyMsg = bodyMsg; //set type this.msgType = msgType; // avoid help button poping up. this.setHelpAvailable(false); //LTD remove this. selectedButton = null; } /** Dialogue constructor */ @Override public void create() { super.create(); //The 'Message' of a TitleArea dialogue only spans 1-2 lines. Then text is cut off. //It is not very efficient for longer messages. //Thus we utilize it as a 'title' and instaed we appeng a label to act as body. (see below). setMessage(this.title, this.msgType); //$NON-NLS-1$ //setTitle(); //not used. //Set the size of the dialogue. //We avoid hard-coding size, instead we tell it to figure out the most optimal size. //this.getShell().setSize(650, 550); //Hard-Coded = bad. this.getShell().setSize(getInitialSize()); } /** Return the buttonID of the button that the user selected if he pressed ok. * * @return ButtonID of selected button. */ public String getSelectedButton() { return selectedButton; } @Override protected Control createDialogArea(Composite parent) { Composite area = (Composite) super.createDialogArea(parent); Composite container = new Composite(area, SWT.NONE); container.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout = new GridLayout(1, false); container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); container.setLayout(layout); //Append a label to act as message body Label label = new Label(container, 0); label.setText(this.bodyMsg); //----- Add Radio buttons to dialogue. widgetButtonList = new ArrayList<>(); int ButtonCount = 1; for (Entry<String, String> usrbutton : userButtonList) { Button tmpButton = new Button(container, SWT.RADIO); tmpButton.setText(usrbutton.getValue()); if (ButtonCount == 1) { tmpButton.setSelection(true); //Make first button be auto-selected. ButtonCount++; } widgetButtonList.add(tmpButton); } return area; } // save content of the Text fields because they get disposed // as soon as the Dialog closes protected void saveInput() { //Figure out which button was selected and set 'selectedButton' to it's key. for (int i = 0; i < widgetButtonList.size(); i++) { if (widgetButtonList.get(i).getSelection()) { selectedButton = userButtonList.get(i).getKey(); } } } /** Called when the ok button is pressed */ @Override protected void okPressed() { saveInput(); // save input. super.okPressed(); // close dialogue } }
Example usage
// //-- Required imports. (some overlap with awt, use jface once): // import org.eclipse.jface.dialogs.IMessageProvider; // import org.eclipse.jface.window.Window; // import java.util.AbstractMap.SimpleEntry; // import java.util.ArrayList; // import java.util.List; // import java.util.Map.Entry; //--- Declare a list for the buttons. List<Entry<String,String>> buttonList = new ArrayList<>(); //--- Add buttons: buttonList.add(new SimpleEntry<String,String>("ButtonID", "Displayed Text for user")); //Ananomous add. buttonList.add(new SimpleEntry<String,String>("Food", "In the mood for food")); buttonList.add(new SimpleEntry<String,String>("Movie", "In the mood for watching a movie")); //--- Set Dialogue options. String title = "Title of the Dialogue"; String body = " A body message with detailed explanation of the radio button options \n" + "It can be stretched over many lines. The Dialogue resizes itself."; int msgType = IMessageProvider.INFORMATION; //Can be one of: NONE ERROR INFORMATION WARNING Shell myShell = shell; //Usually available, or use 'new Shell()' if you don't have one at hand. //--- Instantiate & open the dialogue. TitleAreaDialogWithRadioButtons myDialog = new TitleAreaDialogWithRadioButtons(shell, title, body, buttonList, msgType); int retVal = myDialog.open(); //Handle dialogue outcome. switch (retVal) { case Window.OK: //Avoid using generic '1' and '0' as it's confusing. Use defined constants as shown. System.out.println("You selected option: " + myDialog.getSelectedButton()); break; case Window.CANCEL: System.out.println("You clicked cancle"); break; default: System.out.println("Unexpected closure of dialogue."); break; }