26#include <tqpushbutton.h>
29#include <tqapplication.h>
34#include <kiconloader.h>
36#include <tdeglobalsettings.h>
38#include <kexidb/tableschema.h>
39#include <kexidb/utils.h>
40#include <kexidragobjects.h>
41#include "kexirelationviewtable.h"
42#include "kexirelationview.h"
44KexiRelationViewTableContainer::KexiRelationViewTableContainer(
46 : TQFrame(parent,
"KexiRelationViewTableContainer" )
56 setFrameStyle( TQFrame::WinPanel | TQFrame::Raised );
58 TQVBoxLayout *lyr =
new TQVBoxLayout(
this,4,1);
60 m_tableHeader =
new KexiRelationViewTableContainerHeader(schema->
name(),
this);
62 m_tableHeader->unsetFocus();
63 m_tableHeader->setSizePolicy(TQSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Fixed));
64 lyr->addWidget(m_tableHeader);
65 connect(m_tableHeader,TQ_SIGNAL(moved()),
this,TQ_SLOT(moved()));
66 connect(m_tableHeader, TQ_SIGNAL(endDrag()),
this, TQ_SIGNAL(endDrag()));
68 m_tableView =
new KexiRelationViewTable(schema, parent,
this,
"KexiRelationViewTable");
70 m_tableView->setSizePolicy(TQSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum));
72 m_tableView->setMaximumSize( m_tableView->sizeHint() );
75 lyr->addWidget(m_tableView, 0);
76 connect(m_tableView, TQ_SIGNAL(tableScrolling()),
this, TQ_SLOT(moved()));
77 connect(m_tableView, TQ_SIGNAL(contextMenu(TDEListView*, TQListViewItem*,
const TQPoint&)),
78 this, TQ_SLOT(slotContextMenu(TDEListView*, TQListViewItem*,
const TQPoint&)));
81KexiRelationViewTableContainer::~KexiRelationViewTableContainer()
87 return m_tableView->schema();
90void KexiRelationViewTableContainer::slotContextMenu(TDEListView *, TQListViewItem *,
const TQPoint &p)
93 emit contextMenuRequest( p );
96void KexiRelationViewTableContainer::moved() {
101int KexiRelationViewTableContainer::globalY(
const TQString &field)
106 TQPoint o(0, (m_tableView->globalY(field)) + m_parent->contentsY());
108 return m_parent->viewport()->mapFromGlobal(o).y();
112TQSize KexiRelationViewTableContainer::sizeHint()
115 TQSize s = m_tableView->sizeHint()
116 + TQSize( 2 * 5 , m_tableHeader->height() + 2 * 5 );
118 TQSize s = m_tableView->sizeHint();
119 s.setWidth(s.width() + 4);
120 s.setHeight(m_tableHeader->height() + s.height());
126void KexiRelationViewTableContainer::setFocus()
128 kdDebug() <<
"SET FOCUS" << endl;
130 if (m_tableView->firstChild()) {
131 if (!m_tableView->selectedItems().first())
132 m_tableView->setSelected( m_tableView->firstChild(),
true );
134 m_tableHeader->setFocus();
135 m_tableView->setFocus();
146void KexiRelationViewTableContainer::unsetFocus()
148 kdDebug() <<
"UNSET FOCUS" << endl;
152 m_tableHeader->unsetFocus();
154 m_tableView->clearSelection();
177KexiRelationViewTableContainerHeader::KexiRelationViewTableContainerHeader(
178 const TQString& text,TQWidget *parent)
179 :TQLabel(text,parent),m_dragging(false)
182 m_activeBG = TDEGlobalSettings::activeTitleColor();
183 m_activeFG = TDEGlobalSettings::activeTextColor();
184 m_inactiveBG = TDEGlobalSettings::inactiveTitleColor();
185 m_inactiveFG = TDEGlobalSettings::inactiveTextColor();
187 installEventFilter(
this);
190KexiRelationViewTableContainerHeader::~KexiRelationViewTableContainerHeader()
194void KexiRelationViewTableContainerHeader::setFocus()
196 setPaletteBackgroundColor(m_activeBG);
197 setPaletteForegroundColor(m_activeFG);
200void KexiRelationViewTableContainerHeader::unsetFocus()
202 setPaletteBackgroundColor(m_inactiveBG);
203 setPaletteForegroundColor(m_inactiveFG);
206bool KexiRelationViewTableContainerHeader::eventFilter(TQObject *, TQEvent *ev)
208 if (ev->type()==TQEvent::MouseMove)
210 if (m_dragging &&
static_cast<TQMouseEvent*
>(ev)->state()==TQt::LeftButton) {
212 diffX=
static_cast<TQMouseEvent*
>(ev)->globalPos().x()-m_grabX;
213 diffY=
static_cast<TQMouseEvent*
>(ev)->globalPos().y()-m_grabY;
214 if ((abs(diffX)>2) || (abs(diffY)>2))
216 TQPoint newPos=parentWidget()->pos()+TQPoint(diffX,diffY);
219 m_offsetX+=newPos.x();
222 else if (m_offsetX<0) {
223 m_offsetX+=newPos.x();
225 newPos.setX(m_offsetX);
232 m_offsetY+=newPos.y();
237 m_offsetY+=newPos.y();
239 newPos.setY(m_offsetY);
246 parentWidget()->move(newPos);
247 m_grabX=
static_cast<TQMouseEvent*
>(ev)->globalPos().x();
248 m_grabY=
static_cast<TQMouseEvent*
>(ev)->globalPos().y();
258void KexiRelationViewTableContainerHeader::mousePressEvent(TQMouseEvent *ev) {
259 kdDebug()<<
"KexiRelationViewTableContainerHeader::Mouse Press Event"<<endl;
260 parentWidget()->setFocus();
262 if (ev->button()==TQt::LeftButton) {
264 m_grabX=ev->globalPos().x();
265 m_grabY=ev->globalPos().y();
268 setCursor(TQt::SizeAllCursor);
271 if (ev->button()==TQt::RightButton) {
272 emit
static_cast<KexiRelationViewTableContainer*
>(parentWidget())
273 ->contextMenuRequest(ev->globalPos());
278void KexiRelationViewTableContainerHeader::mouseReleaseEvent(TQMouseEvent *ev) {
279 kdDebug()<<
"KexiRelationViewTableContainerHeader::Mouse Release Event"<<endl;
280 if (m_dragging && ev->button() & TQt::LeftButton) {
281 setCursor(TQt::ArrowCursor);
298 setSchema(tableOrQuerySchema);
301 connect(
this, TQ_SIGNAL(dropped(TQDropEvent *, TQListViewItem *)),
this, TQ_SLOT(slotDropped(TQDropEvent *)));
302 connect(
this, TQ_SIGNAL(contentsMoving(
int,
int)),
this, TQ_SLOT(slotContentsMoving(
int,
int)));
305KexiRelationViewTable::~KexiRelationViewTable()
309TQSize KexiRelationViewTable::sizeHint()
const
311 TQFontMetrics fm(fontMetrics());
317 const int iconWidth = IconSize(TDEIcon::Small) + fm.width(
"i")+20;
318 for (TQListViewItem *item = firstChild(); item; item = item->nextSibling())
319 maxWidth = TQMAX(maxWidth, iconWidth + fm.width(item->text(0)));
321 const uint
rowCount = TQMIN( 8, childCount() );
324 TQMAX( maxWidth, fm.width(
schema()->name()+
" ")),
325 rowCount*firstChild()->totalHeight() + 4 );
330void KexiRelationViewTable::setReadOnly(
bool b)
333 viewport()->setAcceptDrops(!b);
338KexiRelationViewTable::globalY(
const TQString &item)
340 TQListViewItem *i = findItem(item, 0);
343 int y = itemRect(i).y() + (itemRect(i).height() / 2);
344 if (contentsY() > itemPos(i))
348 return mapToGlobal(TQPoint(0, y)).y();
352KexiRelationViewTable::acceptDrag(TQDropEvent *ev)
const
355 TQListViewItem *receiver = itemAt(ev->pos() - TQPoint(0,contentsY()));
358 TQString sourceMimeType;
363 if (sourceMimeType!=
"kexi/table" && sourceMimeType==
"kexi/query")
365 TQString f = receiver->text(0).stripWhiteSpace();
366 if (!srcField.stripWhiteSpace().startsWith(
"*") && !f.startsWith(
"*") && ev->source() != (TQWidget*)
this)
373KexiRelationViewTable::slotDropped(TQDropEvent *ev)
375 TQListViewItem *recever = itemAt(ev->pos() - TQPoint(0,contentsY()));
380 TQString sourceMimeType;
385 if (sourceMimeType!=
"kexi/table" && sourceMimeType==
"kexi/query")
389 TQString rcvField = recever->text(0);
392 s.masterTable = srcTable;
394 s.masterField = srcField;
395 s.detailsField = rcvField;
397 m_view->addConnection(s);
399 kdDebug() <<
"KexiRelationViewTable::slotDropped() " << srcTable <<
":" << srcField <<
" "
400 <<
schema()->
name() <<
":" << rcvField << endl;
405KexiRelationViewTable::slotContentsMoving(
int,
int)
407 emit tableScrolling();
410void KexiRelationViewTable::contentsMousePressEvent(TQMouseEvent *ev)
412 parentWidget()->setFocus();
414 TDEListView::contentsMousePressEvent(ev);
419TQRect KexiRelationViewTable::drawItemHighlighter(TQPainter *painter, TQListViewItem *item)
422 style().drawPrimitive(TQStyle::PE_FocusRect, painter, itemRect(item), colorGroup(),
423 TQStyle::Style_FocusAtBorder);
425 return itemRect(item);
428#include "kexirelationviewtable.moc"
static bool canDecodeSingle(TQMimeSource *e)
static bool decodeSingle(TQDropEvent *e, TQString &sourceMimeType, TQString &sourceName, TQString &field)
KexiDB::TableOrQuerySchema * schema() const
provides a view for displaying relations between database tables.
int rowCount(Connection &conn, const TQString &sql)