ftp.nice.ch/pub/next/database/plz/xplz.3.4.s.tar.gz#/xplz-3.4/gui_build.c

This is gui_build.c in view mode; [Download] [Up]

/* $Id: gui_build.c,v 2.7 1993/06/04 14:46:52 klute Exp klute $ */

/* 
 * Copyright 1993 Rainer Klute <klute@irb.informatik.uni-dortmund.de>
 *
 * Permission to use, copy, modify, distribute, and sell this software and
 * its documentation for any purpose is hereby granted without fee, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation. The author makes no representations about the suitability
 * of this software for any purpose. It is provided "as is" without express
 * or implied warranty.
 *
 */

#include <string.h>

#include <Xm/Xm.h>
#include <Xm/CascadeB.h>
#include <Xm/DialogS.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/Label.h>
#include <Xm/List.h>
#include <Xm/MainW.h>
#include <Xm/PanedW.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/Separator.h>
#include <Xm/Text.h>

#include "Posthorn64.xbm"
#include "Posthorn48.xbm"
#include "batch.h"
#include "patchlevel.h"
#include "gui.h"
#include "ui.h"
#include "gui_batch.h"
#include "gui_utils.h"
#include "message.h"




static XtCallbackProc PositionDialog (Widget widget, XtPointer clientData,
				      XtPointer callData);




/*
 * "CreateMainWindow" erstellt das Hauptfenster des Postleitzahlenprogramms.
 */

Widget CreateMainWindow (Display *display, ConversionData *cd)
{
    Widget applicationShell, mainWindow;
    Widget menubar, commandPulldown, batchPulldown, commands, batch;
    Widget mainForm, inputForm, plzForm, listForm, messageForm;
    Widget fieldForm;
    Widget widget;
    Screen *s;
    Pixmap p;
    char title[200];
    unsigned long posthornForeground, posthornBackground;

    s = DefaultScreenOfDisplay (display);

    strcpy (title, "Das Postleitzahlenbuch (Version ");
    strcat (title, RELEASE);
    strcat (title, ")");
    applicationShell =
    XtVaAppCreateShell ("xplz", "XPlz", applicationShellWidgetClass,
			display,
			XmNtitle, title,
			NULL);


    /* Main window: */
    mainWindow = 
    XtVaCreateManagedWidget ("mainWindow", xmMainWindowWidgetClass, 
			     applicationShell, NULL);

    /* Menu bar: */
    menubar = 
    XmCreateMenuBar (mainWindow, "menuBar", (ArgList) 0, (Cardinal) 0);
    XtManageChild (menubar);

    /* Menu: */
    commandPulldown = 
    XmCreatePulldownMenu (menubar, "commandPulldown", (ArgList) 0, 
			  (Cardinal) 0);
    widget = 
    XtVaCreateManagedWidget ("menuSearch", xmPushButtonWidgetClass,
			     commandPulldown, NULL);
    XtAddCallback (widget, XmNactivateCallback, 
		   (XtCallbackProc) ConvertCallback, cd);
    cd->gc->menuStrassenverzeichnis = 
    XtVaCreateManagedWidget ("menuStreetList", xmPushButtonWidgetClass,
			     commandPulldown,
			     XmNsensitive, False,
			     NULL);
    XtAddCallback (cd->gc->menuStrassenverzeichnis, XmNactivateCallback, 
		   (XtCallbackProc) StrassenverzeichnisCallback, cd);
    widget = 
    XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, commandPulldown,
			     NULL);
    widget = 
    XtVaCreateManagedWidget ("menuQuit", xmPushButtonWidgetClass,
			     commandPulldown, NULL);
    XtAddCallback (widget, XmNactivateCallback, (XtCallbackProc) QuitCallback,
		   NULL);
    commands = XtVaCreateManagedWidget ("menuCommands",
					xmCascadeButtonWidgetClass,
					menubar, 
					XmNsubMenuId, commandPulldown,
					NULL);

    batchPulldown = 
    XmCreatePulldownMenu (menubar, "batchPulldown", (ArgList) 0, (Cardinal) 0);
    cd->gc->menuBatchStart = 
    XtVaCreateManagedWidget ("menuBatchStart", xmPushButtonWidgetClass,
			     batchPulldown,
			     XmNsensitive, True,
			     NULL);
    XtAddCallback (cd->gc->menuBatchStart, XmNactivateCallback,
		   (XtCallbackProc) BatchStart, cd);
    cd->gc->menuBatchContinue = 
    XtVaCreateManagedWidget ("menuBatchContinue", xmPushButtonWidgetClass,
			     batchPulldown,
			     XmNsensitive, False,
			     NULL);
    XtAddCallback (cd->gc->menuBatchContinue, XmNactivateCallback,
		   (XtCallbackProc) BatchContinue, (XtPointer) cd);
    XtVaCreateManagedWidget ("separator", xmSeparatorWidgetClass,
			     batchPulldown, NULL);
    cd->gc->menuBatchAbort = 
    XtVaCreateManagedWidget ("menuBatchAbort", xmPushButtonWidgetClass,
			     batchPulldown,
			     XmNsensitive, False,
			     NULL);
    XtAddCallback (cd->gc->menuBatchAbort, XmNactivateCallback,
		   (XtCallbackProc) BatchAbort, cd);
    batch = XtVaCreateManagedWidget ("menuBatch",
				     xmCascadeButtonWidgetClass,
				     menubar, 
				     XmNsubMenuId, batchPulldown,
				     NULL);


    /* Alles weitere steckt in einem Form-Widget, ... */
    mainForm = 
    XtVaCreateManagedWidget ("mainForm", xmFormWidgetClass, mainWindow, NULL);

    /* ... das sich wiederum in vier weitere Form-Widgets unterteilt. */
    inputForm = 
    XtVaCreateManagedWidget ("inputForm", xmFormWidgetClass, mainForm, NULL);
    plzForm = 
    XtVaCreateManagedWidget ("plzForm", xmFormWidgetClass, mainForm, NULL);
    listForm = 
    XtVaCreateManagedWidget ("listForm", xmFormWidgetClass, mainForm, NULL);
    messageForm = 
    XtVaCreateManagedWidget ("messageForm", xmFormWidgetClass, mainForm, NULL);

    /* Posthorn und Überschrift: */
    widget = 
    XtVaCreateManagedWidget ("titleForm", xmFormWidgetClass, inputForm, NULL);
    widget =
    XtVaCreateManagedWidget ("posthorn", xmLabelWidgetClass, widget,
                             XmNlabelType, XmPIXMAP,
                             NULL);
    XtVaGetValues (widget, XmNforeground, &posthornForeground,
                           XmNbackground, &posthornBackground, NULL);
    p = XCreatePixmapFromBitmapData (display, RootWindowOfScreen (s),
                                     Posthorn64_bits, Posthorn64_width,
                                     Posthorn64_height, posthornForeground,
                                     posthornBackground, PlanesOfScreen (s));
    XtVaSetValues (widget, XmNlabelPixmap, p, NULL);

    {
	XmString s1;
	s1 = XmStringCreate ("Das", "gross");
	s1 = StringCat (s1, XmStringSeparatorCreate ());
        s1 = StringCat (s1, XmStringCreate ("Postleitzahlenbuch", "gross"));
	s1 = StringCat (s1, XmStringSeparatorCreate ());
	s1 =
	StringCat (s1, XmStringCreate ("© 1993 Rainer Klute, ", "klein"));
	s1 =
	StringCat (s1, XmStringCreate ("Universität Dortmund, IRB", "klein"));
	XtVaCreateManagedWidget ("plzbuch", xmLabelWidgetClass, 
				 XtParent (widget),
				 XmNlabelString, s1,
				 NULL);
	XmStringFree (s1);
    }

    /* Eingabebereich für Straße und Ort: */
    widget = XtVaCreateManagedWidget ("inputFrame", xmFrameWidgetClass,
                             inputForm, NULL);
    fieldForm = 
    XtVaCreateManagedWidget ("fieldForm", xmFormWidgetClass,
                             widget, NULL);

    XtVaCreateManagedWidget ("lstrasse", xmLabelWidgetClass, fieldForm, NULL);
    XtVaCreateManagedWidget ("lort", xmLabelWidgetClass, fieldForm, NULL);

    cd->gc->strasse = 
    XtVaCreateManagedWidget ("strasse", xmTextWidgetClass, fieldForm, NULL);
    XtAddCallback (cd->gc->strasse, XmNactivateCallback, 
		   (XtCallbackProc) ConvertCallback, cd);

    cd->gc->ort =
    XtVaCreateManagedWidget ("ort", xmTextWidgetClass, fieldForm, NULL);
    XtAddCallback (cd->gc->ort, XmNactivateCallback, 
		   (XtCallbackProc) ConvertCallback, cd);


    /* Ausgabefeld für die neue Postleitzahl: */
    widget =
    XtVaCreateManagedWidget ("plzFrame", xmFrameWidgetClass, plzForm,
                             NULL);
    cd->gc->plz_neu = 
    XtVaCreateManagedWidget ("plzneu", xmLabelWidgetClass, widget, NULL);

    /* Auswahlliste: */
    widget = 
    XtVaCreateManagedWidget ("listFrame", xmFrameWidgetClass, listForm,
                             NULL);
    cd->gc->list = XmCreateScrolledList (widget, "list", NULL, 0);
    XtAddCallback (cd->gc->list, XmNdefaultActionCallback, 
		   (XtCallbackProc) ListActivated, cd);
    XtManageChild (cd->gc->list);

    /* Hinweistexte: */
    widget = 
    XtVaCreateManagedWidget ("messageFrame", xmFrameWidgetClass, messageForm,
                             NULL);
    cd->gc->messages = 
    XmCreateScrolledText (widget, "messages", (ArgList) 0, (Cardinal) 0);
    XtVaSetValues (cd->gc->messages, XmNtraversalOn, False, NULL);
    XtManageChild (cd->gc->messages);

    XtRealizeWidget (applicationShell);

    {
    XWMHints *wmHints = XAllocWMHints ();
    if (wmHints == (XWMHints *) 0)
    {
	Message ("Speichermangel in \"main\"\n");
	exit (-1);
    }
    p = XCreateBitmapFromData (display, RootWindowOfScreen (s),
                                     Posthorn48_bits, Posthorn48_width,
                                     Posthorn48_height);
    wmHints->flags = IconPixmapHint;
    wmHints->icon_pixmap = p;
    XSetWMHints (display, XtWindow (applicationShell), wmHints);
    XtFree ((void *) wmHints);
    }
    return applicationShell;
}




/*
 * "CreateBatchDialog" baut den Dialog für die Stapelverarbeitung auf.
 */

Widget CreateBatchDialog (Widget widget, ConversionData *cd)
{
    Widget dialog, pane, form;
    Widget control;
    Widget w;
    char help[100];
    Widget pulldown;
    Widget fehlerMenu, ausgabeFormatMenu, verkehrsgebietMenu;
    Arg args[10];
    Cardinal argcount;


    /* DialogShell */

    dialog =
    XtVaCreatePopupShell ("batch_dialog", xmDialogShellWidgetClass,
			  TopLevelShell (cd->gc->ort),
			  XmNdeleteResponse, XmDESTROY,
			  NULL);
    XtAddCallback (dialog, XmNpopupCallback, (XtCallbackProc) PositionDialog,
		   (XtPointer) widget);

    pane =
    XtVaCreateWidget ("pane", xmPanedWindowWidgetClass, dialog,
		      NULL);

    control =
    XtVaCreateManagedWidget ("control", xmFormWidgetClass, pane, NULL);
    XtVaCreateManagedWidget ("labelInputFile", xmLabelWidgetClass, control,
			     NULL);
    XtVaCreateManagedWidget ("labelOutputFile", xmLabelWidgetClass, control,
			     NULL);
    XtVaCreateManagedWidget ("labelErrorFile", xmLabelWidgetClass, control,
			     NULL);

    cd->gc->inputFile =
    XtVaCreateManagedWidget ("inputFile", xmTextWidgetClass, control,
			     XmNvalue, cd->batch->inputFile,
			     XmNmaxLength, 256,
			     NULL);
    cd->gc->outputFile =
    XtVaCreateManagedWidget ("outputFile", xmTextWidgetClass, control,
			     XmNvalue, cd->batch->outputFile,
			     XmNmaxLength, 256,
			     NULL);
    cd->gc->errorFile =
    XtVaCreateManagedWidget ("errorFile", xmTextWidgetClass, control,
			     XmNvalue, cd->batch->errorFile,
			     XmNmaxLength, 256,
			     NULL);

    XtVaCreateManagedWidget ("labelSeparator", xmLabelWidgetClass, control,
			     NULL);

    if (cd->batch->separator != '\0')
    {
	help[0] = cd->batch->separator;
	help[1] = '\0';
    }
    else
	help[0] = '\0';
    cd->gc->separator =
    XtVaCreateManagedWidget ("separator", xmTextWidgetClass, control,
			     XmNmaxLength, 1,
			     XmNvalue, help,
			     XmNwidth, (Dimension) 40,
			     NULL);

    XtVaCreateManagedWidget ("labelColumnStreet", xmLabelWidgetClass, control,
			     NULL);

    if (cd->batch->columnStreet > 0)
	sprintf (help, "%d", cd->batch->columnStreet);
    else
	help[0] = '\0';
    cd->gc->columnStreet =
    XtVaCreateManagedWidget ("columnStreet", xmTextWidgetClass, control,
			     XmNmaxLength, 3,
			     XmNvalue, help,
			     XmNwidth, (Dimension) 40,
			     NULL);

    XtVaCreateManagedWidget ("labelColumnPlz", xmLabelWidgetClass, control,
			     NULL);
    if (cd->batch->columnPlz > 0)
	sprintf (help, "%d", cd->batch->columnPlz);
    else
	help[0] = '\0';
    cd->gc->columnPlz =
    XtVaCreateManagedWidget ("columnPlz", xmTextWidgetClass, control,
			     XmNmaxLength, 3,
			     XmNvalue, help,
			     XmNwidth, (Dimension) 40,
			     NULL);

    XtVaCreateManagedWidget ("labelColumnPlace", xmLabelWidgetClass, control,
			     NULL);
    if (cd->batch->columnPlace > 0)
	sprintf (help, "%d", cd->batch->columnPlace);
    else
	help[0] = '\0';
    cd->gc->columnPlace =
    XtVaCreateManagedWidget ("columnPlace", xmTextWidgetClass, control,
			     XmNmaxLength, 3,
			     XmNvalue, help,
			     XmNwidth, (Dimension) 40,
			     NULL);


    /* Anhalten bei Fehlern? */

    pulldown = XmCreatePulldownMenu (control, "fehlerPulldown", (Arg *) 0,
				     (Cardinal) 0);
    w =
    XtVaCreateManagedWidget ("fehlerAnhalten", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetFehlerAnhalten,
		  (XtPointer) cd);
    w =
    XtVaCreateManagedWidget ("fehlerWeiter", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetFehlerWeiter,
		  (XtPointer) cd);

    argcount = 0;
    XtSetArg (args[argcount], XmNsubMenuId, pulldown);
    argcount++;
    fehlerMenu = XmCreateOptionMenu (control, "fehlerMenu", args, argcount);
    XtManageChild (fehlerMenu);


    /* Ausgabezeichensatz */

    pulldown = XmCreatePulldownMenu (control, "ausgabeFormatPulldown",
				     (Arg *) 0, (Cardinal) 0);
    w =
    XtVaCreateManagedWidget ("ausgabeFormatIso", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetAusgabeFormatIso,
		  (XtPointer) cd);
    w =
    XtVaCreateManagedWidget ("ausgabeFormatIbm", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetAusgabeFormatIbm,
		  (XtPointer) cd);
    w =
    XtVaCreateManagedWidget ("ausgabeFormatAtari", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetAusgabeFormatAtari,
		  (XtPointer) cd);

    argcount = 0;
    XtSetArg (args[argcount], XmNsubMenuId, pulldown);
    argcount++;
    ausgabeFormatMenu = XmCreateOptionMenu (control, "ausgabeFormatMenu", args,
			argcount);
    XtManageChild (ausgabeFormatMenu);


    /* Voreinstellung für Verkehrsgebiet: */

    pulldown = XmCreatePulldownMenu (control, "verkehrsgebietPulldown",
				     (Arg *) 0, (Cardinal) 0);
    w =
    XtVaCreateManagedWidget ("verkehrsgebietWest", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetVerkehrsgebietWest,
		  (XtPointer) cd);
    w =
    XtVaCreateManagedWidget ("verkehrsgebietOst", xmPushButtonWidgetClass,
			     pulldown, NULL);
    XtAddCallback (w, XmNactivateCallback,
		  (XtCallbackProc) SetVerkehrsgebietOst,
		  (XtPointer) cd);

    argcount = 0;
    XtSetArg (args[argcount], XmNsubMenuId, pulldown);
    argcount++;
    verkehrsgebietMenu = XmCreateOptionMenu (control, "verkehrsgebietMenu",
			 args, argcount);
    XtManageChild (verkehrsgebietMenu);


    form = XtVaCreateManagedWidget ("action", xmFormWidgetClass, pane, NULL);
    w = XtVaCreateManagedWidget ("ok", xmPushButtonWidgetClass, form, NULL);
    XtAddCallback (w, XmNactivateCallback, (XtCallbackProc) BatchOk,
		   (XtPointer) cd);
    w = XtVaCreateManagedWidget ("cancel", xmPushButtonWidgetClass, form, NULL);
    XtAddCallback (w, XmNactivateCallback, (XtCallbackProc) BatchCancel, NULL);
    XtManageChild (pane);
    return dialog;
}




static XtCallbackProc PositionDialog (Widget widget, XtPointer clientData,
				      XtPointer callData)
{
    int x, y;
    unsigned int width, height;
    unsigned int borderWidth, depth;
    Widget menu = (Widget) clientData;
    Window rootWindow;
    Window child;
    Position widgetX, widgetY;
    Dimension widgetWidth, widgetHeight;

    XGetGeometry (XtDisplay (menu), XtWindow (menu), &rootWindow, &x, &y,
		  &width, &height, &borderWidth, &depth);
    XTranslateCoordinates (XtDisplay (menu), XtWindow (menu), rootWindow, x, y,
			   &x, &y, &child);
    x += width / 2;
    y += height / 2;
    XtVaGetValues (widget, XmNwidth, &widgetWidth, XmNheight, &widgetHeight,
		   NULL);
    x -= widgetWidth / 2;
    y -= widgetHeight / 2;
    if (x < 0)
	x = 0;
    if (y < 0)
	y = 0;
    widgetX = x;
    widgetY = y;
    XtVaSetValues (widget, XmNx, widgetX, XmNy, widgetY, NULL);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.