gecko-dev/cmd/winfe/navbar.cpp

317 строки
8.1 KiB
C++
Исходник Обычный вид История

1998-03-28 05:44:41 +03:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
// Embedded menu and close box for Aurora (Created by Dave Hyatt)
#include "stdafx.h"
#include "navbar.h"
#include "navcntr.h"
#include "navfram.h"
#include "usertlbr.h"
#include "dropmenu.h"
#include "rdfliner.h"
#include "htrdf.h"
BEGIN_MESSAGE_MAP(CNavMenuButton, CLinkToolbarButton)
ON_MESSAGE(NSDRAGMENUOPEN, OnDragMenuOpen)
END_MESSAGE_MAP()
CNavMenuButton::CNavMenuButton()
:m_HTView(NULL)
{
m_bShouldShowRMMenu = FALSE;
}
extern void DrawUpButton(HDC dc, CRect& rect);
LRESULT CNavMenuButton::OnDragMenuOpen(WPARAM wParam, LPARAM lParam)
{
// Set the focus to the tree view.
if (!m_HTView)
return 1;
CSelectorButton* pSelectorButton = (CSelectorButton*)HT_GetViewFEData(m_HTView);
if (!pSelectorButton)
return 1;
// Get the tree view and set focus to it.
CRDFContentView* pView = pSelectorButton->GetTreeView();
if (pView)
pView->SetFocus();
// Set our drop menu's user data.
m_pCachedDropMenu = (CDropMenu *)lParam; // Set our drop menu
m_MenuCommandMap.Clear();
HT_View theView = m_HTView;
HT_Resource node = NULL;
node = HT_GetNextSelection(theView, node);
BOOL bg = (node == NULL);
HT_Cursor theCursor = HT_NewContextualMenuCursor(theView, PR_FALSE, (PRBool)bg);
if (theCursor != NULL)
{
// We have a cursor. Attempt to iterate
HT_MenuCmd theCommand;
while (HT_NextContextMenuItem(theCursor, &theCommand))
{
char* menuName = HT_GetMenuCmdName(theCommand);
if (theCommand == HT_CMD_SEPARATOR)
m_pCachedDropMenu->AppendMenu(MF_SEPARATOR, 0, TRUE, NULL, NULL);
else
{
// Add the command to our command map
CRDFMenuCommand* rdfCommand = new CRDFMenuCommand(menuName, theCommand);
int index = m_MenuCommandMap.AddCommand(rdfCommand);
m_pCachedDropMenu->AppendMenu(MF_STRING, index+FIRST_HT_MENU_ID, menuName, TRUE, NULL, NULL, NULL);
}
}
HT_DeleteCursor(theCursor);
}
return 1;
}
BOOL CNavMenuButton::OnCommand(UINT wParam, LONG lParam)
{
BOOL bRtn = TRUE;
if (wParam >= FIRST_HT_MENU_ID && wParam <= LAST_HT_MENU_ID)
{
// A selection was made from the context menu.
// Use the menu map to get the HT command value
CRDFMenuCommand* theCommand = (CRDFMenuCommand*)(m_MenuCommandMap.GetCommand((int)wParam-FIRST_HT_MENU_ID));
if (theCommand)
{
HT_MenuCmd htCommand = theCommand->GetHTCommand();
HT_DoMenuCmd(HT_GetPane(m_HTView), htCommand);
}
}
return bRtn;
}
void CNavMenuButton::UpdateView(HT_View v)
{
m_HTView = v;
if (v == NULL)
SetText("No View Selected.");
else SetText(HT_GetNodeName(HT_TopNode(m_HTView)));
}
void CNavMenuButton::UpdateButtonText(CRect rect)
{
CString originalText = "No View Selected.";
if (m_HTView != NULL)
originalText = HT_GetNodeName(HT_TopNode(m_HTView));
int currCount = originalText.GetLength();
// Start off at the maximal string
CString strTxt = originalText;
CSize theSize = GetButtonSizeFromChars(originalText, currCount);
int horExtent = theSize.cx;
int width = horExtent;
int cutoff = rect.right - NAVBAR_CLOSEBOX - 9;
if (width > cutoff && cutoff > 0)
width = cutoff;
while (horExtent > width)
{
strTxt = originalText.Left(currCount-3) + "...";
theSize = GetButtonSizeFromChars(strTxt, currCount);
horExtent = theSize.cx;
currCount--;
}
SetTextWithoutResize(strTxt);
int height = GetRequiredButtonSize().cy;
MoveWindow(2, (rect.Height()-height)/2, width, height);
}
BEGIN_MESSAGE_MAP(CNavMenuBar, CWnd)
//{{AFX_MSG_MAP(CNavMenuBar)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP ( )
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CNavMenuBar::CNavMenuBar()
:m_pSelectorButton(NULL), m_pMenuButton(NULL), m_bHasFocus(FALSE)
{
}
CNavMenuBar::~CNavMenuBar()
{
delete m_pMenuButton;
}
void CNavMenuBar::OnPaint( )
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
if (m_bHasFocus)
m_pMenuButton->SetCustomColors(::GetSysColor(COLOR_CAPTIONTEXT), ::GetSysColor(COLOR_ACTIVECAPTION));
else m_pMenuButton->SetCustomColors(::GetSysColor(COLOR_INACTIVECAPTIONTEXT), ::GetSysColor(COLOR_INACTIVECAPTION));
CBrush faceBrush(::GetSysColor(m_bHasFocus? COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION));
dc.FillRect(&rect, &faceBrush);
// Draw the close box at the edge of the bar.
int left = rect.right - NAVBAR_CLOSEBOX - 5;
int right = left + NAVBAR_CLOSEBOX;
int top = rect.top + (rect.Height() - NAVBAR_CLOSEBOX)/2;
int bottom = top + NAVBAR_CLOSEBOX;
CRect edgeRect(left, top, right, bottom);
CBrush* closeBoxBrush = CBrush::FromHandle(sysInfo.m_hbrBtnFace);
dc.FillRect(&edgeRect, closeBoxBrush);
DrawUpButton(dc.m_hDC, edgeRect);
HPEN hPen = (HPEN)::CreatePen(PS_SOLID, 1, RGB(0,0,0));
HPEN hOldPen = (HPEN)(dc.SelectObject(hPen));
dc.MoveTo(edgeRect.left+4, edgeRect.top+4);
dc.LineTo(edgeRect.right-5, edgeRect.bottom-4);
dc.MoveTo(edgeRect.right-6, edgeRect.top+4);
dc.LineTo(edgeRect.left+3, edgeRect.bottom-4);
HPEN hShadowPen = ::CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
dc.SelectObject(hShadowPen);
dc.MoveTo(rect.left, rect.bottom-1);
dc.LineTo(rect.right, rect.bottom-1);
dc.SelectObject(hOldPen);
VERIFY(::DeleteObject(hPen));
VERIFY(::DeleteObject(hShadowPen));
}
int CNavMenuBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
m_pMenuButton = new CNavMenuButton();
BOOKMARKITEM dummy;
m_pMenuButton->Create(this, FALSE, CSize(32, 21), CSize(32, 21), "No view selected.",
"Click here to view the options menu.",
"Click on the button to view the options menu.", CSize(0,0), 100, 15, dummy,
NULL, TB_HAS_IMMEDIATE_MENU | TB_HAS_DRAGABLE_MENU);
return 0;
}
void CNavMenuBar::OnLButtonDown (UINT nFlags, CPoint point )
{
// Called when the user clicks on the menu bar. Start a drag or collapse the view.
CRect rect;
GetClientRect(&rect);
int left = rect.right - NAVBAR_CLOSEBOX - 5;
int right = left + NAVBAR_CLOSEBOX;
int top = rect.top + (rect.Height() - NAVBAR_CLOSEBOX)/2;
int bottom = top + NAVBAR_CLOSEBOX;
CRect edgeRect(left, top, right, bottom);
if (edgeRect.PtInRect(point))
{
// Collapse the view
if (m_pSelectorButton)
m_pSelectorButton->OnAction();
}
else
{
// Set the focus.
if (m_pSelectorButton)
{
CRDFContentView* pView = m_pSelectorButton->GetTreeView();
if (pView)
pView->SetFocus();
}
m_PointHit = point;
SetCapture();
}
}
void CNavMenuBar::OnMouseMove(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
{
CNSNavFrame* navFrameParent = (CNSNavFrame*)GetParentFrame();
if (abs(point.x - m_PointHit.x) > 3 ||
abs(point.y - m_PointHit.y) > 3)
{
ReleaseCapture();
// Start a drag
MapWindowPoints(navFrameParent, &point, 1);
navFrameParent->StartDrag(point);
}
}
}
void CNavMenuBar::OnLButtonUp(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
{
ReleaseCapture();
}
}
void CNavMenuBar::OnSize( UINT nType, int cx, int cy )
{
if (m_pMenuButton)
{
CRect rect;
GetClientRect(&rect);
m_pMenuButton->UpdateButtonText(rect);
}
}
void CNavMenuBar::UpdateView(CSelectorButton* pButton, HT_View view)
{
m_pSelectorButton = pButton;
if (m_pMenuButton)
{
CRect rect;
GetClientRect(&rect);
m_pMenuButton->UpdateView(view);
m_pMenuButton->UpdateButtonText(rect);
}
if (pButton && pButton->GetTreeView())
{
((CRDFOutliner*)(pButton->GetTreeView()->GetOutlinerParent()->GetOutliner()))->SetDockedMenuBar(this);
}
}