/*******************************************************************************
 * 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"; //$NON-NLS-1$
	
	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);
			String[] filterExtensions = new String[2];
			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
			filterExtensions[1] = "*.*"; //$NON-NLS-1$
			fileDialog.setFilterExtensions(filterExtensions);
			fileDialog.setText(Messages.DesignerPaletteCustomizerDialog_ExportCustomizations);
			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);
			String[] filterExtensions = new String[2];
			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
			filterExtensions[1] = "*.*"; //$NON-NLS-1$
			fileDialog.setFilterExtensions(filterExtensions);
			fileDialog.setText(Messages.DesignerPaletteCustomizerDialog_ImportCustomizations);
			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 static 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			
		}

		
	}
}
