// MapRenderer.java
package org.eclipse.stem.ui.views.geographic.map;

/*******************************************************************************
 * Copyright (c) 2007 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
 *******************************************************************************/

import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.stem.jobs.simulation.ISimulation;
import org.eclipse.stem.ui.adapters.color.ColorProviderAdapter;
import org.eclipse.stem.ui.views.geographic.GeographicRenderer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

/**
 * This class renders geographic data (lat/long) into a "flat map" visual
 * representation.
 */
public class MapRenderer extends GeographicRenderer implements ISelectionChangedListener {

	private MapCanvas mapCanvas;
	private MenuManager menuManager;

	/**
	 * @param parent
	 * @param style
	 */
	public MapRenderer(Composite parent, int style) {
		super(parent, style);
		setSize(SWT.DEFAULT, 100);
		
		final FillLayout layout = new FillLayout();
		layout.marginHeight = MARGIN_HEIGHT;
		layout.marginWidth = MARGIN_WIDTH;
		setLayout(layout);

		
		mapCanvas = new MapCanvas(this, SWT.NONE);
		mapCanvas.setGainFactor(gainFactor);
		mapCanvas.setDrawPolygonBorders(drawPolygonBorders);
//		mapCanvas.setPolygonStroke(polygonStroke);
		mapCanvas.setColorProvider(colorProviderAdapter);
		
		pack();

		mapCanvas.addSelectionChangedListener(this);

		menuManager = createContextMenuManager();
		mapCanvas.setMenu(menuManager.createContextMenu(this));
	} // MapRenderer

	/**
	 * @see org.eclipse.stem.ui.views.geographic.GeographicRenderer#render(org.eclipse.stem.ui.views.geographic.map.StemPolygonsList)
	 */
	@Override
	public void render(StemPolygonsList polygonsToRender, ISimulation simulation) {
		mapCanvas.setGainFactor(this.gainFactor);
		mapCanvas.setUseLogScaling(this.useLogScaling);
		mapCanvas.render(polygonsToRender, simulation);
	}

	
	/**
	 * @return
	 */
	public MapCanvas getCanvas()
	{
		return mapCanvas;
	}
	
	/**
	 * @see org.eclipse.stem.ui.views.geographic.GeographicRenderer#reset()
	 */
	@Override
	public void reset() {
		super.reset();
		mapCanvas.reset();
		mapCanvas.setDrawPolygonBorders(drawPolygonBorders);
		mapCanvas.setGainFactor(gainFactor);
		mapCanvas.setUseLogScaling(useLogScaling);
	} // reset

	protected void toggleDrawPolygonBordersChoice() {
		super.toggleDrawPolygonBordersChoice();
		mapCanvas.setDrawPolygonBorders(drawPolygonBorders);
		redraw();
	} // toggleDrawPolygonBordersChoice

	protected void toggleUseLogScaling() {
		super.toggleUseLogScaling();
		mapCanvas.setUseLogScaling(useLogScaling);
	} // toggleUseLogScaling

	/**
	 * @return the MenuManager
	 */
	public MenuManager getMenuManager() {
		return menuManager;
	} // getMenuManager

	/**
	 * @see org.eclipse.stem.ui.views.geographic.GeographicRenderer#setColorProviderAdapter(org.eclipse.stem.ui.adapters.color.ColorProviderAdapter)
	 */
	@Override
	public void setColorProviderAdapter(ColorProviderAdapter colorProvider) {
		super.setColorProviderAdapter(colorProvider);
		mapCanvas.setColorProvider(colorProvider);
	}
	
	/**
	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
	 */
	public void selectionChanged(SelectionChangedEvent event) {
		fireSelection(event.getSelection());
	}

	/**
	 * @see org.eclipse.stem.ui.views.geographic.GeographicRenderer#dispose()
	 */
	@Override
	public void dispose() {		
		super.dispose();
		mapCanvas.removeSelectionChangedListener(this);
	}

} // MapRenderer
