/*******************************************************************************
 * Copyright (c) 2006 Spirit Link GmbH
 * All rights reserved.
 * 
 * Contributors:
 *     Tom Seidel - initial API and implementation
 *******************************************************************************/

package de.spiritlink.fieldassist;

import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.IControlContentAdapter;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

/**
 * @since 3.2
 *
 */
public abstract class ContentAssistFieldConfiguration {

    
    protected FieldDecoration warningDecoration = null;
    
    protected FieldDecoration errorDecoration = null;
    
    public static String DEC_CONTENTASSIST = "de.spiritlink.fieldassist.contentAssistDecoration"; //$NON-NLS-1$
    
    public FieldDecoration getRequiredFieldDecoration() {
        return FieldDecorationRegistry.getDefault().getFieldDecoration(
                FieldDecorationRegistry.DEC_REQUIRED);
    }

    public FieldDecoration getFieldDecoration() {
        final FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
        FieldDecoration dec = registry
                .getFieldDecoration(DEC_CONTENTASSIST);
        if (dec == null) {
            final FieldDecoration standardDecoration = registry
                    .getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
            registry.registerFieldDecoration(
                    DEC_CONTENTASSIST, 
                            getFieldDecorationMessage()
                            , standardDecoration.getImage());
            dec = registry
                    .getFieldDecoration(DEC_CONTENTASSIST);
        }
        return dec;

    }
    
    public String getFieldDecorationMessage() {
        return "Content assist available. Press " + getTriggerKey();
    }
    
    public String getTriggerKey() {
        return "Ctrl+Space";
    }
    
    public boolean isPropagate() {
        return true;
    }
    
    public int getDelay() {
        return 1000;
    }
    
    public int getContentProposalAcceptance() {
        return ContentProposalAdapter.PROPOSAL_INSERT;
    }
    
    
    public int getContentAssistFilterStyle() {
        return ContentProposalAdapter.FILTER_CHARACTER;
    }
    
    
    

    public boolean isError(ContentAssistField field) {
        return false;
    }
    public boolean isWarning(ContentAssistField field) {
        return false;
    }

    public FieldDecoration getErrorDecoration(ContentAssistField field) {
        if (this.errorDecoration == null) {
            final FieldDecoration standardError = FieldDecorationRegistry
            .getDefault().getFieldDecoration(
                    FieldDecorationRegistry.DEC_ERROR);
            final String errorMsg = getErrorMessage(field);
            if (errorMsg == null) {
                this.errorDecoration = standardError;
            } else {
                this.errorDecoration = new FieldDecoration(standardError
                        .getImage(),errorMsg);
            }
        }
        return this.errorDecoration;

    }

    public FieldDecoration getWarningDecoration(ContentAssistField field) {
        if (this.warningDecoration == null) {
            final FieldDecoration standardWarning = FieldDecorationRegistry
            .getDefault().getFieldDecoration(
                    FieldDecorationRegistry.DEC_WARNING);
            final String warningMessage = getWarningMessage(field);
            if (warningMessage == null) {
                this.warningDecoration = standardWarning;
            } else {
                this.warningDecoration = new FieldDecoration(standardWarning
                        .getImage(), warningMessage);
            }
        }
        return this.warningDecoration;
    }
    
    public IControlContentAdapter getContentAdapter() {
        return new TextContentAdapter();
    }
    
    public boolean isShowErrorDecoration() {
        return false;
    }
    
    public boolean isShowWarningDecoration() {
        return false;
    }
    public boolean isShowErrorColor() {
        return false;
    }
    
    public boolean isShowRequiredColor() {
        return false;
    }
    
    public boolean isShowRequiredFieldDecoration() {
        return false;
    }

    public String getErrorMessage(ContentAssistField field) {
        return null;
    }

    public String getWarningMessage(ContentAssistField field) {
        return null;
    }

    /**
     * @return
     */
    public boolean hasContentAssist() {
        return true;
    }

    /**
     * @param contentAssistField
     * @return
     */
    public boolean isRequired(ContentAssistField contentAssistField) {
        return true;
    }
    
    public int getDecorationPosition() {
        return SWT.TOP | SWT.LEFT;
    }

    /**
     * @return
     */
    public IContentProposalProvider getContentProposalProvider() {
        final String[] user = new String[] {"tom","bob"};
        return new IContentProposalProvider() {
            public IContentProposal[] getProposals(String contents, int position) {
                final IContentProposal[] proposals = new IContentProposal[user.length];
                for (int i = 0; i < user.length; i++) {
                    final String puser = user[i];
                    proposals[i] = new IContentProposal() {
                        public String getContent() {
                            return puser;
                        }

                        public String getLabel() {
                            return null;
                        }

                        public String getDescription() {
                            return "Description";
                        }

                        public int getCursorPosition() {
                            return puser.length();
                        }
                    };
                }
                return proposals;
            }
        };
    }

    /**
     * @return
     */
    public ILabelProvider getLableProvider() {
        return new LabelProvider() {
            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
             */
            public Image getImage(Object element) {
                return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEF_VIEW);
            }
            /* (non-Javadoc)
             * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
             */
            public String getText(Object element) {
                return String.valueOf(((IContentProposal)element).getContent());
            }
        };
    }

}

