Skip to content

Commit

Permalink
add CoreTextArc
Browse files Browse the repository at this point in the history
  • Loading branch information
Darcy Liu committed Feb 27, 2013
1 parent f479abc commit e294771
Show file tree
Hide file tree
Showing 26 changed files with 2,860 additions and 0 deletions.
Binary file added CoreTextArc.zip
Binary file not shown.
479 changes: 479 additions & 0 deletions CoreTextArc/ArcView.c

Large diffs are not rendered by default.

95 changes: 95 additions & 0 deletions CoreTextArc/ArcView.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
File: ArcView.h
Abstract: Declares the interface for the ArcView custom class that uses
CoreText to draw text on a curve.
Version: 1.0
Disclaimer: IMPORTANT: This Apple software is supplied to you by
Apple Inc. ("Apple") in consideration of your agreement to the
following terms, and your use, installation, modification or
redistribution of this Apple software constitutes acceptance of these
terms. If you do not agree with these terms, please do not use,
install, modify or redistribute this Apple software.
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
"Apple Software"), to use, reproduce, modify and redistribute the Apple
Software, with or without modifications, in source and/or binary forms;
provided that if you redistribute the Apple Software in its entirety and
without modifications, you must retain this notice and the following
text and disclaimers in all such redistributions of the Apple Software.
Neither the name, trademarks, service marks or logos of Apple Inc.
may be used to endorse or promote products derived from the Apple
Software without specific prior written permission from Apple. Except
as expressly stated in this notice, no other rights or licenses, express
or implied, are granted by Apple herein, including but not limited to
any patent rights that may be infringed by your derivative works or by
other works in which the Apple Software may be incorporated.
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Copyright (C) 2007 Apple Inc. All Rights Reserved.
*/

#include <Carbon/Carbon.h>

enum {
kArcViewControlSignature = 'arcv',
kArcViewControlID = 0
};

#define kArcViewClassID CFSTR("com.apple.example.arcview")

typedef struct ArcView ArcView;

// Register the arc view class. This should be done very early, before the nib is loaded.
OSStatus ArcViewRegisterClass(void);

// Convenience to get the arc view for the specified window.
ArcView *GetArcViewForWindow(HIWindowRef window);

// Set the font for the arc view. This properly releases the existing font and marks the view as needing display.
void ArcViewSetFont(ArcView *arcView, CTFontRef font);

// Set the content string for the arc view. This properly releases the existing string and marks the view as needing display.
void ArcViewSetString(ArcView *arcView, CFStringRef string);

// Get the current font.
CTFontRef ArcViewGetFont(const ArcView *arcView);

// Get the current content string.
CFStringRef ArcViewGetString(const ArcView *arcView);

// Draw the view in the provided context. This should not be called directly as it draws in response events.
void ArcViewDraw(ArcView *arcView, CGContextRef context);

enum {
kArcViewShowGlyphBoundsOption = 1 << 0,
kArcViewShowLineMetricsOption = 1 << 1,
kArcViewDimSubstitutedGlyphsOption = 1 << 2,
};
typedef UInt32 ArcViewOptions;

// Set the state for the specified option(s)
void ArcViewSetOptions(ArcView *arcView, ArcViewOptions optionsMask, Boolean state);

// Returns true if specified options are enabled
Boolean ArcViewGetOptions(ArcView *arcView, ArcViewOptions optionsMask);
233 changes: 233 additions & 0 deletions CoreTextArc/Controls.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
/*
File: Controls.c
Abstract: Defines utility functions for managing controls in the
application user interface.
Version: 1.0
Disclaimer: IMPORTANT: This Apple software is supplied to you by
Apple Inc. ("Apple") in consideration of your agreement to the
following terms, and your use, installation, modification or
redistribution of this Apple software constitutes acceptance of these
terms. If you do not agree with these terms, please do not use,
install, modify or redistribute this Apple software.
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
"Apple Software"), to use, reproduce, modify and redistribute the Apple
Software, with or without modifications, in source and/or binary forms;
provided that if you redistribute the Apple Software in its entirety and
without modifications, you must retain this notice and the following
text and disclaimers in all such redistributions of the Apple Software.
Neither the name, trademarks, service marks or logos of Apple Inc.
may be used to endorse or promote products derived from the Apple
Software without specific prior written permission from Apple. Except
as expressly stated in this notice, no other rights or licenses, express
or implied, are granted by Apple herein, including but not limited to
any patent rights that may be infringed by your derivative works or by
other works in which the Apple Software may be incorporated.
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Copyright (C) 2007 Apple Inc. All Rights Reserved.
*/

#include "Controls.h"
#include "ArcView.h"

// Initializes the text field with the default localized string
void InitializeTextField(HIWindowRef window)
{
CFStringRef string = CFCopyLocalizedString(CFSTR("Curvaceous Type"), CFSTR("Default string"));
static HIViewID viewID = { kEditTextControlSignature, kEditTextControlID };
HIViewRef view;
OSStatus err;

// Use the front window if none specified
if (window == NULL)
window = FrontNonFloatingWindow();

// Get the control
err = HIViewFindByID(HIViewGetRoot(window), viewID, &view);
require_noerr(err, CantGetControl);

// Get the text from the control
verify_noerr(HIViewSetText(view, string));

CantGetControl: ;
}

// Gets the current text from the edit text control in the specified window and sets it to the arc view.
void UpdateText(HIWindowRef window)
{
static HIViewID viewID = { kEditTextControlSignature, kEditTextControlID };
HIViewRef view;
OSStatus err;
CFStringRef string;

// Use the front window if none specified
if (window == NULL)
window = FrontNonFloatingWindow();

// Get the control
err = HIViewFindByID(HIViewGetRoot(window), viewID, &view);
require_noerr(err, CantGetControl);

// Get the text from the control
string = HIViewCopyText(view);

if (string != NULL) {
// Set the text to the arc view of the same window
ArcView *arcView = GetArcViewForWindow(window);
ArcViewSetString(arcView, string);

CFRelease(string);
}

CantGetControl: ;
}

// Keeps the font controls in sync with the current font. It's important when provided style controls (eg. Bold, Italic) as we are, that they are kept in sync with the font. If the current font cannot be made bold, then the bold control should be disabled. If it is bold, the control should be checked. Likewise for italic. We leave updates of the menu items to another function.
void UpdateFontControls(HIWindowRef window)
{
ArcView *arcView;
CTFontRef font;
CTFontSymbolicTraits traits;
HIViewRef view;
HIViewID viewID;

// If we weren't passed a window, use the front window
if (window == NULL)
window = FrontNonFloatingWindow();

// Get the view for the window
arcView = GetArcViewForWindow(window);

// Get the current font and traits
font = ArcViewGetFont(arcView);
traits = CTFontGetSymbolicTraits(font);

// Get the bold font checkbox control
viewID.signature = kBoldFontControlSignature;
viewID.id = kBoldFontControlID;
verify_noerr(HIViewFindByID(HIViewGetRoot(window), viewID, &view));

// Disable the bold checkbox if we can't toggle the trait
HIViewSetEnabled(view, CanToggleFontTrait(font, kCTFontBoldTrait));

// Set the value for the checkbox based on the current traits
if ((traits & kCTFontBoldTrait) != 0)
HIViewSetValue(view, kControlCheckBoxCheckedValue);
else
HIViewSetValue(view, kControlCheckBoxUncheckedValue);

// Get the italic font checkbox control
viewID.signature = kItalicFontControlSignature;
viewID.id = kItalicFontControlID;
verify_noerr(HIViewFindByID(HIViewGetRoot(window), viewID, &view));

// Disable the bold checkbox if we can't toggle the trait
HIViewSetEnabled(view, CanToggleFontTrait(font, kCTFontItalicTrait));

// Set the value for the checkbox based on the current traits
if ((traits & kCTFontItalicTrait) != 0)
HIViewSetValue(view, kControlCheckBoxCheckedValue);
else
HIViewSetValue(view, kControlCheckBoxUncheckedValue);
}

enum {
kShowFontsMenuItemIndex = 1,
kHideFontsMenuItemIndex = 2,
kBoldMenuItemIndex = 3,
kItalicMenuItemIndex = 4
};

// Updates the font menu items in the Format menu to keep them in sync with the current font selection. We use two individual menu items to show and hide the Fonts window. Based on the visibility of the fonts window we hide one of thse items. Like UpdateFontControls we need to keep the bold and italic menu items in sync with the capabilities of the font.
void UpdateFormatMenu(MenuRef menu)
{
CTFontRef font;
ArcView * arcView;
CTFontSymbolicTraits traits;

// The menu is always based on the front most window
arcView = GetArcViewForWindow(FrontNonFloatingWindow());
assert(arcView != NULL);

// Get the current font and traits
font = ArcViewGetFont(arcView);
traits = CTFontGetSymbolicTraits(font);

if (FPIsFontPanelVisible()) {
// Fonts window is visible. Hide "Show Fonts" and show "Hide Fonts"
ChangeMenuItemAttributes(menu, kShowFontsMenuItemIndex, kMenuItemAttrHidden, 0);
ChangeMenuItemAttributes(menu, kHideFontsMenuItemIndex, 0, kMenuItemAttrHidden);
} else {
// Fonts window is not visible. Show "Show Fonts" and hide "Hide Fonts"
ChangeMenuItemAttributes(menu, kShowFontsMenuItemIndex, 0, kMenuItemAttrHidden);
ChangeMenuItemAttributes(menu, kHideFontsMenuItemIndex, kMenuItemAttrHidden, 0);
}

// Check the menu item if the font has the bold trait
CheckMenuItem(menu, kBoldMenuItemIndex, ((traits & kCTFontBoldTrait) != 0));

// Disable the item if we can't toggle the bold trait
if (!CanToggleFontTrait(font, kCTFontBoldTrait)) {
ChangeMenuItemAttributes(menu, kBoldMenuItemIndex, kMenuItemAttrDisabled, 0);
} else {
ChangeMenuItemAttributes(menu, kBoldMenuItemIndex, 0, kMenuItemAttrDisabled);
}

// Check the menu item if the font has the italic trait
CheckMenuItem(menu, kItalicMenuItemIndex, ((traits & kCTFontItalicTrait) != 0));

// Disable the item if we can't toggle the italic trait
if (!CanToggleFontTrait(font, kCTFontItalicTrait)) {
ChangeMenuItemAttributes(menu, kItalicMenuItemIndex, kMenuItemAttrDisabled, 0);
} else {
ChangeMenuItemAttributes(menu, kItalicMenuItemIndex, 0, kMenuItemAttrDisabled);
}
}

// Update the font panel with the currently selected font. It's important to do this when we activate the window and display the font panel. The act of calling SetFontInfoForSelection with the event target of the specified window is important to direct future font selection events to that window. This could be a specific control if we wanted to handle font selections on a control by control basis.
void UpdateFontPanel(HIWindowRef window)
{
ArcView *arcView;
CTFontRef font;
CTFontDescriptorRef descriptor;

// Use the front window if none specified
if (window == NULL)
window = FrontNonFloatingWindow();

// Get the arc view
arcView = GetArcViewForWindow(window);

// Get the current font
font = ArcViewGetFont(arcView);

descriptor = CTFontCopyFontDescriptor(font);
verify(descriptor != NULL);

// Set the font to the font panel, specifying the window as the event target
verify_noerr(SetFontInfoForSelection(kFontSelectionCoreTextType, 1, (void *)&descriptor, GetWindowEventTarget(window)));
CFRelease(descriptor);
}

Loading

0 comments on commit e294771

Please sign in to comment.