private void CoverageSetup_Load(object sender, EventArgs e)
        {
            var pc = viewModel.Value.ProjectController;

            _SelectedCoverage = viewModel.Value.Coverage;
            var pcks        = pc.Project.Model.GetPackages();
            int layer_count = pc.Project.Model.Grid.ActualLayerCount;

            int[] grid_layers = new int[layer_count];
            var   cov_pcks    = new List <IPackage>();
            var   buf         = from layer in pc.MapAppManager.Map.Layers select new MapLayerDescriptor {
                LegendText = layer.LegendText, DataSet = layer.DataSet
            };
            var map_layers = buf.ToList();

            labelStatus.Text = "Ready";
            for (int i = 0; i < layer_count; i++)
            {
                grid_layers[i] = i + 1;
            }
            foreach (var pck in pcks)
            {
                var atr = pck.GetType().GetCustomAttributes(typeof(CoverageItem), false);
                if (atr.Length == 1)
                {
                    cov_pcks.Add(pck);
                }
            }
            cmbGridLayer.SelectedIndexChanged -= cmbGridLayer_SelectedIndexChanged;
            cmbMapLayers.SelectedIndexChanged -= cmbMapLayers_SelectedIndexChanged;

            cmbMapLayers.DataSource = map_layers;
            cmbGridLayer.DataSource = grid_layers;
            cmbPackages.DataSource  = cov_pcks;
            chbProp.Items.Clear();

            if (_SelectedCoverage != null)
            {
                tbCoverageName.Text = _SelectedCoverage.LegendText;
                _SelectedCoverage.LoadLookTable();
                dataGridEx1.Bind(_SelectedCoverage.LookupTable);

                //restore cmbMapLayers

                for (int i = 0; i < map_layers.Count; i++)
                {
                    string fn = map_layers[i].DataSet.Filename;
                    if (DirectoryHelper.IsRelativePath(fn))
                    {
                        fn = Path.Combine(pc.Project.AbsolutePathToProjectFile, fn);
                    }
                    if (DirectoryHelper.Compare(fn, _SelectedCoverage.FullCoverageFileName))
                    {
                        cmbMapLayers.SelectedIndex = i;
                        var layer = map_layers[i];
                        if (layer.DataSet is FeatureSet)
                        {
                            var fs     = layer.DataSet as FeatureSet;
                            var fields = (from DataColumn dc in fs.DataTable.Columns select dc.ColumnName).ToList();
                            cmbFields.DataSource    = fields;
                            cmbFields.SelectedIndex = fields.IndexOf(_SelectedCoverage.FieldName);
                        }
                        else
                        {
                            cmbFields.DataSource    = new string [] { "Raster Value" };
                            cmbFields.SelectedIndex = 0;
                        }
                        break;
                    }
                }
                for (int i = 0; i < cov_pcks.Count; i++)
                {
                    if (cov_pcks[i].Name == _SelectedCoverage.PackageName)
                    {
                        cmbPackages.SelectedIndex = i;
                        break;
                    }
                }
            }

            if (_SelectedCoverage != null)
            {
                cmbGridLayer.SelectedIndex   = _SelectedCoverage.GridLayer;
                tbCoverageName.ReadOnly      = true;
                btnCreateLookupTable.Enabled = false;
            }
            else
            {
                tbCoverageName.Text        = "new_coverage";
                cmbGridLayer.SelectedIndex = 0;
                dataGridEx1.ClearContent();

                tbCoverageName.ReadOnly      = false;
                btnCreateLookupTable.Enabled = true;
                //cmbGridLayer.Enabled = true;
                //cmbFields.Enabled = true;
                //cmbGridLayer.Enabled = true;
                //cmbPackages.Enabled = true;
                //chbProp.Enabled = true;
            }

            cmbMapLayers.SelectedIndexChanged += cmbMapLayers_SelectedIndexChanged;
            cmbGridLayer.SelectedIndexChanged += cmbGridLayer_SelectedIndexChanged;
        }
        private DataTable Derieve(PackageCoverage coverage)
        {
            if (coverage is FeatureCoverage)
            {
                var lm = coverage as FeatureCoverage;
                var dt = (lm.Source as FeatureSet).DataTable;
                List <DataColumn> new_dcs = new List <DataColumn>();
                foreach (var ap in lm.ArealProperties)
                {
                    if (!dt.Columns.Contains(ap.PropertyName))
                    {
                        DataColumn dc = new DataColumn(ap.PropertyName, Type.GetType(ap.TypeName));
                        dt.Columns.Add(dc);
                        dc.DefaultValue = ap.DefaultValue;
                        new_dcs.Add(dc);
                    }
                }

                if (!dt.Columns.Contains("ID"))
                {
                    DataColumn dc = new DataColumn("ID", Type.GetType("System.Int32"));
                    dt.Columns.Add(dc);

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        dt.Rows[i]["ID"] = i + 1;
                    }
                }
                if (new_dcs.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        foreach (var dc in new_dcs)
                        {
                            dr[dc.ColumnName] = dc.DefaultValue;
                        }
                    }
                }
                //lm.Source.Save();
                return(dt);
            }
            else
            {
                bool      outov           = false;
                var       raster          = coverage as RasterCoverage;
                bool      require_newfile = true;
                DataTable dt = null;
                if (File.Exists(raster.FullLookupTableFileName))
                {
                    LookupTable <double> mt = new LookupTable <double>();
                    mt.FromTextFile(raster.FullLookupTableFileName);
                    dt = mt.ToDataTable();
                    require_newfile = false;

                    foreach (var ap in raster.ArealProperties)
                    {
                        var buf = mt.ColNames.Where(p => p == ap.PropertyName);
                        if (buf.Count() == 0)
                        {
                            require_newfile = true;
                            break;
                        }
                    }
                    if (!require_newfile)
                    {
                        //raster.Converter = mt;
                    }
                }
                if (require_newfile)
                {
                    var para_names = from pr in raster.ArealProperties select pr.PropertyName;
                    var uval       = RasterEx.GetUniqueValues(raster.Source as IRaster, 100, out outov);
                    var uid        = from uu in uval select uu.ToString();

                    var default_values = from pr in raster.ArealProperties select double.Parse(pr.DefaultValue.ToString());

                    var mapping = new LookupTable <double>(para_names.ToArray(), uid.ToArray(), default_values.ToArray());
                    mapping.Save(raster.FullLookupTableFileName);
                    dt = mapping.ToDataTable();
                    //raster.Converter = mapping;
                }

                return(dt);
            }
        }
        private void btnCreateLookupTable_Click(object sender, EventArgs e)
        {
            try
            {
                var pc = viewModel.Value.ProjectController;
                if (_SelectedPackage == null)
                {
                    MessageBox.Show("No package selected.", "Selection", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (chbProp.CheckedItems.Count == 0)
                {
                    MessageBox.Show("No areal properties selected. Please select at least one.", "Selection", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (cmbMapLayers.SelectedItem == null)
                {
                    MessageBox.Show("A map layer must be selected", "Layer Selection", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (cmbFields.SelectedItem == null)
                {
                    MessageBox.Show("A field must be selected", "Field Selection", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (TypeConverterEx.IsNull(tbCoverageName.Text))
                {
                    MessageBox.Show("Coverage name can not be null ", "Coverage Name", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                else
                {
                    if (pc.Project.ContainsCoverage(tbCoverageName.Text))
                    {
                        MessageBox.Show("The coverage name you entered exists, please input anothr one", "Coverage Name", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                var layer = cmbMapLayers.SelectedItem as MapLayerDescriptor;

                if (_SelectedCoverage != null)
                {
                    if (MessageBox.Show("Lookup table existed. Do you really want to create a new lookup table?",
                                        "Layer Selection", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                    {
                        _SelectedCoverage.ArealProperties  = chbProp.CheckedItems.Cast <ArealPropertyInfo>().ToList();
                        _SelectedCoverage.LegendText       = tbCoverageName.Text;
                        _SelectedCoverage.Package          = _SelectedPackage;
                        _SelectedCoverage.Source           = layer.DataSet;
                        _SelectedCoverage.GridLayer        = cmbGridLayer.SelectedIndex;
                        _SelectedCoverage.FieldName        = cmbFields.SelectedItem.ToString();
                        _SelectedCoverage.CoverageFilePath = layer.DataSet.Filename;
                        _SelectedCoverage.InitLookupTable();
                        _SelectedCoverage.SaveLookupTable();
                        dataGridEx1.Bind(_SelectedCoverage.LookupTable);
                    }
                }
                else
                {
                    if (layer.DataSet is IFeatureSet)
                    {
                        _SelectedCoverage = new FeatureCoverage()
                        {
                            LegendText       = tbCoverageName.Text,
                            ID               = DirectoryHelper.GetUniqueString(),
                            ArealProperties  = chbProp.CheckedItems.Cast <ArealPropertyInfo>().ToList(),
                            PackageName      = _SelectedPackage.Name,
                            Package          = _SelectedPackage,
                            Source           = layer.DataSet,
                            GridLayer        = cmbGridLayer.SelectedIndex,
                            CoverageFilePath = layer.DataSet.Filename,
                            FieldName        = cmbFields.SelectedItem.ToString()
                        };
                        _SelectedCoverage.LookupTableFilePath = string.Format(".\\Processing\\fea_{0}_{1}.map", _SelectedCoverage.PackageName, _SelectedCoverage.ID);
                        _SelectedCoverage.InitLookupTable();
                        _SelectedCoverage.SaveLookupTable();
                        dataGridEx1.Bind(_SelectedCoverage.LookupTable);
                        pc.Project.FeatureCoverages.Add(_SelectedCoverage as FeatureCoverage);
                    }
                    else
                    {
                        _SelectedCoverage = new RasterCoverage()
                        {
                            LegendText       = tbCoverageName.Text,
                            ID               = DirectoryHelper.GetUniqueString(),
                            ArealProperties  = chbProp.CheckedItems.Cast <ArealPropertyInfo>().ToList(),
                            PackageName      = _SelectedPackage.Name,
                            Package          = _SelectedPackage,
                            Source           = layer.DataSet as IRaster,
                            GridLayer        = cmbGridLayer.SelectedIndex,
                            CoverageFilePath = layer.DataSet.Filename,
                            FieldName        = cmbFields.SelectedItem.ToString()
                        };
                        _SelectedCoverage.LookupTableFilePath = string.Format(".\\Processing\\fea_{0}_{1}.map", _SelectedCoverage.PackageName, _SelectedCoverage.ID);
                        _SelectedCoverage.InitLookupTable();
                        _SelectedCoverage.SaveLookupTable();
                        dataGridEx1.Bind(_SelectedCoverage.LookupTable);
                        pc.Project.RasterLayerCoverages.Add(_SelectedCoverage as RasterCoverage);
                    }
                }
            }
            catch
            {
                MessageBox.Show("Failed to creat lookup table", "Creation", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
        }