home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / C++-7 / DISK8 / MFC / SAMPLES / OSERVER / MAINWND.CP$ / mainwnd
Encoding:
Text File  |  1992-03-17  |  6.1 KB  |  262 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and Microsoft
  7. // QuickHelp documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11.  
  12. #include "bibref.h"
  13. #include "mainwnd.h"
  14. #include "bibdoc.h"
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17.  
  18. BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
  19.     ON_WM_INITMENUPOPUP()
  20.     ON_WM_SIZE()
  21.     ON_WM_CREATE()
  22.     ON_WM_CLOSE()
  23.     ON_WM_DESTROY()
  24.     ON_WM_SETFOCUS()
  25.     ON_COMMAND(IDM_ABOUT, OnAbout)
  26.     ON_COMMAND(IDM_EXIT, OnClose)       // Exit just closes main window
  27.  
  28.     // only make sense if run non-embedded
  29.     ON_COMMAND(IDM_ITEM_ADD, OnItemAdd)
  30.     ON_COMMAND(IDM_ITEM_DELETE, OnItemDelete)
  31.     ON_COMMAND(IDM_ITEM_MODIFY, OnItemModify)
  32.  
  33.     // for embedded case
  34.     ON_COMMAND(IDM_UPDATE, OnUpdateClient)
  35. END_MESSAGE_MAP()
  36.  
  37. /////////////////////////////////////////////////////////////////////////////
  38. // Basic creation etc
  39.  
  40. CMainWnd::CMainWnd(BOOL bEmbedded)
  41. {
  42.     CRect rect;
  43.     char szRect[32];
  44.  
  45.     if (GetPrivateProfileString("Settings", "Last Position", "",
  46.         szRect, sizeof(szRect), ::app.strIniFile) == 0 ||
  47.         sscanf(szRect, "%d %d %d %d", &rect.left, &rect.top,
  48.             &rect.right, &rect.bottom) != 4)
  49.     {
  50.         // use initial value
  51.         rect = rectDefault;
  52.     }
  53.  
  54.     Create(NULL, "Bibliographic References",
  55.         WS_OVERLAPPEDWINDOW, rect, NULL,
  56.         bEmbedded ? "EmbeddedMenu" : "MainMenu");
  57. }
  58.  
  59. void CMainWnd::OnDestroy()
  60. {
  61.     CRect rect;
  62.     GetWindowRect(&rect);
  63.  
  64.     char szRect[32];
  65.     sprintf(szRect, "%d %d %d %d", 
  66.         rect.left, rect.top, rect.right, rect.bottom);
  67.     WritePrivateProfileString("Settings", "Last Position",
  68.         szRect, ::app.strIniFile);
  69.  
  70.     CFrameWnd::OnDestroy();
  71. }
  72.  
  73.  
  74. int CMainWnd::OnCreate(LPCREATESTRUCT)
  75. {
  76.     // Create the listbox child window
  77.     CRect       rect;
  78.     GetClientRect(&rect);
  79.  
  80.     if (!m_listbox.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL |
  81.       LBS_SORT | LBS_USETABSTOPS | LBS_NOINTEGRALHEIGHT,
  82.       rect, this, -1))
  83.     {
  84.         TRACE("Error creating listbox\n");
  85.         return -1;
  86.     }
  87.  
  88.     m_listbox.SetTabStops(40);      // 10 characters wide
  89.  
  90.     m_pDoc = new CBibDoc(&m_listbox, ::app.strIniFile, "Items");
  91.  
  92.     if (!m_pDoc->Load())
  93.     {
  94.         MessageBox("Load failed");
  95.         delete m_pDoc;
  96.         return -1;
  97.     }
  98.  
  99.     return 0;   // ok
  100. }
  101.  
  102. /////////////////////////////////////////////////////////////////////////////
  103. // Closing the window/server
  104.  
  105. void CMainWnd::OnClose()
  106. {
  107.     // prompt if open and something selected (assume dirty)
  108.     if (m_pDoc->IsOpen() && m_listbox.GetCurSel() != -1)
  109.     {
  110.         // optionally update the client on exit
  111.         char szPrompt[256];
  112.         wsprintf(szPrompt, "Update %s %s?", (LPCSTR)GetDocument()->m_strHost,
  113.             (LPCSTR)GetDocument()->m_strHostObj);
  114.  
  115.         // Note: should only prompt if document is dirty, instead of all
  116.         //  the time as here.
  117.         if (MessageBox(szPrompt, AfxGetAppName(), MB_YESNO) == IDYES)
  118.             OnUpdateClient();
  119.     }
  120.  
  121.     app.ShutDown();
  122. }
  123.  
  124. /////////////////////////////////////////////////////////////////////////////
  125.  
  126. void CMainWnd::OnSize(UINT, int, int)
  127. {
  128.     // Resize child
  129.     CRect       rect;
  130.     GetClientRect(&rect);
  131.     m_listbox.MoveWindow(rect);
  132. }
  133.  
  134. void CMainWnd::OnSetFocus(CWnd*)
  135. {
  136.     // forward the focus to our one and only child
  137.     m_listbox.SetFocus();
  138. }
  139.  
  140. void CMainWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT, BOOL bSysMenu)
  141. {
  142.     if (bSysMenu)
  143.         return;
  144.  
  145.     // if no item selected - disable delete and modify
  146.     UINT    mf = MF_GRAYED|MF_DISABLED;
  147.  
  148.     if (m_listbox.GetCurSel() != -1)
  149.         mf = MF_ENABLED;
  150.     pPopupMenu->EnableMenuItem(IDM_ITEM_DELETE, mf);
  151.     pPopupMenu->EnableMenuItem(IDM_ITEM_MODIFY, mf);
  152.     pPopupMenu->EnableMenuItem(IDM_UPDATE, mf);
  153. }
  154.  
  155. /////////////////////////////////////////////////////////////////////////////
  156. // File menu commands
  157.  
  158. void CMainWnd::OnAbout()
  159. {
  160.     CModalDialog about(IDM_ABOUT, this);
  161.     about.DoModal();
  162. }
  163.  
  164. /////////////////////////////////////////////////////////////////////////////
  165. // Item menu commands
  166.  
  167. class CPromptDlg : public CModalDialog
  168. {
  169.     CString&    m_rKey;
  170.     CString&    m_rValue;
  171. public:
  172.     CPromptDlg(CString& key, CString& value)
  173.         : CModalDialog(IDM_ITEM_ADD), m_rKey(key), m_rValue(value)
  174.         { }
  175.  
  176. protected:
  177.     CEdit&      Edit1()
  178.                     { return *((CEdit*) GetDlgItem(IDC_EDIT1)); } 
  179.     CEdit&      Edit2()
  180.                     { return *((CEdit*) GetDlgItem(IDC_EDIT2)); } 
  181.  
  182.     BOOL    OnInitDialog()
  183.     {
  184.         Edit1().SetWindowText(m_rKey);
  185.         Edit2().SetWindowText(m_rValue);
  186.         return TRUE;
  187.     }
  188.  
  189.     void OnOK()
  190.     {
  191.         Edit1().GetWindowText(m_rKey);
  192.         Edit2().GetWindowText(m_rValue);
  193.  
  194.         if (m_rKey == "" || m_rValue == "")
  195.         {
  196.             MessageBox("Both key and value must be specified");
  197.             return;
  198.         }
  199.         EndDialog(IDOK);
  200.     }
  201. };
  202.  
  203. void CMainWnd::OnItemAdd()
  204. {
  205.     CString key, value;
  206.     CPromptDlg  dlg(key, value);
  207.  
  208.     if (dlg.DoModal() != IDOK)
  209.         return;
  210.  
  211.     CString oldValue;
  212.     int nOldIndex = m_pDoc->GetItemValue(key, oldValue);
  213.     if (nOldIndex != -1)
  214.         m_pDoc->DeleteItem(key, nOldIndex);
  215.  
  216.     // add the item
  217.     m_pDoc->AddItem(key, value);
  218. }
  219.  
  220. void CMainWnd::OnItemDelete()
  221. {
  222.     int nIndex = m_listbox.GetCurSel();
  223.     CString key, value;
  224.     m_pDoc->GetItemKeyValue(nIndex, key, value);
  225.  
  226.     // delete the key (in listbox and in ini file)
  227.     m_pDoc->DeleteItem(key, nIndex);
  228. }
  229.  
  230. void CMainWnd::OnItemModify()
  231. {
  232.     int nIndex = m_listbox.GetCurSel();
  233.     CString key, value;
  234.     m_pDoc->GetItemKeyValue(nIndex, key, value);
  235.  
  236.     CString originalKey = key;
  237.     CPromptDlg  dlg(key, value);
  238.  
  239.     if (dlg.DoModal() != IDOK)
  240.         return;
  241.  
  242.     m_pDoc->DeleteItem(originalKey, nIndex);
  243.     m_pDoc->AddItem(key, value);
  244. }
  245.  
  246. /////////////////////////////////////////////////////////////////////////////
  247. // Update Client
  248.  
  249. void CMainWnd::OnUpdateClient()
  250. {
  251.     int nIndex = m_listbox.GetCurSel();
  252.     if (nIndex == -1)
  253.         return;
  254.  
  255.     CString key, value;
  256.     m_pDoc->GetItemKeyValue(nIndex, key, value);
  257.     if (!m_pDoc->UpdateClient(key))
  258.         MessageBox("Couldn't update client");
  259. }
  260.  
  261. /////////////////////////////////////////////////////////////////////////////
  262.