OSDN Git Service

Beginnings of the custom control that draws the map without any external components.
authorLatif Khalifa <latifer@streamgrid.net>
Sat, 22 May 2010 19:03:24 +0000 (19:03 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sat, 22 May 2010 19:03:24 +0000 (19:03 +0000)
git-svn-id: https://radegast.googlecode.com/svn/branches/legacy_map@645 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/Types/MapControl.Designer.cs [new file with mode: 0644]
Radegast/Core/Types/MapControl.cs [new file with mode: 0644]
Radegast/Core/Types/MapControl.resx [new file with mode: 0644]

diff --git a/Radegast/Core/Types/MapControl.Designer.cs b/Radegast/Core/Types/MapControl.Designer.cs
new file mode 100644 (file)
index 0000000..b981e48
--- /dev/null
@@ -0,0 +1,52 @@
+namespace Radegast
+{
+    partial class MapControl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // MapControl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.DoubleBuffered = true;
+            this.Name = "MapControl";
+            this.Size = new System.Drawing.Size(589, 409);
+            this.Paint += new System.Windows.Forms.PaintEventHandler(this.MapControl_Paint);
+            this.Click += new System.EventHandler(this.MapControl_Click);
+            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MapControl_MouseMove);
+            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MapControl_MouseDown);
+            this.Resize += new System.EventHandler(this.MapControl_Resize);
+            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.MapControl_MouseUp);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+    }
+}
diff --git a/Radegast/Core/Types/MapControl.cs b/Radegast/Core/Types/MapControl.cs
new file mode 100644 (file)
index 0000000..748966a
--- /dev/null
@@ -0,0 +1,201 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing.Drawing2D;
+using OpenMetaverse;
+
+namespace Radegast
+{
+    public partial class MapControl : UserControl
+    {
+        RadegastInstance Instance;
+        GridClient Client { get { return Instance.Client; } }
+        Color background;
+        float zoom;
+        Font textFont;
+        Brush textBrush;
+        Brush textBackgroudBrush;
+        uint regionSize = 256;
+        float pixelsPerMeter;
+        double centerX;
+        double centerY;
+        bool centered = false;
+
+        public MapControl(RadegastInstance instance)
+        {
+            Zoom = 2f;
+
+            InitializeComponent();
+            Disposed += new EventHandler(MapControl_Disposed);
+            this.Instance = instance;
+
+            background = Color.FromArgb(4, 4, 75);
+            textFont = new Font(FontFamily.GenericSansSerif, 8.0f, FontStyle.Bold);
+            textBrush = new SolidBrush(Color.FromArgb(255, 200, 200, 200));
+            textBackgroudBrush = new SolidBrush(Color.Black);
+            CenterMap(1130, 1071, 128, 128);
+        }
+
+        void MapControl_Disposed(object sender, EventArgs e)
+        {
+        }
+
+        public float Zoom
+        {
+            get { return zoom; }
+            set
+            {
+                if (value >= 1f && value <= 4f)
+                {
+                    zoom = value;
+                    pixelsPerMeter = 1f / zoom;
+                    Invalidate();
+                }
+            }
+        }
+
+        public void CenterMap(uint regionHandle, uint localX, uint localY)
+        {
+            uint regionX, regionY;
+            Utils.LongToUInts(regionHandle, out regionX, out regionY);
+            CenterMap(regionX, regionY, localX, localY);
+        }
+
+        public void CenterMap(uint regionX, uint regionY, uint localX, uint localY)
+        {
+            centerX = (double)regionX * 256 + (double)localX;
+            centerY = (double)regionY * 256 + (double)localY;
+            centered = true;
+        }
+
+        public static ulong GlobalPosToRegionHandle(double globalX, double globalY, out float localX, out float localY)
+        {
+            uint x = ((uint)globalX / 256) * 256;
+            uint y = ((uint)globalY / 256) * 256;
+            localX = (float)(globalX - (double)x);
+            localY = (float)(globalY - (double)y);
+            return Utils.UIntsToLong(x, y);
+        }
+
+
+        void Print(Graphics g, float x, float y, string text)
+        {
+            g.DrawString(text, textFont, textBackgroudBrush, x + 1, y + 1);
+            g.DrawString(text, textFont, textBrush, x, y);
+        }
+
+        void DrawRegion(Graphics g, int x, int y, ulong handle)
+        {
+            uint regX, regY;
+            Utils.LongToUInts(handle, out regX, out regY);
+            regX /= regionSize;
+            regY /= regionSize;
+            string name = string.Format("{0:0}, {1:0}", regX, regY);
+            Print(g, x + 2, y - 16, name);
+            float regS = regionSize / zoom;
+            g.DrawRectangle(SystemPens.Window, (float)x, y - regS, regS, regS);
+        }
+
+        private void MapControl_Paint(object sender, PaintEventArgs e)
+        {
+            Graphics g = e.Graphics;
+            g.Clear(background);
+            if (!centered) return;
+            int h = e.ClipRectangle.Height, w = e.ClipRectangle.Width;
+
+            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
+
+
+            float localX, localY;
+            ulong centerRegion = GlobalPosToRegionHandle(centerX, centerY, out localX, out localY);
+            int pixCenterRegionX = (int)(w / 2 - localX / zoom);
+            int pixCenterRegionY = (int)(h / 2 + localY / zoom);
+
+            uint regX, regY;
+            Utils.LongToUInts(centerRegion, out regX, out regY);
+            regX /= regionSize;
+            regY /= regionSize;
+
+            int pixRegS = (int)(regionSize / zoom);
+            int regLeft = (int)regX - ((int)(pixCenterRegionX / pixRegS) + 1);
+            if (regLeft < 0) regLeft = 0;
+            int regTop = (int)regY - ((int)(pixCenterRegionY / pixRegS));
+            if (regTop < 0) regTop = 0;
+
+            for (int ry = regTop; ry < regTop + e.ClipRectangle.Height / pixRegS + 2; ry++)
+            {
+                for (int rx = regLeft; rx < regLeft + e.ClipRectangle.Width / pixRegS + 2; rx++)
+                {
+                    DrawRegion(g,
+                        pixCenterRegionX - ((int)regX - rx) * pixRegS,
+                        pixCenterRegionY + (ry - (int)regY) * pixRegS,
+                        Utils.UIntsToLong((uint)rx * regionSize, (uint)ry * regionSize));
+                    //System.Console.Write("({0}, {1}) ", rx, ry);
+                }
+                //System.Console.WriteLine();
+            }
+            //System.Console.WriteLine("Reg left: {0}, reg top {1}", regLeft, regTop);
+
+            //DrawRegion(g, pixCenterRegionX, pixCenterRegionY, centerRegion);
+        }
+
+        #region Mouse handling
+        private void MapControl_Click(object sender, EventArgs e)
+        {
+        }
+
+        protected override void OnMouseWheel(MouseEventArgs e)
+        {
+            base.OnMouseWheel(e);
+            if (e.Delta > 0)
+                Zoom += 0.25f;
+            else
+                Zoom -= 0.25f;
+        }
+
+        bool dragging = false;
+        int dragX, dragY;
+
+        private void MapControl_MouseDown(object sender, MouseEventArgs e)
+        {
+            if (e.Button == MouseButtons.Left)
+            {
+                dragging = true;
+                dragX = e.X;
+                dragY = e.Y;
+            }
+        }
+
+        private void MapControl_MouseUp(object sender, MouseEventArgs e)
+        {
+            if (e.Button == MouseButtons.Left)
+            {
+                dragging = false;
+            }
+
+        }
+
+        private void MapControl_MouseMove(object sender, MouseEventArgs e)
+        {
+            if (dragging)
+            {
+                centerX -= (e.X - dragX) / pixelsPerMeter;
+                centerY += (e.Y - dragY) / pixelsPerMeter;
+                dragX = e.X;
+                dragY = e.Y;
+                Invalidate();
+            }
+        }
+
+        private void MapControl_Resize(object sender, EventArgs e)
+        {
+            Invalidate();
+        }
+        #endregion Mouse handling
+    }
+}
diff --git a/Radegast/Core/Types/MapControl.resx b/Radegast/Core/Types/MapControl.resx
new file mode 100644 (file)
index 0000000..ff31a6d
--- /dev/null
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+</root>
\ No newline at end of file