Author: mlytwyn
Date: Thu Dec  4 17:02:07 2014
New Revision: 38228

URL: http://svn.gna.org/viewcvs/gnustep?rev=38228&view=rev
Log:
Fix initial cursor insertion location with paragraph alignment setting

Modified:
    libs/gui/branches/gnustep_testplant_branch/Source/NSLayoutManager.m

Modified: libs/gui/branches/gnustep_testplant_branch/Source/NSLayoutManager.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/gui/branches/gnustep_testplant_branch/Source/NSLayoutManager.m?rev=38228&r1=38227&r2=38228&view=diff
==============================================================================
--- libs/gui/branches/gnustep_testplant_branch/Source/NSLayoutManager.m 
(original)
+++ libs/gui/branches/gnustep_testplant_branch/Source/NSLayoutManager.m Thu Dec 
 4 17:02:07 2014
@@ -858,48 +858,61 @@
   linefrag_t *lf;
   float x0, x1;
   NSRect r;
-
+  
   unsigned int glyph_index;
   float fraction_through;
-
-
+  
+  
   glyph_index = [self _glyphIndexForCharacterIndex: cindex
-                                  fractionThrough: &fraction_through];
+                                   fractionThrough: &fraction_through];
   if (glyph_index == (unsigned int)-1)
     {
       /* Need complete layout information. */
       [self _doLayout];
       if (extra_textcontainer)
-       {
-         for (tc = textcontainers, i = 0; i < num_textcontainers; i++, tc++)
-           if (tc->textContainer == extra_textcontainer)
-             break;
-         NSAssert(i < num_textcontainers, @"invalid extraTextContainer");
-         *textContainer = i;
-         r = extra_rect;
-         r.size.width = 1;
-         return r;
-       }
+        {
+          for (tc = textcontainers, i = 0; i < num_textcontainers; i++, tc++)
+            if (tc->textContainer == extra_textcontainer)
+              break;
+          NSAssert(i < num_textcontainers, @"invalid extraTextContainer");
+          *textContainer = i;
+          r = extra_rect;
+          r.size.width = 1;
+          return r;
+        }
       glyph_index = [self numberOfGlyphs] - 1;
       if (glyph_index == (unsigned int)-1)
-       { /* No information is available. Get default font height. */
-         NSFont *f = [_typingAttributes objectForKey:NSFontAttributeName];
-
-         /* will be -1 if there are no text containers */
-         *textContainer = num_textcontainers - 1;
-         r = NSMakeRect(0, 0, 1, [f boundingRectForFont].size.height);
-         if (num_textcontainers > 0)
-           {
-             tc = textcontainers + num_textcontainers - 1;
-             r.origin.x += [tc->textContainer lineFragmentPadding];
-           }
-         return r;
-       }
+        { /* No information is available. Get default font height. */
+          NSFont            *f         = [_typingAttributes 
objectForKey:NSFontAttributeName];
+          NSParagraphStyle  *paragraph = [_typingAttributes objectForKey: 
NSParagraphStyleAttributeName];
+          NSTextAlignment    alignment = [paragraph alignment];
+          
+          /* will be -1 if there are no text containers */
+          *textContainer = num_textcontainers - 1;
+          r = NSMakeRect(0, 0, 1, [f boundingRectForFont].size.height);
+          if (num_textcontainers > 0)
+          {
+            tc = textcontainers + num_textcontainers - 1;
+            r.origin.x += [tc->textContainer lineFragmentPadding];
+          }
+          
+          // Apply left/right/center justification...
+          if (alignment == NSRightTextAlignment)
+          {
+            r.origin.x += [[self firstTextView] frame].size.width;
+          }
+          else if (alignment == NSCenterTextAlignment)
+          {
+            r.origin.x += [[self firstTextView] frame].size.width / 2;
+          }
+          
+          return r;
+        }
       fraction_through = 1.0;
     }
   else
     [self _doLayoutToGlyph: glyph_index];
-
+  
   for (tc = textcontainers, i = 0; i < num_textcontainers; i++, tc++)
     if (tc->pos + tc->length > glyph_index)
       break;
@@ -908,17 +921,17 @@
       *textContainer = -1;
       return NSZeroRect;
     }
-
+  
   *textContainer = i;
-
+  
   LINEFRAG_FOR_GLYPH(glyph_index);
-
+  
   /* Special case if we are asked for the insertion point rectangle at the
-     end of text, since the standard code yields an incorrect result if the
-     last line fragment ends with an invisible character (e.g., a tab).
-     Note that fraction_through is always less than 1 except when
-     -_glyphIndexForCharacterIndex:fractionThrough: is called for
-     cindex == [_textStorage length], in which case we set it to 1. */
+   end of text, since the standard code yields an incorrect result if the
+   last line fragment ends with an invisible character (e.g., a tab).
+   Note that fraction_through is always less than 1 except when
+   -_glyphIndexForCharacterIndex:fractionThrough: is called for
+   cindex == [_textStorage length], in which case we set it to 1. */
   if (fraction_through == 1.0)
     {
       r = (lf == 0) ? NSZeroRect : lf->used_rect;
@@ -926,43 +939,43 @@
       r.size.width = 1;
       return r;
     }
-
+  
   {
     unsigned int i;
     int j;
     linefrag_point_t *lp;
     glyph_run_t *r;
     unsigned int gpos, cpos;
-
+    
     for (j = 0, lp = lf->points; j < lf->num_points; j++, lp++)
       if (lp->pos + lp->length > glyph_index)
-       break;
-
+        break;
+    
     x0 = lp->p.x + lf->rect.origin.x;
     r = run_for_glyph_index(lp->pos, glyphs, &gpos, &cpos);
     i = lp->pos - gpos;
-
+    
     while (i + gpos < glyph_index)
       {
-       if (!r->glyphs[i].isNotShown && r->glyphs[i].g &&
-           r->glyphs[i].g != NSControlGlyph)
-         {
-           x0 += [r->font advancementForGlyph: r->glyphs[i].g].width;
-         }
-       GLYPH_STEP_FORWARD(r, i, gpos, cpos)
+        if (!r->glyphs[i].isNotShown && r->glyphs[i].g &&
+            r->glyphs[i].g != NSControlGlyph)
+          {
+            x0 += [r->font advancementForGlyph: r->glyphs[i].g].width;
+          }
+        GLYPH_STEP_FORWARD(r, i, gpos, cpos)
       }
     x1 = x0;
     if (!r->glyphs[i].isNotShown && r->glyphs[i].g &&
-       r->glyphs[i].g != NSControlGlyph)
+        r->glyphs[i].g != NSControlGlyph)
       {
-       x1 += [r->font advancementForGlyph: r->glyphs[i].g].width;
+        x1 += [r->font advancementForGlyph: r->glyphs[i].g].width;
       }
   }
-
+  
   r = lf->rect;
   r.origin.x = x0 + (x1 - x0) * fraction_through;
   r.size.width = 1;
-
+  
   return r;
 }
 


_______________________________________________
Gnustep-cvs mailing list
Gnustep-cvs@gna.org
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to