package org.xmind.ui.internal.editor;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Path;
import org.eclipse.swt.graphics.Rectangle;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.Page;
public abstract class DialogPane extends Page implements IDialogPane {
private static final float CORNER_OFFSET = 20;
private static final float CORNER_CONTROL_OFFSET = 5;
private static final String DEFAULT_BUTTON_TRIGGER_EVENT_ID = "DEFAULT_BUTTON_TRIGGER_EVENT_ID"; //$NON-NLS-1$
private int returnCode = OK;
private IDialogPaneContainer paneContainer;
private Map<Integer, Button> buttons;
private int defaultButtonId = -1;
private Font defaultFont;
private Composite container;
private Listener defaultButtonListener;
private Listener escapeKeyListener;
public void init(IDialogPaneContainer paneContainer) {
this.paneContainer = paneContainer;
}
protected IDialogPaneContainer getPaneContainer() {
return paneContainer;
}
public void createControl(Composite parent) {
this.container = new Composite(parent, SWT.NONE);
container.setBackground(parent.getDisplay().getSystemColor(
SWT.COLOR_LIST_BACKGROUND));
paintCornersFor(container, parent.getBackground());
GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, true, true);
gridData.widthHint = getPreferredWidth();
gridData.heightHint = SWT.DEFAULT;
container.setLayoutData(gridData);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 30;
gridLayout.marginHeight = 20;
gridLayout.marginTop = 10;
gridLayout.verticalSpacing = 20;
gridLayout.horizontalSpacing = 0;
container.setLayout(gridLayout);
Control contents = createDialogContents(container);
GridData gridData2 = new GridData(SWT.FILL, SWT.FILL, true, false);
gridData2.widthHint = SWT.DEFAULT;
gridData2.heightHint = SWT.DEFAULT;
contents.setLayoutData(gridData2);
createButtonBar(container);
container.addListener(SWT.Traverse, getEscapeKeyListener());
}
protected int getPreferredWidth() {
return 400;
}
protected void paintCornersFor(Composite control, final Color background) {
if (background == null)
return;
control.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Control c = (Control) e.widget;
Rectangle b = c.getBounds();
float x1 = 0;
float y1 = 0;
float x2 = x1 + b.width;
float y2 = y1 + b.height;
Path p = new Path(e.display);
p.moveTo(x1, y1);
p.lineTo(x1 + CORNER_OFFSET, y1);
p.cubicTo(x1 + CORNER_CONTROL_OFFSET, y1, x1, y1
+ CORNER_CONTROL_OFFSET, x1, y1 + CORNER_OFFSET);
p.close();
p.moveTo(x2, y2);
p.lineTo(x2 - CORNER_OFFSET, y2);
p.cubicTo(x2 - CORNER_CONTROL_OFFSET, y2, x2, y2
- CORNER_CONTROL_OFFSET, x2, y2 - CORNER_OFFSET);
p.close();
e.gc.setAntialias(SWT.ON);
e.gc.setBackground(background);
e.gc.fillPath(p);
p.dispose();
}
});
}
protected Control createDialogContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackground(parent.getBackground());
return composite;
}
protected Composite getContainer() {
return container;
}
public Control getControl() {
return container;
}
public abstract void setFocus();
public void dispose() {
if (container != null) {
container.dispose();
container = null;
}
buttons = null;
}
protected abstract void createButtonsForButtonBar(Composite buttonBar);
protected boolean buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
return okPressed();
} else if (buttonId == IDialogConstants.CLOSE_ID) {
return closePressed();
} else if (buttonId == IDialogConstants.CANCEL_ID) {
return cancelPressed();
}
return false;
}
/**
*
*/
protected boolean cancelPressed() {
return false;
}
/**
*
*/
protected boolean closePressed() {
return false;
}
/**
*
*/
protected boolean okPressed() {
return false;
}
protected void createButtonBar(Composite parent) {
Composite buttonBar = new Composite(parent, SWT.NONE);
buttonBar.setBackground(parent.getBackground());
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
gridData.widthHint = SWT.DEFAULT;
gridData.heightHint = SWT.DEFAULT;
buttonBar.setLayoutData(gridData);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.verticalSpacing = 0;
gridLayout.horizontalSpacing = 5;
buttonBar.setLayout(gridLayout);
createBlankArea(buttonBar);
createButtonsForButtonBar(buttonBar);
adjustButtonWidths(buttonBar);
}
protected void createBlankArea(Composite buttonBar) {
Label blank = new Label(buttonBar, SWT.NONE);
blank.setBackground(buttonBar.getBackground());
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.widthHint = SWT.DEFAULT;
gridData.heightHint = 1;
blank.setLayoutData(gridData);
}
protected Button createButton(Composite buttonBar, int id, String label,
boolean defaultButton) {
((GridLayout) buttonBar.getLayout()).numColumns++;
Button button = new Button(buttonBar, SWT.PUSH);
button.setText(label);
button.setFont(JFaceResources.getDialogFont());
button.setData(new Integer(id));
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
int pressId = (Integer) event.widget.getData();
buttonPressed(pressId);
// buttonPressed(((Integer) event.widget.getData()).intValue());
}
});
if (defaultButton) {
this.defaultButtonId = id;
}
if (buttons == null)
buttons = new HashMap<Integer, Button>();
buttons.put(new Integer(id), button);
setButtonLayoutData(button);
return button;
}
protected Button getButton(int id) {
return buttons == null ? null : buttons.get(id);
}
protected void setButtonLayoutData(Button button) {
GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, false);
gridData.widthHint = SWT.DEFAULT;
gridData.heightHint = SWT.DEFAULT;
button.setLayoutData(gridData);
}
private void adjustButtonWidths(Composite buttonBar) {
if (buttons == null)
return;
int maxWidth = 90;
for (Button b : buttons.values()) {
int width = b.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
maxWidth = Math.max(maxWidth, width);
}
for (Button b : buttons.values()) {
((GridData) b.getLayoutData()).widthHint = maxWidth + 2;
}
}
protected void addRefreshDefaultButtonListener(final Control focusControl) {
focusControl.addListener(SWT.FocusIn, getDefaultButtonListener());
focusControl.addListener(SWT.FocusOut, getDefaultButtonListener());
}
protected void addTriggerDefaultButtonListener(Control control,
int triggerEvent) {
control.addListener(triggerEvent, getDefaultButtonListener());
control.setData(DEFAULT_BUTTON_TRIGGER_EVENT_ID,
Integer.valueOf(triggerEvent));
}
private Listener getDefaultButtonListener() {
if (defaultButtonListener == null) {
defaultButtonListener = new Listener() {
private Button savedDefaultButton = null;
public void handleEvent(Event event) {
Object triggerEvent = event.widget
.getData(DEFAULT_BUTTON_TRIGGER_EVENT_ID);
if (triggerEvent instanceof Integer
&& event.type == ((Integer) triggerEvent)
.intValue()) {
triggerDefaultButton();
return;
}
if (event.type == SWT.FocusIn) {
changeDefaultButton();
} else if (event.type == SWT.FocusOut) {
restoreDefaultButton();
}
}
private void restoreDefaultButton() {
if (defaultButtonId >= 0) {
Shell shell = container.getShell();
if (savedDefaultButton != null
&& savedDefaultButton.isDisposed()) {
savedDefaultButton = null;
}
shell.setDefaultButton(savedDefaultButton);
}
}
private void changeDefaultButton() {
if (defaultButtonId >= 0) {
final Shell shell = container.getShell();
savedDefaultButton = shell.getDefaultButton();
shell.getDisplay().asyncExec(new Runnable() {
public void run() {
Button button = getButton(defaultButtonId);
if (button != null && !button.isDisposed()) {
shell.setDefaultButton(button);
}
}
});
}
}
};
}
return defaultButtonListener;
}
private Listener getEscapeKeyListener() {
if (escapeKeyListener == null) {
escapeKeyListener = new Listener() {
public void handleEvent(Event event) {
if (isEscapeKeyPressed(event)) {
escapeKeyPressed();
event.doit = false;
}
}
private boolean isEscapeKeyPressed(Event event) {
return (event.type == SWT.Traverse && event.detail == SWT.TRAVERSE_ESCAPE)
|| (event.type == SWT.KeyDown
&& event.keyCode == SWT.ESC && event.stateMask == 0);
}
};
}
return escapeKeyListener;
}
protected void escapeKeyPressed() {
triggerButton(IDialogConstants.CANCEL_ID);
}
protected Button getDefaultButton() {
if (buttons != null && defaultButtonId >= 0) {
return getButton(defaultButtonId);
}
return null;
}
protected void triggerDefaultButton() {
triggerButton(defaultButtonId);
}
protected boolean triggerButton(int buttonId) {
if (buttonId >= 0) {
Button button = getButton(buttonId);
if (button != null && !button.isDisposed() && button.isEnabled()) {
return buttonPressed(buttonId);
}
}
return false;
}
protected void applyFont(Control control) {
if (defaultFont != null) {
control.setFont(defaultFont);
}
}
protected void hookText(final Text text) {
text.addListener(SWT.FocusIn, new Listener() {
public void handleEvent(Event event) {
text.selectAll();
}
});
}
public void setDefaultFont(Font font) {
this.defaultFont = font;
}
protected void relayout() {
if (container == null || container.isDisposed())
return;
container.getParent().layout(true);
}
public void setReturnCode(int code) {
this.returnCode = code;
}
public int getReturnCode() {
return returnCode;
}
protected boolean close() {
return paneContainer.close();
}
}