{
Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2003 Miranda ICQ/IM project,
all portions of this codebase are copyrighted to the people
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
}

{$IFNDEF M_CLC}
{$DEFINE M_CLC}

const
  CLISTCONTROL_CLASS = 'CListControl';

  // styles

  CLS_MANUALUPDATE    = $0001; // todo
  CLS_SHOWHIDDEN      = $0002;
  CLS_HIDEOFFLINE     = $0004; // hides all offline users
  CLS_CHECKBOXES      = $0008;
  CLS_MULTICOLUMN     = $0010; // not true multi-column, just for ignore/vis options
  CLS_HIDEEMPTYGROUPS = $0020; // note: this flag will be spontaneously removed if the 'new subgroup' menu item is clicked, for obvious reasons
  CLS_USEGROUPS       = $0040;
  CLS_NOHIDEOFFLINE   = $0080; // overrides CLS_HIDEOFFLINE and the per-group hideoffline setting
  CLS_GREYALTERNATE   = $0100; // make every other line slightly grey
  CLS_GROUPCHECKBOXES = $0200; // put checkboxes on groups too (managed by CLC)
  CLS_CONTACTLIST     = $0400; // this control will be the main contact list (v. 0.3.4.3+ 2004/11/02)

  CLS_EX_DISABLEDRAGDROP     = $00000001;
  CLS_EX_EDITLABELS          = $00000002;
  CLS_EX_SHOWSELALWAYS       = $00000004;
  CLS_EX_TRACKSELECT         = $00000008;
  CLS_EX_SHOWGROUPCOUNTS     = $00000010;
  CLS_EX_DIVIDERONOFF        = $00000020;
  CLS_EX_HIDECOUNTSWHENEMPTY = $00000040;
  CLS_EX_NOTRANSLUCENTSEL    = $00000080;
  CLS_EX_LINEWITHGROUPS      = $00000100;
  CLS_EX_QUICKSEARCHVISONLY  = $00000200;
  CLS_EX_SORTGROUPSALPHA     = $00000400;
  CLS_EX_NOSMOOTHSCROLLING   = $00000800;

  CLM_FIRST = $1000; // this is the same as LVM_FIRST
  CLM_LAST  = $1100;

// messages, compare with equivalent TVM_* in the WINAPI

  CLM_ADDCONTACT      = (CLM_FIRST+0); // wParam=hContact
  CLM_ADDGROUP        = (CLM_FIRST+1); // wParam=hGroup
  CLM_AUTOREBUILD     = (CLM_FIRST+2);
  CLM_DELETEITEM      = (CLM_FIRST+3); // wParam=hItem
  CLM_EDITLABEL       = (CLM_FIRST+4); // wParam=hItem
  CLM_ENDEDITLABELNOW = (CLM_FIRST+5); // wParam=cancel, 0 to save
  CLM_ENSUREVISIBLE   = (CLM_FIRST+6); // wParam=hItem, lParam=partialOk

  CLE_TOGGLE   = -1;
  CLE_COLLAPSE = 0;
  CLE_EXPAND   = 1;
  CLE_INVALID  = $FFFF;

  CLM_EXPAND            = (CLM_FIRST+7);  // wParam=hItem, lParam=CLE_
  CLM_FINDCONTACT       = (CLM_FIRST+8);  // wParam=hContact, returns an hItem
  CLM_FINDGROUP         = (CLM_FIRST+9);  // wParam=hGroup, returns an hItem
  CLM_GETBKCOLOR        = (CLM_FIRST+10); // returns a COLORREF
  CLM_GETCHECKMARK      = (CLM_FIRST+11); // wParam=hItem, returns 1 or 0
  CLM_GETCOUNT          = (CLM_FIRST+12); // returns the total number of items

  CLM_GETEDITCONTROL    = (CLM_FIRST+13); // returns the HWND, or NULL
  CLM_GETEXPAND         = (CLM_FIRST+14); // wParam=hItem, returns a CLE_, CLE_INVALID if not a group
  CLM_GETEXTRACOLUMNS   = (CLM_FIRST+15); // returns number of extra columns
  CLM_GETEXTRAIMAGE     = (CLM_FIRST+16); // wParam=hItem, lParam=MAKELPARAM(iColumn (0 based),0), returns iImage or EMPTY_EXTRA_ICON
  CLM_GETEXTRAIMAGELIST = (CLM_FIRST+17); // returns HIMAGELIST
  CLM_GETFONT           = (CLM_FIRST+18); // wParam=fontId, see clm_setfont. returns hFont.
  CLM_GETINDENT         = (CLM_FIRST+19); // wParam=new group indent
  CLM_GETISEARCHSTRING  = (CLM_FIRST+20); // lParam=(AnsiChar*)pszStr, max 120 bytes, returns number of chars in string
  CLM_GETITEMTEXT       = (CLM_FIRST+21); // wParam=hItem, lParam=(TChar*)pszStr, max 120 bytes
  CLM_GETSCROLLTIME     = (CLM_FIRST+22); // returns time in ms
  CLM_GETSELECTION      = (CLM_FIRST+23); // returns hItem
  CLM_SETEXTRASPACE     = (CLM_FIRST+24); // wParam=extra space between icons

  CLCHT_ABOVE        = $0001; // above client area
  CLCHT_BELOW        = $0002; // below client area
  CLCHT_TOLEFT       = $0004; // left of client area
  CLCHT_TORIGHT      = $0008; // right of client area
  CLCHT_NOWHERE      = $0010; // in client area, not on an item
  CLCHT_ONITEMICON   = $0020;
  CLCHT_ONITEMCHECK  = $0040;
  CLCHT_ONITEMLABEL  = $0080;
  CLCHT_ONITEMINDENT = $0100; // to the left of an item icon
  CLCHT_ONITEMEXTRA  = $0200; // on an extra icon, HIBYTE(HIWORD()) says which
  CLCHT_ONITEM       = $03E0;
  CLCHT_INLEFTMARGIN = $0400;
  CLCHT_BELOWITEMS   = $0800; // in client area but below last item

  CLM_HITTEST    = (CLM_FIRST+25); // lParam=MAKELPARAM(x,y) (relative to control), wParam=(PDWORD)&hitTest (see encoding of HitTest() in clc.h, can be NULL) returns hItem or NULL
  CLM_SELECTITEM = (CLM_FIRST+26); // wParam=hItem

  CLB_TOPLEFT  = 0;
  CLB_STRETCHV = 1;
  CLB_STRETCHH = 2; // and tile vertically
  CLB_STRETCH  = 3;

  CLBM_TYPE         = $00FF;
  CLBF_TILEH        = $1000;
  CLBF_TILEV        = $2000;
  CLBF_PROPORTIONAL = $4000;
  CLBF_SCROLL       = $8000;

  CLM_SETBKBITMAP       = (CLM_FIRST+27); // wParam=mode, lParam=hBitmap (don't delete it), NULL for none
  CLM_SETBKCOLOR        = (CLM_FIRST+28); // wParam=a COLORREF, default is GetSysColor(COLOR_3DFACE)
  CLM_SETCHECKMARK      = (CLM_FIRST+29); // wParam=hItem, lParam=1 or 0
  CLM_SETEXTRACOLUMNS   = (CLM_FIRST+30); // wParam = number of extra columns (zero to EXTRA_ICON_COUNT from clc.h, currently 16)
  CLM_SETEXTRAIMAGE     = (CLM_FIRST+31); // wParam=hItem, lParam=MAKELPARAM(iColumn (0 based),iImage). iImage=EMPTY_EXTRA_ICON is a blank
  CLM_SETEXTRAIMAGELIST = (CLM_FIRST+32); // lParam=HIMAGELIST

  FONTID_CONTACTS      = 0;
  FONTID_INVIS         = 1;
  FONTID_OFFLINE       = 2;
  FONTID_NOTONLIST     = 3;
  FONTID_GROUPS        = 4;
  FONTID_GROUPCOUNTS   = 5;
  FONTID_DIVIDERS      = 6;
  FONTID_OFFINVIS      = 7;
  FONTID_STATUSMSG     = 8;
  FONTID_GROUPSCLOSED  = 9;
  FONTID_CONTACTSHOVER = 10;
  FONTID_MAX           = 18;

  CLM_SETFONT            = (CLM_FIRST+33); // wParam=hFont, lParam=MAKELPARAM(fRedraw,fontId)
  CLM_SETINDENT          = (CLM_FIRST+34); // wParam=new indent, default is 3 pixels
  CLM_SETITEMTEXT        = (CLM_FIRST+35); // wParam=hItem, lParam=(AnsiChar*)pszNewText
  CLM_SETSCROLLTIME      = (CLM_FIRST+36); // wParam=time in ms, default 200
  CLM_SETHIDEEMPTYGROUPS = (CLM_FIRST+38); // wParam=TRUE/FALSE

  GREYF_UNFOCUS = $80000000;
  MODEF_OFFLINE = $40000000;

  // and use the PF2_ #defines from m_protosvc.inc
  CLM_SETGREYOUTFLAGS    = (CLM_FIRST+39); // wParam=new flags
  CLM_GETHIDEOFFLINEROOT = (CLM_FIRST+40); // returns TRUE/FALSE
  CLM_SETHIDEOFFLINEROOT = (CLM_FIRST+41); // wParam=TRUE/FALSE
  CLM_SETUSEGROUPS       = (CLM_FIRST+42); // wParam=TRUE/FALSE
  CLM_SETOFFLINEMODES    = (CLM_FIRST+43); // for 'hide offline', wParam=PF2_ flags and MODEF_OFFLINE
  CLM_GETEXSTYLE         = (CLM_FIRST+44); // returns CLS_EX_ flags
  CLM_SETEXSTYLE         = (CLM_FIRST+45); // wParam=CLS_EX_ flags
  CLM_GETLEFTMARGIN      = (CLM_FIRST+46); // returns count of pixels
  CLM_SETLEFTMARGIN      = (CLM_FIRST+47); // wParam=pixels

// the order of info items is never changed, so make sure you add them in the
// order you want them to remain
                                                                                      
const
  CLM_ADDINFOITEMA = (CLM_FIRST+48); // lParam=&TCLCINFOITEM, returns hItem
  CLM_GETITEMTYPE  = (CLM_FIRST+49); // wParam=hItem, returns a CLCIT_
  CLM_GETNEXTITEM  = (CLM_FIRST+50); // wParam=flag, lParam=hItem, returns an hItem
  CLM_GETTEXTCOLOR = (CLM_FIRST+51); // wParam=FONTID_, returns COLORREF
  CLM_SETTEXTCOLOR = (CLM_FIRST+52); // wParam=FONTID_, lParam=COLORREF

  CLM_ADDINFOITEMW = (CLM_FIRST+53); // lParam=&TCLCINFOITEM, returns hItem
  CLM_ADDINFOITEM = CLM_ADDINFOITEMW;

  CLCIIF_BELOWGROUPS   = 1;   // put it between groups and contacts, default is at top
  CLCIIF_BELOWCONTACTS = 2;   // put it at the bottom
  CLCIIF_CHECKBOX      = $40; // give this item a check box
  CLCIIF_GROUPFONT     = $80; // draw the item using FONTID_GROUPS

  CLCIT_INVALID = -1;
  CLCIT_GROUP   = 0;
  CLCIT_CONTACT = 1;
  CLCIT_DIVIDER = 2;
  CLCIT_INFO    = 3;

  CLGN_ROOT            = 0;
  CLGN_CHILD           = 1;
  CLGN_PARENT          = 2;
  CLGN_NEXT            = 3;
  CLGN_PREVIOUS        = 4;
  CLGN_NEXTCONTACT     = 5;
  CLGN_PREVIOUSCONTACT = 6;
  CLGN_NEXTGROUP       = 7;
  CLGN_PREVIOUSGROUP   = 8;

  CLNF_ISGROUP = 1;
  CLNF_ISINFO  = 2;

  CLN_FIRST          = (0-100);
  CLN_EXPANDED       = (CLN_FIRST-0);  // hItem=hGroup, action=CLE_*
  CLN_LISTREBUILT    = (CLN_FIRST-1);
  CLN_ITEMCHECKED    = (CLN_FIRST-2);  // todo  // hItem,action,flags valid
  CLN_DRAGGING       = (CLN_FIRST-3);  // hItem,pt,flags valid. only sent when cursor outside window, return nonzero if processed
  CLN_DROPPED        = (CLN_FIRST-4);  // hItem,pt,flags valid. only sent when cursor outside window, return nonzero if processed
  CLN_LISTSIZECHANGE = (CLN_FIRST-5);  // pt.y valid. the vertical height of the visible items in the list has changed.
  CLN_OPTIONSCHANGED = (CLN_FIRST-6);  // nothing valid. If you set some extended options they have been overwritten and should be re-set
  CLN_DRAGSTOP       = (CLN_FIRST-7);  // hItem,flags valid. sent when cursor goes back in to the window having been outside, return nonzero if processed
  CLN_NEWCONTACT     = (CLN_FIRST-8);  // hItem,flags valid. sent when a new contact is added without a full list rebuild
  CLN_CONTACTMOVED   = (CLN_FIRST-9);  // hItem,flags valid. sent when contact is moved without a full list rebuild
  CLN_CHECKCHANGED   = (CLN_FIRST-10); // hItem,flags valid. sent when any check mark is changed, but only for one change if there are many

// clist window tree messages
  M_CREATECLC        = WM_USER+1;
  M_SETALLEXTRAICONS = WM_USER+2;

type
  PCLCINFOITEM = ^TCLCINFOITEM;
  TCLCINFOITEM = record
    cbSize      : int;
    pszText     : TChar;
    hParentGroup: THANDLE;
    flags       : dword;
    hIcon       : HICON; // todo
  end;

  PNMCLISTCONTROL = ^TNMCLISTCONTROL;
  TNMCLISTCONTROL = record
    hdr    : TNMHDR;        // depends on Windows.pas
    hItem  : THANDLE;
    action : int;
    iColumn: int;       // -1 if not on an extra column
    flags  : dword;
    pt     : TPoint;         // depends on Windows.pas
  end;

  PCLCINFOTIP = ^TCLCINFOTIP;
  TCLCINFOTIP = record
    cbSize       : int;
    isTreeFocused: int;     // so the plugin can provide an option
    isGroup      : int;     // 0 if it's contact, 1 if it's a group
    hItem        : THANDLE; // handle to group or contact
    ptCursor     : TPOINT;
    rcItem       : TRECT;
  end;

  PCLCEXTRAINFOTIP = ^TCLCEXTRAINFOTIP;
  TCLCEXTRAINFOTIP = record
    cbSize       : int;
    isTreeFocused: int;     // so the plugin can provide an option
    hItem        : THANDLE; // handle to group or contact
    ptCursor     : TPOINT;
    rcItem       : TRECT;
    extraIndex   : int;
    hwnd         : HWND;
  end;

const
  {
    wParam : 0
    lParam : Pointer to a TCLCINFOTIP structure
    Affect : An InfoTip for an item should be shown now, see notes
    Returns: [non zero] if you process this, because it makes no sense
             for more than one module to process this.
    Notes  : It's upto the module where to put the InfoTip, Normally
             it's a few pixels below and to the right of the cursor.
             -
             This event is called after the mouse ehas been stationary over
             a contact for (by default) 200ms
  }
  ME_CLC_SHOWINFOTIP     :PAnsiChar = 'CLC/ShowInfoTip';
  ME_CLC_SHOWEXTRAINFOTIP:PAnsiChar = 'CLC/ShowExtraInfoTip';

  {
    wParam : 0
    lParam : Pointer to an initialised TCLCINFOTIP
    Affect : It's time to destroy an infotip, see notes
    Notes  : Only cbSize, isGroup, hItem are set
    notes  : This is sent when the mouse moves off a contact when ME_CLC_SHOWINFOTIP
             has previously been called.
             -
             If you don't want this behaviour, you should have grabbed the mouse
             capture yourself --
  }
  ME_CLC_HIDEINFOTIP:PAnsiChar = 'CLC/HideInfoTip';

  {
    wParam : new_time
    lParam : 0
    Affect : Set a new hover time before the info tip hooks are called, see notes
    Returns: 0 on success, [non zero] on failure
    Notes  : The value of this setting is applid to all current CLC windows
             and saved to b applied to all future windows, it is persistent.
             -
             Time is in milliseconds, default is 750ms
  }
  MS_CLC_SETINFOTIPHOVERTIME:PAnsiChar = 'CLC/SetInfoTipHoverTime';

  {
    wParam : 0
    lParam : 0
    Affect : get the hover time before the infotip hooks are called
    returns: the hover time in MS
  }
  MS_CLC_GETINFOTIPHOVERTIME:PAnsiChar = 'CLC/GetInfoTipHoverTime';

{$ENDIF}