Skip to main content

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.

Jump to: navigation, search

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:

TitleAreaDialogWithRadioButtonsExample.png

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;
            }

Back to the top