/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.macbundler;

import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;


public abstract class BundleWizardBasePage extends DialogPage implements IWizardPage, BundleAttributes, IPropertyChangeListener {

	/**
	 * The page that was shown right before this page became visible;
	 * <code>null</code> if none.
	 */
	private IWizardPage fPreviousPage;
	/**
	 * This page's message key.
	 */
	private String fKey;
	/**
	 * The wizard to which this page belongs; <code>null</code>
	 * if this page has yet to be added to a wizard.
	 */
	private IWizard fWizard;

	BundleDescription fBundleDescription;


	BundleWizardBasePage(String key, BundleDescription bd) {
		super(Util.getString(key + ".title")); //$NON-NLS-1$
		fKey= key;
		fBundleDescription= bd;
		//setMessage(Util.getString(fKey + ".message")); //$NON-NLS-1$
		setDescription(Util.getString(fKey + ".description")); //$NON-NLS-1$

		bd.addListener(this);
	}

	/* (non-Javadoc)
	 * Method declared in WizardPage
	 */
	@Override
	public void setVisible(boolean visible) {
		if (visible) {
			enterPage();
		} else {
			leavePage();
		}
		super.setVisible(visible);
	}

	void enterPage() {
		//System.out.println("enterPage: " + getName());
	}

	void leavePage() {
		//System.out.println("leavePage: " + getName());
	}

    @Override
	public Image getImage() {
        Image result = super.getImage();

        if (result == null && fWizard != null) {
			return fWizard.getDefaultPageImage();
		}

        return result;
    }

	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
	 */
	@Override
	final public void createControl(Composite parent) {

		Composite c= new Composite(parent, SWT.NULL);
		c.setLayout(new GridLayout(1, false));
		setControl(c);

		createContents(c);

		checkIfPageComplete();
	}

	abstract public void createContents(Composite parent);

	static void setHeightHint(Control control, int height) {
		GridData gd1= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
		gd1.heightHint= height;
		control.setLayoutData(gd1);
	}

	static Label createLabel(Composite parent, String text, int align) {
		Label l= new Label(parent, SWT.NONE);
		l.setText(text);
		l.setLayoutData(new GridData(align));
		return l;
	}

	static Composite createComposite(Composite parent, int columns) {
		Composite c= new Composite(parent, SWT.NONE);
		c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		GridLayout gl= new GridLayout(columns, false);
		gl.marginWidth= 0;
		c.setLayout(gl);
		return c;
	}

	Text createText(Composite parent, String key, int lines) {
		Text t= new Text(parent, SWT.BORDER);
		GridData gd= new GridData(GridData.FILL_HORIZONTAL);
		if (lines == 2) {
			gd.heightHint= 30;
		}
		t.setLayoutData(gd);
		hookField(t, key);
		return t;
	}

	Combo createCombo(Composite parent, String key) {
		Combo c= new Combo(parent, SWT.BORDER);
		c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		hookField(c, key);
		return c;
	}

	static Group createGroup(Composite parent, String text, int columns) {
		Group g= new Group(parent, SWT.NONE);
		g.setText(text);
		g.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		g.setLayout(new GridLayout(columns, false));
		return g;
	}

	Button createButton(Composite parent, int flags, String text) {
		Button b= new Button(parent, flags);
		if (text != null) {
			b.setText(text);
		}
		return b;
	}

	static Composite createHBox(Composite parent) {
		Composite c= new Composite(parent, SWT.NONE);
		c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		GridLayout gl= new GridLayout(2, false);
		gl.marginWidth= gl.marginHeight= 0;
		c.setLayout(gl);
		return c;
	}

	void hookField(final Text tf, final String key) {
		tf.addModifyListener(new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent e) {
				fBundleDescription.setValue(key, tf.getText());
				checkIfPageComplete();
			}
		});
	}

	void hookField(final Combo tf, final String key) {
		tf.addModifyListener(new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent e) {
				fBundleDescription.setValue(key, tf.getText());
				checkIfPageComplete();
			}
		});
	}

	void hookButton(final Button b, final String key) {
		b.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				fBundleDescription.setValue(key, Boolean.valueOf(b.getSelection()));
				checkIfPageComplete();
			}
		});
	}

	final void checkIfPageComplete() {
		IWizardContainer c= (fWizard != null) ? fWizard.getContainer() : null;
		if (c != null && this == c.getCurrentPage()) {
			c.updateButtons();
		}
	}

	/////////////////////////////////////////////////////////

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#canFlipToNextPage()
	 */
	@Override
	public boolean canFlipToNextPage() {
		return isPageComplete() && getNextPage() != null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#getName()
	 */
	@Override
	public String getName() {
		return Util.getString(fKey + ".title"); //$NON-NLS-1$;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#getNextPage()
	 */
	@Override
	public IWizardPage getNextPage() {
		if (fWizard == null) {
			return null;
		}
		return fWizard.getNextPage(this);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#getPreviousPage()
	 */
	@Override
	public IWizardPage getPreviousPage() {
		if (fPreviousPage != null) {
			return fPreviousPage;
		}
		if (fWizard != null) {
			return fWizard.getPreviousPage(this);
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#getWizard()
	 */
	@Override
	public IWizard getWizard() {
		return fWizard;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
	 */
	@Override
	public void setPreviousPage(IWizardPage page) {
		fPreviousPage= page;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#setWizard(org.eclipse.jface.wizard.IWizard)
	 */
	@Override
	public void setWizard(IWizard newWizard) {
		fWizard= newWizard;
	}
}
