/*******************************************************************************
 * Copyright (c) 2011 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.server.ui.internal.cnf;

import java.util.ArrayList;

import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IDecoratorManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.CommonViewer;

/**
 * 
 * The purpose of this class is proportionate a way to register those UI Decorators that 
 * needs to be updated after a Server has been modified. Basically this handler is a list
 * of IDs of UI Decorators. 
 * 
 * @author israelgd@mx1.ibm.com
 */
public class ServerDecoratorsHandler {
	
	final static String NAVIGATOR_DECORATOR_ID = "org.eclipse.wst.server.ui.navigatorDecorator";
	
	protected static ArrayList <String> UIDecoratorsIDs = new ArrayList<String>();
	
	static {
		UIDecoratorsIDs.add(NAVIGATOR_DECORATOR_ID);
	}
	protected static IDecoratorManager decoratorManager = null;
	
	protected static IDecoratorManager getDecoratorManager(){
		if (decoratorManager == null){
			decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();
		}
		return decoratorManager;
	}
	/**
	 * Used to refresh the Server Decorators previously added and set selection after that. 
	 * Triggers the decoration event of each Decorator.
	 * */
	public static void refresh(final CommonViewer tableViewer) {
		Display.getDefault().asyncExec(new Runnable() {
			public void run() {		
				IDecoratorManager dm = PlatformUI.getWorkbench().getDecoratorManager();
				ArrayList<String> UIDecoratorsIDsClone = (ArrayList<String>)UIDecoratorsIDs.clone();
				for (String decoratorId: UIDecoratorsIDsClone) {
					dm.update(decoratorId);
				}
				if (tableViewer != null){
					tableViewer.setSelection(tableViewer.getSelection());
				}
			}
		});
	}
	
	/**
	 * Used to refresh the Server Decorators previously added.
	 * @param server
	 * */
	public static void refresh() {
		refresh(null);
	}
	
	/**
	 * Remove a UI Decorator from the Decorator Handler.
	 * @param decoratorID
	 */
	public static void removeUIDecoratorsID(String decoratorID) {
		synchronized (UIDecoratorsIDs) {
			UIDecoratorsIDs.remove(decoratorID);
		}
	}

	/**
	 * Adds a new UI Decorator from the Decorator Handler.
	 * @param decoratorID
	 */
	public static void addUIDecoratorsIDs(String decoratorID) {
		synchronized (UIDecoratorsIDs) {
			if(!UIDecoratorsIDs.contains(decoratorID)){
				UIDecoratorsIDs.add(decoratorID);
			}
		}
	}
}
