public void CreateXml()
        {
            ShapeReaderConfiguration SRC = new ShapeReaderConfiguration();

              SRC.XHeader = "XUTM";
              SRC.YHeader = "YUTM";
              SRC.PlantIDHeader = "PLANTID";
              SRC.WellIDHeader = "BOREHOLENO";
              SRC.IntakeNumber = "INTAKENO";
              SRC.BOTTOMHeader = "INTAKBOTK";
              SRC.TOPHeader = "INTAKTOPK";
              SRC.TerrainHeader = "JUPKOTE";
              SRC.FraAArHeader = "FRAAAR";
              SRC.TilAArHeader = "TILAAR";
              SRC.LayerHeader = "Layer";

              XmlSerializer x = new XmlSerializer(typeof(ShapeReaderConfiguration));
              using (FileStream fs = new FileStream(@"..\..\..\ThirdpartyBinaries\ShapeReaderConfig.xml", FileMode.Create ))
              {
            x.Serialize(fs,SRC);
              }

              ShapeReaderConfiguration SRC2;

              using (FileStream fs = new FileStream(@"..\..\..\ThirdpartyBinaries\ShapeReaderConfig.xml", FileMode.Open))
              {
            SRC2 = (ShapeReaderConfiguration)x.Deserialize(fs);
              }

              Assert.AreEqual(SRC.XHeader, SRC2.XHeader);
              Assert.AreEqual(SRC.YHeader, SRC2.YHeader);
              Assert.AreEqual(SRC.WellIDHeader, SRC2.WellIDHeader);
              Assert.AreEqual(SRC.TOPHeader, SRC2.TOPHeader);
        }
        /// <summary>
        /// Opens a point shape
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog2.Filter = "Known file types (*.shp)|*.shp";
            this.openFileDialog2.ShowReadOnly = true;
            this.openFileDialog2.Title = "Select a shape file with data for wells or intakes";

            if (openFileDialog2.ShowDialog() == DialogResult.OK)
            {
            string FileName = openFileDialog2.FileName;

            PointShapeReader SR = new PointShapeReader(FileName);

            DataTable FullDataSet = SR.Data.Read();
            //Launch a data selector
            DataSelector DS = new DataSelector(FullDataSet);

            if (DS.ShowDialog() == DialogResult.OK)
            {
                if (ShpConfig == null)
                {
                    XmlSerializer x = new XmlSerializer(typeof(ShapeReaderConfiguration));
                    string InstallationPath = Path.GetDirectoryName(this.GetType().Assembly.Location);
                    string config = Path.Combine(InstallationPath, "ShapeReaderConfig.xml");
                    using (FileStream fs = new FileStream(config, FileMode.Open))
                    {
                        ShpConfig = (ShapeReaderConfiguration)x.Deserialize(fs);

                        if (CheckColumn(FullDataSet, ShpConfig.WellIDHeader, config))
                            if (CheckColumn(FullDataSet, ShpConfig.IntakeNumber, config))
                                if (CheckColumn(FullDataSet, ShpConfig.XHeader, config))
                                    if (CheckColumn(FullDataSet, ShpConfig.YHeader, config))
                                        if (CheckColumn(FullDataSet, ShpConfig.TOPHeader, config))
                                          if (CheckColumn(FullDataSet, ShpConfig.BOTTOMHeader, config))
                                          {
                                            Wells = new Dictionary<string, IWell>();
                                            if (FullDataSet.Columns.Contains(ShpConfig.PlantIDHeader))
                                            {
                                              DPlants = new Dictionary<int, Plant>();
                                              HeadObservations.FillInFromNovanaShape(DS.SelectedRows, ShpConfig, Wells, DPlants);
                                            }
                                            else
                                              HeadObservations.FillInFromNovanaShape(DS.SelectedRows, ShpConfig, Wells);
                                            UpdateListsAndListboxes();
                                          }
                    }
                }
            }
            SR.Dispose();
            }
        }
        /// <summary>
        /// Creates wells from DataRows based on ShapeReaderConfiguration
        /// </summary>
        /// <param name="DS"></param>
        /// <param name="SRC"></param>
        public static void FillInFromNovanaShape(DataRow[] DS, ShapeReaderConfiguration SRC, Dictionary<string, IWell> Wells, Dictionary<int, Plant> Plants)
        {
            bool ReadPumpActivity = false;
              bool ReadPlants = false;
              bool ReadLayer = false;
              if (DS.First().Table.Columns.Contains(SRC.FraAArHeader) & DS.First().Table.Columns.Contains(SRC.TilAArHeader))
            ReadPumpActivity = true;

              if (DS.First().Table.Columns.Contains(SRC.LayerHeader))
            ReadLayer = true;

              if (Plants != null)
            if (DS.First().Table.Columns.Contains(SRC.PlantIDHeader))
              ReadPlants = true;

              IWell CurrentWell;
              IIntake CurrentIntake;
              foreach (DataRow DR in DS)
              {
            //Find the well in the dictionary
            if (!Wells.TryGetValue((string)DR[SRC.WellIDHeader], out CurrentWell))
            {
              //Add a new well if it was not found
              CurrentWell = new Well(DR[SRC.WellIDHeader].ToString());
              CurrentWell.UsedForExtraction = true;
              Wells.Add(CurrentWell.ID, CurrentWell);
            }

            int intakeno = Convert.ToInt32(DR[SRC.IntakeNumber]);

            CurrentIntake = CurrentWell.Intakes.FirstOrDefault(var => var.IDNumber == intakeno);

            if (CurrentIntake==null)
              CurrentIntake = CurrentWell.AddNewIntake(intakeno);

            if (ReadLayer)
              if (!Convert.IsDBNull(DR[SRC.LayerHeader]))
            CurrentIntake.Layer = Convert.ToInt32(DR[SRC.LayerHeader]);

            if (ReadPlants)
            {
              Plant CurrentPlant;
              int PlantID = Convert.ToInt32(DR[SRC.PlantIDHeader]);
              if (!Plants.TryGetValue(PlantID, out CurrentPlant))
              {
            CurrentPlant = new Plant(PlantID);
            Plants.Add(PlantID, CurrentPlant);
              }
              PumpingIntake CurrentPumpingIntake = new PumpingIntake(CurrentIntake);
              CurrentPlant.PumpingIntakes.Add(CurrentPumpingIntake);
              if (ReadPumpActivity)
              {
            CurrentPumpingIntake.Start = new DateTime(Convert.ToInt32(DR[SRC.FraAArHeader]), 1, 1);
            CurrentPumpingIntake.End = new DateTime(Convert.ToInt32(DR[SRC.TilAArHeader]), 12, 31);
              }
            }
            CurrentWell.X = Convert.ToDouble(DR[SRC.XHeader]);
            CurrentWell.Y = Convert.ToDouble(DR[SRC.YHeader]);
            CurrentWell.Terrain = Convert.ToDouble(DR[SRC.TerrainHeader]);
            Screen CurrentScreen = new Screen(CurrentIntake);
            CurrentScreen.BottomAsKote = Convert.ToDouble(DR[SRC.BOTTOMHeader]);
            CurrentScreen.TopAsKote = Convert.ToDouble(DR[SRC.TOPHeader]);
              }
        }
 /// <summary>
 /// Creates wells from DataRows based on ShapeReaderConfiguration
 /// </summary>
 /// <param name="DS"></param>
 /// <param name="SRC"></param>
 public static void FillInFromNovanaShape(DataRow[] DS, ShapeReaderConfiguration SRC, Dictionary<string, IWell> Wells)
 {
     FillInFromNovanaShape(DS, SRC, Wells, null);
 }