/*
 * Created on 11/08/2003
 *
 */
package com.quantum.view.bookmark;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import com.quantum.Messages;
import com.quantum.QuantumPlugin;
import com.quantum.model.Bookmark;
import com.quantum.model.xml.ModelToXMLConverter;
import com.quantum.util.QuantumUtil;
import com.quantum.util.xml.XMLHelper;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.SelectionListenerAction;
import org.w3c.dom.Document;
import org.w3c.dom.Element;


final class CopyAction extends SelectionListenerAction {
	private IViewPart view;
    private BookmarkClipboard bookmarkClipboard;
    
	/**
	 * @param BookmarkView
	 */
	public CopyAction(IViewPart view, BookmarkClipboard bookmarkClipboard, 
        ISelectionProvider selectionProvider) {
        super(Messages.getString(CopyAction.class.getName() + ".text"));
        setImageDescriptor(QuantumPlugin.getImageDescriptor("copy.gif"));
		this.view = view;
        this.bookmarkClipboard = bookmarkClipboard;
        selectionProvider.addSelectionChangedListener(this);
	}
	public void run() {
        
        List list = getSelectedNonResources();
        Object selection = list.get(0);
        
		if (selection instanceof BookmarkNode) {
            Bookmark bookmark = ((BookmarkNode) selection).getBookmark();
			this.bookmarkClipboard.setBookmark(bookmark);
			QuantumPlugin.getDefault().getSysClip().setContents(
				new Object[] { bookmark.getName()},
				new Transfer[] { TextTransfer.getInstance()});
			
		} else if (selection instanceof EntityNode) {
            try {
    			Document doc = XMLHelper.createEmptyDocument();
                Element root = doc.createElement("metadata");
                doc.appendChild(root);
    			ModelToXMLConverter.getInstance().convert(root, ((EntityNode) selection).getEntity());
    			StringWriter text = new StringWriter();
    			try {
                    XMLHelper.createDOMSerializer(text).serialize(doc);
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			String textXml = new String(text.getBuffer());
                QuantumPlugin.getDefault().getSysClip().setContents(
    				new Object[] { textXml },
    				new Transfer[] { TextTransfer.getInstance()});
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
		} else if (selection instanceof ColumnNode) {
			String copyText = ""; //$NON-NLS-1$
			Iterator iter = list.iterator();
			IPreferenceStore store = QuantumPlugin.getDefault().getPreferenceStore();
	
			while (iter.hasNext()) {
				Object current = iter.next();
				if (current instanceof ColumnNode) {
					ColumnNode column = (ColumnNode) current;
					if (column != null) {
						copyText += column.getName();
						if (iter.hasNext()) copyText += QuantumUtil.trasposeEscape(store.getString("copyColumnSeparator")); //$NON-NLS-1$
					}
				}
			}
			
            QuantumPlugin.getDefault().getSysClip().setContents(
				new Object[] { copyText },
				new Transfer[] { TextTransfer.getInstance()});				
		}
		
	}
    /* (non-Javadoc)
     * @see org.eclipse.ui.actions.SelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
     */
    protected boolean updateSelection(IStructuredSelection selection) {
        boolean enabled = super.updateSelection(selection);
        
        return enabled; 
    }

}