00001 #include <stdlib.h>
00002 #include <iostream>
00003
00004
00005 #include <QEvent>
00006
00007
00008 #include "mythlogging.h"
00009 #include "mythcontext.h"
00010 #include "mythmainwindow.h"
00011 #include "mythuihelper.h"
00012
00013
00014 #include "webpage.h"
00015 #include "bookmarkeditor.h"
00016 #include "mythbrowser.h"
00017
00018
00019 using namespace std;
00020
00021 MythBrowser::MythBrowser(MythScreenStack *parent,
00022 QStringList &urlList, float zoom)
00023 : MythScreenType (parent, "mythbrowser"),
00024 m_urlList(urlList), m_pageList(NULL),
00025 m_progressBar(NULL), m_titleText(NULL),
00026 m_statusText(NULL), m_currentBrowser(-1),
00027 m_zoom(zoom), m_menuPopup(NULL),
00028 m_defaultFavIcon(NULL)
00029 {
00030 GetMythMainWindow()->PauseIdleTimer(true);
00031 }
00032
00033 MythBrowser::~MythBrowser()
00034 {
00035 while (!m_browserList.isEmpty())
00036 delete m_browserList.takeFirst();
00037 GetMythMainWindow()->PauseIdleTimer(false);
00038 }
00039
00040 bool MythBrowser::Create(void)
00041 {
00042 bool foundtheme = false;
00043
00044
00045 foundtheme = LoadWindowFromXML("browser-ui.xml", "browser", this);
00046
00047 if (!foundtheme)
00048 return false;
00049
00050 MythUIWebBrowser *browser = dynamic_cast<MythUIWebBrowser *> (GetChild("webbrowser"));
00051 m_progressBar = dynamic_cast<MythUIProgressBar *>(GetChild("progressbar"));
00052 m_statusText = dynamic_cast<MythUIText *>(GetChild("status"));
00053 m_titleText = dynamic_cast<MythUIText *>(GetChild("title"));
00054 m_pageList = dynamic_cast<MythUIButtonList *>(GetChild("pagelist"));
00055
00056 if (!browser || !m_pageList)
00057 {
00058 LOG(VB_GENERAL, LOG_ERR, "Theme is missing critical theme elements.");
00059 return false;
00060 }
00061
00062 connect(m_pageList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00063 this, SLOT(slotTabSelected(MythUIButtonListItem*)));
00064
00065
00066 QString favIcon = "mb_default_favicon.png";
00067 GetMythUI()->FindThemeFile(favIcon);
00068 if (QFile::exists(favIcon))
00069 {
00070 QImage image(favIcon);
00071 m_defaultFavIcon = GetMythPainter()->GetFormatImage();
00072 m_defaultFavIcon->Assign(image);
00073 m_defaultFavIcon->UpRef();
00074 }
00075
00076
00077 WebPage *page = new WebPage(this, browser);
00078
00079 m_browserList.append(page);
00080 page->getBrowser()->SetZoom(m_zoom);
00081 page->getBrowser()->SetDefaultSaveDirectory(m_defaultSaveDir);
00082 page->getBrowser()->SetDefaultSaveFilename(m_defaultSaveFilename);
00083
00084 page->SetActive(true);
00085
00086 connect(page, SIGNAL(loadProgress(int)),
00087 this, SLOT(slotLoadProgress(int)));
00088 connect(page, SIGNAL(statusBarMessage(const QString&)),
00089 this, SLOT(slotStatusBarMessage(const QString&)));
00090
00091 if (m_progressBar)
00092 m_progressBar->SetTotal(100);
00093
00094 BuildFocusList();
00095
00096 SetFocusWidget(browser);
00097
00098 slotOpenURL(m_urlList[0]);
00099
00100 for (int x = 1; x < m_urlList.size(); x++)
00101 slotAddTab(m_urlList[x], false);
00102
00103 switchTab(0);
00104
00105 return true;
00106 }
00107
00108 MythUIWebBrowser* MythBrowser::activeBrowser(void)
00109 {
00110 if (m_currentBrowser >=0 && m_currentBrowser < m_browserList.size())
00111 return m_browserList[m_currentBrowser]->getBrowser();
00112 else
00113 return m_browserList[0]->getBrowser();
00114 }
00115
00116 void MythBrowser::slotEnterURL(void)
00117 {
00118 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
00119
00120 QString message = tr("Enter URL");
00121
00122
00123 MythTextInputDialog *dialog = new MythTextInputDialog(popupStack, message);
00124
00125 if (dialog->Create())
00126 popupStack->AddScreen(dialog);
00127
00128 connect(dialog, SIGNAL(haveResult(QString)),
00129 SLOT(slotOpenURL(QString)), Qt::QueuedConnection);
00130 }
00131
00132 void MythBrowser::slotAddTab(const QString &url, bool doSwitch)
00133 {
00134 QString name = QString("browser%1").arg(m_browserList.size() + 1);
00135 WebPage *page = new WebPage(this, m_browserList[0]->getBrowser()->GetArea(),
00136 name.toAscii().constData());
00137 page->getBrowser()->SetZoom(m_zoom);
00138
00139 m_browserList.append(page);
00140
00141 QString newUrl = url;
00142
00143 if (newUrl.isEmpty())
00144 newUrl = "http://www.google.com";
00145
00146 if (!newUrl.startsWith("http://") && !newUrl.startsWith("https://") &&
00147 !newUrl.startsWith("file:/") )
00148 newUrl.prepend("http://");
00149 page->getBrowser()->LoadPage(QUrl::fromEncoded(newUrl.toLocal8Bit()));
00150
00151 page->SetActive(false);
00152
00153 connect(page, SIGNAL(loadProgress(int)),
00154 this, SLOT(slotLoadProgress(int)));
00155 connect(page, SIGNAL(statusBarMessage(const QString&)),
00156 this, SLOT(slotStatusBarMessage(const QString&)));
00157
00158 if (doSwitch)
00159 m_pageList->SetItemCurrent(m_browserList.size() -1);
00160 }
00161
00162 void MythBrowser::slotDeleteTab(void)
00163 {
00164 if (m_browserList.size() < 2)
00165 return;
00166
00167 if (m_currentBrowser >= 0 && m_currentBrowser < m_browserList.size())
00168 {
00169 int tab = m_currentBrowser;
00170 m_currentBrowser = -1;
00171 WebPage *page = m_browserList.takeAt(tab);
00172 delete page;
00173
00174 if (tab >= m_browserList.size())
00175 tab = m_browserList.size() - 1;
00176
00177 switchTab(tab);
00178 }
00179 }
00180
00181 void MythBrowser::switchTab(int newTab)
00182 {
00183 if (newTab == m_currentBrowser)
00184 return;
00185
00186 if (newTab < 0 || newTab >= m_browserList.size())
00187 return;
00188
00189 if (m_currentBrowser >= 0 && m_currentBrowser < m_browserList.size())
00190 m_browserList[m_currentBrowser]->SetActive(false);
00191
00192 BuildFocusList();
00193
00194 m_browserList[newTab]->SetActive(true);
00195
00196 m_currentBrowser = newTab;
00197
00198 if (GetFocusWidget() != m_pageList)
00199 SetFocusWidget(activeBrowser());
00200 }
00201
00202 void MythBrowser::slotOpenURL(const QString &url)
00203 {
00204 QString sUrl = url;
00205 if (!sUrl.startsWith("http://") && !sUrl.startsWith("https://") &&
00206 !sUrl.startsWith("file:/") )
00207 sUrl.prepend("http://");
00208
00209 activeBrowser()->LoadPage(QUrl::fromEncoded(sUrl.toLocal8Bit()));
00210 }
00211
00212 void MythBrowser::slotZoomOut()
00213 {
00214 activeBrowser()->ZoomOut();
00215 }
00216
00217 void MythBrowser::slotZoomIn()
00218 {
00219 activeBrowser()->ZoomIn();
00220 }
00221
00222 void MythBrowser::slotBack()
00223 {
00224 activeBrowser()->Back();
00225 }
00226
00227 void MythBrowser::slotForward()
00228 {
00229 activeBrowser()->Forward();
00230 }
00231
00232 void MythBrowser::slotAddBookmark()
00233 {
00234 m_editBookmark.category = "";
00235 m_editBookmark.name = m_pageList->GetValue();
00236 m_editBookmark.url = activeBrowser()->GetUrl().toString();
00237
00238 MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
00239
00240 BookmarkEditor *editor = new BookmarkEditor(&m_editBookmark,
00241 true, mainStack, "bookmarkeditor");
00242
00243
00244 if (editor->Create())
00245 mainStack->AddScreen(editor);
00246 }
00247
00248 void MythBrowser::slotLoadStarted(void)
00249 {
00250 MythUIButtonListItem *item = m_pageList->GetItemCurrent();
00251 if (item)
00252 item->SetText(tr("Loading..."));
00253 }
00254
00255 void MythBrowser::slotLoadFinished(bool OK)
00256 {
00257 (void) OK;
00258
00259 if (m_progressBar)
00260 m_progressBar->SetUsed(0);
00261 }
00262
00263 void MythBrowser::slotLoadProgress(int progress)
00264 {
00265 if (m_progressBar)
00266 m_progressBar->SetUsed(progress);
00267 }
00268
00269 void MythBrowser::slotTitleChanged(const QString &title)
00270 {
00271 MythUIButtonListItem *item = m_pageList->GetItemCurrent();
00272 if (item)
00273 item->SetText(title);
00274 }
00275
00276 void MythBrowser::slotStatusBarMessage(const QString &text)
00277 {
00278 if (m_statusText)
00279 m_statusText->SetText(text);
00280 }
00281
00282 void MythBrowser::slotTabSelected(MythUIButtonListItem *item)
00283 {
00284 if (!item)
00285 return;
00286
00287 switchTab(m_pageList->GetCurrentPos());
00288 slotStatusBarMessage(item->GetText());
00289 }
00290
00291 void MythBrowser::slotTabLosingFocus(void)
00292 {
00293 SetFocusWidget(activeBrowser());
00294 }
00295
00296 bool MythBrowser::keyPressEvent(QKeyEvent *event)
00297 {
00298
00299 if (GetFocusWidget()->keyPressEvent(event))
00300 return true;
00301
00302 bool handled = false;
00303 QStringList actions;
00304 handled = GetMythMainWindow()->TranslateKeyPress("Browser", event, actions);
00305
00306 for (int i = 0; i < actions.size() && !handled; i++)
00307 {
00308
00309 QString action = actions[i];
00310 handled = true;
00311
00312 if (action == "MENU")
00313 {
00314 slotStatusBarMessage("");
00315
00316 QString label = tr("Actions");
00317
00318 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
00319
00320 m_menuPopup = new MythDialogBox(label, popupStack, "actionmenu");
00321
00322 if (m_menuPopup->Create())
00323 popupStack->AddScreen(m_menuPopup);
00324
00325 m_menuPopup->SetReturnEvent(this, "action");
00326
00327 m_menuPopup->AddButton(tr("Enter URL"), SLOT(slotEnterURL()));
00328
00329 if (activeBrowser()->CanGoBack())
00330 m_menuPopup->AddButton(tr("Back"), SLOT(slotBack()));
00331
00332 if (activeBrowser()->CanGoForward())
00333 m_menuPopup->AddButton(tr("Forward"), SLOT(slotForward()));
00334
00335 m_menuPopup->AddButton(tr("Zoom In"), SLOT(slotZoomIn()));
00336 m_menuPopup->AddButton(tr("Zoom Out"), SLOT(slotZoomOut()));
00337 m_menuPopup->AddButton(tr("New Tab"), SLOT(slotAddTab()));
00338
00339 if (m_browserList.size() > 1)
00340 m_menuPopup->AddButton(tr("Delete Tab"), SLOT(slotDeleteTab()));
00341
00342 m_menuPopup->AddButton(tr("Add Bookmark"), SLOT(slotAddBookmark()));
00343 }
00344 else if (action == "INFO")
00345 {
00346 if (GetFocusWidget() == m_pageList)
00347 SetFocusWidget(activeBrowser());
00348 else
00349 SetFocusWidget(m_pageList);
00350 }
00351 else if (action == "ESCAPE")
00352 {
00353 GetScreenStack()->PopScreen(true, true);
00354 }
00355 else if (action == "PREVTAB")
00356 {
00357 int pos = m_pageList->GetCurrentPos();
00358 if (pos > 0)
00359 m_pageList->SetItemCurrent(--pos);
00360 }
00361 else if (action == "NEXTTAB")
00362 {
00363 int pos = m_pageList->GetCurrentPos();
00364 if (pos < m_pageList->GetCount() - 1)
00365 m_pageList->SetItemCurrent(++pos);
00366 }
00367 else if (action == "DELETE")
00368 {
00369 slotDeleteTab();
00370 }
00371 else
00372 handled = false;
00373 }
00374
00375 if (!handled && MythScreenType::keyPressEvent(event))
00376 handled = true;
00377
00378 return handled;
00379 }
00380
00381