mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-09-10 12:47:13 +00:00
Compare commits
51
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c58c5554f9 | ||
|
|
16ae7b7e74 | ||
|
|
4730c3f4b5 | ||
|
|
19ba66fd9d | ||
|
|
589c26192d | ||
|
|
8471aeea1b | ||
|
|
2cfe45950b | ||
|
|
688671db6a | ||
|
|
1d2e50dfa2 | ||
|
|
7a70036c8f | ||
|
|
ab88a3b236 | ||
|
|
266e14063e | ||
|
|
3af0296779 | ||
|
|
5ff05503a4 | ||
|
|
13e6782cf1 | ||
|
|
24052e6369 | ||
|
|
9b17ce5524 | ||
|
|
e4c2d62eb0 | ||
|
|
27fa37a7e1 | ||
|
|
987da2b812 | ||
|
|
d1611bae12 | ||
|
|
96a3c4b9dd | ||
|
|
8ef40dced5 | ||
|
|
4a6ddb901f | ||
|
|
a5094e0acc | ||
|
|
fffcca592d | ||
|
|
341584c032 | ||
|
|
a1e178d0d7 | ||
|
|
6d78b9b6df | ||
|
|
0669ce06f2 | ||
|
|
767d9378e3 | ||
|
|
c2d62b7a13 | ||
|
|
10e33298a9 | ||
|
|
ecc88112d5 | ||
|
|
b190063264 | ||
|
|
0c9c0c0239 | ||
|
|
ae333ecb77 | ||
|
|
72a85d11df | ||
|
|
f642330306 | ||
|
|
ae1a39322e | ||
|
|
29502d10eb | ||
|
|
37550b9fb0 | ||
|
|
efd2ed1960 | ||
|
|
3a164c8080 | ||
|
|
fb9223c6c3 | ||
|
|
6c6f69d4e5 | ||
|
|
e836226174 | ||
|
|
9f9044b164 | ||
|
|
c528421a8e | ||
|
|
0cfb53cea4 | ||
|
|
b349f0a2fb |
@@ -5,9 +5,9 @@ name: Node build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ node ]
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ node ]
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
@@ -385,6 +385,18 @@ CPAMPMDateType = 6;
|
||||
return;
|
||||
}
|
||||
|
||||
// if we enter a day that is too high for the current month
|
||||
// we need to increase the month by one
|
||||
// if we do not do this, the user input would be silently reset
|
||||
// very poor user experience
|
||||
|
||||
if (parseInt(anObjectValue, 10) > [dateValue _daysInMonth])
|
||||
{
|
||||
[_datePickerElementView._textFieldMonth setIntValue:(dateValue.getMonth() + 2)];
|
||||
[super setObjectValue:objectValue];
|
||||
return;
|
||||
}
|
||||
|
||||
[super setObjectValue:objectValue];
|
||||
break;
|
||||
|
||||
|
||||
+11
-2
@@ -261,10 +261,19 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0,
|
||||
{
|
||||
var contentView = [scrollView contentView],
|
||||
bounds = [contentView bounds],
|
||||
insetBounds = CGRectInset(bounds, 30, 30),
|
||||
eventLocation = [contentView convertPoint:_draggingLocation fromView:nil],
|
||||
deltaX = 0,
|
||||
deltaY = 0;
|
||||
deltaY = 0,
|
||||
insetSize = 30;
|
||||
|
||||
if ([contentView respondsToSelector:@selector(documentView)] &&
|
||||
[[contentView documentView] respondsToSelector:@selector(rowHeight)])
|
||||
{
|
||||
// Adjust inset bounds based on CPTableView row height
|
||||
insetSize = MAX(insetSize, [[contentView documentView] rowHeight]);
|
||||
}
|
||||
|
||||
var insetBounds = CGRectInset(bounds, insetSize, insetSize);
|
||||
|
||||
if (!CGRectContainsPoint(insetBounds, eventLocation))
|
||||
{
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
@import "CPKeyValueBinding.j"
|
||||
@import "CPMenuItem.j"
|
||||
@import "CALayer.j"
|
||||
|
||||
@global CPApp
|
||||
|
||||
@@ -1016,6 +1017,10 @@ var _CPMenuBarVisible = NO,
|
||||
// an additional mouse move after all this, but not in other browsers.
|
||||
// This will be fixed correctly with the coming run loop changes.
|
||||
[_CPDisplayServer run];
|
||||
|
||||
// If layers are updated within the menu callback, the re-draw & re-layout doesn't occur until a mouse move.
|
||||
// We force the update here.
|
||||
[CALayer runLoopUpdateLayers];
|
||||
}
|
||||
|
||||
/* @ignore */
|
||||
|
||||
@@ -585,6 +585,12 @@ CPTokenFieldDeleteButtonType = 1;
|
||||
// Snap to the token if it's only half visible due to mouse wheel scrolling.
|
||||
_shouldScrollTo = aToken;
|
||||
}
|
||||
|
||||
// this is a hack to compensate for a recent adoption in FR management as introduced by commit #26aab29
|
||||
// this PR makes the tokenfield loose FR status prematurely, so we have to regain here in order to make deleteForward: and friends work
|
||||
setTimeout(function(){
|
||||
[[self window] makeFirstResponder:self];
|
||||
}, 50);
|
||||
}
|
||||
|
||||
// ===========
|
||||
@@ -965,8 +971,8 @@ CPTokenFieldDeleteButtonType = 1;
|
||||
[self _selectToken:tokenView byExtendingSelection:NO];
|
||||
}
|
||||
}
|
||||
else
|
||||
[self _removeSelectedTokens:nil];
|
||||
// we have to remove unconditionally because the backspace is not propagated anymore starting from commit #26aab29
|
||||
[self _removeSelectedTokens:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+12
-1
@@ -44,6 +44,7 @@
|
||||
@class CPClipView
|
||||
@class CPScrollView
|
||||
@class CALayer
|
||||
@class CPBinder
|
||||
|
||||
@global appkit_tag_dom_elements
|
||||
|
||||
@@ -232,7 +233,7 @@ var CPViewHighDPIDrawingEnabled = YES;
|
||||
JSObject _ephemeralSubviews;
|
||||
|
||||
JSObject _ephemeralSubviewsForNames;
|
||||
CPSet _ephereralSubviews;
|
||||
CPSet _ephemeralSubviews;
|
||||
|
||||
// Key View Support
|
||||
CPView _nextKeyView;
|
||||
@@ -3732,6 +3733,16 @@ var CPAppearanceVibrantDark = [CPAppearance appearanceNamed:CPAppearanceNameVibr
|
||||
[owners[i] updateTrackingAreas];
|
||||
}
|
||||
|
||||
// needed by CPWindow's releasedWhenClosed property
|
||||
- (void)_releaseRecursively
|
||||
{
|
||||
[_subviews makeObjectsPerformSelector:@selector(_releaseRecursively)];
|
||||
|
||||
[self _removeObservers];
|
||||
[CPBinder unbindAllForObject:self];
|
||||
[self removeFromSuperview];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask",
|
||||
|
||||
@@ -186,6 +186,7 @@ var CPWindowActionMessageKeys = [
|
||||
BOOL _constrainsToUsableScreen;
|
||||
unsigned _shadowStyle;
|
||||
BOOL _showsResizeIndicator;
|
||||
BOOL _releasedWhenClosed @accessors(property=releasedWhenClosed);
|
||||
|
||||
int _positioningMask;
|
||||
CGRect _positioningScreenRect;
|
||||
@@ -2536,6 +2537,9 @@ CPTexturedBackgroundWindowMask
|
||||
[_parentWindow removeChildWindow:self];
|
||||
[self _orderOutRecursively:NO];
|
||||
[self _detachFromChildrenClosing:!_parentWindow];
|
||||
|
||||
if (_releasedWhenClosed)
|
||||
[_contentView _releaseRecursively];
|
||||
}
|
||||
|
||||
- (void)_detachFromChildrenClosing:(BOOL)shouldCloseChildren
|
||||
|
||||
@@ -570,6 +570,16 @@ var CPStringNull = [CPNull null];
|
||||
return aString && aString != "" && self.indexOf(aString) == 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns \c YES if the receiver contains
|
||||
the specified string. If \c aString
|
||||
is empty, the method will return \c NO.
|
||||
*/
|
||||
- (BOOL)containsString:(CPString)aString
|
||||
{
|
||||
return aString && aString != "" && self.indexOf(aString) >= 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns \c YES if the receiver ends
|
||||
with the specified string. If \c aString
|
||||
|
||||
+67
-35
@@ -5,45 +5,60 @@
|
||||
Welcome to Cappuccino!
|
||||
======================
|
||||
|
||||
Cappuccino, a web application framework in Objective-J, a superset of JavaScript, enhances web development by implementing the NeXTSTEP/Apple Cocoa APIs for web browsers. This integration supports the creation of sophisticated, desktop-class applications without imposing arbitrary complexity limits. Leveraging Cocoa’s well-established architecture, Cappuccino facilitates scalable and reliable application development. Applications can be served from any web server and deployed to any modern web browser without dependencies, offering a streamlined solution for developers.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
Cappuccino is an open source framework that makes it easy to build
|
||||
desktop-caliber applications that run in a web browser.
|
||||
Cappuccino is an open-source framework in continuous development since 2008 and released under the LGPL2 license. It implements as much of the proven NeXTStep/Apple Cocoa API as practicable in the modern web browser environment. Resulting applications are served as HTML, JavaScript, and CSS, allowing deployment from any web host.
|
||||
|
||||
With Cappuccino, you don't concern yourself with HTML, CSS, or the DOM. You write applications with the APIs from
|
||||
Apple's Cocoa frameworks and the Objective-J language.
|
||||
Benefits of Cappuccino's Cocoa implementation:
|
||||
* Cross-platform development – any programmer's text editor or IDE is sufficient. The compiler and other parts of the toolchain required to prepare applications for deployment are hosted by Node.js.
|
||||
* Cocoa's rich range of interface controls are abstracted to HTML, CSS, and JavaScript. These go well beyond the functionality provided by current browser standards, and only require minimal HTML5 support.
|
||||
* These design patterns and APIs provide a solid foundation for application development. The APIs have been proven over forty years and provide browser-independent functionality which is a superset of current browser capabilities.
|
||||
* Custom interface controls can reliably build on basic Cocoa controls if extended or new functionality is required.
|
||||
* Robust event-handling mechanisms, a superset of those provided by current browsers, ensure responsive and interactive applications.
|
||||
* Internationalization and localization technologies simplify global deployment.
|
||||
* Consistent and predictable behavior across different platforms enhances reliability and user experience.
|
||||
* Objective-J's [message-passing architecture](https://en.wikipedia.org/wiki/Message_passing), which the Cocoa APIs leverage, promote loose coupling of an app's component functionality — making large scale development more managable.
|
||||
* Comprehensive documentation for Objective-J is supplemented by over two decades of resources for Objective-C and Cocoa. Additionally, a large public catalog of Objective-C Cocoa applications offers valuable guidance for development. Translation of such sample code to Objective-J is often trivial.
|
||||
* Toolchain stability – use of time-tested APIs means an absense of the churn which is all too common in the current generic browser-app ecosystem.
|
||||
* The first web browser and server were written in 1990 by a single person using the APIs which Apple later re-branded and extended as Cocoa. Beyond being a testament to their productivity, it doesn't seem out of place to write application software using the same APIs.
|
||||
|
||||
Check out a [live demo of the widgets in Cappuccino](https://cappuccino-testbook.5apps.com/#ThemeKitchenSink)
|
||||
Check out a [live demo of the standard interface controls provided by Cappuccino](https://cappuccino-testbook.5apps.com/#ThemeKitchenSink)
|
||||
|
||||
Check out some [tutorials](https://cappuccino-cookbook.5apps.com)
|
||||
|
||||
For more information, see the
|
||||
- [Official website](http://cappuccino-project.org)
|
||||
- [Github Wiki](https://github.com/cappuccino/cappuccino/wiki)
|
||||
- [FAQ](http://cappuccino-project.org/support/faq.html)
|
||||
- [Documentation](http://cappuccino-project.org/learn/)
|
||||
- [Mailing list](http://groups.google.com/group/objectivej)
|
||||
- [Official website](http://cappuccino.dev)
|
||||
- [Gitter](https://gitter.im/cappuccino/cappuccino)
|
||||
- [Github Wiki](https://github.com/cappuccino/cappuccino/wiki)
|
||||
- [FAQ](http://cappuccino.dev/support/faq.html)
|
||||
- [Documentation](http://cappuccino.dev/learn/)
|
||||
- [Mailing list (inactive – for historical purposes only)](http://groups.google.com/group/objectivej)
|
||||
|
||||
Follow [@cappuccino](https://twitter.com/cappuccino) on Twitter for updates on the project.
|
||||
|
||||
If you discover any bugs, please [file a ticket](http://github.com/cappuccino/cappuccino/issues).
|
||||
Bugs and enhancement requrests can be reported by [creating a Github issue](http://github.com/cappuccino/cappuccino/issues).
|
||||
|
||||
System Requirements
|
||||
-------------------
|
||||
To run Cappuccino applications, all you need is a HTML5 compliant web browser.
|
||||
* A minimally HTML5-compliant web browser is the only requirement for running Cappuccino applications.
|
||||
They are served as standard HTML, Javascript, CSS and images from any web server.
|
||||
* Any programmer's editor can be used for coding.
|
||||
* macOS users can use Xcode - which leverages the visual development tools from Apple for creation of complex applications with minimal coding.
|
||||
|
||||
You can develop Cappuccino applications with only a simple text editor on any platform.
|
||||
|
||||
If you are on a Mac, our integration with Xcode leverages the world-class visual development tools from Apple to create complex applications with minimal coding.
|
||||
|
||||
Node.js version alpha
|
||||
Notes on the transition of Cappuccino from the Narwhal Javascript engine to Node.js
|
||||
------------------
|
||||
|
||||
There is currently an ongoing effort to switch JavaScript platform from [Narwhal](https://narwhaljs.org/) to Node.js.
|
||||
To try the Node.js version, do the following:
|
||||
Cappuccino compiles source code files written in Objective-J or Javascript to pure HTML/Javascript/CSS.
|
||||
A desktop Javascript engine with CommonJS for accessing local resources is required for the compilation phase.
|
||||
Historically, this engine was [Narwhal](https://narwhaljs.org/).
|
||||
A transition to [Node.js](https://nodejs.org) is being finalized.
|
||||
The results of this transition are available as a Release Candidate.
|
||||
While a formal production release is scheduled for early-autumn 2024, it should be considered production-ready as-is. Multiple production deployments over the last twelve months have confirmed this.
|
||||
In addition to the Node.js-based toolchain, the next formal release will include multiple maintenance improvements and enhancements to the API.
|
||||
|
||||
1. Install Node.js and npm from the [Node.js website](https://nodejs.org/en/).
|
||||
To try Cappuccino using the Node.js version, do the following:
|
||||
|
||||
1. Install Node.js and npm from the [Node.js website](https://nodejs.org/download/) or the OS-specific package manager of your choice. Long-term Support (LTS) versions are supported although others will probably work as intended.
|
||||
|
||||
2. Run `npm set prefix ~/.npm`. This will set the default install location for npm to `~/.npm`. The reasoning behind
|
||||
this is outlined in the section about permission issues below.
|
||||
@@ -63,23 +78,22 @@ this is outlined in the section about permission issues below.
|
||||
|
||||
By default npm uses `/usr/local/lib/node_modules` as the install location for globally installed packages. This causes
|
||||
problems since users typically lack write permissions there. It is therefore recommended to either use a version
|
||||
manager, or change npm's default install location manually (which is what we did above). For more details on how to do
|
||||
this, see [this article](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally).
|
||||
manager, or change npm's default install location manually (which is what we did above with the `npm set prefix…` command). For more details see [this article](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally).
|
||||
|
||||
### Basic usage
|
||||
|
||||
If the install succeeded you will be able to do the following to create a simple Cappuccino application:
|
||||
On successful installation, follow these steps to create a basic and fully-functional Cappuccino application:
|
||||
|
||||
1. `capp gen HelloWorld`
|
||||
2. `cd HelloWorld`
|
||||
3. `python3 -m http.server`
|
||||
3. `python3 -m http.server` (any local http server can be used)
|
||||
4. Go to `localhost:8000` in your web browser.
|
||||
|
||||
### Building Cappuccino from source
|
||||
|
||||
If you want to build Cappuccino from source you should clone the GitHub repository at
|
||||
https://github.com/cappuccino/cappuccino/ and checkout the `node` branch. Then you can use the command
|
||||
`jake install` to install Cappuccino and its tools locally.
|
||||
To build Cappuccino from source clone the GitHub repository at
|
||||
https://github.com/cappuccino/cappuccino/ and checkout the `main` branch. Use the command
|
||||
`jake install` to install the Cappuccino frameworks and toolchain locally.
|
||||
|
||||
To build from source, do:
|
||||
|
||||
@@ -103,14 +117,32 @@ To build from source, do:
|
||||
Beware that building and installing Cappuccino from source will overwrite the binaries installed from npm. To undo this,
|
||||
simply run `npm install -g @objj/cappuccino` again.
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
To write you first application, [download the starter package](http://cappuccino.dev/#download).
|
||||
FAQs
|
||||
----
|
||||
**Q: Can I use Cappuccino on Windows/Linux?**
|
||||
**A:** Yes, Cappuccino can be used on Windows or Linux. While Cappuccino technology is inspired by Apple's Cocoa framework, it is designed to be platform-independent. As long as you have a modern web browser and a compatible development environment (An LTS version of Node.js and an http server), you can develop and deploy Cappuccino applications on other operating systems without any issues.
|
||||
|
||||
To try our new Node (alpha) version of the Cappuccino framework, [check the Node installation instructions](https://github.com/cappuccino/cappuccino/wiki/node)
|
||||
**Q: Has Apple not moved away from Objective-C and Cocoa, making this a dead end?**
|
||||
**A:** While Apple has introduced Swift as a modern language and shifted focus to frameworks like SwiftUI, Objective-C and Cocoa remain widely used and supported. Cappuccino leverages the mature and proven Cocoa architecture, which continues to be relevant for many applications. Additionally, Cappuccino’s design abstracts these technologies to the web, ensuring that developers can create robust web applications regardless of Apple’s evolving ecosystem.
|
||||
|
||||
**Q: What is with the funny syntax of Objective-J and its brackets? I've never seen a language like this – how can anyone be productive with something so strange?**
|
||||
**A:** Objective-J’s syntax, with its brackets, is inspired by Objective-C, which has been used for decades in developing macOS and iOS applications. While it may seem unusual initially, it provides a powerful way to structure code and manage objects. Developers familiar with Objective-C will find it intuitive, and those new to it can leverage extensive documentation and community resources. The initial learning curve is offset by the productivity gains in building complex, maintainable web applications.
|
||||
|
||||
**Q: I have my own HTML, JavaScript, and CSS I'd like to use in a larger app. I don't see any JavaScript, HTML, or CSS in the sample code available. How do I modify the DOM?**
|
||||
**A:** Cappuccino abstracts much of the DOM to align with Cocoa's model. Existing Cocoa controls can be extended or new ones built from scratch to meet specific requirements. The Cocoa APIs follow a classic object-oriented programming model – most necessary functionality will be inherited from the Cappuccino base class one is starting with. The [CPWebView](https://www.cappuccino.dev/learn/documentation/interface_c_p_web_view.html) control can also be used to embed either HTML/Javascript/CSS fragments or entire web pages.
|
||||
|
||||
**Q: What are the advantages of Cappuccino over libraries and frameworks like React and Vue?**
|
||||
**A:** Cappuccino offers several advantages:
|
||||
|
||||
* Cocoa Architecture: Leverages the mature and robust Cocoa APIs, providing a solid foundation for complex applications.
|
||||
* Object-Oriented Approach: Uses Objective-J, which extends JavaScript with powerful object-oriented capabilities.
|
||||
* Desktop-Class Applications: Designed for creating rich, desktop-like applications that run in web browsers.
|
||||
* Unified Framework: Integrates UI components, event handling, and data management in a cohesive package.
|
||||
* Legacy and Stability: Continuous development since 2008 (1986, if going back to the inception of Objective-C and Cocoa) ensures stability and reliability.
|
||||
|
||||
**Q: I've heard claims about Objective-C and Cocoa providing increased productivity – how true is this?**.
|
||||
**A:** Objective-C and Cocoa are designed for efficiency and ease of use. Their mature, well-documented APIs and comprehensive frameworks enable rapid development of robust applications. The object-oriented nature of Objective-C promotes code reuse and modularity, while Cocoa’s design patterns streamline common tasks. Developers often find that these features collectively lead to increased productivity, especially for complex, desktop-class applications.
|
||||
|
||||
To contribute to Cappuccino, please read here: [Getting and Building the Source](
|
||||
https://github.com/cappuccino/cappuccino/wiki/Getting-and-building-the-source).
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* AppController.j
|
||||
* CPMenuCALayerTest
|
||||
*
|
||||
* Created by Mathieu Monney on December 19, 2014.
|
||||
* Copyright 2014, Vidinoti SA, All rights reserved.
|
||||
*/
|
||||
|
||||
@import <Foundation/CPObject.j>
|
||||
|
||||
@implementation MyLayer : CALayer
|
||||
{
|
||||
}
|
||||
|
||||
- (void)drawInContext:(CGContext)aContext {
|
||||
CGContextSetFillColor(aContext, [CPColor blackColor]);
|
||||
CGContextFillRect(aContext, _bounds);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation AppController : CPObject
|
||||
{
|
||||
MyLayer layer;
|
||||
}
|
||||
|
||||
-(void)changeSize:(id)sender {
|
||||
var scale = [[sender selectedItem] title];
|
||||
scale = scale.substr(0,scale.length-1);
|
||||
|
||||
// Change the affine transform of the layer to make sure it is updated due to
|
||||
// https://github.com/cappuccino/cappuccino/pull/2018
|
||||
var af = CGAffineTransformMakeScale(scale/100.0,scale/100.0);
|
||||
[layer setAffineTransform:af];
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
{
|
||||
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
|
||||
contentView = [theWindow contentView],
|
||||
popupButton = [[CPPopUpButton alloc] initWithFrame:CGRectMakeZero()];
|
||||
|
||||
// Changing the button should change the size of the layer if #2018 is fixed.
|
||||
[popupButton addItemsWithTitles:[@"100%",@"50%",@"25%"]];
|
||||
[popupButton sizeToFit];
|
||||
[popupButton setAction:@selector(changeSize:)];
|
||||
[popupButton setTarget:self];
|
||||
|
||||
[popupButton setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin];
|
||||
[popupButton setCenter:[contentView center]];
|
||||
|
||||
[contentView addSubview:popupButton];
|
||||
|
||||
[theWindow orderFront:self];
|
||||
|
||||
var layerRoot = [[CALayer alloc ] init];
|
||||
[layerRoot setBounds:CGRectMake(0,0,[contentView bounds].size.width,[contentView bounds].size.height)];
|
||||
[layerRoot setPosition:CGPointMake(0,0)];
|
||||
[contentView setWantsLayer:YES];
|
||||
|
||||
[contentView setLayer:layerRoot];
|
||||
|
||||
layer = [[MyLayer alloc ] init];
|
||||
[layer setBounds:CGRectMake(0,0,100,100)];
|
||||
[layer setPosition:CGPointMake([contentView bounds].size.width/2,[contentView bounds].size.height/2-100)];
|
||||
[layer setNeedsDisplay];
|
||||
|
||||
[layerRoot addSublayer:layer];
|
||||
|
||||
// Uncomment the following line to turn on the standard menu bar.
|
||||
//[CPMenu setMenuBarVisible:YES];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CPApplicationDelegateClass</key>
|
||||
<string>AppController</string>
|
||||
<key>CPBundleName</key>
|
||||
<string>CPMenuCALayerTest</string>
|
||||
<key>CPPrincipalClass</key>
|
||||
<string>CPApplication</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Jakefile
|
||||
* CPMenuCALayerTest
|
||||
*
|
||||
* Created by Mathieu Monney on December 19, 2014.
|
||||
* Copyright 2014, Vidinoti SA, All rights reserved.
|
||||
*/
|
||||
|
||||
var ENV = require("system").env,
|
||||
FILE = require("file"),
|
||||
JAKE = require("jake"),
|
||||
task = JAKE.task,
|
||||
FileList = JAKE.FileList,
|
||||
app = require("cappuccino/jake").app,
|
||||
configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug",
|
||||
OS = require("os");
|
||||
|
||||
app ("CPMenuCALayerTest", function(task)
|
||||
{
|
||||
task.setBuildIntermediatesPath(FILE.join("Build", "CPMenuCALayerTest.build", configuration));
|
||||
task.setBuildPath(FILE.join("Build", configuration));
|
||||
|
||||
task.setProductName("CPMenuCALayerTest");
|
||||
task.setIdentifier("com.yourcompany.CPMenuCALayerTest");
|
||||
task.setVersion("1.0");
|
||||
task.setAuthor("WireLoad, LLC");
|
||||
task.setEmail("feedback @nospam@ yourcompany.com");
|
||||
task.setSummary("CPMenuCALayerTest");
|
||||
task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**")));
|
||||
task.setResources(new FileList("Resources/**"));
|
||||
task.setIndexFilePath("index.html");
|
||||
task.setInfoPlistPath("Info.plist");
|
||||
|
||||
if (configuration === "Debug")
|
||||
task.setCompilerFlags("-DDEBUG -g");
|
||||
else
|
||||
task.setCompilerFlags("-O");
|
||||
});
|
||||
|
||||
task ("default", ["CPMenuCALayerTest"], function()
|
||||
{
|
||||
printResults(configuration);
|
||||
});
|
||||
|
||||
task ("build", ["default"]);
|
||||
|
||||
task ("debug", function()
|
||||
{
|
||||
ENV["CONFIGURATION"] = "Debug";
|
||||
JAKE.subjake(["."], "build", ENV);
|
||||
});
|
||||
|
||||
task ("release", function()
|
||||
{
|
||||
ENV["CONFIGURATION"] = "Release";
|
||||
JAKE.subjake(["."], "build", ENV);
|
||||
});
|
||||
|
||||
task ("run", ["debug"], function()
|
||||
{
|
||||
OS.system(["open", FILE.join("Build", "Debug", "CPMenuCALayerTest", "index.html")]);
|
||||
});
|
||||
|
||||
task ("run-release", ["release"], function()
|
||||
{
|
||||
OS.system(["open", FILE.join("Build", "Release", "CPMenuCALayerTest", "index.html")]);
|
||||
});
|
||||
|
||||
task ("deploy", ["release"], function()
|
||||
{
|
||||
FILE.mkdirs(FILE.join("Build", "Deployment", "CPMenuCALayerTest"));
|
||||
OS.system(["press", "-f", FILE.join("Build", "Release", "CPMenuCALayerTest"), FILE.join("Build", "Deployment", "CPMenuCALayerTest")]);
|
||||
printResults("Deployment")
|
||||
});
|
||||
|
||||
task ("desktop", ["release"], function()
|
||||
{
|
||||
FILE.mkdirs(FILE.join("Build", "Desktop", "CPMenuCALayerTest"));
|
||||
require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPMenuCALayerTest"), FILE.join("Build", "Desktop", "CPMenuCALayerTest", "CPMenuCALayerTest.app"));
|
||||
printResults("Desktop")
|
||||
});
|
||||
|
||||
task ("run-desktop", ["desktop"], function()
|
||||
{
|
||||
OS.system([FILE.join("Build", "Desktop", "CPMenuCALayerTest", "CPMenuCALayerTest.app", "Contents", "MacOS", "NativeHost"), "-i"]);
|
||||
});
|
||||
|
||||
function printResults(configuration)
|
||||
{
|
||||
print("----------------------------");
|
||||
print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPMenuCALayerTest"));
|
||||
print("----------------------------");
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,103 @@
|
||||
<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<!--
|
||||
index-debug.html
|
||||
CPMenuCALayerTest
|
||||
|
||||
Created by Mathieu Monney on December 19, 2014.
|
||||
Copyright 2014, Vidinoti SA, All rights reserved.
|
||||
-->
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, chrome=1" />
|
||||
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
|
||||
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||
|
||||
<link rel="apple-touch-icon" href="Resources/icon.png" />
|
||||
<link rel="apple-touch-startup-image" href="Resources/default.png" />
|
||||
|
||||
<title>CPMenuCALayerTest</title>
|
||||
|
||||
<script type="text/javascript">
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
OBJJ_INCLUDE_PATHS = ["Frameworks/Debug", "Frameworks", "SomethingElse"];
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Debug/Objective-J/Objective-J.js" type="text/javascript" charset="UTF-8"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
objj_msgSend_reset();
|
||||
|
||||
// DEBUG OPTIONS:
|
||||
|
||||
// Uncomment to enable printing of backtraces on exceptions:
|
||||
//objj_msgSend_decorate(objj_backtrace_decorator);
|
||||
|
||||
// Uncomment to supress exceptions that take place inside a message
|
||||
//objj_msgSend_decorate(objj_supress_exceptions_decorator)
|
||||
|
||||
// Uncomment to enable runtime type checking:
|
||||
//objj_msgSend_decorate(objj_typecheck_decorator);
|
||||
|
||||
// Uncomment (along with both above) to print backtraces on type check errors:
|
||||
//objj_typecheck_prints_backtrace = true;
|
||||
|
||||
// Uncomment to disable the default logger (CPLogConsole if window.console exists, CPLogPopup otherwise):
|
||||
//CPLogUnregister(CPLogDefault);
|
||||
|
||||
// Uncomment to enable a specific logger:
|
||||
//CPLogRegister(CPLogConsole);
|
||||
//CPLogRegister(CPLogPopup);
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
#container {position: absolute; top:50%; left:50%;}
|
||||
#content {width:800px; text-align:center; margin-left: -400px; height:50px; margin-top:-25px; line-height: 50px;}
|
||||
#content {font-family: "Helvetica", "Arial", sans-serif; font-size: 18px; color: black; text-shadow: 0px 1px 0px white; }
|
||||
#loadgraphic {margin-right: 0.2em; margin-bottom:-2px;}
|
||||
</style>
|
||||
|
||||
<!--[if lt IE 7]>
|
||||
<STYLE type="text/css">
|
||||
#container { position: relative; top: 50%; }
|
||||
#content { position: relative;}
|
||||
</STYLE>
|
||||
<![endif]-->
|
||||
|
||||
</head>
|
||||
|
||||
<body style="">
|
||||
<div id="cappuccino-body">
|
||||
<div id="loadingcontainer" style="background-color: #eeeeee; overflow:hidden; width:100%; height:100%; position: absolute; top: 0; left: 0;">
|
||||
<script type="text/javascript">
|
||||
document.write("<div id='container'><p id='content'>" +
|
||||
"<img id='loadgraphic' width='16' height='16' src='Resources/spinner.gif' /> " +
|
||||
"Loading CPMenuCALayerTest...</p></div>");
|
||||
</script>
|
||||
|
||||
<noscript>
|
||||
<div id="container">
|
||||
<div style="width: 440px; padding: 10px 25px 20px 25px; font-family: sans-serif; background-color: #ffffff; position: relative; left: -245px; top: -120px; text-align: center; -moz-border-radius: 20px; -webkit-border-radius: 20px; color: #555555">
|
||||
<p style="line-height: 1.4em;">JavaScript is required for this site to work correctly but is either disabled or not supported by your browser.</p>
|
||||
<p style="font-size:120%; padding:10px;"><a href="http://cappuccino-project.org/noscript">Show me how to enable JavaScript</a></p>
|
||||
<p style="font-size:80%;">You may want to upgrade to a newer browser while you're at it:</p>
|
||||
<ul style="margin:0;padding:0; text-align: center; font-size:80%;" >
|
||||
<li style="display: inline;"><a href="http://www.apple.com/safari/download/">Safari</a></li>
|
||||
<li style="display: inline;"><a href="http://www.mozilla.com/en-US/firefox/">Firefox</a></li>
|
||||
<li style="display: inline;"><a href="http://www.google.com/chrome/">Chrome</a></li>
|
||||
<li style="display: inline;"><a href="http://www.opera.com/download/">Opera</a></li>
|
||||
<li style="display: inline;"><a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx">Internet Explorer</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</noscript>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,78 @@
|
||||
<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<!--
|
||||
index.html
|
||||
CPMenuCALayerTest
|
||||
|
||||
Created by Mathieu Monney on December 19, 2014.
|
||||
Copyright 2014, Vidinoti SA, All rights reserved.
|
||||
-->
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, chrome=1" />
|
||||
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
|
||||
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||
|
||||
<link rel="apple-touch-icon" href="Resources/icon.png" />
|
||||
<link rel="apple-touch-startup-image" href="Resources/default.png" />
|
||||
|
||||
<title>CPMenuCALayerTest</title>
|
||||
|
||||
<script type="text/javascript">
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="Frameworks/Objective-J/Objective-J.js" charset="UTF-8"></script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
#container {position: absolute; top:50%; left:50%;}
|
||||
#content {width:800px; text-align:center; margin-left: -400px; height:50px; margin-top:-25px; line-height: 50px;}
|
||||
#content {font-family: "Helvetica", "Arial", sans-serif; font-size: 18px; color: black; text-shadow: 0px 1px 0px white; }
|
||||
#loadgraphic {margin-right: 0.2em; margin-bottom:-2px;}
|
||||
</style>
|
||||
|
||||
<!--[if lt IE 7]>
|
||||
<STYLE type="text/css">
|
||||
#container { position: relative; top: 50%; }
|
||||
#content { position: relative;}
|
||||
</STYLE>
|
||||
<![endif]-->
|
||||
|
||||
</head>
|
||||
|
||||
<body style="">
|
||||
<div id="cappuccino-body">
|
||||
<div id="loadingcontainer" style="background-color: #eeeeee; overflow:hidden; width:100%; height:100%; position: absolute; top: 0; left: 0;">
|
||||
<script type="text/javascript">
|
||||
document.write("<div id='container'><p id='content'>" +
|
||||
"<img id='loadgraphic' width='16' height='16' src='Resources/spinner.gif' /> " +
|
||||
"Loading CPMenuCALayerTest...</p></div>");
|
||||
</script>
|
||||
|
||||
<noscript>
|
||||
<div id="container">
|
||||
<div style="width: 440px; padding: 10px 25px 20px 25px; font-family: sans-serif; background-color: #ffffff; position: relative; left: -245px; top: -120px; text-align: center; -moz-border-radius: 20px; -webkit-border-radius: 20px; color: #555555">
|
||||
<p style="line-height: 1.4em;">JavaScript is required for this site to work correctly but is either disabled or not supported by your browser.</p>
|
||||
<p style="font-size:120%; padding:10px;"><a href="http://cappuccino-project.org/noscript">Show me how to enable JavaScript</a></p>
|
||||
<p style="font-size:80%;">You may want to upgrade to a newer browser while you're at it:</p>
|
||||
<ul style="margin:0;padding:0; text-align: center; font-size:80%;" >
|
||||
<li style="display: inline;"><a href="http://www.apple.com/safari/download/">Safari</a></li>
|
||||
<li style="display: inline;"><a href="http://www.mozilla.com/en-US/firefox/">Firefox</a></li>
|
||||
<li style="display: inline;"><a href="http://www.google.com/chrome/">Chrome</a></li>
|
||||
<li style="display: inline;"><a href="http://www.opera.com/download/">Opera</a></li>
|
||||
<li style="display: inline;"><a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx">Internet Explorer</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</noscript>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* AppController.j
|
||||
* CPMenuCALayerTest
|
||||
*
|
||||
* Created by Mathieu Monney on December 19, 2014.
|
||||
* Copyright 2014, Vidinoti SA, All rights reserved.
|
||||
*/
|
||||
|
||||
@import <Foundation/Foundation.j>
|
||||
@import <AppKit/AppKit.j>
|
||||
|
||||
@import "AppController.j"
|
||||
|
||||
|
||||
function main(args, namedArgs)
|
||||
{
|
||||
CPApplicationMain(args, namedArgs);
|
||||
}
|
||||
@@ -24,9 +24,9 @@ task ("build", function()
|
||||
minorVersion = parseInt(versions[1], 10),
|
||||
buildVersion = parseInt(versions[2], 10);
|
||||
|
||||
if (!((majorVersion == 11) || (majorVersion == 10 && minorVersion >= 12)))
|
||||
if (!((majorVersion >= 11) || (majorVersion == 10 && minorVersion >= 13)))
|
||||
{
|
||||
colorPrint("XcodeCapp requires at least macOS Sierra.", "red");
|
||||
colorPrint("XcodeCapp requires at least macOS High Sierra.", "red");
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
|
||||
@@ -444,7 +444,6 @@
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEPLOYMENT_LOCATION = YES;
|
||||
DSTROOT = /;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -463,7 +462,7 @@
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INSTALL_PATH = $USER_APPS_DIR;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
@@ -494,7 +493,6 @@
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEPLOYMENT_LOCATION = YES;
|
||||
DSTROOT = /;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -506,7 +504,7 @@
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INSTALL_PATH = $USER_APPS_DIR;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
@@ -518,11 +516,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DSTROOT = /;
|
||||
INFOPLIST_FILE = XcodeCapp/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = XcodeCapp;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||
INSTALL_PATH = "$(LOCAL_APPS_DIR)";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cappuccino.xcodecapp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
@@ -534,11 +533,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DSTROOT = /;
|
||||
INFOPLIST_FILE = XcodeCapp/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = XcodeCapp;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||
INSTALL_PATH = "$(LOCAL_APPS_DIR)";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cappuccino.xcodecapp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
@property IBOutlet XCCMainController *mainWindowController;
|
||||
@property NSOperationQueue *mainOperationQueue;
|
||||
@property NSString *version;
|
||||
@property NSString *copyright;
|
||||
|
||||
- (IBAction)openAbout:(id)aSender;
|
||||
- (IBAction)openPreferences:(id)aSender;
|
||||
|
||||
@@ -28,10 +28,10 @@
|
||||
|
||||
- (void)_initStatusItem
|
||||
{
|
||||
self->imageStatusInactive = [NSImage imageNamed:@"status-icon-inactive"];
|
||||
self->imageStatusProcessing = [NSImage imageNamed:@"status-icon-working"];
|
||||
self->imageStatusError = [NSImage imageNamed:@"status-icon-error"];
|
||||
|
||||
self->imageStatusInactive = [NSImage imageNamed:@"status-icon-inactive"];
|
||||
self->imageStatusProcessing = [NSImage imageNamed:@"status-icon-working"];
|
||||
self->imageStatusError = [NSImage imageNamed:@"status-icon-error"];
|
||||
|
||||
self->statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
|
||||
self->statusItem.menu = self->statusMenu;
|
||||
self->statusItem.image = self->imageStatusInactive;
|
||||
@@ -98,6 +98,8 @@
|
||||
NSLog(@"\n******************************\n** XcodeCapp started **\n******************************\n");
|
||||
|
||||
self.version = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];
|
||||
NSString *copyrightString = [NSBundle mainBundle].infoDictionary[@"NSHumanReadableCopyright"];
|
||||
self.copyright = [NSString stringWithFormat:@"%@\nAll rights reserved", copyrightString];
|
||||
|
||||
[self _initUserDefaults];
|
||||
[self _initOperationQueue];
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.13.2" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.13.2"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
@@ -350,6 +350,7 @@
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
<point key="canvasLocation" x="-225" y="-276"/>
|
||||
</menu>
|
||||
<window title="XcodeCapp" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="main-window" animationBehavior="default" id="QvC-M9-y7g">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||
@@ -375,12 +376,12 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<clipView key="contentView" drawsBackground="NO" id="Zlj-Y5-TaS">
|
||||
<rect key="frame" x="0.0" y="0.0" width="263" height="634"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="72" rowSizeStyle="automatic" viewBased="YES" id="Mss-Tu-7kR">
|
||||
<tableView appearanceType="vibrantLight" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="72" rowSizeStyle="automatic" viewBased="YES" id="Mss-Tu-7kR">
|
||||
<rect key="frame" x="0.0" y="0.0" width="263" height="634"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn identifier="MainCell" editable="NO" width="263" minWidth="40" maxWidth="1000" id="UKo-y4-Q5Q">
|
||||
@@ -409,7 +410,7 @@
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<box autoresizesSubviews="NO" boxType="custom" borderType="line" borderWidth="0.0" cornerRadius="5" title="Box" titlePosition="noTitle" id="kpw-qm-NQG">
|
||||
<box autoresizesSubviews="NO" boxType="custom" borderType="line" borderWidth="0.0" cornerRadius="100" title="Box" titlePosition="noTitle" id="kpw-qm-NQG">
|
||||
<rect key="frame" x="5" y="52" width="10" height="10"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<view key="contentView" id="S9K-TP-K5A">
|
||||
@@ -521,11 +522,11 @@
|
||||
</subviews>
|
||||
<nil key="backgroundColor"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="GIE-ju-XbD">
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="GIE-ju-XbD">
|
||||
<rect key="frame" x="1" y="119" width="223" height="15"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="pb5-AF-zGg">
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="pb5-AF-zGg">
|
||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
@@ -566,8 +567,8 @@
|
||||
</button>
|
||||
</subviews>
|
||||
</view>
|
||||
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="fillColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="borderColor" red="1" green="1" blue="1" alpha="0.41999999999999998" colorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</box>
|
||||
</subviews>
|
||||
</customView>
|
||||
@@ -595,8 +596,8 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" focusRingType="none" title="Project Name" id="ylH-C3-MHM">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="923-ke-ovW" name="value" keyPath="self.currentCappuccinoProjectController.cappuccinoProject.nickname" id="Teo-iY-bEl"/>
|
||||
@@ -607,8 +608,8 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" title="Project Path" id="NvI-dv-Vcf">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" red="0.76319916294850176" green="0.76061204714189667" blue="0.76578627875510685" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="923-ke-ovW" name="value" keyPath="self.currentCappuccinoProjectController.cappuccinoProject.projectPath" id="IT9-Ja-icI"/>
|
||||
@@ -616,8 +617,8 @@
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="fillColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="borderColor" red="0.96862745098039216" green="0.50588235294117645" blue="0.16470588235294117" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" red="0.34509803921568627" green="0.34509803921568627" blue="0.34509803921568627" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</box>
|
||||
<box autoresizesSubviews="NO" boxType="custom" borderType="line" borderWidth="0.0" title="Box" id="ic3-Xg-i5j">
|
||||
<rect key="frame" x="0.0" y="562" width="599" height="26"/>
|
||||
@@ -680,8 +681,8 @@
|
||||
</box>
|
||||
</subviews>
|
||||
</view>
|
||||
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="fillColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="borderColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.93725490196078431" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</box>
|
||||
<tabView drawsBackground="NO" type="noTabsNoBorder" id="00d-fn-q41">
|
||||
<rect key="frame" x="0.0" y="0.0" width="599" height="562"/>
|
||||
@@ -713,39 +714,30 @@
|
||||
</window>
|
||||
<window title="About" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="EMp-Db-uhU" customClass="NSPanel">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
||||
<rect key="contentRect" x="196" y="240" width="296" height="191"/>
|
||||
<rect key="contentRect" x="196" y="240" width="324" height="200"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
|
||||
<view key="contentView" id="dj4-iP-S2b">
|
||||
<rect key="frame" x="0.0" y="0.0" width="296" height="191"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="324" height="200"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="3j4-r5-Ybe">
|
||||
<rect key="frame" x="74" y="64" width="149" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<rect key="frame" x="88" y="73" width="149" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="XcodeCapp" id="qvL-bN-A9R">
|
||||
<font key="font" metaFont="systemBold" size="15"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" id="IH1-cn-Xc9">
|
||||
<rect key="frame" x="18" y="20" width="260" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Copyright © 2012-2018 Cappuccino Project." id="8lT-Ky-ecV">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<imageView id="Q2t-aL-TDg">
|
||||
<rect key="frame" x="107" y="89" width="82" height="82"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<rect key="frame" x="121" y="98" width="82" height="82"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="logo" id="zF2-py-kAi"/>
|
||||
</imageView>
|
||||
<textField verticalHuggingPriority="750" id="vIx-Hh-v8Z">
|
||||
<rect key="frame" x="108" y="42" width="81" height="14"/>
|
||||
<rect key="frame" x="18" y="51" width="288" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Version 4.0.1" id="WUW-Ut-m7V">
|
||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Value from Info.plist displayed using bindings" id="WUW-Ut-m7V">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
@@ -754,9 +746,21 @@
|
||||
<binding destination="Voe-Tx-rLC" name="value" keyPath="self.version" id="Nfs-HY-nea"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" textCompletion="NO" id="IH1-cn-Xc9">
|
||||
<rect key="frame" x="18" y="0.0" width="292" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="center" title="Set in Info.plist, displayed using bindings" id="8lT-Ky-ecV">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="Voe-Tx-rLC" name="value" keyPath="self.copyright" id="cHX-2a-APu"/>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
<point key="canvasLocation" x="-218" y="94.5"/>
|
||||
<point key="canvasLocation" x="-304" y="-20"/>
|
||||
</window>
|
||||
<userDefaultsController representsSharedInstance="YES" id="GHK-nR-IEq" userLabel="User Defaults Controller"/>
|
||||
<window title="XcodeCapp Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="xcc-prefs" animationBehavior="default" id="ekp-cc-W2F">
|
||||
@@ -826,7 +830,7 @@
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
<point key="canvasLocation" x="-156.5" y="-126"/>
|
||||
<point key="canvasLocation" x="136" y="-20"/>
|
||||
</window>
|
||||
<box boxType="custom" borderType="line" borderWidth="0.0" title="Box" titlePosition="noTitle" id="fYW-ua-i1m">
|
||||
<rect key="frame" x="0.0" y="0.0" width="271" height="313"/>
|
||||
@@ -849,8 +853,8 @@
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="XcodeCapp" id="Oar-AW-2i5">
|
||||
<font key="font" metaFont="system" size="18"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" id="fUL-eL-YkQ">
|
||||
@@ -858,7 +862,7 @@
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Version 4.0" id="unR-NY-aap">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="textColor" white="0.31343064259999998" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
@@ -869,9 +873,9 @@
|
||||
</customView>
|
||||
</subviews>
|
||||
</view>
|
||||
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="fillColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<point key="canvasLocation" x="630" y="-361"/>
|
||||
<color key="borderColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" red="0.98039221759999995" green="0.98039221759999995" blue="0.98039221759999995" alpha="1" colorSpace="deviceRGB"/>
|
||||
<point key="canvasLocation" x="310.5" y="-302.5"/>
|
||||
</box>
|
||||
<box boxType="custom" borderType="line" borderWidth="0.0" title="Box" titlePosition="noTitle" id="stz-Vu-tYo" customClass="XCCWelcomeView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="464" height="401"/>
|
||||
@@ -888,15 +892,15 @@
|
||||
<rect key="frame" x="40" y="116" width="354" height="5"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
</box>
|
||||
<box autoresizesSubviews="NO" boxType="custom" borderType="line" cornerRadius="28" title="Box" titlePosition="noTitle" id="Tbj-mM-87j">
|
||||
<rect key="frame" x="189" y="28" width="56" height="56"/>
|
||||
<box autoresizesSubviews="NO" boxType="custom" borderType="line" cornerRadius="100" title="Box" titlePosition="noTitle" id="Tbj-mM-87j">
|
||||
<rect key="frame" x="189" y="28" width="57" height="57"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<view key="contentView" id="aoX-nH-ofv">
|
||||
<rect key="frame" x="1" y="1" width="54" height="54"/>
|
||||
<rect key="frame" x="1" y="1" width="55" height="55"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button focusRingType="none" id="wQo-c7-sD7">
|
||||
<rect key="frame" x="14" y="14" width="27" height="26"/>
|
||||
<rect key="frame" x="14" y="15" width="27" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSAddTemplate" imagePosition="only" alignment="center" focusRingType="none" imageScaling="proportionallyDown" inset="2" id="o7j-4e-NNJ">
|
||||
<behavior key="behavior" lightByContents="YES"/>
|
||||
@@ -906,15 +910,15 @@
|
||||
<action selector="addProject:" target="923-ke-ovW" id="YGQ-yu-Glg"/>
|
||||
</connections>
|
||||
</button>
|
||||
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" style="spinning" id="vPH-Iq-Ray">
|
||||
<rect key="frame" x="11" y="11" width="32" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
</progressIndicator>
|
||||
</subviews>
|
||||
</view>
|
||||
<color key="borderColor" red="0.97254901959999995" green="0.50196078430000002" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="borderColor" red="0.97254901960784312" green="0.50196078431372548" blue="0.15686274509803921" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</box>
|
||||
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" style="spinning" id="vPH-Iq-Ray">
|
||||
<rect key="frame" x="201" y="40" width="32" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
</progressIndicator>
|
||||
<button focusRingType="none" id="wdl-kS-DYD">
|
||||
<rect key="frame" x="124" y="150" width="186" height="186"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
@@ -930,8 +934,8 @@
|
||||
</customView>
|
||||
</subviews>
|
||||
</view>
|
||||
<color key="borderColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="fillColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="borderColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="fillColor" red="0.98039221759999995" green="0.98039221759999995" blue="0.98039221759999995" alpha="1" colorSpace="deviceRGB"/>
|
||||
<connections>
|
||||
<outlet property="boxImport" destination="Tbj-mM-87j" id="Nly-uI-l8C"/>
|
||||
<outlet property="loadingIndicator" destination="vPH-Iq-Ray" id="qiU-X4-gPI"/>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>Version 4.0.1</string>
|
||||
<string>Version 4.0.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
@@ -44,7 +44,7 @@
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2012-2018 Cappuccino Project. All rights reserved.</string>
|
||||
<string>Copyright © 2012-2024 Cappuccino Project</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
@@ -56,8 +56,6 @@
|
||||
<key>XCCLastCappuccinoMasterBranchURL</key>
|
||||
<string>https://github.com/cappuccino/cappuccino/archive/master.zip</string>
|
||||
<key>XCCLastCappuccinoReleaseURL</key>
|
||||
<string>https://github.com/cappuccino/cappuccino/archive/1.0.0.zip</string>
|
||||
<key>NSRequiresAquaSystemAppearance</key>
|
||||
<false/>
|
||||
<string>https://www.cappuccino.dev/downloads/CappuccinoStarter-1.0.0.zip</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -341,8 +341,15 @@ NSString * const XCCCappuccinoProjectLastEventIDKey = @"XCCCappuccinoPro
|
||||
|
||||
- (void)_writeSettings
|
||||
{
|
||||
NSData *data = [NSPropertyListSerialization dataFromPropertyList:self->settings format:NSPropertyListXMLFormat_v1_0 errorDescription:nil];
|
||||
|
||||
# pragma mark -- TODO
|
||||
// Error should be handled with user interaction,
|
||||
// although this hasn't previously been so either.
|
||||
// Immedate concern is with removing noisy deprecation warnings.
|
||||
NSError* error = nil;
|
||||
NSData* data = [NSPropertyListSerialization dataWithPropertyList:self->settings format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error];
|
||||
if(data != nil){
|
||||
NSLog(@"error %ld",(long)[error code]);
|
||||
}
|
||||
[data writeToFile:self.settingsPath atomically:YES];
|
||||
}
|
||||
|
||||
@@ -357,7 +364,7 @@ NSString * const XCCCappuccinoProjectLastEventIDKey = @"XCCCappuccinoPro
|
||||
self->settings[XCCCappuccinoProcessObjj2ObjcSkeletonKey] = @(self.processObjj2ObjcSkeleton);
|
||||
self->settings[XCCCappuccinoProcessNib2CibKey] = @(self.processNib2Cib);
|
||||
self->settings[XCCCappuccinoProjectPreviousStatusKey] = [NSNumber numberWithInt:self.status];
|
||||
|
||||
|
||||
if ([self.lastEventID boolValue])
|
||||
self->settings[XCCCappuccinoProjectLastEventIDKey] = self.lastEventID;
|
||||
|
||||
@@ -370,8 +377,16 @@ NSString * const XCCCappuccinoProjectLastEventIDKey = @"XCCCappuccinoPro
|
||||
|
||||
- (void)_writeXcodeCappIgnoreFile
|
||||
{
|
||||
NSData *data = [NSPropertyListSerialization dataFromPropertyList:self->settings format:NSPropertyListXMLFormat_v1_0 errorDescription:nil];
|
||||
|
||||
# pragma TODO
|
||||
// More verifiable user notification of error?
|
||||
NSError *error = nil;
|
||||
NSData *data = [NSPropertyListSerialization dataWithPropertyList: self->settings
|
||||
format: NSPropertyListXMLFormat_v1_0
|
||||
options: 0
|
||||
error: &error];
|
||||
if(data != nil){
|
||||
NSLog(@"error %ld",(long)[error code]);
|
||||
}
|
||||
[data writeToFile:self.settingsPath atomically:YES];
|
||||
|
||||
NSFileManager *fm = [NSFileManager defaultManager];
|
||||
|
||||
@@ -93,15 +93,17 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n
|
||||
{
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
|
||||
NSRunAlertPanel(
|
||||
self.cappuccinoProject.nickname,
|
||||
@"XcodeCapp was unable to find all necessary executables in your environment:\n\n"
|
||||
@"%@\n\n"
|
||||
@"You certainly need to change the binary paths in the project settings.",
|
||||
@"OK",
|
||||
nil,
|
||||
nil,
|
||||
[self->taskLauncher.executables componentsJoinedByString:@", "]);
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
NSString *title = self.cappuccinoProject.nickname;
|
||||
[alert setMessageText:title];
|
||||
NSArray *informativeTextArray = @[
|
||||
@"XcodeCapp was unable to find all necessary executables in current environment:",
|
||||
@"Please confirm the following executables are in current $PATH:\n",
|
||||
[self->taskLauncher.executables componentsJoinedByString:@", "]
|
||||
];
|
||||
[alert setInformativeText:[informativeTextArray componentsJoinedByString:@"\n"]];
|
||||
[alert runModal];
|
||||
|
||||
[self _reinitializeProjectController];
|
||||
}
|
||||
@@ -155,7 +157,12 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n
|
||||
|
||||
if (![fm fileExistsAtPath:self.cappuccinoProject.projectPath isDirectory:nil])
|
||||
{
|
||||
NSRunAlertPanel(@"The project can’t be located.", @"It seems the project moved while XcodeCapp was not running.", @"Remove Project", nil, nil);
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
[alert setMessageText:@"The project can’t be located"];
|
||||
NSString *informativeText = [NSString stringWithFormat:@"The project was either moved or deleted outside of the XcodeCapp environment.\nProject will be removed."];
|
||||
[alert setInformativeText:informativeText];
|
||||
[alert runModal];
|
||||
|
||||
[self.mainXcodeCappController unmanageCappuccinoProjectController:self];
|
||||
return NO;
|
||||
@@ -1003,7 +1010,12 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n
|
||||
|
||||
- (void)_handleProjectPathChange:(NSString *)path
|
||||
{
|
||||
NSRunAlertPanel(self.cappuccinoProject.nickname, @"The project directory changed. This project will be removed", @"OK", nil, nil, nil);
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
[alert setMessageText:@"The project directory changed"];
|
||||
NSString *informativeText = [NSString stringWithFormat:@"This project will be removed."];
|
||||
[alert setInformativeText:informativeText];
|
||||
[alert runModal];
|
||||
|
||||
[self.mainXcodeCappController unmanageCappuccinoProjectController:self];
|
||||
}
|
||||
@@ -1206,15 +1218,27 @@ void fsevents_callback(ConstFSEventStreamRef streamRef, void *userData, size_t n
|
||||
|
||||
if (!exists || !isDirectory || !isOpened)
|
||||
{
|
||||
NSString *text;
|
||||
NSString *projectErrorDescription;
|
||||
|
||||
if (!isOpened)
|
||||
text = @"The project exists, but failed to open.";
|
||||
projectErrorDescription = @"The project exists, but failed to open.";
|
||||
else
|
||||
text = [NSString stringWithFormat:@"%@ %@.", self.cappuccinoProject.XcodeProjectPath, !exists ? @"does not exist" : @"is not an Xcode project"];
|
||||
projectErrorDescription = [NSString stringWithFormat:@"%@ %@.", self.cappuccinoProject.XcodeProjectPath, !exists ? @"does not exist" : @"is not an Xcode project"];
|
||||
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
NSInteger response = NSRunAlertPanel(@"The project could not be opened.", @"%@\n\nWould you like to regenerate the project?", @"Yes", @"No", nil, text);
|
||||
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
[alert setMessageText:@"The project could not be opened"];
|
||||
NSArray *informativeTextArray = @[
|
||||
projectErrorDescription,
|
||||
@"Should the project be regenerated?"
|
||||
];
|
||||
NSString *informativeText = [informativeTextArray componentsJoinedByString:@"\n"];
|
||||
[alert setInformativeText:informativeText];
|
||||
[alert addButtonWithTitle:@"Yes"];
|
||||
[alert addButtonWithTitle:@"No"];
|
||||
NSInteger response = [alert runModal];
|
||||
|
||||
if (response == NSAlertFirstButtonReturn)
|
||||
[self resetProject:self];
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
- (void)_setTextColor:(NSColor *)color forButton:(NSButton *)button
|
||||
{
|
||||
NSMutableParagraphStyle *paragraphStyle= [NSMutableParagraphStyle new];
|
||||
[paragraphStyle setAlignment:NSCenterTextAlignment];
|
||||
[paragraphStyle setAlignment:NSTextAlignmentCenter];
|
||||
|
||||
NSDictionary *attrs = @{NSFontAttributeName: [NSFont systemFontOfSize:11],
|
||||
NSForegroundColorAttributeName: color,
|
||||
@@ -180,13 +180,12 @@
|
||||
|
||||
if (missingProjects.count)
|
||||
{
|
||||
NSRunAlertPanel(@"Missing Projects",
|
||||
@"Some managed projects could not be found and have been removed:\n\n"
|
||||
@"%@\n\n",
|
||||
@"OK",
|
||||
nil,
|
||||
nil,
|
||||
[missingProjects componentsJoinedByString:@", "]);
|
||||
NSString *informativeText = [NSString stringWithFormat:@"Some managed projects could not be found and have been removed:\n\n%@", [missingProjects componentsJoinedByString:@", "]];
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
[alert setMessageText:@"Missing Projects"];
|
||||
[alert setInformativeText:informativeText];
|
||||
[alert runModal];
|
||||
}
|
||||
|
||||
[self _saveManagedProjectsToUserDefaults];
|
||||
@@ -238,7 +237,11 @@
|
||||
{
|
||||
if ([[self.cappuccinoProjectControllers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"cappuccinoProject.projectPath == %@", path]] count])
|
||||
{
|
||||
NSRunAlertPanel(@"This project is already managed.", @"Please remove the other project or use the reset button.", @"OK", nil, nil, nil);
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
[alert setMessageText:@"This project is already managed."];
|
||||
[alert setInformativeText:@"Please remove the other project or use the reset button."];
|
||||
[alert runModal];
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -306,16 +309,16 @@
|
||||
|
||||
- (IBAction)addProject:(id)aSender
|
||||
{
|
||||
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
|
||||
openPanel.title = @"Add a new Cappuccino Project to XcodeCapp";
|
||||
openPanel.canCreateDirectories = YES;
|
||||
openPanel.canChooseDirectories = YES;
|
||||
openPanel.canChooseFiles = NO;
|
||||
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
|
||||
openPanel.title = @"Add a new Cappuccino Project to XcodeCapp";
|
||||
openPanel.canCreateDirectories = YES;
|
||||
openPanel.canChooseDirectories = YES;
|
||||
openPanel.canChooseFiles = NO;
|
||||
|
||||
if ([openPanel runModal] != NSFileHandlingPanelOKButton)
|
||||
if ([openPanel runModal] != NSModalResponseOK)
|
||||
return;
|
||||
|
||||
NSString *projectPath = [[openPanel.URLs[0] path] stringByStandardizingPath];
|
||||
NSString *projectPath = [[openPanel.URLs[0] path] stringByStandardizingPath];
|
||||
|
||||
[self manageCappuccinoProjectControllerForPath:projectPath];
|
||||
}
|
||||
@@ -509,4 +512,4 @@
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@end
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
# Note: Python2 must be installed to run this
|
||||
|
||||
from __future__ import with_statement
|
||||
from optparse import OptionParser
|
||||
from string import Template
|
||||
|
||||
@@ -2,11 +2,7 @@
|
||||
|
||||
chmod +x capp_lint
|
||||
|
||||
if [[ ! -d /usr/local/narwhal/bin ]]; then
|
||||
mkdir -p /usr/local/narwhal/bin
|
||||
fi
|
||||
|
||||
cp capp_lint /usr/local/narwhal/bin
|
||||
cp capp_lint /usr/local/bin
|
||||
|
||||
if [[ ! -d /usr/local/share/man/man1 ]]; then
|
||||
mkdir -p /usr/local/share/man/man1
|
||||
|
||||
+56
-38
@@ -34,25 +34,23 @@
|
||||
|
||||
@global java
|
||||
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
var os = require("os");
|
||||
var child_process = require("child_process");
|
||||
var utilsFile = ObjectiveJ.utils.file;
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const path = require('path');
|
||||
const { execSync, spawnSync } = require('child_process');
|
||||
const child_process = require("child_process");
|
||||
const utilsFile = ObjectiveJ.utils.file;
|
||||
|
||||
/* var FILE = require("file"),
|
||||
OS = require("os"), */
|
||||
var SharedConverter = nil;
|
||||
|
||||
var SharedConverter = nil;
|
||||
NibFormatUndetermined = 0;
|
||||
NibFormatMac = 1;
|
||||
NibFormatIPhone = 2;
|
||||
|
||||
NibFormatUndetermined = 0;
|
||||
NibFormatMac = 1;
|
||||
NibFormatIPhone = 2;
|
||||
ConverterModeLegacy = 0;
|
||||
ConverterModeNew = 1;
|
||||
|
||||
ConverterModeLegacy = 0;
|
||||
ConverterModeNew = 1;
|
||||
|
||||
ConverterConversionException = @"ConverterConversionException";
|
||||
ConverterConversionException = @"ConverterConversionException";
|
||||
|
||||
@implementation Converter : CPObject
|
||||
{
|
||||
@@ -89,7 +87,7 @@ ConverterConversionException = @"ConverterConversionException";
|
||||
// Some .xibs are iPhone nibs, check the actual contents in this case.
|
||||
if (path.extname(inputPath) !== ".nib" && fs.lstatSync(inputPath).isFile() &&
|
||||
fs.readFileSync(inputPath, { encoding: "utf8" }).indexOf("<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\"") !== -1)
|
||||
//FILE.read(inputPath, { charset:"UTF-8" }).indexOf("<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\"") !== -1)
|
||||
|
||||
inferredFormat = NibFormatIPhone;
|
||||
|
||||
if (inferredFormat === NibFormatMac)
|
||||
@@ -108,7 +106,6 @@ ConverterConversionException = @"ConverterConversionException";
|
||||
|
||||
if ([outputPath length])
|
||||
fs.writeFileSync(outputPath, [convertedData rawString], { encoding: "utf8" });
|
||||
//FILE.write(outputPath, [convertedData rawString], { charset:"UTF-8" });
|
||||
|
||||
CPLog.info("Conversion successful");
|
||||
|
||||
@@ -145,13 +142,45 @@ ConverterConversionException = @"ConverterConversionException";
|
||||
|
||||
if ([outputPath length])
|
||||
{
|
||||
// Compile xib or nib to make sure we have a non-new format nib.
|
||||
// Compile xib or nib to make sure we have a legacy format nib.
|
||||
|
||||
// Use temporary paths for intermediate products.
|
||||
temporaryNibFilePath = path.join(tmpdir, path.basename(aFilePath) + ".tmp.nib");
|
||||
temporaryXibFilePath = path.join(tmpdir, path.basename(aFilePath));
|
||||
|
||||
|
||||
// Ensure that source xib's <deployment /> tag targets deployment version 10.10
|
||||
var xibContent = fs.readFileSync(aFilePath, { encoding: 'utf8' });
|
||||
|
||||
// Perform the in-memory modification of the deployment tag
|
||||
//
|
||||
// Remove existing <deployment /> tag, if present
|
||||
// xib's with Xcode 14 or later do not have a <deployment /> element at all.
|
||||
// It is simpler to ensure no <deployment /> element is present,
|
||||
// then add what we want.
|
||||
//
|
||||
// Add a new <deployment /> element as the first child of the <dependencies /> element.
|
||||
// This is the placement expected when Xcode adds the <deployment /> element.
|
||||
// Target version 10.10 as the deployment version.
|
||||
if (xibContent.includes('<deployment '))
|
||||
{
|
||||
xibContent = xibContent.replace(/<deployment .*\/>/g, '');
|
||||
}
|
||||
// Where will the <deployment /> element be inserted in the string?
|
||||
var deploymentTag = '\n <deployment version="10.10" identifier="macosx"/>';
|
||||
var insertPosition = xibContent.indexOf("<dependencies>") + "<dependencies>".length;
|
||||
|
||||
// Slice the string representing the source xib and insert the new <deployment /> element.
|
||||
var updatedXIBContent = xibContent.slice(0, insertPosition) + deploymentTag + xibContent.slice(insertPosition);
|
||||
|
||||
try {
|
||||
child_process.execSync("/usr/bin/ibtool" + " '" + aFilePath + "' " + "--compile" + " '" + temporaryNibFilePath + "'", {stdio: 'inherit'});
|
||||
} catch(err) {
|
||||
[CPException raise:ConverterConversionException reason:@"Could not compile file: " + aFilePath];
|
||||
fs.writeFileSync(temporaryXibFilePath, updatedXIBContent, 'utf8');
|
||||
try
|
||||
{
|
||||
child_process.execSync("/usr/bin/ibtool" + " '" + temporaryXibFilePath + "' " + "--compile" + " '" + temporaryNibFilePath + "'", {stdio: 'inherit'});
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
[CPException raise:ConverterConversionException reason:@"Could not compile file: " + temporaryXibFilePath];
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -169,30 +198,19 @@ ConverterConversionException = @"ConverterConversionException";
|
||||
// Convert from binary plist to XML plist
|
||||
var temporaryPlistFilePath = path.join(tmpdir, path.basename(aFilePath) + ".tmp.plist");
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
child_process.execSync("/usr/bin/plutil" + " " + "-convert" + " " + "xml1" + " '" + (temporaryNibFilePathInDirectoryFile || temporaryNibFilePath) + "' " + "-o" + " '" + temporaryPlistFilePath + "'", {stdio: 'inherit'});
|
||||
} catch(err) {
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
[CPException raise:ConverterConversionException reason:@"Could not convert to xml plist for file: " + aFilePath];
|
||||
}
|
||||
|
||||
/* try
|
||||
{
|
||||
var p = OS.popen(["/usr/bin/plutil", "-convert", "xml1", temporaryNibFilePath, "-o", temporaryPlistFilePath]);
|
||||
if (p.wait() === 1)
|
||||
[CPException raise:ConverterConversionException reason:@"Could not convert to xml plist for file: " + aFilePath];
|
||||
}
|
||||
finally
|
||||
{
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
} */
|
||||
|
||||
if (!isReadable(temporaryPlistFilePath))
|
||||
[CPException raise:ConverterConversionException reason:@"Unable to convert nib file."];
|
||||
|
||||
var plistContents = fs.readFileSync(temporaryPlistFilePath, { encoding: "utf8" });
|
||||
//var plistContents = FILE.read(temporaryPlistFilePath, { charset: "UTF-8" });
|
||||
|
||||
// Minor NS keyed archive to CP keyed archive conversion.
|
||||
// Use Java directly because rhino's string.replace is *so slow*. 4 seconds vs. 1 millisecond.
|
||||
|
||||
+15
-1
@@ -381,7 +381,21 @@ if [ `uname` = "Darwin" ]; then
|
||||
check_build_environment
|
||||
|
||||
# The narwhal-jsc package is already installed within the base kit.
|
||||
|
||||
|
||||
# Xcode 15's version of the 'ld' linker no longer supports
|
||||
# the '-force_cpusubtype_ALL' flag.
|
||||
# Although not documented, this may have been included to support PowerPC compilation.
|
||||
# Removing the flag has been successfully tested on High Sierra/Xcode 10.1
|
||||
# Testing on all intermediate operating systems and Xcode versions isn't practical,
|
||||
# or beneficial, given the imminent move to NodeJS.
|
||||
# We apply the patch here for expediency, rather than in the 'cappuccino-base' repository.
|
||||
# If a full final release of the narwhal branch is undertaken,
|
||||
# the change will be applied to cappuccino-base at that time.
|
||||
# Note: Rosetta2 is still available in macOS Sonoma.
|
||||
# Compiling for both Intel and Apple Silicon targets requires a testing program
|
||||
# which is, again, neither practical nor justified at this stage of Narwhal's lifecycle.
|
||||
sed -i .orig 's/-force_cpusubtype_ALL//g' $install_directory/packages/narwhal-jsc/Makefile
|
||||
|
||||
# This autoreconf command improves compatibility with MacPorts, but only works with autoconf 2.65+.
|
||||
needed_autoconf_major=2
|
||||
needed_autoconf_minor=65
|
||||
|
||||
Reference in New Issue
Block a user