/** * \file QCommandBuffer.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author John Levon * * Full author contact details are available in file CREDITS. */ #include // Qt defines a macro 'signals' that clashes with a boost namespace. // All is well if the namespace is visible first. #include "GuiView.h" #include "QCommandBuffer.h" #include "QCommandEdit.h" #include "qt_helpers.h" //Added by qt3to4: #include #include #include #include #include #include "controllers/ControlCommandBuffer.h" #include "support/filetools.h" #include #include #include #include using lyx::support::libFileSearch; using std::vector; using std::string; namespace lyx { namespace frontend { namespace { class QTempListBox : public QListWidget { public: QTempListBox() { //setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setWindowModality(Qt::WindowModal); setWindowFlags(Qt::Popup); setAttribute(Qt::WA_DeleteOnClose); } protected: void mouseReleaseEvent(QMouseEvent * e) { if (e->x() < 0 || e->y() < 0 || e->x() > width() || e->y() > height()) { hide(); } else { // emit signal itemPressed(currentItem()); } } void keyPressEvent(QKeyEvent * e) { if (e->key() == Qt::Key_Escape) { hide(); return; } QListWidget::keyPressEvent(e); } }; } // end of anon QCommandBuffer::QCommandBuffer(GuiView * view, ControlCommandBuffer & control, QWidget * parent) : QWidget(parent), view_(view), controller_(control) { QPixmap qpup(toqstr(libFileSearch("images", "up", "xpm"))); QPixmap qpdown(toqstr(libFileSearch("images", "down", "xpm"))); QVBoxLayout * top = new QVBoxLayout(this); QHBoxLayout * layout = new QHBoxLayout(0); QPushButton * up = new QPushButton(qpup, "", this); up->setToolTip(qt_("Previous command")); connect(up, SIGNAL(clicked()), this, SLOT(up())); QPushButton * down = new QPushButton(qpdown, "", this); down->setToolTip(qt_("Next command")); connect(down, SIGNAL(clicked()), this, SLOT(down())); edit_ = new QCommandEdit(this); edit_->setMinimumSize(edit_->sizeHint()); edit_->setFocusPolicy(Qt::ClickFocus); connect(edit_, SIGNAL(escapePressed()), this, SLOT(cancel())); connect(edit_, SIGNAL(returnPressed()), this, SLOT(dispatch())); connect(edit_, SIGNAL(tabPressed()), this, SLOT(complete())); connect(edit_, SIGNAL(upPressed()), this, SLOT(up())); connect(edit_, SIGNAL(downPressed()), this, SLOT(down())); layout->addWidget(up, 0); layout->addWidget(down, 0); layout->addWidget(edit_, 10); top->addLayout(layout); } void QCommandBuffer::focus_command() { edit_->setFocus(); } void QCommandBuffer::cancel() { view_->centralWidget()->setFocus(); edit_->setText(""); } void QCommandBuffer::dispatch() { controller_.dispatch(fromqstr(edit_->text())); view_->centralWidget()->setFocus(); edit_->setText(""); edit_->clearFocus(); } void QCommandBuffer::complete() { string const input = fromqstr(edit_->text()); string new_input; vector comp = controller_.completions(input, new_input); if (comp.empty() && new_input == input) { // show_info_suffix(qt_("[no match]"), input); return; } if (comp.empty()) { edit_->setText(toqstr(new_input)); // show_info_suffix(("[only completion]"), new_input + ' '); return; } edit_->setText(toqstr(new_input)); QTempListBox * list = new QTempListBox; // For some reason the scrollview's contents are larger // than the number of actual items... vector::const_iterator cit = comp.begin(); vector::const_iterator end = comp.end(); for (; cit != end; ++cit) { list->addItem(toqstr(*cit)); } // width() is not big enough by a few pixels. Qt Sucks. // list->setMinimumWidth(list->sizeHint().width() + 10); list->resize(list->sizeHint()); QPoint pos(edit_->mapToGlobal(QPoint(0, 0))); int y = std::max(0, pos.y() - list->height()); list->move(pos.x(), y); connect(list, SIGNAL(itemPressed(QListWidgetItem *)), this, SLOT(complete_selected(QListWidgetItem *))); list->show(); list->setFocus(); } void QCommandBuffer::complete_selected(QListWidgetItem * item) { QWidget const * widget = static_cast(sender()); const_cast(widget)->hide(); edit_->setText(item->text() + ' '); edit_->setFocus(); } void QCommandBuffer::up() { string const input(fromqstr(edit_->text())); string const h(controller_.historyUp()); if (h.empty()) { // show_info_suffix(qt_("[Beginning of history]"), input); } else { edit_->setText(toqstr(h)); } } void QCommandBuffer::down() { string const input(fromqstr(edit_->text())); string const h(controller_.historyDown()); if (h.empty()) { // show_info_suffix(qt_("[End of history]"), input); } else { edit_->setText(toqstr(h)); } } #if 0 void XMiniBuffer::show_info_suffix(string const & suffix, string const & input) { stored_input_ = input; info_suffix_shown_ = true; set_input(input + ' ' + suffix); suffix_timer_->start(); } void XMiniBuffer::suffix_timeout() { info_suffix_shown_ = false; set_input(stored_input_); } #endif } // namespace frontend } // namespace lyx #include "QCommandBuffer_moc.cpp"