26#include <tqpushbutton.h>
29#include <tqapplication.h>
34#include <kiconloader.h>
35#include <tdeversion.h>
37#include <tdeglobalsettings.h>
39#include <kexidb/tableschema.h>
40#include <kexidb/utils.h>
41#include <kexidragobjects.h>
42#include "kexirelationviewtable.h"
43#include "kexirelationview.h"
45KexiRelationViewTableContainer::KexiRelationViewTableContainer(
47 : TQFrame(parent,
"KexiRelationViewTableContainer" )
57 setFrameStyle( TQFrame::WinPanel | TQFrame::Raised );
59 TQVBoxLayout *lyr =
new TQVBoxLayout(
this,4,1);
61 m_tableHeader =
new KexiRelationViewTableContainerHeader(schema->
name(),
this);
63 m_tableHeader->unsetFocus();
64 m_tableHeader->setSizePolicy(TQSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Fixed));
65 lyr->addWidget(m_tableHeader);
66 connect(m_tableHeader,TQ_SIGNAL(moved()),
this,TQ_SLOT(moved()));
67 connect(m_tableHeader, TQ_SIGNAL(endDrag()),
this, TQ_SIGNAL(endDrag()));
69 m_tableView =
new KexiRelationViewTable(schema, parent,
this,
"KexiRelationViewTable");
71 m_tableView->setSizePolicy(TQSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum));
73 m_tableView->setMaximumSize( m_tableView->sizeHint() );
76 lyr->addWidget(m_tableView, 0);
77 connect(m_tableView, TQ_SIGNAL(tableScrolling()),
this, TQ_SLOT(moved()));
78 connect(m_tableView, TQ_SIGNAL(contextMenu(TDEListView*, TQListViewItem*,
const TQPoint&)),
79 this, TQ_SLOT(slotContextMenu(TDEListView*, TQListViewItem*,
const TQPoint&)));
82KexiRelationViewTableContainer::~KexiRelationViewTableContainer()
88 return m_tableView->schema();
91void KexiRelationViewTableContainer::slotContextMenu(TDEListView *, TQListViewItem *,
const TQPoint &p)
94 emit contextMenuRequest( p );
97void KexiRelationViewTableContainer::moved() {
102int KexiRelationViewTableContainer::globalY(
const TQString &field)
107 TQPoint o(0, (m_tableView->globalY(field)) + m_parent->contentsY());
109 return m_parent->viewport()->mapFromGlobal(o).y();
113TQSize KexiRelationViewTableContainer::sizeHint()
116 TQSize s = m_tableView->sizeHint()
117 + TQSize( 2 * 5 , m_tableHeader->height() + 2 * 5 );
119 TQSize s = m_tableView->sizeHint();
120 s.setWidth(s.width() + 4);
121 s.setHeight(m_tableHeader->height() + s.height());
127void KexiRelationViewTableContainer::setFocus()
129 kdDebug() <<
"SET FOCUS" << endl;
131 if (m_tableView->firstChild()) {
132 if (!m_tableView->selectedItems().first())
133 m_tableView->setSelected( m_tableView->firstChild(),
true );
135 m_tableHeader->setFocus();
136 m_tableView->setFocus();
147void KexiRelationViewTableContainer::unsetFocus()
149 kdDebug() <<
"UNSET FOCUS" << endl;
153 m_tableHeader->unsetFocus();
155 m_tableView->clearSelection();
178KexiRelationViewTableContainerHeader::KexiRelationViewTableContainerHeader(
179 const TQString& text,TQWidget *parent)
180 :TQLabel(text,parent),m_dragging(false)
183 m_activeBG = TDEGlobalSettings::activeTitleColor();
184 m_activeFG = TDEGlobalSettings::activeTextColor();
185 m_inactiveBG = TDEGlobalSettings::inactiveTitleColor();
186 m_inactiveFG = TDEGlobalSettings::inactiveTextColor();
188 installEventFilter(
this);
191KexiRelationViewTableContainerHeader::~KexiRelationViewTableContainerHeader()
195void KexiRelationViewTableContainerHeader::setFocus()
197 setPaletteBackgroundColor(m_activeBG);
198 setPaletteForegroundColor(m_activeFG);
201void KexiRelationViewTableContainerHeader::unsetFocus()
203 setPaletteBackgroundColor(m_inactiveBG);
204 setPaletteForegroundColor(m_inactiveFG);
207bool KexiRelationViewTableContainerHeader::eventFilter(TQObject *, TQEvent *ev)
209 if (ev->type()==TQEvent::MouseMove)
211 if (m_dragging &&
static_cast<TQMouseEvent*
>(ev)->state()==TQt::LeftButton) {
213 diffX=
static_cast<TQMouseEvent*
>(ev)->globalPos().x()-m_grabX;
214 diffY=
static_cast<TQMouseEvent*
>(ev)->globalPos().y()-m_grabY;
215 if ((abs(diffX)>2) || (abs(diffY)>2))
217 TQPoint newPos=parentWidget()->pos()+TQPoint(diffX,diffY);
220 m_offsetX+=newPos.x();
223 else if (m_offsetX<0) {
224 m_offsetX+=newPos.x();
226 newPos.setX(m_offsetX);
233 m_offsetY+=newPos.y();
238 m_offsetY+=newPos.y();
240 newPos.setY(m_offsetY);
247 parentWidget()->move(newPos);
248 m_grabX=
static_cast<TQMouseEvent*
>(ev)->globalPos().x();
249 m_grabY=
static_cast<TQMouseEvent*
>(ev)->globalPos().y();
259void KexiRelationViewTableContainerHeader::mousePressEvent(TQMouseEvent *ev) {
260 kdDebug()<<
"KexiRelationViewTableContainerHeader::Mouse Press Event"<<endl;
261 parentWidget()->setFocus();
263 if (ev->button()==TQt::LeftButton) {
265 m_grabX=ev->globalPos().x();
266 m_grabY=ev->globalPos().y();
269 setCursor(TQt::SizeAllCursor);
272 if (ev->button()==TQt::RightButton) {
273 emit
static_cast<KexiRelationViewTableContainer*
>(parentWidget())
274 ->contextMenuRequest(ev->globalPos());
279void KexiRelationViewTableContainerHeader::mouseReleaseEvent(TQMouseEvent *ev) {
280 kdDebug()<<
"KexiRelationViewTableContainerHeader::Mouse Release Event"<<endl;
281 if (m_dragging && ev->button() & TQt::LeftButton) {
282 setCursor(TQt::ArrowCursor);
299 setSchema(tableOrQuerySchema);
302 connect(
this, TQ_SIGNAL(dropped(TQDropEvent *, TQListViewItem *)),
this, TQ_SLOT(slotDropped(TQDropEvent *)));
303 connect(
this, TQ_SIGNAL(contentsMoving(
int,
int)),
this, TQ_SLOT(slotContentsMoving(
int,
int)));
306KexiRelationViewTable::~KexiRelationViewTable()
310TQSize KexiRelationViewTable::sizeHint()
const
312 TQFontMetrics fm(fontMetrics());
318 const int iconWidth = IconSize(TDEIcon::Small) + fm.width(
"i")+20;
319 for (TQListViewItem *item = firstChild(); item; item = item->nextSibling())
320 maxWidth = TQMAX(maxWidth, iconWidth + fm.width(item->text(0)));
322 const uint
rowCount = TQMIN( 8, childCount() );
325 TQMAX( maxWidth, fm.width(schema()->name()+
" ")),
326 rowCount*firstChild()->totalHeight() + 4 );
331void KexiRelationViewTable::setReadOnly(
bool b)
334 viewport()->setAcceptDrops(!b);
339KexiRelationViewTable::globalY(
const TQString &item)
341 TQListViewItem *i = findItem(item, 0);
344 int y = itemRect(i).y() + (itemRect(i).height() / 2);
345 if (contentsY() > itemPos(i))
349 return mapToGlobal(TQPoint(0, y)).y();
353KexiRelationViewTable::acceptDrag(TQDropEvent *ev)
const
356 TQListViewItem *receiver = itemAt(ev->pos() - TQPoint(0,contentsY()));
359 TQString sourceMimeType;
364 if (sourceMimeType!=
"kexi/table" && sourceMimeType==
"kexi/query")
366 TQString f = receiver->text(0).stripWhiteSpace();
367 if (!srcField.stripWhiteSpace().startsWith(
"*") && !f.startsWith(
"*") && ev->source() != (TQWidget*)
this)
374KexiRelationViewTable::slotDropped(TQDropEvent *ev)
376 TQListViewItem *recever = itemAt(ev->pos() - TQPoint(0,contentsY()));
381 TQString sourceMimeType;
386 if (sourceMimeType!=
"kexi/table" && sourceMimeType==
"kexi/query")
390 TQString rcvField = recever->text(0);
393 s.masterTable = srcTable;
394 s.detailsTable = schema()->
name();
395 s.masterField = srcField;
396 s.detailsField = rcvField;
398 m_view->addConnection(s);
400 kdDebug() <<
"KexiRelationViewTable::slotDropped() " << srcTable <<
":" << srcField <<
" "
401 << schema()->
name() <<
":" << rcvField << endl;
406KexiRelationViewTable::slotContentsMoving(
int,
int)
408 emit tableScrolling();
411void KexiRelationViewTable::contentsMousePressEvent(TQMouseEvent *ev)
413 parentWidget()->setFocus();
415 TDEListView::contentsMousePressEvent(ev);
420TQRect KexiRelationViewTable::drawItemHighlighter(TQPainter *painter, TQListViewItem *item)
423 style().drawPrimitive(TQStyle::PE_FocusRect, painter, itemRect(item), colorGroup(),
424 TQStyle::Style_FocusAtBorder);
426 return itemRect(item);
429#include "kexirelationviewtable.moc"
static bool canDecodeSingle(TQMimeSource *e)
static bool decodeSingle(TQDropEvent *e, TQString &sourceMimeType, TQString &sourceName, TQString &field)
provides a view for displaying relations between database tables.
int rowCount(Connection &conn, const TQString &sql)