summaryrefslogtreecommitdiff
path: root/include/eda_text.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/eda_text.h')
-rw-r--r--include/eda_text.h331
1 files changed, 331 insertions, 0 deletions
diff --git a/include/eda_text.h b/include/eda_text.h
new file mode 100644
index 0000000..cd14c46
--- /dev/null
+++ b/include/eda_text.h
@@ -0,0 +1,331 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2013 Jean-Pierre Charras, jpe.charras at wanadoo.fr
+ * Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * @file eda_text.h
+ * @brief Definition of base KiCad text object.
+ */
+
+#ifndef EDA_TEXT_H_
+#define EDA_TEXT_H_
+
+#include <trigo.h> // NORMALIZE_ANGLE_POS( angle );
+#include <common.h> // wxStringSplit
+#include <gr_basic.h> // EDA_DRAW_MODE_T
+#include <base_struct.h> // EDA_RECT
+
+
+// Graphic Text justify:
+// Values -1,0,1 are used in computations, do not change them
+enum EDA_TEXT_HJUSTIFY_T {
+ GR_TEXT_HJUSTIFY_LEFT = -1,
+ GR_TEXT_HJUSTIFY_CENTER = 0,
+ GR_TEXT_HJUSTIFY_RIGHT = 1
+};
+
+
+enum EDA_TEXT_VJUSTIFY_T {
+ GR_TEXT_VJUSTIFY_TOP = -1,
+ GR_TEXT_VJUSTIFY_CENTER = 0,
+ GR_TEXT_VJUSTIFY_BOTTOM = 1
+};
+
+
+/* Options to draw items with thickness ( segments, arcs, circles, texts...) */
+enum EDA_DRAW_MODE_T {
+ FILLED = true, // normal mode: solid segments
+ SKETCH = false // sketch mode: draw segments outlines only
+};
+
+
+/** This is the "default-of-the-default" hardcoded text size; individual
+ * application define their own default policy starting with this
+ * (usually with a user option or project). DO NOT change this value if
+ * you do not fully realize the effect it has on sexp serialization
+ * (text size equal to this is not explicitly wrote, so it would change
+ * subsequent reads) */
+#define DEFAULT_SIZE_TEXT 60 // default text height (in mils, i.e. 1/1000")
+#define TEXT_NO_VISIBLE 1 //< EDA_TEXT::m_Attribut(e?) visibility flag.
+#define DIM_ANCRE_TEXTE 2 // Anchor size for text
+
+
+/**
+ * Class EDA_TEXT
+ * is a basic class to handle texts (labels, texts on components or footprints
+ * ..) not used directly. The "used" text classes are derived from EDA_ITEM and
+ * EDA_TEXT using multiple inheritance.
+ */
+class EDA_TEXT
+{
+protected:
+ wxString m_Text; ///< The 'base' text, maybe later processed for display
+ int m_Thickness; ///< pen size used to draw this text
+ double m_Orient; ///< Orient in 0.1 degrees
+ wxPoint m_Pos; ///< XY position of anchor text.
+ wxSize m_Size; ///< XY size of text
+ bool m_Mirror; ///< true if mirrored
+ int m_Attributs; ///< bit flags such as visible, etc.
+ bool m_Italic; ///< should be italic font (if available)
+ bool m_Bold; ///< should be bold font (if available)
+ EDA_TEXT_HJUSTIFY_T m_HJustify; ///< horizontal justification
+ EDA_TEXT_VJUSTIFY_T m_VJustify; ///< vertical justification
+ bool m_MultilineAllowed; /**< true to use multiline option, false
+ * to use only single line text
+ * Single line is faster in
+ * calculations than multiline */
+
+public:
+ EDA_TEXT( const wxString& text = wxEmptyString );
+ EDA_TEXT( const EDA_TEXT& aText );
+ virtual ~EDA_TEXT();
+
+ /**
+ * Function GetText
+ * returns the string associated with the text object.
+ *
+ * @return a const wxString reference containing the string of the item.
+ */
+ const wxString& GetText() const { return m_Text; }
+
+ /**
+ * Returns the string actually shown after processing of the base
+ * text. Default is no processing */
+ virtual wxString GetShownText() const { return m_Text; }
+
+ /**
+ * Returns a shortened version (max 15 characters) of the shown text */
+ wxString ShortenedShownText() const;
+
+ virtual void SetText( const wxString& aText ) { m_Text = aText; }
+
+ /**
+ * Function SetThickness
+ * sets text thickness.
+ * @param aNewThickness is the new text thickness.
+ */
+ void SetThickness( int aNewThickness ) { m_Thickness = aNewThickness; };
+
+ /**
+ * Function GetThickness
+ * returns text thickness.
+ * @return int - text thickness.
+ */
+ int GetThickness() const { return m_Thickness; };
+
+ void SetOrientation( double aOrientation )
+ {
+ NORMALIZE_ANGLE_POS( aOrientation );
+ m_Orient = aOrientation;
+ }
+ double GetOrientation() const { return m_Orient; }
+
+ void SetItalic( bool isItalic ) { m_Italic = isItalic; }
+ bool IsItalic() const { return m_Italic; }
+
+ void SetBold( bool aBold ) { m_Bold = aBold; }
+ bool IsBold() const { return m_Bold; }
+
+ void SetVisible( bool aVisible )
+ {
+ ( aVisible ) ? m_Attributs &= ~TEXT_NO_VISIBLE : m_Attributs |= TEXT_NO_VISIBLE;
+ }
+ bool IsVisible() const { return !( m_Attributs & TEXT_NO_VISIBLE ); }
+
+ void SetMirrored( bool isMirrored ) { m_Mirror = isMirrored; }
+ bool IsMirrored() const { return m_Mirror; }
+
+ void SetAttributes( int aAttributes ) { m_Attributs = aAttributes; }
+ int GetAttributes() const { return m_Attributs; }
+
+ bool IsDefaultFormatting() const;
+
+ /**
+ * Function SetSize
+ * sets text size.
+ * @param aNewSize is the new text size.
+ */
+ void SetSize( const wxSize& aNewSize ) { m_Size = aNewSize; };
+
+ /**
+ * Function GetSize
+ * returns text size.
+ * @return wxSize - text size.
+ */
+ const wxSize& GetSize() const { return m_Size; };
+
+ void SetWidth( int aWidth ) { m_Size.x = aWidth; }
+ int GetWidth() const { return m_Size.x; }
+
+ void SetHeight( int aHeight ) { m_Size.y = aHeight; }
+ int GetHeight() const { return m_Size.y; }
+
+ /// named differently than the ones using multiple inheritance and including this class
+ void SetTextPosition( const wxPoint& aPoint ) { m_Pos = aPoint; }
+ const wxPoint& GetTextPosition() const { return m_Pos; }
+
+ void SetMultilineAllowed( bool aAllow ) { m_MultilineAllowed = aAllow; }
+ bool IsMultilineAllowed() const { return m_MultilineAllowed; }
+
+ void Offset( const wxPoint& aOffset ) { m_Pos += aOffset; }
+
+ void Empty() { m_Text.Empty(); }
+
+ /**
+ * Function Draw
+ * @param aClipBox = the clipping rect, or NULL if no clipping
+ * @param aDC = the current Device Context
+ * @param aOffset = draw offset (usually (0,0))
+ * @param aColor = text color
+ * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode.
+ * @param aDisplay_mode = FILLED or SKETCH
+ * @param aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ).
+ */
+ void Draw( EDA_RECT* aClipBox, wxDC* aDC,
+ const wxPoint& aOffset, EDA_COLOR_T aColor,
+ GR_DRAWMODE aDrawMode, EDA_DRAW_MODE_T aDisplay_mode = FILLED,
+ EDA_COLOR_T aAnchor_color = EDA_COLOR_T(UNSPECIFIED_COLOR) );
+
+ /**
+ * Convert the text shape to a list of segment
+ * each segment is stored as 2 wxPoints: the starting point and the ending point
+ * there are therefore 2*n points
+ * @param aCornerBuffer = a buffer to store the polygon
+ */
+ void TransformTextShapeToSegmentList( std::vector<wxPoint>& aCornerBuffer ) const;
+
+ /**
+ * Function TextHitTest
+ * Test if \a aPoint is within the bounds of this object.
+ * @param aPoint- A wxPoint to test
+ * @param aAccuracy - Amount to inflate the bounding box.
+ * @return bool - true if a hit, else false
+ */
+ bool TextHitTest( const wxPoint& aPoint, int aAccuracy = 0 ) const;
+
+ /**
+ * Function TextHitTest (overloaded)
+ * Tests if object bounding box is contained within or intersects \a aRect.
+ *
+ * @param aRect - Rect to test against.
+ * @param aContains - Test for containment instead of intersection if true.
+ * @param aAccuracy - Amount to inflate the bounding box.
+ * @return bool - true if a hit, else false
+ */
+ bool TextHitTest( const EDA_RECT& aRect, bool aContains = false, int aAccuracy = 0 ) const;
+
+ /**
+ * Function LenSize
+ * @return the text length in internal units
+ * @param aLine : the line of text to consider.
+ * For single line text, this parameter is always m_Text
+ */
+ int LenSize( const wxString& aLine ) const;
+
+ /**
+ * Function GetTextBox
+ * useful in multiline texts to calculate the full text or a line area (for
+ * zones filling, locate functions....)
+ * @return the rect containing the line of text (i.e. the position and the
+ * size of one line)
+ * this rectangle is calculated for 0 orient text.
+ * If orientation is not 0 the rect must be rotated to match the
+ * physical area
+ * @param aLine The line of text to consider.
+ * for single line text, aLine is unused
+ * If aLine == -1, the full area (considering all lines) is returned
+ * @param aThickness Overrides the current thickness when greater than 0.
+ * this is needed when the current m_Thickness is 0 and a default line thickness
+ * is used
+ * @param aInvertY Invert the Y axis when calculating bounding box.
+ */
+ EDA_RECT GetTextBox( int aLine = -1, int aThickness = -1, bool aInvertY = false ) const;
+
+ /**
+ * Function GetInterline
+ * return the distance between 2 text lines
+ * has meaning only for multiline texts
+ * @param aTextThickness Overrides the current thickness when greater than 0.
+ * this is needed when the current m_Thickness is 0 and a default line thickness
+ * is used
+ */
+ int GetInterline( int aTextThickness = -1 ) const;
+
+ /**
+ * Function GetTextStyleName
+ * @return a wxString with the style name( Normal, Italic, Bold, Bold+Italic)
+ */
+ wxString GetTextStyleName();
+
+ EDA_TEXT_HJUSTIFY_T GetHorizJustify() const { return m_HJustify; };
+ EDA_TEXT_VJUSTIFY_T GetVertJustify() const { return m_VJustify; };
+
+ void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType ) { m_HJustify = aType; };
+ void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType ) { m_VJustify = aType; };
+
+ /**
+ * Function GetPositionsOfLinesOfMultilineText
+ * Populates aPositions with the position of each line of
+ * a multiline text, according to the vertical justification and the
+ * rotation of the whole text
+ * @param aPositions is the list to populate by the wxPoint positions
+ * @param aLineCount is the number of lines (not recalculated here
+ * for efficiency reasons
+ */
+ void GetPositionsOfLinesOfMultilineText(
+ std::vector<wxPoint>& aPositions, int aLineCount ) const;
+ /**
+ * Function Format
+ * outputs the object to \a aFormatter in s-expression form.
+ *
+ * @param aFormatter The #OUTPUTFORMATTER object to write to.
+ * @param aNestLevel The indentation next level.
+ * @param aControlBits The control bit definition for object specific formatting.
+ * @throw IO_ERROR on write error.
+ */
+ virtual void Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const
+ throw( IO_ERROR );
+
+private:
+
+ /**
+ * Function drawOneLineOfText
+ * Draw a single text line.
+ * Used to draw each line of this EDA_TEXT, that can be multiline
+ * @param aClipBox = the clipping rect, or NULL if no clipping
+ * @param aDC = the current Device Context
+ * @param aOffset = draw offset (usually (0,0))
+ * @param aColor = text color
+ * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode.
+ * @param aFillMode = FILLED or SKETCH
+ * @param aText = the single line of text to draw.
+ * @param aPos = the position of this line ).
+ */
+ void drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC,
+ const wxPoint& aOffset, EDA_COLOR_T aColor,
+ GR_DRAWMODE aDrawMode, EDA_DRAW_MODE_T aFillMode,
+ const wxString& aText, const wxPoint &aPos );
+};
+
+
+#endif // EDA_TEXT_H_