Revision: 4900
          http://skim-app.svn.sourceforge.net/skim-app/?rev=4900&view=rev
Author:   hofman
Date:     2008-10-30 23:21:13 +0000 (Thu, 30 Oct 2008)

Log Message:
-----------
More readable and modular determination of discrete scale factors in zoomable 
pdf views

Modified Paths:
--------------
    trunk/BDSKZoomablePDFView.m
    trunk/SKSecondaryPDFView.m

Modified: trunk/BDSKZoomablePDFView.m
===================================================================
--- trunk/BDSKZoomablePDFView.m 2008-10-30 12:41:10 UTC (rev 4899)
+++ trunk/BDSKZoomablePDFView.m 2008-10-30 23:21:13 UTC (rev 4900)
@@ -223,6 +223,24 @@
     }
 }
 
+- (unsigned int)lowerIndexForScaleFactor:(float)scaleFactor {
+    unsigned int i, count = (sizeof(BDSKDefaultScaleMenuFactors) / 
sizeof(float));
+    for (i = count - 1; i > 0; i--) {
+        if (scaleFactor * 1.01 > BDSKDefaultScaleMenuFactors[i])
+            return i;
+    }
+    return 1;
+}
+
+- (unsigned int)upperIndexForScaleFactor:(float)scaleFactor {
+    unsigned int i, count = (sizeof(BDSKDefaultScaleMenuFactors) / 
sizeof(float));
+    for (i = 1; i < count; i++) {
+        if (scaleFactor * 0.99 < BDSKDefaultScaleMenuFactors[i])
+            return i;
+    }
+    return count - 1;
+}
+
 - (void)setScaleFactor:(float)newScaleFactor {
        [self setScaleFactor:newScaleFactor adjustPopup:YES];
 }
@@ -233,12 +251,13 @@
                if (newScaleFactor < 0.01) {
             newScaleFactor = 0.0;
         } else {
-            unsigned cnt = 1, numberOfDefaultItems = 
(sizeof(BDSKDefaultScaleMenuFactors) / sizeof(float));
-            
-            // We only work with some preset zoom values, so choose one of the 
appropriate values
-            while (cnt < numberOfDefaultItems - 1 && newScaleFactor > 0.5 * 
(BDSKDefaultScaleMenuFactors[cnt] + BDSKDefaultScaleMenuFactors[cnt + 1])) 
cnt++;
-            [scalePopUpButton selectItemAtIndex:cnt];
-            newScaleFactor = BDSKDefaultScaleMenuFactors[cnt];
+            unsigned int i = [self lowerIndexForScaleFactor:newScaleFactor], 
upper = [self upperIndexForScaleFactor:newScaleFactor];
+            if (upper > i) {
+                if (newScaleFactor > 0.5 * (BDSKDefaultScaleMenuFactors[i] + 
BDSKDefaultScaleMenuFactors[upper]))
+                    i = upper;
+            }
+            [scalePopUpButton selectItemAtIndex:i];
+            newScaleFactor = BDSKDefaultScaleMenuFactors[i];
         }
     }
     
@@ -257,14 +276,10 @@
         [super zoomIn:sender];
         [self setAutoFits:NO adjustPopup:YES];
     }else{
-        int cnt = 1, numberOfDefaultItems = 
(sizeof(BDSKDefaultScaleMenuFactors) / sizeof(float));
-        float scaleFactor = [self scaleFactor];
-        
-        // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-        while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
BDSKDefaultScaleMenuFactors[cnt]) cnt++;
-        cnt++;
-        while (cnt >= numberOfDefaultItems) cnt--;
-        [self setScaleFactor:BDSKDefaultScaleMenuFactors[cnt]];
+        unsigned int numberOfDefaultItems = 
(sizeof(BDSKDefaultScaleMenuFactors) / sizeof(float));
+        unsigned int i = [self lowerIndexForScaleFactor:[self scaleFactor]];
+        if (i < numberOfDefaultItems - 1) i++;
+        [self setScaleFactor:BDSKDefaultScaleMenuFactors[i]];
     }
 }
 
@@ -273,35 +288,25 @@
         [super zoomOut:sender];
         [self setAutoFits:NO adjustPopup:YES];
     }else{
-        int cnt = 1, numberOfDefaultItems = 
(sizeof(BDSKDefaultScaleMenuFactors) / sizeof(float));
-        float scaleFactor = [self scaleFactor];
-        
-        // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-        while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
BDSKDefaultScaleMenuFactors[cnt]) cnt++;
-        cnt--;
-        while (cnt < 1) cnt++;
-        [self setScaleFactor:BDSKDefaultScaleMenuFactors[cnt]];
+        unsigned int i = [self upperIndexForScaleFactor:[self scaleFactor]];
+        if (i > 1) i--;
+        [self setScaleFactor:BDSKDefaultScaleMenuFactors[i]];
     }
 }
 
 - (BOOL)canZoomIn{
     if ([super canZoomIn] == NO)
         return NO;
-    unsigned cnt = 1, numberOfDefaultItems = 
(sizeof(BDSKDefaultScaleMenuFactors) / sizeof(float));
-    float scaleFactor = [self scaleFactor];
-    // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-    while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
BDSKDefaultScaleMenuFactors[cnt]) cnt++;
-    return cnt < numberOfDefaultItems - 1;
+    unsigned int numberOfDefaultItems = (sizeof(BDSKDefaultScaleMenuFactors) / 
sizeof(float));
+    unsigned int i = [self lowerIndexForScaleFactor:[self scaleFactor]];
+    return i < numberOfDefaultItems - 1;
 }
 
 - (BOOL)canZoomOut{
     if ([super canZoomOut] == NO)
         return NO;
-    unsigned cnt = 1, numberOfDefaultItems = 
(sizeof(BDSKDefaultScaleMenuFactors) / sizeof(float));
-    float scaleFactor = [self scaleFactor];
-    // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-    while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
BDSKDefaultScaleMenuFactors[cnt]) cnt++;
-    return cnt > 1;
+    unsigned int i = [self upperIndexForScaleFactor:[self scaleFactor]];
+    return i > 1;
 }
 
 - (void)goToPage:(PDFPage *)aPage {

Modified: trunk/SKSecondaryPDFView.m
===================================================================
--- trunk/SKSecondaryPDFView.m  2008-10-30 12:41:10 UTC (rev 4899)
+++ trunk/SKSecondaryPDFView.m  2008-10-30 23:21:13 UTC (rev 4900)
@@ -346,6 +346,24 @@
     switching = savedSwitching;
 }
 
+- (unsigned int)lowerIndexForScaleFactor:(float)scaleFactor {
+    unsigned int i, count = (sizeof(SKDefaultScaleMenuFactors) / 
sizeof(float));
+    for (i = count - 1; i > 1; i--) {
+        if (scaleFactor * 1.01 > SKDefaultScaleMenuFactors[i])
+            return i;
+    }
+    return 2;
+}
+
+- (unsigned int)upperIndexForScaleFactor:(float)scaleFactor {
+    unsigned int i, count = (sizeof(SKDefaultScaleMenuFactors) / 
sizeof(float));
+    for (i = 2; i < count; i++) {
+        if (scaleFactor * 0.99 < SKDefaultScaleMenuFactors[i])
+            return i;
+    }
+    return count - 1;
+}
+
 - (void)setScaleFactor:(float)newScaleFactor {
     BOOL savedSwitching = switching;
     switching = YES;
@@ -366,12 +384,13 @@
                if (newScaleFactor < 0.01) {
             newScaleFactor = 0.0;
         } else {
-            unsigned cnt = 2, numberOfDefaultItems = 
(sizeof(SKDefaultScaleMenuFactors) / sizeof(float));
-            
-            // We only work with some preset zoom values, so choose one of the 
appropriate values
-            while (cnt < numberOfDefaultItems - 1 && newScaleFactor > 0.5 * 
(SKDefaultScaleMenuFactors[cnt] + SKDefaultScaleMenuFactors[cnt + 1])) cnt++;
-            [scalePopUpButton selectItemAtIndex:cnt];
-            newScaleFactor = SKDefaultScaleMenuFactors[cnt];
+            unsigned int i = [self lowerIndexForScaleFactor:newScaleFactor], 
upper = [self upperIndexForScaleFactor:newScaleFactor];
+            if (upper > i) {
+                if (newScaleFactor > 0.5 * (SKDefaultScaleMenuFactors[i] + 
SKDefaultScaleMenuFactors[upper]))
+                    i = upper;
+            }
+            [scalePopUpButton selectItemAtIndex:i];
+            newScaleFactor = SKDefaultScaleMenuFactors[i];
         }
     }
     
@@ -387,49 +406,31 @@
 }
 
 - (IBAction)zoomIn:(id)sender{
-    int cnt = 2, numberOfDefaultItems = (sizeof(SKDefaultScaleMenuFactors) / 
sizeof(float));
-    float scaleFactor = [self scaleFactor];
-    
-    // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-    while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
SKDefaultScaleMenuFactors[cnt]) cnt++;
-    cnt++;
-    while (cnt >= numberOfDefaultItems) cnt--;
-    [self setScaleFactor:SKDefaultScaleMenuFactors[cnt] adjustPopup:YES];
+    unsigned int numberOfDefaultItems = (sizeof(SKDefaultScaleMenuFactors) / 
sizeof(float));
+    unsigned int i = [self lowerIndexForScaleFactor:[self scaleFactor]];
+    if (i < numberOfDefaultItems - 1) i++;
+    [self setScaleFactor:SKDefaultScaleMenuFactors[i] adjustPopup:YES];
 }
 
 - (IBAction)zoomOut:(id)sender{
-    int cnt = 2, numberOfDefaultItems = (sizeof(SKDefaultScaleMenuFactors) / 
sizeof(float));
-    float scaleFactor = [self scaleFactor];
-    
-    // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-    while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
SKDefaultScaleMenuFactors[cnt]) cnt++;
-    cnt--;
-    while (cnt < 2) cnt++;
-    [self setScaleFactor:SKDefaultScaleMenuFactors[cnt] adjustPopup:YES];
+    unsigned int i = [self upperIndexForScaleFactor:[self scaleFactor]];
+    if (i > 2) i--;
+    [self setScaleFactor:SKDefaultScaleMenuFactors[i] adjustPopup:YES];
 }
 
 - (BOOL)canZoomIn{
     if ([super canZoomIn] == NO)
         return NO;
-    
-    unsigned cnt = 2, numberOfDefaultItems = 
(sizeof(SKDefaultScaleMenuFactors) / sizeof(float));
-    float scaleFactor = [self scaleFactor];
-    
-    // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-    while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
SKDefaultScaleMenuFactors[cnt]) cnt++;
-    return cnt < numberOfDefaultItems - 1;
+    unsigned int numberOfDefaultItems = (sizeof(SKDefaultScaleMenuFactors) / 
sizeof(float));
+    unsigned int i = [self lowerIndexForScaleFactor:[self scaleFactor]];
+    return i < numberOfDefaultItems - 1;
 }
 
 - (BOOL)canZoomOut{
     if ([super canZoomOut] == NO)
         return NO;
-    
-    unsigned cnt = 2, numberOfDefaultItems = 
(sizeof(SKDefaultScaleMenuFactors) / sizeof(float));
-    float scaleFactor = [self scaleFactor];
-    
-    // We only work with some preset zoom values, so choose one of the 
appropriate values (Fudge a little for floating point == to work)
-    while (cnt < numberOfDefaultItems && scaleFactor * .99 > 
SKDefaultScaleMenuFactors[cnt]) cnt++;
-    return cnt > 2;
+    unsigned int i = [self upperIndexForScaleFactor:[self scaleFactor]];
+    return i > 2;
 }
 
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to