/*
* Copyright 2013 Serdar.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.fub.agg2graphui;
import de.fub.agg2graph.ui.gui.RenderingOptions;
import de.fub.agg2graphui.controller.AbstractLayer;
import de.fub.agg2graphui.controller.LayerManager;
import de.fub.agg2graphui.layers.LayerEvent;
import de.fub.agg2graphui.layers.LayerListener;
import de.fub.mapviewer.ui.MapViewer;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.explorer.ExplorerManager;
/**
*
* @author Serdar
*/
public class AggContentPanel extends MapViewer implements
LayerManager.Provider,
ExplorerManager.Provider,
ChangeListener,
LayerListener {
private static final Logger LOG = Logger.getLogger(AggContentPanel.class.getName());
private static final long serialVersionUID = 1L;
private final ExplorerManager explorerManager = new ExplorerManager();
private transient final LayerManager layerManager = new LayerManager(this);
private boolean labelsVisible = true;
private int highlightIndex = 0;
private int savedZIndex = Integer.MAX_VALUE;
private boolean transparentHighlighting = true;
/**
* Creates new form AggContentPanel
*/
public AggContentPanel() {
initComponents();
setHorizontalWrapped(true);
setRestrictOutsidePanning(true);
layerManager.addChangeListener(AggContentPanel.this);
layerManager.addLayerListener(AggContentPanel.this);
for (MouseWheelListener listener : getMouseWheelListeners()) {
removeMouseWheelListener(listener);
}
addMouseWheelListener(new MouseWheelListenerImpl());
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
setLayout(new java.awt.BorderLayout());
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
public boolean isLabelsVisible() {
return labelsVisible;
}
public void setLabelsVisible(boolean labelsVisible) {
if (this.labelsVisible != labelsVisible) {
this.labelsVisible = labelsVisible;
for (AbstractLayer<?> layer : getLayerManager().getLayers()) {
if (labelsVisible) {
layer.getRenderingOptions().setLabelRenderingType(RenderingOptions.LabelRenderingType.ALWAYS);
} else {
layer.getRenderingOptions().setLabelRenderingType(RenderingOptions.LabelRenderingType.NEVER);
}
}
repaint();
}
}
@Override
public LayerManager getLayerManager() {
return layerManager;
}
public void addLayer(AbstractLayer<?> layer) {
assert layer != null;
getLayerManager().addLayer(layer);
repaint();
}
public void removeLayer(AbstractLayer<?> layer) {
assert layer != null;
getLayerManager().remove(layer);
repaint();
}
private void highlightLayer(int wheelRotation) {
ArrayList<AbstractLayer<?>> layers = new ArrayList<AbstractLayer<?>>(getLayerManager().getLayers());
if (savedZIndex != Integer.MAX_VALUE) {
layers.get(highlightIndex).getRenderingOptions().setzIndex(savedZIndex);
}
highlightIndex = (highlightIndex + wheelRotation + getLayerManager().getLayers().size())
% getLayerManager().getLayers().size();
savedZIndex = layers.get(highlightIndex).getRenderingOptions().getzIndex();
layers.get(highlightIndex).getRenderingOptions().setzIndex(999);
if (transparentHighlighting) {
for (AbstractLayer<?> layer : getLayerManager().getLayers()) {
layer.getRenderingOptions().setOpacity(0.3);
}
layers.get(highlightIndex).getRenderingOptions().setOpacity(1);
}
repaint();
}
@Override
public ExplorerManager getExplorerManager() {
return explorerManager;
}
@Override
public void stateChanged(ChangeEvent e) {
refreshView();
}
@Override
public void requestRender(LayerEvent layerEvent) {
refreshView();
}
private void refreshView() {
if (SwingUtilities.isEventDispatchThread()) {
repaint();
} else {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
repaint();
}
});
}
}
void removeAllLayers() {
layerManager.removeAllLayers();
}
private class MouseWheelListenerImpl implements MouseWheelListener {
public MouseWheelListenerImpl() {
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if (e.isControlDown()) {
highlightLayer(e.getWheelRotation());
e.consume();
} else {
// push down
if (getZoom() <= getTileFactory().getInfo().getMaximumZoomLevel()
|| e.getWheelRotation() > 0) {
setZoom(getZoom() - e.getWheelRotation());
LOG.log(Level.FINEST, "zoom level: {0}, Maxzoom: {1}",
new Object[]{getZoom(), getTileFactory().getInfo().getMaximumZoomLevel()});
}
}
layerManager.requestUpdate();
}
}
}