owntone-server/win32/FireflyShell/MainDlg.cpp

110 lines
3.0 KiB
C++

/*
*(C) 2006 Roku LLC
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License Version 2 as published
* by the Free Software Foundation.
*
* This program 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.
*
* Please read README.txt in the same directory as this source file for
* further license information.
*/
#include "stdafx.h"
#include "resource.h"
#include "MainDlg.h"
#include "FireflyShell.h"
CMainDlg::CMainDlg(bool move_window)
: m_window_move_required(move_window)
{
this->AddPage(m_pageConfig);
this->AddPage(m_pageAdvanced);
this->AddPage(m_pageLog);
this->AddPage(m_pageAbout);
ATLVERIFY(m_strTitle.LoadString(IDR_MAINFRAME));
this->SetTitle(m_strTitle);
}
LRESULT CMainDlg::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
bool restart_service = false;
if (HIWORD(wParam) == BN_CLICKED)
{
const UINT id = LOWORD(wParam);
if ((id == IDOK || id == ID_APPLY_NOW)
&& GetDlgItem(ID_APPLY_NOW).IsWindowEnabled()
&& GetApplication()->GetServiceStatus().IsRunning())
{
CString title, text;
title.LoadString(IDR_MAINFRAME);
text.LoadString(IDS_QUERYSERVERRESTART);
if (MessageBox(text, title, MB_YESNO) != IDYES)
return 0;
restart_service = true;
}
}
LRESULT result = base::OnCommand(uMsg, wParam, lParam, bHandled);
if (restart_service)
GetApplication()->RestartService(m_hWnd);
return result;
}
void CMainDlg::PositionWindow()
{
POINT cursor_pt;
GetCursorPos(&cursor_pt);
CRect desktop_rect;
if (SystemParametersInfo(SPI_GETWORKAREA, 0, &desktop_rect, 0))
{
// Don't put it hard against the edge of the screen or task bar.
desktop_rect.DeflateRect(CSize(4, 4));
CRect window_rect;
GetWindowRect(&window_rect);
// First move the window so that it's middle is at the cursor position.
CPoint pos;
pos.x = cursor_pt.x - window_rect.Width()/2;
pos.y = cursor_pt.y - window_rect.Height()/2;
// Now make that window appear on the work area but in case it doesn't fit prefer to fit the
// top left.
if (pos.x + window_rect.Width() > desktop_rect.right)
pos.x = desktop_rect.right - window_rect.Width();
if (pos.y + window_rect.Height() > desktop_rect.bottom)
pos.y = desktop_rect.bottom - window_rect.Height();
if (pos.x < desktop_rect.left)
pos.x = desktop_rect.left;
if (pos.y < desktop_rect.top)
pos.y = desktop_rect.top;
SetWindowPos(NULL, pos.x, pos.y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);
}
}
void CMainDlg::OnMove(CPoint pt)
{
if (m_window_move_required)
{
// We don't want to recurse.
m_window_move_required = false;
PositionWindow();
}
else
{
SetMsgHandled(false);
}
}