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

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: TVFrame.cpp,v 1.75.2.20 2004/11/01 11:15:10 mike Exp $
  29.  * 
  30.  */
  31. #include <afxcmn.h>
  32. #include <afxtempl.h>
  33. #include <afxext.h>
  34. #include "resource.h"
  35. #include "ptr.h"
  36. #include "Unicode.h"
  37. #include "TextViewNG.h"
  38. #include "TVFrame.h"
  39. #include "FileOpenDialog.h"
  40. #include "DummyView.h"
  41. #include "XMLParser.h"
  42. #include "Keys.h"
  43. #include "TextFile.h"
  44. #include "TextFormatter.h"
  45. #include "Rotate.h"
  46. #include "TView.h"
  47. #include "config.h"
  48. #include "DictSetupDlg.h"
  49. #include "Colors.h"
  50. #ifdef _DEBUG
  51. #define new DEBUG_NEW
  52. #undef THIS_FILE
  53. static char THIS_FILE[] = __FILE__;
  54. #endif
  55. #define MSG_OPEN_FILE (WM_APP+1)
  56. #define MAXTTSIZE     128
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CTVFrame
  59. IMPLEMENT_DYNAMIC(CTVFrame, CFrameWnd)
  60. BEGIN_MESSAGE_MAP(CTVFrame, CFrameWnd)
  61. //{{AFX_MSG_MAP(CTVFrame)
  62. ON_WM_CREATE()
  63. ON_WM_SETFOCUS()
  64. ON_COMMAND(ID_FULLSCREEN, OnFullscreen)
  65. ON_UPDATE_COMMAND_UI(ID_FULLSCREEN, OnUpdateFullscreen)
  66. ON_WM_ACTIVATE()
  67. ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateFileOpen)
  68. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  69. ON_COMMAND(ID_INIT, OnInitView)
  70. ON_WM_COPYDATA()
  71. ON_UPDATE_COMMAND_UI(ID_MAIN_TOOLS, OnUpdateMainTools)
  72. ON_UPDATE_COMMAND_UI(ID_MAIN_OPTIONS, OnUpdateMainOptions)
  73. ON_WM_INITMENUPOPUP()
  74. ON_WM_SIZE()
  75. ON_WM_MOVE()
  76. ON_WM_ERASEBKGND()
  77. //}}AFX_MSG_MAP
  78. ON_COMMAND_RANGE(RECENT_BASE,RECENT_BASE+RECENT_FILES,OnRecentFile)
  79. ON_UPDATE_COMMAND_UI_RANGE(RECENT_BASE,RECENT_BASE+RECENT_FILES,OnUpdateRecentFile)
  80. ON_MESSAGE(MSG_OPEN_FILE,OnOpenFile)
  81. #ifdef WM_POWERBROADCAST
  82. ON_MESSAGE(WM_POWERBROADCAST,OnPower)
  83. #endif
  84. END_MESSAGE_MAP()
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CTVFrame construction/destruction
  87. CTVFrame::CTVFrame() : m_fullscreen(false), m_in_fullscreen(0),
  88.   m_realview(false), m_tooltips(NULL), m_buttoncount(0),
  89.   m_okstate(false)
  90. {
  91.   m_wndView=new DummyView;
  92.   m_toptime.dwLowDateTime=m_toptime.dwHighDateTime=0;
  93.   m_tooltips=NULL;
  94.   m_buttoncount=0;
  95. #ifndef _WIN32_WCE
  96.   m_mainmenu=NULL;
  97.   memset(&m_wndpos,0,sizeof(m_wndpos));
  98. #endif
  99. }
  100. CTVFrame::~CTVFrame() {
  101.   for (int i=0;i<m_buttoncount;++i)
  102.     delete[] m_tooltips[i];
  103.   delete[] m_tooltips;
  104. #ifndef _WIN32_WCE
  105.   delete m_mainmenu;
  106.   if (m_wndpos.length)
  107.     AfxGetApp()->WriteProfileBinary(_T("Parameters"),_T("WindowPos"),(LPBYTE)&m_wndpos,sizeof(m_wndpos));
  108. #endif
  109. }
  110. int CTVFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  111. {
  112.   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  113.     return -1;
  114.   if (!m_wndView->Create(NULL, NULL, WS_VISIBLE, // XXX
  115.     CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
  116.   {
  117.     TRACE0("Failed to create view windown");
  118.     return -1;
  119.   }
  120. #if POCKETPC
  121.   m_wndCommandBar.m_bShowSharedNewButton = FALSE;
  122. #endif
  123. #ifdef _WIN32_WCE
  124.   if(!m_wndCommandBar.Create(this) ||
  125.      !m_wndCommandBar.LoadToolBar(cIDR_MAINFRAME)
  126.      || !m_wndCommandBar.AddAdornments())
  127. #else
  128.   if(!m_wndCommandBar.CreateEx(this,TBSTYLE_FLAT) ||
  129.      !m_wndCommandBar.LoadToolBar(IDR_MAINFRAME))
  130. #endif
  131.   {
  132.     TRACE0("Failed to create CommandBarn");
  133.     return -1;      // fail to create
  134.   }
  135. #ifdef _WIN32_WCE
  136.   // now add tooltips
  137.   CToolBarCtrl&   tbc=m_wndCommandBar.GetToolBarCtrl();
  138.   m_buttoncount=tbc.GetButtonCount();
  139.   m_tooltips=new TCHAR*[m_buttoncount];
  140.   TBBUTTON  tb;
  141.   TCHAR     buf[MAXTTSIZE];
  142.   for (int i=0;i<m_buttoncount;++i) {
  143.     tbc.GetButton(i,&tb);
  144.     int len=LoadString(AfxGetResourceHandle(),tb.idCommand,buf,MAXTTSIZE);
  145.     m_tooltips[i]=new TCHAR[len+1];
  146.     memcpy(m_tooltips[i],buf,len*sizeof(TCHAR));
  147.     m_tooltips[i][len]=_T('');
  148.   }
  149.   m_wndCommandBar.SendMessage(TB_SETTOOLTIPS,m_buttoncount,(LPARAM)m_tooltips);
  150.   m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | CBRS_TOOLTIPS);
  151. #endif
  152.   GetWindowRect(&m_normsize);
  153. #if BE300
  154.   HWND hSQWnd=::FindWindow(_T("SQ Tray"),NULL);
  155.   m_fSQTray= hSQWnd && GetWindowLong(hSQWnd,GWL_STYLE)&WS_VISIBLE;
  156. #endif
  157.   m_recent=CreatePopupMenu();
  158.   m_dicts=CreatePopupMenu();
  159.   CMenu *main=new CMenu;
  160.   if (main) {
  161.     main->LoadMenu(IDR_MAINFRAME);
  162.     CMenu   *sub=main->GetSubMenu(0);
  163.     if (sub)
  164.       sub->InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND|MF_POPUP,(UINT)m_recent,_T("Recent Files"));
  165.     sub=main->GetSubMenu(1);
  166.     if (sub) {
  167.       m_colors = sub->GetSubMenu(5)->Detach();
  168.       sub->InsertMenu(ID_MISCOPT,MF_BYCOMMAND|MF_POPUP,(UINT)m_dicts,_T("Dictionaries"));
  169.     }
  170. #ifdef _WIN32_WCE
  171.     SetMenu(main);
  172. #else
  173.     m_mainmenu=main;
  174.     SetMenu(NULL);
  175. #endif
  176.   }
  177.   return 0;
  178. }
  179. void  CTVFrame::InitWindowPos(int nCmdShow) {
  180. #ifdef _WIN32_WCE
  181.   ShowWindow(nCmdShow);
  182. #else
  183.   UINT   sz;
  184.   LPBYTE  buffer=NULL;
  185.   if (AfxGetApp()->GetProfileBinary(_T("Parameters"),_T("WindowPos"),&buffer,&sz) &&
  186.       sz==sizeof(m_wndpos) && buffer)
  187.   {
  188.     memcpy(&m_wndpos,buffer,sizeof(m_wndpos));
  189.     ::SetWindowPlacement(m_hWnd,&m_wndpos);
  190.   } else
  191.     ShowWindow(nCmdShow);
  192.   delete[] buffer;
  193. #endif
  194. }
  195. /////////////////////////////////////////////////////////////////////////////
  196. // CTVFrame diagnostics
  197. /////////////////////////////////////////////////////////////////////////////
  198. // CTVFrame message handlers
  199. void CTVFrame::OnSetFocus(CWnd* pOldWnd) {
  200.   // forward focus to the view window
  201.   if (m_wndView.get() && m_wndView->m_hWnd)
  202.     m_wndView->SetFocus();
  203. }
  204. BOOL CTVFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
  205. {
  206.   // let the view have first crack at the command
  207.   if (m_wndView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  208.     return TRUE;
  209.   // otherwise, do default handling
  210.   return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  211. }
  212. void CTVFrame::DoFullScreen(bool fs)
  213. {
  214.   if (m_in_fullscreen)
  215.     return;
  216.   m_in_fullscreen++;
  217.   if (fs) {
  218. #ifdef _WIN32_WCE
  219. #if POCKETPC
  220.     SHSipPreference(m_hWnd,SIP_FORCEDOWN);
  221.     SHFullScreen(m_hWnd,SHFS_HIDETASKBAR|SHFS_HIDESIPBUTTON);
  222. #else
  223.     HWND  hTaskBar=::FindWindow(_T("HHTaskBar"),NULL);
  224.     if (hTaskBar)
  225.       ::ShowWindow(hTaskBar,SW_HIDE);
  226. #if BE300
  227.     if (m_fSQTray) {
  228.       hTaskBar=::FindWindow(_T("SQ Tray"),NULL);
  229.       if (hTaskBar)
  230. ::ShowWindow(hTaskBar,SW_HIDE);
  231.     }
  232. #endif
  233. #endif
  234. #else
  235.     ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);
  236.     ModifyStyle(WS_CAPTION|WS_THICKFRAME,0,SWP_FRAMECHANGED);
  237. #endif
  238.     m_wndCommandBar.ShowWindow(SW_HIDE);
  239.     ::SetWindowPos(m_hWnd,NULL,0,0,
  240.       GetSystemMetrics(SM_CXSCREEN),
  241.       GetSystemMetrics(SM_CYSCREEN),
  242.       SWP_NOZORDER|SWP_NOACTIVATE);
  243.   } else {
  244. #ifdef _WIN32_WCE
  245. #if POCKETPC
  246.     SHFullScreen(m_hWnd,SHFS_SHOWTASKBAR|SHFS_SHOWSIPBUTTON);
  247. #else
  248.     HWND  hTaskBar=::FindWindow(_T("HHTaskBar"),NULL);
  249.     if (hTaskBar)
  250.       ::ShowWindow(hTaskBar,SW_SHOW);
  251. #if BE300
  252.     if (m_fSQTray) {
  253.       hTaskBar=::FindWindow(_T("SQ Tray"),NULL);
  254.       if (hTaskBar)
  255. ::ShowWindow(hTaskBar,SW_SHOW);
  256.     }
  257. #endif
  258. #endif
  259. #else
  260.     ::SetWindowPos(m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);
  261.     ModifyStyle(0,WS_CAPTION|WS_THICKFRAME,SWP_FRAMECHANGED);
  262. #endif
  263. #ifdef _WIN32_WCE
  264.     m_wndCommandBar.ShowWindow(SW_SHOWNA);
  265. #else
  266.     m_wndCommandBar.ShowWindow(SW_SHOW);
  267. #endif
  268. #if POCKETPC
  269.     RECT rcw;
  270.     SystemParametersInfo(SPI_GETWORKAREA,0,&rcw,0);
  271.     ::SetWindowPos(m_hWnd,NULL,
  272.       rcw.left,rcw.top,
  273.       rcw.right,rcw.bottom,
  274.       SWP_NOZORDER|SWP_NOACTIVATE);
  275. #else
  276.     ::SetWindowPos(m_hWnd,NULL,
  277.       m_normsize.left,m_normsize.top,
  278.       m_normsize.right-m_normsize.left,m_normsize.bottom-m_normsize.top,
  279.       SWP_NOZORDER|SWP_NOACTIVATE);
  280. #endif
  281.   }
  282.   m_in_fullscreen--;
  283. }
  284. void CTVFrame::OnFullscreen()
  285. {
  286.   m_fullscreen=!m_fullscreen;
  287.   DoFullScreen(m_fullscreen);
  288. }
  289. void CTVFrame::OnUpdateFullscreen(CCmdUI* pCmdUI)
  290. {
  291.   pCmdUI->SetCheck(m_fullscreen);
  292.   pCmdUI->Enable();
  293. }
  294. void CTVFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  295. {
  296.   CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
  297.   if (nState==WA_ACTIVE || nState==WA_CLICKACTIVE) {
  298.     DoFullScreen(m_fullscreen);
  299.     // this hack is needed for CE 2.x and HPC 2k because I am too lazy to find out
  300.     // what's wrong with focus setting
  301.     if (m_wndView.get() && m_wndView->m_hWnd) { // always focus view when we are activated
  302.       m_wndView->SetFocus();
  303.       Keys::SetWindow(m_wndView->m_hWnd);
  304.     }
  305.   } else { // we should really remove fullscreen when the frame is deactivated
  306.     // haha fun, this isnt called under emulation, so take care
  307.     DoFullScreen(false);
  308.     Keys::SetWindow(0);
  309.   }
  310. }
  311. bool  CTVFrame::TryOpenFile(CString& filename) {
  312.   if (filename.GetLength()>0) { // selected some file
  313.     TextFile *tf=TextFile::Open(filename);
  314.     if (tf==NULL && filename.GetLength()>2 && filename[0]==_T('"') &&
  315.   filename[filename.GetLength()-1]==_T('"'))
  316.     {
  317. filename=filename.Mid(1,filename.GetLength()-2);
  318. tf=TextFile::Open(filename);
  319.     }
  320.     if (tf) {
  321.       if (m_realview) {
  322. ((CTView *)m_wndView.get())->SetFile(kilo::auto_ptr<TextFile>(tf));
  323. SetWindowText(_T("HR: ")+FileName(filename));
  324.       }
  325.       return true;
  326.     } else {
  327.       CString   msg;
  328.       msg.Format(_T("Can't open file '%s'"),filename);
  329.       MessageBox(msg,_T("Error"),MB_ICONERROR|MB_OK);
  330.     }
  331.   }
  332.   return false;
  333. }
  334. void CTVFrame::OnUpdateFileOpen(CCmdUI* pCmdUI) {
  335.   pCmdUI->Enable();
  336. }
  337. void CTVFrame::OnFileOpen() {
  338.   CString   ipath=CTVApp::GetStr(_T("OpenPath"));
  339.   CString   sv=ipath;
  340.   CString   str=GetFileName(&ipath,this);
  341.   if (sv!=ipath)
  342.     CTVApp::SetStr(_T("OpenPath"),ipath);
  343.   TryOpenFile(str);
  344. }
  345. BOOL CTVFrame::OnCopyData(CWnd *pWnd,COPYDATASTRUCT *pcd) {
  346.   // filename is always unicode here
  347.   CString filename(Unicode::ToCS((const wchar_t *)pcd->lpData,pcd->cbData/sizeof(wchar_t)));
  348.   if (filename!=_T("-d")) // post a message to ourselves with a copy of filename
  349.     if (filename.GetLength()==0)
  350.       PostMessage(MSG_OPEN_FILE,0,0);
  351.     else
  352.       PostMessage(MSG_OPEN_FILE,0,(LPARAM)new CString(filename));
  353.   else
  354.     if (m_wndView.get())
  355.       ((CTView*)m_wndView.get())->SwitchToDict();
  356.   return TRUE;
  357. }
  358. void  CTVFrame::SaveWndPos() {
  359. #ifndef _WIN32_WCE
  360.   WINDOWPLACEMENT   pl;
  361.   memset(&pl,0,sizeof(pl));
  362.   pl.length=sizeof(pl);
  363.   ::GetWindowPlacement(m_hWnd,&pl);
  364.   if (pl.showCmd!=SW_MAXIMIZE && pl.showCmd!=SW_SHOWMAXIMIZED)
  365.     pl.showCmd=SW_SHOWNORMAL;
  366.   memcpy(&m_wndpos,&pl,sizeof(m_wndpos));
  367. #endif
  368. }
  369. bool  CTVFrame::InitView() {
  370.   bool dictmode=false;
  371.   // initialize xml parser
  372.   XMLParser::LoadStyles();
  373.   bool triednoquote=false;
  374.   CString filename(AfxGetApp()->m_lpCmdLine);
  375.   if (filename==_T("-d")) { // show dictionary
  376.     filename=_T("NUL");
  377.     dictmode=true;
  378.   }
  379.   if (filename.GetLength()==0) // no filename provided, try to fetch most recent
  380.     filename=Bookmarks::find_last_file();
  381.   TextFile *tf;
  382.   for (;;) { // repeat this until it works, or until the user chooses to exit
  383.     if (filename.GetLength()==0) { // still no luck, open fs browser
  384.       CString   ipath=CTVApp::GetStr(_T("OpenPath"));
  385.       CString   sv(ipath);
  386.       filename=GetFileName(&ipath,this);
  387.       if (sv!=ipath)
  388. CTVApp::SetStr(_T("OpenPath"),ipath);
  389.     } else if (filename.GetLength()>4 && filename.Right(4).CompareNoCase(_T(".zip"))==0) {
  390.       CString ipath=filename;
  391.       CString sv(ipath);
  392.       filename=GetFileName(&ipath,this);
  393.       if (sv!=ipath)
  394. CTVApp::SetStr(_T("OpenPath"),ipath);
  395.     }
  396.     if (filename.GetLength()==0) { // everything failed, barf at the user
  397.       MessageBox(_T("No file name provided on the command line, and no recent files found."),
  398. _T("Error"),MB_ICONERROR|MB_OK);
  399.       return false;
  400.     }
  401.     tf=TextFile::Open(filename);
  402.     if (tf==NULL) {
  403.       if (!triednoquote && filename.GetLength()>2 && filename[0]==_T('"') &&
  404.   filename[filename.GetLength()-1]==_T('"'))
  405.       {
  406. triednoquote=true;
  407. filename=filename.Mid(1,filename.GetLength()-2);
  408. continue;
  409.       }
  410.       CString   msg;
  411.       msg.Format(_T("Can't open file '%s'"),filename);
  412.       MessageBox(msg,_T("Error"),MB_ICONERROR|MB_OK);
  413.       filename.Empty();
  414.     } else
  415.       break;
  416.   }
  417.   // replace a dummy view with a real one
  418.   HWND   wnd=m_wndView->Detach();
  419.   CTView  *tv=new CTView;
  420.   tv->Attach(wnd);
  421.   tv->Init();
  422.   tv->SetFile(kilo::auto_ptr<TextFile>(tf));
  423.   if (dictmode) {
  424.     SetWindowText(_T("HR: Dictionary"));
  425.     if (!tv->SwitchToDict())
  426.       return false;
  427.   } else
  428.     SetWindowText(_T("HR: ")+FileName(filename));
  429.   m_wndView.reset(tv);
  430.   m_realview=true;
  431.   return true;
  432. }
  433. void CTVFrame::OnInitView() {
  434.   if (!InitView())
  435.     PostMessage(WM_COMMAND,ID_APP_EXIT);
  436. }
  437. void  CTVFrame::UpdateRecentFiles(CMenu *menu) {
  438.   FILETIME tm;
  439.   m_recentlist.RemoveAll();
  440.   Bookmarks::get_recent_files(m_recentlist,RECENT_FILES,tm);
  441.   if (tm.dwLowDateTime!=m_toptime.dwLowDateTime || tm.dwHighDateTime!=m_toptime.dwHighDateTime) {
  442.     m_toptime=tm;
  443.     while (menu->RemoveMenu(0,MF_BYPOSITION)) ;
  444.     for (int ii=0;ii<m_recentlist.GetSize();++ii)
  445.       menu->AppendMenu(MF_STRING,RECENT_BASE+ii,FileName(m_recentlist[ii]));
  446.     if (m_recentlist.GetSize()==0)
  447.       menu->AppendMenu(MF_STRING|MF_GRAYED,1,_T("No Files"));
  448.   }
  449. }
  450. void CTVFrame::UpdateColors(CMenu *menu) {
  451.   for (;;) {
  452.     MENUITEMINFO  ii;
  453.     memset(&ii,0,sizeof(ii));
  454.     ii.cbSize = sizeof(ii);
  455.     ii.fMask = MIIM_TYPE;
  456.     if (!menu->GetMenuItemInfo(2,&ii,TRUE))
  457.       break;
  458.     if (ii.fType & MFT_SEPARATOR)
  459.       break;
  460.     menu->DeleteMenu(2,MF_BYPOSITION);
  461.   }
  462.   AddColorProfileNames(menu,2);
  463. }
  464. void CTVFrame::UpdateDictionaries(CMenu *menu) {
  465.   CStringArray list;
  466.   int cur;
  467.   CDictSetupDlg::GetDictList(list,cur);
  468.   while (menu->RemoveMenu(0,MF_BYPOSITION)) ;
  469.   for (int ii=0;ii<list.GetSize();++ii) {
  470.     UINT    flags=MF_STRING|(ii==cur ? MF_CHECKED : 0);
  471.     if (!list[ii].IsEmpty() && list[ii][0]==_T(':'))
  472.       menu->AppendMenu(flags,DICT_BASE+ii,(const TCHAR *)list[ii]+1);
  473.     else
  474.       menu->AppendMenu(flags,DICT_BASE+ii,FileName(list[ii]));
  475.   }
  476.   if (list.GetSize()>0)
  477.     menu->AppendMenu(MF_SEPARATOR);
  478.   menu->AppendMenu(MF_STRING,ID_DICT_SETUP,_T("Configure..."));
  479. }
  480. void  CTVFrame::OnUpdateRecentFile(CCmdUI *pCmdUI) {
  481.   pCmdUI->Enable();
  482. }
  483. void  CTVFrame::OnRecentFile(UINT cmd) {
  484.   if (cmd-RECENT_BASE<(UINT)m_recentlist.GetSize()) {
  485.     TextFile *tf=TextFile::Open(m_recentlist[cmd-RECENT_BASE]);
  486.     if (tf) {
  487.       if (m_realview) {
  488. ((CTView *)m_wndView.get())->SetFile(kilo::auto_ptr<TextFile>(tf));
  489. SetWindowText(_T("HR: ")+FileName(m_recentlist[cmd-RECENT_BASE]));
  490.       }
  491.     } else {
  492.       CString   msg;
  493.       msg.Format(_T("Can't open file '%s'"),m_recentlist[cmd-RECENT_BASE]);
  494.       MessageBox(msg,_T("Error"),MB_ICONERROR|MB_OK);
  495.     }
  496.   }
  497. }
  498. static void GetTbPopupPoint(CToolBarCtrl& tb,UINT cmd,int& x,int& y,int& align) {
  499.   RECT rc;
  500.   tb.GetItemRect(tb.CommandToIndex(cmd),&rc);
  501.   tb.ClientToScreen(&rc);
  502.   x=rc.left;
  503. #if POCKETPC
  504.   y=rc.top;
  505.   align=TPM_BOTTOMALIGN;
  506. #else
  507.   y=rc.bottom;
  508.   align=TPM_TOPALIGN;
  509. #endif
  510. }
  511. void CTVFrame::OnUpdateMainTools(CCmdUI* pCmdUI) {
  512.   pCmdUI->Enable();
  513. }
  514. void CTVFrame::OnUpdateMainOptions(CCmdUI* pCmdUI) {
  515.   pCmdUI->Enable();
  516. }
  517. BOOL CTVFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) {
  518.   TBNOTIFY  *tn=(TBNOTIFY*)lParam;
  519.   if (tn->hdr.code==TBN_BEGINDRAG) {
  520.     // abuse the notification to show a popup menu
  521.     int     sm=-1;
  522.     switch (tn->iItem) {
  523.     case ID_MAIN_TOOLS:
  524.       sm=0;
  525.       break;
  526.     case ID_MAIN_OPTIONS:
  527.       sm=1;
  528.       break;
  529.     }
  530.     if (sm>=0) {
  531. #ifdef _WIN32_WCE
  532.       CMenu *menu=GetMenu();
  533. #else
  534.       CMenu *menu=m_mainmenu;
  535. #endif
  536.       if (menu) {
  537. CMenu   *sub=menu->GetSubMenu(sm);
  538. if (sub) {
  539.   int   x,y,align;
  540.   GetTbPopupPoint(m_wndCommandBar.GetToolBarCtrl(),tn->iItem,x,y,align);
  541.   sub->TrackPopupMenu(TPM_LEFTALIGN|align,x,y,this,NULL);
  542.   // unwedge the toolbar :)
  543.   m_wndCommandBar.GetToolBarCtrl().PressButton(tn->iItem,FALSE);
  544. }
  545.       }
  546.     }
  547.   }
  548.   return CFrameWnd::OnNotify(wParam, lParam, pResult);
  549. }
  550. void CTVFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) {
  551.   CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
  552.   if (pPopupMenu->m_hMenu==m_dicts)
  553.     UpdateDictionaries(pPopupMenu);
  554.   else if (pPopupMenu->m_hMenu==m_recent)
  555.     UpdateRecentFiles(pPopupMenu);
  556.   else if (pPopupMenu->m_hMenu==m_colors)
  557.     UpdateColors(pPopupMenu);
  558. }
  559. void CTVFrame::OnSize(UINT nType, int cx, int cy) {
  560.   CFrameWnd::OnSize(nType, cx, cy);
  561. #if POCKETPC
  562.   // in hires this old mfc gets the command bar size wrong
  563.   // so we force our own window size
  564.   if (!m_fullscreen) {
  565.     RECT rcW,rcCB;
  566.     GetWindowRect(&rcW);
  567.     m_wndCommandBar.GetWindowRect(&rcCB);
  568.     if (rcW.bottom > rcCB.top) {
  569.       rcW.bottom = rcCB.top;
  570.       ScreenToClient(&rcW);
  571.       m_wndView->MoveWindow(&rcW);
  572.     }
  573.   }
  574. #endif
  575. #ifndef _WIN32_WCE
  576.   if (cx>0 && cy>0 && !m_in_fullscreen)
  577.     GetWindowRect(&m_normsize);
  578. #endif
  579.   SaveWndPos();
  580. }
  581. void CTVFrame::OnMove(int x, int y) {
  582.   CFrameWnd::OnMove(x, y);
  583. #ifndef _WIN32_WCE
  584.   if (!m_in_fullscreen)
  585.     GetWindowRect(&m_normsize);
  586. #endif
  587.   SaveWndPos();
  588. }
  589. LRESULT  CTVFrame::OnOpenFile(WPARAM wParam,LPARAM lParam) {
  590.   CString *str=(CString*)lParam;
  591.   if (str) {
  592.     TryOpenFile(*str);
  593.     delete str;
  594.   }
  595.   return 0;
  596. }
  597. BOOL CTVFrame::OnEraseBkgnd(CDC* pDC) {
  598.   return FALSE; // frame has no background
  599. }
  600. /////////////////////////////////////////////////////
  601. // some hires support
  602. static int   getDPI() {
  603.   HDC hDC = CreateDC(_T("DISPLAY"),NULL,NULL,NULL);
  604.   int dpi = GetDeviceCaps(hDC,LOGPIXELSY);
  605.   DeleteDC(hDC);
  606.   return dpi;
  607. }
  608. UINT  getIDR_DIALOG() {
  609.   return getDPI() >= 120 ? IDR_DIALOG_HR : IDR_DIALOG;
  610. }
  611. UINT  getIDR_CONTENTS() {
  612.   return getDPI() >= 120 ? IDR_CONTENTS_HR : IDR_CONTENTS;
  613. }
  614. UINT  getIDR_MAINFRAME() {
  615.   return getDPI() >= 120 ? IDR_MAINFRAME_HR : IDR_MAINFRAME;
  616. }