|
|
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.