ultimatepp/uppsrc/CtrlLib/TrayIconWin32.cpp
mdelfede d2b54f7989 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

190 lines
3.1 KiB
C++

#include "CtrlLib.h"
#ifdef PLATFORM_WIN32
#ifndef PLATFORM_WINCE
#include <commdlg.h>
#include <cderr.h>
#include <ShellApi.h>
#endif
#endif
NAMESPACE_UPP
#ifdef PLATFORM_WIN32
#ifndef PLATFORM_WINCE
#define LLOG(x)
enum {
UM_TASKBAR_ = WM_USER + 1024,
NIN_BALLOONSHOW_ = WM_USER + 2,
NIN_BALLOONHIDE_ = WM_USER + 3,
NIN_BALLOONTIMEOUT_ = WM_USER + 4,
NIN_BALLOONUSERCLICK_ = WM_USER + 5,
};
TrayIcon::TrayIcon()
{
Create(NULL, WS_POPUP, 0, false, 0, 0);
Ctrl::Hide();
Zero(nid);
nid.sz = IsWin2K() ? sizeof(NotifyIconNew) : sizeof(NotifyIconOld);
nid.message = UM_TASKBAR_;
nid.hwnd = GetHWND();
static int id;
nid.id = ++id;
visible = false;
Show();
}
TrayIcon::~TrayIcon()
{
Hide();
if(nid.icon)
DestroyIcon(nid.icon);
}
void TrayIcon::Notify(dword msg)
{
if(visible) {
nid.flags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
if(nid.icon)
DestroyIcon(nid.icon);
nid.icon = IconWin32(icon);
int len = min(tip.GetLength(), 60);
memcpy(nid.tip, tip, len);
nid.tip[len] = 0;
VERIFY(Shell_NotifyIcon(msg, (NOTIFYICONDATA *)&nid));
}
}
void TrayIcon::Message(int type, const char *title, const char *text, int timeout)
{
if(!IsWin2K())
return;
nid.flags = 0x10;
*nid.info = *nid.title = 0;
if(text) {
memcpy(nid.info, text, min((int)strlen(text), 255) + 1);
nid.info[255] = 0;
}
if(title) {
memcpy(nid.title, title, min((int)strlen(title), 63) + 1);
nid.title[63] = 0;
}
nid.infoflags = type;
nid.timeout = minmax(timeout, 10, 30) * 1000;
Shell_NotifyIcon(NIM_MODIFY, (NOTIFYICONDATA *)&nid);
}
void TrayIcon::Show(bool b)
{
if(b == visible)
return;
if(visible)
Notify(NIM_DELETE);
visible = b;
if(visible)
Notify(NIM_ADD);
}
TrayIcon& TrayIcon::Icon(const Image &img)
{
icon = img;
Notify(NIM_MODIFY);
return *this;
}
TrayIcon& TrayIcon::Tip(const char *text)
{
tip = text;
Notify(NIM_MODIFY);
return *this;
}
void TrayIcon::Menu(Bar& bar)
{
WhenBar(bar);
}
void TrayIcon::LeftDown()
{
WhenLeftDown();
}
void TrayIcon::LeftUp()
{
WhenLeftUp();
}
void TrayIcon::LeftDouble()
{
WhenLeftDouble();
}
void TrayIcon::DoMenu(Bar& bar)
{
Menu(bar);
}
void TrayIcon::BalloonLeftDown()
{
WhenBalloonLeftDown();
}
void TrayIcon::BalloonShow()
{
WhenBalloonShow();
}
void TrayIcon::BalloonHide()
{
WhenBalloonHide();
}
void TrayIcon::BalloonTimeout()
{
WhenBalloonTimeout();
}
LRESULT TrayIcon::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == UM_TASKBAR_)
switch(lParam) {
case WM_LBUTTONDOWN:
LeftDown();
return TRUE;
case WM_LBUTTONUP:
LeftUp();
return TRUE;
case WM_LBUTTONDBLCLK:
::SetForegroundWindow(nid.hwnd);
LeftDouble();
return TRUE;
case WM_RBUTTONDOWN:
::SetForegroundWindow(nid.hwnd);
MenuBar::Execute(NULL, THISBACK(DoMenu), GetMousePos());
return TRUE;
case NIN_BALLOONSHOW_:
BalloonShow();
return TRUE;
case NIN_BALLOONHIDE_:
BalloonHide();
return TRUE;
case NIN_BALLOONTIMEOUT_:
BalloonTimeout();
return TRUE;
case NIN_BALLOONUSERCLICK_:
BalloonLeftDown();
return TRUE;
}
return Ctrl::WindowProc(message, wParam, lParam);
}
#endif
#endif
END_UPP_NAMESPACE