]> git.saurik.com Git - wxWidgets.git/blame - src/msw/tabctrl.cpp
Now allow SetMenuBar to be called several times.
[wxWidgets.git] / src / msw / tabctrl.cpp
CommitLineData
2bda0e17
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: tabctrl.cpp
3// Purpose: wxTabCtrl
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
42e69d6b 9// Licence: wxWindows license
2bda0e17
KB
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "tabctrl.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
2432b92d 24#include "wx/wx.h"
2bda0e17
KB
25#endif
26
27#if defined(__WIN95__)
28
ce3ed50d 29#if !defined(__GNUWIN32__) && !defined(__SALFORDC__)
2bda0e17
KB
30#include "malloc.h"
31#endif
32
33#include <windows.h>
34
65fd5cb0 35#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
2bda0e17
KB
36#include <commctrl.h>
37#endif
38
57c208c5 39#ifndef __TWIN32__
2bda0e17 40#ifdef __GNUWIN32__
65fd5cb0 41#ifndef wxUSE_NORLANDER_HEADERS
2bda0e17
KB
42#include "wx/msw/gnuwin32/extra.h"
43#endif
57c208c5 44#endif
65fd5cb0 45#endif
2bda0e17
KB
46
47#include "wx/msw/dib.h"
48#include "wx/msw/tabctrl.h"
49#include "wx/app.h"
50#include "wx/msw/private.h"
51#include "wx/msw/imaglist.h"
52
53#if !USE_SHARED_LIBRARY
54IMPLEMENT_DYNAMIC_CLASS(wxTabCtrl, wxControl)
55
56BEGIN_EVENT_TABLE(wxTabCtrl, wxControl)
2bda0e17
KB
57 EVT_SYS_COLOUR_CHANGED(wxTabCtrl::OnSysColourChanged)
58END_EVENT_TABLE()
59#endif
60
ee4f8c2a 61wxTabCtrl::wxTabCtrl()
2bda0e17
KB
62{
63 m_imageList = NULL;
64}
65
ee4f8c2a
JS
66bool wxTabCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
67 long style, const wxString& name)
2bda0e17
KB
68{
69 m_imageList = NULL;
70
71 m_backgroundColour = wxColour(GetRValue(GetSysColor(COLOR_BTNFACE)),
42e69d6b 72 GetGValue(GetSysColor(COLOR_BTNFACE)), GetBValue(GetSysColor(COLOR_BTNFACE)));
2bda0e17
KB
73 m_foregroundColour = *wxBLACK ;
74
2bda0e17
KB
75 SetName(name);
76
77 int x = pos.x;
78 int y = pos.y;
79 int width = size.x;
80 int height = size.y;
81
82 m_windowStyle = style;
83
84 SetFont(* (wxTheFontList->FindOrCreateFont(11, wxSWISS, wxNORMAL, wxNORMAL)));
85
86 SetParent(parent);
87
88 DWORD msflags = 0;
89 if (style & wxBORDER)
90 msflags |= WS_BORDER;
91 msflags |= WS_CHILD | WS_VISIBLE;
92
93 if (width <= 0)
94 width = 100;
95 if (height <= 0)
96 height = 30;
97 if (x < 0)
98 x = 0;
99 if (y < 0)
100 y = 0;
101
102 m_windowId = (id < 0 ? NewControlId() : id);
103
104 long tabStyle = 0;
105 if (m_windowStyle & wxTC_MULTILINE)
106 tabStyle |= TCS_MULTILINE;
107 if (m_windowStyle & wxTC_RIGHTJUSTIFY)
108 tabStyle |= TCS_RIGHTJUSTIFY;
109 if (m_windowStyle & wxTC_FIXEDWIDTH)
110 tabStyle |= TCS_FIXEDWIDTH;
111 if (m_windowStyle & wxTC_OWNERDRAW)
112 tabStyle |= TCS_OWNERDRAWFIXED;
113
114 tabStyle |= TCS_TOOLTIPS;
115
116 // Create the toolbar control.
117 HWND hWndTabCtrl = CreateWindowEx(0L, // No extended styles.
118 WC_TABCONTROL, // Class name for the tab control
223d09f6 119 wxT(""), // No default text.
2bda0e17
KB
120 WS_CHILD | WS_BORDER | WS_VISIBLE | tabStyle, // Styles and defaults.
121 x, y, width, height, // Standard size and position.
122 (HWND) parent->GetHWND(), // Parent window
123 (HMENU)m_windowId, // ID.
124 wxGetInstance(), // Current instance.
125 NULL ); // No class data.
126
127 m_hWnd = (WXHWND) hWndTabCtrl;
128 if (parent) parent->AddChild(this);
129
130 SubclassWin((WXHWND) hWndTabCtrl);
131
132 return TRUE;
133}
134
ee4f8c2a 135wxTabCtrl::~wxTabCtrl()
2bda0e17
KB
136{
137 UnsubclassWin();
138}
139
a23fd0e1 140bool wxTabCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
2bda0e17 141{
42e69d6b
VZ
142 wxTabEvent event(wxEVT_NULL, m_windowId);
143 wxEventType eventType = wxEVT_NULL;
144 NMHDR* hdr1 = (NMHDR*) lParam;
145 switch ( hdr1->code )
146 {
147 case TCN_SELCHANGE:
148 eventType = wxEVT_COMMAND_TAB_SEL_CHANGED;
149 break;
150
151 case TCN_SELCHANGING:
152 eventType = wxEVT_COMMAND_TAB_SEL_CHANGING;
153 break;
fd3f686c 154
2bda0e17
KB
155 case TTN_NEEDTEXT:
156 {
157 // TODO
158// if (tool->m_shortHelpString != "")
159// ttText->lpszText = (char *) (const char *)tool->m_shortHelpString;
2bda0e17
KB
160 }
161
42e69d6b
VZ
162 default :
163 return wxControl::MSWOnNotify(idCtrl, lParam, result);
164 }
2bda0e17 165
42e69d6b
VZ
166 event.SetEventObject( this );
167 event.SetEventType(eventType);
168 event.SetInt(idCtrl) ;
2bda0e17 169
42e69d6b 170 return ProcessEvent(event);
2bda0e17
KB
171}
172
173// Responds to colour changes, and passes event on to children.
174void wxTabCtrl::OnSysColourChanged(wxSysColourChangedEvent& event)
175{
176 m_backgroundColour = wxColour(GetRValue(GetSysColor(COLOR_BTNFACE)),
42e69d6b
VZ
177 GetGValue(GetSysColor(COLOR_BTNFACE)),
178 GetBValue(GetSysColor(COLOR_BTNFACE)));
2bda0e17
KB
179
180 Refresh();
181
182 // Propagate the event to the non-top-level children
183 wxWindow::OnSysColourChanged(event);
184}
185
186// Delete all items
ee4f8c2a 187bool wxTabCtrl::DeleteAllItems()
2bda0e17
KB
188{
189 return ( TabCtrl_DeleteAllItems( (HWND) GetHWND() ) != FALSE );
190}
191
192// Delete an item
ee4f8c2a 193bool wxTabCtrl::DeleteItem(int item)
2bda0e17
KB
194{
195 return ( TabCtrl_DeleteItem( (HWND) GetHWND(), item) != FALSE );
196}
197
198// Get the selection
ee4f8c2a 199int wxTabCtrl::GetSelection() const
2bda0e17
KB
200{
201 return (int) TabCtrl_GetCurSel( (HWND) GetHWND() );
202}
203
da87a1ca
JS
204// Get the tab with the current keyboard focus
205int wxTabCtrl::GetCurFocus() const
206{
207 return (int) TabCtrl_GetCurFocus( (HWND) GetHWND() );
208}
209
2bda0e17 210// Get the associated image list
ee4f8c2a 211wxImageList* wxTabCtrl::GetImageList() const
2bda0e17
KB
212{
213 return m_imageList;
214}
215
216// Get the number of items
ee4f8c2a 217int wxTabCtrl::GetItemCount() const
2bda0e17
KB
218{
219 return (int) TabCtrl_GetItemCount( (HWND) GetHWND() );
220}
221
222// Get the rect corresponding to the tab
ee4f8c2a 223bool wxTabCtrl::GetItemRect(int item, wxRect& wxrect) const
2bda0e17
KB
224{
225 RECT rect;
226 if ( !TabCtrl_GetItemRect( (HWND) GetHWND(), item, & rect) )
227 return FALSE;
228 else
229 {
230 wxrect.x = rect.left; wxrect.y = rect.top;
231 wxrect.width = rect.right - rect.left;
232 wxrect.height = rect.bottom - rect.top;
233 return TRUE;
234 }
235}
236
237// Get the number of rows
ee4f8c2a 238int wxTabCtrl::GetRowCount() const
2bda0e17
KB
239{
240 return (int) TabCtrl_GetRowCount( (HWND) GetHWND() );
241}
242
243// Get the item text
ee4f8c2a 244wxString wxTabCtrl::GetItemText(int item) const
2bda0e17 245{
837e5743 246 wxChar buf[256];
223d09f6 247 wxString str(wxT(""));
2bda0e17
KB
248 TC_ITEM tcItem;
249 tcItem.mask = TCIF_TEXT;
250 tcItem.pszText = buf;
251 tcItem.cchTextMax = 256;
252
253 if (TabCtrl_GetItem( (HWND) GetHWND(), item, & tcItem) )
254 str = tcItem.pszText;
255
256 return str;
257}
258
259// Get the item image
ee4f8c2a 260int wxTabCtrl::GetItemImage(int item) const
2bda0e17
KB
261{
262 TC_ITEM tcItem;
263 tcItem.mask = TCIF_IMAGE;
264
265 if (TabCtrl_GetItem( (HWND) GetHWND(), item, & tcItem) )
266 return tcItem.iImage;
267 else
268 return -1;
269}
270
271// Get the item data
ee4f8c2a 272void* wxTabCtrl::GetItemData(int item) const
2bda0e17
KB
273{
274 TC_ITEM tcItem;
275 tcItem.mask = TCIF_PARAM;
276
277 if (TabCtrl_GetItem( (HWND) GetHWND(), item, & tcItem) )
278 return (void*) tcItem.lParam;
279 else
280 return 0;
281}
282
283// Hit test
284int wxTabCtrl::HitTest(const wxPoint& pt, long& flags)
285{
286 TC_HITTESTINFO hitTestInfo;
287 hitTestInfo.pt.x = pt.x;
288 hitTestInfo.pt.y = pt.y;
289 int item = TabCtrl_HitTest( (HWND) GetHWND(), & hitTestInfo ) ;
290 flags = 0;
291
292 if ((hitTestInfo.flags & TCHT_NOWHERE) == TCHT_NOWHERE)
293 flags |= wxTAB_HITTEST_NOWHERE;
294 if ((hitTestInfo.flags & TCHT_ONITEMICON) == TCHT_ONITEMICON)
295 flags |= wxTAB_HITTEST_ONICON;
296 if ((hitTestInfo.flags & TCHT_ONITEMLABEL) == TCHT_ONITEMLABEL)
297 flags |= wxTAB_HITTEST_ONLABEL;
298
299 return item;
300}
301
302// Insert an item
ee4f8c2a 303bool wxTabCtrl::InsertItem(int item, const wxString& text, int imageId, void* data)
2bda0e17 304{
837e5743 305 wxChar buf[256];
2bda0e17
KB
306 TC_ITEM tcItem;
307 tcItem.mask = TCIF_PARAM;
308 tcItem.lParam = (long) data;
223d09f6 309 if (text != wxT(""))
2bda0e17
KB
310 {
311 tcItem.mask |= TCIF_TEXT;
837e5743 312 wxStrcpy(buf, (const wxChar*) text);
2bda0e17
KB
313 tcItem.pszText = buf;
314 tcItem.cchTextMax = 256;
315 }
316 if (imageId != -1)
317 {
318 tcItem.mask |= TCIF_IMAGE;
319 tcItem.iImage = imageId;
320 }
321
ee4f8c2a 322 return (TabCtrl_InsertItem( (HWND) GetHWND(), item, & tcItem) != -1);
2bda0e17
KB
323}
324
325// Set the selection
ee4f8c2a 326int wxTabCtrl::SetSelection(int item)
2bda0e17
KB
327{
328 return (int) TabCtrl_SetCurSel( (HWND) GetHWND(), item );
329}
330
331// Set the image list
332void wxTabCtrl::SetImageList(wxImageList* imageList)
333{
334 m_imageList = imageList;
335 TabCtrl_SetImageList( (HWND) GetHWND(), (HIMAGELIST) imageList->GetHIMAGELIST() );
336}
337
338// Set the text for an item
ee4f8c2a 339bool wxTabCtrl::SetItemText(int item, const wxString& text)
2bda0e17 340{
837e5743 341 wxChar buf[256];
2bda0e17
KB
342 TC_ITEM tcItem;
343 tcItem.mask = TCIF_TEXT;
837e5743 344 wxStrcpy(buf, (const wxChar*) text);
2bda0e17
KB
345 tcItem.pszText = buf;
346 tcItem.cchTextMax = 256;
347
348 return ( TabCtrl_SetItem( (HWND) GetHWND(), item, & tcItem) != 0 );
349}
350
351// Set the image for an item
ee4f8c2a 352bool wxTabCtrl::SetItemImage(int item, int image)
2bda0e17
KB
353{
354 TC_ITEM tcItem;
355 tcItem.mask = TCIF_IMAGE;
356 tcItem.iImage = image;
357
358 return ( TabCtrl_SetItem( (HWND) GetHWND(), item, & tcItem) != 0 );
359}
360
361// Set the data for an item
ee4f8c2a 362bool wxTabCtrl::SetItemData(int item, void* data)
2bda0e17
KB
363{
364 TC_ITEM tcItem;
365 tcItem.mask = TCIF_PARAM;
366 tcItem.lParam = (long) data;
367
368 return ( TabCtrl_SetItem( (HWND) GetHWND(), item, & tcItem) != 0 );
369}
370
371// Set the size for a fixed-width tab control
372void wxTabCtrl::SetItemSize(const wxSize& size)
373{
374 TabCtrl_SetItemSize( (HWND) GetHWND(), size.x, size.y );
375}
376
377// Set the padding between tabs
378void wxTabCtrl::SetPadding(const wxSize& padding)
379{
380 TabCtrl_SetPadding( (HWND) GetHWND(), padding.x, padding.y );
381}
382
383#if 0
384// These are the default colors used to map the bitmap colors
385// to the current system colors
386
387#define BGR_BUTTONTEXT (RGB(000,000,000)) // black
388#define BGR_BUTTONSHADOW (RGB(128,128,128)) // dark grey
389#define BGR_BUTTONFACE (RGB(192,192,192)) // bright grey
390#define BGR_BUTTONHILIGHT (RGB(255,255,255)) // white
391#define BGR_BACKGROUNDSEL (RGB(255,000,000)) // blue
392#define BGR_BACKGROUND (RGB(255,000,255)) // magenta
393
394void wxMapBitmap(HBITMAP hBitmap, int width, int height)
395{
396 COLORMAP ColorMap[] = {
397 {BGR_BUTTONTEXT, COLOR_BTNTEXT}, // black
398 {BGR_BUTTONSHADOW, COLOR_BTNSHADOW}, // dark grey
399 {BGR_BUTTONFACE, COLOR_BTNFACE}, // bright grey
400 {BGR_BUTTONHILIGHT, COLOR_BTNHIGHLIGHT},// white
401 {BGR_BACKGROUNDSEL, COLOR_HIGHLIGHT}, // blue
402 {BGR_BACKGROUND, COLOR_WINDOW} // magenta
403 };
404
405 int NUM_MAPS = (sizeof(ColorMap)/sizeof(COLORMAP));
406 int n;
407 for ( n = 0; n < NUM_MAPS; n++)
408 {
409 ColorMap[n].to = ::GetSysColor(ColorMap[n].to);
410 }
411
412 HBITMAP hbmOld;
413 HDC hdcMem = CreateCompatibleDC(NULL);
414
415 if (hdcMem)
416 {
417 hbmOld = SelectObject(hdcMem, hBitmap);
418
419 int i, j, k;
420 for ( i = 0; i < width; i++)
421 {
422 for ( j = 0; j < height; j++)
423 {
424 COLORREF pixel = ::GetPixel(hdcMem, i, j);
425/*
426 BYTE red = GetRValue(pixel);
427 BYTE green = GetGValue(pixel);
428 BYTE blue = GetBValue(pixel);
429*/
430
431 for ( k = 0; k < NUM_MAPS; k ++)
432 {
433 if ( ColorMap[k].from == pixel )
434 {
435 /* COLORREF actualPixel = */ ::SetPixel(hdcMem, i, j, ColorMap[k].to);
436 break;
437 }
438 }
439 }
440 }
441
442
443 SelectObject(hdcMem, hbmOld);
444 DeleteObject(hdcMem);
445 }
446
447}
448#endif
449
450// Tab event
451IMPLEMENT_DYNAMIC_CLASS(wxTabEvent, wxCommandEvent)
452
7798a18e 453wxTabEvent::wxTabEvent(wxEventType commandType, int id):
2bda0e17
KB
454 wxCommandEvent(commandType, id)
455{
456}
457
458
459#endif
460 // __WIN95__