summaryrefslogtreecommitdiff
path: root/plugins/Clist_mw/src/CLUIFrames
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-07-16 16:31:53 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-07-16 16:31:53 +0000
commit5b0a53a6d3f1b8d70b34631d96d3815d0a334dd3 (patch)
tree9b38676d8ae565bac52063f5398dde110082a26f /plugins/Clist_mw/src/CLUIFrames
parent1cf47d1eaff4d7d7242d0ab87dd540ae5b400833 (diff)
Clist_mw, Clist_nicer, CmdLine, Console: folder structure change
git-svn-id: http://svn.miranda-ng.org/main/trunk@988 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Clist_mw/src/CLUIFrames')
-rw-r--r--plugins/Clist_mw/src/CLUIFrames/cluiframes.cpp3013
-rw-r--r--plugins/Clist_mw/src/CLUIFrames/cluiframes.h44
-rw-r--r--plugins/Clist_mw/src/CLUIFrames/extraimage.cpp404
-rw-r--r--plugins/Clist_mw/src/CLUIFrames/framesmenu.cpp219
-rw-r--r--plugins/Clist_mw/src/CLUIFrames/statusbar.cpp599
5 files changed, 4279 insertions, 0 deletions
diff --git a/plugins/Clist_mw/src/CLUIFrames/cluiframes.cpp b/plugins/Clist_mw/src/CLUIFrames/cluiframes.cpp
new file mode 100644
index 0000000000..26a8a0cb63
--- /dev/null
+++ b/plugins/Clist_mw/src/CLUIFrames/cluiframes.cpp
@@ -0,0 +1,3013 @@
+/*
+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.
+*/
+
+#include "../commonheaders.h"
+
+extern HINSTANCE g_hInst;
+
+//we use dynamic frame list,
+//but who wants so huge number of frames ??
+#define MAX_FRAMES 16
+
+#define UNCOLLAPSED_FRAME_SIZE 0
+#define DEFAULT_TITLEBAR_HEIGHT 20
+
+//legacy menu support
+#define frame_menu_lock 1
+#define frame_menu_visible 2
+#define frame_menu_showtitlebar 3
+#define frame_menu_floating 4
+extern int ModifyMenuItemProxy(WPARAM wParam,LPARAM lParam);
+static int UpdateTBToolTip(int framepos);
+INT_PTR CLUIFrameSetFloat(WPARAM wParam,LPARAM lParam);
+int CLUIFrameResizeFloatingFrame(int framepos);
+extern int ProcessCommandProxy(WPARAM wParam,LPARAM lParam);
+extern int InitFramesMenus(void);
+int GapBetweenTitlebar;
+
+LOGFONTA TitleBarLogFont = {0};
+
+boolean FramesSysNotStarted = TRUE;
+
+HANDLE hService[20], hHook[4];
+
+typedef struct
+{
+ int order;
+ int realpos;
+}
+ SortData;
+
+static int sortfunc(const void *a,const void *b)
+{
+ SortData *sd1,*sd2;
+ sd1 = (SortData *)a;
+ sd2 = (SortData *)b;
+ if (sd1->order > sd2->order){return(1);}
+ if (sd1->order < sd2->order){return(-1);}
+ //if (sd1->order == sd2->order){return 0;}
+ return 0;
+}
+
+
+//============
+#define CLUIFRAMESSETALIGN "CLUIFramesSetAlign"
+
+#define CLUIFRAMESSETALIGNALTOP "CLUIFramesSetAlignalTop"
+#define CLUIFRAMESSETALIGNALCLIENT "CLUIFramesSetAlignalClient"
+#define CLUIFRAMESSETALIGNALBOTTOM "CLUIFramesSetAlignalBottom"
+
+#define CLUIFRAMESMOVEUPDOWN "CLUIFramesMoveUpDown"
+typedef struct tagMenuHandles
+{
+ HANDLE MainMenuItem;
+ HANDLE MIVisible,MITitle,MITBVisible,MILock,MIColl,MIFloating,MIAlignRoot;
+ HANDLE MIAlignTop,MIAlignClient,MIAlignBottom;
+ HANDLE MIBorder;
+} FrameMenuHandles;
+
+typedef struct tagFrameTitleBar{
+ HWND hwnd;
+ HWND TitleBarbutt;
+ HWND hwndTip;
+
+ LPTSTR tbname;
+ LPTSTR tooltip;
+ HMENU hmenu;
+ HICON hicon;
+
+ BOOLEAN ShowTitleBar;
+ BOOLEAN ShowTitleBarTip;
+ COLORREF BackColour;
+ int oldstyles;
+ POINT oldpos;
+ RECT wndSize;
+} FrameTitleBar;
+
+typedef struct _DockOpt
+{
+ HWND hwndLeft;
+ HWND hwndRight;
+}
+DockOpt;
+
+typedef struct {
+ int id;
+ HWND hWnd ;
+ RECT wndSize;
+ LPTSTR name;
+ int align;
+ int height;
+ int dwFlags;
+ BOOLEAN Locked;
+ BOOLEAN visible;
+ BOOLEAN needhide;
+ BOOLEAN collapsed;
+ int prevvisframe;
+ int HeightWhenCollapsed;
+ FrameTitleBar TitleBar;
+ FrameMenuHandles MenuHandles;
+ int oldstyles;
+ BOOLEAN floating;
+ HWND ContainerWnd;
+ POINT FloatingPos;
+ POINT FloatingSize;
+ BOOLEAN minmaxenabled;
+ BOOLEAN UseBorder;
+ int order;
+ DockOpt dockOpt;
+} wndFrame;
+
+//static wndFrame Frames[MAX_FRAMES];
+static wndFrame *Frames = NULL;
+
+static int nFramescount = 0;
+static int alclientFrame = -1;//for fast access to frame with alclient properties
+static int NextFrameId = 100;
+
+HFONT TitleBarFont;
+static int TitleBarH = DEFAULT_TITLEBAR_HEIGHT;
+static boolean resizing = FALSE;
+
+// menus
+static HANDLE contMIVisible,contMITitle,contMITBVisible,contMILock,contMIColl,contMIFloating;
+static HANDLE contMIAlignRoot;
+static HANDLE contMIAlignTop,contMIAlignClient,contMIAlignBottom;
+static HANDLE contMIBorder;
+static HGENMENU MainMIRoot = (HGENMENU)-1;
+
+// others
+static int ContactListHeight;
+static int LastStoreTick = 0;
+
+static int lbypos = -1;
+static int oldframeheight = -1;
+static int curdragbar = -1;
+static CRITICAL_SECTION csFrameHook;
+
+static BOOLEAN CLUIFramesFitInSize(void);
+static int RemoveItemFromList(int pos,wndFrame **lpFrames,int *FrameItemCount);
+HWND hWndExplorerToolBar;
+static int GapBetweenFrames = 1;
+
+static int RemoveItemFromList(int pos,wndFrame **lpFrames,int *FrameItemCount)
+{
+ memcpy(&((*lpFrames)[pos]),&((*lpFrames)[pos+1]),sizeof(wndFrame)*(*FrameItemCount-pos-1));
+ (*FrameItemCount)--;
+ (*lpFrames) = (wndFrame*)realloc((*lpFrames),sizeof(wndFrame)*(*FrameItemCount));
+ return 0;
+}
+
+static int id2pos(int id)
+{
+ if (FramesSysNotStarted)
+ return -1;
+
+ for (int i = 0;i<nFramescount;i++)
+ if (Frames[i].id == id)
+ return i;
+
+ return -1;
+}
+
+static int btoint(BOOLEAN b)
+{
+ if (b) return 1;
+ return 0;
+}
+
+static void __inline lockfrm()
+{
+ EnterCriticalSection(&csFrameHook);
+}
+
+static void __inline ulockfrm()
+{
+ LeaveCriticalSection(&csFrameHook);
+}
+
+//////////screen docking,code from "floating contacts" plugin.
+
+static wndFrame* FindFrameByWnd( HWND hwnd )
+{
+ if ( hwnd == NULL )
+ return NULL;
+
+ for (int i = 0; i < nFramescount; i++)
+ if ( Frames[i].floating && Frames[i].ContainerWnd == hwnd )
+ return &Frames[i];
+
+ return NULL;
+}
+
+static void DockThumbs( wndFrame *pThumbLeft, wndFrame *pThumbRight, BOOL bMoveLeft )
+{
+ if ( pThumbRight->dockOpt.hwndLeft == NULL && pThumbLeft->dockOpt.hwndRight == NULL ) {
+ pThumbRight->dockOpt.hwndLeft = pThumbLeft->ContainerWnd;
+ pThumbLeft->dockOpt.hwndRight = pThumbRight->ContainerWnd;
+ }
+}
+
+static void UndockThumbs( wndFrame *pThumb1, wndFrame *pThumb2 )
+{
+ if ( pThumb1 == NULL || pThumb2 == NULL )
+ return;
+
+ if ( pThumb1->dockOpt.hwndRight == pThumb2->ContainerWnd )
+ pThumb1->dockOpt.hwndRight = NULL;
+
+ if ( pThumb1->dockOpt.hwndLeft == pThumb2->ContainerWnd )
+ pThumb1->dockOpt.hwndLeft = NULL;
+
+ if ( pThumb2->dockOpt.hwndRight == pThumb1->ContainerWnd )
+ pThumb2->dockOpt.hwndRight = NULL;
+
+ if ( pThumb2->dockOpt.hwndLeft == pThumb1->ContainerWnd )
+ pThumb2->dockOpt.hwndLeft = NULL;
+}
+
+BOOLEAN bMoveTogether;
+
+static void PositionThumb( wndFrame *pThumb, short nX, short nY )
+{
+ wndFrame *pCurThumb = &Frames[0];
+ wndFrame *pDockThumb = pThumb;
+ wndFrame fakeMainWindow;
+ wndFrame fakeTaskBarWindow;
+ RECT rc;
+ RECT rcThumb;
+ RECT rcOld;
+ SIZE sizeScreen;
+ int nNewX;
+ int nNewY;
+ int nOffs = 10;
+ int nWidth;
+ int nHeight;
+ POINT pt;
+ RECT rcLeft;
+ RECT rcTop;
+ RECT rcRight;
+ RECT rcBottom;
+ BOOL bDocked;
+ BOOL bDockedLeft;
+ BOOL bDockedRight;
+ BOOL bLeading;
+ int frmidx = 0;
+
+ if ( pThumb == NULL )
+ return;
+
+ sizeScreen.cx = GetSystemMetrics( SM_CXSCREEN );
+ sizeScreen.cy = GetSystemMetrics( SM_CYSCREEN );
+
+ // Get thumb dimnsions
+ GetWindowRect( pThumb->ContainerWnd, &rcThumb );
+ nWidth = rcThumb.right - rcThumb.left;
+ nHeight = rcThumb.bottom - rcThumb.top;
+
+ // Docking to the edges of the screen
+ nNewX = nX < nOffs ? 0 : nX;
+ nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX;
+ nNewY = nY < nOffs ? 0 : nY;
+ nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY;
+
+ bLeading = pThumb->dockOpt.hwndRight != NULL;
+
+ if ( bMoveTogether ) {
+ UndockThumbs( pThumb, FindFrameByWnd( pThumb->dockOpt.hwndLeft ));
+ GetWindowRect( pThumb->ContainerWnd, &rcOld );
+ }
+
+ memset(&fakeMainWindow,0,sizeof(fakeMainWindow));
+ fakeMainWindow.ContainerWnd = pcli->hwndContactList;
+ fakeMainWindow.floating = TRUE;
+
+ memset(&fakeTaskBarWindow,0,sizeof(fakeTaskBarWindow));
+ fakeTaskBarWindow.ContainerWnd = hWndExplorerToolBar;
+ fakeTaskBarWindow.floating = TRUE;
+
+ while( pCurThumb != NULL ) {
+ if (pCurThumb->floating) {
+ if ( pCurThumb != pThumb ) {
+ GetWindowRect( pThumb->ContainerWnd, &rcThumb );
+ OffsetRect( &rcThumb, nX - rcThumb.left, nY - rcThumb.top );
+
+ GetWindowRect( pCurThumb->ContainerWnd, &rc );
+
+ // These are rects we will dock into
+ rcLeft.left = rc.left - nOffs;
+ rcLeft.top = rc.top - nOffs;
+ rcLeft.right = rc.left + nOffs;
+ rcLeft.bottom = rc.bottom + nOffs;
+
+ rcTop.left = rc.left - nOffs;
+ rcTop.top = rc.top - nOffs;
+ rcTop.right = rc.right + nOffs;
+ rcTop.bottom = rc.top + nOffs;
+
+ rcRight.left = rc.right - nOffs;
+ rcRight.top = rc.top - nOffs;
+ rcRight.right = rc.right + nOffs;
+ rcRight.bottom = rc.bottom + nOffs;
+
+ rcBottom.left = rc.left - nOffs;
+ rcBottom.top = rc.bottom - nOffs;
+ rcBottom.right = rc.right + nOffs;
+ rcBottom.bottom = rc.bottom + nOffs;
+
+
+ bDockedLeft = FALSE;
+ bDockedRight = FALSE;
+
+ // Upper-left
+ pt.x = rcThumb.left;
+ pt.y = rcThumb.top;
+ bDocked = FALSE;
+
+ if ( PtInRect( &rcRight, pt )) {
+ nNewX = rc.right;
+ bDocked = TRUE;
+ }
+
+ if ( PtInRect( &rcBottom, pt )) {
+ nNewY = rc.bottom;
+ if ( PtInRect( &rcLeft, pt ))
+ nNewX = rc.left;
+ }
+
+ if ( PtInRect( &rcTop, pt )) {
+ nNewY = rc.top;
+ bDockedLeft = bDocked;
+ }
+
+ // Upper-right
+ pt.x = rcThumb.right;
+ pt.y = rcThumb.top;
+ bDocked = FALSE;
+
+ if ( !bLeading && PtInRect( &rcLeft, pt )) {
+ if ( !bDockedLeft ) {
+ nNewX = rc.left - nWidth;
+ bDocked = TRUE;
+ }
+ else if ( rc.right == rcThumb.left )
+ bDocked = TRUE;
+ }
+
+ if ( PtInRect( &rcBottom, pt )) {
+ nNewY = rc.bottom;
+ if ( PtInRect( &rcRight, pt ))
+ nNewX = rc.right - nWidth;
+ }
+
+ if ( !bLeading && PtInRect( &rcTop, pt )) {
+ nNewY = rc.top;
+ bDockedRight = bDocked;
+ }
+
+ if ( bMoveTogether ) {
+ if ( bDockedRight )
+ DockThumbs( pThumb, pCurThumb, TRUE );
+
+ if ( bDockedLeft )
+ DockThumbs( pCurThumb, pThumb, FALSE );
+ }
+
+ // Lower-left
+ pt.x = rcThumb.left;
+ pt.y = rcThumb.bottom;
+
+ if ( PtInRect( &rcRight, pt ))
+ nNewX = rc.right;
+
+ if ( PtInRect( &rcTop, pt )) {
+ nNewY = rc.top - nHeight;
+ if ( PtInRect( &rcLeft, pt ))
+ nNewX = rc.left;
+ }
+
+ // Lower-right
+ pt.x = rcThumb.right;
+ pt.y = rcThumb.bottom;
+
+ if ( !bLeading && PtInRect( &rcLeft, pt ))
+ nNewX = rc.left - nWidth;
+
+ if ( !bLeading && PtInRect( &rcTop, pt )) {
+ nNewY = rc.top - nHeight;
+ if ( PtInRect( &rcRight, pt ))
+ nNewX = rc.right - nWidth;
+ }
+ }
+ }
+
+ frmidx++;
+ if (pCurThumb->ContainerWnd = fakeTaskBarWindow.ContainerWnd){break;}
+ if (pCurThumb->ContainerWnd = fakeMainWindow.ContainerWnd){
+ pCurThumb = &fakeTaskBarWindow;continue;}
+ if (frmidx = nFramescount){
+ pCurThumb = &fakeMainWindow;continue;
+ }
+
+ pCurThumb = &Frames[frmidx];
+ }
+
+ // Adjust coords once again
+ nNewX = nNewX < nOffs ? 0 : nNewX;
+ nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX;
+ nNewY = nNewY < nOffs ? 0 : nNewY;
+ nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY;
+
+ SetWindowPos( pThumb->ContainerWnd, HWND_TOPMOST, nNewX, nNewY, 0, 0, SWP_NOSIZE | SWP_NOZORDER );
+
+ // OK, move all docked thumbs
+ if ( bMoveTogether ) {
+ pDockThumb = FindFrameByWnd( pDockThumb->dockOpt.hwndRight );
+ PositionThumb( pDockThumb, (short)( nNewX + nWidth ), (short)nNewY );
+ }
+}
+
+//////////
+
+void GetBorderSize(HWND hwnd,RECT *rect)
+{
+ RECT wr,cr;
+ POINT pt1,pt2;
+
+ GetWindowRect(hwnd,&wr);
+ GetClientRect(hwnd,&cr);
+ pt1.y = cr.top;pt1.x = cr.left;
+ pt2.y = cr.bottom;pt2.x = cr.right;
+
+ ClientToScreen(hwnd,&pt1);
+ ClientToScreen(hwnd,&pt2);
+
+ cr.top = pt1.y;cr.left = pt1.x;
+ cr.bottom = pt2.y;cr.right = pt2.x;
+
+ rect->top = cr.top-wr.top;
+ rect->left = cr.left-wr.left;
+ rect->right = wr.right-cr.right;
+ rect->bottom = wr.bottom-cr.bottom;
+}
+
+//append string
+char __inline *AS(char *str,const char *setting,char *addstr)
+{
+ if (str != NULL) {
+ strcpy(str,setting);
+ strcat(str,addstr);
+ }
+ return str;
+}
+
+int DBLoadFrameSettingsAtPos(int pos,int Frameid)
+{
+ char sadd[15];
+ char buf[255];
+
+ _itoa(pos,sadd,10);
+
+ //boolean
+ Frames[Frameid].collapsed = DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Collapse",sadd),Frames[Frameid].collapsed);
+
+ Frames[Frameid].Locked = DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Locked",sadd),Frames[Frameid].Locked);
+ Frames[Frameid].visible = DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Visible",sadd),Frames[Frameid].visible);
+ Frames[Frameid].TitleBar.ShowTitleBar = DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),Frames[Frameid].TitleBar.ShowTitleBar);
+
+ Frames[Frameid].height = DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"Height",sadd),Frames[Frameid].height);
+ Frames[Frameid].HeightWhenCollapsed = DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),0);
+ Frames[Frameid].align = DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"Align",sadd),Frames[Frameid].align);
+
+ Frames[Frameid].FloatingPos.x = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),100,0,1024);
+ Frames[Frameid].FloatingPos.y = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),100,0,1024);
+ Frames[Frameid].FloatingSize.x = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),100,0,1024);
+ Frames[Frameid].FloatingSize.y = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),100,0,1024);
+
+ Frames[Frameid].floating = DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Floating",sadd),0);
+ Frames[Frameid].order = DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"Order",sadd),0);
+
+ Frames[Frameid].UseBorder = DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),Frames[Frameid].UseBorder);
+
+ return 0;
+}
+
+int DBStoreFrameSettingsAtPos(int pos,int Frameid)
+{
+ char sadd[16];
+ char buf[255];
+
+ _itoa(pos,sadd,10);
+
+ DBWriteContactSettingTString(0,CLUIFrameModule,AS(buf,"Name",sadd),Frames[Frameid].name);
+ //boolean
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Collapse",sadd),(BYTE)btoint(Frames[Frameid].collapsed));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Locked",sadd),(BYTE)btoint(Frames[Frameid].Locked));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Visible",sadd),(BYTE)btoint(Frames[Frameid].visible));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),(BYTE)btoint(Frames[Frameid].TitleBar.ShowTitleBar));
+
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"Height",sadd),(WORD)Frames[Frameid].height);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),(WORD)Frames[Frameid].HeightWhenCollapsed);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"Align",sadd),(WORD)Frames[Frameid].align);
+ //FloatingPos
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),(WORD)Frames[Frameid].FloatingPos.x);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),(WORD)Frames[Frameid].FloatingPos.y);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),(WORD)Frames[Frameid].FloatingSize.x);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),(WORD)Frames[Frameid].FloatingSize.y);
+
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Floating",sadd),(BYTE)btoint(Frames[Frameid].floating));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),(BYTE)btoint(Frames[Frameid].UseBorder));
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"Order",sadd),(WORD)Frames[Frameid].order);
+ //DBWriteContactSettingString(0,CLUIFrameModule,AS(buf,"TBName",sadd),Frames[Frameid].TitleBar.tbname);
+ return 0;
+}
+
+int LocateStorePosition(int Frameid,int maxstored)
+{
+ int i;
+ LPTSTR frmname;
+ char settingname[255];
+ if (Frames[Frameid].name == NULL) return -1;
+
+ for (i = 0;i<maxstored;i++) {
+ mir_snprintf(settingname,sizeof(settingname),"Name%d",i);
+ frmname = DBGetStringT(0,CLUIFrameModule,settingname);
+ if (frmname == NULL) continue;
+ if (lstrcmpi(frmname,Frames[Frameid].name) == 0) {
+ mir_free(frmname);
+ return i;
+ }
+ mir_free(frmname);
+ }
+ return -1;
+}
+
+int CLUIFramesLoadFrameSettings(int Frameid)
+{
+ if (Frameid < 0 || Frameid >= nFramescount)
+ return -1;
+
+ int maxstored = DBGetContactSettingWord(0,CLUIFrameModule,"StoredFrames",-1);
+ if (maxstored == -1)
+ return 0;
+
+ int storpos = LocateStorePosition(Frameid,maxstored);
+ if (storpos == -1)
+ return 0;
+
+ DBLoadFrameSettingsAtPos(storpos,Frameid);
+ return 0;
+}
+
+int CLUIFramesStoreFrameSettings(int Frameid)
+{
+ if (Frameid < 0 || Frameid >= nFramescount)
+ return -1;
+
+ int maxstored = DBGetContactSettingWord(0,CLUIFrameModule,"StoredFrames",-1);
+ if (maxstored == -1) maxstored = 0;
+
+ int storpos = LocateStorePosition(Frameid,maxstored);
+ if (storpos == -1) {storpos = maxstored; maxstored++;}
+
+ DBStoreFrameSettingsAtPos(storpos,Frameid);
+ DBWriteContactSettingWord(0,CLUIFrameModule,"StoredFrames",(WORD)maxstored);
+ //ulockfrm();
+ return 0;
+}
+
+int CLUIFramesStoreAllFrames()
+{
+ lockfrm();
+ for (int i = 0;i<nFramescount;i++)
+ CLUIFramesStoreFrameSettings(i);
+ ulockfrm();
+ return 0;
+}
+
+// Get client frame
+int CLUIFramesGetalClientFrame(void)
+{
+ if (alclientFrame != -1)
+ return alclientFrame;
+
+ if (alclientFrame != -1) {
+ /* this value could become invalid if RemoveItemFromList was called,
+ * so we double-check */
+ if (alclientFrame<nFramescount) {
+ if (Frames[alclientFrame].align == alClient) {
+ return alclientFrame;
+ }
+ }
+ }
+
+ for (int i = 0;i<nFramescount;i++)
+ if (Frames[i].align == alClient) {
+ alclientFrame = i;
+ return i;
+ }
+
+ return -1;
+}
+
+HMENU CLUIFramesCreateMenuForFrame(int frameid,int root,int popuppos,HGENMENU (*pfnAdd )( CLISTMENUITEM* ))
+{
+ CLISTMENUITEM mi;
+ HANDLE menuid;
+ int framepos = id2pos(frameid);
+
+ ZeroMemory(&mi,sizeof(mi));
+
+ mi.cbSize = sizeof(mi);
+ mi.hIcon = LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_CLIENTMIRANDA));
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&FrameTitle");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_GRAYED;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMITitle = menuid;
+ else Frames[framepos].MenuHandles.MITitle = menuid;
+
+ popuppos += 100000;
+ mi.hIcon = NULL;
+ mi.cbSize = sizeof(mi);
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Visible");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszContactOwner = (char *)0;
+ mi.pszService = MS_CLIST_FRAMES_SHFRAME;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIVisible = menuid;
+ else Frames[framepos].MenuHandles.MIVisible = menuid;
+
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Show TitleBar");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService = MS_CLIST_FRAMES_SHFRAMETITLEBAR;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMITBVisible = menuid;
+ else Frames[framepos].MenuHandles.MITBVisible = menuid;
+
+
+ popuppos += 100000;
+
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Locked");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService = MS_CLIST_FRAMES_ULFRAME;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMILock = menuid;
+ else Frames[framepos].MenuHandles.MILock = menuid;
+
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Collapsed");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService = MS_CLIST_FRAMES_UCOLLFRAME;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIColl = menuid;
+ else Frames[framepos].MenuHandles.MIColl = menuid;
+
+ //floating
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Floating Mode");
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszService = "Set_Floating";
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIFloating = menuid;
+ else Frames[framepos].MenuHandles.MIFloating = menuid;
+
+
+ popuppos += 100000;
+
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Border");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService = MS_CLIST_FRAMES_SETUNBORDER;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIBorder = menuid;
+ else Frames[framepos].MenuHandles.MIBorder = menuid;
+
+ popuppos += 100000;
+
+ //alignment root
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Align");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_ROOTPOPUP;
+ mi.pszService = "";
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIAlignRoot = menuid;
+ else Frames[framepos].MenuHandles.MIAlignRoot = menuid;
+
+ mi.flags = CMIF_CHILDPOPUP;
+ //align top
+ mi.pszPopupName = (char *)menuid;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Top");
+ mi.pszService = CLUIFRAMESSETALIGNALTOP;
+ mi.pszContactOwner = (char *)alTop;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIAlignTop = menuid;
+ else Frames[framepos].MenuHandles.MIAlignTop = menuid;
+
+
+ //align client
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Client");
+ mi.pszService = CLUIFRAMESSETALIGNALCLIENT;
+ mi.pszContactOwner = (char *)alClient;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIAlignClient = menuid;
+ else Frames[framepos].MenuHandles.MIAlignClient = menuid;
+
+ //align bottom
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Bottom");
+ mi.pszService = CLUIFRAMESSETALIGNALBOTTOM;
+ mi.pszContactOwner = (char *)alBottom;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) contMIAlignBottom = menuid;
+ else Frames[framepos].MenuHandles.MIAlignBottom = menuid;
+
+ //position
+ //position root
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Position");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_ROOTPOPUP;
+ mi.pszService = "";
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+
+ mi.pszPopupName = (char *)menuid;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Up");
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszService = CLUIFRAMESMOVEUPDOWN;
+ mi.pszContactOwner = (char *)1;
+ pfnAdd(&mi);
+
+ mi.pszPopupName = (char *)menuid;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Down");
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszService = CLUIFRAMESMOVEUPDOWN;
+ mi.pszContactOwner = (char *)-1;
+ pfnAdd(&mi);
+
+ return 0;
+}
+
+INT_PTR ModifyMItem(WPARAM wParam,LPARAM lParam)
+{
+ return ModifyMenuItemProxy(wParam,lParam);
+}
+
+static int CLUIFramesModifyContextMenuForFrame(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ CLISTMENUITEM mi;
+ //TMO_MenuItem tmi;
+
+ lockfrm();
+ pos = id2pos(wParam);
+
+ if (pos >= 0 && pos < nFramescount) {
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR;
+ mi.ptszName = Frames[pos].TitleBar.tbname ? Frames[pos].TitleBar.tbname : Frames[pos].name;
+ ModifyMItem((WPARAM)contMITitle,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].visible) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIVisible,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].Locked) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMILock,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].TitleBar.ShowTitleBar) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMITBVisible,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].floating) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIFloating,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if ((Frames[pos].UseBorder)) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIBorder,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].align&alTop) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignTop,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].align&alClient) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignClient,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].align&alBottom) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignBottom,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].collapsed) mi.flags |= CMIF_CHECKED;
+ if ((!Frames[pos].visible)||(Frames[pos].Locked)||(pos == CLUIFramesGetalClientFrame())) mi.flags |= CMIF_GRAYED;
+ ModifyMItem((WPARAM)contMIColl,(LPARAM)&mi);
+ }
+ ulockfrm();
+ return 0;
+}
+
+INT_PTR CLUIFramesModifyMainMenuItems(WPARAM wParam,LPARAM lParam)
+{
+ lockfrm();
+
+ int pos = id2pos(wParam);
+ if (pos >= 0 && pos < nFramescount) {
+ CLISTMENUITEM mi = { 0 };
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR;
+ mi.ptszName = Frames[pos].TitleBar.tbname ? Frames[pos].TitleBar.tbname : Frames[pos].name;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MITitle,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].visible) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIVisible,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].Locked) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MILock,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].TitleBar.ShowTitleBar) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MITBVisible,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].floating) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIFloating,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if ((Frames[pos].UseBorder)) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIBorder,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0);
+ if (Frames[pos].align&alTop) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIAlignTop,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].align&alClient) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIAlignClient,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0);
+ if (Frames[pos].align&alBottom) mi.flags |= CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIAlignBottom,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (Frames[pos].collapsed) mi.flags |= CMIF_CHECKED;
+ if ((!Frames[pos].visible)||Frames[pos].Locked||(pos == CLUIFramesGetalClientFrame())) mi.flags |= CMIF_GRAYED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIColl,(LPARAM)&mi);
+ }
+ ulockfrm();
+ return 0;
+}
+
+//hiword(wParam) = frameid,loword(wParam) = flag
+INT_PTR CLUIFramesGetFrameOptions(WPARAM wParam,LPARAM lParam)
+{
+ if (FramesSysNotStarted) return 0;
+
+ lockfrm();
+ int pos = id2pos(HIWORD(wParam));
+ if (pos < 0 || pos >= nFramescount) {
+ ulockfrm();
+ return -1;
+ }
+
+ INT_PTR retval;
+
+ switch(LOWORD(wParam)) {
+ case FO_FLAGS:
+ retval = 0;
+ if (Frames[pos].visible) retval |= F_VISIBLE;
+ if (!Frames[pos].collapsed) retval |= F_UNCOLLAPSED;
+ if (Frames[pos].Locked) retval |= F_LOCKED;
+ if (Frames[pos].TitleBar.ShowTitleBar) retval |= F_SHOWTB;
+ if (Frames[pos].TitleBar.ShowTitleBarTip) retval |= F_SHOWTBTIP;
+ if (!(GetWindowLongPtr(Frames[pos].hWnd,GWL_STYLE)&WS_BORDER)) retval |= F_NOBORDER;
+ break;
+
+ case FO_NAME:
+ retval = (INT_PTR)Frames[pos].name;
+ break;
+
+ case FO_TBNAME:
+ retval = (INT_PTR)Frames[pos].TitleBar.tbname;
+ break;
+
+ case FO_TBTIPNAME:
+ retval = (INT_PTR)Frames[pos].TitleBar.tooltip;
+ break;
+
+ case FO_TBSTYLE:
+ retval = GetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_STYLE);
+ break;
+
+ case FO_TBEXSTYLE:
+ retval = GetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_EXSTYLE);
+ break;
+
+ case FO_ICON:
+ retval = (INT_PTR)Frames[pos].TitleBar.hicon;
+ break;
+
+ case FO_HEIGHT:
+ retval = (INT_PTR)Frames[pos].height;
+ break;
+
+ case FO_ALIGN:
+ retval = (INT_PTR)Frames[pos].align;
+ break;
+ case FO_FLOATING:
+ retval = (INT_PTR)Frames[pos].floating;
+ break;
+ default:
+ retval = -1;
+ break;
+ }
+ ulockfrm();
+ return retval;
+}
+
+//hiword(wParam) = frameid,loword(wParam) = flag
+INT_PTR CLUIFramesSetFrameOptions(WPARAM wParam,LPARAM lParam)
+{
+ lockfrm();
+ int pos = id2pos(HIWORD(wParam));
+ if (pos<0||pos>=nFramescount) {
+ ulockfrm();
+ return -1;
+ }
+
+ INT_PTR retval; // value to be returned
+
+ switch(LOWORD(wParam) & ~FO_UNICODETEXT) {
+ case FO_FLAGS:{
+ int flag = lParam;
+ int style;
+
+ Frames[pos].dwFlags = flag;
+ Frames[pos].visible = FALSE;
+ if (flag&F_VISIBLE) Frames[pos].visible = TRUE;
+
+ Frames[pos].collapsed = TRUE;
+ if (flag&F_UNCOLLAPSED) Frames[pos].collapsed = FALSE;
+
+ Frames[pos].Locked = FALSE;
+ if (flag&F_LOCKED) Frames[pos].Locked = TRUE;
+
+ Frames[pos].UseBorder = TRUE;
+ if (flag&F_NOBORDER) Frames[pos].UseBorder = FALSE;
+
+ Frames[pos].TitleBar.ShowTitleBar = FALSE;
+ if (flag&F_SHOWTB) Frames[pos].TitleBar.ShowTitleBar = TRUE;
+
+ Frames[pos].TitleBar.ShowTitleBarTip = FALSE;
+ if (flag&F_SHOWTBTIP) Frames[pos].TitleBar.ShowTitleBarTip = TRUE;
+
+ SendMessage(Frames[pos].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)Frames[pos].TitleBar.ShowTitleBarTip,0);
+
+ style = (int)GetWindowLongPtr(Frames[pos].hWnd,GWL_STYLE);
+ style |= WS_BORDER;
+ if (flag&F_NOBORDER) {style &= (~WS_BORDER);}
+ SetWindowLongPtr(Frames[pos].hWnd,GWL_STYLE,(LONG)style);
+ ulockfrm();
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+ }
+
+ case FO_NAME:
+ if (lParam == (LPARAM)NULL) {ulockfrm(); return -1;}
+ mir_free(Frames[pos].name);
+ Frames[pos].name = mir_tstrdup((LPTSTR)lParam);
+ ulockfrm();
+ return 0;
+
+ case FO_TBNAME:
+ if (lParam == (LPARAM)NULL) {ulockfrm(); return(-1);}
+ mir_free(Frames[pos].TitleBar.tbname);
+ Frames[pos].TitleBar.tbname = mir_tstrdup((LPTSTR)lParam);
+ ulockfrm();
+ if (Frames[pos].floating&&(Frames[pos].TitleBar.tbname != NULL)){SetWindowText(Frames[pos].ContainerWnd,Frames[pos].TitleBar.tbname);}
+ return 0;
+
+ case FO_TBTIPNAME:
+ if (lParam == (LPARAM)NULL) {ulockfrm(); return(-1);}
+ mir_free(Frames[pos].TitleBar.tooltip);
+ Frames[pos].TitleBar.tooltip = mir_tstrdup((LPTSTR)lParam);
+ UpdateTBToolTip(pos);
+ ulockfrm();
+ return 0;
+
+ case FO_TBSTYLE:
+ SetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_STYLE,lParam);
+ ulockfrm();
+ return 0;
+
+ case FO_TBEXSTYLE:
+ SetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_EXSTYLE,lParam);
+ ulockfrm();
+ return 0;
+
+ case FO_ICON:
+ Frames[pos].TitleBar.hicon = (HICON)lParam;
+ ulockfrm();
+ return 0;
+
+ case FO_HEIGHT:
+ if (lParam<0) {ulockfrm(); return -1;}
+ retval = Frames[pos].height;
+ Frames[pos].height = lParam;
+ if (!CLUIFramesFitInSize()) Frames[pos].height = retval;
+ retval = Frames[pos].height;
+ ulockfrm();
+
+ return retval;
+
+ case FO_FLOATING:
+ if (lParam<0) {ulockfrm(); return -1;}
+
+ {
+ int id = Frames[pos].id;
+ Frames[pos].floating = !(lParam);
+ ulockfrm();
+
+ CLUIFrameSetFloat(id,1);//lparam = 1 use stored width and height
+ return wParam;
+ }
+
+ case FO_ALIGN:
+ if ( !(lParam&alTop || lParam&alBottom || lParam&alClient)) {
+ OutputDebugStringA("Wrong align option \r\n");
+ return (-1);
+ }
+
+ if ((lParam&alClient)&&(CLUIFramesGetalClientFrame()>=0)) { //only one alClient frame possible
+ alclientFrame = -1;//recalc it
+ ulockfrm();
+ return -1;
+ }
+ Frames[pos].align = lParam;
+
+ ulockfrm();
+ return 0;
+ }
+ ulockfrm();
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return -1;
+}
+
+//wparam = lparam = 0
+static INT_PTR CLUIFramesShowAll(WPARAM wParam,LPARAM lParam)
+{
+ for (int i = 0;i<nFramescount;i++)
+ Frames[i].visible = TRUE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam = lparam = 0
+INT_PTR CLUIFramesShowAllTitleBars(WPARAM wParam,LPARAM lParam)
+{
+ for (int i = 0;i<nFramescount;i++)
+ Frames[i].TitleBar.ShowTitleBar = TRUE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam = lparam = 0
+INT_PTR CLUIFramesHideAllTitleBars(WPARAM wParam,LPARAM lParam)
+{
+ for (int i = 0;i<nFramescount;i++)
+ Frames[i].TitleBar.ShowTitleBar = FALSE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam = frameid
+INT_PTR CLUIFramesShowHideFrame(WPARAM wParam,LPARAM lParam)
+{
+ lockfrm();
+ int pos = id2pos(wParam);
+ if ( pos >= 0 && (int)pos < nFramescount)
+ Frames[pos].visible = !Frames[pos].visible;
+ if (Frames[pos].floating)
+ CLUIFrameResizeFloatingFrame(pos);
+ ulockfrm();
+
+ if (!Frames[pos].floating)
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam = frameid
+INT_PTR CLUIFramesShowHideFrameTitleBar(WPARAM wParam,LPARAM lParam)
+{
+ lockfrm();
+ int pos = id2pos(wParam);
+ if ( pos >= 0 && (int)pos < nFramescount)
+ Frames[pos].TitleBar.ShowTitleBar = !Frames[pos].TitleBar.ShowTitleBar;
+
+ ulockfrm();
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam = frameid
+//lparam = -1 up ,1 down
+INT_PTR CLUIFramesMoveUpDown(WPARAM wParam,LPARAM lParam)
+{
+ int pos,i,curpos,curalign,v,tmpval;
+
+ lockfrm();
+ pos = id2pos(wParam);
+ if (pos>=0&&(int)pos<nFramescount) {
+ SortData *sd;
+ curpos = Frames[pos].order;
+ curalign = Frames[pos].align;
+ v = 0;
+ sd = (SortData*)malloc(sizeof(SortData)*nFramescount);
+ memset(sd,0,sizeof(SortData)*nFramescount);
+ for (i = 0;i<nFramescount;i++) {
+ if (Frames[i].floating||(!Frames[i].visible)||(Frames[i].align != curalign))
+ continue;
+
+ sd[v].order = Frames[i].order;
+ sd[v].realpos = i;
+ v++;
+ }
+ if (v == 0) {
+ ulockfrm();
+ return 0;
+ }
+ qsort(sd,v,sizeof(SortData),sortfunc);
+ for (i = 0;i<v;i++) {
+ if (sd[i].realpos == pos) {
+ if (lParam == -1) {
+ if (i >= v-1)
+ break;
+
+ tmpval = Frames[sd[i+1].realpos].order;
+ Frames[sd[i+1].realpos].order = Frames[pos].order;
+ Frames[pos].order = tmpval;
+ break;
+ }
+ if (lParam == +1) {
+ if (i < 1)
+ break;
+
+ tmpval = Frames[sd[i-1].realpos].order;
+ Frames[sd[i-1].realpos].order = Frames[pos].order;
+ Frames[pos].order = tmpval;
+ break;
+ }
+ }
+ }
+
+ if (sd != NULL)
+ free(sd);
+ CLUIFramesStoreFrameSettings(pos);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ }
+ ulockfrm();
+ return 0;
+}
+
+//wparam = frameid
+//lparam = alignment
+INT_PTR CLUIFramesSetAlign(WPARAM wParam,LPARAM lParam)
+{
+ CLUIFramesSetFrameOptions(MAKEWPARAM(FO_ALIGN,wParam),lParam);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return 0;
+}
+
+INT_PTR CLUIFramesSetAlignalTop(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFramesSetAlign(wParam,alTop);
+}
+
+INT_PTR CLUIFramesSetAlignalBottom(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFramesSetAlign(wParam,alBottom);
+}
+
+INT_PTR CLUIFramesSetAlignalClient(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFramesSetAlign(wParam,alClient);
+}
+
+//wparam = frameid
+INT_PTR CLUIFramesLockUnlockFrame(WPARAM wParam,LPARAM lParam)
+{
+ lockfrm();
+ int pos = id2pos(wParam);
+ if (pos >= 0 && (int)pos < nFramescount) {
+ Frames[pos].Locked = !Frames[pos].Locked;
+ CLUIFramesStoreFrameSettings(pos);
+ }
+ ulockfrm();
+ return 0;
+}
+
+//wparam = frameid
+INT_PTR CLUIFramesSetUnSetBorder(WPARAM wParam,LPARAM lParam)
+{
+ int oldflags;
+
+ lockfrm();
+ int FrameId = id2pos(wParam);
+ if (FrameId == -1) {
+ ulockfrm();
+ return -1;
+ }
+
+ boolean flt = oldflags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),0);
+ if (oldflags & F_NOBORDER)
+ oldflags &= (~F_NOBORDER);
+ else
+ oldflags |= F_NOBORDER;
+
+ HWND hw = Frames[FrameId].hWnd;
+ RECT rc;
+ GetWindowRect(hw, &rc);
+
+ ulockfrm();
+ CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),oldflags);
+
+ SetWindowPos(hw,0,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_DRAWFRAME);
+ return 0;
+}
+
+//wparam = frameid
+INT_PTR CLUIFramesCollapseUnCollapseFrame(WPARAM wParam,LPARAM lParam)
+{
+ int FrameId;
+
+ lockfrm();
+ FrameId = id2pos(wParam);
+ if (FrameId >= 0 && FrameId < nFramescount) {
+ int oldHeight;
+
+ // do not collapse/uncollapse client/locked/invisible frames
+ if (Frames[FrameId].align == alClient&&!(Frames[FrameId].Locked||(!Frames[FrameId].visible)||Frames[FrameId].floating)) {
+ RECT rc;
+ if (CallService(MS_CLIST_DOCKINGISDOCKED,0,0)) {
+ ulockfrm();
+ return 0;
+ }
+ if (DBGetContactSettingByte(NULL,"CLUI","AutoSize",0)) {
+ ulockfrm();
+ return 0;
+ }
+
+ GetWindowRect(pcli->hwndContactList, &rc);
+
+ if (Frames[FrameId].collapsed == TRUE) {
+ rc.bottom -= rc.top;
+ rc.bottom -= Frames[FrameId].height;
+ Frames[FrameId].HeightWhenCollapsed = Frames[FrameId].height;
+ Frames[FrameId].collapsed = FALSE;
+ }
+ else {
+ rc.bottom -= rc.top;
+ rc.bottom += Frames[FrameId].HeightWhenCollapsed;
+ Frames[FrameId].collapsed = TRUE;
+ }
+
+ SetWindowPos(pcli->hwndContactList,NULL,0,0,rc.right-rc.left,rc.bottom,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
+
+ CLUIFramesStoreAllFrames();
+ ulockfrm();
+ return 0;
+ }
+
+ if (Frames[FrameId].Locked||(!Frames[FrameId].visible))
+ return 0;
+
+ oldHeight = Frames[FrameId].height;
+
+ // if collapsed, uncollapse
+ if (Frames[FrameId].collapsed == TRUE) {
+ Frames[FrameId].HeightWhenCollapsed = Frames[FrameId].height;
+ Frames[FrameId].height = UNCOLLAPSED_FRAME_SIZE;
+ Frames[FrameId].collapsed = FALSE;
+ }
+ // if uncollapsed, collapse
+ else {
+ Frames[FrameId].height = Frames[FrameId].HeightWhenCollapsed;
+ Frames[FrameId].collapsed = TRUE;
+ }
+
+ if (!Frames[FrameId].floating) {
+ if (!CLUIFramesFitInSize()) {
+ //cant collapse,we can resize only for height<alclient frame height
+ int alfrm = CLUIFramesGetalClientFrame();
+
+ if (alfrm != -1) {
+ Frames[FrameId].collapsed = FALSE;
+ if (Frames[alfrm].height>2*UNCOLLAPSED_FRAME_SIZE) {
+ oldHeight = Frames[alfrm].height-UNCOLLAPSED_FRAME_SIZE;
+ Frames[FrameId].collapsed = TRUE;
+ }
+ }
+ else {
+ int i,sumheight = 0;
+ for (i = 0; i < nFramescount; i++) {
+ if ((Frames[i].align != alClient)&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) {
+ sumheight += (Frames[i].height)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+2;
+ return FALSE;
+ }
+
+ if (sumheight>ContactListHeight-0-2)
+ Frames[FrameId].height = (ContactListHeight-0-2)-sumheight;
+ }
+ }
+
+ Frames[FrameId].height = oldHeight;
+
+ if (Frames[FrameId].collapsed == FALSE) {
+ if (Frames[FrameId].floating)
+ SetWindowPos(Frames[FrameId].ContainerWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left+6,Frames[FrameId].height+DEFAULT_TITLEBAR_HEIGHT+4,SWP_SHOWWINDOW|SWP_NOMOVE);
+
+ ulockfrm();
+ return -1;
+ }
+ }
+ }
+
+ ulockfrm();
+
+ if (!Frames[FrameId].floating)
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ else {
+ //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE);
+ RECT contwnd;
+ GetWindowRect(Frames[FrameId].ContainerWnd,&contwnd);
+ contwnd.top = contwnd.bottom-contwnd.top;//height
+ contwnd.left = contwnd.right-contwnd.left;//width
+
+ contwnd.top -= (oldHeight-Frames[FrameId].height);//newheight
+ SetWindowPos(Frames[FrameId].ContainerWnd,HWND_TOP,0,0,contwnd.left,contwnd.top,SWP_SHOWWINDOW|SWP_NOMOVE);
+ }
+ CLUIFramesStoreAllFrames();
+ return 0;
+ }
+ else return -1;
+
+ ulockfrm();
+ return 0;
+}
+
+static int CLUIFramesLoadMainMenu()
+{
+ CLISTMENUITEM mi;
+ int i,separator;
+
+ if ( !(ServiceExists(MS_CLIST_REMOVEMAINMENUITEM))) {
+ //hmm new menu system not used..so display only two items and warning message
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ // create "show all frames" menu
+ mi.hIcon = NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MIRANDA));
+ mi.flags = CMIF_GRAYED;
+ mi.position = 10000000;
+ mi.pszPopupName = LPGEN("Frames");
+ mi.pszName = LPGEN("New Menu System not Found...");
+ mi.pszService = "";
+ Menu_AddMainMenuItem(&mi);
+
+ // create "show all frames" menu
+ mi.hIcon = NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MIRANDA));
+ mi.flags = 0;
+ mi.position = 10100000;
+ mi.pszPopupName = LPGEN("Frames");
+ mi.pszName = LPGEN("Show All Frames");
+ mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMES;
+ Menu_AddMainMenuItem(&mi);
+
+ mi.hIcon = NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_HELP));
+ mi.position = 10100001;
+ mi.pszPopupName = LPGEN("Frames");
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszName = LPGEN("Show All Titlebars");
+ mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMESTB;
+ Menu_AddMainMenuItem(&mi);
+ return 0;
+ }
+
+ if (MainMIRoot != (HGENMENU)-1) {
+ CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)MainMIRoot,0);
+ MainMIRoot = (HGENMENU)-1;
+ }
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+
+ // create root menu
+ mi.hIcon = LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_CLIENTMIRANDA));
+ mi.flags = CMIF_ROOTPOPUP;
+ mi.position = 3000090000;
+ mi.pszPopupName = (char*)-1;
+ mi.pszName = LPGEN("Frames");
+ mi.pszService = 0;
+ MainMIRoot = Menu_AddMainMenuItem(&mi);
+
+ // create frames menu
+ separator = 3000200000;
+ for (i = 0;i<nFramescount;i++) {
+ mi.hIcon = Frames[i].TitleBar.hicon;
+ mi.flags = CMIF_CHILDPOPUP|CMIF_ROOTPOPUP|CMIF_TCHAR;
+ mi.position = separator;
+ mi.hParentMenu = MainMIRoot;
+ mi.ptszName = Frames[i].TitleBar.tbname ? Frames[i].TitleBar.tbname : Frames[i].name;
+ mi.pszService = 0;
+ Frames[i].MenuHandles.MainMenuItem = Menu_AddMainMenuItem(&mi);
+ CLUIFramesCreateMenuForFrame(Frames[i].id,(int)Frames[i].MenuHandles.MainMenuItem,separator,Menu_AddMainMenuItem);
+ CLUIFramesModifyMainMenuItems(Frames[i].id,0);
+ //NotifyEventHooks(hPreBuildFrameMenuEvent,i,(LPARAM)Frames[i].MenuHandles.MainMenuItem);
+ CallService(MS_CLIST_FRAMEMENUNOTIFY,(WPARAM)Frames[i].id,(LPARAM)Frames[i].MenuHandles.MainMenuItem);
+ separator++;
+ }
+
+ separator += 100000;
+
+ // create "show all frames" menu
+ mi.hIcon = NULL;
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.position = separator++;
+ mi.hParentMenu = MainMIRoot;
+ mi.pszName = LPGEN("Show All Frames");
+ mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMES;
+ Menu_AddMainMenuItem(&mi);
+
+ // create "show all titlebars" menu
+ mi.hIcon = NULL;
+ mi.position = separator++;
+ mi.hParentMenu = MainMIRoot;
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszName = LPGEN("Show All Titlebars");
+ mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMESTB;
+ Menu_AddMainMenuItem(&mi);
+
+ // create "hide all titlebars" menu
+ mi.hIcon = NULL;
+ mi.position = separator++;
+ mi.hParentMenu = MainMIRoot;
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszName = LPGEN("Hide All Titlebars");
+ mi.pszService = MS_CLIST_FRAMES_HIDEALLFRAMESTB;
+ Menu_AddMainMenuItem(&mi);
+ return 0;
+}
+
+static HFONT CLUILoadTitleBarFont()
+{
+ char facename[] = "MS Shell Dlg";
+ HFONT hfont;
+ LOGFONT logfont;
+ memset(&logfont,0,sizeof(logfont));
+ memcpy(logfont.lfFaceName,facename,sizeof(facename));
+ logfont.lfWeight = FW_NORMAL;
+ logfont.lfHeight = -10;
+ hfont = CreateFontIndirect(&logfont);
+ return hfont;
+}
+
+static int UpdateTBToolTip(int framepos)
+{
+ TOOLINFO ti = { 0 };
+ ti.cbSize = sizeof(ti);
+ ti.lpszText = Frames[framepos].TitleBar.tooltip;
+ ti.hinst = g_hInst;
+ ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS ;
+ ti.uId = (UINT_PTR)Frames[framepos].TitleBar.hwnd;
+
+ return SendMessage(Frames[framepos].TitleBar.hwndTip, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
+}
+
+//wparam = (CLISTFrame*)clfrm
+INT_PTR CLUIFramesAddFrame(WPARAM wParam,LPARAM lParam)
+{
+ int style,retval;
+ CLISTFrame *clfrm = (CLISTFrame *)wParam;
+
+ if (pcli->hwndContactList == 0) return -1;
+ if (FramesSysNotStarted) return -1;
+ if (clfrm->cbSize != sizeof(CLISTFrame)) return -1;
+ if (!(TitleBarFont)) TitleBarFont = CLUILoadTitleBarFont();
+
+ lockfrm();
+ if (nFramescount>=MAX_FRAMES) { ulockfrm(); return -1;}
+ Frames = (wndFrame*)realloc(Frames,sizeof(wndFrame)*(nFramescount+1));
+
+ memset(&Frames[nFramescount],0,sizeof(wndFrame));
+ Frames[nFramescount].id = NextFrameId++;
+ Frames[nFramescount].align = clfrm->align;
+ Frames[nFramescount].hWnd = clfrm->hWnd;
+ Frames[nFramescount].height = clfrm->height;
+ Frames[nFramescount].TitleBar.hicon = clfrm->hIcon;
+ Frames[nFramescount].TitleBar.BackColour;
+ Frames[nFramescount].floating = FALSE;
+
+ //override tbbtip
+ //clfrm->Flags != F_SHOWTBTIP;
+ //
+ if (DBGetContactSettingByte(0,CLUIFrameModule,"RemoveAllBorders",0) == 1)
+ clfrm->Flags |= F_NOBORDER;
+
+ Frames[nFramescount].dwFlags = clfrm->Flags;
+
+ if (clfrm->name == NULL||((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->wname) : lstrlenA(clfrm->name)) == 0) {
+ Frames[nFramescount].name = (LPTSTR)malloc(255 * sizeof(TCHAR));
+ GetClassName(Frames[nFramescount].hWnd,Frames[nFramescount].name,255);
+ }
+ else Frames[nFramescount].name = (clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->wname) : mir_a2t(clfrm->name);
+
+ if (IsBadCodePtr((FARPROC)clfrm->TBname) || clfrm->TBname == NULL
+ || ((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->TBwname) : lstrlenA(clfrm->TBname)) == 0)
+ Frames[nFramescount].TitleBar.tbname = mir_tstrdup(Frames[nFramescount].name);
+ else
+ Frames[nFramescount].TitleBar.tbname = (clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->TBwname) : mir_a2t(clfrm->TBname);
+ Frames[nFramescount].needhide = FALSE;
+ Frames[nFramescount].TitleBar.ShowTitleBar = (clfrm->Flags&F_SHOWTB?TRUE:FALSE);
+ Frames[nFramescount].TitleBar.ShowTitleBarTip = (clfrm->Flags&F_SHOWTBTIP?TRUE:FALSE);
+
+ Frames[nFramescount].collapsed = clfrm->Flags & F_UNCOLLAPSED ? FALSE:TRUE;
+ Frames[nFramescount].Locked = clfrm->Flags & F_LOCKED ? TRUE : FALSE;
+ Frames[nFramescount].visible = clfrm->Flags & F_VISIBLE ? TRUE : FALSE;
+
+ Frames[nFramescount].UseBorder = (clfrm->Flags&F_NOBORDER)?FALSE:TRUE;
+
+ // create frame
+ Frames[nFramescount].TitleBar.hwnd = CreateWindow(CLUIFrameTitleBarClassName,Frames[nFramescount].name,
+ (DBGetContactSettingByte(0,CLUIFrameModule,"RemoveAllTitleBarBorders",0)?0:WS_BORDER) |WS_CHILD|WS_CLIPCHILDREN|
+ (Frames[nFramescount].TitleBar.ShowTitleBar?WS_VISIBLE:0)| WS_CLIPCHILDREN,
+ 0,0,0,0,pcli->hwndContactList,NULL,g_hInst,NULL);
+ SetWindowLongPtr(Frames[nFramescount].TitleBar.hwnd,GWLP_USERDATA,Frames[nFramescount].id);
+
+ Frames[nFramescount].TitleBar.hwndTip = CreateWindowEx(0, TOOLTIPS_CLASS, NULL,
+ WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ pcli->hwndContactList, NULL, g_hInst, NULL);
+
+ SetWindowPos(Frames[nFramescount].TitleBar.hwndTip, HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+
+ TOOLINFO ti = { 0 };
+ ti.cbSize = sizeof(ti);
+ ti.lpszText = _T("");
+ ti.hinst = g_hInst;
+ ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS ;
+ ti.uId = (UINT_PTR)Frames[nFramescount].TitleBar.hwnd;
+ SendMessage(Frames[nFramescount].TitleBar.hwndTip,TTM_ADDTOOL,(WPARAM)0,(LPARAM)&ti);
+
+ SendMessage(Frames[nFramescount].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)Frames[nFramescount].TitleBar.ShowTitleBarTip,0);
+
+ Frames[nFramescount].oldstyles = GetWindowLongPtr(Frames[nFramescount].hWnd,GWL_STYLE);
+ Frames[nFramescount].TitleBar.oldstyles = GetWindowLongPtr(Frames[nFramescount].TitleBar.hwnd,GWL_STYLE);
+ //Frames[nFramescount].FloatingPos.x =
+
+ retval = Frames[nFramescount].id;
+ Frames[nFramescount].order = nFramescount+1;
+ nFramescount++;
+
+ CLUIFramesLoadFrameSettings(id2pos(retval));
+ style = GetWindowLongPtr(Frames[nFramescount-1].hWnd,GWL_STYLE);
+ style &= (~WS_BORDER);
+ style |= ((Frames[nFramescount-1].UseBorder)?WS_BORDER:0);
+ SetWindowLongPtr(Frames[nFramescount-1].hWnd,GWL_STYLE,style);
+
+ if (Frames[nFramescount-1].order == 0){Frames[nFramescount-1].order = nFramescount;}
+ ulockfrm();
+
+ alclientFrame = -1;//recalc it
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+
+ if (Frames[nFramescount-1].floating) {
+ Frames[nFramescount-1].floating = FALSE;
+ CLUIFrameSetFloat(retval,1);//lparam = 1 use stored width and height
+ }
+
+ return retval;
+}
+
+static INT_PTR CLUIFramesRemoveFrame(WPARAM wParam,LPARAM lParam)
+{
+ if (FramesSysNotStarted)
+ return -1;
+
+ lockfrm();
+ int pos = id2pos(wParam);
+
+ if (pos<0||pos>nFramescount){ulockfrm();return(-1);}
+
+ mir_free(Frames[pos].name);
+ mir_free(Frames[pos].TitleBar.tbname);
+ mir_free(Frames[pos].TitleBar.tooltip);
+
+ DestroyWindow(Frames[pos].hWnd);
+ Frames[pos].hWnd = (HWND)-1;
+ DestroyWindow(Frames[pos].TitleBar.hwnd);
+ Frames[pos].TitleBar.hwnd = (HWND)-1;
+ DestroyWindow(Frames[pos].ContainerWnd);
+ Frames[pos].ContainerWnd = (HWND)-1;
+ DestroyMenu(Frames[pos].TitleBar.hmenu);
+
+ RemoveItemFromList(pos,&Frames,&nFramescount);
+
+ ulockfrm();
+ InvalidateRect(pcli->hwndContactList,NULL,TRUE);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ InvalidateRect(pcli->hwndContactList,NULL,TRUE);
+
+ return 0;
+}
+
+
+int CLUIFramesForceUpdateTB(const wndFrame *Frame)
+{
+ if (Frame->TitleBar.hwnd != 0)
+ RedrawWindow(Frame->TitleBar.hwnd,NULL,NULL,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME);
+ return 0;
+}
+
+int CLUIFramesForceUpdateFrame(const wndFrame *Frame)
+{
+ if (Frame->hWnd != 0) {
+ RedrawWindow(Frame->hWnd,NULL,NULL,RDW_UPDATENOW|RDW_FRAME|RDW_ERASE|RDW_INVALIDATE);
+ UpdateWindow(Frame->hWnd);
+ }
+ if (Frame->floating) {
+ if (Frame->ContainerWnd != 0)
+ RedrawWindow(Frame->ContainerWnd,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME);
+ }
+ return 0;
+}
+
+int CLUIFrameMoveResize(const wndFrame *Frame)
+{
+ //int b;
+ // we need to show or hide the frame?
+ if (Frame->visible&&(!Frame->needhide)) {
+ ShowWindow(Frame->hWnd,SW_SHOW);
+ ShowWindow(Frame->TitleBar.hwnd,Frame->TitleBar.ShowTitleBar == TRUE?SW_SHOW:SW_HIDE);
+ }
+ else {
+ ShowWindow(Frame->hWnd,SW_HIDE);
+ ShowWindow(Frame->TitleBar.hwnd,SW_HIDE);
+ return 0;
+ }
+
+ // set frame position
+ SetWindowPos(Frame->hWnd,NULL,Frame->wndSize.left,Frame->wndSize.top,
+ Frame->wndSize.right-Frame->wndSize.left,
+ Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOREDRAW);
+
+ // set titlebar position
+ if (Frame->TitleBar.ShowTitleBar)
+ SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-TitleBarH-GapBetweenTitlebar,
+ Frame->wndSize.right-Frame->wndSize.left,
+ TitleBarH,SWP_NOZORDER|SWP_NOREDRAW );
+
+ return 0;
+}
+
+BOOLEAN CLUIFramesFitInSize(void)
+{
+ int sumheight = 0;
+ int tbh = 0; // title bar height
+
+ int clientfrm = CLUIFramesGetalClientFrame();
+ if (clientfrm != -1)
+ tbh = TitleBarH*btoint(Frames[clientfrm].TitleBar.ShowTitleBar);
+
+ for (int i = 0;i<nFramescount;i++) {
+ if ((Frames[i].align != alClient)&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) {
+ sumheight += (Frames[i].height)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+2;
+ if (sumheight>ContactListHeight-tbh-2)
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+int CLUIFramesGetMinHeight()
+{
+ int i,tbh,clientfrm,sumheight = 0;
+ RECT border;
+ int allbord = 0;
+ if (pcli->hwndContactList == NULL) return 0;
+ lockfrm();
+
+ // search for alClient frame and get the titlebar's height
+ tbh = 0;
+ clientfrm = CLUIFramesGetalClientFrame();
+ if (clientfrm != -1)
+ tbh = TitleBarH*btoint(Frames[clientfrm].TitleBar.ShowTitleBar);
+
+ for (i = 0; i < nFramescount; i++) {
+ if ((Frames[i].align != alClient)&&(Frames[i].visible)&&(!Frames[i].needhide)&&(!Frames[i].floating)) {
+ RECT wsize;
+
+ GetWindowRect(Frames[i].hWnd,&wsize);
+ sumheight += (wsize.bottom-wsize.top)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+3;
+ }
+ }
+ ulockfrm();
+ GetBorderSize(pcli->hwndContactList,&border);
+ return (sumheight+border.top+border.bottom+allbord+tbh+3);
+}
+
+int CLUIFramesResize(const RECT newsize)
+{
+ int sumheight = 9999999,newheight;
+ int prevframe,prevframebottomline;
+ int tbh,curfrmtbh;
+ int drawitems;
+ int clientfrm;
+ int i,j;
+ int sepw = GapBetweenFrames;
+ SortData *sdarray;
+
+ GapBetweenTitlebar = (int)DBGetContactSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",1);
+ GapBetweenFrames = DBGetContactSettingDword(NULL,"CLUIFrames","GapBetweenFrames",1);
+ TitleBarH = DBGetContactSettingDword(NULL,"CLUIFrames","TitleBarH",DEFAULT_TITLEBAR_HEIGHT);
+
+ sepw = GapBetweenFrames;
+ if (nFramescount < 1)
+ return 0;
+
+ newheight = newsize.bottom-newsize.top;
+
+ // search for alClient frame and get the titlebar's height
+ tbh = 0;
+ clientfrm = CLUIFramesGetalClientFrame();
+ if (clientfrm != -1)
+ tbh = (TitleBarH+GapBetweenTitlebar)*btoint(Frames[clientfrm].TitleBar.ShowTitleBar);
+
+ for (i = 0; i < nFramescount; i++) {
+ if (!Frames[i].floating) {
+ Frames[i].needhide = FALSE;
+ Frames[i].wndSize.left = 0;
+ Frames[i].wndSize.right = newsize.right-0;
+ }
+ }
+
+ //sorting stuff
+ sdarray = (SortData*)malloc(sizeof(SortData)*nFramescount);
+ if (sdarray == NULL){return(-1);}
+ for (i = 0;i<nFramescount;i++) {
+ sdarray[i].order = Frames[i].order;
+ sdarray[i].realpos = i;
+ }
+ qsort(sdarray,nFramescount,sizeof(SortData),sortfunc);
+
+ drawitems = nFramescount;
+
+ while(sumheight>(newheight-tbh)&&drawitems>0) {
+ sumheight = 0;
+ drawitems = 0;
+ for (i = 0;i<nFramescount;i++) {
+ if (((Frames[i].align != alClient))&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) {
+ drawitems++;
+ curfrmtbh = (TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar);
+ sumheight += (Frames[i].height)+curfrmtbh+sepw+(Frames[i].UseBorder?2:0);
+ if (sumheight>newheight-tbh) {
+ sumheight -= (Frames[i].height)+curfrmtbh+sepw;
+ Frames[i].needhide = TRUE;
+ drawitems--;
+ break;
+ }
+ }
+ }
+ }
+
+ prevframe = -1;
+ prevframebottomline = 0;
+ for (j = 0;j<nFramescount;j++) {
+ //move all alTop frames
+ i = sdarray[j].realpos;
+ if ((!Frames[i].needhide)&&(!Frames[i].floating)&&(Frames[i].visible)&&(Frames[i].align == alTop)) {
+ curfrmtbh = (TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar);
+ Frames[i].wndSize.top = prevframebottomline+sepw+(curfrmtbh);
+ Frames[i].wndSize.bottom = Frames[i].height+Frames[i].wndSize.top+(Frames[i].UseBorder?2:0);
+ Frames[i].prevvisframe = prevframe;
+ prevframe = i;
+ prevframebottomline = Frames[i].wndSize.bottom;
+ if (prevframebottomline>newheight){
+ //prevframebottomline -= Frames[i].height+(curfrmtbh+1);
+ //Frames[i].needhide = TRUE;
+ }
+ }
+ }
+
+ if (sumheight<newheight) {
+ for (j = 0;j<nFramescount;j++) {
+ //move alClient frame
+ i = sdarray[j].realpos;
+ if ((!Frames[i].needhide)&&(!Frames[i].floating)&&(Frames[i].visible)&&(Frames[i].align == alClient)) {
+ int oldh;
+ Frames[i].wndSize.top = prevframebottomline+sepw+(tbh);
+ Frames[i].wndSize.bottom = Frames[i].wndSize.top+newheight-sumheight-tbh-sepw;
+
+ oldh = Frames[i].height;
+ Frames[i].height = Frames[i].wndSize.bottom-Frames[i].wndSize.top;
+ Frames[i].prevvisframe = prevframe;
+ prevframe = i;
+ prevframebottomline = Frames[i].wndSize.bottom;
+ if (prevframebottomline>newheight) {
+ //prevframebottomline -= Frames[i].height+(tbh+1);
+ //Frames[i].needhide = TRUE;
+ }
+ break;
+ }
+ }
+ }
+
+ //newheight
+ prevframebottomline = newheight+sepw;
+ //prevframe = -1;
+ for (j = nFramescount-1;j>=0;j--) {
+ //move all alBottom frames
+ i = sdarray[j].realpos;
+ if ((Frames[i].visible)&&(!Frames[i].floating)&&(!Frames[i].needhide)&&(Frames[i].align == alBottom)) {
+ curfrmtbh = (TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar);
+
+ Frames[i].wndSize.bottom = prevframebottomline-sepw;
+ Frames[i].wndSize.top = Frames[i].wndSize.bottom-Frames[i].height-(Frames[i].UseBorder?2:0);
+ Frames[i].prevvisframe = prevframe;
+ prevframe = i;
+ prevframebottomline = Frames[i].wndSize.top/*-1*/-curfrmtbh;
+ if (prevframebottomline>newheight) {
+
+ }
+ }
+ }
+
+ if (sdarray != NULL) {
+ free(sdarray);
+ sdarray = NULL;
+ }
+
+ for (i = 0;i<nFramescount;i++) {
+ if (Frames[i].floating)
+ CLUIFrameResizeFloatingFrame(i);
+ else
+ CLUIFrameMoveResize(&Frames[i]);
+ }
+ return 0;
+}
+
+INT_PTR CLUIFramesUpdateFrame(WPARAM wParam,LPARAM lParam)
+{
+ if (FramesSysNotStarted) return -1;
+ if (wParam == -1) { CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); return 0;}
+ if (lParam&FU_FMPOS) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,1);
+ lockfrm();
+ wParam = id2pos(wParam);
+ if (wParam<0||(int)wParam>=nFramescount) { ulockfrm(); return -1;}
+ if (lParam&FU_TBREDRAW) CLUIFramesForceUpdateTB(&Frames[wParam]);
+ if (lParam&FU_FMREDRAW) CLUIFramesForceUpdateFrame(&Frames[wParam]);
+ //if () {}
+ ulockfrm();
+
+ return 0;
+}
+
+int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam)
+{
+ RECT nRect,rcStatus;
+ int tick,i;
+
+ if (FramesSysNotStarted) return -1;
+ lockfrm();
+
+ GetClientRect(pcli->hwndContactList,&nRect);
+
+ rcStatus.top = rcStatus.bottom = 0;
+
+ nRect.bottom -= nRect.top;
+ nRect.bottom -= (rcStatus.bottom-rcStatus.top);
+ nRect.right -= nRect.left;
+ nRect.left = 0;
+ nRect.top = 0;
+ ContactListHeight = nRect.bottom;
+
+ tick = GetTickCount();
+
+ CLUIFramesResize(nRect);
+
+ for (i = 0; i < nFramescount; i++) {
+ CLUIFramesForceUpdateFrame(&Frames[i]);
+ CLUIFramesForceUpdateTB(&Frames[i]);
+ }
+
+ //resizing = FALSE;
+ ulockfrm();
+ tick = GetTickCount()-tick;
+
+ if (pcli->hwndContactList != 0) InvalidateRect(pcli->hwndContactList,NULL,TRUE);
+ if (pcli->hwndContactList != 0) UpdateWindow(pcli->hwndContactList);
+
+ Sleep(0);
+
+ //dont save to database too many times
+ if (GetTickCount() - LastStoreTick > 1000) {
+ CLUIFramesStoreAllFrames();
+ LastStoreTick = GetTickCount();
+ }
+ return 0;
+}
+
+static HBITMAP hBmpBackground;
+static int backgroundBmpUse;
+static COLORREF bkColour;
+static COLORREF SelBkColour;
+boolean AlignCOLLIconToLeft; //will hide frame icon
+
+int OnFrameTitleBarBackgroundChange(WPARAM wParam,LPARAM lParam)
+{
+ DBVARIANT dbv;
+
+ AlignCOLLIconToLeft = DBGetContactSettingByte(NULL,"FrameTitleBar","AlignCOLLIconToLeft",0);
+
+ bkColour = DBGetContactSettingDword(NULL,"FrameTitleBar","BkColour",CLCDEFAULT_BKCOLOUR);
+ //SelBkColour = DBGetContactSettingDword(NULL,"FrameTitleBar","SelBkColour",0);
+
+ if (hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground = NULL;}
+ if (DBGetContactSettingByte(NULL,"FrameTitleBar","UseBitmap",CLCDEFAULT_USEBITMAP)) {
+ if (!DBGetContactSetting(NULL,"FrameTitleBar","BkBitmap",&dbv)) {
+ hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ }
+ }
+ backgroundBmpUse = DBGetContactSettingWord(NULL,"FrameTitleBar","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+
+ CLUIFramesOnClistResize(0,0);
+ return 0;
+}
+
+void DrawBackGroundTTB(HWND hwnd,HDC mhdc)
+{
+ HDC hdcMem,hdc;
+ RECT clRect,*rcPaint;
+
+ int yScroll = 0;
+ int y;
+ PAINTSTRUCT paintst = {0};
+ HBITMAP hBmpOsb,hOldBmp;
+ DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE);
+ int grey = 0;
+ HFONT oFont;
+ HBRUSH hBrushAlternateGrey = NULL;
+
+ HFONT hFont;
+
+ //InvalidateRect(hwnd,0,FALSE);
+
+ hFont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+
+ if (mhdc) {
+ hdc = mhdc;
+ rcPaint = NULL;
+ }
+ else {
+ hdc = BeginPaint(hwnd,&paintst);
+ rcPaint = &(paintst.rcPaint);
+ }
+
+ GetClientRect(hwnd,&clRect);
+ if (rcPaint == NULL) rcPaint = &clRect;
+ if (rcPaint->right-rcPaint->left == 0||rcPaint->top-rcPaint->bottom == 0) rcPaint = &clRect;
+ y = -yScroll;
+ hdcMem = CreateCompatibleDC(hdc);
+ hBmpOsb = CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL);
+ hOldBmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb);
+ oFont = (HFONT)SelectObject(hdcMem,hFont);
+ SetBkMode(hdcMem,TRANSPARENT);
+ {
+ HBRUSH hBrush = CreateSolidBrush(bkColour);
+ HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem,hBrush);
+ FillRect(hdcMem,rcPaint,hBrush);
+ SelectObject(hdcMem,hoBrush);
+ DeleteObject(hBrush);
+ if (hBmpBackground) {
+ BITMAP bmp;
+ HDC hdcBmp;
+ int x,y;
+ int maxx,maxy;
+ int destw,desth;
+
+ GetObject(hBmpBackground,sizeof(bmp),&bmp);
+ hdcBmp = CreateCompatibleDC(hdcMem);
+ SelectObject(hdcBmp,hBmpBackground);
+ y = backgroundBmpUse&CLBF_SCROLL?-yScroll:0;
+ maxx = backgroundBmpUse&CLBF_TILEH?clRect.right:1;
+ maxy = backgroundBmpUse&CLBF_TILEV?maxy = rcPaint->bottom:y+1;
+ switch(backgroundBmpUse&CLBM_TYPE) {
+ case CLB_STRETCH:
+ if (backgroundBmpUse&CLBF_PROPORTIONAL) {
+ if (clRect.right*bmp.bmHeight<clRect.bottom*bmp.bmWidth) {
+ desth = clRect.bottom;
+ destw = desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw = clRect.right;
+ desth = destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ }
+ else {
+ destw = clRect.right;
+ desth = clRect.bottom;
+ }
+ break;
+ case CLB_STRETCHH:
+ if (backgroundBmpUse&CLBF_PROPORTIONAL) {
+ destw = clRect.right;
+ desth = destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ else {
+ destw = clRect.right;
+ desth = bmp.bmHeight;
+ }
+ break;
+ case CLB_STRETCHV:
+ if (backgroundBmpUse&CLBF_PROPORTIONAL) {
+ desth = clRect.bottom;
+ destw = desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw = bmp.bmWidth;
+ desth = clRect.bottom;
+ }
+ break;
+ default: //clb_topleft
+ destw = bmp.bmWidth;
+ desth = bmp.bmHeight;
+ break;
+ }
+ desth = clRect.bottom -clRect.top;
+ for (;y<maxy;y += desth) {
+ if (y<rcPaint->top-desth) continue;
+ for (x = 0;x<maxx;x += destw)
+ StretchBlt(hdcMem,x,y,destw,desth,hdcBmp,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
+ }
+ DeleteDC(hdcBmp);
+ }
+ }
+
+ BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY);
+
+ SelectObject(hdcMem,hOldBmp);
+ SelectObject(hdcMem,oFont);
+ DeleteObject(hBmpOsb);
+ DeleteDC(hdcMem);
+ paintst.fErase = FALSE;
+ //DeleteObject(hFont);
+ if (!mhdc)
+ EndPaint(hwnd,&paintst);
+}
+
+static int DrawTitleBar(HDC dc,RECT rect,int Frameid)
+{
+ HDC paintDC = dc;
+
+ HDC hdcMem = CreateCompatibleDC(paintDC);
+ HBITMAP hBmpOsb = CreateBitmap(rect.right,rect.bottom,1,GetDeviceCaps(paintDC,BITSPIXEL),NULL);
+ HBITMAP hoBmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb);
+
+ HFONT hoTTBFont = (HFONT)SelectObject(hdcMem,TitleBarFont);
+ SetBkMode(hdcMem,TRANSPARENT);
+
+ HBRUSH hBack = GetSysColorBrush(COLOR_3DFACE);
+ HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem,hBack);
+
+ lockfrm();
+
+ int pos = id2pos(Frameid);
+ if (pos >= 0 && pos < nFramescount) {
+ GetClientRect(Frames[pos].TitleBar.hwnd,&Frames[pos].TitleBar.wndSize);
+
+ //set font charset
+ HFONT hf = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+ if (TitleBarLogFont.lfHeight != 0)
+ hf = CreateFontIndirectA(&TitleBarLogFont);
+
+ HFONT oFont = (HFONT)SelectObject(hdcMem,hf);
+
+ DrawBackGroundTTB(Frames[pos].TitleBar.hwnd,hdcMem);
+ //hFront = CreateSolidPe (SelBkColour);
+ //SelectObject(hdcMem,hFront);
+ SelBkColour = DBGetContactSettingDword(NULL,"CLUIFrames","FramesTitleBarFontCol",0);
+ if (SelBkColour) SetTextColor(hdcMem,SelBkColour);
+
+ if (!AlignCOLLIconToLeft) {
+
+ if (Frames[pos].TitleBar.hicon != NULL) {
+ //(TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)
+ DrawIconEx(hdcMem,2,((TitleBarH>>1)-(GetSystemMetrics(SM_CYSMICON)>>1)),Frames[pos].TitleBar.hicon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ TextOut(hdcMem,GetSystemMetrics(SM_CYSMICON)+4,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname));
+ }
+ else
+ TextOut(hdcMem,2,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname));
+ }
+ else
+ TextOut(hdcMem,GetSystemMetrics(SM_CXSMICON)+2,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname));
+
+ if (!AlignCOLLIconToLeft)
+ DrawIconEx(hdcMem,Frames[pos].TitleBar.wndSize.right-GetSystemMetrics(SM_CXSMICON)-2,((TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),Frames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ else
+ DrawIconEx(hdcMem,0,((TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),Frames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+
+ DeleteObject(hf);
+ SelectObject(hdcMem,oFont);
+ }
+ ulockfrm();
+
+ BitBlt(paintDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,hdcMem,rect.left,rect.top,SRCCOPY);
+
+ SelectObject(hdcMem,hoBmp);
+ SelectObject(hdcMem,hoBrush);
+ SelectObject(hdcMem,hoTTBFont);
+ DeleteDC(hdcMem);
+ DeleteObject(hBack);
+ DeleteObject(hBmpOsb);
+ return 0;
+}
+
+//for old multiwindow
+#define MPCF_CONTEXTFRAMEMENU 3
+POINT ptOld;
+short nLeft = 0;
+short nTop = 0;
+
+LRESULT CALLBACK CLUIFrameTitleBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ RECT rect;
+ int Frameid,Framemod,direction;
+ int xpos,ypos;
+
+ Frameid = (GetWindowLongPtr(hwnd,GWLP_USERDATA));
+ memset(&rect,0,sizeof(rect));
+
+ switch(msg) {
+ case WM_CREATE:
+ SendMessage(hwnd,WM_SETFONT,(WPARAM)TitleBarFont,0);
+ return FALSE;
+
+ case WM_MEASUREITEM:
+ return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam);
+
+ case WM_DRAWITEM:
+ return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam);
+
+ case WM_ENABLE:
+ if (hwnd != 0) InvalidateRect(hwnd,NULL,FALSE);
+ return 0;
+
+ case WM_COMMAND:
+ if ( ServiceExists(MO_CREATENEWMENUOBJECT)) {
+ if (ProcessCommandProxy(MAKEWPARAM(LOWORD(wParam),0),(LPARAM)Frameid)) break;
+ }
+ else if ( CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam),MPCF_CONTEXTFRAMEMENU),(LPARAM)Frameid))
+ break;
+
+ if (HIWORD(wParam) == 0) {//mouse events for self created menu
+ int framepos = id2pos(Frameid);
+ if (framepos == -1)
+ break;
+
+ switch(LOWORD(wParam)) {
+ case frame_menu_lock:
+ Frames[framepos].Locked = !Frames[framepos].Locked;
+ break;
+ case frame_menu_visible:
+ Frames[framepos].visible = !Frames[framepos].visible;
+ break;
+ case frame_menu_showtitlebar:
+ Frames[framepos].TitleBar.ShowTitleBar = !Frames[framepos].TitleBar.ShowTitleBar;
+ break;
+ case frame_menu_floating:
+ CLUIFrameSetFloat(Frameid,0);
+ break;
+ }
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ }
+ break;
+
+ case WM_RBUTTONDOWN:
+ {
+ HMENU hmenu;
+ POINT pt;
+ GetCursorPos(&pt);
+
+ if (ServiceExists(MS_CLIST_MENUBUILDFRAMECONTEXT))
+ hmenu = (HMENU)CallService(MS_CLIST_MENUBUILDFRAMECONTEXT,Frameid,0);
+ else {
+ //legacy menu support
+ int framepos = id2pos(Frameid);
+ lockfrm();
+ if (framepos == -1){ulockfrm();break;}
+ hmenu = CreatePopupMenu();
+
+ AppendMenu(hmenu,MF_STRING|MF_DISABLED|MF_GRAYED,15,Frames[framepos].name);
+ AppendMenu(hmenu,MF_SEPARATOR,16,_T(""));
+
+ if (Frames[framepos].Locked)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_lock,TranslateT("Lock Frame"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_lock,TranslateT("Lock Frame"));}
+
+ if (Frames[framepos].visible)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_visible,TranslateT("Visible"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_visible,TranslateT("Visible"));}
+
+ if (Frames[framepos].TitleBar.ShowTitleBar)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_showtitlebar,TranslateT("Show TitleBar"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_showtitlebar,TranslateT("Show TitleBar"));}
+
+ if (Frames[framepos].floating)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_floating,TranslateT("Floating"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_floating,TranslateT("Floating"));}
+
+ ulockfrm();
+ }
+
+ TrackPopupMenu(hmenu,TPM_LEFTALIGN,pt.x,pt.y,0,hwnd,0);
+ DestroyMenu(hmenu);
+ }
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ Framemod = -1;
+ lbypos = -1;oldframeheight = -1;ReleaseCapture();
+ CallService(MS_CLIST_FRAMES_UCOLLFRAME,Frameid,0);
+ lbypos = -1;oldframeheight = -1;ReleaseCapture();
+ break;
+
+ case WM_LBUTTONUP:
+ if (GetCapture() != hwnd)
+ break;
+ curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture();
+ break;
+
+ case WM_LBUTTONDOWN:
+ {
+ int framepos = id2pos(Frameid);
+ if (framepos == -1)
+ break;
+
+ lockfrm();
+ if (Frames[framepos].floating)
+ {
+ POINT pt;
+ GetCursorPos(&pt);
+ Frames[framepos].TitleBar.oldpos = pt;
+ }
+
+ if (( !(wParam & MK_CONTROL)) && Frames[framepos].Locked && (!(Frames[framepos].floating))) {
+ if (DBGetContactSettingByte(NULL,"CLUI","ClientAreaDrag",0)) {
+ POINT pt;
+ //pt = nm->pt;
+ GetCursorPos(&pt);
+ return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y));
+ }
+ }
+
+ if (Frames[framepos].floating) {
+ RECT rc;
+ GetCursorPos(&ptOld);
+ //ClientToScreen(hwnd,&ptOld);
+ GetWindowRect( hwnd, &rc );
+
+ nLeft = (short)rc.left;
+ nTop = (short)rc.top;
+ }
+ ulockfrm();
+ SetCapture(hwnd);
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ {
+ POINT pt,pt2;
+ RECT wndr;
+ int pos;
+
+ char TBcapt[255];
+
+ lockfrm();
+ pos = id2pos(Frameid);
+
+ if (pos != -1) {
+ int oldflags;
+ wsprintfA(TBcapt,"%s - h:%d, vis:%d, fl:%d, fl:(%d,%d,%d,%d),or: %d",
+ Frames[pos].name,Frames[pos].height,Frames[pos].visible,Frames[pos].floating,
+ Frames[pos].FloatingPos.x,Frames[pos].FloatingPos.y,
+ Frames[pos].FloatingSize.x,Frames[pos].FloatingSize.y,
+ Frames[pos].order);
+
+ oldflags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,Frames[pos].id),(LPARAM)0);
+ if ( !(oldflags & F_SHOWTBTIP))
+ oldflags |= F_SHOWTBTIP;
+ }
+
+ ulockfrm();
+
+ if (wParam & MK_LBUTTON) {
+ RECT rcMiranda;
+ RECT rcwnd,rcOverlap;
+ POINT newpt,ofspt,curpt,newpos;
+ //if (GetCapture() != hwnd){break;}
+ //curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture();
+ lockfrm();
+ pos = id2pos(Frameid);
+ if (Frames[pos].floating) {
+
+ GetCursorPos(&curpt);
+ rcwnd.bottom = curpt.y+5;
+ rcwnd.top = curpt.y;
+ rcwnd.left = curpt.x;
+ rcwnd.right = curpt.x+5;
+
+ GetWindowRect(pcli->hwndContactList, &rcMiranda );
+ //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd );
+ //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )
+ if (IsWindowVisible(pcli->hwndContactList) &&IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )) {
+ int id = Frames[pos].id;
+ ulockfrm();
+
+ ofspt.x = 0;ofspt.y = 0;
+ ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt);
+ ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y;
+
+ CLUIFrameSetFloat(id,0);
+ newpt.x = 0;newpt.y = 0;
+ ClientToScreen(Frames[pos].TitleBar.hwnd,&newpt);
+ SetCursorPos(newpt.x+ofspt.x,newpt.y+ofspt.y);
+ GetCursorPos(&curpt);
+ lockfrm();
+ Frames[pos].TitleBar.oldpos = curpt;
+ ulockfrm();
+ return 0;
+ }
+ }
+ else {
+ int id = Frames[pos].id;
+
+ GetCursorPos(&curpt);
+ rcwnd.bottom = curpt.y+5;
+ rcwnd.top = curpt.y;
+ rcwnd.left = curpt.x;
+ rcwnd.right = curpt.x+5;
+
+ GetWindowRect(pcli->hwndContactList, &rcMiranda );
+
+ if (!IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )) {
+ ulockfrm();
+ GetCursorPos(&curpt);
+ GetWindowRect( Frames[pos].hWnd, &rcwnd );
+ rcwnd.left = rcwnd.right-rcwnd.left;
+ rcwnd.top = rcwnd.bottom-rcwnd.top;
+ newpos.x = curpt.x;newpos.y = curpt.y;
+ if (curpt.x>=(rcMiranda.right-1)){newpos.x = curpt.x+5;}
+ if (curpt.x<=(rcMiranda.left+1)){newpos.x = curpt.x-(rcwnd.left)-5;}
+
+ if (curpt.y>=(rcMiranda.bottom-1)){newpos.y = curpt.y+5;}
+ if (curpt.y<=(rcMiranda.top+1)){newpos.y = curpt.y-(rcwnd.top)-5;}
+
+
+ ofspt.x = 0;ofspt.y = 0;
+ //ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt);
+ GetWindowRect(Frames[pos].TitleBar.hwnd,&rcwnd);
+ ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y;
+
+ Frames[pos].FloatingPos.x = newpos.x;
+ Frames[pos].FloatingPos.y = newpos.y;
+ CLUIFrameSetFloat(id,0);
+ //SetWindowPos(Frames[pos].ContainerWnd,0,newpos.x,newpos.y,0,0,SWP_NOSIZE);
+
+ lockfrm();
+ newpt.x = 0;newpt.y = 0;
+ ClientToScreen(Frames[pos].TitleBar.hwnd,&newpt);
+
+ GetWindowRect( Frames[pos].hWnd, &rcwnd );
+ SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2);
+ GetCursorPos(&curpt);
+
+ Frames[pos].TitleBar.oldpos = curpt;
+ ulockfrm();
+
+ return 0;
+ }
+ }
+ ulockfrm();
+ }
+
+ if (wParam & MK_LBUTTON) {
+ int newh = -1,prevold;
+
+ if (GetCapture() != hwnd){break;}
+
+ lockfrm();
+ pos = id2pos(Frameid);
+
+ if (Frames[pos].floating) {
+ GetCursorPos(&pt);
+ if ((Frames[pos].TitleBar.oldpos.x != pt.x)||(Frames[pos].TitleBar.oldpos.y != pt.y)) {
+
+ pt2 = pt;
+ ScreenToClient(hwnd,&pt2);
+ GetWindowRect(Frames[pos].ContainerWnd,&wndr);
+
+ int dX,dY;
+ POINT ptNew;
+
+ ptNew.x = pt.x;
+ ptNew.y = pt.y;
+ //ClientToScreen( hwnd, &ptNew );
+
+ dX = ptNew.x - ptOld.x;
+ dY = ptNew.y - ptOld.y;
+
+ nLeft += (short)dX;
+ nTop += (short)dY;
+
+ if ( !(wParam & MK_CONTROL))
+ PositionThumb( &Frames[pos], nLeft, nTop );
+ else
+ SetWindowPos( Frames[pos].ContainerWnd,
+ HWND_TOPMOST,
+ nLeft,
+ nTop,
+ 0,
+ 0,
+ SWP_NOSIZE | SWP_NOZORDER );
+
+ ptOld = ptNew;
+
+ pt.x = nLeft;
+ pt.y = nTop;
+ Frames[pos].TitleBar.oldpos = pt;
+ }
+
+ ulockfrm();
+ return 0;
+ }
+
+ if (Frames[pos].prevvisframe != -1) {
+ GetCursorPos(&pt);
+
+ if ((Frames[pos].TitleBar.oldpos.x == pt.x)&&(Frames[pos].TitleBar.oldpos.y == pt.y)) {
+ ulockfrm();
+ break;
+ }
+
+ ypos = rect.top+pt.y;xpos = rect.left+pt.x;
+ Framemod = -1;
+
+ if (Frames[pos].align == alBottom) {
+ direction = -1;
+ Framemod = pos;
+ }
+ else {
+ direction = 1;
+ Framemod = Frames[pos].prevvisframe;
+ }
+ if (Frames[Framemod].Locked) {ulockfrm();break;}
+ if (curdragbar != -1&&curdragbar != pos) {ulockfrm();break;}
+
+ if (lbypos == -1) {
+ curdragbar = pos;
+ lbypos = ypos;
+ oldframeheight = Frames[Framemod].height;
+ SetCapture(hwnd);
+ {ulockfrm();break;}
+ }
+
+ newh = oldframeheight+direction*(ypos-lbypos);
+ if (newh > 0) {
+ prevold = Frames[Framemod].height;
+ Frames[Framemod].height = newh;
+ if (!CLUIFramesFitInSize()) {
+ Frames[Framemod].height = prevold;
+ ulockfrm();
+ return TRUE;
+ }
+ Frames[Framemod].height = newh;
+ if (newh > 3)
+ Frames[Framemod].collapsed = TRUE;
+ }
+ Frames[pos].TitleBar.oldpos = pt;
+ }
+ ulockfrm();
+ if (newh > 0)
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList, 0);
+ break;
+ }
+ curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture();
+ }
+ break;
+
+ case WM_PRINTCLIENT:
+ if (lParam & PRF_CLIENT) {
+ GetClientRect(hwnd,&rect);
+ DrawTitleBar((HDC)wParam,rect,Frameid);
+ }
+
+ case WM_PAINT:
+ {
+ HDC paintDC;
+ PAINTSTRUCT paintStruct;
+
+ //GetClientRect(hwnd,&rect);
+ paintDC = BeginPaint(hwnd, &paintStruct);
+ rect = paintStruct.rcPaint;
+ DrawTitleBar(paintDC,rect,Frameid);
+ EndPaint(hwnd, &paintStruct);
+ }
+ return 0;
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+ return TRUE;
+}
+
+int CLUIFrameResizeFloatingFrame(int framepos)
+{
+ int width,height;
+ RECT rect;
+
+ if (!Frames[framepos].floating){return 0;}
+ if (Frames[framepos].ContainerWnd == 0){return 0;}
+ GetClientRect(Frames[framepos].ContainerWnd,&rect);
+
+ width = rect.right-rect.left;
+ height = rect.bottom-rect.top;
+
+ Frames[framepos].visible?ShowWindow(Frames[framepos].ContainerWnd,SW_SHOW):ShowWindow(Frames[framepos].ContainerWnd,SW_HIDE);
+
+ if (Frames[framepos].TitleBar.ShowTitleBar) {
+ ShowWindow(Frames[framepos].TitleBar.hwnd,SW_SHOW);
+ Frames[framepos].height = height-DEFAULT_TITLEBAR_HEIGHT;
+
+ SetWindowPos(Frames[framepos].TitleBar.hwnd,HWND_TOP,0,0,width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_DRAWFRAME);
+ SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,DEFAULT_TITLEBAR_HEIGHT,width,height-DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW);
+ }
+ else {
+ Frames[framepos].height = height;
+ ShowWindow(Frames[framepos].TitleBar.hwnd,SW_HIDE);
+ SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,0,width,height,SWP_SHOWWINDOW);
+ }
+
+ if (Frames[framepos].ContainerWnd != 0)
+ UpdateWindow(Frames[framepos].ContainerWnd);
+
+ GetWindowRect(Frames[framepos].hWnd,&Frames[framepos].wndSize);
+ return 0;
+}
+
+static int CLUIFrameOnMainMenuBuild(WPARAM wParam,LPARAM lParam)
+{
+ CLUIFramesLoadMainMenu();
+ return 0;
+}
+
+LRESULT CALLBACK CLUIFrameContainerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ RECT rect = { 0 };
+ int Frameid = (GetWindowLongPtr(hwnd,GWLP_USERDATA));
+
+ switch(msg) {
+ case WM_CREATE:
+ {
+ lockfrm();
+ int framepos = id2pos(Frameid);
+ ulockfrm();
+ }
+ return 0;
+
+ case WM_GETMINMAXINFO:
+ {
+ int framepos;
+ MINMAXINFO minmax;
+
+ lockfrm();
+ framepos = id2pos(Frameid);
+ if (framepos<0||framepos>=nFramescount){ulockfrm();break;}
+ if (!Frames[framepos].minmaxenabled){ulockfrm();break;}
+ if (Frames[framepos].ContainerWnd == 0){ulockfrm();break;}
+
+ if (Frames[framepos].Locked) {
+ RECT rct;
+
+ GetWindowRect(hwnd,&rct);
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = rct.right-rct.left;
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = rct.bottom-rct.top;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = rct.right-rct.left;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = rct.bottom-rct.top;
+ }
+
+ memset(&minmax,0,sizeof(minmax));
+ if (SendMessage(Frames[framepos].hWnd,WM_GETMINMAXINFO,(WPARAM)0,(LPARAM)&minmax) == 0) {
+ RECT border;
+ int tbh = TitleBarH*btoint(Frames[framepos].TitleBar.ShowTitleBar);
+ GetBorderSize(hwnd,&border);
+ if (minmax.ptMaxTrackSize.x != 0&&minmax.ptMaxTrackSize.y != 0){
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = minmax.ptMinTrackSize.x;
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = minmax.ptMinTrackSize.y;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = minmax.ptMaxTrackSize.x+border.left+border.right;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = minmax.ptMaxTrackSize.y+tbh+border.top+border.bottom;
+ }
+ }
+ else {
+ ulockfrm();
+ return(DefWindowProc(hwnd, msg, wParam, lParam));
+ }
+
+ ulockfrm();
+ }
+
+ case WM_MOVE:
+ {
+ lockfrm();
+ int framepos = id2pos(Frameid);
+
+ if (framepos<0||framepos>=nFramescount){ulockfrm();break;}
+ if (Frames[framepos].ContainerWnd == 0){ulockfrm();return 0;}
+
+ RECT rect;
+ GetWindowRect(Frames[framepos].ContainerWnd,&rect);
+ Frames[framepos].FloatingPos.x = rect.left;
+ Frames[framepos].FloatingPos.y = rect.top;
+ Frames[framepos].FloatingSize.x = rect.right-rect.left;
+ Frames[framepos].FloatingSize.y = rect.bottom-rect.top;
+
+ CLUIFramesStoreFrameSettings(framepos);
+ ulockfrm();
+ }
+ return 0;
+
+ case WM_SIZE:
+ {
+ lockfrm();
+ int framepos = id2pos(Frameid);
+
+ if (framepos<0||framepos>=nFramescount){ulockfrm();break;}
+ if (Frames[framepos].ContainerWnd == 0){ulockfrm();return 0;}
+ CLUIFrameResizeFloatingFrame(framepos);
+
+ RECT rect;
+ GetWindowRect(Frames[framepos].ContainerWnd,&rect);
+ Frames[framepos].FloatingPos.x = rect.left;
+ Frames[framepos].FloatingPos.y = rect.top;
+ Frames[framepos].FloatingSize.x = rect.right-rect.left;
+ Frames[framepos].FloatingSize.y = rect.bottom-rect.top;
+
+ CLUIFramesStoreFrameSettings(framepos);
+ ulockfrm();
+ }
+ return 0;
+
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ break;
+
+ case WM_DESTROY:
+ return 0;
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+static HWND CreateContainerWindow(HWND parent,int x,int y,int width,int height)
+{
+ return(CreateWindowA("FramesContainer","aaaa",WS_POPUP|WS_THICKFRAME,x,y,width,height,parent,0,g_hInst,0));
+}
+
+INT_PTR CLUIFrameSetFloat(WPARAM wParam,LPARAM lParam)
+{
+ HWND hwndtmp, hwndtooltiptmp;
+ wndFrame *frame;
+ int pos;
+
+ lockfrm();
+
+ pos = id2pos(wParam);
+ if (pos < 0 || pos > nFramescount) {
+ ulockfrm();
+ return 0;
+ }
+
+ frame = &Frames[pos];
+
+ //parent = GetParent(Frames[wParam].hWnd);
+ if (frame->floating) {
+ SetParent(frame->hWnd,pcli->hwndContactList);
+ SetParent(frame->TitleBar.hwnd,pcli->hwndContactList);
+ frame->floating = FALSE;
+ DestroyWindow(frame->ContainerWnd);
+ frame->ContainerWnd = NULL;
+ }
+ else {
+ RECT recttb,rectw,border;
+ int temp;
+ int neww,newh;
+ BOOLEAN locked;
+
+ frame->oldstyles = GetWindowLongPtr(frame->hWnd,GWL_STYLE);
+ frame->TitleBar.oldstyles = GetWindowLongPtr(frame->TitleBar.hwnd,GWL_STYLE);
+ locked = frame->Locked;
+ frame->Locked = FALSE;
+ frame->minmaxenabled = FALSE;
+
+ GetWindowRect(frame->hWnd,&rectw);
+ GetWindowRect(frame->TitleBar.hwnd,&recttb);
+ if (!frame->TitleBar.ShowTitleBar)
+ recttb.top = recttb.bottom = recttb.left = recttb.right = 0;
+
+ frame->ContainerWnd = CreateContainerWindow(pcli->hwndContactList,frame->FloatingPos.x,frame->FloatingPos.y,10,10);
+
+ SetParent(frame->hWnd,frame->ContainerWnd);
+ SetParent(frame->TitleBar.hwnd,frame->ContainerWnd);
+
+ GetBorderSize(frame->ContainerWnd,&border);
+
+ SetWindowLongPtr(frame->ContainerWnd, GWLP_USERDATA, frame->id);
+ if ((lParam == 1)) {
+ if ((frame->FloatingPos.x != 0)&&(frame->FloatingPos.y != 0)) {
+ if (frame->FloatingPos.x<20){frame->FloatingPos.x = 40;}
+ if (frame->FloatingPos.y<20){frame->FloatingPos.y = 40;}
+
+ SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,frame->FloatingPos.x,frame->FloatingPos.y,frame->FloatingSize.x,frame->FloatingSize.y,SWP_HIDEWINDOW);
+ }
+ else SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,120,120,140,140,SWP_HIDEWINDOW);
+ }
+ else {
+ neww = rectw.right-rectw.left+border.left+border.right;
+ newh = (rectw.bottom-rectw.top)+(recttb.bottom-recttb.top)+border.top+border.bottom;
+ if (neww<20){neww = 40;}
+ if (newh<20){newh = 40;}
+ if (frame->FloatingPos.x<20){frame->FloatingPos.x = 40;}
+ if (frame->FloatingPos.y<20){frame->FloatingPos.y = 40;}
+
+ SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,frame->FloatingPos.x,frame->FloatingPos.y,neww,newh,SWP_HIDEWINDOW);
+ }
+
+ SetWindowText(frame->ContainerWnd,frame->TitleBar.tbname);
+
+ temp = GetWindowLongPtr(frame->ContainerWnd,GWL_EXSTYLE);
+ temp |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST ;
+ SetWindowLongPtr(frame->ContainerWnd,GWL_EXSTYLE,temp);
+
+ frame->floating = TRUE;
+ frame->Locked = locked;
+ }
+
+ CLUIFramesStoreFrameSettings(pos);
+ frame->minmaxenabled = TRUE;
+ hwndtooltiptmp = frame->TitleBar.hwndTip;
+
+ hwndtmp = frame->ContainerWnd;
+ ulockfrm();
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList, 0);
+ SendMessage(hwndtmp,WM_SIZE,0,0);
+
+ SetWindowPos(hwndtooltiptmp, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE );
+ return 0;
+}
+
+static int CLUIFrameOnFontChange(WPARAM wParam,LPARAM lParam)
+{
+ FontID fid = {0};
+ fid.cbSize = sizeof(fid);
+ memset(&TitleBarLogFont,0,sizeof(TitleBarLogFont));
+
+ strcpy(fid.group,LPGEN("Frames"));
+ strcpy(fid.name,LPGEN("TitleBarFont"));
+ strcpy(fid.dbSettingsGroup,"CLUIFrames");
+ strcpy(fid.prefix,"FramesTitleBarFont");
+
+ CallService(MS_FONT_GET,(WPARAM)&fid,(LPARAM)&TitleBarLogFont);
+ CLUIFramesOnClistResize(0,0);
+ return 0;
+}
+
+static void CLUIRegisterFonts()
+{
+ FontID fid = {0};
+ fid.cbSize = sizeof(fid);
+ strcpy(fid.group, LPGEN("Frames"));
+ strcpy(fid.name, LPGEN("TitleBarFont"));
+ strcpy(fid.dbSettingsGroup, "CLUIFrames");
+ strcpy(fid.prefix, "FramesTitleBarFont");
+ FontRegister(&fid);
+
+ CLUIFrameOnFontChange(0,0);
+
+ HookEvent(ME_FONT_RELOAD,CLUIFrameOnFontChange);
+}
+
+static int CLUIFrameOnModulesLoad(WPARAM wParam,LPARAM lParam)
+{
+ CLUIFramesLoadMainMenu();
+ CLUIFramesCreateMenuForFrame(-1,-1,000010000,Menu_AddContextFrameMenuItem);
+ CLUIRegisterFonts();
+ return 0;
+}
+
+static int CLUIFrameOnModulesUnload(WPARAM wParam,LPARAM lParam)
+{
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIVisible, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMITitle, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMITBVisible, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMILock, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIColl, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIFloating, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignRoot, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignTop, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignClient, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignBottom, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIBorder, 0 );
+ return 0;
+}
+
+static INT_PTR CLUIGetCapsService(WPARAM wParam,LPARAM lParam)
+{
+ switch (wParam) {
+ case CLUICAPS_FLAGS1:
+ return CLUIF_HIDEEMPTYGROUPS | CLUIF_DISABLEGROUPS | CLUIF_HASONTOPOPTION | CLUIF_HASAUTOHIDEOPTION;
+ case CLUICAPS_FLAGS2:
+ return MAKELONG(EXTRACOLUMNCOUNT,1);
+ }
+ return 0;
+}
+
+int LoadCLUIFramesModule(void)
+{
+ WNDCLASS wndclass;
+ wndclass.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW ;
+ wndclass.lpfnWndProc = CLUIFrameTitleBarProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hInstance = g_hInst;
+ wndclass.hIcon = NULL;
+ wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wndclass.hbrBackground = NULL;
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = CLUIFrameTitleBarClassName;
+ RegisterClass(&wndclass);
+
+ //container helper
+ WNDCLASS cntclass;
+ cntclass.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW|( IsWinVerXPPlus() ? CS_DROPSHADOW : 0);
+ cntclass.lpfnWndProc = CLUIFrameContainerWndProc;
+ cntclass.cbClsExtra = 0;
+ cntclass.cbWndExtra = 0;
+ cntclass.hInstance = g_hInst;
+ cntclass.hIcon = NULL;
+ cntclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ cntclass.hbrBackground = NULL;
+ cntclass.lpszMenuName = NULL;
+ cntclass.lpszClassName = _T("FramesContainer");
+ RegisterClass(&cntclass);
+ //end container helper
+
+ GapBetweenFrames = DBGetContactSettingDword(NULL,"CLUIFrames","GapBetweenFrames",1);
+
+ nFramescount = 0;
+ InitializeCriticalSection(&csFrameHook);
+ InitFramesMenus();
+
+ hHook[0] = HookEvent(ME_SYSTEM_MODULESLOADED,CLUIFrameOnModulesLoad);
+ hHook[1] = HookEvent(ME_CLIST_PREBUILDFRAMEMENU,CLUIFramesModifyContextMenuForFrame);
+ hHook[2] = HookEvent(ME_CLIST_PREBUILDMAINMENU,CLUIFrameOnMainMenuBuild);
+
+ hService[0] = CreateServiceFunction(MS_CLIST_FRAMES_ADDFRAME,CLUIFramesAddFrame);
+ hService[1] = CreateServiceFunction(MS_CLIST_FRAMES_REMOVEFRAME,CLUIFramesRemoveFrame);
+
+ hService[2] = CreateServiceFunction(MS_CLIST_FRAMES_SETFRAMEOPTIONS,CLUIFramesSetFrameOptions);
+ hService[3] = CreateServiceFunction(MS_CLIST_FRAMES_GETFRAMEOPTIONS,CLUIFramesGetFrameOptions);
+ hService[4] = CreateServiceFunction(MS_CLIST_FRAMES_UPDATEFRAME,CLUIFramesUpdateFrame);
+
+ hService[5] = CreateServiceFunction(MS_CLIST_FRAMES_SHFRAMETITLEBAR,CLUIFramesShowHideFrameTitleBar);
+ hService[6] = CreateServiceFunction(MS_CLIST_FRAMES_SHOWALLFRAMESTB,CLUIFramesShowAllTitleBars);
+ hService[7] = CreateServiceFunction(MS_CLIST_FRAMES_HIDEALLFRAMESTB,CLUIFramesHideAllTitleBars);
+ hService[8] = CreateServiceFunction(MS_CLIST_FRAMES_SHFRAME,CLUIFramesShowHideFrame);
+ hService[9] = CreateServiceFunction(MS_CLIST_FRAMES_SHOWALLFRAMES,CLUIFramesShowAll);
+
+ hService[10] = CreateServiceFunction(MS_CLIST_FRAMES_ULFRAME,CLUIFramesLockUnlockFrame);
+ hService[11] = CreateServiceFunction(MS_CLIST_FRAMES_UCOLLFRAME,CLUIFramesCollapseUnCollapseFrame);
+ hService[12] = CreateServiceFunction(MS_CLIST_FRAMES_SETUNBORDER,CLUIFramesSetUnSetBorder);
+
+ hService[13] = CreateServiceFunction(MS_CLUI_GETCAPS,CLUIGetCapsService);
+
+ hService[14] = CreateServiceFunction(CLUIFRAMESSETALIGN,CLUIFramesSetAlign);
+ hService[15] = CreateServiceFunction(CLUIFRAMESMOVEUPDOWN,CLUIFramesMoveUpDown);
+
+ hService[16] = CreateServiceFunction(CLUIFRAMESSETALIGNALTOP,CLUIFramesSetAlignalTop);
+ hService[17] = CreateServiceFunction(CLUIFRAMESSETALIGNALCLIENT,CLUIFramesSetAlignalClient);
+ hService[18] = CreateServiceFunction(CLUIFRAMESSETALIGNALBOTTOM,CLUIFramesSetAlignalBottom);
+
+ hService[19] = CreateServiceFunction("Set_Floating",CLUIFrameSetFloat);
+ hWndExplorerToolBar = FindWindowExA(0,0,"Shell_TrayWnd",NULL);
+ OnFrameTitleBarBackgroundChange(0,0);
+ FramesSysNotStarted = FALSE;
+ hHook[3] = HookEvent(ME_SYSTEM_PRESHUTDOWN, CLUIFrameOnModulesUnload);
+ return 0;
+}
+
+int UnLoadCLUIFramesModule(void)
+{
+ int i;
+ FramesSysNotStarted = TRUE;
+
+ for (i = 0; i<SIZEOF(hService); ++i)
+ DestroyServiceFunction(hService[i]);
+
+ for (i = 0; i<SIZEOF(hHook); ++i)
+ UnhookEvent(hHook[i]);
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ CLUIFramesStoreAllFrames();
+ lockfrm();
+ for (i = 0;i<nFramescount;i++) {
+ DestroyWindow(Frames[i].hWnd);
+ Frames[i].hWnd = (HWND)-1;
+ DestroyWindow(Frames[i].TitleBar.hwnd);
+ Frames[i].TitleBar.hwnd = (HWND)-1;
+ DestroyWindow(Frames[i].ContainerWnd);
+ Frames[i].ContainerWnd = (HWND)-1;
+ DestroyMenu(Frames[i].TitleBar.hmenu);
+
+ mir_free(Frames[i].name);
+ mir_free(Frames[i].TitleBar.tbname);
+ mir_free(Frames[i].TitleBar.tooltip);
+ }
+
+ if (Frames)
+ free(Frames);
+ Frames = NULL;
+ nFramescount = 0;
+ UnregisterClass(CLUIFrameTitleBarClassName,g_hInst);
+ DeleteObject(TitleBarFont);
+ ulockfrm();
+ DeleteCriticalSection(&csFrameHook);
+ return 0;
+}
diff --git a/plugins/Clist_mw/src/CLUIFrames/cluiframes.h b/plugins/Clist_mw/src/CLUIFrames/cluiframes.h
new file mode 100644
index 0000000000..6430c6655d
--- /dev/null
+++ b/plugins/Clist_mw/src/CLUIFrames/cluiframes.h
@@ -0,0 +1,44 @@
+/*
+Miranda ICQ: the free icq client for MS Windows
+Copyright (C) 2000-2 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+
+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.
+*/
+
+int LoadCLUIFramesModule(void);
+int UnLoadCLUIFramesModule(void);
+int CLUIFramesGetMinHeight();
+int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam);
+
+typedef struct tagProtocolData {
+ char *RealName;
+ int protopos;
+ boolean show;
+} ProtocolData;
+
+#define OFFSET_PROTOPOS 200
+#define OFFSET_VISIBLE 400
+
+#define CLUIFrameTitleBarClassName _T("CLUIFrameTitleBar")
+#define CLUIFrameModule "CLUIFrames"
+
+//integrated menu module
+#define MS_INT_MENUMEASUREITEM "CLUIFrames/IntMenuMeasureItem"
+#define MS_INT_MENUDRAWITEM "CLUIFrames/IntMenuDrawItem"
+#define MS_INT_MENUPROCESSCOMMAND "CLUIFrames/IntMenuProcessCommand"
+#define MS_INT_MODIFYMENUITEM "CLUIFrames/IntModifyMenuItem"
+
+
+
diff --git a/plugins/Clist_mw/src/CLUIFrames/extraimage.cpp b/plugins/Clist_mw/src/CLUIFrames/extraimage.cpp
new file mode 100644
index 0000000000..4cec640ebb
--- /dev/null
+++ b/plugins/Clist_mw/src/CLUIFrames/extraimage.cpp
@@ -0,0 +1,404 @@
+#include "../commonheaders.h"
+
+extern int DefaultImageListColorDepth;
+
+int EnabledColumnCount = 0;
+boolean visar[EXTRACOLUMNCOUNT];
+#define ExtraImageIconsIndexCount 3
+int ExtraImageIconsIndex[ExtraImageIconsIndexCount];
+
+static HANDLE hExtraImageListRebuilding,hExtraImageApplying;
+HANDLE hExtraImageClick;
+
+static HIMAGELIST hExtraImageList;
+extern HINSTANCE g_hInst;
+extern HIMAGELIST hCListImages;
+
+extern int ClcIconsChanged(WPARAM,LPARAM);
+
+void SetAllExtraIcons(HWND hwndList,HANDLE hContact);
+void LoadExtraImageFunc();
+HICON LoadIconFromExternalFile(char*, int, boolean, boolean, char*, char*, char*, int, HICON = NULL);
+boolean ImageCreated = FALSE;
+void ReloadExtraIcons();
+BYTE ExtraOrder[] =
+{
+ 0, // EXTRA_ICON_EMAIL
+ 1, // EXTRA_ICON_PROTO
+ 2, // EXTRA_ICON_SMS
+ 3, // EXTRA_ICON_ADV1
+ 4, // EXTRA_ICON_ADV2
+ 5, // EXTRA_ICON_WEB
+ 6, // EXTRA_ICON_CLIENT
+ 7, // EXTRA_ICON_ADV3
+ 8, // EXTRA_ICON_ADV4
+};
+
+BOOL HasExtraIconsService()
+{
+ return ServiceExists("ExtraIcon/Register");
+}
+
+boolean isColumnVisible(int extra)
+{
+ int i = 0;
+
+ if (HasExtraIconsService())
+ return TRUE;
+
+ for (i = 0; i<sizeof(ExtraOrder)/sizeof(ExtraOrder[0]); i++)
+ if (ExtraOrder[i] == extra)
+ {
+ switch(i+1)
+ {
+ case EXTRA_ICON_EMAIL: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_EMAIL",1));
+ case EXTRA_ICON_PROTO: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_PROTO",1));
+ case EXTRA_ICON_SMS: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_SMS",1));
+ case EXTRA_ICON_ADV1: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV1",1));
+ case EXTRA_ICON_ADV2: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV2",1));
+ case EXTRA_ICON_WEB: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_WEB",1));
+ case EXTRA_ICON_CLIENT: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_CLIENT",1));
+ case EXTRA_ICON_ADV3: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV3",0));
+ case EXTRA_ICON_ADV4: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV4",0));
+ }
+ break;
+ }
+ return(FALSE);
+}
+
+void GetVisColumns()
+{
+ visar[0] = isColumnVisible(0);
+ visar[1] = isColumnVisible(1);
+ visar[2] = isColumnVisible(2);
+ visar[3] = isColumnVisible(3);
+ visar[4] = isColumnVisible(4);
+ visar[5] = isColumnVisible(5);
+ visar[6] = isColumnVisible(6);
+ visar[7] = isColumnVisible(7);
+ visar[8] = isColumnVisible(8);
+};
+
+__inline int bti(boolean b)
+{
+ return(b?1:0);
+};
+int colsum(int from,int to)
+{
+ int i,sum;
+ if (from<0||from>=EXTRACOLUMNCOUNT){return(-1);};
+ if (to<0||to>=EXTRACOLUMNCOUNT){return(-1);};
+ if (to<from){return(-1);};
+
+ sum = 0;
+ for (i = from;i<=to;i++)
+ {
+ sum += bti(visar[i]);
+ };
+ return(sum);
+};
+
+int ExtraToColumnNum(int extra)
+{
+ if (HasExtraIconsService())
+ {
+ if (extra < 1 || extra > EXTRACOLUMNCOUNT)
+ return -1;
+ else
+ return extra-1;
+ }
+ else
+ {
+ int cnt = EnabledColumnCount;
+ int extracnt = EXTRACOLUMNCOUNT-1;
+ int ord = ExtraOrder[extra-1];
+ if (!visar[ord]) return -1;
+ return (colsum(0,ord)-1);
+ }
+};
+
+int ColumnNumToExtra(int column)
+{
+ int i;
+
+ if (HasExtraIconsService())
+ return column+1;
+
+ for (i = 0; i<sizeof(ExtraOrder)/sizeof(ExtraOrder[0]); i++)
+ if (ExtraOrder[i] == column)
+ return i+1;
+
+ return -1;
+}
+
+INT_PTR SetIconForExtraColumn(WPARAM wParam,LPARAM lParam)
+{
+ pIconExtraColumn piec;
+ int icol;
+ HANDLE hItem;
+
+ if (pcli->hwndContactTree == 0){return(-1);};
+ if (wParam == 0||lParam == 0){return(-1);};
+ piec = (pIconExtraColumn)lParam;
+
+ if (piec->cbSize != sizeof(IconExtraColumn)){return(-1);};
+ icol = ExtraToColumnNum(piec->ColumnType);
+ if (icol == -1){return(-1);};
+ hItem = (HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)wParam,0);
+ if (hItem == 0){return(-1);};
+
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(icol,piec->hImage));
+ return 0;
+};
+
+//wparam = hIcon
+//return hImage on success,-1 on failure
+INT_PTR AddIconToExtraImageList(WPARAM wParam,LPARAM lParam)
+{
+ if (hExtraImageList == 0||wParam == 0){return(-1);};
+ return((int)ImageList_AddIcon(hExtraImageList,(HICON)wParam));
+}
+
+void SetNewExtraColumnCount()
+{
+ int newcount;
+
+ GetVisColumns();
+ newcount = colsum(0,EXTRACOLUMNCOUNT-1);
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EnabledColumnCount",(BYTE)newcount);
+ EnabledColumnCount = newcount;
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNS,EnabledColumnCount,0);
+}
+
+int OnIconLibIconChanged(WPARAM wParam,LPARAM lParam)
+{
+ HICON hicon;
+ hicon = LoadIconFromExternalFile("clisticons.dll",0,TRUE,FALSE,"Email","Contact List","Email Icon",-IDI_EMAIL);
+ ExtraImageIconsIndex[0] = ImageList_ReplaceIcon(hExtraImageList,ExtraImageIconsIndex[0],hicon );
+
+ hicon = LoadIconFromExternalFile("clisticons.dll",1,TRUE,FALSE,"Sms","Contact List","Sms Icon",-IDI_SMS);
+ ExtraImageIconsIndex[1] = ImageList_ReplaceIcon(hExtraImageList,ExtraImageIconsIndex[1],hicon );
+
+ hicon = LoadIconFromExternalFile("clisticons.dll",4,TRUE,FALSE,"Web","Contact List","Web Icon",-IDI_GLOBUS);
+ ExtraImageIconsIndex[2] = ImageList_ReplaceIcon(hExtraImageList,ExtraImageIconsIndex[2],hicon );
+
+ pcli->pfnClcBroadcast( INTM_INVALIDATE,0,0);
+ return 0;
+}
+
+void ReloadExtraIcons()
+{
+ int count,i;
+ PROTOACCOUNT **accs;
+ HICON hicon;
+
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNSSPACE,DBGetContactSettingByte(NULL,"CLUI","ExtraColumnSpace",18),0);
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,0,(LPARAM)NULL);
+ if (hExtraImageList){ImageList_Destroy(hExtraImageList);};
+ hExtraImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,1,256);
+
+ if (!HasExtraIconsService())
+ {
+ //loading icons
+ hicon = LoadIconFromExternalFile("clisticons.dll",0,TRUE,TRUE,"Email","Contact List","Email Icon",-IDI_EMAIL);
+ if (!hicon) hicon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_EMAIL));
+ ExtraImageIconsIndex[0] = ImageList_AddIcon(hExtraImageList,hicon );
+
+
+ hicon = LoadIconFromExternalFile("clisticons.dll",1,TRUE,TRUE,"Sms","Contact List","Sms Icon",-IDI_SMS);
+ if (!hicon) hicon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SMS));
+ ExtraImageIconsIndex[1] = ImageList_AddIcon(hExtraImageList,hicon );
+
+ hicon = LoadIconFromExternalFile("clisticons.dll",4,TRUE,TRUE,"Web","Contact List","Web Icon",-IDI_GLOBUS);
+ if (!hicon) hicon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_GLOBUS));
+ ExtraImageIconsIndex[2] = ImageList_AddIcon(hExtraImageList,hicon );
+
+ //calc only needed protocols
+ ProtoEnumAccounts( &count, &accs );
+ for ( i = 0; i < count; i++ )
+ if ( IsAccountEnabled( accs[i] ) && CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 ))
+ ImageList_AddIcon( hExtraImageList, LoadSkinnedProtoIcon( accs[i]->szModuleName, ID_STATUS_ONLINE ));
+ }
+
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,0,(LPARAM)hExtraImageList);
+
+ //SetAllExtraIcons(hImgList);
+ SetNewExtraColumnCount();
+ NotifyEventHooks(hExtraImageListRebuilding,0,0);
+ ImageCreated = TRUE;
+}
+
+void ClearExtraIcons();
+
+void ReAssignExtraIcons()
+{
+ ClearExtraIcons();
+ SetNewExtraColumnCount();
+ SetAllExtraIcons(pcli->hwndContactTree,0);
+ SendMessage(pcli->hwndContactTree,CLM_AUTOREBUILD,0,0);
+}
+
+void ClearExtraIcons()
+{
+ int i;
+ HANDLE hContact,hItem;
+
+ //EnabledColumnCount = DBGetContactSettingByte(NULL,CLUIFrameModule,"EnabledColumnCount",5);
+ //SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNS,EnabledColumnCount,0);
+ SetNewExtraColumnCount();
+
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+ do {
+
+ hItem = (HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)hContact,0);
+ if (hItem == 0){continue;};
+ for (i = 0;i<EnabledColumnCount;i++)
+ {
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(i,0xFF));
+ };
+
+ } while(hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0));
+};
+
+void SetAllExtraIcons(HWND hwndList,HANDLE hContact)
+{
+ HANDLE hItem;
+ boolean hcontgiven = FALSE;
+ char *szProto;
+ char *ImgIndex[64];
+ int maxpr,count,i;
+ PROTOACCOUNT **accs;
+ pdisplayNameCacheEntry pdnce;
+ int em,pr,sms,a1,a2,w1,c1;
+ int tick = 0;
+ BOOL hasExtraIconsService;
+ hcontgiven = (hContact != 0);
+
+ if (pcli->hwndContactTree == 0){return;};
+ tick = GetTickCount();
+ if (ImageCreated == FALSE) ReloadExtraIcons();
+
+ SetNewExtraColumnCount();
+
+ hasExtraIconsService = HasExtraIconsService();
+ if (!hasExtraIconsService) {
+ em = ExtraToColumnNum(EXTRA_ICON_EMAIL);
+ pr = ExtraToColumnNum(EXTRA_ICON_PROTO);
+ sms = ExtraToColumnNum(EXTRA_ICON_SMS);
+ a1 = ExtraToColumnNum(EXTRA_ICON_ADV1);
+ a2 = ExtraToColumnNum(EXTRA_ICON_ADV2);
+ w1 = ExtraToColumnNum(EXTRA_ICON_WEB);
+ c1 = ExtraToColumnNum(EXTRA_ICON_CLIENT);
+
+ memset(ImgIndex,0,sizeof(ImgIndex));
+ ProtoEnumAccounts( &count, &accs );
+
+ maxpr = 0;
+ //calc only needed protocols
+ for ( i = 0; i < count; i++ ) {
+ if ( !IsAccountEnabled( accs[i] ) || CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 ) == 0 )
+ continue;
+ ImgIndex[maxpr] = accs[i]->szModuleName;
+ maxpr++;
+ }
+ }
+
+ if ( hContact == NULL )
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+
+ do {
+ szProto = NULL;
+ hItem = hContact;
+ if (hItem == 0){continue;};
+ pdnce = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hItem);
+ if (pdnce == NULL) {continue;};
+
+ // szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ szProto = pdnce->szProto;
+
+ if (!hasExtraIconsService)
+ {
+ if (ExtraToColumnNum(EXTRA_ICON_WEB) != -1)
+ {
+ boolean showweb = FALSE;
+
+ if (szProto != NULL)
+ {
+ char *homepage;
+ homepage = DBGetStringA(pdnce->hContact,"UserInfo", "Homepage");
+ if (!homepage)
+ homepage = DBGetStringA(pdnce->hContact,pdnce->szProto, "Homepage");
+ if (homepage != NULL)
+ {
+ showweb = TRUE;
+ mir_free(homepage);
+ }
+ }
+
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_WEB),(showweb)?2:0xFF));
+ }
+
+ if (ExtraToColumnNum(EXTRA_ICON_EMAIL) != -1)
+ {
+ DBVARIANT dbv = {0};
+ boolean showemail = TRUE;
+
+ if (szProto == NULL || DBGetContactSettingString(hContact, szProto, "e-mail",&dbv))
+ {
+ DBFreeVariant(&dbv);
+ if (DBGetContactSettingString(hContact, "UserInfo", "Mye-mail0", &dbv))
+ showemail = FALSE;
+ }
+ DBFreeVariant(&dbv);
+
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_EMAIL),(showemail)?0:0xFF));
+ }
+
+ if (ExtraToColumnNum(EXTRA_ICON_SMS) != -1)
+ {
+ DBVARIANT dbv = {0};
+ boolean showsms = TRUE;
+
+ if (szProto == NULL || DBGetContactSettingString(hContact, szProto, "Cellular",&dbv)) {
+ DBFreeVariant(&dbv);
+ if (DBGetContactSettingString(hContact, "UserInfo", "MyPhone0", &dbv))
+ showsms = FALSE;
+ }
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_SMS),(showsms)?1:0xFF));
+ DBFreeVariant(&dbv);
+ }
+
+ if (ExtraToColumnNum(EXTRA_ICON_PROTO) != -1)
+ {
+ for (i = 0;i<maxpr;i++)
+ {
+ if (!MyStrCmp(ImgIndex[i],szProto))
+ {
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_PROTO),i+3));
+ break;
+ }
+ }
+ }
+ }
+
+ NotifyEventHooks(hExtraImageApplying,(WPARAM)hContact,0);
+ if (hcontgiven) break;
+ Sleep(0);
+ }
+ while(hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0));
+
+ tick = GetTickCount()-tick;
+ InvalidateRect(hwndList,NULL,FALSE);
+ Sleep(0);
+}
+
+void LoadExtraImageFunc()
+{
+ CreateServiceFunction(MS_CLIST_EXTRA_SET_ICON,SetIconForExtraColumn);
+ CreateServiceFunction(MS_CLIST_EXTRA_ADD_ICON,AddIconToExtraImageList);
+
+ hExtraImageListRebuilding = CreateHookableEvent(ME_CLIST_EXTRA_LIST_REBUILD);
+ hExtraImageApplying = CreateHookableEvent(ME_CLIST_EXTRA_IMAGE_APPLY);
+ hExtraImageClick = CreateHookableEvent(ME_CLIST_EXTRA_CLICK);
+ HookEvent(ME_SKIN2_ICONSCHANGED,OnIconLibIconChanged);
+}
diff --git a/plugins/Clist_mw/src/CLUIFrames/framesmenu.cpp b/plugins/Clist_mw/src/CLUIFrames/framesmenu.cpp
new file mode 100644
index 0000000000..7ce6bdd2a1
--- /dev/null
+++ b/plugins/Clist_mw/src/CLUIFrames/framesmenu.cpp
@@ -0,0 +1,219 @@
+#include "../commonheaders.h"
+
+// == == == == == == == == == == == == == Frames
+HANDLE hFrameMenuObject;
+static HANDLE hPreBuildFrameMenuEvent;
+extern int InitCustomMenus(void);
+
+//contactmenu exec param(ownerdata)
+//also used in checkservice
+typedef struct{
+ char *szServiceName;
+ int Frameid;
+ INT_PTR param1;
+}FrameMenuExecParam,*lpFrameMenuExecParam;
+
+void FreeAndNil( void **p )
+{
+ if ( p == NULL )
+ return;
+
+ if ( *p != NULL ) {
+ mir_free( *p );
+ *p = NULL;
+} }
+
+INT_PTR FreeOwnerDataFrameMenu (WPARAM wParam,LPARAM lParam)
+{
+ lpFrameMenuExecParam cmep;
+
+ cmep = (lpFrameMenuExecParam)lParam;
+ if (cmep != NULL){
+ FreeAndNil((void**)&cmep->szServiceName);
+ FreeAndNil((void**)&cmep);
+ }
+ return 0;
+}
+
+static INT_PTR AddContextFrameMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ TMO_MenuItem tmi;
+ CLISTMENUITEM *mi = (CLISTMENUITEM*)lParam;
+ if ( !pcli->pfnConvertMenu(mi, &tmi))
+ return 0;
+
+ if ((mi->flags & CMIF_ROOTPOPUP) || (mi->flags & CMIF_CHILDPOPUP))
+ tmi.root = mi->hParentMenu;
+
+ lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)mir_alloc(sizeof(FrameMenuExecParam));
+ if (fmep == NULL)
+ return 0;
+
+ fmep->szServiceName = mir_strdup(mi->pszService);
+ fmep->Frameid = mi->popupPosition;
+ fmep->param1 = (INT_PTR)mi->pszContactOwner;
+ tmi.ownerdata = fmep;
+
+ return CallService(MO_ADDNEWMENUITEM, (WPARAM)hFrameMenuObject, (LPARAM)&tmi);
+}
+
+static INT_PTR RemoveContextFrameMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ /* this do by free service
+ lpFrameMenuExecParam fmep;
+ fmep = (lpFrameMenuExecParam)CallService(MO_MENUITEMGETOWNERDATA,wParam,lParam);
+ if (fmep != NULL){
+ if (fmep->szServiceName != NULL){
+ mir_free(fmep->szServiceName);
+ fmep->szServiceName = NULL;
+ }
+ mir_free(fmep);
+ }
+ */
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR FrameMenuExecService(WPARAM wParam,LPARAM lParam)
+{
+ lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)wParam;
+ if (fmep == NULL){return(-1);}
+ CallService(fmep->szServiceName,lParam,fmep->param1);
+
+ return 0;
+}
+
+//true - ok,false ignore
+INT_PTR FrameMenuCheckService(WPARAM wParam,LPARAM lParam)
+{
+ PCheckProcParam pcpp = (PCheckProcParam)wParam;
+ if (pcpp == NULL)
+ return FALSE;
+
+ TMO_MenuItem mi;
+ if (CallService(MO_GETMENUITEM,(WPARAM)pcpp->MenuItemHandle,(LPARAM)&mi) == 0) {
+ lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)mi.ownerdata;
+ if (fmep != NULL) {
+ //pcpp->wParam - frameid
+ if (((WPARAM)fmep->Frameid == pcpp->wParam)||fmep->Frameid == -1) return(TRUE);
+ }
+ }
+ return FALSE;
+}
+
+static INT_PTR ContextFrameMenuNotify(WPARAM wParam,LPARAM lParam)
+{
+ NotifyEventHooks(hPreBuildFrameMenuEvent,wParam,lParam);
+ return 0;
+}
+
+static INT_PTR BuildContextFrameMenu(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM *mi = (CLISTMENUITEM*)lParam;
+ HMENU hMenu;
+ ListParam param = { 0 };
+ param.MenuObjectHandle = hFrameMenuObject;
+ param.wParam = wParam;
+ param.lParam = lParam;
+
+ hMenu = CreatePopupMenu();
+ //NotifyEventHooks(hPreBuildFrameMenuEvent,wParam,-1);
+ ContextFrameMenuNotify(wParam,-1);
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)&param);
+ return (INT_PTR)hMenu;
+}
+
+// == == == == == == == == == == == == == Frames end
+boolean InternalGenMenuModule = FALSE;
+
+int MeasureItemProxy(WPARAM wParam,LPARAM lParam)
+{
+ int val;
+ if (InternalGenMenuModule)
+ {
+ val = CallService(MS_INT_MENUMEASUREITEM,wParam,lParam);
+ if (val) return(val);
+ }
+ return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam);
+}
+
+int DrawItemProxy(WPARAM wParam,LPARAM lParam)
+{
+ if (InternalGenMenuModule)
+ {
+ int val;
+ val = CallService(MS_INT_MENUDRAWITEM,wParam,lParam);
+ if (val) return(val);
+ }
+ return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam);
+}
+
+int ProcessCommandProxy(WPARAM wParam,LPARAM lParam)
+{
+ if (InternalGenMenuModule)
+ {
+ int val;
+ val = CallService(MS_INT_MENUPROCESSCOMMAND,wParam,lParam);
+ if (val) return(val);
+ }
+
+ return CallService(MS_CLIST_MENUPROCESSCOMMAND,wParam,lParam);
+
+}
+
+int ModifyMenuItemProxy(WPARAM wParam,LPARAM lParam)
+{
+ if (InternalGenMenuModule)
+ {
+ int val;
+ val = CallService(MS_INT_MODIFYMENUITEM,wParam,lParam);
+ if (val) return(val);
+ }
+
+ return CallService(MS_CLIST_MODIFYMENUITEM,wParam,lParam);
+}
+
+int InitFramesMenus(void)
+{
+ TMenuParam tmp;
+
+ if (!ServiceExists(MO_REMOVEMENUOBJECT))
+ {
+
+ InitCustomMenus();
+ InternalGenMenuModule = TRUE;
+ }
+
+ if (ServiceExists(MO_REMOVEMENUOBJECT))
+ {
+ CreateServiceFunction("FrameMenuExecService",FrameMenuExecService);
+ CreateServiceFunction("FrameMenuCheckService",FrameMenuCheckService);
+ CreateServiceFunction("FrameMenuFreeService",FreeOwnerDataFrameMenu);
+
+
+ CreateServiceFunction(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM,RemoveContextFrameMenuItem);
+ CreateServiceFunction("CList/AddContextFrameMenuItem",AddContextFrameMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDFRAMECONTEXT,BuildContextFrameMenu);
+ CreateServiceFunction(MS_CLIST_FRAMEMENUNOTIFY,ContextFrameMenuNotify);
+ hPreBuildFrameMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDFRAMEMENU);
+
+ //frame menu object
+ memset(&tmp,0,sizeof(tmp));
+ tmp.cbSize = sizeof(tmp);
+ tmp.CheckService = "FrameMenuCheckService";
+ tmp.ExecService = "FrameMenuExecService";
+ tmp.name = "FrameMenu";
+ hFrameMenuObject = (HANDLE)CallService(MO_CREATENEWMENUOBJECT,0,(LPARAM)&tmp);
+ {
+ OptParam op;
+ op.Handle = hFrameMenuObject;
+ op.Setting = OPT_MENUOBJECT_SET_FREE_SERVICE;
+ op.Value = (INT_PTR)"FrameMenuFreeService";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+ }
+ }
+ return 0;
+}
diff --git a/plugins/Clist_mw/src/CLUIFrames/statusbar.cpp b/plugins/Clist_mw/src/CLUIFrames/statusbar.cpp
new file mode 100644
index 0000000000..319f4f8f63
--- /dev/null
+++ b/plugins/Clist_mw/src/CLUIFrames/statusbar.cpp
@@ -0,0 +1,599 @@
+#include "../commonheaders.h"
+
+extern HINSTANCE g_hInst;
+HANDLE hStatusBarShowToolTipEvent,hStatusBarHideToolTipEvent;
+boolean canloadstatusbar = FALSE;
+HWND helperhwnd = 0;
+HANDLE hFrameHelperStatusBar;
+
+void CluiProtocolStatusChanged(int parStatus, const char* szProto);
+
+INT_PTR GetConnectingIconService (WPARAM wParam,LPARAM lParam);
+
+int RecreateStatusBar(HWND);
+int UseOwnerDrawStatusBar;
+
+#define TM_STATUSBAR 23435234
+#define TM_STATUSBARHIDE 23435235
+boolean tooltipshoing;
+WNDPROC OldWindowProc = NULL;
+
+
+POINT lastpnt;
+RECT OldRc = {0};
+static HBITMAP hBmpBackground;
+static int backgroundBmpUse;
+static COLORREF bkColour;
+extern BYTE showOpts;
+int extraspace;
+
+int OnStatusBarBackgroundChange()
+{
+ {
+ DBVARIANT dbv;
+ showOpts = DBGetContactSettingByte(NULL,"CLUI","SBarShow",1);
+ bkColour = DBGetContactSettingDword(NULL,"StatusBar","BkColour",CLCDEFAULT_BKCOLOUR);
+ if (hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground = NULL;}
+ if (DBGetContactSettingByte(NULL,"StatusBar","UseBitmap",CLCDEFAULT_USEBITMAP)) {
+ if (!DBGetContactSettingString(NULL,"StatusBar","BkBitmap",&dbv)) {
+ hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ }
+ }
+ backgroundBmpUse = DBGetContactSettingWord(NULL,"StatusBar","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+ extraspace = DBGetContactSettingDword(NULL,"StatusBar","BkExtraSpace",0);
+ }
+
+ RecreateStatusBar(pcli->hwndContactList);
+ if (pcli->hwndStatus) InvalidateRect(pcli->hwndStatus,NULL,TRUE);
+ return 0;
+}
+
+
+void DrawDataForStatusBar(LPDRAWITEMSTRUCT dis)
+{
+ //LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam;
+ ProtocolData *PD = (ProtocolData *)dis->itemData;
+ char *szProto = (char*)dis->itemData;
+ int status,x;
+ SIZE textSize;
+ boolean NeedDestroy = FALSE;
+ HICON hIcon;
+ HRGN hrgn;
+
+
+ if (PD == NULL){return;}
+ if (dis->hDC == NULL) {return;}
+
+ //clip it
+
+ hrgn = CreateRectRgn(dis->rcItem.left, dis->rcItem.top,
+ dis->rcItem.right, dis->rcItem.bottom);
+
+ SelectClipRgn(dis->hDC, hrgn);
+
+ szProto = PD->RealName;
+#ifdef _DEBUG
+ {
+ //char buf[512];
+ //sprintf(buf,"proto: %s draw at pos: %d\r\n",szProto,dis->rcItem.left);
+ //OutputDebugStringA(buf);
+ }
+#endif
+
+ status = CallProtoService(szProto,PS_GETSTATUS,0,0);
+ SetBkMode(dis->hDC,TRANSPARENT);
+ x = dis->rcItem.left+extraspace;
+
+ if (showOpts&1)
+ {
+ if ((DBGetContactSettingByte(NULL,"CLUI","UseConnectingIcon",1) == 1) && status < ID_STATUS_OFFLINE)
+ {
+ hIcon = (HICON)GetConnectingIconService((WPARAM)szProto,0);
+
+ if (hIcon)
+ {
+ NeedDestroy = TRUE;
+ }else
+ {
+ hIcon = LoadSkinnedProtoIcon(szProto,status);
+ }
+
+ }else
+ {
+ hIcon = LoadSkinnedProtoIcon(szProto,status);
+ }
+ DrawIconEx(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-GetSystemMetrics(SM_CYSMICON))>>1,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ if (NeedDestroy) DestroyIcon(hIcon);
+ x += GetSystemMetrics(SM_CXSMICON)+2;
+ }
+ else x += 2;
+ if (showOpts&2) {
+ TCHAR szName[64];
+
+ PROTOACCOUNT* pa = ProtoGetAccount(szProto);
+ mir_sntprintf(szName, SIZEOF(szName), _T("%s%s"), pa->tszAccountName, showOpts&4 ? _T(" ") : _T(""));
+ GetTextExtentPoint32(dis->hDC, szName, (int)_tcslen(szName), &textSize);
+
+ TextOut(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-textSize.cy)>>1,szName,lstrlen(szName));
+ x += textSize.cx;
+ }
+ if (showOpts&4) {
+ TCHAR *szStatus = pcli->pfnGetStatusModeDescription(status, 0);
+ if (!szStatus)
+ szStatus = _T("");
+ GetTextExtentPoint32(dis->hDC,szStatus,lstrlen(szStatus),&textSize);
+ TextOut(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-textSize.cy)>>1,szStatus,lstrlen(szStatus));
+ }
+ SelectClipRgn(dis->hDC, NULL);
+ DeleteObject(hrgn);
+}
+
+void DrawBackGround(HWND hwnd,HDC mhdc)
+{
+ HDC hdcMem,hdc;
+ RECT clRect,*rcPaint;
+
+ int yScroll = 0;
+ int y;
+ PAINTSTRUCT paintst = {0};
+ HBITMAP hBmpOsb,holdbmp;
+ DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE);
+ int grey = 0;
+ HFONT oFont;
+ HBRUSH hBrushAlternateGrey = NULL;
+
+ HFONT hFont;
+
+ //InvalidateRect(hwnd,0,FALSE);
+
+ hFont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+
+ if (mhdc)
+ {
+ hdc = mhdc;
+ rcPaint = NULL;
+ }else
+ {
+ hdc = BeginPaint(hwnd,&paintst);
+ rcPaint = &(paintst.rcPaint);
+ }
+
+ GetClientRect(hwnd,&clRect);
+ if (rcPaint == NULL) rcPaint = &clRect;
+ if (rcPaint->right-rcPaint->left == 0||rcPaint->top-rcPaint->bottom == 0) rcPaint = &clRect;
+ y = -yScroll;
+ hdcMem = CreateCompatibleDC(hdc);
+ hBmpOsb = CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL);
+ holdbmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb);
+ oFont = (HFONT)SelectObject(hdcMem,hFont);
+ SetBkMode(hdcMem,TRANSPARENT);
+ { HBRUSH hBrush,hoBrush;
+
+ hBrush = CreateSolidBrush(bkColour);
+ hoBrush = (HBRUSH)SelectObject(hdcMem,hBrush);
+ FillRect(hdcMem,rcPaint,hBrush);
+ SelectObject(hdcMem,hoBrush);
+ DeleteObject(hBrush);
+ if (hBmpBackground) {
+ BITMAP bmp;
+ int x,y;
+ int maxx,maxy;
+ int destw,desth;
+
+ GetObject(hBmpBackground,sizeof(bmp),&bmp);
+ HDC hdcBmp = CreateCompatibleDC(hdcMem);
+ HDC holdbackbmp = (HDC)SelectObject(hdcBmp,hBmpBackground);
+ y = backgroundBmpUse&CLBF_SCROLL?-yScroll:0;
+ maxx = backgroundBmpUse&CLBF_TILEH?clRect.right:1;
+ maxy = backgroundBmpUse&CLBF_TILEV?maxy = rcPaint->bottom:y+1;
+ switch(backgroundBmpUse&CLBM_TYPE) {
+ case CLB_STRETCH:
+ if (backgroundBmpUse&CLBF_PROPORTIONAL) {
+ if (clRect.right*bmp.bmHeight<clRect.bottom*bmp.bmWidth) {
+ desth = clRect.bottom;
+ destw = desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw = clRect.right;
+ desth = destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ }
+ else {
+ destw = clRect.right;
+ desth = clRect.bottom;
+ }
+ break;
+ case CLB_STRETCHH:
+ if (backgroundBmpUse&CLBF_PROPORTIONAL) {
+ destw = clRect.right;
+ desth = destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ else {
+ destw = clRect.right;
+ desth = bmp.bmHeight;
+ }
+ break;
+ case CLB_STRETCHV:
+ if (backgroundBmpUse&CLBF_PROPORTIONAL) {
+ desth = clRect.bottom;
+ destw = desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw = bmp.bmWidth;
+ desth = clRect.bottom;
+ }
+ break;
+ default: //clb_topleft
+ destw = bmp.bmWidth;
+ desth = bmp.bmHeight;
+ break;
+ }
+ desth = clRect.bottom -clRect.top;
+ for (;y<maxy;y += desth) {
+ if (y<rcPaint->top-desth) continue;
+ for (x = 0;x<maxx;x += destw)
+ StretchBlt(hdcMem,x,y,destw,desth,hdcBmp,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
+ }
+ SelectObject(hdcBmp,holdbackbmp);
+ DeleteDC(hdcBmp);
+ }
+ }
+
+ //call to draw icons
+ {
+ DRAWITEMSTRUCT ds;
+ int nParts,nPanel;
+ ProtocolData *PD;
+ RECT rc,clrc;
+ int startoffset,sectwidth;
+
+ memset(&ds,0,sizeof(ds));
+ ds.hwndItem = hwnd;
+ ds.hDC = hdcMem;
+
+
+ startoffset = DBGetContactSettingDword(NULL,"StatusBar","FirstIconOffset",0);
+ extraspace = DBGetContactSettingDword(NULL,"StatusBar","BkExtraSpace",0);
+
+ nParts = SendMessage(hwnd,SB_GETPARTS,0,0);
+ memset(&rc,0,sizeof(RECT));
+ GetClientRect(hwnd,&clrc);
+ clrc.right -= clrc.left;
+ clrc.right -= startoffset;
+ sectwidth = clrc.right/nParts;
+
+ for (nPanel = 0;nPanel<nParts;nPanel++)
+ {
+ PD = (ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,(LPARAM)0);
+ if (PD == NULL){
+ continue;
+ }
+ SendMessage(hwnd,SB_GETRECT,(WPARAM)nPanel,(LPARAM)&rc);
+ //rc.left += startoffset;
+ //if (rc.left>=rc.right) rc.left = rc.right-1;
+ rc.top = 0;
+ rc.left = nPanel*sectwidth+startoffset;
+ rc.right = rc.left+sectwidth-1;
+ ds.rcItem = rc;
+ ds.itemData = (ULONG_PTR)PD;
+ ds.itemID = nPanel;
+
+ DrawDataForStatusBar(&ds);
+ } }
+
+ BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY);
+
+ SelectObject(hdcMem,holdbmp);
+ SelectObject(hdcMem,oFont);
+ DeleteObject(hBmpOsb);
+ DeleteDC(hdcMem);
+ paintst.fErase = FALSE;
+ //DeleteObject(hFont);
+ if (!mhdc)
+ EndPaint(hwnd,&paintst);
+}
+
+LRESULT CALLBACK StatusBarOwnerDrawProc( HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+if (UseOwnerDrawStatusBar)
+{
+ switch(uMsg)
+ {
+ case WM_ERASEBKGND:
+ {
+
+ //DrawBackGround(hwnd);
+ return 0;
+ }
+ case WM_PRINT:
+ {
+ DrawBackGround(hwnd,(HDC)wParam);
+ return 0;
+ }
+ case WM_PAINT:
+ {
+ DrawBackGround(hwnd,0);
+ return 0;
+ }
+ }
+
+}
+return (CallWindowProc(OldWindowProc,hwnd,uMsg,wParam,lParam)
+ );
+}
+
+LRESULT CALLBACK StatusHelperProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg)
+ {
+ case WM_CREATE:
+ {
+ {
+ tooltipshoing = FALSE;
+ //HWND label;
+ //label = CreateWindow("static","Top window",WS_VISIBLE|WS_CHILD ,2,2,120,60,hwnd,NULL,g_hInst,0);
+ //SendMessage(label,WM_SETFONT,(WPARAM)TitleBarFont,0);
+ }
+ return(FALSE);
+
+ }
+ case WM_GETMINMAXINFO:{
+ RECT rct;
+ if (pcli->hwndStatus == 0){break;}
+ GetWindowRect(pcli->hwndStatus,&rct);
+ memset((LPMINMAXINFO)lParam,0,sizeof(MINMAXINFO));
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = 5;
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = rct.bottom-rct.top;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = 1600;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = rct.bottom-rct.top;
+ return 0;
+ }
+
+ case WM_NCHITTEST:
+ {
+
+ }
+ case WM_SHOWWINDOW:
+ {
+ {
+ int res;
+ if (hFrameHelperStatusBar)
+ {
+ res = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),0);
+ DBWriteContactSettingByte(0,"CLUI","ShowSBar",(BYTE)((res&F_VISIBLE)?1:0));
+ }
+ }
+
+
+ if (tooltipshoing){
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing = FALSE;
+ }
+ return 0;
+ //
+ }
+ case WM_TIMER:
+ {
+ if (wParam == TM_STATUSBARHIDE)
+ {
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+
+ if (tooltipshoing){
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing = FALSE;
+ }
+
+
+ }
+
+ if (wParam == TM_STATUSBAR)
+ {
+ POINT pt;
+ KillTimer(hwnd,TM_STATUSBAR);
+
+ GetCursorPos(&pt);
+ if (pt.x == lastpnt.x&&pt.y == lastpnt.y)
+ {
+ {
+ int i,nParts;
+ ProtocolData *PD;
+ RECT rc;
+ ScreenToClient(pcli->hwndStatus,&pt);
+ nParts = SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0);
+ for (i = 0;i<nParts;i++) {
+ SendMessage(pcli->hwndStatus,SB_GETRECT,i,(LPARAM)&rc);
+ if (PtInRect(&rc,pt)) {
+ PD = (ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,i,(LPARAM)0);
+ if (PD == NULL){return 0;}
+
+ NotifyEventHooks(hStatusBarShowToolTipEvent,(WPARAM)PD->RealName,0);
+ SetTimer(hwnd,TM_STATUSBARHIDE,DBGetContactSettingWord(NULL,"CLUIFrames","HideToolTipTime",5000),0);
+ tooltipshoing = TRUE;
+
+ break;
+ }
+ }
+
+
+
+ }
+
+
+
+ }
+
+ }
+
+ return 0;
+ }
+
+ case WM_SETCURSOR:
+ {
+
+ {
+ POINT pt;
+ GetCursorPos(&pt);
+ if (pt.x == lastpnt.x&&pt.y == lastpnt.y)
+ {
+ return 0;
+ }
+ lastpnt = pt;
+ if (tooltipshoing){
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing = FALSE;
+ }
+ KillTimer(hwnd,TM_STATUSBAR);
+ SetTimer(hwnd,TM_STATUSBAR,DBGetContactSettingWord(NULL,"CLC","InfoTipHoverTime",750),0);
+ return 0;
+ }
+
+ }
+ case WM_NOTIFY:
+ {
+ if (lParam == 0){return 0;}
+ if (((LPNMHDR)lParam)->hwndFrom == pcli->hwndStatus)
+ {
+
+ if (((LPNMHDR)lParam)->code == WM_NCHITTEST)
+ {
+ LPNMMOUSE lpnmmouse = (LPNMMOUSE) lParam;
+ } ;
+ }
+ }
+
+ case WM_CONTEXTMENU:
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+
+ if (tooltipshoing)
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+
+ tooltipshoing = FALSE;
+
+ case WM_MEASUREITEM:
+ case WM_DRAWITEM:
+ //parent do all work for us
+ return(SendMessage(pcli->hwndContactList,msg,wParam,lParam));
+
+ case WM_MOVE:
+ PostMessage(pcli->hwndStatus,WM_MOVE,wParam,lParam);
+
+ case WM_SIZE:
+ {
+ RECT rc;
+ int b;
+ if (pcli->hwndStatus != 0) {
+ GetClientRect(hwnd,&rc);
+
+ b = LOWORD(lParam);
+ if (b != 0&&(rc.right-rc.left) != (OldRc.right-OldRc.left)) {
+ OldRc = rc;
+ if (canloadstatusbar)
+ if (DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0)||DBGetContactSettingByte(NULL,"CLUI","EqualSections",1))
+ CluiProtocolStatusChanged(0,0);
+ }
+ if (msg == WM_SIZE) PostMessage(pcli->hwndStatus,WM_SIZE,wParam,lParam);
+ if (pcli->hwndStatus != 0) InvalidateRect(pcli->hwndStatus,NULL,TRUE);
+ return 0;
+ }
+ }
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+HWND CreateStatusHelper(HWND parent)
+{
+ WNDCLASS wndclass = {0};
+ TCHAR pluginname[] = _T("Statushelper");
+
+ if (GetClassInfo(g_hInst,pluginname,&wndclass) == 0 ) {
+ wndclass.style = 0;
+ wndclass.lpfnWndProc = StatusHelperProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hInstance = g_hInst;
+ wndclass.hIcon = NULL;
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
+ wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = pluginname;
+ RegisterClass(&wndclass);
+ }
+
+ return(CreateWindow(pluginname,pluginname,
+ /*WS_THICKFRAME|*/WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,
+ 0,0,0,0,parent,NULL,g_hInst,NULL));
+}
+
+HANDLE CreateStatusBarFrame()
+{
+ CLISTFrame Frame;
+ int h;
+ RECT rc;
+
+ memset(&Frame,0,sizeof(Frame));
+ Frame.cbSize = sizeof(CLISTFrame);
+ Frame.hWnd = helperhwnd;
+ Frame.align = alBottom;
+ Frame.hIcon = LoadSkinnedIcon (SKINICON_OTHER_MIRANDA);
+ Frame.Flags = (DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1)?F_VISIBLE:0)|F_LOCKED|F_NOBORDER|F_TCHAR;
+ GetWindowRect(helperhwnd,&rc);
+ h = rc.bottom-rc.top;
+ Frame.height = (h == 0)?20:h;
+
+
+ Frame.tname = _T("Status");
+ Frame.TBtname = TranslateT("Status Bar");
+ hFrameHelperStatusBar = (HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,(LPARAM)0);
+
+
+ return hFrameHelperStatusBar;
+}
+
+int RecreateStatusBar(HWND parent)
+{
+ if (pcli->hwndStatus) {
+ FreeProtocolData();
+ DestroyWindow(pcli->hwndStatus);
+ }
+ pcli->hwndStatus = 0;
+ if (hFrameHelperStatusBar) CallService(MS_CLIST_FRAMES_REMOVEFRAME,(WPARAM)hFrameHelperStatusBar,0);
+
+ helperhwnd = CreateStatusHelper(parent);
+ UseOwnerDrawStatusBar = DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0);
+
+ //create the status wnd
+ pcli->hwndStatus = CreateStatusWindow(
+ ( DBGetContactSettingByte(0,"CLUI","SBarUseSizeGrip",TRUE) && (!UseOwnerDrawStatusBar)?SBARS_SIZEGRIP:0)|
+ WS_CHILD | (DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1)?WS_VISIBLE:0), _T(""), helperhwnd, 0);
+
+ OldWindowProc = (WNDPROC)GetWindowLongPtr(pcli->hwndStatus,GWLP_WNDPROC);
+ SetWindowLongPtr(pcli->hwndStatus,GWLP_WNDPROC,(LONG_PTR)&StatusBarOwnerDrawProc);
+ CreateStatusBarFrame();
+ {
+ SetWindowPos(helperhwnd,NULL,1,1,1,1,SWP_NOZORDER);
+ CluiProtocolStatusChanged(0,0);
+ CallService(MS_CLIST_FRAMES_UPDATEFRAME,-1,0);
+ }
+
+ return 0;
+}
+
+HWND CreateStatusBarhWnd(HWND parent)
+{
+ RecreateStatusBar(parent);
+ OnStatusBarBackgroundChange();
+
+ hStatusBarShowToolTipEvent = CreateHookableEvent(ME_CLIST_FRAMES_SB_SHOW_TOOLTIP);
+ hStatusBarHideToolTipEvent = CreateHookableEvent(ME_CLIST_FRAMES_SB_HIDE_TOOLTIP);
+ return pcli->hwndStatus;
+}