com.aptana.ui.dialogs.SudoPasswordPromptDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ui.dialogs.SudoPasswordPromptDialog.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2012 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ui.dialogs;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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;
import org.eclipse.swt.widgets.Text;

import com.aptana.core.util.StringUtil;
import com.aptana.ui.IDialogConstants;
import com.aptana.ui.UIPlugin;

/**
 * This password prompt dialog tries to mimic the native mac password prompt dialog.
 * 
 * @author pinnamuri
 */
public class SudoPasswordPromptDialog extends Dialog {

    private Text pwdText;
    private Shell shell;
    private char[] password;

    private static final String MAC_DIALOG_FONT = "Lucida Grande"; //$NON-NLS-1$
    private static final int MAC_DIALOG_FONT_SIZE = 13;
    private String promptMessage;
    private static final String SECURITY_IMAGE = "/icons/full/security.png"; //$NON-NLS-1$

    public SudoPasswordPromptDialog(IShellProvider parentShell, String promptMessage) {
        super(parentShell);
        this.promptMessage = promptMessage + " " + Messages.SudoPasswordPromptDialog_MessagePrompt_Suffix; //$NON-NLS-1$
    }

    @Override
    protected void configureShell(Shell newShell) {
        this.shell = newShell;
        newShell.setLayout(new GridLayout());
    }

    @Override
    protected void okPressed() {
        password = pwdText.getText().toCharArray();
        super.okPressed();
    }

    public char[] getPassword() {
        return password;
    }

    @Override
    protected Point getInitialSize() {
        // Trying to get the size of the dialog similar to mac sudo prompt dialog.
        Point computeSize = shell.computeSize(440, SWT.DEFAULT);
        return computeSize;
    }

    @Override
    protected void initializeBounds() {
        super.initializeBounds();
        pwdText.setFocus();
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        FontData msgPromptFontData = new FontData(MAC_DIALOG_FONT, MAC_DIALOG_FONT_SIZE, SWT.BOLD);
        final Font msgPromptFont = new Font(shell.getDisplay(), msgPromptFontData);

        // ----------------------------------------------------------
        // Composite for the header and prompt message.
        parent.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).equalWidth(false).create());
        parent.setFont(msgPromptFont);

        Label authImageLbl = new Label(parent, SWT.None);
        final Image authImage = UIPlugin.getImageDescriptor(SECURITY_IMAGE).createImage(); //$NON-NLS-1$
        authImageLbl.setImage(authImage);

        Label promptMsg = new Label(parent, SWT.WRAP);
        promptMsg.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, true).align(SWT.BEGINNING, SWT.BEGINNING).create());
        promptMsg.setFont(parent.getFont());
        promptMsg.setText(promptMessage);

        // ----------------------------------------------------------
        // Now laying out UserName and Password fields.
        new Label(parent, SWT.NONE); // Dummy label to fill in.

        FontData fieldsFontData = new FontData(MAC_DIALOG_FONT, MAC_DIALOG_FONT_SIZE, SWT.NORMAL);
        final Font fieldsFont = new Font(shell.getDisplay(), fieldsFontData);

        Composite authDetails = new Composite(parent, SWT.None);
        authDetails.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).equalWidth(false).create());
        authDetails.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).create());
        authDetails.setFont(fieldsFont);

        Composite labels = new Composite(authDetails, SWT.None);
        labels.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).equalWidth(true).create());

        Composite fieldsComp = new Composite(authDetails, SWT.None);
        fieldsComp.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).equalWidth(true).create());
        fieldsComp.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, true).align(SWT.FILL, SWT.BEGINNING).create());

        Label nameLbl = new Label(labels, SWT.None);
        nameLbl.setText(StringUtil.makeFormLabel(Messages.SudoPasswordPromptDialog_User));
        nameLbl.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, false).align(SWT.END, SWT.BEGINNING).create());
        nameLbl.setFont(authDetails.getFont());

        Text nameText = new Text(fieldsComp, SWT.BORDER | SWT.READ_ONLY);
        nameText.setLayoutData(GridDataFactory.swtDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).create());
        nameText.setText(System.getProperty("user.name")); //$NON-NLS-1$
        nameText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));

        Label pwdLbl = new Label(labels, SWT.None);
        pwdLbl.setText(StringUtil.makeFormLabel(Messages.SudoPasswordPromptDialog_Password));
        pwdLbl.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, false).align(SWT.END, SWT.BEGINNING).create());
        pwdLbl.setFont(authDetails.getFont());

        pwdText = new Text(fieldsComp, SWT.BORDER | SWT.PASSWORD);
        pwdText.setLayoutData(GridDataFactory.swtDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).create());

        shell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                if (authImage != null) {
                    authImage.dispose();
                }
                if (msgPromptFont != null) {
                    msgPromptFont.dispose();
                }
                if (fieldsFont != null) {
                    fieldsFont.dispose();
                }
            }
        });

        return parent;
    }

    @Override
    protected Control createButtonBar(Composite parent) {
        new Label(parent, SWT.None);
        Composite buttonsComp = new Composite(parent, SWT.None);
        // Intentionally make the numOfColmnns to 0 as they will be incremented in createButton methods.
        buttonsComp.setLayout(GridLayoutFactory.fillDefaults().numColumns(0).equalWidth(true).create());
        buttonsComp.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, true).align(SWT.END, SWT.BEGINNING).create());

        createButton(buttonsComp, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

        Button okBtn = createButton(buttonsComp, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        okBtn.setLayoutData(
                GridDataFactory.swtDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).create());
        return parent;
    }
}