You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

664 lines
17 KiB

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chak Nanga <chak@netscape.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "stdafx.h"
#include "Dialogs.h"
#include "BrowserFrm.h"
#include "BrowserView.h"
#include "MfcEmbed.h"
#include "resource.h"
#include "KmImage.h"
extern CMfcEmbedApp theApp;
//--------------------------------------------------------------------------//
// CFindReBar
//--------------------------------------------------------------------------//
#ifndef _UNICODE
CFindRebar::CFindRebar(WCHAR* szSearch, PRBool bMatchCase,
PRBool bMatchWholeWord, PRBool bWrapAround,
PRBool bHighlight, CBrowserFrame* pOwner)
{
memset(m_szUStr, 0, sizeof(m_szUStr)*sizeof(char));
if (szSearch)
wcsncpy(m_szUStr, szSearch, sizeof(m_szUStr)/sizeof(WCHAR)-1);
#else
CFindRebar::CFindRebar(CString csSearchStr, PRBool bMatchCase,
PRBool bMatchWholeWord, PRBool bWrapAround,
PRBool bHighlight, CBrowserFrame* pOwner)
: CReBar()
{
m_csSearchStr = csSearchStr;
#endif
m_bMatchCase = bMatchCase;
m_bMatchWholeWord = bMatchWholeWord;
m_bWrapAround = bWrapAround;
m_bHighlight = bHighlight;
m_pOwner = pOwner;
m_hid = 0;
// Stay false until we have initialised the edit control
m_bAutoSearch = false;
m_clrBkgnd = RGB(255,128,128);
m_brBkgnd.CreateSolidBrush( m_clrBkgnd );
m_NotFound = false;
}
BEGIN_MESSAGE_MAP(CFindRebar, CReBar)
#ifndef FINDBAR_USE_TYPEAHEAD
ON_EN_CHANGE(IDC_FIND_EDIT, OnEnChangeSearchStr)
#endif
ON_WM_CREATE()
ON_COMMAND(ID_CLOSE_FINDBAR, Close)
ON_WM_SETFOCUS()
ON_WM_CTLCOLOR()
ON_WM_TIMER()
END_MESSAGE_MAP()
CFindRebar::~CFindRebar()
{
m_bStartsel = false;
}
BOOL CFindRebar::Create(CWnd* parent, DWORD dwStyle)
{
return CReBar::Create(parent, RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_DBLCLKTOGGLE, dwStyle | WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
}
void CFindRebar::Close()
{
DestroyWindow();
}
void CFindRebar::PostNcDestroy()
{
#ifndef _UNICODE
if (theApp.m_bUnicode){
::DestroyWindow(m_cEdit.Detach());
}
#endif
m_pOwner->ClearFindBar();
//CReBar::PostNcDestroy();
}
#ifndef FINDBAR_USE_TYPEAHEAD
void CFindRebar::OnEnChangeSearchStr()
{
if (!m_bAutoSearch) return;
bool disabled = false;
if (m_csSearchStr.GetLength()==0)
disabled = true;
#ifndef _UNICODE
if (theApp.m_bUnicode) {
//int len = ::GetWindowTextLengthW(m_hWnd);
::GetWindowTextW(m_cEdit.m_hWnd, m_szUStr, sizeof(m_szUStr)/sizeof(WCHAR)-1);
}else{
#endif
m_cEdit.GetWindowText(m_csSearchStr);
#ifndef _UNICODE
USES_CONVERSION;
wcsncpy(m_szUStr, A2W(m_csSearchStr), sizeof(m_szUStr)/sizeof(WCHAR)-1);
}
#endif
if (Highlight())
SetTimer(12345, 300, NULL);
m_bStartsel = true;
m_pOwner->SendMessage(WM_COMMAND, ID_EDIT_FINDNEXT, 0);
m_bStartsel = false;
// set back the focus to the find bar that gecko steal when scrolling
m_cEdit.SetFocus();
}
#endif
void CFindRebar::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 12345){
KillTimer(nIDEvent);
m_pOwner->SendMessage(WM_COMMAND, IDC_HIGHLIGHT, 0);
}
CReBar::OnTimer(nIDEvent);
}
int CFindRebar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CReBar::OnCreate(lpCreateStruct) == -1)
return -1;
CString str;
// Band with the close button
closeBar.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_TRANSPARENT);
/*
HBITMAP hBmp = NULL;
CString closeBmp;
if (theApp.FindSkinFile(closeBmp, _T("close.bmp")))
hBmp = (HBITMAP)LoadImage(::AfxGetInstanceHandle(), closeBmp, IMAGE_BITMAP, 0, 0, LR_LOADTRANSPARENT|LR_LOADFROMFILE);
else
hBmp = (HBITMAP)LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TOOLBAR_CLOSE), IMAGE_BITMAP, 0, 0, LR_LOADTRANSPARENT);
TBBUTTON closeButton = {0};
closeButton.fsState = TBSTATE_ENABLED;
closeButton.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
closeButton.idCommand = ID_CLOSE;
closeButton.iString = -1;
closeBar.GetToolBarCtrl().AddButtons(1,&closeButton);
closeBar.SetSizes(CSize(17,16), CSize(10,9));
closeBar.AddReplaceBitmap(hBmp);
*/
closeBar.LoadToolBar(IDR_TOOLBAR_CLOSE);
closeBar.GetToolBarCtrl().SetBitmapSize(CSize(10,10));
AddBar(&closeBar, _T(""), NULL, RBBS_NOGRIPPER);
// Band with the edit control
#ifndef _UNICODE
if (theApp.m_bUnicode){
HWND hWnd = ::CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT",
NULL, WS_CHILD|ES_AUTOHSCROLL, 0, 0, 150, 18,
this->m_hWnd, (HMENU)(UINT_PTR)IDC_FIND_EDIT, AfxGetInstanceHandle(), NULL);
m_cEdit.Attach(hWnd);
::SetWindowTextW(hWnd, m_szUStr);
}else{
#endif
m_cEdit.Create(WS_CHILD|ES_AUTOHSCROLL, CRect(0,0,250,100), this, IDC_FIND_EDIT);
m_cEdit.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
m_cEdit.SetWindowText(m_csSearchStr);
#ifndef _UNICODE
}
#endif
str.LoadString(IDS_FIND);
AddBar(&m_cEdit, str, NULL, RBBS_NOGRIPPER);
m_cEdit.SetWindowPos(NULL, 0, 0, 250, 100, SW_NORMAL);
// Toolbar with next/Previous and options
m_cToolbar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_LIST | TBSTYLE_TOOLTIPS
);//,WS_CHILD|WS_VISIBLE|CBRS_FLYBY);
m_cToolbar.GetToolBarCtrl().SetImageList(NULL);
bool useSkinList = true;
if (!theApp.skin.SetImageList(m_cToolbar.GetToolBarCtrl())) {
useSkinList = false;
KmImage img;
int cxIcon = 16;//GetSystemMetrics(SM_CXSMICON);
if (img.LoadFromSkin(_T("findhot.bmp"))) {
m_ilHot.Create(cxIcon, cxIcon, ILC_MASK | ILC_COLOR32, 6, 1);
img.AddToImageList(m_ilHot);
m_cToolbar.GetToolBarCtrl().SetHotImageList(&m_ilHot);
}
if (img.LoadFromSkin(_T("findcold.bmp"))) {
m_ilCold.Create(cxIcon, cxIcon, ILC_MASK | ILC_COLOR32, 6, 1);
img.AddToImageList(m_ilCold);
m_cToolbar.GetToolBarCtrl().SetImageList(&m_ilCold);
}
if (img.LoadFromSkin(_T("finddead.bmp"))) {
m_ilCold.Create(cxIcon, cxIcon, ILC_MASK | ILC_COLOR32, 6, 1);
img.AddToImageList(m_ilDead);
m_cToolbar.GetToolBarCtrl().SetDisabledImageList(&m_ilDead);
}
}
TBBUTTON button = {0};
button.fsState = TBSTATE_ENABLED;
button.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
//int stringID = toolbar->GetToolBarCtrl().AddString(IDS_FINDNEXT);
int stringID=-1;
button.idCommand = ID_EDIT_FINDNEXT;
button.iBitmap = useSkinList ? theApp.skin.GetIconIndex(ID_EDIT_FINDNEXT) : 0;
button.iString =stringID;
m_cToolbar.GetToolBarCtrl().InsertButton(0,&button);
str.LoadString(IDS_FINDNEXT);
m_cToolbar.SetButtonText(0, (LPCTSTR)str);
//stringID = toolbar->GetToolBarCtrl().AddString(IDS_FINDPREV);
button.idCommand = ID_EDIT_FINDPREV;
button.iBitmap = useSkinList ? theApp.skin.GetIconIndex(ID_EDIT_FINDPREV) : 1;
button.iString = stringID;
m_cToolbar.GetToolBarCtrl().InsertButton(1,&button);
str.LoadString(IDS_FINDPREV);
m_cToolbar.SetButtonText(1, (LPCTSTR)str);
//button.fsStyle = TBSTYLE_CHECK | TB_AUTOSIZE;
button.fsStyle = TBBS_CHECKBOX | TBSTYLE_AUTOSIZE;
// Wrap around button
/* if (m_bWrapAround)
button.fsState = TBSTATE_CHECKED;
button.idCommand = ID_WRAP_AROUND;
button.iBitmap = 2;
m_cToolbar.GetToolBarCtrl().InsertButton(2,&button);
str.LoadString(IDS_FIND_WRAPAROUND);
m_cToolbar.SetButtonText(2, (LPCTSTR)str);*/
// Match case button
button.fsState = TBSTATE_ENABLED;
if (m_bMatchCase)
button.fsState = TBSTATE_CHECKED;
button.idCommand = ID_MATCH_CASE;
button.iBitmap = useSkinList ? theApp.skin.GetIconIndex(ID_MATCH_CASE) : 3;
m_cToolbar.GetToolBarCtrl().InsertButton(2,&button);
str.LoadString(IDS_FIND_MATCHCASE);
m_cToolbar.SetButtonText(2, (LPCTSTR)str);
//toolbar->SetButtonStyle(2, TBBS_CHECKBOX);
// Highlight button
button.fsState = TBSTATE_ENABLED;
if (m_bHighlight)
button.fsState = TBSTATE_CHECKED;
button.idCommand = ID_HIGHLIGHT;
button.iBitmap = useSkinList ? theApp.skin.GetIconIndex(ID_HIGHLIGHT) : 3;
m_cToolbar.GetToolBarCtrl().InsertButton(3,&button);
str.LoadString(IDS_FIND_HIGHLIGHT);
m_cToolbar.SetButtonText(3, (LPCTSTR)str);
AddBar(&m_cToolbar, _T(""), NULL, RBBS_NOGRIPPER);
// Setting the font of the edit control
m_cEdit.SetFont(m_cToolbar.GetFont());
// I wonder why I have to do that ...
REBARBANDINFO rbbi;
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILDSIZE;
rbbi.cxMinChild = 150;
rbbi.cyMinChild = HIWORD(m_cToolbar.GetToolBarCtrl().GetButtonSize()); // Not sure what constant I should set here
GetReBarCtrl().SetBandInfo (1, &rbbi);
rbbi.cxMinChild = 20;
GetReBarCtrl().SetBandInfo (2, &rbbi);
rbbi.cyMinChild = 16;
GetReBarCtrl().SetBandInfo (0, &rbbi);
m_cEdit.SetFocus();
m_cEdit.SetSel(0,-1);
m_bAutoSearch = true;
return 0;
}
void CFindRebar::OnSetFocus(CWnd* pOldWnd)
{
CReBar::OnSetFocus(pOldWnd);
m_cEdit.SetFocus();
m_cEdit.SetSel(0,-1);
}
BOOL CFindRebar::PreTranslateMessage(MSG* pMsg)
{
// to test: Ctrl+F
if(pMsg->message==WM_KEYDOWN){
if (pMsg->wParam!=VK_SHIFT ){
if(pMsg->wParam==VK_F3)
return false; // browserview will take care of it
}
if (pMsg->wParam==VK_ESCAPE){
Close();
return true;
}
if (pMsg->wParam==VK_RETURN){
m_bStartsel = false;
m_pOwner->SendMessage(WM_COMMAND, ID_EDIT_FINDNEXT, 0);
//m_pOwner->SendMessage(WM_FINDMSG, (WPARAM)this, 1);
return true;
}
#ifdef FINDBAR_USE_TYPEAHEAD
m_pOwner->m_wndBrowserView.PostMessage(WM_KEYDOWN, pMsg->lParam, pMsg->wParam);
#endif
}
return CReBar::PreTranslateMessage(pMsg);
}
HBRUSH CFindRebar::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (nCtlColor == CTLCOLOR_EDIT && m_NotFound)
{
pDC->SetBkColor( m_clrBkgnd );
return m_brBkgnd;
}
HBRUSH hbr = CReBar::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
#if 0
// File overview....
//
// Contains find dialog stuff
//
//--------------------------------------------------------------------------//
// CFindDialog Stuff
//--------------------------------------------------------------------------//
CFindDialog::CFindDialog(CString& csSearchStr, PRBool bMatchCase,
PRBool bMatchWholeWord, PRBool bWrapAround,
PRBool bSearchBackwards, CBrowserView* pOwner)
: CFindReplaceDialog()
{
// Save these initial settings off in member vars
// We'll use these to initialize the controls
// in InitDialog()
m_csSearchStr = csSearchStr;
m_bMatchCase = bMatchCase;
m_bMatchWholeWord = bMatchWholeWord;
m_bWrapAround = bWrapAround;
m_bSearchBackwards = bSearchBackwards;
m_pOwner = pOwner;
// Set up to load our customized Find dialog template
// rather than the default one MFC provides
m_fr.Flags |= FR_ENABLETEMPLATE;
m_fr.hInstance = AfxGetInstanceHandle();
m_fr.lpTemplateName = MAKEINTRESOURCE(IDD_FINDDLG);
}
BOOL CFindDialog::OnInitDialog()
{
CFindReplaceDialog::OnInitDialog();
// -- Find settings
m_bMatchCase = theApp.preferences.bFindMatchCase;
m_bSearchBackwards = theApp.preferences.bFindSearchBackwards;
m_bWrapAround = theApp.preferences.bFindWrapAround;
CEdit* pEdit = (CEdit *)GetDlgItem(IDC_FIND_EDIT);
if(pEdit)
pEdit->SetWindowText(m_csSearchStr);
CButton* pChk = (CButton *)GetDlgItem(IDC_MATCH_CASE);
if(pChk)
pChk->SetCheck(m_bMatchCase);
pChk = (CButton *)GetDlgItem(IDC_MATCH_WHOLE_WORD);
if(pChk)
pChk->SetCheck(m_bMatchWholeWord);
pChk = (CButton *)GetDlgItem(IDC_WRAP_AROUND);
if(pChk)
pChk->SetCheck(m_bWrapAround);
pChk = (CButton *)GetDlgItem(IDC_SEARCH_BACKWARDS);
if(pChk)
pChk->SetCheck(m_bSearchBackwards);
return TRUE;
}
void CFindDialog::OnCancel() {
CButton* pChk = (CButton *)GetDlgItem(IDC_MATCH_CASE);
if(pChk)
theApp.preferences.bFindMatchCase = pChk->GetCheck();
pChk = (CButton *)GetDlgItem(IDC_WRAP_AROUND);
if(pChk)
theApp.preferences.bFindWrapAround = pChk->GetCheck();
pChk = (CButton *)GetDlgItem(IDC_SEARCH_BACKWARDS);
if(pChk)
theApp.preferences.bFindSearchBackwards = pChk->GetCheck();
CFindReplaceDialog::OnCancel();
}
void CFindDialog::PostNcDestroy()
{
// Let the owner know we're gone
if(m_pOwner != NULL)
m_pOwner->ClearFindDialog();
CFindReplaceDialog::PostNcDestroy();
}
BOOL CFindDialog::WrapAround()
{
CButton* pChk = (CButton *)GetDlgItem(IDC_WRAP_AROUND);
return pChk ? pChk->GetCheck() : FALSE;
}
BOOL CFindDialog::SearchBackwards()
{
CButton* pChk = (CButton *)GetDlgItem(IDC_SEARCH_BACKWARDS);
return pChk ? pChk->GetCheck() : FALSE;
}
#endif
//IMPLEMENT_DYNAMIC(CSelectDialog, CDialog)
CSelectDialog::CSelectDialog(CWnd* pParent, LPCTSTR pTitle, LPCTSTR pText)
: CDialog(CSelectDialog::IDD, pParent)
{
if(pTitle) m_csDialogTitle = pTitle;
if(pText) m_csMsgText = pText;
m_iChoice = 0;
}
CSelectDialog::~CSelectDialog()
{
}
void CSelectDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_SELECT, m_cList);
}
BEGIN_MESSAGE_MAP(CSelectDialog, CDialog)
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_LBN_DBLCLK(IDC_LIST_SELECT, OnLbnDblclkListSelect)
END_MESSAGE_MAP()
// Gestionnaires de messages SelectDialog
BOOL CSelectDialog::OnInitDialog()
{
CDialog::OnInitDialog();
POSITION pos = m_clChoices.GetHeadPosition();
for (int i=0;i < m_clChoices.GetCount();i++) {
int idx = m_cList.AddString(m_clChoices.GetNext(pos));
m_cList.SetItemData(idx, i);
}
SetWindowText(m_csDialogTitle);
CWnd *pWnd = GetDlgItem(IDC_MSG_TEXT);
if(pWnd)
pWnd->SetWindowText(m_csMsgText);
return TRUE; // return TRUE unless you set the focus to a control
}
void CSelectDialog::AddChoice(LPCTSTR text)
{
m_clChoices.AddTail(text);
}
void CSelectDialog::OnBnClickedOk()
{
int idx = m_cList.GetCaretIndex();
m_iChoice = m_cList.GetItemData(idx);
OnOK();
}
void CSelectDialog::OnLbnDblclkListSelect()
{
OnBnClickedOk();
}
#include "MfcEmbed.h"
/*
extern CMfcEmbedApp theApp;
int CDialogEx2::RunModalLoop(DWORD dwFlags)
{
ASSERT(::IsWindow(m_hWnd)); // window must be created
ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
HWND hWndParent = ::GetParent(m_hWnd);
m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);
MSG *pMsg = AfxGetCurrentMessage();
// acquire and dispatch messages until the modal state is done
for (;;)
{
ASSERT(ContinueModal());
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
{
ASSERT(ContinueModal());
// show the dialog when the message queue goes idle
if (bShowIdle)
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
// call OnIdle while in bIdle state
if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
{
// send WM_ENTERIDLE to the parent
::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
}
if ((dwFlags & MLF_NOKICKIDLE) ||
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
{
// stop idle processing next time
bIdle = FALSE;
}
}
// phase2: pump messages while available
do
{
ASSERT(ContinueModal());
while (::PeekMessage(pMsg, NULL, NULL, WM_USER, PM_NOREMOVE))
{
if (!theApp.PumpMessage2(WM_USER))
{
AfxPostQuitMessage(0);
return -1;
}
// show the window when certain special messages rec'd
if (bShowIdle &&
(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
if (!ContinueModal())
goto ExitModal;
// reset "no idle" state after pumping "normal" message
if (AfxIsIdleMessage(pMsg))
{
bIdle = TRUE;
lIdleCount = 0;
}
}
// pump message, but quit on WM_QUIT
if (!AfxPumpMessage())
{
AfxPostQuitMessage(0);
return -1;
}
// show the window when certain special messages rec'd
if (bShowIdle &&
(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
if (!ContinueModal())
goto ExitModal;
// reset "no idle" state after pumping "normal" message
if (AfxIsIdleMessage(pMsg))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
}
ExitModal:
m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
return m_nModalResult;
}*/