/////////////////////////////////////////////////////////////////////////////// // Name: src/motif/textentry.cpp // Purpose: implementation of wxTextEntry for wxMotif // Author: Vadim Zeitlin // Created: 2007-11-05 // RCS-ID: $Id$ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ // declarations // ============================================================================ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/string.h" #endif //WX_PRECOMP #include "wx/textentry.h" #ifdef __VMS__ #pragma message disable nosimpint #endif #include #ifdef __VMS__ #pragma message enable nosimpint #endif // return the text widget casted to the correct type #define GetText() ((Widget)this->GetTextWidget()) // ============================================================================ // wxTextEntry implementation // ============================================================================ // ---------------------------------------------------------------------------- // helpers // ---------------------------------------------------------------------------- long wxTextEntry::GetMotifPos(long pos) const { // in wx API position -1 means "last one" but for Motif position must be // positive, i.e. it doesn't have this convention, so translate return pos == -1 ? GetLastPosition() : pos; } // ---------------------------------------------------------------------------- // operations on control text // ---------------------------------------------------------------------------- wxString wxTextEntry::GetValue() const { wxString str; char * const s = XmTextGetString(GetText()); if ( s ) { str = s; XtFree(s); } return str; } void wxTextEntry::WriteText(const wxString& text) { long pos = GetInsertionPoint(); XmTextInsert(GetText(), pos, text.char_str()); pos += text.length(); XtVaSetValues(GetText(), XmNcursorPosition, pos, NULL); SetInsertionPoint(pos); XmTextShowPosition(GetText(), pos); } void wxTextEntry::Replace(long from, long to, const wxString& value) { XmTextReplace(GetText(), from, GetMotifPos(to), value.char_str()); } void wxTextEntry::Remove(long from, long to) { SetSelection(from, to); XmTextRemove(GetText()); } // ---------------------------------------------------------------------------- // clipboard operations // ---------------------------------------------------------------------------- void wxTextEntry::Copy() { XmTextCopy(GetText(), CurrentTime); } void wxTextEntry::Cut() { XmTextCut(GetText(), CurrentTime); } void wxTextEntry::Paste() { XmTextPaste(GetText()); } // ---------------------------------------------------------------------------- // undo/redo (not implemented) // ---------------------------------------------------------------------------- void wxTextEntry::Undo() { } void wxTextEntry::Redo() { } bool wxTextEntry::CanUndo() const { return false; } bool wxTextEntry::CanRedo() const { return false; } // ---------------------------------------------------------------------------- // insertion point // ---------------------------------------------------------------------------- void wxTextEntry::SetInsertionPoint(long pos) { XmTextSetInsertionPosition(GetText(), GetMotifPos(pos)); } long wxTextEntry::GetInsertionPoint() const { return XmTextGetInsertionPosition(GetText()); } wxTextPos wxTextEntry::GetLastPosition() const { return XmTextGetLastPosition(GetText()); } // ---------------------------------------------------------------------------- // selection // ---------------------------------------------------------------------------- void wxTextEntry::GetSelection(long* from, long* to) const { XmTextPosition left, right; if ( !XmTextGetSelectionPosition(GetText(), &left, &right) ) { // no selection, for compatibility with wxMSW return empty range at // cursor position left = right = GetInsertionPoint(); } if ( from ) *from = left; if ( to ) *to = right; } void wxTextEntry::SetSelection(long from, long to) { XmTextSetSelection(GetText(), from, GetMotifPos(to), CurrentTime); } // ---------------------------------------------------------------------------- // editable state // ---------------------------------------------------------------------------- bool wxTextEntry::IsEditable() const { return XmTextGetEditable(GetText()) != 0; } void wxTextEntry::SetEditable(bool editable) { XmTextSetEditable(GetText(), (Boolean) editable); }