Merged 47382:
Fix Raise and Lower to leave all other sibilng views in the order they were in. Copyright 2007 Software 2000 Ltd. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@47446 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -967,15 +967,78 @@ bool wxWindow::SetFont(const wxFont& font)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CocoaWindowCompareFunctionResult CocoaRaiseWindowCompareFunction(id first, id second, void *target)
|
#if 0 // these are used when debugging the algorithm.
|
||||||
|
static char const * const comparisonresultStrings[] =
|
||||||
|
{ "<"
|
||||||
|
, "=="
|
||||||
|
, ">"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class CocoaWindowCompareContext
|
||||||
{
|
{
|
||||||
|
DECLARE_NO_COPY_CLASS(CocoaWindowCompareContext)
|
||||||
|
public:
|
||||||
|
CocoaWindowCompareContext(); // Not implemented
|
||||||
|
CocoaWindowCompareContext(NSView *target, NSArray *subviews)
|
||||||
|
{
|
||||||
|
m_target = target;
|
||||||
|
// Cocoa sorts subviews in-place.. make a copy
|
||||||
|
m_subviews = [subviews copy];
|
||||||
|
}
|
||||||
|
~CocoaWindowCompareContext()
|
||||||
|
{ // release the copy
|
||||||
|
[m_subviews release];
|
||||||
|
}
|
||||||
|
NSView* target()
|
||||||
|
{ return m_target; }
|
||||||
|
NSArray* subviews()
|
||||||
|
{ return m_subviews; }
|
||||||
|
/* Helper function that returns the comparison based off of the original ordering */
|
||||||
|
CocoaWindowCompareFunctionResult CompareUsingOriginalOrdering(id first, id second)
|
||||||
|
{
|
||||||
|
NSUInteger firstI = [m_subviews indexOfObjectIdenticalTo:first];
|
||||||
|
NSUInteger secondI = [m_subviews indexOfObjectIdenticalTo:second];
|
||||||
|
// NOTE: If either firstI or secondI is NSNotFound then it will be NSIntegerMax and thus will
|
||||||
|
// likely compare higher than the other view which is reasonable considering the only way that
|
||||||
|
// can happen is if the subview was added after our call to subviews but before the call to
|
||||||
|
// sortSubviewsUsingFunction:context:. Thus we don't bother checking. Particularly because
|
||||||
|
// that case should never occur anyway because that would imply a multi-threaded GUI call
|
||||||
|
// which is a big no-no with Cocoa.
|
||||||
|
|
||||||
|
// Subviews are ordered from back to front meaning one that is already lower will have an lower index.
|
||||||
|
NSComparisonResult result = (firstI < secondI)
|
||||||
|
? NSOrderedAscending /* -1 */
|
||||||
|
: (firstI > secondI)
|
||||||
|
? NSOrderedDescending /* 1 */
|
||||||
|
: NSOrderedSame /* 0 */;
|
||||||
|
|
||||||
|
#if 0 // Enable this if you need to debug the algorithm.
|
||||||
|
NSLog(@"%@ [%d] %s %@ [%d]\n", first, firstI, comparisonresultStrings[result+1], second, secondI);
|
||||||
|
#endif
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
/* The subview we are trying to Raise or Lower */
|
||||||
|
NSView *m_target;
|
||||||
|
/* A copy of the original array of subviews */
|
||||||
|
NSArray *m_subviews;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Causes Cocoa to raise the target view to the top of the Z-Order by telling the sort function that
|
||||||
|
* the target view is always higher than every other view. When comparing two views neither of
|
||||||
|
* which is the target, it returns the correct response based on the original ordering
|
||||||
|
*/
|
||||||
|
static CocoaWindowCompareFunctionResult CocoaRaiseWindowCompareFunction(id first, id second, void *ctx)
|
||||||
|
{
|
||||||
|
CocoaWindowCompareContext *compareContext = (CocoaWindowCompareContext*)ctx;
|
||||||
// first should be ordered higher
|
// first should be ordered higher
|
||||||
if(first==target)
|
if(first==compareContext->target())
|
||||||
return NSOrderedDescending;
|
return NSOrderedDescending;
|
||||||
// second should be ordered higher
|
// second should be ordered higher
|
||||||
if(second==target)
|
if(second==compareContext->target())
|
||||||
return NSOrderedAscending;
|
return NSOrderedAscending;
|
||||||
return NSOrderedSame;
|
return compareContext->CompareUsingOriginalOrdering(first,second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Raise the window to the top of the Z order
|
// Raise the window to the top of the Z order
|
||||||
@@ -983,29 +1046,47 @@ void wxWindow::Raise()
|
|||||||
{
|
{
|
||||||
// wxAutoNSAutoreleasePool pool;
|
// wxAutoNSAutoreleasePool pool;
|
||||||
NSView *nsview = GetNSViewForSuperview();
|
NSView *nsview = GetNSViewForSuperview();
|
||||||
[[nsview superview] sortSubviewsUsingFunction:
|
NSView *superview = [nsview superview];
|
||||||
|
CocoaWindowCompareContext compareContext(nsview, [superview subviews]);
|
||||||
|
|
||||||
|
[superview sortSubviewsUsingFunction:
|
||||||
CocoaRaiseWindowCompareFunction
|
CocoaRaiseWindowCompareFunction
|
||||||
context: nsview];
|
context: &compareContext];
|
||||||
}
|
}
|
||||||
|
|
||||||
static CocoaWindowCompareFunctionResult CocoaLowerWindowCompareFunction(id first, id second, void *target)
|
/* Causes Cocoa to lower the target view to the bottom of the Z-Order by telling the sort function that
|
||||||
|
* the target view is always lower than every other view. When comparing two views neither of
|
||||||
|
* which is the target, it returns the correct response based on the original ordering
|
||||||
|
*/
|
||||||
|
static CocoaWindowCompareFunctionResult CocoaLowerWindowCompareFunction(id first, id second, void *ctx)
|
||||||
{
|
{
|
||||||
|
CocoaWindowCompareContext *compareContext = (CocoaWindowCompareContext*)ctx;
|
||||||
// first should be ordered lower
|
// first should be ordered lower
|
||||||
if(first==target)
|
if(first==compareContext->target())
|
||||||
return NSOrderedAscending;
|
return NSOrderedAscending;
|
||||||
// second should be ordered lower
|
// second should be ordered lower
|
||||||
if(second==target)
|
if(second==compareContext->target())
|
||||||
return NSOrderedDescending;
|
return NSOrderedDescending;
|
||||||
return NSOrderedSame;
|
return compareContext->CompareUsingOriginalOrdering(first,second);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lower the window to the bottom of the Z order
|
// Lower the window to the bottom of the Z order
|
||||||
void wxWindow::Lower()
|
void wxWindow::Lower()
|
||||||
{
|
{
|
||||||
NSView *nsview = GetNSViewForSuperview();
|
NSView *nsview = GetNSViewForSuperview();
|
||||||
[[nsview superview] sortSubviewsUsingFunction:
|
NSView *superview = [nsview superview];
|
||||||
|
CocoaWindowCompareContext compareContext(nsview, [superview subviews]);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
NSLog(@"Target:\n%@\n", nsview);
|
||||||
|
NSLog(@"Before:\n%@\n", compareContext.subviews());
|
||||||
|
#endif
|
||||||
|
[superview sortSubviewsUsingFunction:
|
||||||
CocoaLowerWindowCompareFunction
|
CocoaLowerWindowCompareFunction
|
||||||
context: nsview];
|
context: &compareContext];
|
||||||
|
#if 0
|
||||||
|
NSLog(@"After:\n%@\n", [superview subviews]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
|
bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
|
||||||
|
Reference in New Issue
Block a user