/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2010 SAP AG.
 * 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:
 *    Stefan Dimov - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.jpt.jpadiagrameditor.ui.internal.dialog;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.bindings.keys.ParseException;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.JPADiagramEditorPlugin;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.i18n.JPAEditorMessages;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.JPAEditorConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.forms.IMessage;
import org.eclipse.ui.progress.IProgressService;


@SuppressWarnings("restriction")
public class SelectTypeDialog extends TitleAreaDialog {
	
	protected String title;
	protected String message;
	protected Label label;
	protected Text text;
	protected String type;
	protected Button browseButton;
	protected ContentProposalAdapter contentProposalAdapter;
	
	
	protected static KeyStroke ks = null;
	static {
		try {
			ks = KeyStroke.getInstance("Ctrl+Space");			//$NON-NLS-1$
		} catch (ParseException e1) {
			JPADiagramEditorPlugin.logError("Can't create keystroke object", e1); 	//$NON-NLS-1$
		} 
	}
	
	public SelectTypeDialog(String message,
							String initialType) {
		super(PlatformUI.getWorkbench().getDisplay().getActiveShell());
		this.title = JPAEditorMessages.SelectTypeDialog_chooseAttributeTypeDialogTitle;
		this.message = message;
		this.type = initialType;
	}
	
    protected Control createContents(Composite parent) {
        Control contents = super.createContents(parent);
        initializeControls();
        validatePage();
        return contents;
    }
    
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(JPAEditorMessages.SelectTypeDialog_chooseAttributeTypeDialogWindowTitle);
    }
    
    
	protected Point getInitialSize() {
		return new Point(convertHorizontalDLUsToPixels(320),
						 convertVerticalDLUsToPixels(120));
	}    
    
	public String getTypeName() {
		return type;
	}
	
	protected void buttonPressed(int buttonId) {
		type = text.getText().trim();
		super.buttonPressed(buttonId);
	}		
	
	protected boolean isResizable() {
		return true;
	}	
		
	private void createLabel(Composite composite) {
		label = new Label(composite, SWT.LEFT);
		label.setText(JPAEditorMessages.SelectTypeDialog_typeLabel);
	}
	
	private void createTextField(Composite composite) {
		text = new Text(composite, SWT.SINGLE | SWT.BORDER);		
	}
	
	private void createBrowseBtn(Composite composite) {
		browseButton = new Button(composite, SWT.PUSH);
		browseButton.setText(JPAEditorMessages.SelectTypeDialog_browseBtnTxt);
		browseButton.setToolTipText(JPAEditorMessages.SelectTypeDialog_browseBtnDesc);
		browseButton.addSelectionListener(new SelectionListener() {
			
			public void widgetSelected(SelectionEvent e) {
				IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
				IProgressService service = PlatformUI.getWorkbench().getProgressService();				
				SelectionDialog d = null;
				try {
					d = JavaUI.createTypeDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), 
					service, 
					scope, 
					IJavaElementSearchConstants.CONSIDER_ALL_TYPES, 
					false, 
					text.getText().trim());
				} catch (JavaModelException e1) {
					JPADiagramEditorPlugin.logError("Can't create type selaction dialog instance", e1); 	//$NON-NLS-1$
				}
				d.open();
				Object[] res = d.getResult(); 
				if (res == null)
					return;
				Object[] obj = d.getResult();
				if (obj == null)
					return;
				IType tp = (IType) obj[0];
				text.setText(tp.getFullyQualifiedName());
				text.setSelection(0, tp.getFullyQualifiedName().length());
			}

			public void widgetDefaultSelected(SelectionEvent e) {}
		});
	}
	
	private IContentProposalProvider createContentProposalProvider() {
		SimpleContentProposalProvider contProvider = new SimpleContentProposalProvider(JPAEditorConstants.PRIMITIVE_TYPES_AND_WRAPPERS);
		contProvider.setFiltering(true);
		
		contentProposalAdapter = new ContentProposalAdapter(
				text,
				new TextContentAdapter(), 
				contProvider,
				ks,
				new char[] {'b', 'c', 'd', 'i', 'f', 'l', 's', 'j', 'B', 'C', 'D', 'I', 'F', 'L', 'S', 'J'});
		contentProposalAdapter.setEnabled(true);
		contentProposalAdapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
		return contProvider;
	}
	
	@Override
	public Control createDialogArea(Composite parent) {
        Composite parentComposite = (Composite) super.createDialogArea(parent);
        GridLayout rowLayout = new GridLayout(3, false);
        Composite composite = new Composite(parentComposite, SWT.NONE);
       
        GridData d = new GridData(GridData.FILL_BOTH);
        d.grabExcessHorizontalSpace = true;
        d.heightHint = 400;
        composite.setLayoutData(d);
        
 		rowLayout.marginLeft = 5;
 		rowLayout.marginTop = 5;
 		rowLayout.marginRight = 5;
 		rowLayout.marginBottom = 30;
 		
 		composite.setLayout(rowLayout);
		createLabel(composite);
		GridData data = new GridData(40,20);
		data.verticalAlignment = SWT.CENTER;
		data.horizontalAlignment = SWT.BEGINNING;
		label.setLayoutData(data);
		createTextField(composite);
		data = new GridData(300, 17);
		data.horizontalAlignment = SWT.FILL;
		data.grabExcessHorizontalSpace = true;
		data.verticalAlignment = SWT.CENTER;
		text.setLayoutData(data);
		text.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				setDialogComplete(validatePage());
			}			
		});
		createBrowseBtn(composite);
		data = new GridData(100, 25);
		data.verticalAlignment = SWT.TOP;
		data.horizontalAlignment = SWT.LEFT;
		data.minimumWidth = 80;
		browseButton.setLayoutData(data);		
		createContentProposalProvider();
		return parentComposite;
	}
	
    private void initializeControls() {
        setTitle(title);
        setMessage(message);
        text.setText(type);
        text.setSelection(0, type.length());
        setDialogComplete(validatePage());
    }	
	
    protected void setDialogComplete(boolean value) {
        this.getButton(IDialogConstants.OK_ID).setEnabled(value);
    }	
    
    private boolean validatePage() {
		String type = text.getText().trim();
		if (StringTools.stringIsEmpty(type)) {
			setErrorMessage(JPAEditorMessages.SelectTypeDialog_emptyTypeErrorText);
			return false;
		}
		IStatus stat = getStatus();
		if (stat.isOK()) {
			setErrorMessage(null);
			setMessage(message,	IMessage.NONE);
		} else { 
			setMessage(stat.getMessage(), IMessage.ERROR);
		}
		return (stat.getSeverity() != IStatus.ERROR);
    }
    
    private IStatus getStatus() {
    	String type = text.getText().trim();
    	String[] types = type.split("[<>\\[\\],]");		//$NON-NLS-1$
    	for (int i = 0; i < types.length; i++) {
    		type = types[i].trim();
			IStatus stat = JavaConventions.validateJavaTypeName(type, JavaCore.VERSION_1_6, JavaCore.VERSION_1_6);
			boolean isPrimitive = JPAEditorConstants.PRIMITIVE_TYPES_AND_WRAPPERS_SET.contains(type);
			if (isPrimitive || (stat.getSeverity() != IStatus.ERROR))
				continue;
			return stat;
    	}
		return Status.OK_STATUS;
    }

}
