urllineedit.cpp
上传用户:huahtool
上传日期:2015-12-10
资源大小:1089k
文件大小:10k
源码类别:

浏览器

开发平台:

Visual C++

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the demonstration applications of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #include "urllineedit.h"
  38. #include "browserapplication.h"
  39. #include "searchlineedit.h"
  40. #include "webview.h"
  41. #include <QtCore/QEvent>
  42. #include <QtGui/QApplication>
  43. #include <QtGui/QCompleter>
  44. #include <QtGui/QFocusEvent>
  45. #include <QtGui/QHBoxLayout>
  46. #include <QtGui/QLabel>
  47. #include <QtGui/QLineEdit>
  48. #include <QtGui/QPainter>
  49. #include <QtGui/QStyle>
  50. #include <QtGui/QStyleOptionFrameV2>
  51. #include <QtCore/QDebug>
  52. ExLineEdit::ExLineEdit(QWidget *parent)
  53.     : QWidget(parent)
  54.     , m_leftWidget(0)
  55.     , m_lineEdit(new QLineEdit(this))
  56.     , m_clearButton(0)
  57. {
  58.     setFocusPolicy(m_lineEdit->focusPolicy());
  59.     setAttribute(Qt::WA_InputMethodEnabled);
  60.     setSizePolicy(m_lineEdit->sizePolicy());
  61.     setBackgroundRole(m_lineEdit->backgroundRole());
  62.     setMouseTracking(true);
  63.     setAcceptDrops(true);
  64.     setAttribute(Qt::WA_MacShowFocusRect, true);
  65.     QPalette p = m_lineEdit->palette();
  66.     setPalette(p);
  67.     // line edit
  68.     m_lineEdit->setFrame(false);
  69.     m_lineEdit->setFocusProxy(this);
  70.     m_lineEdit->setAttribute(Qt::WA_MacShowFocusRect, false);
  71.     QPalette clearPalette = m_lineEdit->palette();
  72.     clearPalette.setBrush(QPalette::Base, QBrush(Qt::transparent));
  73.     m_lineEdit->setPalette(clearPalette);
  74.     // clearButton
  75.     m_clearButton = new ClearButton(this);
  76.     connect(m_clearButton, SIGNAL(clicked()),
  77.             m_lineEdit, SLOT(clear()));
  78.     connect(m_lineEdit, SIGNAL(textChanged(const QString&)),
  79.             m_clearButton, SLOT(textChanged(const QString&)));
  80. }
  81. void ExLineEdit::setLeftWidget(QWidget *widget)
  82. {
  83.     m_leftWidget = widget;
  84. }
  85. QWidget *ExLineEdit::leftWidget() const
  86. {
  87.     return m_leftWidget;
  88. }
  89. void ExLineEdit::resizeEvent(QResizeEvent *event)
  90. {
  91.     Q_ASSERT(m_leftWidget);
  92.     updateGeometries();
  93.     QWidget::resizeEvent(event);
  94. }
  95. void ExLineEdit::updateGeometries()
  96. {
  97.     QStyleOptionFrameV2 panel;
  98.     initStyleOption(&panel);
  99.     QRect rect = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
  100.     int height = rect.height();
  101.     int width = rect.width();
  102.     int m_leftWidgetHeight = m_leftWidget->height();
  103.     m_leftWidget->setGeometry(rect.x() + 2,          rect.y() + (height - m_leftWidgetHeight)/2,
  104.                               m_leftWidget->width(), m_leftWidget->height());
  105.     int clearButtonWidth = this->height();
  106.     m_lineEdit->setGeometry(m_leftWidget->x() + m_leftWidget->width(),        0,
  107.                             width - clearButtonWidth - m_leftWidget->width(), this->height());
  108.     m_clearButton->setGeometry(this->width() - clearButtonWidth, 0,
  109.                                clearButtonWidth, this->height());
  110. }
  111. void ExLineEdit::initStyleOption(QStyleOptionFrameV2 *option) const
  112. {
  113.     option->initFrom(this);
  114.     option->rect = contentsRect();
  115.     option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, option, this);
  116.     option->midLineWidth = 0;
  117.     option->state |= QStyle::State_Sunken;
  118.     if (m_lineEdit->isReadOnly())
  119.         option->state |= QStyle::State_ReadOnly;
  120. #ifdef QT_KEYPAD_NAVIGATION
  121.     if (hasEditFocus())
  122.         option->state |= QStyle::State_HasEditFocus;
  123. #endif
  124.     option->features = QStyleOptionFrameV2::None;
  125. }
  126. QSize ExLineEdit::sizeHint() const
  127. {
  128.     m_lineEdit->setFrame(true);
  129.     QSize size = m_lineEdit->sizeHint();
  130.     m_lineEdit->setFrame(false);
  131.     return size;
  132. }
  133. void ExLineEdit::focusInEvent(QFocusEvent *event)
  134. {
  135.     m_lineEdit->event(event);
  136.     QWidget::focusInEvent(event);
  137. }
  138. void ExLineEdit::focusOutEvent(QFocusEvent *event)
  139. {
  140.     m_lineEdit->event(event);
  141.     if (m_lineEdit->completer()) {
  142.         connect(m_lineEdit->completer(), SIGNAL(activated(QString)),
  143.                          m_lineEdit, SLOT(setText(QString)));
  144.         connect(m_lineEdit->completer(), SIGNAL(highlighted(QString)),
  145.                          m_lineEdit, SLOT(_q_completionHighlighted(QString)));
  146.     }
  147.     QWidget::focusOutEvent(event);
  148. }
  149. void ExLineEdit::keyPressEvent(QKeyEvent *event)
  150. {
  151.     m_lineEdit->event(event);
  152.     QWidget::keyPressEvent(event);
  153. }
  154. bool ExLineEdit::event(QEvent *event)
  155. {
  156.     if (event->type() == QEvent::ShortcutOverride)
  157.         m_lineEdit->event(event);
  158.     return QWidget::event(event);
  159. }
  160. void ExLineEdit::paintEvent(QPaintEvent *)
  161. {
  162.     QPainter p(this);
  163.     QStyleOptionFrameV2 panel;
  164.     initStyleOption(&panel);
  165.     style()->drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &p, this);
  166. }
  167. class UrlIconLabel : public QLabel
  168. {
  169. public:
  170.     UrlIconLabel(QWidget *parent);
  171.     WebView *m_webView;
  172. protected:
  173.     void mousePressEvent(QMouseEvent *event);
  174.     void mouseMoveEvent(QMouseEvent *event);
  175. private:
  176.     QPoint m_dragStartPos;
  177. };
  178. UrlIconLabel::UrlIconLabel(QWidget *parent)
  179.     : QLabel(parent)
  180.     , m_webView(0)
  181. {
  182.     setMinimumWidth(16);
  183.     setMinimumHeight(16);
  184. }
  185. void UrlIconLabel::mousePressEvent(QMouseEvent *event)
  186. {
  187.     if (event->button() == Qt::LeftButton)
  188.         m_dragStartPos = event->pos();
  189.     QLabel::mousePressEvent(event);
  190. }
  191. void UrlIconLabel::mouseMoveEvent(QMouseEvent *event)
  192. {
  193.     if (event->buttons() == Qt::LeftButton
  194.         && (event->pos() - m_dragStartPos).manhattanLength() > QApplication::startDragDistance()
  195.          && m_webView) {
  196.         QDrag *drag = new QDrag(this);
  197.         QMimeData *mimeData = new QMimeData;
  198.         mimeData->setText(m_webView->url().toString());
  199.         QList<QUrl> urls;
  200.         urls.append(m_webView->url());
  201.         mimeData->setUrls(urls);
  202.         drag->setMimeData(mimeData);
  203.         drag->exec();
  204.     }
  205. }
  206. UrlLineEdit::UrlLineEdit(QWidget *parent)
  207.     : ExLineEdit(parent)
  208.     , m_webView(0)
  209.     , m_iconLabel(0)
  210. {
  211.     // icon
  212.     m_iconLabel = new UrlIconLabel(this);
  213.     m_iconLabel->resize(16, 16);
  214.     setLeftWidget(m_iconLabel);
  215.     m_defaultBaseColor = palette().color(QPalette::Base);
  216.     webViewIconChanged();
  217. }
  218. void UrlLineEdit::setWebView(WebView *webView)
  219. {
  220.     Q_ASSERT(!m_webView);
  221.     m_webView = webView;
  222.     m_iconLabel->m_webView = webView;
  223.     connect(webView, SIGNAL(urlChanged(const QUrl &)),
  224.         this, SLOT(webViewUrlChanged(const QUrl &)));
  225.     connect(webView, SIGNAL(loadFinished(bool)),
  226.         this, SLOT(webViewIconChanged()));
  227.     connect(webView, SIGNAL(iconChanged()),
  228.         this, SLOT(webViewIconChanged()));
  229.     connect(webView, SIGNAL(loadProgress(int)),
  230.         this, SLOT(update()));
  231. }
  232. void UrlLineEdit::webViewUrlChanged(const QUrl &url)
  233. {
  234.     m_lineEdit->setText(url.toString());
  235.     m_lineEdit->setCursorPosition(0);
  236. }
  237. void UrlLineEdit::webViewIconChanged()
  238. {
  239.     QUrl url = (m_webView)  ? m_webView->url() : QUrl();
  240.     QIcon icon = BrowserApplication::instance()->icon(url);
  241.     QPixmap pixmap(icon.pixmap(16, 16));
  242.     m_iconLabel->setPixmap(pixmap);
  243. }
  244. QLinearGradient UrlLineEdit::generateGradient(const QColor &color) const
  245. {
  246.     QLinearGradient gradient(0, 0, 0, height());
  247.     gradient.setColorAt(0, m_defaultBaseColor);
  248.     gradient.setColorAt(0.15, color.lighter(120));
  249.     gradient.setColorAt(0.5, color);
  250.     gradient.setColorAt(0.85, color.lighter(120));
  251.     gradient.setColorAt(1, m_defaultBaseColor);
  252.     return gradient;
  253. }
  254. void UrlLineEdit::focusOutEvent(QFocusEvent *event)
  255. {
  256.     if (m_lineEdit->text().isEmpty() && m_webView)
  257.         m_lineEdit->setText(m_webView->url().toString());
  258.     ExLineEdit::focusOutEvent(event);
  259. }
  260. void UrlLineEdit::paintEvent(QPaintEvent *event)
  261. {
  262.     QPalette p = palette();
  263.     if (m_webView && m_webView->url().scheme() == QLatin1String("https")) {
  264.         QColor lightYellow(248, 248, 210);
  265.         p.setBrush(QPalette::Base, generateGradient(lightYellow));
  266.     } else {
  267.         p.setBrush(QPalette::Base, m_defaultBaseColor);
  268.     }
  269.     setPalette(p);
  270.     ExLineEdit::paintEvent(event);
  271.     QPainter painter(this);
  272.     QStyleOptionFrameV2 panel;
  273.     initStyleOption(&panel);
  274.     QRect backgroundRect = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
  275.     if (m_webView && !hasFocus()) {
  276.         int progress = m_webView->progress();
  277.         QColor loadingColor = QColor(116, 192, 250);
  278.         painter.setBrush(generateGradient(loadingColor));
  279.         painter.setPen(Qt::transparent);
  280.         int mid = backgroundRect.width() / 100 * progress;
  281.         QRect progressRect(backgroundRect.x(), backgroundRect.y(), mid, backgroundRect.height());
  282.         painter.drawRect(progressRect);
  283.     }
  284. }