cdesktopenv/cde/programs/dtcreate/af_aux.c

687 lines
28 KiB
C

/*
* 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: af_aux.c /main/6 1998/04/06 13:14:19 mgreess $ */
/******************************************************************************/
/* */
/* af_aux - auxiliary functions for add filetype */
/* */
/* Functions to get/set values from/to interface. */
/* Callback routines for AF interface. */
/* */
/******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <errno.h>
#include <unistd.h>
#include <X11/cursorfont.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <Xm/Xm.h>
#include <Xm/TextF.h>
#include <Xm/RowColumnP.h>
#include <Xm/MessageB.h>
#include <Xm/FileSB.h>
#include <Xm/List.h>
#include <sys/stat.h>
#if defined(AIXV3)
# include <sys/dir.h>
#else
# if defined(__linux__)
# include <dirent.h>
# else
# include <sys/dirent.h>
# endif
#endif
#include <Dt/Icon.h>
#include "dtcreate.h"
#include "af_aux.h"
#include "cmncbs.h"
#include "cmnutils.h"
#include "cmnrtns.h"
#include "ErrorDialog.h"
#include "FileCharacteristics.h"
/******************************************************************************/
/* */
/* External Variables */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* Variables */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* CALLBACK FUNCTIONS */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* get_selected_filetype_icon - determines which filetype icon is currently */
/* selected. */
/* */
/* INPUT: none */
/* OUTPUT: Widget wid - id of selected icon gadget */
/* */
/******************************************************************************/
Widget get_selected_filetype_icon (void)
{
if (!last_filetype_pushed) {
last_filetype_pushed = AF_MED_IconGadget;
}
return (last_filetype_pushed);
}
/******************************************************************************/
/* */
/* activateCB_filetype_icon */
/* */
/* INPUT: Widget wid - id of icon gadget */
/* XtPointer client_data - not used */
/* XmPushButtonCallbackStruct *cbs - not used */
/* OUTPUT: none */
/* */
/******************************************************************************/
void activateCB_filetype_icon (Widget wid, XtPointer client_data,
DtIconCallbackStruct *cbs)
{
Time lts, mct = 0;
static Time prev_lts = 0;
if (cbs->reason == XmCR_ACTIVATE) {
#ifdef DEBUG
printf("In activate_filetype_icon callback.\n");
#endif
if (last_filetype_pushed && (last_filetype_pushed != wid)) {
XtVaSetValues(XtParent(last_filetype_pushed), XmNborderWidth, 0, NULL);
}
XtVaSetValues(XtParent(wid), XmNborderWidth, ICON_BORDER_WIDTH, NULL);
last_filetype_pushed = wid;
/********************************************************************/
/* This is the support needed to provide double-click functionality */
/* to the icon gadgets. When double-clicked, the icon editor will */
/* be launched. */
/********************************************************************/
XtVaSetValues(wid, XmNpushButtonClickTime, 0, NULL);
lts = XtLastTimestampProcessed(XtDisplay(wid));
mct = XtGetMultiClickTime(XtDisplay(wid));
if ((prev_lts + mct) > lts) {
prev_lts = XtLastTimestampProcessed(XtDisplay(wid));
} else {
prev_lts = XtLastTimestampProcessed(XtDisplay(wid));
return;
}
#ifdef DEBUG
printf("DblClick icon callback.\n");
#endif
activateCB_edit_icon(wid, (XtPointer)CA_FILETYPE_ICONS,
(XmPushButtonCallbackStruct *)cbs /* unused anyway */);
}
return;
}
/******************************************************************************/
/* */
/* readAFFromGUI - */
/* */
/* */
/* */
/******************************************************************************/
void readAFFromGUI (FiletypeData *pFiletypedata)
{
getAF_FiletypeName(pFiletypedata);
getAF_HelpText(pFiletypedata);
getAF_OpenCmd(pFiletypedata);
getAF_PrintCmd(pFiletypedata);
getAF_Icons(pFiletypedata);
return;
}
/******************************************************************************/
/* */
/* getAF_FiletypeName - get name of filetype family */
/* */
/* INPUT: FiletypeData *pFiletypedata - pointer to filetype data structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void getAF_FiletypeName (FiletypeData *pFiletypedata)
{
GetWidgetTextString(AF_FileTypeNameTextField, &(pFiletypedata->pszName));
return;
}
/******************************************************************************/
/* */
/* getAF_HelpText - retrieve the Help text for the filetype */
/* */
/* INPUT: FiletypeData *pFiletypedata - pointer to filetype data structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void getAF_HelpText (FiletypeData *pFiletypedata)
{
GetWidgetTextString(AF_FiletypeHelpText, &(pFiletypedata->pszHelp));
return;
}
/******************************************************************************/
/* */
/* getAF_Icons - store temporary icon names. */
/* */
/* INPUT: FiletypeData *pFiletypedata - pointer to filetype data structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void getAF_Icons(FiletypeData *pFiletypedata)
{
IconData *pIconData;
/***************************************************************/
/* Medium Pixmap */
/***************************************************************/
pIconData = GetIconDataFromWid(AF_MED_IconGadget);
if ( (pIconData->pmDirtyBit) &&
(pIconData->pmFileName[0]) &&
(strlen(pIconData->pmFileName)) ) {
pFiletypedata->pszMedPmIcon = XtMalloc(strlen(pIconData->pmFileName) + 1);
if (pFiletypedata->pszMedPmIcon) {
strcpy(pFiletypedata->pszMedPmIcon, pIconData->pmFileName);
}
}
pIconData->pmDirtyBit = False;
strcpy(pIconData->pmFileName, "");
/***************************************************************/
/* Medium Bitmap */
/***************************************************************/
if ( (pIconData->bmDirtyBit) &&
(pIconData->bmFileName[0]) &&
(strlen(pIconData->bmFileName)) ) {
pFiletypedata->pszMedBmIcon = XtMalloc(strlen(pIconData->bmFileName) + 1);
if (pFiletypedata->pszMedBmIcon) {
strcpy(pFiletypedata->pszMedBmIcon, pIconData->bmFileName);
}
}
pIconData->bmDirtyBit = False;
strcpy(pIconData->bmFileName, "");
/***************************************************************/
/* Tiny Pixmap */
/***************************************************************/
pIconData = GetIconDataFromWid(AF_TINY_IconGadget);
if ( (pIconData->pmDirtyBit) &&
(pIconData->pmFileName[0]) &&
(strlen(pIconData->pmFileName)) ) {
pFiletypedata->pszTinyPmIcon = XtMalloc(strlen(pIconData->pmFileName) + 1);
if (pFiletypedata->pszTinyPmIcon) {
strcpy(pFiletypedata->pszTinyPmIcon, pIconData->pmFileName);
}
}
pIconData->pmDirtyBit = False;
strcpy(pIconData->pmFileName, "");
/***************************************************************/
/* Tiny Bitmap */
/***************************************************************/
if ( (pIconData->bmDirtyBit) &&
(strlen(pIconData->bmFileName)) ) {
pFiletypedata->pszTinyBmIcon = XtMalloc(strlen(pIconData->bmFileName) + 1);
if (pFiletypedata->pszTinyBmIcon) {
strcpy(pFiletypedata->pszTinyBmIcon, pIconData->bmFileName);
}
}
pIconData->bmDirtyBit = False;
strcpy(pIconData->bmFileName, "");
#if 0
Widget AF_wids[2];
int i;
AF_wids[0] = AF_MED_IconGadget;
AF_wids[1] = AF_TINY_IconGadget;
for (i=0; i < 2; i++) {
/* pixmap */
pIconData = GetIconDataFromWid(AF_wids[i]);
if ( (pIconData->pmDirtyBit) &&
(pIconData->pmFileName) &&
(strlen(pIconData->pmFileName)) ) {
pFiletypedata->pszMedPmIcon = XtMalloc(strlen(pIconData->pmFileName) + 1);
if (pFiletypedata->pszMedPmIcon) {
strcpy(pFiletypedata->pszMedPmIcon, pIconData->pmFileName);
}
}
pIconData->pmDirtyBit = False;
strcpy(pIconData->pmFileName, "");
/* bitmap */
if ( (pIconData->bmDirtyBit) &&
(pIconData->bmFileName) &&
(strlen(pIconData->bmFileName)) ) {
pFiletypedata->pszMedBmIcon = XtMalloc(strlen(pIconData->bmFileName) + 1);
if (pFiletypedata->pszMedBmIcon) {
strcpy(pFiletypedata->pszMedBmIcon, pIconData->bmFileName);
}
}
pIconData->bmDirtyBit = False;
strcpy(pIconData->bmFileName, "");
}
#endif
}
/******************************************************************************/
/* */
/* getAF_OpenCmd - retrieve the Open command string */
/* */
/* INPUT: FiletypeData *pFiletypedata - pointer to filetype data structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void getAF_OpenCmd (FiletypeData *pFiletypedata)
{
GetWidgetTextString(AF_OpenCmdText, &(pFiletypedata->pszOpenCmd));
return;
}
/******************************************************************************/
/* */
/* getAF_PrintCmd - retrieve Print command string */
/* */
/* INPUT: FiletypeData *pFiletypedata - pointer to filetype data structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void getAF_PrintCmd (FiletypeData *pFiletypedata)
{
GetWidgetTextString(AF_FiletypePrintCmdTextField, &(pFiletypedata->pszPrintCmd));
return;
}
/******************************************************************************/
/* */
/* init_AddFiletype_dialog_fields */
/* */
/* INPUT: FiletypeData * - pointer to FiletypeData structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void init_AddFiletype_dialog_fields(FiletypeData *pFtD)
{
char *pszIconFileName = (char *)NULL;
char *pszTmpFile;
if (pFtD->pszName) {
PutWidgetTextString(AF_FileTypeNameTextField, pFtD->pszName);
}
ParseAndUpdateID(pFtD);
if (pFtD->pszHelp) {
PutWidgetTextString(AF_FiletypeHelpText, pFtD->pszHelp);
}
if (pFtD->pszIcon) {
if (bShowPixmaps) {
/*************************/
/* Medium Pixmap */
/*************************/
if (pFtD->pszMedPmIcon) {
SET_ICONGADGET_ICON(AF_MED_IconGadget, pFtD->pszMedPmIcon);
} else {
pszIconFileName = (char *)NULL;
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtMEDIUM);
pszTmpFile = GetCorrectIconType(pszIconFileName);
SET_ICONGADGET_ICON(AF_MED_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
if (pszTmpFile) XtFree(pszTmpFile);
}
/*************************/
/* Tiny Pixmap */
/*************************/
if (pFtD->pszTinyPmIcon) {
SET_ICONGADGET_ICON(AF_TINY_IconGadget, pFtD->pszTinyPmIcon);
} else {
pszIconFileName = (char *)NULL;
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtTINY);
pszTmpFile = GetCorrectIconType(pszIconFileName);
SET_ICONGADGET_ICON(AF_TINY_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
if (pszTmpFile) XtFree(pszTmpFile);
}
} else {
/*************************/
/* Medium Pixmap */
/*************************/
if (pFtD->pszMedBmIcon) {
SET_ICONGADGET_ICON(AF_MED_IconGadget, pFtD->pszMedBmIcon);
} else {
pszIconFileName = (char *)NULL;
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtMEDIUM);
pszTmpFile = GetCorrectIconType(pszIconFileName);
SET_ICONGADGET_ICON(AF_MED_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
if (pszTmpFile) XtFree(pszTmpFile);
}
/*************************/
/* Tiny Pixmap */
/*************************/
if (pFtD->pszTinyBmIcon) {
SET_ICONGADGET_ICON(AF_TINY_IconGadget, pFtD->pszTinyBmIcon);
} else {
pszIconFileName = (char *)NULL;
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtTINY);
pszTmpFile = GetCorrectIconType(pszIconFileName);
SET_ICONGADGET_ICON(AF_TINY_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
if (pszTmpFile) XtFree(pszTmpFile);
}
}
#if 0
/*************************/
/* Tiny Pixmap */
/*************************/
pszIconFileName = (char *)NULL;
if (pFtD->pszTinyPmIcon) {
pszTmpFile = pFtD->pszTinyPmIcon;
} else {
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtTINY);
pszTmpFile = pszIconFileName;
}
SET_ICONGADGET_ICON(AF_TINY_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
} else {
/*************************/
/* Medium Bitmap */
/*************************/
pszIconFileName = (char *)NULL;
if (pFtD->pszMedBmIcon) {
pszTmpFile = pFtD->pszMedBmIcon;
} else {
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtMEDIUM);
pszTmpFile = pszIconFileName;
}
SET_ICONGADGET_ICON(AF_MED_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
/*************************/
/* Tiny Bitmap */
/*************************/
pszIconFileName = (char *)NULL;
if (pFtD->pszTinyBmIcon) {
pszTmpFile = pFtD->pszTinyBmIcon;
} else {
FIND_ICONGADGET_ICON(pFtD->pszIcon, pszIconFileName, DtTINY);
pszTmpFile = pszIconFileName;
}
SET_ICONGADGET_ICON(AF_TINY_IconGadget, pszTmpFile);
if (pszIconFileName) XtFree(pszIconFileName);
}
#endif
}
if (pFtD->pszOpenCmd) {
PutWidgetTextString(AF_OpenCmdText, pFtD->pszOpenCmd);
}
if (pFtD->pszPrintCmd) {
PutWidgetTextString(AF_FiletypePrintCmdTextField, pFtD->pszPrintCmd);
}
return;
}
/******************************************************************************/
/* */
/* clear_AddFiletype_dialog_fields */
/* */
/* INPUT: FiletypeData * - pointer to FiletypeData structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void clear_AddFiletype_dialog_fields(void)
{
/*char pszFile[MAXBUFSIZE];*/
clear_text(AF_FileTypeNameTextField);
clear_text(AF_IdCharacteristicsText);
clear_text(AF_FiletypeHelpText);
createCB_IconGadget(AF_MED_IconGadget, FALSE, Medium_Icon);
createCB_IconGadget(AF_TINY_IconGadget, FALSE, Tiny_Icon);
/*
SET_ICONGADGET_ICON_AND_EXT(AF_MED_IconGadget, af_med_icon_default, pszFile);
SET_ICONGADGET_ICON_AND_EXT(AF_TINY_IconGadget, af_tiny_icon_default, pszFile);
*/
clear_text(AF_OpenCmdText);
clear_text(AF_FiletypePrintCmdTextField);
return;
}
/******************************************************************************/
/* */
/* free_Filetypedata */
/* */
/* INPUT: FiletypeData * - pointer to FiletypeData structure */
/* OUTPUT: none */
/* */
/******************************************************************************/
void free_Filetypedata(FiletypeData *pFtD)
{
char buffer[MAXFILENAME];
#ifdef DEBUG
printf("Free FiletypeData structure\n"); /* debug */
#endif
if (pFtD->pszName) XtFree(pFtD->pszName);
#if DEBUG
printf("Freed Name\n");
#endif
if (pFtD->pszIcon) XtFree(pFtD->pszIcon);
if (pFtD->pszMedPmIcon) {
#if DEBUG
printf("free_Filetypedata: unlink '%s'\n", pFtD->pszMedPmIcon); /* debug */
#endif
unlink(pFtD->pszMedPmIcon);
XtFree(pFtD->pszMedPmIcon);
}
if (pFtD->pszMedBmIcon) {
#if DEBUG
printf("free_Filetypedata: unlink '%s'\n", pFtD->pszMedBmIcon); /* debug */
#endif
unlink(pFtD->pszMedBmIcon);
/**** remove the mask if it exists ****/
sprintf(buffer, "%s_m", pFtD->pszMedBmIcon);
unlink(buffer);
XtFree(pFtD->pszMedBmIcon);
}
if (pFtD->pszTinyPmIcon) {
#if DEBUG
printf("free_Filetypedata: unlink '%s'\n", pFtD->pszTinyPmIcon); /* debug */
#endif
unlink(pFtD->pszTinyPmIcon);
XtFree(pFtD->pszTinyPmIcon);
}
if (pFtD->pszTinyBmIcon) {
#if DEBUG
printf("free_Filetypedata: unlink '%s'\n", pFtD->pszTinyBmIcon); /* debug */
#endif
unlink(pFtD->pszTinyBmIcon);
/**** remove the mask if it exists ****/
sprintf(buffer, "%s_m", pFtD->pszTinyBmIcon);
unlink(buffer);
XtFree(pFtD->pszTinyBmIcon);
}
if (pFtD->pszHelp) XtFree(pFtD->pszHelp);
if (pFtD->pszOpenCmd) XtFree(pFtD->pszOpenCmd);
if (pFtD->pszPrintCmd) XtFree(pFtD->pszPrintCmd);
if (pFtD->pszPattern) XtFree(pFtD->pszPattern);
if (pFtD->pszPermissions) XtFree(pFtD->pszPermissions);
if (pFtD->pszContents) XtFree(pFtD->pszContents);
XtFree((char *) pFtD);
return;
}
/******************************************************************************/
/* */
/* AddFiletypeToList */
/* */
/* INPUT: none */
/* OUTPUT: none */
/* */
/******************************************************************************/
void AddFiletypeToList(void)
{
if (!XmListItemExists(CA_FiletypesList, XmStringCreateSimple(XmTextFieldGetString(AF_FileTypeNameTextField)))) {
XmListAddItem(CA_FiletypesList, XmStringCreateSimple(XmTextFieldGetString(AF_FileTypeNameTextField)), 0);
}
}
/******************************************************************************/
/* */
/* UpdateFiletypeDataArray */
/* */
/* INPUT: none */
/* OUTPUT: none */
/* */
/******************************************************************************/
void UpdateFiletypeDataArray(FiletypeData *pFtD)
{
FiletypeData **papArray;
int i;
/**************************************************************************/
/* Add this structure to the filetype array in the ActionData structure. */
/**************************************************************************/
papArray = (FiletypeData **) XtMalloc(sizeof(FiletypeData *) * (AD.cFiletypes + 1));
for (i=0; i < AD.cFiletypes; i++) {
papArray[i] = AD.papFiletypes[i];
}
papArray[AD.cFiletypes] = pFtD;
if (AD.papFiletypes) {
XtFree((char *) AD.papFiletypes);
}
AD.papFiletypes = papArray;
AD.cFiletypes++;
}
/******************************************************************************/
/* */
/* AddFiletypeCheckFields */
/* */
/* INPUT: none */
/* OUTPUT: FALSE - no errors found */
/* TRUE - found errors */
/* */
/******************************************************************************/
Boolean AddFiletypeCheckFields(void)
{
char *ptr = (char *)NULL;
Boolean bError = FALSE;
char *msgPtr, *errPtr;
/**************************************************************************/
/* Check if filetype name is present. */
/**************************************************************************/
if (!bError) {
ptr = (char *)NULL;
GetWidgetTextString(AF_FileTypeNameTextField, &ptr);
#ifdef DEBUG
printf("Filetype Family Name = '%s'\n", ptr);
#endif
if (!ptr) {
msgPtr = GETMESSAGE(8, 10, "The Datatype Family Name is missing.\n\
Enter a name in the 'Name of Datatype Family' field.");
errPtr = XtNewString(msgPtr);
display_error_message(AddFiletype, errPtr);
XtFree(errPtr);
XmProcessTraversal(AF_FileTypeNameTextField, XmTRAVERSE_CURRENT);
bError = TRUE;
} else {
XtFree(ptr);
}
}
/**************************************************************************/
/* Check if identifying characteristics are present. */
/**************************************************************************/
if (!bError) {
ptr = (char *)NULL;
GetWidgetTextString(AF_IdCharacteristicsText, &ptr);
#ifdef DEBUG
printf("Identifying Chars = '%s'\n", ptr);
#endif
if (!ptr) {
msgPtr = GETMESSAGE(8, 15,
"The Identifying Characteristics are missing.\n\
You must specify the characteristics before the datatype\n\
can be created. Select the Edit button next to the\n\
Identifying Characteristics list to specify the characteristics.");
errPtr = XtNewString(msgPtr);
display_error_message(AddFiletype, errPtr);
XtFree(errPtr);
XmProcessTraversal(AF_IdCharacteristicsEdit, XmTRAVERSE_CURRENT);
bError = TRUE;
} else {
XtFree(ptr);
}
}
return(bError);
}