Home | History | Annotate | Line # | Download | only in menu
tabwindow.cpp revision 1.2.24.1
      1  1.2.24.1  skrll /* -*-C++-*-	$NetBSD: tabwindow.cpp,v 1.2.24.1 2004/08/03 10:34:59 skrll Exp $	*/
      2       1.1    uch 
      3       1.1    uch /*-
      4       1.1    uch  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5       1.1    uch  * All rights reserved.
      6       1.1    uch  *
      7       1.1    uch  * This code is derived from software contributed to The NetBSD Foundation
      8       1.1    uch  * by UCHIYAMA Yasushi.
      9       1.1    uch  *
     10       1.1    uch  * Redistribution and use in source and binary forms, with or without
     11       1.1    uch  * modification, are permitted provided that the following conditions
     12       1.1    uch  * are met:
     13       1.1    uch  * 1. Redistributions of source code must retain the above copyright
     14       1.1    uch  *    notice, this list of conditions and the following disclaimer.
     15       1.1    uch  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1    uch  *    notice, this list of conditions and the following disclaimer in the
     17       1.1    uch  *    documentation and/or other materials provided with the distribution.
     18       1.1    uch  * 3. All advertising materials mentioning features or use of this software
     19       1.1    uch  *    must display the following acknowledgement:
     20       1.1    uch  *        This product includes software developed by the NetBSD
     21       1.1    uch  *        Foundation, Inc. and its contributors.
     22       1.1    uch  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23       1.1    uch  *    contributors may be used to endorse or promote products derived
     24       1.1    uch  *    from this software without specific prior written permission.
     25       1.1    uch  *
     26       1.1    uch  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27       1.1    uch  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28       1.1    uch  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29       1.1    uch  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30       1.1    uch  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31       1.1    uch  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32       1.1    uch  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33       1.1    uch  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34       1.1    uch  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35       1.1    uch  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36       1.1    uch  * POSSIBILITY OF SUCH DAMAGE.
     37       1.1    uch  */
     38       1.1    uch 
     39       1.1    uch #include <hpcmenu.h>
     40       1.1    uch #include <menu/window.h>
     41       1.1    uch #include <menu/tabwindow.h>
     42       1.1    uch #include <res/resource.h>
     43       1.1    uch 
     44       1.1    uch //
     45       1.1    uch // TabControl
     46       1.1    uch //
     47       1.1    uch BOOL
     48       1.1    uch TabWindowBase::create(LPCREATESTRUCT aux)
     49       1.1    uch {
     50       1.1    uch 	int cx = _rect.right - _rect.left;
     51       1.1    uch 	int cy = _rect.bottom - _rect.top;
     52       1.1    uch 	_window = CreateWindow(WC_TABCONTROL, L"",
     53       1.2    uch 	    WS_CHILD | WS_VISIBLE | WS_TABSTOP |
     54       1.2    uch 	    WS_CLIPSIBLINGS | TCS_MULTILINE | TCS_VERTICAL,
     55       1.2    uch 	    _rect.left, _rect.top, cx, cy, _parent_window,
     56       1.2    uch 	    reinterpret_cast <HMENU>(_id), aux->hInstance,
     57       1.2    uch 	    NULL); // this is system window class
     58       1.1    uch 
     59       1.1    uch 	if (!IsWindow(_window))
     60       1.1    uch 		return FALSE;
     61       1.1    uch 
     62       1.1    uch 	// set tab image.
     63       1.1    uch 	HIMAGELIST img = ImageList_Create(TABCTRL_TAB_IMAGE_WIDTH,
     64       1.2    uch 	    TABCTRL_TAB_IMAGE_HEIGHT,
     65       1.2    uch 	    ILC_COLOR, 3, 0);
     66       1.1    uch 	_load_bitmap(img, L"IDI_HPCMENU_MAIN");
     67       1.1    uch 	_load_bitmap(img, L"IDI_HPCMENU_OPTION");
     68       1.1    uch 	_load_bitmap(img, L"IDI_HPCMENU_CONSOLE");
     69       1.1    uch 
     70       1.1    uch 	TabCtrl_SetPadding(_window, 1, 1);
     71       1.1    uch 	TabCtrl_SetImageList(_window, img);
     72       1.1    uch 
     73       1.1    uch 	return TRUE;
     74       1.1    uch }
     75       1.1    uch 
     76       1.1    uch void
     77       1.1    uch TabWindowBase::_load_bitmap(HIMAGELIST img, const TCHAR *name)
     78       1.1    uch {
     79       1.1    uch 	HBITMAP bmp = LoadBitmap(_app._instance, name);
     80       1.1    uch 	ImageList_Add(img, bmp, 0);
     81       1.1    uch 	DeleteObject(bmp);
     82       1.1    uch }
     83       1.1    uch 
     84  1.2.24.1  skrll BOOL
     85  1.2.24.1  skrll TabWindowBase::focusManagerHook(WORD vk, UINT flags, HWND prev)
     86  1.2.24.1  skrll {
     87  1.2.24.1  skrll 	int direction = 0;
     88  1.2.24.1  skrll 
     89  1.2.24.1  skrll 	// NB: VK_UP/VK_DOWN move between tabs
     90  1.2.24.1  skrll 	switch (vk) {
     91  1.2.24.1  skrll 	case VK_RIGHT:
     92  1.2.24.1  skrll 		direction = 1;	// next
     93  1.2.24.1  skrll 		break;
     94  1.2.24.1  skrll 
     95  1.2.24.1  skrll 	case VK_LEFT:
     96  1.2.24.1  skrll 		direction = -1;	// prev
     97  1.2.24.1  skrll 		break;
     98  1.2.24.1  skrll 
     99  1.2.24.1  skrll 	case VK_TAB:
    100  1.2.24.1  skrll 		if (GetKeyState(VK_SHIFT) & 0x8000) // Shift-Tab
    101  1.2.24.1  skrll 			direction = -1;	// prev
    102  1.2.24.1  skrll 		else
    103  1.2.24.1  skrll 			direction = 1; // next
    104  1.2.24.1  skrll 		break;
    105  1.2.24.1  skrll 	}
    106  1.2.24.1  skrll 
    107  1.2.24.1  skrll 	if (!direction)
    108  1.2.24.1  skrll 		return FALSE;
    109  1.2.24.1  skrll 
    110  1.2.24.1  skrll 	HWND dst;
    111  1.2.24.1  skrll 
    112  1.2.24.1  skrll 	if (direction > 0) {	// next - into the current dialog
    113  1.2.24.1  skrll 		int tab_id = TabCtrl_GetCurSel(_window);
    114  1.2.24.1  skrll 
    115  1.2.24.1  skrll 		TC_ITEM tc_item;
    116  1.2.24.1  skrll 		tc_item.mask = TCIF_PARAM;
    117  1.2.24.1  skrll 		TabCtrl_GetItem(_window, tab_id, &tc_item);
    118  1.2.24.1  skrll 		TabWindow *tab = reinterpret_cast <TabWindow *>
    119  1.2.24.1  skrll 		    (tc_item.lParam);
    120  1.2.24.1  skrll 
    121  1.2.24.1  skrll 		dst = GetNextDlgTabItem(tab->_window, NULL, FALSE);
    122  1.2.24.1  skrll 	} else {		// prev - to the button in the root
    123  1.2.24.1  skrll 		dst = prev;
    124  1.2.24.1  skrll 	}
    125  1.2.24.1  skrll 
    126  1.2.24.1  skrll 	SetFocus(dst);
    127  1.2.24.1  skrll 	return TRUE;
    128  1.2.24.1  skrll }
    129  1.2.24.1  skrll 
    130  1.2.24.1  skrll 
    131       1.1    uch //
    132       1.1    uch // Child of TabControl(Dialog)
    133       1.1    uch //
    134       1.1    uch BOOL
    135       1.1    uch TabWindow::create(LPCREATESTRUCT unused)
    136       1.1    uch {
    137       1.1    uch 	_window = CreateDialogParam
    138       1.2    uch 	    (_app._instance, _name, _base._window,
    139       1.2    uch 		reinterpret_cast <DLGPROC>(Window::_dlg_proc),
    140       1.2    uch 		reinterpret_cast <LPARAM>(this));
    141       1.1    uch 
    142       1.1    uch 	return _window ? TRUE : FALSE;
    143       1.1    uch }
    144       1.1    uch 
    145       1.1    uch BOOL
    146       1.1    uch TabWindow::proc(HWND w, UINT msg, WPARAM wparam, LPARAM lparam)
    147       1.1    uch {
    148       1.1    uch 	switch(msg) {
    149       1.1    uch 	default:
    150       1.1    uch 		return FALSE;
    151       1.1    uch 	case WM_INITDIALOG:
    152       1.1    uch 		init(w);
    153       1.1    uch 		break;
    154       1.1    uch 	case WM_COMMAND:
    155       1.1    uch 		command(LOWORD(wparam), HIWORD(wparam));
    156       1.1    uch 		break;
    157       1.1    uch 	}
    158       1.1    uch 	return TRUE;
    159       1.1    uch }
    160       1.1    uch 
    161       1.1    uch void
    162       1.1    uch TabWindow::init(HWND w)
    163       1.1    uch {
    164       1.1    uch 	TC_ITEM item;
    165       1.1    uch 
    166       1.1    uch 	item.mask = TCIF_PARAM | TCIF_IMAGE;
    167       1.1    uch 	item.iImage =(int)_id;
    168       1.1    uch 	item.lParam = reinterpret_cast <LPARAM>(this);
    169       1.1    uch 	// register myself to parent tab-control.
    170       1.1    uch 	_base.insert(_id, item);
    171       1.1    uch 	// fit my dialog size to tab-control window.
    172       1.1    uch 	_base.adjust(_rect);
    173       1.1    uch 	hide();
    174       1.1    uch }
    175       1.1    uch 
    176       1.1    uch BOOL
    177       1.1    uch TabWindow::_is_checked(int id)
    178       1.1    uch {
    179       1.1    uch 	return SendDlgItemMessage(_window, id, BM_GETCHECK, 0, 0)
    180       1.2    uch 	    ? TRUE : FALSE;
    181       1.1    uch }
    182       1.1    uch 
    183       1.1    uch void
    184       1.1    uch TabWindow::_set_check(int id, BOOL onoff)
    185       1.1    uch {
    186       1.1    uch 	SendDlgItemMessage(_window, id, BM_SETCHECK,
    187       1.2    uch 	    onoff ? BST_CHECKED : BST_UNCHECKED, 0);
    188       1.1    uch }
    189