Example #1
0
        private void makeTrackpointsDS()
        {
            DataTable trackpointsTable;

            rebuildingTrackpoints = true;

            string sortOrder = "";

            if(m_trackpointsDS != null)
            {
                sortOrder = m_trackpointsDS.Tables["trackpoints"].DefaultView.Sort;	// we will restore it later
                m_trackpointsDS.Tables.Clear();
                m_trackpointsDS.Dispose();
            }

            trackpointsTable = new DataTable("trackpoints");

            DataColumn myDataColumn;

            // Create new DataColumn, set DataType, ColumnName and add to DataTable.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "id";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = true;
            trackpointsTable.Columns.Add(myDataColumn);

            // needed to relate waypoint to track
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "trackid";
            myDataColumn.ReadOnly = true;
            trackpointsTable.Columns.Add(myDataColumn);

            // needed to index waypoint inside a track
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "wptidx";
            myDataColumn.ReadOnly = true;
            trackpointsTable.Columns.Add(myDataColumn);

            // make column to support checkbox/button
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "view";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "View";
            myDataColumn.ReadOnly = false;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create name column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "name";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Name";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create date/time column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "time";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Time";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create location column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "location";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Location";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create track column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "track";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Track";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create source column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "source";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Source";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "displayed";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Display";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Make the ID column the primary key column.
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = trackpointsTable.Columns["id"];
            trackpointsTable.PrimaryKey = PrimaryKeyColumns;

            // Add the new DataTable to the DataSet.
            m_trackpointsDS = new DataSet();
            m_trackpointsDS.Tables.Add(trackpointsTable);

            // Create DataRow objects and add them to the DataTable
            DataRow myDataRow;
            int count = 0;
            Waypoint prevWpt = null;

            for (int i = 0; i < PhotoWaypoints.WaypointsWithThumbs.Count; i++)
            {
                Waypoint wpt = (Waypoint)PhotoWaypoints.WaypointsWithThumbs.GetByIndex(i);

                // wpt.Location.Lng, wpt.Location.Lat, wpt.Location.Elev
                if(wpt != null)
                {
                    count++;

                    Track trk = WaypointsCache.getTrackById(wpt.TrackId);
                    myDataRow = trackpointsTable.NewRow();
                    myDataRow["id"] = wpt.Id;
                    myDataRow["trackid"] = wpt.TrackId;
                    myDataRow["wptidx"] = i;		// in track
                    string contentOrUrl = (wpt.Desc != null && wpt.Desc.Length > 0) ? "*" : "";
                    contentOrUrl += (wpt.Url != null && wpt.Url.Length > 0) ? "@" : "";
                    myDataRow["view"] = false;
                    myDataRow["name"] = contentOrUrl + ((wpt.Name == null || wpt.Name.Length == 0) ? ("" + (i+1)) : wpt.Name);
                    myDataRow["time"] = new SortableDateTime(wpt.DateTime, DateTimeDisplayMode.ConvertToLocal);
                    myDataRow["location"] = wpt.Location.ToStringWithElev();

                    myDataRow["track"] = trk == null ? "" : trk.Name;
                    myDataRow["source"] = wpt.Source;
                    myDataRow["displayed"] = true;
                    trackpointsTable.Rows.Add(myDataRow);
                    prevWpt = wpt;
                }
            }
            this.messageTrkptLabel.Text = ("total " + count + " track points with photos");

            trackpointsTable.RowDeleting += new DataRowChangeEventHandler(this.trackpoints_RowDeleting);

            trackpointsTable.DefaultView.Sort = sortOrder;

            if(trackpointsTable.DefaultView.Sort.Length == 0)
            {
                trackpointsTable.DefaultView.Sort = "time";
            }

            rebuildingTrackpoints = false;
        }
Example #2
0
        private void makeUnrelatedDS()
        {
            DataTable unrelatedTable;

            rebuildingUnrelated = true;

            string sortOrder = "";

            if(m_unrelatedDS != null)
            {
                sortOrder = m_unrelatedDS.Tables["unrelated"].DefaultView.Sort;	// we will restore it later
                m_unrelatedDS.Tables.Clear();
                m_unrelatedDS.Dispose();
            }

            unrelatedTable = new DataTable("unrelated");

            DataColumn myDataColumn;

            // Create new DataColumn, set DataType, ColumnName and add to DataTable.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "id";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = true;
            unrelatedTable.Columns.Add(myDataColumn);

            // make column to support checkbox/button
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "view";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "View";
            myDataColumn.ReadOnly = false;
            myDataColumn.Unique = false;
            unrelatedTable.Columns.Add(myDataColumn);

            // Create name column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "name";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Name";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            unrelatedTable.Columns.Add(myDataColumn);

            // Create date/time column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "time";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Time";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            unrelatedTable.Columns.Add(myDataColumn);

            // Create source column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "source";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Source";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            unrelatedTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "displayed";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Display";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            unrelatedTable.Columns.Add(myDataColumn);

            // Make the ID column the primary key column.
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = unrelatedTable.Columns["id"];
            unrelatedTable.PrimaryKey = PrimaryKeyColumns;

            // Add the new DataTable to the DataSet.
            m_unrelatedDS = new DataSet();
            m_unrelatedDS.Tables.Add(unrelatedTable);

            // Create DataRow objects and add them to the DataTable
            DataRow myDataRow;
            int count = 0;

            for (int i = 0; i < PhotoWaypoints.PhotosUnrelated.Count; i++)
            {
                PhotoDescr pd = (PhotoDescr)PhotoWaypoints.PhotosUnrelated.GetByIndex(i);

                // wpt.Location.Lng, wpt.Location.Lat, wpt.Location.Elev
                if(pd != null)
                {
                    count++;

                    myDataRow = unrelatedTable.NewRow();
                    myDataRow["id"] = pd.Id;
                    myDataRow["view"] = false;
                    myDataRow["name"] = pd.imageName;
                    myDataRow["time"] = new SortableDateTime(pd.DTOrig, DateTimeDisplayMode.DisplayAsIs);

                    myDataRow["source"] = pd.imageSource;
                    unrelatedTable.Rows.Add(myDataRow);
                }
            }
            this.messageUnrelatedLabel.Text = ("" + count + " photos that couldn't be related to trackpoints");

            unrelatedTable.RowDeleting += new DataRowChangeEventHandler(this.unrelated_RowDeleting);

            unrelatedTable.DefaultView.Sort = sortOrder;

            if(unrelatedTable.DefaultView.Sort.Length == 0)
            {
                unrelatedTable.DefaultView.Sort = "time";
            }

            rebuildingUnrelated = false;
        }
        private void makeWaypointsDS()
        {
            DataTable waypointsTable;

            rebuildingWaypoints = true;

            string sortOrder = "";

            if(m_waypointsDS != null)
            {
                sortOrder = m_waypointsDS.Tables["waypoints"].DefaultView.Sort;	// we will restore it later
                m_waypointsDS.Tables.Clear();
                m_waypointsDS.Dispose();
            }

            {
                waypointsTable = new DataTable("waypoints");

                DataColumn myDataColumn;

                // Create new DataColumn, set DataType, ColumnName and add to DataTable.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.Int32");
                myDataColumn.ColumnName = "id";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = true;
                waypointsTable.Columns.Add(myDataColumn);

                // Create wptName column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "wptname";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Short Name";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create name column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "urlname";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Url Name";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create desc column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "desc";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Description";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create comment column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "comment";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Comment";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create date/time column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = sortableDateTime.GetType();
                myDataColumn.ColumnName = "time";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Time";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create location column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "location";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Location";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create distance from camera column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = (new Distance(0.0d)).GetType();
                myDataColumn.ColumnName = "distance";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Distance";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create symbol column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "sym";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Symbol";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create found column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "found";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Found";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Create source column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "source";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Source";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.Boolean");
                myDataColumn.ColumnName = "displayed";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Display";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                waypointsTable.Columns.Add(myDataColumn);

                // Make the ID column the primary key column.
                DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = waypointsTable.Columns["id"];
                waypointsTable.PrimaryKey = PrimaryKeyColumns;

                // Add the new DataTable to the DataSet.
                m_waypointsDS = new DataSet();
                m_waypointsDS.Tables.Add(waypointsTable);
            }

            // Create DataRow objects and add them to the DataTable
            DataRow myDataRow;
            foreach (Waypoint wpt in WaypointsCache.WaypointsAll)
            {
                myDataRow = waypointsTable.NewRow();
                myDataRow["id"] = wpt.Id;
                myDataRow["wptname"] = wpt.WptName;
                myDataRow["urlname"] = wpt.UrlName;
                string desc = wpt.Desc.Replace("\n", " ").Replace("\r", "");
                desc= desc.Length > 150 ? (desc.Substring(0, 150) + "...") : desc;
                myDataRow["desc"] = desc;
                string comment = wpt.Comment.Replace("\n", " ").Replace("\r", "");
                comment= comment.Length > 150 ? (comment.Substring(0, 150) + "...") : comment;
                myDataRow["comment"] = comment;
                myDataRow["time"] = new SortableDateTime(wpt.DateTime, DateTimeDisplayMode.ConvertToLocal);
                myDataRow["location"] = wpt.Location.ToStringWithElev();
                myDataRow["distance"] = m_cameraManager.Location.distanceFrom(wpt.Location);
                myDataRow["sym"] = wpt.Sym;
                myDataRow["found"] = wpt.Found ? "yes" : "";
                myDataRow["source"] = wpt.Source;
                myDataRow["displayed"] = wpt.Enabled;
                waypointsTable.Rows.Add(myDataRow);
            }

            waypointsTable.RowDeleting += new DataRowChangeEventHandler(this.waypoints_RowDeleting);

            waypointsTable.DefaultView.Sort = sortOrder;

            if(waypointsTable.DefaultView.Sort.Length == 0)
            {
                waypointsTable.DefaultView.Sort = "distance";
            }

            rebuildingWaypoints = false;
        }
        private void makeTracksDS()
        {
            DataTable tracksTable;

            rebuildingTracks = true;

            // we cannot reuse the table, as boolean "Show" checkboxes will otherwise have their events messed up badly.
            if(m_tracksDS != null)
            {
                m_tracksDS.Dispose();
            }

            tracksTable = new DataTable("tracks");

            DataColumn myDataColumn;

            // Create new DataColumn, set DataType, ColumnName and add to DataTable.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "id";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = true;
            tracksTable.Columns.Add(myDataColumn);

            // Create name column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "name";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Name";
            myDataColumn.ReadOnly = false;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            // Create distance traveled column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = (new Distance(0.0d)).GetType();
            myDataColumn.ColumnName = "distance";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Distance";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            // Create source column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "source";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Source";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            // Create "legs" column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "legs";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Legs";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            // Create start column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "start";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Start";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            // Create end column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "end";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "End";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "displayed";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Display";
            myDataColumn.ReadOnly = false;
            myDataColumn.Unique = false;
            tracksTable.Columns.Add(myDataColumn);

            // Make the ID column the primary key column.
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = tracksTable.Columns["id"];
            tracksTable.PrimaryKey = PrimaryKeyColumns;

            // Add the new DataTable to the DataSet.
            m_tracksDS = new DataSet();
            m_tracksDS.Tables.Add(tracksTable);

            tracksTable = m_tracksDS.Tables[0];
            tracksTable.ColumnChanging -= new DataColumnChangeEventHandler(this.tracks_ColumnChanging);
            tracksTable.RowDeleting -= new DataRowChangeEventHandler(this.tracks_RowDeleting);

            // Create DataRow objects and add them to the DataTable
            DataRow myDataRow;
            for (int i = 0; i < WaypointsCache.TracksAll.Count; i++)
            {
                Track track = (Track)WaypointsCache.TracksAll[i];
                if(!track.isRoute)
                {
                    myDataRow = tracksTable.NewRow();
                    myDataRow["id"] = track.Id;

                    Speed dMaxSpeed = new Speed(track.SpeedMax);		// meters per hour
                    Speed dMinSpeed = new Speed(track.SpeedMin);		// meters per hour
                    Distance dOdometer = new Distance(track.Odometer);	// meters

                    myDataRow["name"] = track.Name;
                    string sSpeed = dMinSpeed.ToString() + " to " + dMaxSpeed.ToString();
                    if(!dMinSpeed.isSane && !dMaxSpeed.isSane)
                    {
                        sSpeed = "n/a";
                    }
                    myDataRow["source"] = "speed:" + sSpeed + "   source: " + track.Source;
                    myDataRow["legs"] = track.Trackpoints.Count;
                    myDataRow["start"] = new SortableDateTime(track.Start, DateTimeDisplayMode.ConvertToLocal);
                    myDataRow["end"] = new SortableDateTime(track.End, DateTimeDisplayMode.ConvertToLocal);
                    myDataRow["distance"] = dOdometer;
                    myDataRow["displayed"] = track.Enabled;
                    tracksTable.Rows.Add(myDataRow);
                }
            }

            tracksTable.ColumnChanging += new DataColumnChangeEventHandler(this.tracks_ColumnChanging);
            tracksTable.RowDeleting += new DataRowChangeEventHandler(this.tracks_RowDeleting);

            rebuildingTracks = false;
        }
        private void makeTrackpointsDS(ArrayList selectedTracksRows)
        {
            DataTable trackpointsTable;

            rebuildingTrackpoints = true;

            string sortOrder = "";

            if(m_trackpointsDS != null)
            {
                sortOrder = m_trackpointsDS.Tables["trackpoints"].DefaultView.Sort;	// we will restore it later
                m_trackpointsDS.Tables.Clear();
                m_trackpointsDS.Dispose();
            }

            trackpointsTable = new DataTable("trackpoints");

            DataColumn myDataColumn;

            // Create new DataColumn, set DataType, ColumnName and add to DataTable.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "id";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = true;
            trackpointsTable.Columns.Add(myDataColumn);

            // needed to relate waypoint to track
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "trackid";
            myDataColumn.ReadOnly = true;
            trackpointsTable.Columns.Add(myDataColumn);

            // needed to index waypoint inside a track
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "wptidx";
            myDataColumn.ReadOnly = true;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create name column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "name";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Name";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create date/time column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "time";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Time";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create location column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "location";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Location";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create elevation column (for graph).
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Double");
            myDataColumn.ColumnName = "elevation";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Elevation";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create speed column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = (new Speed(0.0d)).GetType();
            myDataColumn.ColumnName = "speed";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Speed";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create heading column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "heading";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Heading";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create leg distance column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = (new Distance(0.0d)).GetType();
            myDataColumn.ColumnName = "leg";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Leg";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create distance traveled (odometer) column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = (new Distance(0.0d)).GetType();
            myDataColumn.ColumnName = "distance";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Distance";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create track column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "track";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Track";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create source column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "source";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Source";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "displayed";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Display";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create real location column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = GeoCoord.This.GetType();
            myDataColumn.ColumnName = "locationReal";
            myDataColumn.AutoIncrement = false;
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Create real heading column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Double");
            myDataColumn.ColumnName = "headingReal";
            myDataColumn.AutoIncrement = false;
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            trackpointsTable.Columns.Add(myDataColumn);

            // Make the ID column the primary key column.
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = trackpointsTable.Columns["id"];
            trackpointsTable.PrimaryKey = PrimaryKeyColumns;

            // Add the new DataTable to the DataSet.
            m_trackpointsDS = new DataSet();
            m_trackpointsDS.Tables.Add(trackpointsTable);

            // Create DataRow objects and add them to the DataTable
            DataRow myDataRow;
            int column = 0;
            int count = 0;
            m_elevMax = 0.0d;	// meters
            m_elevMin = 0.0d;
            bool fromRoutes = this.prevSelectedTab == this.routesTabPage;
            this.messageTrkptLabel.Text = fromRoutes ? "Routes:" : "Tracks:";
            foreach (int row in selectedTracksRows)
            {
                long trackId = (long)((int)(fromRoutes ? routesDataGrid[row, column] : tracksDataGrid[row, column]));
                Track trk = WaypointsCache.getTrackById(trackId);
                Waypoint prevWpt = null;
                if(trk != null)
                {
                    this.messageTrkptLabel.Text += (" " + trk.Name + " ");

                    double odometer = 0.0d;	// meters

                    for (int i = 0; i < trk.Trackpoints.Count; i++)
                    {
                        Waypoint wpt = (Waypoint)trk.Trackpoints.GetByIndex(i);
                        Waypoint nextWpt = (i < trk.Trackpoints.Count-1) ? (Waypoint)trk.Trackpoints.GetByIndex(i+1) : null;

                        // wpt.Location.Lng, wpt.Location.Lat, wpt.Location.Elev
                        if(wpt != null)
                        {
                            count++;
                            myDataRow = trackpointsTable.NewRow();
                            myDataRow["id"] = wpt.Id;
                            myDataRow["trackid"] = trackId;
                            myDataRow["wptidx"] = i;		// in track
                            string contentOrUrl = (wpt.Desc != null && wpt.Desc.Length > 0) ? "*" : "";
                            contentOrUrl += (wpt.Url != null && wpt.Url.Length > 0) ? "@" : "";
                            string name = contentOrUrl;

                            name += ((wpt.Name == null || wpt.Name.Length == 0) ? ("" + (i+1)) : wpt.Name);
                            if(wpt.WptName.Length > 0 && !name.ToLower().StartsWith(wpt.WptName.ToLower()))		// avoid duplicates like "2: 2"
                            {
                                name += ": " + wpt.WptName;
                            }
                            myDataRow["name"] = name.Trim();
                            myDataRow["time"] = new SortableDateTime(wpt.DateTime, DateTimeDisplayMode.ConvertToLocal);
                            myDataRow["location"] = wpt.Location.ToStringWithElev();
                            myDataRow["locationReal"] = new GeoCoord(wpt.Location);

                            double elev = wpt.Location.Elev;
                            myDataRow["elevation"] = elev;

                            m_elevMax = Math.Max(m_elevMax, elev);
                            m_elevMin = Math.Min(m_elevMin, elev);

                            Speed speed = null;
                            Distance leg = null;
                            if(prevWpt != null)
                            {
                                // compute odometer and speed:
                                TimeSpan dt = wpt.DateTime - prevWpt.DateTime;
                                leg = wpt.Location.distanceFrom(prevWpt.Location);	// meters
                                double legMeters = leg.Meters;
                                odometer += legMeters;
                                double legMetersPerHour = legMeters * 36000000000.0d / dt.Ticks;		// meters per hour
                                if(!fromRoutes && legMetersPerHour > 1000.0d && legMetersPerHour < 330.0d * 3600.0d)	// sanity check - speed of sound, m/hr
                                {
                                    wpt.Speed = (float)legMetersPerHour;
                                    if(wpt.Speed > trk.SpeedMax)
                                    {
                                        trk.SpeedMax = wpt.Speed;
                                    }
                                    if(wpt.Speed < trk.SpeedMin)
                                    {
                                        trk.SpeedMin = wpt.Speed;
                                    }
                                    speed = new Speed(legMetersPerHour);
                                }
                            }
                            wpt.Odometer = (float)odometer;

                            myDataRow["speed"] = speed == null ? new Speed(-1.0d) : speed;

                            double variation = Math.Round(wpt.Location.magneticVariation());
                            double headingTrue = (nextWpt == null || wpt.Location.sameAs(nextWpt.Location)) ? 999.0d : (wpt.Location.bearing(nextWpt.Location) * 180.0d / Math.PI);
                            double headingMagn = (headingTrue == 999.0d) ? 999.0d : ((headingTrue + variation + 360.0d) % 360.0d);

                            myDataRow["headingReal"] = headingMagn;
                            myDataRow["heading"] = (headingTrue == 999.0d) ? "" : String.Format("{0:000}°", Math.Round(headingMagn));
                            myDataRow["leg"] = leg == null ? new Distance(0.0d) : leg;
                            myDataRow["distance"] = new Distance(odometer);
                            myDataRow["track"] = trk.Name;
                            myDataRow["source"] = wpt.Source;
                            myDataRow["displayed"] = true;
                            trackpointsTable.Rows.Add(myDataRow);
                            prevWpt = wpt;
                        }
                    }
                }
            }
            this.messageTrkptLabel.Text += ("   - total " + count + " points");

            trackpointsTable.RowDeleting += new DataRowChangeEventHandler(this.trackpoints_RowDeleting);

            trackpointsTable.DefaultView.Sort = sortOrder;

            if(trackpointsTable.DefaultView.Sort.Length == 0)
            {
                trackpointsTable.DefaultView.Sort = "time";
            }

            rebuildingTrackpoints = false;
        }
        private void makeRoutesDS()
        {
            DataTable routesTable;

            rebuildingRoutes = true;

            // we cannot reuse the table, as boolean "Show" checkboxes will otherwise have their events messed up badly.
            if(m_routesDS != null)
            {
                m_routesDS.Dispose();
            }

            routesTable = new DataTable("routes");

            DataColumn myDataColumn;

            // Create new DataColumn, set DataType, ColumnName and add to DataTable.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "id";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = true;
            routesTable.Columns.Add(myDataColumn);

            // Create name column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "name";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Name";
            myDataColumn.ReadOnly = false;
            myDataColumn.Unique = false;
            routesTable.Columns.Add(myDataColumn);

            // Create source column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataColumn.ColumnName = "source";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Source";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            routesTable.Columns.Add(myDataColumn);

            // Create "legs" column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataColumn.ColumnName = "legs";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Legs";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            routesTable.Columns.Add(myDataColumn);

            // Create start column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "start";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Start";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            routesTable.Columns.Add(myDataColumn);

            // Create end column.
            myDataColumn = new DataColumn();
            myDataColumn.DataType = sortableDateTime.GetType();
            myDataColumn.ColumnName = "end";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "End";
            myDataColumn.ReadOnly = true;
            myDataColumn.Unique = false;
            routesTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.DataType = System.Type.GetType("System.Boolean");
            myDataColumn.ColumnName = "displayed";
            myDataColumn.AutoIncrement = false;
            myDataColumn.Caption = "Display";
            myDataColumn.ReadOnly = false;
            myDataColumn.Unique = false;
            routesTable.Columns.Add(myDataColumn);

            // Make the ID column the primary key column.
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];
            PrimaryKeyColumns[0] = routesTable.Columns["id"];
            routesTable.PrimaryKey = PrimaryKeyColumns;

            // Add the new DataTable to the DataSet.
            m_routesDS = new DataSet();
            m_routesDS.Tables.Add(routesTable);

            routesTable = m_routesDS.Tables[0];
            // Create DataRow objects and add them to the DataTable
            DataRow myDataRow;
            for (int i = 0; i < WaypointsCache.TracksAll.Count; i++)
            {
                Track route = (Track)WaypointsCache.TracksAll[i];
                if(route.isRoute)
                {
                    myDataRow = routesTable.NewRow();
                    myDataRow["id"] = route.Id;

                    Distance dOdometer = new Distance(route.Odometer);	// meters

                    myDataRow["name"] = route.Name;
                    myDataRow["source"] = "" + dOdometer.ToString() + "      source: " + route.Source;
                    myDataRow["legs"] = route.Trackpoints.Count - 1;
                    myDataRow["start"] = new SortableDateTime(route.Start, DateTimeDisplayMode.ConvertToLocal);
                    myDataRow["end"] = new SortableDateTime(route.End, DateTimeDisplayMode.ConvertToLocal);
                    myDataRow["displayed"] = route.Enabled;
                    routesTable.Rows.Add(myDataRow);
                }
            }

            // now make sure the event handlers are in place:
            routesTable.ColumnChanging += new DataColumnChangeEventHandler(this.routes_ColumnChanging);
            routesTable.RowDeleting += new DataRowChangeEventHandler(this.routes_RowDeleting);

            rebuildingRoutes = false;
        }
        private void makeEqDS(bool useFilter)
        {
            DataTable eqTable;

            if(m_eqDS == null)
            {
                eqTable = new DataTable("eq");

                DataColumn myDataColumn;

                // Create new DataColumn, set DataType, ColumnName and add to DataTable.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.Int32");
                myDataColumn.ColumnName = "id";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = true;
                eqTable.Columns.Add(myDataColumn);

                // Create magn column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.Double");
                myDataColumn.ColumnName = "magn";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Magn";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create location column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "location";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Location";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create quality column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "quality";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Quality";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create comment column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "comment";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Comment";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create time column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = sortableDateTime.GetType();
                myDataColumn.ColumnName = "time";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Time";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create displayed column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                //myDataColumn.DataType = System.Type.GetType("System.Boolean");
                myDataColumn.ColumnName = "displayed";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Shown";
                myDataColumn.ReadOnly = false;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create source column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "source";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "Source";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Create url column.
                myDataColumn = new DataColumn();
                myDataColumn.DataType = System.Type.GetType("System.String");
                myDataColumn.ColumnName = "url";
                myDataColumn.AutoIncrement = false;
                myDataColumn.Caption = "URL";
                myDataColumn.ReadOnly = true;
                myDataColumn.Unique = false;
                eqTable.Columns.Add(myDataColumn);

                // Make the ID column the primary key column.
                DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = eqTable.Columns["id"];
                eqTable.PrimaryKey = PrimaryKeyColumns;

                // Add the new DataTable to the DataSet.
                m_eqDS = new DataSet();
                m_eqDS.Tables.Add(eqTable);
            }

            ArrayList src = null;
            switch(m_scope)
            {
                case 0:		// world
                    src = EarthquakesCache.EarthquakesAll;
                    break;
                default:
                case 1:		// visible on map
                    src = EarthquakesCache.EarthquakesDisplayed;
                    break;
                case 2:		// selected in graph or filtered in grid
                    src = EarthquakesCache.EarthquakesDisplayed;
                    break;
            }
            eqTable = m_eqDS.Tables[0];
            eqTable.Rows.Clear();
            // Create DataRow objects and add them to the DataTable
            dsUseUtcTime = Project.useUtcTime; // also memorize how the DS was created
            DataRow myDataRow;
            for (int i = 0; i < src.Count; i++)
            {
                Earthquake eq = (Earthquake)src[i];
                if(!useFilter || useFilter && TimeMagnitudeFilter.passesAll(eq.DateTime, eq.Magn))
                {
                    myDataRow = eqTable.NewRow();

                    myDataRow["id"] = eq.Id;
                    myDataRow["magn"] = eq.Magn;
                    myDataRow["location"] = eq.Location.ToString();
                    myDataRow["quality"] = eq.Quality;
                    myDataRow["comment"] = eq.Comment;
                    myDataRow["time"] = new SortableDateTime(dsUseUtcTime ? eq.DateTime : Project.zuluToLocal(eq.DateTime));
                    myDataRow["displayed"] = eq.Enabled ? "yes" : "no";
                    myDataRow["source"] = eq.Source;
                    myDataRow["url"] = eq.Url;

                    try
                    {
                        eqTable.Rows.Add(myDataRow);
                    }
                    catch {}
                }
            }

            if(eqTable.DefaultView.Sort.Length == 0)
            {
                eqTable.DefaultView.Sort = "magn DESC";
            }

            messageLabel.Text = "" + src.Count + " earthquakes";
        }