Edit

IABSD.fr/xenocara/app/xedit/options.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2006-11-25 20:07:29
    Hash : 616b6f15
    Message : Importing from X.Org 7.2RC2

  • app/xedit/options.c
  • /*
     * Copyright (c) 1999 by The XFree86 Project, Inc.
     *
     * Permission is hereby granted, free of charge, to any person obtaining a
     * copy of this software and associated documentation files (the "Software"),
     * to deal in the Software without restriction, including without limitation
     * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     * and/or sell copies of the Software, and to permit persons to whom the
     * Software is furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *  
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
     * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     * SOFTWARE.
     *
     * Except as contained in this notice, the name of the XFree86 Project shall
     * not be used in advertising or otherwise to promote the sale, use or other
     * dealings in this Software without prior written authorization from the
     * XFree86 Project.
     *
     * Author: Paulo César Pereira de Andrade
     */
    
    /* $XFree86: xc/programs/xedit/options.c,v 1.13 2002/09/22 07:09:05 paulo Exp $ */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "xedit.h"
    
    #include <X11/Xaw/SmeBSB.h>
    #include <X11/Xaw/SimpleMenu.h>
    
    /*
     * Prototypes
     */
    static void SetColumns(Widget, XEvent*, String*, Cardinal*);
    static void ChangeField(Widget, XEvent*, String*, Cardinal*);
    static void EditCallback(Widget, XtPointer, XtPointer);
    static void PopupColumnsCallback(Widget, XtPointer, XtPointer);
    static void CreateColumnsShell(void);
    static void ProcessColumnsCallback(Widget, XtPointer, XtPointer);
    
    /*
     * Initialization
     */
    extern Widget texts[3];
    
    static Widget edit_popup, wrap_popup, justify_popup, scroll_popup,
    	      columns_shell, left_text, right_text;
    
    static XFontStruct *fonts[3];
    static Pixel foregrounds[3], backgrounds[3];
    
    static XtActionsRec actions[] = {
        {"set-columns", SetColumns},
        {"change-field", ChangeField},
    };
    
    #define WRAP_NEVER	1
    #define WRAP_LINE	2
    #define WRAP_WORD	3
    #define	AUTO_FILL	4
    #define JUST_LEFT	5
    #define JUST_RIGHT	6
    #define JUST_CENTER	7
    #define JUST_FULL	8
    #define SCROLL_VERT	9
    #define SCROLL_HORIZ	10
    
    static Widget autoFill, wrapNever, wrapLine, wrapWord,
    	      justifyLeft, justifyRight, justifyCenter, justifyFull,
    	      breakColumns, scrollVert, scrollHoriz;
    
    void
    CreateEditPopup(void)
    {
        Arg args[1];
    
        edit_popup		= XtCreatePopupShell("editMenu", simpleMenuWidgetClass,
    					     topwindow, NULL, 0);
        XtRealizeWidget(edit_popup);
    
        wrap_popup		= XtCreatePopupShell("wrapMenu", simpleMenuWidgetClass,
    					     edit_popup, NULL, 0);
        XtRealizeWidget(wrap_popup);
    
        XtSetArg(args[0], XtNmenuName, "wrapMenu");
        XtCreateManagedWidget("wrapMenuItem", smeBSBObjectClass, edit_popup, args, 1);
    
        wrapNever		= XtCreateManagedWidget("never", smeBSBObjectClass,
    						wrap_popup, NULL, 0);
        XtAddCallback(wrapNever, XtNcallback, EditCallback, (XtPointer)WRAP_NEVER);
        wrapLine		= XtCreateManagedWidget("line", smeBSBObjectClass,
    						wrap_popup, NULL, 0);
        XtAddCallback(wrapLine, XtNcallback, EditCallback, (XtPointer)WRAP_LINE);
        wrapWord		= XtCreateManagedWidget("word", smeBSBObjectClass,
    						wrap_popup, NULL, 0);
        XtAddCallback(wrapWord, XtNcallback, EditCallback, (XtPointer)WRAP_WORD);
    
        autoFill		= XtCreateManagedWidget("autoFill", smeBSBObjectClass,
    						edit_popup, NULL, 0);
        XtAddCallback(autoFill, XtNcallback, EditCallback, (XtPointer)AUTO_FILL);
    
        justify_popup	= XtCreatePopupShell("justifyMenu", simpleMenuWidgetClass,
    					     edit_popup, NULL, 0);
        XtRealizeWidget(justify_popup);
    
        XtSetArg(args[0], XtNmenuName, "justifyMenu");
        XtCreateManagedWidget("justifyMenuItem", smeBSBObjectClass, edit_popup, args, 1);
    
        justifyLeft		= XtCreateManagedWidget("left", smeBSBObjectClass,
    						justify_popup, NULL, 0);
        XtAddCallback(justifyLeft, XtNcallback, EditCallback, (XtPointer)JUST_LEFT);
        justifyRight	= XtCreateManagedWidget("right", smeBSBObjectClass,
    						justify_popup, NULL, 0);
        XtAddCallback(justifyRight, XtNcallback, EditCallback, (XtPointer)JUST_RIGHT);
        justifyCenter	= XtCreateManagedWidget("center", smeBSBObjectClass,
    						justify_popup, NULL, 0);
        XtAddCallback(justifyCenter, XtNcallback, EditCallback, (XtPointer)JUST_CENTER);
        justifyFull		= XtCreateManagedWidget("full", smeBSBObjectClass,
    						justify_popup, NULL, 0);
        XtAddCallback(justifyFull, XtNcallback, EditCallback, (XtPointer)JUST_FULL);
    
        breakColumns	= XtCreateManagedWidget("breakColumns", smeBSBObjectClass,
    						edit_popup, NULL, 0);
        XtAddCallback(breakColumns, XtNcallback, PopupColumnsCallback, NULL);
    
        scroll_popup	= XtCreatePopupShell("scrollMenu", simpleMenuWidgetClass,
    					     edit_popup, NULL, 0);
        XtRealizeWidget(scroll_popup);
    
        XtSetArg(args[0], XtNmenuName, "scrollMenu");
        XtCreateManagedWidget("scrollMenuItem", smeBSBObjectClass, edit_popup, args, 1);
    
        scrollVert		= XtCreateManagedWidget("vertical", smeBSBObjectClass,
    						scroll_popup, NULL, 0);
        XtAddCallback(scrollVert, XtNcallback, EditCallback, (XtPointer)SCROLL_VERT);
        scrollHoriz		= XtCreateManagedWidget("horizontal", smeBSBObjectClass,
    						scroll_popup, NULL, 0);
        XtAddCallback(scrollHoriz, XtNcallback, EditCallback, (XtPointer)SCROLL_HORIZ);
    
        CreateEditModePopup(edit_popup);
    }
    
    void
    SetEditMenu(void)
    {
        Arg args[7];
        Cardinal num_args;
        Boolean auto_fill;
        XawTextWrapMode wrap_mode;
        XawTextJustifyMode justify;
        XawTextScrollMode vscroll, hscroll;
        short left, right;
    
        num_args = 0;
        XtSetArg(args[num_args], XtNwrap, &wrap_mode);		++num_args;
        XtSetArg(args[num_args], XtNautoFill, &auto_fill);		++num_args;
        XtSetArg(args[num_args], XtNjustifyMode, &justify);		++num_args;
        XtSetArg(args[num_args], XtNleftColumn, &left);		++num_args;
        XtSetArg(args[num_args], XtNrightColumn, &right);		++num_args;
        XtSetArg(args[num_args], XtNscrollVertical, &vscroll);	++num_args;
        XtSetArg(args[num_args], XtNscrollHorizontal, &hscroll);	++num_args;
        XtGetValues(textwindow, args, num_args);
    
        if (flist.pixmap) {
    	XtSetArg(args[0], XtNleftBitmap, None);
    	XtSetArg(args[1], XtNleftBitmap, flist.pixmap);
    	if (!auto_fill)
    	    XtSetValues(autoFill, &args[0], 1);
    	else
    	    XtSetValues(autoFill, &args[1], 1);
    	switch (wrap_mode) {
    	    case XawtextWrapNever:
    		XtSetValues(wrapLine, &args[0], 1);
    		XtSetValues(wrapWord, &args[0], 1);
    		XtSetValues(wrapNever, &args[1], 1);
    		break;
    	    case XawtextWrapLine:
    		XtSetValues(wrapNever, &args[0], 1);
    		XtSetValues(wrapWord, &args[0], 1);
    		XtSetValues(wrapLine, &args[1], 1);
    		break;
    	    case XawtextWrapWord:
    		XtSetValues(wrapNever, &args[0], 1);
    		XtSetValues(wrapLine, &args[0], 1);
    		XtSetValues(wrapWord, &args[1], 1);
    		break;
    	}
    	switch (justify) {
    	    case XawjustifyLeft:
    		XtSetValues(justifyRight, &args[0], 1);
    		XtSetValues(justifyCenter, &args[0], 1);
    		XtSetValues(justifyFull, &args[0], 1);
    		XtSetValues(justifyLeft, &args[1], 1);
    		break;
    	    case XawjustifyRight:
    		XtSetValues(justifyLeft, &args[0], 1);
    		XtSetValues(justifyCenter, &args[0], 1);
    		XtSetValues(justifyFull, &args[0], 1);
    		XtSetValues(justifyRight, &args[1], 1);
    		break;
    	    case XawjustifyCenter:
    		XtSetValues(justifyLeft, &args[0], 1);
    		XtSetValues(justifyRight, &args[0], 1);
    		XtSetValues(justifyFull, &args[0], 1);
    		XtSetValues(justifyCenter, &args[1], 1);
    		break;
    	    case XawjustifyFull:
    		XtSetValues(justifyLeft, &args[0], 1);
    		XtSetValues(justifyRight, &args[0], 1);
    		XtSetValues(justifyCenter, &args[0], 1);
    		XtSetValues(justifyFull, &args[1], 1);
    		break;
    	}
    	if (!vscroll)
    	    XtSetValues(scrollVert, &args[0], 1);
    	else
    	    XtSetValues(scrollVert, &args[1], 1);
    	if (!hscroll)
    	    XtSetValues(scrollHoriz, &args[0], 1);
    	else
    	    XtSetValues(scrollHoriz, &args[1], 1);
        }
        if (!auto_fill) {
    	XtSetSensitive(wrapNever, True);
    	XtSetSensitive(wrapLine, True);
    	XtSetSensitive(wrapWord, True);
    
    	XtSetSensitive(justifyLeft, False);
    	XtSetSensitive(justifyRight, False);
    	XtSetSensitive(justifyCenter, False);
    	XtSetSensitive(justifyFull, False);
    	XtSetSensitive(breakColumns, False);
        }
        else {
    	XtSetSensitive(wrapNever, False);
    	XtSetSensitive(wrapLine, False);
    	XtSetSensitive(wrapWord, False);
    
    	XtSetSensitive(justifyLeft, left < right);
    	XtSetSensitive(justifyRight, left < right);
    	XtSetSensitive(justifyCenter, left < right);
    	XtSetSensitive(justifyFull, left < right);
    	XtSetSensitive(breakColumns, True);
        }
    
        SetEditModeMenu();
    }
    
    /*ARGSUSED*/
    static void
    EditCallback(Widget sme, XtPointer client_data, XtPointer call_data)
    {
        Arg args[1];
        Boolean auto_fill;
        XawTextScrollMode scroll;
        xedit_flist_item *item = FindTextSource(XawTextGetSource(textwindow), NULL);
        Bool foreach = False;
    
        switch ((long)client_data) {
    	case WRAP_NEVER:
    	    XtSetArg(args[0], XtNwrap, XawtextWrapNever);
    	    if (item) {
    		item->flags |= WRAP_BIT;
    		item->wrap = XawtextWrapNever;
    		foreach = True;
    	    }
    	    break;
    	case WRAP_LINE:
    	    XtSetArg(args[0], XtNwrap, XawtextWrapLine);
    	    if (item) {
    		item->flags |= WRAP_BIT;
    		item->wrap = XawtextWrapLine;
    		foreach = True;
    	    }
    	    break;
    	case WRAP_WORD:
    	    XtSetArg(args[0], XtNwrap, XawtextWrapWord);
    	    if (item) {
    		item->flags |= WRAP_BIT;
    		item->wrap = XawtextWrapWord;
    		foreach = True;
    	    }
    	    break;
    	case AUTO_FILL:
    	    XtSetArg(args[0], XtNautoFill, &auto_fill);
    	    XtGetValues(textwindow, args, 1);
    	    XtSetArg(args[0], XtNautoFill, !auto_fill);
    	    break;
    	case JUST_LEFT:
    	    XtSetArg(args[0], XtNjustifyMode, XawjustifyLeft);
    	    break;
    	case JUST_RIGHT:
    	    XtSetArg(args[0], XtNjustifyMode, XawjustifyRight);
    	    break;
    	case JUST_CENTER:
    	    XtSetArg(args[0], XtNjustifyMode, XawjustifyCenter);
    	    break;
    	case JUST_FULL:
    	    XtSetArg(args[0], XtNjustifyMode, XawjustifyFull);
    	    break;
    	case SCROLL_VERT:
    	    XtSetArg(args[0], XtNscrollVertical, &scroll);
    	    XtGetValues(textwindow, args, 1);
    	    XtSetArg(args[0], XtNscrollVertical, scroll == XawtextScrollNever ?
    		     XawtextScrollAlways : XawtextScrollNever);
    	    break;
    	case SCROLL_HORIZ:
    	    XtSetArg(args[0], XtNscrollHorizontal, &scroll);
    	    XtGetValues(textwindow, args, 1);
    	    XtSetArg(args[0], XtNscrollHorizontal, scroll == XawtextScrollNever ?
    		     XawtextScrollAlways : XawtextScrollNever);
    	    break;
        }
    
        if (foreach) {
    	int i;
     
    	for (i = 0; i < 3; i++)
    	    XtSetValues(texts[i], args, 1);
        }
        else
    	XtSetValues(textwindow, args, 1);
    }
    
    static void
    CreateColumnsShell(void)
    {
        Atom delete_window;
        Widget form, ok, cancel;
    
        if (columns_shell)
    	return;
    
        XtAppAddActions(XtWidgetToApplicationContext(topwindow),
    		    actions, XtNumber(actions));
    
        columns_shell	= XtCreatePopupShell("columns", transientShellWidgetClass,
    					     topwindow, NULL, 0);
        form		= XtCreateManagedWidget("form", formWidgetClass,
    						columns_shell, NULL, 0);
        XtCreateManagedWidget("leftLabel", labelWidgetClass, form, NULL, 0);
        left_text		= XtVaCreateManagedWidget("left", asciiTextWidgetClass,
    						  form, XtNeditType, XawtextEdit,
    						  NULL);
        XtCreateManagedWidget("rightLabel", labelWidgetClass, form, NULL, 0);
        right_text		= XtVaCreateManagedWidget("right", asciiTextWidgetClass,
    						  form, XtNeditType, XawtextEdit,
    						  NULL);
        ok			= XtCreateManagedWidget("ok", commandWidgetClass,
    						form, NULL, 0);
        XtAddCallback(ok, XtNcallback, ProcessColumnsCallback, (XtPointer)True);
        cancel		= XtCreateManagedWidget("cancel", commandWidgetClass,
    						form, NULL, 0);
        XtAddCallback(cancel, XtNcallback, ProcessColumnsCallback, (XtPointer)False);
    
        XtRealizeWidget(columns_shell);
        delete_window = XInternAtom(XtDisplay(columns_shell), "WM_DELETE_WINDOW", False);
        XSetWMProtocols(XtDisplay(columns_shell), XtWindow(columns_shell), &delete_window, 1);
    
        XtSetKeyboardFocus(columns_shell, left_text);
    }
    
    /*ARGSUSED*/
    static void
    PopupColumnsCallback(Widget w, XtPointer client_data, XtPointer call_data)
    {
        Arg args[3];
        char sleft[6], sright[6];
        short left, right;
        Dimension width, height, b_width;
        Window r, c;
        int x, y, wx, wy, max_x, max_y;
        unsigned mask;
    
        CreateColumnsShell();
    
        XQueryPointer(XtDisplay(columns_shell), XtWindow(columns_shell),
    		  &r, &c, &x, &y, &wx, &wy, &mask);
    
        XtSetArg(args[0], XtNwidth, &width);
        XtSetArg(args[1], XtNheight, &height);
        XtSetArg(args[2], XtNborderWidth, &b_width);
        XtGetValues(columns_shell, args, 3);
    
        width += b_width << 1;
        height += b_width << 1;
    
        x -= (Position)(width >> 1);
        if (x < 0)
    	x = 0;
        if (x > (max_x = (Position)(XtScreen(columns_shell)->width - width)))
    	x = max_x;
    
        y -= (Position)(height >> 1);
        if (y < 0)
    	y = 0;
        if (y > (max_y = (Position)(XtScreen(columns_shell)->height - height)))
    	y = max_y;
    
        XtSetArg(args[0], XtNx, x);
        XtSetArg(args[1], XtNy, y);
        XtSetValues(columns_shell, args, 2);
    
        XtSetArg(args[0], XtNleftColumn, &left);
        XtSetArg(args[1], XtNrightColumn, &right);
        XtGetValues(textwindow, args, 2);
        XmuSnprintf(sleft, sizeof(sleft), "%d", left);
        XmuSnprintf(sright, sizeof(sright), "%d", right);
        XtSetArg(args[0], XtNstring, sleft);
        XtSetValues(left_text, args, 1);
        XtSetArg(args[0], XtNstring, sright);
        XtSetValues(right_text, args, 1);
        XtPopup(columns_shell, XtGrabExclusive);
    }
    
    /*ARGSUSED*/
    static void
    ProcessColumnsCallback(Widget w, XtPointer client_data, XtPointer call_data)
    {
        if (client_data) {
    	Arg args[2];
    	char *left, *right;
    	short leftc, rightc;
    
    	left = GetString(left_text);
    	right = GetString(right_text);
    
    	leftc = atoi(left);
    	rightc = atoi(right);
    	XtSetArg(args[0], XtNleftColumn, leftc);
    	XtSetArg(args[1], XtNrightColumn, rightc);
    
    	XtSetValues(textwindow, args, 2);
        }
    
        XtPopdown(columns_shell);
    }
    
    /*ARGSUSED*/
    static void
    SetColumns(Widget w, XEvent *event, String *params, Cardinal *num_params)
    {
        Bool ok = False;
    
        if (*num_params &&
    	(params[0][0] == 'o' || params[0][0] == 'O'))
    	ok = True;
    
        ProcessColumnsCallback(w, (XtPointer)(long)ok, NULL);
    }
    
    /*ARGSUSED*/
    static void
    ChangeField(Widget w, XEvent *event, String *params, Cardinal *num_params)
    {
        Widget focus = XtGetKeyboardFocusWidget(columns_shell);
    
        XtSetKeyboardFocus(columns_shell,
    		       focus == left_text ? right_text : left_text);
    }
    
    void
    UpdateTextProperties(int force)
    {
        Arg args[4];
        Cardinal num_args;
        xedit_flist_item *item;
        XawTextPropertyList *prop;
        Widget text, source, sink;
        int i;
    
        /* save default information */
        if (fonts[0] == NULL) {
    	for (i = 0; i < 3; i++) {
    	    num_args = 0;
    	    XtSetArg(args[num_args], XtNfont, &fonts[i]);	      ++num_args;
    	    XtSetArg(args[num_args], XtNforeground, &foregrounds[i]); ++num_args;
    	    XtSetArg(args[num_args], XtNbackground, &backgrounds[i]); ++num_args;
    	    XtGetValues(XawTextGetSink(texts[i]), args, num_args);
    	}
        }
    
        for (i = 0; i < 3; i++) {
    	text = texts[i];
    	source = XawTextGetSource(text);
    	sink = XawTextGetSink(text);
    	item = FindTextSource(source, NULL);
    
    	XtSetArg(args[0], XawNtextProperties, &prop);
    	XtGetValues(sink, args, 1);
    
    	if (item == NULL || (!force && prop == item->properties))
    	    continue;
    
    	XtSetArg(args[0], XawNtextProperties, item->properties);
    	num_args = 1;
    	if (item->properties == NULL) {
    	    XtSetArg(args[num_args], XtNfont, fonts[i]);	     ++num_args;
    	    XtSetArg(args[num_args], XtNforeground, foregrounds[i]); ++num_args;
    	    XtSetArg(args[num_args], XtNbackground, backgrounds[i]); ++num_args;
    	}
    	XtSetValues(sink, args, num_args);
    
    	if (text == textwindow) {
    	    XtSetArg(args[0], XtNdisplayCaret, False);
    	    XtSetValues(text, args, 1);
    	}
    	_XawTextBuildLineTable((TextWidget)text,
    			       XawTextTopPosition(text), True);
    	XawTextDisplay(text);
    	if (text == textwindow) {
    	    XtSetArg(args[0], XtNdisplayCaret, True);
    	    XtSetValues(text, args, 1);
    	}
        }
    }