/*=============================================================================#
 # Copyright (c) 2006, 2021 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.ui.workbench.workspace;

import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;

import org.eclipse.statet.ecommons.ui.components.TreeAndListGroup;
import org.eclipse.statet.internal.ecommons.ui.Messages;


public class ResourceFileSelectionDialog extends AbstractResourceSelectionDialog<IFile> {
	
	
	private final static int SIZING_SELECTION_WIDGET_WIDTH= 100;
	private final static int SIZING_SELECTION_WIDGET_HEIGHT= 20;
	
	
	// the visual selection widget group
	private TreeAndListGroup selectionGroup;
	
	
	/**
	 * Creates a resource selection dialog.
	 * 
	 * @param parent the parent shell
	 * @param message the message to be displayed at the top of this dialog, or
	 *     <code>null</code> to display a default message
	 */
	public ResourceFileSelectionDialog(final Shell parent, final String message) {
		super(parent);
		
		setTitle(Messages.ResourceSelectionDialog_title);
		setMessage(message);
	}
	
	
	@Override
	protected String getDefaultMessage() {
		return Messages.ResourceSelectionDialog_SelectContainer_message;
	}
	
	@Override
	protected int getResourceTypes() {
		return IResource.FILE;
	}
	
	public void addFileFilter(final String label, final String fileNamePattern) {
		// TODO (enh) add filter
	}
	
	
	@Override
	protected Control createDialogArea(final Composite parent) {
		// page group
		final Composite composite= (Composite) super.createDialogArea(parent);
		
		createMessageArea(composite);
		
		{	final TreeAndListGroup group= new TreeAndListGroup(composite, getRootElement(),
					new ResourceContentProvider(IResource.FOLDER | IResource.PROJECT),
					WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
					new ResourceContentProvider(IResource.FILE),
					WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
					new ResourceComparator(ResourceComparator.NAME), false );
			final GridData gd= new GridData(SWT.FILL, SWT.FILL, true, true);
			gd.widthHint= convertWidthInCharsToPixels(SIZING_SELECTION_WIDGET_WIDTH);
			gd.heightHint= convertHeightInCharsToPixels(SIZING_SELECTION_WIDGET_HEIGHT);
			group.getControl().setLayoutData(gd);
			
			this.selectionGroup= group;
		}
		
		this.selectionGroup.addSelectionChangedListener(createSelectionChangeListener());
		this.selectionGroup.addDoubleClickListener(createSelectionDoubleClickListener());
		
		createTextField(composite);
		
		return composite;
	}
	
	@Override
	protected void initSelection(final List<IResource> checkedResources) {
		final IResource resource= checkedResources.get(0);
		if (resource instanceof IFile) {
			this.selectionGroup.selectListElement(resource);
		}
		else {
			this.selectionGroup.selectTreeElement(resource);
		}
	}
	
	@Override
	protected void initDialog() {
		this.selectionGroup.initFields();
		
		super.initDialog();
	}
	
}
