/******************************************************************************************** > void OpMakeNodesShapes::DoWithParam(OpDescriptor* pOp, OpParam* pParam) Author: Karim_MacDonald (Xara Group Ltd) <*****@*****.**> Created: 23/11/1999 Inputs: pOp unused pointer to an OpDescriptor. pParam pointer to an OpParamMakeNodesShapes data information structure. Outputs: The list of nodes, passed in through the OpParam, is converted in place into paths. Purpose: This undoable operation converts a given list of nodes to editable shapes (paths), each new node retaining the selection status of the original. See also: OpParamMakeNodesShapes ********************************************************************************************/ void OpMakeNodesShapes::DoWithParam(OpDescriptor* pOp, OpParam* pParam) { std::list<Node*>* plpNodes = ((OpParamMakeNodesShapes*)pParam)->m_plpNodes; Node* pNode; BOOL bFirst = FALSE; BOOL ok = TRUE; for ( std::list<Node*>::iterator iterNode = plpNodes->begin(); iterNode != plpNodes->end() && ok; iterNode++ ) { pNode = *iterNode; BecomeA baInfo(BECOMEA_REPLACE, CC_RUNTIME_CLASS(NodePath), this, pNode->IsSelected(), bFirst); baInfo.SetResultsStayInPlace(TRUE); ok = pNode->DoBecomeA(&baInfo); #ifdef _DEBUG if (ok) TRACEUSER( "Karim", _T("converted %s to editable shapes\n"), pNode->Name()); #endif bFirst = TRUE; } if (!ok) { InformError(); FailAndExecute(); } End(); return; }
/******************************************************************************************** > void OpMakeShapes::Do(OpDescriptor*) Author: Simon_Maneggio (Xara Group Ltd) <*****@*****.**> Created: 29/04/94 Inputs: OpDescriptor (unused) Outputs: - Returns: - Purpose: Performs the MakeShapes operation. ********************************************************************************************/ void OpMakeShapes::Do(OpDescriptor*) { // Obtain the current selections Range Selection(*GetApplication()->FindSelection()); RangeControl rg = Selection.GetRangeControlFlags(); rg.PromoteToParent = TRUE; Selection.Range::SetRangeControl(rg); // change the selection flags Node* CurrentNode = Selection.FindFirst(); BOOL Success = TRUE; ERROR3IF(CurrentNode == NULL, "Make shapes called with no nodes selected"); if (CurrentNode != NULL) // No nodes selected so End { // We need to invalidate the region if (Success) Success = DoInvalidateNodesRegions(Selection, TRUE, FALSE, FALSE, FALSE); // Don't recache // Try to record the selection state, don't render the blobs though if (Success) Success = DoStartSelOp(FALSE,FALSE); // The DoMakeShapes function does all the work while (Success && CurrentNode!=NULL) { Node* Next = Selection.FindNext(CurrentNode); // BODGE - since the group is selected and won't be replaced by anything else, no need to reselect it // this fixes a bug where make shapes on grouped text stories/molds/blends don't leave the parent group // selected but selects the objects inside! BOOL reselect = !IS_A(CurrentNode,NodeGroup) && !IS_A(CurrentNode,NodeBlend); // BOOL ok = TRUE; ObjChangeFlags cFlags(TRUE); ObjChangeParam ObjChange(OBJCHANGE_STARTING,cFlags,NULL,NULL); if (CurrentNode->AllowOp(&ObjChange)) { BecomeA BecomeAPath(BECOMEA_REPLACE,CC_RUNTIME_CLASS(NodePath), this, reselect); BecomeAPath.SetResultsStayInPlace(TRUE); Success = CurrentNode->DoBecomeA(&BecomeAPath); } CurrentNode = Next; } // We need to invalidate the region again for the new positions GetApplication()->FindSelection()->Update(); if (Success) Success = DoInvalidateNodesRegions(*GetApplication()->FindSelection(), TRUE); } if (!Success) { InformError(); FailAndExecute(); } End(); }