|
Packit |
b099d7 |
/* $XConsortium: TextFunc.c /main/16 1996/11/19 12:37:29 drk $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* (c) Copyright 1995 FUJITSU LIMITED
|
|
Packit |
b099d7 |
* This is source code modified by FUJITSU LIMITED under the Joint
|
|
Packit |
b099d7 |
* Development Agreement for the CDEnext PST.
|
|
Packit |
b099d7 |
* This is unpublished proprietary source code of FUJITSU LIMITED
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <Xm/XmosP.h>
|
|
Packit |
b099d7 |
#include <Xm/TextStrSoP.h>
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
#include "TextFI.h"
|
|
Packit |
b099d7 |
#include "TextI.h"
|
|
Packit |
b099d7 |
#include "TextInI.h"
|
|
Packit |
b099d7 |
#include "TextStrSoI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Public definitions with TextField calls.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
****************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmTextPosition
|
|
Packit |
b099d7 |
XmTextGetLastPosition(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextPosition ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget)){
|
|
Packit |
b099d7 |
XmTextFieldWidget tf = (XmTextFieldWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret_val = tf->text.string_length;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XmTextSource source;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
source = GetSrc(widget);
|
|
Packit |
b099d7 |
ret_val = (*source->Scan)(source, 0, XmSELECT_ALL, XmsdRight, 1, TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmTextReplace(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition frompos,
|
|
Packit |
b099d7 |
XmTextPosition topos,
|
|
Packit |
b099d7 |
char *value,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int is_wchar)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean is_wchar)
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
XmTextSource source;
|
|
Packit |
b099d7 |
XmTextBlockRec block, newblock;
|
|
Packit |
b099d7 |
Boolean editable, freeBlock;
|
|
Packit |
b099d7 |
Boolean need_free = False;
|
|
Packit |
b099d7 |
int max_length;
|
|
Packit |
b099d7 |
int num_chars;
|
|
Packit |
b099d7 |
wchar_t * tmp_wc;
|
|
Packit |
b099d7 |
XmTextPosition selleft, selright, cursorPos;
|
|
Packit |
b099d7 |
char * tmp_block = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
source = GetSrc(tw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(*tw->text.output->DrawInsertionPoint)(tw, tw->text.cursor_position, off);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((*source->GetSelection)(tw->text.source, &selleft, &selright)) {
|
|
Packit |
b099d7 |
if ((selleft > frompos && selleft < topos) ||
|
|
Packit |
b099d7 |
(selright >frompos && selright < topos) ||
|
|
Packit |
b099d7 |
(selleft <= frompos && selright >= topos)) {
|
|
Packit |
b099d7 |
(*source->SetSelection)(tw->text.source, tw->text.cursor_position,
|
|
Packit |
b099d7 |
tw->text.cursor_position,
|
|
Packit |
b099d7 |
XtLastTimestampProcessed(XtDisplay(widget)));
|
|
Packit |
b099d7 |
if (tw->text.input->data->pendingdelete)
|
|
Packit |
b099d7 |
tw->text.pendingoff = FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
block.format = XmFMT_8_BIT;
|
|
Packit |
b099d7 |
if (!is_wchar) {
|
|
Packit |
b099d7 |
if (value == NULL)
|
|
Packit |
b099d7 |
block.length = 0;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
block.length = strlen(value);
|
|
Packit |
b099d7 |
block.ptr = value;
|
|
Packit |
b099d7 |
} else { /* value is really a wchar_t ptr cast to char* */
|
|
Packit |
b099d7 |
if (value == NULL) {
|
|
Packit |
b099d7 |
block.length = 0;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
for (tmp_wc = (wchar_t*)value, num_chars = 0;
|
|
Packit |
b099d7 |
*tmp_wc != (wchar_t)0L;
|
|
Packit |
b099d7 |
num_chars++) tmp_wc++;
|
|
Packit |
b099d7 |
tmp_block = XtMalloc((unsigned)
|
|
Packit |
b099d7 |
(num_chars + 1) * (int)tw->text.char_size);
|
|
Packit |
b099d7 |
block.ptr = tmp_block;
|
|
Packit |
b099d7 |
need_free = True;
|
|
Packit |
b099d7 |
tmp_wc = (wchar_t *) value;
|
|
Packit |
b099d7 |
/* if successful, wcstombs returns number of bytes, else -1 */
|
|
Packit |
b099d7 |
block.length = wcstombs(block.ptr, tmp_wc,
|
|
Packit |
b099d7 |
(num_chars + 1) * (int)tw->text.char_size);
|
|
Packit |
b099d7 |
if (block.length == -1) {
|
|
Packit |
b099d7 |
block.length = 0; /* if error, don't insert anything */
|
|
Packit |
b099d7 |
block.ptr[0] = '\0'; /* use the empty string */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
editable = _XmStringSourceGetEditable(source);
|
|
Packit |
b099d7 |
max_length = _XmStringSourceGetMaxLength(source);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmStringSourceSetEditable(source, TRUE);
|
|
Packit |
b099d7 |
_XmStringSourceSetMaxLength(source, INT_MAX);
|
|
Packit |
b099d7 |
if (_XmTextModifyVerify(tw, NULL, &frompos, &topos,
|
|
Packit |
b099d7 |
&cursorPos, &block, &newblock, &freeBlock)) {
|
|
Packit |
b099d7 |
(*source->Replace)(tw, NULL, &frompos, &topos, &newblock, False);
|
|
Packit |
b099d7 |
if (frompos == tw->text.cursor_position && frompos == topos) {
|
|
Packit |
b099d7 |
_XmTextSetCursorPosition((Widget)tw, cursorPos);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmTextValueChanged(tw, NULL);
|
|
Packit |
b099d7 |
if (UnderVerifyPreedit(tw))
|
|
Packit |
b099d7 |
if (newblock.length != block.length ||
|
|
Packit |
b099d7 |
strncmp(newblock.ptr, block.ptr, block.length) != 0) {
|
|
Packit |
b099d7 |
VerifyCommitNeeded(tw) = True;
|
|
Packit |
b099d7 |
PreEndTW(tw) += _XmTextCountCharacters(newblock.ptr, newblock.length)
|
|
Packit |
b099d7 |
- _XmTextCountCharacters(block.ptr, block.length);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (freeBlock && newblock.ptr) XtFree(newblock.ptr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
if (UnderVerifyPreedit(tw)) {
|
|
Packit |
b099d7 |
VerifyCommitNeeded(tw) = True;
|
|
Packit |
b099d7 |
PreEndTW(tw) -= _XmTextCountCharacters(block.ptr, block.length);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (need_free)
|
|
Packit |
b099d7 |
XtFree(tmp_block);
|
|
Packit |
b099d7 |
_XmStringSourceSetEditable(source, editable);
|
|
Packit |
b099d7 |
_XmStringSourceSetMaxLength(source, max_length);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tw->text.input->data->has_destination)
|
|
Packit |
b099d7 |
_XmTextSetDestinationSelection(widget, tw->text.cursor_position,
|
|
Packit |
b099d7 |
False, XtLastTimestampProcessed(XtDisplay(widget)));
|
|
Packit |
b099d7 |
(*tw->text.output->DrawInsertionPoint)(tw, tw->text.cursor_position, on);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextReplace(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition frompos,
|
|
Packit |
b099d7 |
XmTextPosition topos,
|
|
Packit |
b099d7 |
char *value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldReplace(widget, frompos, topos, value);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextReplace(widget, frompos, topos, value, False);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextReplaceWcs(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition frompos,
|
|
Packit |
b099d7 |
XmTextPosition topos,
|
|
Packit |
b099d7 |
wchar_t *value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldReplaceWcs(widget, frompos, topos, (wchar_t*) value);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextReplace(widget, frompos, topos, (char*) value, True);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextInsert(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition position,
|
|
Packit |
b099d7 |
char *value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextReplace(widget, position, position, value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextInsertWcs(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition position,
|
|
Packit |
b099d7 |
wchar_t *wc_value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextReplaceWcs(widget, position, position, wc_value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextSetAddMode(Widget widget,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int state)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean state)
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldSetAddMode(widget, state);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (tw->text.add_mode == state) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(*tw->text.output->DrawInsertionPoint)(tw, tw->text.cursor_position, off);
|
|
Packit |
b099d7 |
tw->text.add_mode = state;
|
|
Packit |
b099d7 |
(*tw->text.output->DrawInsertionPoint)(tw, tw->text.cursor_position, on);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextGetAddMode(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget)){
|
|
Packit |
b099d7 |
XmTextFieldWidget tf = (XmTextFieldWidget) widget;
|
|
Packit |
b099d7 |
ret_val = tf->text.add_mode;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
ret_val = tw->text.add_mode;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextGetEditable(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
ret_val = TextF_Editable(widget);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
ret_val = _XmStringSourceGetEditable(GetSrc(widget));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextSetEditable(Widget widget,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int editable)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean editable)
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldSetEditable(widget, editable);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextSetEditable(widget, editable);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
XmTextGetMaxLength(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
ret_val = TextF_MaxLength(widget);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
ret_val = _XmStringSourceGetMaxLength(GetSrc(widget));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextSetMaxLength(Widget widget,
|
|
Packit |
b099d7 |
int max_length)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
TextF_MaxLength(widget) = max_length;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tw->text.max_length = max_length;
|
|
Packit |
b099d7 |
_XmStringSourceSetMaxLength(GetSrc(tw), max_length);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmTextPosition
|
|
Packit |
b099d7 |
XmTextGetInsertionPosition(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextPosition ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
ret_val = TextF_CursorPosition(widget);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret_val = tw->text.cursor_position;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextSetInsertionPosition(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition position)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldSetInsertionPosition(widget, position);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextResetIC(widget);
|
|
Packit |
b099d7 |
_XmTextSetCursorPosition(widget, position);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmTextSetDestinationSelection(widget, tw->text.cursor_position,
|
|
Packit |
b099d7 |
False, XtLastTimestampProcessed(XtDisplay(widget)));
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextRemove(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return(XmTextFieldRemove(widget));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
XmTextSource source;
|
|
Packit |
b099d7 |
XmTextPosition left, right;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (tw->text.editable == False) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
source = tw->text.source;
|
|
Packit |
b099d7 |
_XmTextResetIC(widget);
|
|
Packit |
b099d7 |
if (!(*source->GetSelection)(source, &left, &right) ||
|
|
Packit |
b099d7 |
left == right) {
|
|
Packit |
b099d7 |
tw->text.input->data->anchor = tw->text.cursor_position;
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmTextReplace(widget, left, right, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tw->text.cursor_position > left)
|
|
Packit |
b099d7 |
_XmTextSetCursorPosition(widget, left);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tw->text.input->data->anchor = tw->text.cursor_position;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextCopy(Widget widget,
|
|
Packit |
b099d7 |
Time copy_time)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean result = False;
|
|
Packit |
b099d7 |
XmTextPosition left, right;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmTextGetSelectionPosition(widget, &left, &right) && right != left)
|
|
Packit |
b099d7 |
/* start copy to clipboard */
|
|
Packit |
b099d7 |
result = XmeClipboardSource(widget, XmCOPY, copy_time);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return result;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextCopyLink(Widget widget,
|
|
Packit |
b099d7 |
Time copy_time)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean result = False;
|
|
Packit |
b099d7 |
XmTextPosition left, right;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmTextGetSelectionPosition(widget, &left, &right) && right != left)
|
|
Packit |
b099d7 |
/* start copy to clipboard */
|
|
Packit |
b099d7 |
result = XmeClipboardSource(widget, XmLINK, copy_time);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return result;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextCut(Widget widget,
|
|
Packit |
b099d7 |
Time cut_time)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean result = False;
|
|
Packit |
b099d7 |
XmTextPosition left, right;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
/* can't cut if you can't edit */
|
|
Packit |
b099d7 |
if (XmTextGetEditable(widget) &&
|
|
Packit |
b099d7 |
XmTextGetSelectionPosition(widget, &left, &right) &&
|
|
Packit |
b099d7 |
(right != left))
|
|
Packit |
b099d7 |
/* start copy to clipboard */
|
|
Packit |
b099d7 |
result = XmeClipboardSource(widget, XmMOVE, cut_time);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return result;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Retrieves the current data from the clipboard
|
|
Packit |
b099d7 |
* and paste it at the current cursor position
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextPaste(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean status;
|
|
Packit |
b099d7 |
InputData data;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return XmTextFieldPaste(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextResetIC(widget);
|
|
Packit |
b099d7 |
data = ((XmTextWidget) widget)->text.input->data;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data->selectionMove = FALSE;
|
|
Packit |
b099d7 |
data->selectionLink = FALSE;
|
|
Packit |
b099d7 |
status = XmeClipboardSink(widget, XmCOPY, NULL);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return(status);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Retrieves the current data from the clipboard
|
|
Packit |
b099d7 |
* and paste it at the current cursor position
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextPasteLink(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean status;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
InputData data;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
data = ((XmTextWidget) widget)->text.input->data;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
data->selectionMove = FALSE;
|
|
Packit |
b099d7 |
data->selectionLink = True;
|
|
Packit |
b099d7 |
status = XmeClipboardSink(widget, XmLINK, NULL);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return(status);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
char *
|
|
Packit |
b099d7 |
XmTextGetSelection(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return(XmTextFieldGetSelection(widget));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextSource source;
|
|
Packit |
b099d7 |
XmTextPosition left, right;
|
|
Packit |
b099d7 |
char *ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
source = GetSrc(widget);
|
|
Packit |
b099d7 |
if ((!(*source->GetSelection)(source, &left, &right)) || right == left)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret_val = _XmStringSourceGetString((XmTextWidget)widget, left,
|
|
Packit |
b099d7 |
right, False);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
wchar_t *
|
|
Packit |
b099d7 |
XmTextGetSelectionWcs(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return(XmTextFieldGetSelectionWcs(widget));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextSource source;
|
|
Packit |
b099d7 |
XmTextPosition left, right;
|
|
Packit |
b099d7 |
wchar_t *ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
source = GetSrc(widget);
|
|
Packit |
b099d7 |
if (!(*source->GetSelection)(source, &left, &right)) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret_val = (wchar_t *)_XmStringSourceGetString((XmTextWidget)widget,
|
|
Packit |
b099d7 |
left, right, True);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextSetSelection(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition first,
|
|
Packit |
b099d7 |
XmTextPosition last,
|
|
Packit |
b099d7 |
Time set_time)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldSetSelection(widget, first, last, set_time);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextSource source;
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextResetIC(widget);
|
|
Packit |
b099d7 |
if (first < 0 || last > tw->text.last_position) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
source = GetSrc(widget);
|
|
Packit |
b099d7 |
source->data->take_selection = True;
|
|
Packit |
b099d7 |
(*source->SetSelection)(source, first, last, set_time);
|
|
Packit |
b099d7 |
tw->text.pendingoff = FALSE;
|
|
Packit |
b099d7 |
_XmTextSetCursorPosition(widget, last);
|
|
Packit |
b099d7 |
_XmTextSetDestinationSelection(widget, tw->text.cursor_position, False,
|
|
Packit |
b099d7 |
set_time);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextClearSelection(Widget widget,
|
|
Packit |
b099d7 |
Time clear_time)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldClearSelection(widget, clear_time);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
XmTextSource source = GetSrc(widget);
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
(*source->SetSelection)(source, 1, -999, source->data->prim_time);
|
|
Packit |
b099d7 |
if (tw->text.input->data->pendingdelete) {
|
|
Packit |
b099d7 |
tw->text.pendingoff = FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextGetSelectionPosition(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition *left,
|
|
Packit |
b099d7 |
XmTextPosition *right)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget)) {
|
|
Packit |
b099d7 |
XmTextFieldWidget tf = (XmTextFieldWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!tf->text.has_primary) {
|
|
Packit |
b099d7 |
ret_val = False;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
*left = tf->text.prim_pos_left;
|
|
Packit |
b099d7 |
*right = tf->text.prim_pos_right;
|
|
Packit |
b099d7 |
ret_val = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
ret_val = (*tw->text.source->GetSelection)(tw->text.source, left, right);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmTextPosition
|
|
Packit |
b099d7 |
XmTextXYToPos(Widget widget,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int x,
|
|
Packit |
b099d7 |
int y)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Position x,
|
|
Packit |
b099d7 |
Position y)
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return(XmTextFieldXYToPos(widget, x, y));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
XmTextPosition ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
ret_val = (*tw->text.output->XYToPos)(tw, x, y);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmTextPosToXY(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition position,
|
|
Packit |
b099d7 |
Position *x,
|
|
Packit |
b099d7 |
Position *y)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return(XmTextFieldPosToXY(widget, position, x, y));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
Boolean ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
ret_val = (*tw->text.output->PosToXY)(tw, position, x, y);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Force the given position to be displayed. If position < 0, then don't force
|
|
Packit |
b099d7 |
* any position to be displayed.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextShowPosition(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition position)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
XmTextFieldShowPosition(widget, position);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextShowPosition(widget, position);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
XmTextGetBaseline(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
if (XmIsTextField(widget)) {
|
|
Packit |
b099d7 |
XmTextFieldWidget tf = (XmTextFieldWidget) widget;
|
|
Packit |
b099d7 |
Dimension margin_top;
|
|
Packit |
b099d7 |
int ret_val;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(XmDirectionMatch(XmPrim_layout_direction(tf),
|
|
Packit |
b099d7 |
XmTOP_TO_BOTTOM_RIGHT_TO_LEFT)) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return(0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
margin_top = tf->text.margin_top +
|
|
Packit |
b099d7 |
tf->primitive.shadow_thickness +
|
|
Packit |
b099d7 |
tf->primitive.highlight_thickness;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret_val = (int) margin_top + (int) TextF_FontAscent(tf);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
Dimension *baselines;
|
|
Packit |
b099d7 |
int temp_bl;
|
|
Packit |
b099d7 |
int line_count;
|
|
Packit |
b099d7 |
XmPrimitiveClassExt *wcePtr;
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(XmDirectionMatch(XmPrim_layout_direction(tw),
|
|
Packit |
b099d7 |
XmTOP_TO_BOTTOM_RIGHT_TO_LEFT)) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return(0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
wcePtr = _XmGetPrimitiveClassExtPtr(XtClass(widget), NULLQUARK);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*wcePtr && (*wcePtr)->widget_baseline)
|
|
Packit |
b099d7 |
(void) (*(*wcePtr)->widget_baseline)(widget, &baselines, &line_count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (line_count)
|
|
Packit |
b099d7 |
temp_bl = (int) baselines[0];
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
temp_bl = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((char *) baselines);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return (temp_bl);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
XmTextGetCenterline(Widget widget)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension *baselines;
|
|
Packit |
b099d7 |
int temp_bl;
|
|
Packit |
b099d7 |
int line_count;
|
|
Packit |
b099d7 |
XmPrimitiveClassExt *wcePtr;
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XmDirectionMatch(XmPrim_layout_direction(tw),
|
|
Packit |
b099d7 |
XmTOP_TO_BOTTOM_RIGHT_TO_LEFT)) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return(0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
wcePtr = _XmGetPrimitiveClassExtPtr(XtClass(widget), NULLQUARK);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*wcePtr && (*wcePtr)->widget_baseline)
|
|
Packit |
b099d7 |
(void) (*(*wcePtr)->widget_baseline)(widget, &baselines, &line_count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (line_count)
|
|
Packit |
b099d7 |
temp_bl = (int) baselines[0];
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
temp_bl = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((char *) baselines);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return (temp_bl);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmTextSetHighlight(Widget w,
|
|
Packit |
b099d7 |
XmTextPosition left,
|
|
Packit |
b099d7 |
XmTextPosition right,
|
|
Packit |
b099d7 |
XmHighlightMode mode)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(w)) {
|
|
Packit |
b099d7 |
XmTextFieldSetHighlight(w, left, right, mode);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
_XmTextSetHighlight(w, left, right, mode);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
_XmTextGetSubstring(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition start,
|
|
Packit |
b099d7 |
int num_chars,
|
|
Packit |
b099d7 |
int buf_size,
|
|
Packit |
b099d7 |
char *buffer,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int want_wchar)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean want_wchar)
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTextWidget tw = (XmTextWidget) widget;
|
|
Packit |
b099d7 |
XmTextBlockRec block;
|
|
Packit |
b099d7 |
XmTextPosition pos, end;
|
|
Packit |
b099d7 |
wchar_t * wc_buffer = (wchar_t*)buffer;
|
|
Packit |
b099d7 |
int destpos = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
end = start + num_chars;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_chars = 0; /* We're done with the value passed in, so let's
|
|
Packit |
b099d7 |
* re-use it when needed for the wchar functionality
|
|
Packit |
b099d7 |
* instead of creating a local automatic variable.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (pos = start; pos < end;) {
|
|
Packit |
b099d7 |
pos = (*tw->text.source->ReadSource)(tw->text.source, pos, end,
|
|
Packit |
b099d7 |
&block);
|
|
Packit |
b099d7 |
if (block.length == 0) {
|
|
Packit |
b099d7 |
if (!want_wchar)
|
|
Packit |
b099d7 |
buffer[destpos] = '\0';
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
wc_buffer[destpos] = (wchar_t)0L;
|
|
Packit |
b099d7 |
return XmCOPY_TRUNCATED;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!want_wchar) {
|
|
Packit |
b099d7 |
if (((destpos + block.length) * sizeof(char)) >= buf_size)
|
|
Packit |
b099d7 |
return XmCOPY_FAILED;
|
|
Packit |
b099d7 |
} else { /* Need number of characters for buffer comparison */
|
|
Packit |
b099d7 |
num_chars = _XmTextCountCharacters(block.ptr, block.length);
|
|
Packit |
b099d7 |
if (((destpos + num_chars) * sizeof(char)) >= buf_size)
|
|
Packit |
b099d7 |
return XmCOPY_FAILED;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!want_wchar) {
|
|
Packit |
b099d7 |
(void)memcpy((void*)&buffer[destpos], (void*)block.ptr,
|
|
Packit |
b099d7 |
block.length);
|
|
Packit |
b099d7 |
destpos += block.length;
|
|
Packit |
b099d7 |
} else { /* want wchar_t* data */
|
|
Packit |
b099d7 |
num_chars = mbstowcs(&wc_buffer[destpos], block.ptr, num_chars);
|
|
Packit |
b099d7 |
if (num_chars < 0) num_chars = 0;
|
|
Packit |
b099d7 |
destpos += num_chars;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!want_wchar)
|
|
Packit |
b099d7 |
buffer[destpos] = '\0';
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
wc_buffer[destpos] = (wchar_t)0L;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XmCOPY_SUCCEEDED;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
XmTextGetSubstring(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition start,
|
|
Packit |
b099d7 |
int num_chars,
|
|
Packit |
b099d7 |
int buf_size,
|
|
Packit |
b099d7 |
char *buffer)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return (XmTextFieldGetSubstring(widget, start, num_chars,
|
|
Packit |
b099d7 |
buf_size, buffer));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
int ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
ret_val =_XmTextGetSubstring(widget, start, num_chars, buf_size,
|
|
Packit |
b099d7 |
buffer, False);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
XmTextGetSubstringWcs(Widget widget,
|
|
Packit |
b099d7 |
XmTextPosition start,
|
|
Packit |
b099d7 |
int num_chars,
|
|
Packit |
b099d7 |
int buf_size,
|
|
Packit |
b099d7 |
wchar_t *buffer)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsTextField(widget))
|
|
Packit |
b099d7 |
return (XmTextFieldGetSubstringWcs(widget, start, num_chars,
|
|
Packit |
b099d7 |
buf_size, buffer));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
int ret_val;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
ret_val =_XmTextGetSubstring(widget, start, num_chars, buf_size,
|
|
Packit |
b099d7 |
(char*) buffer, True);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|