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.

994 lines
26 KiB

/*
* Copyright (C) 2005 Dorian Boissonnade
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* 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.
*
* 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 "BrowserFrm.h"
#include "BrowserFrmTab.h"
class CBrowserGlueTab : public CBrowserGlue
{
public:
CBrowserGlueTab(CBrowserFrame* frame, CBrowserView* view) : CBrowserGlue(frame, view)
{};
CBrowserWrapper* ReuseWindow(BOOL useCurrent)
{
if (mpBrowserFrame->IsPopup() || mpBrowserFrame->IsDialog())
return NULL;
if (useCurrent)
return mpBrowserView->GetBrowserWrapper();
CBrowserTab* tab = ((CBrowserFrmTab*)mpBrowserFrame)->CreateBrowserTab();
if (!tab) return NULL;
if ( !theApp.preferences.GetBool("kmeleon.tabs.loadDivertedInBackground", FALSE)
&& mpBrowserView == mpBrowserFrame->GetActiveView())
((CBrowserFrmTab*)mpBrowserFrame)->SetActiveBrowser(tab);
return tab->GetBrowserWrapper();
}
void SetBrowserTitle(LPCTSTR aTitle)
{
CBrowserGlue::SetBrowserTitle(aTitle);
if (!theApp.preferences.GetBool("kmeleon.tabs.useLoadingTitle", FALSE) || !mLoading)
((CBrowserFrmTab*)mpBrowserFrame)->SetTabTitle((CBrowserTab*)mpBrowserView, aTitle);
}
void SetFavIcon(nsIURI *favUri)
{
CBrowserGlue::SetFavIcon(favUri);
if (!mLoading || !theApp.preferences.GetBool("kmeleon.tabs.useLoadingIcon", TRUE)) {
mIcon = theApp.favicons.GetIcon(mIconURI);
((CBrowserFrmTab*)mpBrowserFrame)->SetTabIcon((CBrowserTab*)mpBrowserView, mIcon);
}
}
void UpdateBusyState(BOOL aBusy)
{
CBrowserGlue::UpdateBusyState(aBusy);
CString title;
if (aBusy) {
if (theApp.preferences.GetBool("kmeleon.tabs.useLoadingIcon", TRUE))
((CBrowserFrmTab*)mpBrowserFrame)->SetTabIcon((CBrowserTab*)mpBrowserView, theApp.favicons.GetLoadingIcon());
if (!theApp.preferences.GetBool("kmeleon.tabs.useLoadingTitle", FALSE) && mLocation.GetLength())
return; //title = mLocation;
else
title.LoadString(IDS_LOADING);
} else {
mIcon = theApp.favicons.GetIcon(mIconURI);
((CBrowserFrmTab*)mpBrowserFrame)->SetTabIcon((CBrowserTab*)mpBrowserView, mIcon);
if (mTitle.IsEmpty()) {
if (mLocation.IsEmpty() || mLocation.Compare(_T("about:blank")) == 0)
title.LoadString(IDS_EMPTY);
else
title = mLocation;
}
else title = mTitle;
}
((CBrowserFrmTab*)mpBrowserFrame)->SetTabTitle((CBrowserTab*)mpBrowserView, title);
}
void GetVisibility(bool *aVisible)
{
if (mpBrowserFrame->GetActiveView() != mpBrowserView)
*aVisible = false;
else
CBrowserGlue::GetVisibility(aVisible);
}
void DestroyBrowserFrame()
{
CBrowserFrmTab* frame = ((CBrowserFrmTab*)mpBrowserFrame);
if (frame->GetTabCount()>1)
frame->CloseTab((CBrowserTab*)mpBrowserView);
else
frame->PostMessage(WM_CLOSE, -1, -1);
}
};
IMPLEMENT_DYNAMIC(CBrowserFrmTab, CBrowserFrame)
BEGIN_MESSAGE_MAP(CBrowserFrmTab, CBrowserFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_COMMAND(ID_CLOSE, OnClose)
ON_MESSAGE(WM_OPENTAB, OnOpenTab)
ON_MESSAGE(WM_CLOSETAB, OnCloseTab)
ON_COMMAND(ID_TAB_NEXT, OnNextTab)
ON_COMMAND(ID_TAB_PREV, OnPrevTab)
ON_COMMAND(ID_TAB_LAST, OnLastTab)
ON_COMMAND(ID_NEW_TAB, OnNewTab)
ON_COMMAND(ID_CLOSE_TAB, OnCloseTab)
ON_COMMAND(ID_CLOSE_ALLTAB, OnCloseAllTab)
ON_COMMAND(ID_CLOSE_ALLOTHERTAB, OnCloseAllOtherTab)
ON_UPDATE_COMMAND_UI_RANGE(TABS_START_ID, TABS_STOP_ID, OnUpdateTabs)
ON_COMMAND_RANGE(TABS_START_ID, TABS_STOP_ID, OnTabSelect)
ON_NOTIFY(TBN_BEGINDRAG, ID_TABS_BAR, OnTbnBeginDrag)
ON_MESSAGE(UWM_NEWSITEICON, OnNewSiteIcon)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
ON_COMMAND(ID_EDIT_FIND, OnShowFindBar)
// ON_MESSAGE(UWM_GETFAVICON, OnGetFavIcon)
ON_WM_KEYDOWN()
ON_WM_SYSCOMMAND()
ON_WM_MENUSELECT()
END_MESSAGE_MAP()
BOOL CBrowserFrmTab::OnToolTipText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
static char* tip = NULL;
static WCHAR* wtip = NULL;
int tooltipWidth = theApp.preferences.GetInt("kmeleon.tabs.tooltipWidth", 100);
if (pNMHDR->idFrom < TABS_START_ID || pNMHDR->idFrom > TABS_STOP_ID)
return CBrowserFrame::OnToolTipText(id, pNMHDR, pResult);
CBrowserTab* tab = (CBrowserTab*)m_Tabs[IDTOTABINDEX(pNMHDR->idFrom)];
if (!tab) return CBrowserFrame::OnToolTipText(id, pNMHDR, pResult);
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
CString tabBarTip = tab->GetBrowserGlue()->mLocation;
if (tabBarTip.GetLength()>tooltipWidth)
tabBarTip = tabBarTip.Mid(0, tooltipWidth-3) + _T("...");
if (!tab->GetBrowserGlue()->mTitle.IsEmpty() && tab->GetBrowserGlue()->mTitle.Compare(tab->GetBrowserGlue()->mLocation) != 0)
tabBarTip = tab->GetBrowserGlue()->mTitle + _T("\n") + tabBarTip;
USES_CONVERSION;
if (pNMHDR->code == TTN_NEEDTEXTA)
{
if (tip) free(tip);
tip = strdup(T2CA(tabBarTip));
pTTTA->lpszText = tip;
}
else
{
if (wtip) free(wtip);
wtip = wcsdup(T2CW(tabBarTip));
pTTTW->lpszText = wtip;
}
*pResult = 0;
// bring the tooltip window above other popup windows
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
CBrowserFrmTab::CBrowserFrmTab(PRUint32 chromeMask, LONG style)
: CBrowserFrame(chromeMask,style)
{
m_pPreviousSelectedTab = NULL;
m_wndCBrowserTab = NULL;
m_wndTabs = NULL;
m_iBrowserCount = 0;
}
CBrowserFrmTab::~CBrowserFrmTab()
{
/* for (int i=0;i<m_iBrowserCount;i++)
delete m_Tabs[i];*/
if (m_wndTabs)
delete m_wndTabs;
}
void CBrowserFrmTab::OnDestroy()
{
m_wndCBrowserTab = NULL;
for (int i=0;i<m_iBrowserCount;i++)
m_Tabs[i]->DestroyWindow();
CBrowserFrame::OnDestroy();
}
void CBrowserFrmTab::OnClose()
{
int ConfirmClose = theApp.preferences.GetBool("browser.tabs.warnOnClose", 1);
if (ConfirmClose && m_iBrowserCount>1)
{
SetForegroundWindow();
CString str;
str.Format(IDS_CLOSE_SEVERAL_TABS, m_iBrowserCount);
if (MessageBox(str, 0, MB_OKCANCEL|MB_ICONWARNING) != IDOK)
return;
}
//for (int i = 0;i<m_iBrowserCount;i++)
// m_Tabs[i]->Destroy();
CBrowserFrame::OnClose();
}
int CBrowserFrmTab::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// tell all our plugins that we were created
if (!IsDialog())
theApp.plugins.SendMessage("*", "* OnCreate", "Create", (long)this->m_hWnd, 1 & (IsPopup()?2:0) );
// Create a ReBar window to which the toolbar and UrlBar
// will be added
BOOL hasLine = theApp.preferences.GetBool("kmeleon.display.toolbars_line", TRUE);
if (!m_wndReBar.Create(this, RBS_DBLCLKTOGGLE | RBS_VARHEIGHT | (hasLine ? RBS_BANDBORDERS:0)))
{
TRACE0("Failed to create ReBar\n");
return -1; // fail to create
}
m_wndReBar.SetNeedSeparator(true);
// Create the bar which will contain the tab list
// It would be better to use a tabcontrol but, currently
// i'm not sure how to deal with it, and it would not fit
// the skin.
m_wndTabs = new CTabReBar();
if (!m_wndTabs->Create(&m_wndReBar, ID_TABS_BAR))
{
TRACE0("Failed to create the tab toolbar\n");
return -1;
}
// Set the favicon image list for the tab bar
m_wndTabs->GetToolBarCtrl().SetImageList(&theApp.favicons);
// Create the first tab
if (CreateBrowserTab(true)==NULL)
{
TRACE0("Failed to create view window\n");
return -1;
}
if (CBrowserFrame::InitLayout() == -1)
return -1;
m_wndTabs->Init(&m_wndReBar);
// If we try to hide it sooner then CrashBadaboum
if (theApp.preferences.bAutoHideTabControl) {
int index = m_wndReBar.FindByName(_T("Tabs"));
m_wndReBar.ShowBand(index, FALSE);
}
return 0;
}
CBrowserTab* CBrowserFrmTab::CreateBrowserTab(bool first)
{
// Fail if we reached the maximun number of tabs
if (m_iBrowserCount >= MAX_TABS_NUMBER)
{
::AfxMessageBox(IDS_MAXTABSNUMBER, MB_ICONSTOP );
return NULL;
}
// Create a new Tab
m_Tabs[m_iBrowserCount] = new CBrowserTab();
// Pass "this" to the View for later callbacks
// and/or access to any public data members, if needed
m_Tabs[m_iBrowserCount]->SetBrowserFrame(this);
// Pass on the BrowserFrameGlue also to the View which
// it will use during the Init() process after creation
// of the BrowserImpl obj. Essentially, the View object
// hooks up the Embedded browser's callbacks to the BrowserFrame
// via this BrowserFrameGlue object
// It will be deleted by the view.
m_Tabs[m_iBrowserCount]->SetBrowserGlue(new CBrowserGlueTab(this, m_Tabs[m_iBrowserCount]));
// Create the view
BOOL r = m_Tabs[m_iBrowserCount]->Create(this, m_iBrowserCount);
if (r)
{
//
CString str;
str.LoadString(IDS_EMPTY);
int buttonIndex = m_iBrowserCount;
if (theApp.preferences.iOnOpenTab == 1
&& m_iCBrowserView>=0)
buttonIndex = m_wndTabs->FindById(TABINDEXTOID(m_iCBrowserView)) + 1;
m_wndTabs->InsertItem(buttonIndex, TABINDEXTOID(m_iBrowserCount), (LPCTSTR)str, (DWORD_PTR)m_Tabs[m_iBrowserCount]);
if (first)
{
m_wndCBrowserTab = m_Tabs[0];
m_iCBrowserView = 0;
// This is our current active tab but it doesn't mean it can
// get the focus yet.
m_Tabs[0]->SetActive(true, false);
//SetActiveBrowser(m_Tabs[0]);
}
//else
// m_Tabs[m_iBrowserCount]->SetActive(false);
UpdateTabListMenu();
return m_Tabs[m_iBrowserCount++];
}
// Failed to create the view. Cleaning.
delete m_Tabs[m_iBrowserCount];
return NULL;
}
void CBrowserFrmTab::OnTabSelect(UINT id)
{
int index = IDTOTABINDEX(id) ;
SetActiveBrowser(m_Tabs[index]);
}
BOOL CBrowserFrmTab::SafeSetActiveBrowser(CBrowserTab* aNewActiveTab)
{
unsigned count = GetTabCount();
if (!count) return FALSE;
for (unsigned i=0; i<count; i++)
if (GetTabIndex(i) == aNewActiveTab) {
SetActiveBrowser(aNewActiveTab);
return TRUE;
}
return FALSE;
}
//void CBrowserFrame::SetActiveBrowser(int index)
void CBrowserFrmTab::SetActiveBrowser(CBrowserTab* aNewActiveTab)
{
if (!aNewActiveTab || aNewActiveTab->IsActive()) return;
BOOL focus = TRUE;
if (m_wndCBrowserTab && aNewActiveTab!=m_wndCBrowserTab)
{
focus = m_wndCBrowserTab->IsChild(GetFocus());
m_wndCBrowserTab->SetActive(false);
m_wndCBrowserTab->SetTypedLocation(!m_wndUrlBar.GetIsTyped() ? _T("") : m_wndUrlBar.GetEnteredURL());
m_pPreviousSelectedTab = m_wndCBrowserTab;
m_wndCBrowserTab->GetBrowserWrapper()->SetVisible(false);
PostMessage(UWM_UPDATESESSIONHISTORY, 0, 0);
}
CBrowserTab* oldTab = m_wndCBrowserTab;
m_iCBrowserView = aNewActiveTab->m_iIndex;
m_wndCBrowserTab = aNewActiveTab;
//SendMessage(WM_SWITCHTAB, (WPARAM)m_wndCBrowserTab, (LPARAM)aNewActiveTab);
theApp.plugins.SendMessage("*", "*", "SwitchTab", (long)oldTab->GetSafeHwnd(), (long)aNewActiveTab->GetSafeHwnd());
//m_wndTabs->SelectItem(TABINDEXTOID(aNewActiveTab->m_iIndex));
//m_wndCBrowserView->Activate(WA_ACTIVE, NULL, false);
//m_Tabs[index].xBrowserFrameGlueObj->m_bActive = true;
UpdateTitle(m_wndCBrowserTab->GetBrowserGlue()->mTitle);
UpdateSecurityStatus(m_wndCBrowserTab->GetBrowserGlue()->mSecurityState);
UpdatePopupNotification(m_wndCBrowserTab->GetBrowserGlue()->mPopupBlockedHost);
UpdateLocation(m_wndCBrowserTab->GetBrowserGlue()->mPendingLocation.GetLength() == 0 ? m_wndCBrowserTab->GetLocation() : m_wndCBrowserTab->GetBrowserGlue()->mPendingLocation, TRUE);
UpdateLoading(m_wndCBrowserTab->GetBrowserGlue()->mLoading);
UpdateProgress(m_wndCBrowserTab->GetBrowserGlue()->mProgressCurrent, m_wndCBrowserTab->GetBrowserGlue()->mProgressMax);
UpdateSiteIcon(theApp.favicons.GetIcon(m_wndCBrowserTab->GetBrowserGlue()->mIconURI));
UpdateStatus(m_wndCBrowserTab->GetBrowserGlue()->mStatusText);
if (m_wndCBrowserTab->GetBrowserGlue()->mHIndex>=0) {
m_wndCBrowserTab->GetBrowserWrapper()->GotoHistoryIndex(m_wndCBrowserTab->GetBrowserGlue()->mHIndex);
m_wndCBrowserTab->GetBrowserGlue()->mHIndex = -1;
}
// BUG: We may be here because of a call to this function.
aNewActiveTab->SetActive(true, focus);
aNewActiveTab->GetBrowserWrapper()->SetVisible(true);
// Don't wait for MFC to update the tab bar
m_wndTabs->GetToolBarCtrl().CheckButton(TABINDEXTOID(aNewActiveTab->m_iIndex), 1);
// Remove a possible tooltip
m_wndToolTip.Hide();
// Reposition the view
RecalcLayout();
}
// I'm overriding RecalcLayout so the current active browser view
// is repositionned.
void CBrowserFrmTab::RecalcLayout(BOOL bNotify)
{
if (m_bInRecalcLayout)
return;
m_bInRecalcLayout = TRUE;
// clear idle flags for recalc layout if called elsewhere
if (m_nIdleFlags & idleNotify)
bNotify = TRUE;
m_nIdleFlags &= ~(idleLayout|idleNotify);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST + m_iCBrowserView, reposExtra, &m_rectBorder);
m_bInRecalcLayout = FALSE;
}
void CBrowserFrmTab::OnNewTab()
{
if (IsDialog() || IsPopup())
return;
CBrowserTab* tab;
if ( (tab=CreateBrowserTab()) == NULL)
{
TRACE0("Failed to create view window\n");
return;
}
switch (theApp.preferences.iNewWindowOpenAs) {
case PREF_NEW_WINDOW_CURRENT:
if (m_wndCBrowserTab)
m_wndCBrowserTab->CloneBrowser(tab);
break;
case PREF_NEW_WINDOW_HOME:
tab->LoadHomePage();
break;
case PREF_NEW_WINDOW_BLANK:
tab->OpenURL(_T("about:blank"));
break;
case PREF_NEW_WINDOW_URL: {
CString newUrl = theApp.preferences.newWindowURL;
if (newUrl.IsEmpty())
tab->OpenURL(_T("about:blank"));
else
tab->OpenURL(newUrl);
}
break;
}
SetActiveBrowser(tab);
if (theApp.preferences.GetBool("kmeleon.display.NewWindowHasUrlFocus", FALSE))
m_wndUrlBar.SetFocus();
}
void CBrowserFrmTab::OnUpdateTabs(CCmdUI* pCmd)
{
pCmd->Enable();
if (pCmd->m_nID == TABINDEXTOID(m_iCBrowserView))
pCmd->SetCheck(1);
else
pCmd->SetCheck(0);
}
#include "nsISHistory.h"
#include ".\browserfrmtab.h"
void CBrowserFrmTab::OnCloseAllTab()
{
while (m_iBrowserCount>1)
CloseTab(m_wndCBrowserTab);
CBrowserWrapper* browser = GetActiveView()->GetBrowserWrapper();
if (!browser) return;
nsCOMPtr<nsISHistory> sHistory;
if (!browser->GetSHistory(getter_AddRefs(sHistory)))
return;
GetActiveView()->OpenURL(_T("about:blank"));
PRInt32 shcount;
sHistory->GetCount(&shcount);
sHistory->PurgeHistory(shcount);
}
void CBrowserFrmTab::OnCloseAllOtherTab()
{
CBrowserView* current = GetActiveView();
while (m_iBrowserCount>1) {
if (current != this->m_Tabs[m_iCBrowserView])
CloseTab(m_Tabs[m_iCBrowserView]);
else if (m_iCBrowserView>0)
CloseTab(m_Tabs[m_iCBrowserView-1]);
else
CloseTab(m_Tabs[m_iCBrowserView+1]);
}
}
void CBrowserFrmTab::OnCloseTab()
{
CloseTab(m_wndCBrowserTab);
}
LRESULT CBrowserFrmTab::OnOpenTab(WPARAM wParam, LPARAM lParam)
{
CBrowserTab* tab = CreateBrowserTab();
if (!tab) return 0;
USES_CONVERSION;
if (wParam) tab->OpenURL(A2CT((char*)wParam));
SetActiveBrowser(tab);
return (LRESULT)tab;
}
LRESULT CBrowserFrmTab::OnCloseTab(WPARAM wParam, LPARAM lParam)
{
CBrowserTab* tab = m_Tabs[IDTOTABINDEX(wParam)];
if (tab) CloseTab(tab);
return -1;
}
BOOL CBrowserFrmTab::CloseTab(CBrowserTab* tab)
{
//if (index <0 || index >=m_iBrowserCount) return FALSE;
// Close if it's a popup
if (IsPopup() || IsDialog()) {
SendMessage(WM_CLOSE,0,0);
return TRUE;
}
//If only one tab, close the window.
if (m_iBrowserCount<2) {
switch (theApp.preferences.iOnCloseLastTab)
{
case 0:
SendMessage(WM_CLOSE,0,0);
return TRUE;
case 1:
m_wndCBrowserTab->OpenURL(_T("about:blank"), nullptr);
return FALSE;
case 2:
return FALSE;
}
}
// Check if we're closing the last active tab, so we can set the
// pointer to something valid.
if (m_pPreviousSelectedTab == tab)
m_pPreviousSelectedTab = NULL; // Have to fix that
int index = tab->m_iIndex;
m_Tabs[index] = NULL;
tab->Destroy();
//delete m_Tabs[index];
// If we're closing the active tab
CBrowserTab* newActiveTab;
if (tab==m_wndCBrowserTab)
{
m_wndCBrowserTab = NULL;
int newTabIndex;
switch (theApp.preferences.iOnCloseTab)
{
case 2:
if (m_pPreviousSelectedTab){
newActiveTab = m_pPreviousSelectedTab;
break;
}
case 0: // Next
newTabIndex = IDTOTABINDEX(m_wndTabs->GetNextItem(TABINDEXTOID(index),false));
newActiveTab = m_Tabs[newTabIndex];
break;
default:
case 1: // Previous
newTabIndex = IDTOTABINDEX(m_wndTabs->GetPreviousItem(TABINDEXTOID(index),false));
newActiveTab = m_Tabs[newTabIndex];
break;
}
}
m_wndTabs->DeleteItem(TABINDEXTOID(index));
m_iBrowserCount--;
// There are better way to do that but ...
// Update our BrowserView array
for (int i=index;i<m_iBrowserCount;i++)
{
m_Tabs[i] = m_Tabs[i+1];
m_Tabs[i]->SetIndex(i);
m_wndTabs->SetItemCommandID(TABINDEXTOID(i + 1), TABINDEXTOID(i));
}
if (index==m_iCBrowserView)
{
m_iCBrowserView = -1;
m_wndCBrowserTab = NULL;
SetActiveBrowser(newActiveTab);
}
else if (index<m_iCBrowserView)
m_iCBrowserView--;
UpdateTabListMenu();
return TRUE;
}
void CBrowserFrmTab::OnNextTab()
{
int newTabID = IDTOTABINDEX(m_wndTabs->GetNextItem(TABINDEXTOID(m_iCBrowserView)));
/*
int newBrowser;
if (m_iCBrowserView<m_iBrowserCount-1)
newBrowser = m_iCBrowserView + 1;
else
newBrowser = 0;*/
SetActiveBrowser(m_Tabs[newTabID]);
}
void CBrowserFrmTab::OnPrevTab()
{
int newTabID = IDTOTABINDEX(m_wndTabs->GetPreviousItem(TABINDEXTOID(m_iCBrowserView)));
/*
int newBrowser;
if (m_iCBrowserView>0)
newBrowser = m_iCBrowserView - 1;
else
newBrowser = m_iBrowserCount - 1;
*/
SetActiveBrowser(m_Tabs[newTabID]);
}
void CBrowserFrmTab::OnLastTab()
{
SetActiveBrowser(m_pPreviousSelectedTab);
}
LRESULT CBrowserFrmTab::OnGetFavIcon(WPARAM wParam, LPARAM lParam)
{
nsCOMPtr<nsIURI> sURI;
nsDependentCString uri;
int index = IDTOTABINDEX(wParam);
int iIcon = theApp.favicons.GetDefaultIcon();
/*
if (m_Tabs[index]->mWebNav) {
nsresult rv = m_Tabs[index]->mWebNav->GetCurrentURI(getter_AddRefs(sURI));
if (NS_SUCCEEDED(rv)) {
iIcon = theApp.favicons.GetIcon(sURI);
}
}
*/
return iIcon;
}
LRESULT CBrowserFrmTab::OnNewSiteIcon(WPARAM url, LPARAM index)
{
for (int i =0; i<this->m_iBrowserCount; i++)
{
nsCOMPtr<nsIURI> uri = m_Tabs[i]->GetBrowserGlue()->mIconURI;
if (!uri) continue;
int icon = theApp.favicons.GetIcon(uri);
if (icon==-1) {// The icon doesn't exist anymore, was deleted
m_Tabs[i]->GetBrowserGlue()->mIconURI = nullptr;
if (i == m_iCBrowserView)
SetFavIcon(theApp.favicons.GetDefaultIcon());
SetTabIcon(m_Tabs[i], theApp.favicons.GetDefaultIcon());
}
else
if (index==-1 || index == icon) {
if (i == m_iCBrowserView)
SetFavIcon(icon);
SetTabIcon(m_Tabs[i], icon);
}
}
return 0;
}
void CBrowserFrmTab::OnTbnBeginDrag(NMHDR *pNMHDR, LRESULT *pResult)
{
USES_CONVERSION;
*pResult = 0;
LPNMTOOLBAR pNMTB = reinterpret_cast<LPNMTOOLBAR>(pNMHDR);
UINT cfTabPt = ::RegisterClipboardFormat(CFSTR_TABPT);
CBrowserTab* tab = (CBrowserTab*)m_Tabs[IDTOTABINDEX(pNMTB->iItem)];
HGLOBAL hTab = GlobalAlloc(GHND, sizeof(CBrowserTab*));
CBrowserTab** pTab = (CBrowserTab**)GlobalLock(hTab);
*pTab = tab;
GlobalUnlock(hTab);
COleDataSource datasource;
//datasource.CacheGlobalData(cfTabPt, hTab);
tab->AddURLAndPerformDrag(datasource);
GlobalFree(hTab);
}
void CBrowserFrmTab::DrawTabListMenu(HMENU menu)
{
for (int i=0; i<m_iBrowserCount; i++)
{
CBrowserWrapper* wrapper = m_Tabs[i]->GetBrowserWrapper();
if (!wrapper) continue;
CString title = wrapper->GetTitle();
if (title.IsEmpty())
title = m_Tabs[i]->GetBrowserGlue()->mTitle; // For restore_on_demand
if (title.IsEmpty())
title = wrapper->GetURI();
if (title.GetLength()>50) title = title.Left(50) + _T("...");
AppendMenu(menu, MF_ENABLED | MF_STRING, TABINDEXTOID(i), title);
}
}
void CBrowserFrmTab::UpdateTabListMenu()
{
KmMenu* menu = theApp.menus.GetKMenu(_T("@TabList"));
if (menu) menu->Invalidate();
}
void CBrowserFrmTab::OnShowFindBar()
{
CBrowserFrame::OnShowFindBar();
m_wndTabs->UpdateVisibility(); // Ugly hack
}
void CBrowserFrmTab::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
if (nItemID >= TABS_START_ID && nItemID <= TABS_STOP_ID) {
CBrowserTab* tab = (CBrowserTab*)m_Tabs[IDTOTABINDEX(nItemID)];
if (tab) {
UpdateStatus(tab->GetCurrentURI());
return;
}
}
CBrowserFrame::OnMenuSelect(nItemID, nFlags, hSysMenu);
}
/**********************************************/
CBrowserTab::CBrowserTab() : CBrowserView()
{
m_bActive = false;
mpFrameTab = NULL;
}
CBrowserTab::~CBrowserTab()
{
}
BOOL CBrowserTab::Create(CBrowserFrmTab* aFrame, int index)
{
mpFrameTab = aFrame;
m_iIndex = index;
return CBrowserView::Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), aFrame, AFX_IDW_PANE_FIRST+index, NULL);
}
void CBrowserTab::Destroy()
{
DestroyWindow();
}
void CBrowserTab::SetIndex(int i)
{
m_iIndex = i;
// m_xBrowserFrameGlueObj.m_iViewIndex = i;
SetWindowLong(m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST + i);
}
bool CBrowserTab::SetActive(bool state, bool haveFocus)
{
bool old = m_bActive;
m_bActive = state;
if (state)
{
if (haveFocus && GetParentFrame() == GetActiveWindow())
CBrowserView::Activate(TRUE);
ShowWindow(SW_SHOW);
}
else
{
CBrowserView::Activate(FALSE);
ShowWindow(SW_HIDE);
}
return old;
}
CBrowserFrame* CBrowserTab::OpenURLInNewWindow(LPCTSTR pUrl, LPCTSTR referrer, BOOL bBackground, BOOL allowFixup)
{
if (!theApp.preferences.GetBool("kmeleon.forceTab", FALSE))
return CBrowserView::OpenURLInNewWindow(pUrl, referrer, bBackground, allowFixup);
const TCHAR* ext = _tcschr(pUrl, L'.');
if (ext && (_tcsstr(ext, _T(".xul")) == ext) && (_tcsncmp(pUrl, _T("chrome:"), 7) == 0))
return theApp.CreateNewBrowserFrameWithUrl(pUrl, referrer, bBackground);
if (!((CBrowserGlue*)m_pBrowserGlue)->mLoading &&
GetCurrentURI() == "about:blank" )
{
OpenURL(pUrl, referrer, allowFixup);
return mpBrowserFrame;
}
OpenURLInNewTab(pUrl, referrer, bBackground, allowFixup);
return mpBrowserFrame;
}
CBrowserTab* CBrowserTab::OpenURLInNewTab(LPCTSTR url, LPCTSTR refferer, BOOL bBackground, BOOL allowFixup)
{
CBrowserTab* tab;
if ( (!GetBrowserGlue()->mLoading && GetBrowserGlue()->mHIndex == -1) &&
GetCurrentURI().Compare(_T("about:blank")) == 0 )
tab = this;
else if ( (tab=mpFrameTab->CreateBrowserTab()) == NULL)
{
TRACE0("Failed to create view window\n");
return NULL;
}
tab->OpenURL(url, refferer, allowFixup);
if (!bBackground)
mpFrameTab->SetActiveBrowser(tab);
return tab;
}
IMPLEMENT_DYNAMIC(CBrowserTab, CBrowserView)
BEGIN_MESSAGE_MAP(CBrowserTab, CBrowserView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_OPEN_LINK_IN_NEW_TAB, OnOpenLinkInNewTab)
ON_COMMAND(ID_OPEN_LINK_IN_BACKGROUNDTAB, OnOpenLinkInBackgroundTab)
ON_COMMAND(ID_OPEN_FRAME_IN_NEW_TAB, OnOpenFrameInNewTab)
ON_COMMAND(ID_OPEN_FRAME_IN_BACKGROUNDTAB, OnOpenFrameInBackgroundTab)
ON_COMMAND(ID_OPEN_IMAGE_IN_NEW_TAB, OnOpenImageInNewTab)
ON_COMMAND(ID_OPEN_IMAGE_IN_BACKGROUNDTAB, OnOpenImageInBackgroundTab)
ON_COMMAND(ID_VIEW_IMAGE, OnViewImageInNewWindow)
ON_WM_KEYDOWN()
ON_WM_KEYUP()
END_MESSAGE_MAP()
int CBrowserTab::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBrowserView::OnCreate(lpCreateStruct) == -1)
return -1;
theApp.plugins.SendMessage("*", "* OnCreateTab", "CreateTab", (long)mpBrowserFrame->m_hWnd, (long)this->m_hWnd);
// GetParent()->SendMessage(WM_CREATETAB, 0, (LPARAM)this);
return 0;
}
void CBrowserTab::OnDestroy()
{
theApp.plugins.SendMessage("*", "* OnDestroyTab", "DestroyTab", (long)mpBrowserFrame->m_hWnd, (long)this->m_hWnd);
CBrowserView::OnDestroy();
//GetParent()->SendMessage(WM_CLOSETAB, m_iIndex, (LPARAM)this);
}
void CBrowserTab::OpenURLWithCommand(UINT idCommand, LPCTSTR url, LPCTSTR refferer, BOOL allowFixup)
{
switch (idCommand)
{
case ID_OPEN_LINK_IN_NEW_TAB:
OpenURLInNewTab(url, refferer, FALSE, allowFixup);
break;
case ID_OPEN_LINK_IN_BACKGROUNDTAB:
OpenURLInNewTab(url, refferer, TRUE, allowFixup);
break;
default:
CBrowserView::OpenURLWithCommand(idCommand, url, refferer, allowFixup);
return;
}
}
void CBrowserTab::OnCloseTab()
{
theApp.plugins.SendMessage("*", "* OnCloseTab", "CloseTab", (long)mpBrowserFrame->m_hWnd, (long)this->m_hWnd);
Destroy();
}
void CBrowserTab::OnOpenLinkInBackgroundTab()
{
CString url, title;
if (!GetLinkTitleAndHref(m_contextNode, url, title))
return;
OpenURLInNewTab(url, m_pWindow->GetDocURL(m_contextNode), TRUE);
}
void CBrowserTab::OnOpenLinkInNewTab()
{
CString url, title;
if (!GetLinkTitleAndHref(m_contextNode, url, title))
return;
OpenURLInNewTab(url, m_pWindow->GetDocURL(m_contextNode), FALSE);
}
void CBrowserTab::OnOpenFrameInNewTab()
{
CString url = m_pWindow->GetFrameURL(m_contextNode);
if (url.IsEmpty()) return;
OpenURLInNewTab(url, GetCurrentURI(), FALSE);
}
void CBrowserTab::OnOpenFrameInBackgroundTab()
{
CString url = m_pWindow->GetFrameURL(m_contextNode);
if (url.IsEmpty()) return;
OpenURLInNewTab(url, GetCurrentURI(), TRUE);
}
void CBrowserTab::OnOpenImageInNewTab()
{
CString imgSrc;
if (!::GetImageSrc(m_contextNode, imgSrc))
if (!::GetBackgroundImageSrc(m_contextNode, imgSrc))
return;
OpenURLInNewTab(imgSrc, GetCurrentURI(), FALSE);
}
void CBrowserTab::OnOpenImageInBackgroundTab()
{
CString imgSrc;
if (!::GetImageSrc(m_contextNode, imgSrc))
if (!::GetBackgroundImageSrc(m_contextNode, imgSrc))
return;
OpenURLInNewTab(imgSrc, GetCurrentURI(), TRUE);
}
void CBrowserTab::OnViewImageInNewWindow()
{
CString imgSrc;
if (!::GetImageSrc(m_contextNode, imgSrc))
if (!::GetBackgroundImageSrc(m_contextNode, imgSrc))
return;
if (theApp.preferences.GetInt("browser.link.open_newwindow", 1) == 3)
OpenURLInNewTab(imgSrc, m_pWindow->GetDocURL(m_contextNode), FALSE);
else
OpenURLInNewWindow(imgSrc, m_pWindow->GetDocURL(m_contextNode), FALSE);
}
void CBrowserFrmTab::OnSysCommand(UINT nID, LPARAM lParam)
{
CBrowserFrame::OnSysCommand(nID, lParam);
if (nID == SC_MAXIMIZE || nID == SC_RESTORE)
m_wndTabs->FixMaximizeRestoreRebarBug();
}
void CBrowserFrmTab::AllowJS(BOOL allow)
{
for (int i=0;i<m_iBrowserCount;i++) {
if (m_Tabs[i])
m_Tabs[i]->GetBrowserWrapper()->AllowJS(allow);
}
}