/******************************************************************************
 * Copyright (c) 2002, 2006 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.gmf.tests.runtime.diagram.ui.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;

/**
 * @author gsturov
 * 
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates.
 */
public class DiagramState {
	
	public ArrayList props = new ArrayList();
	
	public DiagramState(DiagramEditPart diagramEditPart) {

		//EditPartViewer viewer = diagramEditPart.getViewer();
		final Diagram d = (Diagram) diagramEditPart.getModel();
		
		ArrayList views = new ArrayList();
		views.addAll(d.getChildren());
		
		Collections.sort(views, new Comparator() {
			public int compare(Object o1, Object o2) {
				return (ViewUtil.getIdStr((View)o1).compareTo(ViewUtil.getIdStr(((View) o2))));
			}
		});
		
//		for (Iterator it = views.iterator(); it.hasNext();) {
			//TODO sc - add check back in
//			IView view = (IView) it.next();
//			props.add(view.getIdStr());
//			IGraphicalEditPart editpart = (IGraphicalEditPart) viewer.getEditPartRegistry().get(view);
//			IPropertySource propSource = (IPropertySource) editpart.getAdapter(IPropertySource.class);
//			IPropertyDescriptor [] descriptors = propSource.getPropertyDescriptors();
//            
//
//            ArrayList descriptorList= new ArrayList();
//            descriptorList.addAll(Arrays.asList(descriptors));
//            
//            // We are sorting the list of properties based on their id
//            // Before we had assumed that the order of the properties was
//            // always the same if the view had the same set of properties
//            // this assumption is now incorrect.  Don't know why .. just
//            // start changed after a build.
//            Collections.sort(descriptorList,new Comparator() {
//               public int compare(Object ob1,Object ob2){
//                String a1= ((IPropertyDescriptor)ob1).getId().toString();
//                String a2 =((IPropertyDescriptor)ob2).getId().toString();
//                return a1.compareTo(a2);
//               }
//            });
//            
//            for (Iterator it1 = descriptorList.iterator(); it1.hasNext();){
//                IPropertyDescriptor descriptor = (IPropertyDescriptor)it1.next();
//                ILabelProvider label = descriptor.getLabelProvider();
//                Object id = descriptor.getId();
//                String name = descriptor.getDisplayName();
//                String val = label.getText(propSource.getPropertyValue(id));
//                
//                props.add("  " + name + " = " + val); //$NON-NLS-1$ //$NON-NLS-2$
//            }           			
//		
		//}
	}

	public boolean equals(Object obj) {
		if (!(obj instanceof DiagramState))
			return false;
			
		DiagramState state = (DiagramState) obj;
		
		int i1 = props.size();
		int i2 = state.props.size();
		
		if (i1 > i2) {
			reportDifference(i1 - 1, state);
			return false;
		}
		
		if (i2 > i1) {
			reportDifference(i2 - 1, state);
			return false;
		}
		
		int i = 0;
		for (Iterator it = props.iterator(); it.hasNext();) {
			String s1 = (String) it.next();
			String s2 = (String) state.props.get(i);
			if (!s1.equals(s2)) {
				reportDifference(i, state);
				return false;
			}
			i++;
		}
		
		return true;		
	}
	
	public void reportDifference(int propIndex, DiagramState state) {
		
		System.out.println("-----------------------------------------------------"); //$NON-NLS-1$
		System.out.println("Diagram Status difference report. See the last entry!"); //$NON-NLS-1$
		
		int i1 = props.size();
		int i2 = state.props.size();
		
		for (int i = 0; i <= propIndex; i++) {
			String s1 = i <= i1 - 1 ? (String) props.get(i) : "---------"; //$NON-NLS-1$
			String s2 = i <= i2 - 1 ? (String) state.props.get(i) : "---------"; //$NON-NLS-1$
			String s = s1 + "    " + s2; //$NON-NLS-1$
			System.out.println(s);
		}
		System.out.println("-----------------------------------------------------"); //$NON-NLS-1$
	}
}

