www.pudn.com > clking_src.rar > GuiFolder.cpp


//-----------------------------------------------------------------------// 
// This is a part of the GuiLib MFC Extention.							 //	 
// Autor  :  Francisco Campos											 // 
// (C) 2002 Francisco Campos  All rights reserved     // 
// This code is provided "as is", with absolutely no warranty expressed  // 
// or implied. Any use is at your own risk.								 //		 
// You must obtain the author's consent before you can include this code // 
// in a software library.												 // 
// If the source code in  this file is used in any application			 // 
// then acknowledgement must be made to the author of this program		 //	 
// fcampos@tutopia.com													 // 
//-----------------------------------------------------------------------// 
 
#include "stdafx.h" 
#include "GuiFolder.h" 
#include "GuiDrawLayer.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CGuiFolder 
IMPLEMENT_DYNAMIC(CGuiFolder,CWnd) 
 
CFolderBar::CFolderBar(CWnd* m_wnd,LPCSTR lp_msg,UINT uImg) 
{ 
	m_Cwnd=m_wnd; 
	m_lpMsg=lp_msg; 
	m_img=uImg; 
	m_rect=CRect(0,0,0,0); 
	m_posUp=TRUE; 
	 
} 
 
 
CGuiFolder::CGuiFolder() 
{ 
	m_ArrayFolder.RemoveAll(); 
	m_NumFolders=0; 
	m_numFolderDown=0; 
	m_numFolderUp=0; 
	m_iSelected=0;	 
	m_ultimoFolderResal =-1; 
	m_itemp=0; 
	m_typel=mOutlook;//by default 
	m_iWhatFolderIsDrawNow=0; 
} 
 
CGuiFolder::~CGuiFolder() 
{ 
	/* Modified By SunZhenyu 2003/8/22, Add next 7 lines. */ 
	for(int i=0; im_rect.PtInRect(point)) 
		{ 
			DrawFolder(cit,mPush); 
		} 
	}		 
 
	CWnd::OnLButtonDown(nFlags, point); 
} 
 
void CGuiFolder::PreSubclassWindow()  
{ 
	ModifyStyle(0,BS_OWNERDRAW); 
	CWnd::PreSubclassWindow(); 
} 
 
void CGuiFolder::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	int m_iNumBotton=m_ArrayFolder.GetSize(); 
	for( int iCont=0; iCont< m_iNumBotton;iCont++) 
	{ 
		CFolderBar* cit=(CFolderBar*)m_ArrayFolder[iCont]; 
		if (cit->m_rect.PtInRect(point)) 
		{ 
			DrawFolder(cit,mFlat); 
			m_itemp=m_iSelected; 
			m_iSelected=iCont; 
			EfectoScroll(); 
		} 
	}		 
 
	CWnd::OnLButtonUp(nFlags, point); 
} 
 
void CGuiFolder::TypeLook(TypeFolder tol) 
{ 
	m_typel=tol; 
} 
 
void CGuiFolder::EfectoScroll() 
{ 
	int m_iNumBotton=m_ArrayFolder.GetSize(); 
	int m_iSentidoScroll=0;	//1=hacia abajo, 2=hacia arriba 
	if (m_iNumBotton > 0) //si existe un solo folder no haga nada 
	{ 
		// si es el ultimo folder y no esta abajo no haga nada 
		if (m_iSelected == m_NumFolders-1 && 
			((CFolderBar*)m_ArrayFolder[m_iSelected])->m_posUp ==TRUE)	 
		{ 
			m_iSelected=m_itemp; 
			return; 
		} 
		else if (((CFolderBar*)m_ArrayFolder[m_iSelected])->m_posUp ==TRUE ) 
		{ 
			if (((CFolderBar*)m_ArrayFolder[m_iSelected+1])->m_posUp ==FALSE) 
				return; 
			m_iSentidoScroll =1; 
				//de esta posición todos los folders hacia abajo  
			for (int iCont=m_iSelected+1;iCont < m_iNumBotton; iCont++) 
				((CFolderBar*)m_ArrayFolder[iCont])->m_posUp =FALSE; 
				 
		} 
		else if (((CFolderBar*)m_ArrayFolder[m_iSelected])->m_posUp ==FALSE) 
		{ 
				m_iSentidoScroll =2; 
				//de esta posición todos los folders van arriba 
				for (int iCont=m_iSelected;iCont >0; iCont--) 
					((CFolderBar*)m_ArrayFolder[iCont])->m_posUp =TRUE; 
		} 
		 
	} 
 
	CRect m_rect=((CFolderBar*)m_ArrayFolder[m_iSelected])->m_rect; 
	CClientDC dc(this); 
	if (m_iSentidoScroll >0) 
	{ 
		CWnd* pParent=((CFolderBar*)m_ArrayFolder[m_itemp])->m_Cwnd; 
		ASSERT_VALID(pParent); 
		CWnd* pParentn=((CFolderBar*)m_ArrayFolder[m_iSelected])->m_Cwnd; 
		ASSERT_VALID(pParentn); 
		pParent->ShowWindow(SW_HIDE); 
		pParentn->ShowWindow(SW_SHOW); 
		m_AntFolder=m_iSelected; 
	} 
	 
	if (m_iSentidoScroll ==1) 
	{ 
		/*CGuiFolderBar* cb=(CGuiFolderBar*)m_ArrayFolder[m_iSelected]; 
		CWnd* m_cwnd=((CGuiFolderBar*)m_ArrayFolder[m_iSelected])->m_Cwnd; 
		CRect rctemp=cb->m_rect; 
		while (m_rect.bottom < m_iPosDown) 
		{ 
			m_cwnd->SetWindowPos(NULL,m_rect.left,cb->m_rect.bottom,m_rect.Width(),m_rect.bottom, 
			SWP_NOACTIVATE|SWP_NOZORDER); 
			m_rect.bottom+=10; 
			//DrawFolder(cb,mFlat); 
			//m_cwnd->Invalidate(); 
			//m_cwnd->SendMessage(WM_PAINT,0,0); 
			 
			 
			 
		}*/ 
		RecalLayout();	 
	} 
	else if (m_iSentidoScroll ==2) 
	{ 
		/*CWnd* m_cwnd=((CGuiFolderBar*)m_ArrayFolder[m_iSelected])->m_Cwnd; 
		CGuiFolderBar* cb=(CGuiFolderBar*)m_ArrayFolder[m_iSelected]; 
		while (m_rect.top > m_iposUp) 
		{ 
			m_cwnd->SetWindowPos(NULL,m_rect.left,m_iposUp-1,m_rect.Width(),m_iPosDown-m_iposUp, 
			SWP_NOACTIVATE|SWP_NOZORDER); 
			cb->m_rect.top-=10; 
			cb->m_rect.bottom-=10; 
			Sleep(50); 
			DrawFolder(cb,mFlat); 
			 
			 
		} 
		*/ 
		RecalLayout();	 
	} 
	else 
		m_iSelected=m_itemp; 
		 
 
 
 
} 
 
void CGuiFolder::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	int m_iNumBotton= m_ArrayFolder.GetSize(); 
	static int m_AntTecla=-1; 
	for( int iCont=0; iCont< m_iNumBotton;iCont++) 
	{ 
		CFolderBar* cit=(CFolderBar*)m_ArrayFolder[iCont]; 
		m_iWhatFolderIsDrawNow=iCont; 
		if (cit->m_rect.PtInRect(point)) 
		{ 
			if (m_ultimoFolderResal==m_AntTecla && 
				(m_ultimoFolderResal!=-1 && m_AntTecla !=-1)) return; 
			else 
			{ 
			  if (m_ultimoFolderResal != -1) 
			  { 
				CFolderBar* cit1=(CFolderBar*)m_ArrayFolder[m_ultimoFolderResal];	 
				DrawFolder(cit1,mFlat); 
			  } 
			} 
			DrawFolder(cit,mNormal); 
			m_AntTecla=m_ultimoFolderResal; 
			m_ultimoFolderResal=iCont; 
			SetTimer(1,100,NULL); 
			return;			 
		} 
	}	 
 
	if (m_ultimoFolderResal != -1) 
	 { 
		CFolderBar* cit1=(CFolderBar*)m_ArrayFolder[m_ultimoFolderResal];	 
		DrawFolder(cit1,mFlat); 
		m_ultimoFolderResal=-1; 
	 } 
	m_AntTecla=-1; 
 
	CWnd::OnMouseMove(nFlags, point); 
} 
 
void CGuiFolder::DrawFolder(CFolderBar* cfb,Style m_Style) 
{ 
	CRect rc=cfb->m_rect; 
	CBrush cb; 
	CClientDC pDC(this); 
	cb.CreateSysColorBrush(COLOR_BTNFACE); 
	rc.top+=1; 
	rc.right-=1; 
	pDC.FillRect(&rc,&cb); 
	if (m_typel!=mOutlook) 
	{ 
		rc.right-=30; 
	} 
		 
	if (m_Style == mNormal) 
	{ 
				 
		pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorShadow()); 
		rc.DeflateRect(1,1); 
		pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorFace(),GuiDrawLayer::GetRGBColorShadow()); 
	} 
	else if (m_Style == mFlat) 
		pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorShadow()); 
	else if (m_Style == mPush) 
		pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh()); 
	int OldMode=pDC.SetBkMode(TRANSPARENT); 
	cfont = pDC.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT))); 
	CString m_cadBreak=cfb->m_lpMsg; 
	int cont=m_cadBreak.GetLength(); 
	CSize coor=pDC.GetTextExtent(m_cadBreak,m_cadBreak.GetLength()); 
	if ( coor.cx > rc.Width()) 
	{ 
		rc.left+=1; 
		while(cont > 1 ) 
		{ 
			CString m_scadtemp=m_cadBreak+"..."; 
			CSize coor=pDC.GetTextExtent(m_scadtemp,m_scadtemp.GetLength()); 
			if(coor.cx > rc.Width()) 
				m_cadBreak=m_cadBreak.Left(m_cadBreak.GetLength()-1); 
			else 
				break; 
			cont--; 
		} 
		m_cadBreak+=_T("..."); 
		rc.right+=3; 
		 
			pDC.DrawText(m_cadBreak,rc,DT_SINGLELINE|DT_LEFT|DT_VCENTER); 
	} 
	else 
	{ 
	  if (m_typel!=mOutlook) 
			pDC.DrawText(cfb->m_lpMsg,rc,DT_SINGLELINE|DT_LEFT|DT_VCENTER); 
	  else	 
			pDC.DrawText(cfb->m_lpMsg,rc,DT_WORDBREAK|DT_SINGLELINE|DT_CENTER|DT_VCENTER); 
	} 
 
   	pDC.SetBkColor(OldMode); 
	// Modified By SunZhenyu 
	pDC.SelectObject(cfont); 
} 
 
 
void CGuiFolder::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	CRect mrect; 
	int m_iNumFolder=m_ArrayFolder.GetSize(); 
	//mrect.InflateRect(1,1); 
	//GetClientRect(mrect); 
	//dc.Draw3dRect(mrect, ::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHIGHLIGHT)); 
	for ( int iCont=0; iCont< m_iNumFolder; iCont++) 
	{ 
		m_iWhatFolderIsDrawNow=iCont; 
		if (m_iSelected== iCont) 
			DrawFolder((CFolderBar*) m_ArrayFolder[iCont],mFlat); 
		else 
			DrawFolder((CFolderBar*) m_ArrayFolder[iCont],mFlat);		 
 
	}		 
} 
 
void CGuiFolder::OnSize(UINT nType, int cx, int cy)  
{ 
	CWnd::OnSize(nType, cx, cy); 
	if (m_NumFolders > 0) 
		RecalLayout(); 
	// TODO: Add your message handler code here 
	 
} 
 
void CGuiFolder::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if (nIDEvent == 1) 
	{ 
		CRect rc; 
		CPoint pt(GetMessagePos()); 
		ScreenToClient (&pt); 
		GetClientRect(&rc); 
		if (m_ultimoFolderResal != -1) 
		{ 
			CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[m_ultimoFolderResal]; 
			rc=cfd->m_rect; 
		} 
		 
		if (!rc.PtInRect(pt)) 
		{ 
			if (m_ultimoFolderResal != -1) 
			{ 
			CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[m_ultimoFolderResal]; 
			CClientDC dc(this); 
			DrawFolder(cfd,mFlat); 
			m_ultimoFolderResal=-1; 
			} 
			KillTimer(1); 
		} 
		 
	} 
	CWnd::OnTimer(nIDEvent); 
} 
 
int CGuiFolder::PointInFolder(CPoint pt) 
{ 
	for (int i=0; i <	m_ArrayFolder.GetSize(); i++) 
	{ 
		if ( ((CFolderBar*) m_ArrayFolder[i])->m_rect.PtInRect(pt) ) 
			return i; 
	} 
	return -1; 
} 
 
BOOL CGuiFolder::PreTranslateMessage(MSG* pMsg)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	 
	return CWnd::PreTranslateMessage(pMsg); 
} 
 
void CGuiFolder::RecalLayout() 
{ 
	CRect m_rect; 
	CRect m_rectFolder; 
	m_iPosDown=0; //a partir de donde se ubica el anterior folder 
	m_iposUp=0;   //a partir de donde se ubica el siguiente folder 
	int m_iNumFolder=m_ArrayFolder.GetSize(); 
	GetClientRect(&m_rect); 
	m_rectFolder=m_rect; 
	m_iPosDown=m_rect.bottom; 
	for ( int iCont=0; iCont< m_iNumFolder; iCont++) 
	{ 
		CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[iCont]; 
		if (iCont==0) //inevitablemente arriba 
		{ 
			m_rectFolder.bottom=m_rect.top+21; 
			m_iposUp+=m_rectFolder.Height()-1; 
			cfd->m_rect=m_rectFolder; 
		} 
		else 
		{ 
			if (cfd->m_posUp) 
			{ 
				m_rectFolder.top=m_iposUp; 
				m_rectFolder.bottom=m_rectFolder.top+20; 
				m_iposUp+=m_rectFolder.Height(); 
				cfd->m_rect=m_rectFolder; 
			} 
			else 
			{ 
				 
				for(int iRev=m_iNumFolder-1; iRev>=iCont; iRev--) 
				{ 
					CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[iRev]; 
					m_rectFolder.bottom=m_iPosDown; 
					m_rectFolder.top=m_rectFolder.bottom-20; 
					m_iPosDown-=m_rectFolder.Height(); 
					cfd->m_rect=m_rectFolder; 
				} 
				break; 
			} 
		} 
		 
	} 
	CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[m_iSelected]; 
	CWnd*	m_cwnd=cfd->m_Cwnd; 
	m_cwnd->SetWindowPos(NULL,m_rect.left+1,m_iposUp+1,m_rectFolder.Width()-1,(m_iPosDown-m_iposUp), 
		SWP_NOACTIVATE|SWP_NOZORDER); 
	Invalidate(); 
	UpdateWindow(); 
 
} 
 
void CGuiFolder::AddFolder(CWnd* pParent,LPCSTR lpMsg, UINT uIMg) 
{ 
	m_ArrayFolder.SetAtGrow(m_NumFolders, new CFolderBar(pParent,lpMsg,uIMg)); 
	if (m_NumFolders == 0) 
	  m_numFolderUp=1; 
	pParent->ShowWindow(SW_SHOW); 
	m_iSelected=m_NumFolders; 
	m_AntFolder=m_iSelected; 
	m_NumFolders++; 
	RecalLayout(); 
} 
 
 
BOOL CGuiFolder::OnEraseBkgnd(CDC* pDC)  
{ 
	CBrush cbr; 
	cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace()); 
	CRect m_rect; 
	GetClientRect(m_rect); 
	if (m_NumFolders<= 0) 
		pDC->FillRect(m_rect,&cbr); 
	else 
	{ 
		for (int i=0;i<2; i++) 
		{ 
			pDC->Draw3dRect(m_rect,GuiDrawLayer::GetRGBColorFace(),GuiDrawLayer::GetRGBColorFace()); 
			m_rect.DeflateRect(1,1); 
		} 
	} 
	return TRUE; 
} 
 
void CGuiFolder::DeleteFolder(int m_iNumFolder) 
{ 
	/* Modified By SunZhenyu 2003/8/22, replace all function lines. */ 
	if (m_iNumFolder >= 0 && m_iNumFolder < m_NumFolders) 
	{ 
		m_NumFolders--; 
		CFolderBar * p = (CFolderBar *)m_ArrayFolder.GetAt(m_iNumFolder); 
		if( p )	delete	p; 
		m_ArrayFolder.RemoveAt(m_iNumFolder); 
 
		if (m_iNumFolder == 0 || m_iNumFolder < m_NumFolders) 
			m_iSelected=m_iNumFolder; 
		else if(m_iNumFolder > 0) 
			m_iSelected=m_iNumFolder-1; 
		RecalLayout(); 
	} 
	/* 
	if (m_iNumFolder < m_NumFolders) 
	{ 
		m_iNumFolder--; 
		m_ArrayFolder.RemoveAt(m_iNumFolder,m_NumFolders); 
		if (m_iNumFolder == 0 || m_iNumFolder == m_iNumFolder) 
			m_iSelected=m_iNumFolder; 
		else if(m_iNumFolder > 0) 
			m_iSelected=m_iNumFolder-1; 
		RecalLayout(); 
	} 
	*/ 
} 
 
void CGuiFolder::RemoveAllFolder() 
{ 
	/* Modified By SunZhenyu 2003/8/22, Add next 6 lines. */ 
	for(int i=0; i