void UMLClipboard::checkItemForCopyType(UMLListViewItem* Item, bool & WithDiagrams, bool &WithObjects, bool &OnlyAttsOps) { if(!Item) { return; } UMLDoc *doc = UMLApp::app()->getDocument(); OnlyAttsOps = true; UMLView * view = 0; UMLListViewItem * child = 0; Uml::ListView_Type type = Item->getType(); if ( Model_Utils::typeIsCanvasWidget(type) ) { WithObjects = true; OnlyAttsOps = false; } else if ( Model_Utils::typeIsDiagram(type) ) { WithDiagrams = true; OnlyAttsOps = false; view = doc->findView( Item->getID() ); m_ViewList.append( view ); } else if ( Model_Utils::typeIsFolder(type) ) { OnlyAttsOps = false; if(Item->childCount()) { child = (UMLListViewItem*)Item->firstChild(); while(child) { checkItemForCopyType(child, WithDiagrams, WithObjects, OnlyAttsOps); child = (UMLListViewItem*)child->nextSibling(); } } } }
/** * Overloading operator for debugging output. */ QDebug operator<<(QDebug dbg, const UMLListViewItem& item) { dbg.nospace() << "UMLListViewItem: " << item.text(0) << ", type=" << UMLListViewItem::toString(item.type()) << ", id=" << Uml::ID::toString(item.ID()) << ", children=" << item.childCount(); return dbg.space(); }
bool UMLClipboard::insertItemChildren( UMLListViewItem * item ) { if( item -> childCount() ) { UMLListViewItem * child =dynamic_cast<UMLListViewItem *>( item -> firstChild() ); while( child ) { m_ItemList.append( child ); insertItemChildren( child ); child = dynamic_cast<UMLListViewItem *>( child->nextSibling() ); } } return true; }
/** * Find the UMLListViewItem that is related to the given UMLObject * in the tree rooted at the current UMLListViewItem. * Return a pointer to the item or NULL if not found. */ UMLListViewItem* UMLListViewItem::findUMLObject(const UMLObject *o) { if (m_object == o) return this; for (int i = 0; i < childCount(); i++) { UMLListViewItem *item = static_cast<UMLListViewItem*>(child(i)); UMLListViewItem *testItem = item->findUMLObject(o); if (testItem) return testItem; } return 0; }
int UMLListViewFinder::collect(Category category, const QString &text) { Q_UNUSED(category); QList<QTreeWidgetItem*> items = UMLApp::app()->listView()->findItems(text, Qt::MatchContains | Qt::MatchRecursive); m_items.clear(); foreach(QTreeWidgetItem *item, items) { UMLListViewItem *ui = dynamic_cast<UMLListViewItem *>(item); if (!ui) continue; UMLObject *o = ui->umlObject(); if (!includeObject(category, o)) continue; m_items.append(o->id()); }
/** * Find the UMLListViewItem of the given ID in the tree rooted at * the current UMLListViewItem. * Return a pointer to the item or NULL if not found. * * @param id The ID to search for. * @return The item with the given ID or NULL if not found. */ UMLListViewItem * UMLListViewItem::findItem(Uml::ID::Type id) { if (ID() == id) { return this; } for (int i = 0; i < childCount(); ++i) { UMLListViewItem *childItem = static_cast<UMLListViewItem*>(child(i)); UMLListViewItem *inner = childItem->findItem(id); if (inner) { return inner; } } return 0; }
/** * Create a deep copy of this UMLListViewItem, but using the * given parent instead of the parent of this UMLListViewItem. * Return the new UMLListViewItem created. */ UMLListViewItem* UMLListViewItem::deepCopy(UMLListViewItem *newParent) { QString nm = text(0); ListViewType t = type(); UMLObject *o = umlObject(); UMLListViewItem* newItem; if (o) newItem = new UMLListViewItem(newParent, nm, t, o); else newItem = new UMLListViewItem(newParent, nm, t, m_id); for (int i=0; i < childCount(); i++) { UMLListViewItem *childItem = static_cast<UMLListViewItem*>(child(i)); childItem->deepCopy(newItem); } return newItem; }
/** Adds the children of a UMLListViewItem to m_ItemList */ bool UMLClipboard::insertItemChildren(UMLListViewItem * Item, UMLListViewItemList& SelectedItems) { if(Item->childCount()) { UMLListViewItem * child = (UMLListViewItem*)Item->firstChild(); int type; while(child) { m_ItemList.append(child); type = child->getType(); if(type == Uml::lvt_Actor || type == Uml::lvt_UseCase || type == Uml::lvt_Class) { m_ObjectList.append(child->getUMLObject()); } // If the child is selected, remove it from the list of selected items // otherwise it will be inserted twice in m_ObjectList. if(child->isSelected()) { SelectedItems.remove(SelectedItems.find(child) ); } insertItemChildren(child, SelectedItems); child = (UMLListViewItem*)child->nextSibling(); } } return true; }
bool UMLClipboard::pasteChildren(UMLListViewItem *parent, IDChangeLog *chgLog) { if (!parent) { kWarning() << "Paste Children Error, parent missing" << endl; return false; } UMLDoc *doc = UMLApp::app()->getDocument(); UMLListView *listView = UMLApp::app()->getListView(); UMLListViewItem *childItem = static_cast<UMLListViewItem*>(parent->firstChild()); while (childItem) { Uml::IDType oldID = childItem->getID(); Uml::IDType newID = chgLog->findNewID(oldID); UMLListViewItem *shouldNotExist = listView->findItem(newID); if (shouldNotExist) { kError() << "UMLClipboard::pasteChildren: new list view item " << ID2STR(newID) << " already exists (internal error)" << endl; childItem = static_cast<UMLListViewItem*>(childItem->nextSibling()); continue; } UMLObject *newObj = doc->findObjectById(newID); if (newObj) { kDebug() << "UMLClipboard::pasteChildren: adjusting lvitem(" << ID2STR(oldID) << ") to new UMLObject(" << ID2STR(newID) << ")" << endl; childItem->setUMLObject(newObj); childItem->setText(newObj->getName()); } else { kDebug() << "UMLClipboard::pasteChildren: no UMLObject found for lvitem " << ID2STR(newID) << endl; } childItem = static_cast<UMLListViewItem*>(childItem->nextSibling()); } return true; }
/** * Saves the listview item to a "listitem" tag. */ void UMLListViewItem::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) { QDomElement itemElement = qDoc.createElement(QLatin1String("listitem")); Uml::ID::Type id = ID(); QString idStr = Uml::ID::toString(id); //DEBUG(DBG_LVI) << "id = " << idStr << ", type = " << m_type; if (id != Uml::ID::None) itemElement.setAttribute(QLatin1String("id"), idStr); itemElement.setAttribute(QLatin1String("type"), m_type); UMLFolder *extFolder = 0; if (m_object == 0) { if (! Model_Utils::typeIsDiagram(m_type) && m_type != lvt_View) uError() << text(0) << ": m_object is NULL"; if (m_type != lvt_View) itemElement.setAttribute(QLatin1String("label"), text(0)); } else if (m_object->id() == Uml::ID::None) { if (text(0).isEmpty()) { DEBUG(DBG_LVI) << "Skipping empty item"; return; } DEBUG(DBG_LVI) << "saving local label " << text(0) << " because umlobject ID is not set"; if (m_type != lvt_View) itemElement.setAttribute(QLatin1String("label"), text(0)); } else if (m_object->baseType() == UMLObject::ot_Folder) { extFolder = static_cast<UMLFolder*>(m_object); if (!extFolder->folderFile().isEmpty()) { itemElement.setAttribute(QLatin1String("open"), QLatin1String("0")); qElement.appendChild(itemElement); return; } } itemElement.setAttribute(QLatin1String("open"), isExpanded()); QDomElement folderRoot; for (int i=0; i < childCount(); i++) { UMLListViewItem *childItem = static_cast<UMLListViewItem*>(child(i)); childItem->saveToXMI(qDoc, itemElement); } qElement.appendChild(itemElement); }
bool UMLClipboard::fillSelectionLists(UMLListViewItemList& SelectedItems) { UMLListViewItemListIt it(SelectedItems); UMLListViewItem* item = 0; Uml::ListView_Type type; switch(m_type) { case clip4: break; case clip3: for ( ; it.current(); ++it ) { item = (UMLListViewItem*)it.current(); type = item->getType(); if ( !Model_Utils::typeIsClassifierList(type) ) { m_ItemList.append(item); insertItemChildren(item, SelectedItems); //Because it is being called when m_type is 3 //it will insert only child empty folders of other folders. //If a child folder //is not empty that means m_type wouldn't be 3 because if a folder is //selected then its complete contents are treated as if //they were selected } } break; case clip2: case clip1: for ( ; it.current(); ++it ) { item = (UMLListViewItem*)it.current(); type = item->getType(); if ( !Model_Utils::typeIsClassifierList(type) ) { m_ItemList.append(item); if ( Model_Utils::typeIsCanvasWidget(type) ) { m_ObjectList.append(item->getUMLObject()); } insertItemChildren(it.current(), SelectedItems); } } break; case clip5: for ( ; it.current(); ++it ) { item = (UMLListViewItem*)it.current(); type = item->getType(); if( Model_Utils::typeIsClassifierList(type) ) { m_ItemList.append(item); m_ObjectList.append(item->getUMLObject()); } else { return false; } } break; } return true; }
int UMLListViewItem::compare(QTreeWidgetItem *other, int col, bool ascending) const { UMLListViewItem *ulvi = static_cast<UMLListViewItem*>(other); ListViewType ourType = type(); ListViewType otherType = ulvi->type(); if (ourType < otherType) return -1; if (ourType > otherType) return 1; // ourType == otherType const bool subItem = Model_Utils::typeIsClassifierList(ourType); const int alphaOrder = key(col, ascending).compare(other->key(col, ascending)); int retval = 0; QString dbgPfx = "compare(type=" + QString::number((int)ourType) + ", self=" + text() + ", other=" + ulvi->text() + "): return "; UMLObject *otherObj = ulvi->umlObject(); if (m_object == 0) { retval = (subItem ? 1 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (m_object==0)"; #endif return retval; } if (otherObj == 0) { retval = (subItem ? -1 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (otherObj==0)"; #endif return retval; } UMLClassifier *ourParent = dynamic_cast<UMLClassifier*>(m_object->parent()); UMLClassifier *otherParent = dynamic_cast<UMLClassifier*>(otherObj->parent()); if (ourParent == 0) { retval = (subItem ? 1 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (ourParent==0)"; #endif return retval; } if (otherParent == 0) { retval = (subItem ? -1 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (otherParent==0)"; #endif return retval; } if (ourParent != otherParent) { retval = (subItem ? 0 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (ourParent != otherParent)"; #endif return retval; } UMLClassifierListItem *thisUmlItem = dynamic_cast<UMLClassifierListItem*>(m_object); UMLClassifierListItem *otherUmlItem = dynamic_cast<UMLClassifierListItem*>(otherObj); if (thisUmlItem == 0) { retval = (subItem ? 1 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (thisUmlItem==0)"; #endif return retval; } if (otherUmlItem == 0) { retval = (subItem ? -1 : alphaOrder); #ifdef DEBUG_LVITEM_INSERTION_ORDER DEBUG(DBG_LVI) << dbgPfx << retval << " because (otherUmlItem==0)"; #endif return retval; } UMLClassifierListItemList items = ourParent->getFilteredList(thisUmlItem->baseType()); int myIndex = items.indexOf(thisUmlItem); int otherIndex = items.indexOf(otherUmlItem); if (myIndex < 0) { retval = (subItem ? -1 : alphaOrder); uError() << dbgPfx << retval << " because (myIndex < 0)"; return retval; } if (otherIndex < 0) { retval = (subItem ? 1 : alphaOrder); uError() << dbgPfx << retval << " because (otherIndex < 0)"; return retval; } return (myIndex < otherIndex ? -1 : myIndex > otherIndex ? 1 : 0); }
/** If clipboard has mime type application/x-uml-clip5, Pastes the data from the clipboard into the current Doc */ bool UMLClipboard::pasteClip5(QMimeSource* data) { UMLDoc *doc = UMLApp::app()->getDocument(); UMLListView *listView = UMLApp::app()->getListView(); UMLListViewItem* lvitem = dynamic_cast<UMLListViewItem *>( listView->currentItem() ); if (!lvitem || (lvitem->getType() != Uml::lvt_Class && lvitem->getType() != Uml::lvt_Interface)) { return false; } UMLClassifier *parent = dynamic_cast<UMLClassifier *>(lvitem->getUMLObject()); if (parent == NULL) { kError() << "UMLClipboard::pasteClip5: parent is not a UMLClassifier" << endl; return false; } UMLObjectList objects; objects.setAutoDelete(false); IDChangeLog* idchanges = 0; bool result = UMLDrag::decodeClip5(data, objects, parent); if(!result) { return false; } UMLObject *obj = 0; doc->setModified(true); idchanges = doc->getChangeLog(); // Assume success if at least one child object could be pasted if (objects.count()) result = false; for (UMLObjectListIt it(objects); (obj = it.current()) != NULL; ++it) { obj->setID(doc->assignNewID(obj->getID())); switch(obj->getBaseType()) { case Uml::ot_Attribute : { UMLObject *exist = parent->findChildObject(obj->getName(), Uml::ot_Attribute); if (exist) { QString newName = parent->uniqChildName(Uml::ot_Attribute, obj->getName()); obj->setName(newName); } UMLAttribute *att = static_cast<UMLAttribute*>(obj); if (parent->addAttribute(att, idchanges)) { result = true; } else { kError() << "UMLClipboard::pasteClip5: " << parent->getName() << "->addAttribute(" << att->getName() << ") failed" << endl; } break; } case Uml::ot_Operation : { UMLOperation *op = static_cast<UMLOperation*>(obj); UMLOperation *exist = parent->checkOperationSignature(op->getName(), op->getParmList()); if (exist) { QString newName = parent->uniqChildName(Uml::ot_Operation, obj->getName()); op->setName(newName); } if (parent->addOperation(op, idchanges)) { result = true; } else { kError() << "UMLClipboard::pasteClip5: " << parent->getName() << "->addOperation(" << op->getName() << ") failed" << endl; } break; } default : kWarning() << "pasting unknown children type in clip type 5" << endl; return false; } } return result; }