//CTabCtrl_util.cpp
#include "stdafx.h"
#include "CTabCtrl_util.h"
int CTabCtrl_ShowTabPage(CTabCtrl *pCTabCtrl,int i)
{
int ipre=-1;
if(pCTabCtrl)
{
TCITEM item;
CWnd *pCWnd;
item.mask=TCIF_PARAM;
ipre=pCTabCtrl->GetCurSel();
if(ipre==i)
{
//skip
}
else
{
if(pCTabCtrl->GetItem(ipre,&item))
{
pCWnd=(CWnd*)item.lParam;
if(pCWnd)
{
pCWnd->ShowWindow(SW_HIDE);
}
}
pCTabCtrl->SetCurSel(i);
if(pCTabCtrl->GetItem(i,&item))
{
pCWnd=(CWnd*)item.lParam;
if(pCWnd)
{
pCWnd->ShowWindow(SW_SHOW);
}
}
}
}
return ipre;
}
CWnd *CTabCtrl_ShowCurSelTabPage(CTabCtrl *pCTabCtrl,int bCmdShow)
{
CWnd *pCWnd;
TCITEM ti;
int CurSel;
ti.mask=TCIF_PARAM;
CurSel=pCTabCtrl->GetCurSel();
pCTabCtrl->GetItem(CurSel,&ti);
pCWnd=(CWnd*)ti.lParam;
if(pCWnd)
{
pCWnd->ShowWindow(SW_SHOW);
}
return pCWnd;
}
void *CTabCtrl_GetCurPage(CTabCtrl *pCTabCtrl)
{
if(pCTabCtrl)
if(pCTabCtrl->m_hWnd)//20140708
{
int i;
TCITEM item;
i=pCTabCtrl->GetCurSel();
item.mask=TCIF_PARAM;
if(pCTabCtrl->GetItem(i,&item))
{
return (void*)(item.lParam);
}
}
return 0;
}
int CTabCtrl_GetTabPageIndex(CTabCtrl *pCTabCtrl,char *title)
{
if(title)
if(pCTabCtrl)
{
int i;
int cnt;
TCITEM item;
char buf[128];
//memset(&item,0,sizeof(item));
item.mask=TCIF_TEXT;
item.pszText=buf;
item.cchTextMax=sizeof(buf);
cnt=pCTabCtrl->GetItemCount();
for(i=0; i < cnt; i++)
{
if(pCTabCtrl->GetItem(i,&item))
{
if(item.pszText)
if(item.pszText[0]==title[0])
if(strcmp(item.pszText,title)==0)
{
return i;
}
}
}
}
return -1;
}
void *CTabCtrl_GetTabPage(CTabCtrl *pCTabCtrl,char *title)
{
void *pPage=NULL;
int i;
if(pCTabCtrl)
{
i=CTabCtrl_GetTabPageIndex(pCTabCtrl,title);
if(i!=-1)
{
pPage=CTabCtrl_GetTabPage(pCTabCtrl,i);
}
}
return pPage;
}
void *CTabCtrl_GetTabPage(CTabCtrl *pCTabCtrl,int i)
{
void *pPage=NULL;
if(i!=-1)
if(pCTabCtrl)
{
TCITEM item;
item.mask=TCIF_PARAM;
if(pCTabCtrl->GetItem(i,&item))
{
pPage=(void*)item.lParam;
}
}
return pPage;
}
int CTabCtrl_ShowTabPage(CTabCtrl *pCTabCtrl,char *title)
{
int i;
i=CTabCtrl_GetTabPageIndex(pCTabCtrl,title);
if(i!=-1)
{
CTabCtrl_ShowTabPage(pCTabCtrl,i);
}
return i;
}
void CTabCtrl_CalSize(CTabCtrl *pCTabCtrl)
{
if(pCTabCtrl)
{
RECT r;
if(pCTabCtrl->m_hWnd)
{
//set tabctrl size
CWnd *pCWnd;
pCWnd=(CWnd*)(pCTabCtrl->GetParent());
void SetWindowSizeNoMoveFit(HWND hwnd_parent,HWND hwnd_control,int right,int bottom);
SetWindowSizeNoMoveFit(pCWnd->m_hWnd,pCTabCtrl->m_hWnd,0,0);
::GetClientRect(pCTabCtrl->m_hWnd,&r);
pCTabCtrl->AdjustRect(0,&r);
TCITEM item;
//CWnd *pCWnd;
int i;
item.mask=TCIF_PARAM;
i=0;
while(pCTabCtrl->GetItem(i,&item))
{
pCWnd=(CWnd*)item.lParam;
if(pCWnd)
{
pCWnd->MoveWindow(&r);
}
i++;
}
}
}
}
//tab컨트롤 안의 윈도우를 tab컨트롤 크기에 맞게 조정한다.
void CTabCtrl_SizeFitClient(CTabCtrl *pCTabCtrl)
{
if(pCTabCtrl)
{
RECT r;
if(pCTabCtrl->m_hWnd)
{
TCITEM item;
CWnd *pCWnd;
int i;
::GetClientRect(pCTabCtrl->m_hWnd,&r);
pCTabCtrl->AdjustRect(0,&r); //tab 사이즈 빼고 실질적인 클라이언트 영역
item.mask=TCIF_PARAM;
i=0;
while(pCTabCtrl->GetItem(i,&item))
{
pCWnd=(CWnd*)item.lParam;
if(pCWnd)
{
pCWnd->MoveWindow(&r);
}
i++;
}
}
}
}
void CTabCtrl_CalSize(CTabCtrl *pCTabCtrl,int i)
{
if(pCTabCtrl)
{
RECT r;
if(pCTabCtrl->m_hWnd)
{
TCITEM item;
CWnd *pCWnd;
pCTabCtrl->GetClientRect(&r);
pCTabCtrl->AdjustRect(0,&r);
item.mask=TCIF_PARAM;
if(pCTabCtrl->GetItem(i,&item))
{
pCWnd=(CWnd*)item.lParam;
if(pCWnd)
{
pCWnd->MoveWindow(&r);
}
}
}
}
}
void CTabCtrl_AddPage(CTabCtrl *pCTabCtrl,CWnd *pCWnd,char *text)
{
if(pCTabCtrl)
{
TCITEM item;
int cnt;
item.mask=TCIF_TEXT|TCIF_PARAM;
cnt=pCTabCtrl->GetItemCount();
item.pszText=text;
item.lParam=(LPARAM)pCWnd;
pCTabCtrl->InsertItem(cnt,&item);
CTabCtrl_CalSize(pCTabCtrl,cnt);
CTabCtrl_ShowTabPage(pCTabCtrl,cnt);
}
}
void CTabCtrl_DeletePage(CTabCtrl *pCTabCtrl,
int i,
void (*delete_func)(void *pDlg),
int default_view_page)
{
if(pCTabCtrl)
{
//i=pCTabCtrl->GetCurSel();
//if(i > 0)
{
TCITEM item;CWnd *pCWnd;
item.mask=TCIF_PARAM;
if(pCTabCtrl->GetItem(i,&item))
{
pCWnd=(CWnd*)item.lParam;
if(pCWnd)
{
pCWnd->ShowWindow(SW_HIDE);
pCWnd->CloseWindow();
pCWnd->DestroyWindow();
if(delete_func)delete_func(pCWnd);
}
}
pCTabCtrl->DeleteItem(i);
if(default_view_page==-1)default_view_page=i-1;
if(default_view_page==-1)default_view_page=0;
CTabCtrl_ShowTabPage(pCTabCtrl,default_view_page);
CTabCtrl_CalSize(pCTabCtrl);
}
}
}
void CTabCtrl_DeletePage(CTabCtrl *pCTabCtrl,void *pPage,void (*delete_func)(void *pDlg))
{
if(pCTabCtrl)
{
TCITEM item;
int i,cnt;
item.mask=TCIF_PARAM;
cnt=pCTabCtrl->GetItemCount();
for(i=0; i < cnt; i++)
{
if(pCTabCtrl->GetItem(i,&item))
if(((void*)item.lParam)==pPage)
{
CTabCtrl_DeletePage(pCTabCtrl,i,delete_func);
break;
}
}
}
}
void CTabCtrl_DeletePageAll(CTabCtrl *pCTabCtrl,void (*delete_func)(void *pDlg))
{
if(pCTabCtrl)
{
TCITEM item;
int i,cnt;
item.mask=TCIF_PARAM;
cnt=pCTabCtrl->GetItemCount();
for(i=0; i < cnt; i++)
{
CTabCtrl_DeletePage(pCTabCtrl,0,delete_func);//20140818 페이지 삭제가 제대로 안되는 문제 수정(메모리누수)
}
}
}
void CTabCtrl_DeletePage(CTabCtrl *pCTabCtrl,void *pDlg)
{
if(pCTabCtrl)
{
TCITEM item;
int i,cnt;
item.mask=TCIF_PARAM;
cnt=pCTabCtrl->GetItemCount();
for(i=0; i < cnt; i++)
{
if(pCTabCtrl->GetItem(i,&item))
if(((void*)item.lParam)==pDlg)
{
pCTabCtrl->DeleteItem(i);
break;
}
}
CTabCtrl_CalSize(pCTabCtrl);
cnt=pCTabCtrl->GetItemCount();
if(cnt)
{
cnt--;
CTabCtrl_ShowTabPage(pCTabCtrl,cnt);
}
}
}
void CTabCtrl_AddTabDlg(CTabCtrl *pTabCtrl,void *pDlg,char *tabname)
{
if(pTabCtrl)
{
TCITEM item;
int cnt;
item.mask=TCIF_TEXT|TCIF_PARAM;
item.pszText=tabname;
item.lParam=(LPARAM)pDlg;
cnt=pTabCtrl->GetItemCount();
pTabCtrl->InsertItem(cnt,&item);
//g_Data.m_pTabCtrl->SetCurSel(cnt);
CTabCtrl_CalSize(pTabCtrl);
CTabCtrl_ShowTabPage(pTabCtrl,cnt);
}
}
//실패 : -1
int CTabCtrl_FindTabPage(CTabCtrl *pTabCtrl,void *pDlg)
{
if(pTabCtrl)
{
TCITEM item;
int cnt;
int i;
item.mask=TCIF_PARAM;
//item.pszText=tabname;
cnt=pTabCtrl->GetItemCount();
for(i=0; i < cnt; i++)
{
if(pTabCtrl->GetItem(i,&item))
{
if((void*)(item.lParam)==pDlg)
{
return i;
}
}
}
}
return -1;
}
void CTabCtrl_ChangeTabName(CTabCtrl *pTabCtrl,void *pDlg,char *tabname)
{
int i;
i=CTabCtrl_FindTabPage(pTabCtrl,pDlg);
if(i!=-1)
{
TCITEM item;
item.mask=TCIF_TEXT;
item.pszText=tabname;
pTabCtrl->SetItem(i,&item);
CTabCtrl_CalSize(pTabCtrl,i);
CTabCtrl_ShowTabPage(pTabCtrl,i);
}
}
char *CTabCtrl_GetTabName(CTabCtrl *pTabCtrl,void *pDlg,char *buf,int len)
{
int i;
i=CTabCtrl_FindTabPage(pTabCtrl,pDlg);
if(i!=-1)
{
TCITEM item;
item.mask=TCIF_TEXT;
item.pszText=buf;
item.cchTextMax=len;
pTabCtrl->GetItem(i,&item);
return item.pszText;
}
return NULL;
}