diff --git a/mozilla/cmd/winfe/mozilla.cpp b/mozilla/cmd/winfe/mozilla.cpp index b6ac9d50ff1..c21040bf7c3 100644 --- a/mozilla/cmd/winfe/mozilla.cpp +++ b/mozilla/cmd/winfe/mozilla.cpp @@ -1212,7 +1212,8 @@ BOOL CNetscapeApp::InitInstance() RDF_Init(&initStruct); // TODO: Can this fail? Want to bail if so. // Initialize the command map used by RDF configurable UI. - m_pBrowserCommandMap = CIsomorphicCommandMap::InitializeCommandMap(); + m_pBrowserCommandMap = CIsomorphicCommandMap::InitializeCommandMap("Browser Commands"); + m_pCommandToolbarIndices = CIsomorphicCommandMap::InitializeCommandMap("Command Toolbar Bitmap Indices"); // RDF INITIALIZATION ENDS HERE diff --git a/mozilla/cmd/winfe/mozilla.h b/mozilla/cmd/winfe/mozilla.h index 4053bbc85f8..2cbfcf539d2 100644 --- a/mozilla/cmd/winfe/mozilla.h +++ b/mozilla/cmd/winfe/mozilla.h @@ -276,6 +276,7 @@ public: BOOL m_bChildWindow; CIsomorphicCommandMap* m_pBrowserCommandMap; + CIsomorphicCommandMap* m_pCommandToolbarIndices; // Our very own run/pump/idle implementation. public: diff --git a/mozilla/cmd/winfe/rdfacc.h b/mozilla/cmd/winfe/rdfacc.h index 2ce0f8ec843..63520fbfe13 100644 --- a/mozilla/cmd/winfe/rdfacc.h +++ b/mozilla/cmd/winfe/rdfacc.h @@ -28,10 +28,9 @@ private: CMapStringToString mapFromFEToXP; public: - static CIsomorphicCommandMap* InitializeCommandMap(); + static CIsomorphicCommandMap* InitializeCommandMap(const CString& initType); // This function builds the command map and prepopulates it with the set of commands - // that can be responded to. TODO: Make INIT take an argument indicating which command set - // e.g., mail, browser, editor to use. For now, we're just worrying about the browser. + // that can be responded to. void AddItem(CString xpItem, UINT feResource); // Adds an isomorphic entry into the two maps. diff --git a/mozilla/cmd/winfe/usertlbr.cpp b/mozilla/cmd/winfe/usertlbr.cpp index 66c85a16ba0..e83854e093f 100644 --- a/mozilla/cmd/winfe/usertlbr.cpp +++ b/mozilla/cmd/winfe/usertlbr.cpp @@ -138,8 +138,6 @@ int CRDFToolbarButton::Create(CWnd *pParent, int nToolbarStyle, CSize noviceButt { m_bookmark = bookmark; - char *protocol = NULL; - BOOL bResult = CToolbarButton::Create(pParent, nToolbarStyle, noviceButtonSize, advancedButtonSize, pButtonText, pToolTipText, pStatusText, 0, 0, bitmapSize, TRUE, 0, nMaxTextChars, nMinTextChars, dwButtonStyle); @@ -147,20 +145,7 @@ int CRDFToolbarButton::Create(CWnd *pParent, int nToolbarStyle, CSize noviceButt if(bResult) { SetNode(pNode); - m_nIconType = DetermineIconType(pNode, UseLargeIcons()); - - m_nBitmapID = GetBitmapID(); - m_nBitmapIndex = GetBitmapIndex(); - - HDC hDC = ::GetDC(m_hWnd); - - HPALETTE hPalette = WFE_GetUIPalette(GetParentFrame()); - HBITMAP hBitmap = WFE_LookupLoadAndEnterBitmap(hDC, m_nBitmapID, TRUE, hPalette, - sysInfo.m_clrBtnFace, RGB(255, 0, 255)); - ::ReleaseDC(m_hWnd, hDC); - - SetBitmap(hBitmap, TRUE); - + UpdateIconInfo(); if (m_menu.m_hMenu == NULL || (m_menu.m_hMenu != NULL && !IsMenu(m_menu.m_hMenu))) m_menu.CreatePopupMenu(); } @@ -168,6 +153,27 @@ int CRDFToolbarButton::Create(CWnd *pParent, int nToolbarStyle, CSize noviceButt return bResult; } +void CRDFToolbarButton::UpdateIconInfo() +{ + m_nIconType = DetermineIconType(m_Node, UseLargeIcons()); + UINT oldBitmapID = m_nBitmapID; + m_nBitmapID = GetBitmapID(); + if (m_nBitmapID != oldBitmapID) + { + HDC hDC = ::GetDC(m_hWnd); + HPALETTE hPalette = WFE_GetUIPalette(GetParentFrame()); + HBITMAP hBitmap = WFE_LookupLoadAndEnterBitmap(hDC, m_nBitmapID, TRUE, hPalette, + sysInfo.m_clrBtnFace, RGB(255, 0, 255)); + ::ReleaseDC(m_hWnd, hDC); + SetBitmap(hBitmap, TRUE); + if (m_nBitmapID == IDB_PICTURES) + SetBitmapSize(CSize(23,21)); // Command buttons + else SetBitmapSize(CSize(23,17)); // Personal toolbar buttons + } + + m_nBitmapIndex = GetBitmapIndex(); +} + CSize CRDFToolbarButton::GetMinimalButtonSize(void) { CString szText(HT_GetNodeName(m_Node)); @@ -730,16 +736,31 @@ void CRDFToolbarButton::FillInMenu(HT_Resource theNode) UINT CRDFToolbarButton::GetBitmapID(void) { - if (m_nBitmapID != 0) - return m_nBitmapID; + if (m_Node) + { + if (strncmp(HT_GetNodeURL(m_Node), "command:", 8) == 0) + { + // We're an internal command. + return IDB_PICTURES; + } + else if (HT_IsContainer(m_Node)) + return IDB_BUTTON_FOLDER; + else return IDB_USERBTN; + } - if (m_Node && HT_IsContainer(m_Node)) - return IDB_BUTTON_FOLDER; - else return IDB_USERBTN; + return IDB_USERBTN; } UINT CRDFToolbarButton::GetBitmapIndex(void) { + if (m_Node) + { + if (strncmp(HT_GetNodeURL(m_Node), "command:", 8) == 0) + { + // We're an internal command. Access the command bitmap strip. + return theApp.m_pCommandToolbarIndices->GetFEResource(HT_GetNodeURL(m_Node)); + } + } return 0; } @@ -805,52 +826,59 @@ void CRDFToolbarButton::DrawLocalIcon(HDC hDC, int x, int y) void CRDFToolbarButton::DrawButtonBitmap(HDC hDC, CRect rcImg) { + BTN_STATE eState = m_eState; + + if(m_eState == eBUTTON_CHECKED) + // A checked button has same bitmap as the normal state with no mouse-over + eState = eNORMAL; + else if(m_eState == eBUTTON_UP && m_nChecked == 2) + // if we are in the mouse over mode, but indeterminate we want our bitmap to have a disabled look + eState = eDISABLED; + UpdateIconInfo(); if(m_hBmpImg != NULL) { // Create a scratch DC and select our bitmap into it. HDC pBmpDC = ::CreateCompatibleDC(hDC); HPALETTE hPalette = WFE_GetUIPalette(GetParentFrame()); - CBitmap BmpImg; - CPoint ptDst; - HINSTANCE hInst = AfxGetResourceHandle(); - - HBITMAP hBmpImg; - hBmpImg = m_hBmpImg; - HBITMAP hOldBmp = (HBITMAP)::SelectObject(pBmpDC, hBmpImg); HPALETTE hOldPal = ::SelectPalette(pBmpDC, WFE_GetUIPalette(NULL), TRUE); ::RealizePalette(pBmpDC); // Get the image dimensions CSize sizeImg; BITMAP bmp; - ::GetObject(hBmpImg, sizeof(bmp), &bmp); sizeImg.cx = bmp.bmWidth; sizeImg.cy = bmp.bmHeight; - // Center the image within the button - ptDst.x = (rcImg.Width() >= m_bitmapSize.cx) ? - rcImg.left + (((rcImg.Width() - m_bitmapSize.cx) + 1) / 2) : 0; - int realBitmapHeight; if(m_nIconType == LOCAL_FILE) { realBitmapHeight = 16; + m_bitmapSize.cx = 16; } else if (m_nIconType == ARBITRARY_URL) { realBitmapHeight = m_bitmapSize.cy; } - else realBitmapHeight = 17; // Height of personal toolbar button bitmaps. + else + { + if (m_nBitmapID == IDB_PICTURES) + realBitmapHeight = 21; // Height of command buttons + else realBitmapHeight = 17; // Height of personal toolbar button bitmaps. + } + // Center the image within the button + ptDst.x = (rcImg.Width() >= m_bitmapSize.cx) ? + rcImg.left + (((rcImg.Width() - m_bitmapSize.cx) + 1) / 2) : rcImg.left; + ptDst.y = (rcImg.Height() >= realBitmapHeight) ? - rcImg.top + (((rcImg.Height() - realBitmapHeight) + 1) / 2) : 0; + rcImg.top + (((rcImg.Height() - realBitmapHeight) + 1) / 2) : rcImg.top; // If we're in the checked state, shift the image one pixel if (m_eState == eBUTTON_CHECKED || (m_eState == eBUTTON_UP && m_nChecked == 1)) @@ -864,15 +892,6 @@ void CRDFToolbarButton::DrawButtonBitmap(HDC hDC, CRect rcImg) CPoint bitmapStart; - BTN_STATE eState = m_eState; - - if(m_eState == eBUTTON_CHECKED) - // A checked button has same bitmap as the normal state with no mouse-over - eState = eNORMAL; - else if(m_eState == eBUTTON_UP && m_nChecked == 2) - // if we are in the mouse over mode, but indeterminate we want our bitmap to have a disabled look - eState = eDISABLED; - if(m_bIsResourceID) bitmapStart = CPoint(m_nBitmapIndex * m_bitmapSize.cx, m_bEnabled ? realBitmapHeight * eState : realBitmapHeight); @@ -1043,7 +1062,9 @@ static void toolbarNotifyProcedure (HT_Notification ns, HT_Resource n, HT_Event else if (whatHappened == HT_EVENT_VIEW_DELETED) { CRDFToolbar* pToolbar = (CRDFToolbar*)HT_GetViewFEData(theView); + pToolbar->SetHTView(NULL); delete pToolbar; + HT_SetViewFEData(theView, NULL); } else if (whatHappened == HT_EVENT_NODE_VPROP_CHANGED && HT_TopNode(theView) == n) { @@ -1059,8 +1080,8 @@ static void toolbarNotifyProcedure (HT_Notification ns, HT_Resource n, HT_Event else { CRDFToolbar* pToolbar = (CRDFToolbar*)HT_GetViewFEData(theView); - - pToolbar->HandleEvent(ns, n, whatHappened); + if (pToolbar != NULL) + pToolbar->HandleEvent(ns, n, whatHappened); } } @@ -1144,8 +1165,6 @@ CRDFToolbar* CRDFToolbar::CreateUserToolbar(HT_View theView, CWnd* pParent) if (pToolbar->Create(pParent)) { - pToolbar->SetButtonsSameWidth(FALSE); - // Top node is already open. Fill it in. PRBool openState; HT_Resource topNode = HT_TopNode(theView); @@ -1160,11 +1179,7 @@ CRDFToolbar* CRDFToolbar::CreateUserToolbar(HT_View theView, CWnd* pParent) CRDFToolbar::~CRDFToolbar() { - if (m_ToolbarView) - { - HT_DeleteView(m_ToolbarView); - m_ToolbarView = NULL; - } + m_ToolbarView = NULL; } int CRDFToolbar::Create(CWnd *pParent) @@ -1180,6 +1195,19 @@ int CRDFToolbar::Create(CWnd *pParent) DragAcceptFiles(FALSE); + HT_Resource topNode = HT_TopNode(GetHTView()); + BOOL fixedSize = FALSE; + + void* data; + HT_GetNodeData(topNode, gNavCenter->toolbarButtonsFixedSize, HT_COLUMN_STRING, &data); + if (data) + { + CString answer((char*)data); + if (answer.GetLength() > 0 && (answer.GetAt(0) == 'y' || answer.GetAt(0) == 'Y')) + fixedSize = TRUE; + } + SetButtonsSameWidth(fixedSize); + return result; } @@ -1231,7 +1259,7 @@ void CRDFToolbar::AddHTButton(HT_Resource item) if (buttonSize.cy > m_nRowHeight) m_nRowHeight = buttonSize.cy; - + AddButtonAtIndex(pButton); // Have to put the button in the array, since the toolbar base class depends on it. } @@ -1296,7 +1324,9 @@ void CRDFToolbar::ComputeLayoutInfo(CRDFToolbarButton* pButton, int numChars, in } pButton->SetTextWithoutResize(strTxt); - pButton->SetButtonSize(pButton->GetButtonSizeFromChars(strTxt, numChars)); + + if (!m_bButtonsSameWidth) + pButton->SetButtonSize(pButton->GetButtonSizeFromChars(strTxt, numChars)); // Determine how much additional padding we'll use to fill out a row if this button doesn't fit. int rowUsage = usedSpace % rowWidth; @@ -1645,6 +1675,16 @@ CRDFToolbarHolder::CRDFToolbarHolder(int maxToolbars, CFrameWnd* pParentWindow) m_pCachedParentWindow = pParentWindow; } +CRDFToolbarHolder::~CRDFToolbarHolder() +{ + if (m_ToolbarPane) + { + HT_Pane oldPane = m_ToolbarPane; + m_ToolbarPane = NULL; + HT_DeletePane(oldPane); + } +} + void CRDFToolbarHolder::InitializeRDFData() { HT_Notification ns = new HT_NotificationStruct; @@ -1660,17 +1700,29 @@ void CRDFToolbarHolder::InitializeRDFData() } } -CIsomorphicCommandMap* CIsomorphicCommandMap::InitializeCommandMap() +CIsomorphicCommandMap* CIsomorphicCommandMap::InitializeCommandMap(const CString& initType) { CIsomorphicCommandMap* result = new CIsomorphicCommandMap(); - // Enter the builtin browser commands into the map. - result->AddItem("command:back", ID_NAVIGATE_BACK); - result->AddItem("command:forward", ID_NAVIGATE_FORWARD); - result->AddItem("command:reload", ID_NAVIGATE_RELOAD); - result->AddItem("command:print", ID_FILE_PRINT); - result->AddItem("command:stop", ID_NAVIGATE_INTERRUPT); - + if (initType == "Browser Commands") + { + // Enter the builtin browser commands into the map. + result->AddItem("command:back", ID_NAVIGATE_BACK); + result->AddItem("command:forward", ID_NAVIGATE_FORWARD); + result->AddItem("command:reload", ID_NAVIGATE_RELOAD); + result->AddItem("command:home", ID_GO_HOME); + result->AddItem("command:print", ID_FILE_PRINT); + result->AddItem("command:stop", ID_NAVIGATE_INTERRUPT); + } + else if (initType == "Command Toolbar Bitmap Indices") + { + result->AddItem("command:back", 0); + result->AddItem("command:forward", 1); + result->AddItem("command:reload", 2); + result->AddItem("command:home", 3); + result->AddItem("command:print", 7); + result->AddItem("command:stop", 8); + } return result; } diff --git a/mozilla/cmd/winfe/usertlbr.h b/mozilla/cmd/winfe/usertlbr.h index 6aa1537f620..9749920802a 100644 --- a/mozilla/cmd/winfe/usertlbr.h +++ b/mozilla/cmd/winfe/usertlbr.h @@ -91,7 +91,7 @@ public: virtual CSize GetMaximalButtonSize(); virtual BOOL UseLargeIcons() { return FALSE; } - virtual void UpdateIconInfo() { DetermineIconType(m_Node, UseLargeIcons()); } + virtual void UpdateIconInfo(); virtual void DrawButtonBitmap(HDC hDC, CRect rcImg); @@ -191,7 +191,7 @@ private: static int m_nMinToolbarButtonChars; static int m_nMaxToolbarButtonChars; - + public: CRDFToolbar(HT_View theView, int nMaxButtons, int nToolbarStyle, int nPicturesAndTextHeight, int nPicturesHeight, int nTextHeight); @@ -222,6 +222,7 @@ public: void FillInToolbar(); // Called to create and place the buttons on the toolbar HT_View GetHTView() { return m_ToolbarView; } // Returns the HT-View for this toolbar. + void SetHTView(HT_View v) { m_ToolbarView = v; } void SetDragFraction(int i) { m_iDragFraction = i; } int GetDragFraction() { return m_iDragFraction; } @@ -254,6 +255,8 @@ protected: public: CRDFToolbarHolder(int maxToolbars, CFrameWnd* pParent); + virtual ~CRDFToolbarHolder(); + HT_Pane GetHTPane() { return m_ToolbarPane; } void SetHTPane(HT_Pane p) { m_ToolbarPane = p; } CFrameWnd* GetCachedParentWindow() { return m_pCachedParentWindow; }