blob: 1bbba30a8cef1bea4216a9f93349c19bea17e922 [file] [log] [blame]
/* Copyright (C) 2004 TightVNC Team. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
// -=- ToolBar control class.
#include "ToolBar.h"
using namespace rfb::win32;
ToolBar::ToolBar() : hwndToolBar(0), tbID(-1) {
INITCOMMONCONTROLSEX icex;
// Ensure that the common control DLL is loaded
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&icex);
}
ToolBar::~ToolBar() {
DestroyWindow(getHandle());
}
bool ToolBar::create(int _tbID, HWND _parentHwnd, DWORD dwStyle) {
parentHwnd = _parentHwnd;
dwStyle |= WS_CHILD;
// Create the ToolBar window
hwndToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, 0, dwStyle,
0, 0, 25, 25, parentHwnd, (HMENU)_tbID, GetModuleHandle(0), 0);
if (hwndToolBar) {
tbID = _tbID;
// It's required for backward compatibility
SendMessage(hwndToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
}
return (hwndToolBar ? true : false);
};
int ToolBar::addBitmap(int nButtons, UINT bitmapID) {
assert(nButtons > 0);
TBADDBITMAP resBitmap;
resBitmap.hInst = GetModuleHandle(0);
resBitmap.nID = bitmapID;
return SendMessage(getHandle(), TB_ADDBITMAP, nButtons, (LPARAM)&resBitmap);
}
int ToolBar::addSystemBitmap(UINT stdBitmapID) {
TBADDBITMAP resBitmap;
resBitmap.hInst = HINST_COMMCTRL;
resBitmap.nID = stdBitmapID;
return SendMessage(getHandle(), TB_ADDBITMAP, 0, (LPARAM)&resBitmap);
}
bool ToolBar::setBitmapSize(int width, int height) {
int result = SendMessage(getHandle(), TB_SETBITMAPSIZE,
0, MAKELONG(width, height));
return (result ? true : false);
}
bool ToolBar::addButton(int iBitmap, int idCommand, BYTE state, BYTE style, UINT dwData, int iString) {
TBBUTTON tbb;
tbb.iBitmap = iBitmap;
tbb.idCommand = idCommand;
tbb.fsState = state;
tbb.fsStyle = style;
tbb.dwData = dwData;
tbb.iString = iString;
int result = SendMessage(getHandle(), TB_ADDBUTTONS, 1, (LPARAM)&tbb);
if (result) {
SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
}
return (result ? true : false);
}
bool ToolBar::addNButton(int nButtons, LPTBBUTTON tbb) {
assert(nButtons > 0);
assert(tbb > 0);
int result = SendMessage(getHandle(), TB_ADDBUTTONS, nButtons, (LPARAM)tbb);
if (result) {
SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
}
return (result ? true : false);
}
bool ToolBar::deleteButton(int indexButton) {
assert(indexButton >= 0);
int result = SendMessage(getHandle(), TB_DELETEBUTTON, indexButton, 0);
if (result) {
SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
}
return (result ? true : false);
}
bool ToolBar::insertButton(int indexButton, LPTBBUTTON tbb) {
assert(indexButton >= 0);
assert(tbb > 0);
int result = SendMessage(getHandle(), TB_INSERTBUTTON,
indexButton, (LPARAM)tbb);
if (result) {
SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
}
return (result ? true : false);
}
int ToolBar::getButtonInfo(int idButton, TBBUTTONINFO *btnInfo) {
assert(idButton >= 0);
assert(btnInfo > 0);
return SendMessage(getHandle(), TB_GETBUTTONINFO, idButton, (LPARAM)btnInfo);
}
int ToolBar::getButtonsHeight() {
return HIWORD(SendMessage(getHandle(), TB_GETBUTTONSIZE, 0, 0));
}
int ToolBar::getButtonsWidth() {
return LOWORD(SendMessage(getHandle(), TB_GETBUTTONSIZE, 0, 0));
}
bool ToolBar::setButtonInfo(int idButton, TBBUTTONINFO* btnInfo) {
assert(idButton >= 0);
assert(btnInfo > 0);
int result = SendMessage(getHandle(), TB_SETBUTTONINFO,
idButton, (LPARAM)(LPTBBUTTONINFO)btnInfo);
return (result ? true : false);
}
bool ToolBar::checkButton(int idButton, bool check) {
assert(idButton >= 0);
int result = SendMessage(getHandle(), TB_CHECKBUTTON,
idButton, MAKELONG(check, 0));
return (result ? true : false);
}
bool ToolBar::enableButton(int idButton, bool enable) {
assert(idButton >= 0);
int result = SendMessage(getHandle(), TB_ENABLEBUTTON,
idButton, MAKELONG(enable, 0));
return (result ? true : false);
}
bool ToolBar::pressButton(int idButton, bool press) {
assert(idButton >= 0);
int result = SendMessage(getHandle(), TB_PRESSBUTTON,
idButton, MAKELONG(press, 0));
return (result ? true : false);
}
bool ToolBar::getButtonRect(int nIndex, LPRECT buttonRect) {
int result = SendMessage(getHandle(), TB_GETITEMRECT,
nIndex, (LPARAM)buttonRect);
return (result ? true : false);
}
bool ToolBar::setButtonSize(int width, int height) {
assert(width > 0);
assert(height > 0);
int result = SendMessage(getHandle(), TB_SETBUTTONSIZE,
0, MAKELONG(width, height));
if (result) {
SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
return true;
}
return false;
}
void ToolBar::autoSize() {
DWORD style = SendMessage(getHandle(), TB_GETSTYLE, 0, 0);
if (style & CCS_NORESIZE) {
RECT r, btnRect;
GetClientRect(parentHwnd, &r);
getButtonRect(0, &btnRect);
int height = getButtonsHeight() + btnRect.top * 2 + 2;
SetWindowPos(getHandle(), HWND_TOP, 0, 0, r.right - r.left, height,
SWP_NOMOVE);
} else {
SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
}
}
int ToolBar::getHeight() {
RECT r;
GetWindowRect(getHandle(), &r);
return r.bottom - r.top;
}
int ToolBar::getTotalWidth() {
SIZE size;
SendMessage(getHandle(), TB_GETMAXSIZE, 0, (LPARAM)(LPSIZE)&size);
return size.cx;
}
void ToolBar::show() {
ShowWindow(getHandle(), SW_SHOW);
}
void ToolBar::hide() {
ShowWindow(getHandle(), SW_HIDE);
}
bool ToolBar::isVisible() {
DWORD style = GetWindowLong(getHandle(), GWL_STYLE);
return (bool)(style & WS_VISIBLE);
}