From 37b23f7d6cce948b838c32675e505f806f00adb6 Mon Sep 17 00:00:00 2001 From: Pablo Alvarez Lopez Date: Thu, 24 Aug 2023 15:00:58 +0200 Subject: [PATCH] Updated MFXTextFieldIcon.cpp. Refs #13735 --- src/utils/foxtools/MFXTextFieldIcon.cpp | 3652 ++++++++++++----------- src/utils/foxtools/MFXTextFieldIcon.h | 6 +- 2 files changed, 1838 insertions(+), 1820 deletions(-) diff --git a/src/utils/foxtools/MFXTextFieldIcon.cpp b/src/utils/foxtools/MFXTextFieldIcon.cpp index 7a1a5791c17..e1f9ea6b843 100644 --- a/src/utils/foxtools/MFXTextFieldIcon.cpp +++ b/src/utils/foxtools/MFXTextFieldIcon.cpp @@ -45,2107 +45,2125 @@ // Map -FXDEFMAP(MFXTextFieldIcon) MFXTextFieldIconMap[]={ - FXMAPFUNC(SEL_PAINT,0,MFXTextFieldIcon::onPaint), - FXMAPFUNC(SEL_UPDATE,0,MFXTextFieldIcon::onUpdate), - FXMAPFUNC(SEL_MOTION,0,MFXTextFieldIcon::onMotion), - FXMAPFUNC(SEL_TIMEOUT,FXTextField::ID_BLINK,MFXTextFieldIcon::onBlink), - FXMAPFUNC(SEL_TIMEOUT,FXTextField::ID_AUTOSCROLL,MFXTextFieldIcon::onAutoScroll), - FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,MFXTextFieldIcon::onLeftBtnPress), - FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,MFXTextFieldIcon::onLeftBtnRelease), - FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,MFXTextFieldIcon::onMiddleBtnPress), - FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,MFXTextFieldIcon::onMiddleBtnRelease), - FXMAPFUNC(SEL_KEYPRESS,0,MFXTextFieldIcon::onKeyPress), - FXMAPFUNC(SEL_KEYRELEASE,0,MFXTextFieldIcon::onKeyRelease), - FXMAPFUNC(SEL_VERIFY,0,MFXTextFieldIcon::onVerify), - FXMAPFUNC(SEL_SELECTION_LOST,0,MFXTextFieldIcon::onSelectionLost), - FXMAPFUNC(SEL_SELECTION_GAINED,0,MFXTextFieldIcon::onSelectionGained), - FXMAPFUNC(SEL_SELECTION_REQUEST,0,MFXTextFieldIcon::onSelectionRequest), - FXMAPFUNC(SEL_CLIPBOARD_LOST,0,MFXTextFieldIcon::onClipboardLost), - FXMAPFUNC(SEL_CLIPBOARD_GAINED,0,MFXTextFieldIcon::onClipboardGained), - FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,MFXTextFieldIcon::onClipboardRequest), - FXMAPFUNC(SEL_FOCUSIN,0,MFXTextFieldIcon::onFocusIn), - FXMAPFUNC(SEL_FOCUSOUT,0,MFXTextFieldIcon::onFocusOut), - FXMAPFUNC(SEL_FOCUS_SELF,0,MFXTextFieldIcon::onFocusSelf), - FXMAPFUNC(SEL_QUERY_TIP,0,MFXTextFieldIcon::onQueryTip), - FXMAPFUNC(SEL_QUERY_HELP,0,MFXTextFieldIcon::onQueryHelp), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_TOGGLE_EDITABLE,MFXTextFieldIcon::onUpdToggleEditable), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_TOGGLE_OVERSTRIKE,MFXTextFieldIcon::onUpdToggleOverstrike), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_CUT_SEL,MFXTextFieldIcon::onUpdHaveSelection), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_COPY_SEL,MFXTextFieldIcon::onUpdHaveSelection), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_PASTE_SEL,MFXTextFieldIcon::onUpdYes), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_DELETE_SEL,MFXTextFieldIcon::onUpdHaveSelection), - FXMAPFUNC(SEL_UPDATE,FXTextField::ID_SELECT_ALL,MFXTextFieldIcon::onUpdSelectAll), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETVALUE,MFXTextFieldIcon::onCmdSetValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETINTVALUE,MFXTextFieldIcon::onCmdSetIntValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETREALVALUE,MFXTextFieldIcon::onCmdSetRealValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETSTRINGVALUE,MFXTextFieldIcon::onCmdSetStringValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETINTVALUE,MFXTextFieldIcon::onCmdGetIntValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETREALVALUE,MFXTextFieldIcon::onCmdGetRealValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETSTRINGVALUE,MFXTextFieldIcon::onCmdGetStringValue), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_HOME,MFXTextFieldIcon::onCmdCursorHome), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_END,MFXTextFieldIcon::onCmdCursorEnd), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_RIGHT,MFXTextFieldIcon::onCmdCursorRight), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_LEFT,MFXTextFieldIcon::onCmdCursorLeft), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_LEFT,MFXTextFieldIcon::onCmdCursorWordLeft), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_RIGHT,MFXTextFieldIcon::onCmdCursorWordRight), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_START,MFXTextFieldIcon::onCmdCursorWordStart), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_END,MFXTextFieldIcon::onCmdCursorWordEnd), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_MARK,MFXTextFieldIcon::onCmdMark), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_EXTEND,MFXTextFieldIcon::onCmdExtend), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SELECT_ALL,MFXTextFieldIcon::onCmdSelectAll), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DESELECT_ALL,MFXTextFieldIcon::onCmdDeselectAll), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CUT_SEL,MFXTextFieldIcon::onCmdCutSel), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_COPY_SEL,MFXTextFieldIcon::onCmdCopySel), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_PASTE_SEL,MFXTextFieldIcon::onCmdPasteSel), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_PASTE_MIDDLE,MFXTextFieldIcon::onCmdPasteMiddle), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DELETE_SEL,MFXTextFieldIcon::onCmdDeleteSel), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DELETE_ALL,MFXTextFieldIcon::onCmdDeleteAll), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_OVERST_STRING,MFXTextFieldIcon::onCmdOverstString), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_INSERT_STRING,MFXTextFieldIcon::onCmdInsertString), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_BACKSPACE,MFXTextFieldIcon::onCmdBackspace), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DELETE,MFXTextFieldIcon::onCmdDelete), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_TOGGLE_EDITABLE,MFXTextFieldIcon::onCmdToggleEditable), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_TOGGLE_OVERSTRIKE,MFXTextFieldIcon::onCmdToggleOverstrike), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETHELPSTRING,MFXTextFieldIcon::onCmdSetHelp), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETHELPSTRING,MFXTextFieldIcon::onCmdGetHelp), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETTIPSTRING,MFXTextFieldIcon::onCmdSetTip), - FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETTIPSTRING,MFXTextFieldIcon::onCmdGetTip), - }; + FXDEFMAP(MFXTextFieldIcon) MFXTextFieldIconMap[]={ + FXMAPFUNC(SEL_PAINT, 0, MFXTextFieldIcon::onPaint), + FXMAPFUNC(SEL_UPDATE, 0, MFXTextFieldIcon::onUpdate), + FXMAPFUNC(SEL_MOTION, 0, MFXTextFieldIcon::onMotion), + FXMAPFUNC(SEL_LEFTBUTTONPRESS, 0, MFXTextFieldIcon::onLeftBtnPress), + FXMAPFUNC(SEL_LEFTBUTTONRELEASE, 0, MFXTextFieldIcon::onLeftBtnRelease), + FXMAPFUNC(SEL_MIDDLEBUTTONPRESS, 0, MFXTextFieldIcon::onMiddleBtnPress), + FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE, 0, MFXTextFieldIcon::onMiddleBtnRelease), + FXMAPFUNC(SEL_KEYPRESS, 0, MFXTextFieldIcon::onKeyPress), + FXMAPFUNC(SEL_KEYRELEASE, 0, MFXTextFieldIcon::onKeyRelease), + FXMAPFUNC(SEL_VERIFY, 0, MFXTextFieldIcon::onVerify), + FXMAPFUNC(SEL_SELECTION_LOST, 0, MFXTextFieldIcon::onSelectionLost), + FXMAPFUNC(SEL_SELECTION_GAINED, 0, MFXTextFieldIcon::onSelectionGained), + FXMAPFUNC(SEL_SELECTION_REQUEST, 0, MFXTextFieldIcon::onSelectionRequest), + FXMAPFUNC(SEL_CLIPBOARD_LOST, 0, MFXTextFieldIcon::onClipboardLost), + FXMAPFUNC(SEL_CLIPBOARD_GAINED, 0, MFXTextFieldIcon::onClipboardGained), + FXMAPFUNC(SEL_CLIPBOARD_REQUEST, 0, MFXTextFieldIcon::onClipboardRequest), + FXMAPFUNC(SEL_FOCUSIN, 0, MFXTextFieldIcon::onFocusIn), + FXMAPFUNC(SEL_FOCUSOUT, 0, MFXTextFieldIcon::onFocusOut), + FXMAPFUNC(SEL_FOCUS_SELF, 0, MFXTextFieldIcon::onFocusSelf), + FXMAPFUNC(SEL_QUERY_TIP, 0, MFXTextFieldIcon::onQueryTip), + FXMAPFUNC(SEL_QUERY_HELP, 0, MFXTextFieldIcon::onQueryHelp), + FXMAPFUNC(SEL_TIMEOUT, FXTextField::ID_BLINK, MFXTextFieldIcon::onBlink), + FXMAPFUNC(SEL_TIMEOUT, FXTextField::ID_AUTOSCROLL, MFXTextFieldIcon::onAutoScroll), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_TOGGLE_EDITABLE, MFXTextFieldIcon::onUpdToggleEditable), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_TOGGLE_OVERSTRIKE, MFXTextFieldIcon::onUpdToggleOverstrike), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_CUT_SEL, MFXTextFieldIcon::onUpdHaveSelection), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_COPY_SEL, MFXTextFieldIcon::onUpdHaveSelection), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_PASTE_SEL, MFXTextFieldIcon::onUpdYes), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_DELETE_SEL, MFXTextFieldIcon::onUpdHaveSelection), + FXMAPFUNC(SEL_UPDATE, FXTextField::ID_SELECT_ALL, MFXTextFieldIcon::onUpdSelectAll), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SETVALUE, MFXTextFieldIcon::onCmdSetValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SETINTVALUE, MFXTextFieldIcon::onCmdSetIntValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SETREALVALUE, MFXTextFieldIcon::onCmdSetRealValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SETSTRINGVALUE, MFXTextFieldIcon::onCmdSetStringValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_GETINTVALUE, MFXTextFieldIcon::onCmdGetIntValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_GETREALVALUE, MFXTextFieldIcon::onCmdGetRealValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_GETSTRINGVALUE, MFXTextFieldIcon::onCmdGetStringValue), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_HOME, MFXTextFieldIcon::onCmdCursorHome), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_END, MFXTextFieldIcon::onCmdCursorEnd), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_RIGHT, MFXTextFieldIcon::onCmdCursorRight), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_LEFT, MFXTextFieldIcon::onCmdCursorLeft), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_WORD_LEFT, MFXTextFieldIcon::onCmdCursorWordLeft), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_WORD_RIGHT, MFXTextFieldIcon::onCmdCursorWordRight), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_WORD_START, MFXTextFieldIcon::onCmdCursorWordStart), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CURSOR_WORD_END, MFXTextFieldIcon::onCmdCursorWordEnd), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_MARK, MFXTextFieldIcon::onCmdMark), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_EXTEND, MFXTextFieldIcon::onCmdExtend), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SELECT_ALL, MFXTextFieldIcon::onCmdSelectAll), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_DESELECT_ALL, MFXTextFieldIcon::onCmdDeselectAll), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_CUT_SEL, MFXTextFieldIcon::onCmdCutSel), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_COPY_SEL, MFXTextFieldIcon::onCmdCopySel), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_PASTE_SEL, MFXTextFieldIcon::onCmdPasteSel), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_PASTE_MIDDLE, MFXTextFieldIcon::onCmdPasteMiddle), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_DELETE_SEL, MFXTextFieldIcon::onCmdDeleteSel), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_DELETE_ALL, MFXTextFieldIcon::onCmdDeleteAll), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_OVERST_STRING, MFXTextFieldIcon::onCmdOverstString), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_INSERT_STRING, MFXTextFieldIcon::onCmdInsertString), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_BACKSPACE, MFXTextFieldIcon::onCmdBackspace), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_DELETE, MFXTextFieldIcon::onCmdDelete), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_TOGGLE_EDITABLE, MFXTextFieldIcon::onCmdToggleEditable), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_TOGGLE_OVERSTRIKE, MFXTextFieldIcon::onCmdToggleOverstrike), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SETHELPSTRING, MFXTextFieldIcon::onCmdSetHelp), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_GETHELPSTRING, MFXTextFieldIcon::onCmdGetHelp), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_SETTIPSTRING, MFXTextFieldIcon::onCmdSetTip), + FXMAPFUNC(SEL_COMMAND, FXTextField::ID_GETTIPSTRING, MFXTextFieldIcon::onCmdGetTip), +}; // Object implementation -FXIMPLEMENT(MFXTextFieldIcon,FXFrame,MFXTextFieldIconMap,ARRAYNUMBER(MFXTextFieldIconMap)) +FXIMPLEMENT(MFXTextFieldIcon, FXFrame, MFXTextFieldIconMap, ARRAYNUMBER(MFXTextFieldIconMap)) // =========================================================================== // member method definitions // =========================================================================== +MFXTextFieldIcon::MFXTextFieldIcon(FXComposite* p, FXint ncols, FXObject* tgt, FXSelector sel, FXuint opts, FXint x, FXint y, FXint w, FXint h, FXint pl, FXint pr, FXint pt, FXint pb): + FXFrame(p, opts, x, y, w, h, pl, pr, pt, pb) { + if (ncols<0) ncols=0; + flags|=FLAG_ENABLED; + target=tgt; + message=sel; + if (!(options&JUSTIFY_RIGHT)) options|=JUSTIFY_LEFT; + defaultCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); + dragCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); + delimiters=FXTextField::textDelimiters; + font=getApp()->getNormalFont(); + backColor=getApp()->getBackColor(); + textColor=getApp()->getForeColor(); + selbackColor=getApp()->getSelbackColor(); + seltextColor=getApp()->getSelforeColor(); + cursorColor=getApp()->getForeColor(); + cursor=0; + anchor=0; + columns=ncols; + shift=0; +} -// For serialization -MFXTextFieldIcon::MFXTextFieldIcon(){ - flags|=FLAG_ENABLED; - delimiters=FXTextField::textDelimiters; - font=(FXFont*)-1L; - textColor=0; - selbackColor=0; - seltextColor=0; - cursorColor=0; - cursor=0; - anchor=0; - columns=0; - shift=0; - } - - -// Construct and init -MFXTextFieldIcon::MFXTextFieldIcon(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): - FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ - if(ncols<0) ncols=0; - flags|=FLAG_ENABLED; - target=tgt; - message=sel; - if(!(options&JUSTIFY_RIGHT)) options|=JUSTIFY_LEFT; - defaultCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); - dragCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); - delimiters=FXTextField::textDelimiters; - font=getApp()->getNormalFont(); - backColor=getApp()->getBackColor(); - textColor=getApp()->getForeColor(); - selbackColor=getApp()->getSelbackColor(); - seltextColor=getApp()->getSelforeColor(); - cursorColor=getApp()->getForeColor(); - cursor=0; - anchor=0; - columns=ncols; - shift=0; - } - - -// Create X window -void MFXTextFieldIcon::create(){ - FXFrame::create(); - if(!textType){ textType=getApp()->registerDragType(textTypeName); } - if(!utf8Type){ utf8Type=getApp()->registerDragType(utf8TypeName); } - if(!utf16Type){ utf16Type=getApp()->registerDragType(utf16TypeName); } - font->create(); - } - - -// Change the font -void MFXTextFieldIcon::setFont(FXFont* fnt){ - if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } - if(font!=fnt){ - font=fnt; - recalc(); - update(); + +MFXTextFieldIcon::~MFXTextFieldIcon() { + getApp()->removeTimeout(this, FXTextField::ID_BLINK); + getApp()->removeTimeout(this, ID_AUTOSCROLL); + font=(FXFont*)-1L; +} + + +void +MFXTextFieldIcon::create() { + FXFrame::create(); + if (!textType) { + textType=getApp()->registerDragType(textTypeName); } - } + if (!utf8Type) { + utf8Type=getApp()->registerDragType(utf8TypeName); + } + if (!utf16Type) { + utf16Type=getApp()->registerDragType(utf16TypeName); + } + font->create(); +} -// Enable the window -void MFXTextFieldIcon::enable(){ - if(!(flags&FLAG_ENABLED)){ - FXFrame::enable(); - update(); +void +MFXTextFieldIcon::setFont(FXFont* fnt) { + if (!fnt) { + fxerror("%s::setFont: NULL font specified.\n", getClassName()); } - } + if (font!=fnt) { + font=fnt; + recalc(); + update(); + } +} -// Disable the window -void MFXTextFieldIcon::disable(){ - if(flags&FLAG_ENABLED){ - FXFrame::disable(); - update(); +void +MFXTextFieldIcon::enable() { + if (!(flags&FLAG_ENABLED)) { + FXFrame::enable(); + update(); + } +} + + +void +MFXTextFieldIcon::disable() { + if (flags&FLAG_ENABLED) { + FXFrame::disable(); + update(); } - } +} + +FXint +MFXTextFieldIcon::getDefaultWidth() { + return padleft+padright+(border<<1)+columns*font->getTextWidth("8", 1); +} -// Get default width -FXint MFXTextFieldIcon::getDefaultWidth(){ - return padleft+padright+(border<<1)+columns*font->getTextWidth("8",1); - } -// Get default height -FXint MFXTextFieldIcon::getDefaultHeight(){ - return padtop+padbottom+(border<<1)+font->getFontHeight(); - } +FXint +MFXTextFieldIcon::getDefaultHeight() { + return padtop+padbottom+(border<<1)+font->getFontHeight(); +} -// Implement auto-hide or auto-gray modes -long MFXTextFieldIcon::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ - if(!FXFrame::onUpdate(sender,sel,ptr)){ - if(options&TEXTFIELD_AUTOHIDE){if(shown()){hide();recalc();}} - if(options&TEXTFIELD_AUTOGRAY){disable();} +long +MFXTextFieldIcon::onUpdate(FXObject* sender, FXSelector sel, void* ptr) { + if (!FXFrame::onUpdate(sender, sel, ptr)) { + if (options&TEXTFIELD_AUTOHIDE) { + if (shown()) { + hide(); + recalc(); + } + } + if (options&TEXTFIELD_AUTOGRAY) { + disable(); + } } - return 1; - } + return 1; +} -// We now really do have the selection; repaint the text field -long MFXTextFieldIcon::onSelectionGained(FXObject* sender,FXSelector sel,void* ptr){ - FXFrame::onSelectionGained(sender,sel,ptr); - update(); - return 1; - } +long +MFXTextFieldIcon::onSelectionGained(FXObject* sender, FXSelector sel, void* ptr) { + FXFrame::onSelectionGained(sender, sel, ptr); + update(); + return 1; +} -// We lost the selection somehow; repaint the text field -long MFXTextFieldIcon::onSelectionLost(FXObject* sender,FXSelector sel,void* ptr){ - FXFrame::onSelectionLost(sender,sel,ptr); - update(); - return 1; - } +long +MFXTextFieldIcon::onSelectionLost(FXObject* sender, FXSelector sel, void* ptr) { + FXFrame::onSelectionLost(sender, sel, ptr); + update(); + return 1; +} -// Somebody wants our selection; the text field will furnish it if the target doesn't -long MFXTextFieldIcon::onSelectionRequest(FXObject* sender,FXSelector sel,void* ptr){ - FXEvent *event=(FXEvent*)ptr; - FXString string; - FXuint start; - FXuint len; +long +MFXTextFieldIcon::onSelectionRequest(FXObject* sender, FXSelector sel, void* ptr) { + FXEvent *event=(FXEvent*)ptr; + FXString string; + FXuint start; + FXuint len; - // Make sure - FXASSERT(0<=anchor && anchor<=contents.length()); - FXASSERT(0<=cursor && cursor<=contents.length()); + // Make sure + FXASSERT(0<=anchor && anchor<=contents.length()); + FXASSERT(0<=cursor && cursor<=contents.length()); - // Perhaps the target wants to supply its own data for the selection - if(FXFrame::onSelectionRequest(sender,sel,ptr)) return 1; + // Perhaps the target wants to supply its own data for the selection + if (FXFrame::onSelectionRequest(sender, sel, ptr)) + return 1; - // Recognize the request? - if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ + // Recognize the request? + if (event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type) { - // Figure selected bytes - if(anchortarget==utf8Type){ - FXTRACE((100,"Request UTF8\n")); - setDNDData(FROM_SELECTION,event->target,string); - return 1; - } + // Return text of the selection as UTF-8 + if (event->target==utf8Type) { + FXTRACE((100, "Request UTF8\n")); + setDNDData(FROM_SELECTION, event->target, string); + return 1; + } - // Return text of the selection translated to 8859-1 - if(event->target==stringType || event->target==textType){ - FX88591Codec ascii; - FXTRACE((100,"Request ASCII\n")); - setDNDData(FROM_SELECTION,event->target,ascii.utf2mb(string)); - return 1; - } + // Return text of the selection translated to 8859-1 + if (event->target==stringType || event->target==textType) { + FX88591Codec ascii; + FXTRACE((100, "Request ASCII\n")); + setDNDData(FROM_SELECTION, event->target, ascii.utf2mb(string)); + return 1; + } - // Return text of the selection translated to UTF-16 - if(event->target==utf16Type){ - FXUTF16LECodec unicode; // FIXME maybe other endianness for unix - FXTRACE((100,"Request UTF16\n")); - setDNDData(FROM_SELECTION,event->target,unicode.utf2mb(string)); - return 1; - } + // Return text of the selection translated to UTF-16 + if (event->target==utf16Type) { + FXUTF16LECodec unicode; // FIXME maybe other endianness for unix + FXTRACE((100, "Request UTF16\n")); + setDNDData(FROM_SELECTION, event->target, unicode.utf2mb(string)); + return 1; + } } - return 0; - } + return 0; +} -// We now really do have the clipboard, keep clipped text -long MFXTextFieldIcon::onClipboardGained(FXObject* sender,FXSelector sel,void* ptr){ - FXFrame::onClipboardGained(sender,sel,ptr); - return 1; - } +long +MFXTextFieldIcon::onClipboardGained(FXObject* sender, FXSelector sel, void* ptr) { + FXFrame::onClipboardGained(sender, sel, ptr); + return 1; +} -// We lost the clipboard, free clipped text -long MFXTextFieldIcon::onClipboardLost(FXObject* sender,FXSelector sel,void* ptr){ - FXFrame::onClipboardLost(sender,sel,ptr); - clipped.clear(); - return 1; - } +long +MFXTextFieldIcon::onClipboardLost(FXObject* sender, FXSelector sel, void* ptr) { + FXFrame::onClipboardLost(sender, sel, ptr); + clipped.clear(); + return 1; +} -// Somebody wants our clipped text -long MFXTextFieldIcon::onClipboardRequest(FXObject* sender,FXSelector sel,void* ptr){ - FXEvent *event=(FXEvent*)ptr; - FXString string; - // Perhaps the target wants to supply its own data for the clipboard - if(FXFrame::onClipboardRequest(sender,sel,ptr)) return 1; - - // Recognize the request? - if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ +long +MFXTextFieldIcon::onClipboardRequest(FXObject* sender, FXSelector sel, void* ptr) { + FXEvent *event=(FXEvent*)ptr; + FXString string; - // Get clipped string - string=clipped; - - // If password mode, replace by stars - if(options&TEXTFIELD_PASSWD) string.assign('*',string.count()); - - // Return clipped text as as UTF-8 - if(event->target==utf8Type){ - FXTRACE((100,"Request UTF8\n")); - setDNDData(FROM_CLIPBOARD,event->target,string); - return 1; - } - - // Return clipped text translated to 8859-1 - if(event->target==stringType || event->target==textType){ - FX88591Codec ascii; - FXTRACE((100,"Request ASCII\n")); - setDNDData(FROM_CLIPBOARD,event->target,ascii.utf2mb(string)); - return 1; - } - - // Return text of the selection translated to UTF-16 - if(event->target==utf16Type){ - FXUTF16LECodec unicode; // FIXME maybe other endianness for unix - FXTRACE((100,"Request UTF16\n")); - setDNDData(FROM_CLIPBOARD,event->target,unicode.utf2mb(string)); - return 1; - } - } - return 0; - } + // Perhaps the target wants to supply its own data for the clipboard + if (FXFrame::onClipboardRequest(sender, sel, ptr)) + return 1; + // Recognize the request? + if (event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type) { -// Blink the cursor -long MFXTextFieldIcon::onBlink(FXObject*,FXSelector,void*){ - drawCursor(flags^FLAG_CARET); - getApp()->addTimeout(this,FXTextField::ID_BLINK,getApp()->getBlinkSpeed()); - return 0; - } - - -// Gained focus -long MFXTextFieldIcon::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ - FXFrame::onFocusIn(sender,sel,ptr); - if(isEditable()){ - getApp()->addTimeout(this,FXTextField::ID_BLINK,getApp()->getBlinkSpeed()); - drawCursor(FLAG_CARET); - } - if(hasSelection()){ - update(border,border,width-(border<<1),height-(border<<1)); - } - return 1; - } - - -// Lost focus -long MFXTextFieldIcon::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ - FXFrame::onFocusOut(sender,sel,ptr); - getApp()->removeTimeout(this,FXTextField::ID_BLINK); - drawCursor(0); - if(hasSelection()){ - update(border,border,width-(border<<1),height-(border<<1)); - } - return 1; - } - + // Get clipped string + string=clipped; -// Focus on widget itself -long MFXTextFieldIcon::onFocusSelf(FXObject* sender,FXSelector sel,void* ptr){ - if(FXFrame::onFocusSelf(sender,sel,ptr)){ - FXEvent *event=(FXEvent*)ptr; - if(event->type==SEL_KEYPRESS || event->type==SEL_KEYRELEASE){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_SELECT_ALL),NULL); - } - return 1; + // If password mode, replace by stars + if (options&TEXTFIELD_PASSWD) string.assign('*', string.count()); + + // Return clipped text as as UTF-8 + if (event->target==utf8Type) { + FXTRACE((100, "Request UTF8\n")); + setDNDData(FROM_CLIPBOARD, event->target, string); + return 1; + } + + // Return clipped text translated to 8859-1 + if (event->target==stringType || event->target==textType) { + FX88591Codec ascii; + FXTRACE((100, "Request ASCII\n")); + setDNDData(FROM_CLIPBOARD, event->target, ascii.utf2mb(string)); + return 1; + } + + // Return text of the selection translated to UTF-16 + if (event->target==utf16Type) { + FXUTF16LECodec unicode; // FIXME maybe other endianness for unix + FXTRACE((100, "Request UTF16\n")); + setDNDData(FROM_CLIPBOARD, event->target, unicode.utf2mb(string)); + return 1; + } } - return 0; - } + return 0; +} -// If window can have focus -bool MFXTextFieldIcon::canFocus() const { return true; } +long +MFXTextFieldIcon::onBlink(FXObject*, FXSelector, void*) { + drawCursor(flags^FLAG_CARET); + getApp()->addTimeout(this, FXTextField::ID_BLINK, getApp()->getBlinkSpeed()); + return 0; +} -// Into focus chain -void MFXTextFieldIcon::setFocus(){ - FXFrame::setFocus(); - setDefault(TRUE); - flags&=~FLAG_UPDATE; - if(getApp()->hasInputMethod()){ - createComposeContext(); +long +MFXTextFieldIcon::onFocusIn(FXObject* sender, FXSelector sel, void* ptr) { + FXFrame::onFocusIn(sender, sel, ptr); + if (isEditable()) { + getApp()->addTimeout(this, FXTextField::ID_BLINK, getApp()->getBlinkSpeed()); + drawCursor(FLAG_CARET); + } + if (hasSelection()) { + update(border, border, width-(border<<1), height-(border<<1)); } - } + return 1; +} -// Out of focus chain -void MFXTextFieldIcon::killFocus(){ - FXFrame::killFocus(); - setDefault(MAYBE); - flags|=FLAG_UPDATE; - if(flags&FLAG_CHANGED){ - flags&=~FLAG_CHANGED; - if(!(options&TEXTFIELD_ENTER_ONLY)){ - if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)contents.text()); - } +long +MFXTextFieldIcon::onFocusOut(FXObject* sender, FXSelector sel, void* ptr) { + FXFrame::onFocusOut(sender, sel, ptr); + getApp()->removeTimeout(this, FXTextField::ID_BLINK); + drawCursor(0); + if (hasSelection()) { + update(border, border, width-(border<<1), height-(border<<1)); } - if(getApp()->hasInputMethod()){ - destroyComposeContext(); + return 1; +} + + +long +MFXTextFieldIcon::onFocusSelf(FXObject* sender, FXSelector sel, void* ptr) { + if (FXFrame::onFocusSelf(sender, sel, ptr)) { + FXEvent *event=(FXEvent*)ptr; + if (event->type==SEL_KEYPRESS || event->type==SEL_KEYRELEASE) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_SELECT_ALL), NULL); + } + return 1; } - } + return 0; +} -// Set help using a message -long MFXTextFieldIcon::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ - setHelpText(*((FXString*)ptr)); - return 1; - } +bool +MFXTextFieldIcon::canFocus() const { + return true; +} -// Get help using a message -long MFXTextFieldIcon::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ - *((FXString*)ptr)=getHelpText(); - return 1; - } +void +MFXTextFieldIcon::setFocus() { + FXFrame::setFocus(); + setDefault(TRUE); + flags&=~FLAG_UPDATE; + if (getApp()->hasInputMethod()) { + createComposeContext(); + } +} -// Set tip using a message -long MFXTextFieldIcon::onCmdSetTip(FXObject*,FXSelector,void* ptr){ - setTipText(*((FXString*)ptr)); - return 1; - } +void +MFXTextFieldIcon::killFocus() { + FXFrame::killFocus(); + setDefault(MAYBE); + flags|=FLAG_UPDATE; + if (flags&FLAG_CHANGED) { + flags&=~FLAG_CHANGED; + if (!(options&TEXTFIELD_ENTER_ONLY)) { + if (target) target->tryHandle(this, FXSEL(SEL_COMMAND, message), (void*)contents.text()); + } + } + if (getApp()->hasInputMethod()) { + destroyComposeContext(); + } +} -// Get tip using a message -long MFXTextFieldIcon::onCmdGetTip(FXObject*,FXSelector,void* ptr){ - *((FXString*)ptr)=getTipText(); - return 1; - } +long +MFXTextFieldIcon::onCmdSetHelp(FXObject*, FXSelector, void* ptr) { + setHelpText(*((FXString*)ptr)); + return 1; +} -// We were asked about tip text -long MFXTextFieldIcon::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ - if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; - if((flags&FLAG_TIP) && !tip.empty()){ - sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); +long +MFXTextFieldIcon::onCmdGetHelp(FXObject*, FXSelector, void* ptr) { + *((FXString*)ptr)=getHelpText(); return 1; - } - return 0; - } +} + + +long +MFXTextFieldIcon::onCmdSetTip(FXObject*, FXSelector, void* ptr) { + setTipText(*((FXString*)ptr)); + return 1; +} -// We were asked about status text -long MFXTextFieldIcon::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ - if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; - if((flags&FLAG_HELP) && !help.empty()){ - sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); +long +MFXTextFieldIcon::onCmdGetTip(FXObject*, FXSelector, void* ptr) { + *((FXString*)ptr)=getTipText(); return 1; +} + + +long +MFXTextFieldIcon::onQueryTip(FXObject* sender, FXSelector sel, void* ptr) { + if (FXWindow::onQueryTip(sender, sel, ptr)) + return 1; + if ((flags&FLAG_TIP) && !tip.empty()) { + sender->handle(this, FXSEL(SEL_COMMAND, ID_SETSTRINGVALUE), (void*)&tip); + return 1; } - return 0; - } + return 0; +} -// Update value from a message -long MFXTextFieldIcon::onCmdSetValue(FXObject*,FXSelector,void* ptr){ - setText((const FXchar*)ptr); - return 1; - } +long +MFXTextFieldIcon::onQueryHelp(FXObject* sender, FXSelector sel, void* ptr) { + if (FXWindow::onQueryHelp(sender, sel, ptr)) + return 1; + if ((flags&FLAG_HELP) && !help.empty()) { + sender->handle(this, FXSEL(SEL_COMMAND, ID_SETSTRINGVALUE), (void*)&help); + return 1; + } + return 0; +} -// Update value from a message -long MFXTextFieldIcon::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ - setText(FXStringVal(*((FXint*)ptr))); - return 1; - } +long +MFXTextFieldIcon::onCmdSetValue(FXObject*, FXSelector, void* ptr) { + setText((const FXchar*)ptr); + return 1; +} -// Update value from a message -long MFXTextFieldIcon::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ - setText(FXStringVal(*((FXdouble*)ptr))); - return 1; - } +long +MFXTextFieldIcon::onCmdSetIntValue(FXObject*, FXSelector, void* ptr) { + setText(FXStringVal(*((FXint*)ptr))); + return 1; +} -// Update value from a message -long MFXTextFieldIcon::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ - setText(*((FXString*)ptr)); - return 1; - } +long +MFXTextFieldIcon::onCmdSetRealValue(FXObject*, FXSelector, void* ptr) { + setText(FXStringVal(*((FXdouble*)ptr))); + return 1; +} -// Obtain value from text field -long MFXTextFieldIcon::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ - *((FXint*)ptr)=FXIntVal(contents); - return 1; - } +long +MFXTextFieldIcon::onCmdSetStringValue(FXObject*, FXSelector, void* ptr) { + setText(*((FXString*)ptr)); + return 1; +} -// Obtain value from text field -long MFXTextFieldIcon::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ - *((FXdouble*)ptr)=FXDoubleVal(contents); - return 1; - } +long +MFXTextFieldIcon::onCmdGetIntValue(FXObject*, FXSelector, void* ptr) { + *((FXint*)ptr)=FXIntVal(contents); + return 1; +} -// Obtain value from text field -long MFXTextFieldIcon::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ - *((FXString*)ptr)=getText(); - return 1; - } +long +MFXTextFieldIcon::onCmdGetRealValue(FXObject*, FXSelector, void* ptr) { + *((FXdouble*)ptr)=FXDoubleVal(contents); + return 1; +} -// Pressed left button -long MFXTextFieldIcon::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ - FXEvent* ev=(FXEvent*)ptr; - flags&=~FLAG_TIP; - handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); - if(isEnabled()){ - grab(); - if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; - flags&=~FLAG_UPDATE; - if(ev->click_count==1){ - setCursorPos(index(ev->win_x)); - if(ev->state&SHIFTMASK){ - extendSelection(cursor); - } - else{ - killSelection(); - setAnchorPos(cursor); - } - makePositionVisible(cursor); - flags|=FLAG_PRESSED; - } - else{ - setAnchorPos(0); - setCursorPos(contents.length()); - extendSelection(contents.length()); - makePositionVisible(cursor); - } +long +MFXTextFieldIcon::onCmdGetStringValue(FXObject*, FXSelector, void* ptr) { + *((FXString*)ptr)=getText(); return 1; +} + + +long +MFXTextFieldIcon::onLeftBtnPress(FXObject*, FXSelector, void* ptr) { + FXEvent* ev=(FXEvent*)ptr; + flags&=~FLAG_TIP; + handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr); + if (isEnabled()) { + grab(); + if (target && target->tryHandle(this, FXSEL(SEL_LEFTBUTTONPRESS, message), ptr)) return 1; + flags&=~FLAG_UPDATE; + if (ev->click_count==1) { + setCursorPos(index(ev->win_x)); + if (ev->state&SHIFTMASK) { + extendSelection(cursor); + } else { + killSelection(); + setAnchorPos(cursor); + } + makePositionVisible(cursor); + flags|=FLAG_PRESSED; + } else { + setAnchorPos(0); + setCursorPos(contents.length()); + extendSelection(contents.length()); + makePositionVisible(cursor); + } + return 1; } - return 0; - } + return 0; +} -// Released left button -long MFXTextFieldIcon::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ - if(isEnabled()){ - ungrab(); - flags&=~FLAG_PRESSED; - if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; - return 1; +long +MFXTextFieldIcon::onLeftBtnRelease(FXObject*, FXSelector, void* ptr) { + if (isEnabled()) { + ungrab(); + flags&=~FLAG_PRESSED; + if (target && target->tryHandle(this, FXSEL(SEL_LEFTBUTTONRELEASE, message), ptr)) + return 1; + return 1; } - return 0; - } + return 0; +} -// Pressed middle button to paste -long MFXTextFieldIcon::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ - FXEvent* ev=(FXEvent*)ptr; - flags&=~FLAG_TIP; - handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); - if(isEnabled()){ - grab(); - if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; - setCursorPos(index(ev->win_x)); - setAnchorPos(cursor); - makePositionVisible(cursor); - update(border,border,width-(border<<1),height-(border<<1)); - flags&=~FLAG_UPDATE; - return 1; +long +MFXTextFieldIcon::onMiddleBtnPress(FXObject*, FXSelector, void* ptr) { + FXEvent* ev=(FXEvent*)ptr; + flags&=~FLAG_TIP; + handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr); + if (isEnabled()) { + grab(); + if (target && target->tryHandle(this, FXSEL(SEL_MIDDLEBUTTONPRESS, message), ptr)) + return 1; + setCursorPos(index(ev->win_x)); + setAnchorPos(cursor); + makePositionVisible(cursor); + update(border, border, width-(border<<1), height-(border<<1)); + flags&=~FLAG_UPDATE; + return 1; } - return 0; - } + return 0; +} -// Released middle button causes paste of selection -long MFXTextFieldIcon::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ - if(isEnabled()){ - ungrab(); - if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_PASTE_MIDDLE),NULL); +long +MFXTextFieldIcon::onMiddleBtnRelease(FXObject*, FXSelector, void* ptr) { + if (isEnabled()) { + ungrab(); + if (target && target->tryHandle(this, FXSEL(SEL_MIDDLEBUTTONRELEASE, message), ptr)) + return 1; + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_PASTE_MIDDLE), NULL); } - return 0; - } + return 0; +} -// Moved -long MFXTextFieldIcon::onMotion(FXObject*,FXSelector,void* ptr){ - FXEvent* event=(FXEvent*)ptr; - FXint t; - if(flags&FLAG_PRESSED){ - if(event->win_x<(border+padleft) || (width-border-padright)win_x){ - if(!getApp()->hasTimeout(this,ID_AUTOSCROLL)){ - getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - } - else{ - getApp()->removeTimeout(this,ID_AUTOSCROLL); - t=index(event->win_x); - if(t!=cursor){ - drawCursor(0); - cursor=t; - extendSelection(cursor); +long +MFXTextFieldIcon::onMotion(FXObject*, FXSelector, void* ptr) { + FXEvent* event=(FXEvent*)ptr; + FXint t; + if (flags&FLAG_PRESSED) { + if (event->win_x<(border+padleft) || (width-border-padright)win_x) { + if (!getApp()->hasTimeout(this, ID_AUTOSCROLL)) { + getApp()->addTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + } else { + getApp()->removeTimeout(this, ID_AUTOSCROLL); + t=index(event->win_x); + if (t!=cursor) { + drawCursor(0); + cursor=t; + extendSelection(cursor); + } } - } - return 1; + return 1; } - return 0; - } + return 0; +} -// Automatic scroll -long MFXTextFieldIcon::onAutoScroll(FXObject*,FXSelector,void* ptr){ - register FXEvent* event=(FXEvent*)ptr; - if(flags&FLAG_PRESSED){ - register FXint newcursor=cursor; - register FXint ll=border+padleft; - register FXint rr=width-border-padright; - register FXint ww=rr-ll; - register FXint tw; +long +MFXTextFieldIcon::onAutoScroll(FXObject*, FXSelector, void* ptr) { + register FXEvent* event=(FXEvent*)ptr; + if (flags&FLAG_PRESSED) { + register FXint newcursor=cursor; + register FXint ll=border+padleft; + register FXint rr=width-border-padright; + register FXint ww=rr-ll; + register FXint tw; - if(options&TEXTFIELD_PASSWD) - tw=font->getTextWidth("*",1)*contents.count(); - else - tw=font->getTextWidth(contents.text(),contents.length()); + if (options&TEXTFIELD_PASSWD) + tw=font->getTextWidth("*", 1)*contents.count(); + else + tw=font->getTextWidth(contents.text(), contents.length()); + + // Text right-aligned + if (options&JUSTIFY_RIGHT) { + + // Scroll left + if (event->win_xww) { + shift+=ll-event->win_x; + if (ww>tw-shift) + shift=tw-ww; + else + getApp()->addTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + newcursor=index(ll); + } - // Text right-aligned - if(options&JUSTIFY_RIGHT){ + // Scroll right + if (rrwin_x) { + if (tw>ww) { + shift+=rr-event->win_x; + if (shift<=0) + shift=0; + else + getApp()->addTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + newcursor=index(rr); + } + } - // Scroll left - if(event->win_xww){ - shift+=ll-event->win_x; - if(ww>tw-shift) - shift=tw-ww; - else - getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - newcursor=index(ll); + // Text left-aligned + else if (options&JUSTIFY_LEFT) { + + // Scroll left + if (event->win_xww) { + shift+=ll-event->win_x; + if (shift>=0) + shift=0; + else + getApp()->addTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + newcursor=index(ll); } - // Scroll right - if(rrwin_x){ - if(tw>ww){ - shift+=rr-event->win_x; - if(shift<=0) - shift=0; - else - getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - newcursor=index(rr); + // Scroll right + if (rrwin_x) { + if (tw>ww) { + shift+=rr-event->win_x; + if (shift+twaddTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + newcursor=index(rr); + } + } else { + // Text centered, Scroll left + if (event->win_xww) { + shift+=ll-event->win_x; + if (shift>tw/2-ww/2) + shift=tw/2-ww/2; + else + getApp()->addTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + newcursor=index(ll); + } + // Scroll right + if (rrwin_x) { + if (tw>ww) { + shift+=rr-event->win_x; + if (shift<(ww-ww/2)-tw/2) + shift=(ww-ww/2)-tw/2; + else + getApp()->addTimeout(this, ID_AUTOSCROLL, getApp()->getScrollSpeed(), event); + } + newcursor=index(rr); + } + } + // Extend the selection + if (newcursor!=cursor) { + drawCursor(0); + cursor=newcursor; + extendSelection(cursor); } - } + } + return 1; +} - // Text left-aligned - else if(options&JUSTIFY_LEFT){ - // Scroll left - if(event->win_xww){ - shift+=ll-event->win_x; - if(shift>=0) - shift=0; - else - getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - newcursor=index(ll); - } +long +MFXTextFieldIcon::onCmdToggleOverstrike(FXObject*, FXSelector, void*) { + setOverstrike(!isOverstrike()); + return 1; +} - // Scroll right - if(rrwin_x){ - if(tw>ww){ - shift+=rr-event->win_x; - if(shift+twaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - newcursor=index(rr); - } - } - // Text centered - else{ +long +MFXTextFieldIcon::onUpdToggleOverstrike(FXObject* sender, FXSelector, void*) { + sender->handle(this, isOverstrike()?FXSEL(SEL_COMMAND, ID_CHECK):FXSEL(SEL_COMMAND, ID_UNCHECK), NULL); + sender->handle(this, FXSEL(SEL_COMMAND, ID_SHOW), NULL); + sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL); + return 1; +} - // Scroll left - if(event->win_xww){ - shift+=ll-event->win_x; - if(shift>tw/2-ww/2) - shift=tw/2-ww/2; - else - getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - newcursor=index(ll); - } - // Scroll right - if(rrwin_x){ - if(tw>ww){ - shift+=rr-event->win_x; - if(shift<(ww-ww/2)-tw/2) - shift=(ww-ww/2)-tw/2; - else - getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); - } - newcursor=index(rr); - } - } +long +MFXTextFieldIcon::onCmdToggleEditable(FXObject*, FXSelector, void*) { + setEditable(!isEditable()); + return 1; +} + + +long +MFXTextFieldIcon::onUpdToggleEditable(FXObject* sender, FXSelector, void*) { + sender->handle(this, isEditable()?FXSEL(SEL_COMMAND, ID_CHECK):FXSEL(SEL_COMMAND, ID_UNCHECK), NULL); + sender->handle(this, FXSEL(SEL_COMMAND, ID_SHOW), NULL); + sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL); + return 1; +} + + +long +MFXTextFieldIcon::onUpdHaveSelection(FXObject* sender, FXSelector, void* ptr) { + sender->handle(this, hasSelection()?FXSEL(SEL_COMMAND, ID_ENABLE):FXSEL(SEL_COMMAND, ID_DISABLE), ptr); + return 1; +} - // Extend the selection - if(newcursor!=cursor){ - drawCursor(0); - cursor=newcursor; - extendSelection(cursor); - } + +long +MFXTextFieldIcon::onUpdSelectAll(FXObject* sender, FXSelector, void* ptr) { + sender->handle(this, contents.empty()?FXSEL(SEL_COMMAND, ID_DISABLE):FXSEL(SEL_COMMAND, ID_ENABLE), ptr); + return 1; +} + + +void +MFXTextFieldIcon::setCursorPos(FXint pos) { + pos=contents.validate(FXCLAMP(0, pos, contents.length())); + if (cursor!=pos) { + drawCursor(0); + cursor=pos; + if (isEditable() && hasFocus()) + drawCursor(FLAG_CARET); + } +} + + +void +MFXTextFieldIcon::setAnchorPos(FXint pos) { + anchor=contents.validate(FXCLAMP(0, pos, contents.length())); +} + + +void +MFXTextFieldIcon::drawCursor(FXuint state) { + FXint cl, ch, xx, xlo, xhi; + if ((state^flags)&FLAG_CARET) { + if (xid) { + FXDCWindow dc(this); + FXASSERT(0<=cursor && cursor<=contents.length()); + FXASSERT(0<=anchor && anchor<=contents.length()); + xx=coord(cursor)-1; + + // Clip rectangle around cursor + xlo=FXMAX(xx-2, border); + xhi=FXMIN(xx+3, width-border); + + // Cursor can overhang padding but not borders + dc.setClipRectangle(xlo, border, xhi-xlo, height-(border<<1)); + + // Draw I beam + if (state&FLAG_CARET) { + // Draw I-beam + dc.setForeground(cursorColor); + dc.fillRectangle(xx, padtop+border, 1, height-padbottom-padtop-(border<<1)); + dc.fillRectangle(xx-2, padtop+border, 5, 1); + dc.fillRectangle(xx-2, height-border-padbottom-1, 5, 1); + } else { + // Erase I-beam, plus the text immediately surrounding it + dc.setForeground(backColor); + dc.fillRectangle(xx-2, border, 5, height-(border<<1)); + + // Draw two characters before and after cursor + cl=ch=cursor; + if (0getTextWidth("*", 1)*contents.count(); + else + tw=font->getTextWidth(contents.text(), contents.length()); -// Update overstrike toggle -long MFXTextFieldIcon::onUpdToggleOverstrike(FXObject* sender,FXSelector,void*){ - sender->handle(this,isOverstrike()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); - sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); - sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); - return 1; - } + // Constrain shift + if (options&JUSTIFY_RIGHT) { + if (ww>=tw) + shift=0; + else if (shift<0) + shift=0; + else if (shift>tw-ww) + shift=tw-ww; + } else if (options&JUSTIFY_LEFT) { + if (ww>=tw) + shift=0; + else if (shift>0) + shift=0; + else if (shift=tw) + shift=0; + else if (shift>tw/2-ww/2) + shift=tw/2-ww/2; + else if (shift<(ww-ww/2)-tw/2) + shift=(ww-ww/2)-tw/2; + } + // Keep cursor in the picture if resizing field + makePositionVisible(cursor); + // Always redraw + update(); -// Editable toggle -long MFXTextFieldIcon::onCmdToggleEditable(FXObject*,FXSelector,void*){ - setEditable(!isEditable()); - return 1; - } + flags&=~FLAG_DIRTY; +} -// Update editable toggle -long MFXTextFieldIcon::onUpdToggleEditable(FXObject* sender,FXSelector,void*){ - sender->handle(this,isEditable()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); - sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); - sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); - return 1; - } +void +MFXTextFieldIcon::makePositionVisible(FXint pos) { + register FXint rr=width-border-padright; + register FXint ll=border+padleft; + register FXint ww=rr-ll; + register FXint oldshift=shift; + register FXint xx; + if (!xid) return; + pos=contents.validate(FXCLAMP(0, pos, contents.length())); + if (options&JUSTIFY_RIGHT) { + if (options&TEXTFIELD_PASSWD) + xx=font->getTextWidth("*", 1)*contents.count(pos, contents.length()); + else + xx=font->getTextWidth(&contents[pos], contents.length()-pos); + if (shift-xx>0) + shift=xx; + else if (shift-xx<-ww) + shift=xx-ww; + } else if (options&JUSTIFY_LEFT) { + if (options&TEXTFIELD_PASSWD) + xx=font->getTextWidth("*", 1)*contents.index(pos); + else + xx=font->getTextWidth(contents.text(), pos); + if (shift+xx<0) + shift=-xx; + else if (shift+xx>=ww) + shift=ww-xx; + } else { + if (options&TEXTFIELD_PASSWD) + xx=font->getTextWidth("*", 1)*contents.index(pos)-(font->getTextWidth("*", 1)*contents.count())/2; + else + xx=font->getTextWidth(contents.text(), pos)-font->getTextWidth(contents.text(), contents.length())/2; + if (shift+ww/2+xx<0) + shift=-ww/2-xx; + else if (shift+ww/2+xx>=ww) + shift=ww-ww/2-xx; + } + if (shift!=oldshift) { + update(border, border, width-(border<<1), height-(border<<1)); + } +} -// Update somebody who works on the selection -long MFXTextFieldIcon::onUpdHaveSelection(FXObject* sender,FXSelector,void* ptr){ - sender->handle(this,hasSelection()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),ptr); - return 1; - } +FXint +MFXTextFieldIcon::index(FXint x) const { + register FXint rr=width-border-padright; + register FXint ll=border+padleft; + register FXint mm=(ll+rr)/2; + register FXint pos, xx, cw; + if (options&TEXTFIELD_PASSWD) { + cw=font->getTextWidth("*", 1); + if (options&JUSTIFY_RIGHT) + xx=rr-cw*contents.count(); + else if (options&JUSTIFY_LEFT) + xx=ll; + else + xx=mm-(cw*contents.count())/2; + xx+=shift; + pos=contents.offset((x-xx+(cw>>1))/cw); + } else { + if (options&JUSTIFY_RIGHT) + xx=rr-font->getTextWidth(contents.text(), contents.length()); + else if (options&JUSTIFY_LEFT) + xx=ll; + else + xx=mm-font->getTextWidth(contents.text(), contents.length())/2; + xx+=shift; + for (pos=0; posgetTextWidth(&contents[pos], contents.extent(pos)); + if (x<(xx+(cw>>1))) break; + xx+=cw; + } + } + if (pos<0) + pos=0; + if (pos>contents.length()) + pos=contents.length(); + return pos; +} -// Update somebody who works on the selection -long MFXTextFieldIcon::onUpdSelectAll(FXObject* sender,FXSelector,void* ptr){ - sender->handle(this,contents.empty()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),ptr); - return 1; - } +FXint +MFXTextFieldIcon::coord(FXint i) const { + register FXint rr=width-border-padright; + register FXint ll=border+padleft; + register FXint mm=(ll+rr)/2; + register FXint pos; + FXASSERT(0<=i && i<=contents.length()); + if (options&JUSTIFY_RIGHT) { + if (options&TEXTFIELD_PASSWD) { + pos=rr-font->getTextWidth("*", 1)*(contents.count()-contents.index(i)); + } else { + pos=rr-font->getTextWidth(&contents[i], contents.length()-i); + } + } else if (options&JUSTIFY_LEFT) { + if (options&TEXTFIELD_PASSWD) { + pos=ll+font->getTextWidth("*", 1)*contents.index(i); + } else { + pos=ll+font->getTextWidth(contents.text(), i); + } + } else { + if (options&TEXTFIELD_PASSWD) { + pos=mm+font->getTextWidth("*", 1)*contents.index(i)-(font->getTextWidth("*", 1)*contents.count())/2; + } else { + pos=mm+font->getTextWidth(contents.text(), i)-font->getTextWidth(contents.text(), contents.length())/2; + } + } + return pos+shift; +} -// Move the cursor to new valid position -void MFXTextFieldIcon::setCursorPos(FXint pos){ - pos=contents.validate(FXCLAMP(0,pos,contents.length())); - if(cursor!=pos){ - drawCursor(0); - cursor=pos; - if(isEditable() && hasFocus()) drawCursor(FLAG_CARET); +FXbool +MFXTextFieldIcon::isPosVisible(FXint pos) const { + if (0<=pos && pos<=contents.length()) { + register FXint x=coord(contents.validate(pos)); + return border+padleft<=x && x<=width-border-padright; } - } + return FALSE; +} -// Set anchor position to valid position -void MFXTextFieldIcon::setAnchorPos(FXint pos){ - anchor=contents.validate(FXCLAMP(0,pos,contents.length())); - } +FXbool +MFXTextFieldIcon::isPosSelected(FXint pos) const { + return hasSelection() && FXMIN(anchor, cursor)<=pos && pos<=FXMAX(anchor, cursor); +} -// Draw the cursor; need to draw 2 characters around the cursor -// due to possible overhanging in certain fonts. Also, need to -// completely erase and redraw because of ClearType. -// Kudos to Bill Baxter for help with this code. -void MFXTextFieldIcon::drawCursor(FXuint state){ - FXint cl,ch,xx,xlo,xhi; - if((state^flags)&FLAG_CARET){ - if(xid){ - FXDCWindow dc(this); - FXASSERT(0<=cursor && cursor<=contents.length()); - FXASSERT(0<=anchor && anchor<=contents.length()); - xx=coord(cursor)-1; +void +MFXTextFieldIcon::drawTextFragment(FXDCWindow& dc, FXint x, FXint y, FXint fm, FXint to) { + x+=font->getTextWidth(contents.text(), fm); + y+=font->getFontAscent(); + dc.drawText(x, y, &contents[fm], to-fm); +} - // Clip rectangle around cursor - xlo=FXMAX(xx-2,border); - xhi=FXMIN(xx+3,width-border); - // Cursor can overhang padding but not borders - dc.setClipRectangle(xlo,border,xhi-xlo,height-(border<<1)); +void +MFXTextFieldIcon::drawPWDTextFragment(FXDCWindow& dc, FXint x, FXint y, FXint fm, FXint to) { + register FXint cw=font->getTextWidth("*", 1); + register FXint i; + y+=font->getFontAscent(); + x+=cw*contents.index(fm); + for (i=fm; igetTextWidth("*",1)*contents.count(); - else - tw=font->getTextWidth(contents.text(),contents.length()); - - // Constrain shift - if(options&JUSTIFY_RIGHT){ - if(ww>=tw) shift=0; - else if(shift<0) shift=0; - else if(shift>tw-ww) shift=tw-ww; - } - else if(options&JUSTIFY_LEFT){ - if(ww>=tw) shift=0; - else if(shift>0) shift=0; - else if(shift=tw) shift=0; - else if(shift>tw/2-ww/2) shift=tw/2-ww/2; - else if(shift<(ww-ww/2)-tw/2) shift=(ww-ww/2)-tw/2; - } - - // Keep cursor in the picture if resizing field - makePositionVisible(cursor); - - // Always redraw - update(); - - flags&=~FLAG_DIRTY; - } - - -// Force position to become fully visible; we assume layout is correct -void MFXTextFieldIcon::makePositionVisible(FXint pos){ - register FXint rr=width-border-padright; - register FXint ll=border+padleft; - register FXint ww=rr-ll; - register FXint oldshift=shift; - register FXint xx; - if(!xid) return; - pos=contents.validate(FXCLAMP(0,pos,contents.length())); - if(options&JUSTIFY_RIGHT){ - if(options&TEXTFIELD_PASSWD) - xx=font->getTextWidth("*",1)*contents.count(pos,contents.length()); - else - xx=font->getTextWidth(&contents[pos],contents.length()-pos); - if(shift-xx>0) shift=xx; - else if(shift-xx<-ww) shift=xx-ww; + dc.setFont(font); + + // Text color + dc.setForeground(textColor); + + // Height + hh=font->getFontHeight(); + + // Text sticks to top of field + if (options&JUSTIFY_TOP) { + yy=padtop+border; + } else if (options&JUSTIFY_BOTTOM) { + // Text sticks to bottom of field + yy=height-padbottom-border-hh; + } else { + // Text centered in y + yy=border+padtop+(height-padbottom-padtop-(border<<1)-hh)/2; } - else if(options&JUSTIFY_LEFT){ - if(options&TEXTFIELD_PASSWD) - xx=font->getTextWidth("*",1)*contents.index(pos); - else - xx=font->getTextWidth(contents.text(),pos); - if(shift+xx<0) shift=-xx; - else if(shift+xx>=ww) shift=ww-xx; + + if (anchorgetTextWidth("*",1)*contents.index(pos)-(font->getTextWidth("*",1)*contents.count())/2; - else - xx=font->getTextWidth(contents.text(),pos)-font->getTextWidth(contents.text(),contents.length())/2; - if(shift+ww/2+xx<0) shift=-ww/2-xx; - else if(shift+ww/2+xx>=ww) shift=ww-ww/2-xx; - } - if(shift!=oldshift){ - update(border,border,width-(border<<1),height-(border<<1)); - } - } - - -// Find index from coord -FXint MFXTextFieldIcon::index(FXint x) const { - register FXint rr=width-border-padright; - register FXint ll=border+padleft; - register FXint mm=(ll+rr)/2; - register FXint pos,xx,cw; - if(options&TEXTFIELD_PASSWD){ - cw=font->getTextWidth("*",1); - if(options&JUSTIFY_RIGHT) xx=rr-cw*contents.count(); - else if(options&JUSTIFY_LEFT) xx=ll; - else xx=mm-(cw*contents.count())/2; - xx+=shift; - pos=contents.offset((x-xx+(cw>>1))/cw); - } - else{ - if(options&JUSTIFY_RIGHT) xx=rr-font->getTextWidth(contents.text(),contents.length()); - else if(options&JUSTIFY_LEFT) xx=ll; - else xx=mm-font->getTextWidth(contents.text(),contents.length())/2; - xx+=shift; - for(pos=0; posgetTextWidth(&contents[pos],contents.extent(pos)); - if(x<(xx+(cw>>1))) break; - xx+=cw; - } - } - if(pos<0) pos=0; - if(pos>contents.length()) pos=contents.length(); - return pos; - } - - -// Find coordinate from index -FXint MFXTextFieldIcon::coord(FXint i) const { - register FXint rr=width-border-padright; - register FXint ll=border+padleft; - register FXint mm=(ll+rr)/2; - register FXint pos; - FXASSERT(0<=i && i<=contents.length()); - if(options&JUSTIFY_RIGHT){ - if(options&TEXTFIELD_PASSWD){ - pos=rr-font->getTextWidth("*",1)*(contents.count()-contents.index(i)); - } - else{ - pos=rr-font->getTextWidth(&contents[i],contents.length()-i); - } - } - else if(options&JUSTIFY_LEFT){ - if(options&TEXTFIELD_PASSWD){ - pos=ll+font->getTextWidth("*",1)*contents.index(i); - } - else{ - pos=ll+font->getTextWidth(contents.text(),i); - } - } - else{ - if(options&TEXTFIELD_PASSWD){ - pos=mm+font->getTextWidth("*",1)*contents.index(i)-(font->getTextWidth("*",1)*contents.count())/2; - } - else{ - pos=mm+font->getTextWidth(contents.text(),i)-font->getTextWidth(contents.text(),contents.length())/2; - } - } - return pos+shift; - } - - -// Return TRUE if position is visible -FXbool MFXTextFieldIcon::isPosVisible(FXint pos) const { - if(0<=pos && pos<=contents.length()){ - register FXint x=coord(contents.validate(pos)); - return border+padleft<=x && x<=width-border-padright; - } - return FALSE; - } - - -// Return TRUE if position pos is selected -FXbool MFXTextFieldIcon::isPosSelected(FXint pos) const { - return hasSelection() && FXMIN(anchor,cursor)<=pos && pos<=FXMAX(anchor,cursor); - } - - -// Draw text fragment -void MFXTextFieldIcon::drawTextFragment(FXDCWindow& dc,FXint x,FXint y,FXint fm,FXint to){ - x+=font->getTextWidth(contents.text(),fm); - y+=font->getFontAscent(); - dc.drawText(x,y,&contents[fm],to-fm); - } - - -// Draw text fragment in password mode -void MFXTextFieldIcon::drawPWDTextFragment(FXDCWindow& dc,FXint x,FXint y,FXint fm,FXint to){ - register FXint cw=font->getTextWidth("*",1); - register FXint i; - y+=font->getFontAscent(); - x+=cw*contents.index(fm); - for(i=fm; igetTextWidth("*", 1); + ww=cw*contents.count(); -// Draw range of text -void MFXTextFieldIcon::drawTextRange(FXDCWindow& dc,FXint fm,FXint to){ - register FXint sx,ex,xx,yy,cw,hh,ww,si,ei,lx,rx,t; - register FXint rr=width-border-padright; - register FXint ll=border+padleft; - register FXint mm=(ll+rr)/2; - - if(to<=fm) return; - - dc.setFont(font); - - // Text color - dc.setForeground(textColor); - - // Height - hh=font->getFontHeight(); - - // Text sticks to top of field - if(options&JUSTIFY_TOP){ - yy=padtop+border; - } - - // Text sticks to bottom of field - else if(options&JUSTIFY_BOTTOM){ - yy=height-padbottom-border-hh; - } - - // Text centered in y - else{ - yy=border+padtop+(height-padbottom-padtop-(border<<1)-hh)/2; - } - - if(anchorgetTextWidth("*",1); - ww=cw*contents.count(); - - // Text sticks to right of field - if(options&JUSTIFY_RIGHT){ - xx=shift+rr-ww; - } - - // Text sticks on left of field - else if(options&JUSTIFY_LEFT){ - xx=shift+ll; - } - - // Text centered in field - else{ - xx=shift+mm-ww/2; - } - - // Reduce to avoid drawing excessive amounts of text - lx=xx+cw*contents.index(fm); - rx=xx+cw*contents.index(to); - while(fm=0) break; - lx+=cw; - fm=contents.inc(fm); - } - while(fmto) ei=to; - - // Nothing selected - if(!hasSelection() || to<=si || ei<=fm){ - drawPWDTextFragment(dc,xx,yy,fm,to); - } - - // Stuff selected - else{ - if(fm=0) break; + lx+=cw; + fm=contents.inc(fm); } - if(sigetTextWidth(contents.text(),contents.length()); - - // Text sticks to right of field - if(options&JUSTIFY_RIGHT){ - xx=shift+rr-ww; - } - - // Text sticks on left of field - else if(options&JUSTIFY_LEFT){ - xx=shift+ll; - } - - // Text centered in field - else{ - xx=shift+mm-ww/2; - } - - // Reduce to avoid drawing excessive amounts of text - lx=xx+font->getTextWidth(&contents[0],fm); - rx=lx+font->getTextWidth(&contents[fm],to-fm); - while(fmgetTextWidth(&contents[fm],t-fm); - if(lx+cw>=0) break; - lx+=cw; - fm=t; - } - while(fmgetTextWidth(&contents[t],to-t); - if(rx-cwto) ei=to; - - // Nothing selected - if(!hasSelection() || to<=si || ei<=fm){ - drawTextFragment(dc,xx,yy,fm,to); - } - - // Stuff selected - else{ - if(fmto) ei=to; + + // Nothing selected + if (!hasSelection() || to<=si || ei<=fm) { + drawPWDTextFragment(dc, xx, yy, fm, to); + } else { + // Stuff selected + if (fmgetTextWidth(contents.text(), contents.length()); + + // Text sticks to right of field + if (options&JUSTIFY_RIGHT) { + xx=shift+rr-ww; + } else if (options&JUSTIFY_LEFT) { + // Text sticks on left of field + xx=shift+ll; + } else { + // Text centered in field + xx=shift+mm-ww/2; } - if(eigetTextWidth(&contents[0], fm); + rx=lx+font->getTextWidth(&contents[fm], to-fm); + while(fmgetTextWidth(&contents[fm], t-fm); + if (lx+cw>=0) break; + lx+=cw; + fm=t; } - else{ - ei=to; + while(fmgetTextWidth(&contents[t], to-t); + if (rx-cwgetTextWidth(contents.text(),si); - ex=xx+font->getTextWidth(contents.text(),ei); - if(hasFocus()){ - dc.setForeground(selbackColor); - dc.fillRectangle(sx,padtop+border,ex-sx,height-padtop-padbottom-(border<<1)); - dc.setForeground(seltextColor); - drawTextFragment(dc,xx,yy,si,ei); - } - else{ - dc.setForeground(baseColor); - dc.fillRectangle(sx,padtop+border,ex-sx,height-padtop-padbottom-(border<<1)); - dc.setForeground(textColor); - drawTextFragment(dc,xx,yy,si,ei); - } + + // Adjust selected range + if (sito) ei=to; + + // Nothing selected + if (!hasSelection() || to<=si || ei<=fm) { + drawTextFragment(dc, xx, yy, fm, to); + } else { + // Stuff selected + if (fmgetTextWidth(contents.text(), si); + ex=xx+font->getTextWidth(contents.text(), ei); + if (hasFocus()) { + dc.setForeground(selbackColor); + dc.fillRectangle(sx, padtop+border, ex-sx, height-padtop-padbottom-(border<<1)); + dc.setForeground(seltextColor); + drawTextFragment(dc, xx, yy, si, ei); + } else { + dc.setForeground(baseColor); + dc.fillRectangle(sx, padtop+border, ex-sx, height-padtop-padbottom-(border<<1)); + dc.setForeground(textColor); + drawTextFragment(dc, xx, yy, si, ei); + } + } } - } } - } +} -// Handle repaint -long MFXTextFieldIcon::onPaint(FXObject*,FXSelector,void* ptr){ - FXEvent *ev=(FXEvent*)ptr; - FXDCWindow dc(this,ev); +long +MFXTextFieldIcon::onPaint(FXObject*, FXSelector, void* ptr) { + FXEvent *ev=(FXEvent*)ptr; + FXDCWindow dc(this, ev); - // Draw frame - drawFrame(dc,0,0,width,height); + // Draw frame + drawFrame(dc, 0, 0, width, height); - // Gray background if disabled - if(isEnabled()) - dc.setForeground(backColor); - else - dc.setForeground(baseColor); + // Gray background if disabled + if (isEnabled()) + dc.setForeground(backColor); + else + dc.setForeground(baseColor); - // Draw background - dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); + // Draw background + dc.fillRectangle(border, border, width-(border<<1), height-(border<<1)); - // Draw text, clipped against frame interior - dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1)); - drawTextRange(dc,0,contents.length()); + // Draw text, clipped against frame interior + dc.setClipRectangle(border, border, width-(border<<1), height-(border<<1)); + drawTextRange(dc, 0, contents.length()); - // Draw caret - if(flags&FLAG_CARET){ - int xx=coord(cursor)-1; - dc.setForeground(cursorColor); - dc.fillRectangle(xx,padtop+border,1,height-padbottom-padtop-(border<<1)); - dc.fillRectangle(xx-2,padtop+border,5,1); - dc.fillRectangle(xx-2,height-border-padbottom-1,5,1); + // Draw caret + if (flags&FLAG_CARET) { + int xx=coord(cursor)-1; + dc.setForeground(cursorColor); + dc.fillRectangle(xx, padtop+border, 1, height-padbottom-padtop-(border<<1)); + dc.fillRectangle(xx-2, padtop+border, 5, 1); + dc.fillRectangle(xx-2, height-border-padbottom-1, 5, 1); } - return 1; - } + return 1; +} -// Move cursor to begin of line -long MFXTextFieldIcon::onCmdCursorHome(FXObject*,FXSelector,void*){ - setCursorPos(0); - makePositionVisible(0); - return 1; - } +long +MFXTextFieldIcon::onCmdCursorHome(FXObject*, FXSelector, void*) { + setCursorPos(0); + makePositionVisible(0); + return 1; +} -// Move cursor to end of line -long MFXTextFieldIcon::onCmdCursorEnd(FXObject*,FXSelector,void*){ - setCursorPos(contents.length()); - makePositionVisible(cursor); - return 1; - } +long +MFXTextFieldIcon::onCmdCursorEnd(FXObject*, FXSelector, void*) { + setCursorPos(contents.length()); + makePositionVisible(cursor); + return 1; +} + +long +MFXTextFieldIcon::onCmdCursorRight(FXObject*, FXSelector, void*) { + setCursorPos(contents.inc(cursor)); + makePositionVisible(cursor); + return 1; +} -// Move cursor right -long MFXTextFieldIcon::onCmdCursorRight(FXObject*,FXSelector,void*){ - setCursorPos(contents.inc(cursor)); - makePositionVisible(cursor); - return 1; - } -// Move cursor left -long MFXTextFieldIcon::onCmdCursorLeft(FXObject*,FXSelector,void*){ - setCursorPos(contents.dec(cursor)); - makePositionVisible(cursor); - return 1; - } +long +MFXTextFieldIcon::onCmdCursorLeft(FXObject*, FXSelector, void*) { + setCursorPos(contents.dec(cursor)); + makePositionVisible(cursor); + return 1; +} -// Check if w is delimiter -static FXbool isdelimiter(const FXchar *delimiters,FXwchar w){ - return w<128 && strchr(delimiters,w); // FIXME for w>=128 - } +static FXbool +isdelimiter(const FXchar *delimiters, FXwchar w) { + return w<128 && strchr(delimiters, w); // FIXME for w>=128 +} -// Find end of previous word -FXint MFXTextFieldIcon::leftWord(FXint pos) const { - register FXint pp=pos,p; +FXint +MFXTextFieldIcon::leftWord(FXint pos) const { + register FXint pp=pos, p; - // Ensure input is valid - FXASSERT(0<=pos && pos<=contents.length()); + // Ensure input is valid + FXASSERT(0<=pos && pos<=contents.length()); - // Back up until space or delimiter - while(0<=(p=contents.dec(pp)) && !Unicode::isSpace(contents.wc(p)) && !isdelimiter(delimiters,contents.wc(p))) pp=p; + // Back up until space or delimiter + while(0<=(p=contents.dec(pp)) && !Unicode::isSpace(contents.wc(p)) && !isdelimiter(delimiters, contents.wc(p))) pp=p; - // Back up over run of spaces - while(0<=(p=contents.dec(pp)) && Unicode::isSpace(contents.wc(p))) pp=p; + // Back up over run of spaces + while(0<=(p=contents.dec(pp)) && Unicode::isSpace(contents.wc(p))) pp=p; - // One more in case we didn't move - if((pos==pp) && 0<=(p=contents.dec(pp))) pp=p; + // One more in case we didn't move + if ((pos==pp) && 0<=(p=contents.dec(pp))) pp=p; - return pp; - } + return pp; +} -// Find begin of next word -FXint MFXTextFieldIcon::rightWord(FXint pos) const { - register FXint pp=pos; +FXint +MFXTextFieldIcon::rightWord(FXint pos) const { + register FXint pp=pos; - // Ensure input is valid - FXASSERT(0<=pos && pos<=contents.length()); + // Ensure input is valid + FXASSERT(0<=pos && pos<=contents.length()); - // Advance until space or delimiter - while(ppbeep(); + } + return 1; +} + + +long +MFXTextFieldIcon::onCmdCopySel(FXObject*, FXSelector, void*) { + if (hasSelection()) { + FXDragType types[4]; + types[0]=stringType; + types[1]=textType; + types[2]=utf8Type; + types[3]=utf16Type; + if (acquireClipboard(types, 4)) { + if (anchorbeep(); } - else{ - getApp()->beep(); - } - return 1; - } + return 1; +} -// Copy onto cliboard -long MFXTextFieldIcon::onCmdCopySel(FXObject*,FXSelector,void*){ - if(hasSelection()){ - FXDragType types[4]; - types[0]=stringType; - types[1]=textType; - types[2]=utf8Type; - types[3]=utf16Type; - if(acquireClipboard(types,4)){ - if(anchorbeep(); - } - return 1; - } - - -// Paste primary selection -long MFXTextFieldIcon::onCmdPasteMiddle(FXObject*,FXSelector,void*){ - if(isEditable()){ - FXString string; + // First, try UTF-8 + if (getDNDData(FROM_SELECTION, utf8Type, string)) { + FXTRACE((100, "Paste UTF8\n")); + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_INSERT_STRING), (void*)string.text()); + return 1; + } - // First, try UTF-8 - if(getDNDData(FROM_SELECTION,utf8Type,string)){ - FXTRACE((100,"Paste UTF8\n")); - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_INSERT_STRING),(void*)string.text()); - return 1; - } - - // Next, try UTF-16 - if(getDNDData(FROM_SELECTION,utf16Type,string)){ - FXUTF16LECodec unicode; // FIXME maybe other endianness for unix - FXTRACE((100,"Paste UTF16\n")); - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_INSERT_STRING),(void*)unicode.mb2utf(string).text()); - return 1; - } - - // Finally, try good old 8859-1 - if(getDNDData(FROM_SELECTION,stringType,string)){ - FX88591Codec ascii; - FXTRACE((100,"Paste ASCII\n")); - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_INSERT_STRING),(void*)ascii.mb2utf(string).text()); - return 1; - } - } - else{ - getApp()->beep(); - } - return 1; - } - - -// Delete selection -long MFXTextFieldIcon::onCmdDeleteSel(FXObject*,FXSelector,void*){ - if(isEditable()){ - if(!hasSelection()) return 1; - FXint st=FXMIN(anchor,cursor); - FXint en=FXMAX(anchor,cursor); - setCursorPos(st); - setAnchorPos(st); - contents.erase(st,en-st); - layout(); - makePositionVisible(st); - killSelection(); - flags|=FLAG_CHANGED; - if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} + // Next, try UTF-16 + if (getDNDData(FROM_SELECTION, utf16Type, string)) { + FXUTF16LECodec unicode; // FIXME maybe other endianness for unix + FXTRACE((100, "Paste UTF16\n")); + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_INSERT_STRING), (void*)unicode.mb2utf(string).text()); + return 1; + } + + // Finally, try good old 8859-1 + if (getDNDData(FROM_SELECTION, stringType, string)) { + FX88591Codec ascii; + FXTRACE((100, "Paste ASCII\n")); + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_INSERT_STRING), (void*)ascii.mb2utf(string).text()); + return 1; + } + } else { + getApp()->beep(); } - else{ - getApp()->beep(); + return 1; +} + + +long +MFXTextFieldIcon::onCmdDeleteSel(FXObject*, FXSelector, void*) { + if (isEditable()) { + if (!hasSelection()) return 1; + FXint st=FXMIN(anchor, cursor); + FXint en=FXMAX(anchor, cursor); + setCursorPos(st); + setAnchorPos(st); + contents.erase(st, en-st); + layout(); + makePositionVisible(st); + killSelection(); + flags|=FLAG_CHANGED; + if (target) { + target->tryHandle(this, FXSEL(SEL_CHANGED, message), (void*)contents.text()); + } + } else { + getApp()->beep(); } - return 1; - } + return 1; +} -// Delete all text -long MFXTextFieldIcon::onCmdDeleteAll(FXObject*,FXSelector,void*){ - if(isEditable()){ - setCursorPos(0); - setAnchorPos(0); - contents.clear(); - layout(); - makePositionVisible(0); - killSelection(); - flags|=FLAG_CHANGED; - if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} - } - else{ - getApp()->beep(); - } - return 1; - } - - -// Overstrike string -long MFXTextFieldIcon::onCmdOverstString(FXObject*,FXSelector,void* ptr){ - if(isEditable()){ - FXString tentative=contents; - FXint len=strlen((FXchar*)ptr); - FXint reppos=cursor; - FXint replen=len; - if(hasSelection()){ - reppos=FXMIN(anchor,cursor); - replen=FXMAX(anchor,cursor)-reppos; - } - tentative.replace(reppos,replen,(FXchar*)ptr,len); - if(handle(this,FXSEL(SEL_VERIFY,0),(void*)tentative.text())){ getApp()->beep(); return 1; } - setCursorPos(reppos); - setAnchorPos(reppos); - contents=tentative; - layout(); - setCursorPos(reppos+len); - setAnchorPos(reppos+len); - makePositionVisible(reppos+len); - killSelection(); - update(border,border,width-(border<<1),height-(border<<1)); - flags|=FLAG_CHANGED; - if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} - } - else{ - getApp()->beep(); - } - return 1; - } - - -// Insert a string -long MFXTextFieldIcon::onCmdInsertString(FXObject*,FXSelector,void* ptr){ - if(isEditable()){ - FXString tentative=contents; - FXint len=strlen((FXchar*)ptr); - FXint reppos=cursor; - FXint replen=0; - if(hasSelection()){ - reppos=FXMIN(anchor,cursor); - replen=FXMAX(anchor,cursor)-reppos; - } - tentative.replace(reppos,replen,(FXchar*)ptr,len); - if(handle(this,FXSEL(SEL_VERIFY,0),(void*)tentative.text())){ getApp()->beep(); return 1; } - setCursorPos(reppos); - setAnchorPos(reppos); - contents=tentative; - layout(); - setCursorPos(reppos+len); - setAnchorPos(reppos+len); - makePositionVisible(reppos+len); - killSelection(); - update(border,border,width-(border<<1),height-(border<<1)); - flags|=FLAG_CHANGED; - if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} +long +MFXTextFieldIcon::onCmdDeleteAll(FXObject*, FXSelector, void*) { + if (isEditable()) { + setCursorPos(0); + setAnchorPos(0); + contents.clear(); + layout(); + makePositionVisible(0); + killSelection(); + flags|=FLAG_CHANGED; + if (target) { + target->tryHandle(this, FXSEL(SEL_CHANGED, message), (void*)contents.text()); + } + } else { + getApp()->beep(); + } + return 1; +} + + +long +MFXTextFieldIcon::onCmdOverstString(FXObject*, FXSelector, void* ptr) { + if (isEditable()) { + FXString tentative=contents; + FXint len=strlen((FXchar*)ptr); + FXint reppos=cursor; + FXint replen=len; + if (hasSelection()) { + reppos=FXMIN(anchor, cursor); + replen=FXMAX(anchor, cursor)-reppos; + } + tentative.replace(reppos, replen, (FXchar*)ptr, len); + if (handle(this, FXSEL(SEL_VERIFY, 0), (void*)tentative.text())) { + getApp()->beep(); + return 1; + } + setCursorPos(reppos); + setAnchorPos(reppos); + contents=tentative; + layout(); + setCursorPos(reppos+len); + setAnchorPos(reppos+len); + makePositionVisible(reppos+len); + killSelection(); + update(border, border, width-(border<<1), height-(border<<1)); + flags|=FLAG_CHANGED; + if (target) { + target->tryHandle(this, FXSEL(SEL_CHANGED, message), (void*)contents.text()); + } + } else { + getApp()->beep(); } - else{ - getApp()->beep(); + return 1; +} + + +long +MFXTextFieldIcon::onCmdInsertString(FXObject*, FXSelector, void* ptr) { + if (isEditable()) { + FXString tentative=contents; + FXint len=strlen((FXchar*)ptr); + FXint reppos=cursor; + FXint replen=0; + if (hasSelection()) { + reppos=FXMIN(anchor, cursor); + replen=FXMAX(anchor, cursor)-reppos; + } + tentative.replace(reppos, replen, (FXchar*)ptr, len); + if (handle(this, FXSEL(SEL_VERIFY, 0), (void*)tentative.text())) { + getApp()->beep(); + return 1; + } + setCursorPos(reppos); + setAnchorPos(reppos); + contents=tentative; + layout(); + setCursorPos(reppos+len); + setAnchorPos(reppos+len); + makePositionVisible(reppos+len); + killSelection(); + update(border, border, width-(border<<1), height-(border<<1)); + flags|=FLAG_CHANGED; + if (target) { + target->tryHandle(this, FXSEL(SEL_CHANGED, message), (void*)contents.text()); + } + } else { + getApp()->beep(); } - return 1; - } + return 1; +} -// Backspace character -long MFXTextFieldIcon::onCmdBackspace(FXObject*,FXSelector,void*){ - if(isEditable() && 0tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} + +long +MFXTextFieldIcon::onCmdBackspace(FXObject*, FXSelector, void*) { + if (isEditable() && 0tryHandle(this, FXSEL(SEL_CHANGED, message), (void*)contents.text()); + } + } else { + getApp()->beep(); + } + return 1; +} + + +long +MFXTextFieldIcon::onCmdDelete(FXObject*, FXSelector, void*) { + if (isEditable() && cursortryHandle(this, FXSEL(SEL_CHANGED, message), (void*)contents.text()); + } + } else { + getApp()->beep(); } - else{ - getApp()->beep(); + return 1; +} + + +long +MFXTextFieldIcon::onVerify(FXObject*, FXSelector, void* ptr) { + register FXchar *p=(FXchar*)ptr; + + // Limit number of columns + if (options&TEXTFIELD_LIMITED) { + if ((FXint)wcslen(p)>columns) return 1; + } + + // Integer input + if (options&TEXTFIELD_INTEGER) { + while(Ascii::isSpace(*p)) p++; + if (*p=='-' || *p=='+') p++; + while(Ascii::isDigit(*p)) p++; + while(Ascii::isSpace(*p)) p++; + if (*p!='\0') return 1; // Objection! + } + + // Real input + if (options&TEXTFIELD_REAL) { + while(Ascii::isSpace(*p)) p++; + if (*p=='-' || *p=='+') p++; + while(Ascii::isDigit(*p)) p++; + if (*p=='.') p++; + while(Ascii::isDigit(*p)) p++; + if (*p=='E' || *p=='e') { + p++; + if (*p=='-' || *p=='+') p++; + while(Ascii::isDigit(*p)) p++; + } + while(Ascii::isSpace(*p)) p++; + if (*p!='\0') return 1; // Objection! } - return 1; - } + // Target has chance to object to the proposed change + if (target && target->tryHandle(this, FXSEL(SEL_VERIFY, message), ptr)) return 1; -// Delete character -long MFXTextFieldIcon::onCmdDelete(FXObject*,FXSelector,void*){ - if(isEditable() && cursortryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} - } - else{ - getApp()->beep(); - } - return 1; - } - - -// Verify tentative input. -long MFXTextFieldIcon::onVerify(FXObject*,FXSelector,void* ptr){ - register FXchar *p=(FXchar*)ptr; - - // Limit number of columns - if(options&TEXTFIELD_LIMITED){ - if((FXint)wcslen(p)>columns) return 1; - } - - // Integer input - if(options&TEXTFIELD_INTEGER){ - while(Ascii::isSpace(*p)) p++; - if(*p=='-' || *p=='+') p++; - while(Ascii::isDigit(*p)) p++; - while(Ascii::isSpace(*p)) p++; - if(*p!='\0') return 1; // Objection! - } - - // Real input - if(options&TEXTFIELD_REAL){ - while(Ascii::isSpace(*p)) p++; - if(*p=='-' || *p=='+') p++; - while(Ascii::isDigit(*p)) p++; - if(*p=='.') p++; - while(Ascii::isDigit(*p)) p++; - if(*p=='E' || *p=='e'){ - p++; - if(*p=='-' || *p=='+') p++; - while(Ascii::isDigit(*p)) p++; - } - while(Ascii::isSpace(*p)) p++; - if(*p!='\0') return 1; // Objection! - } - - // Target has chance to object to the proposed change - if(target && target->tryHandle(this,FXSEL(SEL_VERIFY,message),ptr)) return 1; - - // No objections have been raised! - return 0; - } - - -// Pressed a key -long MFXTextFieldIcon::onKeyPress(FXObject*,FXSelector,void* ptr){ - FXEvent* event=(FXEvent*)ptr; - flags&=~FLAG_TIP; - if(isEnabled()){ - FXTRACE((200,"%s::onKeyPress keysym=0x%04x state=%04x\n",getClassName(),event->code,event->state)); - if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; + // No objections have been raised! + return 0; +} + + +long +MFXTextFieldIcon::onKeyPress(FXObject*, FXSelector, void* ptr) { + FXEvent* event=(FXEvent*)ptr; + flags&=~FLAG_TIP; + if (isEnabled()) { + FXTRACE((200, "%s::onKeyPress keysym=0x%04x state=%04x\n", getClassName(), event->code, event->state)); + if (target && target->tryHandle(this, FXSEL(SEL_KEYPRESS, message), ptr)) return 1; flags&=~FLAG_UPDATE; - switch(event->code){ - case KEY_Right: - case KEY_KP_Right: - if(!(event->state&SHIFTMASK)){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DESELECT_ALL),NULL); - } - if(event->state&CONTROLMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_RIGHT),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CURSOR_RIGHT),NULL); - } - if(event->state&SHIFTMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_EXTEND),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_MARK),NULL); - } - return 1; - case KEY_Left: - case KEY_KP_Left: - if(!(event->state&SHIFTMASK)){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DESELECT_ALL),NULL); - } - if(event->state&CONTROLMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_LEFT),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CURSOR_LEFT),NULL); - } - if(event->state&SHIFTMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_EXTEND),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_MARK),NULL); - } - return 1; - case KEY_Home: - case KEY_KP_Home: - if(!(event->state&SHIFTMASK)){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DESELECT_ALL),NULL); - } - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CURSOR_HOME),NULL); - if(event->state&SHIFTMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_EXTEND),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_MARK),NULL); - } - return 1; - case KEY_End: - case KEY_KP_End: - if(!(event->state&SHIFTMASK)){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DESELECT_ALL),NULL); - } - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CURSOR_END),NULL); - if(event->state&SHIFTMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_EXTEND),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_MARK),NULL); - } - return 1; - case KEY_Insert: - case KEY_KP_Insert: - if(event->state&CONTROLMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_COPY_SEL),NULL); - return 1; - } - else if(event->state&SHIFTMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_PASTE_SEL),NULL); - return 1; - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_TOGGLE_OVERSTRIKE),NULL); - } - return 1; - case KEY_Delete: - case KEY_KP_Delete: - if(hasSelection()){ - if(event->state&SHIFTMASK){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CUT_SEL),NULL); + switch(event->code) { + case KEY_Right: + case KEY_KP_Right: + if (!(event->state&SHIFTMASK)) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DESELECT_ALL), NULL); } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DELETE_SEL),NULL); + if (event->state&CONTROLMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CURSOR_WORD_RIGHT), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CURSOR_RIGHT), NULL); } - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DELETE),NULL); - } - return 1; - case KEY_BackSpace: - if(hasSelection()){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_DELETE_SEL),NULL); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_BACKSPACE),NULL); - } - return 1; - case KEY_Return: - case KEY_KP_Enter: - if(isEditable()){ - flags|=FLAG_UPDATE; - flags&=~FLAG_CHANGED; - if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)contents.text()); - } - else{ - getApp()->beep(); - } - return 1; - case KEY_a: - if(!(event->state&CONTROLMASK)) goto ins; - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_SELECT_ALL),NULL); - return 1; - case KEY_x: - if(!(event->state&CONTROLMASK)) goto ins; - case KEY_F20: // Sun Cut key - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_CUT_SEL),NULL); - return 1; - case KEY_c: - if(!(event->state&CONTROLMASK)) goto ins; - case KEY_F16: // Sun Copy key - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_COPY_SEL),NULL); - return 1; - case KEY_v: - if(!(event->state&CONTROLMASK)) goto ins; - case KEY_F18: // Sun Paste key - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_PASTE_SEL),NULL); - return 1; - default: -ins: if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; - if(isOverstrike()){ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_OVERST_STRING),(void*)event->text.text()); - } - else{ - handle(this,FXSEL(SEL_COMMAND,FXTextField::ID_INSERT_STRING),(void*)event->text.text()); - } - return 1; - } - } - return 0; - } - - -// Key Release -long MFXTextFieldIcon::onKeyRelease(FXObject*,FXSelector,void* ptr){ - FXEvent* event=(FXEvent*)ptr; - if(isEnabled()){ - FXTRACE((200,"%s::onKeyRelease keysym=0x%04x state=%04x\n",getClassName(),((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); - if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; - switch(event->code){ - case KEY_Right: - case KEY_KP_Right: - case KEY_Left: - case KEY_KP_Left: - case KEY_Home: - case KEY_KP_Home: - case KEY_End: - case KEY_KP_End: - case KEY_Insert: - case KEY_KP_Insert: - case KEY_Delete: - case KEY_KP_Delete: - case KEY_BackSpace: - case KEY_Return: - case KEY_F20: // Sun Cut key - case KEY_F16: // Sun Copy key - case KEY_F18: // Sun Paste key - return 1; - case KEY_a: - case KEY_x: - case KEY_c: - case KEY_v: - if(event->state&CONTROLMASK) return 1; - default: - if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; - return 1; - } + if (event->state&SHIFTMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_EXTEND), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_MARK), NULL); + } + return 1; + case KEY_Left: + case KEY_KP_Left: + if (!(event->state&SHIFTMASK)) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DESELECT_ALL), NULL); + } + if (event->state&CONTROLMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CURSOR_WORD_LEFT), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CURSOR_LEFT), NULL); + } + if (event->state&SHIFTMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_EXTEND), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_MARK), NULL); + } + return 1; + case KEY_Home: + case KEY_KP_Home: + if (!(event->state&SHIFTMASK)) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DESELECT_ALL), NULL); + } + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CURSOR_HOME), NULL); + if (event->state&SHIFTMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_EXTEND), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_MARK), NULL); + } + return 1; + case KEY_End: + case KEY_KP_End: + if (!(event->state&SHIFTMASK)) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DESELECT_ALL), NULL); + } + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CURSOR_END), NULL); + if (event->state&SHIFTMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_EXTEND), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_MARK), NULL); + } + return 1; + case KEY_Insert: + case KEY_KP_Insert: + if (event->state&CONTROLMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_COPY_SEL), NULL); + } else if (event->state&SHIFTMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_PASTE_SEL), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_TOGGLE_OVERSTRIKE), NULL); + } + return 1; + case KEY_Delete: + case KEY_KP_Delete: + if (hasSelection()) { + if (event->state&SHIFTMASK) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CUT_SEL), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DELETE_SEL), NULL); + } + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DELETE), NULL); + } + return 1; + case KEY_BackSpace: + if (hasSelection()) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_DELETE_SEL), NULL); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_BACKSPACE), NULL); + } + return 1; + case KEY_Return: + case KEY_KP_Enter: + if (isEditable()) { + flags|=FLAG_UPDATE; + flags&=~FLAG_CHANGED; + if (target) target->tryHandle(this, FXSEL(SEL_COMMAND, message), (void*)contents.text()); + } else { + getApp()->beep(); + } + return 1; + case KEY_a: + if (!(event->state&CONTROLMASK)) goto ins; + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_SELECT_ALL), NULL); + return 1; + case KEY_x: + if (!(event->state&CONTROLMASK)) goto ins; + case KEY_F20: // Sun Cut key + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_CUT_SEL), NULL); + return 1; + case KEY_c: + if (!(event->state&CONTROLMASK)) goto ins; + case KEY_F16: // Sun Copy key + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_COPY_SEL), NULL); + return 1; + case KEY_v: + if (!(event->state&CONTROLMASK)) goto ins; + case KEY_F18: // Sun Paste key + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_PASTE_SEL), NULL); + return 1; + default: + ins: if ((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; + if (isOverstrike()) { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_OVERST_STRING), (void*)event->text.text()); + } else { + handle(this, FXSEL(SEL_COMMAND, FXTextField::ID_INSERT_STRING), (void*)event->text.text()); + } + return 1; + } } - return 0; - } + return 0; +} + + +long +MFXTextFieldIcon::onKeyRelease(FXObject*, FXSelector, void* ptr) { + FXEvent* event=(FXEvent*)ptr; + if (isEnabled()) { + FXTRACE((200, "%s::onKeyRelease keysym=0x%04x state=%04x\n", getClassName(), ((FXEvent*)ptr)->code, ((FXEvent*)ptr)->state)); + if (target && target->tryHandle(this, FXSEL(SEL_KEYRELEASE, message), ptr)) return 1; + switch(event->code) { + case KEY_Right: + case KEY_KP_Right: + case KEY_Left: + case KEY_KP_Left: + case KEY_Home: + case KEY_KP_Home: + case KEY_End: + case KEY_KP_End: + case KEY_Insert: + case KEY_KP_Insert: + case KEY_Delete: + case KEY_KP_Delete: + case KEY_BackSpace: + case KEY_Return: + case KEY_F20: // Sun Cut key + case KEY_F16: // Sun Copy key + case KEY_F18: // Sun Paste key + return 1; + case KEY_a: + case KEY_x: + case KEY_c: + case KEY_v: + if (event->state&CONTROLMASK) return 1; + default: + if ((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; + return 1; + } + } + return 0; +} -// Kill the selection -FXbool MFXTextFieldIcon::killSelection(){ - if(hasSelection()){ - releaseSelection(); - update(border,border,width-(border<<1),height-(border<<1)); - return TRUE; +FXbool +MFXTextFieldIcon::killSelection() { + if (hasSelection()) { + releaseSelection(); + update(border, border, width-(border<<1), height-(border<<1)); + return TRUE; } - return FALSE; - } + return FALSE; +} + + +FXbool +MFXTextFieldIcon::selectAll() { + setAnchorPos(0); + setCursorPos(contents.length()); + extendSelection(cursor); + return TRUE; +} + +FXbool +MFXTextFieldIcon::setSelection(FXint pos, FXint len) { + setAnchorPos(pos); + setCursorPos(pos+len); + extendSelection(cursor); + return TRUE; +} -// Select all text -FXbool MFXTextFieldIcon::selectAll(){ - setAnchorPos(0); - setCursorPos(contents.length()); - extendSelection(cursor); - return TRUE; - } +FXbool +MFXTextFieldIcon::extendSelection(FXint pos) { + FXDragType types[4]; -// Set selection -FXbool MFXTextFieldIcon::setSelection(FXint pos,FXint len){ - setAnchorPos(pos); - setCursorPos(pos+len); - extendSelection(cursor); - return TRUE; - } + // Validate position to start of character + pos=contents.validate(FXCLAMP(0, pos, contents.length())); + + // Got a selection at all? + if (anchor!=pos) { + types[0]=stringType; + types[1]=textType; + types[2]=utf8Type; + types[3]=utf16Type; + if (!hasSelection()) { + acquireSelection(types, 4); + } + } else { + if (hasSelection()) { + releaseSelection(); + } + } + update(border, border, width-(border<<1), height-(border<<1)); + return TRUE; +} -// Extend selection -FXbool MFXTextFieldIcon::extendSelection(FXint pos){ - FXDragType types[4]; - // Validate position to start of character - pos=contents.validate(FXCLAMP(0,pos,contents.length())); - // Got a selection at all? - if(anchor!=pos){ - types[0]=stringType; - types[1]=textType; - types[2]=utf8Type; - types[3]=utf16Type; - if(!hasSelection()){ - acquireSelection(types,4); - } +void +MFXTextFieldIcon::setText(const FXString& text, FXbool notify) { + killSelection(); + if (contents!=text) { + contents=text; + anchor=contents.length(); + cursor=contents.length(); + if (xid) layout(); + if (notify && target) { + target->tryHandle(this, FXSEL(SEL_COMMAND, message), (void*)contents.text()); + } } - else{ - if(hasSelection()){ - releaseSelection(); - } +} + + +void +MFXTextFieldIcon::setTextColor(FXColor clr) { + if (textColor!=clr) { + textColor=clr; + update(); } +} - update(border,border,width-(border<<1),height-(border<<1)); - return TRUE; - } -// Change the text and move cursor to end -void MFXTextFieldIcon::setText(const FXString& text,FXbool notify){ - killSelection(); - if(contents!=text){ - contents=text; - anchor=contents.length(); - cursor=contents.length(); - if(xid) layout(); - if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)contents.text());} +void +MFXTextFieldIcon::setSelBackColor(FXColor clr) { + if (selbackColor!=clr) { + selbackColor=clr; + update(); } - } +} -// Set text color -void MFXTextFieldIcon::setTextColor(FXColor clr){ - if(textColor!=clr){ - textColor=clr; - update(); +void +MFXTextFieldIcon::setSelTextColor(FXColor clr) { + if (seltextColor!=clr) { + seltextColor=clr; + update(); } - } +} -// Set select background color -void MFXTextFieldIcon::setSelBackColor(FXColor clr){ - if(selbackColor!=clr){ - selbackColor=clr; - update(); + +void +MFXTextFieldIcon::setCursorColor(FXColor clr) { + if (clr!=cursorColor) { + cursorColor=clr; + update(); } - } +} -// Set selected text color -void MFXTextFieldIcon::setSelTextColor(FXColor clr){ - if(seltextColor!=clr){ - seltextColor=clr; - update(); + +void +MFXTextFieldIcon::setNumColumns(FXint ncols) { + if (ncols<0) ncols=0; + if (columns!=ncols) { + shift=0; + columns=ncols; + layout(); // This may not be necessary! + recalc(); + update(); } - } +} -// Set cursor color -void MFXTextFieldIcon::setCursorColor(FXColor clr){ - if(clr!=cursorColor){ - cursorColor=clr; - update(); - } - } +FXbool +MFXTextFieldIcon::isEditable() const { + return (options&TEXTFIELD_READONLY)==0; +} -// Change number of columns -void MFXTextFieldIcon::setNumColumns(FXint ncols){ - if(ncols<0) ncols=0; - if(columns!=ncols){ - shift=0; - columns=ncols; - layout(); // This may not be necessary! - recalc(); - update(); + + +void +MFXTextFieldIcon::setEditable(FXbool edit) { + if (edit) { + options&=~TEXTFIELD_READONLY; + } else { + options|=TEXTFIELD_READONLY; } - } +} -// Return true if editable -FXbool MFXTextFieldIcon::isEditable() const { - return (options&TEXTFIELD_READONLY)==0; - } +FXbool +MFXTextFieldIcon::isOverstrike() const { + return (options&TEXTFIELD_OVERSTRIKE)!=0; +} -// Set editable mode -void MFXTextFieldIcon::setEditable(FXbool edit){ - if(edit) options&=~TEXTFIELD_READONLY; else options|=TEXTFIELD_READONLY; - } -// Return TRUE if overstrike mode in effect -FXbool MFXTextFieldIcon::isOverstrike() const { - return (options&TEXTFIELD_OVERSTRIKE)!=0; - } +void +MFXTextFieldIcon::setOverstrike(FXbool over) { + if (over) { + options|=TEXTFIELD_OVERSTRIKE; + } else { + options&=~TEXTFIELD_OVERSTRIKE; + } +} -// Set overstrike mode -void MFXTextFieldIcon::setOverstrike(FXbool over){ - if(over) options|=TEXTFIELD_OVERSTRIKE; else options&=~TEXTFIELD_OVERSTRIKE; - } +void +MFXTextFieldIcon::setTextStyle(FXuint style) { + FXuint opts=(options&~TEXTFIELD_MASK) | (style&TEXTFIELD_MASK); + if (options!=opts) { + shift=0; + options=opts; + recalc(); + update(); + } +} -// Change text style -void MFXTextFieldIcon::setTextStyle(FXuint style){ - FXuint opts=(options&~TEXTFIELD_MASK) | (style&TEXTFIELD_MASK); - if(options!=opts){ - shift=0; - options=opts; - recalc(); - update(); + +FXuint +MFXTextFieldIcon::getTextStyle() const { + return (options&TEXTFIELD_MASK); +} + + + +void +MFXTextFieldIcon::setJustify(FXuint style) { + FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); + if (options!=opts) { + shift=0; + options=opts; + recalc(); + update(); } - } +} + + + +FXuint +MFXTextFieldIcon::getJustify() const { + return (options&JUSTIFY_MASK); +} + -// Get text style -FXuint MFXTextFieldIcon::getTextStyle() const { - return (options&TEXTFIELD_MASK); - } +void +MFXTextFieldIcon::save(FXStream& store) const { + FXFrame::save(store); + store << contents; + store << font; + store << textColor; + store << selbackColor; + store << seltextColor; + store << cursorColor; + store << columns; + store << help; + store << tip; +} -// Set text justify style -void MFXTextFieldIcon::setJustify(FXuint style){ - FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); - if(options!=opts){ + +void +MFXTextFieldIcon::load(FXStream& store) { + FXFrame::load(store); + store >> contents; + store >> font; + store >> textColor; + store >> selbackColor; + store >> seltextColor; + store >> cursorColor; + store >> columns; + store >> help; + store >> tip; +} + + +MFXTextFieldIcon::MFXTextFieldIcon() { + flags|=FLAG_ENABLED; + delimiters=FXTextField::textDelimiters; + font=(FXFont*)-1L; + textColor=0; + selbackColor=0; + seltextColor=0; + cursorColor=0; + cursor=0; + anchor=0; + columns=0; shift=0; - options=opts; - recalc(); - update(); - } - } - - -// Get text justify style -FXuint MFXTextFieldIcon::getJustify() const { - return (options&JUSTIFY_MASK); - } - - -// Save object to stream -void MFXTextFieldIcon::save(FXStream& store) const { - FXFrame::save(store); - store << contents; - store << font; - store << textColor; - store << selbackColor; - store << seltextColor; - store << cursorColor; - store << columns; - store << help; - store << tip; - } - - -// Load object from stream -void MFXTextFieldIcon::load(FXStream& store){ - FXFrame::load(store); - store >> contents; - store >> font; - store >> textColor; - store >> selbackColor; - store >> seltextColor; - store >> cursorColor; - store >> columns; - store >> help; - store >> tip; - } - - -// Clean up -MFXTextFieldIcon::~MFXTextFieldIcon(){ - getApp()->removeTimeout(this,FXTextField::ID_BLINK); - getApp()->removeTimeout(this,ID_AUTOSCROLL); - font=(FXFont*)-1L; - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/utils/foxtools/MFXTextFieldIcon.h b/src/utils/foxtools/MFXTextFieldIcon.h index 3ebef97f7f6..da62b9c8794 100644 --- a/src/utils/foxtools/MFXTextFieldIcon.h +++ b/src/utils/foxtools/MFXTextFieldIcon.h @@ -38,6 +38,9 @@ class MFXTextFieldIcon : public FXFrame { FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0, FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD); + /// @brief Destructor + virtual ~MFXTextFieldIcon(); + /// @brief Create server-side resources virtual void create(); @@ -188,9 +191,6 @@ class MFXTextFieldIcon : public FXFrame { /// @brief Load text field from a stream virtual void load(FXStream& store); - /// @brief Destructor - virtual ~MFXTextFieldIcon(); - /// @brief fox callbacks /// @{