/** * Set the ID of the diagram hyperlinked to this note. * To switch off the hyperlink, set this to Uml::id_None. * * @param sceneID ID of an UMLScene. * @todo Fix the display of diagram link. */ void NoteWidget::setDiagramLink(Uml::IDType sceneID) { UMLView *view = umlDoc()->findView(sceneID); if (view == 0) { uError() << "no view found for viewID " << ID2STR(sceneID); return; } QString linkText("Diagram: " + view->umlScene()->name()); m_diagramLink = sceneID; }
/** * Set the ID of the diagram hyperlinked to this note. * To switch off the hyperlink, set this to Uml::id_None. * * @param viewID ID of an UMLScene. */ void NoteWidget::setDiagramLink(Uml::ID::Type viewID) { UMLDoc *umldoc = UMLApp::app()->document(); UMLView *view = umldoc->findView(viewID); if (view == NULL) { uError() << "no view found for viewID " << Uml::ID::toString(viewID); return; } QString linkText(QLatin1String("Diagram: ") + view->umlScene()->name()); setDocumentation(linkText); m_diagramLink = viewID; update(); }
Q3CanvasRectangle *decoratePoint(const QPoint& p) { const int SIZE = 4; UMLView *currentView = UMLApp::app()->currentView(); Q3CanvasRectangle *rect; rect = new Q3CanvasRectangle(p.x() - SIZE / 2, p.y() - SIZE / 2, SIZE, SIZE, currentView->canvas()); rect->setBrush( QBrush(Qt::blue) ); rect->setPen( QPen(Qt::blue) ); rect->setVisible(true); return rect; }
QVariant DiagramsModel::data(const QModelIndex & index, int role) const { if (role == Qt::UserRole && index.column() == 0) { QVariant v; v.setValue(m_views.at(index.row()).data()); return v; } else if (role == Qt::DecorationRole && index.column() == 0) { UMLView *v = m_views.at(index.row()); return QVariant(Icon_Utils::smallIcon(v->umlScene()->type())); } else if (role != Qt::DisplayRole) return QVariant(); int cCount = columnCount(index); if (index.column() >= cCount) return QVariant(); UMLView *v = m_views.at(index.row()); if (index.column() == 0) return v->umlScene()->name(); else if (index.column() == 1) return Uml::DiagramType::toStringI18n(v->umlScene()->type()); else if (index.column() == 2) return v->umlScene()->folder()->name(); else return QVariant(QString::number(v->umlScene()->widgetList().size()) + QLatin1String("/") + QString::number(v->umlScene()->associationList().size())); }
/** * Return ID string of UML diagram. * @param sel index of selected item * @return ID as string or empty string */ QString DiagramPrintPage::printUmlDiagram(int sel) { int count = 0; for (int i = 0; i < m_pSelectLW->count(); ++i) { if (isSelected(i)) { if (count == sel) { UMLView *view = (UMLView *)m_doc->findView(m_nIdList[i]); QString sID = QString::fromLatin1("%1").arg(Uml::ID::toString(view->umlScene()->ID())); return sID; } count++; } } return QString(); }
/** * Copy operation. * @param fromView flag if it is from view * @return the mime data */ QMimeData* UMLClipboard::copy(bool fromView/*=false*/) { // Clear previous copied data m_AssociationList.clear(); m_ObjectList.clear(); m_ViewList.clear(); UMLDragData *data = 0; QPixmap* png = 0; UMLListView * listView = UMLApp::app()->listView(); if (fromView) { m_type = clip4; UMLView *view = UMLApp::app()->currentView(); if (view == 0) { uError() << "UMLApp::app()->currentView() is NULL"; return 0; } UMLScene *scene = view->umlScene(); if (scene == 0) { uError() << "currentView umlScene() is NULL"; return 0; } m_WidgetList = scene->selectedWidgetsExt(); //if there is no selected widget then there is no copy action if (!m_WidgetList.count()) { return 0; } m_AssociationList = scene->selectedAssocs(); scene->copyAsImage(png); // Clip4 needs related widgets. addRelatedWidgets(); // Clip4 needs UMLObjects because it's possible the UMLObject // is no longer there when pasting this mime data. This happens for // example when using cut-paste or pasting to another Umbrello // instance. fillObjectListForWidgets(m_WidgetList); foreach (WidgetBase* widget, m_AssociationList) { if (widget->umlObject() != 0) { m_ObjectList.append(widget->umlObject()); } } } else {
/** * This slot is called to finish item editing */ void UMLListViewItem::slotEditFinished(const QString &newText) { m_label = text(0); DEBUG(DBG_LVI) << this << "text=" << newText; UMLListView* listView = static_cast<UMLListView*>(treeWidget()); UMLDoc* doc = listView->document(); if (newText == m_label) { return; } if (newText.isEmpty()) { cancelRenameWithMsg(); return; } switch (m_type) { case lvt_UseCase: case lvt_Actor: case lvt_Class: case lvt_Package: case lvt_UseCase_Folder: case lvt_Logical_Folder: case lvt_Component_Folder: case lvt_Deployment_Folder: case lvt_EntityRelationship_Folder: case lvt_Interface: case lvt_Datatype: case lvt_Enum: case lvt_EnumLiteral: case lvt_Subsystem: case lvt_Component: case lvt_Port: case lvt_Node: case lvt_Category: if (m_object == 0 || !doc->isUnique(newText)) { cancelRenameWithMsg(); return; } UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(m_object, newText)); doc->setModified(true); m_label = newText; break; case lvt_Operation: { if (m_object == 0) { cancelRenameWithMsg(); return; } UMLOperation *op = static_cast<UMLOperation*>(m_object); UMLClassifier *parent = static_cast<UMLClassifier *>(op->parent()); Model_Utils::OpDescriptor od; Model_Utils::Parse_Status st = Model_Utils::parseOperation(newText, od, parent); if (st == Model_Utils::PS_OK) { // TODO: Check that no operation with the exact same profile exists. UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(op, od.m_name)); op->setType(od.m_pReturnType); UMLAttributeList parmList = op->getParmList(); const int newParmListCount = parmList.count(); if (newParmListCount > od.m_args.count()) { // Remove parameters at end of of list that no longer exist. for (int i = od.m_args.count(); i < newParmListCount; i++) { UMLAttribute *a = parmList.at(i); op->removeParm(a, false); } } Model_Utils::NameAndType_ListIt lit = od.m_args.begin(); for (int i = 0; lit != od.m_args.end(); ++lit, ++i) { const Model_Utils::NameAndType& nm_tp = *lit; UMLAttribute *a; if (i < newParmListCount) { a = parmList.at(i); } else { a = new UMLAttribute(op); a->setID(UniqueID::gen()); } UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(a, nm_tp.m_name)); a->setType(nm_tp.m_type); a->setParmKind(nm_tp.m_direction); a->setInitialValue(nm_tp.m_initialValue); if (i >= newParmListCount) { op->addParm(a); } } m_label = op->toString(Uml::SignatureType::SigNoVis); } else { KMessageBox::error(0, Model_Utils::psText(st), i18n("Rename canceled")); } setText(m_label); break; } case lvt_Attribute: case lvt_EntityAttribute: { if (m_object == 0) { cancelRenameWithMsg(); return; } UMLClassifier *parent = static_cast<UMLClassifier*>(m_object->parent()); Model_Utils::NameAndType nt; Uml::Visibility::Enum vis; Model_Utils::Parse_Status st; st = Model_Utils::parseAttribute(newText, nt, parent, &vis); if (st == Model_Utils::PS_OK) { UMLObject *exists = parent->findChildObject(newText); if (exists) { cancelRenameWithMsg(); return; } UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(m_object, nt.m_name)); UMLAttribute *pAtt = static_cast<UMLAttribute*>(m_object); pAtt->setType(nt.m_type); pAtt->setVisibility(vis); pAtt->setParmKind(nt.m_direction); pAtt->setInitialValue(nt.m_initialValue); m_label = pAtt->toString(Uml::SignatureType::SigNoVis); } else { KMessageBox::error(0, Model_Utils::psText(st), i18n("Rename canceled")); } setText(m_label); break; } case lvt_PrimaryKeyConstraint: case lvt_UniqueConstraint: case lvt_ForeignKeyConstraint: case lvt_CheckConstraint: { if (m_object == 0) { cancelRenameWithMsg(); return; } UMLEntity *parent = static_cast<UMLEntity*>(m_object->parent()); QString name; Model_Utils::Parse_Status st; st = Model_Utils::parseConstraint(newText, name, parent); if (st == Model_Utils::PS_OK) { UMLObject *exists = parent->findChildObject(name); if (exists) { cancelRenameWithMsg(); return; } UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(m_object, name)); UMLEntityConstraint* uec = static_cast<UMLEntityConstraint*>(m_object); m_label = uec->toString(Uml::SignatureType::SigNoVis); } else { KMessageBox::error(0, Model_Utils::psText(st), i18n("Rename canceled")); } setText(m_label); break; } case lvt_Template: { if (m_object == 0) { cancelRenameWithMsg(); return; } UMLClassifier *parent = static_cast<UMLClassifier*>(m_object->parent()); Model_Utils::NameAndType nt; Model_Utils::Parse_Status st = Model_Utils::parseTemplate(newText, nt, parent); if (st == Model_Utils::PS_OK) { UMLObject *exists = parent->findChildObject(newText); if (exists) { cancelRenameWithMsg(); return; } UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(m_object, nt.m_name)); UMLTemplate *tmpl = static_cast<UMLTemplate*>(m_object); tmpl->setType(nt.m_type); m_label = tmpl->toString(Uml::SignatureType::SigNoVis); } else { KMessageBox::error(0, Model_Utils::psText(st), i18n("Rename canceled")); } setText(m_label); break; } case lvt_UseCase_Diagram: case lvt_Class_Diagram: case lvt_Sequence_Diagram: case lvt_Collaboration_Diagram: case lvt_State_Diagram: case lvt_Activity_Diagram: case lvt_Component_Diagram: case lvt_Deployment_Diagram: { UMLView *view = doc->findView(ID()); if (view == 0) { cancelRenameWithMsg(); return; } UMLView *anotherView = doc->findView(view->umlScene()->type(), newText); if (anotherView && anotherView->umlScene()->ID() == ID()) { anotherView = 0; } if (anotherView) { cancelRenameWithMsg(); return; } view->umlScene()->setName(newText); setText(newText); doc->signalDiagramRenamed(view); break; } default: KMessageBox::error(0, i18n("Renaming an item of listview type %1 is not yet implemented.", m_type), i18n("Function Not Implemented")); setText(m_label); break; } doc->setModified(true); }
/** If clipboard has mime type application/x-uml-clip4, Pastes the data from the clipboard into the current Doc */ bool UMLClipboard::pasteClip4(QMimeSource* data) { UMLDoc *doc = UMLApp::app()->getDocument(); UMLObjectList objects; objects.setAutoDelete(false); UMLWidgetList widgets; widgets.setAutoDelete(false); AssociationWidgetList assocs; assocs.setAutoDelete(false); IDChangeLog* idchanges = 0; Uml::Diagram_Type diagramType; if( !UMLDrag::decodeClip4(data, objects, widgets, assocs, diagramType) ) { return false; } if( diagramType != UMLApp::app()->getCurrentView()->getType() ) { if( !checkPasteWidgets(widgets) ) { assocs.setAutoDelete(true); assocs.clear(); return false; } } UMLObjectListIt object_it(objects); idchanges = doc->getChangeLog(); if(!idchanges) { return false; } //make sure the file we are pasting into has the objects //we need if there are widgets to be pasted UMLObject* obj = 0; while ( (obj=object_it.current()) != 0 ) { ++object_it; if(!doc->assignNewIDs(obj)) { return false; } } //now add any widget we are want to paste bool objectAlreadyExists = false; UMLView *currentView = UMLApp::app()->getCurrentView(); currentView->beginPartialWidgetPaste(); UMLWidget* widget =0; UMLWidgetListIt widget_it(widgets); while ( (widget=widget_it.current()) != 0 ) { ++widget_it; Uml::IDType oldId = widget->getID(); Uml::IDType newId = idchanges->findNewID(oldId); if (currentView->findWidget(newId)) { kError() << "UMLClipboard::pasteClip4: widget (oldID=" << ID2STR(oldId) << ", newID=" << ID2STR(newId) << ") already exists in target view." << endl; widgets.remove(widget); delete widget; objectAlreadyExists = true; } else if (! currentView->addWidget(widget, true)) { currentView->endPartialWidgetPaste(); return false; } } //now paste the associations AssociationWidget* assoc; AssociationWidgetListIt assoc_it(assocs); while ( (assoc=assoc_it.current()) != 0 ) { ++assoc_it; if (!currentView->addAssociation(assoc, true)) { currentView->endPartialWidgetPaste(); return false; } } //Activate all the pasted associations and widgets currentView->activate(); currentView->endPartialWidgetPaste(); /* UMLListView *listView = UMLApp::app()->getListView(); UMLListViewItem* item = 0; UMLListViewItem* itemdata = 0; UMLListViewItemListIt it(itemdatalist); while ( (itemdata=it.current()) != 0 ) { item = listView->createItem(*itemdata, *idchanges); if(!item) { return false; } if(itemdata -> childCount()) { if(!pasteChildren(item, idchanges)) { return false; } } ++it; }*/ if (objectAlreadyExists) { pasteItemAlreadyExists(); } return true; }
QMimeSource* UMLClipboard::copy(bool fromView/*=false*/) { //Clear previous copied data m_AssociationList.clear(); m_ItemList.clear(); m_ObjectList.clear(); m_ViewList.clear(); UMLDrag *data = 0; QPixmap* png = 0; UMLListView * listView = UMLApp::app()->getListView(); UMLListViewItemList selectedItems; selectedItems.setAutoDelete(false); if(fromView) { m_type = clip4; UMLView *view = UMLApp::app()->getCurrentView(); view->checkSelections(); if(!view->getSelectedWidgets(m_WidgetList)) { return 0; } //if there is no selected widget then there is no copy action if(!m_WidgetList.count()) { return 0; } m_AssociationList = view->getSelectedAssocs(); view->copyAsImage(png); } else { //if the copy action is being performed from the ListView if(!listView->getSelectedItems(selectedItems)) { return 0; } //Set What type of copy operation are we performing and //also fill m_ViewList with all the selected Diagrams setCopyType(selectedItems); //if we are copying a diagram or part of a diagram, select the items //on the ListView that correspond to a UseCase, Actor or Concept //in the Diagram if(m_type == clip2) { //Fill the member lists with all the object and stuff to be copied //to the clipboard selectedItems.clear(); //For each selected view select all the Actors, USe Cases and Concepts //widgets in the ListView for (UMLViewListIt vit(m_ViewList); vit.current(); ++vit) { UMLObjectList objects = vit.current()->getUMLObjects(); for (UMLObjectListIt oit(objects); oit.current(); ++oit) { UMLObject *o = oit.current(); UMLListViewItem *item = listView->findUMLObject(o); if(item) { listView->setSelected(item, true); } } } if(!listView->getSelectedItems(selectedItems)) { return 0; } } if(!fillSelectionLists(selectedItems)) { return 0; } } int i =0; switch(m_type) { case clip1: data = new UMLDrag(m_ObjectList); break; case clip2: data = new UMLDrag(m_ObjectList, m_ItemList, m_ViewList); break; case clip3: data = new UMLDrag(m_ItemList); break; case clip4: if(png) { UMLView *view = UMLApp::app()->getCurrentView(); data = new UMLDrag(m_ObjectList, m_WidgetList, m_AssociationList, *png, view->getType()); } else { return 0; } break; case clip5: data = new UMLDrag(m_ObjectList, i); // The int i is used to differentiate // which UMLDrag constructor gets called. break; } return (QMimeSource*)data; }