Revision: 18368
http://bibdesk.svn.sourceforge.net/bibdesk/?rev=18368&view=rev
Author: hofman
Date: 2012-01-06 18:25:45 +0000 (Fri, 06 Jan 2012)
Log Message:
-----------
add markers for errors to line number view of error editor
Modified Paths:
--------------
trunk/bibdesk/BDSKErrorEditor.h
trunk/bibdesk/BDSKErrorEditor.m
trunk/bibdesk/BDSKErrorObject.h
trunk/bibdesk/BDSKErrorObject.m
trunk/bibdesk/BDSKErrorObjectController.m
trunk/bibdesk/BDSKLineNumberView.h
trunk/bibdesk/BDSKLineNumberView.m
Modified: trunk/bibdesk/BDSKErrorEditor.h
===================================================================
--- trunk/bibdesk/BDSKErrorEditor.h 2012-01-06 07:35:53 UTC (rev 18367)
+++ trunk/bibdesk/BDSKErrorEditor.h 2012-01-06 18:25:45 UTC (rev 18368)
@@ -47,6 +47,7 @@
IBOutlet NSButton *reloadButton;
IBOutlet NSTextField *lineNumberField;
BDSKErrorManager *manager;
+ NSArray *errors;
NSString *fileName;
NSString *displayName;
NSData *data;
@@ -66,6 +67,9 @@
- (BDSKErrorManager *)manager;
- (void)setManager:(BDSKErrorManager *)newManager;
+- (NSArray *)errors;
+- (void)setErrors:(NSArray *)newErrors;
+
- (NSString *)fileName;
- (void)setFileName:(NSString *)newFileName;
- (NSString *)displayName;
@@ -74,6 +78,8 @@
- (void)updateDisplayName;
+- (void)updateErrorMarkers;
+
- (IBAction)loadFile:(id)sender;
- (IBAction)reopenDocument:(id)sender;
- (IBAction)changeSyntaxHighlighting:(id)sender;
Modified: trunk/bibdesk/BDSKErrorEditor.m
===================================================================
--- trunk/bibdesk/BDSKErrorEditor.m 2012-01-06 07:35:53 UTC (rev 18367)
+++ trunk/bibdesk/BDSKErrorEditor.m 2012-01-06 18:25:45 UTC (rev 18368)
@@ -46,6 +46,7 @@
#import "BDSKStringEncodingManager.h"
#import "NSWindowController_BDSKExtensions.h"
#import "BDSKLineNumberView.h"
+#import "BDSKErrorObject.h"
static char BDSKErrorEditorObservationContext;
@@ -59,6 +60,7 @@
{
if(self = [super init]){
manager = nil;
+ errors = nil;
fileName = [aFileName retain];
displayName = [[fileName lastPathComponent] retain];
data = [aData copy];
@@ -87,6 +89,7 @@
- (void)dealloc;
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
+ BDSKDESTROY(errors);
BDSKDESTROY(fileName);
BDSKDESTROY(displayName);
BDSKDESTROY(data);
@@ -120,6 +123,8 @@
[self loadFile:self];
+ [self updateErrorMarkers];
+
NSString *prefix = (isPasteDrag) ? NSLocalizedString(@"Paste/Drag Data",
@"Partial window title") : NSLocalizedString(@"Source Data", @"Partial window
title");
BDSKASSERT(fileName);
@@ -168,6 +173,20 @@
}
}
+- (NSArray *)errors;
+{
+ return errors;
+}
+
+- (void)setErrors:(NSArray *)newErrors;
+{
+ if (errors != newErrors) {
+ [errors release];
+ errors = [[NSArray alloc] initWithArray:newErrors copyItems:YES];
+ [self updateErrorMarkers];
+ }
+}
+
- (NSString *)fileName;
{
return fileName;
@@ -221,6 +240,22 @@
return isPasteDrag;
}
+- (void)updateErrorMarkers;
+{
+ NSRulerView *ruler = [[textView enclosingScrollView] verticalRulerView];
+ if (ruler) {
+ NSMutableArray *markers = [NSMutableArray arrayWithCapacity:[errors
count]];
+ for (BDSKErrorObject *error in errors) {
+ NSImage *image = [[NSWorkspace sharedWorkspace]
iconForFileType:NSFileTypeForHFSTypeCode([error isIgnorableWarning] ?
kAlertCautionIcon : kAlertStopIcon)];
+ NSRulerMarker *marker = [[NSRulerMarker alloc]
initWithRulerView:ruler markerLocation:0.0 image:image imageOrigin:NSZeroPoint];
+ [marker setRepresentedObject:error];
+ [markers addObject:marker];
+ [marker release];
+ }
+ [ruler setMarkers:markers];
+ }
+}
+
#pragma mark Editing
- (IBAction)loadFile:(id)sender{
Modified: trunk/bibdesk/BDSKErrorObject.h
===================================================================
--- trunk/bibdesk/BDSKErrorObject.h 2012-01-06 07:35:53 UTC (rev 18367)
+++ trunk/bibdesk/BDSKErrorObject.h 2012-01-06 18:25:45 UTC (rev 18368)
@@ -40,7 +40,7 @@
@class BDSKErrorEditor, BibItem;
-@interface BDSKErrorObject : NSObject {
+@interface BDSKErrorObject : NSObject <NSCopying> {
BDSKErrorEditor *editor;
BibItem *publication;
Modified: trunk/bibdesk/BDSKErrorObject.m
===================================================================
--- trunk/bibdesk/BDSKErrorObject.m 2012-01-06 07:35:53 UTC (rev 18367)
+++ trunk/bibdesk/BDSKErrorObject.m 2012-01-06 18:25:45 UTC (rev 18368)
@@ -54,6 +54,16 @@
return self;
}
+- (id)copyWithZone:(NSZone *)zone {
+ id error = [[[self class] alloc] init];
+ [error setErrorClassName:errorClassName];
+ [error setFileName:fileName];
+ [error setLineNumber:lineNumber];
+ [error setErrorMessage:errorMessage];
+ [error setIgnorableWarning:isIgnorableWarning];
+ return error;
+}
+
- (void)dealloc {
[fileName release];
[editor release];
Modified: trunk/bibdesk/BDSKErrorObjectController.m
===================================================================
--- trunk/bibdesk/BDSKErrorObjectController.m 2012-01-06 07:35:53 UTC (rev
18367)
+++ trunk/bibdesk/BDSKErrorObjectController.m 2012-01-06 18:25:45 UTC (rev
18368)
@@ -359,7 +359,9 @@
- (void)endObservingErrorsForDocument:(BibDocument *)document
pasteDragData:(NSData *)data {
if([currentErrors count]){
if(document != nil){ // this should happen only for temporary author
objects, which we ignore as they don't belong to any document
- [currentErrors setValue:[self editorForDocument:document
pasteDragData:data] forKey:@"editor"];
+ BDSKErrorEditor *editor = [self editorForDocument:document
pasteDragData:data];
+ [editor setErrors:currentErrors];
+ [currentErrors setValue:editor forKey:@"editor"];
[[self mutableArrayValueForKey:@"errors"]
addObjectsFromArray:currentErrors];
if([self isWindowVisible] == NO && (handledNonIgnorableError ||
[[NSUserDefaults standardUserDefaults] boolForKey:BDSKShowWarningsKey]))
[self showWindow:self];
Modified: trunk/bibdesk/BDSKLineNumberView.h
===================================================================
--- trunk/bibdesk/BDSKLineNumberView.h 2012-01-06 07:35:53 UTC (rev 18367)
+++ trunk/bibdesk/BDSKLineNumberView.h 2012-01-06 18:25:45 UTC (rev 18368)
@@ -41,5 +41,6 @@
@interface BDSKLineNumberView : NSRulerView {
NSPointerArray *lineCharacterIndexes;
+ NSMapTable *errorMarkers;
}
@end
Modified: trunk/bibdesk/BDSKLineNumberView.m
===================================================================
--- trunk/bibdesk/BDSKLineNumberView.m 2012-01-06 07:35:53 UTC (rev 18367)
+++ trunk/bibdesk/BDSKLineNumberView.m 2012-01-06 18:25:45 UTC (rev 18368)
@@ -38,8 +38,11 @@
#import "BDSKLineNumberView.h"
#import "NSInvocation_BDSKExtensions.h"
+#import "NSImage_BDSKExtensions.h"
+#import "BDSKErrorObject.h"
#define DEFAULT_THICKNESS 22.0
+#define MARKER_THICKNESS 12.0
#define RULER_MARGIN 4.0
@implementation BDSKLineNumberView
@@ -57,6 +60,8 @@
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
BDSKDESTROY(lineCharacterIndexes);
+ if (errorMarkers) NSFreeMapTable(errorMarkers);
+ errorMarkers = nil;
[super dealloc];
}
@@ -87,11 +92,50 @@
BDSKDESTROY(lineCharacterIndexes);
}
+- (void)setMarkers:(NSArray *)markers {
+ [super setMarkers:markers];
+ if (errorMarkers)
+ NSResetMapTable(errorMarkers);
+ else
+ errorMarkers = NSCreateMapTable(NSIntegerMapKeyCallBacks,
NSObjectMapValueCallBacks, 0);
+ for (NSRulerMarker *marker in markers) {
+ id object = [marker representedObject];
+ if ([object isKindOfClass:[BDSKErrorObject class]]) {
+ NSInteger line = [object lineNumber];
+ if (line > 0)
+ NSMapInsert(errorMarkers, (const void *)(line - 1), marker);
+ }
+ }
+}
+
+- (void)addMarker:(NSRulerMarker *)marker {
+ [super addMarker:marker];
+ id object = [marker representedObject];
+ if ([object isKindOfClass:[BDSKErrorObject class]]) {
+ NSInteger line = [object lineNumber];
+ if (line > 0) {
+ if (errorMarkers == nil)
+ errorMarkers = NSCreateMapTable(NSIntegerMapKeyCallBacks,
NSObjectMapValueCallBacks, 0);
+ NSMapInsert(errorMarkers, (const void *)(line - 1), marker);
+ }
+ }
+}
+
+- (void)removeMarker:(NSRulerMarker *)marker {
+ [super removeMarker:marker];
+ id object = [marker representedObject];
+ if (errorMarkers && [object isKindOfClass:[BDSKErrorObject class]]) {
+ NSInteger line = [object lineNumber];
+ if (line > 0)
+ NSMapRemove(errorMarkers, (const void *)(line - 1));
+ }
+}
+
static inline CGFloat ruleThicknessForLineCount(NSUInteger count) {
NSUInteger i = (NSUInteger)log10(count) + 1;
NSMutableString *string = [NSMutableString string];
while (i-- > 0) [string appendString:@"0"];
- return ceilf(fmax(DEFAULT_THICKNESS, [string
sizeWithAttributes:lineNumberAttributes].width + RULER_MARGIN * 2));
+ return ceilf(fmax(DEFAULT_THICKNESS, [string
sizeWithAttributes:lineNumberAttributes].width + RULER_MARGIN +
MARKER_THICKNESS));
}
static NSPointerArray *createLineCharacterIndexesForString(NSString *string) {
@@ -148,7 +192,6 @@
- (void)drawHashMarksAndLabelsInRect:(NSRect)aRect {
id view = [self clientView];
- NSRect bounds = NSInsetRect([self bounds], RULER_MARGIN, 0.0);
if ([view isKindOfClass:[NSTextView class]]) {
NSLayoutManager *lm = [view layoutManager];
@@ -158,23 +201,34 @@
NSRange nullRange = NSMakeRange(NSNotFound, 0);
NSString *label;
NSRectArray rects;
- CGFloat offset = [view textContainerInset].height -
NSMinY(visibleRect);
+ CGFloat offsetX = NSMaxX([self bounds]) - RULER_MARGIN;
+ CGFloat offsetY = [view textContainerInset].height -
NSMinY(visibleRect);
NSSize labelSize;
NSPointerArray *lines = [self lineCharacterIndexes];
NSUInteger rectCount, i, line, count = [lines count];
+ NSRulerMarker *marker;
+ NSRect rect;
// one extra for any newline at the end, which doesn't have a glyph
range.length++;
+ [self removeAllToolTips];
+
for (line = [self lineForCharacterIndex:range.location]; line < count;
line++) {
i = (NSUInteger)[lines pointerAtIndex:line];
if (NSLocationInRange(i, range)) {
rects = [lm rectArrayForCharacterRange:NSMakeRange(i, 0)
withinSelectedCharacterRange:nullRange inTextContainer:container
rectCount:&rectCount];
if (rectCount > 0) {
+ if (errorMarkers && (marker = NSMapGet(errorMarkers,
(const void *)line))) {
+ rect = NSMakeRect(1.0, offsetY + NSMidY(rects[0]) -
0.5 * MARKER_THICKNESS, MARKER_THICKNESS, MARKER_THICKNESS);
+ [[marker image] drawFlipped:[self isFlipped]
inRect:rect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
+ [self addToolTipRect:rect owner:[(BDSKErrorObject
*)[marker representedObject] errorMessage] userData:NULL];
+ }
label = [NSString stringWithFormat:@"%lu", (unsigned
long)(line + 1)];
labelSize = [label
sizeWithAttributes:lineNumberAttributes];
- [label drawInRect:NSMakeRect(NSMaxX(bounds) -
labelSize.width, offset + NSMidY(rects[0]) - 0.5 * labelSize.height,
NSWidth(bounds), NSHeight(rects[0])) withAttributes:lineNumberAttributes];
+ rect = NSMakeRect(offsetX - labelSize.width, offsetY +
NSMidY(rects[0]) - 0.5 * labelSize.height, labelSize.width, labelSize.height);
+ [label drawInRect:rect
withAttributes:lineNumberAttributes];
}
}
if (i > NSMaxRange(range))
@@ -183,4 +237,8 @@
}
}
+- (void)drawMarkersInRect:(NSRect)aRect {}
+
+- (void)mouseDown:(NSEvent *)theEvent {}
+
@end
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual
desktops for less than the cost of PCs and save 60% on VDI infrastructure
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit