blob: 070a237501f03006b36fd427e06b027ac31720a0 [file] [log] [blame]
// GeographicRenderer.java
package org.eclipse.stem.ui.views.geographic;
/*******************************************************************************
* 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 java.awt.BasicStroke;
import java.awt.Stroke;
import java.text.ParseException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.text.NumberFormatter;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.stem.jobs.simulation.ISimulation;
import org.eclipse.stem.ui.Activator;
import org.eclipse.stem.ui.adapters.color.ColorProviderAdapter;
import org.eclipse.stem.ui.views.geographic.map.Messages;
import org.eclipse.stem.ui.views.geographic.map.StemPolygonsList;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchActionConstants;
/**
* This class is extended by classes that render geographic (lat/long) data into
* a visual representation.
*/
public abstract class GeographicRenderer extends Composite implements
ISelectionProvider {
protected static final float INITIAL_GAIN_FACTOR = 1.0f;
protected static final boolean INITIAL_DRAW_POLYGON_BORDERS = true;
protected static final boolean INITIAL_USE_LOG_SCALING = true;
protected static final int MARGIN_HEIGHT = 5;
protected static final int MARGIN_WIDTH = 5;
private static NumberFormatter formatter = new NumberFormatter();
protected boolean drawPolygonBorders = INITIAL_DRAW_POLYGON_BORDERS;
protected Stroke polygonStroke = new BasicStroke(1f);
protected boolean useLogScaling = INITIAL_USE_LOG_SCALING;
protected float gainFactor = INITIAL_GAIN_FACTOR;
private GainFactorAction defaultGainFactorAction;
GainFactorAction lastGainFactorAction;
private LogarithmicAction logarithmicAction;
private DrawPolygonBordersAction drawPolygonBordersAction;
protected ColorProviderAdapter colorProviderAdapter = null;
/**
* The collection of ISelectionChangedListener waiting to be told about
* selections.
*/
protected final List<ISelectionChangedListener> listeners = new CopyOnWriteArrayList<ISelectionChangedListener>();
private ISelection selection;
/**
* @param parent
* @param style
*/
public GeographicRenderer(final Composite parent, final int style) {
super(parent, style);
this.addDisposeListener(new DisposeListener() {
/**
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(
@SuppressWarnings("unused") final DisposeEvent e) {
if (!isDisposed()) {
dispose();
}
}
});
} // GeographicRenderer
/**
* @param polygonsToRender
*/
abstract public void render(StemPolygonsList polygonsToRender, ISimulation simulation);
protected java.awt.Color getColorForRelativeValue(
@SuppressWarnings("unused")
final double relativeValue) {
return null;
}
/**
* @see org.eclipse.swt.widgets.Widget#dispose()
*/
@Override
public void dispose() {
//Nothing to do
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void addSelectionChangedListener(
final ISelectionChangedListener listener) {
listeners.add(listener);
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void removeSelectionChangedListener(
final ISelectionChangedListener listener) {
listeners.remove(listener);
}
/**
* @return the selection
*/
public final ISelection getSelection() {
return selection;
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(final ISelection selection) {
this.selection = selection;
fireSelection(selection);
}
/**
* Pass a {@link SelectionChangedEvent} along to listeners.
*
* @param selection
* the {@link ISelection} to be giving to the listeners.
*/
public void fireSelection(final ISelection selection) {
final SelectionChangedEvent event = new SelectionChangedEvent(this,
selection);
for (final ISelectionChangedListener listener : listeners) {
listener.selectionChanged(event);
} // for each ISelectionChangedListener
} // fireSelection
/**
* Reset the renderer.
*/
public void reset() {
// Reset the gain factor and update the checks in the context menu
lastGainFactorAction.setChecked(false);
defaultGainFactorAction.run();
defaultGainFactorAction.setChecked(true);
useLogScaling = INITIAL_USE_LOG_SCALING;
logarithmicAction.setChecked(useLogScaling);
drawPolygonBorders = INITIAL_DRAW_POLYGON_BORDERS;
drawPolygonBordersAction.setChecked(drawPolygonBorders);
// drawPolygonCenterConnections =
// DEFAULT_DRAW_POLYGON_CENTER_CONNECTIONS;
// connectPolygonCentersAction.setChecked(drawPolygonCenterConnections);
} // reset
protected void setGainFactor(final float gainFactor) {
this.gainFactor = gainFactor;
} // setGainFactor
/**
* Switch the option of drawing the borders of polygons on the map.
*/
protected void toggleDrawPolygonBordersChoice() {
drawPolygonBorders = !drawPolygonBorders;
redraw();
} // toggleDrawPolygonBordersChoice
/**
* Switch the option of scaling the display values logrithmically.
*/
protected void toggleUseLogScaling() {
useLogScaling = !useLogScaling;
redraw();
} // toggleUseLogScaling
/**
* Create the view's context menu and add the action handlers to it.
* @return the MenuManager
*/
public MenuManager createContextMenuManager() {
// Context Menu
final MenuManager contextMenuManager = new org.eclipse.jface.action.MenuManager();
contextMenuManager.add(createGainFactorMenu());
logarithmicAction = new LogarithmicAction();
contextMenuManager.add(logarithmicAction);
contextMenuManager.add(new Separator());
drawPolygonBordersAction = new DrawPolygonBordersAction();
contextMenuManager.add(drawPolygonBordersAction);
// connectPolygonCentersAction = new ConnectPolygonCentersAction();
// contextMenuManager.add(connectPolygonCentersAction);
contextMenuManager.add(new Separator());
// Defect 302663
// contextMenuManager.add(createReportsSelectionMenu());
contextMenuManager.add(new Separator());
// ---------------------------------------------------------------------
contextMenuManager.add(new ResetMapCanvasAction());
// Place Holder for Menu Additions
contextMenuManager.add(new Separator(
IWorkbenchActionConstants.MB_ADDITIONS));
// ---------------------------------------------------------------------
return contextMenuManager;
} // createContextMenu
/**
* @return
*/
private MenuManager createGainFactorMenu() {
final MenuManager gainFactorMenu = new MenuManager(Messages
.getString("MapMenu.GainFactor"));
gainFactorMenu.add(new GainFactorAction(0.001));
gainFactorMenu.add(new GainFactorAction(0.01));
gainFactorMenu.add(new GainFactorAction(0.1));
defaultGainFactorAction = new GainFactorAction(1.0); // Default
lastGainFactorAction = defaultGainFactorAction;
gainFactorMenu.add(defaultGainFactorAction);
gainFactorMenu.add(new GainFactorAction(10.0));
gainFactorMenu.add(new GainFactorAction(100.0));
gainFactorMenu.add(new GainFactorAction(1000.0));
gainFactorMenu.add(new GainFactorAction(10000.0));
gainFactorMenu.add(new GainFactorAction(100000.0));
gainFactorMenu.add(new GainFactorAction(1000000.0));
gainFactorMenu.add(new GainFactorAction(10000000.0));
return gainFactorMenu;
}
/**
* @return
*/
private MenuManager createReportsSelectionMenu() {
final MenuManager reportsSelectionMenu = new MenuManager(Messages
.getString("MapMenu.Reports_Select"), "reports");
reportsSelectionMenu.add(new Separator(
IWorkbenchActionConstants.MB_ADDITIONS));
return reportsSelectionMenu;
} // createReportsSelectionMenu
protected class GainFactorAction extends Action {
private final double factor;
GainFactorAction(final double factor) {
super(GeographicRenderer.this.getText(factor),
IAction.AS_RADIO_BUTTON);
this.factor = factor;
setChecked(factor == INITIAL_GAIN_FACTOR);
}
/**
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
return GeographicRenderer.this.getText(factor);
} // getText
/**
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
setGainFactor((float)factor);
lastGainFactorAction = this;
Composite parent = GeographicRenderer.this.getParent();
((GeographicControl)parent).refresh();
}
} // GainFactorAction
String getText(final double factor) {
String retValue = "";
try {
retValue = formatter.valueToString(new Double(factor));
} catch (final ParseException e) {
Activator.logError("Problem parsing gain factor value \"" + factor
+ "\"", e);
}
return retValue;
} // getText
protected class LogarithmicAction extends Action {
/**
* Default Constructor
*/
public LogarithmicAction() {
super(Messages.getString("MapMenu.Logrithmic_Scaling"),
IAction.AS_CHECK_BOX);
setChecked(useLogScaling);
}
/**
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
return Messages.getString("MapMenu.Logrithmic_Scaling");
}
/**
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
toggleUseLogScaling();
Composite parent = GeographicRenderer.this.getParent();
((GeographicControl)parent).refresh();
}
} // LogarighmicAction
protected class DrawPolygonBordersAction extends Action {
/**
* Default Constructor
*/
public DrawPolygonBordersAction() {
super(Messages.getString("MapMenu.Polygon_Borders"),
IAction.AS_CHECK_BOX);
// Checked in the menu?
if (drawPolygonBorders) {
// Yes
setChecked(true);
} // if
}
/**
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
return Messages.getString("MapMenu.Polygon_Borders");
}
/**
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
toggleDrawPolygonBordersChoice();
Composite parent = GeographicRenderer.this.getParent();
((GeographicControl)parent).refresh();
}
} // DrawPolygonBordersAction
// protected class ConnectPolygonCentersAction extends Action {
//
// /**
// * Default Constructor
// */
// public ConnectPolygonCentersAction() {
// super(Messages.getString("MapMenu.Polygon_Centers"),
// IAction.AS_CHECK_BOX);
// setEnabled(false);
// setChecked(drawPolygonCenterConnections);
// }
//
// /**
// * @see org.eclipse.jface.action.Action#getText()
// */
// @Override
// public String getText() {
// return Messages.getString("MapMenu.Polygon_Centers");
// }
//
// /**
// * @see org.eclipse.jface.action.Action#run()
// */
// @Override
// public void run() {
// toggleDrawPolygonsCentersConnections();
// }
// } // ConnectPolygonCentersAction
protected class ResetMapCanvasAction extends Action {
/**
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
return Messages.getString("MapMenu.Reset");
}
/**
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
reset();
}
} // ResetMapCanvasAction
/**
* @param colorProvider the colorProvider to set
*/
public void setColorProviderAdapter(ColorProviderAdapter colorProvider) {
this.colorProviderAdapter = colorProvider;
}
} // GeographicRenderer