diff --git a/uppsrc/CtrlCore/Ctrl.cpp b/uppsrc/CtrlCore/Ctrl.cpp index 0fb5d36f8..a559f08ce 100644 --- a/uppsrc/CtrlCore/Ctrl.cpp +++ b/uppsrc/CtrlCore/Ctrl.cpp @@ -47,6 +47,8 @@ int Ctrl::OverPaint() const { return 0; } void Ctrl::Activate() {} void Ctrl::Deactivate() {} +void Ctrl::DeactivateBy(Ctrl *) {} + void Ctrl::CancelMode() {} void Ctrl::MouseEnter(Point p, dword keyflags) {} void Ctrl::LeftDown(Point p, dword keyflags) {} diff --git a/uppsrc/CtrlCore/CtrlCore.h b/uppsrc/CtrlCore/CtrlCore.h index 15318540f..1d4112e37 100644 --- a/uppsrc/CtrlCore/CtrlCore.h +++ b/uppsrc/CtrlCore/CtrlCore.h @@ -796,6 +796,7 @@ public: virtual void Activate(); virtual void Deactivate(); + virtual void DeactivateBy(Ctrl *new_focus); virtual Image FrameMouseEvent(int event, Point p, int zdelta, dword keyflags); virtual Image MouseEvent(int event, Point p, int zdelta, dword keyflags); diff --git a/uppsrc/CtrlCore/CtrlKbd.cpp b/uppsrc/CtrlCore/CtrlKbd.cpp index 82306c2c6..c034b7c9d 100644 --- a/uppsrc/CtrlCore/CtrlKbd.cpp +++ b/uppsrc/CtrlCore/CtrlKbd.cpp @@ -144,6 +144,7 @@ void Ctrl::DoDeactivate(Ptr pfocusCtrl, Ptr nfocusCtrl) Ctrl *ntop = nfocusCtrl ? nfocusCtrl->GetTopCtrl() : NULL; LLOG("DoDeactivate " << UPP::Name(ptop) << " in favor of " << UPP::Name(ntop)); if(ntop != ptop && !ptop->destroying) { + ptop->DeactivateBy(ntop); ptop->Deactivate(); if(ptop) ptop->StateH(DEACTIVATE); diff --git a/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp b/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp index a5c2f48cd..ca5cb04c4 100644 --- a/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp +++ b/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp @@ -293,6 +293,16 @@ foreground or changing its caption).&] [s5;:Ctrl`:`:Deactivate`(`):%- [@(0.0.255) virtual] [@(0.0.255) void]_[* Deactivate]()&] [s2;b17;a17; This method is called when Ctrl is top`-level and is deactivated `- focus has gone outside of Ctrl and its child Ctrls.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:Ctrl`:`:DeactivateBy`(Upp`:`:Ctrl`*`):%- [@(0.0.255) virtual] +[@(0.0.255) void]_[* DeactivateBy]([_^Upp`:`:Ctrl^ Ctrl]_`*[*@3 new`_focus])&] +[s2; Similar to Deactivate without parameter, but if a widget that +caused deactivation by getting a focus is part of the same appliaction, +[%-*@3 new`_focus] contains a pointer to it. If deactivation is +caused by switching to another application, this parameter is +NULL. Both variants of Deactivate are called, the variant with +paremeter is called first.&] [s3;%- &] [s4;%- &] [s5;:Ctrl`:`:FrameMouseEvent`(int`,Point`,int`,dword`):%- [@(0.0.255) virtual] diff --git a/uppsrc/ide/ide.cpp b/uppsrc/ide/ide.cpp index 57ea46f0e..fb99a9351 100644 --- a/uppsrc/ide/ide.cpp +++ b/uppsrc/ide/ide.cpp @@ -354,14 +354,14 @@ void Ide::CycleFiles() } } -void Ide::Deactivate() +void Ide::DeactivateBy(Ctrl *new_focus) { - if(deactivate_save && issaving == 0) { + if(deactivate_save && issaving == 0 && !new_focus && editor.GetLength() < 1000000) { DeactivationSave(true); SaveFile(); DeactivationSave(false); } - TopWindow::Deactivate(); + TopWindow::DeactivateBy(new_focus); } void Ide::Activate() diff --git a/uppsrc/ide/ide.h b/uppsrc/ide/ide.h index 85fa7f9ea..eba98b52e 100644 --- a/uppsrc/ide/ide.h +++ b/uppsrc/ide/ide.h @@ -329,7 +329,7 @@ public: virtual void FileRename(const String& nm); virtual bool FileRemove(); virtual void DragAndDrop(Point p, PasteClip& d); - virtual void Deactivate(); + virtual void DeactivateBy(Ctrl *new_focus); virtual void Activate(); virtual void Layout();