]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/msw/tabctrl.cpp
set tooltip to be TOPMOST
[wxWidgets.git] / src / msw / tabctrl.cpp
... / ...
CommitLineData
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
9// Licence: wxWindows license
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
24#include "wx/wx.h"
25#endif
26
27#if defined(__WIN95__)
28
29#if !defined(__GNUWIN32__) && !defined(__SALFORDC__)
30#include "malloc.h"
31#endif
32
33#include <windows.h>
34
35#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
36#include <commctrl.h>
37#endif
38
39#ifndef __TWIN32__
40#ifdef __GNUWIN32__
41#ifndef wxUSE_NORLANDER_HEADERS
42#include "wx/msw/gnuwin32/extra.h"
43#endif
44#endif
45#endif
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)
57 EVT_SYS_COLOUR_CHANGED(wxTabCtrl::OnSysColourChanged)
58END_EVENT_TABLE()
59#endif
60
61wxTabCtrl::wxTabCtrl()
62{
63 m_imageList = NULL;
64}
65
66bool wxTabCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
67 long style, const wxString& name)
68{
69 m_imageList = NULL;
70
71 m_backgroundColour = wxColour(GetRValue(GetSysColor(COLOR_BTNFACE)),
72 GetGValue(GetSysColor(COLOR_BTNFACE)), GetBValue(GetSysColor(COLOR_BTNFACE)));
73 m_foregroundColour = *wxBLACK ;
74
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
119 _T(""), // No default text.
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
135wxTabCtrl::~wxTabCtrl()
136{
137 UnsubclassWin();
138}
139
140bool wxTabCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
141{
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;
154
155 case TTN_NEEDTEXT:
156 {
157 // TODO
158// if (tool->m_shortHelpString != "")
159// ttText->lpszText = (char *) (const char *)tool->m_shortHelpString;
160 }
161
162 default :
163 return wxControl::MSWOnNotify(idCtrl, lParam, result);
164 }
165
166 event.SetEventObject( this );
167 event.SetEventType(eventType);
168 event.SetInt(idCtrl) ;
169
170 return ProcessEvent(event);
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)),
177 GetGValue(GetSysColor(COLOR_BTNFACE)),
178 GetBValue(GetSysColor(COLOR_BTNFACE)));
179
180 Refresh();
181
182 // Propagate the event to the non-top-level children
183 wxWindow::OnSysColourChanged(event);
184}
185
186// Delete all items
187bool wxTabCtrl::DeleteAllItems()
188{
189 return ( TabCtrl_DeleteAllItems( (HWND) GetHWND() ) != FALSE );
190}
191
192// Delete an item
193bool wxTabCtrl::DeleteItem(int item)
194{
195 return ( TabCtrl_DeleteItem( (HWND) GetHWND(), item) != FALSE );
196}
197
198// Get the selection
199int wxTabCtrl::GetSelection() const
200{
201 return (int) TabCtrl_GetCurSel( (HWND) GetHWND() );
202}
203
204// Get the tab with the current keyboard focus
205int wxTabCtrl::GetCurFocus() const
206{
207 return (int) TabCtrl_GetCurFocus( (HWND) GetHWND() );
208}
209
210// Get the associated image list
211wxImageList* wxTabCtrl::GetImageList() const
212{
213 return m_imageList;
214}
215
216// Get the number of items
217int wxTabCtrl::GetItemCount() const
218{
219 return (int) TabCtrl_GetItemCount( (HWND) GetHWND() );
220}
221
222// Get the rect corresponding to the tab
223bool wxTabCtrl::GetItemRect(int item, wxRect& wxrect) const
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
238int wxTabCtrl::GetRowCount() const
239{
240 return (int) TabCtrl_GetRowCount( (HWND) GetHWND() );
241}
242
243// Get the item text
244wxString wxTabCtrl::GetItemText(int item) const
245{
246 wxChar buf[256];
247 wxString str(_T(""));
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
260int wxTabCtrl::GetItemImage(int item) const
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
272void* wxTabCtrl::GetItemData(int item) const
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
303bool wxTabCtrl::InsertItem(int item, const wxString& text, int imageId, void* data)
304{
305 wxChar buf[256];
306 TC_ITEM tcItem;
307 tcItem.mask = TCIF_PARAM;
308 tcItem.lParam = (long) data;
309 if (text != _T(""))
310 {
311 tcItem.mask |= TCIF_TEXT;
312 wxStrcpy(buf, (const wxChar*) text);
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
322 return (TabCtrl_InsertItem( (HWND) GetHWND(), item, & tcItem) != -1);
323}
324
325// Set the selection
326int wxTabCtrl::SetSelection(int item)
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
339bool wxTabCtrl::SetItemText(int item, const wxString& text)
340{
341 wxChar buf[256];
342 TC_ITEM tcItem;
343 tcItem.mask = TCIF_TEXT;
344 wxStrcpy(buf, (const wxChar*) text);
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
352bool wxTabCtrl::SetItemImage(int item, int image)
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
362bool wxTabCtrl::SetItemData(int item, void* data)
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
453wxTabEvent::wxTabEvent(wxEventType commandType, int id):
454 wxCommandEvent(commandType, id)
455{
456}
457
458
459#endif
460 // __WIN95__