/*******************************************************************************
 * 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.query;

import org.jboss.tools.common.model.ui.action.CommandBar;
import org.jboss.tools.common.model.ui.action.CommandBarLayout;
import org.eclipse.jface.dialogs.Dialog;
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.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.impl.XModelEntityImpl;
import org.jboss.tools.common.model.ui.ModelUIImages;

public class AbstractQueryDialog extends TitleAreaDialog implements IQueryDialog {
	public static boolean hideHelp = XModelEntityImpl.hideHelp;
	private AbstractQueryWizardView view;
	private int pageWidth = 490;
	private int pageHeight = 225;
	
	public AbstractQueryDialog(Shell shell) {
		super(shell);
		setShellStyle(getShellStyle()|SWT.RESIZE);
	}
	
	public void setView(AbstractQueryWizardView view) {
		this.view = view;
	}

	protected Control createDialogArea(Composite parent) {
		setTitleImage(ModelUIImages.getImage(ModelUIImages.WIZARD_DEFAULT));

		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);

		Label dialogAreaSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
		dialogAreaSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		Control pageArea = view.createControl(composite);
		GridData gd = new GridData(GridData.FILL_BOTH);
		pageArea.setLayoutData(gd);
		
		gd = new GridData(GridData.FILL_BOTH);
		
		Point p = view.getPreferredSize();
		gd.widthHint = (p == null) ? pageWidth : p.x;
		gd.heightHint = (p == null) ? pageHeight : p.y;
		composite.setLayoutData(gd);
		return composite;
	}
	
	protected Control createButtonBar(Composite parent) {
		CommandBar commandBar = view.getCommandBar();
		commandBar.addCommandBarListener(view);
		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);
		composite.setLayoutData(gd);

		Label titleBarSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
		titleBarSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		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);
		commandBar.setCommands(getCommands());
		commandBar.setDefaultCommand(view.getDefaultCommand());
		Control control = commandBar.createControl(composite);
		commandBar.getLayout().alignment = SWT.RIGHT;
		gd = new GridData(GridData.FILL_HORIZONTAL);
		gd.heightHint = commandBar.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
		control.setLayoutData(gd);
		if(view.getHelpKey() == null)
		  commandBar.setEnabled(AbstractQueryWizardView.HELP, false);
		view.updateBar();
		return composite;
	}
	
	protected String[] getCommands() {
		String[] s = view.getCommands();
		if(s.length == 0 || !s[s.length - 1].equals(AbstractQueryWizardView.HELP)) {
			String[] s1 = new String[s.length + 1];
			for (int i = 0; i < s.length; i++) s1[i] = s[i];
			s1[s.length] = AbstractQueryWizardView.HELP;
			s = s1;
		}
		if(hideHelp) {
			String[] s1 = new String[s.length - 1];
			System.arraycopy(s, 0, s1, 0, s1.length);
			return s1;
		}
		return s;
	}

	public Dialog getDialog() {
		return this;
	}
	
}
