This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
281 lines
9.2 KiB
C++
281 lines
9.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/os2/control.cpp
|
|
// Purpose: wxControl class
|
|
// Author: David Webster
|
|
// Modified by:
|
|
// Created: 09/17/99
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#include "wx/control.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/event.h"
|
|
#include "wx/app.h"
|
|
#include "wx/dcclient.h"
|
|
#include "wx/scrolwin.h"
|
|
#include "wx/log.h"
|
|
#endif
|
|
|
|
#include "wx/os2/dc.h"
|
|
#include "wx/os2/private.h"
|
|
|
|
IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow)
|
|
|
|
BEGIN_EVENT_TABLE(wxControl, wxWindow)
|
|
EVT_ERASE_BACKGROUND(wxControl::OnEraseBackground)
|
|
END_EVENT_TABLE()
|
|
|
|
// Item members
|
|
wxControl::wxControl()
|
|
{
|
|
} // end of wxControl::wxControl
|
|
|
|
bool wxControl::Create( wxWindow* pParent,
|
|
wxWindowID vId,
|
|
const wxPoint& rPos,
|
|
const wxSize& rSize,
|
|
long lStyle,
|
|
const wxValidator& rValidator,
|
|
const wxString& rsName )
|
|
{
|
|
bool bRval = wxWindow::Create( pParent
|
|
,vId
|
|
,rPos
|
|
,rSize
|
|
,lStyle
|
|
,rsName
|
|
);
|
|
if (bRval)
|
|
{
|
|
#if wxUSE_VALIDATORS
|
|
SetValidator(rValidator);
|
|
#endif
|
|
}
|
|
return bRval;
|
|
} // end of wxControl::Create
|
|
|
|
bool wxControl::OS2CreateControl( const wxChar* zClassname,
|
|
const wxString& rsLabel,
|
|
const wxPoint& rPos,
|
|
const wxSize& rSize,
|
|
long lStyle )
|
|
{
|
|
WXDWORD dwExstyle;
|
|
WXDWORD dwStyle = OS2GetStyle( lStyle, &dwExstyle );
|
|
|
|
return OS2CreateControl( zClassname
|
|
,dwStyle
|
|
,rPos
|
|
,rSize
|
|
,rsLabel
|
|
,dwExstyle
|
|
);
|
|
} // end of wxControl::OS2CreateControl
|
|
|
|
bool wxControl::OS2CreateControl( const wxChar* zClassname,
|
|
WXDWORD dwStyle,
|
|
const wxPoint& rPos,
|
|
const wxSize& rSize,
|
|
const wxString& rsLabel,
|
|
WXDWORD dwExstyle )
|
|
{
|
|
//
|
|
// Doesn't do anything at all under OS/2
|
|
//
|
|
if (dwExstyle == (WXDWORD)-1)
|
|
{
|
|
dwExstyle = 0;
|
|
(void) OS2GetStyle(GetWindowStyle(), &dwExstyle);
|
|
}
|
|
//
|
|
// All controls should have these styles (wxWidgets creates all controls
|
|
// visible by default)
|
|
//
|
|
if (m_isShown )
|
|
dwStyle |= WS_VISIBLE;
|
|
|
|
wxWindow* pParent = GetParent();
|
|
PSZ zClass = "";
|
|
|
|
if (!pParent)
|
|
return false;
|
|
|
|
if ((wxStrcmp(zClassname, wxT("COMBOBOX"))) == 0)
|
|
zClass = WC_COMBOBOX;
|
|
else if ((wxStrcmp(zClassname, wxT("STATIC"))) == 0)
|
|
zClass = WC_STATIC;
|
|
else if ((wxStrcmp(zClassname, wxT("BUTTON"))) == 0)
|
|
zClass = WC_BUTTON;
|
|
else if ((wxStrcmp(zClassname, wxT("NOTEBOOK"))) == 0)
|
|
zClass = WC_NOTEBOOK;
|
|
else if ((wxStrcmp(zClassname, wxT("CONTAINER"))) == 0)
|
|
zClass = WC_CONTAINER;
|
|
if ((zClass == WC_STATIC) || (zClass == WC_BUTTON))
|
|
dwStyle |= DT_MNEMONIC;
|
|
|
|
m_dwStyle = dwStyle;
|
|
m_label = rsLabel;
|
|
wxString label;
|
|
if (dwStyle & DT_MNEMONIC)
|
|
label = ::wxPMTextToLabel(m_label);
|
|
else
|
|
label = m_label;
|
|
|
|
// clipping siblings does not yet work
|
|
dwStyle &= ~WS_CLIPSIBLINGS;
|
|
|
|
m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
|
|
,zClass // Window class
|
|
,label.c_str() // Initial Text
|
|
,(ULONG)dwStyle // Style flags
|
|
,(LONG)0 // X pos of origin
|
|
,(LONG)0 // Y pos of origin
|
|
,(LONG)0 // control width
|
|
,(LONG)0 // control height
|
|
,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
|
|
,HWND_TOP // initial z position
|
|
,(ULONG)GetId() // Window identifier
|
|
,NULL // no control data
|
|
,NULL // no Presentation parameters
|
|
);
|
|
|
|
if ( !m_hWnd )
|
|
{
|
|
wxLogError(wxT("Failed to create a control of class '%s'"), zClassname);
|
|
|
|
return false;
|
|
}
|
|
//
|
|
// Subclass again for purposes of dialog editing mode
|
|
//
|
|
SubclassWin(m_hWnd);
|
|
|
|
//
|
|
// Controls use the same colours as their parent dialog by default
|
|
//
|
|
InheritAttributes();
|
|
//
|
|
// All OS/2 ctrls use the small font
|
|
//
|
|
SetFont(*wxSMALL_FONT);
|
|
|
|
SetXComp(0);
|
|
SetYComp(0);
|
|
SetSize( rPos.x, rPos.y, rSize.x, rSize.y );
|
|
return true;
|
|
} // end of wxControl::OS2CreateControl
|
|
|
|
wxSize wxControl::DoGetBestSize() const
|
|
{
|
|
return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT);
|
|
} // end of wxControl::DoGetBestSize
|
|
|
|
bool wxControl::ProcessCommand(wxCommandEvent& event)
|
|
{
|
|
return HandleWindowEvent(event);
|
|
}
|
|
|
|
WXHBRUSH wxControl::OnCtlColor(WXHDC hWxDC,
|
|
WXHWND WXUNUSED(hWnd),
|
|
WXUINT WXUNUSED(uCtlColor),
|
|
WXUINT WXUNUSED(uMessage),
|
|
WXWPARAM WXUNUSED(wParam),
|
|
WXLPARAM WXUNUSED(lParam))
|
|
{
|
|
HPS hPS = (HPS)hWxDC; // pass in a PS handle in OS/2
|
|
wxColour vColFore = GetForegroundColour();
|
|
wxColour vColBack = GetBackgroundColour();
|
|
|
|
if (GetParent()->GetTransparentBackground())
|
|
::GpiSetBackMix(hPS, BM_LEAVEALONE);
|
|
else
|
|
::GpiSetBackMix(hPS, BM_OVERPAINT);
|
|
|
|
::GpiSetBackColor(hPS, vColBack.GetPixel());
|
|
::GpiSetColor(hPS, vColFore.GetPixel());
|
|
|
|
wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack
|
|
,wxSOLID
|
|
);
|
|
return (WXHBRUSH)pBrush->GetResourceHandle();
|
|
} // end of wxControl::OnCtlColor
|
|
|
|
void wxControl::OnEraseBackground( wxEraseEvent& rEvent )
|
|
{
|
|
RECTL vRect;
|
|
wxPMDCImpl *impl = (wxPMDCImpl*) rEvent.GetDC()->GetImpl();
|
|
HPS hPS = impl->GetHPS();
|
|
SIZEL vSize = {0,0};
|
|
|
|
::GpiSetPS(hPS, &vSize, PU_PELS | GPIF_DEFAULT);
|
|
::WinQueryWindowRect((HWND)GetHwnd(), &vRect);
|
|
::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel());
|
|
} // end of wxControl::OnEraseBackground
|
|
|
|
WXDWORD wxControl::OS2GetStyle( long lStyle, WXDWORD* pdwExstyle ) const
|
|
{
|
|
long dwStyle = wxWindow::OS2GetStyle( lStyle, pdwExstyle );
|
|
|
|
if (AcceptsFocusFromKeyboard())
|
|
{
|
|
dwStyle |= WS_TABSTOP;
|
|
}
|
|
return dwStyle;
|
|
} // end of wxControl::OS2GetStyle
|
|
|
|
void wxControl::SetLabel( const wxString& rsLabel )
|
|
{
|
|
if(rsLabel != m_label)
|
|
{
|
|
m_label = rsLabel;
|
|
wxString label;
|
|
if (m_dwStyle & DT_MNEMONIC)
|
|
label = ::wxPMTextToLabel(m_label);
|
|
else
|
|
label = m_label;
|
|
::WinSetWindowText(GetHwnd(), label.c_str());
|
|
}
|
|
} // end of wxControl::SetLabel
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// global functions
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// Call this repeatedly for several wnds to find the overall size
|
|
// of the widget.
|
|
// Call it initially with -1 for all values in rect.
|
|
// Keep calling for other widgets, and rect will be modified
|
|
// to calculate largest bounding rectangle.
|
|
void wxFindMaxSize(
|
|
WXHWND hWnd
|
|
, RECT* pRect
|
|
)
|
|
{
|
|
int nLeft = pRect->xLeft;
|
|
int nRight = pRect->xRight;
|
|
int nTop = pRect->yTop;
|
|
int nBottom = pRect->yBottom;
|
|
|
|
::WinQueryWindowRect((HWND)hWnd, pRect);
|
|
|
|
if (nLeft < 0)
|
|
return;
|
|
|
|
if (nLeft < pRect->xLeft)
|
|
pRect->xLeft = nLeft;
|
|
|
|
if (nRight > pRect->xRight)
|
|
pRect->xRight = nRight;
|
|
|
|
if (nTop > pRect->yTop)
|
|
pRect->yTop = nTop;
|
|
|
|
if (nBottom < pRect->yBottom)
|
|
pRect->yBottom = nBottom;
|
|
} // end of wxFindMaxSize
|