]> Shamusworld >> Repos - architektonas/blobdiff - src/base/rs_text.cpp
Refactored CAD tool bars to use predefined actions.
[architektonas] / src / base / rs_text.cpp
index 3b44ae2b23073759b939220d9ae67be1e1e7ada9..56a8cf75e5135a847956ef164191610ac9c7d91f 100644 (file)
@@ -23,9 +23,9 @@
  */
 RS_Text::RS_Text(RS_EntityContainer * parent, const RS_TextData & d): RS_EntityContainer(parent), data(d)
 {
-    usedTextHeight = 0.0;
-    usedTextWidth = 0.0;
-    setText(data.text);
+       usedTextHeight = 0.0;
+       usedTextWidth = 0.0;
+       setText(data.text);
 }
 
 /*virtual*/ RS_Text::~RS_Text()
@@ -59,15 +59,17 @@ RS_TextData RS_Text::getData() const
  */
 int RS_Text::getNumberOfLines()
 {
-    int c=1;
+       int c = 1;
 
-    for (int i=0; i<(int)data.text.length(); ++i) {
-        if (data.text.at(i).unicode()==0x0A) {
-            c++;
-        }
-    }
+       for(int i=0; i<(int)data.text.length(); ++i)
+       {
+               if (data.text.at(i).unicode() == 0x0A)
+               {
+                       c++;
+               }
+       }
 
-    return c;
+       return c;
 }
 
 /**
@@ -77,186 +79,181 @@ int RS_Text::getNumberOfLines()
  */
 void RS_Text::update()
 {
-    RS_DEBUG->print("RS_Text::update");
-
-    clear();
-
-    if (isUndone()) {
-        return;
-    }
-
-    usedTextWidth = 0.0;
-    usedTextHeight = 0.0;
-
-    RS_Font* font = RS_FONTLIST->requestFont(data.style);
-
-    if (font==NULL) {
-        return;
-    }
-
-    Vector letterPos = Vector(0.0, -9.0);
-    Vector letterSpace = Vector(font->getLetterSpacing(), 0.0);
-    Vector space = Vector(font->getWordSpacing(), 0.0);
-    int lineCounter = 0;
-
-    // Every single text line gets stored in this entity container
-    //  so we can move the whole line around easely:
-    RS_EntityContainer* oneLine = new RS_EntityContainer(this);
-
-    // First every text line is created with
-    //   alignement: top left
-    //   angle: 0
-    //   height: 9.0
-    // Rotation, scaling and centering is done later
-
-    // For every letter:
-    for (int i=0; i<(int)data.text.length(); ++i) {
-        switch (data.text.at(i).unicode()) {
-        case 0x0A:
-            // line feed:
-            updateAddLine(oneLine, lineCounter++);
-            oneLine = new RS_EntityContainer(this);
-            letterPos = Vector(0.0, -9.0);
-            break;
-
-        case 0x20:
-            // Space:
-            letterPos+=space;
-            break;
-
-        case 0x5C: {
-                // code (e.g. \S, \P, ..)
-                i++;
-                int ch = data.text.at(i).unicode();
-                switch (ch) {
-                case 'P':
-                    updateAddLine(oneLine, lineCounter++);
-                    oneLine = new RS_EntityContainer(this);
-                    letterPos = Vector(0.0, -9.0);
-                    break;
-
-                case 'S': {
-                        QString up;
-                        QString dw;
-                        //letterPos += letterSpace;
-
-                        // get upper string:
-                        i++;
-                        while (data.text.at(i).unicode()!='^' &&
-                                                      //data.text.at(i).unicode()!='/' &&
-                                                      data.text.at(i).unicode()!='\\' &&
-                                                      //data.text.at(i).unicode()!='#' &&
-                                i<(int)data.text.length()) {
-                            up += data.text.at(i);
-                            i++;
-                        }
-
-                        i++;
-
-                                               if (data.text.at(i-1).unicode()=='^' &&
-                                                    data.text.at(i).unicode()==' ') {
-                                                       i++;
-                                               }
-
-                        // get lower string:
-                        while (data.text.at(i).unicode()!=';' &&
-                                i<(int)data.text.length()) {
-                            dw += data.text.at(i);
-                            i++;
-                        }
-
-                        // add texts:
-                        RS_Text* upper =
-                            new RS_Text(
-                                oneLine,
-                                RS_TextData(letterPos + Vector(0.0,9.0),
-                                            4.0, 100.0, RS2::VAlignTop,
-                                                                                       RS2::HAlignLeft,
-                                            RS2::LeftToRight, RS2::Exact,
-                                            1.0, up, data.style,
-                                            0.0, RS2::Update));
-                                               upper->setLayer(NULL);
-                       upper->setPen(RS_Pen(RS2::FlagInvalid));
-                                               oneLine->addEntity(upper);
-
-                        RS_Text* lower =
-                            new RS_Text(
-                                oneLine,
-                                RS_TextData(letterPos+Vector(0.0,4.0),
-                                            4.0, 100.0, RS2::VAlignTop,
-                                                                                       RS2::HAlignLeft,
-                                            RS2::LeftToRight, RS2::Exact,
-                                            1.0, dw, data.style,
-                                            0.0, RS2::Update));
-                                               lower->setLayer(NULL);
-                       lower->setPen(RS_Pen(RS2::FlagInvalid));
-                        oneLine->addEntity(lower);
-
-                        // move cursor:
-                        upper->calculateBorders();
-                        lower->calculateBorders();
-
-                        double w1 = upper->getSize().x;
-                        double w2 = lower->getSize().x;
-
-                        if (w1>w2) {
-                            letterPos += Vector(w1, 0.0);
-                        } else {
-                            letterPos += Vector(w2, 0.0);
-                        }
-                        letterPos += letterSpace;
-                    }
-                    break;
-
-                default:
-                    break;
-                }
-            }
-            break;
-
-        default: {
-                // One Letter:
-                if (font->findLetter(QString(data.text.at(i))) != NULL) {
-
-                                       RS_DEBUG->print("RS_Text::update: insert a "
-                                         "letter at pos: %f/%f", letterPos.x, letterPos.y);
-
-                    RS_InsertData d(QString(data.text.at(i)),
-                                    letterPos,
-                                    Vector(1.0, 1.0),
-                                    0.0,
-                                    1,1, Vector(0.0,0.0),
-                                    font->getLetterList(), RS2::NoUpdate);
-
-                    RS_Insert* letter = new RS_Insert(this, d);
-                    Vector letterWidth;
-                    letter->setPen(RS_Pen(RS2::FlagInvalid));
-                    letter->setLayer(NULL);
-                    letter->update();
-                    letter->forcedCalculateBorders();
-
-                                       // until 2.0.4.5:
-                    //letterWidth = Vector(letter->getSize().x, 0.0);
-                                       // from 2.0.4.6:
-                    letterWidth = Vector(letter->getMax().x-letterPos.x, 0.0);
-
-                    oneLine->addEntity(letter);
-
-                    // next letter position:
-                    letterPos += letterWidth;
-                    letterPos += letterSpace;
-                }
-            }
-            break;
-        }
-    }
-
-    updateAddLine(oneLine, lineCounter);
-    usedTextHeight -= data.height*data.lineSpacingFactor*1.6
-                      - data.height;
-    forcedCalculateBorders();
-
-    RS_DEBUG->print("RS_Text::update: OK");
+       RS_DEBUG->print("RS_Text::update");
+
+       clear();
+
+       if (isUndone())
+               return;
+
+       usedTextWidth = 0.0;
+       usedTextHeight = 0.0;
+
+       RS_Font * font = RS_FONTLIST->requestFont(data.style);
+
+       if (font == NULL)
+               return;
+
+       Vector letterPos = Vector(0.0, -9.0);
+       Vector letterSpace = Vector(font->getLetterSpacing(), 0.0);
+       Vector space = Vector(font->getWordSpacing(), 0.0);
+       int lineCounter = 0;
+
+       // Every single text line gets stored in this entity container
+       //  so we can move the whole line around easely:
+       RS_EntityContainer * oneLine = new RS_EntityContainer(this);
+
+       // First every text line is created with
+       //   alignement: top left
+       //   angle: 0
+       //   height: 9.0
+       // Rotation, scaling and centering is done later
+
+       // For every letter:
+       for(int i=0; i<(int)data.text.length(); ++i)
+       {
+               switch (data.text.at(i).unicode())
+               {
+               case 0x0A:
+                       // line feed:
+                       updateAddLine(oneLine, lineCounter++);
+                       oneLine = new RS_EntityContainer(this);
+                       letterPos = Vector(0.0, -9.0);
+                       break;
+
+               case 0x20:
+                       // Space:
+                       letterPos += space;
+                       break;
+
+               case 0x5C:
+               {
+                       // code (e.g. \S, \P, ..)
+                       i++;
+                       int ch = data.text.at(i).unicode();
+
+                       switch (ch)
+                       {
+                       case 'P':
+                               updateAddLine(oneLine, lineCounter++);
+                               oneLine = new RS_EntityContainer(this);
+                               letterPos = Vector(0.0, -9.0);
+                               break;
+
+                       case 'S':
+                       {
+                               QString up;
+                               QString dw;
+                               //letterPos += letterSpace;
+
+                               // get upper string:
+                               i++;
+                               while (data.text.at(i).unicode() != '^'
+                                       && data.text.at(i).unicode() != '\\'
+                                       && i < (int)data.text.length())
+                               {
+                                       up += data.text.at(i);
+                                       i++;
+                               }
+
+                               i++;
+
+                               if (data.text.at(i - 1).unicode() == '^'
+                                       && data.text.at(i).unicode() == ' ')
+                               {
+                                       i++;
+                               }
+
+                               // get lower string:
+                               while (data.text.at(i).unicode() != ';' && i < (int)data.text.length())
+                               {
+                                       dw += data.text.at(i);
+                                       i++;
+                               }
+
+                               // add texts:
+                               RS_Text * upper = new RS_Text(oneLine,
+                                       RS_TextData(letterPos + Vector(0.0, 9.0),
+                                               4.0, 100.0, RS2::VAlignTop,
+                                               RS2::HAlignLeft,
+                                               RS2::LeftToRight, RS2::Exact,
+                                               1.0, up, data.style,
+                                               0.0, RS2::Update));
+                               upper->setLayer(NULL);
+                               upper->setPen(RS_Pen(RS2::FlagInvalid));
+                               oneLine->addEntity(upper);
+
+                               RS_Text * lower = new RS_Text(oneLine,
+                                       RS_TextData(letterPos+Vector(0.0, 4.0),
+                                               4.0, 100.0, RS2::VAlignTop,
+                                               RS2::HAlignLeft,
+                                               RS2::LeftToRight, RS2::Exact,
+                                               1.0, dw, data.style,
+                                               0.0, RS2::Update));
+                               lower->setLayer(NULL);
+                               lower->setPen(RS_Pen(RS2::FlagInvalid));
+                               oneLine->addEntity(lower);
+
+                               // move cursor:
+                               upper->calculateBorders();
+                               lower->calculateBorders();
+
+                               double w1 = upper->getSize().x;
+                               double w2 = lower->getSize().x;
+
+                               if (w1 > w2)
+                                       letterPos += Vector(w1, 0.0);
+                               else
+                                       letterPos += Vector(w2, 0.0);
+
+                               letterPos += letterSpace;
+                       }
+                               break;
+
+                       default:
+                               break;
+                       }
+               }
+                       break;
+
+               default:
+               {
+                       // One Letter:
+                       if (font->findLetter(QString(data.text.at(i))) != NULL)
+                       {
+                               RS_DEBUG->print("RS_Text::update: insert a "
+                               "letter at pos: %f/%f", letterPos.x, letterPos.y);
+
+                               RS_InsertData d(QString(data.text.at(i)), letterPos, Vector(1.0, 1.0),
+                                       0.0, 1,1, Vector(0.0, 0.0), font->getLetterList(), RS2::NoUpdate);
+
+                               RS_Insert * letter = new RS_Insert(this, d);
+                               letter->setPen(RS_Pen(RS2::FlagInvalid));
+                               letter->setLayer(NULL);
+                               letter->update();
+                               letter->forcedCalculateBorders();
+
+                               // until 2.0.4.5:
+                               //letterWidth = Vector(letter->getSize().x, 0.0);
+                               // from 2.0.4.6:
+                               Vector letterWidth = Vector(letter->getMax().x - letterPos.x, 0.0);
+
+                               oneLine->addEntity(letter);
+
+                               // next letter position:
+                               letterPos += letterWidth;
+                               letterPos += letterSpace;
+                       }
+               }
+                       break;
+               }
+       }
+
+       updateAddLine(oneLine, lineCounter);
+       usedTextHeight -= data.height * data.lineSpacingFactor * 1.6 - data.height;
+       forcedCalculateBorders();
+
+       RS_DEBUG->print("RS_Text::update: OK");
 }
 
 /**
@@ -268,75 +265,73 @@ void RS_Text::update()
  */
 void RS_Text::updateAddLine(RS_EntityContainer* textLine, int lineCounter)
 {
-    RS_DEBUG->print("RS_Text::updateAddLine: width: %f", textLine->getSize().x);
+       RS_DEBUG->print("RS_Text::updateAddLine: width: %f", textLine->getSize().x);
 
        //textLine->forcedCalculateBorders();
-    //RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textLine->getSize().x);
+       //RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textLine->getSize().x);
 
-    // Move to correct line position:
-    textLine->move(Vector(0.0, -9.0 * lineCounter
-                             * data.lineSpacingFactor * 1.6));
+       // Move to correct line position:
+       textLine->move(Vector(0.0, -9.0 * lineCounter * data.lineSpacingFactor * 1.6));
 
        textLine->forcedCalculateBorders();
        Vector textSize = textLine->getSize();
 
        RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textSize.x);
 
-    // Horizontal Align:
-    switch (data.halign) {
-    case RS2::HAlignCenter:
-               RS_DEBUG->print("RS_Text::updateAddLine: move by: %f", -textSize.x/2.0);
-        textLine->move(Vector(-textSize.x/2.0, 0.0));
-        break;
+       // Horizontal Align:
+       switch (data.halign)
+       {
+       case RS2::HAlignCenter:
+               RS_DEBUG->print("RS_Text::updateAddLine: move by: %f", -textSize.x / 2.0);
+               textLine->move(Vector(-textSize.x / 2.0, 0.0));
+               break;
 
-    case RS2::HAlignRight:
-        textLine->move(Vector(-textSize.x, 0.0));
-        break;
+       case RS2::HAlignRight:
+               textLine->move(Vector(-textSize.x, 0.0));
+               break;
 
-    default:
-        break;
-    }
+       default:
+               break;
+       }
 
-    // Vertical Align:
-    double vSize = getNumberOfLines()*9.0*data.lineSpacingFactor*1.6
-                   - (9.0*data.lineSpacingFactor*1.6 - 9.0);
+       // Vertical Align:
+       double vSize = getNumberOfLines() * 9.0 * data.lineSpacingFactor * 1.6 - (9.0 * data.lineSpacingFactor * 1.6 - 9.0);
 
-    switch (data.valign) {
-    case RS2::VAlignMiddle:
-        textLine->move(Vector(0.0, vSize/2.0));
-        break;
+       switch (data.valign)
+       {
+       case RS2::VAlignMiddle:
+               textLine->move(Vector(0.0, vSize / 2.0));
+               break;
 
-    case RS2::VAlignBottom:
-        textLine->move(Vector(0.0, vSize));
-        break;
+       case RS2::VAlignBottom:
+               textLine->move(Vector(0.0, vSize));
+               break;
 
-    default:
-        break;
-    }
+       default:
+               break;
+       }
 
-    // Scale:
-    textLine->scale(Vector(0.0,0.0),
-                    Vector(data.height/9.0, data.height/9.0));
+       // Scale:
+       textLine->scale(Vector(0.0, 0.0), Vector(data.height / 9.0, data.height / 9.0));
 
-    textLine->forcedCalculateBorders();
+       textLine->forcedCalculateBorders();
 
-    // Update actual text size (before rotating, after scaling!):
-    if (textLine->getSize().x>usedTextWidth) {
-        usedTextWidth = textLine->getSize().x;
-    }
+       // Update actual text size (before rotating, after scaling!):
+       if (textLine->getSize().x > usedTextWidth)
+               usedTextWidth = textLine->getSize().x;
 
-    usedTextHeight += data.height*data.lineSpacingFactor*1.6;
+       usedTextHeight += data.height * data.lineSpacingFactor * 1.6;
 
-    // Rotate:
-    textLine->rotate(Vector(0.0,0.0), data.angle);
+       // Rotate:
+       textLine->rotate(Vector(0.0, 0.0), data.angle);
 
-    // Move:
-    textLine->move(data.insertionPoint);
-    textLine->setPen(RS_Pen(RS2::FlagInvalid));
-    textLine->setLayer(NULL);
-    textLine->forcedCalculateBorders();
+       // Move:
+       textLine->move(data.insertionPoint);
+       textLine->setPen(RS_Pen(RS2::FlagInvalid));
+       textLine->setLayer(NULL);
+       textLine->forcedCalculateBorders();
 
-    addEntity(textLine);
+       addEntity(textLine);
 }
 
 Vector RS_Text::getInsertionPoint()
@@ -577,84 +572,86 @@ Vector RS_Text::getNearestRef(const Vector & coord, double * dist)
 
 void RS_Text::move(Vector offset)
 {
-    data.insertionPoint.move(offset);
-    update();
+       data.insertionPoint.move(offset);
+       update();
 }
 
 void RS_Text::rotate(Vector center, double angle)
 {
-    data.insertionPoint.rotate(center, angle);
-    data.angle = RS_Math::correctAngle(data.angle+angle);
-    update();
+       data.insertionPoint.rotate(center, angle);
+       data.angle = RS_Math::correctAngle(data.angle + angle);
+       update();
 }
 
 void RS_Text::scale(Vector center, Vector factor)
 {
-    data.insertionPoint.scale(center, factor);
-    data.width*=factor.x;
-    data.height*=factor.x;
-    update();
+       data.insertionPoint.scale(center, factor);
+       data.width *= factor.x;
+       data.height *= factor.x;
+       update();
 }
 
 void RS_Text::mirror(Vector axisPoint1, Vector axisPoint2)
 {
-    data.insertionPoint.mirror(axisPoint1, axisPoint2);
-    //double ang = axisPoint1.angleTo(axisPoint2);
-    bool readable = RS_Math::isAngleReadable(data.angle);
-
-    Vector vec;
-    vec.setPolar(1.0, data.angle);
-    vec.mirror(Vector(0.0,0.0), axisPoint2-axisPoint1);
-    data.angle = vec.angle();
-
-    bool corr;
-    data.angle = RS_Math::makeAngleReadable(data.angle, readable, &corr);
-
-    if (corr) {
-        if (data.halign==RS2::HAlignLeft) {
-            data.halign=RS2::HAlignRight;
-        } else if (data.halign==RS2::HAlignRight) {
-            data.halign=RS2::HAlignLeft;
-        }
-    } else {
-        if (data.valign==RS2::VAlignTop) {
-            data.valign=RS2::VAlignBottom;
-        } else if (data.valign==RS2::VAlignBottom) {
-            data.valign=RS2::VAlignTop;
-        }
-    }
-    update();
+       data.insertionPoint.mirror(axisPoint1, axisPoint2);
+       //double ang = axisPoint1.angleTo(axisPoint2);
+       bool readable = RS_Math::isAngleReadable(data.angle);
+
+       Vector vec;
+       vec.setPolar(1.0, data.angle);
+       vec.mirror(Vector(0.0, 0.0), axisPoint2 - axisPoint1);
+       data.angle = vec.angle();
+
+       bool corr;
+       data.angle = RS_Math::makeAngleReadable(data.angle, readable, &corr);
+
+       if (corr)
+       {
+               if (data.halign == RS2::HAlignLeft)
+               {
+                       data.halign = RS2::HAlignRight;
+               }
+               else if (data.halign == RS2::HAlignRight)
+               {
+                       data.halign = RS2::HAlignLeft;
+               }
+       }
+       else
+       {
+               if (data.valign == RS2::VAlignTop)
+               {
+                       data.valign = RS2::VAlignBottom;
+               }
+               else if (data.valign == RS2::VAlignBottom)
+               {
+                       data.valign = RS2::VAlignTop;
+               }
+       }
+
+       update();
 }
 
 bool RS_Text::hasEndpointsWithinWindow(Vector /*v1*/, Vector /*v2*/)
 {
-    return false;
+       return false;
 }
 
-
-
 /**
  * Implementations must stretch the given range of the entity
  * by the given offset.
  */
-void RS_Text::stretch(Vector firstCorner,
-                      Vector secondCorner,
-                      Vector offset) {
-
-    if (getMin().isInWindow(firstCorner, secondCorner) &&
-            getMax().isInWindow(firstCorner, secondCorner)) {
-
-        move(offset);
-    }
+void RS_Text::stretch(Vector firstCorner, Vector secondCorner, Vector offset)
+{
+       if (getMin().isInWindow(firstCorner, secondCorner)
+               && getMax().isInWindow(firstCorner, secondCorner))
+               move(offset);
 }
 
-
-
 /**
  * Dumps the point's data to stdout.
  */
-std::ostream& operator << (std::ostream& os, const RS_Text& p) {
-    os << " Text: " << p.getData() << "\n";
-    return os;
+std::ostream & operator<<(std::ostream & os, const RS_Text & p)
+{
+       os << " Text: " << p.getData() << "\n";
+       return os;
 }
-