/*
* Copyright (c) 2016 Fraunhofer IGD
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Fraunhofer IGD <http://www.igd.fraunhofer.de/>
*/
package de.fhg.igd.mapviewer.view;
import java.awt.BorderLayout;
import javax.swing.SwingUtilities;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.part.WorkbenchPart;
import de.fhg.igd.mapviewer.BasicMapKit;
import de.fhg.igd.mapviewer.tip.MapTipManager;
import de.fhg.igd.swingrcp.SwingComposite;
/**
* MapView
*
* @author <a href="mailto:simon.templer@igd.fhg.de">Simon Templer</a>
*/
public class MapView extends AbstractMapView implements IPartListener2 {
private static final String MEMENTO_TOOLS = "tools"; //$NON-NLS-1$
private static final String MEMENTO_MAP = "map"; //$NON-NLS-1$
private static final Log log = LogFactory.getLog(MapView.class);
/**
* The ID of this View
*/
public static final String ID = "de.fhg.igd.mapviewer.view.MapView"; //$NON-NLS-1$
private SwingComposite main;
private ExtendedMapKit mapKit;
private MapTools mapTools;
private IMemento initMemento;
private final MapTipManager mapTips = new MapTipManager();
/**
* The constructor.
*/
public MapView() {
}
/**
* @see ViewPart#init(IViewSite, IMemento)
*/
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
this.initMemento = memento;
IPartService partService = site.getService(IPartService.class);
partService.addPartListener(this);
}
/**
* @see ViewPart#saveState(IMemento)
*/
@Override
public void saveState(IMemento memento) {
mapTools.saveState(memento.createChild(MEMENTO_TOOLS));
mapKit.saveState(memento.createChild(MEMENTO_MAP));
super.saveState(memento);
}
/**
* @see WorkbenchPart#createPartControl(Composite)
*/
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
main = new SwingComposite(parent);
main.getContentPane().setLayout(new BorderLayout());
mapKit = new ExtendedMapKit(MapView.this);
main.getContentPane().add(mapKit, BorderLayout.CENTER);
// actions
configureActions();
// restore state
mapTools.restoreState(
(initMemento != null) ? (initMemento.getChild(MEMENTO_TOOLS)) : (null));
// status
new PositionStatus(mapKit.getMainMap(), getViewSite(), getTitleImage(), epsgProvider);
new PositionStatus(mapKit.getMiniMap(), getViewSite(), getTitleImage(), epsgProvider);
// view activator
ViewActivator activator = new ViewActivator(getViewSite());
activator.addComponent(mapKit.getMainMap());
activator.addComponent(mapKit.getMiniMap());
}
/**
* @see WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
main.getContentPane().requestFocus();
}
});
}
/**
* Configure menu and toolbar actions and register map view extensions
*/
public void configureActions() {
IActionBars bars = getViewSite().getActionBars();
// tool-bar
IToolBarManager toolBar = bars.getToolBarManager();
toolBar.add(mapTools = new MapTools(mapKit));
// menu
IMenuManager menu = bars.getMenuManager();
menu.add(new MapMenu());
// extensions
IConfigurationElement[] config = Platform.getExtensionRegistry()
.getConfigurationElementsFor(MapViewExtension.class.getName());
for (IConfigurationElement element : config) {
if (element.getName().equals("extra")) { //$NON-NLS-1$
try {
MapViewExtension extra = (MapViewExtension) element
.createExecutableExtension("class"); //$NON-NLS-1$
extra.setMapView(this);
} catch (Exception e) {
log.warn("Error creating map view extension", e); //$NON-NLS-1$
}
}
}
// add map tips
mapKit.addCustomPainter(mapTips);
}
/**
* @return the mapTips
*/
public MapTipManager getMapTips() {
return mapTips;
}
/**
* @return the map kit
*/
public BasicMapKit getMapKit() {
return mapKit;
}
/**
* @return the map tools
*/
public MapTools getMapTools() {
return mapTools;
}
/**
* @see IPartListener2#partVisible(IWorkbenchPartReference)
*/
@Override
public void partVisible(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partActivated(IWorkbenchPartReference)
*/
@Override
public void partActivated(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partBroughtToTop(IWorkbenchPartReference)
*/
@Override
public void partBroughtToTop(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partClosed(IWorkbenchPartReference)
*/
@Override
public void partClosed(IWorkbenchPartReference partRef) {
if (partRef.getPart(false) == this) {
// do nothing
}
}
/**
* @see IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
*/
@Override
public void partDeactivated(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partHidden(IWorkbenchPartReference)
*/
@Override
public void partHidden(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partInputChanged(IWorkbenchPartReference)
*/
@Override
public void partInputChanged(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partOpened(IWorkbenchPartReference)
*/
@Override
public void partOpened(IWorkbenchPartReference partRef) {
if (partRef.getPart(false) == this) {
// do nothing - expecting restoreState to be called by extensions
}
}
/**
* Restore the map state from the view memento.
*/
public void restoreState() {
// restore state (e.g. the first time the view becomes visible)
final Display display = Display.getCurrent();
// must be done like this because of mapKit.zoomToPositions -
// else there is no component width/height set
display.asyncExec(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
mapKit.restoreState((initMemento != null)
? (initMemento.getChild(MapView.MEMENTO_MAP)) : (null));
}
});
}
});
}
}