/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.dialog;
import java.util.*;
import org.eclipse.swt.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.Assert;
import org.jboss.tools.common.model.ServiceDialog;
public class MessageAndCheckboxDialog extends MessageDialog {
public static String MESSAGE = ServiceDialog.DIALOG_MESSAGE;
public static String CHECKBOX_MESSAGE = ServiceDialog.CHECKBOX_MESSAGE;
public static String CHECKED = ServiceDialog.CHECKED;
public static String BUTTONS = ServiceDialog.BUTTONS;
public static String SEPARATOR = ServiceDialog.SEPARATOR;
public static String TITLE = "title"; //$NON-NLS-1$
public static String RETURN_CODE = ServiceDialog.RETURN_CODE;
Button button;
Button[] buttons = new Button[0];
Properties properties;
int lastButton = -1;
public MessageAndCheckboxDialog(Shell parentShell, String dialogTitle, int dialogImageType, Properties p) {
super(parentShell, dialogTitle, null, p.getProperty(MESSAGE), dialogImageType, createButtonLabels(p), 0);
properties = p;
}
static String[] createButtonLabels(Properties p) {
String[] buttons = (String[])p.get(BUTTONS);
if(buttons == null) return new String[]{IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL};
String[] bs = new String[buttons.length];
for (int i = 0; i < bs.length; i++) {
bs[i] = JFaceResources.getString(buttons[i]);
if(bs[i] == null) bs[i] = buttons[i];
}
return bs;
}
public static boolean openConfirm(Shell parent, Properties p) {
Assert.isNotNull(p);
Assert.isNotNull(p.getProperty(MESSAGE), "Property " + MESSAGE + " is null"); //$NON-NLS-1$ //$NON-NLS-2$
Assert.isNotNull(p.getProperty(CHECKBOX_MESSAGE), "Property " + CHECKBOX_MESSAGE + " is null"); //$NON-NLS-1$ //$NON-NLS-2$
Assert.isTrue(p.get(CHECKED) instanceof Boolean, "Property " + CHECKED + " must have type Boolean"); //$NON-NLS-1$ //$NON-NLS-2$
String title = p.getProperty("title", "Confirmation"); //$NON-NLS-1$
MessageAndCheckboxDialog dialog = new MessageAndCheckboxDialog(parent, title, QUESTION, p);
int result = dialog.open();
p.put(RETURN_CODE, Integer.valueOf(result));
return result == 0;
}
protected Control createCustomArea(Composite parent) {
String b1 = properties.getProperty(CHECKBOX_MESSAGE + "_1"); //$NON-NLS-1$
if(b1 == null) return button = createCheckBox(parent, ""); //$NON-NLS-1$
return createMultiCheckBox(parent);
}
protected Button createCheckBox(Composite parent, String suffix) {
Button b = new Button(parent, SWT.CHECK);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
if(getImage() != null)
data.horizontalIndent = getImage().getImageData().width + 8;
b.setLayoutData(data);
b.setText(properties.getProperty(CHECKBOX_MESSAGE + suffix));
b.setSelection(((Boolean)properties.get(CHECKED + suffix)).booleanValue());
return b;
}
protected Control createMultiCheckBox(Composite parent) {
Composite c = new Composite(parent, SWT.NONE);
c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout l = new GridLayout();
l.marginWidth = 0;
l.marginHeight = 11;
c.setLayout(l);
button = createCheckBox(c, ""); //$NON-NLS-1$
ArrayList<Button> list = new ArrayList<Button>();
int i = 1;
while(true) {
String suffix = "_" + i; //$NON-NLS-1$
if(properties.getProperty(CHECKBOX_MESSAGE + suffix) == null) break;
if(properties.getProperty(SEPARATOR + suffix) != null) {
// actually here we should only call
// createSeparator(parent, true);
// breaking would be performed
// on another property LAST + suffix
// it is not implemented while we have
// the only case for this dialog.
lastButton = i;
break;
}
Button b = createCheckBox(c, suffix);
list.add(b);
++i;
}
buttons = list.toArray(new Button[0]);
return c;
}
private void createSeparator(Composite parent, boolean indent) {
Label lb = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
if(indent && getImage() != null)
data.horizontalIndent = getImage().getImageData().width + 8;
lb.setLayoutData(data);
}
private void createSpace(Composite parent, int height) {
Label lb = new Label(parent, SWT.HORIZONTAL);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.heightHint = height;
lb.setLayoutData(data);
}
protected void buttonPressed(int buttonId) {
properties.put(CHECKED, Boolean.valueOf(button.getSelection()));
for (int i = 0; i < buttons.length; i++) {
properties.put(CHECKED + "_" + (i + 1), Boolean.valueOf(buttons[i].getSelection())); //$NON-NLS-1$
}
super.buttonPressed(buttonId);
}
protected Control createButtonBar(Composite parent) {
if(lastButton < 0) return super.createButtonBar(parent);
Composite vcomposite = new Composite(parent, SWT.NONE);
GridLayout vl = new GridLayout(1, false);
vl.marginHeight = 0;
vl.marginWidth = 0;
vl.verticalSpacing = 0;
vcomposite.setLayout(vl);
GridData d = new GridData(GridData.FILL_HORIZONTAL);
d.horizontalSpan = 2;
vcomposite.setLayoutData(d);
/// createSpace(vcomposite, 6);
createSeparator(vcomposite, false);
createSpace(vcomposite, 10);
Composite composite = new Composite(vcomposite, SWT.NONE);
GridLayout l = new GridLayout(2, false);
l.marginHeight = 0;
l.marginWidth = 0;
l.verticalSpacing = 0;
composite.setLayout(l);
GridData data = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.FILL_HORIZONTAL);
composite.setLayoutData(data);
Button b = createCheckBox(composite, "_" + lastButton); //$NON-NLS-1$
b.setLayoutData(new GridData());
Button[] bs = new Button[buttons.length + 1];
System.arraycopy(buttons, 0, bs, 0, buttons.length);
bs[buttons.length] = b;
buttons = bs;
Composite w = new Composite(composite, SWT.NONE);
GridLayout wl = new GridLayout(2, false);
wl.marginHeight = 0;
wl.marginWidth = 0;
wl.horizontalSpacing = 0;
wl.verticalSpacing = 0;
w.setLayout(wl);
w.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Control c = super.createButtonBar(w);
c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_HORIZONTAL));
return vcomposite;
}
}