/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.common.snippets.internal.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteTemplateEntry;
import org.eclipse.gef.ui.palette.PaletteCustomizer;
import org.eclipse.gef.ui.palette.customize.EntryPage;
import org.eclipse.wst.common.snippets.core.ISnippetCategory;
import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
import org.eclipse.wst.common.snippets.internal.Logger;
import org.eclipse.wst.common.snippets.internal.editors.ISnippetEditor;
import org.eclipse.wst.common.snippets.internal.model.SnippetManager;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawerFactory;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItemFactory;


public class SnippetsCustomizer extends PaletteCustomizer {
	protected List activeEditors = new ArrayList();
	protected List factories = null;

	public SnippetsCustomizer() {
		super();
		factories = new ArrayList(2);
		factories.add(new SnippetPaletteDrawerFactory());
		factories.add(new SnippetPaletteItemFactory());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canAdd(org.eclipse.gef.palette.PaletteContainer,
	 *      org.eclipse.gef.palette.PaletteEntry)
	 */
	protected boolean canAdd(PaletteContainer container, PaletteEntry entry) {
		if (entry instanceof ISnippetCategory) {
			return super.canAdd(container, entry);
		}
		else if (entry.getType().equals(PaletteTemplateEntry.PALETTE_TYPE_TEMPLATE)) {
			return container.getType().equals(PaletteDrawer.PALETTE_TYPE_DRAWER) && ((ISnippetsEntry) entry).getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS && super.canAdd(container, entry);
		}
		return ((ISnippetsEntry) entry).getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS && super.canAdd(container, entry);
	}

	public boolean canDelete(PaletteEntry entry) {
		return ((ISnippetsEntry) entry).getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS && super.canDelete(entry);
	}

	public boolean canExport(PaletteEntry entry) {
		return ((ISnippetsEntry) entry).getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS && entry.getType() == PaletteDrawer.PALETTE_TYPE_DRAWER;
	}

	public boolean canImport(PaletteEntry entry) {
		return true;
	}

	public boolean canMoveDown(PaletteEntry entry) {
		if (entry instanceof ISnippetCategory)
			return super.canMoveDown(entry);
		return ((ISnippetsEntry) entry).getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS && super.canMoveDown(entry);
	}

	public boolean canMoveUp(PaletteEntry entry) {
		if (entry instanceof ISnippetCategory)
			return super.canMoveUp(entry);
		return ((ISnippetsEntry) entry).getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS && super.canMoveUp(entry);
	}

	/**
	 * Find and instantiate the editor class
	 */

	public List getNewEntryFactories() {
		return factories;
	}

	/**
	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#getPropertiesPage(org.eclipse.gef.palette.PaletteEntry)
	 */
	public EntryPage getPropertiesPage(PaletteEntry entry) {
		if (entry instanceof SnippetPaletteDrawer) {
			return new SnippetDrawerEntryPage();
		}
		else if (entry instanceof SnippetPaletteItem && entry.getUserModificationPermission() == PaletteEntry.PERMISSION_FULL_MODIFICATION) {
			return new SnippetTemplateEntryPage(this);
		}
		return super.getPropertiesPage(entry);
	}

	public void revertToSaved() {
		activeEditors = new ArrayList(0);
		SnippetManager.getInstance().resetDefinitions();
	}

	public void save() {
		// The EntryPage's apply() is final, so we have to force updates now
		for (int i = 0; i < activeEditors.size(); i++) {
			try {
				((ISnippetEditor) activeEditors.get(i)).updateItem();
			}
			catch (Exception e) {
				Logger.logException(e);
			}
		}

		activeEditors = new ArrayList(0);

		try {
			SnippetManager.getInstance().saveDefinitions();
		}
		catch (Exception e) {
			Logger.logException(e);
		}
	}
}