123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- /////////////////////////////////////////////////////////////////////////////
- // apps/include/graphics/twm4nx/Cmenus.hxx
- //
- // Licensed to the Apache Software Foundation (ASF) under one or more
- // contributor license agreements. See the NOTICE file distributed with
- // this work for additional information regarding copyright ownership. The
- // ASF licenses this file to you under the Apache License, Version 2.0 (the
- // "License"); you may not use this file except in compliance with the
- // License. You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- // License for the specific language governing permissions and limitations
- // under the License.
- //
- /////////////////////////////////////////////////////////////////////////////
- // Largely an original work but derives from TWM 1.0.10 in many ways:
- //
- // Copyright 1989,1998 The Open Group
- // Copyright 1988 by Evans & Sutherland Computer Corporation,
- //
- // Please refer to apps/twm4nx/COPYING for detailed copyright information.
- // Although not listed as a copyright holder, thanks and recognition need
- // to go to Tom LaStrange, the original author of TWM.
- #ifndef __APPS_INCLUDE_GRAPHICS_TWM4NX_CMENUS_HXX
- #define __APPS_INCLUDE_GRAPHICS_TWM4NX_CMENUS_HXX
- /////////////////////////////////////////////////////////////////////////////
- // Included Files
- /////////////////////////////////////////////////////////////////////////////
- #include <mqueue.h>
- #include "graphics/nxwidgets/cwidgeteventhandler.hxx"
- #include "graphics/nxwidgets/cwidgeteventargs.hxx"
- #include "graphics/nxwidgets/cnxtkwindow.hxx"
- #include "graphics/twm4nx/cwindow.hxx"
- #include "graphics/twm4nx/ctwm4nxevent.hxx"
- #include "graphics/twm4nx/iapplication.hxx"
- /////////////////////////////////////////////////////////////////////////////
- // Pre-processor Definitions
- /////////////////////////////////////////////////////////////////////////////
- #define TWM_WINDOWS "TwmNxWindows" // for f.menu "TwmNxWindows"
- #define SIZE_HINDENT 10
- #define SIZE_VINDENT 2
- #define MAXMENUDEPTH 10 // max number of nested menus
- #define MOVE_NONE 0 // modes of constrained move
- #define MOVE_VERT 1
- #define MOVE_HORIZ 2
- #define SHADOWWIDTH 5 // in pixels
- // Info stings defines
- #define INFO_LINES 30
- #define INFO_SIZE 200
- /////////////////////////////////////////////////////////////////////////////
- // Implementation Classes
- /////////////////////////////////////////////////////////////////////////////
- namespace NXWidgets
- {
- class CButtonArray; // Forward reference
- class CWidgetEventArgs; // Forward reference
- class CWidgetEventArgs; // Forward reference
- }
- namespace Twm4Nx
- {
- struct SEventMsg; // Forward referernce
- class CMenus; // Forward reference
- struct SMenuItem
- {
- FAR struct SMenuItem *flink; /**< Forward link to next menu item */
- FAR struct SMenuItem *blink; /**< Backward link previous menu item */
- FAR NXWidgets::CNxString text; /**< The text string for the menu item */
- FAR CMenus *subMenu; /**< Menu root of a pull right menu */
- FAR CTwm4NxEvent *handler; /**< Application event handler */
- uint16_t event; /**< Menu selection event */
- };
- class CMenus : protected NXWidgets::CWidgetEventHandler, public CTwm4NxEvent
- {
- private:
- CTwm4Nx *m_twm4nx; /**< Cached Twm4Nx session */
- mqd_t m_eventq; /**< NxWidget event message queue */
- FAR CWindow *m_menuWindow; /**< The menu window */
- FAR NXWidgets::CButtonArray *m_buttons; /**< The menu button array */
- FAR struct SMenuItem *m_menuHead; /**< First item in menu */
- FAR struct SMenuItem *m_menuTail; /**< Last item in menu */
- NXWidgets::CNxString m_menuName; /**< The name of the menu */
- nxgl_coord_t m_entryHeight; /**< Menu entry height */
- uint16_t m_nMenuItems; /**< Number of items in the menu */
- uint8_t m_nrows; /**< Number of rows in the button array */
- char m_info[INFO_LINES][INFO_SIZE];
- /**
- * Convert the position of a menu window to the position of
- * the containing frame.
- */
- void menuToFramePos(FAR const struct nxgl_point_s *menupos,
- FAR struct nxgl_point_s *framepos);
- /**
- * Convert the position of the containing frame to the position of
- * the menu window.
- */
- void frameToMenuPos(FAR const struct nxgl_point_s *framepos,
- FAR struct nxgl_point_s *menupos);
- /**
- * Convert the size of a menu window to the size of the containing
- * frame.
- */
- void menuToFrameSize(FAR const struct nxgl_size_s *menusize,
- FAR struct nxgl_size_s *framesize);
- /**
- * Convert the size of a containing frame to the size of the menu
- * window.
- */
- void frameToMenuSize(FAR const struct nxgl_size_s *framesize,
- FAR struct nxgl_size_s *menusize);
- /**
- * Create the menu window. Menu windows are always created in the
- * hidden state. When the menu is selected, then it should be shown.
- *
- * @result True is returned on success
- */
- bool createMenuWindow(void);
- /**
- * Calculate the optimal menu frame size
- *
- * @param frameSize The location to return the calculated frame size
- */
- void getMenuFrameSize(FAR struct nxgl_size_s &frameSize);
- /**
- * Calculate the optimal menu window size
- *
- * @param size The location to return the calculated window size
- */
- void getMenuWindowSize(FAR struct nxgl_size_s &size);
- /**
- * Update the menu window size
- *
- * @result True is returned on success
- */
- bool setMenuWindowSize(void);
- /**
- * Set the position of the menu window. Supports positioning of a
- * pop-up window.
- *
- * @param framePos The position of the menu window frame
- * @result True is returned on success
- */
- bool setMenuWindowPosition(FAR struct nxgl_point_s *framePos);
- /**
- * Set the position of the menu window. Supports presentation of a
- * pop-up window.
- *
- * @param framePos The position of the menu window frame
- * @result True is returned on success
- */
- inline bool raiseMenuWindow()
- {
- return m_menuWindow->raiseWindow();
- }
- /**
- * Create the menu button array
- *
- * @result True is returned on success
- */
- bool createMenuButtonArray(void);
- void paintMenu(void);
- void destroyMenu(void);
- /**
- * Handle a widget action event, overriding the CWidgetEventHandler
- * method. This will indicate a button pre-release event.
- *
- * @param e The event data.
- */
- void handleActionEvent(const NXWidgets::CWidgetEventArgs &e);
- /**
- * Cleanup or initialization error or on deconstruction.
- */
- void cleanup(void);
- public:
- /**
- * CMenus Constructor
- *
- * @param twm4nx. Twm4Nx session
- */
- CMenus(CTwm4Nx *twm4nx);
- /**
- * CMenus Destructor
- */
- ~CMenus(void);
- /**
- * CMenus Initializer. Performs the parts of the CMenus construction
- * that may fail. The menu window is created but is not initially
- * visible. Use the show() method to make the menu visible.
- *
- * @param name The menu name
- * @result True is returned on success
- */
- bool initialize(FAR NXWidgets::CNxString &name);
- /**
- * Add an item to a menu
- *
- * @param item Describes the menu item entry
- * @return True if the menu item was added successfully
- */
- bool addMenuItem(FAR IApplication *item);
- /**
- * Return the size of the menu window frame
- *
- * @param frameSize The location in which to return the current menu
- * window frame size.
- * @result True is returned on success
- */
- bool getFrameSize(FAR struct nxgl_size_s *frameSize)
- {
- return m_menuWindow->getFrameSize(frameSize);
- }
- /**
- * Set the position of the menu window frame
- *
- * @param framePos The new menum window frame position
- * @result True is returned on success
- */
- bool getFramePosition(FAR struct nxgl_point_s *framePos)
- {
- return m_menuWindow->getFramePosition(framePos);
- }
- /**
- * Set the position of the menu window frame
- *
- * @param framePos The new menum window frame position
- * @result True is returned on success
- */
- bool setFramePosition(FAR const struct nxgl_point_s *framePos)
- {
- return m_menuWindow->setFramePosition(framePos);
- }
- /**
- * Return true if the menu is currently being displayed
- *
- * @return True if the menu is visible
- */
- inline bool isVisible(void)
- {
- return !m_menuWindow->isIconified();
- }
- /**
- * Make the menu visible.
- *
- * @return True if the menu is shown.
- */
- inline bool show(void)
- {
- return m_menuWindow->deIconify();
- }
- /**
- * Hide the menu
- *
- * @return True if the menu was hidden.
- */
- inline bool hide(void)
- {
- return m_menuWindow->iconify();
- }
- /**
- * Handle MENU events.
- *
- * @param msg. The received NxWidget MENU event message.
- * @return True if the message was properly handled. false is
- * return on any failure.
- */
- bool event(FAR struct SEventMsg *msg);
- };
- }
- #endif // __APPS_INCLUDE_GRAPHICS_TWM4NX_CMENUS_HXX
|