root/src/tests/kits/interface/menu/menuworld/BitmapMenuItem.cpp
//--------------------------------------------------------------------
//      
//      BitmapMenuItem.cpp
//
//      Written by: Owen Smith
//      
//--------------------------------------------------------------------

/*
        Copyright 1999, Be Incorporated.   All Rights Reserved.
        This file may be used under the terms of the Be Sample Code License.
*/

#include "BitmapMenuItem.h"
#include "constants.h"

//====================================================================
//      BitmapMenuItem Implementation



//--------------------------------------------------------------------
//      BitmapMenuItem constructors, destructors, operators

BitmapMenuItem::BitmapMenuItem(const char* name, const BBitmap& bitmap,
        BMessage* message, char shortcut, uint32 modifiers)
        : BMenuItem(name, message, shortcut, modifiers),
        m_bitmap(bitmap.Bounds(), bitmap.ColorSpace())
{
        // Sadly, operator= for bitmaps is not yet implemented.
        // Half of m_bitmap's initialization is above; now we copy
        // the bits.
        m_bitmap.SetBits(bitmap.Bits(), bitmap.BitsLength(),
                0, bitmap.ColorSpace());
}



//--------------------------------------------------------------------
//      BitmapMenuItem constructors, destructors, operators

void BitmapMenuItem::Draw(void)
{
        BMenu* menu = Menu();
        if (menu) {
                BRect itemFrame = Frame();
                BRect bitmapFrame = itemFrame;
                bitmapFrame.InsetBy(2, 2); // account for 2-pixel margin
                
                menu->SetDrawingMode(B_OP_COPY);
                menu->SetHighColor(BKG_GREY);
                menu->FillRect(itemFrame);
                menu->DrawBitmap(&m_bitmap, bitmapFrame);
                
                if (IsSelected()) {
                        // a nonstandard but simple way to draw highlights
                        menu->SetDrawingMode(B_OP_INVERT);
                        menu->SetHighColor(0,0,0);
                        menu->FillRect(itemFrame);
                }
        }
}

void BitmapMenuItem::GetContentSize(float* width, float* height)
{
        GetBitmapSize(width, height);
}



//--------------------------------------------------------------------
//      BitmapMenuItem accessors

void BitmapMenuItem::GetBitmapSize(float* width, float* height)
{
        BRect r = m_bitmap.Bounds();
        *width = r.Width() + 4; // 2-pixel boundary on either side
        *height = r.Height() + 4; // 2-pixel boundary on top/bottom
}