/*******************************************************************************
 * Copyright (c) 2007, 2008 Wind River Systems, Inc. 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
 *
 * Contributors:
 *    Markus Schorn - initial API and implementation
 *******************************************************************************/ 
package org.eclipse.cdt.internal.ui.preferences;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;

import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionPreferences;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionWorkspacePreferences;
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
import org.eclipse.cdt.ui.dialogs.DialogsMessages;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;

import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;

/**
 * This OptionPage is used in the IndexerPreference page to allow for adjusting
 * various parsing related caches.
 */
public class IndexerStrategyBlock extends AbstractCOptionPage {
    private Button fAutoUpdateButton;
	private Button fImmediateUpdateButton;
	private Button fUseActiveBuildButton;
	private Button fUseFixedBuildConfig;

	public IndexerStrategyBlock(ICOptionContainer container) {
    	setContainer(container);
    }

    @Override
	public void createControl(Composite parent) {
    	GridData gd;
    	GridLayout gl;
        Composite composite = ControlFactory.createComposite(parent, 1);
		gl=  (GridLayout)composite.getLayout();
		gl.marginWidth= 0;
		gl.verticalSpacing= gl.marginHeight*2;
		
		gd= (GridData) composite.getLayoutData();
		gd.grabExcessHorizontalSpace= false;
		gd.horizontalAlignment= GridData.FILL;

		setControl(composite);
      
		SelectionListener updateEnablement= new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				updateEnablement();
			}
		};

		Group group= ControlFactory.createGroup(composite, DialogsMessages.IndexerStrategyBlock_strategyGroup, 1);
		gd= (GridData) group.getLayoutData();
		gd.grabExcessHorizontalSpace= true;
		gd.horizontalAlignment= GridData.FILL;	
		fAutoUpdateButton= ControlFactory.createCheckBox(group, DialogsMessages.IndexerStrategyBlock_autoUpdate);
		fImmediateUpdateButton= ControlFactory.createCheckBox(group, DialogsMessages.IndexerStrategyBlock_immediateUpdate);
		fAutoUpdateButton.addSelectionListener(updateEnablement);
		
		if (IndexerPreferencePage.showBuildConfiguration()) {
			group= ControlFactory.createGroup(composite, DialogsMessages.IndexerStrategyBlock_buildConfigGroup, 1);
			gd= (GridData) group.getLayoutData();
			gd.grabExcessHorizontalSpace= true;
			gd.horizontalAlignment= GridData.FILL;
			fUseActiveBuildButton= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_activeBuildConfig, null, null);
			fUseFixedBuildConfig= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_specificBuildConfig, null, null);
		}		
		initializeValues();
    }

    protected void updateEnablement() {
    	fImmediateUpdateButton.setEnabled(fAutoUpdateButton.getSelection());
	}

	private void initializeValues() {
    	int updatePolicy= IndexerPreferences.getUpdatePolicy(null);
    	initUpdatePolicy(updatePolicy);

    	if (fUseActiveBuildButton != null) {
    		ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager();
    		ICProjectDescriptionWorkspacePreferences prefs= prjDescMgr.getProjectDescriptionWorkspacePreferences(false);
    		boolean useActive= prefs.getConfigurationRelations() == ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE;
    		fUseActiveBuildButton.setSelection(useActive);
    		fUseFixedBuildConfig.setSelection(!useActive);
    	}    	
    	updateEnablement();
	}

	private void initUpdatePolicy(int updatePolicy) {
		fAutoUpdateButton.setSelection(updatePolicy != IndexerPreferences.UPDATE_POLICY_MANUAL);
    	fImmediateUpdateButton.setSelection(updatePolicy == IndexerPreferences.UPDATE_POLICY_IMMEDIATE);
	}

	@Override
	public void performApply(IProgressMonitor monitor) throws CoreException {
		int updatePolicy;
		if (!fAutoUpdateButton.getSelection()) {
			updatePolicy= IndexerPreferences.UPDATE_POLICY_MANUAL;
		} else if (fImmediateUpdateButton.getSelection()) {
			updatePolicy= IndexerPreferences.UPDATE_POLICY_IMMEDIATE;
		} else {
			updatePolicy= IndexerPreferences.UPDATE_POLICY_LAZY;
		}			
		IndexerPreferences.setUpdatePolicy(null, updatePolicy);

    	if (fUseActiveBuildButton != null) {
    		boolean useActive= fUseActiveBuildButton.getSelection();
    		int relation= useActive ?
    				ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE :
    				ICProjectDescriptionPreferences.CONFIGS_INDEPENDENT;
    		ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager();
    		ICProjectDescriptionWorkspacePreferences prefs= prjDescMgr.getProjectDescriptionWorkspacePreferences(true);
    		prefs.setConfigurationRelations(relation);
    		prjDescMgr.setProjectDescriptionWorkspacePreferences(prefs, false, new NullProgressMonitor());
    	}
	}

    @Override
	public void performDefaults() {
    	initUpdatePolicy(IndexerPreferences.getDefaultUpdatePolicy());
    	if (fUseActiveBuildButton != null) {
    		fUseActiveBuildButton.setSelection(false);
    		fUseFixedBuildConfig.setSelection(true);
    	}
    	updateEnablement();
    }
}
