|
|
#include "pch.hxx"
#include "globals.h"
#include "resource.h"
#include "util.h"
#include "frame.h"
#include "mehost.h"
void SaveFocus(BOOL fActive, HWND *phwnd);
CMDIFrame::CMDIFrame() { m_hwnd = 0; m_hToolbar = 0; m_hStatusbar = 0; m_fToolbar = TRUE; m_fStatusbar = TRUE; m_cRef = 1; m_pInPlaceActiveObj=0; m_hwndFocus=0; }
CMDIFrame::~CMDIFrame() { SafeRelease(m_pInPlaceActiveObj); }
ULONG CMDIFrame::AddRef() { return ++m_cRef; }
ULONG CMDIFrame::Release() { if (--m_cRef==0) { delete this; return 0; } return m_cRef; }
HRESULT CMDIFrame::QueryInterface(REFIID riid, LPVOID *lplpObj) { if(!lplpObj) return E_INVALIDARG;
*lplpObj = NULL; // set to NULL, in case we fail.
if (IsEqualIID(riid, IID_IOleInPlaceFrame)) *lplpObj = (LPVOID)(LPOLEINPLACEFRAME)this; else if (IsEqualIID(riid, IID_IOleInPlaceUIWindow)) *lplpObj = (LPVOID)(IOleInPlaceUIWindow *)this; else return E_NOINTERFACE;
AddRef(); return NOERROR; }
HRESULT CMDIFrame::HrInit(LPSTR pszCmdLine) { static char szAppName[] = "Mepad"; HWND hwnd = NULL; WNDCLASSEX wndclass; HRESULT hr=E_FAIL;
wndclass.cbSize = sizeof(wndclass); wndclass.style = 0; wndclass.lpfnWndProc = CMDIFrame::ExtWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = g_hInst; wndclass.hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(idiApp)); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = MAKEINTRESOURCE(idmrMainMenu); wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon(g_hInst, MAKEINTRESOURCE(idiApp));
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT, szAppName, "Mepad", WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInst, (LPVOID)this);
if(!hwnd) goto error;
ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); hr = NOERROR;
if (pszCmdLine) hr = OpenDoc(pszCmdLine);
error: return hr; }
LRESULT CALLBACK CMDIFrame::ExtWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { CMDIFrame *pFrame=0;
if(msg==WM_CREATE) { pFrame=(CMDIFrame *)((LPCREATESTRUCT)lParam)->lpCreateParams; if(pFrame && pFrame->WMCreate(hwnd)) return 0; else return -1; }
pFrame = (CMDIFrame *)GetWindowLong(hwnd, GWL_USERDATA); if(pFrame) return pFrame->WndProc(hwnd, msg, wParam, lParam); else return DefWindowProc(hwnd, msg, wParam, lParam); }
enum { itbNew, itbOpen, itbSave, itbBack, itbForward, itbPrint, itbAbout, itbEditDoc, ctbToolbar };
#define cxButtonSep 8
#define dxToolbar 16
#define dxStatusbar 14
static TBBUTTON rgtbbutton[] = { { itbNew, idmNew, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, -1 }, { itbOpen, idmOpen, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, -1 }, { itbSave, idmSave, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, -1 }, { itbEditDoc, idmEditDocument, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_CHECK, {0}, 0L, -1 }
};
#define ctbbutton (sizeof(rgtbbutton) / sizeof(TBBUTTON))
BOOL CMDIFrame::WMCreate(HWND hwnd) { HMENU hMenu; MENUITEMINFO mii; hMenu = GetMenu(hwnd);
mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_SUBMENU; GetMenuItemInfo(hMenu, idmPopupWindow, FALSE, &mii);
SetWindowLong(hwnd, GWL_USERDATA, (LONG)this); AddRef(); m_hwnd=hwnd;
// toolbar
m_hToolbar = CreateToolbarEx( hwnd, WS_CLIPCHILDREN|WS_CHILD|TBSTYLE_TOOLTIPS|WS_VISIBLE|WS_BORDER, 0, ctbToolbar, g_hInst, idbToolbar, rgtbbutton, ctbbutton, dxToolbar, dxToolbar, dxToolbar, dxToolbar, sizeof(TBBUTTON));
m_hStatusbar = CreateWindowEx( 0, STATUSCLASSNAME, "", WS_CHILD|WS_VISIBLE|WS_BORDER|SBS_SIZEGRIP, 0,0,0,0, hwnd, 0, g_hInst, NULL);
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu = (HMENU)mii.hSubMenu; ccs.idFirstChild = 100;
m_hwndClient = CreateWindowEx( 0, "MDICLIENT", "", WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE, 0,0,0,0, hwnd, 0, g_hInst, (LPVOID)&ccs);
SendMessage(m_hwndClient, WM_MDISETMENU, (WPARAM)hMenu, (LPARAM)mii.hSubMenu);
SetToolbar(); SetStatusbar(); return TRUE; }
void CMDIFrame::WMDestroy() { PostQuitMessage(0); SetWindowLong(m_hwnd, GWL_USERDATA, 0); Release(); }
LRESULT CMDIFrame::WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { LONG lRet;
switch (iMsg) { case WM_CLOSE: HWND hwndKid;
hwndKid = ::GetWindow(m_hwndClient, GW_CHILD); while (hwndKid) { if (SendMessage(hwndKid, WM_CLOSE, 0, 0)) return 1; hwndKid = ::GetWindow(hwndKid, GW_HWNDNEXT); } break;
case WM_ACTIVATE: if (m_pInPlaceActiveObj) m_pInPlaceActiveObj->OnFrameWindowActivate(LOWORD(wParam) != WA_INACTIVE); break;
case WM_SIZE: WMSize(); return 0;
case WM_COMMAND: if(HrWMCommand(GET_WM_COMMAND_HWND(wParam, lParam), GET_WM_COMMAND_ID(wParam, lParam), GET_WM_COMMAND_CMD(wParam, lParam))==S_OK) return 0; break;
case WM_NOTIFY: WMNotify(wParam, (NMHDR*)lParam); return 0;
case WM_INITMENUPOPUP: return WMInitMenuPopup(hwnd, (HMENU)wParam, (UINT)LOWORD(lParam));
case WM_MENUSELECT: if(m_hStatusbar) HandleMenuSelect(m_hStatusbar, wParam, lParam); return 0;
case WM_DESTROY : WMDestroy(); return 0 ; } lRet = DefFrameProc(hwnd, m_hwndClient, iMsg, wParam, lParam);
if(iMsg==WM_ACTIVATE) { // post-process wm_activates to set focus back to
// controls
SaveFocus((BOOL)(LOWORD(wParam)), &m_hwndFocus); }
return lRet; }
void CMDIFrame::WMNotify(WPARAM wParam, NMHDR* pnmhdr) { switch(pnmhdr->code) { case TTN_NEEDTEXT: ProcessTooltips((LPTOOLTIPTEXT) pnmhdr); break;
} }
HRESULT CMDIFrame::HrWMCommand(HWND hwnd, int id, WORD wCmd) { HWND hwndChild; CMeHost *pHost;
HRESULT hr = S_FALSE;
switch(id) { case idmOptions: DoOptions(); break;
case idmToggleToolbar: m_fToolbar = !m_fToolbar; SetToolbar(); break;
case idmToggleStatusbar: m_fStatusbar = !m_fStatusbar; SetStatusbar(); break;
case idmPopupFile: break;
case idmTile: SendMessage(m_hwndClient, WM_MDITILE, MDITILE_HORIZONTAL, 0); break;
case idmCascade: SendMessage(m_hwndClient, WM_MDICASCADE, 0, 0); break;
case idmNew: pHost = new CMeHost(); if (pHost) { hr = pHost->HrInit(m_hwndClient, (IOleInPlaceFrame *)this); pHost->Release(); } if (FAILED(hr)) MessageBox(hwnd, "Failed", "Mepad", MB_OK); break;
case idmClose: PostMessage(m_hwnd, WM_CLOSE, 0, 0); return 0;
case idmPageSetup: case idmPopupGo : case idmPopupHelp: MessageBox(hwnd, "Not Implemented yet", "Mepad", MB_OK); hr = NOERROR; break;
case idmAbout: MessageBox(hwnd, "MimeEdit Pad\nA test container for MimeEdit.\n(c) brettm", "Mepad", MB_OK); break; }
// delegate the the active MDI child window
hwndChild = (HWND)SendMessage(m_hwndClient, WM_MDIGETACTIVE, 0, 0); if (hwndChild) { pHost = (CMeHost *)GetWindowLong(hwndChild, GWL_USERDATA); if (pHost) pHost->OnCommand(hwnd, id, wCmd); }
return hr;
}
void CMDIFrame::WMSize() { RECT rcToolbar, rc, rcStatus; int cy;
SetWindowPos(m_hToolbar, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER); SetWindowPos(m_hStatusbar, NULL, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOZORDER);
GetClientRect(m_hToolbar, &rcToolbar); GetClientRect(m_hToolbar, &rcStatus);
GetClientRect(m_hwnd, &rc); cy = rc.bottom - rcToolbar.bottom - rcStatus.bottom + 3; SetWindowPos(m_hwndClient, NULL, 0, rcToolbar.bottom, rc.right-rc.left, cy, SWP_NOACTIVATE|SWP_NOZORDER); }
void CMDIFrame::SetToolbar() { ShowWindow(m_hToolbar, m_fToolbar?SW_SHOW:SW_HIDE); WMSize(); InvalidateRect(m_hwnd, NULL, TRUE); }
void CMDIFrame::SetStatusbar() { ShowWindow(m_hStatusbar, m_fStatusbar?SW_SHOW:SW_HIDE); WMSize(); InvalidateRect(m_hwnd, NULL, TRUE); }
LRESULT CMDIFrame::WMInitMenuPopup(HWND hwnd, HMENU hmenuPopup, UINT uPos) { MENUITEMINFO mii; HMENU hmenuMain; UINT ustate; HWND hwndChild; CMeHost *pHost;
hmenuMain = GetMenu(hwnd); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_SUBMENU; GetMenuItemInfo(hmenuMain, uPos, TRUE, &mii);
// grey all the commands handled by the children, then can reenable them
EnableMenuItem(hmenuPopup, idmOpen, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmEditDocument, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmCut, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmCopy, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmPaste, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmUndo, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmRedo, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmSelectAll, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmPrint, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmSaveAs, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmFind, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmRot13, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmNoHeader, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmPreview, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmMiniHeader, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmFormatBar, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenuPopup, idmFmtPreview, MF_BYCOMMAND|MF_GRAYED);
switch (mii.wID) { case idmPopupView: ustate = (m_fToolbar?MF_CHECKED:MF_UNCHECKED) | MF_BYCOMMAND; CheckMenuItem(hmenuPopup, idmToggleToolbar, ustate); ustate = (m_fStatusbar?MF_CHECKED:MF_UNCHECKED) | MF_BYCOMMAND; CheckMenuItem(hmenuPopup, idmToggleStatusbar, ustate); break; }
// delegate to the active MDI child window
hwndChild = (HWND)SendMessage(m_hwndClient, WM_MDIGETACTIVE, 0, 0); if (hwndChild) { pHost = (CMeHost *)GetWindowLong(hwndChild, GWL_USERDATA); if (pHost) pHost->OnInitMenuPopup(hwnd, hmenuPopup, uPos); }
return 0; }
static HACCEL hAccel=0;
HRESULT CMDIFrame::TranslateAcclerator(LPMSG lpmsg) { HWND hwndChild;
if (!hAccel) hAccel = LoadAccelerators(g_hInst, MAKEINTRESOURCE(idacMeHost));
if(::TranslateAccelerator(m_hwnd, hAccel, lpmsg)) return S_OK;
hwndChild = (HWND)SendMessage(m_hwndClient, WM_MDIGETACTIVE, 0, 0); if(hwndChild && ::TranslateAccelerator(hwndChild, hAccel, lpmsg)) return S_OK;
if (TranslateMDISysAccel(m_hwndClient, lpmsg)) return S_OK;
if (m_pInPlaceActiveObj) return m_pInPlaceActiveObj->TranslateAccelerator(lpmsg);
return S_FALSE; }
// *** IOleInPlaceFrame methods ***
HRESULT CMDIFrame::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) {
return NOERROR; }
HRESULT CMDIFrame::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject) { return NOERROR; }
HRESULT CMDIFrame::RemoveMenus(HMENU hmenuShared) { return NOERROR; }
HRESULT CMDIFrame::SetStatusText(LPCOLESTR pszStatusText) { if (pszStatusText) { TCHAR rgch[MAX_PATH];
WideCharToMultiByte(CP_ACP, 0, pszStatusText, -1, rgch, MAX_PATH, NULL, NULL); SendMessage(m_hStatusbar, SB_SIMPLE, (WPARAM)TRUE, 0); SendMessage(m_hStatusbar, SB_SETTEXT, SBT_NOBORDERS|255, (LPARAM) rgch); } else { SendMessage(m_hStatusbar, SB_SIMPLE, (WPARAM)FALSE, 0); }
return S_OK; }
HRESULT CMDIFrame::EnableModeless(BOOL fEnable) { return E_NOTIMPL; }
HRESULT CMDIFrame::TranslateAccelerator(LPMSG lpMsg, WORD wID) { return E_NOTIMPL; }
HRESULT CMDIFrame::GetWindow(HWND *phwnd) { *phwnd = m_hwnd; return S_OK; }
HRESULT CMDIFrame::ContextSensitiveHelp(BOOL) { return E_NOTIMPL; }
// *** IOleInPlaceUIWindow methods ***
HRESULT CMDIFrame::GetBorder(LPRECT) { return E_NOTIMPL;
}
HRESULT CMDIFrame::RequestBorderSpace(LPCBORDERWIDTHS) { return E_NOTIMPL;
}
HRESULT CMDIFrame::SetBorderSpace(LPCBORDERWIDTHS) { return E_NOTIMPL;
}
HRESULT CMDIFrame::SetActiveObject(IOleInPlaceActiveObject *pInPlaceActiveObj, LPCOLESTR) { ReplaceInterface(m_pInPlaceActiveObj, pInPlaceActiveObj); return S_OK; }
void CMDIFrame::DoOptions() { DialogBoxParam(g_hInst, MAKEINTRESOURCE(iddOptions), m_hwnd, ExtOptDlgProc, (LPARAM)this); }
INT_PTR CALLBACK CMDIFrame::ExtOptDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { CMDIFrame *pFrame=(CMDIFrame *)GetWindowLong(hwnd, DWL_USER);
if (msg==WM_INITDIALOG) { pFrame = (CMDIFrame *)lParam; SetWindowLong(hwnd, DWL_USER, lParam); }
return pFrame?pFrame->OptDlgProc(hwnd, msg, wParam, lParam):FALSE; }
BOOL g_fHTML =TRUE, g_fIncludeMsg =TRUE, g_fQuote =FALSE, g_fSlideShow =FALSE, g_fAutoInline =TRUE, g_fSendImages =TRUE, g_fComposeFont =TRUE, g_fBlockQuote =TRUE, g_fAutoSig =FALSE, g_fSigHtml =FALSE; CHAR g_chQuote ='>'; CHAR g_szComposeFont[MAX_PATH] = "0,1,0,2,0.0.128,,Verdana"; LONG g_lHeaderType = 0; CHAR g_szSig[MAX_PATH] = "<your signature goes here>";
INT_PTR CALLBACK CMDIFrame::OptDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { char sz[5]; int i;
switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: g_fHTML = IsDlgButtonChecked(hwnd, idcHTML); g_fIncludeMsg = IsDlgButtonChecked(hwnd, idcInclude); g_fQuote = IsDlgButtonChecked(hwnd, idcQuote); g_fSlideShow = IsDlgButtonChecked(hwnd, idcSlide); g_fAutoInline = IsDlgButtonChecked(hwnd, idcAuto); g_fSendImages = IsDlgButtonChecked(hwnd, idcSendImages); g_fComposeFont = IsDlgButtonChecked(hwnd, idcComposeFont); g_fAutoSig = IsDlgButtonChecked(hwnd, idcSig); g_fSigHtml = IsDlgButtonChecked(hwnd, idcSigHtml);
GetWindowText(GetDlgItem(hwnd, ideComposeFont), g_szComposeFont, MAX_PATH); GetWindowText(GetDlgItem(hwnd, ideSig), g_szSig, MAX_PATH);
GetWindowText(GetDlgItem(hwnd, ideQuote), sz, 1); g_chQuote = sz[0];
g_fBlockQuote = IsDlgButtonChecked(hwnd, idcBlockQuote); for (i=0; i<4; i++) if (IsDlgButtonChecked(hwnd, idrbNone+i)) g_lHeaderType = i;
// fall tro'
case IDCANCEL: EndDialog(hwnd, LOWORD(wParam)); return TRUE; } break;
case WM_INITDIALOG: CheckDlgButton(hwnd, idcHTML, g_fHTML ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcInclude, g_fIncludeMsg ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcQuote, g_fQuote ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcSlide, g_fSlideShow ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcAuto, g_fAutoInline ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcSendImages, g_fSendImages ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcComposeFont, g_fComposeFont ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcSig, g_fAutoSig ? BST_CHECKED:BST_UNCHECKED); CheckDlgButton(hwnd, idcSigHtml, g_fSigHtml ? BST_CHECKED:BST_UNCHECKED);
sz[0] = g_chQuote; sz[1] = 0; SetWindowText(GetDlgItem(hwnd, ideQuote), sz); SetWindowText(GetDlgItem(hwnd, ideComposeFont), g_szComposeFont); SetWindowText(GetDlgItem(hwnd, ideSig), g_szSig);
CheckRadioButton(hwnd, idrbNone, idrbPrint, idrbNone+g_lHeaderType); CheckDlgButton(hwnd, idcBlockQuote, g_fBlockQuote ? BST_CHECKED:BST_UNCHECKED); break; }
return FALSE; }
void SaveFocus(BOOL fActive, HWND *phwnd) { if(fActive&&IsWindow(*phwnd)) SetFocus(*phwnd); else *phwnd=GetFocus(); }
HRESULT CMDIFrame::OpenDoc(LPSTR pszFileName) { CMeHost *pHost; HRESULT hr;
if (pszFileName && *pszFileName) { pHost = new CMeHost(); if (pHost) { hr = pHost->HrInit(m_hwndClient, (IOleInPlaceFrame *)this); if (!FAILED(hr)) hr = pHost->HrLoadFile(pszFileName); pHost->Release(); }
if (FAILED(hr)) MessageBox(m_hwnd, "Failed to open file", "Mepad", MB_OK); } return S_OK; }
|