finalcut/src/fmenu.h

240 lines
8.5 KiB
C
Raw Normal View History

// File: fmenubar.h
// Provides: class FMenu
//
// Inheritance diagram
// ═══════════════════
//
// ▕▔▔▔▔▔▔▔▔▔▏ ▕▔▔▔▔▔▔▔▔▔▏
// ▕ FObject ▏ ▕ FTerm ▏
// ▕▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▁▁▏
// ▲ ▲
// │ │ *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏
// └─────┬─────┘ ┌ - -▕ FRadioMenuItem ▏
// │ : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏
// ▕▔▔▔▔▔▔▔▔▔▏ :
// ▕ FWidget ▏ : *▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏
// ▕▁▁▁▁▁▁▁▁▁▏ ├ - -▕ FCheckMenuItem ▏
// ▲ : ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏
// │ 1 :
// ▕▔▔▔▔▔▔▔▔▔▏ ▕▔▔▔▔▔▔▔▔▔▔▔▏- ┘ ▕▔▔▔▔▔▔▔▔▔▔▔▏
// ▕ FWindow ▏ ▕ FMenuList ▏- - - -▕ FMenuItem ▏
// ▕▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▁▁▁▁▏1 *▕▁▁▁▁▁▁▁▁▁▁▁▏
// ▲ ▲ 1:
// │ │ :
// └─────┬─────┘ :
// │ 1 :
// ▕▔▔▔▔▔▔▔▏- - - ┘ ▕▔▔▔▔▔▔▔▔▔▔▔▏
// ▕ FMenu ▏- - - - - - - -▕ FMenuItem ▏
// ▕▁▁▁▁▁▁▁▏1 1▕▁▁▁▁▁▁▁▁▁▁▁▏
2015-08-16 20:05:39 +02:00
#ifndef _FMENU_H
#define _FMENU_H
#include "fwindow.h"
#include "fmenubar.h"
2015-08-16 20:05:39 +02:00
#include "fmenulist.h"
#include "fmenuitem.h"
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
// class FMenu
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class FMenu : public FWindow, public FMenuList
{
private:
FMenuItem* item;
FWidget* super_menu;
2015-11-22 21:41:18 +01:00
FMenu* open_sub_menu;
2015-09-15 23:07:24 +02:00
uInt maxItemWidth;
bool mouse_down;
bool has_checkable_items;
2015-08-16 20:05:39 +02:00
private:
FMenu (const FMenu&);
FMenu& operator = (const FMenu&);
void init(FWidget*);
2015-09-15 23:07:24 +02:00
void menu_dimension();
2015-08-16 20:05:39 +02:00
bool isMenuBar (FWidget*) const;
bool isMenu (FWidget*) const;
bool isRadioMenuItem (FWidget*) const;
FWidget* getSuperMenu() const;
void setSuperMenu (FWidget*);
2015-11-22 21:41:18 +01:00
bool isSubMenu() const;
void openSubMenu (FMenu*);
2015-10-19 00:07:07 +02:00
void hideSubMenus();
void hideSuperMenus();
bool containsMenuStructure (const FPoint&) const;
bool containsMenuStructure (int, int) const;
FMenu* superMenuAt (const FPoint&) const;
FMenu* superMenuAt (int, int) const;
2015-10-29 21:10:50 +01:00
bool selectNextItem();
bool selectPrevItem();
void keypressMenuBar (FKeyEvent*&);
bool hotkeyMenu (FKeyEvent*&);
2015-08-16 20:05:39 +02:00
int getHotkeyPos (wchar_t*&, wchar_t*&, uInt);
void draw();
2015-09-15 23:07:24 +02:00
void drawBorder();
2015-10-29 21:10:50 +01:00
void drawMenuShadow();
2015-08-16 20:05:39 +02:00
void drawItems();
2015-10-29 21:10:50 +01:00
void drawSeparator(int);
2015-08-16 20:05:39 +02:00
void processActivate();
public:
2015-09-27 16:45:28 +02:00
explicit FMenu (FWidget* = 0); // constructor
FMenu (FString&, FWidget* = 0);
FMenu (const std::string&, FWidget* = 0);
FMenu (const char*, FWidget* = 0);
2015-08-16 20:05:39 +02:00
virtual ~FMenu(); // destructor
virtual const char* getClassName() const;
2015-10-29 21:10:50 +01:00
void onKeyPress (FKeyEvent*);
2015-08-16 20:05:39 +02:00
void onMouseDown (FMouseEvent*);
void onMouseUp (FMouseEvent*);
void onMouseMove (FMouseEvent*);
2015-10-29 21:10:50 +01:00
void onAccel (FAccelEvent*);
2015-09-30 22:39:02 +02:00
void show();
2015-08-16 20:05:39 +02:00
void hide();
2015-09-22 04:18:20 +02:00
// make every setGeometry from FWidget available
using FWidget::setGeometry;
2015-09-27 16:45:28 +02:00
void setGeometry (int, int, int, int, bool = true);
void setStatusbarMessage (FString);
2015-08-16 20:05:39 +02:00
FMenuItem* getItem() const;
FString getText() const;
2015-10-29 21:10:50 +01:00
bool setEnable(bool);
bool setEnable();
bool unsetEnable();
bool setDisable();
bool isEnabled() const;
2015-08-16 20:05:39 +02:00
void setSelected();
void unsetSelected();
bool isSelected() const;
bool hasHotkey() const;
void setMenu (FMenu*);
bool hasMenu() const;
2015-10-29 21:10:50 +01:00
bool setTransparentShadow (bool);
bool setTransparentShadow();
bool unsetTransparentShadow();
bool hasTransparentShadow();
2015-08-16 20:05:39 +02:00
void setText (FString&);
void setText (const std::string&);
void setText (const char*);
void cb_menuitem_toggled (FWidget*, void*);
2015-09-30 22:39:02 +02:00
private:
friend class FApplication;
friend class FCheckMenuItem;
2015-11-07 23:16:09 +01:00
friend class FMenuBar;
2015-09-30 22:39:02 +02:00
friend class FMenuItem;
friend class FRadioMenuItem;
2015-08-16 20:05:39 +02:00
};
#pragma pack(pop)
// FMenu inline functions
2015-10-19 00:07:07 +02:00
//----------------------------------------------------------------------
inline FWidget* FMenu::getSuperMenu() const
{ return super_menu; }
//----------------------------------------------------------------------
inline void FMenu::setSuperMenu (FWidget* smenu)
{ super_menu = smenu; }
//----------------------------------------------------------------------
inline bool FMenu::containsMenuStructure (const FPoint& p) const
{ return containsMenuStructure (p.getX(), p.getY()); }
//----------------------------------------------------------------------
inline FMenu* FMenu::superMenuAt (const FPoint& p) const
{ return superMenuAt (p.getX(), p.getY()); }
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
inline const char* FMenu::getClassName() const
{ return "FMenu"; }
//----------------------------------------------------------------------
2015-09-20 05:44:50 +02:00
inline void FMenu::onAccel (FAccelEvent* ev)
{ item->onAccel(ev); }
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
inline FMenuItem* FMenu::getItem() const
{ return item; }
//----------------------------------------------------------------------
inline FString FMenu::getText() const
{ return item->getText(); }
//----------------------------------------------------------------------
2015-10-29 21:10:50 +01:00
inline bool FMenu::setEnable(bool on)
{ return item->setEnable(on); }
//----------------------------------------------------------------------
inline bool FMenu::setEnable()
{ return item->setEnable(); }
//----------------------------------------------------------------------
inline bool FMenu::unsetEnable()
{ return item->unsetEnable(); }
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
2015-10-29 21:10:50 +01:00
inline bool FMenu::setDisable()
{ return item->setDisable(); }
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
2015-10-29 21:10:50 +01:00
inline bool FMenu::isEnabled() const
{ return item->isEnabled(); }
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
inline void FMenu::setSelected()
{ item->setSelected(); }
//----------------------------------------------------------------------
inline void FMenu::unsetSelected()
{ item->unsetSelected(); }
//----------------------------------------------------------------------
inline bool FMenu::isSelected() const
{ return item->isSelected(); }
//----------------------------------------------------------------------
inline bool FMenu::hasHotkey() const
{ return item->hasHotkey(); }
//----------------------------------------------------------------------
inline void FMenu::setMenu (FMenu* m)
{ item->setMenu(m); }
//----------------------------------------------------------------------
inline bool FMenu::hasMenu() const
{ return item->hasMenu(); }
2015-10-29 21:10:50 +01:00
//----------------------------------------------------------------------
inline bool FMenu::setTransparentShadow()
{ return setTransparentShadow(true); }
//----------------------------------------------------------------------
inline bool FMenu::unsetTransparentShadow()
{ return setTransparentShadow(false); }
//----------------------------------------------------------------------
inline bool FMenu::hasTransparentShadow()
{ return ((flags & TRANS_SHADOW) != 0); }
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
inline void FMenu::setText (FString& txt)
{ item->setText(txt); }
//----------------------------------------------------------------------
inline void FMenu::setText (const std::string& txt)
{ item->setText(txt); }
//----------------------------------------------------------------------
inline void FMenu::setText (const char* txt)
{ item->setText(txt); }
#endif // _FMENU_H