                Guidelines for hacking SWF
                ==========================

This document describes some of the minimal coding guidelines
to be followed while hacking the new SWF implementation. These
guidelines are for the sake of consistency.

1. Please refer to the design document of SWF to understand the
   implementation.

2. Please follow the general coding style described for the Mono
   project (/cvs/mcs/class/README).

3. Method stubbing is highly discouraged. It's recommended to submit
   an implemented method instead of just the signature. If you have
   to stub a property or method, please use the [MonoTODO ("what")]
   attribute to document what still needs to be done.

4. When you implement the drawing method for a control in a theme, it
   should make call to ControlPaint class methods and System.Drawing
   classes. If it is not possible to implment a control's draw method
   under these restrictions and you need some functionality from
   XplatUIDriver, please let us know. We will try to enhance the
   driver, if *really* required.

5. As mentioned in the design doc also, double buffering must be used
   by any new controls being added. Whenever a property or method that
   changes the look of the control is called, the bitmap representing
   the control should be updated. The Paint method should only copy
   the bitmap to the screen, and *not* recalculate or paint the control.
   To aid in double-buffering, the Control class provides the 
   Control.DeviceContext and Control.ImageBuffer properties.

   A typical OnPaint will look like this:

      protected override void OnPaint (PaintEventArgs pevent) {
         pevent.Graphics.DrawImage (this.ImageBuffer, 
                                    pevent.ClipRectangle, 
                                    pevent.ClipRectangle, 
                                    GraphicsUnit.Pixel);
      }

   The ImageBuffer bitmap is supposed to contain the representation
   of the control, often drawn when a property is set, similar to this:

      public Color RectColor {
         set {
            sb.Color = value;
            Redraw ();
         }
      }
	
      internal void Redraw () {
          this.DeviceContext.FillRectangle (sb, this.ClientRectangle);
      }


6. Minimize redraws as much as possible by utilizing the clipRectangle 
   when possible.

7. Setting the size of a control raises a resize event even if the
   control size is same. Be careful is setting the size and it's better
   to avoid changing the control size as much as possible. Wherever
   possible try scaling the control bitmap as per the size needs.

8. Make sure to call the base class event methods when overriding them.

9. Define regions in your code, as it makes it easy to browse the code
   in the editors which can collapse/expand regions.

10. Last but not the least, please let others on the mono-winforms-list
    know about your work, so that duplication can be avoided.

Happy hacking!

