|
|
1.1 ! root 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: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.