recordtablescreen.cpp

Go to the documentation of this file.
00001 #include <QtCore/qobject.h>
00002 #include <QtCore/qmimedata.h>
00003 #include <QProgressBar>
00004 
00005 #include "main.h"
00006 #include "mainwindow.h"
00007 #include "clipbrecords.h"
00008 #include "recordtablescreen.h"
00009 #include "recordtablemodel.h"
00010 
00011 extern appconfig mytetraconfig;
00012 
00013 
00014 recordtablescreen::recordtablescreen(QWidget *parent) : QWidget(parent)
00015 {
00016  setup_actions();
00017  setup_ui();
00018 
00019  // Для вида таблицы данных устанавливается модель
00020  // Установку модели надо сделать перед соединением сигналов и слотов
00021  recordmodel=new recordtablemodel();
00022  recordmodel->setObjectName("recordmodel");
00023  recordview->setModel(recordmodel);
00024  
00025  setup_signals();
00026  assembly();
00027 
00028  recordview_currentdir="";
00029  recordview_currentfile="";
00030 
00031  // Нужно установить правила показа контекстного самодельного меню
00032  // чтобы оно могло вызываться
00033  recordview->setContextMenuPolicy(Qt::CustomContextMenu);
00034  
00035 }
00036 
00037 recordtablescreen::~recordtablescreen()
00038 {
00039 
00040 }
00041 
00042 
00043 void recordtablescreen::setup_actions(void)
00044 {
00045  // Добавление записи
00046  // a->setShortcut(tr("Ctrl+X"));
00047  action_add_new_toend = new QAction(tr("Add new"), this);
00048  action_add_new_toend->setStatusTip(tr("Add new record"));
00049  action_add_new_toend->setIcon(QIcon("resource/pic/note_add.svg"));
00050  connect(action_add_new_toend, SIGNAL(triggered()), this, SLOT(add_new_toend_context()));
00051 
00052  // Добавление записи до
00053  action_add_new_before = new QAction(tr("Add new before"), this);
00054  action_add_new_before->setStatusTip(tr("Add new record before selected record"));
00055  connect(action_add_new_before, SIGNAL(triggered()), this, SLOT(add_new_before_context()));
00056 
00057  // Добавление записи после
00058  action_add_new_after = new QAction(tr("Add new after"), this);
00059  action_add_new_after->setStatusTip(tr("Add new record after selected record"));
00060  connect(action_add_new_after, SIGNAL(triggered()), this, SLOT(add_new_after_context()));
00061 
00062  // Редактирование записи
00063  action_edit_field = new QAction(tr("Edit property (name, author, tags...)"), this);
00064  action_edit_field->setStatusTip(tr("Edit record property (name, author, tags...)"));
00065  action_edit_field->setIcon(QIcon("resource/pic/note_edit.svg"));
00066  connect(action_edit_field, SIGNAL(triggered()), this, SLOT(edit_field_context()));
00067 
00068  // Удаление записи
00069  action_delete = new QAction(tr("Delete"), this);
00070  action_delete->setStatusTip(tr("Delete record(s)"));
00071  action_delete->setIcon(QIcon("resource/pic/note_delete.svg"));
00072  connect(action_delete, SIGNAL(triggered()), this, SLOT(delete_context()));
00073 
00074  // Удаление записи с копированием в буфер обмена
00075  action_cut = new QAction(tr("&Cut"), this);
00076  action_cut->setStatusTip(tr("Cut record(s) to clipboard"));
00077  action_cut->setIcon(QIcon("resource/pic/cb_cut.svg"));
00078  connect(action_cut, SIGNAL(triggered()), this, SLOT(cut()));
00079 
00080  // Копирование записи (записей) в буфер обмена
00081  action_copy = new QAction(tr("&Copy"), this);
00082  action_copy->setStatusTip(tr("Copy record(s) to clipboard"));
00083  action_copy->setIcon(QIcon("resource/pic/cb_copy.svg"));
00084  connect(action_copy, SIGNAL(triggered()), this, SLOT(copy()));
00085 
00086  // Вставка записи из буфера обмена
00087  action_paste = new QAction(tr("&Paste"), this);
00088  action_paste->setStatusTip(tr("Paste record(s) from clipboard"));
00089  action_paste->setIcon(QIcon("resource/pic/cb_paste.svg"));
00090  connect(action_paste, SIGNAL(triggered()), this, SLOT(paste()));
00091 
00092  // Перемещение записи вверх
00093  action_moveup = new QAction(tr("&Move Up"), this);
00094  action_moveup->setStatusTip(tr("Move record up"));
00095  action_moveup->setIcon(QIcon("resource/pic/move_up.svg"));
00096  connect(action_moveup, SIGNAL(triggered()), this, SLOT(moveup()));
00097 
00098  // Перемещение записи вниз
00099  action_movedn=new QAction(tr("&Move Down"), this);
00100  action_movedn->setStatusTip(tr("Move record down"));
00101  action_movedn->setIcon(QIcon("resource/pic/move_dn.svg"));
00102  connect(action_movedn, SIGNAL(triggered()), this, SLOT(movedn()));
00103 
00104  action_findinbase=new QAction(tr("Find in base"), this);
00105  action_findinbase->setStatusTip(tr("Find in base"));
00106  action_findinbase->setIcon(QIcon("resource/pic/find_in_base.svg"));
00107  connect(action_findinbase, SIGNAL(triggered()), this, SLOT(findinbase_open()));
00108   
00109  // Сразу после создания все действия запрещены
00110  disable_all_actions();
00111 }
00112 
00113 
00114 void recordtablescreen::setup_ui(void)
00115 {
00116  tools_line=new QToolBar(this);
00117  tools_line->addSeparator();
00118  tools_line->addAction(action_add_new_toend);
00119  tools_line->addAction(action_edit_field);
00120  tools_line->addAction(action_delete);
00121  tools_line->addSeparator();
00122  tools_line->addAction(action_cut);
00123  tools_line->addAction(action_copy);
00124  tools_line->addAction(action_paste);
00125  tools_line->addSeparator();
00126  tools_line->addAction(action_moveup);
00127  tools_line->addAction(action_movedn);
00128 
00129  find_line=new QToolBar(this);
00130  find_line->addAction(action_findinbase);
00131  
00132  recordview=new QListView(this);
00133  recordview->setObjectName("recordview");
00134  recordview->setSelectionMode(QAbstractItemView::ExtendedSelection);
00135 }
00136 
00137 
00138 void recordtablescreen::setup_signals(void)
00139 {
00140  // Сигнал чтобы показать контекстное меню по правому клику на списке записей
00141  connect(recordview,SIGNAL(customContextMenuRequested(const QPoint &)),
00142          this,SLOT(on_customContextMenuRequested(const QPoint &)));
00143 
00144  // Сигнал чтобы открыть на редактирование параметры записи при двойном клике
00145  connect(recordview, SIGNAL(doubleClicked(const QModelIndex &)),
00146          this, SLOT(edit_field_context(void)));
00147 
00148  // Сигнал для обработки движения стрелок в списке конечных записей
00149  connect(recordview->selectionModel(), SIGNAL(currentRowChanged (const QModelIndex&, const QModelIndex&)),
00150          this, SLOT(select(const QModelIndex&)));
00151 
00152  // Сигналы для обновления панели инструментов при изменении в selectionModel()
00153  connect(recordview->selectionModel(), SIGNAL(currentChanged (const QModelIndex&, const QModelIndex&)),
00154          this, SLOT(tools_update(void)));
00155  connect(recordview->selectionModel(), SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),
00156          this, SLOT(tools_update(void)));
00157 
00158  // Сигналы для обновления панели инструментов
00159  connect(recordview, SIGNAL(activated(const QModelIndex &)),
00160          this, SLOT(tools_update(void)));
00161  connect(recordview, SIGNAL(clicked(const QModelIndex &)),
00162          this, SLOT(tools_update(void)));
00163  connect(recordview, SIGNAL(doubleClicked(const QModelIndex &)),
00164          this, SLOT(tools_update(void)));
00165  connect(recordview, SIGNAL(entered(const QModelIndex &)),
00166          this, SLOT(tools_update(void)));
00167  connect(recordview, SIGNAL(pressed(const QModelIndex &)),
00168          this, SLOT(tools_update(void)));
00169  connect(QApplication::clipboard(),SIGNAL(dataChanged()),
00170          this, SLOT(tools_update(void)));
00171 }
00172 
00173 
00174 void recordtablescreen::assembly(void)
00175 {
00176  recordtable_tools_layout=new QHBoxLayout();
00177  recordtable_tools_layout->addWidget(tools_line);
00178  recordtable_tools_layout->addStretch();
00179  recordtable_tools_layout->addWidget(find_line);
00180  
00181  recordtablescreen_layout=new QVBoxLayout();
00182  recordtablescreen_layout->setObjectName("recordtablescreen_QVBoxLayout");
00183 
00184  recordtablescreen_layout->addLayout(recordtable_tools_layout);
00185  recordtablescreen_layout->addWidget(recordview);
00186 
00187  setLayout(recordtablescreen_layout);
00188 
00189  // Границы убираются, так как данный объект будет использоваться как виджет
00190  QLayout *lt;
00191  lt=layout();
00192  lt->setContentsMargins(0,2,0,0);
00193 }
00194 
00195 
00196 // Установка нового набора данных для списка записей
00197 void recordtablescreen::set_tabledata(recordtabledata *rtdata)
00198 {
00199  qDebug() << "In recordtablescreen set_tabledata() start";
00200  
00201  // Обновление набора данных с последующим выбором первой строки
00202  // может быть очень длительным, поэтому показывается что процесс выполняется
00203  // QCursor cursor_wait=QCursor(Qt::BusyCursor);
00204  // qApp->setOverrideCursor(cursor_wait);
00205  find_object<mainwindow>("mainwindow")->setCursor(Qt::BusyCursor);
00206  
00207  // Указатель на данные сообщается источнику данных
00208  recordmodel->set_tabledata(rtdata);
00209 
00210  // Надо обязательно сбросить selection model для списка записей
00211  recordview->selectionModel()->clear();
00212  
00213  // Если список конечных записей не пуст
00214  // Выделение надо устанавливается на первую запись
00215  // иначе выделение устанавливать не нужно, 
00216  // а надо очистить поля области редактировния
00217  if(recordmodel->rowCount()>0)
00218   recordview->selectionModel()->setCurrentIndex( recordview->model()->index( 0, 0 ) , QItemSelectionModel::SelectCurrent);
00219  else
00220  { 
00221   find_object<metaeditor>("editorview")->clear_all();
00222   recordview_currentdir="";
00223   recordview_currentfile="";
00224  }
00225  
00226  // qApp->restoreOverrideCursor();
00227  find_object<mainwindow>("mainwindow")->unsetCursor();
00228  
00229  qDebug() << "In recordtablescreen set new model stop";
00230 }
00231 
00232 
00233 QString recordtablescreen::get_currentdir(void)
00234 {
00235  return recordview_currentdir;
00236 }
00237 
00238 
00239 QString recordtablescreen::get_currentfile(void)
00240 {
00241  return recordview_currentfile;
00242 }
00243 
00244 
00245 // Полный путь к файлу, который открыт на редактирование в recordview
00246 QString recordtablescreen::get_fullfilename_of_currentitem(void)
00247 {
00248  QString fullfilename="./"+mytetraconfig.get_tetradir()+"/base/"+recordview_currentdir+"/"+recordview_currentfile;
00249  return fullfilename;
00250 }
00251 
00252 
00253 // Действия при выборе пункта таблицы конечных записей
00254 void recordtablescreen::select(const QModelIndex &index)
00255 {
00256  qDebug() << "In function recordtablescreen select () current item num " << index.row();
00257 
00258  // Сохраняется текст в окне редактирования в соответсвующий файл
00259  find_object<mainwindow>("mainwindow")->save_current_record_text();
00260 
00261  // Выясняется ссылка на таблицу конечных данных
00262  recordtabledata *table=recordmodel->get_tabledata();
00263  
00264  // Для новой выбраной записи выясняется директория и основной файл
00265  QString currentdir =table->get_field("dir",index.row());
00266  QString currentfile=table->get_field("file",index.row());
00267  QString fullfilename="./"+mytetraconfig.get_tetradir()+"/base/"+currentdir+"/"+currentfile;
00268  qDebug() << " File " << fullfilename << "\n";
00269  QFile f(fullfilename);
00270 
00271  // Если в окне содержимого записи уже находится выбираемая запись
00272  if(recordview_currentdir==currentdir && 
00273     recordview_currentfile==currentfile) return;
00274 
00275  // Если нужный файл не существует
00276  if(!f.exists())
00277   critical_error("File "+fullfilename+" not found");
00278 
00279  // Если нужный файл недоступен для чтения
00280  if(!f.open(QIODevice::ReadOnly))
00281   critical_error("File "+fullfilename+" not readable. Check permission.");
00282 
00283 
00284  // Текст из файла вставляется в окно редактирования
00285  // editorview->set_textarea( QString::fromUtf8(f.readAll()) );
00286  metaeditor *edview=find_object<metaeditor>("editorview");
00287  edview->set_textarea( QString::fromUtf8(f.readAll()) );
00288 
00289  // Заполнятся прочие инфо поля на экране
00290  edview->set_name  ( table->get_field("name",index.row()) );
00291  edview->set_author( table->get_field("author",index.row()) );
00292  edview->set_url   ( table->get_field("url",index.row()) );
00293  edview->set_tags  ( table->get_field("tags",index.row()) );
00294 
00295  // Запоминаются имя файла и директории
00296  recordview_currentdir=currentdir;
00297  recordview_currentfile=currentfile;
00298 }
00299 
00300 
00301 // Слот для вызова добавления новой записи в конец таблицы
00302 void recordtablescreen::add_new_toend_context(void)
00303 {
00304  qDebug() << "In slot add_new_toend_context()";
00305 
00306  add_new_record(ADD_NEW_RECORD_TO_END);
00307 }
00308 
00309 
00310 // Слот для вызова добавления новой записи перед выделенной строкой
00311 void recordtablescreen::add_new_before_context(void)
00312 {
00313  qDebug() << "In slot add_new_before_context()";
00314 
00315  add_new_record(ADD_NEW_RECORD_BEFORE);
00316 }
00317 
00318 
00319 // Слот для вызова добавления новой записи после выделенной строки
00320 void recordtablescreen::add_new_after_context(void)
00321 {
00322  qDebug() << "In slot add_new_after_context()";
00323 
00324  add_new_record(ADD_NEW_RECORD_AFTER);
00325 }
00326 
00327 
00328 // Вызов окна добавления данных в таблицу конечных записей
00329 void recordtablescreen::add_new_record(int mode)
00330 {
00331  qDebug() << "In add_new_record()";
00332 
00333  // Создается окно ввода данных, после выхода из этой функции окно должно удалиться
00334  addnewrecord addnewrecordwin;
00335  int i=addnewrecordwin.exec();
00336  if(i==QDialog::Rejected)return; // Была нажата отмена, ничего не нужно делать
00337 
00338  // Введенные данные добавляются
00339  add_new(mode,
00340          addnewrecordwin.get_field("name"),
00341          addnewrecordwin.get_field("author"),
00342          addnewrecordwin.get_field("url"),
00343          addnewrecordwin.get_field("tags"),
00344          addnewrecordwin.get_field("text"));
00345 }
00346 
00347 
00348 // Функция добавления новой записи в таблицу конечных записей
00349 void recordtablescreen::add_new(int mode,
00350                                 QString name,
00351                                 QString author,
00352                                 QString url,
00353                                 QString tags,
00354                                 QString text)
00355 {
00356  qDebug() << "In add_new()";
00357 
00358  // Получение номера первой выделенной строки
00359  int pos=get_first_selection_pos();
00360  if(pos<0)pos=0; // Если ничего не было выбрано
00361 
00362  // Выясняется ссылка на таблицу конечных данных
00363  recordtabledata *table=recordmodel->get_tabledata();
00364 
00365  // Вставка новых данных в модель таблицы конечных записей
00366  int selpos=table->insert_new_record(mode,pos,
00367                                      name,
00368                                      author,
00369                                      url,
00370                                      tags,
00371                                      text);
00372 
00373  // Обновление данных на экране после их изменения
00374  recordmodel->update();
00375  
00376  // Установка курсора на только что созданную позицию
00377  QModelIndex selidx=recordmodel->index(selpos); // Создание индекса из номера
00378  recordview->selectionModel()->setCurrentIndex(selidx,QItemSelectionModel::ClearAndSelect);
00379 
00380  // Сохранение дерева веток
00381  find_object<treescreen>("treeview")->save_knowtree();
00382 }
00383 
00384 
00385 void recordtablescreen::edit_field_context(void)
00386 {
00387  qDebug() << "In edit_field_context()";
00388 
00389  // Получение индекса выделенного элемента
00390  QModelIndexList selectitems=recordview->selectionModel()->selectedIndexes();
00391  QModelIndex index=selectitems.at(0);
00392  int pos=(selectitems.at(0)).row();
00393 
00394  // Создается окно ввода данных, после выхода из этой функции окно должно удалиться
00395  editrecord editrecordwin;
00396 
00397   // Выясняется ссылка на таблицу конечных данных
00398  recordtabledata *table=recordmodel->get_tabledata();
00399 
00400  // Поля окна заполняются начальными значениями
00401  editrecordwin.set_field("name",  table->get_field("name",index.row()) );
00402  editrecordwin.set_field("author",table->get_field("author",index.row()) );
00403  editrecordwin.set_field("url",   table->get_field("url",index.row()) );
00404  editrecordwin.set_field("tags",  table->get_field("tags",index.row()) );
00405 
00406 
00407  int i=editrecordwin.exec();
00408  if(i==QDialog::Rejected)return; // Была нажата отмена, ничего не нужно делать
00409 
00410  // Введенные данные обновляются
00411  edit_field(pos,
00412             editrecordwin.get_field("name"),
00413             editrecordwin.get_field("author"),
00414             editrecordwin.get_field("url"),
00415             editrecordwin.get_field("tags"));
00416 
00417  // Нужно перерисовать окно редактирования чтобы обновились инфополя
00418  // делается это путем "повторного" выбора текущего пункта
00419  select(index);
00420 }
00421 
00422 
00423 // Функция сохранения отредактированной записи в таблицу конечных записей
00424 void recordtablescreen::edit_field(int pos,
00425                                    QString name,
00426                                    QString author,
00427                                    QString url,
00428                                    QString tags)
00429 {
00430  qDebug() << "In edit_field()";
00431 
00432  // Выясняется ссылка на таблицу конечных данных
00433  recordtabledata *table=recordmodel->get_tabledata();
00434 
00435  // Обновление новых данных в таблице конечных записей
00436  table->edit_record(pos,
00437                     name,
00438                     author,
00439                     url,
00440                     tags);
00441 
00442  // Обновление инфополей в области редактирования записи
00443  metaeditor *medt=find_object<metaeditor>("editorview");
00444  medt->set_name(name);
00445  medt->set_author(author);
00446  medt->set_url(url);
00447  medt->set_tags(tags);
00448  
00449  // Сохранение дерева веток
00450  find_object<treescreen>("treeview")->save_knowtree();
00451 }
00452 
00453 
00454 void recordtablescreen::delete_context(void)
00455 {
00456  // Создается окно с вопросом нужно удалять запись (записи) или нет
00457  QMessageBox messageBox(this);
00458  messageBox.setWindowTitle("Delete");
00459  messageBox.setText("Are you sure to delete this record(s)?");
00460  QAbstractButton *cancelButton =messageBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
00461  QAbstractButton *deleteButton =messageBox.addButton(tr("Delete"), QMessageBox::AcceptRole);
00462 
00463  Q_UNUSED(cancelButton);
00464  
00465  messageBox.exec();
00466  if (messageBox.clickedButton() == deleteButton)
00467   {
00468    // Выбранные данные удаляются
00469    delete_records();
00470   }
00471 
00472 }
00473 
00474 
00475 // Удаление отмеченных записей
00476 void recordtablescreen::delete_records(void)
00477 {
00478  // Запоминание позиции, на которой стоит курсор списка
00479  int before_index=(recordview->selectionModel()->currentIndex()).row();
00480 
00481  // Выясняется ссылка на таблицу конечных данных
00482  recordtabledata *table=recordmodel->get_tabledata();
00483  
00484  // Получение списка Item-элементов, подлежащих удалению
00485  QModelIndexList itemsfordelete=recordview->selectionModel()->selectedIndexes();
00486 
00487  // Сбор в массив всех индексов, которые нужно удалить
00488  // Напрямую пробегать массив item-элементов и удалять из него нельзя
00489  // так как итератор начинает указывать на несуществующие элементы
00490  QVector<int> delidx;
00491  QModelIndexList::iterator it;
00492  for(it=itemsfordelete.begin(); it!=itemsfordelete.end(); it++)
00493  {
00494   QModelIndex curridx;
00495   curridx=*it;
00496   qDebug() << "Mark for delete item num " << curridx.row();
00497   delidx.append( curridx.row() );
00498  }
00499 
00500  // Массив удаляемых индексов сортируется так чтоб вначале 
00501  // были индексы с наименьшим номером
00502  qSort(delidx.begin(), delidx.end(), qLess<int>());
00503  
00504  // Поиск индекса, на который надо установить засветку после удаления
00505  int i=0,selection_index=-1;
00506  for(i=0;i<table->size();i++)
00507   {
00508    // Если позиция не помечена на удаление, она считается
00509    if(!delidx.contains(i))
00510     {
00511      selection_index++;
00512   
00513      // На первой непомеченной после курсора позиции обработка прекращается
00514      // Значение selection_index в этот момент и есть нужный индекс
00515      if(i>before_index)break; 
00516     }
00517   }
00518 
00519  // Вызывается удаление отмеченных записей
00520  table->delete_records(delidx);
00521 
00522  // Сохранение дерева веток
00523  find_object<treescreen>("treeview")->save_knowtree();
00524 
00525  // Обновление на экране ветки, на которой стоит засветка,
00526  // так как количество хранимых в ветке записей поменялось
00527  find_object<treescreen>("treeview")->update_selected_branch();
00528  
00529  // Обновление данных на экране для таблицы конечных записей
00530  recordmodel->update();
00531  
00532  // Установка курсора на нужную позицию
00533  if(selection_index>=0)
00534   {
00535    // Создание индекса из номера
00536    QModelIndex selidx=recordmodel->index(selection_index); 
00537 
00538    // Установка курсора
00539    recordview->selectionModel()->setCurrentIndex(selidx,QItemSelectionModel::ClearAndSelect);
00540   }
00541  else
00542   {
00543    // Иначе таблица конечных записей пуста, курсор устанавливать не нужно
00544 
00545    // Нужно очистить поле редактирования чтобы невидно было текста
00546    // последней удаленной записи
00547    find_object<metaeditor>("editorview")->clear_all();
00548   }
00549 }
00550 
00551 
00552 // Копирование отмеченных записей в буфер обмена с удалением 
00553 // из таблицы конечных записей
00554 void recordtablescreen::cut(void)
00555 {
00556  copy();
00557  delete_records();
00558 }
00559 
00560 // Копирование отмеченных записей в буфер обмена
00561 void recordtablescreen::copy(void)
00562 {
00563  // Получение списка Item-элементов, подлежащих копированию
00564  QModelIndexList itemsforcopy=recordview->selectionModel()->selectedIndexes();
00565 
00566   // Создается ссылка на буфер обмена
00567  QClipboard *cbuf=QApplication::clipboard();
00568 
00569  // Создается объект с данными для заполнения буфера обмена
00570  static int fillflag=0;
00571  if(fillflag==1)
00572   {
00573    const clipbrecords *rcd_previos;
00574    rcd_previos=qobject_cast<const clipbrecords *>(cbuf->mimeData());
00575    if(rcd_previos!=NULL)delete rcd_previos;
00576    fillflag=0;
00577   } 
00578  clipbrecords *rcd=new clipbrecords();
00579  fillflag=1;
00580 
00581  // Выясняется ссылка на таблицу конечных данных
00582  recordtabledata *table=recordmodel->get_tabledata();
00583 
00584  // Перебираются записи и вносятся в буфер обмена
00585  for(int i=0; i<itemsforcopy.size(); ++i) 
00586   rcd->add_record( table->get_record_img( (itemsforcopy.at(i)).row() ));
00587 
00588  // Печатается содержимое буфера в консоль
00589  rcd->print();
00590 
00591  // Объект с записями помещается в буфер обмена
00592  cbuf->setMimeData(rcd);
00593 }
00594 
00595 
00596 // Вставка записей из буфера обмена
00597 void recordtablescreen::paste(void)
00598 {
00599  // Проверяется, содержит ли буфер обмена данные нужного формата
00600  if(!(QApplication::clipboard()->mimeData()->hasFormat("mytetra/records"))) 
00601   return;
00602 
00603  // Создается ссылка на буфер обмена
00604  QClipboard *cbuf=QApplication::clipboard();
00605  
00606  // Извлечение объекта из буфера обмена
00607  // const clipbrecords *rcd=new clipbrecords();
00608  const clipbrecords *rcd;
00609  rcd=qobject_cast<const clipbrecords *>(cbuf->mimeData());
00610  rcd->print();
00611 
00612  // Выясняется количество записей в буфере
00613  int nlist=rcd->get_records_num();
00614  
00615  // Пробегаются все записи в буфере
00616  for(int i=0;i<nlist;i++)
00617   {
00618    QMap<QString, QString> curr_record;
00619    
00620    // Получение из буфера записи с нужным номером
00621    curr_record=rcd->get_record(i);
00622  
00623    // if(recordview->selectionModel()->hasSelection())
00624  
00625    add_new(ADD_NEW_RECORD_TO_END,
00626            curr_record["name"],
00627            curr_record["author"],
00628            curr_record["url"],
00629            curr_record["tags"],
00630            curr_record["text"]);
00631   }
00632 
00633  // Обновление на экране ветки, на которой стоит засветка,
00634  // так как количество хранимых в ветке записей поменялось
00635  find_object<treescreen>("treeview")->update_selected_branch();
00636 }
00637 
00638 
00639 // Отключение всех действий
00640 void recordtablescreen::disable_all_actions(void)
00641 {
00642  action_add_new_toend->setEnabled(false);
00643  action_add_new_before->setEnabled(false);
00644  action_add_new_after->setEnabled(false);
00645  action_edit_field->setEnabled(false);
00646  action_delete->setEnabled(false);
00647 
00648  action_cut->setEnabled(false);
00649  action_copy->setEnabled(false);
00650  action_paste->setEnabled(false);
00651 
00652  action_moveup->setEnabled(false);
00653  action_movedn->setEnabled(false);
00654 }
00655 
00656 
00657 void recordtablescreen::tools_update(void)
00658 {
00659  qDebug() << "Recordtable tools update";
00660 
00661  // Отключаются все действия
00662  disable_all_actions();
00663 
00664  // Выясняется, содержит ли текущая ветка подчиненные ветки
00665  /*
00666  QModelIndex index = find_object<treescreen>("treeview")->get_selection_model()->currentIndex();
00667  TreeItem *item = find_object<treescreen>("treeview")->kntrmodel->getItem(index);
00668  int branch_have_children=0;
00669  if(item->childCount()>0)branch_have_children=1;
00670  */
00671 
00672  // Включаются те действия которые разрешены
00673 
00674  // Добавление записи
00675  // Добавлять можно к любой ветке
00676  action_add_new_toend->setEnabled(true);
00677 
00678  // Добавление записи до
00679  // Добавлять "до" можно только тогда, когда выбрана только одна строка
00680  if((recordview->selectionModel()->hasSelection() &&
00681      (recordview->selectionModel()->selectedRows()).size()==1))
00682     action_add_new_before->setEnabled(true);
00683 
00684  // Добавление записи после
00685  // Добавлять "после" можно только тогда, когда выбрана только одна строка
00686  if((recordview->selectionModel()->hasSelection() &&
00687      (recordview->selectionModel()->selectedRows()).size()==1))
00688   action_add_new_after->setEnabled(true);
00689 
00690  // Редактирование записи
00691  // Редактировать можно только тогда, когда выбрана только одна строка
00692  if(recordview->selectionModel()->hasSelection() &&
00693     (recordview->selectionModel()->selectedRows()).size()==1)
00694   action_edit_field->setEnabled(true);
00695 
00696  // Удаление записи
00697  // Пункт активен только если запись (или записи) выбраны в списке
00698  if(recordview->selectionModel()->hasSelection())
00699   action_delete->setEnabled(true);
00700 
00701  // Удаление с копированием записи в буфер обмена
00702  // Пункт активен только если запись (или записи) выбраны в списке
00703  if(recordview->selectionModel()->hasSelection())
00704   action_cut->setEnabled(true);
00705 
00706  // Копирование записи в буфер обмена
00707  // Пункт активен только если запись (или записи) выбраны в списке
00708  if(recordview->selectionModel()->hasSelection())
00709   action_copy->setEnabled(true);
00710 
00711  // Вставка записи из буфера обмена
00712  // Вставлять записи можно только тогда, когда выбрана
00713  // только одна строка (добавляется после выделеной строки)
00714  // или не выбрано ни одной строки (тогда добавляется в конец списка)
00715  // или записей вообще нет
00716  // И проверяется, содержит ли буфер обмена данные нужного формата
00717  if((recordview->selectionModel()->hasSelection() && (recordview->selectionModel()->selectedRows()).size()==1) ||
00718      recordview->selectionModel()->hasSelection()==false ||
00719      recordview->model()->rowCount()==0)
00720   if(QApplication::clipboard()->mimeData()->hasFormat("mytetra/records")) 
00721    action_paste->setEnabled(true);
00722 
00723  // Перемещение записи вверх
00724  // Пункт возможен только когда выбрана одна строка
00725  // и указатель стоит не на начале списка
00726  if((recordview->selectionModel()->hasSelection() && (recordview->selectionModel()->selectedRows()).size()==1) &&
00727     is_selected_set_to_top()==false )
00728   action_moveup->setEnabled(true);
00729 
00730  // Перемещение записи вниз
00731  // Пункт возможен только когда выбрана одна строка
00732  // и указатель стоит не в конце списка
00733  if((recordview->selectionModel()->hasSelection() && (recordview->selectionModel()->selectedRows()).size()==1) &&
00734     is_selected_set_to_bottom()==false )
00735   action_movedn->setEnabled(true);
00736 
00737  // Обновляется состояние области редактирования текста
00738  // если ни одна запись не выбрана, редактирование невозможно
00739  if(recordview->selectionModel()->hasSelection())
00740   find_object<metaeditor>("editorview")->set_textarea_editable(true);
00741  else
00742   find_object<metaeditor>("editorview")->set_textarea_editable(false);
00743 }
00744 
00745 
00746 // Открытие контекстного меню в таблице конечных записей
00747 void recordtablescreen::on_customContextMenuRequested(const QPoint &pos)
00748 {
00749   qDebug("In on_customContextMenuRequested");
00750 
00751   // Конструирование меню
00752   QMenu menu(this);
00753   menu.addAction(action_add_new_toend);
00754   menu.addAction(action_add_new_before);
00755   menu.addAction(action_add_new_after);
00756   menu.addSeparator();
00757   menu.addAction(action_edit_field);
00758   menu.addAction(action_delete);
00759   menu.addSeparator();
00760   menu.addAction(action_cut);
00761   menu.addAction(action_copy);
00762   menu.addAction(action_paste);
00763  
00764   // Включение отображения меню на экране
00765   // menu.exec(event->globalPos());
00766   menu.exec(recordview->viewport()->mapToGlobal(pos));
00767 }
00768 
00769 
00770 // Перемещение записи вверх
00771 void recordtablescreen::moveup(void)
00772 {
00773  qDebug() << "In moveup()";
00774 
00775  // Получение номера первой выделенной строки
00776  int pos=get_first_selection_pos();
00777 
00778  // Выясняется ссылка на таблицу конечных данных
00779  recordtabledata *table=recordmodel->get_tabledata();
00780 
00781  // Перемещение текущей записи вверх
00782  table->moveup(pos);
00783 
00784  // Установка засветки на перемещенную запись
00785  set_selection_to_pos(pos-1);
00786 
00787  // Сохранение дерева веток
00788  find_object<treescreen>("treeview")->save_knowtree();
00789 
00790 }
00791 
00792 
00793 // Перемещение записи вниз
00794 void recordtablescreen::movedn(void)
00795 {
00796  qDebug() << "In movedn()";
00797 
00798  // Получение номера первой выделенной строки
00799  int pos=get_first_selection_pos();
00800 
00801  // Выясняется ссылка на таблицу конечных данных
00802  recordtabledata *table=recordmodel->get_tabledata();
00803 
00804  // Перемещение текущей записи вниз
00805  table->movedn(pos);
00806 
00807  // Установка засветки на перемещенную запись
00808  set_selection_to_pos(pos+1);
00809 
00810  // Сохранение дерева веток
00811  find_object<treescreen>("treeview")->save_knowtree();
00812 
00813 }
00814 
00815 
00816 // Получение номера первого выделенного элемента
00817 int recordtablescreen::get_first_selection_pos(void)
00818 {
00819  // Получение списка выделенных Item-элементов
00820  QModelIndexList selectitems=recordview->selectionModel()->selectedIndexes();
00821 
00822  if(selectitems.isEmpty())
00823   return -1; // Если ничего не выделено
00824  else
00825   return (selectitems.at(0)).row(); // Индекс первого выделенного элемента
00826 }
00827 
00828 
00829 bool recordtablescreen::is_selected_set_to_top(void)
00830 {
00831  if(get_first_selection_pos()==0)return true;
00832  else return false;
00833 }
00834 
00835 
00836 bool recordtablescreen::is_selected_set_to_bottom(void)
00837 {
00838  if(get_first_selection_pos()==recordview->model()->rowCount()-1)return true;
00839  else return false;
00840 }
00841 
00842 
00843 // Установка засветки в нужную строку
00844 void recordtablescreen::set_selection_to_pos(int pos)
00845 {
00846  // Создание индекса из номера
00847  QModelIndex selidx=recordmodel->index(pos);
00848 
00849  // Установка засветки на нужный индекс
00850  recordview->selectionModel()->setCurrentIndex(selidx,QItemSelectionModel::ClearAndSelect);
00851 }
00852 
00853 
00854 // Действия при нажатии на кнопку поиска по базе
00855 void recordtablescreen::findinbase_open(void)
00856 {
00857  // Определяется ссылка на виджет поиска
00858  findscreen *findscreen_rel=find_object<findscreen>("findscreendisp");
00859  
00860  // Если виджет не показан, он выводится на экран, и наоборот
00861  if(findscreen_rel->isVisible()==false)
00862   findscreen_rel->widget_show();
00863  else
00864   findscreen_rel->widget_hide();
00865 }
00866 

Generated on Mon Feb 2 00:25:34 2009 for mytetra by  doxygen 1.5.1