/*******************************************************************************
 * Copyright (c) 2001, 2006 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 
 *     Trung de Irene <trungha@ca.ibm.com>
 *******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.dialogs;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
import org.eclipse.wst.common.ui.internal.search.dialogs.ComponentSpecification;
import org.eclipse.wst.xsd.ui.internal.editor.Messages;
import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin;

/**
 * The BuiltInTypesFilteringDialog is a SelectionDialog that allows the user to
 *  select a ...
 */
public class SelectBuiltInTypesForFilteringDialog extends CheckedTreeSelectionDialog {

	public final static String CUSTOM_LIST_SEPARATOR = XSDEditorPlugin.CUSTOM_LIST_SEPARATOR;

	public SelectBuiltInTypesForFilteringDialog(Shell parent, 
			ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
		super(parent, labelProvider, contentProvider);

		init();
	}
	
	public CheckboxTreeViewer getTreeViewer(){
		return super.getTreeViewer();
	}
	
	private void init(){
		// grey state enable
		setContainerMode(true);
		
		setTitle(Messages._UI_LABEL_SET_COMMON_BUILT_IN_TYPES);
		setMessage(Messages._UI_LABEL_SELECT_TYPES_FILTER_OUT);
		
		//super.create();
		//super.getTreeViewer().setSorter(new ViewerSorter());
		
	}
	
	/**
	 *   Returns a String acting as list of built-in types selected by the user
	 * in the filter dialog (white space acts as the item separator).
	 *   Suggest using getSelectedBuiltInTypesFromString
	 * to get a concrete array of selected types.
	 *   We can only store String in the plugin preference's storage so we have 
	 * use this method for conversion
	 */
	public static String getTypesListInString(Object[] chosenTypes) {
		String returningList = ""; //$NON-NLS-1$
		for (int i = 0; i < chosenTypes.length; i++){
			if ( chosenTypes[i] instanceof ComponentSpecification){
				ComponentSpecification aType = 
					(ComponentSpecification) chosenTypes[i];

				returningList += aType.getName() + CUSTOM_LIST_SEPARATOR;
			}
			/* else selectedBuiltInTypes[i] instanceof List, ie. a parentNode
			 * we ignore it. */
		}
		return returningList;
	}
	
	/**
	 * Filters out all built-In type not recorded in the 'listString' and 
	 * returns the result in a List
	 * Warning: recursive method
	 * @param listString 
	 * @param aContainer 
	 * 			Containing all types
	 * @return a subset of what 'aContainer' has as specified by 'listString'
	 */
	public static List getSelectedBuiltInTypesFromString(String listString, 
			List aContainer) {
		List selectedTypes = new ArrayList();

		// ignore the 'header' item in the container, starting from i = 1
		for (int i = 1; i < aContainer.size(); i++){
			Object o = aContainer.get(i);
			if ( o instanceof ComponentSpecification){
				ComponentSpecification aType = (ComponentSpecification) o;
				String typeName = aType.getName();
				// if typeName's name appears in 'listString'
				if ( listString.indexOf(typeName + CUSTOM_LIST_SEPARATOR) != -1)
					selectedTypes.add(o);
			}
			else if ( o instanceof List){
				selectedTypes.addAll( getSelectedBuiltInTypesFromString(listString, (List) o) ); 
			}
		}
		return selectedTypes;
	}
}
