e5f195da33
Add few recently added SVG files used for bitmap bundles in samples also to bakefiles and CMakeLists. Closes #22197.
277 lines
7.7 KiB
C++
277 lines
7.7 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: tbtest.cpp
|
|
// Purpose: wxTaskBarIcon demo
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created: 01/02/97
|
|
// Copyright: (c)
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "smile.xpm"
|
|
#include "smile2.xpm"
|
|
|
|
#include "wx/artprov.h"
|
|
#include "wx/taskbar.h"
|
|
|
|
#include "tbtest.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// global variables
|
|
// ----------------------------------------------------------------------------
|
|
|
|
static MyDialog *gs_dialog = NULL;
|
|
|
|
// ============================================================================
|
|
// implementation
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyApp
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxIMPLEMENT_APP(MyApp);
|
|
|
|
bool MyApp::OnInit()
|
|
{
|
|
if ( !wxApp::OnInit() )
|
|
return false;
|
|
|
|
if ( !wxTaskBarIcon::IsAvailable() )
|
|
{
|
|
wxMessageBox
|
|
(
|
|
"There appears to be no system tray support in your current environment. This sample may not behave as expected.",
|
|
"Warning",
|
|
wxOK | wxICON_EXCLAMATION
|
|
);
|
|
}
|
|
|
|
// Create the main window
|
|
gs_dialog = new MyDialog("wxTaskBarIcon Test Dialog");
|
|
|
|
gs_dialog->Show(true);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyDialog implementation
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxBEGIN_EVENT_TABLE(MyDialog, wxDialog)
|
|
EVT_BUTTON(wxID_ABOUT, MyDialog::OnAbout)
|
|
EVT_BUTTON(wxID_OK, MyDialog::OnOK)
|
|
EVT_BUTTON(wxID_EXIT, MyDialog::OnExit)
|
|
EVT_CLOSE(MyDialog::OnCloseWindow)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
|
|
MyDialog::MyDialog(const wxString& title)
|
|
: wxDialog(NULL, wxID_ANY, title)
|
|
{
|
|
wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
|
|
|
|
wxSizerFlags flags;
|
|
flags.Border(wxALL, 10);
|
|
|
|
sizerTop->Add(new wxStaticText
|
|
(
|
|
this,
|
|
wxID_ANY,
|
|
"Press 'Hide me' to hide this window, Exit to quit."
|
|
), flags);
|
|
|
|
sizerTop->Add(new wxStaticText
|
|
(
|
|
this,
|
|
wxID_ANY,
|
|
"Double-click on the taskbar icon to show me again."
|
|
), flags);
|
|
|
|
sizerTop->AddStretchSpacer()->SetMinSize(200, 50);
|
|
|
|
wxSizer * const sizerBtns = new wxBoxSizer(wxHORIZONTAL);
|
|
sizerBtns->Add(new wxButton(this, wxID_ABOUT, "&About"), flags);
|
|
sizerBtns->Add(new wxButton(this, wxID_OK, "&Hide"), flags);
|
|
sizerBtns->Add(new wxButton(this, wxID_EXIT, "E&xit"), flags);
|
|
|
|
sizerTop->Add(sizerBtns, flags.Align(wxALIGN_CENTER_HORIZONTAL));
|
|
SetSizerAndFit(sizerTop);
|
|
Centre();
|
|
|
|
m_taskBarIcon = new MyTaskBarIcon();
|
|
|
|
// we should be able to show up to 128 characters on Windows
|
|
if (!m_taskBarIcon->SetIcon(wxArtProvider::GetBitmapBundle(wxART_WX_LOGO, wxART_OTHER, wxSize(32, 32)),
|
|
"wxTaskBarIcon Sample\n"
|
|
"With a very, very, very, very\n"
|
|
"long tooltip whose length is\n"
|
|
"greater than 64 characters.") )
|
|
{
|
|
wxLogError("Could not set icon.");
|
|
}
|
|
|
|
#if defined(__WXOSX__) && wxOSX_USE_COCOA
|
|
m_dockIcon = new MyTaskBarIcon(wxTBI_DOCK);
|
|
if ( !m_dockIcon->SetIcon(wxArtProvider::GetBitmapBundle(wxART_WX_LOGO, wxART_OTHER, wxSize(32, 32))) )
|
|
{
|
|
wxLogError("Could not set icon.");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
MyDialog::~MyDialog()
|
|
{
|
|
delete m_taskBarIcon;
|
|
}
|
|
|
|
void MyDialog::OnAbout(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
static const char * const title = "About wxWidgets Taskbar Sample";
|
|
static const char * const message
|
|
= "wxWidgets sample showing wxTaskBarIcon class\n"
|
|
"\n"
|
|
"(C) 1997 Julian Smart\n"
|
|
"(C) 2007 Vadim Zeitlin";
|
|
|
|
#if defined(__WXMSW__) && wxUSE_TASKBARICON_BALLOONS
|
|
m_taskBarIcon->ShowBalloon(title, message, 15000,
|
|
wxICON_INFORMATION,
|
|
wxBitmapBundle::FromSVGFile("info.svg", wxSize(64, 64))
|
|
);
|
|
#else // !__WXMSW__
|
|
wxMessageBox(message, title, wxICON_INFORMATION|wxOK, this);
|
|
#endif // __WXMSW__/!__WXMSW__
|
|
}
|
|
|
|
void MyDialog::OnOK(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
Show(false);
|
|
}
|
|
|
|
void MyDialog::OnExit(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
Close(true);
|
|
}
|
|
|
|
void MyDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyTaskBarIcon implementation
|
|
// ----------------------------------------------------------------------------
|
|
|
|
enum
|
|
{
|
|
PU_RESTORE = 10001,
|
|
PU_NEW_ICON,
|
|
PU_EXIT,
|
|
PU_CHECKMARK,
|
|
PU_SUB1,
|
|
PU_SUB2,
|
|
PU_SUBMAIN
|
|
};
|
|
|
|
|
|
wxBEGIN_EVENT_TABLE(MyTaskBarIcon, wxTaskBarIcon)
|
|
EVT_MENU(PU_RESTORE, MyTaskBarIcon::OnMenuRestore)
|
|
EVT_MENU(PU_EXIT, MyTaskBarIcon::OnMenuExit)
|
|
EVT_MENU(PU_NEW_ICON,MyTaskBarIcon::OnMenuSetNewIcon)
|
|
EVT_MENU(PU_CHECKMARK,MyTaskBarIcon::OnMenuCheckmark)
|
|
EVT_UPDATE_UI(PU_CHECKMARK,MyTaskBarIcon::OnMenuUICheckmark)
|
|
EVT_TASKBAR_LEFT_DCLICK (MyTaskBarIcon::OnLeftButtonDClick)
|
|
EVT_MENU(PU_SUB1, MyTaskBarIcon::OnMenuSub)
|
|
EVT_MENU(PU_SUB2, MyTaskBarIcon::OnMenuSub)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
void MyTaskBarIcon::OnMenuRestore(wxCommandEvent& )
|
|
{
|
|
gs_dialog->Show(true);
|
|
}
|
|
|
|
void MyTaskBarIcon::OnMenuExit(wxCommandEvent& )
|
|
{
|
|
gs_dialog->Close(true);
|
|
}
|
|
|
|
static bool check = true;
|
|
|
|
void MyTaskBarIcon::OnMenuCheckmark(wxCommandEvent& )
|
|
{
|
|
check = !check;
|
|
}
|
|
|
|
void MyTaskBarIcon::OnMenuUICheckmark(wxUpdateUIEvent &event)
|
|
{
|
|
event.Check(check);
|
|
}
|
|
|
|
void MyTaskBarIcon::OnMenuSetNewIcon(wxCommandEvent&)
|
|
{
|
|
wxIcon icon(smile_xpm);
|
|
|
|
if (!SetIcon(wxBitmapBundle::FromBitmaps(
|
|
wxBitmap(smile_xpm),
|
|
wxBitmap(smile2_xpm)
|
|
),
|
|
"wxTaskBarIcon Sample - a different icon"))
|
|
wxMessageBox("Could not set new icon.");
|
|
}
|
|
|
|
void MyTaskBarIcon::OnMenuSub(wxCommandEvent&)
|
|
{
|
|
wxMessageBox("You clicked on a submenu!");
|
|
}
|
|
|
|
// Overridables
|
|
wxMenu *MyTaskBarIcon::CreatePopupMenu()
|
|
{
|
|
wxMenu *menu = new wxMenu;
|
|
menu->Append(PU_RESTORE, "&Restore main window");
|
|
menu->AppendSeparator();
|
|
menu->Append(PU_NEW_ICON, "&Set New Icon");
|
|
menu->AppendSeparator();
|
|
menu->AppendCheckItem(PU_CHECKMARK, "Test &check mark");
|
|
menu->AppendSeparator();
|
|
wxMenu *submenu = new wxMenu;
|
|
submenu->Append(PU_SUB1, "One submenu");
|
|
submenu->AppendSeparator();
|
|
submenu->Append(PU_SUB2, "Another submenu");
|
|
menu->Append(PU_SUBMAIN, "Submenu", submenu);
|
|
/* OSX has built-in quit menu for the dock menu, but not for the status item */
|
|
#ifdef __WXOSX__
|
|
if ( OSXIsStatusItem() )
|
|
#endif
|
|
{
|
|
menu->AppendSeparator();
|
|
menu->Append(PU_EXIT, "E&xit");
|
|
}
|
|
return menu;
|
|
}
|
|
|
|
void MyTaskBarIcon::OnLeftButtonDClick(wxTaskBarIconEvent&)
|
|
{
|
|
gs_dialog->Show(true);
|
|
}
|