diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | e9ae80694875f869892f13f4fcaf1170a00dea41 (patch) | |
tree | aa2f8d8a217e2d376224c8d46b7397b68d35de2d /klinkstatus/src/ui/tablelinkstatus.cpp | |
download | tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.tar.gz tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdewebdev@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'klinkstatus/src/ui/tablelinkstatus.cpp')
-rw-r--r-- | klinkstatus/src/ui/tablelinkstatus.cpp | 750 |
1 files changed, 750 insertions, 0 deletions
diff --git a/klinkstatus/src/ui/tablelinkstatus.cpp b/klinkstatus/src/ui/tablelinkstatus.cpp new file mode 100644 index 00000000..695365a9 --- /dev/null +++ b/klinkstatus/src/ui/tablelinkstatus.cpp @@ -0,0 +1,750 @@ +/*************************************************************************** + * Copyright (C) 2004 by Paulo Moura Guedes * + * moura@kdewebdev.org * + * * + * 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 of the License, 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., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "tablelinkstatus.h" +#include "../utils/utils.h" +#include "../parser/url.h" +#include "../global.h" + +#include <qmemarray.h> +#include <qtooltip.h> +#include <qpixmap.h> +#include <qclipboard.h> +#include <qpainter.h> +#include <qprocess.h> + +#include <kapplication.h> +#include <kstandarddirs.h> +#include <krun.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <dcopclient.h> +#include <dcopref.h> + + +/* + +********************* TableLinkstatus *************************** + +*/ + +TableLinkstatus::TableLinkstatus(QWidget * parent, const char * name, + int column_index_status, + int column_index_label, + int column_index_URL) + : QTable(parent, name), + ResultView(column_index_status, column_index_label, column_index_URL) + //context_table_menu_(this, "context_table_menu") +{ + setShowGrid(false); + setSorting(false); + setSelectionMode(QTable::NoSelection); + setFocusStyle(QTable::FollowStyle); + setReadOnly(true); + + verticalHeader()->hide(); + setLeftMargin(0); + + cell_tip_ = new CellToolTip(this); + + sub_menu_ = new QPopupMenu(this, "sub_menu_referrers"); + + connect(this, SIGNAL( contextMenuRequested ( int, int, const QPoint& )), + this, SLOT( slotPopupContextMenu( int, int, const QPoint&)) ); +} + +TableLinkstatus::~TableLinkstatus() +{ + delete cell_tip_; +} + +void TableLinkstatus::setColumns(QStringList const& columns) +{ + ResultView::setColumns(columns); + + removeColunas(); + setNumCols(columns.size()); + + QHeader* horizontal_header = horizontalHeader(); + for(uint i = 0; i != columns.size(); ++i) + { + if(i == 0) + { + Q_ASSERT(columns[i] == i18n("Status") && col_status_ == 1); + setColumnWidth(i, STATUS_COLUMN_WIDTH); + } + else if(i == 1) + { + Q_ASSERT(columns[i] == i18n("Label") && col_label_ == 2); + setColumnWidth(i, width() / 3); + } + else if(i == 2) + Q_ASSERT(columns[i] == i18n("URL") && col_url_ == 3); + + horizontal_header->setLabel(i, i18n(columns[i])); + } + + setColumnStretchable(col_url_ - 1, true); + horizontal_header->adjustHeaderSize(); +} + +void TableLinkstatus::insertResult(LinkStatus const* linkstatus) +{ + insereLinha(generateRowOfTableItems(linkstatus)); +} + +vector<TableItem*> TableLinkstatus::generateRowOfTableItems(LinkStatus const* linkstatus) +{ + vector<TableItem*> items; + int column = 1; + + TableItem* item1 = new TableItemStatus(this, QTableItem::Never, + linkstatus, column++); + TableItem* item2 = new TableItemNome(this, QTableItem::Never, + linkstatus, column++); + TableItem* item3 = new TableItemURL(this, QTableItem::Never, + linkstatus, column++); + items.push_back(item1); + items.push_back(item2); + items.push_back(item3); + + // If more columns are choosed in the settings, create and add the items here + // ... + + return items; +} + +void TableLinkstatus::insereLinha(vector<TableItem*> items) +{ + Q_ASSERT(items.size() == (uint)numCols()); + + setNumRows(numRows() + 1); + int row = numRows() - 1; + + for(vector<TableItem*>::size_type i = 0; i != items.size(); ++i) + { + Q_ASSERT(items[i]); + + int col = items[i]->columnIndex() - 1; + setItem(row, col, items[i]); + } + + if(items[col_url_ - 1]->sizeHint().width() > columnWidth(col_url_ - 1)) + { + setColumnStretchable(col_url_ - 1, false); + setColumnWidth(col_url_ - 1, items[col_url_ - 1]->sizeHint().width()); + } + + ensureCellVisible(row, 0); +} + +void TableLinkstatus::clear() +{ + QMemArray<int> linhas(numRows()); + for(uint i = 0; i != linhas.size(); ++i) + linhas[i] = i + 1; + + removeRows(linhas); + + Q_ASSERT(numRows() == 0); +} + +void TableLinkstatus::removeColunas() +{ + QMemArray<int> columns(numCols()); + for(uint i = 0; i != columns.size(); ++i) + columns[i] = i + 1; + + removeColumns(columns); + + Q_ASSERT(numCols() == 0); +} + +void TableLinkstatus::show(ResultView::Status const& status) +{ + for(int i = 0; i != numRows(); ++i) + { + int row = i; + TableItem* _item = myItem(row, col_status_); + + if(!ResultView::displayableWithStatus(_item->linkStatus(), status)) + hideRow(row); + else + showRow(row); + } +} + +void TableLinkstatus::showAll() +{ + for(int i = 0; i != numRows(); ++i) + showRow(i); +} + +/* +void TableLinkstatus::mostraPorStatusCode(int status_code) +{ + for(int i = 0; i != numRows(); ++i) + { + int row = i + 1; + QTableItem* _item = myItem(row, col_status_); + + if(status_code != _item->text().toInt()) + hideRow(row); + } +} +*/ +/** + Use this procedure when you insert a row at the bottom of the table, + and you only want the to scroll down if you were already at the bottom, + before inserting the row. + This allows you to see what's going on on other cells without having + the table always scrolling down when every row is inserted. +*/ +void TableLinkstatus::ensureCellVisible(int row, int col) +{ + // table viewport is at the bottom + if(rowPos(row - 1) <= (contentsY() + visibleHeight())) + QTable::ensureCellVisible(row, col); +} + +bool TableLinkstatus::textFitsInCell(int row, int col) const +{ + QTableItem* itm(myItem(row, col)); + Q_ASSERT(itm); + + QSize size_hint(itm->sizeHint()); + int visible_width = 0; + + if(col == numCols() - 1) + visible_width = contentsX() + visibleWidth(); + else + visible_width = columnPos(col) + columnWidth(col); + + if(columnPos(col) + size_hint.width() > visible_width) + return false; + else + return true; +} + +bool TableLinkstatus::isEmpty() const +{ + return numRows() == 0; +} + +TableItem* TableLinkstatus::myItem(int row, int col) const +{ + TableItem* _item = dynamic_cast<TableItem*> (QTable::item(row, col)); + Q_ASSERT(_item); + return _item; +} + +void TableLinkstatus::slotPopupContextMenu(int r, int w, const QPoint& pos) +{ + TableItem* table_item = myItem(r, w); + if(table_item) + { + QValueVector<KURL> referrers = table_item->linkStatus()->referrers(); + loadContextTableMenu(referrers, table_item->linkStatus()->isRoot()); + context_table_menu_.popup(pos); + } +} + +void TableLinkstatus::loadContextTableMenu(QValueVector<KURL> const& referrers, bool is_root) +{ + context_table_menu_.clear(); + sub_menu_->clear(); + + if(!is_root) + { + sub_menu_->insertItem(i18n("All"), this, SLOT(slotEditReferrersWithQuanta())); + sub_menu_->insertSeparator(); + + for(uint i = 0; i != referrers.size(); ++i) + { + sub_menu_->insertItem(referrers[i].prettyURL()); + } + connect(sub_menu_, SIGNAL(activated(int)), this, SLOT(slotEditReferrerWithQuanta(int))); + + context_table_menu_.insertItem(SmallIconSet("fileopen"), i18n("Edit Referrer with Quanta"), + sub_menu_); + } + else + { + int id = context_table_menu_.insertItem(SmallIconSet("fileopen"), i18n("Edit Referrer with Quanta")); + context_table_menu_.setItemEnabled(id, false); + } + + context_table_menu_.insertItem(SmallIconSet("fileopen"), i18n("Open URL"), + this, SLOT(slotViewUrlInBrowser())); + + context_table_menu_.insertItem(SmallIconSet("fileopen"), i18n("Open Referrer URL"), + this, SLOT(slotViewParentUrlInBrowser())); + + context_table_menu_.insertSeparator(); + + context_table_menu_.insertItem(SmallIconSet("editcopy"), i18n("Copy URL"), + this, SLOT(slotCopyUrlToClipboard())); + + context_table_menu_.insertItem(SmallIconSet("editcopy"), i18n("Copy Referrer URL"), + this, SLOT(slotCopyParentUrlToClipboard())); + + context_table_menu_.insertItem(SmallIconSet("editcopy"), i18n("Copy Cell Text"), + this, SLOT(slotCopyCellTextToClipboard())); +} + +void TableLinkstatus::slotCopyUrlToClipboard() const +{ + TableItem* _item = myItem(currentRow(), currentColumn()); + QString content(_item->linkStatus()->absoluteUrl().prettyURL()); + QClipboard* cb = kapp->clipboard(); + cb->setText(content); +} + +void TableLinkstatus::slotCopyParentUrlToClipboard() const +{ + TableItem* _item = myItem(currentRow(), currentColumn()); + QString content(_item->linkStatus()->parent()->absoluteUrl().prettyURL()); + QClipboard* cb = kapp->clipboard(); + cb->setText(content); +} + +void TableLinkstatus::slotCopyCellTextToClipboard() const +{ + QString cell_text(text(currentRow(), currentColumn())); + QClipboard* cb = kapp->clipboard(); + cb->setText(cell_text); +} + +void TableLinkstatus::slotEditReferrersWithQuanta() +{ + TableItem* _item = myItem(currentRow(), currentColumn()); + QValueVector<KURL> referrers = _item->linkStatus()->referrers(); + + if(Global::isQuantaAvailableViaDCOP()) + { + for(uint i = 0; i != referrers.size(); ++i) + slotEditReferrerWithQuanta(referrers[i]); + } + else + { + QStringList list_urls; + + for(uint i = 0; i != referrers.size(); ++i) + list_urls.append(referrers[i].url()); + + Global::openQuanta(list_urls); + } +} + +void TableLinkstatus::slotEditReferrerWithQuanta(int id) +{ + int index = sub_menu_->indexOf(id); + + if(index == 0) + return; + Q_ASSERT(index != -1); + Q_ASSERT(index != 1); // separator + + //kdDebug(23100) << "id: " << id << endl; + //kdDebug(23100) << "index: " << index << endl; + + index -= 2; // The list of referrers starts on index = 2 + + TableItem* _item = myItem(currentRow(), currentColumn()); + QValueVector<KURL> referrers = _item->linkStatus()->referrers(); + Q_ASSERT(index >= 0 && (uint)index < referrers.size()); + + slotEditReferrerWithQuanta(referrers[index]); +} + +void TableLinkstatus::slotEditReferrerWithQuanta(KURL const& url) +{ + QString filePath = url.url(); + + if(Global::isQuantaAvailableViaDCOP()) + { + DCOPRef quanta(Global::quantaDCOPAppId(),"WindowManagerIf"); + bool success = quanta.send("openFile", filePath, 0, 0); + + if(!success) + { + QString message = i18n("<qt>File <b>%1</b> cannot be opened. Might be a DCOP problem.</qt>").arg(filePath); + KMessageBox::error(parentWidget(), message); + } + } + else + { + QStringList args(url.url()); + Global::openQuanta(args); + } +} + +void TableLinkstatus::slotViewUrlInBrowser() +{ + TableItem* _item = myItem(currentRow(), currentColumn()); + KURL url = _item->linkStatus()->absoluteUrl(); + + if(url.isValid()) + { + (void) new KRun (url, 0, url.isLocalFile(), true); + } + else + KMessageBox::sorry(this, i18n("Invalid URL.")); +} + +void TableLinkstatus::slotViewParentUrlInBrowser() +{ + TableItem* _item = myItem(currentRow(), currentColumn()); + + if(_item->linkStatus()->isRoot()) + { + KMessageBox::sorry(this, i18n("ROOT URL.")); + } + else + { + LinkStatus const* ls_parent = _item->linkStatus()->parent(); + Q_ASSERT(ls_parent); + + KURL url = ls_parent->absoluteUrl(); + + if(url.isValid()) + (void) new KRun (url, 0, url.isLocalFile(), true); + else + KMessageBox::sorry(this, i18n("Invalid URL.")); + } +} + +/* + +********************* TableItem *************************** + +*/ + +TableItem::TableItem(QTable* table, EditType et, + LinkStatus const* linkstatus, + int column_index, int alignment) + : QTableItem(table, et, ""), ResultViewItem(linkstatus, column_index), + /*ls_((LinkStatus*)linkstatus), + column_index_(column_index),*/ alignment_(alignment) +{ + //Q_ASSERT(ls_); + //Q_ASSERT(column_index_ > 0); +} + +TableItem::~TableItem() +{} + +void TableItem::setColumnIndex(int i) +{ + Q_ASSERT(i > 0 && i <= table()->numCols()); + + //column_index_ = i; + ResultViewItem::setColumnIndex(i); +} + +int TableItem::columnIndex() const +{ + Q_ASSERT(column_index_ <= table()->numCols()); + + return ResultViewItem::columnIndex(); +} + +void TableItem::setAlignment(int aFlags) +{ + alignment_ = aFlags; +} + +int TableItem::alignment() const +{ + return alignment_; +} +/* +LinkStatus const* const TableItem::linkStatus() const +{ + Q_ASSERT(ls_); + return ls_; +} + +QColor const& TableItem::textStatusColor() const +{ + if(linkStatus()->errorOccurred()) + { + //kdDebug(23100) << "ERROR: " << linkStatus()->error() << ": " << linkStatus()->absoluteUrl().prettyURL() << endl; + if(linkStatus()->error() == i18n( "Javascript not supported" )) + return Qt::lightGray; + else + return Qt::red; + } + + else if(linkStatus()->absoluteUrl().hasRef()) + return Qt::blue; + + else if(linkStatus()->absoluteUrl().protocol() != "http" && + linkStatus()->absoluteUrl().protocol() != "https") + return Qt::darkGreen; + + else + { + QString status_code(QString::number(linkStatus()->httpHeader().statusCode())); + + if(status_code[0] == '0') + { + kdWarning(23100) << "status code == 0: " << endl; + kdWarning(23100) << linkStatus()->toString() << endl; + kdWarning(23100) << linkStatus()->httpHeader().toString() << endl; + } + //Q_ASSERT(status_code[0] != '0'); + + if(status_code[0] == '5') + return Qt::darkMagenta; + + else if(status_code[0] == '4') + return Qt::red; + + else if(status_code[0] == '3') + return Qt::blue; + + else if(status_code[0] == '2') + return Qt::darkGreen; + + else + return Qt::red; + } +} +*/ + +/* + +********************* TableItemURL *************************** + +*/ + +TableItemURL::TableItemURL(QTable* table, EditType et, + LinkStatus const* linkstatus, int column_index) + : TableItem(table, et, linkstatus, column_index) +{ + setText(); +} + +void TableItemURL::setText() +{ + if(linkStatus()->node() && linkStatus()->malformed()) + { + if(linkStatus()->node()->url().isEmpty()) + QTableItem::setText( linkStatus()->node()->content().simplifyWhiteSpace() ); + else + QTableItem::setText( linkStatus()->node()->url() ); + } + else + { + KURL url = linkStatus()->absoluteUrl(); + QTableItem::setText(::convertToLocal(linkStatus())); + } +} + +void TableItemURL::setPixmap() +{} + +QString TableItemURL::toolTip() const +{ + return text(); // Pode parecer repeticao mas nao eh... Ver construtor +} + +void TableItemURL::paint( QPainter *p, const QColorGroup &cg, + const QRect &cr, bool selected ) +{ + // Get a color to draw the text + QColorGroup m_cg(cg); + QColor color(textStatusColor()); + m_cg.setColor(QColorGroup::Text, color); + + QTableItem::paint(p, m_cg, cr, selected); +} + +QColor const& TableItemURL::textStatusColor() const +{ + // TODO clean this code + + QString status_code(QString::number(linkStatus()->httpHeader().statusCode())); + + if(linkStatus()->errorOccurred()) + { + if(linkStatus()->error().contains(i18n( "Timeout" ))) + return darkMagenta; + else if(linkStatus()->error().contains(i18n( "not supported" ))) + return lightGray; + else + return red; + } + else if(linkStatus()->absoluteUrl().protocol() != "http" && + linkStatus()->absoluteUrl().protocol() != "https") + return black; + + else if(status_code[0] == '5') + return darkMagenta; + + else if(status_code[0] == '4') + return red; + + else + return black; +} + +/* + +********************* TableItemStatus *************************** + +*/ + +TableItemStatus::TableItemStatus(QTable* table, EditType et, + LinkStatus const* linkstatus, int column_index) + : TableItem(table, et, linkstatus, column_index) +{ + setAlignment(Qt::AlignHCenter /*| Qt :: AlignVCenter*/); + setText(); + setPixmap(); +} + +void TableItemStatus::setText() +{ + if(linkStatus()->errorOccurred() || + linkStatus()->status() == "OK" || + linkStatus()->status() == "304") + { + QTableItem::setText(""); + } + else + { + /* + if(linkStatus()->httpHeader().statusCode() == 0) + { + kdDebug(23100) << "TableItemStatus::setText : statusCode() == 0" << endl; + kdDebug(23100) << linkStatus()->toString() << endl; + kdDebug(23100) << linkStatus()->docHtml() << endl; + } + */ + //Q_ASSERT(linkStatus()->httpHeader().statusCode() != 0); //<------------------------------------------------------------ + //QTableItem::setText( QString::number(linkStatus()->httpHeader().statusCode()) ); + QTableItem::setText( linkStatus()->status() ); + } +} + +void TableItemStatus::setPixmap() +{ + if(linkStatus()->errorOccurred()) + { + + if(linkStatus()->error().contains(i18n( "Timeout" ))) + { + QTableItem::setPixmap(SmallIcon("kalarm")); + } + else if(linkStatus()->error() == i18n( "Malformed" )) + { + QTableItem::setPixmap(SmallIcon("bug")); + } + else + { + QTableItem::setPixmap(SmallIcon("no")); + } + } + else if(linkStatus()->status() == "304") + QTableItem::setPixmap(UserIcon("304")); + + else if(linkStatus()->status() == "OK") + QTableItem::setPixmap(SmallIcon("ok")); +} + +QString TableItemStatus::toolTip() const +{ + if(linkStatus()->errorOccurred() || + linkStatus()->absoluteUrl().hasRef() || + (linkStatus()->absoluteUrl().protocol() != "http" && + linkStatus()->absoluteUrl().protocol() != "https")) + { + return i18n("%1").arg(linkStatus()->status()); + } + else + return i18n("%1").arg(linkStatus()->httpHeader().reasonPhrase()); +} + +void TableItemStatus::paint( QPainter *p, const QColorGroup &cg, + const QRect &cr, bool selected ) +{ + p->fillRect( 0, 0, cr.width(), cr.height(), + selected ? cg.brush( QColorGroup::Highlight ) + : cg.brush( QColorGroup::Base ) ); + + int w = cr.width(); + int h = cr.height(); + + int x = 0; + if ( !pixmap().isNull() ) + { + p->drawPixmap( ( w - pixmap().width() ) / 2, + ( h - pixmap().height() ) / 2, + pixmap() ); + x = pixmap().width() + 2; + } + + // Get a color to draw the text + QColorGroup m_cg(cg); + QColor color(textStatusColor()); + m_cg.setColor(QColorGroup::Text, color); + + //QTableItem::paint(p, m_cg, cr, selected); + + if ( selected ) + p->setPen( m_cg.highlightedText() ); + else + p->setPen( m_cg.text() ); + p->drawText( x + 2, 0, w - x - 4, h, + wordWrap() ? (alignment() | WordBreak) : alignment(), text() ); +} + +/* + +********************* TableItemNome *************************** + +*/ + +TableItemNome::TableItemNome(QTable* table, EditType et, + LinkStatus const* linkstatus, int column_index) + : TableItem(table, et, linkstatus, column_index) +{ + setText(); +} + +void TableItemNome::setText() +{ + QString label(linkStatus()->label()); + if(!label.isNull()) + QTableItem::setText(label.simplifyWhiteSpace()); +} + +void TableItemNome::setPixmap() +{} + +QString TableItemNome::toolTip() const +{ + return text(); // Pode parecer repeticao mas nao eh... Ver construtor +} + +#include "tablelinkstatus.moc" |