    /*******************************************************************************
     * Copyright (c) 2009 IBM Corporation and others.
     * All rights reserved. This program and the accompanying materials
     * are 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
     ********************************************************************************/
    package org.eclipse.jdt.ui.internal.copyrightupdater;

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.SashForm;
    import org.eclipse.swt.custom.ScrolledComposite;
    import org.eclipse.swt.events.ControlEvent;
    import org.eclipse.swt.events.ControlListener;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    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.Button;
    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.Layout;

    import org.eclipse.jface.dialogs.IDialogConstants;
    import org.eclipse.jface.layout.PixelConverter;

    import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
    import org.eclipse.jdt.ui.cleanup.ICleanUpConfigurationUI;

    public class CopyrightTabPage implements ICleanUpConfigurationUI {

    	private PixelConverter fPixelConverter;
    	private CleanUpOptions fOptions;

    	public CopyrightTabPage() {
    		super();
    	}

    	/* (non-Javadoc)
    	 * @see org.eclipse.jdt.ui.cleanup.ICleanUpConfigurationUI#createContents(org.eclipse.swt.widgets.Composite)
    	 */
    	public Composite createContents(Composite parent) {
    		final int numColumns= 4;

    		if (fPixelConverter == null) {
    			fPixelConverter= new PixelConverter(parent);
    		}

    		final SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL);
    		sashForm.setFont(parent.getFont());

    		Composite scrollContainer = new Composite(sashForm, SWT.NONE);

    		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
    		scrollContainer.setLayoutData(gridData);

    		GridLayout layout= new GridLayout(2, false);
    		layout.marginHeight= 0;
    		layout.marginWidth= 0;
    		layout.horizontalSpacing= 0;
    		layout.verticalSpacing= 0;
    		scrollContainer.setLayout(layout);

    		ScrolledComposite scroll= new ScrolledComposite(scrollContainer, SWT.V_SCROLL | SWT.H_SCROLL);
    		scroll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    		scroll.setExpandHorizontal(true);
    		scroll.setExpandVertical(true);

    		final Composite settingsContainer= new Composite(scroll, SWT.NONE);
    		settingsContainer.setFont(sashForm.getFont());

    		scroll.setContent(settingsContainer);

    		settingsContainer.setLayout(new PageLayout(scroll, 400, 400));
    		settingsContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    		Composite settingsPane= new Composite(settingsContainer, SWT.NONE);
    		settingsPane.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    		layout= new GridLayout(numColumns, false);
    		layout.verticalSpacing= (int)(1.5 * fPixelConverter.convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING));
    		layout.horizontalSpacing= fPixelConverter.convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
    		layout.marginHeight= fPixelConverter.convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
    		layout.marginWidth= fPixelConverter.convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
    		settingsPane.setLayout(layout);
    		doCreatePreferences(settingsPane);

    		settingsContainer.setSize(settingsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));

    		scroll.addControlListener(new ControlListener() {

    			public void controlMoved(ControlEvent e) {
    			}

    			public void controlResized(ControlEvent e) {
    				settingsContainer.setSize(settingsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    			}
    		});

    		Label sashHandle = new Label(scrollContainer, SWT.SEPARATOR | SWT.VERTICAL);
    		gridData= new GridData(SWT.RIGHT, SWT.FILL, false, true);
    		sashHandle.setLayoutData(gridData);

    		return sashForm;
    	}

    	/**
    	 * Creates the preferences for the tab page.
    	 *
    	 * @param composite Composite to create in
    	 */
    	protected void doCreatePreferences(Composite composite) {
    		Group group= new Group(composite, SWT.NONE);
    		group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    		group.setLayout(new GridLayout(1, false));
    		group.setText("Copyright Update"); //$NON-NLS-1$

    		final Button updateCheckbox= new Button(group, SWT.CHECK);
    		updateCheckbox.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
    		updateCheckbox.setText("Update the Copyrights"); //$NON-NLS-1$
    		updateCheckbox.setSelection(fOptions.isEnabled("cleanup.update_copyrights")); //$NON-NLS-1$
    		updateCheckbox.addSelectionListener(new SelectionAdapter() {
    			/*
    			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
    			 */
    			public void widgetSelected(SelectionEvent e) {
    				fOptions.setOption("cleanup.update_copyrights", updateCheckbox.getSelection() ? CleanUpOptions.TRUE : CleanUpOptions.FALSE); //$NON-NLS-1$
    			}
    		});
    	}

    	/* (non-Javadoc)
    	 * @see org.eclipse.jdt.ui.cleanup.ICleanUpConfigurationUI#getCleanUpCount()
    	 */
    	public int getCleanUpCount() {
    		return 1;
    	}

    	/* (non-Javadoc)
    	 * @see org.eclipse.jdt.ui.cleanup.ICleanUpConfigurationUI#getPreview()
    	 */
    	public String getPreview() {
    		StringBuffer buf= new StringBuffer();

    		if (fOptions.isEnabled("cleanup.update_copyrights")) {//$NON-NLS-1$
    			buf.append("/* Copyright (c) 2007, 2009 IBM Corporation and others.*/"); //$NON-NLS-1$
    		} else {
    			buf.append("/* Copyright (c) 2007, 2008 IBM Corporation and others.*/"); //$NON-NLS-1$
    		}

    		return buf.toString();

    	}

    	/* (non-Javadoc)
    	 * @see org.eclipse.jdt.ui.cleanup.ICleanUpConfigurationUI#getSelectedCleanUpCount()
    	 */
    	public int getSelectedCleanUpCount() {
    		return fOptions.isEnabled("cleanup.update_copyrights") ? 1 : 0; //$NON-NLS-1$
    	}

    	/* (non-Javadoc)
    	 * @see org.eclipse.jdt.ui.cleanup.ICleanUpConfigurationUI#setOptions(org.eclipse.jdt.ui.cleanup.CleanUpOptions)
    	 */
    	public void setOptions(CleanUpOptions options) {
    		fOptions= options;

    	}

    	/**
    	 * Layout used for the settings part. Makes sure to show scrollbars
    	 * if necessary. The settings part needs to be layouted on resize.
    	 */
    	private static class PageLayout extends Layout {

    		private final ScrolledComposite fContainer;
    		private final int fMinimalWidth;
    		private final int fMinimalHight;

    		private PageLayout(ScrolledComposite container, int minimalWidth, int minimalHight) {
    			fContainer= container;
    			fMinimalWidth= minimalWidth;
    			fMinimalHight= minimalHight;
    		}

    		public Point computeSize(Composite composite, int wHint, int hHint, boolean force) {
    			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
    				return new Point(wHint, hHint);
    			}

    			int x = fMinimalWidth;
    			int y = fMinimalHight;
    			Control[] children = composite.getChildren();
    			for (int i = 0; i < children.length; i++) {
    				Point size = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
    				x = Math.max(x, size.x);
    				y = Math.max(y, size.y);
    			}

    			Rectangle area= fContainer.getClientArea();
    			if (area.width > x) {
    				fContainer.setExpandHorizontal(true);
    			} else {
    				fContainer.setExpandHorizontal(false);
    			}

    			if (area.height > y) {
    				fContainer.setExpandVertical(true);
    			} else {
    				fContainer.setExpandVertical(false);
    			}

    			if (wHint != SWT.DEFAULT) {
    				x = wHint;
    			}
    			if (hHint != SWT.DEFAULT) {
    				y = hHint;
    			}

    			return new Point(x, y);
    		}

    		/* (non-Javadoc)
    		 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite, boolean)
    		 */
    		public void layout(Composite composite, boolean force) {
    			Rectangle rect = composite.getClientArea();
    			Control[] children = composite.getChildren();
    			for (int i = 0; i < children.length; i++) {
    				children[i].setSize(rect.width, rect.height);
    			}
    		}
    	}
    }