home *** CD-ROM | disk | FTP | other *** search
/ .net 2002 March / DotNetMagazine-Issue107-Coverdisc-NET107-02-03-PCMac.bin / pc / PC Software / picks / HTTrack / httrack-3.22-3.exe / {app} / src_win / WinHTTrack / splitter.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-18  |  13.7 KB  |  462 lines

  1. // splitter.cpp : implementation file
  2. //
  3.  
  4. #include "resource.h"
  5. #include "stdafx.h"
  6. #include "splitter.h"
  7. #include "DialogContainer.h"
  8. #include "cpp_lang.h"
  9.  
  10. #include "afxpriv.h"
  11.  
  12. // CDirTreeView
  13. #include "DirTreeView.h"
  14.  
  15. // Pointeur sur nous
  16. #include "WinHTTrack.h"
  17. extern CWinHTTrackApp* this_app;
  18.  
  19. #include "htsbase.h"
  20.  
  21. #ifdef _DEBUG
  22. #undef THIS_FILE
  23. static char BASED_CODE THIS_FILE[] = __FILE__;
  24. #endif
  25.  
  26. static UINT indicators[] =
  27. {
  28.     ID_SEPARATOR,           // status line indicator
  29.     ID_INDICATOR_CAPS,
  30.     ID_INDICATOR_NUM,
  31.     ID_INDICATOR_SCRL,
  32. };
  33.  
  34. // splitter frame
  35. extern CSplitterFrame* this_CSplitterFrame;
  36. // termine flag
  37. extern int termine;
  38.  
  39. /* DirTreeView */
  40. #include "DirTreeView.h"
  41. extern CDirTreeView* this_DirTreeView;
  42.  
  43.  
  44.  
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CSplitterFrame
  47.  
  48. // Create a splitter window which splits an output text view and an input view
  49. //                           |
  50. //    TEXT VIEW (CTextView)  | INPUT VIEW (CInputView)
  51. //                           |
  52.  
  53. IMPLEMENT_DYNCREATE(CSplitterFrame, CMDIChildWnd)
  54.  
  55. CSplitterFrame::CSplitterFrame()
  56. {
  57.   this_CSplitterFrame=this;
  58. }
  59.  
  60. CSplitterFrame::~CSplitterFrame()
  61. {
  62.   this_CSplitterFrame=NULL;
  63. }
  64.  
  65. #define wm_IcnRest (WM_USER + 16)
  66. BEGIN_MESSAGE_MAP(CSplitterFrame, CMDIChildWnd)
  67.     //{{AFX_MSG_MAP(CSplitterFrame)
  68.     ON_WM_MDIACTIVATE()
  69.     ON_WM_CLOSE()
  70.     //}}AFX_MSG_MAP
  71.   ON_MESSAGE( wm_IcnRest, IconRestore )
  72. END_MESSAGE_MAP()
  73. //
  74.  
  75. // Iconify
  76. void CSplitterFrame::Onhide() 
  77. {
  78.   if (!iconifie) {
  79.     //icnd.hWnd=this->GetMainWnd()->m_hWnd;
  80.     //icnd.hWnd=AfxGetMainWnd()->m_hWnd;
  81.     icnd.hWnd=this_CSplitterFrame->m_hWnd;
  82.     strcpybuff(icnd.szTip,"WinHTTrack Website Copier");
  83.     /* */
  84.     AfxGetMainWnd()->ShowWindow(SW_HIDE);
  85.     //ShowWindow(SW_SHOWMINNOACTIVE);
  86.     Shell_NotifyIcon(NIM_ADD,&icnd);
  87.     iconifie=true;
  88.   } else {
  89.     CheckRestore();
  90.   }
  91. }
  92.  
  93. LRESULT CSplitterFrame::IconRestore(WPARAM wParam,LPARAM lParam) {
  94.   if (iconifie) {
  95.     POINT point;
  96.     GetCursorPos(&point);
  97.     //ScreenToClient(&point);
  98.     int msg=(UINT) lParam;
  99.     if (msg==WM_RBUTTONDOWN) {  // menu      
  100.       CMenu menu;
  101.       VERIFY(menu.LoadMenu(IDR_POPUP));
  102.       CMenu* pPopup = menu.GetSubMenu(0);
  103.       ASSERT(pPopup != NULL); 
  104.       pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,
  105.         point.x, point.y, AfxGetMainWnd());
  106.     } else if (msg==WM_LBUTTONDBLCLK) {
  107.       CheckRestore();
  108.     }
  109.   }
  110.   return 0;
  111. }
  112.  
  113. void CSplitterFrame::IconChange(CString st) {
  114.   if (iconifie) {
  115.     strcpybuff(icnd.szTip,"");
  116.     strncatbuff(icnd.szTip,st,60);
  117.     Shell_NotifyIcon(NIM_MODIFY,&icnd);
  118.   }
  119. }
  120.  
  121. void CSplitterFrame::CheckRestore() {
  122.   if (iconifie) {
  123.     Shell_NotifyIcon(NIM_DELETE,&icnd);
  124.     //if (!termine) {
  125.     if (AfxGetMainWnd()) {
  126.       if (AfxGetMainWnd()->m_hWnd) {
  127.         AfxGetMainWnd()->ShowWindow(SW_RESTORE);
  128.         AfxGetMainWnd()->SetForegroundWindow();
  129.       }
  130.     }
  131.     iconifie=false;
  132.   }
  133. }
  134. // FIN Iconify
  135.  
  136.  
  137. BOOL CSplitterFrame::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle , const RECT& rect , CMDIFrameWnd* pParentWnd , CCreateContext* pContext ) {
  138.   /* recrÈer control tabs */
  139.   this_app->NewTabs();
  140.  
  141.   // Enlever bordure fenÍtre, et mettre en plein Ècran (pas de fenÍtre dans la fenÍtre!!)
  142.   dwStyle&=(~(WS_MINIMIZEBOX|WS_BORDER|WS_CAPTION|WS_OVERLAPPED|WS_OVERLAPPEDWINDOW));
  143.   dwStyle|=(WS_MAXIMIZE);
  144.   int r=CMDIChildWnd::Create(lpszClassName,lpszWindowName,dwStyle ,rect ,pParentWnd ,pContext );
  145.   if (r) {
  146.     // Mettre en maximisÈ
  147.     WINDOWPLACEMENT pl;
  148.     RECT rc;
  149.     rc.top=0;
  150.     rc.left=0;
  151.     rc.bottom=200;
  152.     rc.right=400;
  153.     pl.length=sizeof(pl);
  154.     pl.flags=WPF_RESTORETOMAXIMIZED;
  155.     pl.showCmd=SW_SHOWMAXIMIZED;
  156.     pl.rcNormalPosition=rc;
  157.     SetWindowPlacement(&pl);
  158.   }
  159.  
  160.   // iconification
  161.   iconifie=false;
  162.   icnd.cbSize=sizeof(NOTIFYICONDATA);
  163.   icnd.uID=0;              // euhh id=0
  164.   icnd.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
  165.   icnd.uCallbackMessage=wm_IcnRest;  // notre callback
  166.   icnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  167.  
  168.   // Retourner rÈsultat
  169.   return r;
  170. }
  171.  
  172. static TCHAR BASED_CODE szSection[] = _T("Settings");
  173. static TCHAR BASED_CODE szWindowPos[] = _T("SplitterPos");
  174. BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) 
  175. {
  176.   /*
  177.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  178.         | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  179.         !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  180.     {
  181.         TRACE0("Failed to create toolbar\n");
  182.         return -1;      // fail to create
  183.     }
  184.  
  185.     if (!m_wndStatusBar.Create(this) ||
  186.         !m_wndStatusBar.SetIndicators(indicators,
  187.           sizeof(indicators)/sizeof(UINT)))
  188.     {
  189.         TRACE0("Failed to create status bar\n");
  190.         return -1;      // fail to create
  191.     }
  192.     // TODO: Delete these three lines if you don't want the toolbar to
  193.     //  be dockable
  194.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  195.     EnableDocking(CBRS_ALIGN_ANY);
  196.     DockControlBar(&m_wndToolBar);
  197.   */
  198.   //
  199.  
  200.     // create a splitter with 1 row, 2 columns
  201.     if (!m_wndSplitter.CreateStatic(this, 1, 2))
  202.     {
  203.         TRACE0("Failed to CreateStaticSplitter\n");
  204.         return FALSE;
  205.     }
  206.  
  207.     // add the first splitter pane - the default view in column 0
  208.     /*if (!m_wndSplitter.CreateView(0, 0,
  209.         pContext->m_pNewViewClass, CSize(130, 50), pContext))
  210.     {
  211.         TRACE0("Failed to create first pane\n");
  212.         return FALSE;
  213.     }*/
  214.  
  215.   int PaneW=200,PaneH=50;
  216.   {
  217.     CString strBuffer = AfxGetApp()->GetProfileString(szSection, szWindowPos);
  218.     if (!strBuffer.IsEmpty()) {
  219.       int rx=0,ry=0;
  220.       if (sscanf(strBuffer,"%d,%d",&rx,&ry)==2) {
  221.         PaneW=rx;
  222.         PaneH=ry;
  223.       }
  224.     }
  225.   }
  226.  
  227.     // add the second splitter pane - an input view in column 1
  228.  
  229.     if (!m_wndSplitter.CreateView(0, 0,
  230.         RUNTIME_CLASS(CDirTreeView), CSize(PaneW, PaneH), pContext))
  231.     {
  232.         TRACE0("Failed to create second pane\n");
  233.         return FALSE;
  234.     }
  235.   if (this_DirTreeView)
  236.     this_DirTreeView->docType=".whtt";
  237.  
  238.     // add the second splitter pane - an input view in column 1
  239.     if (!m_wndSplitter.CreateView(0, 1,
  240.         RUNTIME_CLASS(CDialogContainer), CSize(0,0), pContext))
  241.     {
  242.         TRACE0("Failed to create second pane\n");
  243.         return FALSE;
  244.     }
  245.  
  246.   //m_wndSplitter.SetColumnInfo(1,800,400);
  247.  
  248.   // menu entries - done with MDIactivate
  249.   //SetMenuPrefs();
  250.  
  251.   // activate the input view
  252.     SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
  253.  
  254.     return TRUE;
  255. }
  256.  
  257. CSplitterWnd* CSplitterFrame::GetSplitter() {
  258.   return &m_wndSplitter;
  259. }
  260.  
  261. BOOL CSplitterFrame::SetNewView(int row, int col, CRuntimeClass* pViewClass) {
  262.   ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
  263.   
  264.   CView* pView = STATIC_DOWNCAST(CView, m_wndSplitter.GetPane(row, col));
  265.   CFrameWnd* pFrame = pView->GetParentFrame();
  266.   ASSERT(pFrame);
  267.   
  268.   // set up create context to preserve doc/frame etc.
  269.   CCreateContext cc;
  270.   memset(&cc, sizeof(cc), 0);
  271.   cc.m_pNewViewClass = pViewClass;
  272.   cc.m_pCurrentDoc = pView->GetDocument();
  273.   cc.m_pNewDocTemplate = cc.m_pCurrentDoc ?
  274.     cc.m_pCurrentDoc->GetDocTemplate() : NULL;
  275.   cc.m_pCurrentFrame = pFrame;
  276.   
  277.   m_wndSplitter.DeleteView(row, col);                // delete old view
  278.  
  279.   /* */
  280.   /* recrÈer control tabs */
  281.   this_app->NewTabs();
  282.   /* */
  283.  
  284.   VERIFY(m_wndSplitter.CreateView(row, col,          // create new one
  285.     pViewClass,
  286.     CSize(0,0),                      // will fix in RecalcLayout
  287.     &cc));
  288.   
  289.   m_wndSplitter.RecalcLayout();                      // recompute layout 
  290.   
  291.   // initialize the view
  292.   CWnd* pWnd = m_wndSplitter.GetPane(row, col);
  293.   if (pWnd)
  294.     pWnd->SendMessage(WM_INITIALUPDATE);
  295.  
  296.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document vide
  297.   GetActiveDocument()->SetTitle("New Project");
  298.   //SetDefaultTitle(GetActiveDocument());
  299.   return 1;
  300. }
  301.  
  302. BOOL CSplitterFrame::SetSaved() {
  303.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document sauvÈ
  304.   return 1;
  305. }
  306.  
  307. // Nommer le document
  308. BOOL CSplitterFrame::SetNewName(CString name) {
  309.   GetActiveDocument()->SetPathName(name);
  310.   int pos=max(name.ReverseFind('\\'),name.ReverseFind('/'))+1;
  311.   GetActiveDocument()->SetTitle(name.Mid(pos));
  312.   GetActiveDocument()->SetModifiedFlag();
  313.   return 1;
  314. }
  315.  
  316. void CSplitterFrame::EnableExtEntries(BOOL state) {
  317.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  318.   if (menu) {
  319.     int status;
  320.     if (!state)
  321.       status=MF_GRAYED; 
  322.     else
  323.       status=MF_ENABLED; 
  324.     menu->EnableMenuItem(2,status|MF_BYPOSITION);
  325.     menu->EnableMenuItem(3,status|MF_BYPOSITION);
  326.     
  327.     GetParent()->GetParent()->DrawMenuBar();
  328.   }
  329. }
  330.  
  331. void CSplitterFrame::EnableSaveEntries(BOOL state) {
  332.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  333.   if (menu) {
  334.     int status;
  335.     if (!state)
  336.       status=MF_GRAYED; 
  337.     else
  338.       status=MF_ENABLED; 
  339.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  340.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  341.     GetParent()->GetParent()->DrawMenuBar();
  342.   }
  343. }
  344.  
  345. void CSplitterFrame::SetMenuPrefs() {
  346.   if (LANG_T(-1)) {    // Patcher en franÁais
  347.     CMenu* menu = GetParent()->GetParent()->GetMenu();
  348.     if (menu) {
  349.       menu->ModifyMenu(0,MF_BYPOSITION,0,LANG(LANG_P1));
  350.       menu->ModifyMenu(1,MF_BYPOSITION,1,LANG(LANG_P2));
  351.       menu->ModifyMenu(2,MF_BYPOSITION,2,LANG(LANG_P3));
  352.       menu->ModifyMenu(3,MF_BYPOSITION,0,LANG(LANG_P4));
  353.       menu->ModifyMenu(4,MF_BYPOSITION,1,LANG(LANG_P5));
  354.       menu->ModifyMenu(5,MF_BYPOSITION,2,LANG(LANG_P6));
  355.       //
  356.       menu->ModifyMenu(ID_FILE_NEW ,MF_BYCOMMAND,ID_FILE_NEW,LANG_P18);
  357.       menu->ModifyMenu(ID_FILE_OPEN ,MF_BYCOMMAND,ID_FILE_OPEN,LANG_P19);
  358.       menu->ModifyMenu(ID_FILE_SAVE ,MF_BYCOMMAND,ID_FILE_SAVE,LANG_P20);
  359.       menu->ModifyMenu(ID_FILE_SAVE_AS ,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG_P21);
  360.       menu->ModifyMenu(ID_FILE_DELETE_PROJ ,MF_BYCOMMAND,ID_FILE_DELETE_PROJ,LANG_P22);
  361.       menu->ModifyMenu(ID_FILE_BROWSE_SIT ,MF_BYCOMMAND,ID_FILE_BROWSE_SIT,LANG_P23);
  362.       menu->ModifyMenu(ID_APP_EXIT,MF_BYCOMMAND,ID_APP_EXIT,LANG(LANG_P10));
  363.       menu->ModifyMenu(ID_LoadDefaultOptions,MF_BYCOMMAND,ID_LoadDefaultOptions,LANG(LANG_P11));
  364.       menu->ModifyMenu(ID_SaveProject,MF_BYCOMMAND,ID_SaveProject,LANG_SAVEPROJECT);
  365.       menu->ModifyMenu(ID_NewProjectImport,MF_BYCOMMAND,ID_NewProjectImport,LANG(LANG_P18));
  366.       menu->ModifyMenu(ID_SaveDefaultOptions,MF_BYCOMMAND,ID_SaveDefaultOptions,LANG(LANG_P12));
  367.       menu->ModifyMenu(ID_ClearDefaultOptions,MF_BYCOMMAND,ID_ClearDefaultOptions,LANG(LANG_P12b));
  368.       menu->ModifyMenu(ID_LOAD_OPTIONS,MF_BYCOMMAND,ID_FILE_OPEN,LANG(LANG_P13));
  369.       menu->ModifyMenu(ID_FILE_SAVE_OPTIONS_AS,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG(LANG_P14));
  370.       menu->ModifyMenu(IDC_langprefs,MF_BYCOMMAND,IDC_langprefs,LANG(LANG_P15));
  371.       menu->ModifyMenu(ID_HELP,MF_BYCOMMAND,ID_HELP,LANG(LANG_P16));
  372.       menu->ModifyMenu(IDC_ipabout,MF_BYCOMMAND,IDC_ipabout,LANG(LANG_P17));
  373.       //
  374.       /*
  375.       menu->ModifyMenu(0,MF_BYPOSITION,0,LANG(LANG_O1));
  376.       menu->ModifyMenu(1,MF_BYPOSITION,1,LANG(LANG_O2));
  377.       menu->ModifyMenu(2,MF_BYPOSITION,2,LANG(LANG_O3));
  378.       menu->ModifyMenu(3,MF_BYPOSITION,3,LANG(LANG_O4));
  379.       menu->ModifyMenu(4,MF_BYPOSITION,4,LANG(LANG_O5));
  380.       */
  381.       //
  382.       menu->ModifyMenu(ID_FILE_PAUSE,MF_BYCOMMAND,ID_FILE_PAUSE,LANG(LANG_O10));
  383.       menu->ModifyMenu(ID_FILE_EXIT,MF_BYCOMMAND,ID_FILE_EXIT,LANG(LANG_O11));
  384.       menu->ModifyMenu(ID_OPTIONS_MODIFY,MF_BYCOMMAND,ID_OPTIONS_MODIFY,LANG(LANG_O12));
  385.       menu->ModifyMenu(ID_LOG_VIEWLOG,MF_BYCOMMAND,ID_LOG_VIEWLOG,LANG(LANG_O13));
  386.       menu->ModifyMenu(ID_LOG_VIEWERRORLOG,MF_BYCOMMAND,ID_LOG_VIEWERRORLOG,LANG(LANG_O14));
  387.       menu->ModifyMenu(ID_LOG_VIEWTRANSFERS,MF_BYCOMMAND,ID_LOG_VIEWTRANSFERS,LANG(LANG_O14b));
  388.       menu->ModifyMenu(ID_WINDOW_HIDE,MF_BYCOMMAND,ID_WINDOW_HIDE,LANG(LANG_O15));
  389.       //menu->ModifyMenu(ID_VIEW_TOOLBAR,MF_BYCOMMAND,ID_VIEW_TOOLBAR,LANG(LANG_O18));
  390.       menu->ModifyMenu(ID_VIEW_STATUS_BAR,MF_BYCOMMAND,ID_VIEW_STATUS_BAR,LANG(LANG_O19));
  391.       menu->ModifyMenu(ID_WINDOW_SPLIT,MF_BYCOMMAND,ID_WINDOW_SPLIT,LANG(LANG_O20));      
  392.       menu->ModifyMenu(ID_ABOUT,MF_BYCOMMAND,ID_ABOUT,LANG(LANG_O16));
  393.       menu->ModifyMenu(ID_UPDATE,MF_BYCOMMAND,ID_UPDATE,LANG(LANG_O17));
  394.       //
  395.       GetParent()->GetParent()->DrawMenuBar();
  396.     }
  397.   }
  398. }
  399.  
  400.  
  401. /////////////////////////////////////////////////////////////////////////////
  402. //
  403.  
  404. IMPLEMENT_DYNAMIC(CViewExSplitWnd, CSplitterWnd)
  405.  
  406. CViewExSplitWnd::CViewExSplitWnd()
  407. {
  408. }
  409.  
  410. CViewExSplitWnd::~CViewExSplitWnd()
  411. {
  412. }
  413.  
  414. CWnd* CViewExSplitWnd::GetActivePane(int* pRow, int* pCol)
  415. {
  416.     ASSERT_VALID(this);
  417.  
  418.     // attempt to use active view of frame window
  419.     CWnd* pView = NULL;
  420.     CFrameWnd* pFrameWnd = GetParentFrame();
  421.     ASSERT_VALID(pFrameWnd);
  422.     pView = pFrameWnd->GetActiveView();
  423.  
  424.     // failing that, use the current focus
  425.     if (pView == NULL)
  426.         pView = GetFocus();
  427.  
  428.     return pView;
  429. }
  430.  
  431. //
  432.  
  433. /* Activation du MDI */
  434. void CSplitterFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd) 
  435. {
  436.     CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
  437.   SetMenuPrefs();
  438.   /* disable ext. entries by default */
  439.   this_CSplitterFrame->EnableExtEntries(FALSE);
  440.   this_CSplitterFrame->EnableSaveEntries(TRUE);
  441.  
  442.   if (!bActivate) {
  443.     int cxCur,cxMin;
  444.     TCHAR szBuffer[sizeof("-32767")*8];
  445.     m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  446.     sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  447.       AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  448.   }
  449. }
  450.  
  451.  
  452. void CSplitterFrame::OnClose() 
  453. {
  454.   int cxCur,cxMin;
  455.   TCHAR szBuffer[sizeof("-32767")*8];
  456.   m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  457.   sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  458.     AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  459.  
  460.     CMDIChildWnd::OnClose();
  461. }
  462.