/// <summary>
    /// On dragdrop.
    /// </summary>
    /// <param name="e">The <see cref="T:KeyEventArgs"/> instance containing the event data.</param>
    public bool OnDragDrop(DragEventArgs e) {
      Control control = (Control)this.Controller.ParentControl;
      Point p = control.PointToClient(new Point(e.X, e.Y));
      IShape shape = null;
      IDataObject iDataObject = e.Data;
      string text;

      if (iDataObject.GetDataPresent("IShape")) {
        shape = (IShape)iDataObject.GetData("IShape");
        shape.Model = Controller.Model;
      } else if (iDataObject.GetDataPresent(typeof(string))) {
        text = iDataObject.GetData(
                typeof(string)).ToString();

        //foreach (string shapeType in Enum.GetNames(typeof(ShapeTypes)))
        //{
        //    if (shapeType.ToString().ToLower() == text.ToLower())
        //    {
        //        shape = ShapeFactory.GetShape(shapeType);
        //        break;
        //    }
        //}

        // If our shape is still null, then the text being dragged
        // onto the canvas is not the name of a shape, so add a
        // TextOnly shape with the text.
        //if (shape == null)
        //{
        //    shape = new TextOnly(Controller.Model);
        //    (shape as TextOnly).Text = text;
        //}

        shape = new TextOnly(Controller.Model);
        (shape as TextOnly).Text = text;
      } else if (iDataObject.GetDataPresent(DataFormats.FileDrop)) {
        try {
          string[] files = (string[])iDataObject.GetData(
              DataFormats.FileDrop);

          foreach (string fileName in files) {
            FileInfo info = new FileInfo(fileName);

            if (info.Exists) {
              FileShape fileShape = new FileShape(fileName);
              AddShapeCommand cmd = new AddShapeCommand(
                  this.Controller,
                  fileShape,
                  p);
              this.Controller.UndoManager.AddUndoCommand(cmd);
              cmd.Redo();
              p.Offset(20, 20);
            }
          }

          feedbackCursor = null;
        }
        catch {
        }
      } else if (iDataObject.GetDataPresent(typeof(Bitmap))) {
        // Doesn't support dropping images yet - having problems
        // getting images off the clipboard.
        shape = new ImageShape(Controller.Model);
        (shape as ImageShape).Image =
            (Image)iDataObject.GetData(typeof(Bitmap));
        return true;
      }

      if (shape != null) {
        shape.MoveBy(new Point(p.X, p.Y));


        //ComplexRectangle shape = new ComplexRectangle();
        //shape.Rectangle = new Rectangle(p.X, p.Y, 150, 70);
        //shape.Text = "Just an example, work in progress.";

        //TextLabel shape = new TextLabel();
        //shape.Rectangle = new Rectangle(p.X, p.Y, 150, 70);
        //shape.Text = "Just an example, work in progress.";

        AddShapeCommand cmd = new AddShapeCommand(
            this.Controller,
            shape,
            p);
        this.Controller.UndoManager.AddUndoCommand(cmd);
        cmd.Redo();
        feedbackCursor = null;
        return true;
      }

      // The drop event wasn't handled here.
      return false;
    }
        /// <summary>
        /// On dragdrop.
        /// </summary>
        /// <param name="e">The <see cref="T:KeyEventArgs"/> instance containing the event data.</param>
        public bool OnDragDrop(DragEventArgs e)
        {
            Control     control     = (Control)this.Controller.ParentControl;
            Point       p           = control.PointToClient(new Point(e.X, e.Y));
            IShape      shape       = null;
            IDataObject iDataObject = e.Data;
            string      text;

            if (iDataObject.GetDataPresent("IShape"))
            {
                shape       = (IShape)iDataObject.GetData("IShape");
                shape.Model = Controller.Model;
            }
            else if (iDataObject.GetDataPresent(typeof(string)))
            {
                text = iDataObject.GetData(
                    typeof(string)).ToString();

                //foreach (string shapeType in Enum.GetNames(typeof(ShapeTypes)))
                //{
                //    if (shapeType.ToString().ToLower() == text.ToLower())
                //    {
                //        shape = ShapeFactory.GetShape(shapeType);
                //        break;
                //    }
                //}

                // If our shape is still null, then the text being dragged
                // onto the canvas is not the name of a shape, so add a
                // TextOnly shape with the text.
                //if (shape == null)
                //{
                //    shape = new TextOnly(Controller.Model);
                //    (shape as TextOnly).Text = text;
                //}

                shape = new TextOnly(Controller.Model);
                (shape as TextOnly).Text = text;
            }
            else if (iDataObject.GetDataPresent(DataFormats.FileDrop))
            {
                try {
                    string[] files = (string[])iDataObject.GetData(
                        DataFormats.FileDrop);

                    foreach (string fileName in files)
                    {
                        FileInfo info = new FileInfo(fileName);

                        if (info.Exists)
                        {
                            FileShape       fileShape = new FileShape(fileName);
                            AddShapeCommand cmd       = new AddShapeCommand(
                                this.Controller,
                                fileShape,
                                p);
                            this.Controller.UndoManager.AddUndoCommand(cmd);
                            cmd.Redo();
                            p.Offset(20, 20);
                        }
                    }

                    feedbackCursor = null;
                }
                catch {
                }
            }
            else if (iDataObject.GetDataPresent(typeof(Bitmap)))
            {
                // Doesn't support dropping images yet - having problems
                // getting images off the clipboard.
                shape = new ImageShape(Controller.Model);
                (shape as ImageShape).Image =
                    (Image)iDataObject.GetData(typeof(Bitmap));
                return(true);
            }

            if (shape != null)
            {
                shape.MoveBy(new Point(p.X, p.Y));


                //ComplexRectangle shape = new ComplexRectangle();
                //shape.Rectangle = new Rectangle(p.X, p.Y, 150, 70);
                //shape.Text = "Just an example, work in progress.";

                //TextLabel shape = new TextLabel();
                //shape.Rectangle = new Rectangle(p.X, p.Y, 150, 70);
                //shape.Text = "Just an example, work in progress.";

                AddShapeCommand cmd = new AddShapeCommand(
                    this.Controller,
                    shape,
                    p);
                this.Controller.UndoManager.AddUndoCommand(cmd);
                cmd.Redo();
                feedbackCursor = null;
                return(true);
            }

            // The drop event wasn't handled here.
            return(false);
        }