Standardize on using a single macro across all wxWidgets sources and solve the name clash with Sun CC standard headers (see #10660). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61508 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
285 lines
8.0 KiB
C++
285 lines
8.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/os2/combobox.cpp
|
|
// Purpose: wxComboBox class
|
|
// Author: David Webster
|
|
// Modified by:
|
|
// Created: 10/13/99
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) David Webster
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#if wxUSE_COMBOBOX
|
|
|
|
#include "wx/combobox.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/settings.h"
|
|
#endif
|
|
|
|
#include "wx/clipbrd.h"
|
|
#include "wx/os2/private.h"
|
|
|
|
#define OWNER_DRAWN_LISTBOX_EXTRA_SPACE (1)
|
|
|
|
MRESULT EXPENTRY wxComboEditWndProc( HWND hWnd
|
|
,UINT uMessage
|
|
,MPARAM wParam
|
|
,MPARAM lParam
|
|
);
|
|
//
|
|
// The pointer to standard wnd proc
|
|
//
|
|
static WXFARPROC gfnWndprocEdit = (WXFARPROC)NULL;
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
|
|
|
|
bool wxComboBox::OS2Command( WXUINT uParam, WXWORD WXUNUSED(wId) )
|
|
{
|
|
long lSel = GetSelection();
|
|
wxString sValue;
|
|
|
|
switch (uParam)
|
|
{
|
|
case CBN_LBSELECT:
|
|
if (lSel > -1)
|
|
{
|
|
wxCommandEvent vEvent( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() );
|
|
|
|
vEvent.SetInt(lSel);
|
|
vEvent.SetEventObject(this);
|
|
vEvent.SetString(GetStringSelection());
|
|
|
|
ProcessCommand(vEvent);
|
|
}
|
|
break;
|
|
|
|
case CBN_EFCHANGE:
|
|
{
|
|
wxCommandEvent vEvent( wxEVT_COMMAND_TEXT_UPDATED, GetId() );
|
|
|
|
if (lSel == -1L)
|
|
sValue = GetValue();
|
|
else
|
|
sValue = GetStringSelection();
|
|
vEvent.SetString(sValue);
|
|
vEvent.SetEventObject(this);
|
|
ProcessCommand(vEvent);
|
|
}
|
|
break;
|
|
}
|
|
//
|
|
// There is no return value for the CBN_ notifications, so always return
|
|
// false from here to pass the message to DefWindowProc()
|
|
//
|
|
return false;
|
|
} // end of wxComboBox::OS2Command
|
|
|
|
bool wxComboBox::Create(
|
|
wxWindow* pParent
|
|
, wxWindowID vId
|
|
, const wxString& rsValue
|
|
, const wxPoint& rPos
|
|
, const wxSize& rSize
|
|
, const wxArrayString& asChoices
|
|
, long lStyle
|
|
, const wxValidator& rValidator
|
|
, const wxString& rsName
|
|
)
|
|
{
|
|
wxCArrayString chs(asChoices);
|
|
|
|
return Create(pParent, vId, rsValue, rPos, rSize, chs.GetCount(),
|
|
chs.GetStrings(), lStyle, rValidator, rsName);
|
|
}
|
|
|
|
bool wxComboBox::Create(
|
|
wxWindow* pParent
|
|
, wxWindowID vId
|
|
, const wxString& rsValue
|
|
, const wxPoint& rPos
|
|
, const wxSize& rSize
|
|
, int n
|
|
, const wxString asChoices[]
|
|
, long lStyle
|
|
, const wxValidator& rValidator
|
|
, const wxString& rsName
|
|
)
|
|
{
|
|
m_isShown = false;
|
|
|
|
if (!CreateControl( pParent
|
|
,vId
|
|
,rPos
|
|
,rSize
|
|
,lStyle
|
|
,rValidator
|
|
,rsName
|
|
))
|
|
return false;
|
|
|
|
//
|
|
// Get the right style
|
|
//
|
|
long lSstyle = 0L;
|
|
|
|
lSstyle = WS_TABSTOP |
|
|
WS_VISIBLE;
|
|
|
|
// clipping siblings does not yet work
|
|
// if (lStyle & wxCLIP_SIBLINGS )
|
|
// lSstyle |= WS_CLIPSIBLINGS;
|
|
if (lStyle & wxCB_READONLY)
|
|
lSstyle |= CBS_DROPDOWNLIST;
|
|
else if (lStyle & wxCB_SIMPLE)
|
|
lSstyle |= CBS_SIMPLE; // A list (shown always) and edit control
|
|
else
|
|
lSstyle |= CBS_DROPDOWN;
|
|
|
|
|
|
if (!OS2CreateControl( wxT("COMBOBOX")
|
|
,lSstyle
|
|
))
|
|
return false;
|
|
|
|
//
|
|
// A choice/combobox normally has a white background (or other, depending
|
|
// on global settings) rather than inheriting the parent's background colour.
|
|
//
|
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
|
|
|
|
for (int i = 0; i < n; i++)
|
|
{
|
|
Append(asChoices[i]);
|
|
}
|
|
|
|
SetSize( rPos.x
|
|
,rPos.y
|
|
,rSize.x
|
|
,rSize.y
|
|
);
|
|
|
|
// Set height to use with sizers i.e. without the dropdown listbox
|
|
wxFont vFont = GetFont();
|
|
int nEditHeight;
|
|
wxGetCharSize( GetHWND(), NULL, &nEditHeight, &vFont );
|
|
nEditHeight = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nEditHeight);
|
|
SetInitialSize(wxSize(-1,nEditHeight+4)); // +2x2 for the border
|
|
|
|
if (!rsValue.empty())
|
|
{
|
|
SetValue(rsValue);
|
|
}
|
|
gfnWndprocEdit = (WXFARPROC)::WinSubclassWindow( (HWND)GetHwnd()
|
|
,(PFNWP)wxComboEditWndProc
|
|
);
|
|
::WinSetWindowULong(GetHwnd(), QWL_USER, (ULONG)this);
|
|
Show(true);
|
|
return true;
|
|
} // end of wxComboBox::Create
|
|
|
|
wxString wxComboBox::GetValue() const
|
|
{
|
|
return HasFlag(wxCB_READONLY) ? GetStringSelection()
|
|
: wxTextEntry::GetValue();
|
|
}
|
|
|
|
void wxComboBox::SetValue(const wxString& value)
|
|
{
|
|
if ( HasFlag(wxCB_READONLY) )
|
|
SetStringSelection(value);
|
|
else
|
|
wxTextEntry::SetValue(value);
|
|
}
|
|
|
|
void wxComboBox::Clear()
|
|
{
|
|
wxChoice::Clear();
|
|
if ( !HasFlag(wxCB_READONLY) )
|
|
wxTextEntry::Clear();
|
|
}
|
|
|
|
bool wxComboBox::IsEditable() const
|
|
{
|
|
return !HasFlag(wxCB_READONLY) && wxTextEntry::IsEditable();
|
|
}
|
|
|
|
bool wxComboBox::ProcessEditMsg(
|
|
WXUINT uMsg
|
|
, WXWPARAM wParam
|
|
, WXLPARAM lParam)
|
|
{
|
|
SHORT vFlag;
|
|
switch (uMsg)
|
|
{
|
|
case WM_CHAR:
|
|
vFlag = SHORT1FROMMP(wParam);
|
|
switch(vFlag)
|
|
{
|
|
case KC_CHAR:
|
|
return (HandleChar( wParam
|
|
,lParam
|
|
,true /* isASCII */
|
|
));
|
|
|
|
case KC_PREVDOWN:
|
|
return (HandleKeyDown( wParam
|
|
,lParam
|
|
));
|
|
|
|
case KC_KEYUP:
|
|
return (HandleKeyUp( wParam
|
|
,lParam
|
|
));
|
|
}
|
|
break;
|
|
|
|
case WM_SETFOCUS:
|
|
if (SHORT1FROMMP((MPARAM)lParam) == TRUE)
|
|
return(HandleSetFocus((WXHWND)(HWND)wParam));
|
|
else
|
|
return(HandleKillFocus((WXHWND)(HWND)wParam));
|
|
}
|
|
return false;
|
|
} // end of wxComboBox::ProcessEditMsg
|
|
|
|
MRESULT EXPENTRY wxComboEditWndProc(
|
|
HWND hWnd
|
|
, UINT uMessage
|
|
, MPARAM wParam
|
|
, MPARAM lParam
|
|
)
|
|
{
|
|
switch (uMessage)
|
|
{
|
|
//
|
|
// Forward some messages to the combobox
|
|
//
|
|
case WM_SETFOCUS:
|
|
case WM_CHAR:
|
|
{
|
|
wxComboBox* pCombo = (wxComboBox *)::WinQueryWindowULong( hWnd
|
|
,QWL_USER
|
|
);
|
|
|
|
if (pCombo->ProcessEditMsg( uMessage
|
|
,wParam
|
|
,lParam
|
|
))
|
|
return ((MRESULT)0);
|
|
}
|
|
break;
|
|
|
|
//
|
|
// TODO: Deal with tooltips here
|
|
//
|
|
}
|
|
return (gfnWndprocEdit(hWnd, (ULONG)uMessage, (MPARAM)wParam, (MPARAM)lParam));
|
|
} // end of wxComboEditWndProc
|
|
|
|
#endif
|
|
// wxUSE_COMBOBOX
|