123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $TOG: text.c /main/5 1999/07/20 14:50:18 mgreess $ */
- /*****************************************************************************
- *****************************************************************************
- **
- ** File: text.c
- **
- ** Description: Text transfer functions for the CDE Drag & Drop Demo.
- **
- ** (c) Copyright 1993, 1994 Hewlett-Packard Company
- ** (c) Copyright 1993, 1994 International Business Machines Corp.
- ** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
- ** (c) Copyright 1993, 1994 Unix System Labs, Inc., a subsidiary of
- ** Novell, Inc.
- **
- ****************************************************************************
- ************************************<+>*************************************/
- #include <X11/Intrinsic.h>
- #include <Xm/Xm.h>
- #include <Xm/Label.h>
- #include <Xm/List.h>
- #include <Xm/RowColumn.h>
- #include <Xm/Text.h>
- #include <Dt/Dt.h>
- #include <Dt/Dnd.h>
- #include "demo.h"
- #include "text.h"
- /*************************************************************************
- *
- * Data Structures & Private Declarations For Text Transfers
- *
- **************************************************************************/
- /*
- * Data for text list of fruit
- */
- char *todaysFruit[] = {
- "Oranges",
- "Peaches",
- "Lemons",
- "Watermelons",
- "Apples",
- "Bananas",
- "Plums",
- "Limes",
- "Cantaloupes",
- "Nectarines",
- "Papayas",
- "Mangos",
- NULL
- };
- /*************************************************************************
- *
- * Text Drag & Drop
- *
- *************************************************************************/
- /*
- * textConvertCallback
- *
- * Sets the text object's text to the text in the fruit list based on where
- * the pointer was when the drag started.
- */
- void
- textConvertCallback(
- Widget dragContext,
- XtPointer clientData,
- XtPointer callData)
- {
- DtDndConvertCallbackStruct *convertInfo =
- (DtDndConvertCallbackStruct *) callData;
- Widget fruitList = (Widget) clientData;
- int selectedPos;
- XmString *items;
- Cardinal itemCount;
- if (convertInfo == NULL) {
- return;
- }
- /*
- * Verify protocol and callback reason
- */
- if (convertInfo->dragData->protocol != DtDND_TEXT_TRANSFER ||
- (convertInfo->reason != DtCR_DND_CONVERT_DATA &&
- convertInfo->reason != DtCR_DND_CONVERT_DELETE) ||
- fruitList == NULL) {
- return;
- }
- switch (convertInfo->reason) {
- case DtCR_DND_CONVERT_DATA:
- /*
- * Provide the text from the fruit list
- */
- XtVaGetValues(fruitList,
- XmNuserData, &selectedPos,
- XmNitems, &items,
- XmNitemCount, &itemCount,
- NULL);
- if (itemCount > 0 && selectedPos < itemCount) {
- convertInfo->dragData->data.strings[0] =
- items[selectedPos-1];
- } else {
- convertInfo->status = DtDND_FAILURE;
- }
- break;
- DtCR_DND_CONVERT_DELETE:
- /*
- * Delete the text from the fruit list. If the fruit list
- * were set up to be dynamic, deletion from the list would
- * occur here.
- */
- printf("Delete fruit item #%d\n",
- convertInfo->dragData->data.strings[0]);
- break;
- }
- }
- /*
- * textDragFinishCallback
- *
- * Normally would free any memory allocated by textConvertCallback
- * but none was allocated so this is just a placeholder.
- */
- void
- textDragFinishCallback(
- Widget widget,
- XtPointer clientData,
- XtPointer callData)
- {
- }
- /*
- * textTransferCallback
- *
- * Handles transfer of files or text to the text edit. Files are transfered
- * by placing their name in the field, text by inserting the text into the
- * field.
- */
- void
- textTransferCallback(
- Widget widget,
- XtPointer clientData,
- XtPointer callData)
- {
- DtDndTransferCallbackStruct *transferInfo =
- (DtDndTransferCallbackStruct *) callData;
- String text;
- /*
- * Verify callback reason
- */
- if (transferInfo == NULL ||
- transferInfo->reason != DtCR_DND_TRANSFER_DATA) {
- return;
- }
- switch (transferInfo->dropData->protocol) {
- case DtDND_FILENAME_TRANSFER:
- /*
- * Copy the file name into the text field
- */
- XtVaSetValues(widget,
- XmNvalue, transferInfo->dropData->data.files[0],
- NULL);
- break;
- case DtDND_TEXT_TRANSFER:
- /*
- * Copy the fruit name into the text field
- */
- text = XmStringUnparse(transferInfo->dropData->data.strings[0],
- NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
- XtVaSetValues(widget, XmNvalue, text, NULL);
- XtFree (text);
- break;
- }
- }
- /*
- * textDragSetup
- *
- * Prepares the fruit list to source drags of text with button 1.
- */
- void textDragSetup(Widget fruitList)
- {
- static char translations[] = "\
- ~c ~s ~m ~a <Btn1Down>:\
- demoProcessPress(ListBeginSelect,textDragStart)\n\
- c ~s ~m ~a <Btn1Down>:\
- demoProcessPress(ListBeginToggle,textDragStart)";
- static char btn2_translations[] = "\
- ~c ~s ~m ~a <Btn2Down>:\
- demoProcessPress(ListBeginSelect,textDragStart)\n\
- c ~s ~m ~a <Btn2Down>:\
- demoProcessPress(ListBeginToggle,textDragStart)\n\
- <Btn2Motion>:ListButtonMotion()\n\
- ~c ~s ~m ~a <Btn2Up>:ListEndSelect()\n\
- c ~s ~m ~a <Btn2Up>:ListEndToggle()";
- static XtActionsRec actionTable[] =
- {
- {"textDragStart", (XtActionProc) &textDragStart},
- {"demoProcessPress", (XtActionProc) &demoProcessPress}
- };
- int btn1_transfer = 0;
- XtTranslations new_translations;
- XtAppAddActions(
- demoAppContext,
- actionTable,
- sizeof(actionTable)/sizeof(actionTable[0]));
- new_translations = XtParseTranslationTable(translations);
- XtOverrideTranslations(fruitList, new_translations);
- XtVaGetValues(
- (Widget) XmGetXmDisplay(XtDisplayOfObject(fruitList)),
- "enableBtn1Transfer", &btn1_transfer,
- NULL);
-
- if (btn1_transfer != True)
- {
- new_translations = XtParseTranslationTable(btn2_translations);
- XtOverrideTranslations(fruitList, new_translations);
- }
- #if 0
- XtAddEventHandler(fruitList, Button1MotionMask, False,
- (XtEventHandler)demoDragMotionHandler,
- (XtPointer)DtDND_TEXT_TRANSFER);
- #endif
- }
- /*
- * textDropSetup
- *
- * Registers text field to accept drops of files.
- */
- void
- textDropSetup(
- Widget textField)
- {
- static XtCallbackRec transferCBRec[] = { {textTransferCallback, NULL},
- {NULL, NULL} };
- DtDndDropRegister(textField, DtDND_FILENAME_TRANSFER,
- XmDROP_COPY, transferCBRec, NULL, 0);
- }
- /*
- * textDragStart
- *
- * Initiates a drag of a text item from the fruit list provided the pointer
- * is over an item in the list.
- */
- void
- textDragStart(
- Widget widget,
- XEvent *event)
- {
- int itemCount,
- selectedPos;
- static XtCallbackRec convertCBRec[] = { {textConvertCallback, NULL},
- {NULL, NULL} };
- static XtCallbackRec dragFinishCBRec[] =
- { {demoDragFinishCallback, NULL},
- {textDragFinishCallback, NULL},
- {NULL, NULL} };
- /*
- * Determine which item to drag from the text list
- */
- XtVaGetValues(widget, XmNitemCount, &itemCount, NULL);
- selectedPos = XmListYToPos(widget, event->xmotion.y);
- if (selectedPos == 0 || selectedPos > itemCount) {
- return;
- }
- XtVaSetValues(widget, XmNuserData, selectedPos, NULL);
- convertCBRec[0].closure = (XtPointer)widget;
- /*
- * Start the drag
- */
- if (DtDndDragStart(widget, event, DtDND_TEXT_TRANSFER, 1,
- XmDROP_COPY, convertCBRec, dragFinishCBRec, NULL, 0)
- == NULL) {
- printf("DragStart returned NULL.\n");
- }
- }
- /*************************************************************************
- *
- * Text Creation & Initialization
- *
- *************************************************************************/
- /*
- * textCreateDragSource
- *
- * Creates a scrolling list filled with fruit names.
- */
- Widget
- textCreateDragSource(
- Widget parent)
- {
- Widget fruitList;
- XmString *fruits;
- Arg args[2];
- int ii, fruitCount;
- for (ii = 0; todaysFruit[ii] != NULL; ii++)
- ;
- fruitCount = ii;
- fruits = (XmString *) XtMalloc(sizeof(XmString) * fruitCount);
- for (ii = 0; ii < fruitCount; ii++) {
- fruits[ii] = XmStringCreate(todaysFruit[ii],
- XmFONTLIST_DEFAULT_TAG);
- }
- ii = 0;
- XtSetArg(args[ii], XmNitems, fruits); ii++;
- XtSetArg(args[ii], XmNitemCount, fruitCount); ii++;
- fruitList = XmCreateScrolledList(parent, "fruitList", args, ii);
- XtManageChild(fruitList);
- for (ii = 0; ii < fruitCount; ii++) {
- XmStringFree(fruits[ii]);
- }
- XtFree((char *)fruits);
- return fruitList;
- }
- /*
- * textCreateDropSite
- *
- * Creates a text field with a label.
- */
- Widget
- textCreateDropSite(
- Widget parent)
- {
- Widget textRowColumn,
- textLabel,
- textField;
- textRowColumn = XtVaCreateManagedWidget("textRowColumn",
- xmRowColumnWidgetClass, parent,
- NULL);
- textLabel = XtVaCreateManagedWidget("textLabel",
- xmLabelWidgetClass, textRowColumn,
- NULL);
- textField = XtVaCreateManagedWidget("textField",
- xmTextWidgetClass, textRowColumn,
- NULL);
- return textField;
- }
|