/*********************************************************************** * FXRuby -- the Ruby language bindings for the FOX GUI toolkit. * Copyright (c) 2001-2009 by Lyle Johnson. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For further information please contact the author by e-mail * at "lyle@lylejohnson.name". ***********************************************************************/ /// Text widget options enum { TEXT_READONLY = 0x00100000, /// Text is NOT editable TEXT_WORDWRAP = 0x00200000, /// Wrap at word breaks TEXT_OVERSTRIKE = 0x00400000, /// Overstrike mode TEXT_FIXEDWRAP = 0x00800000, /// Fixed wrap columns TEXT_NO_TABS = 0x01000000, /// Insert spaces for tabs TEXT_AUTOINDENT = 0x02000000, /// Autoindent TEXT_SHOWACTIVE = 0x04000000, /// Show active line TEXT_AUTOSCROLL = 0x08000000 /// Logging mode, keeping last line visible }; /// Selection modes enum FXTextSelectionMode { SELECT_CHARS, SELECT_WORDS, SELECT_LINES }; /// Highlight style entry struct FXHiliteStyle { %extend { FXHiliteStyle(){ FXHiliteStyle *self = new FXHiliteStyle(); self->normalForeColor = 0; self->normalBackColor = 0; self->selectForeColor = 0; self->selectBackColor = 0; self->hiliteForeColor = 0; self->hiliteBackColor = 0; self->activeBackColor = 0; self->style = 0; return self; } } FXColor normalForeColor; /// Normal text foreground color FXColor normalBackColor; /// Normal text background color FXColor selectForeColor; /// Selected text foreground color FXColor selectBackColor; /// Selected text background color FXColor hiliteForeColor; /// Highlight text foreground color FXColor hiliteBackColor; /// Highlight text background color FXColor activeBackColor; /// Active text background color FXuint style; /// Highlight text style ~FXHiliteStyle(); }; /** * Text mutation callback data passed with the SEL_INSERTED, * SEL_REPLACED, and SEL_DELETED messages; both old and new * text is available on behalf of the undo system as well as * syntax highlighting. */ struct FXTextChange { FXint pos; /// Position in buffer FXint ndel; /// Number characters deleted at position FXint nins; /// Number characters inserted at position %extend { VALUE ins() const { return to_ruby(self->ins,self->nins); } VALUE del() const { return to_ruby(self->del,self->ndel); } } }; %rename("overstrike?") FXText::isOverstrike() const; %rename("overstrike=") FXText::setOverstrike(FXbool); %rename("numRows") FXText::getNumRows() const; /** * The text widget supports editing of multiple lines of text. * An optional style table can provide text coloring based on * the contents of an optional parallel style buffer, which is * maintained as text is edited. In a typical scenario, the * contents of the style buffer is either directly written when * the text is added to the widget, or is continually modified * by editing the text via syntax-based highlighting engine which * colors the text based on syntactical patterns. */ class FXText : public FXScrollArea { public: enum { STYLE_UNDERLINE = 0x0001, /// Underline text STYLE_STRIKEOUT = 0x0002, /// Strike out text STYLE_BOLD = 0x0004 /// Bold text }; public: long onPaint(FXObject*,FXSelector,void* PTR_EVENT); long onFocusIn(FXObject*,FXSelector,void* PTR_EVENT); long onFocusOut(FXObject*,FXSelector,void* PTR_EVENT); long onLeftBtnPress(FXObject*,FXSelector,void* PTR_EVENT); long onLeftBtnRelease(FXObject*,FXSelector,void* PTR_EVENT); long onMiddleBtnPress(FXObject*,FXSelector,void* PTR_EVENT); long onMiddleBtnRelease(FXObject*,FXSelector,void* PTR_EVENT); long onRightBtnPress(FXObject*,FXSelector,void* PTR_EVENT); long onRightBtnRelease(FXObject*,FXSelector,void* PTR_EVENT); long onUngrabbed(FXObject*,FXSelector,void* PTR_EVENT); long onMotion(FXObject*,FXSelector,void* PTR_EVENT); long onBeginDrag(FXObject*,FXSelector,void* PTR_EVENT); long onEndDrag(FXObject*,FXSelector,void* PTR_EVENT); long onDragged(FXObject*,FXSelector,void* PTR_EVENT); long onDNDEnter(FXObject*,FXSelector,void* PTR_EVENT); long onDNDLeave(FXObject*,FXSelector,void* PTR_EVENT); long onDNDMotion(FXObject*,FXSelector,void* PTR_EVENT); long onDNDDrop(FXObject*,FXSelector,void* PTR_EVENT); long onDNDRequest(FXObject*,FXSelector,void* PTR_EVENT); long onSelectionLost(FXObject*,FXSelector,void* PTR_EVENT); long onSelectionGained(FXObject*,FXSelector,void* PTR_EVENT); long onSelectionRequest(FXObject*,FXSelector,void* PTR_EVENT); long onClipboardLost(FXObject*,FXSelector,void* PTR_EVENT); long onClipboardGained(FXObject*,FXSelector,void* PTR_EVENT); long onClipboardRequest(FXObject*,FXSelector,void* PTR_EVENT); long onKeyPress(FXObject*,FXSelector,void* PTR_EVENT); long onKeyRelease(FXObject*,FXSelector,void* PTR_EVENT); long onBlink(FXObject*,FXSelector,void* PTR_IGNORE); long onFlash(FXObject*,FXSelector,void* PTR_IGNORE); long onAutoScroll(FXObject*,FXSelector,void* PTR_EVENT); long onQueryHelp(FXObject*,FXSelector,void* PTR_IGNORE); long onQueryTip(FXObject*,FXSelector,void* PTR_IGNORE); // Control commands long onCmdToggleEditable(FXObject*,FXSelector,void* PTR_IGNORE); long onUpdToggleEditable(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdToggleOverstrike(FXObject*,FXSelector,void* PTR_IGNORE); long onUpdToggleOverstrike(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorRow(FXObject*,FXSelector,void* PTR_IGNORE); long onUpdCursorRow(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorColumn(FXObject*,FXSelector,void* PTR_IGNORE); long onUpdCursorColumn(FXObject*,FXSelector,void* PTR_IGNORE); long onUpdHaveSelection(FXObject*,FXSelector,void* PTR_IGNORE); long onUpdSelectAll(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSetStringValue(FXObject*,FXSelector,void* PTR_STRING); long onCmdGetStringValue(FXObject*,FXSelector,void* PTR_NULL); // FIXME long onCmdSearch(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdReplace(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSearchNext(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSearchSel(FXObject*,FXSelector,void* PTR_IGNORE); // Cursor movement long onCmdCursorTop(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorBottom(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorHome(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorEnd(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorRight(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorLeft(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorUp(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorDown(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorWordLeft(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorWordRight(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorWordStart(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorWordEnd(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorPageDown(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorPageUp(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorScreenTop(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorScreenBottom(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorScreenCenter(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorParHome(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCursorParEnd(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdBlockBeg(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdBlockEnd(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdGotoMatching(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdGotoSelected(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdGotoLine(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdScrollUp(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdScrollDown(FXObject*,FXSelector,void* PTR_IGNORE); // Mark and extend long onCmdMark(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdExtend(FXObject*,FXSelector,void* PTR_IGNORE); // Inserting long onCmdOverstString(FXObject*,FXSelector,void* PTR_CHAR); long onCmdInsertString(FXObject*,FXSelector,void* PTR_CSTRING); long onCmdInsertNewline(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdInsertTab(FXObject*,FXSelector,void* PTR_IGNORE); // Manipulation Selection long onCmdCutSel(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdCopySel(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdPasteSel(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDeleteSel(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdChangeCase(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdShiftText(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdPasteMiddle(FXObject*,FXSelector,void* PTR_IGNORE); // Changing Selection long onCmdSelectChar(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSelectWord(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSelectLine(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSelectAll(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSelectMatching(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdSelectBlock(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDeselectAll(FXObject*,FXSelector,void* PTR_IGNORE); // Deletion long onCmdBackspace(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdBackspaceWord(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdBackspaceBol(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDelete(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDeleteWord(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDeleteEol(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDeleteAll(FXObject*,FXSelector,void* PTR_IGNORE); long onCmdDeleteLine(FXObject*,FXSelector,void* PTR_IGNORE); public: static const FXchar textDelimiters[]; public: enum { ID_CURSOR_TOP=FXScrollArea::ID_LAST, ID_CURSOR_BOTTOM, ID_CURSOR_HOME, ID_CURSOR_END, ID_CURSOR_RIGHT, ID_CURSOR_LEFT, ID_CURSOR_UP, ID_CURSOR_DOWN, ID_CURSOR_WORD_LEFT, ID_CURSOR_WORD_RIGHT, ID_CURSOR_WORD_START, ID_CURSOR_WORD_END, ID_CURSOR_PAGEDOWN, ID_CURSOR_PAGEUP, ID_CURSOR_SCRNTOP, ID_CURSOR_SCRNBTM, ID_CURSOR_SCRNCTR, ID_CURSOR_PAR_HOME, ID_CURSOR_PAR_END, ID_SCROLL_UP, ID_SCROLL_DOWN, ID_MARK, ID_EXTEND, ID_OVERST_STRING, ID_INSERT_STRING, ID_INSERT_NEWLINE, ID_INSERT_TAB, ID_CUT_SEL, ID_COPY_SEL, ID_DELETE_SEL, ID_PASTE_SEL, ID_PASTE_MIDDLE, ID_SELECT_CHAR, ID_SELECT_WORD, ID_SELECT_LINE, ID_SELECT_ALL, ID_SELECT_MATCHING, ID_SELECT_BRACE, ID_SELECT_BRACK, ID_SELECT_PAREN, ID_SELECT_ANG, ID_DESELECT_ALL, ID_BACKSPACE, ID_BACKSPACE_WORD, ID_BACKSPACE_BOL, ID_DELETE, ID_DELETE_WORD, ID_DELETE_EOL, ID_DELETE_ALL, ID_DELETE_LINE, ID_TOGGLE_EDITABLE, ID_TOGGLE_OVERSTRIKE, ID_CURSOR_ROW, ID_CURSOR_COLUMN, ID_CLEAN_INDENT, ID_SHIFT_LEFT, ID_SHIFT_RIGHT, ID_SHIFT_TABLEFT, ID_SHIFT_TABRIGHT, ID_UPPER_CASE, ID_LOWER_CASE, ID_GOTO_MATCHING, ID_GOTO_SELECTED, ID_GOTO_LINE, ID_SEARCH_FORW_SEL, ID_SEARCH_BACK_SEL, ID_SEARCH_FORW, ID_SEARCH_BACK, ID_SEARCH, ID_REPLACE, ID_LEFT_BRACE, ID_LEFT_BRACK, ID_LEFT_PAREN, ID_LEFT_ANG, ID_RIGHT_BRACE, ID_RIGHT_BRACK, ID_RIGHT_PAREN, ID_RIGHT_ANG, ID_BLINK, ID_FLASH, ID_LAST }; public: /// Construct multi-line text widget %extend { FXText(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2){ return new FXRbText(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb); } } /// Change top margin void setMarginTop(FXint pt); /// Return top margin FXint getMarginTop() const; /// Change bottom margin void setMarginBottom(FXint pb); /// Return bottom margin FXint getMarginBottom() const; /// Change left margin void setMarginLeft(FXint pl); /// Return left margin FXint getMarginLeft() const; /// Change right margin void setMarginRight(FXint pr); /// Return right margin FXint getMarginRight() const; /// Return wrap columns FXint getWrapColumns() const; /// Set wrap columns void setWrapColumns(FXint cols); /// Return tab columns FXint getTabColumns() const; /// Change tab columns void setTabColumns(FXint cols); /// Return number of columns used for line numbers FXint getBarColumns() const; /// Change number of columns used for line numbers void setBarColumns(FXint cols); /// Return TRUE if text was modified FXbool isModified() const; /// Set modified flag void setModified(FXbool mod=TRUE); /// Set editable flag void setEditable(FXbool edit=TRUE); /// Return TRUE if text is editable FXbool isEditable() const; /// Set overstrike mode void setOverstrike(FXbool over=TRUE); /// Return TRUE if overstrike mode in effect FXbool isOverstrike() const; /// Set styled text mode void setStyled(FXbool styled=TRUE); /// Return TRUE if style buffer FXbool isStyled() const; /// Change delimiters of words void setDelimiters(const FXchar* delims=textDelimiters); /// Return word delimiters const FXchar* getDelimiters() const; /// Change text font void setFont(FXFont* fnt); /// Return text font FXFont* getFont() const; /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const; /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const; /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const; /// Change highlighted text color void setHiliteTextColor(FXColor clr); /// Return highlighted text color FXColor getHiliteTextColor() const; /// Change highlighted background color void setHiliteBackColor(FXColor clr); /// Return highlighted background color FXColor getHiliteBackColor() const; /// Change active background color void setActiveBackColor(FXColor clr); /// Return active background color FXColor getActiveBackColor() const; /// Change cursor color void setCursorColor(FXColor clr); /// Return cursor color FXColor getCursorColor() const; /// Change line number color void setNumberColor(FXColor clr); /// Return line number color FXColor getNumberColor() const; /// Change bar color void setBarColor(FXColor clr); /// Return bar color FXColor getBarColor() const; /// Set help text void setHelpText(const FXString& text); /// Return help text FXString getHelpText() const; /// Set the tool tip message for this text field void setTipText(const FXString& text); /// Get the tool tip message for this text field FXString getTipText() const; /// Get character at position in text buffer FXint getByte(FXint pos) const; /// Get wide character at position pos FXwchar getChar(FXint pos) const; /// Get length of wide character at position pos FXint getCharLen(FXint pos) const; /// Get style at position in style buffer FXint getStyle(FXint pos) const; %extend { // Extract n bytes of text from position pos VALUE extractText(FXint pos,FXint n) const { VALUE str; FXString buffer; self->extractText(buffer,pos,n); str=to_ruby(buffer.text(),n); return str; } /// Extract n bytes of style info from position pos VALUE extractStyle(FXint pos,FXint n) const { FXString style; VALUE str=Qnil; if(self->isStyled()){ self->extractStyle(style,pos,n); str=to_ruby(style.text(),n); } return str; } } // end %extend /// Return text in the widget FXString getText() const; /// Return length of buffer FXint getLength() const; /// Return number of rows in buffer FXint getNumRows() const; /// Shift block of lines from position start up to end by given amount FXint shiftText(FXint start,FXint end,FXint amount,FXbool notify=FALSE); %extend { /** * Search for string in text buffer, returning the extent of * the string in beg and end. The search starts from the given * starting position, scans forward (SEARCH_FORWARD) or backward * (SEARCH_BACKWARD), and wraps around if SEARCH_WRAP has been * specified. The search type is either a plain search (SEARCH_EXACT), * case insensitive search (SEARCH_IGNORECASE), or regular expression * search (SEARCH_REGEX). * For regular expression searches, capturing parentheses are used if * npar is greater than 1; in this case, the number of entries in the * beg[], end[] arrays must be npar also. If either beg or end or * both are NULL, internal arrays are used. * [This API is still subject to change!!] */ VALUE findText(const FXString& string,FXint start=0,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP|SEARCH_EXACT){ FXint* beg; FXint* end; VALUE ary=Qnil; FXint ngroups=string.contains('(')+1; // FIXME: is this right? if(!FXMALLOC(&beg,FXint,ngroups)){ return Qnil; } if(!FXMALLOC(&end,FXint,ngroups)){ FXFREE(&beg); return Qnil; } if(self->findText(string,beg,end,start,flags,ngroups)){ ary=rb_ary_new(); rb_ary_push(ary,FXRbMakeArray(beg,ngroups)); rb_ary_push(ary,FXRbMakeArray(end,ngroups)); } FXFREE(&beg); FXFREE(&end); return ary; } } /// Return TRUE if position pos is selected FXbool isPosSelected(FXint pos) const; /// Return TRUE if position is fully visible FXbool isPosVisible(FXint pos) const; /// Return text position at given visible x,y coordinate FXint getPosAt(FXint x,FXint y) const; /// Count number of rows; start should be on a row start FXint countRows(FXint start,FXint end) const; /// Count number of columns; start should be on a row start FXint countCols(FXint start,FXint end) const; /// Count number of newlines FXint countLines(FXint start,FXint end) const; /// Return position of begin of line containing position pos FXint lineStart(FXint pos) const; /// Return position of end of line containing position pos FXint lineEnd(FXint pos) const; /// Return start of next line FXint nextLine(FXint pos,FXint nl=1) const; /// Return start of previous line FXint prevLine(FXint pos,FXint nl=1) const; /// Return row start FXint rowStart(FXint pos) const; /// Return row end FXint rowEnd(FXint pos) const; /// Return start of next row FXint nextRow(FXint pos,FXint nr=1) const; /// Return start of previous row FXint prevRow(FXint pos,FXint nr=1) const; /// Return end of previous word FXint leftWord(FXint pos) const; /// Return begin of next word FXint rightWord(FXint pos) const; /// Return begin of word FXint wordStart(FXint pos) const; /// Return end of word FXint wordEnd(FXint pos) const; /// Return validated utf8 character start position FXint validPos(FXint pos) const; /// Retreat to the previous valid utf8 character start FXint dec(FXint pos) const; /// Advance to the next valid utf8 character start FXint inc(FXint pos) const; /// Make line containing pos the top line void setTopLine(FXint pos); /// Return position of top line FXint getTopLine() const; /// Make line containing pos the bottom line void setBottomLine(FXint pos); /// Return the position of the bottom line FXint getBottomLine() const; /// Make line containing pos the center line void setCenterLine(FXint pos); /// Set the anchor position void setAnchorPos(FXint pos); /// Return the anchor position FXint getAnchorPos() const; /// Set cursor row void setCursorRow(FXint row,FXbool notify=FALSE); /// Return cursor row, i.e. indent position FXint getCursorRow() const; /// Set cursor column void setCursorColumn(FXint col,FXbool notify=FALSE); /// Return cursor column FXint getCursorColumn() const; /// Return the cursor position FXint getCursorPos() const; /// Return selstartpos FXint getSelStartPos() const; /// Return selendpos FXint getSelEndPos() const; /// Select all text FXbool selectAll(FXbool notify=FALSE); /// Select len characters starting at given position pos FXbool setSelection(FXint pos,FXint len,FXbool notify=FALSE); /// Highlight len characters starting at given position pos FXbool setHighlight(FXint start,FXint len); /// Unhighlight the text FXbool killHighlight(); /// Scroll text to make the given position visible void makePositionVisible(FXint pos); /// Change text widget style void setTextStyle(FXuint style); /// Return text widget style FXuint getTextStyle() const; /// Change number of visible rows void setVisibleRows(FXint rows); /// Return number of visible rows FXint getVisibleRows() const; /// Change number of visible columns void setVisibleColumns(FXint cols); /// Return number of visible columns FXint getVisibleColumns() const; /** * Change brace and parenthesis match highlighting time, in ms. * A match highlight time of 0 disables brace matching. */ void setHiliteMatchTime(FXuint t); /** * Return brace and parenthesis match highlighting time, in ms. */ FXuint getHiliteMatchTime() const; %extend { /// Set highlight styles void setHiliteStyles(VALUE styles){ if(self->isMemberOf(FXMETACLASS(FXRbText))){ FXRbText *text=dynamic_cast(self); FXASSERT(text); Check_Type(styles,T_ARRAY); if(text->numStyles>0){ delete [] text->styles; text->numStyles=0; } text->numStyles=RARRAY_LEN(styles); if(text->numStyles>0){ text->styles=new FXHiliteStyle[text->numStyles]; for (long i=0; inumStyles; i++){ FXHiliteStyle* ptr; SWIG_ConvertPtr(rb_ary_entry(styles,i),(void **)&ptr,SWIGTYPE_p_FXHiliteStyle,1); text->styles[i]=*ptr; } self->setHiliteStyles(text->styles); } } else{ rb_notimplement(); } } /// Get highlight styles VALUE getHiliteStyles() const { if(self->isMemberOf(FXMETACLASS(FXRbText))){ const FXRbText* text=dynamic_cast(self); FXASSERT(text); VALUE ary=rb_ary_new(); for(FXint i=0; inumStyles; i++){ rb_ary_push(ary,FXRbGetRubyObj(&(text->styles[i]),"FXHiliteStyle *")); } return ary; } else{ rb_notimplement(); return Qnil; // not reached } } } /// Destructor virtual ~FXText(); }; DECLARE_FXOBJECT_VIRTUALS(FXText) DECLARE_FXID_VIRTUALS(FXText) DECLARE_FXDRAWABLE_VIRTUALS(FXText) DECLARE_FXWINDOW_VIRTUALS(FXText) DECLARE_FXSCROLLAREA_VIRTUALS(FXText) DECLARE_FXTEXT_VIRTUALS(FXText)