/**
 * Copyright (c) 2009 Anyware Technologies 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:
 *     Anyware Technologies - initial API and implementation
 *
 * $Id: PropertiesMasterDetail.java,v 1.13 2009/07/28 16:19:13 bcabe Exp $
 */
package org.eclipse.pde.ds.ui.internal.editor.masterdetail;

import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.jface.viewers.*;
import org.eclipse.pde.ds.scr.Properties;
import org.eclipse.pde.ds.scr.Property;
import org.eclipse.pde.ds.ui.internal.editor.detailpart.properties.PropertiesDetailsPart;
import org.eclipse.pde.ds.ui.internal.editor.detailpart.properties.PropertyDetailsPart;
import org.eclipse.pde.emfforms.editor.EmfFormEditor;
import org.eclipse.pde.emfforms.editor.EmfMasterDetailBlock;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.IDetailsPage;

public class PropertiesMasterDetail extends EmfMasterDetailBlock {

	private Button addButtonProperty;
	private Button addButtonProperties;

	public PropertiesMasterDetail(EmfFormEditor<?> editor) {
		super(editor, "Properties");
		useGenericButton = false;
	}

	public IDetailsPage getPage(Object key) {
		if (key instanceof Class<?>) {
			if (Properties.class.isAssignableFrom((Class<?>) key)) {
				return new PropertiesDetailsPart(parentEditor);
			}
			if (Property.class.isAssignableFrom((Class<?>) key)) {
				return new PropertyDetailsPart(parentEditor);
			}
		}
		return null;
	}

	@Override
	protected void createCustomButtons(Composite parent) {
		addButtonProperty = createButton(parent, "Add Property");
		addButtonProperties = createButton(parent, "Add Properties");
	}

	public Button getAddButtonProperty() {
		return addButtonProperty;
	}

	public Button getAddButtonProperties() {
		return this.addButtonProperties;
	}

	@Override
	protected ViewerFilter getTreeFilter() {
		return new ViewerFilter() {
			@Override
			public boolean select(Viewer viewer, Object parentElement, Object element) {
				Object unwrappedElement = AdapterFactoryEditingDomain.unwrap(element);
				return unwrappedElement instanceof Properties || unwrappedElement instanceof Property;
			}
		};
	}

	@Override
	protected IFilter getCreateSiblingContextMenuFilter() {
		return new IFilter() {

			public boolean select(Object toTest) {
				if (toTest instanceof FeatureMap.Entry) {
					Object val = ((FeatureMap.Entry) toTest).getValue();
					return (val instanceof Property || val instanceof Properties);
				}
				return true;

			}
		};
	}
}
