Logo Search packages:      
Sourcecode: felt version File versions  Download package

panel.c

/*
    This file is part of the FElt finite element analysis package.
    Copyright (C) 1993-2000 Jason I. Gobat and Darren C. Atkinson

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/************************************************************************
*
* File:           panel.c
*
* Description:    contains all of the functions that constitute callbacks
*           and action procedures from the Velvet main control
*           panel widgets.
*
* History:  by Jason I. Gobat and Darren C. Atkinson
*
*************************************************************************/

# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <unistd.h>
# include <X11/Xlib.h>
# include <X11/Intrinsic.h>
# include <X11/StringDefs.h>
# include <X11/Xaw/Simple.h>
# include <X11/Xaw/AsciiText.h>
# include <X11/Xaw/Viewport.h>
# include <X11/Xaw/SmeBSB.h>
# include "fe.h"
# include "Canvas.h"
# include "Drawing.h"
# include "procedures.h"
# include "problem.h"
# include "panel.h"
# include "globals.h"
# include "text_entry.h"
# include "vfe.h"
# include "Solution.h"

# define sgn(x) (x < 0 ? -1 : x > 0)

extern CanvasDialog     canvas_d;

extern Panel   panel [ ];


void ToggleSnapStatus ()
{
    Arg            arglist[1];

    if (canvas -> snap) 
       XtSetArg (arglist[0], XtNrightBitmap, NULL);
    else
       XtSetArg (arglist[0], XtNrightBitmap, checkmark);

    XtSetValues (XtNameToWidget (panel [3].menu, "snap") , arglist, 1);

    canvas -> snap = !canvas -> snap;

    CanvasDialogSet (canvas_d);
    changeflag = True;
}

void ToggleRenumberStatus ()
{
   Arg            arglist [1];

   if (solution -> renumber)
      XtSetArg (arglist [0], XtNrightBitmap, NULL);
   else
      XtSetArg (arglist [0], XtNrightBitmap, checkmark);

   XtSetValues (XtNameToWidget (panel [6].menu, "renumber_solve"), arglist, 1);

   solution -> renumber = !solution -> renumber;
}

void SetNodeNumberFlag ()
{
   Arg            arglist [1];

   if (canvas -> node_numbers)
      XtSetArg (arglist [0], XtNrightBitmap, checkmark);
   else
      XtSetArg (arglist [0], XtNrightBitmap, NULL);

   XtSetValues (XtNameToWidget (panel [3].menu, "node_numbering"), arglist, 1);
}
   
void ToggleNodeNumberStatus ()
{
   canvas -> node_numbers  = !canvas -> node_numbers;
   SetNodeNumberFlag();
   SetNodeNumbering (canvas -> node_numbers ? True : False);
   CanvasDialogSet (canvas_d);
   changeflag = True;
}

void SetEltNumberFlag()
{
   Arg            arglist [1];

   if (canvas -> element_numbers)
      XtSetArg (arglist [0], XtNrightBitmap, checkmark);
   else
      XtSetArg (arglist [0], XtNrightBitmap, NULL);

   XtSetValues (XtNameToWidget (panel [3].menu, "elt_numbering"), arglist, 1);
}

void ToggleEltNumberStatus ()
{

   canvas -> element_numbers  = !canvas -> element_numbers;
   SetEltNumberFlag ( );
   SetElementNumbering (canvas -> element_numbers ? True : False);
   CanvasDialogSet (canvas_d);
   changeflag = True;
}


void ToggleGridStatus ()
{
    Arg            arglist[1];

    if (canvas -> grid)
       XtSetArg (arglist[0], XtNrightBitmap, NULL);
    else
       XtSetArg (arglist[0], XtNrightBitmap, checkmark);

    XtSetValues (XtNameToWidget (panel [3].menu, "grid"), arglist, 1);
    
    canvas -> grid = !canvas -> grid;

    CanvasDialogSet (canvas_d);
    changeflag = True;
}

void ZoomAll ()
{
   float    xscale,
            yscale;
   Dimension      height,
            width;
   Arg            arglist [4];
   Cardinal count;

   count = 0;
   XtSetArg (arglist [count], XtNheight, &height); count++;
   XtSetArg (arglist [count], XtNwidth, &width); count++;
   XtGetValues (viewport, arglist, count);

   xscale = (float) width / (canvas -> xmax - canvas -> xmin);
   yscale = (float) height / (canvas -> ymax - canvas -> ymin);

   if (xscale < yscale) canvas -> scale = xscale;
   else canvas -> scale = yscale;

   count = 0;
   XtSetArg (arglist [count], XtNxScale, Float2Arg(canvas -> scale)); count++;
   XtSetArg (arglist [count], XtNyScale, Float2Arg(canvas -> scale)); count++;
   XtSetValues (drawing, arglist, count);

   XawViewportSetCoordinates (viewport, 0, 0);
   changeflag = True;
}

void ZoomStart ()
{
   Cardinal count;
   Arg            arglist [4];

   SetEditMode ( );

   count = 0;
   XtSetArg (arglist [count], XtNcursorName, "left_ptr"); count++;
   XtSetValues (drawing, arglist, count);

   ChangeStatusLine ("Select first corner:", True);

   XtRemoveAllCallbacks (drawing, XtNbuttonCallback);
   XtAddCallback (drawing, XtNbuttonCallback, ZoomSelect, NULL);
   XtOverrideTranslations (entry, 
        XtParseTranslationTable ("<Key>Return: ZoomAP()"));

   if (DW_SetForeground (drawing, canvas -> tool_color) == False)
      (void) DW_SetForeground (drawing, "black");
}

void ZoomAP ()
{
   static unsigned      corner_number = 0;
   static float         xl,xr,
                  yb,yt;
   Figure         box;
   char*          status;

   if (corner_number == 0) {
      status = GetTextCoordinates (&xl,&yb,NULL); 
      if (status == NULL) {
         corner_number++;
         ChangeStatusLine ("Select second corner:", True);
      }
   } 
   else if (corner_number == 1) {
      status = GetTextCoordinates (&xr,&yt,NULL);
      if (status == NULL) {
         DW_SetInteractive (drawing, True);
         box = DW_DrawRectangle (drawing, True, xl, yb, xr - xl, yt - yb);
         DW_SetInteractive (drawing, False);
         ZoomEnd (box);
         DW_RemoveFigure (drawing, box);
         corner_number = 0;
      }
   }
}

void ZoomSelect (w, clientData, callData)
   Widget   w;
   XtPointer      clientData;
   XtPointer      callData;
{
   static Point         corner;
   static Figure  box; 
   DrawingReport  *report;
   FigureAttributes     attributes;

   report = (DrawingReport *) callData;

   switch (report -> event -> type) {
   case ButtonPress:
      ChangeStatusLine ("- Select second corner -", False);
      corner = report -> unsnapped;
      DW_SetInteractive (w, True);
      box = DW_DrawRectangle (w, True, corner.x, corner.y, 0.0, 0.0);
      break;

   case MotionNotify:
      attributes.width  = report -> unsnapped.x - corner.x;
      attributes.height = report -> unsnapped.y - corner.y;
      DW_SetAttributes (w, box, DW_FigureSize, &attributes);
      break;

   case ButtonRelease:
      DW_SetInteractive (drawing, False);
      ZoomEnd (box);
      DW_RemoveFigure (drawing, box);
      break;
   }
} 

void ZoomEnd (box)
   Figure   box;
{
   float          xscale;
   float          yscale;
   float          xr,xl,
                  yt,yb;
   Dimension            pos_x,
                  pos_y;
   Dimension            height,
                  width;
   Arg                  arglist [4];
   Cardinal       count;
   FigureAttributes     attributes;
   XRectangle           rect;
   
   count = 0;
   XtSetArg (arglist [count], XtNheight, &height); count++;
   XtSetArg (arglist [count], XtNwidth, &width); count++;
   XtGetValues (viewport, arglist, count);

   DW_GetAttributes (drawing, box, &attributes);

   if (attributes.width > 0) {
      xl = attributes.x;
      xr = attributes.width + xl;
   } else {
      xl = attributes.x + attributes.width;
      xr = attributes.x;
   }

   if (attributes.height > 0) {
      yb = attributes.y;
      yt = attributes.height + yb;
   } else {
      yb = attributes.y + attributes.height;
      yt = attributes.y;
   } 
  
   if (xr > xl) 
      xscale = (float) width / (xr - xl);
   else
      return;

   if (yt > yb)
      yscale = (float) height / (yt - yb);
   else
      return;

   if (xscale < yscale) canvas -> scale = xscale;
   else canvas -> scale = yscale;

   count = 0;
   XtSetArg (arglist [count], XtNxScale, Float2Arg(canvas -> scale)); count++;
   XtSetArg (arglist [count], XtNyScale, Float2Arg(canvas -> scale)); count++;
   XtSetValues (drawing, arglist, count); 

   DW_ClipBox (box, &rect);
   pos_x = rect.x;
   pos_y = rect.y;

   SetNormalMode ();

   XawViewportSetCoordinates (viewport, pos_x, pos_y);
   changeflag = True;
}

void SetWaitCursor (w)
   Widget   w;
{
   Arg            arglist [1];
   Cardinal count;

   count = 0;
   XtSetArg (arglist [count], XtNcursorName, "watch"); count++;
   XtSetValues (w, arglist, count);

   XFlush (XtDisplay (toplevel));
}

void SetNormalCursor (w)
   Widget   w;
{
   Arg            arglist [1];
   Cardinal count;

   count = 0;
   XtSetArg (arglist [count], XtNcursorName, "crosshair"); count++;
   XtSetValues (w, arglist, count);

   XFlush (XtDisplay (toplevel));
}

void ParseEntryLine ()
{
   extern PanelId     last_command;
   Arg                  arglist [1];
   String             result;
   unsigned       i;
   XtPointer            execute;
   extern TextCommand commands [ ];

   XtSetArg (arglist[0], XtNstring, &result);
   XtGetValues (entry, arglist, 1);

   execute = NULL;

   if (strcmp (result, "") == 0) {
      if (last_command != -1)
         execute = (XtPointer) &last_command;
   }
   else {
      execute = NULL;

      i = 0;
      while ((int) commands [i].id > -1) {
         if (!strcmp (commands [i].name, result)) {
            execute = (XtPointer) &commands [i].id;
            last_command = commands [i].id;
            break;
         }
         i ++;
      }
   }

   XtSetArg (arglist[0], XtNstring, "");
   XtSetValues (entry, arglist, 1);

   if (execute != NULL) 
      PanelCallback (NULL, execute, NULL);
   else
      XBell (XtDisplay (toplevel), 20);
}

void MenuAction (w, event, params, num_params)
   Widget   w;
   XEvent   *event;
   String   *params;
   Cardinal *num_params;
{
   XtPointer      execute;
   unsigned i,j;

   i = 0;
   execute = NULL;
   while (strcmp (panel [i].name, "spacer")) {
      if (panel [i].numentries == 0) {
          if (!strcmp (panel [i].name, *params)) {
             execute = (XtPointer) &panel [i].menuentry[0].id;
             break;
          }
      }
      else {
         for (j = 0 ; j < panel [i].numentries ; j++) {

            if (!strcmp (panel [i].menuentry [j].name, *params)) {
                execute = (XtPointer) &panel [i].menuentry [j].id;
                break;
            }
         }
      }

      if (execute != NULL) break;
      else i++;
   }

   if (execute != NULL)
      PanelCallback (NULL, execute, NULL);
   else 
      fprintf (stderr,"velvet: could not find menu entry named %s\n",*params);
}  

void QuitEdit ( )
{
   if (edit_mode == True) 
      SetNormalMode ();
}

void AbortEdit ( )
{
   if (edit_mode == True) 
      SetNormalMode ();
}

void SetNormalMode ()
{
   unsigned i;
   Arg            arglist [2];
   Cardinal count;
   int            depth;

   ChangeStatusLine ("Command:", True);

   XtRemoveAllCallbacks (drawing, XtNbuttonCallback);
   XtRemoveAllCallbacks (drawing, XtNmotionCallback);

   XtSetArg (arglist [0], XtNcursorName, "crosshair");
   XtSetValues (drawing, arglist, 1);

   XtOverrideTranslations (entry, 
        XtParseTranslationTable ("<Key>Return: ParseEntryLine()"));

   count = 0;
   XtSetArg (arglist[count], XtNeditType, XawtextEdit); count++;
   XtSetArg (arglist [count], XtNstring, ""); count++;
   XtSetValues (entry, arglist, 1);

   XawTextDisplayCaret (entry, True);

   XtAddCallback (drawing, XtNbuttonCallback, SelectCallback, NULL);

   AssignQuitAbort (QuitEdit, "QuitEdit", AbortEdit, "AbortEdit");

   if (sensitive_menus == True) {
      for (i = 0 ; i <= 2 ; i++)
         XtSetSensitive (panel [i].button, True);

      for (i = 2 ; i <= 4 ; i++)
         XtSetSensitive (panel [3].menuentry[i].widget, True);

      for (i = 4 ; i <= 7 ; i++) 
         XtSetSensitive (panel [i].button, True);

      XtSetSensitive (quitbutton, False);
      XtSetSensitive (abortbutton, False);
   }

   XtSetArg (arglist[0], XtNdepth, &depth);
   XtGetValues (toplevel, arglist, 1);
   if (depth < 8) {
      XtSetSensitive (panel [2].menuentry[0].widget, False);
      XtSetSensitive (panel [2].menuentry[1].widget, False);
   }

   edit_mode = False;
}

void AssignQuitAbort (quitCB, quitAP, abortCB, abortAP)
   XtCallbackProc quitCB;
   XtCallbackProc abortCB;
   String         quitAP;
   String         abortAP;
{
   char           cmd1 [256];
   char           cmd2 [256];

   XtRemoveAllCallbacks (quitbutton, XtNcallback);
   XtRemoveAllCallbacks (abortbutton, XtNcallback);

   XtAddCallback (quitbutton, XtNcallback, quitCB, NULL);
   XtAddCallback (abortbutton, XtNcallback, abortCB, NULL);

   sprintf (cmd1, "<Key>Escape: %s()", quitAP);
   sprintf (cmd2, "Ctrl<Key>c: %s()", abortAP);

   XtOverrideTranslations (entry,
      XtParseTranslationTable (cmd1));
   XtOverrideTranslations (entry,
      XtParseTranslationTable (cmd2));
}
                                

void SetEditMode ()
{
   unsigned i;

   edit_mode = True;

   if (sensitive_menus == True) {
      for (i = 0 ; i <= 2 ; i++)
         XtSetSensitive (panel [i].button, False);

      for (i = 2 ; i <= 4 ; i++)
         XtSetSensitive (panel [3].menuentry[i].widget, False);

      for (i = 4; i <= 7 ; i++)
         XtSetSensitive (panel [i].button, False);

      XtSetSensitive (quitbutton, True);
      XtSetSensitive (abortbutton, True);
   }
}

 
void ChangeStatusLine (new_label, allow_input)
   String   new_label;
   Boolean  allow_input;
{
   Arg            arglist [1];
   Cardinal count;

   if (!allow_input) {
      count = 0;
      XtSetArg (arglist[count], XtNeditType, XawtextRead); count++;
      XtSetValues (entry, arglist, count);

      XawTextDisplayCaret (entry, False);
   }

   XtUnmanageChild (statusline);
   XtUnmanageChild (entry);

   count = 0;
   XtSetArg (arglist [count], XtNlabel, new_label); count++;
   XtSetValues (statusline, arglist, count);

   XtManageChild (statusline);
   XtManageChild (entry);
}

Generated by  Doxygen 1.6.0   Back to index