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