[mapguide-commits] r6937 - in branches/2.4/MgDev/Desktop: MapViewer MapViewer.Desktop

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu Aug 16 02:07:48 PDT 2012


Author: jng
Date: 2012-08-16 02:07:48 -0700 (Thu, 16 Aug 2012)
New Revision: 6937

Modified:
   branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs
   branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs
   branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs
   branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs
Log:
mg-desktop: Re-work the viewer selection logic. The existing viewer selection logic pre-dates the porting over of MgRenderingService::QueryFeatures to mg-desktop. Again, this is purely a move to ensure consistency of API behaviour between mg-desktop and MapGuide proper. We can now probably eliminate a lot of selection/tooltip code that's currently in MgMapViewerProvider as it is no longer required.

Modified: branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs	2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs	2012-08-16 09:07:48 UTC (rev 6937)
@@ -296,6 +296,13 @@
         void SelectByGeometry(MgGeometry geom);
 
         /// <summary>
+        /// Selects features from all selectable layers that intersects the given geometry up to the specified number
+        /// </summary>
+        /// <param name="geom"></param>
+        /// <param name="maxFeatures">The maximum number of features to select. Specify -1 for all features</param>
+        void SelectByGeometry(MgGeometry geom, int maxFeatures);
+
+        /// <summary>
         /// Zooms to the initial map view
         /// </summary>
         void InitialMapView();

Modified: branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs	2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs	2012-08-16 09:07:48 UTC (rev 6937)
@@ -2089,10 +2089,8 @@
             _lastTooltipX = x;
             _lastTooltipY = y;
 
-            var layers = _map.GetLayers();
-            
-            var mapPt1 = ScreenToMapUnits(x - 2, y - 2);
-            var mapPt2 = ScreenToMapUnits(x + 2, y + 2);
+            var mapPt1 = ScreenToMapUnits(x - this.PointPixelBuffer, y - this.PointPixelBuffer);
+            var mapPt2 = ScreenToMapUnits(x + this.PointPixelBuffer, y + this.PointPixelBuffer);
             var ringCoords = new MgCoordinateCollection();
             ringCoords.Add(_geomFact.CreateCoordinateXY(mapPt2.X, mapPt2.Y));
             ringCoords.Add(_geomFact.CreateCoordinateXY(mapPt1.X, mapPt2.Y));
@@ -2101,113 +2099,12 @@
             ringCoords.Add(_geomFact.CreateCoordinateXY(mapPt2.X, mapPt2.Y)); //Close it
             var poly = _geomFact.CreatePolygon(_geomFact.CreateLinearRing(ringCoords), new MgLinearRingCollection());
 
-            for (int i = 0; i < layers.GetCount(); i++)
+            MgTooltipQueryResult tr = _provider.QueryMapFeatures(MgQueryRequestType.Tooltip, null, poly, MgFeatureSpatialOperations.Intersects, "", 1, 4 /* has tooltips */) as MgTooltipQueryResult;
+            if (tr != null)
             {
-                var layer = layers.GetItem(i);
-                var layerGroup = layer.GetGroup();
-                //Layer not visible or its parent is not visible
-                if (!layer.IsVisible() || (layerGroup != null && !layerGroup.IsVisible()))
-                    continue;
-
-                //No defined tooltips
-                if (!_provider.LayerHasTooltips(layer))
-                    continue;
-
-                //Drawing layers have no intelligence
-                string fsId = layer.FeatureSourceId;
-                if (fsId.EndsWith(MgResourceType.DrawingSource))
-                    continue;
-
-                //Nor do rasters
-                if (IsRasterLayer(layer))
-                    continue;
-
-                var objId = layer.GetObjectId();
-                var ldfId = layer.GetLayerDefinition();
-                var ldfIdStr = ldfId.ToString();
-
-                //No tooltip detected
-                //if (!_tooltipExpressions.ContainsKey(ldfIdStr))
-                if (!_provider.HasTooltips(ldfId))
-                    continue;
-
-                //Make sure geometry property checks out
-                var geomName = _provider.GetGeometryProperty(objId);
-                var clsDef = layer.GetClassDefinition();
-                var props = clsDef.GetProperties();
-                if (props.IndexOf(geomName) < 0)
-                    continue;
-
-                var geomProp = props.GetItem(geomName) as MgGeometricPropertyDefinition;
-                if (geomProp == null)
-                    continue;
-
-                var trans = _provider.GetMapToLayerTransform(layer, geomProp);
-
-                string propName = "QUERYTOOLTIP";
-                MgFeatureQueryOptions query = new MgFeatureQueryOptions();
-                query.AddComputedProperty(propName, _provider.GetTooltipExpression(ldfId));
-                if (trans != null)
-                {
-                    var txPoly = (MgGeometry)poly.Transform(trans);
-                    query.SetSpatialFilter(geomName, txPoly, MgFeatureSpatialOperations.Intersects);
-                }
-                else
-                {
-                    query.SetSpatialFilter(geomName, poly, MgFeatureSpatialOperations.Intersects);
-                }
-
-                MgFeatureReader reader = null;
-                reader = layer.SelectFeatures(query);
-                try
-                {
-                    if (reader.ReadNext())
-                    {
-                        object value = null;
-
-                        var pt = reader.GetPropertyType(propName);
-                        switch (pt)
-                        {
-                            case MgPropertyType.String:
-                                value = reader.GetString(propName);
-                                break;
-                            case MgPropertyType.Boolean:
-                                value = reader.GetBoolean(propName);
-                                break;
-                            case MgPropertyType.Byte:
-                                value = reader.GetByte(propName);
-                                break;
-                            case MgPropertyType.DateTime:
-                                value = reader.GetByte(propName);
-                                break;
-                            case MgPropertyType.Double:
-                            case MgPropertyType.Decimal:
-                                value = reader.GetDouble(propName);
-                                break;
-                            case MgPropertyType.Int16:
-                                value = reader.GetInt16(propName);
-                                break;
-                            case MgPropertyType.Int32:
-                                value = reader.GetInt32(propName);
-                                break;
-                            case MgPropertyType.Int64:
-                                value = reader.GetInt64(propName);
-                                break;
-                            case MgPropertyType.Single:
-                                value = reader.GetSingle(propName);
-                                break;
-                        }
-
-                        if (value != null)
-                            return value.ToString(); //.Replace("\n", Environment.NewLine);
-                    }
-                }
-                finally
-                {
-                    reader.Close();
-                }
+                _activeTooltipText = tr.Tooltip;
+                return _activeTooltipText;
             }
-
             return string.Empty;
         }
 
@@ -2245,11 +2142,17 @@
             Clipboard.SetImage(this.GetCurrentImage());
         }
 
+        public void SelectByGeometry(MgGeometry geom)
+        {
+            SelectByGeometry(geom, -1);
+        }
+
         /// <summary>
         /// Selects features from all selectable layers that intersects the given geometry
         /// </summary>
         /// <param name="geom"></param>
-        public void SelectByGeometry(MgGeometry geom)
+        /// <param name="maxFeatures"></param>
+        public void SelectByGeometry(MgGeometry geom, int maxFeatures)
         {
             //Don't select if dragging. This is the cause of the failure to render
             //multiple selections, which required a manual refresh afterwards
@@ -2260,70 +2163,18 @@
             var sw = new Stopwatch();
             sw.Start();
 #endif
-
-            string mapCsWkt = _map.GetMapSRS();
-            var layers = _map.GetLayers();
-
-            if (ModifierKeys != Keys.Control)
-                _provider.ClearSelection(_selection);
-
-            for (int i = 0; i < layers.GetCount(); i++)
+            //We will be either wiping or updating the existing selection set
+            MgSelectionQueryResult sel = _provider.QueryMapFeatures(MgQueryRequestType.Selection, null, geom, MgFeatureSpatialOperations.Intersects, "", maxFeatures, (1 | 2)) as MgSelectionQueryResult; //1=Visible, 2=Selectable, 4=HasTooltips
+            if (sel != null)
             {
-                var layer = layers.GetItem(i);
-                if (!layer.Selectable || !layer.IsVisible())
-                    continue;
-
-                string fsId = layer.FeatureSourceId;
-                if (fsId.EndsWith(MgResourceType.DrawingSource))
-                    continue;
-
-                //Nor do rasters
-                if (IsRasterLayer(layer))
-                    continue;
-
-                //This could be a newly added layer
-                _provider.CheckAndCacheGeometryProperty(layer);
-
-                var objId = layer.GetObjectId();
-                string geomName = _provider.GetGeometryProperty(objId);
-
-                //Make sure geometry property checks out
-                var clsDef = layer.GetClassDefinition();
-                var props = clsDef.GetProperties();
-                if (props.IndexOf(geomName) < 0)
-                    continue;
-
-                var geomProp = props.GetItem(geomName) as MgGeometricPropertyDefinition;
-                if (geomProp == null)
-                    continue;
-
-                MgFeatureQueryOptions query = new MgFeatureQueryOptions();
-                string filter = layer.GetFilter();
-                if (!string.IsNullOrEmpty(filter))
-                    query.SetFilter(filter);
-
-                var trans = _provider.GetMapToLayerTransform(layer, geomProp);
-                if (trans != null)
-                {
-                    var txGeom = (MgGeometry)geom.Transform(trans);
-                    query.SetSpatialFilter(geomName, txGeom, MgFeatureSpatialOperations.Intersects);
-                }
-                else
-                {
-                    query.SetSpatialFilter(geomName, geom, MgFeatureSpatialOperations.Intersects);
-                }
-
-                MgFeatureReader reader = layer.SelectFeatures(query);
-                try
-                {
-                    _selection.AddFeatures(layer, reader, 0);
-                }
-                finally
-                {
-                    reader.Close();
-                }
+                MgSelectionBase newSel = sel.Selection;
+                string newXml = newSel.ToXml();
+                _selection.FromXml(newXml);
             }
-
+            else
+            {
+                _selection.FromXml("");
+            }
 #if TRACE
             sw.Stop();
             Trace.TraceInformation("Selection processing completed in {0}ms", sw.ElapsedMilliseconds);
@@ -2642,7 +2493,7 @@
 
                     MgGeometry geom = _wktRW.Read(MakeWktPolygon(mapPt1.X, mapPt1.Y, mapPt2.X, mapPt2.Y));
 
-                    SelectByGeometry(geom);
+                    SelectByGeometry(geom, 1);
                 }
                 else if (this.ActiveTool == MapActiveTool.ZoomIn)
                 {

Modified: branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs	2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs	2012-08-16 09:07:48 UTC (rev 6937)
@@ -341,5 +341,47 @@
         {
             _mapToLayerTransforms[objId] = trans;
         }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="queryType"></param>
+        /// <param name="layerNames"></param>
+        /// <param name="filterGeom"></param>
+        /// <param name="selectionVariant"></param>
+        /// <param name="featureFilter"></param>
+        /// <param name="maxFeatures"></param>
+        /// <param name="layerAttributeFilter"></param>
+        /// <returns></returns>
+        public abstract MgQueryMapFeaturesResult QueryMapFeatures(MgQueryRequestType queryType, MgStringCollection layerNames, MgGeometry filterGeom, int selectionVariant, string featureFilter, int maxFeatures, int layerAttributeFilter);
+
+        protected MgTooltipQueryResult MakeTooltip(string tooltip) { return new MgTooltipQueryResult(tooltip); }
+
+        protected MgSelectionQueryResult MakeSelectionResult(MgSelectionBase sel) { return new MgSelectionQueryResult(sel); }
     }
+
+    public abstract class MgQueryMapFeaturesResult
+    {
+
+    }
+
+    public class MgTooltipQueryResult : MgQueryMapFeaturesResult
+    {
+        internal MgTooltipQueryResult(string tooltip) { this.Tooltip = tooltip; }
+
+        public string Tooltip { get; private set; }
+    }
+
+    public class MgSelectionQueryResult : MgQueryMapFeaturesResult
+    {
+        internal MgSelectionQueryResult(MgSelectionBase newSelection) { this.Selection = newSelection; }
+
+        public MgSelectionBase Selection { get; private set; }
+    }
+
+    public enum MgQueryRequestType
+    {
+        Tooltip,
+        Selection
+    }
 }

Modified: branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs	2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs	2012-08-16 09:07:48 UTC (rev 6937)
@@ -159,5 +159,14 @@
         {
             return _renderSvc.RenderMap(_implMap, (MgdSelection)selection, format);
         }
+
+        public override MgQueryMapFeaturesResult QueryMapFeatures(MgQueryRequestType queryType, MgStringCollection layerNames, MgGeometry filterGeom, int selectionVariant, string featureFilter, int maxFeatures, int layerAttributeFilter)
+        {
+            var fi = _renderSvc.QueryFeatures(_implMap, layerNames, filterGeom, selectionVariant, featureFilter, maxFeatures, layerAttributeFilter);
+            if (queryType == MgQueryRequestType.Tooltip)
+                return MakeTooltip(fi.GetTooltip());
+            else
+                return MakeSelectionResult(fi.GetSelection());
+        }
     }
 }



More information about the mapguide-commits mailing list