#region Disclaimer / License
// Copyright (C) 2009, Kenneth Skovhede
// http://www.hexad.dk, opensource@hexad.dk
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
#endregion
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OSGeo.MapGuide.MaestroAPI;
namespace OSGeo.MapGuide.Maestro
{
public partial class BoundsPicker : Form
{
private string m_bounds;
public string SRSBounds
{
get { return m_bounds; }
}
public BoundsPicker(string bounds, string[] coordsys)
: this()
{
m_bounds = bounds;
if (coordsys == null)
{
SRSLabel.Visible =
SRSCombo.Visible =
false;
this.Height -= 30;
}
else
SRSCombo.Items.AddRange(coordsys);
if (!string.IsNullOrEmpty(bounds))
{
try
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
if (bounds.Trim().StartsWith("<"))
bounds = System.Web.HttpUtility.HtmlDecode(bounds);
bounds = "" + bounds + "";
doc.LoadXml(bounds);
System.Xml.XmlNode root = doc["root"];
if (root["Bounds"] != null)
{
if (root["Bounds"].Attributes["SRS"] != null)
SRSCombo.Text = root["Bounds"].Attributes["SRS"].Value;
if (root["Bounds"].Attributes["west"] != null)
MinX.Text = root["Bounds"].Attributes["west"].Value;
if (root["Bounds"].Attributes["east"] != null)
MaxX.Text = root["Bounds"].Attributes["east"].Value;
if (root["Bounds"].Attributes["south"] != null)
MinY.Text = root["Bounds"].Attributes["south"].Value;
if (root["Bounds"].Attributes["north"] != null)
MaxY.Text = root["Bounds"].Attributes["north"].Value;
}
else
throw new Exception(Strings.BoundsPicker.MissingBoundsError);
}
catch(Exception ex)
{
string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
MessageBox.Show(this, string.Format(Strings.BoundsPicker.BoundsDecodeError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private BoundsPicker()
{
InitializeComponent();
}
private void OKBtn_Click(object sender, EventArgs e)
{
string srs;
if (SRSCombo.Text.Trim().Length == 0 || SRSCombo.Visible == false)
srs = null;
else
srs = SRSCombo.Text;
if (MinX.Text.Trim().Length == 0 || MaxX.Text.Trim().Length == 0 || MinY.Text.Trim().Length == 0 || MaxY.Text.Trim().Length == 0 || (srs == null && SRSCombo.Visible))
{
MessageBox.Show(this, Strings.BoundsPicker.IncompleBoundsError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
double temp;
System.Globalization.CultureInfo localCI = System.Globalization.CultureInfo.CurrentUICulture;
System.Globalization.CultureInfo usCI = System.Globalization.CultureInfo.InvariantCulture;
bool isUs = double.TryParse(MinX.Text, System.Globalization.NumberStyles.Float, usCI, out temp) &&
double.TryParse(MaxX.Text, System.Globalization.NumberStyles.Float, usCI, out temp) &&
double.TryParse(MinY.Text, System.Globalization.NumberStyles.Float, usCI, out temp) &&
double.TryParse(MaxY.Text, System.Globalization.NumberStyles.Float, usCI, out temp);
bool isLocal = double.TryParse(MinX.Text, System.Globalization.NumberStyles.Float, localCI, out temp) &&
double.TryParse(MaxX.Text, System.Globalization.NumberStyles.Float, localCI, out temp) &&
double.TryParse(MinY.Text, System.Globalization.NumberStyles.Float, localCI, out temp) &&
double.TryParse(MaxY.Text, System.Globalization.NumberStyles.Float, localCI, out temp);
if (!isUs && isLocal)
{
switch (MessageBox.Show(this, Strings.BoundsPicker.NumbersInRegionalError, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
{
case DialogResult.Yes:
if (double.TryParse(MinX.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
MinX.Text = temp.ToString(usCI);
else
{
MessageBox.Show(this, Strings.BoundsPicker.InvalidMinXError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (double.TryParse(MaxX.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
MaxX.Text = temp.ToString(usCI);
else
{
MessageBox.Show(this, Strings.BoundsPicker.InvalidMaxXError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (double.TryParse(MinY.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
MinY.Text = temp.ToString(usCI);
else
{
MessageBox.Show(this, Strings.BoundsPicker.InvalidMinYError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (double.TryParse(MaxY.Text, System.Globalization.NumberStyles.Float, localCI, out temp))
MaxY.Text = temp.ToString(usCI);
else
{
MessageBox.Show(this, Strings.BoundsPicker.InvalidMaxYError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
break;
case DialogResult.Cancel:
return;
}
}
if (!isUs && !isLocal)
{
if (MessageBox.Show(this, Strings.BoundsPicker.UseInvalidCoordinatesWarning, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error) != DialogResult.Yes)
return;
}
m_bounds = "";
this.DialogResult = DialogResult.OK;
this.Close();
}
}
}