More Motif changes (colour/font stuff)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@902 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
1998-10-23 18:22:30 +00:00
parent 0d559d69c8
commit 321db4b6bf
23 changed files with 284 additions and 191 deletions

View File

@@ -20,6 +20,7 @@
#include "wx/icon.h"
#include "wx/log.h"
#include "wx/control.h"
#include "wx/dcmemory.h"
#include <Xm/Xm.h>
@@ -1003,3 +1004,23 @@ static
return ipixmap;
}
// Creates a bitmap with transparent areas drawn in
// the given colour.
wxBitmap wxCreateMaskedBitmap(wxBitmap& bitmap, wxColour& colour)
{
wxBitmap newBitmap(bitmap.GetWidth(),
bitmap.GetHeight(),
bitmap.GetDepth());
wxMemoryDC destDC;
wxMemoryDC srcDC;
srcDC.SelectObject(bitmap);
destDC.SelectObject(newBitmap);
wxBrush brush(colour, wxSOLID);
destDC.SetOptimization(FALSE);
destDC.SetBackground(brush);
destDC.Clear();
destDC.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & srcDC, 0, 0, wxCOPY, TRUE);
return newBitmap;
}

View File

@@ -42,6 +42,10 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit
const wxString& name)
{
m_buttonBitmap = bitmap;
m_buttonBitmapOriginal = bitmap;
m_buttonBitmapSelected = bitmap;
m_buttonBitmapSelectedOriginal = bitmap;
SetName(name);
SetValidator(validator);
parent->AddChild(this);
@@ -86,27 +90,9 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit
m_mainWidget = (WXWidget) buttonWidget;
if (bitmap.Ok())
{
Pixmap p1, p2;
ChangeBackgroundColour ();
p1 = (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap(m_mainWidget);
p2 = (Pixmap) ((wxBitmap&)bitmap).GetInsensPixmap(m_mainWidget);
if(p1 == p2) // <- the Get...Pixmap()-functions return the same pixmap!
{
p2 =
XCreateInsensitivePixmap(DisplayOfScreen(XtScreen(buttonWidget)), p1);
m_insensPixmap = (WXPixmap) p2;
}
XtVaSetValues (buttonWidget,
XmNlabelPixmap, p1,
XmNlabelInsensitivePixmap, p2,
XmNarmPixmap, (Pixmap) ((wxBitmap&)bitmap).GetArmPixmap (m_mainWidget),
XmNlabelType, XmPIXMAP,
NULL);
}
DoSetBitmap();
XtAddCallback (buttonWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback,
(XtPointer) this);
@@ -116,8 +102,6 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit
SetFont(* parent->GetFont());
ChangeBackgroundColour ();
return TRUE;
}
@@ -132,53 +116,18 @@ wxBitmapButton::~wxBitmapButton()
void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap)
{
m_buttonBitmapOriginal = bitmap;
m_buttonBitmap = bitmap;
if (bitmap.Ok())
{
Pixmap labelPixmap, insensPixmap, armPixmap;
labelPixmap = (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap(m_mainWidget);
if (m_buttonBitmapSelected.Ok())
armPixmap = (Pixmap) m_buttonBitmapSelected.GetLabelPixmap(m_mainWidget);
else
armPixmap = (Pixmap) ((wxBitmap&)bitmap).GetArmPixmap(m_mainWidget);
if (m_buttonBitmapDisabled.Ok())
insensPixmap = (Pixmap) m_buttonBitmapDisabled.GetLabelPixmap(m_mainWidget);
else
insensPixmap = (Pixmap) ((wxBitmap&)bitmap).GetInsensPixmap(m_mainWidget);
if (!insensPixmap || (insensPixmap == labelPixmap)) // <- the Get...Pixmap()-functions return the same pixmap!
{
insensPixmap = XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget) m_mainWidget)), labelPixmap);
m_insensPixmap = (WXPixmap) insensPixmap;
}
XtVaSetValues ((Widget) m_mainWidget,
XmNlabelPixmap, labelPixmap,
XmNlabelInsensitivePixmap, insensPixmap,
XmNarmPixmap, armPixmap,
XmNlabelType, XmPIXMAP,
NULL);
}
else
{
// Null bitmap: must not use current pixmap
// since it is no longer valid.
XtVaSetValues ((Widget) m_mainWidget,
XmNlabelType, XmSTRING,
XmNlabelPixmap, XmUNSPECIFIED_PIXMAP,
XmNlabelInsensitivePixmap, NULL,
XmNarmPixmap, NULL,
NULL);
}
DoSetBitmap();
}
void wxBitmapButton::SetBitmapSelected(const wxBitmap& sel)
{
m_buttonBitmapSelected = sel;
m_buttonBitmapSelectedOriginal = sel;
DoSetBitmap();
};
void wxBitmapButton::SetBitmapFocus(const wxBitmap& focus)
@@ -190,6 +139,114 @@ void wxBitmapButton::SetBitmapFocus(const wxBitmap& focus)
void wxBitmapButton::SetBitmapDisabled(const wxBitmap& disabled)
{
m_buttonBitmapDisabled = disabled;
m_buttonBitmapDisabledOriginal = disabled;
DoSetBitmap();
};
void wxBitmapButton::DoSetBitmap()
{
if (m_buttonBitmapOriginal.Ok())
{
Pixmap pixmap = 0;
Pixmap insensPixmap = 0;
Pixmap armPixmap = 0;
// Must re-make the bitmap to have its transparent areas drawn
// in the current widget background colour.
if (m_buttonBitmapOriginal.GetMask())
{
int backgroundPixel;
XtVaGetValues((Widget) m_mainWidget, XmNbackground, &backgroundPixel,
NULL);
wxColour col;
col.SetPixel(backgroundPixel);
wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapOriginal, col);
m_buttonBitmap = newBitmap;
pixmap = (Pixmap) m_buttonBitmap.GetPixmap();
}
else
pixmap = (Pixmap) m_buttonBitmap.GetLabelPixmap(m_mainWidget);
if (m_buttonBitmapDisabledOriginal.Ok())
{
if (m_buttonBitmapDisabledOriginal.GetMask())
{
int backgroundPixel;
XtVaGetValues((Widget) m_mainWidget, XmNbackground, &backgroundPixel,
NULL);
wxColour col;
col.SetPixel(backgroundPixel);
wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapDisabledOriginal, col);
m_buttonBitmapDisabled = newBitmap;
insensPixmap = (Pixmap) m_buttonBitmapDisabled.GetPixmap();
}
else
insensPixmap = (Pixmap) m_buttonBitmap.GetInsensPixmap(m_mainWidget);
}
else
insensPixmap = (Pixmap) m_buttonBitmap.GetInsensPixmap(m_mainWidget);
// Now make the bitmap representing the armed state
if (m_buttonBitmapSelectedOriginal.Ok())
{
if (m_buttonBitmapSelectedOriginal.GetMask())
{
int backgroundPixel;
XtVaGetValues((Widget) m_mainWidget, XmNarmColor, &backgroundPixel,
NULL);
wxColour col;
col.SetPixel(backgroundPixel);
wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapSelectedOriginal, col);
m_buttonBitmapSelected = newBitmap;
armPixmap = (Pixmap) m_buttonBitmapSelected.GetPixmap();
}
else
armPixmap = (Pixmap) m_buttonBitmap.GetArmPixmap(m_mainWidget);
}
else
armPixmap = (Pixmap) m_buttonBitmap.GetArmPixmap(m_mainWidget);
if (insensPixmap == pixmap) // <- the Get...Pixmap()-functions return the same pixmap!
{
insensPixmap =
XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget) m_mainWidget)), pixmap);
m_insensPixmap = (WXPixmap) insensPixmap;
}
XtVaSetValues ((Widget) m_mainWidget,
XmNlabelPixmap, pixmap,
XmNlabelInsensitivePixmap, insensPixmap,
XmNarmPixmap, armPixmap,
XmNlabelType, XmPIXMAP,
NULL);
}
else
{
// Null bitmap: must not use current pixmap
// since it is no longer valid.
XtVaSetValues ((Widget) m_mainWidget,
XmNlabelType, XmSTRING,
XmNlabelPixmap, XmUNSPECIFIED_PIXMAP,
XmNlabelInsensitivePixmap, XmUNSPECIFIED_PIXMAP,
XmNarmPixmap, XmUNSPECIFIED_PIXMAP,
NULL);
}
}
void wxBitmapButton::ChangeBackgroundColour()
{
DoChangeBackgroundColour(m_mainWidget, m_backgroundColour, TRUE);
// Must reset the bitmaps since the colours have changed.
DoSetBitmap();
}

View File

@@ -137,16 +137,16 @@ void wxButtonCallback (Widget w, XtPointer clientData, XtPointer ptr)
void wxButton::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxButton::ChangeBackgroundColour()
{
// TODO
DoChangeBackgroundColour(m_mainWidget, m_backgroundColour, TRUE);
}
void wxButton::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}

View File

@@ -153,16 +153,27 @@ void wxCheckBoxCallback (Widget w, XtPointer clientData,
void wxCheckBox::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxCheckBox::ChangeBackgroundColour()
{
// TODO
wxComputeColours (XtDisplay((Widget) m_mainWidget), & m_backgroundColour,
(wxColour*) NULL);
XtVaSetValues ((Widget) m_mainWidget,
XmNbackground, g_itemColors[wxBACK_INDEX].pixel,
XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel,
XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel,
XmNforeground, g_itemColors[wxFORE_INDEX].pixel,
NULL);
XtVaSetValues ((Widget) m_mainWidget,
XmNselectColor, g_itemColors[wxSELE_INDEX].pixel,
NULL);
}
void wxCheckBox::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}

View File

@@ -164,6 +164,8 @@ void wxChoice::Append(const wxString& item)
#endif
NULL);
DoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
if (m_windowFont.Ok())
XtVaSetValues (w,
XmNfontList, (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) m_formWidget)),
@@ -420,16 +422,45 @@ void wxChoiceCallback (Widget w, XtPointer clientData,
void wxChoice::ChangeFont()
{
// TODO
// Note that this causes the widget to be resized back
// to its original size! We therefore have to set the size
// back again. TODO: a better way in Motif?
if (m_windowFont.Ok())
{
int width, height, width1, height1;
GetSize(& width, & height);
XmFontList fontList = (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) m_mainWidget));
XtVaSetValues ((Widget) m_mainWidget, XmNfontList, fontList, NULL);
XtVaSetValues ((Widget) m_buttonWidget, XmNfontList, fontList, NULL);
int i;
for (i = 0; i < m_noStrings; i++)
XtVaSetValues ((Widget) m_widgetList[i], XmNfontList, fontList, NULL);
GetSize(& width1, & height1);
if (width != width1 || height != height1)
{
SetSize(-1, -1, width, height);
}
}
}
void wxChoice::ChangeBackgroundColour()
{
// TODO
DoChangeBackgroundColour(m_formWidget, m_backgroundColour);
DoChangeBackgroundColour(m_buttonWidget, m_backgroundColour);
DoChangeBackgroundColour(m_menuWidget, m_backgroundColour);
int i;
for (i = 0; i < m_noStrings; i++)
DoChangeBackgroundColour(m_widgetList[i], m_backgroundColour);
}
void wxChoice::ChangeForegroundColour()
{
// TODO
DoChangeForegroundColour(m_formWidget, m_foregroundColour);
DoChangeForegroundColour(m_buttonWidget, m_foregroundColour);
DoChangeForegroundColour(m_menuWidget, m_foregroundColour);
int i;
for (i = 0; i < m_noStrings; i++)
DoChangeForegroundColour(m_widgetList[i], m_foregroundColour);
}

View File

@@ -209,17 +209,18 @@ void wxComboBoxCallback (Widget w, XtPointer clientData,
void wxComboBox::ChangeFont()
{
// TODO
// Don't use the base class wxChoice's ChangeFont
wxWindow::ChangeFont();
}
void wxComboBox::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxComboBox::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
#endif

View File

@@ -236,6 +236,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
(XtPointer)this);
ChangeBackgroundColour();
SetFont(* parent->GetFont());
return TRUE;
}

View File

@@ -190,17 +190,17 @@ int wxGauge::GetValue() const
void wxGauge::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxGauge::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxGauge::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}
//// PRIVATE DECLARATIONS FOR XMGAUGE

View File

@@ -743,16 +743,16 @@ WXWidget wxListBox::GetTopWidget() const
void wxListBox::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxListBox::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxListBox::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}

View File

@@ -34,8 +34,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl)
wxRadioButton::wxRadioButton()
{
m_labelWidget = (WXWidget) 0;
m_formWidget = (WXWidget) 0;
}
bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
@@ -65,71 +63,28 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
XmString text = XmStringCreateSimple ((char*) (const char*) label1);
Widget formWidget = XtVaCreateManagedWidget ((char*) (const char*) name,
xmFormWidgetClass, parentWidget,
XmNmarginHeight, 0,
XmNmarginWidth, 0,
NULL);
m_formWidget = (WXWidget) formWidget;
Widget labelWidget = XtVaCreateManagedWidget ((char*) (const char*) label1,
#if wxUSE_GADGETS
xmLabelGadgetClass,
formWidget,
#else
xmLabelWidgetClass, formWidget,
#endif
XmNlabelString, text,
NULL);
m_labelWidget = (WXWidget) labelWidget;
/* TODO
if (labelFont)
XtVaSetValues (labelWidget,
XmNfontList, labelFont->GetInternalFont (XtDisplay(formWidget)),
NULL);
*/
XmStringFree (text);
Widget radioButtonWidget = XtVaCreateManagedWidget ("toggle",
#if wxUSE_GADGETS
xmToggleButtonGadgetClass, formWidget,
xmToggleButtonGadgetClass, parentWidget,
#else
xmToggleButtonWidgetClass, formWidget,
xmToggleButtonWidgetClass, parentWidget,
#endif
XmNlabelString, text,
XmNfillOnSelect, True,
XmNindicatorType, XmONE_OF_MANY, // diamond-shape
NULL);
XmStringFree (text);
XtAddCallback (radioButtonWidget, XmNvalueChangedCallback, (XtCallbackProc) wxRadioButtonCallback,
(XtCallbackProc) this);
m_mainWidget = (WXWidget) radioButtonWidget;
/* TODO
if (labelFont)
XtVaSetValues (radioButtonWidget,
XmNfontList, labelFont->GetInternalFont (XtDisplay(formWidget)),
NULL);
*/
if (labelWidget)
XtVaSetValues (labelWidget,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNalignment, XmALIGNMENT_BEGINNING,
NULL);
XtVaSetValues (radioButtonWidget,
XmNleftOffset, 4,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, (Widget) m_labelWidget ? XmATTACH_WIDGET : XmATTACH_FORM,
XmNleftWidget, (Widget) m_labelWidget ? (Widget) m_labelWidget : formWidget,
NULL);
XtManageChild (radioButtonWidget);
SetCanAddEventHandler(TRUE);
AttachWidget (parent, m_mainWidget, m_formWidget, pos.x, pos.y, size.x, size.y);
AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y);
SetFont(* parent->GetFont());
ChangeBackgroundColour();
@@ -158,17 +113,17 @@ void wxRadioButton::Command (wxCommandEvent & event)
void wxRadioButton::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxRadioButton::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxRadioButton::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}
void wxRadioButtonCallback (Widget w, XtPointer clientData,

View File

@@ -249,17 +249,17 @@ void wxSlider::Command (wxCommandEvent & event)
void wxSlider::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxSlider::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxSlider::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}
void wxSliderCallback (Widget widget, XtPointer clientData, XmScaleCallbackStruct * cbs)

View File

@@ -121,16 +121,16 @@ void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap)
void wxStaticBitmap::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxStaticBitmap::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxStaticBitmap::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}

View File

@@ -183,16 +183,16 @@ void wxStaticBox::SetSize(int x, int y, int width, int height, int sizeFlags)
void wxStaticBox::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxStaticBox::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxStaticBox::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}

View File

@@ -76,16 +76,16 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
void wxStaticText::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxStaticText::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxStaticText::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}

View File

@@ -638,17 +638,17 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
void wxTextCtrl::ChangeFont()
{
// TODO
wxWindow::ChangeFont();
}
void wxTextCtrl::ChangeBackgroundColour()
{
// TODO
wxWindow::ChangeBackgroundColour();
}
void wxTextCtrl::ChangeForegroundColour()
{
// TODO
wxWindow::ChangeForegroundColour();
}
static void wxTextWindowChangedProc (Widget w, XtPointer clientData, XtPointer ptr)

View File

@@ -40,8 +40,6 @@ static void wxToolButtonCallback (Widget w, XtPointer clientData,
static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
XEvent *event, Boolean *continue_to_dispatch);
wxBitmap wxCreateMaskedBitmap(wxBitmap& bitmap, wxColour& colour);
class wxToolBarTimer: public wxTimer
{
public:
@@ -446,27 +444,6 @@ void wxToolButtonCallback (Widget w, XtPointer clientData,
}
// Creates a bitmap with transparent areas drawn in
// the given colour.
wxBitmap wxCreateMaskedBitmap(wxBitmap& bitmap, wxColour& colour)
{
wxBitmap newBitmap(bitmap.GetWidth(),
bitmap.GetHeight(),
bitmap.GetDepth());
wxMemoryDC destDC;
wxMemoryDC srcDC;
srcDC.SelectObject(bitmap);
destDC.SelectObject(newBitmap);
wxBrush brush(colour, wxSOLID);
destDC.SetOptimization(FALSE);
destDC.SetBackground(brush);
destDC.Clear();
destDC.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & srcDC, 0, 0, wxCOPY, TRUE);
return newBitmap;
}
static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
XEvent *event, Boolean *continue_to_dispatch)

View File

@@ -3024,8 +3024,6 @@ void wxWindow::ChangeForegroundColour()
// Change a widget's foreground and background colours.
// TODO: make this 2 functions, ChangeForegroundColour and ChangeBackgroundColour.
void wxWindow::DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
{
// When should we specify the foreground, if it's calculated
@@ -3077,7 +3075,6 @@ void wxWindow::ChangeFont()
// Note that this causes the widget to be resized back
// to its original size! We therefore have to set the size
// back again. TODO: a better way in Motif?
/*
Widget w = (Widget) GetLabelWidget(); // Usually the main widget
if (w && m_windowFont.Ok())
{
@@ -3094,7 +3091,6 @@ void wxWindow::ChangeFont()
SetSize(-1, -1, width, height);
}
}
*/
}
void wxWindow::SetFont(const wxFont& font)

View File

@@ -50,6 +50,11 @@ wxWave::wxWave(const wxString& sFileName, bool isResource)
Create(sFileName, isResource);
}
wxWave::wxWave(int size, const byte* data)
: m_waveLength(0), m_isResource(FALSE), m_waveData(NULL)
{
Create(size, data);
}
wxWave::~wxWave()
{
@@ -103,6 +108,19 @@ bool wxWave::Create(const wxString& fileName, bool isResource)
}
}
bool wxWave::Create(int size, const byte* data)
{
Free();
m_isResource = FALSE;
m_waveLength=size;
m_waveData = (byte*)::GlobalLock(::GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, m_waveLength));
if (!m_waveData)
return FALSE;
for (int i=0; i<size; i++) m_waveData[i] = data[i];
return TRUE;
}
bool wxWave::Play(bool async, bool looped) const
{
if (!IsOk())