Blame lib/Xm/TextFunc.c

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
}