📄 uidlg.cpp
字号:
/*
* Copyright (C) 2003-2007 Funambol, Inc
*
* 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, TITLE, NONINFRINGEMENT 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 program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*/
#include "stdafx.h"
#include "ui.h"
#include "uiDlg.h"
#include "CommunicationSettings.h"
#include "LoglevelSettings.h"
#include "RecoverSettings.h"
#include "About.h"
#include "PushSettings.h"
#include "SyncSettings.h"
#include "pim/ClientSettings.h"
#include "pim/maincpp.h"
#include "shellapi.h"
#include "SynchronizationMessages.h"
#include "Shellapi.h"
#include "aygshell.h"
#include "pim/SettingFunctions.h"
#include "ClientUtil.h"
#include "base/util/utils.h"
#include <windows.h>
#include "comutil.h"
#include "HwndFunctions.h"
#include "notify/timed_msgbox.h"
#include "CustomButton.h"
#include "ClientUtil.h"
#include "MailSettings.h"
#include "ContactSettings.h"
#include "CalendarSettings.h"
#include "TaskSettings.h"
#include "BriefcaseSettings.h"
#include "NotesSettings.h"
#include "DeviceInfo.h"
#include "pim/account.h"
#include "processUtils.h"
#define ITEMS_FROM_SERVER 20
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
long retValueLastSync=0;
bool isServerConfigured();
CuiDlg::CuiDlg(CWnd* pParent /*=NULL*/)
: CDialog(CuiDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CuiDlg::OnMenuComm()
{
isInSettings = true;
CCommunicationSettings wndCommSett;
INT_PTR result = wndCommSett.DoModal();
isInSettings = false;
if(bSyncStarted){
CreateMenuBar(IDM_STOP);
}
}
void CuiDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, lstSources);
}
BEGIN_MESSAGE_MAP(CuiDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
ON_COMMAND(IDM_COMM, OnMenuComm)
//}}AFX_MSG_MAP
ON_COMMAND(IDM_LOGLEVEL, &CuiDlg::OnMenuLoglevel)
ON_COMMAND(ID_SYNC, &CuiDlg::OnSync)
ON_COMMAND(ID_MENU_EXIT, &CuiDlg::OnMenuExit)
ON_COMMAND(ID_RECOVER, &CuiDlg::OnMenuRecover)
ON_MESSAGE(ID_MYMSG_CONNECTING, &CuiDlg::OnMsgConnecting)
ON_MESSAGE(ID_MYMSG_ENDING, &CuiDlg::OnMsgEndingSync)
ON_MESSAGE(ID_MYMSG_ENDING_SOURCE, &CuiDlg::OnMsgEndingSource)
ON_MESSAGE(ID_MYMSG_STARTSYNC_ENDED, &CuiDlg::OnStartsyncEnded)
ON_MESSAGE(ID_MYMSG_STARTING_SYNC, &CuiDlg::OnStartingSync)
ON_MESSAGE(ID_MYMSG_STARTING_SOURCE, &CuiDlg::OnStartingSource)
ON_MESSAGE(ID_MYMSG_ITEM_SYNCED_FROM_SERVER, &CuiDlg::OnMsgItemSyncedFromServer)
ON_MESSAGE(ID_MYMSG_ITEM_SYNCED_FROM_CLIENT, &CuiDlg::OnMsgItemSyncedFromClient)
ON_MESSAGE(ID_MYMSG_TOTAL_ITEMS, &CuiDlg::OnMsgTotalItems)
ON_COMMAND(ID_MENU_ABOUT, &CuiDlg::OnMenuAbout)
ON_COMMAND(IDABORT, &CuiDlg::OnMenuStop)
ON_COMMAND(ID_SETTINGS_PUSHSETTINGS, &CuiDlg::OnMenuPush)
ON_COMMAND(ID_SETTINGS_SYNC, &CuiDlg::OnMenuSync)
ON_WM_CLOSE()
//ON_WM_CONTEXTMENU() // for context menu
ON_MESSAGE(ID_MYMSG_SOURCE_STATE, &CuiDlg::OnMsgSourceState)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CuiDlg::OnItemchangedList1)
#if defined(WIN32_PLATFORM_PSPC)
// ON_COMMAND(ID_MENU_CONTEXT_SYNC, &CuiDlg::OnContextMenuSync)
// ON_COMMAND(ID_MENU_CONTEXT_SETTINGS, &CuiDlg::OnContextMenuSettings)
#endif
ON_COMMAND(ID_TOOLS_DEVICEINFO, &CuiDlg::OnToolsDeviceinfo)
END_MESSAGE_MAP()
// CuiDlg message handlers
BOOL CuiDlg::OnInitDialog()
{
CString s1;
s1.LoadString(getLocalizationUtils()->getLocaleResource(),IDS_FUNAMBOL); SetWindowText(s1);
CDialog::OnInitDialog();
LOG.setLevel(getLOGLevel());
AfxGetMainWnd()->EnableWindow();
// init settings
ClientSettings* cs = getRegConfig();
try {
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
}
catch(...) {
LOG.error("uiDlg: can't set application icon.");
}
// set items size, check dpi
/*double dpiY = (double)GetDeviceCaps(GetDC()->GetSafeHdc(),LOGPIXELSY)/96.0;
int height = lstSources.getItemHeight();
height = (int) height * dpiY;
lstSources.setItemHeight(height);*/
// try to set the font used in main window
try {
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
HFONT hFont = (HFONT) GetStockObject(SYSTEM_FONT);
GetObject(hFont, sizeof lf, &lf);
lf.lfWeight = FW_BOLD;
lf.lfHeight += FONT_HEIGHT_OFFSET;
VERIFY(lstSources.fontBold.CreateFontIndirect(&lf));
}
catch(...) {
LOG.error("uiDlg: can't set main screen font.");
}
// check if another sync is in progress
if(checkStartSync() != 0)
{
CreateMenuBar(IDM_STOP);
#if defined WIN32_PLATFORM_WFSP
#if (_WIN32_WCE < 0x500)
CreateMenuBar(IDR_MENUBAR_STOP);
#endif
#endif
bSyncStarted = true;
}
else
{
CreateMenuBar(IDR_MENU_MAIN);
#if defined WIN32_PLATFORM_WFSP
#if (_WIN32_WCE < 0x500)
CreateMenuBar(IDR_MAINFRAME);
#endif
#endif
bSyncStarted = false;
}
initSyncControls();
lstSources.SetItemState(0, LVIS_SELECTED, LVIF_STATE);
// stretch the list to cover all client area
CRect rect;
GetClientRect(&rect);
lstSources.setItemWidth(rect.Width());
lstSources.SetWindowPos(GetActiveWindow(),0,0, rect.Width(), rect.Height(),
SWP_SHOWWINDOW );
lstSources.Invalidate();
currentSource = 0;
resetCurrentItem = true;
lastItem = 0;
currentItem = 0;
totalItems = 0;
sourceEnds = 0;
sourceBegins = 0;
nMailsToSync = 0;
isInSettings = false;
firstSourceId = -1;
// set states
syncSourceContactState = SYNCSOURCE_STATE_OK;
syncSourceCalendarState = SYNCSOURCE_STATE_OK;
syncSourceTaskState = SYNCSOURCE_STATE_OK;
syncSourceNoteState = SYNCSOURCE_STATE_OK;
syncSourceBriefcaseState = SYNCSOURCE_STATE_OK;
syncSourceMailState = SYNCSOURCE_STATE_OK;
bSyncCanceled = false;
CString user;
CString password;
user = getRegConfig()->getAccessConfig().getUsername();
password = getRegConfig()->getAccessConfig().getPassword();
if( (!(isServerConfigured())) ||user.IsEmpty() || password.IsEmpty()){
// OnMenuComm();
isInSettings = true;
CCommunicationSettings commSettings;
CString msg;
msg.LoadString(getLocalizationUtils()->getLocaleResource(),IDS_ERROR_ENTER_CREDENTIALS);
commSettings.showMessage(msg);
INT_PTR result = commSettings.DoModal();
isInSettings = false;
return TRUE;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CuiDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
int resId;
switch(DRA::GetDisplayMode())
{
case DRA::Landscape:
resId = IDD_UI_DIALOG_WIDE;
break;
case DRA::Portrait:
resId = IDD_UI_DIALOG; break;
case DRA::Square:
resId = IDD_UI_DIALOG_SQUARE; break;
default:
resId = IDD_UI_DIALOG; break;
};
DRA::RelayoutDialog( AfxGetInstanceHandle(), this->m_hWnd, MAKEINTRESOURCE(resId));
// stretch the list to cover all client area
CRect rect;
GetClientRect(&rect);
lstSources.setItemWidth(rect.Width());
lstSources.SetWindowPos(GetActiveWindow(),0,0, rect.Width(), rect.Height(),
SWP_SHOWWINDOW );
lstSources.Invalidate();
}
#endif
void CuiDlg::OnMenuLoglevel()
{
isInSettings = true;
CLoglevelSettings wndLoglevel;
INT_PTR result = wndLoglevel.DoModal();
isInSettings = false;
if(bSyncStarted){
CreateMenuBar(IDM_STOP);
}
}
void CuiDlg::OnSync()
{
if (!lstSources.getIsLocked()){
lockPanes();
}
// start a sync of all enabled sources
lstSources.setStateToAll(ITEM_STATE_TO_SYNC, true);
lstSources.SetItemState(lstSources.GetCurSelItem(), 0, LVIS_FOCUSED);
refreshSourcePane(SOURCE_MAIL);
setFirstSourceToSync();
StartSync(TEXT("manual"));
}
void CuiDlg::OnClose()
{
int processID = 0;
HWND wnd = NULL;
wnd = ::FindWindow(TEXT("funambolstartsync"), NULL);
if ((processID = checkStartSync()) != 0) {
// sync is in progress
HwndFunctions::closePreviousMsgBox();
// send msg to startsync to stop
if(wnd){
::PostMessage(wnd, WM_COMMAND, (WPARAM)10, NULL);
}
Sleep(500);
DWORD code = 0;
GetExitCodeProcess((HANDLE)processID, &code);
if (code == STILL_ACTIVE) {
HANDLE hProcess = OpenProcess(0, FALSE, processID);
if (hProcess) {
startProgram(SYNCAPP, TEXT("removeNotif"));
TerminateProcess(hProcess, -6); //-6 code for the user stop sync.
CloseHandle(hProcess);
}
}
}
else {
startProgram(SYNCAPP, TEXT("removeNotif"));
}
EndDialog(0);
}
void CuiDlg::OnMenuExit()
{
int ret = EndAppQuery(GetSafeHwnd());
if((ret == 0) || (ret== 1))
//CDialog::OnOK();
getRegConfig()->saveDirty();
EndDialog(0);
}
void CuiDlg::OnMenuRecover()
{
CRecoverSettings wndRecover;
// TODO: workaround for isInSettings
//isInSettings = true;
INT_PTR result = wndRecover.DoModal();
if(result == RECOVER_SYNC_STARTED){
// the user started a recover sync
}
isInSettings = false;
}
LRESULT CuiDlg::OnStartsyncEnded(WPARAM wParam, LPARAM lParam)
{
CString s1("");
lstSources.stopAnim(currentSource);
getRegConfig()->read();
if(!isInSettings){
CreateMenuBar(IDR_MENU_MAIN);
#if defined WIN32_PLATFORM_WFSP
#if (_WIN32_WCE < 0x500)
CreateMenuBar(IDR_MAINFRAME);
#endif
#endif
}
retValueLastSync = lParam;
bSyncStarted = false;
// stop sync icon animation
for(int i=0;i<lstSources.GetItemCount();i++){
lstSources.stopAnim(lstSources.indexToId(i));
}
if( (retValueLastSync == 0) || (retValueLastSync == 10003) ||
(retValueLastSync == -20) || (retValueLastSync == -6) ){
// for these errorcodes we don't display error message
}
else{
CString message; message.LoadString(getLocalizationUtils()->getLocaleResource(), IDS_CODE_ERROR_NOT_DONE);
CString errormsg = SyncErrorMsg(retValueLastSync);
HwndFunctions::closePreviousMsgBox();
HWND wndFocus = GetFocus()->GetSafeHwnd();
if(errormsg != ""){
TimedMessageBox(GetSafeHwnd(), errormsg, getLocalizationUtils()->getLocalizationString(IDS_FUNAMBOL_ALERT),
MB_OK | MB_ICONHAND | MB_SETFOREGROUND, INFINITE);
}
else{
TimedMessageBox(GetSafeHwnd(), message, getLocalizationUtils()->getLocalizationString(IDS_FUNAMBOL_ALERT),
MB_OK | MB_ICONHAND | MB_SETFOREGROUND, INFINITE);
}
::SetFocus(wndFocus);
}
// reset variables
currentSource = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -