/*
* Copyright (C) 2014 Alec Dhuse
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package co.foldingmap.GUISupport;
import co.foldingmap.Logger;
import co.foldingmap.map.DigitalMap;
import co.foldingmap.map.MapView;
import co.foldingmap.map.Visibility;
import co.foldingmap.map.tile.TileMath;
import co.foldingmap.map.vector.VectorObject;
import co.foldingmap.map.vector.VectorObjectList;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.TitledBorder;
/**
*
* @author Alec
*/
public class ObjectVisibilityPanel extends JPanel implements ActionListener {
protected DigitalMap mapData;
protected JCheckBox checkMinView, checkMaxView;
protected JLabel labelVisibleSpacer;
protected JPanel panelLevelOfDetail;
protected JRadioButton radioAlwaysVisible;
protected JTextField textVisibleMaxView, textVisibleMinView;
protected VectorObjectList<VectorObject> mapObjects;
public ObjectVisibilityPanel() {
init();
}
public ObjectVisibilityPanel(DigitalMap mapData, VectorObjectList<VectorObject> mapObjects) {
this.mapData = mapData;
this.mapObjects = mapObjects;
init();
}
@Override
public void actionPerformed(ActionEvent e) {
Object sourceObject = e.getSource();
if (sourceObject == checkMaxView) {
radioAlwaysVisible.setSelected(false);
textVisibleMaxView.setEnabled(true);
updateVisibility();
} else if (sourceObject == checkMinView) {
radioAlwaysVisible.setSelected(false);
textVisibleMinView.setEnabled(true);
updateVisibility();
} else if (sourceObject == radioAlwaysVisible) {
checkMaxView.setSelected(false);
checkMinView.setSelected(false);
textVisibleMaxView.setEnabled(false);
textVisibleMinView.setEnabled(false);
updateVisibility();
}
}
private void init() {
try {
checkMaxView = new JCheckBox("Max This Zoom");
checkMinView = new JCheckBox("Min This Zoom");
labelVisibleSpacer = new JLabel("");
panelLevelOfDetail = new JPanel(new GridLayout(2, 3, 5, 5));
radioAlwaysVisible = new JRadioButton("Always Visible");
textVisibleMaxView = new JTextField();
textVisibleMinView = new JTextField();
panelLevelOfDetail.setBorder(new TitledBorder("Level Of Detail"));
this.setLayout(new GridLayout(1, 1, 5, 5));
this.setBorder(new TitledBorder(""));
this.add(panelLevelOfDetail);
panelLevelOfDetail.add(radioAlwaysVisible);
panelLevelOfDetail.add(checkMaxView);
panelLevelOfDetail.add(checkMinView);
panelLevelOfDetail.add(labelVisibleSpacer);
panelLevelOfDetail.add(textVisibleMaxView);
panelLevelOfDetail.add(textVisibleMinView);
checkMaxView.addActionListener(this);
checkMinView.addActionListener(this);
radioAlwaysVisible.addActionListener(this);
if (this.mapObjects == null) {
textVisibleMaxView.setEnabled(false);
textVisibleMinView.setEnabled(false);
radioAlwaysVisible.setSelected(true);
checkMaxView.setSelected(false);
checkMinView.setSelected(false);
} else {
if (this.mapObjects.size() == 1) {
Visibility visibility = mapObjects.get(0).getVisibility();
if (visibility != null) {
float maxTile = visibility.getMaxTileZoomLevel();
float minTile = visibility.getMinTileZoomLevel();
if (maxTile >= 25 && minTile <= 0) {
radioAlwaysVisible.setSelected(true);
} else if (maxTile < 25 && minTile <= 0) {
radioAlwaysVisible.setSelected(false);
checkMaxView.setSelected(true);
checkMinView.setSelected(false);
textVisibleMaxView.setText(Float.toString(maxTile));
textVisibleMinView.setText("");
} else if (minTile >= 0) {
radioAlwaysVisible.setSelected(false);
checkMaxView.setSelected(false);
checkMinView.setSelected(true);
textVisibleMaxView.setText("");
textVisibleMinView.setText(Float.toString(minTile));
} else {
radioAlwaysVisible.setSelected(true);
}
} else {
//no region
radioAlwaysVisible.setSelected(true);
}
} else {
//size > 1
}
}
} catch (Exception e) {
Logger.log(Logger.ERR, "Error in ObjectVisibilityPanel.init() - " + e);
}
}
/**
* Saves the visibility values to the given mapObjects.
*/
public void save() {
VectorObject currentObject;
try {
for (int i = 0; i < mapObjects.size(); i++) {
currentObject = mapObjects.get(i);
currentObject.getVisibility().setMaxTileZoomLevel(Float.parseFloat(textVisibleMaxView.getText()));
currentObject.getVisibility().setMinTileZoomLevel(Float.parseFloat(textVisibleMinView.getText()));
} //end for loop
} catch (Exception e) {
Logger.log(Logger.ERR, "Error in ObjectVisibilityPanel.save() - " + e);
}
}
private void updateVisibility() {
float tileZoom;
MapView mapView;
VectorObject currentObject;
try {
mapView = mapData.getLastMapView();
tileZoom = TileMath.getTileMapZoom(mapView.getZoomLevel());
for (int i = 0; i < mapObjects.size(); i++) {
currentObject = mapObjects.get(i);
if (radioAlwaysVisible.isSelected()) {
this.textVisibleMaxView.setText("");
this.textVisibleMinView.setText("");
currentObject.setVisibility(null);
} else if (checkMaxView.isSelected() && !checkMinView.isSelected()) {
if (currentObject.getVisibility() == null) {
currentObject.setVisibility(new Visibility(tileZoom, 0));
} else {
currentObject.getVisibility().setMaxTileZoomLevel(tileZoom);
}
this.textVisibleMaxView.setText(Float.toString(tileZoom));
this.textVisibleMinView.setText("");
} else if (!checkMaxView.isSelected() && checkMinView.isSelected()) {
if (currentObject.getVisibility() == null) {
currentObject.setVisibility(new Visibility(25, tileZoom));
} else {
currentObject.getVisibility().setMinTileZoomLevel(tileZoom);
}
this.textVisibleMaxView.setText("");
this.textVisibleMinView.setText(Float.toString(tileZoom));
} else if (checkMaxView.isSelected() && checkMinView.isSelected()) {
if (currentObject.getVisibility() == null) {
currentObject.setVisibility(new Visibility(tileZoom, tileZoom));
} else {
currentObject.getVisibility().setMaxTileZoomLevel(tileZoom);
currentObject.getVisibility().setMinTileZoomLevel(tileZoom);
}
currentObject.getVisibility().setMaxTileZoomLevel(tileZoom);
currentObject.getVisibility().setMinTileZoomLevel(tileZoom);
this.textVisibleMaxView.setText(Float.toString(tileZoom));
this.textVisibleMinView.setText(Float.toString(tileZoom));
} //end if
} //end for loop
} catch (Exception e) {
Logger.log(Logger.ERR, "Error in ObjectVisibilityPanel.updateVisibility(): " + e);
}
}
}