gecko-dev/cmd/macfe/gui/CGAIconPopup.cp

199 строки
6.2 KiB
C++

/* -*- 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.
*/
/*====================================================================================*/
#pragma mark INCLUDE FILES
/*====================================================================================*/
#include "CGAIconPopup.h"
#include <UGAColorRamp.h>
#include <UGraphicsUtilities.h>
/*====================================================================================*/
#pragma mark TYPEDEFS
/*====================================================================================*/
/*====================================================================================*/
#pragma mark CONSTANTS
/*====================================================================================*/
static const Int16 gsPopup_RightInset = 24; // Used to position the title rect
static const Int16 gsPopup_TitleInset = 8; // Apple specification
static const Int16 gsPopup_LabelOffset = 2; // Offset of label from popup
/*====================================================================================*/
#pragma mark INTERNAL CLASS DECLARATIONS
/*====================================================================================*/
/*====================================================================================*/
#pragma mark INTERNAL FUNCTION PROTOTYPES
/*====================================================================================*/
/*====================================================================================*/
#pragma mark CLASS IMPLEMENTATIONS
/*====================================================================================*/
#pragma mark -
/*======================================================================================
Return the icon resource ID for the current title, 0 if none. Returns the actual
resource ID that can be used to access the icon using ::GetCIcon().
======================================================================================*/
Int16 CGAIconPopup::GetTitleIconID(void) {
Int16 iconID;
::GetItemIcon(GetMacMenuH(), mValue, &iconID);
return (iconID ? iconID + 256 : 0);
}
/*======================================================================================
Refresh just the menu portion, not the title
======================================================================================*/
void CGAIconPopup::RefreshMenu(void) {
if ( !IsVisible() || (GetSuperView() == nil) ) return;
Rect refreshRect, superRevealed;
GetSuperView()->GetRevealedRect(superRevealed);
CalcLocalPopupFrameRect(refreshRect);
::InsetRect(&refreshRect, 0, 2); // Dont refresh shadows
refreshRect.right -= gsPopup_RightInset;
refreshRect.left += gsPopup_TitleInset;
LocalToPortPoint(topLeft(refreshRect));
LocalToPortPoint(botRight(refreshRect));
if ( ::SectRect(&refreshRect, &superRevealed, &refreshRect) ) {
InvalPortRect(&refreshRect);
}
}
/*======================================================================================
Get the title rect. Fix a bug in class that doesn't center text vertically.
======================================================================================*/
void CGAIconPopup::CalcTitleRect(Rect &outRect) {
StTextState theTextState;
const Int16 bevelWidth = 2;
UTextTraits::SetPortTextTraits(GetTextTraitsID());
FontInfo fInfo;
GetFontInfo(&fInfo);
Int16 textHeight = fInfo.ascent + fInfo.descent;
CalcLocalPopupFrameRect(outRect);
::InsetRect(&outRect, 0, bevelWidth);
outRect.right -= gsPopup_RightInset;
outRect.left += gsPopup_TitleInset;
outRect.top += ((UGraphicsUtilities::RectHeight(outRect) - textHeight) / 2) - 1;
outRect.bottom = outRect.top + textHeight;
if ( GetTitleIconID() ) {
outRect.left += cMenuIconWidth + cMenuIconTitleMargin;
}
}
/*======================================================================================
Get the label rect. Fix a bug in class that doesn't center text vertically.
======================================================================================*/
void CGAIconPopup::CalcLabelRect(Rect &outRect) {
if ( HasLabel() ) {
StTextState theTextState;
const Int16 bevelWidth = 2;
UTextTraits::SetPortTextTraits(GetTextTraitsID());
FontInfo fInfo;
GetFontInfo(&fInfo);
Int16 textHeight = fInfo.ascent + fInfo.descent;
CalcLocalFrameRect(outRect);
outRect.right = outRect.left + (mLabelWidth - gsPopup_LabelOffset);
::InsetRect(&outRect, 0, bevelWidth);
outRect.top += ((UGraphicsUtilities::RectHeight(outRect) - textHeight) / 2) - 1;
outRect.bottom = outRect.top + textHeight;
} else {
outRect = gEmptyRect;
}
}
/*======================================================================================
Draw the popup title
======================================================================================*/
void CGAIconPopup::DrawPopupTitle(void) {
LGAPopup::DrawPopupTitle();
Int16 iconID = GetTitleIconID();
if ( iconID != 0 ) {
CIconHandle theIconH = ::GetCIcon(iconID);
if ( theIconH != nil ) {
Rect iconRect;
LGAPopup::CalcTitleRect(iconRect);
iconRect.right = iconRect.left + cMenuIconWidth;
iconRect.top = iconRect.top + ((iconRect.bottom - iconRect.top - cMenuIconHeight) / 2);
iconRect.bottom = iconRect.top + cMenuIconHeight;
Int16 transform = ttNone;
if ( IsEnabled() ) {
if ( IsHilited() ) {
transform = ttSelected;
}
} else {
transform = ttDisabled;
}
::PlotCIconHandle(&iconRect, ttNone, transform, theIconH);
::DisposeCIcon(theIconH);
}
}
}