/* * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.eclipse.lambda.upload.wizard.dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; abstract class AbstractInputDialog extends TitleAreaDialog { private final String title; private final String message; private final String messageDuringAction; private final String inputFieldLabel; private final String defaultInputValue; private Text inputText; private ProgressBar progressBar; /** * We store it memory so that we still have access to the input if the text * field has been disposed. */ protected String inputValue; /** * Invoked after the user clicks OK button. Note this method is not called * in the main thread. So any UI update in this method should be guarded by * Display.syncExec or Display.asyncExec. */ protected abstract void performFinish(String input); protected AbstractInputDialog(Shell parentShell, String title, String message, String messageDuringAction, String inputFieldLabel, String defaultInputValue) { super(parentShell); this.title = title; this.message = message; this.messageDuringAction = messageDuringAction; this.inputFieldLabel = inputFieldLabel; this.defaultInputValue = defaultInputValue; inputValue = defaultInputValue; } @Override public void create() { super.create(); setTitle(title); setMessage(message, IMessageProvider.NONE); } @Override protected Control createDialogArea(Composite parent) { Composite area = (Composite) super.createDialogArea(parent); Composite container = new Composite(area, SWT.NONE); container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout layout = new GridLayout(2, false); layout.marginTop = 20; layout.verticalSpacing = 40; container.setLayout(layout); Label label = new Label(container, SWT.NONE); label.setText(inputFieldLabel); inputText = new Text(container, SWT.BORDER); GridData gridData = new GridData(GridData.FILL_HORIZONTAL); inputText.setLayoutData(gridData); inputText.setText(defaultInputValue); inputText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent arg0) { inputValue = inputText.getText(); if (inputValue.isEmpty()) { getButton(IDialogConstants.OK_ID).setEnabled(false); } else { getButton(IDialogConstants.OK_ID).setEnabled(true); } } }); progressBar = new ProgressBar(container, SWT.INDETERMINATE); progressBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridData gd = new GridData(SWT.FILL, SWT.BOTTOM, true, false); gd.horizontalSpan = 2; progressBar.setLayoutData(gd); progressBar.setVisible(false); return container; } @Override protected void okPressed() { setErrorMessage(null); setMessage(messageDuringAction); getButton(IDialogConstants.OK_ID).setEnabled(false); getButton(IDialogConstants.CANCEL_ID).setEnabled(false); progressBar.setVisible(true); new Thread(new Runnable() { public void run() { try { performFinish(AbstractInputDialog.this.inputValue); } catch (final Exception e) { // hide progress bar Display.getDefault().syncExec(new Runnable() { public void run() { setErrorMessage(e.getMessage()); progressBar.setVisible(false); getButton(IDialogConstants.OK_ID).setEnabled(true); getButton(IDialogConstants.CANCEL_ID).setEnabled(true); } }); return; } Display.getDefault().syncExec(new Runnable() { public void run() { AbstractInputDialog.super.okPressed(); } }); } }).start(); } }