/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.editors.palette;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.palette.PaletteCustomizer;
import org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction;
import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.jsf.common.ui.internal.utils.PluginImageHelper;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;

/**
 * Customization dialog for Web Page Designer palette items
 * @author mengbo
 * @version 1.5
 */
public class DesignerPaletteCustomizerDialog extends PaletteCustomizerDialog {
	private static final String DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME = "WPDPaletteCustomizations.xml";
	
	private static String DEFAULTEXTENSION = ".xml";//$NON-NLS-1$ 

	/**
	 * Constructor
	 * @param shell
	 * @param customizer
	 * @param root
	 */
	public DesignerPaletteCustomizerDialog(Shell shell,
			PaletteCustomizer customizer, PaletteRoot root) {
		super(shell, customizer, root);

	}

	private PropertyChangeListener applyButtonUpdater = new PropertyChangeListener() {


		public void propertyChange(PropertyChangeEvent evt) {
			Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
			if (applyButton == null) {
				return;
			}
			applyButton.setEnabled(true);
		}
	};

	/* (non-Javadoc)
	 * @see org.eclipse.jface.window.Window#open()
	 */
	public int open() {
		// save the current state before open
		// save();
		return super.open();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#setActiveEntry(org.eclipse.gef.palette.PaletteEntry)
	 */
	protected void setActiveEntry(PaletteEntry entry) {
		//remove listener on previous entry before adding to new entry
		PaletteEntry pre = getSelectedPaletteEntry();
		if (pre != null) {
			pre.removePropertyChangeListener(applyButtonUpdater);
		} else {
			getButton(APPLY_ID).setEnabled(false);
		}
		
		if (entry != null)
			entry.addPropertyChangeListener(applyButtonUpdater);
		
		super.setActiveEntry(entry);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#save()
	 */
	protected void save() {
		super.save();
		Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
		if (applyButton != null) {
			applyButton.setEnabled(false);
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
	 */
	protected void createButtonsForButtonBar(Composite parent) {
		super.createButtonsForButtonBar(parent);
		getButton(APPLY_ID).setEnabled(false);
		// save();
	}

	/* (non-Javadoc)
	 * Export action
	 *
	 */
	private class ExportAction extends PaletteCustomizationAction {
		
		/**
		 * Constructor
		 */
		public ExportAction() {
			setEnabled(true);
			setText(PageDesignerResources.getInstance().getString(
					"DesignerPaletteCustomizerDialog.label.export")); //$NON-NLS-1$
			setImageDescriptor(PluginImageHelper.getInstance()
					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_EXPORT,
							PDPlugin.getPluginId()));
			setDisabledImageDescriptor(PluginImageHelper.getInstance()
					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_EXPORT,
							PDPlugin.getPluginId()));
			setHoverImageDescriptor(PluginImageHelper.getInstance()
					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_EXPORT,
							PDPlugin.getPluginId()));
		}

		private void handleExport() {
			final FileDialog fileDialog = new FileDialog(PDPlugin
					.getActiveWorkbenchShell());
			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME); //$NON-NLS-1$
			String[] filterExtensions = new String[2];
			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
			filterExtensions[1] = "*.*"; //$NON-NLS-1$
			fileDialog.setFilterExtensions(filterExtensions);
			fileDialog.setText("Export Palette Customizations");
			String filename = fileDialog.open();
			if (filename != null) {
				if (!filename.endsWith(DEFAULTEXTENSION)) {
					filename = filename + DEFAULTEXTENSION;
				}
				DesignerPaletteCustomizationsHelper
					.exportCustomizations(PaletteItemManager.getCurrentInstance(), filename);


				updateActions();
			}
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.action.Action#run()
		 */
		public void run() {
			handleExport();
		}

		/* (non-Javadoc)
		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
		 */
		public void update() {
			//boolean enabled = false;
			PaletteEntry entry = getSelectedPaletteEntry();
			if (entry != null) {
				// if (getCustomizer() instanceof DesignerPaletteCustomizer)
				// enabled = ((DesignerPaletteCustomizer)
				// getCustomizer()).canExport(entry);
			}
			setEnabled(true);
		}

	}

	/* (non-Javadoc)
	 * Import action
	 */
	private class ImportAction extends PaletteCustomizationAction {
		private DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog;
		
		/**
		 * Constructor
		 * @param designerPaletteCustomizerDialog
		 */
		public ImportAction(DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog) {
			super();
			this.designerPaletteCustomizerDialog = designerPaletteCustomizerDialog;
			setEnabled(true);
			setText(PageDesignerResources.getInstance().getString(
					"DesignerPaletteCustomizerDialog.label.import")); //$NON-NLS-1$
			setImageDescriptor(PluginImageHelper.getInstance()
					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_IMPORT,
							PDPlugin.getPluginId()));
			setDisabledImageDescriptor(PluginImageHelper.getInstance()
					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_IMPORT,
							PDPlugin.getPluginId()));
			setHoverImageDescriptor(PluginImageHelper.getInstance()
					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_IMPORT,
							PDPlugin.getPluginId()));
			
		}

		private void handleImport() {
//			PaletteEntry entry = designerPaletteCustomizerDialog.getSelectedPaletteEntry();
			final FileDialog fileDialog = new FileDialog(PDPlugin
					.getActiveWorkbenchShell());
			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME); //$NON-NLS-1$
			String[] filterExtensions = new String[2];
			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
			filterExtensions[1] = "*.*"; //$NON-NLS-1$
			fileDialog.setFilterExtensions(filterExtensions);
			fileDialog.setText("Import Palette Customizations");
			String filename = fileDialog.open();
			if (filename != null) {		
					//deselect current entry first
					designerPaletteCustomizerDialog.close();		
					
//					getCustomizer().revertToSaved();
					DesignerPaletteCustomizationsHelper
						.importCustomizations((DesignerPaletteCustomizer)getCustomizer(), filename);
					
//					designerPaletteCustomizerDialog.setActiveEntry(entry);
					((DesignerPaletteCustomizer)getCustomizer()).getDesignerPaletteRoot().refresh();
					designerPaletteCustomizerDialog.open();
//					designerPaletteCustomizerDialog.setActiveEntry(entry);
			}
		}

		public void run() {
			handleImport();
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
		 */
		public void update() {
			//nothing to do
		}
	}

	/**
	 * @return import action
	 */
	public Action getImportAction() {
		return new ImportAction(this);
	}

	/**
	 * @return export action
	 */
	public Action getExportAction() {
		return new ExportAction();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createOutlineActions()
	 */
	protected List createOutlineActions() {
		List actions = super.createOutlineActions();
		actions.remove(0);// remove new action
		actions.remove(0);// remove delete action
		actions.add(new ImportAction(this));
		actions.add(new ExportAction());

		return actions;
	}
	
	@Override
	protected TreeViewer createOutlineTreeViewer(Composite composite) {
		TreeViewer viewer = super.createOutlineTreeViewer(composite);
		viewer.setContentProvider(new DesignerPaletteContentProvider());
		return viewer;
	}

	
	/**
	 * Content provider for dialog.
	 * Displays only {@link TaglibPaletteDrawer}s
	 */
	private class DesignerPaletteContentProvider implements ITreeContentProvider {

		public Object[] getChildren(Object parentElement) {
			if (parentElement instanceof DesignerPaletteRoot){
				List libs = new ArrayList();
				List children = ((DesignerPaletteRoot)parentElement).getChildren();				
				if (!children.isEmpty()) {
					for (Iterator it=children.iterator();it.hasNext();){
						PaletteEntry entry = (PaletteEntry)it.next();
						if (entry instanceof TaglibPaletteDrawer)
							libs.add(entry);
					}
					if (!libs.isEmpty())
						return libs.toArray();
				}
			}
			return null;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
		 */
		public Object getParent(Object element) {
			return ((PaletteEntry)element).getParent();
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
		 */
		public boolean hasChildren(Object element) {
			return false;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
		 */
		public Object[] getElements(Object inputElement) {
			Object[] elements = new Object[0];
			if (inputElement instanceof DesignerPaletteRoot){
				elements = getChildren(inputElement);
				if (elements == null) {
					elements = new Object[0];
				}
			}
			return elements;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
		 */
		public void dispose() {
			//nothing to do
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
		 */
		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
			//won't change			
		}

		
	}
}
