diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 9e25fd67c..1fb04e710 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -210,10 +210,25 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", if (shouldRemoveLastObject) [objectValue removeObjectAtIndex:_selectedRange.location]; - [objectValue insertObject:token atIndex:_selectedRange.location]; + // Give the delegate a chance to confirm, replace or add to the list of tokens being added. + var delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:_selectedRange.location], + delegateApprovedObjectsCount = [delegateApprovedObjects count]; + if (delegateApprovedObjects) + { + for (var i = 0; i < delegateApprovedObjectsCount; i++) + { + [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; + } + } + + // Put the cursor after the last inserted token. var location = _selectedRange.location; + [self setObjectValue:objectValue]; - _selectedRange = CPMakeRange(location + 1, 0); + + if (delegateApprovedObjectsCount) + location += delegateApprovedObjectsCount; + _selectedRange = CPMakeRange(location, 0); [self _inputElement].value = @""; [self setNeedsLayout]; @@ -1175,7 +1190,19 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // // return an array of represented objects you want to add. // // If you want to reject the add, return an empty array. // // returning nil will cause an error. -// - (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)tokens atIndex:(NSUInteger)index; +- (CPArray)tokenField:(CPTokenField)tokenField shouldAddObjects:(CPArray)tokens atIndex:(int)index +{ + var delegate = [self delegate]; + if ([delegate respondsToSelector:@selector(tokenField:shouldAddObjects:atIndex:)]) + { + var approvedObjects = [delegate tokenField:tokenField shouldAddObjects:tokens atIndex:index]; + if (approvedObjects !== nil) + return approvedObjects; + } + + return tokens; +} + // // // If you return nil or don't implement these delegate methods, we will assume // // editing string = display string = represented object diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 2bed398b6..933e03c90 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -426,6 +426,7 @@ CPTexturedBackgroundWindowMask // Create a generic content view. [self setContentView:[[CPView alloc] initWithFrame:CGRectMakeZero()]]; + [self setInitialFirstResponder:[self contentView]]; _firstResponder = self; @@ -480,7 +481,7 @@ CPTexturedBackgroundWindowMask [self close]; _platformWindow = aPlatformWindow; - [_platformWindow setTitle:_title]; + [_platformWindow _setTitle:_title window:self]; if (wasVisible) [self orderFront:self]; @@ -950,6 +951,12 @@ CPTexturedBackgroundWindowMask var bounds = CGRectMake(0.0, 0.0, CGRectGetWidth(_frame), CGRectGetHeight(_frame)); + // During init the initial first responder is set to the contentView + // if it hasn't changed in the mean time we need to update that reference + // to the new contentView + if ([self initialFirstResponder] === _contentView) + [self setInitialFirstResponder:aView]; + _contentView = aView; [_contentView setFrame:[self contentRectForFrameRect:bounds]]; @@ -1274,17 +1281,17 @@ CPTexturedBackgroundWindowMask - (BOOL)acceptsFirstResponder { - return YES; + return NO; } -- (id)initialFirstResponder +- (CPView)initialFirstResponder { return _initialFirstResponder; } -- (void)setInitialFirstResponder:(id)aResponder +- (void)setInitialFirstResponder:(CPView)aView { - _initialFirstResponder = aResponder; + _initialFirstResponder = aView; } /*! @@ -1360,7 +1367,7 @@ CPTexturedBackgroundWindowMask _title = aTitle; [_windowView setTitle:aTitle]; - [_platformWindow setTitle:_title]; + [_platformWindow _setTitle:_title window:self]; [self _synchronizeMenuBarTitleWithWindowTitle]; } @@ -2487,30 +2494,70 @@ CPTexturedBackgroundWindowMask - (void)selectNextKeyView:(id)sender { + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) + [self recalculateKeyViewLoop]; + + var nextValidKeyView = nil; + if ([_firstResponder isKindOfClass:[CPView class]]) - [self selectKeyViewFollowingView:_firstResponder]; + nextValidKeyView = [_firstResponder nextValidKeyView]; + + if (!nextValidKeyView) + { + var initialFirstResponder = [self initialFirstResponder]; + + if ([initialFirstResponder acceptsFirstResponder]) + nextValidKeyView = initialFirstResponder; + else + nextValidKeyView = [initialFirstResponder nextValidKeyView]; + } + + [self makeFirstResponder:nextValidKeyView]; } - (void)selectPreviousKeyView:(id)sender { + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) + [self recalculateKeyViewLoop]; + + var previousValidKeyView = nil; + if ([_firstResponder isKindOfClass:[CPView class]]) - [self selectKeyViewPrecedingView:_firstResponder]; + previousValidKeyView = [_firstResponder previousValidKeyView]; + + if (!previousValidKeyView) + { + var initialFirstResponder = [self initialFirstResponder]; + + if ([initialFirstResponder acceptsFirstResponder]) + previousValidKeyView = initialFirstResponder; + else + previousValidKeyView = [initialFirstResponder previousValidKeyView]; + } + + [self makeFirstResponder:previousValidKeyView]; } - (void)selectKeyViewFollowingView:(CPView)aView { - if (_keyViewLoopIsDirty) + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) [self recalculateKeyViewLoop]; - [self makeFirstResponder:[aView nextValidKeyView]]; + var nextValidKeyView = [aView nextValidKeyView]; + + if ([nextValidKeyView isKindOfClass:[CPView class]]) + [self makeFirstResponder:nextValidKeyView]; } - (void)selectKeyViewPrecedingView:(CPView)aView { - if (_keyViewLoopIsDirty) + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) [self recalculateKeyViewLoop]; - [self makeFirstResponder:[aView previousValidKeyView]]; + var previousValidKeyView = [aView previousValidKeyView]; + + if ([previousValidKeyView isKindOfClass:[CPView class]]) + [self makeFirstResponder:previousValidKeyView]; } /*! @@ -2598,9 +2645,11 @@ CPTexturedBackgroundWindowMask var allViews = function(aWindow) { - var views = [[aWindow contentView] subviews], - index = 0; + var views = [CPArray arrayWithObject:[aWindow contentView]]; + [views addObjectsFromArray:[[aWindow contentView] subviews]]; + + var index = 0; for (; index < views.length; ++index) views = views.concat([views[index] subviews]); diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index 2d47ce96e..4526cbd19 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -259,12 +259,12 @@ var PrimaryPlatformWindow = NULL; return [CPPlatform isBrowser]; } -- (void)setTitle:(CPString)aTitle +- (void)_setTitle:(CPString)aTitle window:(CPWindow)aWindow { _title = aTitle; #if PLATFORM(DOM) - if (_DOMWindow && _DOMWindow.document) + if (_DOMWindow && _DOMWindow.document && (aWindow === [CPApp mainWindow])) _DOMWindow.document.title = _title; #endif } diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 66b847748..58ab7269e 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -541,7 +541,8 @@ var ModifierKeyCodes = [ // FIXME: cpSetFrame? _DOMWindow.document.write(""); _DOMWindow.document.close(); - _DOMWindow.document.title = _title; + if (self != [CPPlatformWindow primaryPlatformWindow]) + _DOMWindow.document.title = _title; if (![CPPlatform isBrowser]) { diff --git a/Foundation/CPArray+KVO.j b/Foundation/CPArray+KVO.j index 395e0fd59..9c03d5ca1 100644 --- a/Foundation/CPArray+KVO.j +++ b/Foundation/CPArray+KVO.j @@ -131,7 +131,7 @@ _replaceManySEL = sel_getName(@"replace" + capitalizedKey + "AtIndexes:with" + capitalizedKey + ":"); if ([_proxyObject respondsToSelector:_replaceManySEL]) - _replace = [_proxyObject methodForSelector:_replaceManySEL]; + _replaceMany = [_proxyObject methodForSelector:_replaceManySEL]; _objectAtIndexSEL = sel_getName(@"objectIn" + capitalizedKey + "AtIndex:"); if ([_proxyObject respondsToSelector:_objectAtIndexSEL]) @@ -233,10 +233,25 @@ - (id)objectAtIndex:(unsigned)anIndex { - if (_objectAtIndex) - return _objectAtIndex(_proxyObject, _objectAtIndexSEL, anIndex); + return [[self objectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex]] firstObject]; +} - return [[self _representedObject] objectAtIndex:anIndex]; +- (CPArray)objectsAtIndexes:(CPIndexSet)theIndexes +{ + if (_objectsAtIndexes) + return _objectsAtIndexes(_proxyObject, _objectsAtIndexesSEL, theIndexes); + if (_objectAtIndex) + { + var index = CPNotFound, + objects = []; + + while ((index = [theIndexes indexGreaterThanIndex:index]) !== CPNotFound) + objects.push(_objectAtIndex(_proxyObject, _objectAtIndexSEL, index)); + + return objects; + } + + return [[self _representedObject] objectsAtIndexes:theIndexes]; } - (void)addObject:(id)anObject @@ -288,37 +303,111 @@ [self removeObject:anObject inRange:CPMakeRange(0, [self count])]; } -- (void)removeLastObject +- (void)removeObjectsInArray:(CPArray)theObjects +{ + if (_removeMany) + { + var indexes = [CPIndexSet indexSet], + index = [theObjects count]; + + while (index--) + [indexes addIndex:[self indexOfObject:[theObjects objectAtIndex:index]]]; + + _removeMany(_proxyObject, _removeManySEL, indexes); + } + else if (_remove) + { + var index = [theObjects count]; + while (index--) + _remove(_proxyObject, _removeSEL, [self indexOfObject:[theObjects objectAtIndex:index]]); + } + else + { + var target = [[self _representedObject] copy]; + [target removeObjectsInArray:theObjects]; + [self _setRepresentedObject:target]; + } +} + +- (void)removeObject:(id)theObject inRange:(CPRange)theRange { if (_remove) - return _remove(_proxyObject, _removeSEL, [self count] - 1); + _remove(_proxyObject, _removeSEL, [self indexOfObject:theObject inRange:theRange]); + else if (_removeMany) + { + var index = [self indexOfObject:theObject inRange:theRange]; + _removeMany(_proxyObject, _removeManySEL, [CPIndexSet indexSetWithIndex:index]); + } + else + { + var index; - var target = [[self _representedObject] copy]; + while ((index = [self indexOfObject:theObject inRange:theRange]) !== CPNotFound) + { + [self removeObjectAtIndex:index]; + theRange = CPIntersectionRange(CPMakeRange(index, length - index), theRange); + } + } +} - [target removeLastObject]; - [self _setRepresentedObject:target]; +- (void)removeLastObject +{ + [self removeObjectsAtIndexes:[CPIndexSet indexSetWithIndex:[self count] - 1]]; } - (void)removeObjectAtIndex:(unsigned)anIndex { - if (_remove) - return _remove(_proxyObject, _removeSEL, anIndex); + [self removeObjectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex]]; +} - var target = [[self _representedObject] copy]; +- (void)removeObjectsAtIndexes:(CPIndexSet)theIndexes +{ + if (_removeMany) + _removeMany(_proxyObject, _removeManySEL, theIndexes); + else if (_remove) + { + var index = [theIndexes lastIndex]; - [target removeObjectAtIndex:anIndex]; - [self _setRepresentedObject:target]; + while (index !== CPNotFound) + { + _remove(_proxyObject, _removeSEL, index) + index = [theIndexes indexLessThanIndex:index]; + } + } + else + { + var target = [[self _representedObject] copy]; + [target removeObjectsAtIndexes:theIndexes]; + [self _setRepresentedObject:target]; + } } - (void)replaceObjectAtIndex:(unsigned)anIndex withObject:(id)anObject { - if (_replace) - return _replace(_proxyObject, _replaceSEL, anIndex, anObject); + [self replaceObjectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] withObjects:[anObject]] +} - var target = [[self _representedObject] copy]; +- (void)replaceObjectsAtIndexes:(CPIndexSet)theIndexes withObjects:(CPArray)theObjects +{ + if (_replaceMany) + return _replaceMany(_proxyObject, _replaceManySEL, theIndexes, theObjects); + else if (_replace) + { + var i = 0, + index = [theIndexes firstIndex]; - [target replaceObjectAtIndex:anIndex withObject:anObject]; - [self _setRepresentedObject:target]; + while (index !== CPNotFound) + { + _replace(_proxyObject, _replaceSEL, index, [theObjects objectAtIndex:i++]); + index = [theIndexes indexGreaterThanIndex:index]; + } + } + else + { + var target = [[self _representedObject] copy]; + [target replaceObjectsAtIndexes:theIndexes withObjects:theObjects]; + [self _setRepresentedObject:target]; + } } @end diff --git a/Jakefile b/Jakefile index be6eff3d5..3d2b5d0aa 100644 --- a/Jakefile +++ b/Jakefile @@ -160,6 +160,10 @@ function generateDocs(/* boolean */ noFrame) rm_rf($DOCUMENTATION_BUILD); mv("debug.txt", FILE.join("Documentation", "debug.txt")); mv("Documentation", $DOCUMENTATION_BUILD); + + // There is a bug in doxygen 1.7.x preventing loading correctly the custom CSS + // So let's do it manually + cp(FILE.join(documentationDir, "doxygen.css"), FILE.join($DOCUMENTATION_BUILD, "html", "doxygen.css")); } } diff --git a/Tests/AppKit/CPWindowTest.j b/Tests/AppKit/CPWindowTest.j index ca465c673..0ef64e874 100644 --- a/Tests/AppKit/CPWindowTest.j +++ b/Tests/AppKit/CPWindowTest.j @@ -5,15 +5,108 @@ @implementation CPWindowTest : OJTestCase { - CPWindow theWindow; + CPWindow _window @accessors(property=window); } --(void)testCanAllocWindow +- (void)setUp { - theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0,0,200,150) - styleMask:CPWindowNotSizable]; + _window = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0) + styleMask:CPWindowNotSizable]; +} - [self assertTrue:!!theWindow]; +- (void)testCanAllocWindow +{ + [self assertTrue:!![self window]]; +} + +- (void)testThatContentViewIsInitialFirstResponder +{ + var contentView = [[self window] contentView]; + [self assert:contentView + equals:[[self window] initialFirstResponder] + message:@"The window's content view must be the initial first responder"]; +} + +- (void)testKeyViewLoop +{ + var contentView = [[self window] contentView], + textField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100.0]; + + [textField setFrame:CGRectMake(100.0, 100.0, 100.0, 26.0)]; + [contentView addSubview:textField]; + [[self window] recalculateKeyViewLoop]; + + var nextTextField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100]; + [nextTextField setFrame:CGRectMake(100.0, 200.0, 100.0, 26.0)]; + [contentView addSubview:nextTextField]; + [[self window] recalculateKeyViewLoop]; + + // Test nextKeyView + [self assert:textField + equals:[contentView nextKeyView] + message:@"textField should be the next key view of contentView"]; + + [self assert:nextTextField + equals:[textField nextKeyView] + message:@"nextTextField should be the next key view of textField"]; + + [self assert:contentView + equals:[nextTextField nextKeyView] + message:@"contentView should be the next key view of nextTextField"]; + + // Test previousKeyView + [self assert:contentView + equals:[textField previousKeyView] + message:@"contentView should be the previous key view of textField"]; + + [self assert:textField + equals:[nextTextField previousKeyView] + message:@"textField should be the previous key view of nextTextField"]; + + [self assert:nextTextField + equals:[contentView previousKeyView] + message:@"nextTextField should be the previous key view of contentView"]; +} + +- (void)testValiKeyViewLoop +{ + var contentView = [[self window] contentView], + textField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100.0]; + + [textField setFrame:CGRectMake(100.0, 100.0, 100.0, 26.0)]; + [contentView addSubview:textField]; + [[self window] recalculateKeyViewLoop]; + + var nextTextField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100]; + [nextTextField setFrame:CGRectMake(100.0, 200.0, 100.0, 26.0)]; + [contentView addSubview:nextTextField]; + [[self window] recalculateKeyViewLoop]; + + // Test nextValidKeyView + [self assert:textField + equals:[contentView nextValidKeyView] + message:@"textField should be the next valid key view of contentView"]; + + [self assert:nextTextField + equals:[textField nextValidKeyView] + message:@"nextTextField should be the next valid key view of textField"]; + + [self assert:textField + equals:[nextTextField nextValidKeyView] + message:@"textField should be the next key valid view of nextTextField"]; + + // Test previousValidKeyView + [self assert:nextTextField + equals:[textField previousValidKeyView] + message:@"nextTextField should be the previous valid key view of textField"]; + + [self assert:textField + equals:[nextTextField previousValidKeyView] + message:@"textField should be the previous key valid view of nextTextField"]; + + [self assert:nextTextField + equals:[contentView previousValidKeyView] + message:@"nextTextField should be the previous valid key view of contentView"]; } @end \ No newline at end of file diff --git a/Tests/Foundation/CPKVCArrayTest.j b/Tests/Foundation/CPKVCArrayTest.j new file mode 100644 index 000000000..52f087856 --- /dev/null +++ b/Tests/Foundation/CPKVCArrayTest.j @@ -0,0 +1,396 @@ +var COUNTER; + +@implementation CPKVCArrayTest : OJTestCase +{ + TestObject _object @accessors(property=object); + ImplementedTestObject _implementedObject @accessors(property=implementedObject); +} + +- (void)setUp +{ + _object = [[TestObject alloc] init]; + _implementedObject = [[ImplementedTestObject alloc] init]; + + COUNTER = 0; +} + +- (void)_patchSelector:(SEL)theSelector +{ + var method_dtable = [[self object] class].method_dtable, + method_list = [[self object] class].method_list, + selectorsToRemove = [@selector(countOfValues), @selector(objectInValuesAtIndex), + @selector(objectInValuesAtIndex:), @selector(valuesAtIndexes:), + @selector(insertObject:inValuesAtIndex:), @selector(insertValues:atIndexes:), + @selector(removeObjectFromValuesAtIndex:), @selector(removeValuesAtIndexes:), + @selector(removeObjectFromValuesAtIndex:), + @selector(replaceObjectInValuesAtIndex:withObject:), + @selector(replaceValuesAtIndexes:withValues:)], + selectorIndex = [selectorsToRemove count]; + + while (selectorIndex--) + { + var selector = [selectorsToRemove objectAtIndex:selectorIndex], + implementation = method_dtable[selector]; + + if (!implementation) + continue; + + delete method_dtable[selector] + [method_list removeObject:implementation]; + } + + var method = class_getInstanceMethod([[self implementedObject] class], theSelector), + implementation = method_getImplementation(method); + + class_addMethod([[self object] class], theSelector, implementation); +} + +- (void)testUsesCountOfKey +{ + [self _patchSelector:@selector(countOfValues)]; + + var count = [[[self object] mutableArrayValueForKey:@"values"] count]; + + [self assert:10 equals:count message:@"countOfValues should return 10"]; + [self assert:1 equals:COUNTER message:@"countOfValues should have been called once"] +} + +- (void)testObjectAtIndexUsesObjectInKeyAtIndex +{ + [self _patchSelector:@selector(objectInValuesAtIndex:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + object = [values objectAtIndex:0]; + + [self assert:0 equals:object] + [self assert:1 equals:COUNTER message:@"objectInValuesAtIndex: should have been called once"]; +} + +- (void)testObjectsAtIndexesUsesObjectInKeyAtIndex +{ + [self _patchSelector:@selector(objectInValuesAtIndex:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + objects = [values objectsAtIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)]]; + + [self assert:[0, 1] equals:objects] + [self assert:2 equals:COUNTER message:@"objectInValuesAtIndex: should have been called once"]; +} + +- (void)testObjectAtIndexUsesKeyAtIndexes +{ + [self _patchSelector:@selector(valuesAtIndexes:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + object = [values objectAtIndex:0]; + + [self assert:0 equals:object] + [self assert:1 equals:COUNTER message:@"valuesAtIndexes: should have been called once"]; +} + +- (void)testObjectsAtIndexesUsesKeyAtIndexes +{ + [self _patchSelector:@selector(valuesAtIndexes:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + objects = [values objectsAtIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)]]; + + [self assert:[0, 1] equals:objects] + [self assert:1 equals:COUNTER message:@"valuesAtIndexes: should have been called once"]; +} + +- (void)testInsertObjectAtIndexUsesInsertKeyAtIndex +{ + [self _patchSelector:@selector(insertObject:inValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] insertObject:11 atIndex:10]; + + [self assert:11 equals:[[[self object] values] objectAtIndex:10]]; + [self assert:1 equals:COUNTER message:@"insertObject:inValuesAtIndex: should have been called once"]; +} + +- (void)testInsertObjectsAtIndexesUsesInsertKeyAtIndex +{ + [self _patchSelector:@selector(insertObject:inValuesAtIndex:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(10, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] insertObjects:[11, 12] atIndexes:indexes]; + + [self assert:[11, 12] equals:[[[self object] values] objectsAtIndexes:indexes]]; + [self assert:2 + equals:COUNTER + message:@"insertValues:atIndexes: should have been called once for each object"]; +} + +- (void)testInsertObjectAtIndexUsesInsertKeyAtIndexes +{ + [self _patchSelector:@selector(insertValues:atIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] insertObject:11 atIndex:10]; + + [self assert:11 equals:[[[self object] values] objectAtIndex:10]]; + [self assert:1 equals:COUNTER message:@"insertValues:atIndexes: should have been called once"]; +} + +- (void)testInsertObjectsAtIndexesUsesInsertKeyAtIndexes +{ + [self _patchSelector:@selector(insertValues:atIndexes:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(10, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] insertObjects:[11, 12] atIndexes:indexes]; + + [self assert:[11, 12] equals:[[[self object] values] objectsAtIndexes:indexes]]; + [self assert:1 + equals:COUNTER + message:@"insertValues:atIndexes: should have been called once for each object"]; +} + +- (void)testRemoveObjectAtIndexUsesRemoveObjectFromKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectAtIndex:0]; + + [self assert:[1, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeObjectFromValuesAtIndex: should have been called once"]; +} + +- (void)testRemoveObjectAtIndexesUsesRemoveObjectFromKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsAtIndexes:indexes]; + + [self assert:[2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:2 equals:COUNTER message:@"removeValuesAtIndex: should have been called once for each object"]; +} +- (void)testRemoveObjectsAtIndexesUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectAtIndex:0]; + + [self assert:[1, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"removeValuesAtIndexes: should have been once for each object"]; +} + +- (void)testRemoveObjectsAtIndexesUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(3, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsAtIndexes:indexes]; + + [self assert:[0, 1, 2, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testRemoveObjectUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObject:1]; + + [self assert:[0, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:"removeObjectFromValuesAtIndex: should have been called once"] +} + +- (void)testeRemoveObjectUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObject:5]; + + [self assert:[0, 1, 2, 3, 4, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testRemoveObjectsInArrayUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsInArray:[3, 6]]; + + [self assert:[0, 1, 2, 4, 5, 7, 8, 9] equals:[[self object] values]]; + [self assert:2 equals:COUNTER message:"removeObjectFromValuesAtIndex: should have been called once"] +} + +- (void)testRemoveObjectsInArrayUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsInArray:[0, 9]]; + + [self assert:[1, 2, 3, 4, 5, 6, 7, 8] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testRemoveLastObjectUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeLastObject]; + + [self assert:[0, 1, 2, 3, 4, 5, 6, 7, 8] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:"removeObjectFromValuesAtIndex: should have been called once"] +} + +- (void)testRemoveLastObjectUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeLastObject]; + + [self assert:[0, 1, 2, 3, 4, 5, 6, 7, 8] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testReplaceObjectAtIndexWithObjectUsesReplaceObjectInKeyAtIndexWithObject +{ + [self _patchSelector:@selector(replaceObjectInValuesAtIndex:withObject:)]; + + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectAtIndex:0 withObject:1]; + + [self assert:[1, 1, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"replaceObjectInValuesAtIndex:withObject: should have been called once"]; +} + +- (void)testReplaceObjectsAtIndexesWithObjectsUsesReplaceObjectInKeyAtIndexWithObject +{ + [self _patchSelector:@selector(replaceObjectInValuesAtIndex:withObject:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(5, 3)]; + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectsAtIndexes:indexes withObjects:[1, 2, 3]]; + + [self assert:[0, 1, 2, 3, 4, 1, 2, 3, 8, 9] equals:[[self object] values]]; + [self assert:3 + equals:COUNTER + message:@"replaceObjectInValuesAtIndex:withObject: should have been called once"]; +} + +- (void)testReplaceObjectAtIndexWithObjectUsesReplaceKeyAtIndexesWithKeys +{ + [self _patchSelector:@selector(replaceValuesAtIndexes:withValues:)]; + + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectAtIndex:5 withObject:6]; + + [self assert:[0, 1, 2, 3, 4, 6, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"replaceObjectInValuesAtIndex:withObject: should have been called once"]; +} + +- (void)testReplaceObjectsAtIndexesWithObjectsUsesReplaceKeyAtIndexesWithKeys +{ + [self _patchSelector:@selector(replaceValuesAtIndexes:withValues:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(6, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectsAtIndexes:indexes withObjects:[7, 8]]; + + [self assert:[0, 1, 2, 3, 4, 5, 7, 8, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"replaceObjectInValuesAtIndexes:withValues: should have been called once"]; +} + +@end + +@implementation TestObject : CPObject +{ + CPArray _values @accessors(property=values); +} + +- (id)init +{ + if (self = [super init]) + { + _values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + } + + return self; +} + +@end + +@implementation ImplementedTestObject : TestObject +{ +} + +- (int)countOfValues +{ + // CPLog.warn(@"countOfValues"); + + COUNTER += 1; + return [[self values] count]; +} + +- (id)objectInValuesAtIndex:(int)theIndex +{ + // CPLog.warn(@"objectInValuesAtIndex: %@", theIndex); + + COUNTER += 1; + return [[self values] objectAtIndex:theIndex]; +} + +- (CPArray)valuesAtIndexes:(CPIndexSet)theIndexes +{ + // CPLog.warn(@"valuesAtIndexes: %@", theIndexes); + + COUNTER += 1; + return [[self values] objectsAtIndexes:theIndexes]; +} + +- (void)insertObject:(id)theObject inValuesAtIndex:(int)theIndex +{ + // CPLog.warn(@"insertObject: %@ inValuesAtIndex: %@", theObject, theIndex); + + COUNTER += 1; + [[self values] insertObject:theObject atIndex:theIndex]; +} + +- (void)insertValues:(CPArray)theObjects atIndexes:(CPIndexSet)theIndexes +{ + // CPLog.warn(@"insertValues: %@ atIndexes: %@", theObjects, theIndexes); + + COUNTER += 1; + [[self values] insertObjects:theObjects atIndexes:theIndexes]; +} + +- (void)removeObjectFromValuesAtIndex:(int)theIndex +{ + // CPLog.warn(@"removeObjectFromValuesAtIndex: %@", theIndex); + + COUNTER += 1; + [[self values] removeObjectAtIndex:theIndex]; +} + +- (void)removeValuesAtIndexes:(CPIndexSet)theIndexes +{ + // CPLog.warn(@"removeValuesAtIndexes: %@", theIndexes); + + COUNTER += 1; + [[self values] removeObjectsAtIndexes:theIndexes]; +} + +- (void)replaceObjectInValuesAtIndex:(int)theIndex withObject:(id)theObject +{ + // CPLog.warn(@"replaceObjectInValuesAtIndex: %@ withObject: %@", theIndex, theObject); + + COUNTER += 1; + [[self values] replaceObjectAtIndex:theIndex withObject:theObject]; +} + +- (void)replaceValuesAtIndexes:(CPIndexSet)theIndexes withValues:(id)theObjects +{ + // CPLog.warn(@"replaceValuesAtIndexes: %@ withValues: %@", theIndexes, theObjects); + + COUNTER += 1; + [[self values] replaceObjectsAtIndexes:theIndexes withObjects:theObjects]; +} + +@end \ No newline at end of file diff --git a/Tests/Manual/Bindings/README.md b/Tests/Manual/Bindings/README.md deleted file mode 100644 index 0c9922fd9..000000000 --- a/Tests/Manual/Bindings/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Run this application with the current master, and note the following bugs: - -- When you click on any item, there are two selection change notifications instead of one. - -- If you compare the order of the notifications with Cocoa, they are slightly different. - -- The right hand table is configured to allow an empty selection. If you click in the -empty area below the names, there is an empty selection notification, but then the -the current selection changes to the first item and generates another notification. - -- If you select multiple items on the left, there is an error. This is a bug that will -have to be fixed in a later commit. - -If you apply the changes in these commits, the first three bugs are fixed. diff --git a/Tests/Manual/CPTokenFieldTest/AppController.j b/Tests/Manual/CPTokenFieldTest/AppController.j index 9ecc5c027..ea8fc7038 100644 --- a/Tests/Manual/CPTokenFieldTest/AppController.j +++ b/Tests/Manual/CPTokenFieldTest/AppController.j @@ -15,6 +15,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad CPTokenField tokenFieldD; CPArray allPersons; + CPButton manipulateTokenInsertionButton; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification @@ -22,28 +23,28 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], contentView = [theWindow contentView], - tokenFieldA = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 40, 500, 29)], + tokenFieldA = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 40, 500, 30)], label = [[CPTextField alloc] initWithFrame:CGRectMake(15, 15, 500, 24)]; - [label setStringValue:@"This token field has no auto suggestions and uses space to separate tokens."]; + [label setStringValue:"This token field has no auto suggestions and uses space to separate tokens."]; [contentView addSubview:label]; [tokenFieldA setEditable:YES]; - [tokenFieldA setPlaceholderString:@"Type in a token!"]; + [tokenFieldA setPlaceholderString:"Type in a token!"]; [tokenFieldA setTokenizingCharacterSet:[CPCharacterSet characterSetWithCharactersInString:@" "]]; [contentView addSubview:tokenFieldA]; - var tokenFieldB = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 110, 500, 29)], + var tokenFieldB = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 110, 500, 30)], labelB = [[CPTextField alloc] initWithFrame:CGRectMake(15, 80, 500, 24)]; - [labelB setStringValue:@"This token field has no bezel, uses comma to separate tokens and has auto suggest."]; + [labelB setStringValue:"This token field has no bezel, uses comma to separate tokens and has auto suggest."]; [contentView addSubview:labelB]; [tokenFieldB setEditable:YES]; [tokenFieldB setBezeled:NO]; - [tokenFieldB setPlaceholderString:@"Edit me!"]; + [tokenFieldB setPlaceholderString:"Edit me!"]; [tokenFieldB setObjectValue:["Missouri", "California"]]; [tokenFieldB setDelegate:self]; @@ -53,14 +54,18 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [contentView addSubview:tokenFieldB]; - var tokenFieldC = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 170, 500, 29)], + manipulateTokenInsertionButton = [CPCheckBox checkBoxWithTitle:"Token transformations"]; + [manipulateTokenInsertionButton setFrame:CGRectMake(525, 110, 200, 50)]; + [contentView addSubview:manipulateTokenInsertionButton]; + + var tokenFieldC = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 170, 500, 30)], labelC = [[CPTextField alloc] initWithFrame:CGRectMake(15, 150, 500, 24)]; - [labelC setStringValue:@"This token field can't fit all its tokens."]; + [labelC setStringValue:"This token field can't fit all its tokens."]; [contentView addSubview:labelC]; [tokenFieldC setEditable:YES]; - [tokenFieldC setPlaceholderString:@"Edit me!"]; + [tokenFieldC setPlaceholderString:"Edit me!"]; [tokenFieldC setObjectValue:['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado']]; [tokenFieldC setDelegate:self]; @@ -71,10 +76,10 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [tokenFieldC setAction:@selector(tokenFieldAction:)]; [tokenFieldC setTarget:self]; - tokenFieldD = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 230, 500, 29)], + tokenFieldD = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 230, 500, 30)], labelD = [[CPTextField alloc] initWithFrame:CGRectMake(15, 210, 500, 24)]; - [labelD setStringValue:@"This token field contains represented objects."]; + [labelD setStringValue:"This token field contains represented objects."]; [contentView addSubview:labelD]; [tokenFieldD setEditable:YES]; @@ -93,7 +98,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [contentView addSubview:tokenFieldD]; var button = [[CPButton alloc] initWithFrame:CGRectMake(15, 270, 0, 0)]; - [button setTitle:@"Get Object Values"]; + [button setTitle:"Get Object Values"]; [button sizeToFit]; [button setTarget:self]; [button setAction:@selector(getObjectValues:)]; @@ -148,6 +153,25 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad CPLog.info("tokenFieldAction: " + sender); } +- (CPArray)tokenField:tokenField shouldAddObjects:tokens atIndex:index +{ + CPLog.info("tokenField: " + tokenField + " shouldAddObjects: " + tokens + " atIndex: " + index); + + // Texas -> Utah, Michigan -> Michigan & Arkansas, Washington -> nil + + if ([manipulateTokenInsertionButton intValue]) + { + if (tokens[0] == "Texas") + return ["Utah"]; + else if (tokens[0] == "Michigan") + return ["Michigan", "Arkansas"]; + else if (tokens[0] == "Washington") + return []; + } + + return tokens; +} + @end // A sample of a custom Object diff --git a/Tests/Manual/PlatformWindows/AppController.j b/Tests/Manual/PlatformWindows/AppController.j index 9dd9883d4..5025379d5 100644 --- a/Tests/Manual/PlatformWindows/AppController.j +++ b/Tests/Manual/PlatformWindows/AppController.j @@ -37,44 +37,46 @@ platformWindow = [[CPPlatformWindow alloc] init]; -// [platformWindow orderFront:self];//console.log(CPStringFromRect([theWindow contentRectForFrameRect:[theWindow frame]])); + // [platformWindow orderFront:self];//console.log(CPStringFromRect([theWindow contentRectForFrameRect:[theWindow frame]])); [platformWindow setContentRect:[theWindow contentRectForFrameRect:[theWindow frame]]]; - // [theWindow setTitle:@"My Custom Title"]; - //[platformWindow orderFront:self]; - // seriously, this test file is dirty :) var slider = [[theWindow contentView] subviews][0]; [slider setTarget:self]; [slider setAction:@selector(randomTitle:)]; [slider setContinuous:NO]; -window.setTimeout(function(){ - [theWindow orderOut:self]; - [theWindow setPlatformWindow:platformWindow]; - [theWindow orderFront:self]; - [theWindow setFullBridge:YES]; - var button = [[theWindow contentView] subviews][2]; + [theWindow setTitle:"Initial title (pop out pending)"]; + window.setTimeout(function() + { + [theWindow orderOut:self]; + [theWindow setPlatformWindow:platformWindow]; + [theWindow orderFront:self]; + [theWindow setFullBridge:YES]; + var button = [[theWindow contentView] subviews][2]; - [button setTarget:self]; - [button setAction:@selector(close)]; + [button setTarget:self]; + [button setAction:@selector(close)]; + [theWindow setTitle:"Title after pop out (red box pending)"]; - window.setTimeout(function(){ - var view = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; - [view setBackgroundColor:[CPColor redColor]]; - - [[theWindow contentView] addSubview:view];},1000); - - }, 1000); - //window.setTimeout(function() { [platformWindow orderOut:self]; [platformWindow orderFront:self]; }, 2000); + window.setTimeout(function() + { + var view = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + [view setBackgroundColor:[CPColor redColor]]; + [[theWindow contentView] addSubview:view]; + [theWindow setTitle:"Title in final stage"]; + }, 1000); + }, 2000); } - (void)close { [[theWindow platformWindow] orderOut:self]; - window.setTimeout(function(){ - [[theWindow platformWindow] orderFront:self];}, 1000); + window.setTimeout(function() + { + [[theWindow platformWindow] orderFront:self]; + }, 1000); } - (void)another:(id)aSender @@ -84,7 +86,7 @@ window.setTimeout(function(){ - (IBAction)randomTitle:(id)aSender { - [theWindow setTitle:@"Window random number " + Math.random(1000)] + [theWindow setTitle:@"Window random number " + Math.random(1000)]; } @end diff --git a/Tools/Documentation/Cappuccino.doxygen b/Tools/Documentation/Cappuccino.doxygen index b1a35a20a..3bbea5caf 100644 --- a/Tools/Documentation/Cappuccino.doxygen +++ b/Tools/Documentation/Cappuccino.doxygen @@ -25,7 +25,7 @@ DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. -PROJECT_NAME = "Cappuccino API" +PROJECT_NAME = " API" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or @@ -33,6 +33,8 @@ PROJECT_NAME = "Cappuccino API" PROJECT_NUMBER = 0.9.1 +PROJECT_LOGO = ./Tools/Documentation/logo.png + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location @@ -845,7 +847,7 @@ HTML_FOOTER = # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! -HTML_STYLESHEET = ./Tools/Documentation/doxygen.css +#HTML_STYLESHEET = doxygen.css # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index fa16d6d4b..afb8b6006 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -6,7 +6,7 @@ body, table, td, div, p, dl, dd, dt, em { } body, table, div, p { - font: normal 13px "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; + font: 13px normal "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; } table { @@ -18,7 +18,7 @@ pre, code { } p { - margin: 0 0 1em 0; + margin: 1em 0; } dl { @@ -47,52 +47,52 @@ em { h1, h2, h3, h4 { font-family: "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; - margin: 1.5em 0 .5em; + margin: 2em 0 1em 0; } -h1 { - font-size: 150%; +.title { + font-size: 150%; } h2 { - font-size: 120%; + font-size: 120%; } h3 { - font-size: 100%; + font-size: 100%; } dt { - font-weight: bold; + font-weight: bold; } div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { - margin-top: 2px; + margin-top: 2px; } p.endli { - margin-bottom: 0px; + margin-bottom: 0px; } p.enddd { - margin-bottom: 4px; + margin-bottom: 4px; } p.endtd { - margin-bottom: 2px; + margin-bottom: 2px; } /* @end */ caption { - font-weight: bold; + font-weight: bold; } span.legend { @@ -106,18 +106,20 @@ h3.version { } div.qindex, div.navtab { - background-color: #ECEFF6; - border: 1px solid #A4B5D6; - text-align: center; - padding: .25em; + background-color: #ECEFF6; + border: 1px solid #A4B5D6; + text-align: center; + margin: 2px; + padding: 2px; } div.qindex, div.navpath { - line-height: 140%; + width: 100%; + line-height: 140%; } -div.contents div.qindex+table { - margin: 1.5em 15px; +div.qindex+table { + margin: 1.5em; } div.qindex+table td { @@ -129,34 +131,36 @@ div.qindex+table tr td table { } div.navtab { - margin-right: 15px; + margin-right: 15px; } /* @group Link Styling */ a { - color: #2F4697; - font-weight: normal; - text-decoration: none; + color: #439DE0; + font-weight: normal; + text-decoration: none; } .contents a:visited { + color: #439DE0; } a:hover { - text-decoration: underline; - /* background-color: #D5E8FF; */ + text-decoration: none; + color: #62B9ED; + text-shadow: none; } a.qindex { - font-weight: bold; + font-weight: bold; } a.qindexHL { - font-weight: bold; - background-color: #9DAFD3; - color: #ffffff; - border: 1px double #879DC9; + font-weight: bold; + background-color: #9DAFD3; + color: #ffffff; + border: 1px double #879DC9; } .contents a.qindexHL:visited { @@ -164,110 +168,95 @@ a.qindexHL { } a.el { - padding: 1px; + padding: 1px; } a.elRef { } a.code { - color: #4765A1; + color: #4765A1; } a.codeRef { - color: #4765A1; + color: #4765A1; } /* @end */ dl.el { - margin-left: -1cm; + margin-left: -1cm; } .fragment { - font-family: Courier, monospace, fixed; - font-size: 105%; + font-family: Courier, monospace, fixed; + font-size: 105%; } pre.fragment { margin-top: 1em; - border: 1px solid #C5CFE5; - /* background-color: #FBFCFD; */ - padding: 4px 6px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; + border: 1px solid #C5CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; } div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; } div.groupText { - margin-left: 16px; - font-style: italic; + margin-left: 16px; + font-style: italic; } body { - background: white; - color: black; + background-color: white; + color: black; margin: 0; } div.contents { - width: 1024px; - margin: auto; - border: 1px solid #eee; - border-width: 0 1px; - padding: 15px; + margin: 1.5em; } /* If the first element of the contents is a table, give it some space */ div.contents > table { - margin: 1.5em 0 0; -} - -div.contents > p, -div.contents > h1, -div.contents > h2, -div.contents > dl, -.dynheader, -.dynsummary, -.dyncontent { - padding-left: 0; - padding-right: 0; -} - -div.contents hr { - margin-left: -15px; - margin-right: -15px; + margin-top: 1.5em; } td.indexkey { - font-family: Consolas, Menlo, "Lucida Console"; - border-bottom: 1px solid #eee; - padding: .25em 0 .25em .5em; + font-family: Consolas, "Lucida Console"; + padding: .25em 0 .25em .5em; + font-weight: bold; + border-bottom: 1px solid #C5CFE5; + background-color: white; + margin: 4px; } table tr.indexkey:first-child td { @@ -275,9 +264,19 @@ table tr.indexkey:first-child td { } td.indexvalue { - font-family: Consolas, Menlo, "Lucida Console"; - border-bottom: 1px solid #eee; - padding: .25em 0 .25em .5em; + background-color: #ECEFF6; + background-color: white; + border-bottom: 1px solid #C5CFE5; + margin: 2px 0px; + padding: .25em 0 .25em .5em; +} + +tr.memlist { + background-color: #EEF1F7; +} + +table tr.memlist:first-child td { + padding-top: 1.5em; } table tr.memlist > td { @@ -285,9 +284,9 @@ table tr.memlist > td { } tr.memlist td { - font-family: Consolas, Menlo, "Lucida Console"; - padding: .25em 0; - border-bottom: 1px solid #eee; + font-family: Consolas, "Lucida Console"; + padding: .25em 0; + border-bottom: 1px solid #eee; } /* Don't show the [static] column in full member list */ @@ -296,7 +295,7 @@ tr.memlist td code { } p.formulaDsp { - text-align: center; + text-align: center; } img.formulaDsp { @@ -304,155 +303,159 @@ img.formulaDsp { } img.formulaInl { - vertical-align: middle; + vertical-align: middle; } div.center { - text-align: center; + text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { - border: 0px; + border: 0px; } address.footer { - text-align: right; - padding-right: 12px; + text-align: right; + padding-right: 12px; } img.footer { - border: 0px; - vertical-align: middle; + border: 0px; + vertical-align: middle; } /* @group Code Colorization */ span.keyword { - color: #008000 + color: #008000 } span.keywordtype { - color: #604020 + color: #604020 } span.keywordflow { - color: #e08000 + color: #e08000 } span.comment { - color: #A085E4 + color: #A085E4 } span.preprocessor { - color: #806020 + color: #806020 } span.stringliteral { - color: #002080 + color: #002080 } span.charliteral { - color: #008080 + color: #008080 } span.vhdldigit { - color: #ff00ff + color: #ff00ff } span.vhdlchar { - color: #000000 + color: #000000 } span.vhdlkeyword { - color: #700070 + color: #700070 } span.vhdllogic { - color: #ff0000 + color: #ff0000 } /* @end */ /* .search { - color: #003399; - font-weight: bold; + color: #003399; + font-weight: bold; } form.search { - margin-bottom: 0px; - margin-top: 0px; + margin-bottom: 0px; + margin-top: 0px; } input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } */ td.tiny { - font-size: 75%; + font-size: 75%; } .dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A4B5D6; + padding: 4px; + border-collapse: collapse; + border: 1px solid #A4B5D6; } th.dirtab { - background: #ECEFF6; - font-weight: bold; + background: #ECEFF6; + font-weight: bold; } hr { - height: 0px; - border: none; - border-top: 2px solid #ddd; - margin: 1em 0; + height: 0px; + border: none; + border-top: 2px solid #ddd; + margin: 1em 0; } hr.footer { - height: 1px; - margin-top: 0; + height: 1px; } /* @group Member Descriptions */ table.memberdecls { - font-family: Consolas, Menlo, "Lucida Console"; - border-spacing: 0px; - padding: 0px; - margin: 0 !important; + font-family: Consolas, "Lucida Console"; + border-spacing: 0px; + padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { - border: none; - margin: 4px; - padding: .25em 0; + background-color: white; + border: none; + margin: 4px; + padding: .25em 0; } .mdescLeft, .mdescRight { - color: #555; - padding-bottom: 1em; + color: #555; + padding-bottom: 1em; } .memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #ccc; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } +.memItemRight { + width: 100%; +} + .memTemplParams { - color: #4765A1; + color: #4765A1; white-space: nowrap; } @@ -463,58 +466,91 @@ table.memberdecls { /* Styles for detailed member documentation */ .memtemplate { - font-size: 80%; - color: #4765A1; - font-weight: normal; - margin-left: 3px; + font-size: 80%; + color: #4765A1; + font-weight: normal; + margin-left: 9px; } .memnav { - background-color: #ECEFF6; - border: 1px solid #A4B5D6; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; + background-color: #ECEFF6; + border: 1px solid #A4B5D6; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; } .memitem { - padding: 0; - margin-top: .5em; + padding: 0; + margin-top: .5em; + margin-bottom: 10px; } .memname { white-space: nowrap; - font: bold 105% Consolas, Menlo, "Lucida Console"; - margin: .25em 0 .1em .25em; + font: bold 105% Consolas, "Lucida Console"; + margin: .25em 0 0 .25em; } -.memproto { - margin: 2em -15px 0; - border-top: 1px solid #ccc; - padding: 6px 15px; - color: #253554; - background-color: #f7f7f7; - font-family: Consolas, Menlo, "Lucida Console"; - font-weight: bold; -} - -.memdoc { - margin: 0 -15px; - padding: .5em 15px 0; +.memproto, dl.reflist dt { + border-top: 1px solid #BDBDBD; + border-left: 1px solid #BDBDBD; + border-right: 1px solid #BDBDBD; + padding: 6px 0px 6px 0px; + color: #333; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 1px 1px 5px; + -moz-border-radius-topright: 3px; + -moz-border-radius-topleft: 3px; + /* webkit specific markup */ + -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + background-color: #E2E2E2; + padding-left: 9px; } .memdoc > p { margin-top: 0; } +.memdoc, dl.reflist dd { + border-bottom: 1px solid #BDBDBD; + border-left: 1px solid #BDBDBD; + border-right: 1px solid #BDBDBD; + background-color: white; + border-top-width: 0; + /* opera specific markup */ + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-bottomright: 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 1px 1px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); + padding: .8em 12px 0 12px; +} .memdoc dl dd td { padding-right: 1em; - padding-top: .5em; } -.memdoc dl dd table tr:first-child td { - padding-top: 0; +dl.reflist dt { + padding: 5px; } .memdoc dl dd table tr td:first-child { @@ -526,28 +562,54 @@ table.memberdecls { } .memdoc dl dd td em { - font-family: Consolas, Menlo, "Lucida Console"; + font-family: Consolas, "Lucida Console"; font-weight: bold; - white-space: nowrap; + white-space: nowrap; } .paramkey { - text-align: right; + text-align: right; } .paramtype { - white-space: nowrap; - color: #DD6800; + white-space: nowrap; + color: #DD6800; } .paramname { - color: #602020; - white-space: nowrap; + color: #602020; + white-space: nowrap; } .paramname em { - font-style: normal; + font-style: normal; } +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.memdoc .params td { + padding-left: 10px; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + + + + /* @end */ /* @group Directory (tree) */ @@ -555,22 +617,22 @@ table.memberdecls { /* for the tree view */ .ftvtree { - font-family: sans-serif; - margin: 0px; + font-family: sans-serif; + margin: 0px; } /* these are for tree view when used as main index */ .directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; + font-size: 9pt; + font-weight: bold; + margin: 5px; } .directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + margin: 0px; + margin-top: 1em; + font-size: 11pt; } /* @@ -582,194 +644,454 @@ table.memberdecls { /* .directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); } .directory h3.swap span { - display: none; + display: none; } */ .directory > h3 { - margin-top: 0; + margin-top: 0; } .directory p { - margin: 0px; - white-space: nowrap; + margin: 0px; + white-space: nowrap; } .directory div { - display: none; - margin: 0px; + display: none; + margin: 0px; } .directory img { - vertical-align: -30%; + vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { - font-size: 100%; - font-weight: bold; + font-size: 100%; + font-weight: bold; } .directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + margin: 0px; + margin-top: 1em; + font-size: 11pt; } .directory-alt > h3 { - margin-top: 0; + margin-top: 0; } .directory-alt p { - margin: 0px; - white-space: nowrap; + margin: 0px; + white-space: nowrap; } .directory-alt div { - display: none; - margin: 0px; + display: none; + margin: 0px; } .directory-alt img { - vertical-align: -30%; + vertical-align: -30%; } /* @end */ div.dynheader { - margin-top: 8px; -} - -div.dynheader.closed { - margin-bottom: 1em; -} - -div.dyncontent { - margin-bottom: 1em; + margin-top: 8px; } address { - font-style: normal; - color: #2B3D61; + font-style: normal; + color: #2B3D61; } table.doxtable { - border-collapse:collapse; + border-collapse:collapse; } table.doxtable td, table.doxtable th { - border: 1px solid #2E4167; - padding: 3px 7px 2px; + border: 1px solid #2E4167; + padding: 3px 7px 2px; } table.doxtable th { - background-color: #384F7E; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; + background-color: #384F7E; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; } +table.fieldtable { + width: 100%; + margin-bottom: 10px; + border: 1px solid #A9B9D8; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A9B9D8; + border-bottom: 1px solid #A9B9D8; + vertical-align: top; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A9B9D8; + width: 100%; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E3E8F2; + font-size: 90%; + color: #253554; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A9B9D8; +} + + .tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; } .navpath ul { - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - height:30px; - line-height:30px; - color:#8BA0CB; - border:solid 1px #C2CEE4; - overflow:hidden; - margin:0px; - padding:0px; + font-size: 11px; + background: -moz-linear-gradient(-90deg, whiteSmoke, #CCC); + background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); + height:30px; + line-height:30px; + color:#333; + border:solid 1px #CCC; + overflow:hidden; + margin:0px; + padding:0px; } .navpath li { - list-style-type:none; - float:left; - padding-left:10px; - padding-right: 15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#374E7C; + list-style-type:none; + float:left; + padding-left:10px; + padding-right: 15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#374E7C; } -.navpath a +.navpath li.navelem a { - height:32px; - display:block; - text-decoration: none; - outline: none; + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #333; } -.navpath a:hover +.navpath li.navelem a:hover { - color:#6985BC; + color:#6985BC; + text-shadow: none; } +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#374E7C; + font-size: 8pt; +} + + div.summary { - float: right; - font-size: 90%; - width: 50%; - text-align: right; + float: right; + font-size: 90%; + padding-right: 5px; + width: 50%; + text-align: right; + margin-left: 10px; + margin-top: 22px; + margin-right: 10px; + color: #419DE0; } div.summary a { - white-space: nowrap; + white-space: nowrap; + margin-left: 3px; + margin-right: 3px; +} + +div.ingroups +{ + margin-left: 0px; + font-size: 8pt; + padding-left: 0px; + width: 50%; + text-align: left; + margin-top: 2px; +} + +div.ingroups a +{ + white-space: nowrap; } div.header { - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - width: 1024px; - margin: 0 auto; - padding: 1.5em 15px; - border-bottom: 1px solid #C5CFE5; - border-left: 1px solid #eee; - border-right: 1px solid #eee; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C5CFE5; +} + +div.headertitle +{ + padding: 10px 5px 10px 20px; + background: #333; + background: -moz-linear-gradient(-90deg, #444, #333); + background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333)); + color: white; + text-shadow: -1px -1px black; + min-height: 36px; } div.headertitle h1 { - margin: 0; + margin: 0px; } -/* @group Tabs */ +div.headertitle a { + color: #5EB5EB; +} +dl +{ + padding: 0 0 0 10px; +} + +dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug +{ + border-left:4px solid; + padding: 0 0 0 6px; +} + +dl.note +{ + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; + max-height: 55px; + padding-left: 5px; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #CCC; + color: white; + font-weight: bold; + text-shadow: -1px -1px black; + background: #485D77; + background: -moz-linear-gradient(-90deg, #485D77, #252D38); + background: -webkit-gradient(linear, left top, left bottom, from(#485D77), to(#252D38)); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #91A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334974; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } + pre.fragment + { + overflow: visible; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + } +} + + +/* ADDITIONS */ .tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); + background: -moz-linear-gradient(-90deg, #fff, #eee); + background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee)); + border-bottom: 1px solid #ccc; + width: 100%; z-index: 101; font-size: 100%; } -.tabs2 { - font-size: 90%; +.tabs a, .tabs2 a{ + text-align: center; } -.tabs3 { - font-size: 75%; +.tabs2 { + font-size: 90%; } .tablist { @@ -781,9 +1103,9 @@ div.headertitle h1 { .tablist li { float: left; display: table-cell; - background-image: url('tab_b.png'); line-height: 36px; list-style: none; + background: inherit; padding: 0; } @@ -791,32 +1113,173 @@ div.headertitle h1 { display: block; padding: 0 20px; font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #293A5C; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; outline: none; + background: none; + color: #444; + border-right: 1px solid #ccc; +} + +.tablist a:hover { + background: inherit; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; + text-shadow: none; + color: gray; +} + +.tabs3 { + font-size: 75%; + max-height: 20px; + line-height: 0px; +} + +.tabs3 li { + padding: 0px; + margin: 0px; + line-height: 20px; } .tabs3 .tablist a { padding: 0 10px; -} - -.tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; + height: 20px; + padding-top: 0px; + margin-top: 0px; } .tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; + background: -moz-linear-gradient(-90deg, #eee, #fff); + background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#fff)); + color: #444; + text-shadow: 0px 1px 1px #f2f2f2; +} + +.tabs2 li{ + padding: 0px; + margin: 0px; + line-height: 30px; +} + + +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background: -moz-linear-gradient(-90deg, #62B9ED, #308CD9) !important; + background: -webkit-gradient(linear, left top, left bottom, from(#62B9ED), to(#308CD9)) !important; + border-top: 1px solid #308CD9; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); } -/* @end */ +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; + outline:none; + color: #333; +} + +#nav-tree .label { + margin:0px; + padding:0px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + padding:2px; + margin:0px; + color:#fff; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + background: #E8EAEE; + font-size:14px; + overflow:auto; + padding-right: 0px !important; + margin-right: -5px !important; + background: #E8EAEE !important; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: 300px; + background: #E8EAEE; + border:none; +} + +.ui-resizable .ui-resizable-handle { + display:block; + background-image: none !important; +} + +.ui-resizable-e { + background: #CCC !important; + cursor:e-resize; + height:100%; + right:0; + top:0; + width: 1px !important; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} diff --git a/Tools/Documentation/logo.png b/Tools/Documentation/logo.png new file mode 100644 index 000000000..d370088a7 Binary files /dev/null and b/Tools/Documentation/logo.png differ