void RefactoringAssistant::showContextMenu(KListView* ,QListViewItem *item, const QPoint &p) { m_menu->clear(); UMLObject *obj = findUMLObject( item ); if(obj) {// Menu for UMLObjects Uml::Object_Type t = obj->getBaseType(); if (t == Uml::ot_Class) { m_menu->insertItem(i18n("Add Base Class"),this,SLOT(addBaseClassifier())); m_menu->insertItem(i18n("Add Derived Class"),this,SLOT(addDerivedClassifier())); // m_menu->insertItem(i18n("Add Interface Implementation"),this,SLOT(addInterfaceImplementation())); m_menu->insertItem(i18n("Add Operation"),this,SLOT(createOperation())); m_menu->insertItem(i18n("Add Attribute"),this,SLOT(createAttribute())); } else if (t == Uml::ot_Interface) { m_menu->insertItem(i18n("Add Base Interface"),this,SLOT(addSuperClassifier())); m_menu->insertItem(i18n("Add Derived Interface"),this,SLOT(addDerivedClassifier())); m_menu->insertItem(i18n("Add Operation"),this,SLOT(createOperation())); } // else // { // kDebug()<<"No context menu for objects of type "<<typeid(*obj).name()<<endl; // return; // } m_menu->insertSeparator(); m_menu->insertItem(i18n("Properties"),this,SLOT(editProperties())); } else {//menu for other ViewItems if( item->text(1) == "operations" ) { m_menu->insertItem(i18n("Add Operation"),this,SLOT(createOperation())); } else if( item->text(1) == "attributes" ) { m_menu->insertItem(i18n("Add Attribute"),this,SLOT(createAttribute())); } else { kWarning()<<"RefactoringAssistant::showContextMenu() " <<"called for extraneous item"<<endl; return; } } m_menu->exec(p); }
QString UMLAttribute::toString(Uml::Signature_Type sig) { QString s; if(sig == Uml::st_ShowSig || sig == Uml::st_NoSig) { s = m_Vis.toString(true) + ' '; } if(sig == Uml::st_ShowSig || sig == Uml::st_SigNoVis) { // Determine whether the type name needs to be scoped. UMLObject *owningObject = static_cast<UMLObject*>(parent()); if (owningObject->getBaseType() == Uml::ot_Operation) { // The immediate parent() is the UMLOperation but we want // the UMLClassifier: owningObject = static_cast<UMLObject*>(owningObject->parent()); } UMLClassifier *ownParent = dynamic_cast<UMLClassifier*>(owningObject); if (ownParent == NULL) { kError() << "UMLAttribute::toString: parent " << owningObject->getName() << " is not a UMLClassifier" << endl; return ""; } QString typeName; UMLClassifier *type = UMLClassifierListItem::getType(); if (type) { UMLPackage *typeScope = type->getUMLPackage(); if (typeScope != ownParent && typeScope != ownParent->getUMLPackage()) typeName = type->getFullyQualifiedName(); else typeName = type->getName(); } // The default direction, "in", is not mentioned. // Perhaps we should include a pd_Unspecified in // Uml::Parameter_Direction to have better control over this. if (m_ParmKind == Uml::pd_InOut) s += "inout "; else if (m_ParmKind == Uml::pd_Out) s += "out "; // Construct the attribute text. QString string = s + getName() + " : " + typeName; if(m_InitialValue.length() > 0) string += " = " + m_InitialValue; return string; } return s + getName(); }
void RefactoringAssistant::addDerivedClassifier() { QListViewItem *item = selectedItem(); if(!item) { kWarning()<<"RefactoringAssistant::addDerivedClassifier() " <<"called with no item selected"<<endl; return; } UMLObject *obj = findUMLObject( item ); if( !dynamic_cast<UMLClassifier*>(obj) ) { kWarning()<<"RefactoringAssistant::addDerivedClassifier() " <<"called for a non-classifier object"<<endl; return; } //classes have classes and interfaces interfaces as super/derived classifiers Uml::Object_Type t = obj->getBaseType(); UMLClassifier *derived = static_cast<UMLClassifier*>(Object_Factory::createUMLObject(t)); if(!derived) return; m_doc->createUMLAssociation( derived, obj, Uml::at_Generalization ); ////////////////////// Manually add the classifier to the assitant - would be nicer to do it with ///////////////////// a signal, like operations and attributes QListViewItem *derivedFolder = item->firstChild(); while( derivedFolder->text(0) != i18n("Derived Classifiers") ) derivedFolder = derivedFolder->nextSibling(); if(!derivedFolder) { kWarning()<<"Cannot find Derived Folder"<<endl; return; } item = new KListViewItem( derivedFolder, derived->getName() ); item->setPixmap(0,m_pixmaps.Subclass); item->setExpandable( true ); m_umlObjectMap[item] = derived; addClassifier( derived, item, false, true, true); ///////////////////////// }
QString UMLAttribute::getFullyQualifiedName( const QString& separator, bool includeRoot /* = false */) const { UMLOperation *op = NULL; UMLObject *owningObject = static_cast<UMLObject*>(parent()); if (owningObject->getBaseType() == Uml::ot_Operation) { op = static_cast<UMLOperation*>(owningObject); owningObject = static_cast<UMLObject*>(owningObject->parent()); } UMLClassifier *ownParent = dynamic_cast<UMLClassifier*>(owningObject); if (ownParent == NULL) { kError() << "UMLAttribute::getFullyQualifiedName(" << m_Name << "): parent " << owningObject->getName() << " is not a UMLClassifier" << endl; return ""; } QString tempSeparator = separator; if (tempSeparator.isEmpty()) tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); QString fqn = ownParent->getFullyQualifiedName(tempSeparator, includeRoot); if (op) fqn.append(tempSeparator + op->getName()); fqn.append(tempSeparator + m_Name); return fqn; }
/** 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; }
void RefactoringAssistant::movableDropEvent (QListViewItem* parentItem, QListViewItem* afterme) { //when dropping on a class, we have to put the item in the appropriate folder! UMLObject *movingObject; UMLClassifier *newClassifier; QListViewItem *movingItem; for( movingItem = firstChild(); movingItem != 0; movingItem = movingItem->itemBelow() ) { if( movingItem->isSelected() ) break; } if( !movingItem || (movingItem == afterme) || !(movingObject = findUMLObject(movingItem)) ) { kWarning()<<"Moving item not found or dropping after itself or item not found in uml obj map. aborting. (drop had already been accepted)"<<endl; return; } Uml::Object_Type t = movingObject->getBaseType(); newClassifier = dynamic_cast<UMLClassifier*>( findUMLObject( parentItem ) ); if(!newClassifier) { if ((parentItem->text(1) == "operations" && t == Uml::ot_Operation) || (parentItem->text(1) == "attributes" && t == Uml::ot_Attribute)) { newClassifier = dynamic_cast<UMLClassifier*>( findUMLObject( parentItem->parent() ) ); } if(!newClassifier) { kWarning()<<"New parent of object is not a Classifier - Drop had already been accepted - check!"<<endl; return; } } if (t == Uml::ot_Operation) {kDebug()<<"moving operation"<<endl; UMLOperation *op = static_cast<UMLOperation*>(movingObject); if(newClassifier->checkOperationSignature(op->getName(), op->getParmList())) { QString msg = QString(i18n("An operation with that signature already exists in %1.\n")).arg(newClassifier->getName()) + QString(i18n("Choose a different name or parameter list." )); KMessageBox::error(this, msg, i18n("Operation Name Invalid"), false); return; } UMLClassifier *oldClassifier = dynamic_cast<UMLClassifier*>(op->parent()); if(oldClassifier) oldClassifier->removeOperation( op ); newClassifier->addOperation( op ); } else if (t == Uml::ot_Attribute) {kDebug()<<"moving attribute - not implemented"<<endl; // UMLAttribute *att = static_cast<UMLAttribute*>(movingObject); // if(!newClassifier->checkAttributeSignature(att)) // { // QString msg = QString(i18n("An attribute with that signature already exists in %1.\n")).arg(newClassifier->getName()) // + // QString(i18n("Choose a different name or parameter list." )); // KMessageBox::error(this, msg, i18n("Operation Name Invalid"), false); // return; // } // oldClassifier->removeAttribute( att ); // newClassifier->addAttribute( att ); } //emit moved(moving, afterFirst, afterme); emit moved(); }
bool RefactoringAssistant::acceptDrag(QDropEvent *event) const { //first check if we can accept drops at all, and if the operation // is a move within the list itself if( !acceptDrops() || !itemsMovable() || (event->source()!=viewport())) { return false; } RefactoringAssistant *me = const_cast<RefactoringAssistant*>(this); //ok, check if the move is valid QListViewItem *movingItem = 0, *afterme = 0, *parentItem = 0; me->findDrop(event->pos(), parentItem, afterme); for( movingItem = firstChild(); movingItem != 0; movingItem = movingItem->itemBelow() ) { if( movingItem->isSelected() ) break; } if(!movingItem || !parentItem) { kDebug()<<"moving/parent items not found - can't accept drag!"<<endl; return false; } UMLObject *movingObject; if( !(movingObject = me->findUMLObject(movingItem)) ) { kDebug()<<"Moving object not found in uml map!"<<movingItem->text(0)<<endl; return false; } Uml::Object_Type t = movingObject->getBaseType(); if (t != Uml::ot_Attribute && t != Uml::ot_Operation) { kDebug()<<"only operations and attributes are movable! - return false"<<endl; return false; } kDebug()<<"parent item is "<<parentItem->text(0)<<endl; UMLObject *parentObject = me->findUMLObject(parentItem); if( parentObject && dynamic_cast<UMLClassifier*>(parentObject) ) { //droping to a classifier, ok } else {//parent is not a classifier, so maybe it's a folder.. check types if( (parentItem->text(1) == "operations" && t == Uml::ot_Operation) || (parentItem->text(1) == "attributes" && t == Uml::ot_Attribute)) { parentObject = me->findUMLObject( parentItem->parent() ); } else { kDebug()<<"moving to item "<<parentItem->text(0)<<" -- "<<parentItem->text(1)<<" not valid"<<endl; return false; } } if (dynamic_cast<UMLClassifier*>(parentObject) && (t == Uml::ot_Attribute || t == Uml::ot_Operation)) { return true; } kDebug()<<"how did I get here? return false!!"<<endl; return false; }