Version: 9.15.0
CatalogWidget.cxx
Go to the documentation of this file.
1 // Copyright (C) 2006-2025 CEA, EDF
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 
20 #include "RuntimeSALOME.hxx"
21 #include "CatalogWidget.hxx"
22 
23 #include "Catalog.hxx"
24 #include "TypeCode.hxx"
25 #include "ComponentDefinition.hxx"
26 #include "ItemMimeData.hxx"
27 #include "QtGuiContext.hxx"
28 
29 #include <QApplication>
30 #include <QMimeData>
31 #include <QDrag>
32 #include <QPainter>
33 #include <QBitmap>
34 #include <QString>
35 #include <QFileInfo>
36 #include <QMouseEvent>
37 
38 #include <cassert>
39 
40 //#define _DEVDEBUG_
41 #include "YacsTrace.hxx"
42 
43 using namespace std;
44 using namespace YACS::ENGINE;
45 using namespace YACS::HMI;
46 
47 CatalogWidget::CatalogWidget(QWidget *parent,
48  YACS::ENGINE::Catalog* builtinCatalog,
49  YACS::ENGINE::Catalog* sessionCatalog)
50  : QTreeWidget(parent)
51 {
52  DEBTRACE("CatalogWidget::CatalogWidget");
53  _builtinCatalog = builtinCatalog;
54  _sessionCatalog = sessionCatalog;
55 
56  _idCatalog = 0;
57  _cataMap.clear();
58  _typeToCataMap.clear();
59  _dragModifier=false;
60 
61  setColumnCount(1);
62  setHeaderHidden( true );
63 
64  addCatalog(_builtinCatalog, "Built In");
65  addCatalog(_sessionCatalog, "Current Session");
66 
67  setDragDropMode(QAbstractItemView::DragOnly);
68  setDragEnabled(true);
69  setDropIndicatorShown(true);
70 
71  setSelectionMode(QAbstractItemView::ExtendedSelection);
72 }
73 
74 bool CatalogWidget::addCatalogFromFile(std::string fileName)
75 {
76  DEBTRACE("CatalogWidget::addCatalogFromFile " << fileName);
77  QFileInfo afi(fileName.c_str());
78  if(!afi.exists())
79  return false;
80  Catalog *cataProc = YACS::ENGINE::getSALOMERuntime()->loadCatalog("proc", fileName);
81  string aFile = afi.fileName().toStdString();
82  addCatalog(cataProc, aFile);
83  return true;
84 }
85 
86 std::map<std::string, YACS::ENGINE::Catalog*> CatalogWidget::getCataMap()
87 {
88  return _cataMap;
89 }
90 
92 {
93  YACS::ENGINE::Catalog* catalog = 0;
94  if (_cataMap.count(cataName))
95  catalog = _cataMap[cataName];
96  return catalog;
97 }
98 
100 {
101  DEBTRACE("CatalogWidget::getCatalogFromType " << typeName);
102  YACS::ENGINE::Catalog* catalog = 0;
103  if (_typeToCataMap.count(typeName))
104  catalog = _typeToCataMap[typeName];
105  return catalog;
106 }
107 
109  std::string name)
110 {
111  if (!catalog) return;
112 
113  QTreeWidgetItem *itemCata = 0;
114  QTreeWidgetItem *category = 0;
115 
116  itemCata = new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString(name.c_str())));
117  insertTopLevelItem(_idCatalog, itemCata);
118  _idCatalog++;
119 
120  if (! catalog->_typeMap.empty())
121  {
122  category = new QTreeWidgetItem(itemCata, QStringList(QString("Types")));
123  map<string, TypeCode*>::const_iterator it = catalog->_typeMap.begin();
124  for (; it != catalog->_typeMap.end(); ++it)
125  {
126  DEBTRACE("Type : " <<(*it).first
127  << " " << (*it).second->getKindRepr()
128  << " " << (*it).second->name()
129  << " " << (*it).second->shortName()
130  << " " << (*it).second->id() );
131  string typeName = it->first;
132  QTreeWidgetItem *item = new QTreeWidgetItem(category, QStringList(QString(typeName.c_str())));
133  if (! _typeToCataMap.count(typeName))
134  _typeToCataMap[typeName] = catalog;
135  else if ( ! ((*it).second)->isEquivalent(_typeToCataMap[typeName]->_typeMap[typeName]) )
136  {
137  DEBTRACE(" ========================================================================================================");
138  DEBTRACE(" type " << typeName << " not compatible with one of same name already present in another catalog, FORCE NEW!");
139  DEBTRACE(" ========================================================================================================");
140  _typeToCataMap[typeName] = catalog;
141  item->setForeground(0,Qt::blue);
142  }
143  }
144  }
145 
146  if (! catalog->_componentMap.empty())
147  {
148  category = new QTreeWidgetItem(itemCata, QStringList(QString("Components")));
149  map<string, ComponentDefinition*>::const_iterator it = catalog->_componentMap.begin();
150  for (; it != catalog->_componentMap.end(); ++it)
151  {
152  QTreeWidgetItem *item = new QTreeWidgetItem(category, QStringList(QString((it->first).c_str())));
153  map<string, ServiceNode *>::const_iterator its = (it->second)->_serviceMap.begin();
154  for (; its != (it->second)->_serviceMap.end(); ++its)
155  QTreeWidgetItem *sitem = new QTreeWidgetItem(item, QStringList(QString((its->first).c_str())));
156  }
157  }
158 
159  if (! catalog->_nodeMap.empty())
160  {
161  category = new QTreeWidgetItem(itemCata, QStringList(QString("Elementary Nodes")));
162  map<string, Node*>::const_iterator it = catalog->_nodeMap.begin();
163  for (; it != catalog->_nodeMap.end(); ++it)
164  QTreeWidgetItem *item = new QTreeWidgetItem(category, QStringList(QString((it->first).c_str())));
165  }
166 
167  if (! catalog->_composednodeMap.empty())
168  {
169  category = new QTreeWidgetItem(itemCata, QStringList(QString("Composed Nodes")));
170  map<string, ComposedNode*>::const_iterator it = catalog->_composednodeMap.begin();
171  for (; it != catalog->_composednodeMap.end(); ++it)
172  QTreeWidgetItem *item = new QTreeWidgetItem(category, QStringList(QString((it->first).c_str())));
173  }
174  _cataMap[name] = catalog;
175 }
176 
178 {
179 }
180 
181 void CatalogWidget::startDrag(Qt::DropActions supportedActions)
182 {
183  DEBTRACE("startDrag " << supportedActions);
184  if (! QtGuiContext::getQtCurrent()) return;
185  if (! QtGuiContext::getQtCurrent()->isEdition()) return;
186 
187  QDrag *drag = 0;
188  ItemMimeData *mime = 0;
189  QString theMimeInfo;
190 
191  QList<QTreeWidgetItem*> selectList = selectedItems();
192  for (int i=0; i<selectList.size(); i++)
193  {
194  QTreeWidgetItem *parent = selectList[i]->parent();
195  if (!parent) continue;
196  QTreeWidgetItem *grandPa = parent->parent();
197  if (!grandPa) continue;
198  QTreeWidgetItem *grandGrandPa = grandPa->parent();
199  string cataName ="";
200  if (grandGrandPa)
201  cataName = grandGrandPa->text(0).toStdString();
202  else
203  cataName = grandPa->text(0).toStdString();
204  DEBTRACE("cataName=" << cataName);
205  YASSERT(_cataMap.count(cataName));
206  YACS::ENGINE::Catalog *catalog = _cataMap[cataName];
207 
208  QString mimeInfo;
209  string compo = "";
210  string definition = "";
211  QPixmap pixmap;
212  if (! parent->text(0).compare("Types"))
213  {
214  mimeInfo = "Type";
215  definition = selectList[i]->text(0).toStdString();
216  pixmap.load("icons:data_link.png");
217  }
218  else if (parent->text(0).contains("Nodes"))
219  {
220  mimeInfo = "Node";
221  definition = selectList[i]->text(0).toStdString();
222  pixmap.load("icons:add_node.png");
223  }
224  else if (! grandPa->text(0).compare("Components"))
225  {
226  mimeInfo = "Service";
227  definition = selectList[i]->text(0).toStdString();
228  compo = parent->text(0).toStdString();
229  pixmap.load("icons:new_salome_service_node.png");
230  }
231  else
232  {
233  mimeInfo = "Component";
234  compo = selectList[i]->text(0).toStdString();
235  pixmap.load("icons:component.png");
236  }
237  QString mimeType = "yacs/cata" + mimeInfo;
238 
239  if (!drag) // --- intialize mime data with the first selected item
240  {
241  DEBTRACE("mimeInfo=" << mimeInfo.toStdString() << " definition=" << definition << " compo=" << compo);
242  drag = new QDrag(this);
243  mime = new ItemMimeData;
244  drag->setMimeData(mime);
245  mime->setData(mimeType, mimeInfo.toLatin1());
246  drag->setPixmap(pixmap);
247 
248  theMimeInfo = mimeInfo;
249 
250  mime->setCatalog(catalog);
251  mime->setCataName(cataName);
252  mime->setCompo(compo);
253  mime->setType(definition);
254  }
255  else // --- push only selected item of the same mimeType than the first
256  {
257  if (theMimeInfo == mimeInfo)
258  {
259  DEBTRACE("mimeInfo=" << mimeInfo.toStdString() << " definition=" << definition << " compo=" << compo);
260  mime->setCatalog(catalog);
261  mime->setCataName(cataName);
262  mime->setCompo(compo);
263  mime->setType(definition);
264  }
265  }
266  }
267 
268  if (drag)
269  {
270  if(_dragModifier)
271  mime->setControl(true);
272  else
273  mime->setControl(false);
274 
275  drag->exec(supportedActions);
276  }
277 }
278 
279 void CatalogWidget::mousePressEvent(QMouseEvent *event)
280 {
281  DEBTRACE("CatalogWidget::mousePressEvent ");
282  _dragModifier= false;
283  if(event->button() == Qt::MidButton)
284  _dragModifier= true;
285  QTreeWidget::mousePressEvent(event);
286 }
287 
#define YASSERT(val)
YASSERT macro is always defined, used like assert, but throw a YACS::Exception instead of abort.
Definition: YacsTrace.hxx:59
#define DEBTRACE(msg)
Definition: YacsTrace.hxx:31
class for YACS catalogs.
Definition: Catalog.hxx:42
std::map< std::string, ComposedNode * > _composednodeMap
Definition: Catalog.hxx:52
std::map< std::string, ComponentDefinition * > _componentMap
Definition: Catalog.hxx:50
std::map< std::string, Node * > _nodeMap
Definition: Catalog.hxx:51
std::map< std::string, TypeCode * > _typeMap
Definition: Catalog.hxx:49
virtual Catalog * loadCatalog(const std::string &sourceKind, const std::string &path)
Load a catalog of calculation to use as factory.
Definition: Runtime.cxx:285
std::map< std::string, YACS::ENGINE::Catalog * > _cataMap
YACS::ENGINE::Catalog * _builtinCatalog
virtual YACS::ENGINE::Catalog * getCatalogFromType(std::string typeName)
virtual YACS::ENGINE::Catalog * getCatalog(std::string cataName)
virtual void mousePressEvent(QMouseEvent *event)
virtual std::map< std::string, YACS::ENGINE::Catalog * > getCataMap()
YACS::ENGINE::Catalog * _sessionCatalog
virtual bool addCatalogFromFile(std::string fileName)
virtual void startDrag(Qt::DropActions supportedActions)
std::map< std::string, YACS::ENGINE::Catalog * > _typeToCataMap
virtual void addCatalog(YACS::ENGINE::Catalog *catalog, std::string name)
virtual void setCompo(std::string compo)
virtual void setType(std::string aType)
virtual void setCataName(std::string cataName)
virtual void setCatalog(YACS::ENGINE::Catalog *cata)
virtual void setControl(bool control)
static QtGuiContext * getQtCurrent()
YACSRUNTIMESALOME_EXPORT RuntimeSALOME * getSALOMERuntime()