package tim.prune.gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import tim.prune.I18nManager;
import tim.prune.data.Track;
import tim.prune.gui.map.MapSource;
import tim.prune.gui.map.MapSourceLibrary;
import tim.prune.save.BaseImageConfigDialog;
import tim.prune.save.BaseImageConsumer;
import tim.prune.save.MapGrouter;
import tim.prune.threedee.ImageDefinition;
/**
* Panel used to show the current base image details
* and an edit button to change the definition
*/
public class BaseImageDefinitionPanel extends JPanel implements BaseImageConsumer
{
/** Parent object (if any) */
private BaseImageConsumer _parent = null;
/** Label to describe the current settings */
private JLabel _baseImageLabel = null;
/** Button for changing the definition */
private JButton _editButton = null;
/** Dialog called by the "Edit" button to change the settings */
private BaseImageConfigDialog _baseImageConfig = null;
/**
* Constructor
* @param inParent parent object to inform about changes
* @param inParentDialog parent dialog
* @param inTrack track object
*/
public BaseImageDefinitionPanel(BaseImageConsumer inParent, JDialog inParentDialog,
Track inTrack)
{
_parent = inParent;
_baseImageConfig = new BaseImageConfigDialog(this, inParentDialog, inTrack);
// Etched border
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(4, 4, 4, 4))
);
setLayout(new BorderLayout());
// GUI components
JPanel subPanel = new JPanel();
subPanel.setLayout(new BorderLayout(10, 4));
subPanel.add(new JLabel(I18nManager.getText("dialog.exportpov.baseimage") + ": "), BorderLayout.WEST);
_baseImageLabel = new JLabel("Typical sourcename");
subPanel.add(_baseImageLabel, BorderLayout.CENTER);
_editButton = new JButton(I18nManager.getText("button.edit"));
_editButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
changeBaseImage();
}
});
subPanel.add(_editButton, BorderLayout.EAST);
add(subPanel, BorderLayout.NORTH);
}
/**
* @param inDefinition image definition from interactive step
*/
public void initImageParameters(ImageDefinition inDefinition)
{
_baseImageConfig.setImageDefinition(inDefinition);
}
/**
* Change the base image by calling the BaseImageConfigDialog
*/
private void changeBaseImage()
{
// Check if there is a cache to use
if (BaseImageConfigDialog.isImagePossible())
{
// Show new dialog to choose image details
_baseImageConfig.begin();
}
// TODO: What if it isn't possible? Should the caller show the error message?
//else {
// _app.showErrorMessage(getNameKey(), "dialog.exportimage.noimagepossible");
//}
}
/**
* Callback from base image config dialog
*/
public void baseImageChanged()
{
updateBaseImageDetails();
if (_parent != null) {
_parent.baseImageChanged();
}
}
/**
* Update the description label according to the selected base image details
*/
public void updateBaseImageDetails()
{
String desc = null;
ImageDefinition imageDef = _baseImageConfig.getImageDefinition();
// Check if selected zoom level is suitable or not, if not then set image to no
if (imageDef.getUseImage() && !_baseImageConfig.isSelectedZoomValid()) {
imageDef.setUseImage(false, imageDef.getSourceIndex(), 5);
}
// Make a description for the label
if (imageDef.getUseImage())
{
MapSource source = MapSourceLibrary.getSource(imageDef.getSourceIndex());
if (source != null)
{
desc = source.getName() + " (" + imageDef.getZoom() + ")";
}
}
if (desc == null) {
desc = I18nManager.getText("dialog.about.no");
}
_baseImageLabel.setText(desc);
_editButton.setEnabled(BaseImageConfigDialog.isImagePossible());
}
/**
* @return the grouter object for reuse of the prepared images
*/
public MapGrouter getGrouter()
{
return _baseImageConfig.getGrouter();
}
/**
* @return image definition
*/
public ImageDefinition getImageDefinition() {
return _baseImageConfig.getImageDefinition();
}
/**
* @return true if any tiles were found
*/
public boolean getFoundData() {
return _baseImageConfig.getFoundData();
}
}