diff options
Diffstat (limited to 'kexi/widget/relations/kexirelationviewtable.cpp')
-rw-r--r-- | kexi/widget/relations/kexirelationviewtable.cpp | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/kexi/widget/relations/kexirelationviewtable.cpp b/kexi/widget/relations/kexirelationviewtable.cpp new file mode 100644 index 00000000..97beaa87 --- /dev/null +++ b/kexi/widget/relations/kexirelationviewtable.cpp @@ -0,0 +1,429 @@ +/* This file is part of the KDE project + Copyright (C) 2002, 2003 Lucijan Busch <[email protected]> + Copyright (C) 2003-2007 Jaroslaw Staniek <[email protected]> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include <stdlib.h> + +#include <qheader.h> +#include <qlayout.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qcursor.h> +#include <qpoint.h> +#include <qapplication.h> +#include <qbitmap.h> +#include <qstyle.h> + +#include <kdebug.h> +#include <kiconloader.h> +#include <kdeversion.h> +#include <kconfig.h> +#include <kglobalsettings.h> + +#include <kexidb/tableschema.h> +#include <kexidb/utils.h> +#include <kexidragobjects.h> +#include "kexirelationviewtable.h" +#include "kexirelationview.h" + +KexiRelationViewTableContainer::KexiRelationViewTableContainer( + KexiRelationView *parent, KexiDB::TableOrQuerySchema *schema) + : QFrame(parent,"KexiRelationViewTableContainer" ) +// , m_table(t) + , m_parent(parent) +// , m_mousePressed(false) +{ + +// setFixedSize(100, 150); +//js: resize(100, 150); + //setMouseTracking(true); + + setFrameStyle( QFrame::WinPanel | QFrame::Raised ); + + QVBoxLayout *lyr = new QVBoxLayout(this,4,1); //js: using Q*BoxLayout is a good idea + + m_tableHeader = new KexiRelationViewTableContainerHeader(schema->name(), this); + + m_tableHeader->unsetFocus(); + m_tableHeader->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed)); + lyr->addWidget(m_tableHeader); + connect(m_tableHeader,SIGNAL(moved()),this,SLOT(moved())); + connect(m_tableHeader, SIGNAL(endDrag()), this, SIGNAL(endDrag())); + + m_tableView = new KexiRelationViewTable(schema, parent, this, "KexiRelationViewTable"); + //m_tableHeader->setFocusProxy( m_tableView ); + m_tableView->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum)); + + m_tableView->setMaximumSize( m_tableView->sizeHint() ); + +// m_tableView->resize( m_tableView->sizeHint() ); + lyr->addWidget(m_tableView, 0); + connect(m_tableView, SIGNAL(tableScrolling()), this, SLOT(moved())); + connect(m_tableView, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), + this, SLOT(slotContextMenu(KListView*, QListViewItem*, const QPoint&))); +} + +KexiRelationViewTableContainer::~KexiRelationViewTableContainer() +{ +} + +KexiDB::TableOrQuerySchema* KexiRelationViewTableContainer::schema() const +{ + return m_tableView->schema(); +} + +void KexiRelationViewTableContainer::slotContextMenu(KListView *, QListViewItem *, const QPoint &p) +{ +// m_parent->executePopup(p); + emit contextMenuRequest( p ); +} + +void KexiRelationViewTableContainer::moved() { +// kdDebug()<<"finally emitting moved"<<endl; + emit moved(this); +} + +int KexiRelationViewTableContainer::globalY(const QString &field) +{ +// kdDebug() << "KexiRelationViewTableContainer::globalY()" << endl; +// QPoint o = mapFromGlobal(QPoint(0, (m_tableView->globalY(field))/*+m_parent->contentsY()*/)); + + QPoint o(0, (m_tableView->globalY(field)) + m_parent->contentsY()); +// kdDebug() << "KexiRelationViewTableContainer::globalY() db2" << endl; + return m_parent->viewport()->mapFromGlobal(o).y(); +} + +#if 0//js +QSize KexiRelationViewTableContainer::sizeHint() +{ +#ifdef Q_WS_WIN + QSize s = m_tableView->sizeHint() + + QSize( 2 * 5 , m_tableHeader->height() + 2 * 5 ); +#else + QSize s = m_tableView->sizeHint(); + s.setWidth(s.width() + 4); + s.setHeight(m_tableHeader->height() + s.height()); +#endif + return s; +} +#endif + +void KexiRelationViewTableContainer::setFocus() +{ + kdDebug() << "SET FOCUS" << endl; + //select 1st: + if (m_tableView->firstChild()) { + if (!m_tableView->selectedItems().first()) + m_tableView->setSelected( m_tableView->firstChild(), true ); + } + m_tableHeader->setFocus(); + m_tableView->setFocus(); +/* QPalette p = qApp->palette(); + p.setColor( QPalette::Active, QColorGroup::Highlight, KGlobalSettings::highlightColor() ); + p.setColor( QPalette::Active, QColorGroup::HighlightedText, KGlobalSettings::highlightedTextColor() ); + m_tableView->setPalette(p);*/ + + raise(); + repaint(); + emit gotFocus(); +} + +void KexiRelationViewTableContainer::unsetFocus() +{ + kdDebug() << "UNSET FOCUS" << endl; +// if (m_tableView->selectedItem()) //unselect item if was selected +// m_tableView->setSelected(m_tableView->selectedItem(), false); +// m_tableView->clearSelection(); + m_tableHeader->unsetFocus(); + + m_tableView->clearSelection(); + +// m_tableView->unsetPalette(); +/* QPalette p = m_tableView->palette(); +// p.setColor( QPalette::Active, QColorGroup::Highlight, KGlobalSettings::highlightColor() ); +// p.setColor( QPalette::Active, QColorGroup::HighlightedText, KGlobalSettings::highlightedTextColor() ); + p.setColor( QPalette::Active, QColorGroup::Highlight, p.color(QPalette::Active, QColorGroup::Background ) ); +// p.setColor( QPalette::Active, QColorGroup::Highlight, gray ); + p.setColor( QPalette::Active, QColorGroup::HighlightedText, p.color(QPalette::Active, QColorGroup::Foreground ) ); +// p.setColor( QPalette::Active, QColorGroup::Highlight, green ); +// p.setColor( QPalette::Active, QColorGroup::HighlightedText, blue ); + m_tableView->setPalette(p);*/ + + clearFocus(); + repaint(); +} + + +//END KexiRelationViewTableContainer + +//============================================================================ +//BEGIN KexiRelatoinViewTableContainerHeader + +KexiRelationViewTableContainerHeader::KexiRelationViewTableContainerHeader( + const QString& text,QWidget *parent) + :QLabel(text,parent),m_dragging(false) +{ + setMargin(1); + m_activeBG = KGlobalSettings::activeTitleColor(); + m_activeFG = KGlobalSettings::activeTextColor(); + m_inactiveBG = KGlobalSettings::inactiveTitleColor(); + m_inactiveFG = KGlobalSettings::inactiveTextColor(); + + installEventFilter(this); +} + +KexiRelationViewTableContainerHeader::~KexiRelationViewTableContainerHeader() +{ +} + +void KexiRelationViewTableContainerHeader::setFocus() +{ + setPaletteBackgroundColor(m_activeBG); + setPaletteForegroundColor(m_activeFG); +} + +void KexiRelationViewTableContainerHeader::unsetFocus() +{ + setPaletteBackgroundColor(m_inactiveBG); + setPaletteForegroundColor(m_inactiveFG); +} + +bool KexiRelationViewTableContainerHeader::eventFilter(QObject *, QEvent *ev) +{ + if (ev->type()==QEvent::MouseMove) + { + if (m_dragging && static_cast<QMouseEvent*>(ev)->state()==Qt::LeftButton) { + int diffX,diffY; + diffX=static_cast<QMouseEvent*>(ev)->globalPos().x()-m_grabX; + diffY=static_cast<QMouseEvent*>(ev)->globalPos().y()-m_grabY; + if ((abs(diffX)>2) || (abs(diffY)>2)) + { + QPoint newPos=parentWidget()->pos()+QPoint(diffX,diffY); +//correct the x position + if (newPos.x()<0) { + m_offsetX+=newPos.x(); + newPos.setX(0); + } + else if (m_offsetX<0) { + m_offsetX+=newPos.x(); + if (m_offsetX>0) { + newPos.setX(m_offsetX); + m_offsetX=0; + } + else newPos.setX(0); + } +//correct the y position + if (newPos.y()<0) { + m_offsetY+=newPos.y(); + newPos.setY(0); + } + else + if (m_offsetY<0) { + m_offsetY+=newPos.y(); + if (m_offsetY>0) { + newPos.setY(m_offsetY); + m_offsetY=0; + } + else newPos.setY(0); + } +//move and update helpers + + parentWidget()->move(newPos); + m_grabX=static_cast<QMouseEvent*>(ev)->globalPos().x(); + m_grabY=static_cast<QMouseEvent*>(ev)->globalPos().y(); +// kdDebug()<<"HEADER:emitting moved"<<endl; + emit moved(); + } + return true; + } + } + return false; +} + +void KexiRelationViewTableContainerHeader::mousePressEvent(QMouseEvent *ev) { + kdDebug()<<"KexiRelationViewTableContainerHeader::Mouse Press Event"<<endl; + parentWidget()->setFocus(); + ev->accept(); + if (ev->button()==Qt::LeftButton) { + m_dragging=true; + m_grabX=ev->globalPos().x(); + m_grabY=ev->globalPos().y(); + m_offsetX=0; + m_offsetY=0; + setCursor(Qt::SizeAllCursor); + return; + } + if (ev->button()==Qt::RightButton) { + emit static_cast<KexiRelationViewTableContainer*>(parentWidget()) + ->contextMenuRequest(ev->globalPos()); + } +// QLabel::mousePressEvent(ev); +} + +void KexiRelationViewTableContainerHeader::mouseReleaseEvent(QMouseEvent *ev) { + kdDebug()<<"KexiRelationViewTableContainerHeader::Mouse Release Event"<<endl; + if (m_dragging && ev->button() & Qt::LeftButton) { + setCursor(Qt::ArrowCursor); + m_dragging=false; + emit endDrag(); + } + ev->accept(); +} + +//END KexiRelatoinViewTableContainerHeader + + +//===================================================================================== + +KexiRelationViewTable::KexiRelationViewTable(KexiDB::TableOrQuerySchema* tableOrQuerySchema, + KexiRelationView *view, QWidget *parent, const char *name) + : KexiFieldListView(parent, name, KexiFieldListView::ShowAsterisk) + , m_view(view) +{ + setSchema(tableOrQuerySchema); + header()->hide(); + + connect(this, SIGNAL(dropped(QDropEvent *, QListViewItem *)), this, SLOT(slotDropped(QDropEvent *))); + connect(this, SIGNAL(contentsMoving(int, int)), this, SLOT(slotContentsMoving(int,int))); +} + +KexiRelationViewTable::~KexiRelationViewTable() +{ +} + +QSize KexiRelationViewTable::sizeHint() const +{ + QFontMetrics fm(fontMetrics()); + +// kdDebug() << schema()->name() << " cw=" << columnWidth(0) + fm.width("i") +// << ", " << fm.width(schema()->name()+" ") << endl; + + int maxWidth = -1; + const int iconWidth = IconSize(KIcon::Small) + fm.width("i")+20; + for (QListViewItem *item = firstChild(); item; item = item->nextSibling()) + maxWidth = QMAX(maxWidth, iconWidth + fm.width(item->text(0))); + + const uint rowCount = QMIN( 8, childCount() ); + + QSize s( + QMAX( maxWidth, fm.width(schema()->name()+" ")), + rowCount*firstChild()->totalHeight() + 4 ); + return s; +} + +#if 0 +void KexiRelationViewTable::setReadOnly(bool b) +{ + setAcceptDrops(!b); + viewport()->setAcceptDrops(!b); +} +#endif + +int +KexiRelationViewTable::globalY(const QString &item) +{ + QListViewItem *i = findItem(item, 0); + if (!i) + return -1; + int y = itemRect(i).y() + (itemRect(i).height() / 2); + if (contentsY() > itemPos(i)) + y = 0; + else if (y == 0) + y = height(); + return mapToGlobal(QPoint(0, y)).y(); +} + +bool +KexiRelationViewTable::acceptDrag(QDropEvent *ev) const +{ +// kdDebug() << "KexiRelationViewTable::acceptDrag()" << endl; + QListViewItem *receiver = itemAt(ev->pos() - QPoint(0,contentsY())); + if (!receiver || !KexiFieldDrag::canDecodeSingle(ev)) + return false; + QString sourceMimeType; + QString srcTable; + QString srcField; + if (!KexiFieldDrag::decodeSingle(ev,sourceMimeType,srcTable,srcField)) + return false; + if (sourceMimeType!="kexi/table" && sourceMimeType=="kexi/query") + return false; + QString f = receiver->text(0).stripWhiteSpace(); + if (!srcField.stripWhiteSpace().startsWith("*") && !f.startsWith("*") && ev->source() != (QWidget*)this) + return true; + + return false; +} + +void +KexiRelationViewTable::slotDropped(QDropEvent *ev) +{ + QListViewItem *recever = itemAt(ev->pos() - QPoint(0,contentsY())); + if (!recever || !KexiFieldDrag::canDecodeSingle(ev)) { + ev->ignore(); + return; + } + QString sourceMimeType; + QString srcTable; + QString srcField; + if (!KexiFieldDrag::decodeSingle(ev,sourceMimeType,srcTable,srcField)) + return; + if (sourceMimeType!="kexi/table" && sourceMimeType=="kexi/query") + return; +// kdDebug() << "KexiRelationViewTable::slotDropped() srcfield: " << srcField << endl; + + QString rcvField = recever->text(0); + + SourceConnection s; + s.masterTable = srcTable; + s.detailsTable = schema()->name(); + s.masterField = srcField; + s.detailsField = rcvField; + + m_view->addConnection(s); + + kdDebug() << "KexiRelationViewTable::slotDropped() " << srcTable << ":" << srcField << " " + << schema()->name() << ":" << rcvField << endl; + ev->accept(); +} + +void +KexiRelationViewTable::slotContentsMoving(int,int) +{ + emit tableScrolling(); +} + +void KexiRelationViewTable::contentsMousePressEvent(QMouseEvent *ev) +{ + parentWidget()->setFocus(); + setFocus(); + KListView::contentsMousePressEvent(ev); +// if (ev->button()==Qt::RightButton) +// static_cast<KexiRelationView*>(parentWidget())->executePopup(ev->pos()); +} + +QRect KexiRelationViewTable::drawItemHighlighter(QPainter *painter, QListViewItem *item) +{ + if (painter) { + style().drawPrimitive(QStyle::PE_FocusRect, painter, itemRect(item), colorGroup(), + QStyle::Style_FocusAtBorder); + } + return itemRect(item); +} + +#include "kexirelationviewtable.moc" |