123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- //////////////////////////////////////////////////////////////////////////////
- //
- // PUSHBTN.CPP
- //
- // History:
- // 02/05/97 JMI Started.
- //
- // 02/05/97 JMI Forgot to make sure we were actually clicked in before
- // processing a release within cursor event area.
- //
- // 02/05/97 JMI Forgot to remove a debug TRACE.
- //
- // 03/19/97 JMI Converted to using the RHot::m_iecUser (was using
- // RHot::m_epcUser) so HotCall and CursorEvent now take
- // RInputEvent ptrs.
- //
- // 03/28/97 JMI RSP_MB0_DOUBLECLICK is now treated the same as
- // RSP_MB0_PRESSED.
- //
- // 04/16/97 JMI In previous update, forgot to add case RSP_MB0_DOUBLECLICK
- // in both places need for this implentation of CursorEvent().
- //
- //////////////////////////////////////////////////////////////////////////////
- //
- // This a GUI item that is based on the basic RGuiItem.
- // This overrides HotCall() to get information about where a click in its CHot
- // occurred.
- // This overrides Compose() to add text.
- //
- // Enhancements/Uses:
- // To change the look of a button when pressed, you may want to override the
- // Compose() or DrawBorder() in a derived class.
- // To change the background of a button, see RGuiItem.
- // To get a callback on a click/release pair in the button, set m_bcUser.
- //
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // Headers.
- //////////////////////////////////////////////////////////////////////////////
- #include "Blue.h"
- #ifdef PATHS_IN_INCLUDES
- #include "ORANGE/GUI/PushBtn.h"
- #else
- #include "PushBtn.h"
- #endif // PATHS_IN_INCLUDES
- //////////////////////////////////////////////////////////////////////////////
- // Module specific macros.
- //////////////////////////////////////////////////////////////////////////////
- // Sets val to def if val is -1.
- #define DEF(val, def) ((val == -1) ? def : val)
- //////////////////////////////////////////////////////////////////////////////
- // Module specific typedefs.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // Module specific (static) variables.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // Construction/Destruction.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- //
- // Default constructor.
- //
- //////////////////////////////////////////////////////////////////////////////
- RPushBtn::RPushBtn()
- {
- // Override RGuiItem's default justification.
- m_justification = RGuiItem::Centered;
- m_type = PushBtn; // Indicates type of GUI item.
- // Initialize RPushBtn members.
- m_state = Off; // The button's current state (On or Off (see enums)).
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Destructor.
- //
- //////////////////////////////////////////////////////////////////////////////
- RPushBtn::~RPushBtn()
- {
- }
- ////////////////////////////////////////////////////////////////////////
- // Methods.
- ////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////
- //
- // Compose item.
- //
- ////////////////////////////////////////////////////////////////////////
- void RPushBtn::Compose( // Returns nothing.
- RImage* pim /*= NULL*/) // Dest image, uses m_im if NULL.
- {
- if (pim == NULL)
- {
- pim = &m_im;
- }
- if (m_sPressed != FALSE || m_state == On)
- {
- // Invert border.
- m_sInvertedBorder = TRUE;
- }
- else
- {
- m_sInvertedBorder = FALSE;
- }
- // Call base (draws border and background).
- RGuiItem::Compose(pim);
- // Draw pushbtn stuff.
- short sX, sY, sW, sH;
- // Get client relative to border so we know where to
- // put the text.
- GetClient(&sX, &sY, &sW, &sH);
- // Draw text.
- DrawText(sX, sY, sW, sH, pim);
- }
- ////////////////////////////////////////////////////////////////////////
- //
- // Cursor event notification.
- // Events in event area.
- // (virtual).
- //
- ////////////////////////////////////////////////////////////////////////
- void RPushBtn::CursorEvent( // Returns nothing.
- RInputEvent* pie) // In: Most recent user input event.
- // Out: pie->sUsed = TRUE, if used.
- {
- switch (pie->sEvent)
- {
- case RSP_MB0_DOUBLECLICK:
- case RSP_MB0_RELEASED:
- // If we were clicked in . . .
- if (m_sPressed != FALSE)
- {
- // Do change of state right away so user callback gets the new
- // value.
- // If within event area . . .
- if ( pie->sPosX >= m_sEventAreaX && pie->sPosX < m_sEventAreaX + m_sEventAreaW
- && pie->sPosY >= m_sEventAreaY && pie->sPosY < m_sEventAreaY + m_sEventAreaH)
- {
- // Change state.
- m_state = (m_state == Off) ? On : Off;
- }
- }
- break;
- }
- // Call base.
- RGuiItem::CursorEvent(pie);
- switch (pie->sEvent)
- {
- case RSP_MB0_DOUBLECLICK:
- case RSP_MB0_PRESSED:
- // Always recompose on press, since there's so many possibilities
- // with this button.
- Compose();
- // Note that we used it.
- pie->sUsed = TRUE;
- break;
- case RSP_MB0_RELEASED:
- // Always recompose on release, since there's so many possibilities
- // with this button.
- Compose();
- // Note that we used it.
- pie->sUsed = TRUE;
- break;
- }
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Draw border.
- // (virtual (Overridden here)).
- //
- //////////////////////////////////////////////////////////////////////////////
- void RPushBtn::DrawBorder( // Returns nothing.
- RImage* pim /*= NULL*/, // Dest image, uses m_im if NULL.
- short sInvert /*= FALSE*/) // Inverts border if TRUE.
- {
- short sVertShadowPos;
- short sHorzShadowPos;
- short sVertHighlightPos;
- short sHorzHighlightPos;
- short sVertEdgePos;
- short sHorzEdgePos;
- short sShadowThickness = m_sBorderThickness;
- short sEdgeThickness = m_sBorderThickness;
- short sHighlightThickness = m_sBorderThickness;
- if (pim == NULL)
- {
- pim = &m_im;
- }
- short sW = pim->m_sWidth;
- short sH = pim->m_sHeight;
- m_sInvertedBorder = sInvert;
- if (sInvert == FALSE)
- {
- sVertShadowPos = sW - m_sBorderThickness;
- sHorzShadowPos = sH - m_sBorderThickness;
- sVertHighlightPos = 0;
- sHorzHighlightPos = 0;
- sVertEdgePos = sW - m_sBorderThickness * 2;
- sHorzEdgePos = sH - m_sBorderThickness * 2;
- }
- else
- {
- // Left top becomes thicker when pressed.
- sShadowThickness = (m_sPressed == FALSE) ? m_sBorderThickness
- : (m_sBorderThickness * 2);
- sEdgeThickness = sShadowThickness;
- sHighlightThickness = m_sBorderThickness;//sShadowThickness;
- sVertShadowPos = 0;
- sHorzShadowPos = 0;
- sVertHighlightPos = sW - sHighlightThickness;
- sHorzHighlightPos = sH - sHighlightThickness;
- sVertEdgePos = sShadowThickness;
- sHorzEdgePos = sShadowThickness;
- }
- // One pixel for each edge of border gets overwritten.
- rspRect(m_u32BorderHighlightColor, pim, 0, sHorzHighlightPos, sW, sHighlightThickness);
- rspRect(m_u32BorderHighlightColor, pim, sVertHighlightPos, 0, sHighlightThickness, sH);
- rspRect(m_u32BorderShadowColor, pim, 0, sHorzShadowPos, sW, sShadowThickness);
- rspRect(m_u32BorderShadowColor, pim, sVertShadowPos, 0, sShadowThickness, sH);
- rspRect(m_u32BorderEdgeColor, pim, sShadowThickness, sHorzEdgePos, sW - sShadowThickness - sEdgeThickness, sEdgeThickness);
- rspRect(m_u32BorderEdgeColor, pim, sVertEdgePos, sShadowThickness, sEdgeThickness, sH - sShadowThickness - sEdgeThickness);
- }
- //////////////////////////////////////////////////////////////////////////////
- // Querries.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- //
- // Gets the thickness of the top/left border (including border edge effect).
- // (virtual (Overridden here)).
- //
- //////////////////////////////////////////////////////////////////////////////
- short RPushBtn::GetTopLeftBorderThickness(void) // Returns border thickness
- // including edge effect.
- {
- if (m_sBorderThickness == 0)
- return 0;
- else
- return (m_sBorderThickness
- + ((m_sInvertedBorder == FALSE) ? 0 : m_sBorderThickness) )
- * ((m_sPressed == FALSE) ? 1 : 2);
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // Gets the thickness of the bottom/right border (including border edge effect).
- // (virtual (Overridden here)).
- //
- //////////////////////////////////////////////////////////////////////////////
- short RPushBtn::GetBottomRightBorderThickness(void) // Returns border thickness
- // including edge effect.
- {
- if (m_sBorderThickness == 0)
- return 0;
- else
- return (m_sBorderThickness
- + ((m_sInvertedBorder == FALSE) ? m_sBorderThickness : 0) )
- ;// * ((m_sPressed == FALSE) ? 1 : 2);
- }
- //////////////////////////////////////////////////////////////////////////////
- // EOF
- //////////////////////////////////////////////////////////////////////////////
|