📄 magicframe.cpp
字号:
int intCommandRun = theApp.intCommandRun;
CString strCommand = theApp.strCommand;
HANDLE *phCmdID = &theApp.m_hCmdID;
if( lParam )
{
CMailbox &mbox = *( (CMailbox*) lParam );
ASSERT( mbox.IsKindOf( RUNTIME_CLASS( CMailbox ) ) );
if( ACTION_DEFAULT != mbox.m_intCommand )
{
intCommand = mbox.m_intCommand;
intCommandRun = mbox.m_intCommandRun;
strCommand = mbox.m_strCommand;
phCmdID = &mbox.m_hCmdID;
}
}
if( *phCmdID )
{
//SetForegroundProcess
return 0;
}
if( ACTION_NONE == intCommand ) return 0;
strCommand.TrimLeft();
strCommand.TrimRight();
if( strCommand.IsEmpty() ) return 0;
CString strFile = strCommand;
int intFileIndex = 0;
int intDelimiter = 0;
int intDelimiterMax = strCommand.GetLength();
{
BOOL bQuoted = FALSE;
TCHAR prev = 0, curr = 0;
for( intDelimiter = 0; intDelimiter < intDelimiterMax; ++intDelimiter )
{
prev = curr;
curr = strCommand.GetAt( intDelimiter );
strFile.SetAt( intFileIndex, curr );
if( _T('\"') == curr && _T('\\') != prev ) { bQuoted = !bQuoted; --intFileIndex; }
else if( ( _T('\t') == curr || _T(' ') == curr ) && !bQuoted ) break;
++intFileIndex;
}
if( intFileIndex < intDelimiterMax ) strFile.SetAt( intFileIndex, _T('\0') );
}
CString strParameters = strCommand.Right( intDelimiterMax - intDelimiter - 1 );
int intCmdShow = SW_NORMAL;
switch( intCommandRun )
{
case COMMAND_RUN_HIDDEN: intCmdShow = SW_HIDE; break;
case COMMAND_RUN_MINIMIZED: intCmdShow = SW_SHOWMINNOACTIVE; break;
case COMMAND_RUN_MAXIMIZED: intCmdShow = SW_SHOWMAXIMIZED; break;
}
SHELLEXECUTEINFO sei =
{
sizeof( SHELLEXECUTEINFO ),
SEE_MASK_DOENVSUBST | SEE_MASK_NOCLOSEPROCESS,
NULL,
_T("open"),
strFile,
strParameters,
NULL,
intCmdShow,
0, 0, 0, 0, 0, 0, 0
};
ShellExecuteEx( &sei );
*phCmdID = sei.hProcess;
return 1;
}
BOOL CMagicFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext )
{
VERIFY( m_wndSplitter.CreateStatic( this, 2, 1 ) );
VERIFY( m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS( CMailboxView ), CSize( 0, theApp.intSplitterPos ), pContext ) );
VERIFY( m_wndSplitter.CreateView( 1, 0, RUNTIME_CLASS( CExcerptView ), CSize( 0, 0 ), pContext ) );
return TRUE;
}
LRESULT CMagicFrame::OnMciNotify( WPARAM , LPARAM lParam )
{
ASSERT( GetActiveDocument() );
( (CMagicDoc*) GetActiveDocument() )->MciNotify( lParam );
return 0;
}
void CMagicFrame::OnEnterMenuLoop( BOOL bIsTrackPopupMenu )
{
SetIndicators( TRUE );
CFrameWnd::OnEnterMenuLoop( bIsTrackPopupMenu );
}
void CMagicFrame::OnExitMenuLoop( BOOL bIsTrackPopupMenu )
{
CFrameWnd::OnExitMenuLoop( bIsTrackPopupMenu );
SetIndicators( FALSE );
}
LRESULT CMagicFrame::OnUpdateItem( WPARAM wParam, LPARAM )
{
CMagicDoc *doc = ( (CMagicDoc*) GetActiveDocument() );
if( !doc ) return 0;
if( wParam ) doc->UpdateItem( (CObject*) wParam );
else doc->UpdateIdle();
return 0;
}
void CMagicFrame::OnEnterIdle(UINT nWhy, CWnd* pWho)
{
CFrameWnd::OnEnterIdle(nWhy, pWho);
SendMessage( VM_UPDATEITEM );
}
void CMagicFrame::OnQuickSend()
{
/* launch mailer now! */
if( (int) ShellExecute( NULL, _T("open"), _T("mailto:"), _T(""), _T(""), SW_NORMAL ) < 32 )
{
CString strMessage;
AfxFormatString1( strMessage, IDP_CANNOT_FOLLOW_THE_LINK_1, _T("mailto:") );
AfxMessageBox( strMessage );
}
}
void CMagicFrame::OnSuspend()
{
theApp.bIsSuspended = !theApp.bIsSuspended;
if( !IsWatchdogOn() )
{
CreateWatchDog( 1 );
}
}
void CMagicFrame::OnUpdateSuspend(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck( theApp.bIsSuspended );
}
void CMagicFrame::WatchDogTimedOut()
{
if( theApp.bIsSuspended )
{
if( m_bIsAlternativeIcon )
{
m_nidB = m_nidA;
m_nidB.hIcon = m_hMailboxSuspended;
VERIFY( Shell_NotifyIcon( NIM_MODIFY, &m_nidB ) );
SetMainWindowIcon( m_nidB.hIcon );
}
else
{
VERIFY( Shell_NotifyIcon( NIM_MODIFY, &m_nidA ) );
SetMainWindowIcon( m_nidA.hIcon );
}
m_bIsAlternativeIcon = !m_bIsAlternativeIcon;
CreateWatchDog( 1000 ); // 1 sec
}
else if( m_bFlashNewMail )
{
if( m_bIsAlternativeIcon )
{
VERIFY( Shell_NotifyIcon( NIM_MODIFY, &m_nidA ) );
SetMainWindowIcon( m_nidA.hIcon );
}
else
{
m_nidB = m_nidA;
m_nidB.hIcon = m_hMailboxEmpty16;
VERIFY( Shell_NotifyIcon( NIM_MODIFY, &m_nidB ) );
SetMainWindowIcon( m_nidB.hIcon );
}
m_bIsAlternativeIcon = !m_bIsAlternativeIcon;
CreateWatchDog( 1000 ); // 1 sec
}
else
{
VERIFY( Shell_NotifyIcon( NIM_MODIFY, &m_nidA ) );
SetMainWindowIcon( m_nidA.hIcon );
m_bIsAlternativeIcon = true;
}
}
void CMagicFrame::SwitchPane()
{
m_wndSplitter.ActivateNext();
}
void CMagicFrame::OnEndSession(BOOL bEnding)
{
SaveSettings();
theApp.SaveSettings();
CFrameWnd::OnEndSession(bEnding);
}
void CMagicFrame::SetMainWindowIcon( HICON hTaskbarIcon )
{
HICON hMainWindowIcon = 0;
if( hTaskbarIcon == m_hMailboxFull16 )
{
hMainWindowIcon = m_hMailboxFull;
}
else if( hTaskbarIcon == m_hMailboxEmpty16 )
{
hMainWindowIcon = m_hMailboxEmpty;
}
else if( hTaskbarIcon == m_hMailboxSuspended )
{
hMainWindowIcon = m_hMailboxSuspended;
}
else
{
ASSERT( false );
}
SetIcon( hMainWindowIcon, FALSE );
}
void CMagicFrame::GetMessageString( UINT nID, CString& rMessage ) const
{
CFrameWnd::GetMessageString( nID, rMessage ) ;
StrTranslate(rMessage);
}
void CMagicFrame::OnLanguageSelect(UINT nID)
{
int nLang = nID - IDC_FIRST_LANGUAGE-1;
LPCTSTR sFile = NULL;
if (nLang<0)
sFile = NULL;
else if (nLang < m_aLanguages.GetSize())
sFile = m_aLanguages[nLang].sFile;
else
return;
GetDictionary()->SetDictionary(sFile, TRUE);
// update language change
static CMenu menu; // static is required to avoid bufg with Alt.
menu.DestroyMenu();
menu.LoadMenu(IDR_MAINFRAME);
GetDictionary()->MenuTranslate(menu.m_hMenu);
SetMenu(&menu);
// send message to all windows
m_wndSplitter.SendMessageToDescendants(VM_LANGUAGE, 0, 0, FALSE, FALSE);
theApp.strLastDiction = sFile;
m_aLanguages.RemoveAll(); // lng list have to be updated
}
void CMagicFrame::OnUpdateFirstLanguage(CCmdUI* pCmdUI)
{
if (!pCmdUI->m_pSubMenu)
return;
if (m_aLanguages.GetSize())
return; // already done
m_aLanguages.RemoveAll();
GetDictionary()->FindDictions(m_aLanguages);
if (m_aLanguages.GetSize() == 0)
return;
for (int i = 0; i<m_aLanguages.GetSize(); i++)
{
pCmdUI->m_pSubMenu->AppendMenu(MF_STRING,
IDC_FIRST_LANGUAGE+i+1, m_aLanguages[i].sLang);
}
}
BOOL CMagicFrame::OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult)
{
// need to handle both ANSI and UNICODE versions of the message
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
if (! CFrameWnd::OnToolTipText(nID, pNMHDR, pResult))
return FALSE;
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
{
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
CString s = pTTTA->szText;
if (s.IsEmpty())
s.LoadString(pNMHDR->idFrom);
StrTranslate(s);
lstrcpyn(pTTTA->szText, s, sizeof(pTTTA->szText));
}
else
{
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
CString str=pTTTW->szText; // convert to ANSI
if (str.IsEmpty())
str.LoadString(pNMHDR->idFrom);
StrTranslate(str);
_mbstowcsz(pTTTW->szText, str, sizeof(pTTTW->szText));
}
#else
if (pNMHDR->code == TTN_NEEDTEXTW)
{
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
CString s = pTTTW->szText;
StrTranslate(s);
lstrcpyn(pTTTW->szText, s, sizeof(pTTTW->szText));
}
#endif
return TRUE; // message was handled
}
void CMagicFrame::OnFileApplyfilters()
{
m_wndSplitter.SendMessageToDescendants(WM_COMMAND, ID_FILE_APPLYFILTERS, 0, FALSE, FALSE);
}
void CMagicFrame::OnFriends()
{
CString sFile;
if (!FindLocalFile(FRIENDS_FILE, sFile, FALSE))
{
// no file? - create one
CStdioFile file;
if (!file.Open(sFile, CFile::modeCreate|CFile::typeText|CFile::modeWrite, NULL))
return;
file.WriteString(";If sender address is in this file, message is not filtered in any way\n");
file.WriteString(";You can allow whole domains with *@domain.com\n");
file.WriteString("\n;SourceForge addresses are not limited to @sourceforge.net : user@users.sourceforge.net\n");
file.WriteString("*.sourceforge.net\n");
}
ShellExecute(NULL, "Open", sFile, NULL, NULL, SW_SHOW);
}
void CMagicFrame::OnClose()
{
SaveSettings();
CFrameWnd::OnClose();
}
// copied from MFC, to ensure correct state save
BOOL CMagicFrame::OnMyBarCheck(UINT nID)
{
ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);
ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);
CControlBar* pBar = GetControlBar(nID);
if (pBar != NULL)
{
BOOL bVis = ((pBar->GetStyle() & WS_VISIBLE) == 0);
ShowControlBar(pBar, bVis, FALSE);
if (nID == ID_VIEW_STATUS_BAR)
{
if (bVis)
theApp.m_dwFlags &= ~MMF_NO_STATUS;
else
theApp.m_dwFlags |= MMF_NO_STATUS;
}
else if (nID == ID_VIEW_TOOLBAR)
{
if (bVis)
theApp.m_dwFlags &= ~MMF_NO_TOOLBAR;
else
theApp.m_dwFlags |= MMF_NO_TOOLBAR;
}
return TRUE;
}
return FALSE;
}
void CMagicFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if (pPopupMenu->GetMenuItemID(0) != ID_LIST_MIN)
return;
UpdateFilterLists();
pPopupMenu->DeleteMenu(0, MF_BYPOSITION);
CStringArray asActions;
CString sAction;
LOAD_STRING(sAction, IDP_COLUMN_TO); asActions.Add(sAction);
LOAD_STRING(sAction, IDP_COLUMN_FROM); asActions.Add(sAction);
LOAD_STRING(sAction, IDP_COLUMN_SUBJ); asActions.Add(sAction);
int nMax = min(49, m_asFilterLists.GetSize());
for (int i=0; i<nMax; i++)
{
CMenu popup;
popup.CreatePopupMenu();
popup.AppendMenu(MF_STRING, ID_LIST_MIN+1+i, asActions[0]);
popup.AppendMenu(MF_STRING, ID_LIST_MIN+50+i, asActions[1]);
popup.AppendMenu(MF_STRING, ID_LIST_MIN+100+i, asActions[2]);
pPopupMenu->AppendMenu(MF_POPUP, (UINT)popup.Detach(), m_asFilterLists[i]);
}
}
void CMagicFrame::UpdateFilterLists()
{
if (m_bListReady)
return;
m_asFilterLists.RemoveAll();
for (int i=0; i<theApp.m_Filters.GetSize(); i++)
{
CMailFilter& mf = theApp.m_Filters.ElementAt(i);
for (int c=0; c<CMailFilter::nConditions; c++)
{
if (mf.m_aCnd[c].m_sText.Find('$') != 0)
continue;
CString sFile = mf.m_aCnd[c].m_sText.Mid(1);
sFile.MakeLower();
sFile.TrimRight();
for (int j=0; j<m_asFilterLists.GetSize(); j++)
{
if (m_asFilterLists[j] == sFile)
{
sFile.Empty();
break;
}
}
if (!sFile.IsEmpty())
m_asFilterLists.Add(sFile);
}
}
m_bListReady = TRUE;
}
void CMagicFrame::OnViewDelLog()
{
CString sPath;
if (!FindLocalFile(DELLOG_FILE, sPath, TRUE))
return;
CString sTxtApp;
GetTextHandler(sTxtApp, sPath);
WinExec(sTxtApp, SW_SHOW);
}
void CMagicFrame::OnKillSpam()
{
m_wndSplitter.SendMessageToDescendants(WM_COMMAND, ID_KILL_SPAM, 0, FALSE, FALSE);
}
/////////////////////////////////////////////////////////////////////////////
// DReTester dialog
DReTester::DReTester(CWnd* pParent /*=NULL*/)
: CDialog(DReTester::IDD, pParent)
{
//{{AFX_DATA_INIT(DReTester)
m_sRE = _T("");
m_sText = _T("");
//}}AFX_DATA_INIT
}
void DReTester::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DReTester)
DDX_Text(pDX, IDC_RE, m_sRE);
DDX_Text(pDX, IDC_TEXT, m_sText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DReTester, CDialog)
//{{AFX_MSG_MAP(DReTester)
ON_BN_CLICKED(IDOK, OnOk)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DReTester message handlers
void DReTester::OnOk()
{
UpdateData();
CString s(m_sRE);
if (s.GetLength()<=0)
return;
if (s[0]!='/')
s.Format("/%s/i", m_sRE);
CRegExp re;
if (!re.SetExpr((LPTSTR)(LPCTSTR)s))
{
AfxMessageBox("Bad formed!");
GetDlgItem(IDC_RE)->SetFocus();
return;
}
SMatches m;
if (re.Parse((LPTSTR)(LPCTSTR)m_sText, &m))
{
SendDlgItemMessage(IDC_TEXT, EM_SETSEL, m.s[0], m.e[0]);
GetDlgItem(IDC_TEXT)->SetFocus();
}
else
{
SendDlgItemMessage(IDC_TEXT, EM_SETSEL, 0, 0);
AfxMessageBox("Not Found!");
}
}
void CMagicFrame::OnTestRe()
{
DReTester dlg;
dlg.DoModal();
}
CMagicDoc* GetDoc()
{
POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
CDocTemplate* pDT = AfxGetApp()->GetNextDocTemplate(pos);
if (!pDT)
return NULL;
pos = pDT->GetFirstDocPosition();
return (CMagicDoc*)pDT->GetNextDoc(pos);
}
void CMagicFrame::OnFilters()
{
CMagicDoc* pDoc = GetDoc();
if (!pDoc)
return;
DFilters dlg(pDoc);
dlg.DoModal();
m_bListReady = FALSE;
}
BOOL CMagicFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
if (pCopyDataStruct && pCopyDataStruct->dwData==1)
{
OnRestore();
}
return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
}
BOOL CMagicFrame::OnQueryEndSession()
{
CMagicDoc* pDoc = GetDoc();
if (pDoc && pDoc->IsModified())
{
SendMessage(WM_COMMAND, ID_FILE_SAVE);
}
if (!CFrameWnd::OnQueryEndSession())
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -