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; }
/** 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; }
/** 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; }