22#include "kexirelationwidget.h"
26#include <tqpushbutton.h>
32#include <kiconloader.h>
33#include <kpushbutton.h>
35#include <kexidb/connection.h>
36#include <kexidb/utils.h>
38#include <kexiproject.h>
39#include <keximainwindow.h>
40#include "kexirelationview.h"
41#include "kexirelationviewtable.h"
42#include "kexirelationviewconnection.h"
44KexiRelationWidget::KexiRelationWidget(
KexiMainWindow *win, TQWidget *parent,
49 m_conn = m_win->project()->dbConnection();
51 TQHBoxLayout *hlyr =
new TQHBoxLayout(0);
52 TQGridLayout *g =
new TQGridLayout(
this);
53 g->addLayout( hlyr, 0, 0 );
55 m_tableCombo =
new KComboBox(
this,
"tables_combo");
56 m_tableCombo->setMinimumWidth(TQFontMetrics(font()).width(
"w")*20);
57 TQLabel *lbl =
new TQLabel(m_tableCombo, i18n(
"Table")+
": ",
this);
59 m_tableCombo->setInsertionPolicy(TQComboBox::NoInsertion);
61 hlyr->addWidget(m_tableCombo);
62 m_tableCombo->setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::Preferred));
65 m_btnAdd =
new KPushButton(i18n(
"&Add"),
this);
66 hlyr->addWidget(m_btnAdd);
68 connect(m_btnAdd, TQ_SIGNAL(clicked()),
this, TQ_SLOT(slotAddTable()));
71 setViewWidget(m_relationView);
72 g->addWidget(m_relationView, 1, 0);
76 m_tableQueryPopup =
new TDEPopupMenu(
this,
"m_popup");
77 m_tableQueryPopupTitleID = m_tableQueryPopup->insertTitle(SmallIcon(
"table"),
"");
78 connect(m_tableQueryPopup, TQ_SIGNAL(aboutToShow()),
this, TQ_SLOT(aboutToShowPopupMenu()));
80 m_connectionPopup =
new TDEPopupMenu(
this,
"m_connectionPopup");
81 m_connectionPopupTitleID = m_connectionPopup->insertTitle(
"");
82 connect(m_connectionPopup, TQ_SIGNAL(aboutToShow()),
this, TQ_SLOT(aboutToShowPopupMenu()));
84 m_areaPopup =
new TDEPopupMenu(
this,
"m_areaPopup");
86 m_openSelectedTableAction =
new TDEAction(i18n(
"&Open Table"), SmallIcon(
"document-open"), TDEShortcut(),
87 this, TQ_SLOT(openSelectedTable()),
this,
"relationsview_openTable");
88 m_openSelectedTableAction->plug( m_tableQueryPopup );
89 m_designSelectedTableAction =
new TDEAction(i18n(
"&Design Table"), SmallIcon(
"edit"), TDEShortcut(),
90 this, TQ_SLOT(designSelectedTable()),
this,
"relationsview_designTable");
91 m_designSelectedTableAction->plug( m_tableQueryPopup );
92 m_tableQueryPopup->insertSeparator();
94 TDEAction* hide_action = plugSharedAction(
"edit_delete", i18n(
"&Hide Table"), m_tableQueryPopup);
95 hide_action->setIconSet(TQIconSet());
97 plugSharedAction(
"edit_delete",m_connectionPopup);
98 plugSharedAction(
"edit_delete",
this, TQ_SLOT(removeSelectedObject()));
100 connect(m_relationView, TQ_SIGNAL(tableViewGotFocus()),
101 this, TQ_SLOT(tableViewGotFocus()));
102 connect(m_relationView, TQ_SIGNAL(connectionViewGotFocus()),
103 this, TQ_SLOT(connectionViewGotFocus()));
104 connect(m_relationView, TQ_SIGNAL(emptyAreaGotFocus()),
105 this, TQ_SLOT(emptyAreaGotFocus()));
106 connect(m_relationView, TQ_SIGNAL(tableContextMenuRequest(
const TQPoint& )),
107 this, TQ_SLOT(tableContextMenuRequest(
const TQPoint& )));
108 connect(m_relationView, TQ_SIGNAL(connectionContextMenuRequest(
const TQPoint& )),
109 this, TQ_SLOT(connectionContextMenuRequest(
const TQPoint& )));
112 connect(m_relationView, TQ_SIGNAL(tablePositionChanged(KexiRelationViewTableContainer*)),
113 this, TQ_SIGNAL(tablePositionChanged(KexiRelationViewTableContainer*)));
114 connect(m_relationView, TQ_SIGNAL(aboutConnectionRemove(KexiRelationViewConnection*)),
115 this, TQ_SIGNAL(aboutConnectionRemove(KexiRelationViewConnection*)));
127#ifdef TESTING_KexiRelationWidget
128 for (
int i=0;i<(int)m_db->tableNames().count();i++)
129 TQTimer::singleShot(100,
this,TQ_SLOT(slotAddTable()));
135KexiRelationWidget::~KexiRelationWidget()
139TablesDict* KexiRelationWidget::tables()
const
141 return m_relationView->tables();
144KexiRelationViewTableContainer* KexiRelationWidget::table(
const TQString& name)
const
146 return m_relationView->tables()->find( name );
149const ConnectionList* KexiRelationWidget::connections()
const
151 return m_relationView->connections();
155KexiRelationWidget::slotAddTable()
157 if (m_tableCombo->currentItem()==-1)
159 TQString tname = m_tableCombo->text(m_tableCombo->currentItem());
160 KexiDB::TableSchema *t = m_conn->tableSchema(tname);
169 if (!m_relationView->tableContainer(t)) {
170 KexiRelationViewTableContainer *c = m_relationView->addTableContainer(t, rect);
171 kdDebug() <<
"KexiRelationWidget::slotAddTable(): adding table " << t->name() << endl;
174 connect(c->tableView(), TQ_SIGNAL(doubleClicked(TQListViewItem*,
const TQPoint&,
int)),
175 this, TQ_SLOT(slotTableFieldDoubleClicked(TQListViewItem*,
const TQPoint&,
int)));
178 const TQString tname = t->name().lower();
179 const int count = m_tableCombo->count();
181 for (; i < count; i++ ) {
182 if (m_tableCombo->text(i).lower() == tname )
186 int oi = m_tableCombo->currentItem();
187 kdDebug()<<
"KexiRelationWidget::slotAddTable(): removing a table from the combo box"<<endl;
188 m_tableCombo->removeItem(i);
189 if (m_tableCombo->count()>0) {
190 if (oi>=m_tableCombo->count()) {
191 oi=m_tableCombo->count()-1;
193 m_tableCombo->setCurrentItem(oi);
196 m_tableCombo->setEnabled(
false);
197 m_btnAdd->setEnabled(
false);
204KexiRelationWidget::addConnection(
const SourceConnection& conn)
206 m_relationView->addConnection(conn);
210KexiRelationWidget::addTable(
const TQString& t)
212 for(
int i=0; i < m_tableCombo->count(); i++)
214 if(m_tableCombo->text(i) == t)
216 m_tableCombo->setCurrentItem(i);
222void KexiRelationWidget::tableViewGotFocus()
234void KexiRelationWidget::connectionViewGotFocus()
239void KexiRelationWidget::emptyAreaGotFocus()
244void KexiRelationWidget::tableContextMenuRequest(
const TQPoint& pos)
250void KexiRelationWidget::connectionContextMenuRequest(
const TQPoint& pos)
257void KexiRelationWidget::emptyAreaContextMenuRequest(
const TQPoint& )
263void KexiRelationWidget::invalidateActions()
265 setAvailable(
"edit_delete", m_relationView->selectedConnection() || m_relationView->focusedTableView());
268void KexiRelationWidget::executePopup( TQPoint pos )
270 if (pos==TQPoint(-1,-1)) {
272 m_relationView->focusedTableView() ? m_relationView->focusedTableView()->pos() + m_relationView->focusedTableView()->rect().center() : rect().center() );
274 if (m_relationView->focusedTableView())
275 m_tableQueryPopup->exec(pos);
276 else if (m_relationView->selectedConnection())
277 m_connectionPopup->exec(pos);
280void KexiRelationWidget::removeSelectedObject()
282 m_relationView->removeSelectedObject();
285void KexiRelationWidget::openSelectedTable()
288 if (!m_relationView->focusedTableView() || !m_relationView->focusedTableView()->schema()->table())
290 bool openingCancelled;
291 m_win->openObject(
"kexi/table", m_relationView->focusedTableView()->schema()->name(),
292 Kexi::DataViewMode, openingCancelled);
295void KexiRelationWidget::designSelectedTable()
298 if (!m_relationView->focusedTableView() || !m_relationView->focusedTableView()->schema()->table())
300 bool openingCancelled;
301 m_win->openObject(
"kexi/table", m_relationView->focusedTableView()->schema()->name(),
302 Kexi::DesignViewMode, openingCancelled);
305TQSize KexiRelationWidget::sizeHint()
const
307 return m_relationView->sizeHint();
312 const TQString &t = table.name().lower();
314 for (i=0; i<m_tableCombo->count() && t > m_tableCombo->text(i).lower(); i++)
316 m_tableCombo->insertItem(table.name(), i);
317 if (!m_tableCombo->isEnabled()) {
318 m_tableCombo->setCurrentItem(0);
319 m_tableCombo->setEnabled(
true);
320 m_btnAdd->setEnabled(
true);
323 emit tableHidden(table);
326void KexiRelationWidget::aboutToShowPopupMenu()
329 if (m_relationView->focusedTableView() && m_relationView->focusedTableView()->schema()->table()) {
330 m_tableQueryPopup->changeTitle(m_tableQueryPopupTitleID, SmallIcon(
"table"),
331 TQString(m_relationView->focusedTableView()->schema()->name()) +
" : " + i18n(
"Table"));
333 else if (m_relationView->selectedConnection()) {
334 m_connectionPopup->changeTitle( m_connectionPopupTitleID,
335 m_relationView->selectedConnection()->toString() +
" : " + i18n(
"Relationship") );
340KexiRelationWidget::slotTableFieldDoubleClicked(TQListViewItem *i,
const TQPoint&,
int)
342 if (!sender()->isA(
"KexiRelationViewTable"))
344 const KexiRelationViewTable* t =
static_cast<const KexiRelationViewTable*
>(sender());
346 if (selectedFieldNames.count()==1)
347 emit tableFieldDoubleClicked( t->
schema()->
table(), selectedFieldNames.first() );
351KexiRelationWidget::clear()
353 m_relationView->clear();
358void KexiRelationWidget::removeAllConnections()
360 m_relationView->removeAllConnections();
364KexiRelationWidget::fillTablesCombo()
366 m_tableCombo->clear();
367 TQStringList tmp = m_conn->tableNames();
369 m_tableCombo->insertStringList(tmp);
373KexiRelationWidget::objectCreated(
const TQCString &mime,
const TQCString& name)
375 if (mime==
"kexi/table" || mime==
"kexi/query") {
377 m_tableCombo->insertItem(TQString(name));
378 m_tableCombo->listBox()->sort();
383KexiRelationWidget::objectDeleted(
const TQCString &mime,
const TQCString& name)
385 if (mime==
"kexi/table" || mime==
"kexi/query") {
386 TQString strName(name);
387 for (
int i=0; i<m_tableCombo->count(); i++) {
389 if (m_tableCombo->text(i)==strName) {
390 m_tableCombo->removeItem(i);
391 if (m_tableCombo->currentItem()==i) {
392 if (i==(m_tableCombo->count()-1))
393 m_tableCombo->setCurrentItem(i-1);
395 m_tableCombo->setCurrentItem(i);
404KexiRelationWidget::objectRenamed(
const TQCString &mime,
const TQCString& name,
const TQCString& newName)
406 if (mime==
"kexi/table" || mime==
"kexi/query") {
407 TQString strName(name);
408 for (
int i=0; i<m_tableCombo->count(); i++) {
410 if (m_tableCombo->text(i)==strName) {
411 m_tableCombo->changeItem(TQString(newName), i);
412 m_tableCombo->listBox()->sort();
422 m_relationView->hideAllTablesExcept(tables);
425#include "kexirelationwidget.moc"
TableSchema * table() const
TQPtrList< TableSchema > List
Type of tables list.
KexiDB::TableOrQuerySchema * schema() const
TQStringList selectedFieldNames() const
Kexi's main window interface This interface is implemented by KexiMainWindowImpl class.
provides a view for displaying relations between database tables.
Base class for single view embeddable of in KexiDialogBase.
virtual void setAvailable(const char *action_name, bool set)