diff options
Diffstat (limited to 'sysui/source/win32/QuickStart/QuickStart.cpp')
-rw-r--r-- | sysui/source/win32/QuickStart/QuickStart.cpp | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/sysui/source/win32/QuickStart/QuickStart.cpp b/sysui/source/win32/QuickStart/QuickStart.cpp new file mode 100644 index 000000000000..d473043b9646 --- /dev/null +++ b/sysui/source/win32/QuickStart/QuickStart.cpp @@ -0,0 +1,380 @@ +// QuickStart.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "resource.h" + +#define MY_TASKBAR_NOTIFICATION WM_USER+1 + +#define MAX_LOADSTRING 100 + +// message used to communicate with soffice +#define TERMINATIONVETO_MESSAGE "SO TerminationVeto" +#define TERMINATE_MESSAGE "SO Terminate" +#define LISTENER_WINDOWCLASS "SO Listener Class" +static UINT aTerminationVetoMessage = 0x7FFF; +static UINT aTerminateMessage = 0x7FFF; +static HMENU popupMenu = NULL; +static bool bTerminateVeto = true; + +#define UPDATE_TIMER 1 + +// Global Variables: +HINSTANCE hInst; // current instance +TCHAR szTitle[MAX_LOADSTRING]; // The title bar text +TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text + +TCHAR szExitString[MAX_LOADSTRING]; +TCHAR szTooltipString[MAX_LOADSTRING]; + +// Foward declarations of functions included in this code module: +ATOM MyRegisterClass(HINSTANCE hInstance); +BOOL InitInstance(HINSTANCE, int); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); + +bool SofficeRuns() +{ + // check for soffice by searching the communication window + return ( FindWindowEx( NULL, NULL, LISTENER_WINDOWCLASS, NULL ) == NULL ) ? false : true; +} + +bool launchSoffice( ) +{ + if ( !SofficeRuns() ) + { + UINT ret = WinExec( "h:\\office60.630b\\program\\swriter.exe -bean", SW_SHOW ); +// UINT ret = WinExec( "swriter.exe -bean", SW_SHOW ); // looks in the same directory + if ( ret < 32 ) + return false; + + // wait until we can communicate + int retry = 30; + while (retry-- && !SofficeRuns() ) + Sleep(1000); + + return SofficeRuns(); + } + else + return true; +} + +void NotifyListener( HWND hWnd ) +{ + static HICON hIconActive=NULL; + //static HICON hIconInActive=NULL; + + if( !hIconActive ) + { + hIconActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_ACTIVE ), + IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), + LR_DEFAULTCOLOR | LR_SHARED ); + +/* hIconInActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_INACTIVE ), + IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), + LR_DEFAULTCOLOR | LR_SHARED ); + */ + } + + NOTIFYICONDATA nid; + nid.cbSize = sizeof(NOTIFYICONDATA); + nid.hWnd = hWnd; + nid.uID = IDM_QUICKSTART; +// nid.hIcon = bTerminateVeto ? hIconActive : hIconInActive; +// strcpy(nid.szTip, bTerminateVeto ? STRING_QUICKSTARTACTIVE : STRING_QUICKSTARTINACTIVE); + nid.hIcon = hIconActive; + strcpy(nid.szTip, szTooltipString); + nid.uFlags = NIF_TIP|NIF_ICON; + + // update systray + Shell_NotifyIcon( NIM_MODIFY, &nid ); + //CheckMenuItem( popupMenu, IDM_QUICKSTART, bTerminateVeto ? MF_CHECKED : MF_UNCHECKED ); + + // notify listener + SendMessage( HWND_BROADCAST, aTerminationVetoMessage, (WORD) bTerminateVeto, 0L ); +} + + + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + // TODO: Place code here. + MSG msg; + HACCEL hAccelTable; + aTerminationVetoMessage = RegisterWindowMessage( TERMINATIONVETO_MESSAGE ); + aTerminateMessage = RegisterWindowMessage( TERMINATE_MESSAGE ); + + // Initialize global strings + LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + LoadString(hInstance, IDC_QUICKSTART, szWindowClass, MAX_LOADSTRING); + + LoadString(hInstance, IDS_EXIT, szExitString, MAX_LOADSTRING); + LoadString(hInstance, IDS_TOOLTIP, szTooltipString, MAX_LOADSTRING); + + MyRegisterClass(hInstance); + + // Perform application initialization: + if (!InitInstance (hInstance, nCmdShow)) + { + return FALSE; + } + + hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_QUICKSTART); + + // Main message loop: + while (GetMessage(&msg, NULL, 0, 0)) + { + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return msg.wParam; +} + + + +// +// FUNCTION: MyRegisterClass() +// +// PURPOSE: Registers the window class. +// +// COMMENTS: +// +// This function and its usage is only necessary if you want this code +// to be compatible with Win32 systems prior to the 'RegisterClassEx' +// function that was added to Windows 95. It is important to call this function +// so that the application will get 'well formed' small icons associated +// with it. +// +ATOM MyRegisterClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_QUICKSTART); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = (LPCSTR)IDC_QUICKSTART; + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); + + return RegisterClassEx(&wcex); +} + +// +// FUNCTION: InitInstance(HANDLE, int) +// +// PURPOSE: Saves instance handle and creates main window +// +// COMMENTS: +// +// In this function, we save the instance handle in a global variable and +// create and display the main program window. +// +BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + HWND hWnd; + + hInst = hInstance; // Store instance handle in our global variable + + hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); + + if (!hWnd) + { + return FALSE; + } + + nCmdShow = SW_HIDE; // hide main window, we only need the taskbar icon + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return TRUE; +} + +// +// FUNCTION: WndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes messages for the main window. +// +// WM_COMMAND - process the application menu +// WM_PAINT - Paint the main window +// WM_DESTROY - post a quit message and return +// +// +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_CREATE: + { + // make sure soffice runs + if( !launchSoffice() ) + return -1; + + // create popup menu + popupMenu = CreatePopupMenu(); + static int count=0; + + // Add my items + MENUITEMINFO mi; + mi.cbSize = sizeof(MENUITEMINFO); + mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID; + mi.fType=MFT_STRING; + mi.fState=MFS_ENABLED|MFS_DEFAULT; + mi.wID = IDM_QUICKSTART; + mi.hSubMenu=NULL; + mi.hbmpChecked=NULL; + mi.hbmpUnchecked=NULL; + mi.dwItemData=NULL; + mi.dwTypeData = "QuickStart"; + mi.cch = strlen(mi.dwTypeData); +// InsertMenuItem(popupMenu, count++, TRUE, &mi); + + mi.cbSize = sizeof(MENUITEMINFO); + mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID; + mi.fType=MFT_STRING; + mi.fState=MFS_ENABLED; + mi.wID = IDM_ABOUT; + mi.hSubMenu=NULL; + mi.hbmpChecked=NULL; + mi.hbmpUnchecked=NULL; + mi.dwItemData=NULL; + mi.dwTypeData = "Info..."; + mi.cch = strlen(mi.dwTypeData); +// InsertMenuItem(popupMenu, count++, TRUE, &mi); + + mi.cbSize = sizeof(MENUITEMINFO); + mi.fMask=MIIM_TYPE; + mi.fType=MFT_SEPARATOR; + mi.hSubMenu=NULL; + mi.hbmpChecked=NULL; + mi.hbmpUnchecked=NULL; + mi.dwItemData=NULL; +// InsertMenuItem(popupMenu, count++, TRUE, &mi); + + mi.cbSize = sizeof(MENUITEMINFO); + mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID; + mi.fType=MFT_STRING; + mi.fState=MFS_ENABLED; + mi.wID = IDM_EXIT; + mi.hSubMenu=NULL; + mi.hbmpChecked=NULL; + mi.hbmpUnchecked=NULL; + mi.dwItemData=NULL; + mi.dwTypeData = szExitString; + mi.cch = strlen(mi.dwTypeData); + InsertMenuItem(popupMenu, count++, TRUE, &mi); + + // add taskbar icon + NOTIFYICONDATA nid; + nid.cbSize = sizeof(NOTIFYICONDATA); + nid.hWnd = hWnd; + nid.uID = IDM_QUICKSTART; + nid.uFlags = NIF_MESSAGE; + nid.uCallbackMessage=MY_TASKBAR_NOTIFICATION; + Shell_NotifyIcon(NIM_ADD, &nid); + + // and update state + NotifyListener( hWnd ); + + // check for soffice + SetTimer(hWnd, UPDATE_TIMER, 3000, NULL); + } + break; + + case MY_TASKBAR_NOTIFICATION: // message from taskbar + switch(lParam) + { +/* + case WM_LBUTTONDBLCLK: + bTerminateVeto = bTerminateVeto ? false : true; + NotifyListener( hWnd ); + break; + */ + + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + { + POINT pt; + GetCursorPos(&pt); + SetForegroundWindow( hWnd ); + int m = TrackPopupMenuEx(popupMenu, TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON, + pt.x, pt.y, hWnd, NULL); + // BUGFIX: See Q135788 (PRB: Menus for Notification Icons Don't Work Correctly) + PostMessage(hWnd, NULL, 0, 0); + switch(m) + { + case IDM_QUICKSTART: + bTerminateVeto = bTerminateVeto ? false : true; + NotifyListener( hWnd ); + break; + case IDM_ABOUT: + DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); + break; + case IDM_EXIT: + DestroyWindow(hWnd); + break; + } + } + break; + } + break; + + case WM_TIMER: + if( wParam == UPDATE_TIMER ) + { + // update state + NotifyListener( hWnd ); + } + break; + + case WM_DESTROY: + // try to terminate office + SendMessage( HWND_BROADCAST, aTerminateMessage, 0, 0L ); + + // delete taskbar icon + NOTIFYICONDATA nid; + nid.cbSize=sizeof(NOTIFYICONDATA); + nid.hWnd = hWnd; + nid.uID = IDM_QUICKSTART; + Shell_NotifyIcon(NIM_DELETE, &nid); + + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +// Mesage handler for about box. +LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + return TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + break; + } + return FALSE; +} |