void MCStack::setgeom() { if (MCnoui || !opened) return; // MW-2009-09-25: Ensure things are the right size when doing // remote dialog/menu windows. if (window == DNULL) { state &= ~CS_NEED_RESIZE; // MW-2011-08-18: [[ Redraw ]] Update to use redraw. MCRedrawLockScreen(); resize(rect . width, rect . height); MCRedrawUnlockScreen(); mode_setgeom(); return; } // IM-2013-10-04: [[ FullscreenMode ]] Use view methods to get / set the stack viewport MCRectangle t_old_rect; t_old_rect = view_getstackviewport(); rect = view_setstackviewport(rect); state &= ~CS_NEED_RESIZE; // IM-2013-10-04: [[ FullscreenMode ]] Return values from view methods are // in stack coords so don't need to transform if (t_old_rect.x != rect.x || t_old_rect.y != rect.y || t_old_rect.width != rect.width || t_old_rect.height != rect.height) resize(t_old_rect.width, t_old_rect.height); }
void MCStack::setgeom() { //set stack(window) size or position from script if (MCnoui || !opened) return; // MW-2009-09-25: Ensure things are the right size when doing // remote dialog/menu windows. if (window == DNULL) { // MW-2011-08-18: [[ Redraw ]] Update to use redraw. MCRedrawLockScreen(); state &= ~CS_NEED_RESIZE; resize(rect . width, rect . height); MCRedrawUnlockScreen(); mode_setgeom(); return; } // MW-2011-09-12: [[ MacScroll ]] Make sure we apply the current scroll setting. applyscroll(); Rect windRect; GetPortBounds(GetWindowPort((WindowPtr)window->handle.window), &windRect); SetGWorld(GetWindowPort((WindowPtr)window->handle.window), GetMainDevice()); Point p; p.h = windRect.left; p.v = windRect.top; LocalToGlobal(&p); int2 curWidth = windRect.right - windRect.left; int2 curHeight = windRect.bottom - windRect.top; if (IsWindowVisible((WindowPtr)window->handle.window)) { if (mode != WM_SHEET && mode != WM_DRAWER && (rect.x != p.h || rect.y != p.v)) { MoveWindow((WindowPtr)window->handle.window, rect.x, rect.y, False); state |= CS_BEEN_MOVED; } if (rect.width != curWidth || rect.height != curHeight) { SizeWindow((WindowPtr)window->handle.window, rect.width, rect.height, True); resize(curWidth, curHeight + getscroll()); } state &= ~CS_NEED_RESIZE; } else { if (mode != WM_SHEET && mode != WM_DRAWER) MoveWindow((WindowPtr)window->handle.window, rect.x, rect.y, False); if (rect.width != curWidth || rect.height != curHeight) { SizeWindow((WindowPtr)window->handle.window, rect.width, rect.height, True); resize(curWidth, curHeight + getscroll()); } state &= ~(CS_BEEN_MOVED | CS_NEED_RESIZE); } }
void MCStack::setgeom() { if (MCnoui || !opened) return; // MW-2009-09-25: Ensure things are the right size when doing // remote dialog/menu windows. if (window == DNULL) { state &= ~CS_NEED_RESIZE; // MW-2011-08-18: [[ Redraw ]] Update to use redraw. MCRedrawLockScreen(); resize(rect . width, rect . height); MCRedrawUnlockScreen(); mode_setgeom(); return; } uint32_t wstyle, exstyle; getstyle(wstyle, exstyle); RECT newrect = getwrect(rect, wstyle, exstyle); RECT wrect; GetWindowRect((HWND)window->handle.window, &wrect); LONG cx = newrect.right - newrect.left; LONG cy = newrect.bottom - newrect.top; state &= ~CS_NEED_RESIZE; if (wrect.right - wrect.left != cx || wrect.bottom - wrect.top != cy || newrect.left != wrect.left || newrect.top != wrect.top) { state |= CS_NO_CONFIG; MoveWindow((HWND)window->handle.window, newrect.left, newrect.top, cx, cy, True); if (wrect.right - wrect.left != cx || wrect.bottom - wrect.top != cy) resize(uint2(wrect.right - wrect.left), uint2(wrect.bottom - wrect.top)); state &= ~CS_NO_CONFIG; } }
void MCStack::effectrect(const MCRectangle& p_area, Boolean& r_abort) { // Get the list of effects. MCEffectList *t_effects = MCcur_effects; MCcur_effects = NULL; // If the window isn't opened or hasn't been attached (plugin) or if we have no // snapshot to use, this is a no-op. if (!opened || !haswindow() || m_snapshot == nil) { while(t_effects != NULL) { MCEffectList *t_effect; t_effect = t_effects; t_effects = t_effects -> next; delete t_effect; } return; } // Mark the stack as being in an effect. state |= CS_EFFECT; // Lock messages while the effect is happening. Boolean t_old_lockmessages; t_old_lockmessages = MClockmessages; MClockmessages = True; // Calculate the area of interest. MCRectangle t_effect_area; t_effect_area = curcard -> getrect(); t_effect_area . y = getscroll(); t_effect_area . height -= t_effect_area . y; t_effect_area = MCU_intersect_rect(t_effect_area, p_area); // IM-2013-08-21: [[ ResIndependence ]] Scale effect area to device coords // Align snapshot rect to device pixels // IM-2013-09-30: [[ FullscreenMode ]] Use stack transform to get device coords MCGAffineTransform t_transform; t_transform = getdevicetransform(); // MW-2013-10-29: [[ Bug 11330 ]] Make sure the effect area is cropped to the visible // area. t_effect_area = MCRectangleGetTransformedBounds(t_effect_area, getviewtransform()); t_effect_area = MCU_intersect_rect(t_effect_area, MCU_make_rect(0, 0, view_getrect() . width, view_getrect() . height)); // IM-2014-01-24: [[ HiDPI ]] scale effect region to backing surface coords MCGFloat t_scale; t_scale = view_getbackingscale(); MCRectangle t_device_rect, t_user_rect; t_device_rect = MCRectangleGetScaledBounds(t_effect_area, t_scale); t_user_rect = MCRectangleGetTransformedBounds(t_device_rect, MCGAffineTransformInvert(t_transform)); // IM-2013-08-29: [[ RefactorGraphics ]] get device height for CoreImage effects // IM-2013-09-30: [[ FullscreenMode ]] Use view rect to get device height uint32_t t_device_height; t_device_height = floor(view_getrect().height * t_scale); // Make a region of the effect area // IM-2013-08-29: [[ ResIndependence ]] scale effect region to device coords MCRegionRef t_effect_region; t_effect_region = nil; /* UNCHECKED */ MCRegionCreate(t_effect_region); /* UNCHECKED */ MCRegionSetRect(t_effect_region, t_effect_area); #ifndef FEATURE_PLATFORM_PLAYER #if defined(FEATURE_QUICKTIME) // MW-2010-07-07: Make sure QT is only loaded if we actually are doing an effect if (t_effects != nil) if (!MCdontuseQTeffects) if (!MCtemplateplayer -> isQTinitted()) MCtemplateplayer -> initqt(); #endif #endif // Lock the screen to prevent any updates occuring until we want them. MCRedrawLockScreen(); // By default, we have not aborted. r_abort = False; MCGImageRef t_initial_image; t_initial_image = MCGImageRetain(m_snapshot); while(t_effects != nil) { uint32_t t_duration; t_duration = MCU_max(1, MCeffectrate / (t_effects -> speed - VE_VERY)); if (t_effects -> type == VE_DISSOLVE) t_duration *= 2; uint32_t t_delta; t_delta = 0; // Create surface at effect_area size. // Render into surface based on t_effects -> image MCGImageRef t_final_image = nil; // If this isn't a plain effect, then we must fetch first and last images. if (t_effects -> type != VE_PLAIN) { // Render the final image. MCGContextRef t_context = nil; // IM-2014-05-20: [[ GraphicsPerformance ]] Create opaque context for snapshot /* UNCHECKED */ MCGContextCreate(t_device_rect.width, t_device_rect.height, false, t_context); MCGContextTranslateCTM(t_context, -t_device_rect.x, -t_device_rect.y); // IM-2013-10-03: [[ FullscreenMode ]] Apply device transform to context MCGContextConcatCTM(t_context, t_transform); // Configure the context. MCGContextClipToRect(t_context, MCRectangleToMCGRectangle(t_user_rect)); // Render an appropriate image switch(t_effects -> image) { case VE_INVERSE: { MCContext *t_old_context = nil; /* UNCHECKED */ t_old_context = new MCGraphicsContext(t_context); curcard->draw(t_old_context, t_user_rect, false); delete t_old_context; MCGContextSetFillRGBAColor(t_context, 1.0, 1.0, 1.0, 1.0); MCGContextSetBlendMode(t_context, kMCGBlendModeDifference); MCGContextAddRectangle(t_context, MCRectangleToMCGRectangle(t_user_rect)); MCGContextFill(t_context); } break; case VE_BLACK: MCGContextSetFillRGBAColor(t_context, 0.0, 0.0, 0.0, 1.0); MCGContextAddRectangle(t_context, MCRectangleToMCGRectangle(t_user_rect)); MCGContextFill(t_context); break; case VE_WHITE: MCGContextSetFillRGBAColor(t_context, 1.0, 1.0, 1.0, 1.0); MCGContextAddRectangle(t_context, MCRectangleToMCGRectangle(t_user_rect)); MCGContextFill(t_context); break; case VE_GRAY: MCGContextSetFillRGBAColor(t_context, 0.5, 0.5, 0.5, 1.0); MCGContextAddRectangle(t_context, MCRectangleToMCGRectangle(t_user_rect)); MCGContextFill(t_context); break; default: { MCContext *t_old_context = nil; /* UNCHECKED */ t_old_context = new MCGraphicsContext(t_context); curcard->draw(t_old_context, t_user_rect, false); delete t_old_context; } } /* UNCHECKED */ MCGContextCopyImage(t_context, t_final_image); MCGContextRelease(t_context); } MCStackEffectContext t_context; t_context.delta = t_delta; t_context.duration = t_duration; t_context.effect = t_effects; t_context.effect_area = t_device_rect; t_context.initial_image = t_initial_image; t_context.final_image = t_final_image; // MW-2011-10-20: [[ Bug 9824 ]] Make sure dst point is correct. // Initialize the destination with the start image. view_platform_updatewindowwithcallback(t_effect_region, MCStackRenderInitial, &t_context); // If there is a sound, then start playing it. if (t_effects -> sound != NULL) { MCAudioClip *acptr; MCNewAutoNameRef t_sound; /* UNCHECKED */ MCNameCreate(t_effects->sound, &t_sound); if ((acptr = (MCAudioClip *)getobjname(CT_AUDIO_CLIP, *t_sound)) == NULL) { IO_handle stream; if ((stream = MCS_open(t_effects->sound, kMCOpenFileModeRead, True, False, 0)) != NULL) { acptr = new MCAudioClip; acptr->setdisposable(); if (!acptr->import(t_effects->sound, stream)) { delete acptr; acptr = NULL; } MCS_close(stream); } } if (acptr != NULL) { MCU_play_stop(); MCacptr = acptr; MCU_play(); #ifndef FEATURE_PLATFORM_AUDIO if (MCacptr != NULL) MCscreen->addtimer(MCacptr, MCM_internal, PLAY_RATE); #endif } if (MCscreen->wait((real8)MCsyncrate / 1000.0, False, True)) { r_abort = True; break; } } // Initialize CoreImage of QTEffects if needed. if (t_effects -> type != VE_PLAIN) { MCAutoPointer<char> t_name; /* UNCHECKED */ MCStringConvertToCString(t_effects -> name, &t_name); #ifdef _MAC_DESKTOP // IM-2013-08-29: [[ ResIndependence ]] use scaled effect rect for CI effects if (t_effects -> type == VE_UNDEFINED && MCCoreImageEffectBegin(*t_name, t_initial_image, t_final_image, t_device_rect, t_device_height, t_effects -> arguments)) t_effects -> type = VE_CIEFFECT; else #endif #ifdef FEATURE_QUICKTIME_EFFECTS // IM-2013-08-29: [[ ResIndependence ]] use scaled effect rect for QT effects if (t_effects -> type == VE_UNDEFINED && MCQTEffectBegin(t_effects -> type, *t_name, t_effects -> direction, t_initial_image, t_final_image, t_device_rect)) t_effects -> type = VE_QTEFFECT; #else ; #endif } // Run effect // Now perform the effect loop, but only if there is something to do. if (t_effects -> type != VE_PLAIN || old_blendlevel != blendlevel) { // Calculate timing parameters. double t_start_time; t_start_time = 0.0; for(;;) { t_context.delta = t_delta; Boolean t_drawn = False; view_platform_updatewindowwithcallback(t_effect_region, MCStackRenderEffect, &t_context); // Now redraw the window with the new image. // if (t_drawn) { MCscreen -> sync(getw()); } // Update the window's blendlevel (if needed) if (old_blendlevel != blendlevel) { float t_fraction = float(t_delta) / t_duration; setopacity(uint1((old_blendlevel * 255 + (float(blendlevel) - old_blendlevel) * 255 * t_fraction) / 100)); } // If the start time is zero, then start counting from here. if (t_start_time == 0.0) t_start_time = MCS_time(); // If we've reached the end of the transition, we are done. if (t_delta == t_duration) { #ifdef _ANDROID_MOBILE // MW-2011-12-12: [[ Bug 9907 ]] Make sure we let the screen sync at this point MCscreen -> wait(0.01, False, False); #endif break; } // Get the time now. double t_now; t_now = MCS_time(); // Compute the new delta value. uint32_t t_new_delta; t_new_delta = (uint32_t)ceil((t_now - t_start_time) * 1000.0); // If the new value is same as the old, then advance one step. if (t_new_delta == t_delta) t_delta = t_new_delta + 1; else t_delta = t_new_delta; // If the new delta is beyond the end point, set it to the end. if (t_delta > t_duration) t_delta = t_duration; // Wait until the next boundary, making sure we break for no reason // other than abort. if (MCscreen -> wait((t_start_time + (t_delta / 1000.0)) - t_now, False, False)) r_abort = True; // If we aborted, we render the final step and are thus done. if (r_abort) t_delta = t_duration; } } #ifdef _MAC_DESKTOP if (t_effects -> type == VE_CIEFFECT) MCCoreImageEffectEnd(); else #endif #ifdef FEATURE_QUICKTIME_EFFECTS if (t_effects -> type == VE_QTEFFECT) MCQTEffectEnd(); #endif // Free initial surface. MCGImageRelease(t_initial_image); // initial surface becomes final surface. t_initial_image = t_final_image; t_final_image = nil; // Move to the next effect. MCEffectList *t_current_effect; t_current_effect = t_effects; t_effects = t_effects -> next; delete t_current_effect; } // Make sure the pixmaps are freed and any dangling effects // are cleaned up. if (t_effects != NULL) { /* OVERHAUL - REVISIT: error cleanup needs revised */ MCGImageRelease(t_initial_image); // MCGSurfaceRelease(t_final_image); while(t_effects != NULL) { MCEffectList *t_current_effect; t_current_effect = t_effects; t_effects = t_effects -> next; delete t_current_effect; } } MCRegionDestroy(t_effect_region); MCGImageRelease(m_snapshot); m_snapshot = nil; m_snapshot = t_initial_image; // Unlock the screen. MCRedrawUnlockScreen(); // Unlock messages. MClockmessages = t_old_lockmessages; // Turn off effect mode. state &= ~CS_EFFECT; // The stack's blendlevel is now the new one. old_blendlevel = blendlevel; // Finally, mark the affected area of the stack for a redraw. dirtyrect(p_area); }
void MCDispatch::dodrop(bool p_source) { if (!m_drag_end_sent && MCdragsource != NULL && (MCdragdest == NULL || MCdragaction == DRAG_ACTION_NONE)) { // We are only the source m_drag_end_sent = true; MCdragsource -> message(MCM_drag_end); // OK-2008-10-21 : [[Bug 7316]] - Cursor in script editor follows mouse after dragging to non-Revolution target. // I have no idea why this apparently only happens in the script editor, but this seems to fix it and doesn't seem too risky :) // MW-2008-10-28: [[ Bug 7316 ]] - This happens because the script editor is doing stuff with drag messages // causing the default engine behaviour to be overriden. In this case, some things have to happen to the field // when the drag is over. Note that we have to check that the source was a field in this case since we don't // need to do anything if it is not! if (MCdragsource -> gettype() == CT_FIELD) { MCField *t_field; t_field = static_cast<MCField *>(MCdragsource); t_field -> setstate(False, CS_DRAG_TEXT); t_field -> computedrag(); t_field -> getstack() -> resetcursor(True); } return; } if (p_source) return; // Setup global variables for a field drop MCdropfield = NULL; MCdropchar = 0; int4 t_start_index, t_end_index; t_start_index = t_end_index = 0; if (MCdragdest != NULL && MCdragdest -> gettype() == CT_FIELD) { MCdropfield = static_cast<MCField *>(MCdragdest); if (MCdragdest -> getstate(CS_DRAG_TEXT)) { MCdropfield -> locmark(False, False, False, False, True, t_start_index, t_end_index); MCdropchar = t_start_index; } } // If source is a field and the engine handled the start of the drag operation bool t_auto_source; t_auto_source = MCdragsource != NULL && MCdragsource -> gettype() == CT_FIELD && MCdragsource -> getstate(CS_SOURCE_TEXT); // If dest is a field and the engine handled the accepting of the operation bool t_auto_dest; t_auto_dest = MCdragdest != NULL && MCdragdest -> gettype() == CT_FIELD && MCdragdest -> getstate(CS_DRAG_TEXT); if (t_auto_source && t_auto_dest && MCdragsource == MCdragdest) { // Source and target is the same field MCField *t_field; t_field = static_cast<MCField *>(MCdragsource); int4 t_from_start_index, t_from_end_index; t_field -> selectedmark(False, t_from_start_index, t_from_end_index, False, False); // We are dropping in the target selection - so just send the messages and do nothing if (t_start_index >= t_from_start_index && t_start_index < t_from_end_index) { t_field -> message(MCM_drag_drop); t_field -> message(MCM_drag_end); t_field -> setstate(False, CS_DRAG_TEXT); t_field -> computedrag(); t_field -> getstack() -> resetcursor(True); return; } if (t_field -> message(MCM_drag_drop) != ES_NORMAL) { MCParagraph *t_paragraphs; t_paragraphs = MCdragdata -> FetchParagraphs(MCdropfield); // MW-2012-02-16: [[ Bug ]] Bracket any actions that result in // textChanged message by a lock screen pair. MCRedrawLockScreen(); if (MCdragaction == DRAG_ACTION_MOVE) { MCdropfield -> movetext(t_paragraphs, t_start_index); Ustruct *us = MCundos->getstate(); if (us != NULL && us->type == UT_MOVE_TEXT) MCdropfield->seltext(us -> ud.text.index, us -> ud.text.index + us->ud.text.newchars, False, True); } else { MCdropfield -> seltext(t_start_index, t_start_index, True); MCdropfield -> pastetext(t_paragraphs, true); Ustruct *us = MCundos->getstate(); if (us != NULL && us->type == UT_TYPE_TEXT) MCdropfield->seltext(t_start_index, t_start_index + us->ud.text.newchars, False, True); } // MW-2012-02-16: [[ Bug ]] Bracket any actions that result in // textChanged message by a lock screen pair. MCRedrawUnlockScreen(); // MW-2012-02-08: [[ TextChanged ]] Invoke textChanged as this method // was called as a result of a user action (result of drop in field). MCactivefield -> textchanged(); } MCdropfield->setstate(False, CS_DRAG_TEXT); MCdropfield->computedrag(); MCdropfield -> getstack() -> resetcursor(True); return; } int4 t_src_start, t_src_end; t_src_start = t_src_end = 0; if (t_auto_source) static_cast<MCField *>(MCdragsource) -> selectedmark(False, t_src_start, t_src_end, False, False); bool t_auto_drop; t_auto_drop = MCdragdest != NULL && MCdragdest -> message(MCM_drag_drop) != ES_NORMAL; if (t_auto_dest && t_auto_drop && MCdragdata != NULL && MCdropfield != NULL) { // MW-2012-02-16: [[ Bug ]] Bracket any actions that result in // textChanged message by a lock screen pair. MCRedrawLockScreen(); // Process an automatic drop action MCdropfield -> seltext(t_start_index, t_start_index, True); MCParagraph *t_paragraphs; t_paragraphs = MCdragdata -> FetchParagraphs(MCdropfield); MCdropfield -> pastetext(t_paragraphs, true); Ustruct *us = MCundos->getstate(); if (us != NULL && us->type == UT_TYPE_TEXT) MCdropfield->seltext(t_start_index, t_start_index + us->ud.text.newchars, False, True); MCdropfield->setstate(False, CS_DRAG_TEXT); MCdropfield->computedrag(); MCdropfield -> getstack() -> resetcursor(True); // MW-2012-02-16: [[ Bug ]] Bracket any actions that result in // textChanged message by a lock screen pair. MCRedrawUnlockScreen(); // MW-2012-02-08: [[ TextChanged ]] Invoke textChanged as this method // was called as a result of a user action (drop from different field). MCactivefield -> textchanged(); } else if (MCdropfield != NULL) { MCdropfield->setstate(False, CS_DRAG_TEXT); MCdropfield->computedrag(); MCdropfield -> getstack() -> resetcursor(True); } bool t_auto_end; if (MCdragsource != NULL) { m_drag_end_sent = true; t_auto_end = MCdragsource -> message(MCM_drag_end) != ES_NORMAL; } else t_auto_end = false; if (t_auto_source && t_auto_end && MCdragsource != NULL && MCdragaction == DRAG_ACTION_MOVE) { // MW-2012-02-16: [[ Bug ]] Bracket any actions that result in // textChanged message by a lock screen pair. MCRedrawLockScreen(); static_cast<MCField *>(MCdragsource) -> deletetext(t_src_start, t_src_end); MCRedrawUnlockScreen(); // MW-2012-02-08: [[ TextChanged ]] Invoke textChanged as this method // was called as a result of a user action (move from one field to another). MCactivefield -> textchanged(); } }
bool MCDispatch::dopaste(MCObject*& r_objptr, bool p_explicit) { r_objptr = NULL; if (MCactivefield != NULL) { MCParagraph *t_paragraphs; t_paragraphs = MCclipboarddata -> FetchParagraphs(MCactivefield); // if (t_paragraphs != NULL) { // MW-2012-03-16: [[ Bug ]] Fetch the current active field since it can be // unset as a result of pasting (due to scrollbarDrag). MCField *t_field; t_field = MCactivefield; // MW-2012-02-16: [[ Bug ]] Bracket any actions that result in // textChanged message by a lock screen pair. MCRedrawLockScreen(); t_field -> pastetext(t_paragraphs, true); MCRedrawUnlockScreen(); // MW-2012-02-08: [[ TextChanged ]] Invoke textChanged as this method // was called as a result of a user action (paste cmd, paste key). t_field -> textchanged(); return true; } } if (MCactiveimage != NULL && MCclipboarddata -> HasImage()) { MCSharedString *t_data; t_data = MCclipboarddata -> Fetch(TRANSFER_TYPE_IMAGE); if (t_data != NULL) { MCExecPoint ep(NULL, NULL, NULL); ep . setsvalue(t_data -> Get()); MCImage *t_image; t_image = new MCImage; t_image -> open(); t_image -> openimage(); t_image -> setprop(0, P_TEXT, ep, False); MCactiveimage -> pasteimage(t_image); t_image -> closeimage(); t_image -> close(); delete t_image; t_data -> Release(); } return true; } if (MCdefaultstackptr != NULL && (p_explicit || MCdefaultstackptr -> gettool(MCdefaultstackptr) == T_POINTER)) { MCObject *t_objects; t_objects = NULL; if (!MCclipboarddata -> Lock()) return false; if (MCclipboarddata -> HasObjects()) { MCSharedString *t_data; t_data = MCclipboarddata -> Fetch(TRANSFER_TYPE_OBJECTS); if (t_data != NULL) { t_objects = MCObject::unpickle(t_data, MCdefaultstackptr); t_data -> Release(); } } else if (MCclipboarddata -> HasImage()) { MCSharedString *t_data; t_data = MCclipboarddata -> Fetch(TRANSFER_TYPE_IMAGE); if (t_data != NULL) { MCExecPoint ep(NULL, NULL, NULL); ep . setsvalue(t_data -> Get()); t_objects = new MCImage(*MCtemplateimage); t_objects -> open(); t_objects -> setprop(0, P_TEXT, ep, False); t_objects -> close(); t_data -> Release(); } } MCclipboarddata -> Unlock(); // if (t_objects != NULL) { MCselected -> clear(False); MCselected -> lockclear(); while(t_objects != NULL) { MCObject *t_object; t_object = t_objects -> remove(t_objects); t_object -> paste(); // OK-2009-04-02: [[Bug 7881]] - Parentscripts broken by cut and pasting object t_object -> resolveparentscript(); if (t_object -> getparent() == NULL) delete t_object; else r_objptr = t_object; } MCselected -> unlockclear(); return true; } } return false; }