ContentsDlg.cpp
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:8k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: ContentsDlg.cpp,v 1.31.2.11 2004/10/21 15:35:24 mike Exp $
  29.  * 
  30.  */
  31. #include <afxcmn.h>
  32. #include <afxtempl.h>
  33. #include "resource.h"
  34. #include "ptr.h"
  35. #include "FilePos.h"
  36. #include "Bookmarks.h"
  37. #include "ContentsDlg.h"
  38. #include "TextViewNG.h"
  39. #include "TextFile.h"
  40. #include "config.h"
  41. #include "XListBox.h"
  42. #include "InputBox.h"
  43. #if POCKETPC
  44. #include <afxext.h>
  45. #endif
  46. #ifdef _DEBUG
  47. #define new DEBUG_NEW
  48. #undef THIS_FILE
  49. static char THIS_FILE[] = __FILE__;
  50. #endif
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CContentsDlg dialog
  53. CContentsDlg::CContentsDlg(Bookmarks& toc,TextFile *tp,FilePos cur,
  54.    CWnd* pParent /*=NULL*/) :
  55.   CDialog(CContentsDlg::IDD, pParent), m_index(NO_ITEM), m_toc(toc), m_cur(cur),
  56.   m_tp(tp)
  57. {
  58.   //{{AFX_DATA_INIT(CContentsDlg)
  59.   // NOTE: the ClassWizard will add member initialization here
  60.   //}}AFX_DATA_INIT
  61. }
  62. void CContentsDlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64.   CDialog::DoDataExchange(pDX);
  65.   //{{AFX_DATA_MAP(CContentsDlg)
  66.   // NOTE: the ClassWizard will add DDX and DDV calls here
  67.   //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(CContentsDlg, CDialog)
  70. //{{AFX_MSG_MAP(CContentsDlg)
  71. ON_MESSAGE(XLM_CONTEXTMENU,OnXContextMenu)
  72. ON_MESSAGE(XLM_DBLCLK,OnXDblClick)
  73. ON_COMMAND(ID_PP_EDIT,OnEdit)
  74. ON_COMMAND(ID_PP_DELETE,OnDelete)
  75. ON_COMMAND(ID_L0,OnL0)
  76. ON_COMMAND(ID_L1,OnL1)
  77. ON_COMMAND(ID_L2,OnL2)
  78. ON_COMMAND(ID_L3,OnL3)
  79. ON_COMMAND(ID_L4,OnL4)
  80. ON_COMMAND(ID_L5,OnL5)
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CContentsDlg message handlers
  85. BOOL CContentsDlg::OnInitDialog() 
  86. {
  87.   CDialog::OnInitDialog();
  88. #if POCKETPC
  89.   ((CCeCommandBar *)m_pWndEmptyCB)->LoadToolBar(cIDR_CONTENTS);
  90. #endif
  91.   HWND      hXLB=::GetDlgItem(m_hWnd,IDC_CONTENTS);
  92.   RECT   r;
  93.   GetClientRect(&r);
  94. #if !defined(_WIN32_WCE)
  95.   RECT   rwin;
  96.   ::GetWindowRect(hXLB,&rwin);
  97.   r.bottom=r.top+(rwin.bottom-rwin.top);
  98. #endif
  99.   ::MoveWindow(hXLB,r.left,r.top,r.right-r.left,r.bottom-r.top,TRUE);
  100.   XLB_SetImageList(hXLB,CTVApp::ImageList()->GetSafeHandle(),true);
  101.   XLB_SetGTFunc(hXLB,GetText,this);
  102.   // insert items
  103.   bool     havesubdocs=m_tp->GetSubDocCount()>1;
  104.   int     curlevel=havesubdocs ? -1 : 0; // -1 means Document-level
  105.   int     curpos=m_toc.BFind(m_cur,Bookmarks::SPREVCH);
  106.   bool     docmatch=curpos<m_toc.GetSize() && m_toc.Ref(curpos).docid==m_cur.docid;
  107.   int     docid=-1;
  108.   if (!docmatch)
  109.     curpos=-1;
  110.   XLB_Handle  *handle=XLB_GetHandle(hXLB);
  111.   int   prev=0;
  112.   for (int i=0;i<m_toc.GetSize();++i) {
  113.     if (havesubdocs && docid<m_toc.Ref(i).docid) // create a new entry under root!
  114.       do {
  115. ++docid;
  116. curlevel=-1;
  117. XLB_AppendItem(handle,NULL,NULL,IM_CNODE,0,-docid-1);
  118.       } while (docid<m_toc.Ref(i).docid);
  119.     int       lev=m_toc.Level(i);
  120.     if (lev<0) {
  121.       if (prev>=0)
  122. ++curlevel;
  123.     } else
  124.       curlevel=lev;
  125.     prev=lev;
  126.     XLB_AppendItem(handle,NULL,NULL,
  127.       (m_toc.Flags(i)&Bookmarks::BMK)?IM_BMK:IM_CLEAF,
  128.       curlevel+1,i);
  129.     if (curpos==i)
  130.       XLB_SetSelection(hXLB,XLB_GetItemCount(hXLB)-1);
  131.   }
  132.   if (havesubdocs)
  133.     while (docid<m_tp->GetSubDocCount()-1) {
  134.       ++docid;
  135.       XLB_AppendItem(handle,NULL,NULL,IM_CNODE,0,-docid-1);
  136.     }
  137.   XLB_CollapseLevel(hXLB,0); // does an implicit UpdateState
  138.   XLB_EnsureVisible(hXLB,XLB_GetSelection(hXLB),true);
  139.   return TRUE;
  140. }
  141. CString  CContentsDlg::GetText(void *ugtdata,int num,int item,LONG data)
  142. {
  143.   CContentsDlg *dlg=(CContentsDlg*)ugtdata;
  144.   if (num==0)
  145.     return data>=0 ? 
  146.       dlg->m_toc.Text(data,dlg->m_tp) : 
  147.       dlg->m_tp->GetSubDocName(-data-1);
  148.   else if (num==1 && data>=0) {
  149.     CString   ret;
  150.     ret.Format(_T("%d%%"),
  151.       dlg->m_toc.Ref(data).para*100 /
  152. (dlg->m_tp->Length(dlg->m_toc.Ref(data).docid)+1)
  153.     );
  154.     return ret;
  155.   }
  156.   return CString();
  157. }
  158. void CContentsDlg::OnOK() {
  159.   HWND     hXLB=::GetDlgItem(m_hWnd,IDC_CONTENTS);
  160.   m_index=NO_ITEM;
  161.   int     sel=XLB_GetSelection(hXLB);
  162.   if (sel>=0)
  163.     m_index=XLB_GetData(hXLB,sel);
  164.   EndDialog(IDOK);
  165. }
  166. void CContentsDlg::OnCancel() {
  167.   m_toc.Rollback();
  168.   EndDialog(IDCANCEL);
  169. }
  170. LRESULT CContentsDlg::OnXContextMenu(WPARAM wParam,LPARAM lParam) {
  171.   HWND     hXLB=::GetDlgItem(m_hWnd,IDC_CONTENTS);
  172.   int     sel=XLB_GetSelection(hXLB);
  173.   if (sel<0)
  174.     return 0;
  175.   int     idx=XLB_GetData(hXLB,sel);
  176.   if (idx<0 || !(m_toc.Flags(idx)&Bookmarks::BMK))
  177.     return 0;
  178.   CPoint    pt;
  179.   pt.x=LOWORD(wParam);
  180.   pt.y=HIWORD(wParam);
  181.   ::ClientToScreen(hXLB,&pt);
  182.   CMenu menu;
  183.   menu.CreatePopupMenu();
  184.   menu.AppendMenu(MF_STRING,ID_PP_EDIT,_T("Edit"));
  185.   menu.AppendMenu(MF_STRING,ID_PP_DELETE,_T("Delete"));
  186.   menu.TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);
  187.   return 0;
  188. }
  189. LRESULT CContentsDlg::OnXDblClick(WPARAM wParam,LPARAM lParam) {
  190.   OnOK();
  191.   return 0;
  192. }
  193. void  CContentsDlg::OnEdit() {
  194.   HWND     hXLB=::GetDlgItem(m_hWnd,IDC_CONTENTS);
  195.   int     sel=XLB_GetSelection(hXLB);
  196.   if (sel<0)
  197.     return;
  198.   int     idx=XLB_GetData(hXLB,sel);
  199.   if (idx<0 || idx>=m_toc.GetSize() || !(m_toc.Flags(idx)&Bookmarks::BMK))
  200.     return;
  201.   CAddBmDialog   dlg(this);
  202.   dlg.m_text=m_toc.Text(idx,m_tp);
  203.   if (dlg.DoModal()==IDOK && dlg.m_text!=m_toc.Text(idx,m_tp)) {
  204.     m_toc.Change(idx,dlg.m_text);
  205.     XLB_SetItemText1(hXLB,sel,dlg.m_text);
  206.   }
  207. }
  208. void  CContentsDlg::OnDelete() {
  209.   HWND     hXLB=::GetDlgItem(m_hWnd,IDC_CONTENTS);
  210.   int     sel=XLB_GetSelection(hXLB);
  211.   if (sel<0)
  212.     return;
  213.   int     idx=XLB_GetData(hXLB,sel);
  214.   if (idx>=0 && idx<m_toc.GetSize() && m_toc.Flags(idx)&Bookmarks::BMK &&
  215.     MessageBox(_T("Delete this bookmark?"),_T("Confirm"),MB_YESNO)==IDYES)
  216.   {
  217.     m_toc.Remove(idx);
  218.     XLB_DeleteItem(hXLB,sel);
  219.   }
  220. }
  221. void  CContentsDlg::OnL1() {
  222.   XLB_CollapseLevel(::GetDlgItem(m_hWnd,IDC_CONTENTS),0);
  223. }
  224. void  CContentsDlg::OnL2() {
  225.   XLB_CollapseLevel(::GetDlgItem(m_hWnd,IDC_CONTENTS),1);
  226. }
  227. void  CContentsDlg::OnL3() {
  228.   XLB_CollapseLevel(::GetDlgItem(m_hWnd,IDC_CONTENTS),2);
  229. }
  230. void  CContentsDlg::OnL4() {
  231.   XLB_CollapseLevel(::GetDlgItem(m_hWnd,IDC_CONTENTS),3);
  232. }
  233. void  CContentsDlg::OnL5() {
  234.   XLB_CollapseLevel(::GetDlgItem(m_hWnd,IDC_CONTENTS),4);
  235. }
  236. void  CContentsDlg::OnL0() {
  237.   XLB_CollapseLevel(::GetDlgItem(m_hWnd,IDC_CONTENTS),-1);
  238. }