blob: b78a5f22c3662430f60bad34cd11e8ca1a464557 [file] [log] [blame]
/**
* Copyright (c) 2012, 2019 Mia-Software and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Alban Ménager (Soft-Maint) - Bug 387470 - [EFacet][Custom] Editors
* Grégoire Dupé (Mia-Software) - Bug 387470 - [EFacet][Custom] Editors
*/
package org.eclipse.modisco.facet.util.ui.internal.exported.util.dialog;
import org.eclipse.core.commands.Command;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.modisco.facet.util.ui.internal.exported.WidgetProperties;
import org.eclipse.modisco.facet.util.ui.internal.exported.dialog.IDialog;
import org.eclipse.modisco.facet.util.ui.internal.exported.util.widget.command.ICommandWidget;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
/**
* Abstract class representing a dialog. Some methods are implemented to avoid
* unnecessary duplication code.
*
* @param <CB>
* The type of the callback.
* @param <P>
* The type of the key of the {@link WidgetProperties}
* @since 0.3
*/
public abstract class AbstractDialog<CB extends Object, W extends ICommandWidget>
extends TitleAreaDialog implements IDialog<W> {
// Attributes.
private W widget;
private Composite dialogComposite;
private CB callback;
/**
* Constructor.
*
* @param callback
* the callback
* @param properties
* the properties that the widget needs
*/
protected AbstractDialog(final CB callback) {
this();
this.callback = callback;
}
/**
* Constructor.
*/
protected AbstractDialog() {
super(createDisplayedShell());
}
private static Shell createDisplayedShell() {
final Display display = Display.getDefault();
final Shell shell = new Shell(display);
final Monitor primary = display.getPrimaryMonitor();
final Rectangle bounds = primary.getBounds();
final Rectangle rect = shell.getBounds();
final int xLocation = bounds.x + ((bounds.width - rect.width) / 2);
final int yLocation = bounds.y + ((bounds.height - rect.height) / 2);
shell.setLocation(xLocation, yLocation);
return shell;
}
/**
* Execute the widget {@link Command}.
*/
protected abstract void execute();
/**
* Check if all the required attributes are setted ({@link #isDialogValid()}
* and call the method {@link #execute()} to get and execute the widget
* command. If the dialog is not valid, this method display the errors with
* the method {@link #setErrorMessage(String)}.
*/
@Override
protected void okPressed() {
if (isDialogValid()) {
getWidget().onDialogValidation();
execute();
super.okPressed();
} else {
setErrorMessage(getWidget().getError());
}
}
/**
* Set the title and the message dialog. Create the associated widget and
* all sub widgets of this widget.
*/
@Override
protected Control createDialogArea(final Composite parent) {
setTitle(getDialogTitle());
setMessage(getDialogMessage());
// Composite is a subtype of Control.
this.dialogComposite = (Composite) super.createDialogArea(parent);
this.widget = createWidget();
this.widget.createWidgetContent();
return this.widget.adapt(Control.class);
}
public Composite getDialogComposite() {
return this.dialogComposite;
}
/**
* Create the associated widget to the dialog.
*
* @return an instance of the widget.
*/
protected abstract W createWidget();
/**
* Return the message at the top of the dialog.
*
* @return the message.
*/
protected abstract String getDialogMessage();
/**
* Return the title of the dialog.
*
* @return the title.
*/
protected abstract String getDialogTitle();
public boolean isDialogValid() {
boolean result = true;
final String error = getWidget().getError();
if (error != null) {
result = false;
}
return result;
}
public W getWidget() {
return this.widget;
}
public void commit() {
okPressed();
}
public void cancel() {
cancelPressed();
}
/**
* @return the callback
*/
public CB getCallback() {
return this.callback;
}
}