Revision: 27983
http://sourceforge.net/p/bibdesk/svn/27983
Author: hofman
Date: 2022-10-03 09:34:36 +0000 (Mon, 03 Oct 2022)
Log Message:
-----------
Secure text field subclass that allows showing the password controlled by an
embedded toggle button. Works by swapping the cell used to display the text.
Use for password field in group table.
Modified Paths:
--------------
trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib
trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
Added Paths:
-----------
trunk/bibdesk/BDSKSecureTextField.h
trunk/bibdesk/BDSKSecureTextField.m
Added: trunk/bibdesk/BDSKSecureTextField.h
===================================================================
--- trunk/bibdesk/BDSKSecureTextField.h (rev 0)
+++ trunk/bibdesk/BDSKSecureTextField.h 2022-10-03 09:34:36 UTC (rev 27983)
@@ -0,0 +1,65 @@
+//
+// BDSKSecureTextField.h
+// BibDesk
+//
+// Created by Christiaan Hofman on 03/10/2022.
+/*
+ This software is Copyright (c) 2022
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface BDSKSecureTextField : NSSecureTextField {
+ BOOL showsText;
+ NSButton *button;
+ NSTextFieldCell *secureCell;
+ NSTextFieldCell *unsecureCell;
+}
+
+@property (nonatomic) BOOL showsText;
+
+@property (nonatomic, readonly) NSButton *button;
+
+- (IBAction)toggleShowsText:(id)sender;
+
+@end
+
+#pragma mark -
+
+@interface BDSKSecureTextFieldCell : NSSecureTextFieldCell
+@end
+
+#pragma mark -
+
+@interface BDSKUnsecureTextFieldCell : NSTextFieldCell
+@end
Added: trunk/bibdesk/BDSKSecureTextField.m
===================================================================
--- trunk/bibdesk/BDSKSecureTextField.m (rev 0)
+++ trunk/bibdesk/BDSKSecureTextField.m 2022-10-03 09:34:36 UTC (rev 27983)
@@ -0,0 +1,312 @@
+//
+// BDSKSecureTextField.m
+// BibDesk
+//
+// Created by Christiaan Hofman on 03/10/2022.
+/*
+ This software is Copyright (c) 2022
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "BDSKSecureTextField.h"
+#import "NSLayoutConstraint_BDSKExtensions.h"
+#import "NSGeometry_BDSKExtensions.h"
+#import "NSView_BDSKExtensions.h"
+
+
+@interface BDSKSecureTextFieldButton : NSButton
+@end
+
+#pragma mark -
+
+@implementation BDSKSecureTextField
+
+@synthesize showsText, button;
+
++ (Class)cellClass { return [BDSKSecureTextFieldCell class]; }
+
++ (NSImage *)showTextImage {
+ static NSImage *image = nil;
+ if (image == nil) {
+ image = [[NSImage alloc] initWithSize:NSMakeSize(19.0, 17.0)];
+ [image lockFocus];
+ [[NSImage imageNamed:NSImageNameQuickLookTemplate]
drawInRect:NSMakeRect(-1.0, 2.0, 21.0, 13.0)];
+ [image unlockFocus];
+ [image setTemplate:YES];
+ [image setAccessibilityDescription:NSLocalizedString(@"Show password",
@"")];
+ }
+ return image;
+}
+
++ (NSImage *)hideTextImage {
+ static NSImage *image = nil;
+ if (image == nil) {
+ image = [[NSImage alloc] initWithSize:NSMakeSize(19.0, 17.0)];
+ [image lockFocus];
+ [[NSImage imageNamed:NSImageNameQuickLookTemplate]
drawInRect:NSMakeRect(-1.0, 2.0, 21.0, 13.0)];
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(3.0, 3.0)];
+ [path lineToPoint:NSMakePoint(15.0, 14.0)];
+ [NSGraphicsContext saveGraphicsState];
+ [[NSGraphicsContext currentContext]
setCompositingOperation:NSCompositeClear];
+ [path setLineWidth:3.0];
+ [path stroke];
+ [NSGraphicsContext restoreGraphicsState];
+ [path setLineWidth:1.0];
+ [path stroke];
+ [image unlockFocus];
+ [image setTemplate:YES];
+ [image setAccessibilityDescription:NSLocalizedString(@"Hide password",
@"")];
+ }
+ return image;
+}
+
+- (void)commonInit {
+ if (button == nil) {
+ button = [[BDSKSecureTextFieldButton alloc] init];
+ [button setButtonType:NSToggleButton];
+ [button setBordered:NO];
+ [button setImagePosition:NSImageOnly];
+ [button setImageScaling:NSImageScaleProportionallyDown];
+ [button setImage:[[self class] showTextImage]];
+ [button setAlternateImage:[[self class] hideTextImage]];
+ [button setRefusesFirstResponder:YES];
+ [button setTarget:self];
+ [button setAction:@selector(toggleShowsText:)];
+ [button setToolTip:showsText ? NSLocalizedString(@"Hide password",
@"Tool tip message") : NSLocalizedString(@"Show password", @"Tool tip
message")];
+ [button setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [self addSubview:button];
+ [self addConstraints:[NSArray arrayWithObjects:
+ [NSLayoutConstraint constraintWithTrailingMargin:2.0
forItem:button toItem:self],
+ [NSLayoutConstraint constraintWithTopMargin:2.0 forItem:button
toItem:self],
+ [NSLayoutConstraint constraintWithBottomMargin:2.0 forItem:button
toItem:self], nil]];
+ }
+}
+
+- (id)initWithFrame:(NSRect)frameRect {
+ self = [super initWithFrame:frameRect];
+ if (self) {
+ [self commonInit];
+ }
+ return self;
+}
+
+- (id)initWithCoder:(NSCoder *)coder {
+ self = [super initWithCoder:coder];
+ if (self) {
+ button = [[coder decodeObjectForKey:@"button"] retain];
+ showsText = [coder decodeBoolForKey:@"showsText"];
+ [self commonInit];
+ }
+ return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)coder {
+ [super encodeWithCoder:coder];
+ [coder encodeConditionalObject:button forKey:@"button"];
+ [coder encodeBool:showsText forKey:@"showsText"];
+}
+
+- (void)dealloc {
+ BDSKDESTROY(button);
+ BDSKDESTROY(secureCell);
+ BDSKDESTROY(unsecureCell);
+ [super dealloc];
+}
+
+- (IBAction)toggleShowsText:(id)sender {
+ [self setShowsText:[sender state] == NSOnState];
+ [sender setToolTip:showsText ? NSLocalizedString(@"Hide password", @"Tool
tip message") : NSLocalizedString(@"Show password", @"Tool tip message")];
+}
+
+- (void)setShowsText:(BOOL)flag {
+ if (showsText == flag)
+ return;
+ showsText = flag;
+
+ NSTextFieldCell *oldCell = [self cell];
+ NSTextFieldCell *newCell;
+
+ if (showsText) {
+ if (unsecureCell == nil) {
+ unsecureCell = [[BDSKUnsecureTextFieldCell alloc]
initTextCell:@""];
+ [unsecureCell setFont:[oldCell font]];
+ [unsecureCell setControlSize:[oldCell controlSize]];
+ [unsecureCell setControlTint:[oldCell controlTint]];
+ [unsecureCell setEnabled:[oldCell isEnabled]];
+ [unsecureCell setAlignment:[oldCell alignment]];
+ [unsecureCell setWraps:[oldCell wraps]];
+ [unsecureCell setScrollable:[oldCell isScrollable]];
+ [unsecureCell setSelectable:[oldCell isSelectable]];
+ [unsecureCell setEditable:[oldCell isEditable]];
+ [unsecureCell setDrawsBackground:[oldCell drawsBackground]];
+ [unsecureCell setBezeled:[oldCell isBezeled]];
+ if ([oldCell isBezeled])
+ [unsecureCell setBezelStyle:[oldCell bezelStyle]];
+ secureCell = [oldCell retain];
+ }
+ newCell = unsecureCell;
+ } else {
+ if (secureCell == nil) {
+ secureCell = [[BDSKUnsecureTextFieldCell alloc] initTextCell:@""];
+ [secureCell setFont:[oldCell font]];
+ [secureCell setControlSize:[oldCell controlSize]];
+ [secureCell setControlTint:[oldCell controlTint]];
+ [secureCell setEnabled:[oldCell isEnabled]];
+ [secureCell setAlignment:[oldCell alignment]];
+ [secureCell setWraps:[oldCell wraps]];
+ [secureCell setScrollable:[oldCell isScrollable]];
+ [secureCell setSelectable:[oldCell isSelectable]];
+ [secureCell setEditable:[oldCell isEditable]];
+ [secureCell setDrawsBackground:[oldCell drawsBackground]];
+ [secureCell setBezeled:[oldCell isBezeled]];
+ if ([oldCell isBezeled])
+ [secureCell setBezelStyle:[oldCell bezelStyle]];
+ unsecureCell = [oldCell retain];
+ }
+ newCell = secureCell;
+ }
+
+ [newCell setEnabled:[oldCell isEnabled]];
+ [newCell setEditable:[oldCell isEditable]];
+ [newCell setStringValue:[oldCell stringValue] ?: @""];
+
+ NSRange selectedRange = NSMakeRange(NSNotFound, 0);
+ if ([self currentEditor]) {
+ selectedRange = [[self currentEditor] selectedRange];
+ [[self window] makeFirstResponder:[self window]];
+ }
+
+ [self setCell:newCell];
+
+ if (selectedRange.location != NSNotFound) {
+ [[self window] makeFirstResponder:self];
+ [[self currentEditor] setSelectedRange:selectedRange];
+ }
+}
+
+- (id)accessibilityHitTest:(NSPoint)point {
+ if ([button superview] && NSPointInRect(point, [button
convertRectToScreen:[button bounds]]))
+ return NSAccessibilityUnignoredAncestor([button cell]);
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+@end
+
+#pragma mark -
+
+@implementation BDSKSecureTextFieldCell
+
+- (NSRect)drawingRectForBounds:(NSRect)rect {
+ return [super drawingRectForBounds:BDSKShrinkRect(rect, NSHeight(rect) +
2.0, NSMaxXEdge)];
+}
+
+- (NSArray *)accessibilityChildren {
+ NSButton *button = [(BDSKSecureTextField *)[self controlView] button];
+ if (button)
+ return NSAccessibilityUnignoredChildrenForOnlyChild(button);
+ return nil;
+}
+
+- (id)accessibilityHitTest:(NSPoint)point {
+ NSButton *button = [(BDSKSecureTextField *)[self controlView] button];
+ if (button && NSPointInRect(point, [button convertRectToScreen:[button
bounds]]))
+ return [button accessibilityHitTest:point];
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+- (NSArray *)accessibilityAttributeNames {
+ return [[super accessibilityAttributeNames]
arrayByAddingObject:NSAccessibilityChildrenAttribute];
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityChildrenAttribute])
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpartial-availability"
+ return [self accessibilityChildren];
+#pragma clang diagnostic pop
+ return [super accessibilityAttributeValue:attribute];
+}
+
+@end
+
+#pragma mark -
+
+@implementation BDSKUnsecureTextFieldCell
+
+- (NSRect)drawingRectForBounds:(NSRect)rect {
+ return [super drawingRectForBounds:BDSKShrinkRect(rect, NSHeight(rect) +
2.0, NSMaxXEdge)];
+}
+
+- (NSArray *)accessibilityChildren {
+ NSButton *button = [(BDSKSecureTextField *)[self controlView] button];
+ if (button)
+ return NSAccessibilityUnignoredChildrenForOnlyChild(button);
+ return nil;
+}
+
+- (id)accessibilityHitTest:(NSPoint)point {
+ NSButton *button = [(BDSKSecureTextField *)[self controlView] button];
+ if (button && NSPointInRect(point, [button convertRectToScreen:[button
bounds]]))
+ return [button accessibilityHitTest:point];
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+- (NSArray *)accessibilityAttributeNames {
+ return [[super accessibilityAttributeNames]
arrayByAddingObject:NSAccessibilityChildrenAttribute];
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityChildrenAttribute])
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpartial-availability"
+ return [self accessibilityChildren];
+#pragma clang diagnostic pop
+ return [super accessibilityAttributeValue:attribute];
+}
+
+@end
+
+#pragma mark -
+
+@implementation BDSKSecureTextFieldButton
+
+- (id)accessibilityParent {
+ return NSAccessibilityUnignoredAncestor([(NSControl *)[self superview]
cell]);
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityParentAttribute])
+ return NSAccessibilityUnignoredAncestor([(NSControl *)[self superview]
cell]);
+ return [super accessibilityAttributeValue:attribute];
+}
+
+@end
Modified: trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib
===================================================================
--- trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib 2022-10-03 06:30:13 UTC
(rev 27982)
+++ trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib 2022-10-03 09:34:36 UTC
(rev 27983)
@@ -152,9 +152,9 @@
</binding>
</connections>
</textField>
- <textField toolTip="Password for
authentication" verticalHuggingPriority="750"
translatesAutoresizingMaskIntoConstraints="NO" id="197"
customClass="NSSecureTextField">
+ <textField toolTip="Password for
authentication" verticalHuggingPriority="750"
translatesAutoresizingMaskIntoConstraints="NO" id="197"
customClass="BDSKSecureTextField">
<rect key="frame" x="259" y="66"
width="94" height="19"/>
- <textFieldCell key="cell"
controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES"
editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel"
drawsBackground="YES" id="928">
+ <textFieldCell key="cell"
controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES"
editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel"
drawsBackground="YES" id="928" customClass="BDSKSecureTextFieldCell">
<font key="font"
metaFont="message" size="11"/>
<color key="textColor"
name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor"
name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
Modified: trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
===================================================================
--- trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj 2022-10-03 06:30:13 UTC
(rev 27982)
+++ trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj 2022-10-03 09:34:36 UTC
(rev 27983)
@@ -732,6 +732,8 @@
CEE23BE50BFBA78F002B746B /* template.txt in Copy Files: Shared
Support */ = {isa = PBXBuildFile; fileRef = F91B5CE407657A200011ED22 /*
template.txt */; };
CEE50487104D662500636237 /* BDSKNotesSearchIndex.m in Sources
*/ = {isa = PBXBuildFile; fileRef = CEE50486104D662500636237 /*
BDSKNotesSearchIndex.m */; };
CEE7ACE9109E2F360072D63C /* NSSplitView_BDSKExtensions.m in
Sources */ = {isa = PBXBuildFile; fileRef = CEE7ACE7109E2F360072D63C /*
NSSplitView_BDSKExtensions.m */; };
+ CEE8445228EAE17C009FD564 /* BDSKSecureTextField.h in Headers */
= {isa = PBXBuildFile; fileRef = CEE8445028EAE17C009FD564 /*
BDSKSecureTextField.h */; };
+ CEE8445328EAE17C009FD564 /* BDSKSecureTextField.m in Sources */
= {isa = PBXBuildFile; fileRef = CEE8445128EAE17C009FD564 /*
BDSKSecureTextField.m */; };
CEE882B926697C0500574E12 /* BDSKControlTableCellView.h in
Headers */ = {isa = PBXBuildFile; fileRef = CEE882B726697C0500574E12 /*
BDSKControlTableCellView.h */; };
CEE882BA26697C0500574E12 /* BDSKControlTableCellView.m in
Sources */ = {isa = PBXBuildFile; fileRef = CEE882B826697C0500574E12 /*
BDSKControlTableCellView.m */; };
CEE8DD470E5C3F5B00EFA97F /* yaz.framework in Copy Files:
Frameworks */ = {isa = PBXBuildFile; fileRef = F9C7E5950BEA3C9400D65C7F /*
yaz.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
@@ -1925,6 +1927,8 @@
CEE50488104D664200636237 /* BDSKNotesSearchIndex.h */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path =
BDSKNotesSearchIndex.h; sourceTree = "<group>"; };
CEE7ACE6109E2F360072D63C /* NSSplitView_BDSKExtensions.h */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
path = NSSplitView_BDSKExtensions.h; sourceTree = "<group>"; };
CEE7ACE7109E2F360072D63C /* NSSplitView_BDSKExtensions.m */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = NSSplitView_BDSKExtensions.m; sourceTree = "<group>";
};
+ CEE8445028EAE17C009FD564 /* BDSKSecureTextField.h */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
BDSKSecureTextField.h; sourceTree = "<group>"; };
+ CEE8445128EAE17C009FD564 /* BDSKSecureTextField.m */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
BDSKSecureTextField.m; sourceTree = "<group>"; };
CEE882B726697C0500574E12 /* BDSKControlTableCellView.h */ =
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
BDSKControlTableCellView.h; sourceTree = "<group>"; };
CEE882B826697C0500574E12 /* BDSKControlTableCellView.m */ =
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
BDSKControlTableCellView.m; sourceTree = "<group>"; };
CEEA4C680B57B0D400434059 /* BDSKBooleanValueTransformer.m */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = BDSKBooleanValueTransformer.m; sourceTree =
"<group>"; };
@@ -2649,6 +2653,7 @@
CEF7A6670915115B00BE9E02 /* BDSKScriptMenu.m */,
F9EF21B308B1572500AAC9A9 /*
BDSKScrollableTextField.m */,
F9EF21B508B1572500AAC9A9 /*
BDSKScrollableTextFieldCell.m */,
+ CEE8445128EAE17C009FD564 /*
BDSKSecureTextField.m */,
CE62E0920F4C46D600BDF01E /* BDSKSplitView.m */,
CE30FAD60919713100CB1A19 /* BDSKStatusBar.m */,
CE62E0B80F4C4A2100BDF01E /* BDSKTableView.m */,
@@ -3387,6 +3392,7 @@
CEFE212F1259E6CB00DAD553 /*
BDSKSearchGroupServerManager.h */,
F9B800920B41DFAF00A5A615 /*
BDSKSearchGroupSheetController.h */,
CEBC676C0B4A845F00CE0B2D /*
BDSKSearchGroupViewController.h */,
+ CEE8445028EAE17C009FD564 /*
BDSKSecureTextField.h */,
CE095D4F135C52B5000E4396 /* BDSKSelectCommand.h
*/,
CE9666430B46B70C003BAB9A /* BDSKServerInfo.h */,
CEC9B8A22172418D00108617 /*
BDSKServerInfo+Scripting.h */,
@@ -3698,6 +3704,7 @@
CE2A0A4C224599F600A8F31C /*
BDSKPubMedXMLParser.h in Headers */,
CE2A0A07224599E900A8F31C /* BDSKFontManager.h
in Headers */,
CE2A0A6122459A0A00A8F31C /*
BDSKScrollableTextField.h in Headers */,
+ CEE8445228EAE17C009FD564 /*
BDSKSecureTextField.h in Headers */,
CE15419C2649753D001F1655 /*
BDSKFormatTextField.h in Headers */,
CE2A0A8222459A3100A8F31C /* BDSKTableView.h in
Headers */,
CE2A0A8E22459A3600A8F31C /*
BDSKTextWithIconCell.h in Headers */,
@@ -4817,6 +4824,7 @@
CE82BE8D0D58C12A00A2E8C5 /*
BDSKMacroResolver+Scripting.m in Sources */,
CE3011A30D5CC41D00C0B7FA /* BDSKAddCommand.m in
Sources */,
CE3011AD0D5CC46F00C0B7FA /* BDSKRemoveCommand.m
in Sources */,
+ CEE8445328EAE17C009FD564 /*
BDSKSecureTextField.m in Sources */,
CE3011BA0D5CC4D100C0B7FA /*
NSAppleEventDescriptor_BDSKExtensions.m in Sources */,
CE6DCA230D6A0237003A072F /*
BDSKCondition+Scripting.m in Sources */,
CE8BE5480D99A10700E314A4 /* BDSKBookmark.m in
Sources */,
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit