/**
 *                                                                            
 *  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 v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Florian Pirchner - Initial implementation
 * 
 */

package org.eclipse.osbp.ecview.extension.grid.editparts.emf;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.osbp.ecview.core.common.context.IViewContext;
import org.eclipse.osbp.ecview.core.common.editpart.emf.ElementEditpart;
import org.eclipse.osbp.ecview.extension.grid.CxGrid;
import org.eclipse.osbp.ecview.extension.grid.CxGridFooterRow;
import org.eclipse.osbp.ecview.extension.grid.CxGridHeaderRow;
import org.eclipse.osbp.ecview.extension.grid.CxGridMetaRow;
import org.eclipse.osbp.ecview.extension.grid.CxGridPackage;
import org.eclipse.osbp.ecview.extension.grid.editparts.IGridMetaRowEditpart;
import org.eclipse.osbp.ecview.extension.grid.editparts.presentation.IGridPresentation;
import org.eclipse.osbp.ecview.extension.grid.util.CxGridUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The Class GridMetaRowEditpart.
 */
public abstract class GridMetaRowEditpart extends
		ElementEditpart<CxGridMetaRow> implements IGridMetaRowEditpart {

	/** The Constant LOGGER. */
	@SuppressWarnings("unused")
	private static final Logger LOGGER = LoggerFactory
			.getLogger(GridMetaRowEditpart.class);

	/** The cx grid. */
	private CxGrid cxGrid;

	/**
	 * Instantiates a new grid meta row editpart.
	 */
	protected GridMetaRowEditpart() {

	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.ecview.core.common.editpart.emf.ElementEditpart#initialize(org.eclipse.osbp.ecview.core.common.model.core.YElement)
	 */
	@Override
	public void initialize(IViewContext context, CxGridMetaRow model) {
		super.initialize(context, model);

		cxGrid = CxGridUtil.getGrid(model);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.ecview.core.common.editpart.emf.ElementEditpart#handleModelAdd(int, org.eclipse.emf.common.notify.Notification)
	 */
	@Override
	protected void handleModelAdd(int featureId, Notification notification) {
		switch (featureId) {
		case CxGridPackage.CX_GRID_META_ROW__CUSTOM_CELLS:
			updateCustomCellsPresentation();
			break;
		case CxGridPackage.CX_GRID_META_ROW__GROUPINGS:
			updateRowsPresentation();
			break;
		default:
			super.handleModelSet(featureId, notification);
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.ecview.core.common.editpart.emf.ElementEditpart#handleModelRemove(int, org.eclipse.emf.common.notify.Notification)
	 */
	@Override
	protected void handleModelRemove(int featureId, Notification notification) {
		switch (featureId) {
		case CxGridPackage.CX_GRID_META_ROW__CUSTOM_CELLS:
			updateCustomCellsPresentation();
			break;
		case CxGridPackage.CX_GRID_META_ROW__GROUPINGS:
			updateRowsPresentation();
			break;
		default:
			super.handleModelSet(featureId, notification);
		}
	}

	/**
	 * Update custom cells presentation.
	 */
	protected void updateCustomCellsPresentation() {
		IGridPresentation<?> presentation = GridEditpart.getGridPresentation(
				viewContext, getModel());
		if (presentation != null) {
			presentation.updateColumns();
		}
	}

	/**
	 * Update rows presentation.
	 */
	protected void updateRowsPresentation() {
		IGridPresentation<?> presentation = GridEditpart.getGridPresentation(
				viewContext, cxGrid);
		if (presentation != null) {
			if (getModel() instanceof CxGridHeaderRow) {
				presentation.updateHeader();
			} else if (getModel() instanceof CxGridFooterRow) {
				presentation.updateFooter();
			} else {
				throw new IllegalArgumentException("Not a supported option!");
			}
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.ecview.core.common.editpart.emf.ElementEditpart#internalDispose()
	 */
	@Override
	protected void internalDispose() {
		try {
			cxGrid = null;
		} finally {
			super.internalDispose();
		}
	}
}
