// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "textctrl.h"
#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __VMS
+#define XtParent XTPARENT
+#endif
+
+#include "wx/defs.h"
+
#include <sys/types.h>
#include <sys/stat.h>
-#include <fstream.h>
#include <ctype.h>
#include "wx/textctrl.h"
static void wxTextWindowLoseFocusProc(Widget w, XtPointer clientData, XmAnyCallbackStruct *cbs);
static void wxTextWindowActivateProc(Widget w, XtPointer clientData, XmAnyCallbackStruct *ptr);
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
END_EVENT_TABLE()
-#endif
// ============================================================================
// implementation
wxTextCtrl::wxTextCtrl()
{
m_tempCallbackStruct = (void*) NULL;
- m_modified = FALSE;
- m_processedDefault = FALSE;
+ m_modified = false;
+ m_processedDefault = false;
}
bool wxTextCtrl::Create(wxWindow *parent,
const wxValidator& validator,
const wxString& name)
{
- m_tempCallbackStruct = (void*) NULL;
- m_modified = FALSE;
- m_processedDefault = FALSE;
- // m_backgroundColour = parent->GetBackgroundColour();
- m_backgroundColour = * wxWHITE;
- m_foregroundColour = parent->GetForegroundColour();
-
- SetName(name);
- SetValidator(validator);
- if (parent)
- parent->AddChild(this);
+ if( !CreateControl( parent, id, pos, size, style, validator, name ) )
+ return false;
- m_windowStyle = style;
+ m_tempCallbackStruct = (void*) NULL;
+ m_modified = false;
+ m_processedDefault = false;
- if ( id == -1 )
- m_windowId = (int)NewControlId();
- else
- m_windowId = id;
+ m_backgroundColour = *wxWHITE;
Widget parentWidget = (Widget) parent->GetClientWidget();
XtSetArg (args[1], XmNwordWrap, wantWordWrap ? True : False);
m_mainWidget = (WXWidget) XmCreateScrolledText(parentWidget,
- (char*)name.c_str(),
+ wxConstCast(name.c_str(), char),
args, 2);
XtVaSetValues ((Widget) m_mainWidget,
{
m_mainWidget = (WXWidget)XtVaCreateManagedWidget
(
- (char*)name.c_str(),
+ wxConstCast(name.c_str(), char),
xmTextWidgetClass,
parentWidget,
NULL
NULL);
}
- if ( !!value )
+ if ( !value.empty() )
{
-#if 0
- // don't do this because it is just linking the text to a source
- // string which is unsafe. MB
- //
- XmTextSetString ((Widget) m_mainWidget, (char*)value.c_str());
-#else
// do this instead... MB
//
XtVaSetValues( (Widget) m_mainWidget,
- XmNvalue, (char *)value.c_str(),
+ XmNvalue, wxConstCast(value.c_str(), char),
NULL);
-#endif
}
-
+
// install callbacks
XtAddCallback((Widget) m_mainWidget, XmNvalueChangedCallback, (XtCallbackProc)wxTextWindowChangedProc, (XtPointer)this);
XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this);
// font
- m_font = parent->GetFont();
- ChangeFont(FALSE);
+ ChangeFont(false);
- SetCanAddEventHandler(TRUE);
- AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
+ wxSize best = GetBestSize();
+ if( size.x != -1 ) best.x = size.x;
+ if( size.y != -1 ) best.y = size.y;
+
+ AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
+ pos.x, pos.y, best.x, best.y);
ChangeBackgroundColour();
- return TRUE;
+ return true;
}
WXWidget wxTextCtrl::GetTopWidget() const
{
- return ((m_windowStyle & wxTE_MULTILINE) ? (WXWidget) XtParent((Widget) m_mainWidget) : m_mainWidget);
+ return IsMultiLine() ? (WXWidget)XtParent((Widget)m_mainWidget)
+ : m_mainWidget;
}
wxString wxTextCtrl::GetValue() const
void wxTextCtrl::SetValue(const wxString& value)
{
- m_inSetValue = TRUE;
+ m_inSetValue = true;
-#if 0
- // don't do this because it is just linking the text to a source
- // string which is unsafe. MB
- //
- XmTextSetString ((Widget) m_mainWidget, (char*)value.c_str());
-#else
// do this instead... MB
//
+ // with (at least) OpenMotif 2.1 this causes a lot of flicker
+#if 0
XtVaSetValues( (Widget) m_mainWidget,
- XmNvalue, (char *)value.c_str(),
+ XmNvalue, wxConstCast(value.c_str(), char),
NULL);
#endif
- m_inSetValue = FALSE;
+ Clear();
+ AppendText( value );
+
+ m_inSetValue = false;
}
// Clipboard operations
// Can cut if there's a selection
long from, to;
GetSelection(& from, & to);
- return (from != to) ;
+ return (from != to) && (IsEditable());
}
bool wxTextCtrl::CanPaste() const
bool wxTextCtrl::CanUndo() const
{
// No Undo in Motif
- return FALSE;
+ return false;
}
bool wxTextCtrl::CanRedo() const
{
// No Redo in Motif
- return FALSE;
+ return false;
}
// If the return values from and to are the same, there is no
void wxTextCtrl::SetInsertionPointEnd()
{
- long pos = GetLastPosition();
+ wxTextPos pos = GetLastPosition();
SetInsertionPoint(pos);
}
return (long) XmTextGetInsertionPosition ((Widget) m_mainWidget);
}
-long wxTextCtrl::GetLastPosition() const
+wxTextPos wxTextCtrl::GetLastPosition() const
{
return (long) XmTextGetLastPosition ((Widget) m_mainWidget);
}
void wxTextCtrl::Replace(long from, long to, const wxString& value)
{
XmTextReplace ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
- (char*) (const char*) value);
+ wxConstCast(value.c_str(), char));
}
void wxTextCtrl::Remove(long from, long to)
void wxTextCtrl::SetSelection(long from, long to)
{
+ if( to == -1 )
+ to = GetLastPosition();
+
XmTextSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
(Time) 0);
}
-bool wxTextCtrl::LoadFile(const wxString& file)
-{
- if (!wxFileExists(file))
- return FALSE;
-
- m_fileName = file;
-
- Clear();
-
- Widget textWidget = (Widget) m_mainWidget;
- FILE *fp = 0;
-
- struct stat statb;
- if ((stat ((char*) (const char*) file, &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG ||
- !(fp = fopen ((char*) (const char*) file, "r")))
- {
- return FALSE;
- }
- else
- {
- long len = statb.st_size;
- char *text;
- if (!(text = XtMalloc ((unsigned) (len + 1))))
- {
- fclose (fp);
- return FALSE;
- }
- if (fread (text, sizeof (char), len, fp) != (size_t) len)
- {
- }
- fclose (fp);
-
- text[len] = 0;
- XmTextSetString (textWidget, text);
- // m_textPosition = len;
- XtFree (text);
- m_modified = FALSE;
- return TRUE;
- }
-}
-
-// If file is null, try saved file name first
-// Returns TRUE if succeeds.
-bool wxTextCtrl::SaveFile(const wxString& file)
-{
- wxString theFile(file);
- if (theFile == "")
- theFile = m_fileName;
- if (theFile == "")
- return FALSE;
- m_fileName = theFile;
-
- Widget textWidget = (Widget) m_mainWidget;
- FILE *fp;
-
- if (!(fp = fopen ((char*) (const char*) theFile, "w")))
- {
- return FALSE;
- }
- else
- {
- char *text = XmTextGetString (textWidget);
- long len = XmTextGetLastPosition (textWidget);
-
- if (fwrite (text, sizeof (char), len, fp) != (size_t) len)
- {
- // Did not write whole file
- }
- // Make sure newline terminates the file
- if (text[len - 1] != '\n')
- fputc ('\n', fp);
-
- fclose (fp);
- XtFree (text);
- m_modified = FALSE;
- return TRUE;
- }
-}
-
void wxTextCtrl::WriteText(const wxString& text)
{
- long textPosition = GetInsertionPoint() + strlen (text);
- XmTextInsert ((Widget) m_mainWidget, GetInsertionPoint(), (char*) (const char*) text);
+ long textPosition = GetInsertionPoint() + text.length();
+ XmTextInsert ((Widget) m_mainWidget, GetInsertionPoint(),
+ wxConstCast(text.c_str(), char));
XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL);
SetInsertionPoint(textPosition);
XmTextShowPosition ((Widget) m_mainWidget, textPosition);
- m_modified = TRUE;
+ m_modified = true;
}
void wxTextCtrl::AppendText(const wxString& text)
{
- long textPosition = GetLastPosition() + strlen(text);
- XmTextInsert ((Widget) m_mainWidget, GetLastPosition(), (char*) (const char*) text);
+ wxTextPos textPosition = GetLastPosition() + text.length();
+ XmTextInsert ((Widget) m_mainWidget, GetLastPosition(),
+ wxConstCast(text.c_str(), char));
XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL);
SetInsertionPoint(textPosition);
XmTextShowPosition ((Widget) m_mainWidget, textPosition);
- m_modified = TRUE;
+ m_modified = true;
}
void wxTextCtrl::Clear()
{
XmTextSetString ((Widget) m_mainWidget, "");
- m_modified = FALSE;
+ m_modified = false;
}
bool wxTextCtrl::IsModified() const
return m_modified;
}
-// Makes 'unmodified'
+// Makes modified or unmodified
+void wxTextCtrl::MarkDirty()
+{
+ m_modified = true;
+}
+
void wxTextCtrl::DiscardEdits()
{
- m_modified = FALSE;
+ m_modified = false;
}
int wxTextCtrl::GetNumberOfLines() const
{
long i = 0;
int currentLine = 0;
- bool finished = FALSE;
+ bool finished = false;
while (!finished)
{
int ch = s[i];
}
else if (ch == 0)
{
- finished = TRUE;
+ finished = true;
}
else
i++;
if ( y )
*y = yy;
- return TRUE;
+ return true;
}
void wxTextCtrl::ShowPosition(long pos)
// Indicates that we should generate a normal command, because
// we're letting default behaviour happen (otherwise it's vetoed
// by virtue of overriding OnChar)
- m_processedDefault = TRUE;
+ m_processedDefault = true;
if (m_tempCallbackStruct)
{
XmNhorizontalScrollBar, &hsb,
XmNverticalScrollBar, &vsb,
NULL);
- wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+ wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
if (hsb)
- DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE);
+ wxDoChangeBackgroundColour((WXWidget) hsb, backgroundColour, true);
if (vsb)
- DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE);
+ wxDoChangeBackgroundColour((WXWidget) vsb, backgroundColour, true);
- DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE);
+ // MBN: why change parent background?
+ // DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, true);
}
}
if (vsb)
DoChangeForegroundColour((WXWidget) vsb, m_foregroundColour);
*/
- DoChangeForegroundColour((WXWidget) parent, m_foregroundColour);
+ wxDoChangeForegroundColour((WXWidget) parent, m_foregroundColour);
}
}
m_tempCallbackStruct = NULL;
}
+wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget,
+ const wxWindow* window )
+{
+ Dimension xmargin, ymargin, highlight, shadow;
+ char* value;
+
+ XtVaGetValues( textWidget,
+ XmNmarginWidth, &xmargin,
+ XmNmarginHeight, &ymargin,
+ XmNvalue, &value,
+ XmNhighlightThickness, &highlight,
+ XmNshadowThickness, &shadow,
+ NULL );
+
+ if( !value )
+ value = "|";
+
+ int x, y;
+ window->GetTextExtent( value, &x, &y );
+
+ if( x < 100 ) x = 100;
+
+ return wxSize( x + 2 * xmargin + 2 * highlight + 2 * shadow,
+ // MBN: +2 necessary: Lesstif bug or mine?
+ y + 2 * ymargin + 2 * highlight + 2 * shadow + 2 );
+}
+
+wxSize wxTextCtrl::DoGetBestSize() const
+{
+ if( IsSingleLine() )
+ return wxDoGetSingleTextCtrlBestSize( (Widget)m_mainWidget, this );
+ else
+ return wxWindow::DoGetBestSize();
+}
+
// ----------------------------------------------------------------------------
// helpers and Motif callbacks
// ----------------------------------------------------------------------------
const char * const passwd = value;
int len = value.length();
- len += strlen(cbs->text->ptr) + 1; // + new text (if any) + NUL
+ len += ( cbs->text->ptr ?
+ strlen(cbs->text->ptr) :
+ 0 ) + 1; // + new text (if any) + NUL
len -= cbs->endPos - cbs->startPos; // - text from affected region.
char * newS = new char [len];
*dest++ = *p++;
// Copy the text to be inserted).
- while (*insert)
- *dest++ = *insert++;
+ if (insert)
+ while (*insert)
+ *dest++ = *insert++;
// Finally, copy into newS any remaining text from passwd[endPos] on.
for (p = passwd + cbs->endPos; *p; )
return;
wxTextCtrl *tw = (wxTextCtrl *) clientData;
- tw->SetModified(TRUE);
+ tw->SetModified(true);
}
static void
wxTextWindowModifyProc (Widget WXUNUSED(w), XtPointer clientData, XmTextVerifyCallbackStruct *cbs)
{
wxTextCtrl *tw = (wxTextCtrl *) clientData;
- tw->m_processedDefault = FALSE;
+ tw->m_processedDefault = false;
// First, do some stuff if it's a password control: in this case, we need
// to store the string inside the class because GetValue() can't retrieve
}
}
+ if(tw->InSetValue())
+ return;
+
// If we're already within an OnChar, return: probably a programmatic
// insertion.
if (tw->m_tempCallbackStruct)