/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
 package org.eclipse.osbp.ide.core.ui.softwarefactory.util;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;

public class ResourceChangeListener implements IResourceChangeListener {

	@Override
	public void resourceChanged(IResourceChangeEvent event) {
		String doing = "";
		int type = event.getType();
		if ((type & org.eclipse.core.resources.IResourceChangeEvent.POST_CHANGE)==org.eclipse.core.resources.IResourceChangeEvent.POST_CHANGE) {
			doing += "POST_CHANGE-";
		}
		if ((type & org.eclipse.core.resources.IResourceChangeEvent.PRE_CLOSE)==org.eclipse.core.resources.IResourceChangeEvent.PRE_CLOSE) {
			doing += "PRE_CLOSE-";
		}
		if ((type & org.eclipse.core.resources.IResourceChangeEvent.PRE_DELETE)==org.eclipse.core.resources.IResourceChangeEvent.PRE_DELETE) {
			doing += "PRE_DELETE-";
		}
		if ((type & org.eclipse.core.resources.IResourceChangeEvent.PRE_BUILD)==org.eclipse.core.resources.IResourceChangeEvent.PRE_BUILD) {
			doing += "PRE_BUILD-";
		}
		if ((type & org.eclipse.core.resources.IResourceChangeEvent.POST_BUILD)==org.eclipse.core.resources.IResourceChangeEvent.POST_BUILD) {
			doing += "POST_BUILD-";
		}
		if ((type & org.eclipse.core.resources.IResourceChangeEvent.PRE_REFRESH)==org.eclipse.core.resources.IResourceChangeEvent.PRE_REFRESH) {
			doing += "PRE_REFRESH-";
		}
		doing = iterateChildren(doing, event.getDelta().getAffectedChildren());
		System.err.println(doing);
	}
	
	private String iterateChildren(String inDoing, IResourceDelta[] deltas) {
		String doing = inDoing;
		if (deltas != null) {
			for(IResourceDelta delta:deltas) {
				IResource resource = delta.getResource();
				if (resource != null) {
					doing += " "+resource.getName();
				}
				doing = iterateChildren(doing, delta.getAffectedChildren());
			}
		}
		return doing;
	}
}
