summaryrefslogtreecommitdiff
path: root/include/base_struct.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/base_struct.h')
-rw-r--r--include/base_struct.h567
1 files changed, 567 insertions, 0 deletions
diff --git a/include/base_struct.h b/include/base_struct.h
new file mode 100644
index 0000000..e6238f3
--- /dev/null
+++ b/include/base_struct.h
@@ -0,0 +1,567 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2013-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 2008-2015 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
+ * Copyright (C) 2008-2015 Wayne Stambaugh <stambaughw@verizon.net>
+ * Copyright (C) 2004-2015 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 base_struct.h
+ * @brief Basic classes for most KiCad items.
+ */
+
+#ifndef BASE_STRUCT_H_
+#define BASE_STRUCT_H_
+
+#include <core/typeinfo.h>
+
+#include <colors.h>
+#include <bitmaps.h>
+#include <richio.h>
+#include <view/view_item.h>
+#include <class_eda_rect.h>
+
+#if defined(DEBUG)
+#include <iostream> // needed for Show()
+extern std::ostream& operator <<( std::ostream& out, const wxSize& size );
+
+extern std::ostream& operator <<( std::ostream& out, const wxPoint& pt );
+#endif
+
+
+/// Flag to enable find and replace tracing using the WXTRACE environment variable.
+extern const wxString traceFindReplace;
+
+
+/**
+ * Enum FILL_T
+ * is the set of fill types used in plotting or drawing enclosed areas.
+ */
+enum FILL_T {
+ NO_FILL, // Poly, Square, Circle, Arc = option No Fill
+ FILLED_SHAPE, /* Poly, Square, Circle, Arc = option Fill
+ * with current color ("Solid shape") */
+ FILLED_WITH_BG_BODYCOLOR /* Poly, Square, Circle, Arc = option Fill
+ * with background body color, translucent
+ * (texts inside this shape can be seen)
+ * not filled in B&W mode when plotting or
+ * printing */
+};
+
+
+enum SEARCH_RESULT {
+ SEARCH_QUIT,
+ SEARCH_CONTINUE
+};
+
+
+class wxFindReplaceData;
+class EDA_ITEM;
+class EDA_DRAW_FRAME;
+class EDA_RECT;
+class DHEAD;
+class MSG_PANEL_ITEM;
+
+
+/**
+ * Class INSPECTOR
+ * is an abstract class that is used to inspect and possibly collect the
+ * (search) results of Iterating over a list or tree of KICAD_T objects.
+ * Extend from this class and implement the Inspect function and provide for
+ * a way for the extension to collect the results of the search/scan data and
+ * provide them to the caller.
+ */
+class INSPECTOR
+{
+public:
+ virtual ~INSPECTOR()
+ {
+ }
+
+
+ /**
+ * Function Inspect
+ * is the examining function within the INSPECTOR which is passed to the
+ * EDA_ITEM::Iterate() function. It is used primarily for searching, but
+ * not limited to that. It can also collect or modify the scanned objects.
+ *
+ * @param aItem An EDA_ITEM to examine.
+ * @param aTestData is arbitrary data needed by the inspector to determine
+ * if the EDA_ITEM under test meets its match criteria.
+ * @return A #SEARCH_RESULT type #SEARCH_QUIT if the iterator function is to
+ * stop the scan, else #SEARCH_CONTINUE;
+ */
+ virtual SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData ) = 0;
+};
+
+
+// These define are used for the .m_Flags and .m_UndoRedoStatus member of the
+// class EDA_ITEM
+#define IS_CHANGED (1 << 0) ///< Item was edited, and modified
+#define IS_LINKED (1 << 1) ///< Used in calculation to mark linked items (temporary use)
+#define IN_EDIT (1 << 2) ///< Item currently edited
+#define IS_MOVED (1 << 3) ///< Item being moved
+#define IS_NEW (1 << 4) ///< New item, just created
+#define IS_RESIZED (1 << 5) ///< Item being resized
+#define IS_DRAGGED (1 << 6) ///< Item being dragged
+#define IS_DELETED (1 << 7)
+#define IS_WIRE_IMAGE (1 << 8) ///< Item to be drawn as wireframe while editing
+#define STARTPOINT (1 << 9)
+#define ENDPOINT (1 << 10)
+#define SELECTED (1 << 11)
+#define SELECTEDNODE (1 << 12) ///< flag indicating that the structure has already selected
+#define STRUCT_DELETED (1 << 13) ///< flag indication structures to be erased
+#define CANDIDATE (1 << 14) ///< flag indicating that the structure is connected
+#define SKIP_STRUCT (1 << 15) ///< flag indicating that the structure should be ignored
+#define DO_NOT_DRAW (1 << 16) ///< Used to disable draw function
+#define IS_CANCELLED (1 << 17) ///< flag set when edit dialogs are canceled when editing a
+ ///< new object
+#define TRACK_LOCKED (1 << 18) ///< Pcbnew: track locked: protected from global deletion
+#define TRACK_AR (1 << 19) ///< Pcbnew: autorouted track
+#define FLAG1 (1 << 20) ///< Pcbnew: flag used in local computations
+#define FLAG0 (1 << 21) ///< Pcbnew: flag used in local computations
+#define BEGIN_ONPAD (1 << 22) ///< Pcbnew: flag set for track segment starting on a pad
+#define END_ONPAD (1 << 23) ///< Pcbnew: flag set for track segment ending on a pad
+#define BUSY (1 << 24) ///< Pcbnew: flag indicating that the structure has
+ ///< already been edited, in some functions
+#define HIGHLIGHTED (1 << 25) ///< item is drawn in normal colors, when the rest is darkened
+#define BRIGHTENED (1 << 26) ///< item is drawn with a bright contour
+
+#define DP_COUPLED (1 << 27) ///< item is coupled with another item making a differential pair
+ ///< (applies to segments only)
+
+#define EDA_ITEM_ALL_FLAGS -1
+
+typedef unsigned STATUS_FLAGS;
+
+/**
+ * Class EDA_ITEM
+ * is a base class for most all the KiCad significant classes, used in
+ * schematics and boards.
+ */
+class EDA_ITEM : public KIGFX::VIEW_ITEM
+{
+private:
+
+ /**
+ * Run time identification, _keep private_ so it can never be changed after
+ * a constructor sets it. See comment near SetType() regarding virtual
+ * functions.
+ */
+ KICAD_T m_StructType;
+ STATUS_FLAGS m_Status;
+
+protected:
+ EDA_ITEM* Pnext; ///< next in linked list
+ EDA_ITEM* Pback; ///< previous in linked list
+ DHEAD* m_List; ///< which DLIST I am on.
+
+ EDA_ITEM* m_Parent; ///< Linked list: Link (parent struct)
+ time_t m_TimeStamp; ///< Time stamp used for logical links
+
+ /// Set to true to override the visibility setting of the item.
+ bool m_forceVisible;
+
+ /// Flag bits for editing and other uses.
+ STATUS_FLAGS m_Flags;
+
+ // Link to an copy of the item use to save the item's state for undo/redo feature.
+ EDA_ITEM* m_Image;
+
+private:
+
+ void initVars();
+
+protected:
+
+ EDA_ITEM( EDA_ITEM* parent, KICAD_T idType );
+ EDA_ITEM( KICAD_T idType );
+ EDA_ITEM( const EDA_ITEM& base );
+
+public:
+
+ virtual ~EDA_ITEM() { };
+
+ /**
+ * Function Type()
+ *
+ * returns the type of object. This attribute should never be changed
+ * after a constructor sets it, so there is no public "setter" method.
+ * @return KICAD_T - the type of object.
+ */
+ inline KICAD_T Type() const
+ {
+ return m_StructType;
+ }
+
+ void SetTimeStamp( time_t aNewTimeStamp ) { m_TimeStamp = aNewTimeStamp; }
+ time_t GetTimeStamp() const { return m_TimeStamp; }
+
+ EDA_ITEM* Next() const { return Pnext; }
+ EDA_ITEM* Back() const { return Pback; }
+ EDA_ITEM* GetParent() const { return m_Parent; }
+ DHEAD* GetList() const { return m_List; }
+
+ void SetNext( EDA_ITEM* aNext ) { Pnext = aNext; }
+ void SetBack( EDA_ITEM* aBack ) { Pback = aBack; }
+ void SetParent( EDA_ITEM* aParent ) { m_Parent = aParent; }
+ void SetList( DHEAD* aList ) { m_List = aList; }
+
+ inline bool IsNew() const { return m_Flags & IS_NEW; }
+ inline bool IsModified() const { return m_Flags & IS_CHANGED; }
+ inline bool IsMoving() const { return m_Flags & IS_MOVED; }
+ inline bool IsDragging() const { return m_Flags & IS_DRAGGED; }
+ inline bool IsWireImage() const { return m_Flags & IS_WIRE_IMAGE; }
+ inline bool IsSelected() const { return m_Flags & SELECTED; }
+ inline bool IsResized() const { return m_Flags & IS_RESIZED; }
+ inline bool IsHighlighted() const { return m_Flags & HIGHLIGHTED; }
+ inline bool IsBrightened() const { return m_Flags & BRIGHTENED; }
+
+ inline void SetWireImage() { SetFlags( IS_WIRE_IMAGE ); }
+ inline void SetSelected() { SetFlags( SELECTED ); ViewUpdate( COLOR ); }
+ inline void SetHighlighted() { SetFlags( HIGHLIGHTED ); ViewUpdate( COLOR ); }
+ inline void SetBrightened() { SetFlags( BRIGHTENED ); }
+
+ inline void ClearSelected() { ClearFlags( SELECTED ); ViewUpdate( COLOR ); }
+ inline void ClearHighlighted() { ClearFlags( HIGHLIGHTED ); ViewUpdate( COLOR ); }
+ inline void ClearBrightened() { ClearFlags( BRIGHTENED ); }
+
+ void SetModified();
+
+ int GetState( int type ) const
+ {
+ return m_Status & type;
+ }
+
+ void SetState( int type, int state )
+ {
+ if( state )
+ m_Status |= type; // state = ON or OFF
+ else
+ m_Status &= ~type;
+ }
+
+ STATUS_FLAGS GetStatus() const { return m_Status; }
+ void SetStatus( STATUS_FLAGS aStatus ) { m_Status = aStatus; }
+
+ void SetFlags( STATUS_FLAGS aMask ) { m_Flags |= aMask; }
+ void ClearFlags( STATUS_FLAGS aMask = EDA_ITEM_ALL_FLAGS ) { m_Flags &= ~aMask; }
+ STATUS_FLAGS GetFlags() const { return m_Flags; }
+
+ void SetImage( EDA_ITEM* aItem ) { m_Image = aItem; }
+
+ /**
+ * Function SetForceVisible
+ * is used to set and cleag force visible flag used to force the item to be drawn
+ * even if it's draw attribute is set to not visible.
+ *
+ * @param aEnable True forces the item to be drawn. False uses the item's visibility
+ * setting to determine if the item is to be drawn.
+ */
+ void SetForceVisible( bool aEnable ) { m_forceVisible = aEnable; }
+
+ /**
+ * Function GetMsgPanelInfo
+ * populates \a aList of #MSG_PANEL_ITEM objects with it's internal state for display
+ * purposes.
+ *
+ * @note This method replaces DisplayInfo() so that KiCad objects no longer have any
+ * knowledge of wxWidgets UI objects.
+ *
+ * @param aList is the list to populate.
+ */
+ virtual void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
+ {
+ }
+
+ /**
+ * Function HitTest
+ * tests if \a aPosition is contained within or on the bounding area of an item.
+ *
+ * @param aPosition A reference to a wxPoint object containing the coordinates to test.
+ * @return True if \a aPosition is within or on the item bounding area.
+ */
+ virtual bool HitTest( const wxPoint& aPosition ) const
+ {
+ return false; // derived classes should override this function
+ }
+
+
+ /**
+ * Function GetBoundingBox
+ * returns the orthogonal, bounding box of this object for display
+ * purposes.
+ * This box should be an enclosing perimeter for visible components of this
+ * object, and the units should be in the pcb or schematic coordinate
+ * system.
+ * It is OK to overestimate the size by a few counts.
+ */
+ virtual const EDA_RECT GetBoundingBox() const
+ {
+#if defined(DEBUG)
+ printf( "Missing GetBoundingBox()\n" );
+ Show( 0, std::cout ); // tell me which classes still need GetBoundingBox support
+#endif
+
+ // return a zero-sized box per default. derived classes should override
+ // this
+ return EDA_RECT( wxPoint( 0, 0 ), wxSize( 0, 0 ) );
+ }
+
+ /**
+ * Function Clone
+ * creates a duplicate of this item with linked list members set to NULL.
+ *
+ * The default version will return NULL in release builds and likely crash the
+ * program. In debug builds, a warning message indicating the derived class
+ * has not implemented cloning. This really should be a pure virtual function.
+ * Due to the fact that there are so many objects derived from EDA_ITEM, the
+ * decision was made to return NULL until all the objects derived from EDA_ITEM
+ * implement cloning. Once that happens, this function should be made pure.
+ *
+ * @return A clone of the item.
+ */
+ virtual EDA_ITEM* Clone() const; // should not be inline, to save the ~ 6 bytes per call site.
+
+ /**
+ * Function IterateForward
+ * walks through the object tree calling the inspector() on each object
+ * type requested in scanTypes.
+ *
+ * @param listStart The first in a list of EDA_ITEMs to iterate over.
+ * @param inspector Is an INSPECTOR to call on each object that is one of
+ * the requested scanTypes.
+ * @param testData Is an aid to testFunc, and should be sufficient to allow
+ * it to fully determine if an item meets the match criteria,
+ * but it may also be used to collect output.
+ * @param scanTypes A KICAD_T array that is EOT terminated, and provides both
+ * the order and interest level of of the types of objects to
+ * be iterated over.
+ * @return SEARCH_RESULT SEARCH_QUIT if the called INSPECTOR returned
+ * SEARCH_QUIT, else SCAN_CONTINUE;
+ */
+ static SEARCH_RESULT IterateForward( EDA_ITEM* listStart,
+ INSPECTOR* inspector,
+ const void* testData,
+ const KICAD_T scanTypes[] );
+
+ /**
+ * Function Visit
+ * may be re-implemented for each derived class in order to handle
+ * all the types given by its member data. Implementations should call
+ * inspector->Inspect() on types in scanTypes[], and may use
+ * IterateForward()
+ * to do so on lists of such data.
+ * @param inspector An INSPECTOR instance to use in the inspection.
+ * @param testData Arbitrary data used by the inspector.
+ * @param scanTypes Which KICAD_T types are of interest and the order
+ * is significant too, terminated by EOT.
+ * @return SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan,
+ * else SCAN_CONTINUE, and determined by the inspector.
+ */
+ virtual SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
+ const KICAD_T scanTypes[] );
+
+ /**
+ * Function GetClass
+ * returns the class name.
+ * @return wxString
+ */
+ virtual wxString GetClass() const = 0;
+
+ /**
+ * Function GetSelectMenuText
+ * returns the text to display to be used in the selection clarification context menu
+ * when multiple items are found at the current cursor position. The default version
+ * of this function raises an assertion in the debug mode and returns a string to
+ * indicate that it was not overridden to provide the object specific text.
+ *
+ * @return The menu text string.
+ */
+ virtual wxString GetSelectMenuText() const;
+
+ /**
+ * Function GetMenuImage
+ * returns a pointer to an image to be used in menus. The default version returns
+ * the right arrow image. Override this function to provide object specific menu
+ * images.
+ * @return The menu image associated with the item.
+ */
+ virtual BITMAP_DEF GetMenuImage() const { return right_xpm; }
+
+ /**
+ * Function Matches
+ * compares the item against the search criteria in \a aSearchData.
+ *
+ * The base class returns false since many of the objects derived from EDA_ITEM
+ * do not have any text to search.
+ *
+ * @param aSearchData A reference to a wxFindReplaceData object containing the
+ * search criteria.
+ * @param aAuxData A pointer to optional data required for the search or NULL
+ * if not used.
+ * @param aFindLocation A pointer to a wxPoint object to store the location of
+ * matched item. The pointer can be NULL if it is not used.
+ * @return True if the item's text matches the search criteria in \a aSearchData.
+ */
+ virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation )
+ {
+ return false;
+ }
+
+ /**
+ * Helper function used in search and replace dialog
+ * Function Replace
+ * performs a text replace on \a aText using the find and replace criteria in
+ * \a aSearchData on items that support text find and replace.
+ *
+ * @param aSearchData A reference to a wxFindReplaceData object containing the
+ * search and replace criteria.
+ * @param aText A reference to a wxString object containing the text to be
+ * replaced.
+ * @return True if \a aText was modified, otherwise false.
+ */
+ bool Replace( wxFindReplaceData& aSearchData, wxString& aText );
+
+ /**
+ * Function Replace
+ * performs a text replace using the find and replace criteria in \a aSearchData
+ * on items that support text find and replace.
+ *
+ * This function must be overridden for items that support text replace.
+ *
+ * @param aSearchData A reference to a wxFindReplaceData object containing the
+ * search and replace criteria.
+ * @param aAuxData A pointer to optional data required for the search or NULL
+ * if not used.
+ * @return True if the item text was modified, otherwise false.
+ */
+ virtual bool Replace( wxFindReplaceData& aSearchData, void* aAuxData = NULL ) { return false; }
+
+ /**
+ * Function IsReplaceable
+ * <p>
+ * Override this method in any derived object that supports test find and
+ * replace.
+ * </p>
+ *
+ * @return True if the item has replaceable text that can be modified using
+ * the find and replace dialog.
+ */
+ virtual bool IsReplaceable() const { return false; }
+
+ /**
+ * Test if another item is less than this object.
+ *
+ * @param aItem - Item to compare against.
+ * @return - True if \a aItem is less than the item.
+ */
+ bool operator<( const EDA_ITEM& aItem ) const;
+
+ /**
+ * Function Sort
+ * is a helper function to be used by the C++ STL sort algorithm for sorting a STL
+ * container of EDA_ITEM pointers.
+ *
+ * @param aLeft The left hand item to compare.
+ * @param aRight The right hand item to compare.
+ * @return True if \a aLeft is less than \a aRight.
+ */
+ static bool Sort( const EDA_ITEM* aLeft, const EDA_ITEM* aRight ) { return *aLeft < *aRight; }
+
+#if 0
+ /**
+ * Operator assignment
+ * is used to assign the members of \a aItem to another object.
+ *
+ * @warning This is still a work in progress and not ready for prime time. Do not use
+ * as there is a known issue with wxString buffers.
+ */
+ virtual EDA_ITEM& operator=( const EDA_ITEM& aItem );
+ #define USE_EDA_ITEM_OP_EQ
+#endif
+
+ /// @copydoc VIEW_ITEM::ViewBBox()
+ virtual const BOX2I ViewBBox() const;
+
+ /// @copydoc VIEW_ITEM::ViewGetLayers()
+ virtual void ViewGetLayers( int aLayers[], int& aCount ) const;
+
+#if defined(DEBUG)
+
+ /**
+ * Function Show
+ * is used to output the object tree, currently for debugging only.
+ * @param nestLevel An aid to prettier tree indenting, and is the level
+ * of nesting of this object within the overall tree.
+ * @param os The ostream& to output to.
+ */
+ virtual void Show( int nestLevel, std::ostream& os ) const = 0;
+ // pure virtual so compiler warns if somebody mucks up a derived declaration
+
+ void ShowDummy( std::ostream& os ) const; ///< call this if you are a lazy developer
+
+ /**
+ * Function NestedSpace
+ * outputs nested space for pretty indenting.
+ * @param nestLevel The nest count
+ * @param os The ostream&, where to output
+ * @return std::ostream& - for continuation.
+ **/
+ static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
+
+#endif
+
+protected:
+ /**
+ * Function Matches
+ * compares \a aText against search criteria in \a aSearchData.
+ * This is a helper function for simplify derived class logic.
+ *
+ * @param aText A reference to a wxString object containing the string to test.
+ * @param aSearchData The criteria to search against.
+ * @return True if \a aText matches the search criteria in \a aSearchData.
+ */
+ bool Matches( const wxString& aText, wxFindReplaceData& aSearchData );
+};
+
+
+/**
+ * Function new_clone
+ * provides cloning capabilities for all Boost pointer containers of EDA_ITEM pointers.
+ *
+ * @param aItem EDA_ITEM to clone.
+ * @return Clone of \a aItem.
+ */
+inline EDA_ITEM* new_clone( const EDA_ITEM& aItem ) { return aItem.Clone(); }
+
+
+/**
+ * Define list of drawing items for screens.
+ *
+ * The standard C++ container was chosen so the pointer can be removed from a list without
+ * it being destroyed.
+ */
+typedef std::vector< EDA_ITEM* > EDA_ITEMS;
+
+
+#endif // BASE_STRUCT_H_