/*******************************************************************************
 * Copyright (c) 2007, 2010 IBM Corporation and others.
 * All rights reserved. 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.wst.xml.core.internal.formatter;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;

public class XMLFormattingPreferences {
	public final static String PRESERVE = XMLFormattingConstraints.PRESERVE;
	public final static String COLLAPSE = XMLFormattingConstraints.COLLAPSE;
	public final static String IGNORE = XMLFormattingConstraints.IGNORE;

	public final static String INDENT = XMLFormattingConstraints.INDENT;
	public final static String NEW_LINE = XMLFormattingConstraints.NEW_LINE;
	public final static String INLINE = XMLFormattingConstraints.INLINE;

	private int fMaxLineWidth = 72;
	private boolean fAlignFinalBracket = false;
	private boolean fSpaceBeforeEmptyCloseTag = true;
	private boolean fIndentMultipleAttributes = false;
	private boolean fFormatCommentText = true;
	private boolean fJoinCommentLines = false;

	private String fPCDataWhitespaceStrategy = XMLFormattingConstraints.PRESERVE;
	private String fTextIndentStrategy = XMLFormattingConstraints.INLINE;
	private String fTextWhitespaceStrategy = XMLFormattingConstraints.COLLAPSE;
	private String fElementIndentStrategy = XMLFormattingConstraints.INDENT;
	private String fElementWhitespaceStrategy = XMLFormattingConstraints.IGNORE;
	private String fMixedIndentStrategy = XMLFormattingConstraints.INDENT;
	private String fMixedWhitespaceStrategy = XMLFormattingConstraints.IGNORE;
	private String fOneIndent = "\t"; //$NON-NLS-1$
	private boolean fClearAllBlankLines = false;

	public XMLFormattingPreferences() {
		Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences();
		if (preferences != null) {
			setFormatCommentText(preferences.getBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_TEXT));
			setJoinCommentLines(preferences.getBoolean(XMLCorePreferenceNames.FORMAT_COMMENT_JOIN_LINES));

			setMaxLineWidth(preferences.getInt(XMLCorePreferenceNames.LINE_WIDTH));
			setIndentMultipleAttributes(preferences.getBoolean(XMLCorePreferenceNames.SPLIT_MULTI_ATTRS));
			setAlignFinalBracket(preferences.getBoolean(XMLCorePreferenceNames.ALIGN_END_BRACKET));
			setSpaceBeforeEmptyCloseTag(preferences.getBoolean(XMLCorePreferenceNames.SPACE_BEFORE_EMPTY_CLOSE_TAG));
			
			boolean preservepcdata = preferences.getBoolean(XMLCorePreferenceNames.PRESERVE_CDATACONTENT);
			if (preservepcdata)
				fPCDataWhitespaceStrategy = XMLFormattingPreferences.PRESERVE;
			else
				fPCDataWhitespaceStrategy = XMLFormattingPreferences.COLLAPSE;

			char indentChar = ' ';
			String indentCharPref = preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR);
			if (XMLCorePreferenceNames.TAB.equals(indentCharPref)) {
				indentChar = '\t';
			}
			int indentationWidth = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE);

			StringBuffer indent = new StringBuffer();
			for (int i = 0; i < indentationWidth; i++) {
				indent.append(indentChar);
			}
			setOneIndent(indent.toString());
			setClearAllBlankLines(preferences.getBoolean(XMLCorePreferenceNames.CLEAR_ALL_BLANK_LINES));
		}
	}

	public int getMaxLineWidth() {
		return fMaxLineWidth;
	}

	public boolean getFormatCommentText() {
		return fFormatCommentText;
	}

	public boolean getAlignFinalBracket() {
		return fAlignFinalBracket;
	}

	public boolean getSpaceBeforeEmptyCloseTag() {
		return fSpaceBeforeEmptyCloseTag;
	}
	
	public boolean getIndentMultipleAttributes() {
		return fIndentMultipleAttributes;
	}

	public String getPCDataWhitespaceStrategy() {
		return fPCDataWhitespaceStrategy;
	}

	public String getTextIndentStrategy() {
		return fTextIndentStrategy;
	}

	public String getTextWhitespaceStrategy() {
		return fTextWhitespaceStrategy;
	}

	public String getElementIndentStrategy() {
		return fElementIndentStrategy;
	}

	public String getElementWhitespaceStrategy() {
		return fElementWhitespaceStrategy;
	}
	
	public boolean getJoinCommentLines() {
		return fJoinCommentLines;
	}

	public void setJoinCommentLines(boolean joinCommentLines) {
		fJoinCommentLines = joinCommentLines;
	}

	public void setFormatCommentText(boolean formatCommentText) {
		fFormatCommentText = formatCommentText;
	}

	public void setSpaceBeforeEmptyCloseTag(boolean spaceBeforeEmptyCloseTag) {
		fSpaceBeforeEmptyCloseTag = spaceBeforeEmptyCloseTag;
	}

	public void setIndentMultipleAttributes(boolean indentMultipleAttributes) {
		fIndentMultipleAttributes = indentMultipleAttributes;
	}

	public void setPCDataWhitespaceStrategy(String dataWhitespaceStrategy) {
		fPCDataWhitespaceStrategy = dataWhitespaceStrategy;
	}

	public void setAlignFinalBracket(boolean alignFinalBracket) {
		fAlignFinalBracket = alignFinalBracket;
	}

	public String getMixedIndentStrategy() {
		return fMixedIndentStrategy;
	}

	public void setMixedIndentStrategy(String mixedIndentStrategy) {
		fMixedIndentStrategy = mixedIndentStrategy;
	}

	public String getMixedWhitespaceStrategy() {
		return fMixedWhitespaceStrategy;
	}

	public void setMixedWhitespaceStrategy(String mixedWhitespaceStrategy) {
		fMixedWhitespaceStrategy = mixedWhitespaceStrategy;
	}

	public String getOneIndent() {
		return fOneIndent;
	}

	protected void setMaxLineWidth(int maxLineWidth) {
		fMaxLineWidth = maxLineWidth;
	}

	protected void setOneIndent(String oneIndent) {
		fOneIndent = oneIndent;
	}

	public boolean getClearAllBlankLines() {
		return fClearAllBlankLines;
	}

	public void setClearAllBlankLines(boolean clearAllBlankLines) {
		fClearAllBlankLines = clearAllBlankLines;
	}
}
