diff options
Diffstat (limited to 'plugins/Clist_modern/src/CLUIFrames')
-rw-r--r-- | plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp | 4018 | ||||
-rw-r--r-- | plugins/Clist_modern/src/CLUIFrames/cluiframes.h | 143 | ||||
-rw-r--r-- | plugins/Clist_modern/src/CLUIFrames/framesmenu.cpp | 124 | ||||
-rw-r--r-- | plugins/Clist_modern/src/CLUIFrames/groupmenu.cpp | 588 |
4 files changed, 4873 insertions, 0 deletions
diff --git a/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp b/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp new file mode 100644 index 0000000000..f30b090a19 --- /dev/null +++ b/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp @@ -0,0 +1,4018 @@ +/*
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2008 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 "../hdr/modern_commonheaders.h"
+#include "../m_api/m_skin_eng.h"
+#include "../hdr/modern_commonprototypes.h"
+#include "../hdr/modern_sync.h"
+
+
+// ALL THIS MODULE FUNCTION SHOULD BE EXECUTED FROM MAIN THREAD
+
+#include "../hdr/modern_static_cluiframes_service.h" // contain services initialization and proxiation
+
+
+static const int UNCOLLAPSED_FRAME_SIZE = 0;
+static const int DEFAULT_TITLEBAR_HEIGHT = 18;
+
+//GLOBALS
+FRAMEWND * g_pfwFrames = NULL;
+int g_nFramesCount = 0;
+int g_nTitleBarHeight = DEFAULT_TITLEBAR_HEIGHT;
+
+// STATIC
+
+enum {
+ frame_menu_lock = 1,
+ frame_menu_visible,
+ frame_menu_showtitlebar,
+ frame_menu_floating
+}; //legacy menu support
+
+enum { eUnknownId = -1 };
+
+static int _us_DoSetFrameFloat(WPARAM wParam,LPARAM lParam);
+static int CLUIFrameResizeFloatingFrame( int framepos );
+static HWND CreateSubContainerWindow( HWND parent,int x,int y,int width,int height );
+static BOOL CLUIFramesFitInSize();
+static int RemoveItemFromList(int pos, FRAMEWND **lpFrames, int *FrameItemCount );
+static int _us_DoSetFramePaintProc(WPARAM wParam, LPARAM lParam);
+
+
+
+static CRITICAL_SECTION _cluiFramesModuleCS = {0};
+static BOOL _cluiFramesModuleCSInitialized = FALSE;
+static BOOL _fCluiFramesModuleNotStarted = TRUE;
+static XPTHANDLE _hFrameTitleTheme = NULL;
+static int _nClientFrameId = eUnknownId; //for fast access to frame with alclient properties
+static int _iNextFrameId = 100;
+static HFONT _hTitleBarFont = NULL;
+
+// menus
+static HGENMENU _hmiVisible, _hmiTBVisible, _hmiLock, _hmiColl;
+static HGENMENU _hmiFloating, _hmiAlignRoot, _hmiAlignTop, _hmiAlignClient, _hmiAlignBottom;
+static HGENMENU _hmiPosRoot, _hmiPosUp, _hmiPosDown, _hmiBorder, _hmiRoot;
+
+// others
+static int _nContactListHeight = 0;
+static DWORD _dwLastStoreTick = 0;
+
+HWND hWndExplorerToolBar;
+static int GapBetweenFrames = 1;
+
+BOOLEAN bMoveTogether;
+int recurs_prevent = 0;
+static BOOL PreventSizeCalling = FALSE;
+
+static HBITMAP hBmpBackground;
+static int backgroundBmpUse;
+static COLORREF bkColour;
+static COLORREF SelBkColour;
+static BOOL bkUseWinColours;
+BYTE AlignCOLLIconToLeft; //will hide frame icon
+COLORREF sttGetColor(char * module, char * color, COLORREF defColor);
+//for old multiwindow
+#define MPCF_CONTEXTFRAMEMENU 3
+POINT ptOld;
+short nLeft = 0;
+short nTop = 0;
+
+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);};
+ return (0);
+};
+int CLUIFrames_OnMoving( HWND hwnd, RECT *r)
+{
+ int i;
+ g_CluiData.mutexPreventDockMoving = 0;
+ for (i=0; i < g_nFramesCount; i++) {
+
+ if ( !g_pfwFrames[i].floating && g_pfwFrames[i].OwnerWindow != NULL && g_pfwFrames[i].OwnerWindow != (HWND)-2)
+ {
+ int x;
+ int y;
+ int dx,dy;
+ FRAMEWND * Frame;
+ POINT pt = {0};
+ RECT wr;
+ Frame = &(g_pfwFrames[i]);
+
+ GetWindowRect(hwnd,&wr);
+ ClientToScreen(hwnd,&pt);
+ dx = (r->left-wr.left)+pt.x;
+ dy = (r->top-wr.top)+pt.y;
+ x = Frame->wndSize.left;
+ y = Frame->wndSize.top;
+ SetWindowPos(Frame->OwnerWindow,NULL,x+dx,y+dy, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSENDCHANGING|SWP_ASYNCWINDOWPOS|SWP_DEFERERASE|SWP_NOOWNERZORDER);
+ };
+
+ }
+ g_CluiData.mutexPreventDockMoving = 1;
+ AniAva_RedrawAllAvatars(FALSE);
+ return 0;
+}
+int SetAlpha(BYTE Alpha)
+{
+ int i;
+
+ for (i=0; i < g_nFramesCount; i++) {
+
+ if ( !g_pfwFrames[i].floating && g_pfwFrames[i].OwnerWindow != NULL && g_pfwFrames[i].OwnerWindow != (HWND)-2 && g_pfwFrames[i].visible && !g_pfwFrames[i].needhide )
+ {
+ HWND hwnd = g_pfwFrames[i].OwnerWindow;
+ long l;
+ l = GetWindowLongPtr(hwnd,GWL_EXSTYLE);
+ if ( !(l&WS_EX_LAYERED))
+ {
+ HWND parent = NULL;
+ if (g_CluiData.fOnDesktop)
+ {
+ HWND hProgMan = FindWindow(_T("Progman"),NULL);
+ if (IsWindow(hProgMan))
+ parent = hProgMan;
+ }
+
+ CLUI_ShowWindowMod(hwnd,SW_HIDE);
+ SetParent(hwnd,NULL);
+ SetWindowLongPtr(hwnd,GWL_EXSTYLE,l|WS_EX_LAYERED);
+ SetParent(hwnd,parent);
+ if (l&WS_VISIBLE) CLUI_ShowWindowMod(hwnd,SW_SHOW);
+ }
+ SetLayeredWindowAttributes(hwnd, g_CluiData.dwKeyColor,Alpha, LWA_ALPHA|LWA_COLORKEY);
+ }
+ }
+ AniAva_RedrawAllAvatars(FALSE);
+ return 0;
+}
+
+
+int CLUIFrames_RepaintSubContainers()
+{
+ int i;
+ for (i=0; i < g_nFramesCount; i++)
+ if ( !g_pfwFrames[i].floating && g_pfwFrames[i].OwnerWindow != (HWND)0 && g_pfwFrames[i].OwnerWindow != (HWND)-2 && g_pfwFrames[i].visible && !g_pfwFrames[i].needhide )
+ {
+ RedrawWindow(g_pfwFrames[i].hWnd,NULL,NULL,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_INVALIDATE|RDW_FRAME);
+ };
+ return 0;
+}
+
+int CLUIFrames_ActivateSubContainers( BOOL active)
+{
+ int i;
+ for (i=0; i < g_nFramesCount; i++)
+ if (active && !g_pfwFrames[i].floating && g_pfwFrames[i].OwnerWindow != (HWND)0 && g_pfwFrames[i].OwnerWindow != (HWND)-2 && g_pfwFrames[i].visible && !g_pfwFrames[i].needhide )
+ {
+ if ( db_get_b(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT))
+ {
+ SetWindowPos(g_pfwFrames[i].OwnerWindow,HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ SetWindowPos(g_pfwFrames[i].OwnerWindow,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ }
+ else SetWindowPos(g_pfwFrames[i].OwnerWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE | SWP_NOMOVE);
+ };
+ return 0;
+}
+int CLUIFrames_SetParentForContainers( HWND parent )
+{
+ int i;
+ if (parent && parent != pcli->hwndContactList)
+ g_CluiData.fOnDesktop = 1;
+ else
+ g_CluiData.fOnDesktop = 0;
+ for (i=0; i < g_nFramesCount; i++) {
+ if ( !g_pfwFrames[i].floating && g_pfwFrames[i].OwnerWindow != (HWND)0 && g_pfwFrames[i].OwnerWindow != (HWND)-2 && g_pfwFrames[i].visible && !g_pfwFrames[i].needhide )
+ {
+ HWND hwnd = g_pfwFrames[i].OwnerWindow;
+ SetParent(hwnd,parent);
+ }
+ }
+ return 0;
+}
+
+int CLUIFrames_OnShowHide( HWND hwnd, int mode )
+{
+ int i;
+ int prevFrameCount;
+ for (i=0; i < g_nFramesCount; i++) {
+ if ( !g_pfwFrames[i].floating && g_pfwFrames[i].OwnerWindow != (HWND)0 && g_pfwFrames[i].OwnerWindow != (HWND)-2)
+ {
+ {
+ //Try to avoid crash on exit due to unlock.
+ HWND owner = g_pfwFrames[i].OwnerWindow;
+ HWND Frmhwnd = g_pfwFrames[i].hWnd;
+ BOOL visible = g_pfwFrames[i].visible;
+ BOOL needhide = g_pfwFrames[i].needhide;
+ needhide |= (!g_pfwFrames[i].collapsed || g_pfwFrames[i].height == 0 );
+ prevFrameCount = g_nFramesCount;
+ ShowWindow(owner,(mode == SW_HIDE || !visible || needhide)?SW_HIDE:mode);
+ ShowWindow(Frmhwnd,(mode == SW_HIDE || !visible || needhide)?SW_HIDE:mode);
+ }
+
+ if (mode != SW_HIDE)
+ {
+ SetWindowPos(g_pfwFrames[i].OwnerWindow,HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ if ( db_get_b(NULL,"CList","OnDesktop",SETTING_ONDESKTOP_DEFAULT))
+ {
+ SetWindowPos(g_pfwFrames[i].OwnerWindow,HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ SetWindowPos(g_pfwFrames[i].OwnerWindow,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ }
+ else SetWindowPos(g_pfwFrames[i].OwnerWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE | SWP_NOMOVE);
+ }
+ }
+ }
+ if (mode != SW_HIDE) SetForegroundWindow(pcli->hwndContactList);
+ AniAva_RedrawAllAvatars(TRUE);
+ return 0;
+}
+static int RemoveItemFromList(int pos,FRAMEWND **lpFrames,int *FrameItemCount)
+{
+ memmove(&((*lpFrames)[pos]),&((*lpFrames)[pos+1]),sizeof(FRAMEWND)*(*FrameItemCount-pos-1));
+ (*FrameItemCount)--;
+ (*lpFrames) = (FRAMEWND*)realloc((*lpFrames),sizeof(FRAMEWND)*(*FrameItemCount));
+ return 0;
+}
+
+static int id2pos(int id)
+{
+ int i;
+ if (_fCluiFramesModuleNotStarted) return -1;
+ for (i=0; i < g_nFramesCount; i++)
+ if (g_pfwFrames[i].id == id) return(i);
+ return(-1);
+};
+
+static int btoint(BOOLEAN b)
+{
+ if (b) return 1;
+ return 0;
+}
+
+
+static FRAMEWND* FindFrameByWnd( HWND hwnd )
+{
+ int i;
+
+ if ( hwnd == NULL ) return( NULL );
+
+ for (i=0; i < g_nFramesCount; i++)
+ if ((g_pfwFrames[i].floating) && (g_pfwFrames[i].ContainerWnd == hwnd))
+ return(&g_pfwFrames[i]);
+
+ return( NULL);
+}
+
+
+int QueueAllFramesUpdating(BYTE queue)
+{
+ int i;
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if ( !g_CluiData.fLayered)
+ {
+ if (queue)
+ InvalidateRect(g_pfwFrames[i].hWnd,NULL,FALSE);
+ else
+ ValidateRect(g_pfwFrames[i].hWnd,NULL);
+ }
+ if (g_pfwFrames[i].PaintCallbackProc)
+ {
+ g_pfwFrames[i].bQueued = queue;
+ if (g_pfwFrames[i].UpdateRgn)
+ {
+ DeleteObject(g_pfwFrames[i].UpdateRgn);
+ }
+ g_pfwFrames[i].UpdateRgn = 0;
+ }
+
+ }
+ return queue;
+
+}
+int FindFrameID(HWND FrameHwnd)
+{
+ FRAMEWND * frm = NULL;
+ if (FrameHwnd == NULL ) return 0;
+ frm = FindFrameByItsHWND(FrameHwnd);
+ if (frm)
+ return frm->id;
+ else return 0;
+}
+FRAMEWND * FindFrameByItsHWND(HWND FrameHwnd)
+{
+ int i;
+ if ( FrameHwnd == NULL ) return( NULL );
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if (g_pfwFrames[i].hWnd == FrameHwnd){return(&g_pfwFrames[i]);};
+ };
+ return NULL;
+}
+
+static void DockThumbs( FRAMEWND *pThumbLeft, FRAMEWND *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( FRAMEWND *pThumb1, FRAMEWND *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;
+ }
+}
+static void PositionThumb( FRAMEWND *pThumb, short nX, short nY )
+{
+ FRAMEWND *pCurThumb = &g_pfwFrames[0];
+ FRAMEWND *pDockThumb = pThumb;
+ FRAMEWND fakeMainWindow;
+ FRAMEWND 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 == g_nFramesCount){
+ pCurThumb = &fakeMainWindow;continue;
+ }
+
+ pCurThumb = &g_pfwFrames[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|SWP_NOACTIVATE );
+
+
+ // OK, move all g_CluiData.fDocked thumbs
+ if ( bMoveTogether )
+ {
+ pDockThumb = FindFrameByWnd( pDockThumb->dockOpt.hwndRight );
+
+ PositionThumb( pDockThumb, (short)( nNewX + nWidth ), (short)nNewY );
+ }
+}
+
+
+
+static void GetBorderSize(HWND hwnd,RECT *rect)
+{
+ RECT wr,cr;
+ POINT pt1,pt2;
+ // RECT r = {0};
+ // *rect = r;
+ // return;
+ 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;
+ //if (rect->top+rect->bottom>10){rect->top = rect->bottom = 2;};
+ //if (rect->left+rect->right>10){rect->top = rect->bottom = 2;};
+
+};
+
+static char __inline *AS(char *str,const char *setting,char *addstr)
+{
+ if (str != NULL) {
+ strcpy(str,setting);
+ strcat(str,addstr);
+ }
+ return str;
+}
+
+static int DBLoadFrameSettingsAtPos(int pos,int Frameid)
+{
+ char sadd[15];
+ char buf[255];
+ // char *oldtb;
+
+ _itoa(pos,sadd,10);
+
+ //db_set_s(0, CLUIFrameModule,strcat("Name",sadd),Frames[Frameid].name);
+ //bool
+ g_pfwFrames[Frameid].collapsed = db_get_b(0, CLUIFrameModule,AS(buf,"Collapse",sadd),g_pfwFrames[Frameid].collapsed);
+
+ g_pfwFrames[Frameid].Locked = db_get_b(0, CLUIFrameModule,AS(buf,"Locked",sadd),g_pfwFrames[Frameid].Locked);
+ g_pfwFrames[Frameid].visible = db_get_b(0, CLUIFrameModule,AS(buf,"Visible",sadd),g_pfwFrames[Frameid].visible);
+ g_pfwFrames[Frameid].TitleBar.ShowTitleBar = db_get_b(0, CLUIFrameModule,AS(buf,"TBVisile",sadd),g_pfwFrames[Frameid].TitleBar.ShowTitleBar);
+
+ g_pfwFrames[Frameid].height = db_get_w(0, CLUIFrameModule,AS(buf,"Height",sadd),g_pfwFrames[Frameid].height);
+ g_pfwFrames[Frameid].HeightWhenCollapsed = db_get_w(0, CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),0);
+ g_pfwFrames[Frameid].align = db_get_w(0, CLUIFrameModule,AS(buf,"Align",sadd),g_pfwFrames[Frameid].align);
+
+ g_pfwFrames[Frameid].FloatingPos.x = DBGetContactSettingRangedWord(0, CLUIFrameModule,AS(buf,"FloatX",sadd),100, 0, 2048);
+ g_pfwFrames[Frameid].FloatingPos.y = DBGetContactSettingRangedWord(0, CLUIFrameModule,AS(buf,"FloatY",sadd),100, 0, 2048);
+ g_pfwFrames[Frameid].FloatingSize.x = DBGetContactSettingRangedWord(0, CLUIFrameModule,AS(buf,"FloatW",sadd),100, 0, 2048);
+ g_pfwFrames[Frameid].FloatingSize.y = DBGetContactSettingRangedWord(0, CLUIFrameModule,AS(buf,"FloatH",sadd),100, 0, 2048);
+
+ g_pfwFrames[Frameid].floating = db_get_b(0, CLUIFrameModule,AS(buf,"Floating",sadd),0);
+ g_pfwFrames[Frameid].order = db_get_w(0, CLUIFrameModule,AS(buf,"Order",sadd),0);
+
+ g_pfwFrames[Frameid].UseBorder = db_get_b(0, CLUIFrameModule,AS(buf,"UseBorder",sadd),g_pfwFrames[Frameid].UseBorder);
+
+ return 0;
+}
+
+static int DBStoreFrameSettingsAtPos(int pos,int Frameid)
+{
+ char sadd[16];
+ char buf[255];
+
+ _itoa(pos,sadd,10);
+
+ db_set_ws(0, CLUIFrameModule,AS(buf,"Name",sadd),g_pfwFrames[Frameid].Name);
+ //bool
+ db_set_b(0, CLUIFrameModule,AS(buf,"Collapse",sadd),(BYTE)btoint(g_pfwFrames[Frameid].collapsed));
+ db_set_b(0, CLUIFrameModule,AS(buf,"Locked",sadd),(BYTE)btoint(g_pfwFrames[Frameid].Locked));
+ db_set_b(0, CLUIFrameModule,AS(buf,"Visible",sadd),(BYTE)btoint(g_pfwFrames[Frameid].visible));
+ db_set_b(0, CLUIFrameModule,AS(buf,"TBVisile",sadd),(BYTE)btoint(g_pfwFrames[Frameid].TitleBar.ShowTitleBar));
+
+ db_set_w(0, CLUIFrameModule,AS(buf,"Height",sadd),(WORD)g_pfwFrames[Frameid].height);
+ db_set_w(0, CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),(WORD)g_pfwFrames[Frameid].HeightWhenCollapsed);
+ db_set_w(0, CLUIFrameModule,AS(buf,"Align",sadd),(WORD)g_pfwFrames[Frameid].align);
+ //FloatingPos
+ db_set_w(0, CLUIFrameModule,AS(buf,"FloatX",sadd),(WORD)g_pfwFrames[Frameid].FloatingPos.x);
+ db_set_w(0, CLUIFrameModule,AS(buf,"FloatY",sadd),(WORD)g_pfwFrames[Frameid].FloatingPos.y);
+ db_set_w(0, CLUIFrameModule,AS(buf,"FloatW",sadd),(WORD)g_pfwFrames[Frameid].FloatingSize.x);
+ db_set_w(0, CLUIFrameModule,AS(buf,"FloatH",sadd),(WORD)g_pfwFrames[Frameid].FloatingSize.y);
+
+ db_set_b(0, CLUIFrameModule,AS(buf,"Floating",sadd),(BYTE)btoint(g_pfwFrames[Frameid].floating));
+ db_set_b(0, CLUIFrameModule,AS(buf,"UseBorder",sadd),(BYTE)btoint(g_pfwFrames[Frameid].UseBorder));
+ db_set_w(0, CLUIFrameModule,AS(buf,"Order",sadd),(WORD)g_pfwFrames[Frameid].order);
+ return 0;
+}
+
+static int LocateStorePosition(int Frameid,int maxstored)
+{
+ if (g_pfwFrames[Frameid].Name == NULL)
+ return -1;
+
+ char settingname[255];
+ for (int i=0; i < maxstored; i++) {
+ mir_snprintf(settingname,SIZEOF(settingname),"Name%d",i);
+ DBVARIANT dbv = {0};
+ if ( db_get_ts( NULL, CLUIFrameModule, settingname, &dbv ))
+ continue;
+
+ if ( lstrcmpi(dbv.ptszVal, g_pfwFrames[Frameid].Name) == 0) {
+ db_free( &dbv );
+ return i;
+ }
+ db_free( &dbv );
+ }
+ return -1;
+}
+
+static int CLUIFramesLoadFrameSettings(int Frameid)
+{
+ int storpos,maxstored;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ if (Frameid < 0 || Frameid >= g_nFramesCount) return -1;
+
+ maxstored = db_get_w(0, CLUIFrameModule,"StoredFrames",-1);
+ if (maxstored == -1) return 0;
+
+ storpos = LocateStorePosition(Frameid,maxstored);
+ if (storpos == -1) return 0;
+
+ DBLoadFrameSettingsAtPos(storpos,Frameid);
+ return 0;
+}
+
+static int CLUIFramesStoreFrameSettings(int Frameid)
+{
+ int maxstored,storpos;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ if (Frameid < 0 || Frameid >= g_nFramesCount) return -1;
+
+ maxstored = db_get_w(0, CLUIFrameModule,"StoredFrames",-1);
+ if (maxstored == -1) maxstored = 0;
+
+ storpos = LocateStorePosition(Frameid,maxstored);
+ if (storpos == -1) {storpos = maxstored; maxstored++;}
+
+ DBStoreFrameSettingsAtPos(storpos,Frameid);
+ db_set_w(0, CLUIFrameModule,"StoredFrames",(WORD)maxstored);
+
+ return 0;
+}
+
+static int CLUIFramesStoreAllFrames()
+{
+ int i;
+ if (_fCluiFramesModuleNotStarted) return -1;
+ for (i=0; i < g_nFramesCount; i++)
+ CLUIFramesStoreFrameSettings(i);
+ return 0;
+}
+
+static int CLUIFramesGetalClientFrame(void)
+{
+ int i;
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ if ( _nClientFrameId != eUnknownId ) {
+ /* this value could become invalid if RemoveItemFromList was called,
+ * so we double-check */
+ if (_nClientFrameId < g_nFramesCount) {
+ if (g_pfwFrames[_nClientFrameId].align == alClient) {
+ return _nClientFrameId;
+ }
+ }
+ }
+
+ for (i=0; i < g_nFramesCount; i++)
+ if (g_pfwFrames[i].align == alClient) {
+ _nClientFrameId = i;
+ return i;
+ }
+ return -1;
+}
+
+static HMENU CLUIFramesCreateMenuForFrame(int frameid,int root,int popuppos,HGENMENU (*pfnAdd)(CLISTMENUITEM*))
+{
+ //TMO_MenuItem tmi;
+ HGENMENU menuid;
+ int framepos = id2pos(frameid);
+
+ if (_fCluiFramesModuleNotStarted)
+ return NULL;
+
+ CLISTMENUITEM mi = { 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) _hmiVisible = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MIVisible = menuid;
+
+ popuppos += 100000;
+
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Show title");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService = MS_CLIST_FRAMES_SHFRAMETITLEBAR;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) _hmiTBVisible = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MITBVisible = menuid;
+
+ 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) _hmiLock = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MILock = menuid;
+
+ mi.pszPopupName = (char *)root;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Expanded");
+ mi.flags = CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService = MS_CLIST_FRAMES_UCOLLFRAME;
+ mi.pszContactOwner = (char *)0;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) _hmiColl = menuid;
+ else g_pfwFrames[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) _hmiFloating = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MIFloating = menuid;
+
+ 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) _hmiBorder = menuid;
+ else g_pfwFrames[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) _hmiAlignRoot = menuid;
+ else g_pfwFrames[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) _hmiAlignTop = menuid;
+ else g_pfwFrames[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) _hmiAlignClient = menuid;
+ else g_pfwFrames[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) _hmiAlignBottom = menuid;
+ else g_pfwFrames[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);
+ if (frameid == -1) _hmiPosRoot = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MIPosRoot = menuid;
+ //??????
+ mi.pszPopupName = (char *)menuid;
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Up");
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszService = CLUIFRAMESMOVEUP;
+ mi.pszContactOwner = (char *)1;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) _hmiPosUp = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MIPosUp = menuid;
+
+ mi.popupPosition = frameid;
+ mi.position = popuppos++;
+ mi.pszName = LPGEN("&Down");
+ mi.flags = CMIF_CHILDPOPUP;
+ mi.pszService = CLUIFRAMESMOVEDOWN;
+ mi.pszContactOwner = (char *)-1;
+ menuid = pfnAdd(&mi);
+ if (frameid == -1) _hmiPosDown = menuid;
+ else g_pfwFrames[framepos].MenuHandles.MIPosDown = menuid;
+
+ }
+
+ return 0;
+}
+
+static int ModifyMItem(WPARAM wParam,LPARAM lParam)
+{
+ if ((int)wParam == -1 ) return 0; // FIXME
+
+ return CallService(MS_CLIST_MODIFYMENUITEM, wParam, lParam);
+};
+
+
+static int CLUIFramesModifyContextMenuForFrame(WPARAM wParam,LPARAM lParam)
+{
+ /* HOOK */
+ if (MirandaExiting()) return 0;
+ if (_fCluiFramesModuleNotStarted) return -1;
+ int pos = id2pos(wParam);
+ if (pos >= 0 && pos < g_nFramesCount) {
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIM_FLAGS|CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR;
+ if (g_pfwFrames[pos].visible) mi.flags |= CMIF_CHECKED;
+ mi.ptszName = g_pfwFrames[pos].TitleBar.tbname ? g_pfwFrames[pos].TitleBar.tbname : g_pfwFrames[pos].Name;
+ ModifyMItem((WPARAM)_hmiVisible,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].Locked) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiLock,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].TitleBar.ShowTitleBar) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiTBVisible,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].floating) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiFloating,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if ( g_CluiData.fLayered ) mi.flags |= CMIF_GRAYED;
+ else if ((g_pfwFrames[pos].UseBorder)) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiBorder,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].align&alTop) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiAlignTop,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].align&alClient) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiAlignClient,(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].align&alBottom) mi.flags |= CMIF_CHECKED;
+ ModifyMItem((WPARAM)_hmiAlignBottom,(LPARAM)&mi);
+
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].collapsed) mi.flags |= CMIF_CHECKED;
+ if ((!g_pfwFrames[pos].visible) || (g_pfwFrames[pos].Locked) || (pos == CLUIFramesGetalClientFrame())) mi.flags |= CMIF_GRAYED;
+ ModifyMItem((WPARAM)_hmiColl,(LPARAM)&mi);
+ }
+ return 0;
+}
+
+static int CLUIFramesModifyMainMenuItems(WPARAM wParam,LPARAM lParam)
+{
+ //hiword(wParam) = frameid,loword(wParam) = flag
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ int pos = id2pos(wParam);
+
+ if (pos >= 0 && pos < g_nFramesCount) {
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIM_FLAGS|CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR;
+ if (g_pfwFrames[pos].visible) mi.flags |= CMIF_CHECKED;
+ mi.ptszName = g_pfwFrames[pos].TitleBar.tbname ? g_pfwFrames[pos].TitleBar.tbname : g_pfwFrames[pos].Name;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIVisible, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].Locked) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MILock, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].TitleBar.ShowTitleBar) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MITBVisible, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].floating) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIFloating, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+
+ if ( g_CluiData.fLayered ) mi.flags |= CMIF_GRAYED;
+ else if ((g_pfwFrames[pos].UseBorder)) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIBorder, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP|((g_pfwFrames[pos].align&alClient)?CMIF_GRAYED:0);
+ if (g_pfwFrames[pos].align&alTop) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIAlignTop, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].align&alClient) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIAlignClient, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP|((g_pfwFrames[pos].align&alClient)?CMIF_GRAYED:0);
+ if (g_pfwFrames[pos].align&alBottom) mi.flags |= CMIF_CHECKED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIAlignBottom, &mi);
+
+ mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if (g_pfwFrames[pos].collapsed) mi.flags |= CMIF_CHECKED;
+ if ((!g_pfwFrames[pos].visible) || g_pfwFrames[pos].Locked || (pos == CLUIFramesGetalClientFrame())) mi.flags |= CMIF_GRAYED;
+ Menu_ModifyItem(g_pfwFrames[pos].MenuHandles.MIColl, &mi);
+ }
+
+ return 0;
+}
+
+
+static INT_PTR _us_DoGetFrameOptions(WPARAM wParam,LPARAM lParam)
+{
+ INT_PTR retval;
+ BOOL bUnicodeText = (LOWORD(wParam) & FO_UNICODETEXT) != 0;
+ wParam = MAKEWPARAM((LOWORD(wParam)) & ~FO_UNICODETEXT, HIWORD(wParam));
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ int pos = id2pos(HIWORD(wParam));
+ if (pos < 0 || pos >= g_nFramesCount)
+ return -1;
+
+ switch(LOWORD(wParam)) {
+ case FO_FLAGS:
+ retval = 0;
+ if (g_pfwFrames[pos].visible) retval |= F_VISIBLE;
+ if ( !g_pfwFrames[pos].collapsed) retval |= F_UNCOLLAPSED;
+ if (g_pfwFrames[pos].Locked) retval |= F_LOCKED;
+ if (g_pfwFrames[pos].TitleBar.ShowTitleBar) retval |= F_SHOWTB;
+ if (g_pfwFrames[pos].TitleBar.ShowTitleBarTip) retval |= F_SHOWTBTIP;
+ if ( !g_CluiData.fLayered) {
+ if ( !(GetWindowLongPtr(g_pfwFrames[pos].hWnd,GWL_STYLE)&WS_BORDER))
+ retval |= F_NOBORDER;
+ }
+ else if ( !g_pfwFrames[pos].UseBorder)
+ retval |= F_NOBORDER;
+ break;
+
+ case FO_NAME:
+ if (bUnicodeText)
+ retval = (INT_PTR)g_pfwFrames[pos].Name;
+ else
+ retval = (INT_PTR)g_pfwFrames[pos].szName;
+ break;
+
+ case FO_TBNAME:
+ if (bUnicodeText)
+ retval = (INT_PTR)g_pfwFrames[pos].TitleBar.tbname;
+ else
+ retval = (INT_PTR)g_pfwFrames[pos].TitleBar.sztbname;
+ break;
+
+ case FO_TBTIPNAME:
+ if (bUnicodeText)
+ retval = (INT_PTR)g_pfwFrames[pos].TitleBar.tooltip;
+ else
+ retval = (INT_PTR)g_pfwFrames[pos].TitleBar.sztooltip;
+ break;
+
+ case FO_TBSTYLE:
+ retval = GetWindowLongPtr(g_pfwFrames[pos].TitleBar.hwnd,GWL_STYLE);
+ break;
+
+ case FO_TBEXSTYLE:
+ retval = GetWindowLongPtr(g_pfwFrames[pos].TitleBar.hwnd,GWL_EXSTYLE);
+ break;
+
+ case FO_ICON:
+ retval = (INT_PTR)g_pfwFrames[pos].TitleBar.hicon;
+ break;
+
+ case FO_HEIGHT:
+ retval = (INT_PTR)g_pfwFrames[pos].height;
+ break;
+
+ case FO_ALIGN:
+ retval = (INT_PTR)g_pfwFrames[pos].align;
+ break;
+ case FO_FLOATING:
+ retval = (INT_PTR)g_pfwFrames[pos].floating;
+ break;
+ default:
+ retval = -1;
+ break;
+ }
+
+ return retval;
+}
+
+static int UpdateTBToolTip(int framepos)
+{
+ TOOLINFO ti = { sizeof(ti) };
+ ti.lpszText = g_pfwFrames[framepos].TitleBar.tooltip;
+ ti.hinst = g_hInst;
+ ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS ;
+ ti.uId = (UINT_PTR)g_pfwFrames[framepos].TitleBar.hwnd;
+ return SendMessage(g_pfwFrames[framepos].TitleBar.hwndTip, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
+}
+
+//hiword(wParam) = frameid,loword(wParam) = flag
+static int _us_DoSetFrameOptions(WPARAM wParam,LPARAM lParam)
+{
+ int retval; // value to be returned
+ BOOL bUnicodeText = (LOWORD(wParam) & FO_UNICODETEXT) != 0;
+ wParam = MAKEWPARAM((LOWORD(wParam))& ~FO_UNICODETEXT, HIWORD(wParam));
+ if (_fCluiFramesModuleNotStarted)
+ return -1;
+
+ int pos = id2pos(HIWORD(wParam));
+ if (pos < 0 || pos >= g_nFramesCount)
+ return -1;
+
+ FRAMEWND &fw = g_pfwFrames[pos];
+
+ switch(LOWORD(wParam)) {
+ case FO_FLAGS:
+ fw.dwFlags = lParam;
+ fw.visible = FALSE;
+ if (lParam & F_VISIBLE) fw.visible = TRUE;
+
+ fw.collapsed = TRUE;
+ if (lParam & F_UNCOLLAPSED) fw.collapsed = FALSE;
+
+ fw.Locked = FALSE;
+ if (lParam & F_LOCKED) fw.Locked = TRUE;
+
+ fw.UseBorder = TRUE;
+ if (lParam & F_NOBORDER) fw.UseBorder = FALSE;
+
+ fw.TitleBar.ShowTitleBar = FALSE;
+ if (lParam & F_SHOWTB) fw.TitleBar.ShowTitleBar = TRUE;
+
+ fw.TitleBar.ShowTitleBarTip = FALSE;
+ if (lParam & F_SHOWTBTIP) fw.TitleBar.ShowTitleBarTip = TRUE;
+
+ SendMessageA(fw.TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)fw.TitleBar.ShowTitleBarTip,0);
+ {
+ int style = (int)GetWindowLongPtr(fw.hWnd,GWL_STYLE);
+ style &= (~WS_BORDER);
+ if ( !(lParam & F_NOBORDER ) && !g_CluiData.fLayered )
+ style |= WS_BORDER;
+
+ SetWindowLongPtr(fw.hWnd,GWL_STYLE,(long)style);
+ SetWindowLongPtr(fw.TitleBar.hwnd,GWL_STYLE,(long)style& ~(WS_VSCROLL | WS_HSCROLL));
+ }
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ SetWindowPos(fw.TitleBar.hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED|SWP_NOACTIVATE);
+ return 0;
+
+ case FO_NAME:
+ if (lParam == 0)
+ return -1;
+
+ mir_free(fw.Name);
+ mir_free(fw.szName);
+ if (bUnicodeText) {
+ fw.Name = mir_tstrdup((LPTSTR)lParam);
+ fw.szName = mir_t2a((LPTSTR)lParam);
+ }
+ else {
+ fw.szName = mir_strdup((char*)lParam);
+ fw.Name = mir_a2t((char *)lParam);
+ }
+ return 0;
+
+ case FO_TBNAME:
+ if (lParam == 0) { return(-1);}
+
+ mir_free(fw.TitleBar.tbname);
+ mir_free(fw.TitleBar.sztbname);
+ if (bUnicodeText) {
+ fw.TitleBar.tbname = mir_tstrdup((LPTSTR)lParam);
+ fw.TitleBar.sztbname = mir_t2a((LPTSTR)lParam);
+ }
+ else {
+ fw.TitleBar.sztbname = mir_strdup((char*)lParam);
+ fw.TitleBar.tbname = mir_a2t((char*)lParam);
+ }
+
+ if (fw.floating && (fw.TitleBar.tbname != NULL))
+ SetWindowText(fw.ContainerWnd,fw.TitleBar.tbname);
+ return 0;
+
+ case FO_TBTIPNAME:
+ if (lParam == 0) { return(-1);}
+ if (fw.TitleBar.tooltip != NULL) mir_free_and_nil(fw.TitleBar.tooltip);
+ if (fw.TitleBar.sztooltip != NULL) mir_free_and_nil(fw.TitleBar.sztooltip);
+ if (bUnicodeText)
+ {
+ fw.TitleBar.tooltip = mir_tstrdup((LPTSTR)lParam);
+ fw.TitleBar.sztooltip = mir_t2a((LPTSTR)lParam);
+ }
+ else
+ {
+ fw.TitleBar.sztooltip = mir_strdup((char*)lParam);
+ fw.TitleBar.tooltip = mir_a2t((char*)lParam);
+ }
+ UpdateTBToolTip(pos);
+ return 0;
+
+ case FO_TBSTYLE:
+ SetWindowLongPtr(fw.TitleBar.hwnd,GWL_STYLE,lParam& ~(WS_VSCROLL | WS_HSCROLL));
+ return 0;
+
+ case FO_TBEXSTYLE:
+ SetWindowLongPtr(fw.TitleBar.hwnd,GWL_EXSTYLE,lParam);
+ return 0;
+
+ case FO_ICON:
+ fw.TitleBar.hicon = (HICON)lParam;
+ return 0;
+
+ case FO_HEIGHT:
+ if (lParam < 0) { return -1;}
+
+ if (fw.collapsed)
+ {
+ int oldHeight = fw.height;
+ retval = fw.height;
+ fw.height = lParam;
+ if ( !CLUIFramesFitInSize()) fw.height = retval;
+ retval = fw.height;
+ if (fw.height != oldHeight && !fw.floating)
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ }
+ else
+ {
+ retval = fw.HeightWhenCollapsed;
+ fw.HeightWhenCollapsed = lParam;
+ if ( !CLUIFramesFitInSize()) fw.HeightWhenCollapsed = retval;
+ retval = fw.HeightWhenCollapsed;
+
+ }
+ return retval;
+
+ case FO_FLOATING:
+ if (lParam < 0) { return -1;}
+
+ {
+ int id = fw.id;
+ fw.floating = !(lParam);
+
+
+ CLUIFrames_SetFrameFloat(id,1);//lparam = 1 use stored width and height
+ return(wParam);
+ }
+
+ case FO_ALIGN:
+ if ( !(lParam&alTop || lParam&alBottom || lParam&alClient))
+ {
+ TRACE("Wrong align option \r\n");
+ return (-1);
+ };
+
+ if ((lParam&alClient) && (CLUIFramesGetalClientFrame() >= 0)) { //only one alClient frame possible
+ _nClientFrameId = eUnknownId;//recalc it
+
+ return -1;
+ }
+ fw.align = lParam;
+ return 0;
+ }
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return -1;
+}
+
+//wparam = lparam = 0
+static int _us_DoShowAllFrames(WPARAM wParam,LPARAM lParam)
+{
+ int i;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ for (i=0; i < g_nFramesCount; i++)
+ g_pfwFrames[i].visible = TRUE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return 0;
+}
+
+//wparam = lparam = 0
+static int _us_DoShowTitles(WPARAM wParam,LPARAM lParam)
+{
+ int i;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ for (i=0; i < g_nFramesCount; i++)
+ g_pfwFrames[i].TitleBar.ShowTitleBar = TRUE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return 0;
+}
+
+//wparam = lparam = 0
+static int _us_DoHideTitles(WPARAM wParam,LPARAM lParam)
+{
+ int i;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ for (i=0; i < g_nFramesCount; i++)
+ g_pfwFrames[i].TitleBar.ShowTitleBar = FALSE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return 0;
+}
+
+//wparam = frameid
+static int _us_DoShowHideFrame(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted)
+ return -1;
+
+ int pos = (wParam == 0) ? lParam : id2pos(wParam);
+ if (pos >= 0 && (int)pos < g_nFramesCount) {
+ g_pfwFrames[pos].visible = !g_pfwFrames[pos].visible;
+ if (g_pfwFrames[pos].OwnerWindow != (HWND)-2) {
+ if (g_pfwFrames[pos].OwnerWindow)
+ CLUI_ShowWindowMod(g_pfwFrames[pos].OwnerWindow,(g_pfwFrames[pos].visible && g_pfwFrames[pos].collapsed && IsWindowVisible(pcli->hwndContactList))?SW_SHOW/*NOACTIVATE*/:SW_HIDE);
+ else if (g_pfwFrames[pos].visible) {
+ g_pfwFrames[pos].OwnerWindow = CreateSubContainerWindow(pcli->hwndContactList,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,10, 10);
+ SetParent(g_pfwFrames[pos].hWnd,g_pfwFrames[pos].OwnerWindow);
+ CLUI_ShowWindowMod(g_pfwFrames[pos].OwnerWindow,(g_pfwFrames[pos].visible && g_pfwFrames[pos].collapsed && IsWindowVisible(pcli->hwndContactList))?SW_SHOW/*NOACTIVATE*/:SW_HIDE);
+ }
+ }
+
+ if (g_pfwFrames[pos].floating)
+ CLUIFrameResizeFloatingFrame(pos);
+
+ if ( !g_pfwFrames[pos].floating)
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList, 0);
+ }
+ return 0;
+}
+
+//wparam = frameid
+static int _us_DoShowHideFrameTitle(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted)
+ return -1;
+
+ int pos = (wParam == 0) ? lParam : id2pos(wParam);
+ if (pos >= 0 && (int)pos < g_nFramesCount)
+ g_pfwFrames[pos].TitleBar.ShowTitleBar = !g_pfwFrames[pos].TitleBar.ShowTitleBar;
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return 0;
+}
+
+//wparam = frameid
+//lparam = -1 up ,1 down
+static int _us_DoMoveFrame(WPARAM wParam,LPARAM lParam)
+{
+ int i,curpos,curalign,v,tmpval;
+
+ if (_fCluiFramesModuleNotStarted)
+ return -1;
+
+ int pos = id2pos(wParam);
+ if (pos >= 0 && (int)pos < g_nFramesCount) {
+ SortData *sd;
+ curpos = g_pfwFrames[pos].order;
+ curalign = g_pfwFrames[pos].align;
+ v = 0;
+ sd = (SortData*)malloc(sizeof(SortData)*g_nFramesCount);
+ memset(sd, 0, sizeof(SortData)*g_nFramesCount);
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if (g_pfwFrames[i].floating || (!g_pfwFrames[i].visible) || (g_pfwFrames[i].align != curalign)){continue;};
+
+ sd[v].order = g_pfwFrames[i].order;
+ sd[v].realpos = i;
+ v++;
+ };
+ if (v == 0){return 0;};
+ qsort(sd,v,sizeof(SortData),sortfunc);
+ for (i=0; i < v; i++)
+ g_pfwFrames[sd[i].realpos].order = i+1; //to be sure that order is incremental
+ for (i=0; i < v; i++) {
+ if (sd[i].realpos == pos) {
+ if (lParam == -1) {
+ if (i >= v-1) break;
+ tmpval = g_pfwFrames[sd[i+1].realpos].order;
+ g_pfwFrames[sd[i+1].realpos].order = g_pfwFrames[pos].order;
+ g_pfwFrames[pos].order = tmpval;
+ break;
+ }
+
+ if (lParam == 1) {
+ if (i < 1) break;
+ tmpval = g_pfwFrames[sd[i-1].realpos].order;
+ g_pfwFrames[sd[i-1].realpos].order = g_pfwFrames[pos].order;
+ g_pfwFrames[pos].order = tmpval;
+ break;
+ }
+ }
+ }
+
+ free(sd);
+ CLUIFramesStoreFrameSettings(pos);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ }
+
+ return 0;
+}
+
+static int _us_DoMoveFrameUp(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFrames_MoveFrame(wParam,(LPARAM)+1);
+}
+
+static int _us_DoMoveFrameDown(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFrames_MoveFrame(wParam,(LPARAM)-1);
+}
+
+//wparam = frameid
+//lparam = alignment
+static int _us_DoSetFrameAlign(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ CLUIFrames_SetFrameOptions(MAKEWPARAM(FO_ALIGN,wParam),lParam);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return 0;
+}
+
+static int _us_DoAlignFrameTop(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ return CLUIFrames_SetFrameAlign(wParam,alTop);
+}
+
+static int _us_DoAlignFrameBottom(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ return CLUIFrames_SetFrameAlign(wParam,alBottom);
+}
+
+static int _us_DoAlignFrameClient(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ return CLUIFrames_SetFrameAlign(wParam,alClient);
+}
+
+//wparam = frameid
+static int _us_DoLockFrame(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ int pos = (wParam == 0) ? lParam : id2pos(wParam);
+ if (pos >= 0 && (int)pos < g_nFramesCount) {
+ g_pfwFrames[pos].Locked = !g_pfwFrames[pos].Locked;
+ CLUIFramesStoreFrameSettings(pos);
+ }
+
+ return 0;
+}
+
+//wparam = frameid
+static int _us_DoSetFrameBorder(WPARAM wParam,LPARAM lParam)
+{
+ RECT rc;
+ int oldflags;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ int FrameId = (wParam == 0) ? lParam : id2pos(wParam);
+ if (FrameId == -1)
+ return -1;
+
+ int 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 = g_pfwFrames[FrameId].hWnd;
+ GetWindowRect(hw,&rc);
+
+ CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),oldflags);
+ SetWindowPos(hw, 0, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE|SWP_DRAWFRAME);
+ return 0;
+}
+
+//wparam = frameid
+static int _us_DoCollapseFrame(WPARAM wParam,LPARAM lParam)
+{
+ int FrameId;
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ if (wParam == 0) {
+ FrameId = lParam;
+ } else {
+ FrameId = id2pos(wParam);
+ }
+ if (FrameId >= 0 && FrameId < g_nFramesCount)
+ {
+ int oldHeight;
+
+ // do not collapse/uncollapse client/locked/invisible frames
+ if (g_pfwFrames[FrameId].align == alClient && !(g_pfwFrames[FrameId].Locked || (!g_pfwFrames[FrameId].visible) || g_pfwFrames[FrameId].floating))
+ {
+ RECT rc;
+ if (CallService(MS_CLIST_DOCKINGISDOCKED, 0, 0)) {return 0;};
+ if ( !g_CluiData.fDocked && g_CluiData.fAutoSize) {return 0;};
+ GetWindowRect(pcli->hwndContactList,&rc);
+
+ if (g_pfwFrames[FrameId].collapsed == TRUE) {
+ rc.bottom -= rc.top;
+ rc.bottom -= g_pfwFrames[FrameId].height;
+ g_pfwFrames[FrameId].HeightWhenCollapsed = g_pfwFrames[FrameId].height;
+ g_pfwFrames[FrameId].collapsed = FALSE;
+ }
+ else
+ {
+ rc.bottom -= rc.top;
+ rc.bottom += g_pfwFrames[FrameId].HeightWhenCollapsed;
+ g_pfwFrames[FrameId].collapsed = TRUE;
+ }
+
+ SetWindowPos(pcli->hwndContactList,NULL, 0, 0, rc.right-rc.left,rc.bottom,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
+
+ CLUIFramesStoreAllFrames();
+
+
+ return 0;
+
+ }
+ if (g_pfwFrames[FrameId].Locked || (!g_pfwFrames[FrameId].visible)) return 0;
+
+ oldHeight = g_pfwFrames[FrameId].height;
+
+ // if collapsed, uncollapse
+ if (g_pfwFrames[FrameId].collapsed == TRUE) {
+ g_pfwFrames[FrameId].HeightWhenCollapsed = g_pfwFrames[FrameId].height;
+ g_pfwFrames[FrameId].height = UNCOLLAPSED_FRAME_SIZE;
+ g_pfwFrames[FrameId].collapsed = FALSE;
+ }
+ // if uncollapsed, collapse
+ else {
+ g_pfwFrames[FrameId].height = g_pfwFrames[FrameId].HeightWhenCollapsed;
+ g_pfwFrames[FrameId].collapsed = TRUE;
+ }
+
+ if ( !g_pfwFrames[FrameId].floating)
+ {
+
+ if ( !CLUIFramesFitInSize()) {
+ //cant collapse,we can resize only for height < alclient frame height
+ int alfrm = CLUIFramesGetalClientFrame();
+
+ if (alfrm != -1) {
+ g_pfwFrames[FrameId].collapsed = FALSE;
+ if (g_pfwFrames[alfrm].height>2*UNCOLLAPSED_FRAME_SIZE) {
+ oldHeight = g_pfwFrames[alfrm].height-UNCOLLAPSED_FRAME_SIZE;
+ g_pfwFrames[FrameId].collapsed = TRUE;
+ }
+ }else
+ {
+ int i,sumheight = 0;
+ for (i=0; i < g_nFramesCount; i++) {
+ if ((g_pfwFrames[i].align != alClient) && (!g_pfwFrames[i].floating) && (g_pfwFrames[i].visible) && (!g_pfwFrames[i].needhide)) {
+ sumheight += (g_pfwFrames[i].height)+(g_nTitleBarHeight*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar))+2;
+ return FALSE;
+ }
+ if (sumheight>_nContactListHeight-0-2)
+ {
+ g_pfwFrames[FrameId].height = (_nContactListHeight-0-2)-sumheight;
+ }
+
+ }
+ }
+
+ g_pfwFrames[FrameId].height = oldHeight;
+
+ if (g_pfwFrames[FrameId].collapsed == FALSE) {
+
+ if ( !g_pfwFrames[FrameId].floating)
+ {
+ }
+ else
+ {
+ //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP, 0, 0, Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE);
+ SetWindowPos(g_pfwFrames[FrameId].ContainerWnd,HWND_TOP, 0, 0, g_pfwFrames[FrameId].wndSize.right-g_pfwFrames[FrameId].wndSize.left+6,g_pfwFrames[FrameId].height+DEFAULT_TITLEBAR_HEIGHT+4,SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOMOVE);
+ };
+
+
+ return -1;};//redraw not needed
+ }
+ };//floating test
+
+ //CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ if ( !g_pfwFrames[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(g_pfwFrames[FrameId].ContainerWnd,&contwnd);
+ contwnd.top = contwnd.bottom-contwnd.top;//height
+ contwnd.left = contwnd.right-contwnd.left;//width
+
+ contwnd.top -= (oldHeight-g_pfwFrames[FrameId].height);//newheight
+ SetWindowPos(g_pfwFrames[FrameId].ContainerWnd,HWND_TOP, 0, 0, contwnd.left,contwnd.top,SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOMOVE);
+ };
+ CLUIFramesStoreAllFrames();
+ return 0;
+ }
+ else
+ return -1;
+}
+
+static int CLUIFramesLoadMainMenu()
+{
+ if (_fCluiFramesModuleNotStarted)
+ return -1;
+
+ if (_hmiRoot != (HGENMENU)-1) {
+ CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)_hmiRoot,0);
+ _hmiRoot = (HGENMENU)-1;
+ }
+
+ // create root menu
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIF_ROOTHANDLE;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_FRAME);
+ mi.position = 3000090000;
+ mi.pszName = LPGEN("Frames");
+ _hmiRoot = Menu_AddMainMenuItem(&mi);
+
+ // create frames menu
+ int separator = 3000200000;
+ for (int i=0; i < g_nFramesCount; i++) {
+ mi.hIcon = g_pfwFrames[i].TitleBar.hicon;
+ mi.flags = CMIF_ROOTHANDLE | CMIF_TCHAR;
+ mi.position = separator;
+ mi.hParentMenu = _hmiRoot;
+ mi.ptszName = g_pfwFrames[i].TitleBar.tbname ? g_pfwFrames[i].TitleBar.tbname : g_pfwFrames[i].Name;
+ mi.pszService = 0;
+ g_pfwFrames[i].MenuHandles.MainMenuItem = Menu_AddMainMenuItem(&mi);
+ CLUIFramesCreateMenuForFrame(g_pfwFrames[i].id,(int)g_pfwFrames[i].MenuHandles.MainMenuItem,separator,Menu_AddMainMenuItem);
+ CLUIFramesModifyMainMenuItems(g_pfwFrames[i].id,0);
+ CallService(MS_CLIST_FRAMEMENUNOTIFY,(WPARAM)g_pfwFrames[i].id,(LPARAM)g_pfwFrames[i].MenuHandles.MainMenuItem);
+ separator++;
+ }
+
+ separator += 100000;
+
+ // create "show all frames" menu
+ mi.hIcon = NULL;
+ mi.flags = CMIF_ROOTHANDLE;
+ mi.position = separator++;
+ mi.hParentMenu = _hmiRoot;
+ mi.pszName = LPGEN("Show All Frames");
+ mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMES;
+ Menu_AddMainMenuItem(&mi);
+
+ // create "show all titlebars" menu
+ mi.position = separator++;
+ mi.pszName = LPGEN("Show All Titlebars");
+ mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMESTB;
+ Menu_AddMainMenuItem(&mi);
+
+ // create "hide all titlebars" menu
+ mi.position = separator++;
+ 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;
+ LOGFONTA logfont;
+ memset(&logfont, 0, sizeof(logfont));
+ memmove(logfont.lfFaceName,facename,sizeof(facename));
+ logfont.lfWeight = FW_NORMAL;
+ logfont.lfHeight = -10;
+ logfont.lfCharSet = DEFAULT_CHARSET;
+ hfont = CreateFontIndirectA(&logfont);
+ return hfont;
+}
+
+
+//wparam = (CLISTFrame*)clfrm
+static int _us_DoAddFrame(WPARAM wParam,LPARAM lParam)
+{
+ int style,retval;
+ //char * CustomName = NULL;
+ CLISTFrame *clfrm = (CLISTFrame *)wParam;
+
+ if (pcli->hwndContactList == 0) return -1;
+ if (_fCluiFramesModuleNotStarted) return -1;
+ if (clfrm->cbSize != sizeof(CLISTFrame)) return -1;
+ if ( !(_hTitleBarFont)) _hTitleBarFont = CLUILoadTitleBarFont();
+
+ g_pfwFrames = (FRAMEWND*)realloc(g_pfwFrames,sizeof(FRAMEWND)*(g_nFramesCount+1));
+
+ memset(&g_pfwFrames[g_nFramesCount], 0, sizeof(FRAMEWND));
+ g_pfwFrames[g_nFramesCount].id = _iNextFrameId++;
+ g_pfwFrames[g_nFramesCount].align = clfrm->align;
+ g_pfwFrames[g_nFramesCount].hWnd = clfrm->hWnd;
+ g_pfwFrames[g_nFramesCount].height = clfrm->height;
+ g_pfwFrames[g_nFramesCount].TitleBar.hicon = clfrm->hIcon;
+ //Frames[nFramescount].TitleBar.BackColour;
+ g_pfwFrames[g_nFramesCount].floating = FALSE;
+ if (clfrm->Flags&F_NO_SUBCONTAINER || !g_CluiData.fLayered)
+ g_pfwFrames[g_nFramesCount].OwnerWindow = (HWND)-2;
+ else g_pfwFrames[g_nFramesCount].OwnerWindow = 0;
+
+ //override tbbtip
+ //clfrm->Flags |= F_SHOWTBTIP;
+ //
+ if ( db_get_b(0, CLUIFrameModule,"RemoveAllBorders",0) == 1)
+ {
+ clfrm->Flags |= F_NOBORDER;
+ };
+ g_pfwFrames[g_nFramesCount].dwFlags = clfrm->Flags;
+
+ if (clfrm->name == NULL || ((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->wname) : lstrlenA(clfrm->name)) == 0) {
+ g_pfwFrames[g_nFramesCount].Name = (LPTSTR)mir_alloc(255 * sizeof(TCHAR));
+ GetClassName(g_pfwFrames[g_nFramesCount].hWnd,g_pfwFrames[g_nFramesCount].Name,255);
+ }
+ else
+ {
+ g_pfwFrames[g_nFramesCount].Name = (clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->wname) : mir_a2t(clfrm->name);
+ }
+ g_pfwFrames[g_nFramesCount].szName = mir_t2a(g_pfwFrames[g_nFramesCount].Name);
+ if (IsBadCodePtr((FARPROC)clfrm->TBname) || clfrm->TBname == NULL
+ || ((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->TBwname) : lstrlenA(clfrm->TBname)) == 0)
+ g_pfwFrames[g_nFramesCount].TitleBar.tbname = mir_tstrdup(g_pfwFrames[g_nFramesCount].Name);
+ else
+ g_pfwFrames[g_nFramesCount].TitleBar.tbname = (clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->TBwname) : mir_a2t(clfrm->TBname);
+ g_pfwFrames[g_nFramesCount].TitleBar.sztbname = mir_t2a(g_pfwFrames[g_nFramesCount].TitleBar.tbname);
+ g_pfwFrames[g_nFramesCount].needhide = FALSE;
+ g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBar = (clfrm->Flags&F_SHOWTB?TRUE:FALSE);
+ g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBarTip = (clfrm->Flags&F_SHOWTBTIP?TRUE:FALSE);
+
+ g_pfwFrames[g_nFramesCount].collapsed = (clfrm->Flags&F_UNCOLLAPSED)?FALSE:TRUE;
+
+
+ g_pfwFrames[g_nFramesCount].Locked = clfrm->Flags&F_LOCKED?TRUE:FALSE;
+ g_pfwFrames[g_nFramesCount].visible = clfrm->Flags&F_VISIBLE?TRUE:FALSE;
+
+ g_pfwFrames[g_nFramesCount].UseBorder = ((clfrm->Flags&F_NOBORDER) || g_CluiData.fLayered)?FALSE:TRUE;
+
+ //Frames[nFramescount].OwnerWindow = 0;
+
+
+
+ g_pfwFrames[g_nFramesCount].TitleBar.hwnd
+ = CreateWindow(CLUIFrameTitleBarClassName,g_pfwFrames[g_nFramesCount].Name,
+ ( db_get_b(0, CLUIFrameModule,"RemoveAllTitleBarBorders",1)?0:WS_BORDER)
+
+ |WS_CHILD|WS_CLIPCHILDREN|
+ (g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBar?WS_VISIBLE:0)|
+ WS_CLIPCHILDREN,
+ 0, 0, 0, 0, pcli->hwndContactList,NULL,g_hInst,NULL);
+ SetWindowLongPtr(g_pfwFrames[g_nFramesCount].TitleBar.hwnd,GWLP_USERDATA,g_pfwFrames[g_nFramesCount].id);
+
+
+ g_pfwFrames[g_nFramesCount].TitleBar.hwndTip
+ = CreateWindowExA(0, TOOLTIPS_CLASSA, NULL,
+ WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ pcli->hwndContactList, NULL, g_hInst,
+ NULL);
+
+ SetWindowPos(g_pfwFrames[g_nFramesCount].TitleBar.hwndTip, HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ {
+ TOOLINFOA ti;
+ int res;
+
+ ZeroMemory(&ti,sizeof(ti));
+ ti.cbSize = sizeof(ti);
+ ti.lpszText = "";
+ ti.hinst = g_hInst;
+ ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS ;
+ ti.uId = (UINT_PTR)g_pfwFrames[g_nFramesCount].TitleBar.hwnd;
+ res = SendMessageA(g_pfwFrames[g_nFramesCount].TitleBar.hwndTip,TTM_ADDTOOL, 0, (LPARAM)&ti);
+ }
+
+ SendMessageA(g_pfwFrames[g_nFramesCount].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)g_pfwFrames[g_nFramesCount].TitleBar.ShowTitleBarTip,0);
+
+ g_pfwFrames[g_nFramesCount].oldstyles = GetWindowLongPtr(g_pfwFrames[g_nFramesCount].hWnd,GWL_STYLE);
+ g_pfwFrames[g_nFramesCount].TitleBar.oldstyles = GetWindowLongPtr(g_pfwFrames[g_nFramesCount].TitleBar.hwnd,GWL_STYLE);
+ //Frames[nFramescount].FloatingPos.x =
+
+ retval = g_pfwFrames[g_nFramesCount].id;
+ g_pfwFrames[g_nFramesCount].order = g_nFramesCount+1;
+ g_nFramesCount++;
+
+
+ CLUIFramesLoadFrameSettings(id2pos(retval));
+ if (g_pfwFrames[g_nFramesCount-1].collapsed == FALSE)
+ {
+ g_pfwFrames[g_nFramesCount-1].height = 0;
+ }
+
+ // create frame
+
+
+ // else Frames[nFramescount-1].height = Frames[nFramescount-1].HeightWhenCollapsed;
+
+ style = GetWindowLongPtr(g_pfwFrames[g_nFramesCount-1].hWnd,GWL_STYLE);
+ style &= (~WS_BORDER);
+ style |= (((g_pfwFrames[g_nFramesCount-1].UseBorder) && !g_CluiData.fLayered)?WS_BORDER:0);
+ SetWindowLongPtr(g_pfwFrames[g_nFramesCount-1].hWnd,GWL_STYLE,style);
+ SetWindowLongPtr(g_pfwFrames[g_nFramesCount-1].TitleBar.hwnd,GWL_STYLE,style& ~(WS_VSCROLL | WS_HSCROLL));
+ SetWindowLongPtr(g_pfwFrames[g_nFramesCount-1].TitleBar.hwnd,GWL_STYLE,GetWindowLongPtr(g_pfwFrames[g_nFramesCount-1].TitleBar.hwnd,GWL_STYLE)&~(WS_VSCROLL|WS_HSCROLL));
+
+ if (g_pfwFrames[g_nFramesCount-1].order == 0){g_pfwFrames[g_nFramesCount-1].order = g_nFramesCount;};
+
+
+ //need to enlarge parent
+ {
+ RECT mainRect;
+ int mainHeight, minHeight;
+ GetWindowRect(pcli->hwndContactList,&mainRect);
+ mainHeight = mainRect.bottom-mainRect.top;
+ minHeight = CLUIFrames_GetTotalHeight();
+ if (mainHeight < minHeight)
+ {
+ BOOL Upward = FALSE;
+ Upward = !g_CluiData.fDocked && g_CluiData.fAutoSize && db_get_b(NULL,"CLUI","AutoSizeUpward",SETTING_AUTOSIZEUPWARD_DEFAULT);
+
+ if (Upward)
+ mainRect.top = mainRect.bottom-minHeight;
+ else
+ mainRect.bottom = mainRect.top+minHeight;
+ SetWindowPos(pcli->hwndContactList,NULL,mainRect.left,mainRect.top,mainRect.right-mainRect.left, mainRect.bottom-mainRect.top, SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOSENDCHANGING);
+ }
+ GetWindowRect(pcli->hwndContactList,&mainRect);
+ mainHeight = mainRect.bottom-mainRect.top;
+ }
+ _nClientFrameId = eUnknownId;//recalc it
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+
+ if (g_pfwFrames[g_nFramesCount-1].floating)
+ {
+
+ g_pfwFrames[g_nFramesCount-1].floating = FALSE;
+ //SetWindowPos(Frames[nFramescount-1].hw
+ CLUIFrames_SetFrameFloat(retval,1);//lparam = 1 use stored width and height
+ }
+ else
+ CLUIFrames_SetFrameFloat(retval,2);
+
+ /** Remove */
+ //_ExtFramesSrv_AddFrame( wParam, lParam);
+
+ return retval;
+}
+
+static int _us_DoRemoveFrame(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ pos = id2pos(wParam);
+
+ if (pos < 0 || pos>g_nFramesCount){return(-1);};
+
+ mir_free_and_nil(g_pfwFrames[pos].Name);
+ mir_free_and_nil(g_pfwFrames[pos].szName);
+ mir_free_and_nil(g_pfwFrames[pos].TitleBar.tbname);
+ mir_free_and_nil(g_pfwFrames[pos].TitleBar.sztbname);
+ mir_free_and_nil(g_pfwFrames[pos].TitleBar.tooltip);
+ mir_free_and_nil(g_pfwFrames[pos].TitleBar.sztooltip);
+ DestroyWindow(g_pfwFrames[pos].hWnd);
+ g_pfwFrames[pos].hWnd = (HWND)-1;
+ DestroyWindow(g_pfwFrames[pos].TitleBar.hwnd);
+ if (g_pfwFrames[pos].TitleBar.hwndTip)
+ DestroyWindow(g_pfwFrames[pos].TitleBar.hwndTip);
+ g_pfwFrames[pos].TitleBar.hwnd = (HWND)-1;
+ if (g_pfwFrames[pos].ContainerWnd && g_pfwFrames[pos].ContainerWnd != (HWND)-1) DestroyWindow(g_pfwFrames[pos].ContainerWnd);
+ g_pfwFrames[pos].ContainerWnd = (HWND)-1;
+ if (g_pfwFrames[pos].TitleBar.hmenu) DestroyMenu(g_pfwFrames[pos].TitleBar.hmenu);
+ g_pfwFrames[pos].PaintCallbackProc = NULL;
+ if (g_pfwFrames[pos].UpdateRgn) DeleteObject(g_pfwFrames[pos].UpdateRgn);
+
+ if (g_pfwFrames[pos].OwnerWindow != (HWND)-1
+ && g_pfwFrames[pos].OwnerWindow != (HWND)-2
+ && g_pfwFrames[pos].OwnerWindow != (HWND)0)
+ DestroyWindow(g_pfwFrames[pos].OwnerWindow);
+
+ g_pfwFrames[pos].OwnerWindow = NULL;
+ RemoveItemFromList(pos,&g_pfwFrames,&g_nFramesCount);
+
+ CLUI__cliInvalidateRect(pcli->hwndContactList,NULL,TRUE);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ CLUI__cliInvalidateRect(pcli->hwndContactList,NULL,TRUE);
+
+ return 0;
+};
+
+
+static int CLUIFramesForceUpdateTB(const FRAMEWND *Frame)
+{
+ if (Frame->TitleBar.hwnd != 0) RedrawWindow(Frame->TitleBar.hwnd,NULL,NULL,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME);
+ //UpdateWindow(Frame->TitleBar.hwnd);
+ return 0;
+}
+
+static int CLUIFramesForceUpdateFrame(const FRAMEWND *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);
+ //UpdateWindow(Frame->ContainerWnd);
+ };
+ return 0;
+}
+
+static int CLUIFrameMoveResize(const FRAMEWND *Frame)
+{
+ // we need to show or hide the frame?
+ if (Frame->visible && (!Frame->needhide)) {
+ if (Frame->OwnerWindow != (HWND)-2 && Frame->OwnerWindow)
+ {
+ // CLUI_ShowWindowMod(Frame->OwnerWindow,SW_SHOW);
+ }
+ CLUI_ShowWindowMod(Frame->hWnd,SW_SHOW/*NOACTIVATE*/);
+ CLUI_ShowWindowMod(Frame->TitleBar.hwnd,Frame->TitleBar.ShowTitleBar == TRUE?SW_SHOW/*NOACTIVATE*/:SW_HIDE);
+ }
+ else {
+ if (Frame->OwnerWindow && Frame->OwnerWindow != (HWND)(-1) && Frame->OwnerWindow != (HWND)(-2))
+ {
+ CLUI_ShowWindowMod(Frame->OwnerWindow,SW_HIDE);
+ }
+ CLUI_ShowWindowMod(Frame->hWnd,SW_HIDE);
+ CLUI_ShowWindowMod(Frame->TitleBar.hwnd,SW_HIDE);
+ return 0;
+ }
+
+ if (Frame->OwnerWindow && Frame->OwnerWindow != (HWND)-2 )
+ {
+ RECT pr;
+ POINT Off = {0};
+
+ ClientToScreen(pcli->hwndContactList,&Off);
+ GetWindowRect(pcli->hwndContactList,&pr);
+
+ if ( Frame->visible && (!Frame->collapsed || Frame->wndSize.bottom-Frame->wndSize.top == 0))
+ {
+ ShowWindowAsync( Frame->OwnerWindow, SW_HIDE );
+ ShowWindowAsync( Frame->hWnd, SW_HIDE );
+ }
+
+ {
+ SetWindowPos(Frame->OwnerWindow,NULL,Frame->wndSize.left+Off.x,Frame->wndSize.top+Off.y,
+ Frame->wndSize.right-Frame->wndSize.left,
+ Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE ); //- -= -=
+
+ SetWindowPos(Frame->hWnd,NULL, 0, 0,
+ Frame->wndSize.right-Frame->wndSize.left,
+ Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE);
+ }
+ // set titlebar position
+ if (Frame->TitleBar.ShowTitleBar) {
+ SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,
+ Frame->wndSize.right-Frame->wndSize.left,
+ g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE );
+ }
+ if ( Frame->visible && IsWindowVisible( pcli->hwndContactList ) && Frame->collapsed && Frame->wndSize.bottom-Frame->wndSize.top != 0 )
+ {
+ ShowWindow( Frame->OwnerWindow, SW_SHOW );
+ ShowWindow( Frame->hWnd, SW_SHOW );
+ }
+
+ }
+ else
+ {
+ // 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_NOACTIVATE);
+ // set titlebar position
+ if (Frame->TitleBar.ShowTitleBar) {
+ SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,
+ Frame->wndSize.right-Frame->wndSize.left,
+ g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE);
+
+ }
+ }
+ // Sleep(0);
+ return 0;
+}
+
+static BOOL CLUIFramesFitInSize(void)
+{
+ int i;
+ int sumheight = 0;
+ int tbh = 0; // title bar height
+ int clientfrm;
+ clientfrm = CLUIFramesGetalClientFrame();
+ if (clientfrm != -1)
+ tbh = g_nTitleBarHeight*btoint(g_pfwFrames[clientfrm].TitleBar.ShowTitleBar);
+
+ for (i=0; i < g_nFramesCount; i++) {
+ if ((g_pfwFrames[i].align != alClient) && (!g_pfwFrames[i].floating) && (g_pfwFrames[i].visible) && (!g_pfwFrames[i].needhide)) {
+ sumheight += (g_pfwFrames[i].height)+(g_nTitleBarHeight*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar))+2/*+btoint(Frames[i].UseBorder)*2*/;
+ if (sumheight>_nContactListHeight-tbh-2)
+ {
+ if ( !g_CluiData.fDocked && g_CluiData.fAutoSize)
+ {
+ return TRUE; //Can be required to enlarge
+ }
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+int CLUIFrames_GetTotalHeight()
+{
+ int i;
+ int sumheight = 0;
+ RECT border;
+ if (pcli->hwndContactList == NULL) return 0;
+
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if ((g_pfwFrames[i].visible) && (!g_pfwFrames[i].needhide) && (!g_pfwFrames[i].floating) && (pcli->hwndContactTree) && (g_pfwFrames[i].hWnd != pcli->hwndContactTree))
+ sumheight += (g_pfwFrames[i].height)+(g_nTitleBarHeight*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar));
+ };
+
+ GetBorderSize(pcli->hwndContactList,&border);
+
+ //GetWindowRect(pcli->hwndContactList,&winrect);
+ //GetClientRect(pcli->hwndContactList,&clirect);
+ // clirect.bottom -= clirect.top;
+ // clirect.bottom += border.top+border.bottom;
+ //allbord = (winrect.bottom-winrect.top)-(clirect.bottom-clirect.top);
+
+ //TODO minsize
+ sumheight += g_CluiData.TopClientMargin;
+ sumheight += g_CluiData.BottomClientMargin;
+ return max(db_get_w(NULL,"CLUI","MinHeight",SETTING_MINHEIGTH_DEFAULT),
+ (sumheight+border.top+border.bottom));
+}
+
+int CLUIFramesGetMinHeight()
+{
+ int i,tbh,clientfrm,sumheight = 0;
+ RECT border;
+ int allbord = 0;
+ if (pcli->hwndContactList == NULL) return 0;
+
+
+ // search for alClient frame and get the titlebar's height
+ tbh = 0;
+ clientfrm = CLUIFramesGetalClientFrame();
+ if (clientfrm != -1)
+ tbh = g_nTitleBarHeight*btoint(g_pfwFrames[clientfrm].TitleBar.ShowTitleBar);
+
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if ((g_pfwFrames[i].align != alClient) && (g_pfwFrames[i].visible) && (!g_pfwFrames[i].needhide) && (!g_pfwFrames[i].floating))
+ {
+ RECT wsize;
+
+ GetWindowRect(g_pfwFrames[i].hWnd,&wsize);
+ sumheight += (wsize.bottom-wsize.top)+(g_nTitleBarHeight*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar));
+ }
+ };
+
+ GetBorderSize(pcli->hwndContactList,&border);
+
+ //GetWindowRect(pcli->hwndContactList,&winrect);
+ //GetClientRect(pcli->hwndContactList,&clirect);
+ // clirect.bottom -= clirect.top;
+ // clirect.bottom += border.top+border.bottom;
+ //allbord = (winrect.bottom-winrect.top)-(clirect.bottom-clirect.top);
+
+ //TODO minsize
+ sumheight += g_CluiData.TopClientMargin;
+ sumheight += g_CluiData.BottomClientMargin;
+ return max(db_get_w(NULL,"CLUI","MinHeight",SETTING_MINHEIGTH_DEFAULT),
+ (sumheight+border.top+border.bottom+allbord+tbh) );
+}
+
+
+
+
+static int CLUIFramesResizeFrames(const RECT newsize)
+{
+ int sumheight = 9999999,newheight;
+ int prevframe,prevframebottomline;
+ int tbh,curfrmtbh;
+ int drawitems;
+ int clientfrm;
+ int i,j;
+ int sepw = GapBetweenFrames;
+ int topBorder = newsize.top;
+ int minHeight = CLUIFrames_GetTotalHeight();
+ SortData *sdarray;
+
+
+ g_CluiData.nGapBetweenTitlebar = (int)db_get_dw(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT);
+ GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT);
+
+ if (g_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 = (g_nTitleBarHeight+g_CluiData.nGapBetweenTitlebar)*btoint(g_pfwFrames[clientfrm].TitleBar.ShowTitleBar);
+
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if ( !g_pfwFrames[i].floating)
+ {
+ g_pfwFrames[i].needhide = FALSE;
+ g_pfwFrames[i].wndSize.left = newsize.left;
+ g_pfwFrames[i].wndSize.right = newsize.right;
+
+ };
+ };
+ {
+ //sorting stuff
+ sdarray = (SortData*)malloc(sizeof(SortData)*g_nFramesCount);
+ if (sdarray == NULL){return(-1);};
+ for (i=0; i < g_nFramesCount; i++)
+ {sdarray[i].order = g_pfwFrames[i].order;
+ sdarray[i].realpos = i;
+ };
+ qsort(sdarray,g_nFramesCount,sizeof(SortData),sortfunc);
+
+ }
+
+ drawitems = g_nFramesCount;
+
+ while(sumheight>(newheight-tbh) && drawitems>0) {
+ sumheight = 0;
+ drawitems = 0;
+ for (i=0; i < g_nFramesCount; i++) {
+ if (((g_pfwFrames[i].align != alClient)) && (!g_pfwFrames[i].floating) && (g_pfwFrames[i].visible) && (!g_pfwFrames[i].needhide)) {
+ drawitems++;
+ curfrmtbh = (g_nTitleBarHeight+g_CluiData.nGapBetweenTitlebar)*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar);
+ sumheight += (g_pfwFrames[i].height)+curfrmtbh+(i > 0 ? sepw : 0)+((g_pfwFrames[i].UseBorder && !g_CluiData.fLayered)?2:0);
+ if (sumheight>newheight-tbh) {
+ sumheight -= (g_pfwFrames[i].height)+curfrmtbh + (i > 0 ? sepw : 0);
+ g_pfwFrames[i].needhide = !g_CluiData.fDocked && g_CluiData.fAutoSize?FALSE:TRUE;
+ drawitems--;
+ break;
+ }
+ }
+ }
+ }
+
+ prevframe = -1;
+ prevframebottomline = topBorder;
+ for (j = 0;j < g_nFramesCount;j++) {
+ //move all alTop frames
+ i = sdarray[j].realpos;
+ if ((!g_pfwFrames[i].needhide) && (!g_pfwFrames[i].floating) && (g_pfwFrames[i].visible) && (g_pfwFrames[i].align == alTop)) {
+ curfrmtbh = (g_nTitleBarHeight+g_CluiData.nGapBetweenTitlebar)*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar);
+ g_pfwFrames[i].wndSize.top = prevframebottomline+(i > 0 ? sepw : 0)+(curfrmtbh);
+ g_pfwFrames[i].wndSize.bottom = g_pfwFrames[i].height+g_pfwFrames[i].wndSize.top+((g_pfwFrames[i].UseBorder && !g_CluiData.fLayered)?2:0);
+ g_pfwFrames[i].prevvisframe = prevframe;
+ prevframe = i;
+ prevframebottomline = g_pfwFrames[i].wndSize.bottom;
+ if (prevframebottomline>newheight){
+ //prevframebottomline -= Frames[i].height+(curfrmtbh+1);
+ //Frames[i].needhide = TRUE;
+ }
+ }
+ }
+
+ if (sumheight < newheight) {
+ for (j = 0;j < g_nFramesCount;j++) {
+ //move alClient frame
+ i = sdarray[j].realpos;
+ if ((!g_pfwFrames[i].needhide) && (!g_pfwFrames[i].floating) && (g_pfwFrames[i].visible) && (g_pfwFrames[i].align == alClient)) {
+ int oldh;
+ g_pfwFrames[i].wndSize.top = prevframebottomline+(j > 0 ? sepw : 0)+(tbh);
+ g_pfwFrames[i].wndSize.bottom = g_pfwFrames[i].wndSize.top+newheight-sumheight-tbh-(j > 0 ? sepw : 0);
+
+ oldh = g_pfwFrames[i].height;
+ g_pfwFrames[i].height = g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top;
+ g_pfwFrames[i].prevvisframe = prevframe;
+ prevframe = i;
+ prevframebottomline = g_pfwFrames[i].wndSize.bottom;
+ if (prevframebottomline>newheight) {
+ //prevframebottomline -= Frames[i].height+(tbh+1);
+ //Frames[i].needhide = TRUE;
+ }
+ break;
+ }
+ }
+ }
+
+ //newheight
+ prevframebottomline = newheight+sepw+topBorder;
+ //prevframe = -1;
+ for (j = g_nFramesCount-1;j >= 0;j--) {
+ //move all alBottom frames
+ i = sdarray[j].realpos;
+ if ((g_pfwFrames[i].visible) && (!g_pfwFrames[i].floating) && (!g_pfwFrames[i].needhide) && (g_pfwFrames[i].align == alBottom)) {
+ curfrmtbh = (g_nTitleBarHeight+g_CluiData.nGapBetweenTitlebar)*btoint(g_pfwFrames[i].TitleBar.ShowTitleBar);
+
+ g_pfwFrames[i].wndSize.bottom = prevframebottomline-(j > 0 ? sepw : 0);
+ g_pfwFrames[i].wndSize.top = g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].height-((g_pfwFrames[i].UseBorder && !g_CluiData.fLayered)?2:0);
+ g_pfwFrames[i].prevvisframe = prevframe;
+ prevframe = i;
+ prevframebottomline = g_pfwFrames[i].wndSize.top/*-1*/-curfrmtbh;
+ if (prevframebottomline>newheight) {
+
+ }
+ }
+ }
+ for (i=0; i < g_nFramesCount; i++)
+ if (g_pfwFrames[i].TitleBar.ShowTitleBar)
+ SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar);
+ if (sdarray != NULL){free(sdarray);sdarray = NULL;};
+
+
+
+ return 0;
+}
+
+static int SizeMoveNewSizes()
+{
+ int i;
+ for (i=0; i < g_nFramesCount; i++)
+ {
+
+ if (g_pfwFrames[i].floating){
+ CLUIFrameResizeFloatingFrame(i);
+ }else
+ {
+ CLUIFrameMoveResize(&g_pfwFrames[i]);
+ };
+ }
+ return 0;
+}
+
+
+static int CLUIFramesResize(RECT newsize)
+{
+ CLUIFramesResizeFrames(newsize);
+ SizeMoveNewSizes();
+ return 0;
+}
+int CLUIFrames_ApplyNewSizes(int mode)
+{
+ int i;
+ g_CluiData.mutexPreventDockMoving = 0;
+ for (i=0; i < g_nFramesCount; i++) {
+ if ((mode == 1 && g_pfwFrames[i].OwnerWindow != (HWND)-2 && g_pfwFrames[i].OwnerWindow) ||
+ (mode == 2 && g_pfwFrames[i].OwnerWindow == (HWND)-2) ||
+ (mode == 3))
+ if (g_pfwFrames[i].floating){
+ CLUIFrameResizeFloatingFrame(i);
+ }else
+ {
+ CLUIFrameMoveResize(&g_pfwFrames[i]);
+ };
+ }
+ if (IsWindowVisible(pcli->hwndContactList))
+ {
+ ske_DrawNonFramedObjects(1,0);
+ CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE, 0, 0);
+ }
+ g_CluiData.mutexPreventDockMoving = 1;
+ return 0;
+}
+
+static int _us_DoUpdateFrame(WPARAM wParam,LPARAM lParam)
+{
+ if (_fCluiFramesModuleNotStarted) return -1;
+ if (wParam == -1) { CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); return 0;}
+ if (lParam&FU_FMPOS) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,1);
+
+ int pos = id2pos( wParam );
+ if ( pos < 0 || pos >= g_nFramesCount ) { return -1; }
+ if ( lParam&FU_TBREDRAW ) CLUIFramesForceUpdateTB( &g_pfwFrames[pos] );
+ if ( lParam&FU_FMREDRAW ) CLUIFramesForceUpdateFrame( &g_pfwFrames[pos] );
+ return 0;
+}
+
+int CLUIFrames_OnClistResize_mod(WPARAM wParam,LPARAM mode)
+{
+ RECT nRect;
+ int tick;
+ GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT);
+ g_CluiData.nGapBetweenTitlebar = db_get_dw(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT);
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ GetClientRect(pcli->hwndContactList,&nRect);
+
+ nRect.left += g_CluiData.LeftClientMargin;
+ nRect.right -= g_CluiData.RightClientMargin;
+ nRect.top += g_CluiData.TopClientMargin;
+ nRect.bottom -= g_CluiData.BottomClientMargin;
+ // g_CluiData.mutexPreventDockMoving = 0;
+ tick = GetTickCount();
+ CLUIFramesResize(nRect);
+ if (mode == 0) CLUIFrames_ApplyNewSizes(3);
+
+ tick = GetTickCount()-tick;
+
+ Sleep(0);
+
+ //dont save to database too many times
+ if (GetTickCount()-_dwLastStoreTick>1000){ CLUIFramesStoreAllFrames();_dwLastStoreTick = GetTickCount();};
+
+ return 0;
+}
+
+int SizeFramesByWindowRect(RECT *r, HDWP * PosBatch, int mode)
+{
+ RECT nRect;
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ g_CluiData.nGapBetweenTitlebar = (int)db_get_dw(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT);
+ GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT);
+ nRect.left = 0;
+ nRect.top = 0;
+ nRect.right = r->right-r->left;
+ nRect.bottom = r->bottom-r->top;
+ nRect.left += g_CluiData.LeftClientMargin;
+ nRect.right -= g_CluiData.RightClientMargin;
+ nRect.top += g_CluiData.TopClientMargin;
+ nRect.bottom -= g_CluiData.BottomClientMargin;
+ CLUIFramesResizeFrames(nRect);
+ {
+ int i;
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ int dx;
+ int dy;
+ dx = 0;//rcNewWindowRect.left-rcOldWindowRect.left;
+ dy = 0;//_window_rect.top-rcOldWindowRect.top;
+ if ( !g_pfwFrames[i].floating)
+ {
+ if (g_pfwFrames[i].visible && !g_pfwFrames[i].needhide && !IsWindowVisible(g_pfwFrames[i].hWnd))
+ {
+ ShowWindow(g_pfwFrames[i].hWnd,SW_SHOW);
+ if (g_pfwFrames[i].TitleBar.ShowTitleBar) ShowWindow(g_pfwFrames[i].TitleBar.hwnd,SW_SHOW);
+ }
+ if (g_pfwFrames[i].OwnerWindow && (INT_PTR)(g_pfwFrames[i].OwnerWindow) != -2 )
+ {
+ if ( !(mode&2))
+ {
+ HWND hwnd;
+ hwnd = GetParent(g_pfwFrames[i].OwnerWindow);
+ *PosBatch = DeferWindowPos(*PosBatch,g_pfwFrames[i].OwnerWindow,NULL,g_pfwFrames[i].wndSize.left+r->left,g_pfwFrames[i].wndSize.top+r->top,
+ g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left, g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE);
+ SetWindowPos(g_pfwFrames[i].hWnd,NULL, 0, 0,
+ g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left, g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE/*|SWP_NOSENDCHANGING*/);
+ }
+ //Frame
+ if (g_pfwFrames[i].TitleBar.ShowTitleBar)
+ {
+ SetWindowPos(g_pfwFrames[i].TitleBar.hwnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar+dy,
+ g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE );
+ SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar);
+ UpdateWindow(g_pfwFrames[i].TitleBar.hwnd);
+ }
+ }
+ else
+ {
+ if (1)
+ {
+ int res = 0;
+ // set frame position
+ res = SetWindowPos(g_pfwFrames[i].hWnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top+dy,
+ g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,
+ g_pfwFrames[i].wndSize.bottom-g_pfwFrames[i].wndSize.top,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSENDCHANGING);
+ }
+ if (1)
+ {
+ // set titlebar position
+ if (g_pfwFrames[i].TitleBar.ShowTitleBar)
+ {
+ SetWindowPos(g_pfwFrames[i].TitleBar.hwnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar+dy,
+ g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSENDCHANGING );
+ SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar);
+
+ }
+ }
+ UpdateWindow(g_pfwFrames[i].hWnd);
+ if (g_pfwFrames[i].TitleBar.ShowTitleBar) UpdateWindow(g_pfwFrames[i].TitleBar.hwnd);
+ };
+ }
+
+ }
+ if (GetTickCount()-_dwLastStoreTick>1000)
+ {
+ CLUIFramesStoreAllFrames();
+ _dwLastStoreTick = GetTickCount();
+ };
+ }
+ return 0;
+}
+
+int CheckFramesPos(RECT *wr)
+{
+ //CALLED only FROM MainWindow procedure at CLUI.c
+ int i;
+ if (_fCluiFramesModuleNotStarted) return -1;
+ g_CluiData.nGapBetweenTitlebar = (int)db_get_dw(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT);
+ GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT);
+
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ int dx;
+ int dy;
+ dx = 0;//rcNewWindowRect.left-rcOldWindowRect.left;
+ dy = 0;//_window_rect.top-rcOldWindowRect.top;
+ if ( !g_pfwFrames[i].floating && g_pfwFrames[i].visible)
+ {
+ if ( !(g_pfwFrames[i].OwnerWindow && (INT_PTR)(g_pfwFrames[i].OwnerWindow) != -2))
+ {
+ RECT r;
+ GetWindowRect(g_pfwFrames[i].hWnd,&r);
+ if (r.top-wr->top != g_pfwFrames[i].wndSize.top || r.left-wr->left != g_pfwFrames[i].wndSize.left)
+ SetWindowPos(g_pfwFrames[i].hWnd,NULL,g_pfwFrames[i].wndSize.left, g_pfwFrames[i].wndSize.top, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
+ }
+ if (g_pfwFrames[i].TitleBar.ShowTitleBar)
+ {
+ RECT r;
+ GetWindowRect(g_pfwFrames[i].TitleBar.hwnd,&r);
+ if (r.top-wr->top != g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar || r.left-wr->left != g_pfwFrames[i].wndSize.left)
+ {
+ SetWindowPos(g_pfwFrames[i].TitleBar.hwnd,NULL,g_pfwFrames[i].wndSize.left+dx,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar+dy,
+ g_pfwFrames[i].wndSize.right-g_pfwFrames[i].wndSize.left,g_nTitleBarHeight,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE);
+ SetRect(&g_pfwFrames[i].TitleBar.wndSize,g_pfwFrames[i].wndSize.left,g_pfwFrames[i].wndSize.top-g_nTitleBarHeight-g_CluiData.nGapBetweenTitlebar,g_pfwFrames[i].wndSize.right,g_pfwFrames[i].wndSize.top-g_CluiData.nGapBetweenTitlebar);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam)
+{
+ RECT nRect;
+ int tick;
+ GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT);
+ g_CluiData.nGapBetweenTitlebar = db_get_dw(NULL,"CLUIFrames","GapBetweenTitleBar",SETTING_GAPTITLEBAR_DEFAULT);
+
+ if (_fCluiFramesModuleNotStarted) return -1;
+
+ //need to enlarge parent
+ {
+ RECT mainRect;
+ int mainHeight, minHeight;
+ GetWindowRect(pcli->hwndContactList,&mainRect);
+ mainHeight = mainRect.bottom-mainRect.top;
+ minHeight = CLUIFrames_GetTotalHeight();
+ if (mainHeight < minHeight)
+ {
+ BOOL Upward = FALSE;
+ Upward = !g_CluiData.fDocked && g_CluiData.fAutoSize && db_get_b(NULL,"CLUI","AutoSizeUpward",SETTING_AUTOSIZEUPWARD_DEFAULT);
+
+ if (Upward)
+ mainRect.top = mainRect.bottom-minHeight;
+ else
+ mainRect.bottom = mainRect.top+minHeight;
+ SetWindowPos(pcli->hwndContactList,NULL,mainRect.left,mainRect.top,mainRect.right-mainRect.left, mainRect.bottom-mainRect.top, SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE|SWP_NOSENDCHANGING);
+ }
+ GetWindowRect(pcli->hwndContactList,&mainRect);
+ mainHeight = mainRect.bottom-mainRect.top;
+ }
+ GetClientRect(pcli->hwndContactList,&nRect);
+ //$$$ Fixed borders
+ if (lParam && lParam != 1 && lParam != 2)
+ {
+ RECT oldRect;
+ POINT pt;
+ RECT *newRect = (RECT *)lParam;
+ int dl,dt,dr,db;
+ GetWindowRect((HWND)wParam,&oldRect);
+ pt.x = nRect.left;
+ pt.y = nRect.top;
+ ClientToScreen(pcli->hwndContactList,&pt);
+ dl = pt.x-oldRect.left;
+ dt = pt.y-oldRect.top;
+ dr = (oldRect.right-oldRect.left)-(nRect.right-nRect.left)-dl;
+ db = (oldRect.bottom-oldRect.top)-(nRect.bottom-nRect.top)-dt;
+ nRect.left = newRect->left+dl;
+ nRect.top = newRect->top+dt;
+ nRect.bottom = newRect->bottom-db;
+ nRect.right = newRect->right-dr;
+ }
+
+
+ //if (db_get_b(NULL,"CLUI","ShowSBar",SETTING_SHOWSBAR_DEFAULT))GetWindowRect(pcli->hwndStatus,&rcStatus);
+ //else rcStatus.top = rcStatus.bottom = 0;
+ // nRect.top--;
+ /* $$$ 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; $$$*/
+
+ nRect.left += g_CluiData.LeftClientMargin;
+ nRect.right -= g_CluiData.RightClientMargin;
+ nRect.top += g_CluiData.TopClientMargin;
+ nRect.bottom -= g_CluiData.BottomClientMargin;
+
+ if (nRect.bottom < nRect.top)
+ nRect.bottom = nRect.top;
+ _nContactListHeight = nRect.bottom-nRect.top; //$$
+
+ tick = GetTickCount();
+
+
+ CLUIFramesResize(nRect);
+
+ CLUIFrames_ApplyNewSizes(2);
+ CLUIFrames_ApplyNewSizes(1);
+
+ //resizing = FALSE;
+
+ tick = GetTickCount()-tick;
+
+ if (pcli->hwndContactList != 0) CLUI__cliInvalidateRect(pcli->hwndContactList,NULL,TRUE);
+ if (pcli->hwndContactList != 0) UpdateWindow(pcli->hwndContactList);
+
+ if (lParam == 2) RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE);
+
+
+ Sleep(0);
+
+ //dont save to database too many times
+ if (GetTickCount()-_dwLastStoreTick>1000){ CLUIFramesStoreAllFrames();_dwLastStoreTick = GetTickCount();};
+
+ return 0;
+}
+
+int OnFrameTitleBarBackgroundChange(WPARAM wParam,LPARAM lParam)
+{
+ if (MirandaExiting()) return 0;
+ {
+ DBVARIANT dbv = {0};
+
+ AlignCOLLIconToLeft = db_get_b(NULL,"FrameTitleBar","AlignCOLLIconToLeft",CLCDEFAULT_COLLICONTOLEFT);
+
+ bkColour = sttGetColor("FrameTitleBar","BkColour",CLCDEFAULT_BKCOLOUR);
+ bkUseWinColours = db_get_b(NULL,"FrameTitleBar","UseWinColours",CLCDEFAULT_USEWINDOWSCOLOURS);
+ SelBkColour = sttGetColor("FrameTitleBar","TextColour",CLCDEFAULT_TEXTCOLOUR);
+ if (hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground = NULL;}
+ if (g_CluiData.fDisableSkinEngine)
+ {
+ if ( db_get_b(NULL,"FrameTitleBar","UseBitmap",CLCDEFAULT_USEBITMAP)) {
+ if ( !db_get_s(NULL,"FrameTitleBar","BkBitmap",&dbv)) {
+ hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAP, 0, (LPARAM)dbv.pszVal);
+ db_free(&dbv);
+ }
+ }
+ backgroundBmpUse = db_get_w(NULL,"FrameTitleBar","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+ }
+ };
+
+ CLUI__cliInvalidateRect( pcli->hwndContactList, 0, 0 );
+
+ RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE);
+
+ return 0;
+}
+
+void DrawBackGround(HWND hwnd,HDC mhdc, HBITMAP hBmpBackground, COLORREF bkColour, DWORD backgroundBmpUse )
+{
+ 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);
+ SetStretchBltMode(hdcMem,HALFTONE);
+ { HBRUSH hBrush;
+
+ hBrush = CreateSolidBrush(bkColour);
+ FillRect(hdcMem,rcPaint,hBrush);
+ 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);
+ }
+ }
+}
+
+
+int DrawTitleBar(HDC hdcMem2,RECT *rect,int Frameid)
+{
+ int pos;
+ BOOL bThemed = FALSE;
+ HDC hdcMem;
+ HFONT hoTTBFont;
+ RECT rc = *rect;
+ HBRUSH hBack,hoBrush;
+ HBITMAP b1 = NULL,b2 = NULL;
+ hdcMem = CreateCompatibleDC(hdcMem2);
+
+ SetBkMode(hdcMem,TRANSPARENT);
+ hoTTBFont = (HFONT)SelectObject(hdcMem,_hTitleBarFont);
+ ske_ResetTextEffect(hdcMem);
+ ske_ResetTextEffect(hdcMem2);
+ hBack = GetSysColorBrush(COLOR_3DFACE);
+ hoBrush = (HBRUSH)SelectObject(hdcMem,hBack);
+
+ pos = id2pos(Frameid);
+
+ if (pos >= 0 && pos < g_nFramesCount)
+ {
+ GetClientRect(g_pfwFrames[pos].TitleBar.hwnd,&rc);
+ if (g_pfwFrames[pos].floating)
+ {
+
+ rc.bottom = rc.top+g_nTitleBarHeight;
+ g_pfwFrames[pos].TitleBar.wndSize = rc;
+ }
+ else
+ {
+ g_pfwFrames[pos].TitleBar.wndSize = rc;
+ }
+ b1 = ske_CreateDIB32(rc.right-rc.left,rc.bottom-rc.top);
+ b2 = (HBITMAP)SelectObject(hdcMem,b1);
+ if ( g_pfwFrames[pos].floating && !g_CluiData.fDisableSkinEngine)
+ {
+ FillRect(hdcMem,&rc,hBack);
+ //SelectObject(hdcMem,hoBrush);
+ SkinDrawGlyph(hdcMem,&rc,&rc,"Main,ID=FrameCaption");
+ }
+ else
+ {
+ if (g_CluiData.fDisableSkinEngine)
+ {
+ if ( !hBmpBackground && bkUseWinColours && xpt_IsThemed(_hFrameTitleTheme))
+ {
+ int state = CS_ACTIVE;
+ // if (GetForegroundWindow() != pcli->hwndContactList) state = CS_INACTIVE;
+ xpt_DrawThemeBackground(_hFrameTitleTheme,hdcMem, WP_SMALLCAPTION, state, &rc,&rc);
+ bThemed = TRUE;
+ }
+ else
+ DrawBackGround(g_pfwFrames[pos].TitleBar.hwnd,hdcMem, hBmpBackground, bkColour, backgroundBmpUse);
+ }
+ else if ( !g_CluiData.fLayered)
+ {
+ ske_BltBackImage(g_pfwFrames[pos].TitleBar.hwnd,hdcMem,&rc);
+ }
+ else BitBlt(hdcMem, 0, 0, rc.right-rc.left,rc.bottom-rc.top,hdcMem2,rect->left,rect->top,SRCCOPY);
+ SkinDrawGlyph(hdcMem,&rc,&rc,"Main,ID=FrameCaption");
+ }
+ if (bThemed)
+ SetTextColor(hdcMem,GetSysColor(COLOR_CAPTIONTEXT ));
+ else
+ SetTextColor(hdcMem,SelBkColour);
+ {
+ RECT textrc = rc;
+ if ( !AlignCOLLIconToLeft)
+ {
+
+ if (g_pfwFrames[pos].TitleBar.hicon != NULL)
+ {
+ mod_DrawIconEx_helper(hdcMem,rc.left +2,rc.top+((g_nTitleBarHeight>>1)-(GetSystemMetrics(SM_CYSMICON)>>1)),g_pfwFrames[pos].TitleBar.hicon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON), 0, NULL,DI_NORMAL);
+ textrc.left += GetSystemMetrics(SM_CXSMICON)+4;
+ textrc.top += 2;
+ }
+ else
+ {
+ textrc.left += 2;
+ textrc.top += 2;
+ }
+
+ }
+ else
+ {
+ textrc.left += GetSystemMetrics(SM_CXSMICON)+2;
+ textrc.top += 2;
+ }
+ ske_TextOut(hdcMem,textrc.left,textrc.top,g_pfwFrames[pos].TitleBar.tbname,lstrlen(g_pfwFrames[pos].TitleBar.tbname));
+
+ }
+ if ( !AlignCOLLIconToLeft)
+ {
+ mod_DrawIconEx_helper(hdcMem,g_pfwFrames[pos].TitleBar.wndSize.right-GetSystemMetrics(SM_CXSMICON)-2,rc.top+((g_nTitleBarHeight>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),g_pfwFrames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON), 0, NULL,DI_NORMAL);
+ }
+ else
+ {
+ mod_DrawIconEx_helper(hdcMem,rc.left,rc.top+((g_nTitleBarHeight>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),g_pfwFrames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON), 0, NULL,DI_NORMAL);
+ }
+
+
+ }
+ {
+ BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
+ if (g_pfwFrames[pos].floating || (!g_CluiData.fLayered))
+ {
+ HRGN rgn = CreateRectRgn(rect->left,rect->top,rect->right,rect->bottom);
+ SelectClipRgn(hdcMem2,rgn);
+ BitBlt(hdcMem2,rect->left,rect->top,rc.right-rc.left,rc.bottom-rc.top,hdcMem, 0, 0, SRCCOPY);
+ DeleteObject(rgn);
+ }
+ else
+ BitBlt(hdcMem2,rect->left,rect->top,rc.right-rc.left,rc.bottom-rc.top,hdcMem, 0, 0, SRCCOPY);
+ //MyAlphaBlend(hdcMem2,rect.left,rect.top,rc.right-rc.left,rc.bottom-rc.top,hdcMem, 0, 0, rc.right-rc.left,rc.bottom-rc.top,bf);
+ }
+
+ SelectObject(hdcMem,b2);
+ DeleteObject(b1);
+ SelectObject(hdcMem,hoTTBFont);
+ SelectObject(hdcMem,hoBrush);
+ DeleteDC(hdcMem);
+ return 0;
+}
+static LRESULT CALLBACK CLUIFrameTitleBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static int s_nLastByPos = -1;
+ static int s_nOldFrameHeight = -1;
+ static int s_nCurDragBar = -1;
+
+ RECT rect;
+ int Frameid,Framemod,direction;
+ int xpos,ypos;
+
+ Frameid = (GetWindowLongPtr(hwnd,GWLP_USERDATA));
+ memset(&rect, 0, sizeof(rect));
+
+ switch(msg) {
+ case WM_CREATE:
+ if ( !_hFrameTitleTheme)
+ _hFrameTitleTheme = xpt_AddThemeHandle(hwnd,L"WINDOW");
+ SendMessage(hwnd,WM_SETFONT,(WPARAM)_hTitleBarFont,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_USER+100:
+ return 1;
+
+ case WM_ENABLE:
+ if (hwnd != 0) CLUI__cliInvalidateRect(hwnd,NULL,FALSE);
+ return 0;
+
+ case WM_ERASEBKGND:
+ return 1;
+
+ case WM_COMMAND:
+ if ( CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam),0), 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:
+ g_pfwFrames[framepos].Locked = !g_pfwFrames[framepos].Locked;
+ break;
+ case frame_menu_visible:
+ g_pfwFrames[framepos].visible = !g_pfwFrames[framepos].visible;
+ break;
+ case frame_menu_showtitlebar:
+ g_pfwFrames[framepos].TitleBar.ShowTitleBar = !g_pfwFrames[framepos].TitleBar.ShowTitleBar;
+ break;
+ case frame_menu_floating:
+ CLUIFrames_SetFrameFloat(Frameid,0);
+ break;
+ }
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,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);
+
+ if (framepos == -1){break;};
+ hmenu = CreatePopupMenu();
+ // Frames[Frameid].TitleBar.hmenu = hmenu;
+ AppendMenu(hmenu,MF_STRING|MF_DISABLED|MF_GRAYED,15,g_pfwFrames[framepos].Name);
+ AppendMenu(hmenu,MF_SEPARATOR,16,_T(""));
+
+ if (g_pfwFrames[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 (g_pfwFrames[framepos].visible)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_visible,TranslateT("Visible"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_visible,TranslateT("Visible"));};
+
+ if (g_pfwFrames[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 (g_pfwFrames[framepos].floating)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_floating,TranslateT("Floating"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_floating,TranslateT("Floating"));};
+ }
+
+ TrackPopupMenu(hmenu,TPM_LEFTALIGN,pt.x,pt.y, 0, hwnd,0);
+ DestroyMenu(hmenu);
+ }
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ Framemod = -1;
+ s_nLastByPos = -1;s_nOldFrameHeight = -1;ReleaseCapture();
+ CallService(MS_CLIST_FRAMES_UCOLLFRAME,Frameid,0);
+ s_nLastByPos = -1;s_nOldFrameHeight = -1;ReleaseCapture();
+ break;
+
+ case WM_LBUTTONUP:
+ {
+ if (GetCapture() != hwnd){break;};
+ s_nCurDragBar = -1;s_nLastByPos = -1;s_nOldFrameHeight = -1;ReleaseCapture();
+ break;
+ };
+ case WM_LBUTTONDOWN:
+ {
+
+ int framepos = id2pos(Frameid);
+
+ if (framepos == -1){break;};
+ {
+ if (g_pfwFrames[framepos].floating)
+ {
+
+ POINT pt;
+ GetCursorPos(&pt);
+ g_pfwFrames[framepos].TitleBar.oldpos = pt;
+ };
+ };
+
+ //ScreenToClient(Frames[framepos].ContainerWnd,&Frames[framepos].TitleBar.oldpos);
+
+ if ((!(wParam&MK_CONTROL)) && g_pfwFrames[framepos].Locked && (!(g_pfwFrames[framepos].floating)))
+ {
+ if ( db_get_b(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT)) {
+ POINT pt;
+ int res;
+ //pt = nm->pt;
+ GetCursorPos(&pt);
+ res = SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y));
+ return res;
+ }
+ };
+
+ if (g_pfwFrames[framepos].floating)
+ {
+ RECT rc;
+ GetCursorPos(&ptOld);
+ //ClientToScreen(hwnd,&ptOld);
+ GetWindowRect( hwnd, &rc );
+
+ nLeft = (short)rc.left;
+ nTop = (short)rc.top;
+ };
+
+ SetCapture(hwnd);
+
+
+ break;
+ };
+ case WM_MOUSEMOVE:
+ {
+ POINT pt,pt2;
+ RECT wndr;
+ int pos;
+ //tbinfo
+ {
+ char TBcapt[255];
+
+
+ pos = id2pos(Frameid);
+
+ if (pos != -1)
+ {
+ int oldflags;
+
+
+ mir_snprintf(TBcapt, SIZEOF(TBcapt), "%s - h:%d, vis:%d, fl:%d, fl:(%d,%d,%d,%d),or: %d",
+ g_pfwFrames[pos].szName, g_pfwFrames[pos].height, g_pfwFrames[pos].visible, g_pfwFrames[pos].floating,
+ g_pfwFrames[pos].FloatingPos.x, g_pfwFrames[pos].FloatingPos.y,
+ g_pfwFrames[pos].FloatingSize.x, g_pfwFrames[pos].FloatingSize.y,
+ g_pfwFrames[pos].order
+ );
+
+ oldflags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,g_pfwFrames[pos].id),0);
+ if ( !(oldflags&F_SHOWTBTIP))
+ {
+ oldflags |= F_SHOWTBTIP;
+ //CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,Frames[pos].id),(LPARAM)oldflags);
+ };
+ //CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_TBTIPNAME,Frames[pos].id),(LPARAM)TBcapt);
+ };
+
+
+
+ }
+ //
+ if ((wParam&MK_LBUTTON)/* && (wParam&MK_CONTROL)*/)
+ {
+ RECT rcMiranda;
+ RECT rcwnd,rcOverlap;
+ POINT newpt,ofspt,curpt,newpos;
+ //if (GetCapture() != hwnd){break;};
+ //curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture();
+
+ pos = id2pos(Frameid);
+ if (g_pfwFrames[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 = g_pfwFrames[pos].id;
+
+
+
+
+ ofspt.x = 0;ofspt.y = 0;
+ ClientToScreen(g_pfwFrames[pos].TitleBar.hwnd,&ofspt);
+ ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y;
+
+ CLUIFrames_SetFrameFloat(id,0);
+ newpt.x = 0;newpt.y = 0;
+ ClientToScreen(g_pfwFrames[pos].TitleBar.hwnd,&newpt);
+ SetCursorPos(newpt.x+ofspt.x,newpt.y+ofspt.y);
+ GetCursorPos(&curpt);
+
+ g_pfwFrames[pos].TitleBar.oldpos = curpt;
+
+ return 0;
+ };
+
+ }
+ else
+ {
+ int id = g_pfwFrames[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 );
+ //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd );
+ //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )
+
+
+ if ( !IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ))
+ {
+ GetCursorPos(&curpt);
+ GetWindowRect( g_pfwFrames[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(g_pfwFrames[pos].TitleBar.hwnd,&rcwnd);
+ ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y;
+
+ g_pfwFrames[pos].FloatingPos.x = newpos.x;
+ g_pfwFrames[pos].FloatingPos.y = newpos.y;
+ CLUIFrames_SetFrameFloat(id,0);
+ //SetWindowPos(Frames[pos].ContainerWnd, 0, newpos.x,newpos.y, 0, 0, SWP_NOSIZE);
+
+
+ newpt.x = 0;newpt.y = 0;
+ ClientToScreen(g_pfwFrames[pos].TitleBar.hwnd,&newpt);
+
+ GetWindowRect( g_pfwFrames[pos].hWnd, &rcwnd );
+ SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2);
+ GetCursorPos(&curpt);
+
+ g_pfwFrames[pos].TitleBar.oldpos = curpt;
+ return 0;
+ }
+ }
+ }
+
+ if (wParam & MK_LBUTTON) {
+ int newh = -1,prevold;
+
+ if (GetCapture() != hwnd){break;};
+
+
+ pos = id2pos(Frameid);
+
+ if (g_pfwFrames[pos].floating)
+ {
+ GetCursorPos(&pt);
+ if ((g_pfwFrames[pos].TitleBar.oldpos.x != pt.x) || (g_pfwFrames[pos].TitleBar.oldpos.y != pt.y))
+ {
+
+ pt2 = pt;
+ ScreenToClient(hwnd,&pt2);
+ GetWindowRect(g_pfwFrames[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( &g_pfwFrames[pos], nLeft, nTop );
+ else
+ SetWindowPos( g_pfwFrames[pos].ContainerWnd,
+ HWND_TOPMOST,
+ nLeft,
+ nTop,
+ 0,
+ 0,
+ SWP_NOSIZE |SWP_NOACTIVATE| SWP_NOZORDER );
+
+ ptOld = ptNew;
+ }
+
+ pt.x = nLeft;
+ pt.y = nTop;
+ g_pfwFrames[pos].TitleBar.oldpos = pt;
+ };
+
+ //break;
+ return 0;
+ }
+
+ if (g_pfwFrames[pos].prevvisframe != -1) {
+ GetCursorPos(&pt);
+
+ if ((g_pfwFrames[pos].TitleBar.oldpos.x == pt.x) && (g_pfwFrames[pos].TitleBar.oldpos.y == pt.y))
+ break;
+
+ ypos = rect.top+pt.y;xpos = rect.left+pt.x;
+ Framemod = -1;
+
+ if (g_pfwFrames[pos].align == alBottom) {
+ direction = -1;
+ Framemod = pos;
+ }
+ else {
+ direction = 1;
+ Framemod = g_pfwFrames[pos].prevvisframe;
+ }
+ if (g_pfwFrames[Framemod].Locked) break;
+ if (s_nCurDragBar != -1 && s_nCurDragBar != pos) break;
+
+ if (s_nLastByPos == -1) {
+ s_nCurDragBar = pos;
+ s_nLastByPos = ypos;
+ s_nOldFrameHeight = g_pfwFrames[Framemod].height;
+ SetCapture(hwnd);
+ break;
+ }
+
+ newh = s_nOldFrameHeight+direction*(ypos-s_nLastByPos);
+ if (newh>0) {
+ prevold = g_pfwFrames[Framemod].height;
+ g_pfwFrames[Framemod].height = newh;
+ if ( !CLUIFramesFitInSize()) { g_pfwFrames[Framemod].height = prevold; return TRUE;}
+ g_pfwFrames[Framemod].height = newh;
+ if (newh>3) g_pfwFrames[Framemod].collapsed = TRUE;
+
+ }
+ g_pfwFrames[pos].TitleBar.oldpos = pt;
+ }
+
+ if (newh > 0)
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ break;
+ }
+ s_nCurDragBar = -1;s_nLastByPos = -1;s_nOldFrameHeight = -1;ReleaseCapture();
+ }
+ break;
+
+ case WM_PRINT:
+ case WM_PRINTCLIENT:
+ GetClientRect(hwnd, &rect);
+ if (!g_CluiData.fLayered)
+ ske_BltBackImage(hwnd, (HDC)wParam, &rect);
+
+ DrawTitleBar((HDC)wParam, &rect, Frameid);
+ break;
+
+ case WM_SIZE:
+ InvalidateRect(hwnd,NULL,FALSE);
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+
+ case WM_PAINT:
+ if (g_pfwFrames[id2pos(Frameid)].floating || !g_CluiData.fLayered) {
+ GetClientRect(hwnd, &rect);
+ HDC paintDC = GetDC(hwnd);
+ DrawTitleBar(paintDC, &rect, Frameid);
+ ReleaseDC(hwnd, paintDC);
+ ValidateRect(hwnd, NULL);
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+ return TRUE;
+}
+static int CLUIFrameResizeFloatingFrame(int framepos)
+{
+ RECT rect;
+
+ if ( !g_pfwFrames[framepos].floating){return 0;};
+ if (g_pfwFrames[framepos].ContainerWnd == 0){return 0;};
+ GetClientRect(g_pfwFrames[framepos].ContainerWnd,&rect);
+
+ int width = rect.right-rect.left;
+ int height = rect.bottom - rect.top;
+
+ g_pfwFrames[framepos].visible?CLUI_ShowWindowMod(g_pfwFrames[framepos].ContainerWnd,SW_SHOW/*NOACTIVATE*/):CLUI_ShowWindowMod(g_pfwFrames[framepos].ContainerWnd,SW_HIDE);
+
+
+
+ if (g_pfwFrames[framepos].TitleBar.ShowTitleBar)
+ {
+ CLUI_ShowWindowMod(g_pfwFrames[framepos].TitleBar.hwnd,SW_SHOW/*NOACTIVATE*/);
+ //if (Frames[framepos].Locked){return 0;};
+ g_pfwFrames[framepos].height = height-DEFAULT_TITLEBAR_HEIGHT;
+
+ SetWindowPos(g_pfwFrames[framepos].TitleBar.hwnd,HWND_TOP, 0, 0, width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_DRAWFRAME);
+ SetWindowPos(g_pfwFrames[framepos].hWnd,HWND_TOP, 0, DEFAULT_TITLEBAR_HEIGHT,width,height-DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW);
+
+ }
+ else
+ {
+ //SetWindowPos(Frames[framepos].TitleBar.hwnd,HWND_TOP, 0, 0, width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_NOMOVE);
+ //if (Frames[framepos].Locked){return 0;};
+ g_pfwFrames[framepos].height = height;
+ CLUI_ShowWindowMod(g_pfwFrames[framepos].TitleBar.hwnd,SW_HIDE);
+ SetWindowPos(g_pfwFrames[framepos].hWnd,HWND_TOP, 0, 0, width,height,SWP_SHOWWINDOW|SWP_NOACTIVATE);
+
+ };
+ // CLUIFramesForceUpdateFrame(&Frames[framepos]);
+ if (g_pfwFrames[framepos].ContainerWnd != 0) UpdateWindow(g_pfwFrames[framepos].ContainerWnd);
+ //GetClientRect(Frames[framepos].TitleBar.hwnd,&Frames[framepos].TitleBar.wndSize);
+ GetWindowRect(g_pfwFrames[framepos].hWnd,&g_pfwFrames[framepos].wndSize);
+ //Frames[framepos].height = Frames[framepos].wndSize.bottom-Frames[framepos].wndSize.top;
+ //GetClientRect(Frames[framepos].hWnd,&Frames[framepos].wndSize);
+ //Frames[framepos].height = Frames[framepos].wndSize.bottom-Frames[framepos].wndSize.top;
+ return 0;
+};
+
+static int CLUIFrameOnMainMenuBuild(WPARAM wParam,LPARAM lParam)
+{
+ if (MirandaExiting()) return 0;
+ CLUIFramesLoadMainMenu();
+
+ return 0;
+}
+
+static LRESULT CALLBACK CLUIFrameSubContainerProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ RECT rect = { 0 };
+ int Frameid = (GetWindowLongPtr(hwnd,GWLP_USERDATA));
+
+ switch (msg) {
+ case WM_ACTIVATE:
+ if (g_bTransparentFlag) {
+ BYTE alpha;
+ if ((wParam != WA_INACTIVE || ((HWND)lParam == hwnd) || GetParent((HWND)lParam) == hwnd)) {
+ HWND hw = lParam ? GetParent((HWND)lParam) : 0;
+ alpha = db_get_b(NULL, "CList", "Alpha", SETTING_ALPHA_DEFAULT);
+ if (hw) SetWindowPos(hw, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+ CLUI_SmoothAlphaTransition(hwnd, alpha, 1);
+ }
+ }
+
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+
+ case WM_NOTIFY:
+ case WM_PARENTNOTIFY:
+ case WM_SYSCOMMAND:
+ return SendMessage(pcli->hwndContactList, msg, wParam, lParam);
+
+ case WM_MOVE:
+ if (g_CluiData.fDocked)
+ return 1;
+ break;
+
+ case WM_WINDOWPOSCHANGING:
+ if (g_CluiData.mutexPreventDockMoving) {
+ WINDOWPOS *wp;
+ wp = (WINDOWPOS*)lParam;
+ wp->flags |= SWP_NOMOVE/*|SWP_NOSIZE*/;
+ wp->flags &= (wp->flags&~SWP_NOACTIVATE);
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+ break;
+
+ case WM_WINDOWPOSCHANGED:
+ if (g_CluiData.fDocked && g_CluiData.mutexPreventDockMoving)
+ return 0;
+ break;
+
+ case WM_NCPAINT:
+ case WM_PAINT:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+
+ case WM_ERASEBKGND:
+ return 1;
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+static HWND CreateSubContainerWindow(HWND parent, int x, int y, int width, int height)
+{
+ HWND hwnd = CreateWindowEx(WS_EX_LAYERED, CLUIFrameSubContainerClassName, _T("SubContainerWindow"), WS_POPUP | (!g_CluiData.fLayered ? WS_BORDER : 0), x, y, width, height, parent, 0, g_hInst, 0);
+ SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_BORDER));
+ if (g_CluiData.fOnDesktop) {
+ HWND hProgMan = FindWindow(_T("Progman"), NULL);
+ if (IsWindow(hProgMan))
+ SetParent(hwnd, hProgMan);
+ }
+
+ return hwnd;
+}
+
+static LRESULT CALLBACK CLUIFrameContainerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ RECT rect;
+ int Frameid = (GetWindowLongPtr(hwnd, GWLP_USERDATA));
+ memset(&rect, 0, sizeof(rect));
+
+ switch(msg) {
+ case WM_CREATE:
+ {
+ int framepos;
+
+ framepos = id2pos(Frameid);
+ //SetWindowPos(Frames[framepos].TitleBar.hwndTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
+
+ return 0;
+ };
+ case WM_GETMINMAXINFO:
+ //DefWindowProc(hwnd,msg,wParam,lParam);
+ {
+ int framepos;
+ MINMAXINFO minmax;
+
+
+ framepos = id2pos(Frameid);
+ if (framepos < 0 || framepos >= g_nFramesCount){break;};
+ if ( !g_pfwFrames[framepos].minmaxenabled){break;};
+ if (g_pfwFrames[framepos].ContainerWnd == 0){break;};
+
+ if (g_pfwFrames[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;
+ //
+ //return 0;
+ };
+
+
+ memset(&minmax, 0, sizeof(minmax));
+ if (SendMessage(g_pfwFrames[framepos].hWnd,WM_GETMINMAXINFO, 0, (LPARAM)&minmax) == 0)
+ {
+ RECT border;
+ int tbh = g_nTitleBarHeight*btoint(g_pfwFrames[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
+ {
+
+
+ return(DefWindowProc(hwnd, msg, wParam, lParam));
+ };
+
+
+
+ }
+ //return 0;
+
+ case WM_MOVE:
+ {
+ int framepos;
+ RECT rect;
+
+ framepos = id2pos(Frameid);
+
+ if (framepos < 0 || framepos >= g_nFramesCount){break;};
+ if (g_pfwFrames[framepos].ContainerWnd == 0){return 0;};
+
+ GetWindowRect(g_pfwFrames[framepos].ContainerWnd,&rect);
+ g_pfwFrames[framepos].FloatingPos.x = rect.left;
+ g_pfwFrames[framepos].FloatingPos.y = rect.top;
+ g_pfwFrames[framepos].FloatingSize.x = rect.right-rect.left;
+ g_pfwFrames[framepos].FloatingSize.y = rect.bottom-rect.top;
+
+ CLUIFramesStoreFrameSettings(framepos);
+
+ if ( g_pfwFrames[framepos].floating )
+ {
+ POINT curpt,ofspt, newpt, newpos;
+ RECT rcwnd, rcOverlap, rcMiranda;
+
+ 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 (IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ))
+ {
+ GetCursorPos(&curpt);
+ GetWindowRect( g_pfwFrames[framepos].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(g_pfwFrames[framepos].TitleBar.hwnd,&rcwnd);
+ ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y;
+
+ g_pfwFrames[framepos].FloatingPos.x = newpos.x;
+ g_pfwFrames[framepos].FloatingPos.y = newpos.y;
+ CLUIFrames_SetFrameFloat(Frameid,0);
+ //SetWindowPos(Frames[pos].ContainerWnd, 0, newpos.x,newpos.y, 0, 0, SWP_NOSIZE);
+
+
+ newpt.x = 0;newpt.y = 0;
+ ClientToScreen(g_pfwFrames[framepos].TitleBar.hwnd,&newpt);
+
+ GetWindowRect( g_pfwFrames[framepos].hWnd, &rcwnd );
+ SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2);
+ GetCursorPos(&curpt);
+
+ g_pfwFrames[framepos].TitleBar.oldpos = curpt;
+
+
+ return 0;
+ };
+
+ };
+
+
+ return 0;
+ };
+
+ case WM_SIZE:
+ {
+ int framepos;
+ RECT rect;
+
+ CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam);
+
+ framepos = id2pos(Frameid);
+
+ if (framepos < 0 || framepos >= g_nFramesCount){break;};
+ if (g_pfwFrames[framepos].ContainerWnd == 0){return 0;};
+ CLUIFrameResizeFloatingFrame(framepos);
+
+ GetWindowRect(g_pfwFrames[framepos].ContainerWnd,&rect);
+ g_pfwFrames[framepos].FloatingPos.x = rect.left;
+ g_pfwFrames[framepos].FloatingPos.y = rect.top;
+ g_pfwFrames[framepos].FloatingSize.x = rect.right-rect.left;
+ g_pfwFrames[framepos].FloatingSize.y = rect.bottom-rect.top;
+
+ CLUIFramesStoreFrameSettings(framepos);
+
+
+ return 0;
+ };
+ case WM_LBUTTONDOWN:
+ {
+ if ( db_get_b(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT)) {
+ POINT pt;
+ GetCursorPos(&pt);
+ return SendMessage( hwnd, WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y));
+ }
+ break;
+ }
+ case WM_CLOSE:
+ {
+ DestroyWindow(hwnd);
+ break;
+ };
+
+ case WM_DESTROY:
+ {
+ //{ CLUIFramesStoreAllFrames();};
+ return 0;
+ };
+ /*
+ case WM_COMMAND:
+ case WM_NOTIFY:
+ return(SendMessage(pcli->hwndContactList,msg,wParam,lParam));
+ */
+
+
+ };
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+};
+static HWND CreateContainerWindow(HWND parent,int x,int y,int width,int height)
+{
+ return(CreateWindow(_T("FramesContainer"),_T("FramesContainer"),WS_POPUP|WS_THICKFRAME,x,y,width,height,parent, 0, g_hInst,0));
+};
+
+
+static int _us_DoSetFrameFloat(WPARAM wParam,LPARAM lParam)
+{
+ HWND hwndtmp,hwndtooltiptmp;
+
+
+ int pos = id2pos( wParam );
+ if ( pos >= 0 && pos < g_nFramesCount )
+
+ if (g_pfwFrames[pos].floating || (lParam&2))
+ {
+ if (g_pfwFrames[pos].OwnerWindow != (HWND)-2 && g_pfwFrames[pos].visible)
+ {
+ if (g_pfwFrames[pos].OwnerWindow == 0) g_pfwFrames[pos].OwnerWindow = CreateSubContainerWindow(pcli->hwndContactList,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,10, 10);
+ CLUI_ShowWindowMod(g_pfwFrames[pos].OwnerWindow,(g_pfwFrames[pos].visible && g_pfwFrames[pos].collapsed && IsWindowVisible(pcli->hwndContactList))?SW_SHOW/*NOACTIVATE*/:SW_HIDE);
+ SetParent(g_pfwFrames[pos].hWnd,g_pfwFrames[pos].OwnerWindow);
+ SetParent(g_pfwFrames[pos].TitleBar.hwnd,pcli->hwndContactList);
+ SetWindowLongPtr(g_pfwFrames[pos].OwnerWindow,GWLP_USERDATA,g_pfwFrames[pos].id);
+ g_pfwFrames[pos].floating = FALSE;
+ if ( !(lParam&2))
+ {
+ DestroyWindow(g_pfwFrames[pos].ContainerWnd);
+ g_pfwFrames[pos].ContainerWnd = 0;
+ }
+ }
+ else
+ {
+ SetParent(g_pfwFrames[pos].hWnd,pcli->hwndContactList);
+ SetParent(g_pfwFrames[pos].TitleBar.hwnd,pcli->hwndContactList);
+ g_pfwFrames[pos].floating = FALSE;
+ if (g_pfwFrames[pos].ContainerWnd) DestroyWindow(g_pfwFrames[pos].ContainerWnd);
+ g_pfwFrames[pos].ContainerWnd = 0;
+ }
+ }
+ else
+ {
+ RECT recttb,rectw,border;
+ int temp;
+ int neww,newh;
+ BOOLEAN locked;
+
+ g_pfwFrames[pos].oldstyles = GetWindowLongPtr(g_pfwFrames[pos].hWnd,GWL_STYLE);
+ g_pfwFrames[pos].TitleBar.oldstyles = GetWindowLongPtr(g_pfwFrames[pos].TitleBar.hwnd,GWL_STYLE);
+ locked = g_pfwFrames[pos].Locked;
+ g_pfwFrames[pos].Locked = FALSE;
+ g_pfwFrames[pos].minmaxenabled = FALSE;
+
+ GetWindowRect(g_pfwFrames[pos].hWnd,&rectw);
+ GetWindowRect(g_pfwFrames[pos].TitleBar.hwnd,&recttb);
+ if ( !g_pfwFrames[pos].TitleBar.ShowTitleBar){
+ recttb.top = recttb.bottom = recttb.left = recttb.right = 0;
+ };
+
+ g_pfwFrames[pos].ContainerWnd = CreateContainerWindow(pcli->hwndContactList,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,10, 10);
+
+
+
+
+ SetParent(g_pfwFrames[pos].hWnd,g_pfwFrames[pos].ContainerWnd);
+ SetParent(g_pfwFrames[pos].TitleBar.hwnd,g_pfwFrames[pos].ContainerWnd);
+ if (g_pfwFrames[pos].OwnerWindow != (HWND)-2 && g_pfwFrames[pos].OwnerWindow != 0)
+ {
+ DestroyWindow(g_pfwFrames[pos].OwnerWindow);
+ g_pfwFrames[pos].OwnerWindow = 0;
+ }
+
+ GetBorderSize(g_pfwFrames[pos].ContainerWnd,&border);
+
+
+ SetWindowLongPtr(g_pfwFrames[pos].ContainerWnd,GWLP_USERDATA,g_pfwFrames[pos].id);
+ if ((lParam == 1))
+ {
+ //if ((Frames[pos].FloatingPos.x != 0) && (Frames[pos].FloatingPos.y != 0))
+ {
+ if (g_pfwFrames[pos].FloatingPos.x < 0){g_pfwFrames[pos].FloatingPos.x = 0;};
+ if (g_pfwFrames[pos].FloatingPos.y < 0){g_pfwFrames[pos].FloatingPos.y = 0;};
+
+ SetWindowPos(g_pfwFrames[pos].ContainerWnd,HWND_TOPMOST,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,g_pfwFrames[pos].FloatingSize.x,g_pfwFrames[pos].FloatingSize.y,SWP_HIDEWINDOW|SWP_NOACTIVATE);
+ }
+ }
+ else if (lParam == 0)
+ {
+ 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 (g_pfwFrames[pos].FloatingPos.x < 20){g_pfwFrames[pos].FloatingPos.x = 40;};
+ if (g_pfwFrames[pos].FloatingPos.y < 20){g_pfwFrames[pos].FloatingPos.y = 40;};
+
+ SetWindowPos(g_pfwFrames[pos].ContainerWnd,HWND_TOPMOST,g_pfwFrames[pos].FloatingPos.x,g_pfwFrames[pos].FloatingPos.y,neww,newh,SWP_HIDEWINDOW|SWP_NOACTIVATE);
+ };
+
+
+ SetWindowText(g_pfwFrames[pos].ContainerWnd,g_pfwFrames[pos].TitleBar.tbname);
+
+ temp = GetWindowLongPtr(g_pfwFrames[pos].ContainerWnd,GWL_EXSTYLE);
+ temp |= WS_EX_TOOLWINDOW|WS_EX_TOPMOST ;
+ SetWindowLongPtr(g_pfwFrames[pos].ContainerWnd,GWL_EXSTYLE,temp);
+
+ g_pfwFrames[pos].floating = TRUE;
+ g_pfwFrames[pos].Locked = locked;
+
+ }
+ CLUIFramesStoreFrameSettings(pos);
+ g_pfwFrames[pos].minmaxenabled = TRUE;
+ hwndtooltiptmp = g_pfwFrames[pos].TitleBar.hwndTip;
+
+ hwndtmp = g_pfwFrames[pos].ContainerWnd;
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ if (hwndtmp) SendMessage(hwndtmp,WM_SIZE, 0, 0);
+
+
+ SetWindowPos(hwndtooltiptmp, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE|SWP_NOACTIVATE );
+
+ return 0;
+}
+
+int CLUIFrameOnModulesLoad(WPARAM wParam,LPARAM lParam)
+{
+ /* HOOK */
+ CLUIFramesLoadMainMenu();
+ CLUIFramesCreateMenuForFrame(-1,-1,000010000, Menu_AddContextFrameMenuItem);
+ return 0;
+}
+
+int CLUIFrameOnModulesUnload(WPARAM wParam,LPARAM lParam)
+{
+ g_CluiData.bSTATE = STATE_PREPEARETOEXIT;
+
+ if ( !_hmiVisible)
+ return 0;
+
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiVisible, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiTBVisible, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiLock, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiColl, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiFloating, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiAlignTop, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiAlignClient, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiAlignBottom, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiBorder, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiAlignRoot, 1 );
+
+
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiPosUp, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiPosDown, 1 );
+ CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, (LPARAM)_hmiPosRoot, 1 );
+
+
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiVisible, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiTBVisible, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiLock, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiColl, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiFloating, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiBorder, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiAlignRoot, 1 );
+ CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiPosRoot, 1 );
+
+ _hmiVisible = 0;
+ return 0;
+}
+
+int LoadCLUIFramesModule(void)
+{
+ WNDCLASS wndclass;
+ WNDCLASS cntclass;
+ WNDCLASS subconclass;
+ InitializeCriticalSection(&_cluiFramesModuleCS);
+ _cluiFramesModuleCSInitialized = TRUE;
+
+ 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 = GetSysColorBrush(COLOR_3DFACE);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = CLUIFrameTitleBarClassName;
+ RegisterClass(&wndclass);
+
+ subconclass.style = CS_DBLCLKS;//|CS_HREDRAW|CS_VREDRAW ;
+ subconclass.lpfnWndProc = CLUIFrameSubContainerProc;
+ subconclass.cbClsExtra = 0;
+ subconclass.cbWndExtra = 0;
+ subconclass.hInstance = g_hInst;
+ subconclass.hIcon = NULL;
+ subconclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ subconclass.hbrBackground = NULL;
+ subconclass.lpszMenuName = NULL;
+ subconclass.lpszClassName = CLUIFrameSubContainerClassName;
+ RegisterClass(&subconclass);
+
+ //container helper
+
+ cntclass.style = CS_DBLCLKS/*|CS_HREDRAW|CS_VREDRAW*/|CS_DROPSHADOW;
+ 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 = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",SETTING_GAPFRAMES_DEFAULT);
+
+ g_nFramesCount = 0;
+
+ InitFramesMenus();
+
+ HookEvent(ME_SYSTEM_MODULESLOADED,CLUIFrameOnModulesLoad);
+ HookEvent(ME_CLIST_PREBUILDFRAMEMENU,CLUIFramesModifyContextMenuForFrame);
+ HookEvent(ME_CLIST_PREBUILDMAINMENU,CLUIFrameOnMainMenuBuild);
+ HookEvent(ME_SYSTEM_PRESHUTDOWN, CLUIFrameOnModulesUnload);
+
+ CreateCluiFramesServices();
+
+
+ hWndExplorerToolBar = FindWindowEx(0, 0, _T("Shell_TrayWnd"),NULL);
+ OnFrameTitleBarBackgroundChange(0, 0);
+ _fCluiFramesModuleNotStarted = FALSE;
+ return 0;
+}
+
+static INT_PTR UnloadMainMenu()
+{
+ CLUIFrameOnModulesUnload(0, 0);
+ if (_hmiRoot != (HANDLE)-1)
+ {
+ CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)_hmiRoot,0);
+ _hmiRoot = (HGENMENU)-1;
+ }
+
+ return (INT_PTR) _hmiRoot;
+}
+
+int UnLoadCLUIFramesModule(void)
+{
+ int i;
+
+ _fCluiFramesModuleNotStarted = TRUE;
+ if (hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground = NULL;}
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ CLUIFramesStoreAllFrames();
+
+
+ UnitFramesMenu();
+ UnloadMainMenu();
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if (g_pfwFrames[i].hWnd != pcli->hwndContactTree)
+ DestroyWindow(g_pfwFrames[i].hWnd);
+
+ g_pfwFrames[i].hWnd = (HWND)-1;
+ DestroyWindow(g_pfwFrames[i].TitleBar.hwnd);
+ g_pfwFrames[i].TitleBar.hwnd = (HWND)-1;
+ if (g_pfwFrames[i].ContainerWnd && g_pfwFrames[i].ContainerWnd != (HWND)(-2) && g_pfwFrames[i].ContainerWnd != (HWND)(-1)) DestroyWindow(g_pfwFrames[i].ContainerWnd);
+ g_pfwFrames[i].ContainerWnd = (HWND)-1;
+ if (g_pfwFrames[i].TitleBar.hmenu) DestroyMenu(g_pfwFrames[i].TitleBar.hmenu);
+ if (g_pfwFrames[i].OwnerWindow && g_pfwFrames[i].OwnerWindow != (HWND)(-2) && g_pfwFrames[i].OwnerWindow != (HWND)(-1))
+ DestroyWindow(g_pfwFrames[i].OwnerWindow );
+ g_pfwFrames[i].OwnerWindow = (HWND)-2;
+ if (g_pfwFrames[i].UpdateRgn) DeleteObject(g_pfwFrames[i].UpdateRgn);
+
+ mir_free_and_nil(g_pfwFrames[i].Name);
+ mir_free_and_nil(g_pfwFrames[i].szName);
+ mir_free_and_nil(g_pfwFrames[i].TitleBar.tbname);
+ mir_free_and_nil(g_pfwFrames[i].TitleBar.sztbname);
+ mir_free_and_nil(g_pfwFrames[i].TitleBar.tooltip);
+ mir_free_and_nil(g_pfwFrames[i].TitleBar.sztooltip);
+
+ }
+ free(g_pfwFrames);
+ g_pfwFrames = NULL;
+ g_nFramesCount = 0;
+ UnregisterClass(CLUIFrameTitleBarClassName,g_hInst);
+ DeleteObject(_hTitleBarFont);
+
+ _cluiFramesModuleCSInitialized = FALSE;
+ DeleteCriticalSection(&_cluiFramesModuleCS);
+ return 0;
+}
+
+static int _us_DoSetFramePaintProc(WPARAM wParam, LPARAM lParam)
+{
+ if ( !wParam) return 0;
+ {
+ // LOOK REQUIRED OR SYNC CALL NEEDED
+ FRAMEWND *frm = FindFrameByItsHWND((HWND)wParam);
+ if ( !frm) return 0;
+ if (lParam)
+ frm->PaintCallbackProc = (tPaintCallbackProc)lParam;
+ else
+ frm->PaintCallbackProc = NULL;
+ return 1;
+ }
+}
+int CLUIFrames_SetLayeredMode( BOOL fLayeredMode, HWND hwnd )
+{
+ int i;
+ for (i=0; i < g_nFramesCount; i++)
+ {
+ if (fLayeredMode)
+ {
+ if (g_pfwFrames[i].visible && GetParent(g_pfwFrames[i].hWnd) == pcli->hwndContactList && g_pfwFrames[i].PaintCallbackProc == NULL)
+ {
+ //create owner window
+ g_pfwFrames[i].OwnerWindow = CreateSubContainerWindow(pcli->hwndContactList,g_pfwFrames[i].FloatingPos.x,g_pfwFrames[i].FloatingPos.y,10, 10);
+ SetParent(g_pfwFrames[i].hWnd,g_pfwFrames[i].OwnerWindow);
+ }
+ }
+ else
+ {
+ if (GetParent(g_pfwFrames[i].hWnd) == g_pfwFrames[i].OwnerWindow)
+ {
+ SetParent(g_pfwFrames[i].hWnd,hwnd);
+ if ((INT_PTR)g_pfwFrames[i].OwnerWindow>0)
+ {
+ DestroyWindow(g_pfwFrames[i].OwnerWindow);
+ g_pfwFrames[i].OwnerWindow = (HWND)-2;
+ }
+ }
+ }
+ }
+
+ CLUIFrames_UpdateFrame((WPARAM)-1,0); //update all frames
+ return 0;
+}
+
+int CLUIFrames_UpdateBorders()
+{
+ for ( int i=0; i < g_nFramesCount; i++ )
+ {
+ if ( !g_pfwFrames[i].floating )
+ {
+ DWORD style = (int)GetWindowLongPtr( g_pfwFrames[i].hWnd, GWL_STYLE ) & ( ~WS_BORDER );
+ if ( !g_CluiData.fLayered && g_pfwFrames[i].UseBorder ) style |= WS_BORDER;
+ SetWindowLongPtr( g_pfwFrames[i].hWnd, GWL_STYLE, style );
+ CLUIFramesModifyMainMenuItems( g_pfwFrames[i].id, 0 );
+ RedrawWindow( g_pfwFrames[i].hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE );
+ };
+ }
+
+ return 0;
+}
\ No newline at end of file diff --git a/plugins/Clist_modern/src/CLUIFrames/cluiframes.h b/plugins/Clist_modern/src/CLUIFrames/cluiframes.h new file mode 100644 index 0000000000..75bf89a8bd --- /dev/null +++ b/plugins/Clist_modern/src/CLUIFrames/cluiframes.h @@ -0,0 +1,143 @@ +/*
+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.
+*/
+
+#pragma once
+
+#ifndef _CLUIFRAMES_H_
+#define _CLUIFRAMES_H_
+
+#include "../m_api/m_skin_eng.h"
+
+int LoadCLUIFramesModule(void);
+int UnLoadCLUIFramesModule(void);
+int CLUIFramesGetMinHeight();
+int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam);
+int CLUIFrames_GetTotalHeight();
+
+typedef struct tagProtocolData {
+ char *RealName;
+ int protopos;
+ boolean show;
+} ProtocolData;
+
+typedef struct
+{
+ int order;
+ int realpos;
+}SortData;
+
+
+
+
+//============
+#define CLUIFRAMESSETALIGN "CLUIFramesSetAlign"
+
+#define CLUIFRAMESSETALIGNALTOP "CLUIFramesSetAlignalTop"
+#define CLUIFRAMESSETALIGNALCLIENT "CLUIFramesSetAlignalClient"
+#define CLUIFRAMESSETALIGNALBOTTOM "CLUIFramesSetAlignalBottom"
+#define CLUIFRAMESSETFLOATING "Set_Floating"
+
+#define CLUIFRAMESMOVEUPDOWN "CLUIFramesMoveUpDown"
+#define CLUIFRAMESMOVEUP "CLUIFramesMoveUp"
+#define CLUIFRAMESMOVEDOWN "CLUIFramesMoveDown"
+
+struct FrameMenuHandles
+{
+ HGENMENU MainMenuItem;
+ HGENMENU MIVisible,MITitle,MITBVisible,MILock,MIColl,MIFloating,MIAlignRoot;
+ HGENMENU MIAlignTop,MIAlignClient,MIAlignBottom;
+ HGENMENU MIBorder, MIPosRoot, MIPosUp, MIPosDown;
+};
+
+struct FrameTitleBar
+{
+ HWND hwnd;
+ HWND TitleBarbutt;
+ HWND hwndTip;
+
+ TCHAR* tbname;
+ TCHAR* tooltip;
+
+ char * sztbname;
+ char * sztooltip;
+
+ HMENU hmenu;
+ HICON hicon;
+
+ BOOLEAN ShowTitleBar;
+ BOOLEAN ShowTitleBarTip;
+ COLORREF BackColour;
+ COLORREF TextColour;
+ int oldstyles;
+ POINT oldpos;
+ RECT wndSize;
+};
+
+struct DockOpt
+{
+ HWND hwndLeft;
+ HWND hwndRight;
+};
+
+struct FRAMEWND
+{
+ int id;
+ HWND hWnd ;
+ RECT wndSize;
+ TCHAR * Name;
+ char * szName;
+ 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;
+ HWND OwnerWindow;
+ tPaintCallbackProc PaintCallbackProc;
+ sPaintRequest * PaintData;
+ BOOLEAN bQueued;
+ HRGN UpdateRgn;
+};
+
+#define OFFSET_PROTOPOS 200
+#define OFFSET_VISIBLE 400
+
+#define CLUIFrameSubContainerClassName _T("CLUIFrameSubContainer")
+#define CLUIFrameTitleBarClassName _T("CLUIFrameTitleBar")
+#define CLUIFrameModule "CLUIFrames"
+
+#endif
+
+
+
+
diff --git a/plugins/Clist_modern/src/CLUIFrames/framesmenu.cpp b/plugins/Clist_modern/src/CLUIFrames/framesmenu.cpp new file mode 100644 index 0000000000..8473c9403b --- /dev/null +++ b/plugins/Clist_modern/src/CLUIFrames/framesmenu.cpp @@ -0,0 +1,124 @@ +#include "../hdr/modern_commonheaders.h"
+#include "../hdr/modern_commonprototypes.h"
+
+//========================== Frames
+HANDLE hFrameMenuObject;
+
+//contactmenu exec param(ownerdata)
+//also used in checkservice
+typedef struct{
+ char *szServiceName;
+ int Frameid;
+ INT_PTR param1;
+}
+ FrameMenuExecParam,*lpFrameMenuExecParam;
+
+static INT_PTR AddContextFrameMenuItem(WPARAM wParam, LPARAM lParam)
+{
+ CLISTMENUITEM *mi = (CLISTMENUITEM*)lParam;
+
+ TMO_MenuItem tmi;
+ if ( !pcli->pfnConvertMenu(mi, &tmi))
+ return NULL;
+
+ tmi.root = (mi->flags & CMIF_ROOTHANDLE) ? mi->hParentMenu : NULL;
+
+ lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)mir_alloc(sizeof(FrameMenuExecParam));
+ if (fmep == NULL)
+ return 0;
+
+ memset(fmep, 0, sizeof(FrameMenuExecParam));
+ 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)
+{
+ lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)CallService(MO_MENUITEMGETOWNERDATA, wParam, lParam);
+ if (fmep != NULL) {
+ if (fmep->szServiceName != NULL)
+ mir_free(fmep->szServiceName);
+ mir_free(fmep);
+ }
+
+ if (lParam != 1)
+ 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(g_CluiData.hEventPreBuildFrameMenu, wParam, lParam);
+ return 0;
+}
+
+static INT_PTR BuildContextFrameMenu(WPARAM wParam,LPARAM lParam)
+{
+ ListParam param = { 0 };
+ param.MenuObjectHandle = hFrameMenuObject;
+ param.wParam = wParam;
+ param.lParam = lParam;
+
+ HMENU hMenu = CreatePopupMenu();
+ ContextFrameMenuNotify(wParam, -1);
+ CallService(MO_BUILDMENU, (WPARAM)hMenu, (LPARAM)¶m);
+ return (INT_PTR)hMenu;
+}
+
+//========================== Frames end
+
+int InitFramesMenus(void)
+{
+ CreateServiceFunction("FrameMenuExecService",FrameMenuExecService);
+ CreateServiceFunction("FrameMenuCheckService",FrameMenuCheckService);
+
+ CreateServiceFunction(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM,RemoveContextFrameMenuItem);
+ CreateServiceFunction("CList/AddContextFrameMenuItem",AddContextFrameMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDFRAMECONTEXT,BuildContextFrameMenu);
+ CreateServiceFunction(MS_CLIST_FRAMEMENUNOTIFY,ContextFrameMenuNotify);
+
+ // frame menu object
+ hFrameMenuObject = MO_CreateMenuObject("FrameMenu", LPGEN("Frame menu"), "FrameMenuCheckService", "FrameMenuExecService");
+ return 0;
+}
+
+int UnitFramesMenu()
+{
+ return 0;
+}
diff --git a/plugins/Clist_modern/src/CLUIFrames/groupmenu.cpp b/plugins/Clist_modern/src/CLUIFrames/groupmenu.cpp new file mode 100644 index 0000000000..0b47bc71da --- /dev/null +++ b/plugins/Clist_modern/src/CLUIFrames/groupmenu.cpp @@ -0,0 +1,588 @@ +/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2008 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 "../hdr/modern_commonheaders.h"
+#include "m_clui.h"
+#include "../hdr/modern_clist.h"
+#include "../hdr/modern_clc.h"
+
+//////////////////////////////Group MENU/////////////////////////
+HANDLE hGroupMenuObject;
+
+HGENMENU hGroupMainMenuItemProxy;
+HGENMENU hHideShowMainMenuItem;
+HGENMENU hGroupStatusMenuItemProxy;
+
+HGENMENU hHideOfflineUsersMenuItem;
+HGENMENU hHideOfflineUsersOutHereMenuItem;
+HGENMENU hHideEmptyGroupsMenuItem;
+
+HGENMENU hDisableGroupsMenuItem;
+HGENMENU hNewGroupMenuItem;
+HGENMENU hNewSubGroupMenuItem;
+
+int NewGroupIconidx;
+
+void InitSubGroupMenus(void);
+
+//Groupmenu exec param(ownerdata)
+typedef struct
+{
+ char *szServiceName;
+ int Param1,Param2;
+}
+ GroupMenuExecParam,*lpGroupMenuExecParam;
+
+/*
+wparam = handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM
+return 0 on success.
+*/
+static INT_PTR RemoveGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+
+INT_PTR BuildGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ ListParam param = { 0 };
+ param.MenuObjectHandle = hGroupMenuObject;
+
+ //hMenu = hMainMenu;
+ HMENU hMenu = CreatePopupMenu();
+ //hMenu = wParam;
+ int tick = GetTickCount();
+
+ NotifyEventHooks(g_CluiData.hEventPreBuildGroupMenu, 0, 0);
+
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)¶m);
+ //DrawMenuBar((HWND)CallService("CLUI/GetHwnd", 0, 0));
+ tick = GetTickCount()-tick;
+ return (INT_PTR)hMenu;
+}
+
+static INT_PTR AddGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ TMO_MenuItem tmi;
+ CLISTMENUITEM *mi = (CLISTMENUITEM*)lParam;
+ if ( !pcli->pfnConvertMenu(mi, &tmi))
+ return NULL;
+
+ lpGroupMenuExecParam mmep = (lpGroupMenuExecParam)mir_calloc(sizeof(GroupMenuExecParam));
+ if (mmep == NULL)
+ return 0;
+
+ //we need just one parametr.
+ mmep->szServiceName = mir_strdup(mi->pszService);
+ mmep->Param1 = mi->popupPosition;
+ lpGroupMenuParam gmp = (lpGroupMenuParam)wParam;
+ if (gmp != NULL) {
+ mmep->Param1 = gmp->wParam;
+ mmep->Param2 = gmp->lParam;
+ }
+ tmi.ownerdata = mmep;
+
+ char buf[1024];
+ mir_snprintf(buf, SIZEOF(buf), "%s/%s", mi->pszService, mi->pszName);
+
+ OptParam op;
+ op.Handle = (HANDLE)CallService(MO_ADDNEWMENUITEM,(WPARAM)hGroupMenuObject,(LPARAM)&tmi);
+ op.Setting = OPT_MENUITEMSETUNIQNAME;
+ op.Value = (INT_PTR)buf;
+ CallService(MO_SETOPTIONSMENUITEM, 0, (LPARAM)&op);
+ return (INT_PTR)op.Handle;
+}
+
+int GroupMenuCheckService(WPARAM wParam,LPARAM lParam) {
+//not used
+ return 0;
+};
+
+INT_PTR GroupMenuonAddService(WPARAM wParam,LPARAM lParam) {
+
+ MENUITEMINFO *mii = (MENUITEMINFO* )wParam;
+ if (mii == NULL)
+ return 0;
+
+ if (hHideShowMainMenuItem == (HANDLE)lParam) {
+ mii->fMask |= MIIM_STATE;
+ mii->fState |= MFS_DEFAULT;
+
+ }
+ if (hGroupMainMenuItemProxy == (HANDLE)lParam) {
+ mii->fMask |= MIIM_SUBMENU;
+ mii->hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETMAIN, 0, 0);
+ }
+
+ if (hGroupStatusMenuItemProxy == (HANDLE)lParam) {
+ mii->fMask |= MIIM_SUBMENU;
+ mii->hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS, 0, 0);
+ }
+
+ return TRUE;
+}
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR GroupMenuExecService(WPARAM wParam,LPARAM lParam)
+{
+ if (wParam != 0) {
+ lpGroupMenuExecParam mmep = (lpGroupMenuExecParam)wParam;
+ if ( !mir_strcmp(mmep->szServiceName,"Help/AboutCommand")) {
+ //bug in help.c,it used wparam as parent window handle without reason.
+ mmep->Param1 = 0;
+ CallService(mmep->szServiceName,mmep->Param1,lParam);
+ }
+ else CallService(mmep->szServiceName,mmep->Param1,mmep->Param2);
+ }
+ return 1;
+}
+
+INT_PTR FreeOwnerDataGroupMenu (WPARAM wParam,LPARAM lParam)
+{
+ lpGroupMenuExecParam mmep = (lpGroupMenuExecParam)lParam;
+ if (mmep != NULL) {
+ mir_free(mmep->szServiceName);
+ mir_free(mmep);
+ }
+
+ return 0;
+}
+
+INT_PTR HideGroupsHelper(WPARAM wParam,LPARAM lParam)
+{
+ int newVal = !(GetWindowLongPtr(pcli->hwndContactTree,GWL_STYLE)&CLS_HIDEEMPTYGROUPS);
+ db_set_b(NULL,"CList","HideEmptyGroups",(BYTE)newVal);
+ SendMessage(pcli->hwndContactTree,CLM_SETHIDEEMPTYGROUPS,newVal,0);
+ return 0;
+}
+
+INT_PTR UseGroupsHelper(WPARAM wParam,LPARAM lParam)
+{
+ int newVal = !(GetWindowLongPtr(pcli->hwndContactTree,GWL_STYLE)&CLS_USEGROUPS);
+ db_set_b(NULL,"CList","UseGroups",(BYTE)newVal);
+ SendMessage(pcli->hwndContactTree,CLM_SETUSEGROUPS,newVal,0);
+ return 0;
+}
+
+INT_PTR HideOfflineRootHelper(WPARAM wParam,LPARAM lParam)
+{
+ SendMessage(
+ (HWND)CallService(MS_CLUI_GETHWNDTREE, 0, 0),
+ CLM_SETHIDEOFFLINEROOT,
+ !SendMessage((HWND)CallService(MS_CLUI_GETHWNDTREE, 0, 0),CLM_GETHIDEOFFLINEROOT, 0, 0),
+ 0);
+ return 0;
+}
+
+INT_PTR CreateGroupHelper(WPARAM wParam,LPARAM lParam)
+{
+ SendMessage((HWND)CallService(MS_CLUI_GETHWNDTREE, 0, 0), CLM_SETHIDEEMPTYGROUPS, 0, 0);
+ SendMessage((HWND)CallService(MS_CLUI_GETHWNDTREE, 0, 0), CLM_SETUSEGROUPS, 1, 0);
+ Clist_CreateGroup(0, 0);
+ return 0;
+};
+
+static int OnBuildGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ if (MirandaExiting()) return 0;
+
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIM_FLAGS | ( db_get_b(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT)?CMIF_CHECKED:0);
+ Menu_ModifyItem(hHideOfflineUsersMenuItem, &mi);
+
+ mi.flags = CMIM_FLAGS | (SendMessage(pcli->hwndContactTree,CLM_GETHIDEOFFLINEROOT, 0, 0)?CMIF_CHECKED:0);
+ Menu_ModifyItem(hHideOfflineUsersOutHereMenuItem, &mi);
+
+ mi.flags = CMIM_FLAGS | (GetWindowLongPtr(pcli->hwndContactTree,GWL_STYLE)&CLS_HIDEEMPTYGROUPS?CMIF_CHECKED:0);
+ Menu_ModifyItem(hHideEmptyGroupsMenuItem, &mi);
+
+ mi.flags = CMIM_FLAGS | (GetWindowLongPtr(pcli->hwndContactTree,GWL_STYLE)&CLS_USEGROUPS?0:CMIF_CHECKED);
+ Menu_ModifyItem(hDisableGroupsMenuItem, &mi);
+ return 0;
+}
+
+static IconItem iconItem = { "New Group", "NewGroup", IDI_NEWGROUP2 };
+
+int static OnIconLibIconChanged(WPARAM wParam,LPARAM lParam)
+{
+ if (MirandaExiting()) return 0;
+
+ HICON hIcon = Skin_GetIconByHandle(iconItem.hIcolib);
+ NewGroupIconidx = ImageList_ReplaceIcon(hCListImages, NewGroupIconidx, hIcon);
+ Skin_ReleaseIcon(hIcon);
+
+ CLISTMENUITEM clmi = { sizeof(clmi) };
+ clmi.flags = CMIM_ICON;
+ clmi.hIcon = ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0);
+ Menu_ModifyItem(hNewSubGroupMenuItem, &clmi);
+ Menu_ModifyItem(hNewGroupMenuItem, &clmi);
+ return 0;
+}
+
+void GroupMenus_Init(void)
+{
+ Icon_Register(g_hInst, "Contact List", &iconItem, 1);
+
+ HICON hIcon = Skin_GetIconByHandle(iconItem.hIcolib);
+ NewGroupIconidx = hIcon ? ImageList_AddIcon(hCListImages, hIcon) : -1;
+ Skin_ReleaseIcon(hIcon);
+
+ CreateServiceFunction("CLISTMENUSGroup/ExecService",GroupMenuExecService);
+ CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu",FreeOwnerDataGroupMenu);
+ CreateServiceFunction("CLISTMENUSGroup/GroupMenuonAddService",GroupMenuonAddService);
+ CreateServiceFunction("CLISTMENUSGroup/HideGroupsHelper",HideGroupsHelper);
+ CreateServiceFunction("CLISTMENUSGroup/UseGroupsHelper",UseGroupsHelper);
+ CreateServiceFunction("CLISTMENUSGroup/HideOfflineRootHelper",HideOfflineRootHelper);
+ CreateServiceFunction("CLISTMENUSGroup/CreateGroupHelper",CreateGroupHelper);
+
+ CreateServiceFunction("CList/AddGroupMenuItem",AddGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_REMOVEGROUPMENUITEM,RemoveGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDGROUP,BuildGroupMenu);
+
+ HookEvent(ME_CLIST_PREBUILDGROUPMENU,OnBuildGroupMenu);
+
+ InitSubGroupMenus();
+
+ // Group menu
+ hGroupMenuObject = MO_CreateMenuObject("GroupMenu", LPGEN("Group menu"), 0, "CLISTMENUSGroup/ExecService");
+ MO_SetMenuObjectParam(hGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE);
+ MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSGroup/FreeOwnerDataGroupMenu");
+ MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSGroup/GroupMenuonAddService");
+
+ //add exit command to menu
+ GroupMenuParam gmp;
+
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.position = 1900000;
+ mi.pszService = "CloseAction";
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_EXIT);
+ mi.pszName = LPGEN("E&xit");
+ AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 500;
+ mi.pszService = MS_CLIST_SHOWHIDE;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_SHOWHIDE);
+ mi.pszName = LPGEN("&Hide/Show");
+ hHideShowMainMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 200000;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_FINDUSER);
+ mi.pszService = "FindAdd/FindAddCommand";
+ mi.pszName = LPGEN("&Find/Add Contacts...");
+ AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 300000;
+ mi.pszService = "";
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_MAINMENU); // eternity #004
+ mi.pszName = LPGEN("&Main menu");
+ hGroupMainMenuItemProxy = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 300100;
+ mi.pszService = "";
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_STATUS); // eternity #004
+ mi.pszName = LPGEN("&Status");
+ hGroupStatusMenuItemProxy = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 400000;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_OPTIONS);
+ mi.pszService = "Options/OptionsCommand";
+ mi.pszName = LPGEN("&Options...");
+ AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 500000;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_MIRANDA);
+ mi.pszService = "Help/AboutCommand";
+ mi.pszName = LPGEN("&About");
+ AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.flags = 0;
+ mi.position = 100000;
+ mi.hIcon = ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0);
+ mi.pszService = "CLISTMENUSGroup/CreateGroupHelper";
+ mi.pszName = LPGEN("&New Group");
+ hNewGroupMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+ DestroyIcon_protect(mi.hIcon);
+
+ mi.position = 100001;
+ mi.hIcon = NULL;
+ mi.pszService = MS_CLIST_SETHIDEOFFLINE;
+ mi.pszName = LPGEN("&Hide Offline Users");
+ gmp.lParam = 0;gmp.wParam = -1;
+ hHideOfflineUsersMenuItem = (HGENMENU)AddGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi);
+
+ mi.position = 100002;
+ mi.pszService = "CLISTMENUSGroup/HideOfflineRootHelper";
+ mi.pszName = LPGEN("Hide &Offline Users out here");
+ hHideOfflineUsersOutHereMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 100003;
+ mi.pszService = "CLISTMENUSGroup/HideGroupsHelper";
+ mi.pszName = LPGEN("Hide &Empty Groups");
+ hHideEmptyGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+
+ mi.position = 100004;
+ mi.pszService = "CLISTMENUSGroup/UseGroupsHelper";
+ mi.pszName = LPGEN("Disable &Groups");
+ hDisableGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi);
+
+ HookEvent(ME_SKIN2_ICONSCHANGED, OnIconLibIconChanged);
+}
+
+//////////////////////////////END Group MENU/////////////////////////
+
+//////////////////////////////SubGroup MENU/////////////////////////
+HANDLE hSubGroupMenuObject;
+
+HANDLE hSubGroupMainMenuItemProxy;
+HANDLE hSubGroupStatusMenuItemProxy;
+
+HGENMENU hHideOfflineUsersHereMenuItem, hShowOfflineUsersHereMenuItem;
+
+//SubGroupmenu exec param(ownerdata)
+typedef struct{
+char *szServiceName;
+int Param1,Param2;
+}SubGroupMenuExecParam,*lpSubGroupMenuExecParam;
+
+/*
+wparam = handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM
+return 0 on success.
+*/
+static INT_PTR RemoveSubGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+static int OnBuildSubGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ BOOL gray1 = FALSE;
+ BOOL gray2 = FALSE;
+ BOOL showOfflineinGroup = FALSE;
+
+ ClcGroup *group = (ClcGroup *)wParam;
+ if (wParam == 0) return 0;
+
+ if (MirandaExiting()) return 0;
+ //contact->group
+
+ showOfflineinGroup = CLCItems_IsShowOfflineGroup(group);
+ gray1 = (showOfflineinGroup != FALSE);
+ gray2 = (group->hideOffline != FALSE);
+
+ if (gray1 && gray2) gray1 = FALSE; //should not be cause CLCItems_IsShowOfflineGroup return false if group->hideOffline
+
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.flags = CMIM_FLAGS | ((group->hideOffline && !gray1)?CMIF_CHECKED:0)| (gray1?CMIF_GRAYED:0);
+ Menu_ModifyItem(hHideOfflineUsersHereMenuItem, &mi);
+
+ mi.flags = CMIM_FLAGS | ((showOfflineinGroup && !gray2) ? CMIF_CHECKED:0)| (gray2?CMIF_GRAYED:0);
+ Menu_ModifyItem(hShowOfflineUsersHereMenuItem, &mi);
+ return 0;
+}
+
+INT_PTR BuildSubGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ ListParam param = { 0 };
+ param.MenuObjectHandle = hSubGroupMenuObject;
+ param.wParam = wParam;
+ param.lParam = lParam;
+
+ //hMenu = hMainMenu;
+ HMENU hMenu = CreatePopupMenu();
+ //hMenu = wParam;
+ int tick = GetTickCount();
+
+ NotifyEventHooks(g_CluiData.hEventPreBuildSubGroupMenu,wParam,0);
+
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)¶m);
+ //DrawMenuBar((HWND)CallService("CLUI/GetHwnd", 0, 0));
+ tick = GetTickCount()-tick;
+ return (INT_PTR)hMenu;
+}
+
+HMENU cliBuildGroupPopupMenu(ClcGroup *group)
+{
+ //HWND wnd = GetForegroundWindow();
+ return (HMENU)CallService(MS_CLIST_MENUBUILDSUBGROUP,(WPARAM)group,0);
+}
+
+static INT_PTR AddSubGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ TMO_MenuItem tmi;
+ CLISTMENUITEM *mi = (CLISTMENUITEM*)lParam;
+ if ( !pcli->pfnConvertMenu(mi, &tmi))
+ return NULL;
+
+ lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)mir_calloc(sizeof(SubGroupMenuExecParam));
+ if ( mmep == NULL)
+ return 0;
+
+ //we need just one parametr.
+ mmep->szServiceName = mir_strdup(mi->pszService);
+ mmep->Param1 = mi->popupPosition;
+ lpGroupMenuParam gmp = (lpGroupMenuParam)wParam;
+ if (gmp != NULL) {
+ mmep->Param1 = gmp->wParam;
+ mmep->Param2 = gmp->lParam;
+ }
+ tmi.ownerdata = mmep;
+
+ char buf[1024];
+ mir_snprintf(buf, SIZEOF(buf), "%s/%s", mi->pszService, mi->pszName);
+
+ OptParam op;
+ op.Handle = (HANDLE)CallService(MO_ADDNEWMENUITEM,(WPARAM)hSubGroupMenuObject,(LPARAM)&tmi);
+ op.Setting = OPT_MENUITEMSETUNIQNAME;
+ op.Value = (INT_PTR)buf;
+ CallService(MO_SETOPTIONSMENUITEM, 0, (LPARAM)&op);
+ return (INT_PTR)op.Handle;
+}
+
+INT_PTR SubGroupMenuCheckService(WPARAM wParam,LPARAM lParam)
+{
+ TCheckProcParam * CParam = (TCheckProcParam*)wParam;
+ if (CParam) {
+ lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)(CParam->MenuItemOwnerData);
+ if (mmep)
+ mmep->Param2 = CParam->lParam;
+ }
+ return 1;
+}
+
+INT_PTR SubGroupMenuonAddService(WPARAM wParam,LPARAM lParam)
+{
+ MENUITEMINFO *mii = (MENUITEMINFO* )wParam;
+ if (mii == NULL)
+ return 0;
+
+ return TRUE;
+}
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR SubGroupMenuExecService(WPARAM wParam,LPARAM lParam)
+{
+ if (wParam != 0) {
+ lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)wParam;
+ if ( !mir_strcmp(mmep->szServiceName, "Help/AboutCommand")) {
+ //bug in help.c,it used wparam as parent window handle without reason.
+ mmep->Param1 = 0;
+ CallService(mmep->szServiceName,mmep->Param1,lParam);
+ }
+ else CallService(mmep->szServiceName,mmep->Param1,lParam);
+ }
+ return 1;
+}
+
+INT_PTR FreeOwnerDataSubGroupMenu (WPARAM wParam,LPARAM lParam)
+{
+ lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)lParam;
+ if (mmep != NULL){
+ mir_free(mmep->szServiceName);
+ mir_free(mmep);
+ }
+
+ return 0;
+}
+
+//wparam menu handle to pass to clc.c
+//lparam WM_COMMAND HWND
+INT_PTR GroupMenuExecProxy(WPARAM wParam,LPARAM lParam)
+{
+ SendMessage(lParam?(HWND)lParam:(HWND)pcli->hwndContactTree,WM_COMMAND,wParam,0);
+ return 0;
+}
+
+void InitSubGroupMenus(void)
+{
+ CreateServiceFunction("CLISTMENUSSubGroup/ExecService",SubGroupMenuExecService);
+ CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu",FreeOwnerDataSubGroupMenu);
+ CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuonAddService",SubGroupMenuonAddService);
+ CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuCheckService",SubGroupMenuCheckService);
+ CreateServiceFunction("CLISTMENUSSubGroup/GroupMenuExecProxy",GroupMenuExecProxy);
+
+ CreateServiceFunction("CList/AddSubGroupMenuItem",AddSubGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_REMOVESUBGROUPMENUITEM,RemoveSubGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDSUBGROUP,BuildSubGroupMenu);
+
+ HookEvent(ME_CLIST_PREBUILDSUBGROUPMENU,OnBuildSubGroupMenu);
+
+ // SubGroup menu
+ hSubGroupMenuObject = MO_CreateMenuObject("SubGroupMenu", LPGEN("Subgroup menu"), 0, "CLISTMENUSSubGroup/ExecService");
+ MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE);
+ MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu");
+ MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuonAddService");
+ MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_CHECK_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuCheckService");
+
+ // add exit command to menu
+ GroupMenuParam gmp;
+
+ CLISTMENUITEM mi = { sizeof(mi) };
+ mi.position = 1000;
+ mi.hIcon = ske_ImageList_GetIcon(hCListImages,NewGroupIconidx,0);
+ mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName = LPGEN("&New SubGroup");
+ gmp.lParam = 0;gmp.wParam = POPUP_NEWSUBGROUP;
+ hNewSubGroupMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+ DestroyIcon_protect(mi.hIcon);
+
+ mi.position = 1001;
+ mi.hIcon = NULL;
+ mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName = LPGEN("&Hide Offline Users in here");
+ gmp.lParam = 0;
+ gmp.wParam = POPUP_GROUPHIDEOFFLINE;
+ hHideOfflineUsersHereMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ mi.position = 1002;
+ mi.hIcon = NULL;
+ mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName = LPGEN("&Show Offline Users in here");
+ gmp.lParam = 0;
+ gmp.wParam = POPUP_GROUPSHOWOFFLINE;
+ hShowOfflineUsersHereMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ memset(&mi, 0, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.position = 900001;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_RENAME);
+ mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName = LPGEN("&Rename Group");
+ gmp.lParam = 0;gmp.wParam = POPUP_RENAMEGROUP;
+ AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+ DestroyIcon_protect(mi.hIcon);
+
+ mi.position = 900002;
+ mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_DELETE);
+ mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName = LPGEN("&Delete Group");
+ gmp.lParam = 0;gmp.wParam = POPUP_DELETEGROUP;
+ AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+ DestroyIcon_protect(mi.hIcon);
+}
+
+//////////////////////////////END SubGroup MENU/////////////////////////
|