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

Reply via email to