#include "stdafx.h"
#include "XDockPane.h"
#include "HtmlPane.h"
#include "ListPane.h"
#include "PdfPane.h"
#include "TreePane.h"
#include "ModalPane.h"
#include "SplitePane.h"
#include "DialogPane.h"
#include "FileView.h"
#include "ClassView.h"
#include "OutputWnd.h"
#include "FrameDlg.h"
#include "PhoneBook.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define IDC_HTML_PANE 100
#define IDC_TREE_PANE 101
#define IDC_LIST_PANE 102
#define IDC_PDF_PANE 103
#define IDC_MODAL_PANE 104
#define IDC_DIALOG_PANE 105
#define IDC_SPLITE_PANE 106
#define ID_OUTPUT_PANE 107
#define ID_CLASSVIEW_PANE 108
#define ID_FILEVIEW_PANE 109
#define ID_FRAME_DIALOG 110
#define ID_STATUSBAR_LINK 201
#define ID_PHONEBOOK 202
//used for dockablepane to reset it's pointer after close->destroy
const UINT WM_RESETMEMBER = ::RegisterWindowMessage(_T("WM_RESETMEMBER"));
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_STATUSBAR_LINK,OnStatusLink)
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnApplicationLook)
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnUpdateApplicationLook)
ON_REGISTERED_MESSAGE(AFX_WM_ON_PRESS_CLOSE_BUTTON,OnClosePane)
ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_CAPS,ID_INDICATOR_SCRL,OnUpdateStatus)
ON_UPDATE_COMMAND_UI(ID_STATUSBAR_LINK,OnEnableTrue)
ON_REGISTERED_MESSAGE(WM_RESETMEMBER,OnResetMember)
ON_COMMAND(ID_TREE_PANE,OnTreePane)
ON_COMMAND(ID_LIST_PANE,OnListPane)
ON_COMMAND(ID_PDF_PANE,OnPdfPane)
ON_COMMAND(ID_HTML_PANE,OnHtmlPane)
ON_COMMAND(ID_SPLITE_PANE,OnSplitePane)
ON_COMMAND(ID_MODAL_PANE,OnModalPane)
ON_COMMAND(ID_DIALOG_PANE,OnDialogPane)
ON_COMMAND_RANGE(IDC_FILEVIEW_PANE,IDC_OUTPUT_PANE,OnVisualStudioPane)
ON_COMMAND(ID_FRAME_DIALOG,OnFrameDlg)
ON_COMMAND(ID_PHONEBOOK,OnPhoneBook)
END_MESSAGE_MAP()
CMainFrame::CMainFrame()
{
// disables loading of docking layout from the registry.
// GetDockingManager()->DisableRestoreDockState(TRUE);
theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
m_htmlPane = NULL;
m_listPane = NULL;
m_pdfPane = NULL;
m_treePane = NULL;
m_modalPane = NULL ;
m_splitePane = NULL ;
m_dlgPane = NULL ;
m_outputPane = NULL ;
m_classPane = NULL ;
m_filePane = NULL ;
}
CMainFrame::~CMainFrame()
{
SAFE_DELETE(m_htmlPane);
SAFE_DELETE(m_listPane);
SAFE_DELETE(m_pdfPane);
SAFE_DELETE(m_treePane);
SAFE_DELETE(m_modalPane);
SAFE_DELETE(m_splitePane);
SAFE_DELETE(m_dlgPane);
SAFE_DELETE(m_outputPane);
SAFE_DELETE(m_classPane);
SAFE_DELETE(m_filePane);
}
void CMainFrame::OnDestroy()
{
m_regCmdMsg.RemoveAll();
CFrameWndEx::OnDestroy();
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
OnApplicationLook(theApp.m_nAppLook);
m_wndRibbonBar.Create(this);
InitializeRibbon();
if (!CreateStatusBar())
{
TRACE0("Failed to create status bar\n");
return -1;
}
// enable Visual Studio 2005 style docking window behavior
CDockingManager::SetDockingMode(DT_SMART);
// enable Visual Studio 2005 style docking window auto-hide behavior
EnableAutoHidePanes(CBRS_ALIGN_ANY);
CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);
m_wndRichView = GetActiveView();
RecalcLayout();
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWndEx::PreCreateWindow(cs) )
return FALSE;
cs.lpszName = _T("XDockPane");
SetTitle(_T("XDockPane"));
return TRUE;
}
void CMainFrame::InitializeRibbon()
{
BOOL bNameValid;
CString strTemp;
bNameValid = strTemp.LoadString(IDS_RIBBON_FILE);
ASSERT(bNameValid);
m_PanelImages.SetImageSize(CSize(16, 16));
m_PanelImages.Load(IDB_BUTTONS);
// Init main button:
m_MainButton.SetImage(IDB_MAIN);
m_MainButton.SetText(_T("\nf"));
m_MainButton.SetToolTipText(strTemp);
m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));
CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);
bNameValid = strTemp.LoadString(IDS_RIBBON_NEW);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));
bNameValid = strTemp.LoadString(IDS_RIBBON_OPEN);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN, strTemp, 1, 1));
bNameValid = strTemp.LoadString(IDS_RIBBON_SAVE);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE, strTemp, 2, 2));
bNameValid = strTemp.LoadString(IDS_RIBBON_SAVEAS);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE_AS, strTemp, 3, 3));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT);
ASSERT(bNameValid);
CMFCRibbonButton* pBtnPrint = new CMFCRibbonButton(ID_FILE_PRINT, strTemp, 6, 6);
pBtnPrint->SetKeys(_T("p"), _T("w"));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_LABEL);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonLabel(strTemp));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, strTemp, 7, 7, TRUE));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_PREVIEW);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_PREVIEW, strTemp, 8, 8, TRUE));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_SETUP);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_SETUP, strTemp, 11, 11, TRUE));
pMainPanel->Add(pBtnPrint);
pMainPanel->Add(new CMFCRibbonSeparator(TRUE));
bNameValid = strTemp.LoadString(IDS_RIBBON_CLOSE);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, strTemp, 9, 9));
bNameValid = strTemp.LoadString(IDS_RIBBON_RECENT_DOCS);
ASSERT(bNameValid);
pMainPanel->AddRecentFilesList(strTemp);
bNameValid = strTemp.LoadString(IDS_RIBBON_EXIT);
ASSERT(bNameValid);
pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, strTemp, 15));
bNameValid = strTemp.LoadString(IDS_RIBBON_HOME);
ASSERT(bNameValid);
CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);
// add visual studio precreated pane
CMFCRibbonPanel* pVSPanel = pCategoryHome->AddPanel(_T("VS Precreated Pane"));
pVSPanel->SetKeys(_T("VP"));
CMFCRibbonButton* pBtnFileViewPane = new CMFCRibbonButton(IDC_FILEVIEW_PANE,_T("File View"), -1, 2);
CMFCRibbonButton* pBtnClassViewPane = new CMFCRibbonButton(IDC_CLASSVIEW_PANE,_T("CLASS View"), -1, 3);
CMFCRibbonButton* pBtnOutputPane = new CMFCRibbonButton(IDC_OUTPUT_PANE,_T("Output View"), -1, 4);
pVSPanel->Add(pBtnFileViewPane);
pVSPanel->Add(pBtnClassViewPane);
pVSPanel->Add(pBtnOutputPane);
// add basic pane panel
CMFCRibbonPanel* pBasicPanel = pCategoryHome->AddPanel(_T("Basic Pane"));
pBasicPanel->SetKeys(_T("BP"));
CMFCRibbonButton* pBtnTreePane = new CMFCRibbonButton(ID_TREE_PANE,_T("Tree Pane"), -1, 5);
CMFCRibbonButton* pBtnListPane = new CMFCRibbonButton(ID_LIST_PANE,_T("LIST Pane"), -1, 6);
pBasicPanel->Add(pBtnTreePane);
pBasicPanel->Add(pBtnListPane);
//add Advanced pane panel
CMFCRibbonPanel* pAdvanedPanel = pCategoryHome->AddPanel(_T("Advanced Pane"));
pAdvanedPanel->SetKeys(_T("AP"));
CMFCRibbonButton* pBtnPdfPane = new CMFCRibbonButton(ID_PDF_PANE,_T("PDF Pane"),-1,7);
CMFCRibbonButton* pBtnHtmlPane = new CMFCRibbonButton(ID_HTML_PANE,_T("HTML Pane"),-1,8);
CMFCRibbonButton* pBtnModalPane = new CMFCRibbonButton(ID_MODAL_PANE,_T("Modal Loop Pane"),-1,9);
CMFCRibbonButton* pBtnDialogPane = new CMFCRibbonButton(ID_DIALOG_PANE,_T("Dialog Pane"),-1,10);
CMFCRibbonButton* pBtnSplitePane = new CMFCRibbonButton(ID_SPLITE_PANE,_T("Splite Pane"),-1,11);
pAdvanedPanel->Add(pBtnPdfPane);
pAdvanedPanel->Add(pBtnHtmlPane);
pAdvanedPanel->Add(pBtnSplitePane);
pAdvanedPanel->Add(pBtnModalPane);
pAdvanedPanel->Add(pBtnDialogPane);
//add Miscellaneous pane
CMFCRibbonPanel* pMiscellaneousPanel = pCategoryHome->AddPanel(_T("Miscellaneous"));
pMiscellaneousPanel->SetKeys(_T("MP"));
CMFCRibbonButton* pBtnFrameDlg = new CMFCRibbonButton(ID_FRAME_DIALOG,_T("Frame Dialog"),-1,10);
CMFCRibbonButton* pBtnPhoneDlg = new CMFCRibbonButton(ID_PHONEBOOK,_T("Phone Book"),-1,12);
pMiscellaneousPanel->Add(pBtnFrameDlg);
pMiscellaneousPanel->Add(pBtnPhoneDlg);
// Add elements to the right side of tabs:
bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE);
ASSERT(bNameValid);
CMFCRibbonButton* pVisualStyleButton = new CMFCRibbonButton(-1, strTemp, -1, -1);
pVisualStyleButton->SetMenu(IDR_THEME_MENU, FALSE /* No default command */, TRUE /* Right align */);
bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_TIP);
ASSERT(bNameValid);
pVisualStyleButton->SetToolTipText(strTemp);
bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_DESC);
ASSERT(bNameValid);
pVisualStyleButton->SetDescription(strTemp);
m_wndRibbonBar.AddToTabs(pVisualStyleButton);
// Add quick access toolbar commands:
CList<UINT, UINT> lstQATCmds;
lstQATCmds.AddTail(ID_FILE_NEW);
lstQATCmds.AddTail(ID_FILE_OPEN);
lstQATCmds.AddTail(ID_FILE_SAVE);
lstQATCmds.AddTail(ID_FILE_PRINT_DIRECT);
m_wndRibbonBar.SetQuickAccessCommands(lstQATCmds);
m_wndRibbonBar.AddToTabs(new CMFCRibbonButton(ID_APP_ABOUT, _T("\na"), m_PanelImages.ExtractIcon (0)));
}
BOOL CMainFrame::CreateStatusBar()
{
if (!m_wndStatusBar.Create(this))
{
TRACE0("Failed to create status bar\n");
return FALSE;
}
m_wndStatusBar.EnableToolTips(TRUE,FALSE);
m_wndStatusBar.AddElement(new CMFCRibbonLinkCtrl(ID_STATUSBAR_LINK, _T("Developed By Huzifa"), _T("http://www.CodeProject.com/members/huzifa30")), _T("Link to website"));
m_wndStatusBar.AddSeparator();
m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_INDICATOR_CAPS,_T("CAP"),0),_T("CAP"));
m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_INDICATOR_NUM,_T("NUM"),0),_T("NUM"));
m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_INDICATOR_SCRL,_T("SCRL"),0),_T("SCRL"));
m_wndStatusBar.AddSeparator();
return TRUE;
}
void CMainFrame::OnUpdateStatus(CCmdUI*ui)
{
UINT flag = 0x0001;
switch(ui->m_nID)
{
case ID_STATUSBAR_LINK:
ui->Enable();
break;
case ID_INDICATOR_CAPS:
ui->Enable(::GetKeyState(VK_CAPITAL) & flag );
break;
case ID_INDICATOR_SCRL:
ui->Enable(::GetKeyState(VK_SCROLL) & flag );
break;
case ID_INDICATOR_NUM:
ui->Enable(::GetKeyState(VK_NUMLOCK) & flag );
break;
}
}
void CMainFrame::OnApplicationLook(UINT id)
{
CWaitCursor wait;
theApp.m_nAppLook = id;
switch (theApp.m_nAppLook)
{
case ID_VIEW_APPLOOK_OFF_2007_BLUE:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
break;
case ID_VIEW_APPLOOK_OFF_2007_BLACK:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
break;
case ID_VIEW_APPLOOK_OFF_2007_SILVER:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
break;
case ID_VIEW_APPLOOK_OFF_2007_AQUA:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
break;
}
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
CDockingManager::SetDockingMode(DT_SMART);
RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
}
void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
}
void CMainFrame::OnHtmlPane()
{
if(m_htmlPane && m_htmlPane->GetSafeHwnd())
{
m_htmlPane->ShowPane(TRUE,FALSE,TRUE);
return ;
}
m_htmlPane = new CHtmlPane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
CString strTitle = _T("Html Pane");
if (!m_htmlPane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
IDC_HTML_PANE, style))
{
TRACE0("Failed to create html pane\n");
SAFE_DELETE(m_htmlPane);
return ;
}
m_htmlPane->EnableDocking(CBRS_ALIGN_ANY);
CDockablePane* pTabbedBar = NULL;
DockPane((CBasePane*)m_htmlPane,AFX_IDW_DOCKBAR_RIGHT);
if(m_treePane)
DockPaneLeftOf(m_htmlPane,m_treePane);
m_htmlPane->ShowPane(TRUE,FALSE,TRUE);
RecalcLayout();
}
void CMainFrame::OnPdfPane()
{
if(m_pdfPane && m_pdfPane->GetSafeHwnd())
{
m_pdfPane->ShowPane(TRUE,FALSE,TRUE);
return ;
}
m_pdfPane = new CPdfPane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
CString strTitle = _T("Pdf Pane");
if (!m_pdfPane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
IDC_PDF_PANE, style))
{
TRACE0("Failed to create Pdf pane\n");
SAFE_DELETE(m_pdfPane);
return ;
}
m_pdfPane->EnableDocking(CBRS_ALIGN_ANY);
DockPane((CBasePane*)m_pdfPane,AFX_IDW_DOCKBAR_RIGHT);
m_pdfPane->ShowPane(TRUE,FALSE,TRUE);
RecalcLayout();
RegCmdMsg(m_pdfPane);
AfxMessageBox(_T("Click Open from Frame window to Open a PDF File"));
}
void CMainFrame::OnListPane()
{
if(m_listPane && m_listPane->GetSafeHwnd())
{
m_listPane->ShowPane(TRUE,FALSE,TRUE);
return ;
}
m_listPane = new CListPane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
CString strTitle = _T("List Pane");
if (!m_listPane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
IDC_LIST_PANE, style))
{
TRACE0("Failed to create List pane\n");
SAFE_DELETE(m_listPane);
return ;
}
m_listPane->EnableDocking(CBRS_ALIGN_ANY);
DockPane((CBasePane*)m_listPane,AFX_IDW_DOCKBAR_LEFT);
CDockablePane* pTabbedBar = NULL;
// make list pane attach to treepane if it's already created
if(m_treePane && m_treePane->GetSafeHwnd())
m_listPane->AttachToTabWnd(m_treePane, DM_SHOW, TRUE, &pTabbedBar);
m_listPane->ShowPane(TRUE,FALSE,TRUE);
RecalcLayout();
}
void CMainFrame::OnTreePane()
{
if(m_treePane && m_treePane->GetSafeHwnd())
{
m_treePane->ShowPane(TRUE,FALSE,TRUE);
return ;
}
m_treePane = new CTreePane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
CString strTitle = _T("Tree Pane");
if (!m_treePane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
IDC_TREE_PANE, style))
{
TRACE0("Failed to create Tree pane\n");
SAFE_DELETE(m_treePane);
return ;
}
m_treePane->EnableDocking(CBRS_ALIGN_ANY);
DockPane((CBasePane*)m_treePane,AFX_IDW_DOCKBAR_LEFT);
// make treepane attach to list pane if it's already created
CDockablePane* pTabbedBar = NULL;
if(m_listPane && m_listPane->GetSafeHwnd())
m_treePane->AttachToTabWnd(m_listPane, DM_SHOW, TRUE, &pTabbedBar);
else
m_treePane->ShowPane(TRUE,FALSE,TRUE);
m_treePane->SetMinSize(CSize(200,100));
RecalcLayout();
}
void CMainFrame::OnModalPane()
{
m_modalPane = new CModalPane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI ;
UINT styleEx = WS_EX_TOPMOST|WS_EX_DLGMODALFRAME|WS_EX_WINDOWEDGE;
CString strTitle = _T("Modal loop Pane");
CRect rect(0, 0, 200, 400);
if (!m_modalPane->CreateEx(styleEx,strTitle, this,rect, TRUE,
IDC_MODAL_PANE, style))
{
TRACE0("Failed to create Modal loop pane\n");
SAFE_DELETE(m_modalPane);
return ;
}
m_modalPane->EnableDocking(CBRS_NOALIGN);
//make m_modalPane initialy floating
ClientToScreen(&rect);
m_modalPane->FloatPane(rect);
((CModalPane*)m_modalPane)->DoModal();
}
LRESULT CMainFrame::OnResetMember(WPARAM wp,LPARAM)
{
int id = (int)wp;
switch(id)
{
case IDC_TREE_PANE:
SAFE_DELETE(m_treePane);
break;
case IDC_LIST_PANE :
SAFE_DELETE(m_listPane);
break;
case IDC_PDF_PANE :
SAFE_DELETE(m_pdfPane);
break;
case IDC_HTML_PANE :
SAFE_DELETE(m_htmlPane);
break;
case IDC_MODAL_PANE:
SAFE_DELETE(m_modalPane);
break;
case IDC_DIALOG_PANE :
SAFE_DELETE(m_dlgPane);
break;
case IDC_SPLITE_PANE:
SAFE_DELETE(m_splitePane);
break;
case ID_OUTPUT_PANE :
SAFE_DELETE(m_outputPane);
break;
case ID_CLASSVIEW_PANE:
SAFE_DELETE(m_classPane);
break;
case ID_FILEVIEW_PANE :
SAFE_DELETE(m_filePane);
break;
default :
return (LRESULT)FALSE;//id warent found
}
return (LRESULT)TRUE;
}
LRESULT CMainFrame::OnClosePane(WPARAM,LPARAM lp)
{
CBasePane* pane = (CBasePane*)lp;
if(pane && pane->GetSafeHwnd())
{
int id = pane->GetDlgCtrlID();
pane->ShowPane(FALSE, FALSE, FALSE);//hide pane
RemovePaneFromDockManager(pane,TRUE,TRUE,TRUE,NULL);//remove from manager
UnregCmdMsg(pane);//unregister pane from command routing list
pane->PostMessage(WM_CLOSE);//close and destroy
PostMessage(WM_RESETMEMBER,id,0);//reset our member to null
AdjustDockingLayout();//recalc docking layout
return (LRESULT)TRUE;//prevent close , we already close it
}
return FALSE;
}
void CMainFrame::RegCmdMsg(CBasePane* pane)
{
m_regCmdMsg.AddTail(pane);
}
void CMainFrame::UnregCmdMsg(CBasePane* pane)
{
POSITION pos = m_regCmdMsg.GetHeadPosition();
CBasePane* i ;
while (pos)
{
i = m_regCmdMsg.GetAt(pos);
if(i == pane )
{
m_regCmdMsg.RemoveAt(pos);
return ;
}
m_regCmdMsg.GetNext(pos);
}
}
BOOL CMainFrame::OnCmdMsg(UINT id,int code , void *pExtra,AFX_CMDHANDLERINFO* pHandler)
{
//route cmd first to registered dockable pane
POSITION pos = m_regCmdMsg.GetHeadPosition();
while (pos)
{
CBasePane* pane = m_regCmdMsg.GetAt(pos);
if(pane && pane->GetSafeHwnd() && pane->IsVisible()
&& pane->OnCmdMsg(id,code,pExtra,pHandler))
return TRUE;
m_regCmdMsg.GetNext(pos);
}
return CFrameWndEx::OnCmdMsg(id,code,pExtra,pHandler);
}
void CMainFrame::OnDialogPane()
{
if(m_dlgPane && m_dlgPane->GetSafeHwnd())
{
m_dlgPane->ShowPane(TRUE,FALSE,TRUE);
return ;
}
m_dlgPane = new CDialogPane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
CString strTitle = _T("Child Dialog Pane");
if (!m_dlgPane->Create(strTitle, this, CRect(0, 0, 300, 400), TRUE,
IDC_DIALOG_PANE, style,AFX_CBRS_OUTLOOK_TABS))
{
TRACE0("Failed to create dialog pane\n");
SAFE_DELETE(m_dlgPane);
return ;
}
m_dlgPane->EnableDocking(CBRS_ALIGN_ANY);
DockPane((CBasePane*)m_dlgPane,AFX_IDW_DOCKBAR_RIGHT);
CDockablePane* pTabbedBar = NULL;
if(m_splitePane && m_splitePane->GetSafeHwnd())
m_dlgPane->AttachToTabWnd(m_splitePane, DM_SHOW, TRUE, &pTabbedBar);
else
m_dlgPane->ShowPane(TRUE,FALSE,TRUE);
RecalcLayout();
}
void CMainFrame::OnSplitePane()
{
if(m_splitePane && m_splitePane->GetSafeHwnd())
{
m_splitePane->ShowPane(TRUE,FALSE,TRUE);
return ;
}
m_splitePane = new CSplitePane;
UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI|AFX_CBRS_AUTO_ROLLUP;
CString strTitle = _T("Splite Pane");
if (!m_splitePane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
IDC_SPLITE_PANE, style,AFX_CBRS_OUTLOOK_TABS))
{
TRACE0("Failed to create Splite pane\n");
SAFE_DELETE(m_splitePane);
return ;
}
m_splitePane->EnableDocking(CBRS_ALIGN_ANY);
DockPane((CBasePane*)m_splitePane,AFX_IDW_DOCKBAR_RIGHT);
CDockablePane* pTabbedBar = NULL;
if(m_dlgPane && m_dlgPane->GetSafeHwnd())
m_splitePane->AttachToTabWnd(m_dlgPane, DM_SHOW, TRUE, &pTabbedBar);
else
m_splitePane->ShowPane(TRUE,FALSE,TRUE);
m_splitePane->ToggleAutoHide();
RecalcLayout();
}
void CMainFrame::OnVisualStudioPane(UINT cmd)
{
CString name;
DWORD style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
| WS_CLIPCHILDREN | CBRS_FLOAT_MULTI;
HICON hIcon;
switch(cmd)
{
case IDC_FILEVIEW_PANE:
{
if(m_filePane && m_filePane->GetSafeHwnd())
{
m_filePane->ShowPane(TRUE,FALSE,TRUE);
break ;
}
m_filePane = new CFileView;
name.LoadString(IDS_FILE_VIEW);
if (!m_filePane->Create(name, this, CRect(0, 0, 200, 200), TRUE, ID_FILEVIEW_PANE, style|CBRS_LEFT|CBRS_SIZE_FIXED))
{
TRACE0("Failed to create File View window\n");
ASSERT(FALSE); // failed to create
}
m_filePane->EnableDocking(CBRS_ALIGN_ANY);
HICON hIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_FILE_VIEW_HC), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
m_filePane->SetIcon(hIcon, FALSE);
if(m_classPane && m_classPane->GetSafeHwnd())
{
if(!m_filePane->DockToWindow(m_classPane,CBRS_ALIGN_BOTTOM))
DockPane(m_filePane,AFX_IDW_DOCKBAR_LEFT);
}
else
DockPane(m_filePane,AFX_IDW_DOCKBAR_LEFT);
break;
}
case IDC_CLASSVIEW_PANE:
{
if(m_classPane && m_classPane->GetSafeHwnd())
{
m_classPane->ShowPane(TRUE,FALSE,TRUE);
break ;
}
m_classPane = new CClassView;
name.LoadString(IDS_CLASS_VIEW);
if (!m_classPane->Create(name, this, CRect(0, 0, 200, 200), TRUE, ID_CLASSVIEW_PANE,style|CBRS_LEFT))
{
TRACE0("Failed to create Class View window\n");
ASSERT(FALSE); // failed to create
}
m_classPane->EnableDocking(CBRS_ALIGN_ANY);
hIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_CLASS_VIEW_HC), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
m_classPane->SetIcon(hIcon, FALSE);
m_classPane->EnableAutohideAll();
if(m_filePane && m_filePane->GetSafeHwnd())
{
if(!m_classPane->DockToWindow(m_filePane,CBRS_ALIGN_TOP))
DockPane(m_classPane,AFX_IDW_DOCKBAR_LEFT);
}
else
DockPane(m_classPane,AFX_IDW_DOCKBAR_LEFT);
break;
}
case IDC_OUTPUT_PANE:
{
if(m_outputPane && m_outputPane->GetSafeHwnd())
{
m_outputPane->ShowPane(TRUE,FALSE,TRUE);
break;
}
m_outputPane = new COutputWnd;
name.LoadString(IDS_OUTPUT_WND);
if (!m_outputPane->Create(name, this, CRect(0, 0, 100, 100), TRUE,ID_OUTPUT_PANE ,style | CBRS_BOTTOM))
{
TRACE0("Failed to create Output window\n");
ASSERT(FALSE); // failed to create
}
m_outputPane->EnableDocking(CBRS_ALIGN_ANY);
hIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_OUTPUT_WND_HC), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
m_outputPane->SetIcon(hIcon, FALSE);
DockPane(m_outputPane,AFX_IDW_DOCKBAR_BOTTOM);
m_outputPane->RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
break;
}
}//switch
RecalcLayout();
}
void CMainFrame::OnStatusLink()
{
CMFCRibbonLinkCtrl* pLink = (CMFCRibbonLinkCtrl*) m_wndStatusBar.FindByID(ID_STATUSBAR_LINK);
if (pLink)
pLink->OpenLink();//open link in status bar
}
void CMainFrame::OnFrameDlg()
{
CFrameDlg dlg(this);
dlg.DoModal();
}
void CMainFrame::OnPhoneBook()
{
PhoneBook dlg(this);
dlg.DoModal();
}