21#include <tqtoolbutton.h>
24#include <tqvalidator.h>
26#include <tqscrollview.h>
29#include <kiconloader.h>
32#include <kstaticdeleter.h>
34#include "kexirecordnavigator.h"
35#include "kexirecordmarker.h"
38class KexiRecordNavigatorPrivate
41 KexiRecordNavigatorPrivate()
43 , editingIndicatorLabel(0)
44 , editingIndicatorEnabled(false)
45 , editingIndicatorVisible(false)
51 TQLabel *editingIndicatorLabel;
52 bool editingIndicatorEnabled : 1;
53 bool editingIndicatorVisible : 1;
58KexiRecordNavigatorHandler::KexiRecordNavigatorHandler()
62KexiRecordNavigatorHandler::~KexiRecordNavigatorHandler()
68KexiRecordNavigator::KexiRecordNavigator(TQWidget *parent,
int leftMargin,
const char *name)
69 : TQFrame(parent, name)
71 , m_isInsertingEnabled(true)
72 , d( new KexiRecordNavigatorPrivate() )
74 if (parent->inherits(
"TQScrollView"))
75 setParentView(
dynamic_cast<TQScrollView*
>(parent) );
76 setFrameStyle(TQFrame::NoFrame);
77 d->lyr =
new TQHBoxLayout(
this,0,0,
"nav_lyr");
79 m_textLabel =
new TQLabel(
this);
80 d->lyr->addWidget( m_textLabel );
81 setLabelText(i18n(
"Row:"));
83 int bw = 6+SmallIcon(
"navigator_first").width();
85 f.setPixelSize((bw > 12) ? 12 : bw);
87 m_nav1DigitWidth = fm.width(
"8");
89 d->lyr->addWidget( m_navBtnFirst =
new TQToolButton(
this) );
90 m_navBtnFirst->setFixedWidth(bw);
91 m_navBtnFirst->setFocusPolicy(TQWidget::NoFocus);
92 m_navBtnFirst->setIconSet( SmallIconSet(
"navigator_first") );
93 TQToolTip::add(m_navBtnFirst, i18n(
"First row"));
95 d->lyr->addWidget( m_navBtnPrev =
new TQToolButton(
this) );
96 m_navBtnPrev->setFixedWidth(bw);
97 m_navBtnPrev->setFocusPolicy(TQWidget::NoFocus);
98 m_navBtnPrev->setIconSet( SmallIconSet(
"navigator_prev") );
99 m_navBtnPrev->setAutoRepeat(
true);
100 TQToolTip::add(m_navBtnPrev, i18n(
"Previous row"));
102 d->lyr->addSpacing( 6 );
104 d->lyr->addWidget( m_navRecordNumber =
new KLineEdit(
this) );
105 m_navRecordNumber->setAlignment(AlignRight | AlignVCenter);
106 m_navRecordNumber->setFocusPolicy(TQWidget::ClickFocus);
107 m_navRecordNumber->installEventFilter(
this);
109 m_navRecordNumberValidator =
new TQIntValidator(1, INT_MAX,
this);
110 m_navRecordNumber->setValidator(m_navRecordNumberValidator);
111 m_navRecordNumber->installEventFilter(
this);
112 TQToolTip::add(m_navRecordNumber, i18n(
"Current row number"));
114 KLineEdit *lbl_of =
new KLineEdit(i18n(
"of"),
this);
115 lbl_of->setSizePolicy(TQSizePolicy::Fixed,TQSizePolicy::Preferred);
116 lbl_of->setMaximumWidth(fm.width(lbl_of->text())+8);
117 lbl_of->setReadOnly(
true);
118 lbl_of->setLineWidth(0);
119 lbl_of->setFocusPolicy(TQWidget::NoFocus);
120 lbl_of->setAlignment(AlignCenter);
121 d->lyr->addWidget( lbl_of );
123 d->lyr->addWidget( m_navRecordCount =
new KLineEdit(
this) );
124 m_navRecordCount->setSizePolicy(TQSizePolicy::Fixed,TQSizePolicy::Preferred);
125 m_navRecordCount->setReadOnly(
true);
126 m_navRecordCount->setLineWidth(0);
127 m_navRecordCount->setFocusPolicy(TQWidget::NoFocus);
128 m_navRecordCount->setAlignment(AlignLeft | AlignVCenter);
129 TQToolTip::add(m_navRecordCount, i18n(
"Number of rows"));
132 m_navRecordNumber->setFont(f);
133 m_navRecordCount->setFont(f);
136 d->lyr->addWidget( m_navBtnNext =
new TQToolButton(
this) );
137 m_navBtnNext->setFixedWidth(bw);
138 m_navBtnNext->setFocusPolicy(TQWidget::NoFocus);
139 m_navBtnNext->setIconSet( SmallIconSet(
"navigator_next") );
140 m_navBtnNext->setAutoRepeat(
true);
141 TQToolTip::add(m_navBtnNext, i18n(
"Next row"));
143 d->lyr->addWidget( m_navBtnLast =
new TQToolButton(
this) );
144 m_navBtnLast->setFixedWidth(bw);
145 m_navBtnLast->setFocusPolicy(TQWidget::NoFocus);
146 m_navBtnLast->setIconSet( SmallIconSet(
"navigator_last") );
147 TQToolTip::add(m_navBtnLast, i18n(
"Last row"));
149 d->lyr->addSpacing( 6 );
150 d->lyr->addWidget( m_navBtnNew =
new TQToolButton(
this) );
151 m_navBtnNew->setFixedWidth(bw);
152 m_navBtnNew->setFocusPolicy(TQWidget::NoFocus);
153 m_navBtnNew->setIconSet( SmallIconSet(
"navigator_new") );
154 TQToolTip::add(m_navBtnNew, i18n(
"New row"));
155 m_navBtnNext->setEnabled(isInsertingEnabled());
157 d->lyr->addSpacing( 6 );
158 d->lyr->addStretch(10);
160 connect(m_navBtnPrev,TQ_SIGNAL(clicked()),
this,TQ_SLOT(slotPrevButtonClicked()));
161 connect(m_navBtnNext,TQ_SIGNAL(clicked()),
this,TQ_SLOT(slotNextButtonClicked()));
162 connect(m_navBtnLast,TQ_SIGNAL(clicked()),
this,TQ_SLOT(slotLastButtonClicked()));
163 connect(m_navBtnFirst,TQ_SIGNAL(clicked()),
this,TQ_SLOT(slotFirstButtonClicked()));
164 connect(m_navBtnNew,TQ_SIGNAL(clicked()),
this,TQ_SLOT(slotNewButtonClicked()));
167 setCurrentRecordNumber(0);
169 updateGeometry(leftMargin);
172KexiRecordNavigator::~KexiRecordNavigator()
179 if (m_isInsertingEnabled==set)
181 m_isInsertingEnabled = set;
183 m_navBtnNew->setEnabled( m_isInsertingEnabled );
186void KexiRecordNavigator::setEnabled(
bool set )
188 TQFrame::setEnabled(set);
189 if (set && !m_isInsertingEnabled)
190 m_navBtnNew->setEnabled(
false );
193bool KexiRecordNavigator::eventFilter( TQObject *o, TQEvent *e )
195 if (o==m_navRecordNumber) {
196 bool recordEntered =
false;
198 if (e->type()==TQEvent::KeyPress) {
199 TQKeyEvent *ke =
static_cast<TQKeyEvent*
>(e);
201 case TQt::Key_Escape: {
203 m_navRecordNumber->undo();
209 case TQt::Key_Return:
211 case TQt::Key_BackTab:
220 else if (e->type()==TQEvent::FocusOut) {
221 if (
static_cast<TQFocusEvent*
>(e)->reason()!=TQFocusEvent::Tab
222 &&
static_cast<TQFocusEvent*
>(e)->reason()!=TQFocusEvent::Backtab
223 &&
static_cast<TQFocusEvent*
>(e)->reason()!=TQFocusEvent::Other)
230 uint r = m_navRecordNumber->text().toUInt(&ok);
233 if (m_view && (hasFocus() || e->type()==TQEvent::KeyPress))
236 emit recordNumberEntered(r);
238 d->handler->moveToRecordRequested(r-1);
254 if (r>(recCnt+(m_isInsertingEnabled?1:0)))
255 r = recCnt+(m_isInsertingEnabled?1:0);
258 n = TQString::number(r);
267 m_navRecordNumber->setText(n);
269 updateButtons(recCnt);
272void KexiRecordNavigator::updateButtons(uint recCnt)
276 m_navBtnPrev->setEnabled(r > 1);
277 m_navBtnFirst->setEnabled(r > 1);
278 m_navBtnNext->setEnabled(r > 0
279 && r < (recCnt +(m_isInsertingEnabled?(1+d->editingIndicatorVisible):0) ) );
280 m_navBtnLast->setEnabled(r!=(recCnt+(m_isInsertingEnabled?1:0)) && (m_isInsertingEnabled || recCnt>0));
286 const TQString & n = TQString::number(count);
293 if (m_view && m_view->horizontalScrollBar()->isVisible()) {
295 resize(width()+(n.length()-
m_navRecordCount->text().length())*m_nav1DigitWidth, height());
300 const int w = m_nav1DigitWidth*TQMAX( TQMAX(n.length(),2)+1,m_navRecordNumber->text().length()+1)+6;
301 if (m_navRecordNumber->width()!=w)
302 m_navRecordNumber->setFixedWidth(w);
307 m_view->updateScrollBars();
314 int r = m_navRecordNumber->text().toInt(&ok);
329void KexiRecordNavigator::setParentView(TQScrollView *view)
334void KexiRecordNavigator::updateGeometry(
int leftMargin)
336 TQFrame::updateGeometry();
339 if (m_view->horizontalScrollBar()->isVisible()) {
340 navWidth = sizeHint().width();
343 navWidth = leftMargin + m_view->clipper()->width();
347 m_view->frameWidth(),
348 m_view->height() - m_view->horizontalScrollBar()->sizeHint().height()-m_view->frameWidth(),
350 m_view->horizontalScrollBar()->sizeHint().height()
353 m_view->updateScrollBars();
359 hbar.setGeometry( x + width(), y, w - width(), h );
364 m_textLabel->setText(text.isEmpty() ? TQString() : (TQString::fromLatin1(
" ")+text+
" "));
375void KexiRecordNavigator::slotPrevButtonClicked()
377 emit prevButtonClicked();
379 d->handler->moveToPreviousRecordRequested();
382void KexiRecordNavigator::slotNextButtonClicked()
384 emit nextButtonClicked();
386 d->handler->moveToNextRecordRequested();
389void KexiRecordNavigator::slotLastButtonClicked()
391 emit lastButtonClicked();
393 d->handler->moveToLastRecordRequested();
396void KexiRecordNavigator::slotFirstButtonClicked()
398 emit firstButtonClicked();
400 d->handler->moveToFirstRecordRequested();
403void KexiRecordNavigator::slotNewButtonClicked()
405 emit newButtonClicked();
407 d->handler->addNewRecordRequested();
413 d->handler = handler;
418 return d->editingIndicatorVisible;
423 return d->editingIndicatorEnabled;
428 d->editingIndicatorEnabled = set;
429 if (d->editingIndicatorEnabled) {
430 if (!d->editingIndicatorLabel) {
431 d->editingIndicatorLabel =
new TQLabel(
this);
432 d->editingIndicatorLabel->setAlignment(TQt::AlignCenter);
434 pix.convertFromImage( *KexiRecordMarker::penImage() );
435 d->editingIndicatorLabel->setFixedWidth( pix.width() + 2*2 );
436 d->lyr->insertWidget( 0, d->editingIndicatorLabel );
438 d->editingIndicatorLabel->show();
441 if (d->editingIndicatorLabel) {
442 d->editingIndicatorLabel->hide();
449 d->editingIndicatorVisible = show;
451 if (!d->editingIndicatorEnabled)
453 if (d->editingIndicatorVisible) {
455 pix.convertFromImage( *KexiRecordMarker::penImage() );
456 d->editingIndicatorLabel->setPixmap( pix );
457 TQToolTip::add( d->editingIndicatorLabel, i18n(
"Editing indicator") );
460 d->editingIndicatorLabel->setPixmap( TQPixmap() );
461 TQToolTip::remove( d->editingIndicatorLabel );
468class KexiRecordNavigatorActionsInternal {
470 KexiRecordNavigatorActionsInternal()
471 : moveToFirstRecord(i18n(
"First row"),
"navigator_first", i18n(
"Go to first row"))
472 , moveToPreviousRecord(i18n(
"Previous row"),
"navigator_prev", i18n(
"Go to previous row"))
473 , moveToNextRecord(i18n(
"Next row"),
"navigator_next", i18n(
"Go to next row"))
474 , moveToLastRecord(i18n(
"Last row"),
"navigator_last", i18n(
"Go to last row"))
475 , moveToNewRecord(i18n(
"New row"),
"navigator_new", i18n(
"Go to new row"))
479 KGuiItem moveToFirstRecord;
480 KGuiItem moveToPreviousRecord;
481 KGuiItem moveToNextRecord;
482 KGuiItem moveToLastRecord;
483 KGuiItem moveToNewRecord;
486static KStaticDeleter<KexiRecordNavigatorActionsInternal> KexiRecordNavigatorActions_deleter;
487KexiRecordNavigatorActionsInternal* KexiRecordNavigatorActions_internal = 0;
489void KexiRecordNavigatorActionsInternal::init()
491 if (!KexiRecordNavigatorActions_internal)
492 KexiRecordNavigatorActions_deleter.setObject(KexiRecordNavigatorActions_internal,
493 new KexiRecordNavigatorActionsInternal());
496const KGuiItem& KexiRecordNavigator::Actions::moveToFirstRecord()
497{ KexiRecordNavigatorActionsInternal::init();
return KexiRecordNavigatorActions_internal->moveToFirstRecord; }
499const KGuiItem& KexiRecordNavigator::Actions::moveToPreviousRecord()
500{ KexiRecordNavigatorActionsInternal::init();
return KexiRecordNavigatorActions_internal->moveToPreviousRecord; }
502const KGuiItem& KexiRecordNavigator::Actions::moveToNextRecord()
503{ KexiRecordNavigatorActionsInternal::init();
return KexiRecordNavigatorActions_internal->moveToNextRecord; }
505const KGuiItem& KexiRecordNavigator::Actions::moveToLastRecord()
506{ KexiRecordNavigatorActionsInternal::init();
return KexiRecordNavigatorActions_internal->moveToLastRecord; }
508const KGuiItem& KexiRecordNavigator::Actions::moveToNewRecord()
509{ KexiRecordNavigatorActionsInternal::init();
return KexiRecordNavigatorActions_internal->moveToNewRecord; }
511#include "kexirecordnavigator.moc"
KexiRecordNavigatorHandler interface handles requests generated by KexiRecordNavigator.
void setInsertingButtonVisible(bool set)
uint currentRecordNumber() const
void setLabelText(const TQString &text)
void showEditingIndicator(bool show)
bool editingIndicatorEnabled() const
void setInsertingEnabled(bool set)
void setEditingIndicatorEnabled(bool set)
void setRecordCount(uint count)
void setHBarGeometry(TQScrollBar &hbar, int x, int y, int w, int h)
void setCurrentRecordNumber(uint r)
bool editingIndicatorVisible() const
void setRecordHandler(KexiRecordNavigatorHandler *handler)
KLineEdit * m_navRecordCount
readonly counter