treeitem.cpp

Go to the documentation of this file.
00001 /*
00002     treeitem.cpp
00003     A container for items of data supplied by the simple tree model.
00004 */
00005 
00006 #include <QStringList>
00007 
00008 #include "treeitem.h"
00009 #include "main.h"
00010 #include "recordtabledata.h"
00011 
00012 
00013 TreeItem::TreeItem(const QMap<QString, QString> &data, TreeItem *parent)
00014 {
00015     parentItem = parent;
00016     fieldtable = data;
00017 }
00018 
00019 
00020 TreeItem::~TreeItem()
00021 {
00022  // В родительском объекте ссылка на данный объект удаляется
00023  // Подумать, нужно ли это действие
00024  // Вроде не нужно, но может понадобится в дальнейшем
00025  // if(parentItem)parentItem->removeChildrenLink(childNumber(),1);
00026   
00027  // Удалятся все конечные записи, принадлежащие данному объекту
00028  recordtable_clear();
00029   
00030  qDeleteAll(childItems); 
00031 }
00032 
00033 
00034 TreeItem *TreeItem::child(int number)
00035 {
00036     return childItems.value(number);
00037 }
00038 
00039 
00040 // Возвращение количества потомков (т.е. количество записей в списке childItems)
00041 int TreeItem::childCount() const
00042 {
00043     return childItems.count();
00044 }
00045 
00046 
00047 // Возвращает номер, под которым данный объект хранится
00048 // в массиве childItems своего родителя
00049 int TreeItem::childNumber() const
00050 {
00051     if (parentItem)
00052         return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
00053 
00054     return 0;
00055 }
00056 
00057 
00058 int TreeItem::fieldCount() const
00059 {
00060     return fieldtable.count();
00061 }
00062 
00063 
00064 // Получение данных
00065 QVariant TreeItem::data(QString name)
00066 {
00067  // Если запрашивается динамическое имя из имени и количества потомков
00068  if(name=="dynamicname")
00069   {
00070    // Выясняется, есть ли у текущего элемента конечные записи
00071    int rcnt=this->recordtable_getrowcount();
00072 
00073    // Если конечных элементов нет, возвращатся просто имя
00074    if(rcnt==0) return fieldtable["name"];
00075    else
00076     {
00077      // Иначе конечные элементы есть, возвращается имя записи
00078      // и количество конечных элементно
00079      QString r,i;
00080      r=fieldtable["name"]+" ["+i.setNum(rcnt)+"]";
00081      return r;
00082     }
00083    }
00084  else
00085   {
00086    // Запрашивается просто данные с указанным имененм
00087    if(fieldtable.contains(name)) return fieldtable[name];
00088    else
00089     {
00090      critical_error("In TreeItem data getting with unavailable name "+name);
00091      exit(1);
00092      return QVariant();
00093     }
00094   }
00095 }
00096 
00097 
00098 // Установка данных
00099 // Первый параметр - имя поля
00100 // Второй параметр - устанавливаемое значение
00101 void TreeItem::setData(QString n,QString v)
00102 {
00103  if(n=="id" ||
00104     n=="name" ||
00105     n=="ctime")
00106   {
00107    // qDebug() << "Set to item data " << n << v;
00108    fieldtable[n]=v;
00109   } 
00110  else
00111   {
00112    qDebug() << "Set undestand field " << n << " to item of branch tree";
00113    exit(1);
00114   }
00115 }
00116 
00117 
00118 TreeItem *TreeItem::parent()
00119 {
00120     return parentItem;
00121 }
00122 
00123 
00124 // Добавление новых подчиненных элементов
00125 // position - позиция в списке подчиненных элементов для вставки элементов
00126 // count - сколько новых элементов будет вставлено
00127 // columns - сколько колонок содержит добавляемый элемент
00128 bool TreeItem::insertChildren(int position, int count, int columns)
00129 {
00130     if (position < 0 || position > childItems.size())
00131         return false;
00132 
00133     for (int row = 0; row < count; ++row) {
00134         QMap<QString, QString> data;
00135         TreeItem *item = new TreeItem(data, this); // Создается объект item
00136         childItems.insert(position, item); // Вставка item в нужную позицию массива childItems
00137     }
00138 
00139     return true;
00140 }
00141 
00142 
00143 // Добавление нового подчиненного элемента 
00144 // в конец списка подчиненных элементов
00145 bool TreeItem::addChildren(void)
00146 {
00147  QMap<QString, QString> data;
00148 
00149  TreeItem *item = new TreeItem(data, this); // Создается объект item
00150 
00151  childItems << item; // Добавление item в конец массива childItems
00152 
00153  return true;
00154 }
00155 
00156 
00157 bool TreeItem::removeChildren(int position, int count)
00158 {
00159     if (position < 0 || position + count > childItems.size())
00160         return false;
00161 
00162     for (int row = 0; row < count; ++row)
00163      delete childItems.takeAt(position);
00164 
00165     return true;
00166 }
00167 
00168 
00169 bool TreeItem::removeChildrenLink(int position, int count)
00170 {
00171     if (position < 0 || position + count > childItems.size())
00172         return false;
00173 
00174     // Ссылка на удаленный элемент убирается из списка подчиненных элементов
00175     for (int row = 0; row < count; ++row)
00176      childItems.removeAt(position); 
00177 
00178     return true;
00179 }
00180 
00181 
00182 bool TreeItem::move_up(void)
00183 {
00184  // Выясняется номер данного элемента в списке родителя
00185  int num=childNumber();
00186 
00187  // Если двигать вверх некуда, ничего делать не нужно
00188  if(num==0)return false;
00189 
00190  // Элемент перемещается вверх по списку
00191  ( parentItem->childItems ).swap(num,num-1);
00192  
00193  return true;
00194 }
00195 
00196 
00197 bool TreeItem::move_dn(void)
00198 {
00199  // Выясняется номер данного элемента в списке родителя
00200  int num=childNumber();
00201 
00202  // Если двигать вниз некуда, ничего делать не нужно
00203  if(num>=(parentItem->childCount()-1))return false;
00204 
00205  // Элемент перемещается вниз по списку
00206  ( parentItem->childItems ).swap(num,num+1);
00207  
00208  return true;
00209 }
00210 
00211 
00212 // Путь к элементу (список идентификаторов от корня до текущего элемента)
00213 QStringList TreeItem::get_path(void)
00214 {
00215  return get_path_as_field("id");
00216 }
00217 
00218 
00219 QStringList TreeItem::get_path_as_name(void)
00220 {
00221  return get_path_as_field("name");
00222 }
00223 
00224 
00225 QStringList TreeItem::get_path_as_field(QString field)
00226 {
00227  QStringList path;
00228  TreeItem *curritem=this;
00229  
00230  path << (curritem->data(field)).toString();
00231  
00232  while(curritem->parent()!=NULL)
00233   {
00234    curritem=curritem->parent();
00235    path << (curritem->data(field)).toString();
00236   }
00237  
00238  // Поворот массива идентификаторов задом наперед
00239  int k=path.size()-1;
00240  int j=path.size()/2;
00241  for(int i=0;i<j;++i)path.swap(i,k-i);
00242  
00243  return path;
00244 }
00245 
00246 
00247 // Возвращает массив путей всех подветок, которые содержит ветка
00248 QList<QStringList> TreeItem::get_all_children_path(void)
00249 {
00250  // Очищение списка путей
00251  get_all_children_path_recurse(this,0);
00252  
00253  // Получение списка путей
00254  QList<QStringList> pathlist=get_all_children_path_recurse(this,1);
00255  
00256  return pathlist;
00257 }
00258 
00259 
00260 // Возвращает массив путей всех подветок, которые содержит ветка
00261 // Внутренняя рекурсивная функция
00262 QList<QStringList> TreeItem::get_all_children_path_recurse(TreeItem *item,int mode)
00263 {
00264  static QList<QStringList> pathlist;
00265  
00266  // Если дана команда очистить список путей
00267  if(mode==0)
00268   {
00269    pathlist.clear();
00270    return QList<QStringList>();
00271   }
00272  
00273  for(int i=0;i<(item->childCount());i++)
00274  {
00275   QStringList path=(item->child(i))->get_path();
00276   pathlist << path;
00277   get_all_children_path_recurse(item->child(i),2);
00278  }
00279  
00280  if(mode==1)return pathlist;
00281  else return QList<QStringList>();
00282 }
00283   
00284 
00285 void TreeItem::recordtable_init(QDomElement dommodel)
00286 {
00287  rtable.init(dommodel);
00288 }
00289 
00290 
00291 int TreeItem::recordtable_getrowcount(void)
00292 {
00293  return rtable.size();
00294 }
00295 
00296 
00297 QDomDocument TreeItem::recordtable_export_data_to_dom(void)
00298 {
00299  return rtable.export_data_to_dom();
00300 }
00301 
00302 
00303 void TreeItem::recordtable_clear(void)
00304 {
00305  rtable.clear();
00306 }
00307 
00308 recordtabledata *TreeItem::recordtable_gettabledata(void)
00309 {
00310  return &rtable;
00311 }
00312 

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