Extending the IDE (Overview)
============================

The online pages are more uptodate and have more examples:
http://wiki.lazarus.freepascal.org/Extending_the_IDE



The IDE supports several types of plugins:

Components
  These are the items in the component palette. For a example TButton can be
  used to create Buttons.
    
Component Editors
  Component editors are used when you double click on a component in the
  designer or to add some extra items to the popup menu of the designer, when
  you right click on a component.

Property Editors
  These are used by the rows in the object inspector.

Experts
  These are all other types.


-------------------------------------------------------------------------------
There are two possibilities to add your own plugins to Lazarus:

1. Write a package, install it and register your plugins in the 'Register'
   procedure of a unit.
2. Extend the lazarus code, and send your cvs diff to the lazarus mailing list.


-------------------------------------------------------------------------------
Writing components:

ToDo
Hint: Create a new component via the package editor.



-------------------------------------------------------------------------------
Writing component editors:

ToDo
Hint: see componenteditors.pas for examples


-------------------------------------------------------------------------------
Writing property editors

ToDo
Hint: see propedits.pp for examples


-------------------------------------------------------------------------------
Register event handlers

There are several events in the IDE, for which plugins can add their own
handlers.
In propedits.pp there is a GlobalDesignHook object, which maintains several
events for designing. Each event calls a list of handlers. The default handlers
are added by the IDE. You can add your own handlers with the AddHandlerXXX and
RemoveHandlerXXX methods. They will be called before the default handlers.
Examples:

  Adding your handler (this is normally done in the constructor of your object):
    GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);
    
  Removing your handler:
    GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);

  You can remove all handlers at once. For example, it is a good idea to add
  this line in the destructor of object:
    GlobalDesignHook.RemoveAllHandlersForObject(Self);


The handlers of GlobalDesignHook:

  // lookup root
  ChangeLookupRoot
    Called when the LookupRoot changed.
    The LookupRoot is the owner object of the currently selected components.
    Normally this is a TForm.

  // methods
  CreateMethod
  GetMethodName
  GetMethods
  MethodExists
  RenameMethod
  ShowMethod
    Called
  MethodFromAncestor
  ChainCall

  // components
  GetComponent
  GetComponentName
  GetComponentNames
  GetRootClassName
  ComponentRenamed
    Called when a component was renamed
  ComponentAdded
    Called when a new component was added to the LookupRoot
  ComponentDeleting
    Called before a component is freed.
  DeleteComponent
    Called by the IDE to delete a component.
  GetSelectedComponents
    Get the current selection of components.

  // persistent objects
  GetObject
  GetObjectName
  GetObjectNames

  // modifing
  Modified
  Revert
  RefreshPropertyValues



