/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.common.editor.form;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;

import org.jboss.tools.common.meta.XChild;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.ui.ModelUIPlugin;

public class FormPlace {
	Composite composite = null;
	XModelObject selected = null;
	IForm form = null;
	
	public Control createControl(Composite parent) {
		composite = new Composite(parent, SWT.NONE);
		composite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		composite.setLayout(layout);
		if(form != null) {
			form.createControl(composite);
		}
		return composite;
	}

	public Control getControl() {
		return composite;
	}
	
	public void setSelectedObject(XModelObject object) {
		if(selected == object) return;
		selected = object;
		Class c = getFormClassForSelection();
		if(form == null || c == null || form.getClass() != c/* || DefaultChildrenForm.class == c*/) {
			if(form != null) {
				form.dispose();
				form = null;
			} 
			if(c != null) installForm(c);
		} else {
			form.setInput(selected);
		}
	}
	
	private void installForm(Class cls) {
		try {
			form = (IForm)cls.newInstance();
		} catch (InstantiationException e) {
			ModelUIPlugin.getPluginLog().logError(e);
			return;
		} catch (IllegalAccessException e) {
			ModelUIPlugin.getPluginLog().logError(e);
			return;
		}
		form.setInput(selected);
		if(composite != null && !composite.isDisposed()) {
			Control c = form.createControl(composite);
			c.setLayoutData(new GridData(GridData.FILL_BOTH));
			composite.update();
			composite.layout();
		}
	}

	public void dispose() {
		if(form != null) form.dispose();
		form = null;
		if(composite != null) {
			if(!composite.isDisposed()) composite.dispose();
			composite = null;
		}
	}
	
	private Class getFormClassForSelection() {
		if(selected == null) return null;
		XChild[] cs = selected.getModelEntity().getChildren();
		int cl = cs.length;
		if(cl == 0) return PropertyForm.class;
		if(cl > 1) return PropertyForm.class;
		if(cl == 1) return DefaultChildrenForm.class;
		return null;
	}
	
	public void update() {
		if(form != null) form.update();
	}
	
}
