1 /**
2  * UGENE - Integrated Bioinformatics Tools.
3  * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru>
4  * http://ugene.net
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21 
22 #include <drivers/GTKeyboardDriver.h>
23 #include <drivers/GTMouseDriver.h>
24 #include <primitives/GTTreeWidget.h>
25 #include <primitives/GTWidget.h>
26 #include <primitives/PopupChooser.h>
27 #include <utils/GTKeyboardUtils.h>
28 #include <utils/GTThread.h>
29 #include <utils/GTUtilsDialog.h>
30 
31 #include <QMainWindow>
32 #include <QTreeWidget>
33 
34 #include <U2Core/Annotation.h>
35 #include <U2Core/AnnotationGroup.h>
36 #include <U2Core/ProjectModel.h>
37 #include <U2Core/U2SafePoints.h>
38 
39 #include <U2Gui/MainWindow.h>
40 
41 #include <U2View/AnnotationsTreeView.h>
42 
43 #include "GTUtilsAnnotationsTreeView.h"
44 #include "GTUtilsMdi.h"
45 #include "GTUtilsProjectTreeView.h"
46 #include "GTUtilsSequenceView.h"
47 #include "GTUtilsTaskTreeView.h"
48 #include "runnables/ugene/corelibs/U2Gui/CreateAnnotationWidgetFiller.h"
49 #include "runnables/ugene/corelibs/U2Gui/CreateObjectRelationDialogFiller.h"
50 #include "runnables/ugene/corelibs/U2Gui/EditQualifierDialogFiller.h"
51 
52 namespace U2 {
53 using namespace HI;
54 
55 #define GT_CLASS_NAME "GTUtilsAnnotationsTreeView"
56 
57 const QString GTUtilsAnnotationsTreeView::widgetName = "annotations_tree_widget";
58 
59 #define GT_METHOD_NAME "getTreeWidget"
getTreeWidget(HI::GUITestOpStatus & os)60 QTreeWidget *GTUtilsAnnotationsTreeView::getTreeWidget(HI::GUITestOpStatus &os) {
61     QWidget *sequenceView = GTUtilsSequenceView::getActiveSequenceViewWindow(os);
62     QWidget *widget = GTWidget::findWidget(os, widgetName, sequenceView);
63     QTreeWidget *treeWidget = qobject_cast<QTreeWidget *>(widget);
64     GT_CHECK_RESULT(treeWidget != nullptr, QString("QTreeWidget '%1' not found").arg(widgetName), nullptr);
65     return treeWidget;
66 }
67 #undef GT_METHOD_NAME
68 
69 #define GT_METHOD_NAME "addAnnotationsTableFromProject"
addAnnotationsTableFromProject(HI::GUITestOpStatus & os,const QString & tableName)70 void GTUtilsAnnotationsTreeView::addAnnotationsTableFromProject(HI::GUITestOpStatus &os, const QString &tableName) {
71     GTUtilsDialog::waitForDialog(os, new CreateObjectRelationDialogFiller(os));
72     GTUtilsProjectTreeView::dragAndDrop(os, GTUtilsProjectTreeView::findIndex(os, tableName), GTUtilsAnnotationsTreeView::getTreeWidget(os));
73     GTThread::waitForMainThread();
74 }
75 #undef GT_METHOD_NAME
76 
77 #define GT_METHOD_NAME "getAVItemName"
getAVItemName(HI::GUITestOpStatus & os,AVItem * avItem)78 QString GTUtilsAnnotationsTreeView::getAVItemName(HI::GUITestOpStatus &os, AVItem *avItem) {
79     GT_CHECK_RESULT(avItem != nullptr, "avItem is NULL", "");
80 
81     switch (avItem->type) {
82         case AVItemType_Annotation: {
83             AVAnnotationItem *avAnnotationItem = (AVAnnotationItem *)avItem;
84             GT_CHECK_RESULT(avAnnotationItem != nullptr, "avAnnotationItem is NULL", "");
85 
86             Annotation *annotation = avAnnotationItem->annotation;
87             return annotation->getName();
88         } break;
89 
90         case AVItemType_Group: {
91             AVGroupItem *avGroupItem = (AVGroupItem *)avItem;
92             GT_CHECK_RESULT(avGroupItem != nullptr, "avAnnotationItem is NULL", "");
93 
94             AnnotationGroup *group = avGroupItem->group;
95             return group->getName();
96         } break;
97 
98         case AVItemType_Qualifier: {
99             AVQualifierItem *avQualifierItem = (AVQualifierItem *)avItem;
100             GT_CHECK_RESULT(avQualifierItem != nullptr, "avQualifierItem is NULL", "");
101             return avQualifierItem->qName;
102         } break;
103 
104         default:
105             break;
106     }
107 
108     return "";
109 }
110 #undef GT_METHOD_NAME
111 
112 #define GT_METHOD_NAME "getQualifierValue"
getQualifierValue(HI::GUITestOpStatus & os,const QString & qualifierName,QTreeWidgetItem * parentItem)113 QString GTUtilsAnnotationsTreeView::getQualifierValue(HI::GUITestOpStatus &os, const QString &qualifierName, QTreeWidgetItem *parentItem) {
114     GT_CHECK_RESULT(parentItem != nullptr, "Parent item is null", "");
115     QTreeWidgetItem *qualifierItem = findItem(os, qualifierName, parentItem);
116     return qualifierItem->text(AnnotationsTreeView::COLUMN_VALUE);
117 }
118 #undef GT_METHOD_NAME
119 
120 #define GT_METHOD_NAME "getQualifierValue"
getQualifierValue(HI::GUITestOpStatus & os,const QString & qualName,const QString & parentName)121 QString GTUtilsAnnotationsTreeView::getQualifierValue(HI::GUITestOpStatus &os, const QString &qualName, const QString &parentName) {
122     QTreeWidgetItem *parent = findItem(os, parentName);
123     QTreeWidgetItem *qualItem = findItem(os, qualName, parent);
124     return qualItem->text(AnnotationsTreeView::COLUMN_VALUE);
125 }
126 #undef GT_METHOD_NAME
127 
128 #define GT_METHOD_NAME "getAnnotatedRegions"
getAnnotatedRegions(HI::GUITestOpStatus & os)129 QList<U2Region> GTUtilsAnnotationsTreeView::getAnnotatedRegions(HI::GUITestOpStatus &os) {
130     QList<U2Region> res;
131 
132     QTreeWidget *treeWidget = getTreeWidget(os);
133     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", res);
134 
135     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
136     foreach (QTreeWidgetItem *item, treeItems) {
137         AVAnnotationItem *annotationItem = dynamic_cast<AVAnnotationItem *>(item);
138         CHECK_OPERATION(annotationItem != nullptr, continue);
139 
140         Annotation *ann = annotationItem->annotation;
141         res.append(ann->getRegions().toList());
142     }
143     return res;
144 }
145 #undef GT_METHOD_NAME
146 
147 #define GT_METHOD_NAME "getSelectedAnnotatedRegions"
getSelectedAnnotatedRegions(HI::GUITestOpStatus & os)148 QList<U2Region> GTUtilsAnnotationsTreeView::getSelectedAnnotatedRegions(HI::GUITestOpStatus &os) {
149     QList<U2Region> res;
150 
151     QTreeWidget *treeWidget = getTreeWidget(os);
152     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", res);
153 
154     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
155     foreach (QTreeWidgetItem *item, treeItems) {
156         AVAnnotationItem *annotationItem = dynamic_cast<AVAnnotationItem *>(item);
157         CHECK_OPERATION(annotationItem != nullptr, continue);
158         CHECK_CONTINUE(annotationItem->isSelected());
159 
160         Annotation *ann = annotationItem->annotation;
161         res.append(ann->getRegions().toList());
162     }
163     return res;
164 }
165 #undef GT_METHOD_NAME
166 
167 #define GT_METHOD_NAME "getAnnotationRegionString"
getAnnotationRegionString(HI::GUITestOpStatus & os,const QString & annotationName)168 QString GTUtilsAnnotationsTreeView::getAnnotationRegionString(HI::GUITestOpStatus &os, const QString &annotationName) {
169     QTreeWidgetItem *annotationItem = findItem(os, annotationName);
170     GT_CHECK_RESULT(nullptr != annotationItem, "Annotation item is NULL", "");
171     return annotationItem->text(AnnotationsTreeView::COLUMN_VALUE);
172 }
173 #undef GT_METHOD_NAME
174 
175 #define GT_METHOD_NAME "getAnnotationType"
getAnnotationType(HI::GUITestOpStatus & os,const QString & annotationName)176 QString GTUtilsAnnotationsTreeView::getAnnotationType(HI::GUITestOpStatus &os, const QString &annotationName) {
177     QTreeWidgetItem *annotationItem = findItem(os, annotationName);
178     GT_CHECK_RESULT(nullptr != annotationItem, "Annotation item is NULL", "");
179     return annotationItem->text(AnnotationsTreeView::COLUMN_TYPE);
180 }
181 #undef GT_METHOD_NAME
182 
183 #define GT_METHOD_NAME "findFirstAnnotation"
findFirstAnnotation(HI::GUITestOpStatus & os,const GTGlobals::FindOptions & options)184 QTreeWidgetItem *GTUtilsAnnotationsTreeView::findFirstAnnotation(HI::GUITestOpStatus &os, const GTGlobals::FindOptions &options) {
185     QTreeWidget *treeWidget = getTreeWidget(os);
186     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", nullptr);
187 
188     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
189     foreach (QTreeWidgetItem *item, treeItems) {
190         AVItem *avItem = dynamic_cast<AVItem *>(item);
191         GT_CHECK_RESULT(nullptr != avItem, "Cannot convert QTreeWidgetItem to AVItem", nullptr);
192         if (avItem->type == AVItemType_Annotation) {
193             return item;
194         }
195     }
196     GT_CHECK_RESULT(options.failIfNotFound == false, "No items in tree widget", nullptr);
197     return nullptr;
198 }
199 #undef GT_METHOD_NAME
200 
201 #define GT_METHOD_NAME "findItem"
findItem(HI::GUITestOpStatus & os,const QString & itemName,const GTGlobals::FindOptions & options)202 QTreeWidgetItem *GTUtilsAnnotationsTreeView::findItem(HI::GUITestOpStatus &os, const QString &itemName, const GTGlobals::FindOptions &options) {
203     GT_CHECK_RESULT(!itemName.isEmpty(), "Item name is empty", nullptr);
204 
205     QTreeWidget *treeWidget = getTreeWidget(os);
206     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
207     foreach (QTreeWidgetItem *item, treeItems) {
208         QString treeItemName = item->text(0);
209         if (treeItemName == itemName) {
210             return item;
211         }
212     }
213     GT_CHECK_RESULT(!options.failIfNotFound, QString("Item '%1' not found in tree widget").arg(itemName), nullptr);
214     return nullptr;
215 }
216 #undef GT_METHOD_NAME
217 
218 #define GT_METHOD_NAME "findItem"
findItemWithIndex(HI::GUITestOpStatus & os,const QString & itemName,const int index)219 QTreeWidgetItem *GTUtilsAnnotationsTreeView::findItemWithIndex(HI::GUITestOpStatus &os, const QString &itemName, const int index) {
220     GT_CHECK_RESULT(itemName.isEmpty() == false, "Item name is empty", nullptr);
221 
222     QTreeWidget *treeWidget = getTreeWidget(os);
223     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", nullptr);
224 
225     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
226     int i = 0;
227     foreach (QTreeWidgetItem *item, treeItems) {
228         QString treeItemName = item->text(0);
229         if (treeItemName == itemName) {
230             i++;
231             if (i == index) {
232                 return item;
233             }
234         }
235     }
236 
237     return nullptr;
238 }
239 #undef GT_METHOD_NAME
240 
241 #define GT_METHOD_NAME "findItem"
findItem(HI::GUITestOpStatus & os,const QString & itemName,QTreeWidgetItem * parentItem,const GTGlobals::FindOptions & options)242 QTreeWidgetItem *GTUtilsAnnotationsTreeView::findItem(HI::GUITestOpStatus &os, const QString &itemName, QTreeWidgetItem *parentItem, const GTGlobals::FindOptions &options) {
243     GT_CHECK_RESULT(!itemName.isEmpty(), "Item name is empty", nullptr);
244     if (parentItem == nullptr) {
245         return findItem(os, itemName, options);
246     }
247     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(parentItem);
248     foreach (QTreeWidgetItem *item, treeItems) {
249         QString treeItemName = item->text(0);
250         if (treeItemName == itemName) {
251             return item;
252         }
253     }
254     GT_CHECK_RESULT(!options.failIfNotFound, "Item " + itemName + " not found in tree widget", nullptr);
255     return nullptr;
256 }
257 
258 #undef GT_METHOD_NAME
259 
260 #define GT_METHOD_NAME "findItems"
findItems(HI::GUITestOpStatus & os,const QString & itemName,const GTGlobals::FindOptions & options)261 QList<QTreeWidgetItem *> GTUtilsAnnotationsTreeView::findItems(HI::GUITestOpStatus &os, const QString &itemName, const GTGlobals::FindOptions &options) {
262     QList<QTreeWidgetItem *> result;
263     GT_CHECK_RESULT(itemName.isEmpty() == false, "Item name is empty", result);
264 
265     QTreeWidget *treeWidget = getTreeWidget(os);
266     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", result);
267 
268     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
269     foreach (QTreeWidgetItem *item, treeItems) {
270         QString treeItemName = item->text(0);
271         if (treeItemName == itemName) {
272             result.append(item);
273         }
274     }
275     GT_CHECK_RESULT(!options.failIfNotFound || !result.isEmpty(), "Item " + itemName + " not found in tree widget", result);
276 
277     return result;
278 }
279 #undef GT_METHOD_NAME
280 
281 #define GT_METHOD_NAME "getGroupNames"
getGroupNames(HI::GUITestOpStatus & os,const QString & annotationTableName)282 QStringList GTUtilsAnnotationsTreeView::getGroupNames(HI::GUITestOpStatus &os, const QString &annotationTableName) {
283     QList<QTreeWidgetItem *> annotationTableItems;
284     if (!annotationTableName.isEmpty()) {
285         annotationTableItems << findItem(os, annotationTableName);
286     } else {
287         QTreeWidget *treeWidget = getTreeWidget(os);
288         QTreeWidgetItem *rootItem = treeWidget->invisibleRootItem();
289         for (int i = 0; i < rootItem->childCount(); i++) {
290             annotationTableItems << rootItem->child(i);
291         }
292     }
293 
294     QStringList groupNames;
295     foreach (QTreeWidgetItem *annotationTableItem, annotationTableItems) {
296         for (int i = 0; i < annotationTableItem->childCount(); i++) {
297             groupNames << annotationTableItem->child(i)->text(AnnotationsTreeView::COLUMN_NAME);
298         }
299     }
300 
301     return groupNames;
302 }
303 #undef GT_METHOD_NAME
304 
305 #define GT_METHOD_NAME "getAnnotationNamesOfGroup"
getAnnotationNamesOfGroup(HI::GUITestOpStatus & os,const QString & groupName)306 QStringList GTUtilsAnnotationsTreeView::getAnnotationNamesOfGroup(HI::GUITestOpStatus &os, const QString &groupName) {
307     Q_UNUSED(os);
308     QStringList names;
309     QTreeWidgetItem *groupItem = findItem(os, groupName);
310     for (int i = 0; i < groupItem->childCount(); i++) {
311         AVItem *avItem = dynamic_cast<AVItem *>(groupItem->child(i));
312         GT_CHECK_RESULT(nullptr != avItem, "Cannot convert QTreeWidgetItem to AVItem", QStringList());
313         names << getAVItemName(os, avItem);
314     }
315     return names;
316 }
317 #undef GT_METHOD_NAME
318 
319 #define GT_METHOD_NAME "getAnnotatedRegionsOfGroup"
getAnnotatedRegionsOfGroup(HI::GUITestOpStatus & os,const QString & groupName)320 QList<U2Region> GTUtilsAnnotationsTreeView::getAnnotatedRegionsOfGroup(HI::GUITestOpStatus &os, const QString &groupName) {
321     Q_UNUSED(os);
322     QList<U2Region> regions;
323     QTreeWidgetItem *groupItem = findItem(os, groupName);
324     GT_CHECK_RESULT(groupItem != nullptr, QString("Cannot find group item '%1'").arg(groupName), regions);
325     for (int i = 0; i < groupItem->childCount(); i++) {
326         AVItem *avItem = dynamic_cast<AVItem *>(groupItem->child(i));
327         GT_CHECK_RESULT(nullptr != avItem, "Cannot convert QTreeWidgetItem to AVItem", QList<U2Region>());
328         AVAnnotationItem *item = (AVAnnotationItem *)avItem;
329         GT_CHECK_RESULT(item != nullptr, "sdf", regions);
330         regions << item->annotation->getRegions().toList();
331     }
332     return regions;
333 }
334 #undef GT_METHOD_NAME
335 
336 #define GT_METHOD_NAME "getAnnotatedRegionsOfGroup"
getAnnotatedRegionsOfGroup(HI::GUITestOpStatus & os,const QString & groupName,const QString & parentName)337 QList<U2Region> GTUtilsAnnotationsTreeView::getAnnotatedRegionsOfGroup(HI::GUITestOpStatus &os, const QString &groupName, const QString &parentName) {
338     Q_UNUSED(os);
339     QList<U2Region> regions;
340     QTreeWidgetItem *parentItem = findItem(os, parentName);
341     GT_CHECK_RESULT(parentItem != nullptr, "Parent item not found!", regions);
342 
343     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(parentItem);
344     foreach (QTreeWidgetItem *childItem, treeItems) {
345         QString treeItemName = childItem->text(0);
346         if (treeItemName == groupName) {
347             for (int i = 0; i < childItem->childCount(); i++) {
348                 AVItem *avItem = dynamic_cast<AVItem *>(childItem->child(i));
349                 GT_CHECK_RESULT(nullptr != avItem, "Cannot convert QTreeWidgetItem to AVItem", QList<U2Region>());
350                 AVAnnotationItem *item = (AVAnnotationItem *)avItem;
351                 GT_CHECK_RESULT(item != nullptr, "sdf", regions);
352                 regions << item->annotation->getRegions().toList();
353             }
354         }
355     }
356     return regions;
357 }
358 #undef GT_METHOD_NAME
359 
360 #define GT_METHOD_NAME "findRegion"
findRegion(HI::GUITestOpStatus & os,const QString & itemName,const U2Region & r)361 bool GTUtilsAnnotationsTreeView::findRegion(HI::GUITestOpStatus &os, const QString &itemName, const U2Region &r) {
362     AVAnnotationItem *item = (AVAnnotationItem *)GTUtilsAnnotationsTreeView::findItem(os, itemName);
363     CHECK_SET_ERR_RESULT(item != nullptr, "Item " + itemName + " not found", false);
364     Annotation *ann = item->annotation;
365 
366     U2Region neededRegion(r.startPos - 1, r.length - r.startPos + 1);
367 
368     bool found = false;
369     QVector<U2Region> regions = ann->getRegions();
370     for (const U2Region &annotationRegion : qAsConst(regions)) {
371         if (annotationRegion.contains(neededRegion)) {
372             found = true;
373             break;
374         }
375     }
376 
377     return found;
378 }
379 #undef GT_METHOD_NAME
380 
381 #define GT_METHOD_NAME "getSelectedItem"
getSelectedItem(HI::GUITestOpStatus & os)382 QString GTUtilsAnnotationsTreeView::getSelectedItem(HI::GUITestOpStatus &os) {
383     QTreeWidget *treeWidget = getTreeWidget(os);
384     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", nullptr);
385 
386     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
387     foreach (QTreeWidgetItem *item, treeItems) {
388         if (item->isSelected()) {
389             return getAVItemName(os, dynamic_cast<AVItem *>(item));
390         }
391     }
392 
393     return QString();
394 }
395 #undef GT_METHOD_NAME
396 
397 #define GT_METHOD_NAME "getAllSelectedItem"
getAllSelectedItems(HI::GUITestOpStatus & os)398 QList<QTreeWidgetItem *> GTUtilsAnnotationsTreeView::getAllSelectedItems(HI::GUITestOpStatus &os) {
399     QList<QTreeWidgetItem *> res;
400 
401     QTreeWidget *treeWidget = getTreeWidget(os);
402     GT_CHECK_RESULT(treeWidget != nullptr, "Tree widget is NULL", res);
403 
404     QList<QTreeWidgetItem *> treeItems = GTTreeWidget::getItems(treeWidget->invisibleRootItem());
405     foreach (QTreeWidgetItem *item, treeItems) {
406         if (item->isSelected()) {
407             QString s = item->text(0);
408             res << item;
409         }
410     }
411 
412     return res;
413 }
414 #undef GT_METHOD_NAME
415 
416 #define GT_METHOD_NAME "getItemCenter"
getItemCenter(HI::GUITestOpStatus & os,const QString & itemName)417 QPoint GTUtilsAnnotationsTreeView::getItemCenter(HI::GUITestOpStatus &os, const QString &itemName) {
418     QTreeWidgetItem *item = findItem(os, itemName);
419     GT_CHECK_RESULT(item != nullptr, "Item " + itemName + " is NULL", QPoint());
420 
421     return GTTreeWidget::getItemCenter(os, item);
422 }
423 #undef GT_METHOD_NAME
424 
425 #define GT_METHOD_NAME "createQualifier"
createQualifier(HI::GUITestOpStatus & os,const QString & qualName,const QString & qualValue,const QString & parentName)426 void GTUtilsAnnotationsTreeView::createQualifier(HI::GUITestOpStatus &os, const QString &qualName, const QString &qualValue, const QString &parentName) {
427     GTUtilsDialog::waitForDialog(os, new PopupChooser(os, QStringList() << "ADV_MENU_ADD"
428                                                                         << "add_qualifier_action"));
429     GTUtilsDialog::waitForDialog(os, new EditQualifierFiller(os, qualName, qualValue));
430     GTMouseDriver::moveTo(getItemCenter(os, parentName));
431     GTMouseDriver::click(Qt::RightButton);
432 }
433 #undef GT_METHOD_NAME
434 
435 #define GT_METHOD_NAME "selectItems"
selectItems(HI::GUITestOpStatus & os,const QStringList & items)436 void GTUtilsAnnotationsTreeView::selectItems(HI::GUITestOpStatus &os, const QStringList &items) {
437     GT_CHECK_RESULT(items.size() != 0, "List of items to select is empty", );
438     // remove previous selection
439     QPoint firstItemCenterPoint = getItemCenter(os, items.first());
440     GTMouseDriver::moveTo(firstItemCenterPoint);
441     GTMouseDriver::click();
442     GTKeyboardDriver::keyPress(Qt::Key_Control);
443 
444     for (const QString &item : qAsConst(items)) {
445         QPoint centerPoint = getItemCenter(os, item);
446         GTMouseDriver::moveTo(centerPoint);
447 
448         QTreeWidgetItem *treeItem = findItem(os, item);
449         GT_CHECK_RESULT(treeItem != nullptr, "Tree item is NULL", );
450         if (!treeItem->isSelected()) {
451             GTMouseDriver::click();
452         }
453     }
454     GTKeyboardDriver::keyRelease(Qt::Key_Control);
455     GTGlobals::sleep();
456 }
457 #undef GT_METHOD_NAME
458 
459 #define GT_METHOD_NAME "selectItems"
selectItems(HI::GUITestOpStatus & os,const QList<QTreeWidgetItem * > & items)460 void GTUtilsAnnotationsTreeView::selectItems(HI::GUITestOpStatus &os, const QList<QTreeWidgetItem *> &items) {
461     GT_CHECK_RESULT(items.size() != 0, "List of items to select is empty", );
462 
463     // Remove previous selection.
464     QPoint firstItemCenterPoint = GTTreeWidget::getItemCenter(os, items.first());
465     GTMouseDriver::moveTo(firstItemCenterPoint);
466     GTMouseDriver::click();
467     GTKeyboardDriver::keyPress(Qt::Key_Control);
468 
469     for (QTreeWidgetItem *item : qAsConst(items)) {
470         QPoint itemCenterPoint = GTTreeWidget::getItemCenter(os, item);
471         GTMouseDriver::moveTo(itemCenterPoint);
472 
473         GT_CHECK_RESULT(item != nullptr, "Tree item is NULL", );
474         if (!item->isSelected()) {
475             GTMouseDriver::click();
476         }
477     }
478     GTKeyboardDriver::keyRelease(Qt::Key_Control);
479     GTThread::waitForMainThread();
480 }
481 #undef GT_METHOD_NAME
482 
483 #define GT_METHOD_NAME "clickItem"
clickItem(HI::GUITestOpStatus & os,const QString & item,const int numOfItem,bool isDoubleClick)484 void GTUtilsAnnotationsTreeView::clickItem(HI::GUITestOpStatus &os, const QString &item, const int numOfItem, bool isDoubleClick) {
485     GT_CHECK_RESULT(!item.isEmpty(), "Empty item name", );
486 
487     QTreeWidgetItem *wgtItem = findItemWithIndex(os, item, numOfItem);
488     GT_CHECK_RESULT(wgtItem != nullptr, "Item " + item + " is NULL", );
489 
490     QPoint p = GTTreeWidget::getItemCenter(os, wgtItem);
491     GTMouseDriver::moveTo(p);
492     if (isDoubleClick) {
493         GTMouseDriver::doubleClick();
494     } else {
495         GTMouseDriver::click();
496     }
497     GTGlobals::sleep();
498 }
499 #undef GT_METHOD_NAME
500 
501 #define GT_METHOD_NAME "createAnnotation"
createAnnotation(HI::GUITestOpStatus & os,const QString & groupName,const QString & annotationName,const QString & location,bool createNewTable,const QString & saveTo)502 void GTUtilsAnnotationsTreeView::createAnnotation(HI::GUITestOpStatus &os, const QString &groupName, const QString &annotationName, const QString &location, bool createNewTable, const QString &saveTo) {
503     QTreeWidget *annotationsTreeView = getTreeWidget(os);
504     GT_CHECK(nullptr != annotationsTreeView, "No annotation tree view");
505     GTWidget::click(os, annotationsTreeView);
506 
507     GTUtilsDialog::waitForDialog(os, new CreateAnnotationWidgetFiller(os, createNewTable, groupName, annotationName, location, saveTo));
508     GTKeyboardDriver::keyClick('n', Qt::ControlModifier);
509 }
510 #undef GT_METHOD_NAME
511 
512 #define GT_METHOD_NAME "deleteItem"
deleteItem(HI::GUITestOpStatus & os,const QString & itemName)513 void GTUtilsAnnotationsTreeView::deleteItem(HI::GUITestOpStatus &os, const QString &itemName) {
514     deleteItem(os, findItem(os, itemName));
515 }
516 #undef GT_METHOD_NAME
517 
518 #define GT_METHOD_NAME "deleteItem"
deleteItem(HI::GUITestOpStatus & os,QTreeWidgetItem * item)519 void GTUtilsAnnotationsTreeView::deleteItem(HI::GUITestOpStatus &os, QTreeWidgetItem *item) {
520     GT_CHECK(item != nullptr, "Item is NULL");
521     selectItems(os, QList<QTreeWidgetItem *>() << item);
522     GTKeyboardDriver::keyClick(Qt::Key_Delete);
523     GTGlobals::sleep(100);
524     GTUtilsTaskTreeView::waitTaskFinished(os);
525 }
526 #undef GT_METHOD_NAME
527 
528 #define GT_METHOD_NAME "callContextMenuOnItem"
callContextMenuOnItem(HI::GUITestOpStatus & os,QTreeWidgetItem * item)529 void GTUtilsAnnotationsTreeView::callContextMenuOnItem(HI::GUITestOpStatus &os, QTreeWidgetItem *item) {
530     GTMouseDriver::moveTo(GTTreeWidget::getItemCenter(os, item));
531     GTMouseDriver::click(Qt::RightButton);
532 }
533 #undef GT_METHOD_NAME
534 
535 #define GT_METHOD_NAME "callContextMenuOnItem"
callContextMenuOnItem(HI::GUITestOpStatus & os,const QString & itemName)536 void GTUtilsAnnotationsTreeView::callContextMenuOnItem(HI::GUITestOpStatus &os, const QString &itemName) {
537     GTMouseDriver::moveTo(getItemCenter(os, itemName));
538     GTMouseDriver::click(Qt::RightButton);
539 }
540 #undef GT_METHOD_NAME
541 
542 #define GT_METHOD_NAME "callContextMenuOnQualifier"
callContextMenuOnQualifier(HI::GUITestOpStatus & os,const QString & parentName,const QString & qualifierName)543 void GTUtilsAnnotationsTreeView::callContextMenuOnQualifier(HI::GUITestOpStatus &os, const QString &parentName, const QString &qualifierName) {
544     getItemCenter(os, parentName);
545     callContextMenuOnItem(os, qualifierName);
546 }
547 #undef GT_METHOD_NAME
548 
549 #define GT_METHOD_NAME "checkNoAnnotations"
checkNoAnnotations(HI::GUITestOpStatus & os)550 void GTUtilsAnnotationsTreeView::checkNoAnnotations(HI::GUITestOpStatus &os) {
551     QTreeWidgetItem *annotationItem = findFirstAnnotation(os, {false});
552     CHECK_SET_ERR(annotationItem == nullptr, "There should be no annotations");
553 }
554 #undef GT_METHOD_NAME
555 
556 #undef GT_CLASS_NAME
557 
558 }  // namespace U2
559