]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/richedit/wxllist.h
Added the forgotten file txtstrm.tex
[wxWidgets.git] / samples / richedit / wxllist.h
index 5bc7fbae19ba4a3ca72de5bdb195bf8761fcc7dd..071f490dbfb628df61e279005b1e4d258f7ae9d2 100644 (file)
 
 #include   "kbList.h"
 
-#include   "wx/wx.h"
-#include   "wx/print.h"
-#include   "wx/printdlg.h"
-#include   "wx/generic/printps.h"
-#include   "wx/generic/prntdlgg.h"
-#include   "wx/dataobj.h"
+#include   <wx/wx.h>
+#include   <wx/print.h>
+#include   <wx/printdlg.h>
+#include   <wx/generic/printps.h>
+#include   <wx/generic/prntdlgg.h>
+#include   <wx/dataobj.h>
 
 // skip the following defines if embedded in M application
 #ifndef   M_BASEDIR
@@ -32,8 +32,8 @@
 
 // use the wxWindows caret class instead of home grown cursor whenever possible
 #ifdef __WXMSW__
-    #undef WXLAYOUT_USE_CARET
-    #define WXLAYOUT_USE_CARET 1
+#   undef WXLAYOUT_USE_CARET
+#   define WXLAYOUT_USE_CARET 1
 #endif // __WXMSW__
 
 // do not enable debug mode within Mahogany
@@ -203,6 +203,10 @@ public:
    */
    static wxLayoutObject *Read(wxString &istr);
    //@}
+
+   /// returns TRUE if the object is shown on the screen (i.e. not cmd object)
+   bool IsVisibleObject() const { return GetType() != WXLO_TYPE_CMD; }
+
 protected:
    /// optional data for application's use
    UserData *m_UserData;
@@ -214,7 +218,7 @@ KBLIST_DEFINE(wxLayoutObjectList, wxLayoutObject);
 /// An illegal iterator to save typing.
 #define NULLIT (wxLayoutObjectList::iterator(NULL))
 /// The iterator type.
-#define wxLOiterator   wxLayoutObjectList::iterator
+typedef wxLayoutObjectList::iterator wxLOiterator;
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
@@ -316,8 +320,7 @@ private:
    wxBitmap *m_Icon;
 };
 
-/** This structure holds all formatting information. Members which are
-    undefined (for a CmdObject this means: no change), are set to -1.
+/** This structure holds all formatting information.
 */
 struct wxLayoutStyleInfo
 {
@@ -328,11 +331,10 @@ struct wxLayoutStyleInfo
                      int iul = -1,
                      wxColour *fg = NULL,
                      wxColour *bg = NULL);
-   wxColour & GetBGColour()
-      {
-         return m_bg;
-      }
    wxLayoutStyleInfo & operator=(const wxLayoutStyleInfo &right);
+
+   wxColour & GetBGColour() { return m_bg; }
+
    /// Font change parameters.
    int  size, family, style, weight, underline;
    /// Colours
@@ -340,7 +342,7 @@ struct wxLayoutStyleInfo
    int m_fg_valid, m_bg_valid; // bool, but must be int!
 };
 
-
+/// a cached font
 class wxFontCacheEntry
 {
 public:
@@ -366,6 +368,8 @@ public:
       }
 private:
    wxFont *m_Font;
+
+   // VZ: I wonder why it doesn't use wxLayoutStyleInfo instead of those?
    int  m_Family, m_Size, m_Style, m_Weight;
    bool m_Underline;
 };
@@ -516,12 +520,14 @@ public:
    /** Finds the object which covers the screen position xpos in this
        line.
        @param dc the wxDC to use for calculations
+       @param llist the layout list to which this line belongs
        @param xpos the screen x coordinate
        @param offset where to store the difference between xpos and
        the object's head
        @return iterator to the object or NULLIT
    */
    wxLayoutObjectList::iterator FindObjectScreen(wxDC &dc,
+                                                 wxLayoutList *llist,
                                                  CoordType xpos,
                                                  CoordType *offset,
                                                  bool *found = NULL) const ;
@@ -537,11 +543,18 @@ public:
        functions to export the list.
        @return iterator to the first object
    */
-   wxLayoutObjectList::iterator GetFirstObject(void)
+   wxLayoutObjectList::iterator GetFirstObject(void) const
       {
          return m_ObjectList.begin();
       }
 
+   /** Get the last object in the list.
+    */
+   wxLayoutObjectList::iterator GetLastObject(void) const
+      {
+         return m_ObjectList.tail();
+      }
+
    /** Deletes this line, returns pointer to next line.
        @param update If true, update all following lines.
    */
@@ -576,6 +589,7 @@ public:
        @param llist th   e wxLayoutList
        @param cursorPos if not NULL, set cursor screen position in there
        @param cursorSize if not cursorPos != NULL, set cursor size in there
+       @param cursorStyle if non NULL where to store styleinfo for cursor pos
        @param cx if cursorPos != NULL, the cursor x position
        @param suppressStyleUpdate FALSe normally, only to suppress updating of m_StyleInfo
    */
@@ -583,6 +597,7 @@ public:
                wxLayoutList *llist,
                wxPoint *cursorPos = NULL,
                wxPoint *cursorSize = NULL,
+               wxLayoutStyleInfo *cursorStyle = NULL,
                int cx = 0,
                bool suppressStyleUpdate = FALSE);
    /** This function finds an object belonging to a given cursor
@@ -594,13 +609,14 @@ public:
        for that position
        @return pointer to the object
    */
-   wxLayoutObject * FindObjectScreen(wxDC &dc, CoordType xpos, bool
-                                     *found = NULL);
+   wxLayoutObject * FindObjectScreen(wxDC &dc,
+                                     CoordType xpos,
+                                     bool *found = NULL);
    /** This sets the style info for the beginning of this line.
        @param si styleinfo structure
     */
    void ApplyStyle(const wxLayoutStyleInfo &si)
-      {   m_StyleInfo = si; }
+      { m_StyleInfo = si; }
 
    //@}
 
@@ -779,9 +795,11 @@ public:
    bool MoveCursorHorizontally(int n);
    /** Move cursor to the left or right counting in words
        @param n = number of positions in words
+       @param untilNext: puts the cursor at the start of the next word if true,
+              leaves it at the end of the current one otherwise
        @return bool if it could be moved
    */
-   bool MoveCursorWord(int n);
+   bool MoveCursorWord(int n, bool untilNext = true);
 
    /// Move cursor to end of line.
    void MoveCursorToEndOfLine(void)
@@ -790,14 +808,24 @@ public:
          MoveCursorHorizontally(m_CursorLine->GetLength()-m_CursorPos.x);
       }
 
-   /// Move cursor to begin of line.
+   /// Move cursor to the start of line.
    void MoveCursorToBeginOfLine(void)
       { MoveCursorHorizontally(-m_CursorPos.x); }
 
+   /// get the number of lines in the list
+   size_t GetNumLines() const { return m_numLines; }
+
    /// Returns current cursor position.
    const wxPoint &GetCursorPos(wxDC &dc) const { return m_CursorPos; }
    const wxPoint &GetCursorPos() const { return m_CursorPos; }
 
+   /// move cursor to the end of text
+   void MoveCursorToEnd(void)
+   {
+      MoveCursorTo(wxPoint(0, GetNumLines() - 1));
+      MoveCursorToEndOfLine();
+   }
+
    //@}
 
    /**@name Editing functions.
@@ -904,7 +932,6 @@ public:
    inline void SetFontColour(wxColour *fg, wxColour *bg = NULL)
       { SetFont(-1,-1,-1,-1,-1,fg,bg); }
 
-
    /**
       Returns a pointer to the default settings.
       This is only valid temporarily and should not be stored
@@ -913,6 +940,28 @@ public:
    */
    wxLayoutStyleInfo &GetDefaultStyleInfo(void) { return m_DefaultStyleInfo ; }
    wxLayoutStyleInfo &GetStyleInfo(void) { return m_CurrentStyleInfo ; }
+   const wxLayoutStyleInfo &GetStyleInfo(void) const { return m_CurrentStyleInfo ; }
+   const wxLayoutStyleInfo &GetCursorStyleInfo(void) const { return m_CursorStyleInfo ; }
+
+   /// is the current font underlined?
+   bool IsFontUnderlined() const { return GetCursorStyleInfo().underline != 0; }
+   /// is the current font bold?
+   bool IsFontBold() const { return GetCursorStyleInfo().weight == wxBOLD; }
+   /// is the current font italic?
+   bool IsFontItalic() const { return GetCursorStyleInfo().style == wxITALIC; }
+
+   /// set underline if it was off, turn it off if it was on
+   void ToggleFontUnderline()
+      { SetFontUnderline(!IsFontUnderlined()); }
+
+   /// make font bold if it was normal or make it normal if it was bold
+   void ToggleFontWeight()
+      { SetFontWeight(IsFontBold() ? wxNORMAL : wxBOLD); }
+
+   /// make font italic if it was normal or make it normal if it was italic
+   void ToggleFontItalics()
+      { SetFontStyle(IsFontItalic() ? wxNORMAL : wxITALIC); }
+
    //@}
 
    /**@name Drawing */
@@ -932,8 +981,22 @@ public:
        @param dc the wxDC to draw on
        @param bottom optional y coordinate where to stop calculating
        @param forceAll force re-layout of all lines
+       @param cpos Can hold a cursorposition, and will be overwritten
+       with the corresponding DC position.
+       @param csize Will hold the cursor size relating to cpos.
    */
-   void Layout(wxDC &dc, CoordType bottom = -1, bool forceAll = false);
+   void Layout(wxDC &dc, CoordType bottom = -1, bool forceAll = false,
+               wxPoint *cpos = NULL,
+               wxPoint *csize = NULL);
+
+   /** Returns the screen coordinates relating to a given cursor
+       position and the size of the cursor at that position.
+       @param dc for which to calculate it
+       @param cpos Cursor position to look for.
+       @param csize If non-NULL, will be set to the cursor size.
+       @return The cursor position on the DC.
+   */
+   wxPoint GetScreenPos(wxDC &dc, const wxPoint &cpos, wxPoint *csize = NULL);
 
    /** Calculates new sizes for everything in the list, like Layout()
        but this is needed after the list got changed.
@@ -954,16 +1017,6 @@ public:
        @return cursor position in pixels
    */
    wxPoint GetCursorScreenPos(wxDC &dc);
-   /** Calculates the cursor position on the screen.
-       @param dc the dc to use for cursor position calculations
-       @param resetCursorMovedFlag: if true, reset "cursor moved" flag
-       @param translate optional translation of cursor coords on screen
-       
-   */
-   void UpdateCursorScreenPos(wxDC &dc,
-                              bool resetCursorMovedFlag = true,
-                              const wxPoint& translate = wxPoint(0,
-                                                                 0));
 
    /** Draws the cursor.
        @param active If true, draw a bold cursor to mark window as
@@ -1000,11 +1053,11 @@ public:
    /// adds the cursor position to the update rectangle
    void AddCursorPosToUpdateRect()
    {
-      #ifndef WXLAYOUT_USE_CARET
-         SetUpdateRect(m_CursorScreenPos);
-         SetUpdateRect(m_CursorScreenPos+m_CursorSize);
+#ifndef WXLAYOUT_USE_CARET
+      SetUpdateRect(m_CursorScreenPos);
+      SetUpdateRect(m_CursorScreenPos+m_CursorSize);
       //#else - the caret will take care of refreshing itself
-      #endif // !WXLAYOUT_USE_CARET
+#endif // !WXLAYOUT_USE_CARET
    }
    /// Invalidates the update rectangle.
    void InvalidateUpdateRect(void) { m_UpdateRectValid = false; }
@@ -1037,9 +1090,9 @@ public:
    /// Discard the current selection
    void DiscardSelection();
    /// Are we still selecting text?
-   bool IsSelecting(void);
+   bool IsSelecting(void) const;
    /// Is the given point (text coords) selected?
-   bool IsSelected(const wxPoint &cursor);
+   bool IsSelected(const wxPoint &cursor) const;
    /// Do we have a non null selection?
    bool HasSelection() const
       { return m_Selection.m_valid || m_Selection.m_selecting; }
@@ -1076,16 +1129,44 @@ public:
    void Debug(void);
 #endif
 
+   // for wxLayoutLine usage only
+   void IncNumLines() { m_numLines++; }
+   void DecNumLines() { m_numLines--; }
+
+   /// get the line by number
+   wxLayoutLine *GetLine(CoordType index) const
+   {
+       wxASSERT_MSG( (0 <= index) && (index < (CoordType)m_numLines),
+                     "invalid index" );
+
+       wxLayoutLine *line;
+       CoordType n = index;
+       for ( line = m_FirstLine; line && n-- > 0; line = line->GetNextLine() )
+           ;
+
+       if ( line )
+       {
+          // should be the right one
+          wxASSERT( line->GetLineNumber() == index );
+       }
+
+       return line;
+   }
+
 private:
    /// Clear the list.
    void InternalClear(void);
 
    /// The list of lines.
    wxLayoutLine *m_FirstLine;
+   /// The number of lines in the list (store instead recalculating for speed)
+   size_t m_numLines;
+
    /// The update rectangle which needs to be refreshed:
    wxRect  m_UpdateRect;
    /// Is the update rectangle valid?
    bool    m_UpdateRectValid;
+
    /**@name Cursor Management */
    //@{
    /// Where the text cursor (column,line) is.
@@ -1107,9 +1188,11 @@ private:
    /// selection.state and begin/end coordinates
    struct Selection
    {
-      Selection() { m_valid = false; m_selecting = false; }
+      Selection() { m_valid = m_selecting = m_discarded = false; }
+
       bool m_valid;
       bool m_selecting;
+      bool m_discarded; // may be TRUE only until the next redraw
 
       // returns true if we already have the screen coordinates of the
       // selection start and end
@@ -1130,6 +1213,8 @@ private:
    wxLayoutStyleInfo m_DefaultStyleInfo;
    /// the current setting:
    wxLayoutStyleInfo m_CurrentStyleInfo;
+   /// the current setting:
+   wxLayoutStyleInfo m_CursorStyleInfo;
    //@}
 };