//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.publishing.ui.wizards;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.AuthoringUIText;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.layout.elements.AbstractElementLayout;
import org.eclipse.epf.library.layout.elements.ActivityLayout;
import org.eclipse.epf.publishing.services.PublishHTMLOptions;
import org.eclipse.epf.publishing.services.PublishOptions;
import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
import org.eclipse.epf.publishing.ui.PublishingUIResources;
import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
import org.eclipse.epf.ui.wizards.BaseWizardPage;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
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.Point;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;

/**
 * A wizard page that prompts the user to select the publishing options for the
 * generated web site.
 * 
 * @author Kelvin Low
 * @author Bingxue Xu
 * @author Jinhua Xi
 * @since 1.0
 * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=206567
 */
public class SelectPublishingOptionsPage extends BaseWizardPage {

	/**
	 * The wizard page name.
	 */
	public static final String PAGE_NAME = SelectPublishingOptionsPage.class
			.getName();

	protected Shell shell;
	
	protected Composite composite;
	
	protected Group layoutGroup;

	protected Text titleText;

	protected Text aboutHTMLText;

	protected Text feedbackURLText;

	protected Button selectHTMLButton;

	protected Button publishGlossaryCheckbox;

	protected Button publishIndexCheckbox;

	protected Text bannerImageText;

	protected Button selectImageButton;

	protected Button checkExternalLinksCheckbox;

	protected Button convertBrokenLinksCheckbox;

	protected Button publishUnopenADDCheckbox;

	protected Button publishBaseADCheckbox;

	protected Button publishLightWeightTreeCheckbox;

	protected Button extraDescriptorInfoCtr;

	protected Button showRelatedDescriptors;
	
	protected Button showRelatedDescriptorsOption;

	protected Button showDescriptorsInNavigationTree;
	
	protected Button showRelatedLinks;

	protected ComboViewer activityTabViewer;

	protected MethodConfiguration config;

	protected List<MethodConfiguration> selectedConfigs = new ArrayList<MethodConfiguration>();

	public static Map<String, String> activityTabMap = new TreeMap<String, String>();

	static {
		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_DESC,
				AuthoringUIResources.descriptionPage_title);
		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_WBS,
				AuthoringUIResources.ProcessEditor_WorkBreakdownStructure);
		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_TBS,
				AuthoringUIResources.ProcessEditor_TeamAllocation);
		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_WPBS,
				AuthoringUIResources.ProcessEditor_WorkProductUsage);
	}

	/**
	 * Creates a new instance.
	 */
	public SelectPublishingOptionsPage(String pageName) {
		super(pageName,
				PublishingUIResources.selectPublishingOptionsWizardPage_title,
				PublishingUIResources.selectPublishingOptionsWizardPage_text,
				PublishingUIPlugin.getDefault().getImageDescriptor(
						"full/wizban/PublishConfiguration.gif")); //$NON-NLS-1$			
	}

	/**
	 * Creates a new instance.
	 */
	public SelectPublishingOptionsPage() {
		this(PAGE_NAME);
	}

	/**
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
	 */
	public void createControl(Composite parent) {
		shell = parent.getShell();

		ScrolledComposite scrolledComposite = new ScrolledComposite(
				parent, 
				SWT.V_SCROLL | SWT.H_SCROLL);
		
		composite = createGridLayoutComposite(scrolledComposite, 1);
		
		scrolledComposite.setContent(composite);

		createTitleAndLinksGroup(composite);
		createGlossaryAndIndexGroup(composite);
		createLookAndFeelGroup(composite);
		createValidation(composite);
		createDiagramGenerationGroup(composite);
		createLayoutGroup(composite);

		Point defaultSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
		composite.setSize(defaultSize);
		
		initControls();

		addListeners();

		setControl(scrolledComposite);

		PlatformUI
				.getWorkbench()
				.getHelpSystem()
				.setHelp(
						scrolledComposite,
						AuthoringUIHelpContexts.CONFIGURATION_PUBLISH_WIZARD_ALL_PAGES_CONTEXT);
	}

	/**
	 * Creates the Title and links group.
	 * 
	 * @param composite
	 *            the parent composite
	 * @return the group composite
	 */
	protected Group createTitleAndLinksGroup(Composite composite) {
		Group titleAndLinksGroup = createGridLayoutGroup(composite,
				PublishingUIResources.titleAndLinksGroup_text, 3);

		createLabel(titleAndLinksGroup, PublishingUIResources.titleLabel_text);
		titleText = createEditableText(titleAndLinksGroup, "", 360, 1); //$NON-NLS-1$
		createLabel(titleAndLinksGroup, ""); //$NON-NLS-1$

		createLabel(titleAndLinksGroup,
				PublishingUIResources.aboutHTMLLabel_text);
		aboutHTMLText = createEditableText(titleAndLinksGroup, "", 360, 1); //$NON-NLS-1$
		selectHTMLButton = new Button(titleAndLinksGroup, SWT.NONE);
		selectHTMLButton.setText(AuthoringUIText.SELECT_BUTTON_TEXT);

		createLabel(titleAndLinksGroup,
				PublishingUIResources.feedbackURLLabel_text);
		feedbackURLText = createEditableText(titleAndLinksGroup, "", 360, 1); //$NON-NLS-1$
		createLabel(titleAndLinksGroup, ""); //$NON-NLS-1$

		return titleAndLinksGroup;
	}

	/**
	 * Creates the Look and feel group.
	 * 
	 * @param composite
	 *            the parent composite
	 * @return the group composite
	 */
	protected Group createLookAndFeelGroup(Composite composite) {
		Group lookAndFeelGroup = createGridLayoutGroup(composite,
				PublishingUIResources.lookAndFeelGroup_text, 3);

		createLabel(lookAndFeelGroup,
				PublishingUIResources.bannerImageLabel_text);
		bannerImageText = createEditableText(lookAndFeelGroup, "", 360, 1); //$NON-NLS-1$
		selectImageButton = new Button(lookAndFeelGroup, SWT.NONE);
		selectImageButton.setText(AuthoringUIText.SELECT_BUTTON_TEXT);

		return lookAndFeelGroup;
	}

	/**
	 * Creates the Glosary and index group.
	 * 
	 * @param composite
	 *            the parent composite
	 * @return the group composite
	 */
	protected Group createGlossaryAndIndexGroup(Composite composite) {
		Group glossaryAndIndexGroup = createGridLayoutGroup(composite,
				PublishingUIResources.glossaryAndIndexGroup_text, 2);

		publishGlossaryCheckbox = createCheckbox(glossaryAndIndexGroup,
				PublishingUIResources.publishGlossaryLabel_text);
		publishIndexCheckbox = createCheckbox(glossaryAndIndexGroup,
				PublishingUIResources.publishIndexLabel_text);

		return glossaryAndIndexGroup;
	}

	/**
	 * Creates the Validation group.
	 * 
	 * @param composite
	 *            the parent composite
	 * @return the group composite
	 */
	protected Group createValidation(Composite composite) {
		Group validationGroup = createGridLayoutGroup(composite,
				PublishingUIResources.validationGroup_text, 2);

		checkExternalLinksCheckbox = createCheckbox(validationGroup,
				PublishingUIResources.checkExternalLinksLabel_text);

		convertBrokenLinksCheckbox = createCheckbox(validationGroup,
				PublishingUIResources.convertBrokenLinksLabel_text);

		return validationGroup;
	}

	/**
	 * Creates the Diagram Generation group.
	 * 
	 * @param composite
	 *            the parent composite
	 * @return the group composite
	 */
	protected Group createDiagramGenerationGroup(Composite composite) {
		Group diagramGroup = createGridLayoutGroup(composite,
				PublishingUIResources.diagramGroup_text, 1);

		publishUnopenADDCheckbox = createCheckbox(diagramGroup,
				PublishingUIResources.publishActivityDetailDiagramsLabel_text);

		publishBaseADCheckbox = createCheckbox(diagramGroup,
				PublishingUIResources.publishExtendedActivityDiagramsLabel_text);

		return diagramGroup;
	}

	public Group getLayoutGroup() {
		return layoutGroup;
	}

	public void setLayoutGroup(Group layoutGroup) {
		this.layoutGroup = layoutGroup;
	}

	/**
	 * Creates the Layout group.
	 * 
	 * @param composite
	 *            the parent composite
	 * @return the group composite
	 */
	protected Group createLayoutGroup(Composite composite) {
		layoutGroup = createGridLayoutGroup(composite,
				PublishingUIResources.layoutGroup_text, 1);

		publishLightWeightTreeCheckbox = createCheckbox(layoutGroup,
				PublishingUIResources.publishLightWeightTreeLabel_text);

		showRelatedLinks = createCheckbox(layoutGroup,
				PublishingUIResources.showRelatedLinks_text);

		showDescriptorsInNavigationTree = createCheckbox(layoutGroup,
				PublishingUIResources.showDescriptorsInNavigationTree_text);

		extraDescriptorInfoCtr = createCheckbox(layoutGroup,
				PublishingUIResources.publishExtraDescriptorInfoLabel_text);

		showRelatedDescriptors = createCheckbox(layoutGroup,
				PublishingUIResources.showRelatedDescriptors_text);		
		Composite descriptorComposite = createChildGridLayoutComposite(layoutGroup, 1);
		showRelatedDescriptorsOption = createCheckbox(descriptorComposite,
				PublishingUIResources.showRelatedDescriptors_option_text);
		
		Composite activityTabComposite = createGridLayoutComposite(layoutGroup,
				2);
		((GridLayout) activityTabComposite.getLayout()).marginTop = -5;
		((GridLayout) activityTabComposite.getLayout()).marginLeft = -5;

		createLabel(activityTabComposite,
				PublishingUIResources.selectDefaultActivityTab_text);

		activityTabViewer = new ComboViewer(activityTabComposite, SWT.BORDER
				| SWT.READ_ONLY);
		GridData gd = new GridData(GridData.BEGINNING
				| GridData.FILL_HORIZONTAL);
		activityTabViewer.getCombo().setLayoutData(gd);

		ILabelProvider labelProvider = new LabelProvider() {
			public String getText(Object param) {
				if (param instanceof Map.Entry) {
					return (String) ((Map.Entry) param).getValue();
				} else {
					return param.toString();
				}
			}
		};
		activityTabViewer.setLabelProvider(labelProvider);

		return layoutGroup;
	}

	/**
	 * Provide a means to add additional options to the published web site
	 * group.
	 * 
	 * @param composite
	 *            the parent composite
	 */
	protected void includeAdditionalPublishingOptions(Composite composite) {
	}

	/**
	 * Creates the publishing options groups to this wizard page.
	 * 
	 * @param composite
	 *            the parent composite
	 */
	protected void createPublishingOptionsGroups(Composite composite) {
	}

	/**
	 * Initializes the wizard page controls with data.
	 */
	protected void initControls() {
		String configId = config != null ? config.getGuid() : ""; //$NON-NLS-1$

		titleText.setText(PublishingUIPreferences.getTitle(configId));
		bannerImageText.setText(PublishingUIPreferences
				.getBannerImage(configId));
		aboutHTMLText.setText(PublishingUIPreferences.getAboutHTML(configId));
		feedbackURLText.setText(PublishingUIPreferences
				.getFeedbackURL(configId));
		publishGlossaryCheckbox.setSelection(PublishingUIPreferences
				.getIncludeGlossary(configId));
		publishIndexCheckbox.setSelection(PublishingUIPreferences
				.getIncludeIndex(configId));
		checkExternalLinksCheckbox.setSelection(PublishingUIPreferences
				.getCheckExternalLinks(configId));
		convertBrokenLinksCheckbox.setSelection(PublishingUIPreferences
				.getConvertBrokenLinks(configId));
		publishUnopenADDCheckbox.setSelection(PublishingUIPreferences
				.getPublishUnopenActivityDD(configId));
		publishBaseADCheckbox.setSelection(PublishingUIPreferences
				.getPublishADForActivityExtension(configId));
		publishLightWeightTreeCheckbox.setSelection(!PublishingUIPreferences
				.getLightWeightTree(configId));
		extraDescriptorInfoCtr.setSelection(PublishingUIPreferences
				.getExtraDescriptorInfo(configId));
		showRelatedDescriptors.setSelection(PublishingUIPreferences
				.getShowRelatedDescriptors(configId));
		showRelatedLinks.setSelection(PublishingUIPreferences
				.getShowRelatedLinks(configId));
		showRelatedDescriptorsOption.setSelection(PublishingUIPreferences
				.getShowRelatedDescriptorsOption(configId));
		if (showRelatedDescriptors.getSelection()) {
			showRelatedDescriptorsOption.setEnabled(true);
		} else {
			showRelatedDescriptorsOption.setEnabled(false);
		}
		if (showRelatedDescriptorsOption.getSelection()) {
			AbstractElementLayout.processDescritorsNewOption = true;
		} else {
			AbstractElementLayout.processDescritorsNewOption = false;
		}
		showDescriptorsInNavigationTree.setSelection(PublishingUIPreferences
				.getShowDescriptorsInNavigationTree(configId));

		if (activityTabViewer.getCombo().getItemCount() == 0) {
			activityTabViewer.add(activityTabMap.entrySet().toArray());
		}
		activityTabViewer.getCombo().setText(
				activityTabMap.get(PublishingUIPreferences
						.getDefaultActivityTab(configId)));

	}

	/**
	 * Adds the listeners for the controls on this page.
	 */
	protected void addListeners() {
		selectImageButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				try {
					FileDialog dialog = new FileDialog(shell, SWT.OPEN);
					dialog.setFilterExtensions(new String[] {
							"*.gif", "*.jpg", "*.bmp" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
					String imageFile = dialog.open();
					if (imageFile != null) {
						bannerImageText.setText(imageFile);
					}
				} catch (Exception e) {
					PublishingUIPlugin.getDefault().getLogger().logError(e);
				}
			}
		});

		selectHTMLButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				try {
					FileDialog dialog = new FileDialog(shell, SWT.OPEN);
					dialog
							.setFilterExtensions(new String[] {
									"*.htm", "*.html" }); //$NON-NLS-1$ //$NON-NLS-2$
					String htmlFile = dialog.open();
					if (htmlFile != null) {
						aboutHTMLText.setText(htmlFile);
					}
				} catch (Exception e) {
					PublishingUIPlugin.getDefault().getLogger().logError(e);
				}
			}
		});

		aboutHTMLText.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				setPageComplete(isPageComplete());
			}
		});
		
		showRelatedDescriptors.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				if (showRelatedDescriptors.getSelection()) {
					showRelatedDescriptorsOption.setEnabled(true);
				} else {
					showRelatedDescriptorsOption.setSelection(false);
					AbstractElementLayout.processDescritorsNewOption = false;
					showRelatedDescriptorsOption.setEnabled(false);
				}
			}
		});
		
		showRelatedDescriptorsOption.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				if (showRelatedDescriptorsOption.getSelection()) {
					AbstractElementLayout.processDescritorsNewOption = true;
				} else {
					AbstractElementLayout.processDescritorsNewOption = false;
				}
			}
		});
	}

	/**
	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
	 */
	public void onEnterPage(Object obj) {
		if (obj != null && obj instanceof MethodConfiguration) {
			MethodConfiguration selectedConfig = (MethodConfiguration) obj;
			if (!selectedConfigs.contains(selectedConfig)) {
				selectedConfigs.add(selectedConfig);
			}
			if (selectedConfig != config) {
				config = selectedConfig;
				initControls();
			}
		}
		
		//resize the content composite in the scrolled parent
		Point size = composite.getSize();
		Point parentSize = composite.getParent().getSize();
		int borderWidth = composite.getParent().getBorderWidth();
		
		if(size.x < parentSize.x - 2 * borderWidth){
			composite.setSize(parentSize.x - 2 * borderWidth, size.y);
		}
	}

	/**
	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
	 */
	public boolean isPageComplete() {
		String path = aboutHTMLText.getText();
		IPath ecPath = Path.fromOSString(path);
		boolean isValid = ecPath.isValidPath(path);
		if (!isValid) {
			setErrorMessage(PublishingUIResources.invalidAboutPathError_msg);
			return false;
		} else if (!StrUtil.isValidPublishPath(path)) {
			setErrorMessage(PublishingUIResources.invalidAboutPathCharsError_msg);
			return false;
		} else {
			setErrorMessage(null);
		}
		return true;
	}

	/**
	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#getNextPageData()
	 */
	public Object getNextPageData() {
		return config;
	}

	/**
	 * Gets the user selected publishing options.
	 * 
	 * @return a <code>PublishOptions</code> object
	 */
	public PublishOptions getPublishingOptions() {
		PublishHTMLOptions options = new PublishHTMLOptions();

		options.setTitle(getWebSiteTitle());
		options.setBannerImage(getBannerImagePath());
		options.setAboutHTML(getAboutHTMLPath());
		options.setFeedbackURL(getFeedbackURL());
		options.setPublishGlossary(getPublishGlossarySelection());
		options.setPublishIndex(getPublishIndexSelection());
		options.setCheckExternalLinks(getCheckExternalLinksSelection());
		options.setPublishUnopenADD(getPublishUnopenADDSelection());
		options.setPublishBaseAD(getPublishBaseADSelection());
		options.setConvertBrokenLinks(getConvertBrokenLinksSelection());
		options.setPublishLightWeightTree(getPublishLightWeightTreeSelection());
		options.setShowMethodContentInDescriptors(getShowExtraDescriptorInfoSelection());
		options.setShowRelatedDescriptors(showRelatedDescriptors.getSelection());
		options.setShowRelatedDescriptorsOption(showRelatedDescriptorsOption.getSelection());		
		options.setShowRelatedLinks(showRelatedLinks.getSelection());
		options.setShowDescriptorsInNavigationTree(showDescriptorsInNavigationTree.getSelection());

		String defaultActivityTab = getDefaultActivityTabSelection();
		if (defaultActivityTab != null) {
			options.setDefaultActivityTab(defaultActivityTab);
		}

		return options;
	}

	/**
	 * Gets the user specified web site title.
	 */
	protected String getWebSiteTitle() {
		return titleText.getText().trim();
	}

	/**
	 * Gets the user specified banner image path.
	 */
	protected String getBannerImagePath() {
		return bannerImageText.getText().trim();
	}

	/**
	 * Gets the user specified about HTML path.
	 */
	protected String getAboutHTMLPath() {
		return aboutHTMLText.getText().trim();
	}

	/**
	 * Gets the user specified feedback URL.
	 */
	protected String getFeedbackURL() {
		return feedbackURLText.getText().trim();
	}

	/**
	 * Gets the user specified publish glossary selection.
	 */
	protected boolean getPublishGlossarySelection() {
		return publishGlossaryCheckbox.getSelection();
	}

	/**
	 * Gets the user specified publish index selection.
	 */
	protected boolean getPublishIndexSelection() {
		return publishIndexCheckbox.getSelection();
	}

	/**
	 * Gets the user specified check external links selection.
	 */
	protected boolean getCheckExternalLinksSelection() {
		return checkExternalLinksCheckbox.getSelection();
	}

	/**
	 * Gets the user specified convert broken links selection.
	 */
	protected boolean getConvertBrokenLinksSelection() {
		return convertBrokenLinksCheckbox.getSelection();
	}

	/**
	 * Gets the user specified auto generate activity detail diagrams selection.
	 */
	protected boolean getPublishUnopenADDSelection() {
		return publishUnopenADDCheckbox.getSelection();
	}

	/**
	 * Gets the user specified publish activity diagram for base activties with
	 * unmodified extensions.
	 */
	protected boolean getPublishBaseADSelection() {
		return publishBaseADCheckbox.getSelection();
	}

	/**
	 * Gets the user specified generate light weight tree selection.
	 */
	protected boolean getPublishLightWeightTreeSelection() {
		return !publishLightWeightTreeCheckbox.getSelection();
	}

	/**
	 * Gets the user specified show extra descriptor info selection.
	 */
	protected boolean getShowExtraDescriptorInfoSelection() {
		return extraDescriptorInfoCtr.getSelection();
	}

	/**
	 * Gets the user specified show related descriptor in content page
	 * selection.
	 */
	protected boolean getShowRelatedDescriptorsSelection() {
		return showRelatedDescriptors.getSelection();
	}
	
	/**
	 * Gets the user specified Show all indirect (green) occurrences 
	 * in extended patterns
	 */
	protected boolean getShowRelatedDescriptorsOptionSelection() {
		return showRelatedDescriptorsOption.getSelection();
	}
	
	/**
	 * Gets the user specified show related links in navigate page
	 * selection.
	 */
	protected boolean getShowRelatedLinksSelection() {
		return showRelatedLinks.getSelection();
	}
	
	/**
	 * Gets the user specified show descriptors in navigation tree selection.
	 */
	protected boolean getShowDescriptorsInNavigationTreeSelection() {
		return showDescriptorsInNavigationTree.getSelection();
	}

	/**
	 * Gets the user specified default activity tab selection.
	 */
	protected String getDefaultActivityTabSelection() {
		IStructuredSelection sel = (IStructuredSelection) activityTabViewer
				.getSelection();
		Map.Entry item = (Map.Entry) sel.getFirstElement();
		if (item == null) {
			return null;
		} else {
			return (String) item.getKey();
		}
	}

	/**
	 * Saves the user selections in this wizard page to preference store.
	 */
	public void savePreferences() {
		if (config != null) {
			String configId = config.getGuid();
			saveTitleAndLinksPreferences(configId);
			saveGlossaryAndIndexPreferences(configId);
			saveValidationPreferences(configId);
			saveDiagramGenerationPreferences(configId);
			saveLayoutPreferences(configId);
		}
	}

	/**
	 * Saves the title and links preferences.
	 */
	protected void saveTitleAndLinksPreferences(String configId) {
		PublishingUIPreferences.setTitle(configId, getWebSiteTitle());
		PublishingUIPreferences.setBannerImage(configId, getBannerImagePath());
		PublishingUIPreferences.setAboutHTML(configId, getAboutHTMLPath());
		PublishingUIPreferences.setFeedbackURL(configId, getFeedbackURL());
	}

	/**
	 * Saves the glosaary and index preferences.
	 */
	protected void saveGlossaryAndIndexPreferences(String configId) {
		PublishingUIPreferences.setIncludeGlossary(configId,
				getPublishGlossarySelection());
		PublishingUIPreferences.setIncludeIndex(configId,
				getPublishIndexSelection());
	}

	/**
	 * Saves the validation preferences.
	 */
	protected void saveValidationPreferences(String configId) {
		PublishingUIPreferences.setCheckExternalLinks(configId,
				getCheckExternalLinksSelection());
		PublishingUIPreferences.setConvertBrokenLinks(configId,
				getConvertBrokenLinksSelection());
	}

	/**
	 * Saves the diagram generation preferences.
	 */
	protected void saveDiagramGenerationPreferences(String configId) {
		PublishingUIPreferences.setPublishUnopenActivityDD(configId,
				getPublishUnopenADDSelection());
		PublishingUIPreferences.setPublishADForActivityExtension(configId,
				getPublishBaseADSelection());
	}

	/**
	 * Saves the layout preferences.
	 */
	protected void saveLayoutPreferences(String configId) {
		PublishingUIPreferences.setLightWeightTree(configId,
				getPublishLightWeightTreeSelection());
		PublishingUIPreferences.setExtraDescriptorInfo(configId,
				getShowExtraDescriptorInfoSelection());
		PublishingUIPreferences.setShowRelatedDescriptors(configId,
				getShowRelatedDescriptorsSelection());
		PublishingUIPreferences.setShowRelatedDescriptorsOption(configId,
				getShowRelatedDescriptorsOptionSelection());
		PublishingUIPreferences.setShowRelatedLinks(configId,
				getShowRelatedLinksSelection());
		PublishingUIPreferences.setShowDescriptorsInNavigationTree(configId,
				getShowDescriptorsInNavigationTreeSelection());
		PublishingUIPreferences.setDefaultActivityTab(configId,
				getDefaultActivityTabSelection());
	}

}