+
+wxString wxMacMLTEControl::GetLineText(long lineNo) const
+{
+ wxString line ;
+
+ if ( lineNo < GetNumberOfLines() )
+ {
+ long ypos = 0 ;
+
+ Fixed lineWidth,
+ lineHeight,
+ currentHeight = 0;
+
+ // get the first possible position in the control
+ Point firstPoint;
+ TXNOffsetToPoint(m_txn, 0, &firstPoint);
+
+ // Iterate through the lines until we reach the one we want,
+ // adding to our current y pixel point position
+ while (ypos < lineNo)
+ {
+ TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);
+ currentHeight += lineHeight;
+ }
+
+ Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };
+ TXNOffset theOffset;
+ TXNPointToOffset(m_txn, thePoint, &theOffset);
+
+ wxString content = GetStringValue() ;
+ Point currentPoint = thePoint;
+ while(thePoint.v == currentPoint.v && theOffset < content.length())
+ {
+ line += content[theOffset];
+ TXNOffsetToPoint(m_txn, ++theOffset, ¤tPoint);
+ }
+ }
+ return line ;
+}
+
+int wxMacMLTEControl::GetLineLength(long lineNo) const
+{
+ int theLength = 0;
+
+ if ( lineNo < GetNumberOfLines() )
+ {
+ long ypos = 0 ;
+
+ Fixed lineWidth,
+ lineHeight,
+ currentHeight = 0;
+
+ // get the first possible position in the control
+ Point firstPoint;
+ TXNOffsetToPoint(m_txn, 0, &firstPoint);
+
+ // Iterate through the lines until we reach the one we want,
+ // adding to our current y pixel point position
+ while (ypos < lineNo)
+ {
+ TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);
+ currentHeight += lineHeight;
+ }
+
+ Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };
+ TXNOffset theOffset;
+ TXNPointToOffset(m_txn, thePoint, &theOffset);
+
+ wxString content = GetStringValue() ;
+ Point currentPoint = thePoint;
+ while(thePoint.v == currentPoint.v && theOffset < content.length())
+ {
+ ++theLength;
+ TXNOffsetToPoint(m_txn, ++theOffset, ¤tPoint);
+ }
+ }
+ return theLength ;
+}
+
+
+// ----------------------------------------------------------------------------
+// MLTE control implementation (classic part)
+// ----------------------------------------------------------------------------
+
+// CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
+// the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
+// moment is to avoid setting the true focus on the control, the proper solution at the end would be to have
+// an alternate path for carbon key events that routes automatically into the same wx flow of events
+
+/* part codes */
+
+/* kmUPTextPart is the part code we return to indicate the user has clicked
+in the text area of our control */
+#define kmUPTextPart 1
+
+
+/* routines for using existing user pane controls.
+These routines are useful for cases where you would like to use an
+existing user pane control in, say, a dialog window as a scrolling
+text edit field.*/
+
+/* Utility Routines */
+
+/* kUserClickedToFocusPart is a part code we pass to the SetKeyboardFocus
+routine. In our focus switching routine this part code is understood
+as meaning 'the user has clicked in the control and we need to switch
+the current focus to ourselves before we can continue'. */
+#define kUserClickedToFocusPart 100
+
+/* STPTextPaneVars is a structure used for storing the the mUP Control's
+internal variables and state information. A handle to this record is
+stored in the pane control's reference value field using the
+SetControlReference routine. */
+
+class STPTextPaneVars {
+public :
+ /* OS records referenced */
+ TXNObject fTXNRec; /* the txn record */
+ TXNFrameID fTXNFrame; /* the txn frame ID */
+ ControlRef fUserPaneRec; /* handle to the user pane control */
+ WindowPtr fOwner; /* window containing control */
+ GrafPtr fDrawingEnvironment; /* grafport where control is drawn */
+ /* flags */
+ Boolean fInFocus; /* true while the focus rect is drawn around the control */
+ Boolean fIsActive; /* true while the control is drawn in the active state */
+ Boolean fTXNObjectActive; /* reflects the activation state of the text edit record */
+ Boolean fFocusDrawState; /* true if focus is drawn (default: true) */
+ /* calculated locations */
+ Rect fRBounds; /* control bounds */
+ Rect fRTextArea; /* area where the text is drawn */
+ Rect fRFocusOutline; /* rectangle used to draw the focus box */
+ Rect fRTextOutline; /* rectangle used to draw the border */
+ RgnHandle fRTextOutlineRegion; /* background region for the text, erased before calling TEUpdate */
+ /* our focus advance override routine */
+ EventHandlerUPP handlerUPP;
+ EventHandlerRef handlerRef;
+ bool fNoBorders ;
+ bool fMultiline ;
+ bool fVisible ;
+} ;
+
+/* Univerals Procedure Pointer variables used by the
+mUP Control. These variables are set up
+the first time that mUPOpenControl is called. */
+ControlUserPaneDrawUPP gTPDrawProc = NULL;
+ControlUserPaneHitTestUPP gTPHitProc = NULL;
+ControlUserPaneTrackingUPP gTPTrackProc = NULL;
+ControlUserPaneIdleUPP gTPIdleProc = NULL;
+ControlUserPaneKeyDownUPP gTPKeyProc = NULL;
+ControlUserPaneActivateUPP gTPActivateProc = NULL;
+ControlUserPaneFocusUPP gTPFocusProc = NULL;
+
+// one place for calculating all
+static void TPCalculateBounds(STPTextPaneVars *varsp, const Rect& bounds)
+{
+ SetRect(&varsp->fRBounds, bounds.left, bounds.top, bounds.right, bounds.bottom);
+ SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
+ // eventually make TextOutline inset 1,1
+ SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
+ if ( !varsp->fNoBorders )