/*******************************************************************************
* 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.wizards.special;
import org.jboss.tools.common.model.ui.action.CommandBar;
import org.jboss.tools.common.model.ui.action.CommandBarLayout;
import org.jboss.tools.common.model.ui.action.CommandBarListener;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.jboss.tools.common.meta.action.impl.SpecialWizardSupport;
import org.jboss.tools.common.meta.impl.XModelEntityImpl;
import org.jboss.tools.common.model.ui.ModelUIImages;
public class DefaultSpecialWizardDialog extends TitleAreaDialog implements CommandBarListener {
public static boolean hideHelp = XModelEntityImpl.hideHelp;
private DefaultSpecialWizard wizard;
private String[] commands = new String[0];
private CommandBar commandBar = null;
private int pageWidth = 490;
private int pageHeight = 225;
private Point minimumSize = null;
private Point maximumSize = null;
public DefaultSpecialWizardDialog(Shell shell) {
super(shell);
}
protected Control stepPage;
protected Control createPage(Composite parent) {
if (stepPage!=null) {
stepPage.dispose();
stepPage = null;
}
ISpecialWizardStep wizardStep = wizard.getWizardStep();
this.setTitleImage(ModelUIImages.getImage(ModelUIImages.WIZARD_DEFAULT));
return wizardStep.createControl(parent);
}
public void updateDialogArea() {
stepPage = createPage((Composite)pageArea);
Point size = stepPage.computeSize(SWT.DEFAULT, SWT.DEFAULT);
size.x = Math.max(size.x,pageWidth);
size.y = Math.max(size.y,pageHeight);
GridData gd = (GridData)stepPage.getLayoutData();
if (gd==null) gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = size.y;
stepPage.setLayoutData(gd);
((Composite)pageArea).layout(true);
updateSizeForPage();
}
protected Control pageArea;
protected Control createPageArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
composite.setLayout(gridLayout);
return composite;
}
protected Composite dialogArea;
protected Control createDialogArea(Composite parent) {
dialogArea = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
dialogArea.setLayout(gridLayout);
// Build the separator line
Label dialogAreaSeparator = new Label(dialogArea, SWT.HORIZONTAL | SWT.SEPARATOR);
dialogAreaSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Build the page area
pageArea = createPageArea(dialogArea);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = pageWidth;
gd.heightHint = pageHeight;
pageArea.setLayoutData(gd);
gd = new GridData(GridData.FILL_BOTH);
gd.grabExcessVerticalSpace = true;
dialogArea.setLayoutData(gd);
return dialogArea;
}
protected Control createButtonBar(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
composite.setLayout(gridLayout);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
//gd.heightHint = commandBarHeight;
composite.setLayoutData(gd);
// Build the separator line
Label titleBarSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
titleBarSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Build the command bar
commandBar = new CommandBar();
CommandBarLayout cbl = new CommandBarLayout();
cbl.buttonHeight = convertHorizontalDLUsToPixels(20);
cbl.buttonWidth = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
cbl.gap = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_MARGIN);
cbl.left = 10;
cbl.right = 10;
cbl.top = 11;
cbl.bottom = 10;
commandBar.setLayout(cbl);
Control control = commandBar.createControl(composite);
commandBar.addCommandBarListener(this);
commandBar.getLayout().alignment = SWT.RIGHT;
gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = commandBar.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
control.setLayoutData(gd);
return composite;
}
public void updateButtonsBar(String[] newCommands) {
newCommands = revalidateHelpInCommands(newCommands);
if(!equal(commands, newCommands)) {
commandBar.setCommands(commands = newCommands);
commandBar.update();
((Composite)commandBar.getControl()).layout();
}
}
private String[] revalidateHelpInCommands(String[] newCommands) {
if(!hideHelp || newCommands.length == 0 || !newCommands[newCommands.length - 1].equals(SpecialWizardSupport.HELP)) return newCommands;
String[] s = new String[newCommands.length - 1];
System.arraycopy(newCommands, 0, s, 0, s.length);
return s;
}
private void setShellSize(int width, int height) {
// clip for 3/4 desktop
Rectangle displayArea = this.getShell().getDisplay().getClientArea();
if ((this.getMinimumSize()!=null)&&(this.getMinimumSize().x>displayArea.width)) {
width = this.getMinimumSize().x;
} else {
width = Math.min(width,displayArea.width*3/4);
}
if ((this.getMinimumSize()!=null)&&(this.getMinimumSize().y>displayArea.width)) {
height = this.getMinimumSize().y;
} else {
height = Math.min(height,displayArea.height*3/4);
}
if ((this.getMinimumSize()!=null)&&(this.getMinimumSize().x!=SWT.DEFAULT)&&(this.getMinimumSize().x>width)) {
width = this.getMinimumSize().x;
}
if ((this.getMinimumSize()!=null)&&(this.getMinimumSize().y!=SWT.DEFAULT)&&(this.getMinimumSize().y>height)) {
height = this.getMinimumSize().y;
}
if ((this.getMaximumSize()!=null)&&(this.getMaximumSize().x!=SWT.DEFAULT)&&(this.getMaximumSize().x<width)) {
width = this.getMaximumSize().x;
}
if ((this.getMaximumSize()!=null)&&(this.getMaximumSize().y!=SWT.DEFAULT)&&(this.getMaximumSize().y<height)) {
height = this.getMaximumSize().y;
}
getShell().setSize(width, height);
constrainShellSize();
}
private Point calculatePageSizeDelta() {
Control pageControl = stepPage;
if (pageControl == null) return new Point(0, 0);
Point contentSize = pageControl.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
contentSize.x = Math.max(contentSize.x,pageWidth);
contentSize.y = Math.max(contentSize.y,pageHeight);
// Rectangle displayArea = this.getShell().getDisplay().getClientArea();
// Point displaySize = new Point(displayArea.width, displayArea.height);
// temp bugfix
//contentSize.x = Math.min(contentSize.x,displaySize.x*3/4);
//contentSize.y = Math.min(contentSize.y,displaySize.y*3/4);
Rectangle rect = ((Composite)pageArea).getClientArea();
Point containerSize = new Point(rect.width, rect.height);
return new Point(
Math.max(0, contentSize.x - containerSize.x),
Math.max(0, contentSize.y - containerSize.y));
}
private void updateSizeForPage() {
Point delta = calculatePageSizeDelta();
if (delta.x > 0 || delta.y > 0) {
// increase the size of the shell
Shell shell = getShell();
Point shellSize = shell.getSize();
setShellSize(shellSize.x + delta.x, shellSize.y + delta.y);
}
}
private boolean equal(String[] s1, String[] s2) {
if(s1 == null || s2 == null || s1.length != s2.length) return false;
for (int i = 0; i < s1.length; i++) if(!s1[i].equals(s2[i])) return false;
return true;
}
public boolean close() {
if(wizard != null) wizard.stopValidator();
boolean b = super.close();
wizard = null;
if (commandBar!=null) commandBar.dispose();
commandBar = null;
return b;
}
// CommandBarListener
public void action(String command) {
wizard.action(command);
}
public Control getButtonBar() {
return buttonBar;
}
public DefaultSpecialWizard getWizard() {
return wizard;
}
public void setWizard(DefaultSpecialWizard wizard) {
this.wizard = wizard;
}
public Point getMinimumSize() {
return minimumSize;
}
public void setMinimumSize(Point point) {
minimumSize = point;
}
public Point getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(Point point) {
maximumSize = point;
}
public CommandBar getCommandBar() {
return commandBar;
}
}