mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-11-11 01:18:45 +00:00
Merge branch 'master' of https://github.com/cappuccino/cappuccino into table_header_divider_thickness
This commit is contained in:
commit
7044c1cda4
33 files changed
+809
-281
No files matched your search
@@ -12,5 +12,6 @@ xcuserdata/
|
||||
*.xCodeSupport/
|
||||
*.XcodeSupport/
|
||||
*XcodeSupport/
|
||||
Tests/Manual/**/*.xcodeproj
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
+3
-19
@@ -22,6 +22,7 @@
|
||||
|
||||
@import <Foundation/CPBundle.j>
|
||||
|
||||
@import "CPApplication_Constants.j"
|
||||
@import "CPCompatibility.j"
|
||||
@import "CPColorPanel.j"
|
||||
@import "CPCursor.j"
|
||||
@@ -40,24 +41,6 @@ var CPMainCibFile = @"CPMainCibFile",
|
||||
CPMainCibFileHumanFriendly = @"Main cib file base name",
|
||||
CPEventModifierFlags = 0;
|
||||
|
||||
CPApp = nil;
|
||||
|
||||
CPApplicationWillFinishLaunchingNotification = @"CPApplicationWillFinishLaunchingNotification";
|
||||
CPApplicationDidFinishLaunchingNotification = @"CPApplicationDidFinishLaunchingNotification";
|
||||
CPApplicationWillTerminateNotification = @"CPApplicationWillTerminateNotification";
|
||||
CPApplicationWillBecomeActiveNotification = @"CPApplicationWillBecomeActiveNotification";
|
||||
CPApplicationDidBecomeActiveNotification = @"CPApplicationDidBecomeActiveNotification";
|
||||
CPApplicationWillResignActiveNotification = @"CPApplicationWillResignActiveNotification";
|
||||
CPApplicationDidResignActiveNotification = @"CPApplicationDidResignActiveNotification";
|
||||
|
||||
CPTerminateNow = YES;
|
||||
CPTerminateCancel = NO;
|
||||
CPTerminateLater = -1; // not currently supported
|
||||
|
||||
CPRunStoppedResponse = -1000;
|
||||
CPRunAbortedResponse = -1001;
|
||||
CPRunContinuesResponse = -1002;
|
||||
|
||||
/*!
|
||||
@ingroup appkit
|
||||
@class CPApplication
|
||||
@@ -174,7 +157,8 @@ CPRunContinuesResponse = -1002;
|
||||
CPApplicationDidBecomeActiveNotification, @selector(applicationDidBecomeActive:),
|
||||
CPApplicationWillResignActiveNotification, @selector(applicationWillResignActive:),
|
||||
CPApplicationDidResignActiveNotification, @selector(applicationDidResignActive:),
|
||||
CPApplicationWillTerminateNotification, @selector(applicationWillTerminate:)
|
||||
CPApplicationWillTerminateNotification, @selector(applicationWillTerminate:),
|
||||
CPApplicationDidChangeScreenParametersNotification, @selector(applicationDidChangeScreenParameters:)
|
||||
],
|
||||
count = [delegateNotifications count];
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* CPApplication_Constants.j
|
||||
* AppKit
|
||||
*
|
||||
* Created by Aparajita Fishman.
|
||||
* Copyright 2013 The Cappuccino Project
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
CPApp = nil;
|
||||
|
||||
CPApplicationWillFinishLaunchingNotification = @"CPApplicationWillFinishLaunchingNotification";
|
||||
CPApplicationDidFinishLaunchingNotification = @"CPApplicationDidFinishLaunchingNotification";
|
||||
CPApplicationWillTerminateNotification = @"CPApplicationWillTerminateNotification";
|
||||
CPApplicationWillBecomeActiveNotification = @"CPApplicationWillBecomeActiveNotification";
|
||||
CPApplicationDidBecomeActiveNotification = @"CPApplicationDidBecomeActiveNotification";
|
||||
CPApplicationWillResignActiveNotification = @"CPApplicationWillResignActiveNotification";
|
||||
CPApplicationDidResignActiveNotification = @"CPApplicationDidResignActiveNotification";
|
||||
CPApplicationDidChangeScreenParametersNotification = @"CPApplicationDidChangeScreenParametersNotification";
|
||||
|
||||
CPTerminateNow = YES;
|
||||
CPTerminateCancel = NO;
|
||||
CPTerminateLater = -1; // not currently supported
|
||||
|
||||
CPRunStoppedResponse = -1000;
|
||||
CPRunAbortedResponse = -1001;
|
||||
CPRunContinuesResponse = -1002;
|
||||
+33
-24
@@ -448,38 +448,47 @@ CPButtonImageOffset = 3.0;
|
||||
{
|
||||
switch (aButtonType)
|
||||
{
|
||||
case CPMomentaryLightButton: [self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPNoCellMask];
|
||||
break;
|
||||
case CPMomentaryLightButton:
|
||||
[self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPNoCellMask];
|
||||
break;
|
||||
|
||||
case CPMomentaryPushInButton: [self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPNoCellMask];
|
||||
break;
|
||||
case CPMomentaryPushInButton:
|
||||
[self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPNoCellMask];
|
||||
break;
|
||||
|
||||
case CPMomentaryChangeButton: [self setHighlightsBy:CPContentsCellMask];
|
||||
[self setShowsStateBy:CPNoCellMask];
|
||||
break;
|
||||
case CPMomentaryChangeButton:
|
||||
[self setHighlightsBy:CPContentsCellMask];
|
||||
[self setShowsStateBy:CPNoCellMask];
|
||||
break;
|
||||
|
||||
case CPPushOnPushOffButton: [self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPChangeBackgroundCellMask | CPChangeGrayCellMask];
|
||||
break;
|
||||
case CPPushOnPushOffButton:
|
||||
[self setHighlightsBy:CPPushInCellMask | CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPChangeBackgroundCellMask | CPChangeGrayCellMask];
|
||||
break;
|
||||
|
||||
case CPOnOffButton: [self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
break;
|
||||
case CPOnOffButton:
|
||||
[self setHighlightsBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
[self setShowsStateBy:CPChangeGrayCellMask | CPChangeBackgroundCellMask];
|
||||
break;
|
||||
|
||||
case CPToggleButton: [self setHighlightsBy:CPPushInCellMask | CPContentsCellMask];
|
||||
[self setShowsStateBy:CPContentsCellMask];
|
||||
break;
|
||||
case CPToggleButton:
|
||||
[self setHighlightsBy:CPPushInCellMask | CPContentsCellMask];
|
||||
[self setShowsStateBy:CPContentsCellMask];
|
||||
break;
|
||||
|
||||
case CPSwitchButton: [CPException raise:CPInvalidArgumentException
|
||||
reason:"The CPSwitchButton type is not supported in Cappuccino, use the CPCheckBox class instead."];
|
||||
case CPSwitchButton:
|
||||
[CPException raise:CPInvalidArgumentException
|
||||
reason:"The CPSwitchButton type is not supported in Cappuccino, use the CPCheckBox class instead."];
|
||||
|
||||
case CPRadioButton: [CPException raise:CPInvalidArgumentException
|
||||
reason:"The CPRadioButton type is not supported in Cappuccino, use the CPRadio class instead."];
|
||||
case CPRadioButton:
|
||||
[CPException raise:CPInvalidArgumentException
|
||||
reason:"The CPRadioButton type is not supported in Cappuccino, use the CPRadio class instead."];
|
||||
|
||||
default: [CPException raise:CPInvalidArgumentException
|
||||
reason:"Unknown button type."];
|
||||
default:
|
||||
[CPException raise:CPInvalidArgumentException
|
||||
reason:"Unknown button type."];
|
||||
}
|
||||
|
||||
[self setImageDimsWhenDisabled:YES];
|
||||
|
||||
@@ -68,6 +68,11 @@ var _CPEventPeriodicEventPeriod = 0,
|
||||
float _deltaX;
|
||||
float _deltaY;
|
||||
float _deltaZ;
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
BOOL _suppressCappuccinoCut;
|
||||
BOOL _suppressCappuccinoPaste;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -473,6 +478,24 @@ var _CPEventPeriodicEventPeriod = 0,
|
||||
return !firstResponderIsText;
|
||||
}
|
||||
|
||||
/*!
|
||||
Return YES if this event is a part of processing a browser controlled cut or paste event
|
||||
where the browser will go ahead and do the work of cutting or pasting within the input
|
||||
element after processing of this event. The implication is that it should not be done by
|
||||
the CPTextField (or whatever else is controlling the input) since this would result in
|
||||
nothing being cut (because the field already cut the text out), or a double paste
|
||||
(because the field pasted as well as the browser).
|
||||
*/
|
||||
- (BOOL)_platformIsEffectingCutOrPaste
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
return _suppressCappuccinoCut || _suppressCappuccinoPaste;
|
||||
#else
|
||||
return NO;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Generates periodic events every \c aPeriod seconds.
|
||||
|
||||
|
||||
+252
-88
@@ -351,8 +351,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
else
|
||||
[self unsetThemeState:CPThemeStateEditable];
|
||||
|
||||
// We only allow first responder status if the field is editable and enabled.
|
||||
if (!shouldBeEditable && [[self window] firstResponder] === self)
|
||||
// We only allow first responder status if the field is enable, and editable or selectable.
|
||||
if (!(shouldBeEditable && ![self isSelectable]) && [[self window] firstResponder] === self)
|
||||
[[self window] makeFirstResponder:nil];
|
||||
|
||||
if (shouldBeEditable)
|
||||
@@ -377,7 +377,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
{
|
||||
[super setEnabled:shouldBeEnabled];
|
||||
|
||||
// We only allow first responder status if the field is editable and enabled.
|
||||
// We only allow first responder status if the field is enabled.
|
||||
if (!shouldBeEnabled && [[self window] firstResponder] === self)
|
||||
[[self window] makeFirstResponder:nil];
|
||||
}
|
||||
@@ -531,18 +531,21 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
/*! @ignore */
|
||||
- (BOOL)acceptsFirstResponder
|
||||
{
|
||||
return [self isEditable] && [self isEnabled] && [self _isWithinUsablePlatformRect];
|
||||
return ([self isEnabled] && [self isEditable] || [self isSelectable]) && [self _isWithinUsablePlatformRect];
|
||||
}
|
||||
|
||||
/*! @ignore */
|
||||
- (BOOL)becomeFirstResponder
|
||||
{
|
||||
if (![self isEnabled])
|
||||
return NO;
|
||||
|
||||
// As long as we are the first responder we need to monitor the key status of our window.
|
||||
[self _setObserveWindowKeyNotifications:YES];
|
||||
|
||||
_isEditing = NO;
|
||||
|
||||
if ([[self window] isKeyWindow])
|
||||
if ([[self window] isKeyWindow] && [self isEditable])
|
||||
return [self _becomeFirstKeyResponder];
|
||||
|
||||
return YES;
|
||||
@@ -552,6 +555,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
A text field can be the first responder without necessarily being the focus of keyboard input. For example, it might be the first responder of window A but window B is the main and key window. It's important we don't put a focused input field into a text field in a non-key window, even if that field is the first responder, because the key window might also have a first responder text field which the user will expect to receive keyboard input.
|
||||
|
||||
Since a first responder but non-key window text field can't receive input it should not even look like an active text field (Cocoa has a "slightly active" text field look it uses when another window is the key window, but Cappuccino doesn't today.)
|
||||
|
||||
It's also possible for a text field to be non-editable but selectable in which case it can also become the first responder -
|
||||
this is what allows text to be copied from it.
|
||||
*/
|
||||
- (BOOL)_becomeFirstKeyResponder
|
||||
{
|
||||
@@ -560,6 +566,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
if (![self _isWithinUsablePlatformRect])
|
||||
return NO;
|
||||
|
||||
// A selectable but non-editable text field may be the first responder, but never the
|
||||
// first key responder (first key responder indicating editability.)
|
||||
if (![self isEditable])
|
||||
return NO;
|
||||
|
||||
[self setThemeState:CPThemeStateEditing];
|
||||
|
||||
[self _updatePlaceholderState];
|
||||
@@ -680,24 +691,26 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
- (BOOL)resignFirstResponder
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
|
||||
var element = [self _inputElement],
|
||||
newValue = element.value,
|
||||
error = @"";
|
||||
|
||||
if (newValue !== _stringValue)
|
||||
// We might have been the first responder without actually editing.
|
||||
if (_isEditing)
|
||||
{
|
||||
[self _setStringValue:newValue];
|
||||
}
|
||||
var element = [self _inputElement],
|
||||
newValue = element.value,
|
||||
error = @"";
|
||||
|
||||
// If there is a formatter, always give it a chance to reject the resignation,
|
||||
// even if the value has not changed.
|
||||
if ([self _valueIsValid:newValue] === NO)
|
||||
{
|
||||
element.focus();
|
||||
return NO;
|
||||
}
|
||||
if (newValue !== _stringValue)
|
||||
{
|
||||
[self _setStringValue:newValue];
|
||||
}
|
||||
|
||||
// If there is a formatter, always give it a chance to reject the resignation,
|
||||
// even if the value has not changed.
|
||||
if ([self _valueIsValid:newValue] === NO)
|
||||
{
|
||||
element.focus();
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// When we are no longer the first responder we don't worry about the key status of our window anymore.
|
||||
@@ -706,10 +719,13 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
[self _resignFirstKeyResponder];
|
||||
|
||||
_isEditing = NO;
|
||||
[self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:nil]];
|
||||
if ([self isEditable])
|
||||
{
|
||||
[self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidEndEditingNotification object:self userInfo:nil]];
|
||||
|
||||
if ([self sendsActionOnEndEditing])
|
||||
[self sendAction:[self action] to:[self target]];
|
||||
if ([self sendsActionOnEndEditing])
|
||||
[self sendAction:[self action] to:[self target]];
|
||||
}
|
||||
|
||||
[self textDidBlur:[CPNotification notificationWithName:CPTextFieldDidBlurNotification object:self userInfo:nil]];
|
||||
|
||||
@@ -782,6 +798,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)_windowDidBecomeKey:(CPNotification)aNotification
|
||||
{
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
var wind = [self window];
|
||||
|
||||
if ([wind isKeyWindow] && [wind firstResponder] === self)
|
||||
@@ -828,6 +847,17 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
return [self acceptsFirstResponder];
|
||||
}
|
||||
|
||||
- (void)_didEdit
|
||||
{
|
||||
if (!_isEditing)
|
||||
{
|
||||
_isEditing = YES;
|
||||
[self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]];
|
||||
}
|
||||
|
||||
[self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]];
|
||||
}
|
||||
|
||||
- (void)mouseDown:(CPEvent)anEvent
|
||||
{
|
||||
// Don't track! (ever?)
|
||||
@@ -854,7 +884,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)mouseUp:(CPEvent)anEvent
|
||||
{
|
||||
if (![self isSelectable] && (![self isEditable] || ![self isEnabled]))
|
||||
if (![self isEnabled] || !([self isSelectable] || [self isEditable]))
|
||||
[[self nextResponder] mouseUp:anEvent];
|
||||
else if ([self isSelectable])
|
||||
{
|
||||
@@ -866,13 +896,22 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
CPTextFieldCachedSelectStartFunction = nil
|
||||
CPTextFieldCachedDragFunction = nil;
|
||||
}
|
||||
|
||||
// TODO clickCount === 2 should select the clicked word.
|
||||
|
||||
if ([[CPApp currentEvent] clickCount] === 3)
|
||||
{
|
||||
[self selectText:nil];
|
||||
return;
|
||||
}
|
||||
|
||||
return [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)mouseDragged:(CPEvent)anEvent
|
||||
{
|
||||
if (![self isSelectable] && (![self isEditable] || ![self isEnabled]))
|
||||
if (![self isEnabled] || !([self isSelectable] || [self isEditable]))
|
||||
[[self nextResponder] mouseDragged:anEvent];
|
||||
else if ([self isSelectable])
|
||||
return [[[anEvent window] platformWindow] _propagateCurrentDOMEvent:YES];
|
||||
@@ -880,26 +919,21 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)keyUp:(CPEvent)anEvent
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
var newValue = [self _inputElement].value;
|
||||
|
||||
if (newValue !== _stringValue)
|
||||
{
|
||||
[self _setStringValue:newValue];
|
||||
|
||||
if (!_isEditing)
|
||||
{
|
||||
_isEditing = YES;
|
||||
[self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]];
|
||||
}
|
||||
|
||||
[self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]];
|
||||
[self _didEdit];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
[[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)keyDown:(CPEvent)anEvent
|
||||
@@ -932,11 +966,15 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)insertNewline:(id)sender
|
||||
{
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
var newValue = [self _inputElement].value;
|
||||
|
||||
if (newValue !== _stringValue)
|
||||
{
|
||||
[self _setStringValue:newValue];
|
||||
[self _didEdit];
|
||||
}
|
||||
|
||||
if ([self _valueIsValid:_stringValue])
|
||||
@@ -975,6 +1013,9 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)_insertCharacterIgnoringFieldEditor:(CPString)aCharacter
|
||||
{
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
|
||||
var oldValue = _stringValue,
|
||||
@@ -987,13 +1028,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
// NOTE: _stringValue is now the current input element value
|
||||
if (oldValue !== _stringValue)
|
||||
{
|
||||
if (!_isEditing)
|
||||
{
|
||||
_isEditing = YES;
|
||||
[self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]];
|
||||
}
|
||||
|
||||
[self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]];
|
||||
[self _didEdit];
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1243,22 +1278,29 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
- (void)_selectText:(id)sender immediately:(BOOL)immediately
|
||||
{
|
||||
// Selecting the text in a field makes it the first responder
|
||||
if (([self isEditable] || [self isSelectable]))
|
||||
if ([self isEditable] || [self isSelectable])
|
||||
{
|
||||
var wind = [self window];
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
var element = [self _inputElement];
|
||||
|
||||
if ([wind firstResponder] === self)
|
||||
if ([self isEditable])
|
||||
{
|
||||
if (immediately)
|
||||
element.select();
|
||||
else
|
||||
window.setTimeout(function() { element.select(); }, 0);
|
||||
var element = [self _inputElement];
|
||||
|
||||
if ([wind firstResponder] === self)
|
||||
{
|
||||
if (immediately)
|
||||
element.select();
|
||||
else
|
||||
window.setTimeout(function() { element.select(); }, 0);
|
||||
}
|
||||
else if (wind !== nil && [wind makeFirstResponder:self])
|
||||
[self _selectText:sender immediately:immediately];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self setSelectedRange:CPMakeRange(0, _stringValue.length)];
|
||||
}
|
||||
else if (wind !== nil && [wind makeFirstResponder:self])
|
||||
[self _selectText:sender immediately:immediately];
|
||||
#else
|
||||
// Even if we can't actually select the text we need to preserve the first
|
||||
// responder side effect.
|
||||
@@ -1272,16 +1314,30 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
- (void)copy:(id)sender
|
||||
{
|
||||
// First write to the Cappuccino clipboard.
|
||||
var selectedRange = [self selectedRange];
|
||||
var stringToCopy = nil;
|
||||
|
||||
if (selectedRange.length < 1)
|
||||
return;
|
||||
if ([self isEditable])
|
||||
{
|
||||
var selectedRange = [self selectedRange];
|
||||
|
||||
var pasteboard = [CPPasteboard generalPasteboard],
|
||||
stringForPasting = [_stringValue substringWithRange:selectedRange];
|
||||
if (selectedRange.length < 1)
|
||||
return;
|
||||
|
||||
stringToCopy = [_stringValue substringWithRange:selectedRange];
|
||||
}
|
||||
else
|
||||
{
|
||||
// selectedRange won't work if we're displaying our text using a <div>. Instead we have to ask the browser
|
||||
// what's selected and hope it's right in a Cappuccino context as well.
|
||||
#if PLATFORM(DOM)
|
||||
stringToCopy = [[[self window] platformWindow] _selectedText];
|
||||
#endif
|
||||
}
|
||||
|
||||
var pasteboard = [CPPasteboard generalPasteboard];
|
||||
|
||||
[pasteboard declareTypes:[CPStringPboardType] owner:nil];
|
||||
[pasteboard setString:stringForPasting forType:CPStringPboardType];
|
||||
[pasteboard setString:stringToCopy forType:CPStringPboardType];
|
||||
|
||||
if ([CPPlatform isBrowser])
|
||||
{
|
||||
@@ -1292,9 +1348,15 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)cut:(id)sender
|
||||
{
|
||||
if (![self isEnabled])
|
||||
return;
|
||||
|
||||
[self copy:sender];
|
||||
|
||||
if (![CPPlatform isBrowser])
|
||||
if (![self isEditable])
|
||||
return;
|
||||
|
||||
if (![[CPApp currentEvent] _platformIsEffectingCutOrPaste])
|
||||
{
|
||||
[self deleteBackward:sender];
|
||||
}
|
||||
@@ -1311,7 +1373,10 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)paste:(id)sender
|
||||
{
|
||||
if (![CPPlatform isBrowser])
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
if (![[CPApp currentEvent] _platformIsEffectingCutOrPaste])
|
||||
{
|
||||
var pasteboard = [CPPasteboard generalPasteboard];
|
||||
|
||||
@@ -1325,6 +1390,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:pasteString];
|
||||
|
||||
[self setStringValue:newValue];
|
||||
[self _didEdit];
|
||||
[self setSelectedRange:CPMakeRange(selectedRange.location + pasteString.length, 0)];
|
||||
}
|
||||
// If we don't have an oninput listener, we won't detect the change made by the cut and need to fake a key up "soon".
|
||||
@@ -1340,6 +1406,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (CPRange)selectedRange
|
||||
{
|
||||
// TODO Need a way to figure out the selected range if we're not using an input. Need
|
||||
// to get whole document selection and somehow see which part is inside of this text field.
|
||||
if ([[self window] firstResponder] !== self)
|
||||
return CPMakeRange(0, 0);
|
||||
|
||||
@@ -1383,35 +1451,48 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
|
||||
var inputElement = [self _inputElement];
|
||||
|
||||
try
|
||||
if (![self isEditable])
|
||||
{
|
||||
if ([inputElement.selectionStart isKindOfClass:CPNumber])
|
||||
{
|
||||
inputElement.selectionStart = aRange.location;
|
||||
inputElement.selectionEnd = CPMaxRange(aRange);
|
||||
}
|
||||
else
|
||||
{
|
||||
// browsers which don't support selectionStart/selectionEnd (aka IE).
|
||||
var theDocument = inputElement.ownerDocument || inputElement.document,
|
||||
existingRange = theDocument.selection.createRange(),
|
||||
range = inputElement.createTextRange();
|
||||
// No input element - selectable text field only.
|
||||
var contentView = [self layoutEphemeralSubviewNamed:@"content-view"
|
||||
positioned:CPWindowAbove
|
||||
relativeToEphemeralSubviewNamed:@"bezel-view"];
|
||||
|
||||
if (range.inRange(existingRange))
|
||||
if (contentView)
|
||||
[contentView setSelectedRange:aRange];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Input element
|
||||
var inputElement = [self _inputElement];
|
||||
|
||||
try
|
||||
{
|
||||
if ([inputElement.selectionStart isKindOfClass:CPNumber])
|
||||
{
|
||||
range.collapse(true);
|
||||
range.move('character', aRange.location);
|
||||
range.moveEnd('character', aRange.length);
|
||||
range.select();
|
||||
inputElement.selectionStart = aRange.location;
|
||||
inputElement.selectionEnd = CPMaxRange(aRange);
|
||||
}
|
||||
else
|
||||
{
|
||||
// browsers which don't support selectionStart/selectionEnd (aka IE).
|
||||
var theDocument = inputElement.ownerDocument || inputElement.document,
|
||||
existingRange = theDocument.selection.createRange(),
|
||||
range = inputElement.createTextRange();
|
||||
|
||||
if (range.inRange(existingRange))
|
||||
{
|
||||
range.collapse(true);
|
||||
range.move('character', aRange.location);
|
||||
range.moveEnd('character', aRange.length);
|
||||
range.select();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
}
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1422,18 +1503,84 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
|
||||
- (void)deleteBackward:(id)sender
|
||||
{
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
var selectedRange = [self selectedRange];
|
||||
|
||||
if (selectedRange.length < 2)
|
||||
return;
|
||||
if (selectedRange.length < 1)
|
||||
{
|
||||
if (selectedRange.location < 1)
|
||||
return;
|
||||
|
||||
selectedRange.location += 1;
|
||||
selectedRange.length -= 1;
|
||||
// Delete a single element backward from the insertion point if there's no selection.
|
||||
selectedRange.location -= 1;
|
||||
selectedRange.length += 1;
|
||||
}
|
||||
|
||||
var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""];
|
||||
|
||||
[self setStringValue:newValue];
|
||||
[self setSelectedRange:CPMakeRange(selectedRange.location, 0)];
|
||||
[self _didEdit];
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
// Since we just performed the deletion manually, we don't need the browser to do anything else.
|
||||
// (Previously we would allow the event to propagate for the browser to delete 1 character only,
|
||||
// and we'd delete the rest manually. But this meant that if deleteBackward: was called without
|
||||
// it being a browser backspace event, 1 character would be left behind.)
|
||||
[[[self window] platformWindow] _propagateCurrentDOMEvent:NO];
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)delete:(id)sender
|
||||
{
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
// delete: only works when there's a selection (as opposed to deleteForward: and deleteBackward:).
|
||||
var selectedRange = [self selectedRange];
|
||||
|
||||
if (selectedRange.length < 1)
|
||||
return;
|
||||
|
||||
var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""];
|
||||
|
||||
[self setStringValue:newValue];
|
||||
[self setSelectedRange:CPMakeRange(selectedRange.location, 0)];
|
||||
[self _didEdit];
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
// Since we just performed the deletion manually, we don't need the browser to do anything else.
|
||||
[[[self window] platformWindow] _propagateCurrentDOMEvent:NO];
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)deleteForward:(id)sender
|
||||
{
|
||||
if (!([self isEnabled] && [self isEditable]))
|
||||
return;
|
||||
|
||||
var selectedRange = [self selectedRange];
|
||||
|
||||
if (selectedRange.length < 1)
|
||||
{
|
||||
if (selectedRange.location + 1 >= _stringValue.length)
|
||||
return;
|
||||
|
||||
selectedRange.length += 1;
|
||||
}
|
||||
|
||||
var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""];
|
||||
|
||||
[self setStringValue:newValue];
|
||||
[self setSelectedRange:CPMakeRange(selectedRange.location, 0)];
|
||||
[self _didEdit];
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
// Since we just performed the deletion manually, we don't need the browser to do anything else.
|
||||
[[[self window] platformWindow] _propagateCurrentDOMEvent:NO];
|
||||
#endif
|
||||
}
|
||||
|
||||
#pragma mark Setting the Delegate
|
||||
@@ -1614,10 +1761,27 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
{
|
||||
[super viewDidUnhide];
|
||||
|
||||
if ([[self window] firstResponder] === self)
|
||||
if ([self isEditable] && [[self window] firstResponder] === self)
|
||||
[self _becomeFirstKeyResponder];
|
||||
}
|
||||
|
||||
- (BOOL)validateUserInterfaceItem:(id <CPValidatedUserInterfaceItem>)anItem
|
||||
{
|
||||
var theAction = [anItem action];
|
||||
|
||||
if (![self isEditable] && (theAction == @selector(cut:) || theAction == @selector(paste:) || theAction == @selector(delete:)))
|
||||
return NO;
|
||||
|
||||
// FIXME - [self selectedRange] is always empty if we're not an editable field, so we must assume yes here.
|
||||
if (![self isEditable])
|
||||
return YES;
|
||||
|
||||
if (theAction == @selector(copy:) || theAction == @selector(cut:) || theAction == @selector(delete:))
|
||||
return [self selectedRange].length;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark Private
|
||||
|
||||
- (BOOL)_isWithinUsablePlatformRect
|
||||
|
||||
+42
-13
@@ -735,6 +735,10 @@ CPTexturedBackgroundWindowMask
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Constrain a frame so that the window remains at least partially visible on screen,
|
||||
moving or resizing the frame as necessary.
|
||||
*/
|
||||
- (CGRect)_constrainFrame:(CGRect)aFrame toUsableScreenWidth:(BOOL)constrainWidth andHeight:(BOOL)constrainHeight
|
||||
{
|
||||
var frame = CGRectMakeCopy(aFrame);
|
||||
@@ -759,7 +763,7 @@ CPTexturedBackgroundWindowMask
|
||||
if (CGRectGetWidth(frame) > usableWidth)
|
||||
{
|
||||
frame.origin.x = CGRectGetMinX(usableRect);
|
||||
frame.size.width = usableWidth;
|
||||
frame.size.width = MAX(usableWidth, _minSize.width);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -778,13 +782,20 @@ CPTexturedBackgroundWindowMask
|
||||
if (CGRectGetHeight(frame) > usableHeight)
|
||||
{
|
||||
frame.origin.y = CGRectGetMinY(usableRect);
|
||||
frame.size.height = usableHeight;
|
||||
frame.size.height = MAX(usableHeight, _minSize.height);
|
||||
}
|
||||
}
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
/*
|
||||
Constrain the origin of a frame such that:
|
||||
|
||||
- The window view's minimum resize width is kept onscreen at the left/right of the window.
|
||||
- The top of the window is kept below the top of the usable content.
|
||||
- The top of the contentView + CPWindowMinVisibleVerticalMargin is kept above the bottom of the usable content.
|
||||
*/
|
||||
- (CGRect)_constrainOriginOfFrame:(CGRect)aFrame
|
||||
{
|
||||
var frame = CGRectMakeCopy(aFrame);
|
||||
@@ -792,19 +803,20 @@ CPTexturedBackgroundWindowMask
|
||||
if (!_constrainsToUsableScreen || !_isVisible)
|
||||
return frame;
|
||||
|
||||
/*
|
||||
- CPWindowMinVisibleHorizontalMargin is kept onscreen at the left/right of the window.
|
||||
- The top of the window is kept below the top of the usable content.
|
||||
- The top of the contentView + CPWindowMinVisibleVerticalMargin is kept above the bottom of the usable content.
|
||||
*/
|
||||
var usableRect = [_platformWindow usableContentFrame],
|
||||
maxUsableY = CGRectGetMaxY(usableRect) - CGRectGetMinY([_contentView frame]) - CPWindowMinVisibleVerticalMargin;
|
||||
minimumSize = [_windowView _minimumResizeSize];
|
||||
|
||||
frame.origin.x = MAX(frame.origin.x, CGRectGetMinX(usableRect) + CPWindowMinVisibleHorizontalMargin - CGRectGetWidth(frame));
|
||||
frame.origin.x = MIN(frame.origin.x, CGRectGetMaxX(usableRect) - CPWindowMinVisibleHorizontalMargin);
|
||||
// First constrain x so that at least CPWindowMinVisibleHorizontalMargin is visible on the right
|
||||
frame.origin.x = MAX(frame.origin.x, CGRectGetMinX(usableRect) + minimumSize.width - CGRectGetWidth(frame));
|
||||
|
||||
// Now constrain x so that at least CPWindowMinVisibleHorizontalMargin is visible on the left
|
||||
frame.origin.x = MIN(frame.origin.x, CGRectGetMaxX(usableRect) - minimumSize.width);
|
||||
|
||||
// Now constrain y so that it is below the top of the usable content
|
||||
frame.origin.y = MAX(frame.origin.y, CGRectGetMinY(usableRect));
|
||||
frame.origin.y = MIN(frame.origin.y, maxUsableY);
|
||||
|
||||
// Finally constrain y so that at least CPWindowMinVisibleHorizontalMargin is visible at the bottom
|
||||
frame.origin.y = MIN(frame.origin.y, CGRectGetMaxY(usableRect) - CGRectGetMinY([_contentView frame]) - CPWindowMinVisibleVerticalMargin);
|
||||
|
||||
return frame;
|
||||
}
|
||||
@@ -1021,6 +1033,23 @@ CPTexturedBackgroundWindowMask
|
||||
[[CPNotificationCenter defaultCenter] postNotificationName:CPWindowResizeStyleGlobalChangeNotification object:nil];
|
||||
}
|
||||
|
||||
/*!
|
||||
If set to NO, platform window (virtual screen) resizes will not attempt to move/resize user windows.
|
||||
to the usable area.
|
||||
*/
|
||||
+ (void)setConstrainWindowsToUsableScreen:(BOOL)shouldConstrain
|
||||
{
|
||||
CPWindowConstrainToScreen = shouldConstrain;
|
||||
}
|
||||
|
||||
/*!
|
||||
Return whether platform window (virtual screen) resizes constrain user windows to the usable area.
|
||||
*/
|
||||
+ (BOOL)constrainWindowsToUsableScreen
|
||||
{
|
||||
return CPWindowConstrainToScreen;
|
||||
}
|
||||
|
||||
- (void)_didReceiveResizeStyleChange:(CPNotification)aNotification
|
||||
{
|
||||
[_windowView setShowsResizeIndicator:_styleMask & CPResizableWindowMask];
|
||||
@@ -3269,7 +3298,7 @@ var keyViewComparator = function(lhs, rhs, context)
|
||||
if ([self isFullPlatformWindow])
|
||||
return [self setFrame:[_platformWindow visibleFrame]];
|
||||
|
||||
if (_autoresizingMask === CPWindowNotSizable)
|
||||
if (!CPWindowConstrainToScreen || _autoresizingMask === CPWindowNotSizable)
|
||||
return;
|
||||
|
||||
var frame = [_platformWindow contentBounds],
|
||||
@@ -3291,7 +3320,7 @@ var keyViewComparator = function(lhs, rhs, context)
|
||||
if (_autoresizingMask & CPWindowHeightSizable)
|
||||
newFrame.size.height += dY;
|
||||
|
||||
[self setFrame:newFrame];
|
||||
[self _setFrame:newFrame display:YES animate:NO constrainWidth:YES constrainHeight:YES];
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -194,3 +194,5 @@ CPStandardWindowShadowStyle = 0;
|
||||
CPMenuWindowShadowStyle = 1;
|
||||
CPPanelWindowShadowStyle = 2;
|
||||
CPCustomWindowShadowStyle = 3;
|
||||
|
||||
CPWindowConstrainToScreen = YES;
|
||||
@@ -631,7 +631,38 @@ _CPWindowViewResizeSlop = 3;
|
||||
newHeight = startHeight;
|
||||
}
|
||||
|
||||
[theWindow _setFrame:CGRectMake(newX, newY, newWidth, newHeight) display:YES animate:NO constrainWidth:NO constrainHeight:NO];
|
||||
// When resizing, we always constrain to the usable screen.
|
||||
frame = CGRectMake(newX, newY, newWidth, newHeight);
|
||||
|
||||
var constrainedFrame = [theWindow _constrainOriginOfFrame:frame],
|
||||
dx = constrainedFrame.origin.x - frame.origin.x,
|
||||
dy = constrainedFrame.origin.y - frame.origin.y;
|
||||
|
||||
// When resizing from the left or top, we adjust the origin and size.
|
||||
switch (_resizeRegion)
|
||||
{
|
||||
case _CPWindowViewResizeRegionBottomLeft:
|
||||
case _CPWindowViewResizeRegionLeft:
|
||||
case _CPWindowViewResizeRegionTopLeft:
|
||||
case _CPWindowViewResizeRegionTop:
|
||||
case _CPWindowViewResizeRegionTopRight:
|
||||
frame.origin = constrainedFrame.origin;
|
||||
frame.size.width -= dx;
|
||||
frame.size.height -= dy;
|
||||
}
|
||||
|
||||
// When resizing from the right or bottom, we only adjust the size.
|
||||
switch (_resizeRegion)
|
||||
{
|
||||
case _CPWindowViewResizeRegionTopRight:
|
||||
case _CPWindowViewResizeRegionRight:
|
||||
case _CPWindowViewResizeRegionBottomRight:
|
||||
case _CPWindowViewResizeRegionBottom:
|
||||
frame.size.width += dx;
|
||||
frame.size.height += dy;
|
||||
}
|
||||
|
||||
[theWindow _setFrame:frame display:YES animate:NO constrainWidth:NO constrainHeight:NO];
|
||||
[self setCursorForLocation:location resizing:YES];
|
||||
}
|
||||
|
||||
@@ -928,7 +959,8 @@ _CPWindowViewResizeSlop = 3;
|
||||
|
||||
- (CGSize)_minimumResizeSize
|
||||
{
|
||||
return CGSizeMake(0, _CPWindowViewMinContentHeight);
|
||||
// Leave at least 4px so there is something visible.
|
||||
return CGSizeMake(4, _CPWindowViewMinContentHeight);
|
||||
}
|
||||
|
||||
- (int)bodyOffset
|
||||
|
||||
@@ -35,7 +35,10 @@
|
||||
|
||||
var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey",
|
||||
_CPCibCustomResourceResourceNameKey = @"_CPCibCustomResourceResourceNameKey",
|
||||
_CPCibCustomResourcePropertiesKey = @"_CPCibCustomResourcePropertiesKey";
|
||||
_CPCibCustomResourcePropertiesKey = @"_CPCibCustomResourcePropertiesKey",
|
||||
|
||||
_CPCibCustomResourceTemplateImageMap = nil;
|
||||
|
||||
|
||||
@implementation _CPCibCustomResource : CPObject
|
||||
{
|
||||
@@ -45,6 +48,16 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey",
|
||||
CPBundle _bundle;
|
||||
}
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
if (self !== [_CPCibCustomResource class])
|
||||
return;
|
||||
|
||||
_CPCibCustomResourceTemplateImageMap = @{
|
||||
"CPAddTemplate": "button-image-plus",
|
||||
"CPRemoveTemplate": "button-image-minus"
|
||||
};
|
||||
}
|
||||
+ (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize
|
||||
{
|
||||
return [[self alloc] initWithClassName:@"CPImage" resourceName:aResourceName properties:@{ @"size": aSize }];
|
||||
@@ -98,12 +111,12 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey",
|
||||
(![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources]))
|
||||
if (_className === @"CPImage")
|
||||
{
|
||||
if (_resourceName == "CPAddTemplate")
|
||||
return [[CPTheme defaultTheme] valueForAttributeWithName:@"button-image-plus" forClass:[CPButtonBar class]];
|
||||
else if (_resourceName == "CPRemoveTemplate")
|
||||
return [[CPTheme defaultTheme] valueForAttributeWithName:@"button-image-minus" forClass:[CPButtonBar class]];
|
||||
var templateImage = [_CPCibCustomResourceTemplateImageMap objectForKey:_resourceName];
|
||||
|
||||
return [self imageFromCoder:aCoder];
|
||||
if (templateImage)
|
||||
return [[CPTheme defaultTheme] valueForAttributeWithName:templateImage forClass:[CPButtonBar class]];
|
||||
else
|
||||
return [self imageFromCoder:aCoder];
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
@@ -43,7 +43,7 @@ var CANVAS_LINECAP_TABLE = [ "butt", "round", "square" ],
|
||||
#define _CGContextFillRectCanvas(aContext, aRect) aContext.fillRect(CGRectGetMinX(aRect), CGRectGetMinY(aRect), CGRectGetWidth(aRect), CGRectGetHeight(aRect))
|
||||
#define _CGContextClipCanvas(aContext) aContext.clip()
|
||||
|
||||
// In Cocoa, all primitives excepts rects cannot be added to the context's path
|
||||
// In Cocoa, all primitives excepts rects and arcs cannot be added to the context's path
|
||||
// until a move to point has been done, because an empty path has no current point.
|
||||
var hasPath = function(aContext, methodName)
|
||||
{
|
||||
@@ -113,12 +113,12 @@ function CGContextSetBlendMode(aContext, aBlendMode)
|
||||
|
||||
function CGContextAddArc(aContext, x, y, radius, startAngle, endAngle, clockwise)
|
||||
{
|
||||
if (!hasPath(aContext, "CGContextAddArc"))
|
||||
return;
|
||||
|
||||
// Despite the documentation saying otherwise, the last parameter is anti-clockwise not clockwise.
|
||||
// http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes#Arcs
|
||||
_CGContextAddArcCanvas(aContext, x, y, radius, startAngle, endAngle, !clockwise);
|
||||
|
||||
// AddArc implicitly starts a path
|
||||
aContext.hasPath = YES;
|
||||
}
|
||||
|
||||
function CGContextAddArcToPoint(aContext, x1, y1, x2, y2, radius)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
@import <Foundation/CPArray.j>
|
||||
@import <Foundation/CPObject.j>
|
||||
|
||||
@import "CGGeometry.j"
|
||||
|
||||
@implementation CPDOMWindowLayer : CPObject
|
||||
{
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
|
||||
#define SUPPRESS_CAPPUCCINO_CUT_FOR_EVENT(anEvent) anEvent._suppressCappuccinoCut = YES
|
||||
#define SUPPRESS_CAPPUCCINO_PASTE_FOR_EVENT(anEvent) anEvent._suppressCappuccinoPaste = YES
|
||||
|
||||
var hasEditableTarget = function(aDOMEvent)
|
||||
{
|
||||
var target = aDOMEvent.target || aDOMEvent.srcElement;
|
||||
@@ -258,8 +261,14 @@ var hasEditableTarget = function(aDOMEvent)
|
||||
// In both of those cases we don't want to send the event on keydown too, or we'll get 2X copy/cut operations.
|
||||
if (supportsNativeCopyAndPaste || _ignoreNativeCopyOrCutEvent)
|
||||
currentEventShouldBeSuppressed = YES;
|
||||
}
|
||||
|
||||
currentEventShouldDefinitelyBubble = YES;
|
||||
if (!currentEventShouldBeSuppressed)
|
||||
{
|
||||
if (characters === "v")
|
||||
SUPPRESS_CAPPUCCINO_PASTE_FOR_EVENT(anEvent);
|
||||
else if (characters === "x")
|
||||
SUPPRESS_CAPPUCCINO_CUT_FOR_EVENT(anEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -456,6 +465,8 @@ Return true if the event may be a copy and paste event, but the target is not an
|
||||
var anEvent = [self _fakeClipboardEvent:aDOMEvent type:"v"],
|
||||
platformWindow = [[anEvent window] platformWindow];
|
||||
|
||||
SUPPRESS_CAPPUCCINO_PASTE_FOR_EVENT(anEvent);
|
||||
|
||||
// By default we'll stop the native handling of the event since we're handling it ourselves. However, we need to
|
||||
// stop it before we send the event so that the event can overrule our choice. CPTextField for instance wants the
|
||||
// default handling when focused (which is to insert into the field).
|
||||
@@ -480,6 +491,8 @@ Return true if the event may be a copy and paste event, but the target is not an
|
||||
var anEvent = [self _fakeClipboardEvent:aDOMEvent type:(aDOMEvent.type.indexOf("cut") != CPNotFound ? "x" : "c")],
|
||||
platformWindow = [[anEvent window] platformWindow];
|
||||
|
||||
SUPPRESS_CAPPUCCINO_CUT_FOR_EVENT(anEvent);
|
||||
|
||||
[platformWindow _propagateCurrentDOMEvent:NO]
|
||||
|
||||
// Let the app react through copy: and cut: actions.
|
||||
|
||||
@@ -107,11 +107,13 @@
|
||||
* P: undefined 80 undefined
|
||||
*/
|
||||
|
||||
@import <Foundation/CPNotificationCenter.j>
|
||||
@import <Foundation/CPObject.j>
|
||||
@import <Foundation/CPRunLoop.j>
|
||||
@import <Foundation/CPSet.j>
|
||||
@import <Foundation/CPTimer.j>
|
||||
|
||||
@import "CPApplication_Constants.j"
|
||||
@import "CPCompatibility.j"
|
||||
@import "CPCursor.j"
|
||||
@import "CPDOMWindowLayer.j"
|
||||
@@ -128,7 +130,6 @@
|
||||
@class CPDragServer
|
||||
@class _CPToolTip
|
||||
|
||||
@global CPApp
|
||||
@global _CPRunModalLoop
|
||||
|
||||
// List of all open native windows
|
||||
@@ -994,6 +995,10 @@ var resizeTimer = nil;
|
||||
[windows[windowCount] resizeWithOldPlatformWindowSize:oldSize];
|
||||
}
|
||||
|
||||
[[CPNotificationCenter defaultCenter] postNotificationName:CPApplicationDidChangeScreenParametersNotification
|
||||
object:CPApp
|
||||
userInfo:nil];
|
||||
|
||||
//window.liveResize = NO;
|
||||
|
||||
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
|
||||
@@ -1174,8 +1179,12 @@ var resizeTimer = nil;
|
||||
[CPApp sendEvent:event];
|
||||
}
|
||||
|
||||
var didStop = NO;
|
||||
if (StopDOMEventPropagation && (!supportsNativeDragAndDrop || type !== "mousedown" && !isDragging))
|
||||
{
|
||||
didStop = YES;
|
||||
_CPDOMEventStop(aDOMEvent, self);
|
||||
}
|
||||
|
||||
// If there are any tracking event listeners (listening for CPLeftMouseDraggedMask)
|
||||
// then show the event guard so we don't lose events to iframes
|
||||
@@ -1197,6 +1206,7 @@ var resizeTimer = nil;
|
||||
_DOMEventGuard.style.display = hasTrackingEventListener ? "" : "none";
|
||||
|
||||
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
|
||||
return !didStop;
|
||||
}
|
||||
|
||||
- (void)contextMenuEvent:(DOMEvent)aDOMEvent
|
||||
@@ -1498,6 +1508,44 @@ var resizeTimer = nil;
|
||||
return theWindow;
|
||||
}
|
||||
|
||||
/*! @ignore Return the selected text in the DOM window if known. */
|
||||
- (CPString)_selectedText
|
||||
{
|
||||
if (_DOMWindow.getSelection)
|
||||
return "" + _DOMWindow.getSelection();
|
||||
else if (_DOMWindow.document.getSelection)
|
||||
return "" + _DOMWindow.document.getSelection();
|
||||
else if (_DOMWindow.selection)
|
||||
return "" + _DOMWindow.selection.createRange().text;
|
||||
else
|
||||
return nil;
|
||||
}
|
||||
|
||||
/*!
|
||||
Set the text selection range to the given range within the given element, which must be a child of
|
||||
this DOM window.
|
||||
*/
|
||||
- (void)setSelectedRange:(CPRange)aRange inElement:(DOMElement)anElement
|
||||
{
|
||||
if (_DOMWindow.getSelection())
|
||||
{
|
||||
var domRange = _DOMWindow.document.createRange();
|
||||
domRange.setStart(anElement.childNodes[0], aRange.location);
|
||||
domRange.setEnd(anElement.childNodes[0], CPMaxRange(aRange));
|
||||
_DOMWindow.getSelection().removeAllRanges();
|
||||
_DOMWindow.getSelection().addRange(domRange);
|
||||
}
|
||||
else if (_DOMWindow.document.selection)
|
||||
{
|
||||
var domRange = _DOMWindow.document.body.createTextRange();
|
||||
domRange.moveToElementText(anElement);
|
||||
domRange.collapse(true);
|
||||
domRange.moveStart('character', aRange.location);
|
||||
domRange.moveEnd('character', aRange.length);
|
||||
domRange.select();
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
When using command (mac) or control (windows), keys are propagated to the browser by default.
|
||||
To prevent a character key from propagating (to prevent its default action, and instead use it
|
||||
@@ -1616,12 +1664,6 @@ _CPDOMEventStop = function(aDOMEvent, aPlatformWindow)
|
||||
|
||||
if (aDOMEvent.stopPropagation)
|
||||
aDOMEvent.stopPropagation();
|
||||
|
||||
if (aDOMEvent.type === CPDOMEventMouseDown)
|
||||
{
|
||||
aPlatformWindow._DOMFocusElement.focus();
|
||||
aPlatformWindow._DOMFocusElement.blur();
|
||||
}
|
||||
};
|
||||
|
||||
function CPWindowObjectList()
|
||||
|
||||
@@ -135,6 +135,16 @@ var _CPAutocompleteMenuMaximumHeight = 307;
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
/*
|
||||
If the textField has no window, then we simply stop to layout the
|
||||
subviews and close the _menuWindow.
|
||||
*/
|
||||
if (![textField window])
|
||||
{
|
||||
[_menuWindow orderOut:self];
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO
|
||||
/*
|
||||
The autocompletion menu should be underneath the word/text being
|
||||
@@ -202,6 +212,8 @@ var _CPAutocompleteMenuMaximumHeight = 307;
|
||||
[self setIndexOfSelectedItem:indexOfSelectedItem];
|
||||
|
||||
[textField setThemeState:CPThemeStateAutocompleting];
|
||||
|
||||
[_menuWindow setPlatformWindow:[[textField window] platformWindow]];
|
||||
[[textField window] addChildWindow:_menuWindow ordered:CPWindowAbove];
|
||||
|
||||
[self layoutSubviews];
|
||||
|
||||
@@ -802,4 +802,11 @@ var _CPimageAndTextViewFrameSizeChangedFlag = 1 << 0,
|
||||
[super setFrameSize:aSize];
|
||||
}
|
||||
|
||||
- (void)setSelectedRange:(CPRange)aRange
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
[[[self window] platformWindow] setSelectedRange:aRange inElement:_DOMTextElement];
|
||||
#endif
|
||||
}
|
||||
|
||||
@end
|
||||
+20
-13
@@ -642,22 +642,29 @@ var CPToolbarItemItemIdentifierKey = @"CPToolbarItemItemIdentifierKey",
|
||||
{
|
||||
switch (anItemIdentifier)
|
||||
{
|
||||
case CPToolbarSeparatorItemIdentifier: return [_CPToolbarSeparatorItem new];
|
||||
case CPToolbarSpaceItemIdentifier: return [_CPToolbarSpaceItem new];
|
||||
case CPToolbarFlexibleSpaceItemIdentifier: return [_CPToolbarFlexibleSpaceItem new];
|
||||
case CPToolbarShowColorsItemIdentifier: return [_CPToolbarShowColorsItem new];
|
||||
case CPToolbarShowFontsItemIdentifier: return nil;
|
||||
case CPToolbarCustomizeToolbarItemIdentifier: return nil;
|
||||
case CPToolbarPrintItemIdentifier: return nil;
|
||||
case CPToolbarSeparatorItemIdentifier:
|
||||
return [_CPToolbarSeparatorItem new];
|
||||
|
||||
case CPToolbarSpaceItemIdentifier:
|
||||
return [_CPToolbarSpaceItem new];
|
||||
|
||||
case CPToolbarFlexibleSpaceItemIdentifier:
|
||||
return [_CPToolbarFlexibleSpaceItem new];
|
||||
|
||||
case CPToolbarShowColorsItemIdentifier:
|
||||
return [_CPToolbarShowColorsItem new];
|
||||
|
||||
case CPToolbarShowFontsItemIdentifier:
|
||||
return nil;
|
||||
|
||||
case CPToolbarCustomizeToolbarItemIdentifier:
|
||||
return nil;
|
||||
|
||||
case CPToolbarPrintItemIdentifier:
|
||||
return nil;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
/*@import "_CPToolbarFlexibleSpaceItem.j"
|
||||
@import "_CPToolbarShowColorsItem.j"
|
||||
@import "_CPToolbarSeparatorItem.j"
|
||||
@import "_CPToolbarSpaceItem.j"
|
||||
*/
|
||||
@@ -723,10 +723,12 @@ var CPDictionaryShowNilDeprecationMessage = YES,
|
||||
- (CPString)description
|
||||
{
|
||||
var string = "@{",
|
||||
keys = self._keys,
|
||||
keys = [self allKeys],
|
||||
index = 0,
|
||||
count = self._count;
|
||||
|
||||
keys.sort();
|
||||
|
||||
for (; index < count; ++index)
|
||||
{
|
||||
if (index === 0)
|
||||
|
||||
@@ -118,7 +118,8 @@ function decompile(/*String*/ aString, /*CFURL*/ aURL)
|
||||
dependencies.push(new FileDependency(new CFURL(text), YES));
|
||||
}
|
||||
|
||||
var fn = FileExecutable._lookupCachedFunction(aURL)
|
||||
var fn = FileExecutable._lookupCachedFunction(aURL);
|
||||
|
||||
if (fn)
|
||||
return new Executable(code, dependencies, aURL, fn);
|
||||
|
||||
|
||||
+31
-31
@@ -22,8 +22,8 @@
|
||||
|
||||
// sprintf:
|
||||
|
||||
var formatRegex = new RegExp("([^%]+|%(?:\\d+\\$)?[\\+\\-\\ \\#0]*[0-9\\*]*(.[0-9\\*]+)?[hlL]?[cbBdieEfgGosuxXpn%@])", "g");
|
||||
var tagRegex = new RegExp("(%)(?:(\\d+)\\$)?([\\+\\-\\ \\#0]*)([0-9\\*]*)((?:.[0-9\\*]+)?)([hlL]?)([cbBdieEfgGosuxXpn%@])");
|
||||
var formatRegex = /([^%]+|%(?:\d+\$)?[\+\-\ \#0]*[0-9\*]*(.[0-9\*]+)?[hlL]?[cbBdieEfgGosuxXpn%@])/g,
|
||||
tagRegex = /(%)(?:(\d+)\$)?([\+\-\ \#0]*)([0-9\*]*)((?:.[0-9\*]+)?)([hlL]?)([cbBdieEfgGosuxXpn%@])/;
|
||||
|
||||
exports.sprintf = function(format)
|
||||
{
|
||||
@@ -36,10 +36,10 @@ exports.sprintf = function(format)
|
||||
for (var i = 0; i < tokens.length; i++)
|
||||
{
|
||||
var t = tokens[i];
|
||||
if (format.substring(index, index + t.length) != t)
|
||||
{
|
||||
|
||||
if (format.substring(index, index + t.length) !== t)
|
||||
return result;
|
||||
}
|
||||
|
||||
index += t.length;
|
||||
|
||||
if (t.charAt(0) !== "%")
|
||||
@@ -51,10 +51,9 @@ exports.sprintf = function(format)
|
||||
else
|
||||
{
|
||||
var subtokens = t.match(tagRegex);
|
||||
if (subtokens.length != 8 || subtokens[0] != t)
|
||||
{
|
||||
|
||||
if (subtokens.length !== 8 || subtokens[0] !== t)
|
||||
return result;
|
||||
}
|
||||
|
||||
var percentSign = subtokens[1],
|
||||
argIndex = subtokens[2],
|
||||
@@ -70,27 +69,28 @@ exports.sprintf = function(format)
|
||||
argIndex = Number(argIndex);
|
||||
|
||||
var width = null;
|
||||
|
||||
if (widthString == "*")
|
||||
width = arguments[argIndex];
|
||||
else if (widthString != "")
|
||||
else if (widthString !== "")
|
||||
width = Number(widthString);
|
||||
|
||||
var precision = null;
|
||||
if (precisionString == ".*")
|
||||
|
||||
if (precisionString === ".*")
|
||||
precision = arguments[argIndex];
|
||||
else if (precisionString != "")
|
||||
else if (precisionString !== "")
|
||||
precision = Number(precisionString.substring(1));
|
||||
|
||||
var leftJustify = (flags.indexOf("-") >= 0);
|
||||
var padZeros = (flags.indexOf("0") >= 0);
|
||||
var leftJustify = (flags.indexOf("-") >= 0),
|
||||
padZeros = (flags.indexOf("0") >= 0),
|
||||
subresult = "";
|
||||
|
||||
var subresult = "";
|
||||
|
||||
if (RegExp("[bBdiufeExXo]").test(specifier))
|
||||
if (/[bBdiufeExXo]/.test(specifier))
|
||||
{
|
||||
var num = Number(arguments[argIndex]);
|
||||
var num = Number(arguments[argIndex]),
|
||||
sign = "";
|
||||
|
||||
var sign = "";
|
||||
if (num < 0)
|
||||
{
|
||||
sign = "-";
|
||||
@@ -103,7 +103,7 @@ exports.sprintf = function(format)
|
||||
sign = " ";
|
||||
}
|
||||
|
||||
if (specifier == "d" || specifier == "i" || specifier == "u")
|
||||
if (specifier === "d" || specifier === "i" || specifier === "u")
|
||||
{
|
||||
var number = String(Math.abs(Math.floor(num)));
|
||||
|
||||
@@ -112,16 +112,16 @@ exports.sprintf = function(format)
|
||||
|
||||
if (specifier == "f")
|
||||
{
|
||||
var number = String((precision != null) ? Math.abs(num).toFixed(precision) : Math.abs(num));
|
||||
var suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : "";
|
||||
var number = String((precision !== null) ? Math.abs(num).toFixed(precision) : Math.abs(num)),
|
||||
suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : "";
|
||||
|
||||
subresult = justify(sign, "", number, suffix, width, leftJustify, padZeros);
|
||||
}
|
||||
|
||||
if (specifier == "e" || specifier == "E")
|
||||
if (specifier === "e" || specifier === "E")
|
||||
{
|
||||
var number = String(Math.abs(num).toExponential(precision != null ? precision : 21));
|
||||
var suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : "";
|
||||
var number = String(Math.abs(num).toExponential(precision !== null ? precision : 21)),
|
||||
suffix = (flags.indexOf("#") >= 0 && number.indexOf(".") < 0) ? "." : "";
|
||||
|
||||
subresult = justify(sign, "", number, suffix, width, leftJustify, padZeros);
|
||||
}
|
||||
@@ -150,7 +150,7 @@ exports.sprintf = function(format)
|
||||
subresult = justify(sign, prefix, number, "", width, leftJustify, padZeros);
|
||||
}
|
||||
|
||||
if (RegExp("[A-Z]").test(specifier))
|
||||
if (/[A-Z]/.test(specifier))
|
||||
subresult = subresult.toUpperCase();
|
||||
else
|
||||
subresult = subresult.toLowerCase();
|
||||
@@ -159,16 +159,14 @@ exports.sprintf = function(format)
|
||||
{
|
||||
var subresult = "";
|
||||
|
||||
if (specifier == "%")
|
||||
if (specifier === "%")
|
||||
subresult = "%";
|
||||
else if (specifier == "c")
|
||||
else if (specifier === "c")
|
||||
subresult = String(arguments[argIndex]).charAt(0);
|
||||
else if (specifier == "s" || specifier == "@")
|
||||
else if (specifier === "s" || specifier === "@")
|
||||
subresult = String(arguments[argIndex]);
|
||||
else if (specifier == "p" || specifier == "n")
|
||||
{
|
||||
else if (specifier === "p" || specifier === "n")
|
||||
subresult = "";
|
||||
}
|
||||
|
||||
subresult = justify("", "", subresult, "", width, leftJustify, false);
|
||||
}
|
||||
@@ -176,12 +174,14 @@ exports.sprintf = function(format)
|
||||
result += subresult;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function justify(sign, prefix, string, suffix, width, leftJustify, padZeros)
|
||||
{
|
||||
var length = (sign.length + prefix.length + string.length + suffix.length);
|
||||
|
||||
if (leftJustify)
|
||||
{
|
||||
return sign + prefix + string + suffix + pad(width - length, " ");
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
* AppController.j
|
||||
* CGPath
|
||||
*
|
||||
* Created by You on May 23, 2013.
|
||||
* Copyright 2013, Your Company All rights reserved.
|
||||
* Created by Alexandre Wilhelm on May 23, 2013.
|
||||
* Copyright 2013, Alexandre Wilhelm. All rights reserved.
|
||||
*/
|
||||
|
||||
@import <Foundation/Foundation.j>
|
||||
@@ -53,13 +53,13 @@
|
||||
|
||||
CGContextBeginPath(context);
|
||||
path2 = CGPathCreateMutable();
|
||||
CGPathAddRect( path2, nil, CGRectMake(250, 50, 100, 100));
|
||||
CGPathAddRect(path2, nil, CGRectMake(250, 50, 100, 100));
|
||||
CGContextAddPath(context, path2);
|
||||
CGContextClosePath(context);
|
||||
CGContextStrokePath(context);
|
||||
|
||||
CGContextBeginPath(context);
|
||||
path3 = CGPathWithEllipseInRect( CGRectMake(100, 150, 100, 100))
|
||||
path3 = CGPathWithEllipseInRect(CGRectMake(100, 150, 100, 100))
|
||||
CGContextAddPath(context, path3);
|
||||
CGContextClosePath(context);
|
||||
CGContextStrokePath(context);
|
||||
@@ -85,9 +85,6 @@
|
||||
|
||||
|
||||
@implementation PathView : CPView
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
- (void)drawRect:(CGRect)aRect
|
||||
{
|
||||
@@ -99,11 +96,11 @@
|
||||
CGContextBeginPath(context);
|
||||
var path = CGPathCreateMutable();
|
||||
CGPathMoveToPoint(path, nil, 100, 100);
|
||||
CGPathAddArc(path, nil,100, 100, 70, 0, 2.615500255957057, YES);
|
||||
CGPathAddArc(path, nil, 100, 100, 70, 0, 2.615500255957057, YES);
|
||||
CGPathAddLineToPoint(path, nil, 100, 100);
|
||||
CGPathAddArc(path, nil,100, 100, 70, 2.615500255957057, 6.148960361810042, YES);
|
||||
CGPathAddArc(path, nil, 100, 100, 70, 2.615500255957057, 6.148960361810042, YES);
|
||||
CGPathAddLineToPoint(path, nil, 100, 100);
|
||||
CGPathAddArc(path, nil,100, 100, 70, 6.148960361810042, 0, YES);
|
||||
CGPathAddArc(path, nil, 100, 100, 70, 6.148960361810042, 0, YES);
|
||||
CGPathAddLineToPoint(path, nil, 100, 100);
|
||||
CGContextAddPath(context, path);
|
||||
CGContextStrokePath(context);
|
||||
@@ -112,7 +109,7 @@
|
||||
// Test to create an arc without a start point
|
||||
CGContextBeginPath(context);
|
||||
path = CGPathCreateMutable();
|
||||
CGPathAddArc(path, nil,300, 100, 70, 0, 2.615500255957057, YES);
|
||||
CGPathAddArc(path, nil, 300, 100, 70, 0, 2.615500255957057, YES);
|
||||
CGContextAddPath(context, path);
|
||||
CGContextStrokePath(context);
|
||||
CGContextClosePath(context);
|
||||
@@ -121,7 +118,7 @@
|
||||
CGContextBeginPath(context);
|
||||
path = CGPathCreateMutable();
|
||||
CGPathMoveToPoint(path, nil, 100, 250);
|
||||
CGPathAddArc(path, nil,100, 300, 70, 0, 2.615500255957057, YES);
|
||||
CGPathAddArc(path, nil, 100, 300, 70, 0, 2.615500255957057, YES);
|
||||
CGContextAddPath(context, path);
|
||||
CGContextStrokePath(context);
|
||||
CGContextClosePath(context);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
@outlet CPWindow theWindow;
|
||||
@outlet CPCollectionView aCollectionView;
|
||||
@outlet CPArrayController anArrayController;
|
||||
@outlet CPTextField selectableTextField;
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
@@ -30,6 +31,8 @@
|
||||
|
||||
[anArrayController setContent:@[@"Cat", @"Rabbit", @"Dinosaur", anImage]];
|
||||
|
||||
[selectableTextField setStringValue:@"Lion"];
|
||||
|
||||
[theWindow setFullPlatformWindow:YES];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;134E;D;K;6;CP$UIDd;3;136E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;142E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;152E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;116E;Line truncated
|
||||
280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;120E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;122E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;3;127E;D;K;6;CP$UIDd;3;128E;D;K;6;CP$UIDd;3;129E;D;K;6;CP$UIDd;3;130E;D;K;6;CP$UIDd;3;131E;D;K;6;CP$UIDd;3;133E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;137E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;D;K;6;CP$UIDd;3;145E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;146E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;147E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;149E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;150E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;151E;D;K;6;CP$UIDd;3;153E;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;156E;D;K;6;CP$UIDd;3;157E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;3;111E;D;K;6Line truncated
|
||||
|
||||
1. Select text items in the Collection View or the Text Field and copy it to the system clipboard (Cmd-C on the Mac, Ctrl-C on the PC).
|
||||
1. Select text items in the Collection View or the Text Field and copy it to the system clipboard (Cmd-C on the Mac, Ctrl-C on the PC). It's also possible to select text from "a label with selectable text" and "non-editable field".
|
||||
2. Open this application in a different browser window, or even a different browser. You can test copying from Firefox to Chrome, Safari to Internet Explorer or vice versa and so on.
|
||||
3. Paste into the Collection View or Text Field of the destination and verify your material transferred correctly.
|
||||
4. It is not currently possible to copy or paste images between browsers. Using the Cappuccino menus only, you can copy, cut or paste the image item within this app in this browser window (e.g. to and from the same collection view).S;22;{{25, 180}, {129, 17}}S;19;{{0, 0}, {129, 17}}d;2;12S;19;Regular Text Field:S;23;{{158, 174}, {617, 29}}S;19;{{0, 0}, {617, 29}}S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;324E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;388E;E;S;13;AppControllerS;18;CollectionViewItemS;20;CPCollectionViewItemS;19;CPMutableDictionaryS;20;{{0, 0}, {100, 100}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;155E;D;K;6;CP$UIDd;3;153E;E;E;S;18;CollectionViewViewS;6;CPViewS;20;{{20, 41}, {60, 17}}S;18;{{0, 0}, {60, 17}}d;2;42S;5;LabelS;20;{{17, 17}, {66, 66}}S;18;{{0, 0}, {66, 66}}S;11;maxItemSizeS;11;minItemSizeD;K;10;$classnameS;7;CPValueK;8;$classesA;S;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;377E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;389E;E;D;K;6;$classD;K;6;CP$UIDd;3;377E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;389E;E;S;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;390E;D;K;6;CP$UIDd;3;390E;D;K;6;CP$UIDd;3;390E;D;K;6;CP$UIDd;3;265E;E;E;S;20;{{1, 1}, {749, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;140E;E;E;S;6;_NS:78S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;3;324E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;391E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;E;E;S;26;{"width":150,"height":150}f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;D;K;6;CP$UIDd;3;265E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;
|
||||
4. It is not currently possible to copy or paste images between browsers. Using the Cappuccino menus only, you can copy, cut or paste the image item within this app in this browser window (e.g. to and from the same collection view).S;23;{{155, 201}, {617, 29}}S;19;{{0, 0}, {617, 29}}S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;329E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;400E;E;S;22;{{22, 207}, {129, 17}}S;19;{{0, 0}, {129, 17}}d;2;12S;19;Regular Text Field:S;22;{{22, 239}, {129, 17}}S;19;Non-editable Field:S;23;{{155, 233}, {617, 29}}S;19;bezeled+placeholderS;13;AppControllerS;18;CollectionViewItemS;20;CPCollectionViewItemS;19;CPMutableDictionaryS;20;{{0, 0}, {100, 100}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;159E;D;K;6;CP$UIDd;3;157E;E;E;S;18;CollectionViewViewS;6;CPViewS;20;{{20, 41}, {60, 17}}S;18;{{0, 0}, {60, 17}}d;2;42S;5;LabelS;20;{{17, 17}, {66, 66}}S;18;{{0, 0}, {66, 66}}S;11;maxItemSizeS;11;minItemSizeD;K;10;$classnameS;7;CPValueK;8;$classesA;S;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;389E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;401E;E;D;K;6;$classD;K;6;CP$UIDd;3;389E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;401E;E;S;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;402E;D;K;6;CP$UIDd;3;270E;E;E;S;20;{{1, 1}, {749, 125}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;141E;E;E;S;6;_NS:78S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;3;329E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;403E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;E;E;S;26;{"width":150,"height":150}f;18;0.6862745098039216D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;D;K;6;CP$UIDd;3;270E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;
|
||||
@@ -645,7 +645,7 @@
|
||||
<object class="NSWindowTemplate" id="972006081">
|
||||
<int key="NSWindowStyleMask">7</int>
|
||||
<int key="NSWindowBacking">2</int>
|
||||
<string key="NSWindowRect">{{335, 390}, {791, 386}}</string>
|
||||
<string key="NSWindowRect">{{335, 390}, {791, 447}}</string>
|
||||
<int key="NSWTFlags">1946157056</int>
|
||||
<string key="NSWindowTitle">Window</string>
|
||||
<string key="NSWindowClass">NSWindow</string>
|
||||
@@ -659,7 +659,7 @@
|
||||
<object class="NSTextField" id="534430937">
|
||||
<reference key="NSNextResponder" ref="439893737"/>
|
||||
<int key="NSvFlags">268</int>
|
||||
<string key="NSFrame">{{17, 349}, {237, 17}}</string>
|
||||
<string key="NSFrame">{{17, 410}, {237, 17}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="492282826"/>
|
||||
@@ -763,7 +763,7 @@
|
||||
<string key="NSFrame">{{1, 144}, {233, 15}}</string>
|
||||
<reference key="NSSuperview" ref="492282826"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="646514202"/>
|
||||
<reference key="NSNextKeyView" ref="939393406"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:91</string>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
<int key="NSsFlags">1</int>
|
||||
@@ -772,7 +772,7 @@
|
||||
<double key="NSPercent">0.63157892227172852</double>
|
||||
</object>
|
||||
</object>
|
||||
<string key="NSFrame">{{20, 214}, {751, 127}}</string>
|
||||
<string key="NSFrame">{{20, 275}, {751, 127}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="205651234"/>
|
||||
@@ -801,16 +801,17 @@
|
||||
<object class="NSMutableString" key="NSContents">
|
||||
<bytes key="NS.bytes">SW5zdHJ1Y3Rpb25zOgoKMS4gU2VsZWN0IHRleHQgaXRlbXMgaW4gdGhlIENvbGxlY3Rpb24gVmlldyBv
|
||||
ciB0aGUgVGV4dCBGaWVsZCBhbmQgY29weSBpdCB0byB0aGUgc3lzdGVtIGNsaXBib2FyZCAoQ21kLUMg
|
||||
b24gdGhlIE1hYywgQ3RybC1DIG9uIHRoZSBQQykuCjIuIE9wZW4gdGhpcyBhcHBsaWNhdGlvbiBpbiBh
|
||||
IGRpZmZlcmVudCBicm93c2VyIHdpbmRvdywgb3IgZXZlbiBhIGRpZmZlcmVudCBicm93c2VyLiBZb3Ug
|
||||
Y2FuIHRlc3QgY29weWluZyBmcm9tIEZpcmVmb3ggdG8gQ2hyb21lLCBTYWZhcmkgdG8gSW50ZXJuZXQg
|
||||
RXhwbG9yZXIgb3IgdmljZSB2ZXJzYSBhbmQgc28gb24uCjMuIFBhc3RlIGludG8gdGhlIENvbGxlY3Rp
|
||||
b24gVmlldyBvciBUZXh0IEZpZWxkIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgdmVyaWZ5IHlvdXIgbWF0
|
||||
ZXJpYWwgdHJhbnNmZXJyZWQgY29ycmVjdGx5Lgo0LiBJdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxl
|
||||
IHRvIGNvcHkgb3IgcGFzdGUgaW1hZ2VzIGJldHdlZW4gYnJvd3NlcnMuIFVzaW5nIHRoZSBDYXBwdWNj
|
||||
aW5vIG1lbnVzIG9ubHksIHlvdSBjYW4gY29weSwgY3V0IG9yIHBhc3RlIHRoZSBpbWFnZSBpdGVtIHdp
|
||||
dGhpbiB0aGlzIGFwcCBpbiB0aGlzIGJyb3dzZXIgd2luZG93IChlLmcuIHRvIGFuZCBmcm9tIHRoZSBz
|
||||
YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
b24gdGhlIE1hYywgQ3RybC1DIG9uIHRoZSBQQykuIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBzZWxlY3Qg
|
||||
dGV4dCBmcm9tICJhIGxhYmVsIHdpdGggc2VsZWN0YWJsZSB0ZXh0IiBhbmQgIm5vbi1lZGl0YWJsZSBm
|
||||
aWVsZCIuCjIuIE9wZW4gdGhpcyBhcHBsaWNhdGlvbiBpbiBhIGRpZmZlcmVudCBicm93c2VyIHdpbmRv
|
||||
dywgb3IgZXZlbiBhIGRpZmZlcmVudCBicm93c2VyLiBZb3UgY2FuIHRlc3QgY29weWluZyBmcm9tIEZp
|
||||
cmVmb3ggdG8gQ2hyb21lLCBTYWZhcmkgdG8gSW50ZXJuZXQgRXhwbG9yZXIgb3IgdmljZSB2ZXJzYSBh
|
||||
bmQgc28gb24uCjMuIFBhc3RlIGludG8gdGhlIENvbGxlY3Rpb24gVmlldyBvciBUZXh0IEZpZWxkIG9m
|
||||
IHRoZSBkZXN0aW5hdGlvbiBhbmQgdmVyaWZ5IHlvdXIgbWF0ZXJpYWwgdHJhbnNmZXJyZWQgY29ycmVj
|
||||
dGx5Lgo0LiBJdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHRvIGNvcHkgb3IgcGFzdGUgaW1hZ2Vz
|
||||
IGJldHdlZW4gYnJvd3NlcnMuIFVzaW5nIHRoZSBDYXBwdWNjaW5vIG1lbnVzIG9ubHksIHlvdSBjYW4g
|
||||
Y29weSwgY3V0IG9yIHBhc3RlIHRoZSBpbWFnZSBpdGVtIHdpdGhpbiB0aGlzIGFwcCBpbiB0aGlzIGJy
|
||||
b3dzZXIgd2luZG93IChlLmcuIHRvIGFuZCBmcm9tIHRoZSBzYW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
</object>
|
||||
<object class="NSFont" key="NSSupport">
|
||||
<string key="NSName">LucidaGrande</string>
|
||||
@@ -828,10 +829,10 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<object class="NSTextField" id="131499969">
|
||||
<reference key="NSNextResponder" ref="439893737"/>
|
||||
<int key="NSvFlags">290</int>
|
||||
<string key="NSFrame">{{162, 186}, {609, 22}}</string>
|
||||
<string key="NSFrame">{{159, 220}, {609, 22}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="647555975"/>
|
||||
<reference key="NSNextKeyView" ref="710607803"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="264543275">
|
||||
@@ -842,7 +843,7 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
<reference key="NSControlView" ref="131499969"/>
|
||||
<bool key="NSDrawsBackground">YES</bool>
|
||||
<object class="NSColor" key="NSBackgroundColor">
|
||||
<object class="NSColor" key="NSBackgroundColor" id="491527331">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">textBackgroundColor</string>
|
||||
@@ -851,7 +852,7 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<bytes key="NSWhite">MQA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSColor" key="NSTextColor">
|
||||
<object class="NSColor" key="NSTextColor" id="812820178">
|
||||
<int key="NSColorSpace">6</int>
|
||||
<string key="NSCatalogName">System</string>
|
||||
<string key="NSColorName">textColor</string>
|
||||
@@ -863,7 +864,7 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<object class="NSTextField" id="646514202">
|
||||
<reference key="NSNextResponder" ref="439893737"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{22, 189}, {135, 17}}</string>
|
||||
<string key="NSFrame">{{19, 223}, {135, 17}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="131499969"/>
|
||||
@@ -881,8 +882,72 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
<object class="NSTextField" id="939393406">
|
||||
<reference key="NSNextResponder" ref="439893737"/>
|
||||
<int key="NSvFlags">288</int>
|
||||
<string key="NSFrame">{{17, 250}, {757, 17}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="646514202"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:1535</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="192842169">
|
||||
<int key="NSCellFlags">70254657</int>
|
||||
<int key="NSCellFlags2">272630784</int>
|
||||
<string key="NSContents">A label with selectable text.</string>
|
||||
<reference key="NSSupport" ref="668931703"/>
|
||||
<string key="NSCellIdentifier">_NS:1535</string>
|
||||
<reference key="NSControlView" ref="939393406"/>
|
||||
<reference key="NSBackgroundColor" ref="815515125"/>
|
||||
<reference key="NSTextColor" ref="618666579"/>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
<object class="NSTextField" id="710607803">
|
||||
<reference key="NSNextResponder" ref="439893737"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{19, 191}, {135, 17}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="405018315"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:1535</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="609292086">
|
||||
<int key="NSCellFlags">68157504</int>
|
||||
<int key="NSCellFlags2">71304192</int>
|
||||
<string key="NSContents">Non-editable Field:</string>
|
||||
<reference key="NSSupport" ref="668931703"/>
|
||||
<string key="NSCellIdentifier">_NS:1535</string>
|
||||
<reference key="NSControlView" ref="710607803"/>
|
||||
<reference key="NSBackgroundColor" ref="815515125"/>
|
||||
<reference key="NSTextColor" ref="618666579"/>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
<object class="NSTextField" id="405018315">
|
||||
<reference key="NSNextResponder" ref="439893737"/>
|
||||
<int key="NSvFlags">290</int>
|
||||
<string key="NSFrame">{{159, 188}, {609, 22}}</string>
|
||||
<reference key="NSSuperview" ref="439893737"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="647555975"/>
|
||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||
<bool key="NSEnabled">YES</bool>
|
||||
<object class="NSTextFieldCell" key="NSCell" id="181099906">
|
||||
<int key="NSCellFlags">-2073034687</int>
|
||||
<int key="NSCellFlags2">272630784</int>
|
||||
<string key="NSContents"/>
|
||||
<reference key="NSSupport" ref="668931703"/>
|
||||
<string key="NSCellIdentifier">_NS:9</string>
|
||||
<reference key="NSControlView" ref="405018315"/>
|
||||
<bool key="NSDrawsBackground">YES</bool>
|
||||
<reference key="NSBackgroundColor" ref="491527331"/>
|
||||
<reference key="NSTextColor" ref="812820178"/>
|
||||
</object>
|
||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||
</object>
|
||||
</object>
|
||||
<string key="NSFrameSize">{791, 386}</string>
|
||||
<string key="NSFrameSize">{791, 447}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
<reference key="NSNextKeyView" ref="534430937"/>
|
||||
@@ -1269,6 +1334,14 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
</object>
|
||||
<int key="connectionID">479</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">selectableTextField</string>
|
||||
<reference key="source" ref="635946545"/>
|
||||
<reference key="destination" ref="405018315"/>
|
||||
</object>
|
||||
<int key="connectionID">503</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBOutletConnection" key="connection">
|
||||
<string key="label">itemPrototype</string>
|
||||
@@ -1845,9 +1918,12 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="534430937"/>
|
||||
<reference ref="492282826"/>
|
||||
<reference ref="939393406"/>
|
||||
<reference ref="647555975"/>
|
||||
<reference ref="646514202"/>
|
||||
<reference ref="131499969"/>
|
||||
<reference ref="646514202"/>
|
||||
<reference ref="710607803"/>
|
||||
<reference ref="405018315"/>
|
||||
</object>
|
||||
<reference key="parent" ref="972006081"/>
|
||||
</object>
|
||||
@@ -1986,6 +2062,48 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<reference key="object" ref="1014031390"/>
|
||||
<reference key="parent" ref="503039080"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">497</int>
|
||||
<reference key="object" ref="939393406"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="192842169"/>
|
||||
</object>
|
||||
<reference key="parent" ref="439893737"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">498</int>
|
||||
<reference key="object" ref="192842169"/>
|
||||
<reference key="parent" ref="939393406"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">499</int>
|
||||
<reference key="object" ref="710607803"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="609292086"/>
|
||||
</object>
|
||||
<reference key="parent" ref="439893737"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">500</int>
|
||||
<reference key="object" ref="609292086"/>
|
||||
<reference key="parent" ref="710607803"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">501</int>
|
||||
<reference key="object" ref="405018315"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="181099906"/>
|
||||
</object>
|
||||
<reference key="parent" ref="439893737"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">502</int>
|
||||
<reference key="object" ref="181099906"/>
|
||||
<reference key="parent" ref="405018315"/>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="flattenedProperties">
|
||||
@@ -2075,7 +2193,13 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<string>492.IBPluginDependency</string>
|
||||
<string>493.IBPluginDependency</string>
|
||||
<string>494.IBPluginDependency</string>
|
||||
<string>497.IBPluginDependency</string>
|
||||
<string>498.IBPluginDependency</string>
|
||||
<string>499.IBPluginDependency</string>
|
||||
<string>5.IBPluginDependency</string>
|
||||
<string>500.IBPluginDependency</string>
|
||||
<string>501.IBPluginDependency</string>
|
||||
<string>502.IBPluginDependency</string>
|
||||
<string>56.IBPluginDependency</string>
|
||||
<string>57.IBPluginDependency</string>
|
||||
<string>58.IBPluginDependency</string>
|
||||
@@ -2212,6 +2336,12 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="unlocalizedProperties">
|
||||
@@ -2226,7 +2356,7 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<reference key="dict.values" ref="0"/>
|
||||
</object>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">496</int>
|
||||
<int key="maxID">503</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
@@ -2240,12 +2370,14 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>aCollectionView</string>
|
||||
<string>anArrayController</string>
|
||||
<string>selectableTextField</string>
|
||||
<string>theWindow</string>
|
||||
</object>
|
||||
<object class="NSArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>NSCollectionView</string>
|
||||
<string>NSArrayController</string>
|
||||
<string>NSTextField</string>
|
||||
<string>NSWindow</string>
|
||||
</object>
|
||||
</object>
|
||||
@@ -2255,6 +2387,7 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>aCollectionView</string>
|
||||
<string>anArrayController</string>
|
||||
<string>selectableTextField</string>
|
||||
<string>theWindow</string>
|
||||
</object>
|
||||
<object class="NSArray" key="dict.values">
|
||||
@@ -2267,6 +2400,10 @@ YW1lIGNvbGxlY3Rpb24gdmlldykuA</bytes>
|
||||
<string key="name">anArrayController</string>
|
||||
<string key="candidateClassName">NSArrayController</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo">
|
||||
<string key="name">selectableTextField</string>
|
||||
<string key="candidateClassName">NSTextField</string>
|
||||
</object>
|
||||
<object class="IBToOneOutletInfo">
|
||||
<string key="name">theWindow</string>
|
||||
<string key="candidateClassName">NSWindow</string>
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
|
||||
[contentView addSubview:label];
|
||||
|
||||
theSlider = [[CPSlider alloc] initWithFrame:CGRectMake(100,100,180,24)];
|
||||
theSlider = [[CPSlider alloc] initWithFrame:CGRectMake(100, 100, 180, 24)];
|
||||
[theSlider setMinValue:36];
|
||||
[theSlider setMaxValue:238];
|
||||
[theSlider setObjectValue:([theSlider minValue] + [theSlider maxValue])/2];
|
||||
[theSlider setObjectValue:([theSlider minValue] + [theSlider maxValue]) / 2];
|
||||
[theSlider setTarget:self];
|
||||
[theSlider setAction:@selector(doSlider:)];
|
||||
[contentView addSubview:theSlider];
|
||||
@@ -104,8 +104,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.5</string>
|
||||
<string>3.0.6</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>3.0.5</string>
|
||||
<string>3.0.6</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.developer-tools</string>
|
||||
<key>LSUIElement</key>
|
||||
|
||||
@@ -98,19 +98,19 @@
|
||||
}
|
||||
|
||||
/* We need a body wrapper because Cappuccino is unhappy if we change the body element */
|
||||
#cappuccino {
|
||||
#cappuccino-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#cappuccino .container {
|
||||
#cappuccino-body .container {
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#cappuccino .content {
|
||||
#cappuccino-body .content {
|
||||
display: table-cell;
|
||||
height: 100%;
|
||||
vertical-align: top;
|
||||
@@ -167,7 +167,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="cappuccino">
|
||||
<div id="cappuccino-body">
|
||||
<div class="container">
|
||||
<div class="content">
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -68,19 +68,19 @@
|
||||
}
|
||||
|
||||
/* We need a body wrapper because Cappuccino is unhappy if we change the body element */
|
||||
#cappuccino {
|
||||
#cappuccino-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#cappuccino .container {
|
||||
#cappuccino-body .container {
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#cappuccino .content {
|
||||
#cappuccino-body .content {
|
||||
display: table-cell;
|
||||
height: 100%;
|
||||
vertical-align: top;
|
||||
@@ -137,7 +137,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="cappuccino">
|
||||
<div id="cappuccino-body">
|
||||
<div class="container">
|
||||
<div class="content">
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -98,19 +98,19 @@
|
||||
}
|
||||
|
||||
/* We need a body wrapper because Cappuccino is unhappy if we change the body element */
|
||||
#cappuccino {
|
||||
#cappuccino-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#cappuccino .container {
|
||||
#cappuccino-body .container {
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#cappuccino .content {
|
||||
#cappuccino-body .content {
|
||||
display: table-cell;
|
||||
height: 100%;
|
||||
vertical-align: top;
|
||||
@@ -167,7 +167,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="cappuccino">
|
||||
<div id="cappuccino-body">
|
||||
<div class="container">
|
||||
<div class="content">
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -68,19 +68,19 @@
|
||||
}
|
||||
|
||||
/* We need a body wrapper because Cappuccino is unhappy if we change the body element */
|
||||
#cappuccino {
|
||||
#cappuccino-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#cappuccino .container {
|
||||
#cappuccino-body .container {
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#cappuccino .content {
|
||||
#cappuccino-body .content {
|
||||
display: table-cell;
|
||||
height: 100%;
|
||||
vertical-align: top;
|
||||
@@ -137,7 +137,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="cappuccino">
|
||||
<div id="cappuccino-body">
|
||||
<div class="container">
|
||||
<div class="content">
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -98,19 +98,19 @@
|
||||
}
|
||||
|
||||
/* We need a body wrapper because Cappuccino is unhappy if we change the body element */
|
||||
#cappuccino {
|
||||
#cappuccino-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#cappuccino .container {
|
||||
#cappuccino-body .container {
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#cappuccino .content {
|
||||
#cappuccino-body .content {
|
||||
display: table-cell;
|
||||
height: 100%;
|
||||
vertical-align: top;
|
||||
@@ -167,7 +167,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="cappuccino">
|
||||
<div id="cappuccino-body">
|
||||
<div class="container">
|
||||
<div class="content">
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -68,19 +68,19 @@
|
||||
}
|
||||
|
||||
/* We need a body wrapper because Cappuccino is unhappy if we change the body element */
|
||||
#cappuccino {
|
||||
#cappuccino-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
#cappuccino .container {
|
||||
#cappuccino-body .container {
|
||||
display: table;
|
||||
margin: 0 auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#cappuccino .content {
|
||||
#cappuccino-body .content {
|
||||
display: table-cell;
|
||||
height: 100%;
|
||||
vertical-align: top;
|
||||
@@ -137,7 +137,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="cappuccino">
|
||||
<div id="cappuccino-body">
|
||||
<div class="container">
|
||||
<div class="content">
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -25,10 +25,16 @@
|
||||
|
||||
@import <AppKit/_CPCibCustomResource.j>
|
||||
|
||||
@import "Nib2CibException.j"
|
||||
|
||||
@global CP_NSMapClassName
|
||||
|
||||
var FILE = require("file"),
|
||||
imageSize = require("cappuccino/imagesize").imagesize;
|
||||
imageSize = require("cappuccino/imagesize").imagesize,
|
||||
supportedTemplateImages = [
|
||||
"NSAddTemplate",
|
||||
"NSRemoveTemplate"
|
||||
];
|
||||
|
||||
@implementation _CPCibCustomResource (NSCoding)
|
||||
|
||||
@@ -47,10 +53,15 @@ var FILE = require("file"),
|
||||
|
||||
if (_resourceName == "NSSwitch")
|
||||
return nil;
|
||||
else if (_resourceName == "NSAddTemplate" || _resourceName == "NSRemoveTemplate")
|
||||
else if (/^NS[A-Z][A-Za-z]+$/.test(_resourceName))
|
||||
{
|
||||
// Defer resolving this path until runtime.
|
||||
_resourceName = _resourceName.replace("NS", "CP");
|
||||
if (supportedTemplateImages.indexOf(_resourceName) >= 0)
|
||||
{
|
||||
// Defer resolving this path until runtime.
|
||||
_resourceName = _resourceName.replace("NS", "CP");
|
||||
}
|
||||
else
|
||||
[CPException raise:Nib2CibException format:@"The built in image “%@” is not supported.", _resourceName];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user