/*
 * $Id$
 *
 * Copyright (c) 2006 by the TeXlipse team.
 * 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
 */
package net.sourceforge.texlipse.model;

import java.util.Arrays;

import net.sourceforge.texlipse.TexlipsePlugin;
import net.sourceforge.texlipse.properties.TexlipseProperties;

import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ContextInformation;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Point;

/**
 * Manages style completions.
 * 
 * (still work in progress)
 * 
 * @author Oskar Ojala
 */
public class TexStyleCompletionManager implements IPropertyChangeListener{

//    private Map keyValue;
    private static TexStyleCompletionManager theInstance;

    private String[] STYLETAGS = new String[] { 
        "\\textbf{", "\\textit{", "\\textrm{", "\\textsf{", "\\textsc", "\\textsl{", "\\texttt{","\\emph{", "{\\huge", "{\\Huge"
    };
    private String[] STYLELABELS = new String[] { 
        "bold", "italic", "roman", "sans serif", "small caps", "slanted", "teletype", "emphasize", "huge", "Huge"
    };
    
    /**
     * Creates a new style completion manager
     */
    private TexStyleCompletionManager() {
//        this.keyValue = new HashMap();
        readSettings();
    }

    /**
     * Returns the instance of the style completion manager
     * 
     * @return The singleton instance
     */
    public static TexStyleCompletionManager getInstance() {
        if (theInstance == null) {
            theInstance = new TexStyleCompletionManager();
            TexlipsePlugin.getDefault().getPreferenceStore().addPropertyChangeListener(theInstance);
        }
        return theInstance;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
     */
    public void propertyChange(PropertyChangeEvent event) {
        if (event.getProperty().equals(TexlipseProperties.STYLE_COMPLETION_SETTINGS)) {
            readSettings();
        }
    }
    
    /**
     * Reads the smart keys defined at the preference page.
     */
    private void readSettings() {
        String[] props = TexlipsePlugin.getPreferenceArray(TexlipseProperties.STYLE_COMPLETION_SETTINGS);

        Arrays.sort(props);
        
        STYLELABELS = new String[props.length];
        STYLETAGS = new String[props.length];
        
        for (int i = 0; i < props.length; i++) {
            String[] pair = props[i].split("=");

//            int index = keys[i].indexOf('=');
//            if (index <= 0) {
//                continue;
//            }            
//            keyValue.put(keys[i].substring(0, index), keys[i].substring(index+1));
            STYLELABELS[i] = pair[0];
            STYLETAGS[i] = pair[1];
        }
    }

    /**
     * Returns the style completion proposals
     * 
     * @param selectedText The selected text
     * @param selectedRange The selected range
     * @return An array of completion proposals
     */
    public ICompletionProposal[] getStyleCompletions(String selectedText, Point selectedRange) {

        /*
        ICompletionProposal[] result = new ICompletionProposal[keyValue.size()];
        int i=0;
        for (Iterator iter = keyValue.keySet().iterator(); iter.hasNext();) {
            String key = (String) iter.next();
            String value = (String) keyValue.get(key);
            
            
            String replacement = "{" + key + " " + selectedText + "}";
            int cursor = key.length() + 2;
            IContextInformation contextInfo = new ContextInformation(null, value+" Style");
            result[i] = new CompletionProposal(replacement, 
                    selectedRange.x, selectedRange.y,
                    cursor, null, value,
                    contextInfo, replacement);
            i++;
        }
        */
        
        ICompletionProposal[] result = new ICompletionProposal[STYLELABELS.length];
        // Loop through all styles
        for (int i = 0; i < STYLETAGS.length; i++) {
            String tag = STYLETAGS[i];
            
            // Compute replacement text
            String replacement = tag + selectedText + "}";
            
            // Derive cursor position
            int cursor = tag.length() + 1;
            
            // Compute a suitable context information
            IContextInformation contextInfo = 
                new ContextInformation(null, STYLELABELS[i]+" Style");
            
            // Construct proposal
            result[i] = new CompletionProposal(replacement, 
                    selectedRange.x, selectedRange.y,
                    cursor, null, STYLELABELS[i], 
                    contextInfo, replacement);
        }
        return result;
    }
    
    /**
     * Returns the style context.
     * 
     * @return Array of style contexts
     */
    public IContextInformation[] getStyleContext() {
        ContextInformation[] contextInfos = new ContextInformation[STYLELABELS.length];
        
        // Create one context information item for each style
        for (int i = 0; i < STYLELABELS.length; i++) {
            contextInfos[i] = new ContextInformation(null, STYLELABELS[i]+" Style");
        }
        return contextInfos;
    }

}

@@ -4708,16 +4708,40 @@
 ngth() +
+ selectedText.length() +
  1;%0A    

Fix for Bug 2537654 --> Cursor-Position after TexStyleCompletion