/ATF2/control-software/epics-3.14.10/extensions/src/edm/doc/edmBoxComplete.cc
C++ | 2091 lines | 1407 code | 531 blank | 153 comment | 218 complexity | 0c332fc11eac00f7d882d71948138f67 MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-2.0, IPL-1.0, BSD-3-Clause
- // object: 2ed7d2e8-f439-11d2-8fed-00104b8742df
- // lib: 3014b6ee-f439-11d2-ad99-00104b8742df
- // define SMARTDRAW if the widget may be part of an overlapping
- // stack of widgets
- //#define SMARTDRAW 1
- #define __edmBoxComplete_cc 1
- #include "edmBoxComplete.h"
- //---------------------------------------------------------------------------
- // default constructor
- edmBoxClass::edmBoxClass ( void ) {
- // Allocate space for the component name and init
- name = new char[strlen("2ed7d2e8_f439_11d2_8fed_00104b8742df")+1];
- strcpy( name, "2ed7d2e8_f439_11d2_8fed_00104b8742df" );
- // Init class member data
- editBuf = NULL;
- pvExists = 0;
- active = 0;
- activeMode = 0;
- fill = 0;
- lineColorMode = COLORMODE_STATIC;
- fillColorMode = COLORMODE_STATIC;
- lineWidth = 1;
- lineStyle = LineSolid;
- readMin = 0;
- readMax = 10;
- precision = 1;
- efReadMin.setNull(1);
- efReadMax.setNull(1);
- strcpy( fontTag, "" );
- strcpy( label, "" );
- fs = NULL;
- labelX = 0;
- labelY = 0;
- alignment = XmALIGNMENT_BEGINNING;
- unconnectedTimer = 0;
- // This makes the blinking color magic work
- setBlinkFunction( (void *) doBlink );
- }
- //---------------------------------------------------------------------------
- // copy constructor
- edmBoxClass::edmBoxClass
- ( const edmBoxClass *source ) {
- activeGraphicClass *ago = (activeGraphicClass *) this;
- // clone base class data
- ago->clone( (activeGraphicClass *) source );
- // Allocate space for the component name and init
- name = new char[strlen("2ed7d2e8_f439_11d2_8fed_00104b8742df")+1];
- strcpy( name, "2ed7d2e8_f439_11d2_8fed_00104b8742df" );
- editBuf = NULL;
- // copy edit mode data and initialize execute mode data
- lineColor.copy(source->lineColor);
- fillColor.copy(source->fillColor);
- lineCb = source->lineCb;
- fillCb = source->fillCb;
- fill = source->fill;
- lineColorMode = source->lineColorMode;
- fillColorMode = source->fillColorMode;
- strncpy( fontTag, source->fontTag, 63 );
- fontTag[63] = 0;
- strncpy( label, source->label, 63 );
- label[63] = 0;
- fs = actWin->fi->getXFontStruct( fontTag );
- stringLength = source->stringLength;
- fontAscent = source->fontAscent;
- fontDescent = source->fontDescent;
- fontHeight = source->fontHeight;
- stringWidth = source->stringWidth;
- labelX = source->labelX;
- labelY = source->labelY;
- alignment = source->alignment;
- lineWidth = source->lineWidth;
- lineStyle = source->lineStyle;
- pvExpStr.setRaw( source->pvExpStr.rawString );
- pvExists = 0;
- active = 0;
- activeMode = 0;
- readMin = source->readMin;
- readMax = source->readMax;
- precision = source->precision;
- efReadMin = source->efReadMin;
- efReadMax = source->efReadMax;
- efPrecision = source->efPrecision;
- unconnectedTimer = 0;
- // This makes the blinking color magic work
- setBlinkFunction( (void *) doBlink );
- }
- //---------------------------------------------------------------------------
- // Destructor
- edmBoxClass::~edmBoxClass ( void ) {
- // deallocate dynamic memory
- if ( name ) delete[] name;
- if ( unconnectedTimer ) {
- XtRemoveTimeOut( unconnectedTimer );
- unconnectedTimer = 0;
- }
- if ( editBuf ) delete editBuf;
- // disable blink function
- updateBlink( 0 );
- }
- //---------------------------------------------------------------------------
- char *edmBoxClass::objName ( void ) {
- // Return component name
- return name;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::createInteractive (
- activeWindowClass *aw_obj,
- int _x,
- int _y,
- int _w,
- int _h ) {
- // All widgets must copy active window object
- actWin = (activeWindowClass *) aw_obj;
- // Initialize edit mode data so an initial edit mode image
- // may be drawn
- x = _x;
- y = _y;
- w = _w;
- h = _h;
- lineColor.setColorIndex( actWin->defaultFg1Color, actWin->ci );
- fillColor.setColorIndex( actWin->defaultBgColor, actWin->ci );
- strcpy( fontTag, actWin->defaultCtlFontTag );
- alignment = actWin->defaultCtlAlignment;
- fs = actWin->fi->getXFontStruct( fontTag );
- updateFont( " ", fontTag, &fs,
- &fontAscent, &fontDescent, &fontHeight,
- &stringWidth );
- boxH = h - fontHeight - fontHeight;
- if ( boxH < 5 ) {
- boxH = 5;
- h = boxH + fontHeight + fontHeight;
- sboxH = h;
- }
- boxY = y + fontHeight;
- if ( w < 5 ) {
- w = 5;
- sboxW = 5;
- }
- // Draw initial edit mode image
- this->draw();
- // create and popup the property dialog for a newly created object
- this->editCreate();
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::editCreate ( void ) {
- this->genericEdit();
- // Map dialog box form buttons to callbacks
- ef.finished( editOk, editApply, editCancelDelete, this );
- // Required by display engine
- actWin->currentEf = NULL;
- // Pop-up the dialog box
- ef.popup();
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::edit ( void ) {
- this->genericEdit();
- // Map dialog box form buttons to callbacks
- ef.finished( editOk, editApply, editCancel, this );
- // Required by display engine
- actWin->currentEf = &ef;
- // Pop-up the dialog box
- ef.popup();
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::genericEdit ( void ) {
- // Create the property dialog box so that user may edit widget attributes
- char title[32], *ptr;
- // Allocate the edit buffer, this holds values until the OK or Cancel button
- // is pressed
- if ( !editBuf ) {
- editBuf = new editBufType;
- }
- // Build property dialog title - this will become "Box Properties"
- // Get the widget nickname from the component name
- ptr = actWin->obj.getNameFromClass( "2ed7d2e8_f439_11d2_8fed_00104b8742df" );
- if ( ptr )
- strncpy( title, ptr, 31 );
- else
- strncpy( title, edmBoxComplete_str2, 31 );
- Strncat( title, edmBoxComplete_str3, 31 );
- // Copy current property values into edit buffer; on OK or Apply
- // edit buffer values will be copied back into current property values
- editBuf->bufX = x;
- editBuf->bufY = y;
- editBuf->bufW = w;
- editBuf->bufH = h;
- editBuf->bufLineColor = lineColor.pixelIndex();
- editBuf->bufLineColorMode = lineColorMode;
- editBuf->bufFillColor = fillColor.pixelIndex();
- editBuf->bufFillColorMode = fillColorMode;
- editBuf->bufFill = fill;
- editBuf->bufLineWidth = lineWidth;
- editBuf->bufLineStyle = lineStyle;
- if ( pvExpStr.getRaw() )
- strncpy( editBuf->bufPvName, pvExpStr.getRaw(), PV_Factory::MAX_PV_NAME );
- else
- strcpy( editBuf->bufPvName, "" );
- editBuf->bufEfReadMin = efReadMin;
- editBuf->bufEfReadMax = efReadMax;
- editBuf->bufEfPrecision = efPrecision;
- strncpy( editBuf->bufLabel, label, 63 );
- editBuf->bufLabel[63] = 0;
- // Create the property dialog data entry form
- ef.create( actWin->top, actWin->appCtx->ci.getColorMap(),
- &actWin->appCtx->entryFormX,
- &actWin->appCtx->entryFormY, &actWin->appCtx->entryFormW,
- &actWin->appCtx->entryFormH, &actWin->appCtx->largestH,
- title, NULL, NULL, NULL );
- // Add fields to the form
- ef.addTextField( edmBoxComplete_str4, 30, &editBuf->bufX );
- ef.addTextField( edmBoxComplete_str5, 30, &editBuf->bufY );
- ef.addTextField( edmBoxComplete_str6, 30, &editBuf->bufW );
- ef.addTextField( edmBoxComplete_str7, 30, &editBuf->bufH );
- ef.addOption( edmBoxComplete_str8, edmBoxComplete_str19,
- &editBuf->bufLineWidth );
- ef.addOption( edmBoxComplete_str9, edmBoxComplete_str20,
- &editBuf->bufLineStyle );
- ef.addColorButton( edmBoxComplete_str10, actWin->ci, &lineCb,
- &editBuf->bufLineColor );
- ef.addToggle( edmBoxComplete_str11, &editBuf->bufLineColorMode );
- ef.addToggle( edmBoxComplete_str12, &editBuf->bufFill );
- ef.addColorButton( edmBoxComplete_str13, actWin->ci, &fillCb,
- &editBuf->bufFillColor );
- ef.addToggle( edmBoxComplete_str11, &editBuf->bufFillColorMode );
- ef.addTextField( edmBoxComplete_str14, 30, editBuf->bufPvName,
- PV_Factory::MAX_PV_NAME );
- ef.addTextField( edmBoxComplete_str15, 30, &editBuf->bufEfReadMin );
- ef.addTextField( edmBoxComplete_str16, 30, &editBuf->bufEfReadMax );
- ef.addTextField( edmBoxComplete_str23, 30, &editBuf->bufEfPrecision );
- ef.addFontMenu( edmBoxComplete_str17, actWin->fi, &fm, fontTag );
- fm.setFontAlignment( alignment );
- ef.addTextField( edmBoxComplete_str18, 30, editBuf->bufLabel, 63 );
- return 1;
- }
- //---------------------------------------------------------------------------
- // called by editApply and editOK
- void edmBoxClass::editUpdate (
- Widget w,
- XtPointer client,
- XtPointer call )
- {
- edmBoxClass *ebo = (edmBoxClass *) client;
- // Widget data has changed
- ebo->actWin->setChanged();
- // All widgets must include next two lines
- ebo->eraseSelectBoxCorners();
- ebo->erase();
- // Copy edit buffer into current property values
- ebo->lineColorMode = ebo->editBuf->bufLineColorMode;
- if ( ebo->lineColorMode == COLORMODE_ALARM )
- ebo->lineColor.setAlarmSensitive();
- else
- ebo->lineColor.setAlarmInsensitive();
- ebo->lineColor.setColorIndex( ebo->editBuf->bufLineColor, ebo->actWin->ci );
- ebo->fill = ebo->editBuf->bufFill;
- ebo->fillColorMode = ebo->editBuf->bufFillColorMode;
- if ( ebo->fillColorMode == COLORMODE_ALARM )
- ebo->fillColor.setAlarmSensitive();
- else
- ebo->fillColor.setAlarmInsensitive();
- ebo->fillColor.setColorIndex( ebo->editBuf->bufFillColor, ebo->actWin->ci );
- ebo->lineWidth = ebo->editBuf->bufLineWidth;
- if ( ebo->editBuf->bufLineStyle == 0 )
- ebo->lineStyle = LineSolid;
- else if ( ebo->editBuf->bufLineStyle == 1 )
- ebo->lineStyle = LineOnOffDash;
- ebo->pvExpStr.setRaw( ebo->editBuf->bufPvName );
- ebo->efReadMin = ebo->editBuf->bufEfReadMin;
- ebo->efReadMax = ebo->editBuf->bufEfReadMax;
- ebo->efPrecision = ebo->editBuf->bufEfPrecision;
- if ( ebo->efReadMin.isNull() ) {
- ebo->readMin = 0;
- }
- else{
- ebo->readMin = ebo->efReadMin.value();
- }
- if ( ebo->efReadMax.isNull() ) {
- ebo->readMax = 10;
- }
- else{
- ebo->readMax = ebo->efReadMax.value();
- }
- if ( ( ebo->efPrecision.isNull() ) ) {
- ebo->precision = 1;
- }
- else{
- ebo->precision = ebo->efPrecision.value();
- }
- strncpy( ebo->fontTag, ebo->fm.currentFontTag(), 63 );
- ebo->fontTag[63] = 0;
- ebo->actWin->fi->loadFontTag( ebo->fontTag );
- ebo->alignment = ebo->fm.currentFontAlignment();
- ebo->fs = ebo->actWin->fi->getXFontStruct( ebo->fontTag );
- strncpy( ebo->label, ebo->editBuf->bufLabel, 63 );
- ebo->label[63] = 0;
- ebo->stringLength = strlen( ebo->label );
- ebo->updateFont( ebo->label, ebo->fontTag, &ebo->fs,
- &ebo->fontAscent, &ebo->fontDescent, &ebo->fontHeight,
- &ebo->stringWidth );
- // copy into object dimensions and select box dimensions
- ebo->x = ebo->editBuf->bufX;
- ebo->sboxX = ebo->editBuf->bufX;
- ebo->y = ebo->editBuf->bufY;
- ebo->sboxY = ebo->editBuf->bufY;
- ebo->w = ebo->editBuf->bufW;
- ebo->sboxW = ebo->editBuf->bufW;
- ebo->h = ebo->editBuf->bufH;
- ebo->sboxH = ebo->editBuf->bufH;
- // Check values and do a few calculations
- if ( ebo->w < 5 ) {
- ebo->w = 5;
- ebo->sboxW = ebo->w;
- }
- ebo->boxH = ebo->h - ebo->fontHeight - ebo->fontHeight;
- if ( ebo->boxH < 5 ) {
- ebo->boxH = 5;
- ebo->h = ebo->boxH + ebo->fontHeight + ebo->fontHeight;
- ebo->sboxH = ebo->h;
- }
- ebo->boxY = ebo->y + ebo->fontHeight;
- if ( ebo->readMax > ebo->readMin ) {
- ebo->factorW = (double) ( ebo->w - 2 ) / ( ebo->readMax - ebo->readMin );
- ebo->factorH = (double) ebo->boxH / ( ebo->readMax - ebo->readMin );
- }
- else {
- ebo->factorW = 1;
- ebo->factorH = 1;
- }
- ebo->centerX = ebo->x + (int) ( ebo->w * 0.5 + 0.5 );
- ebo->centerY = ebo->boxY + (int) ( ebo->boxH * 0.5 + 0.5 );
- // updateDimensions should be called whenever the widget size
- // or text fonts might have changed
- ebo->updateDimensions();
- }
- //---------------------------------------------------------------------------
- // X Windows callback function for the apply button on the property dialog
- void edmBoxClass::editApply (
- Widget w,
- XtPointer client,
- XtPointer call )
- {
- edmBoxClass *ebo = (edmBoxClass *) client;
- edmBoxClass::editUpdate( w, client, call );
- ebo->refresh( ebo );
- }
- //---------------------------------------------------------------------------
- // X Windows callback function for the OK button on the property dialog
- void edmBoxClass::editOk (
- Widget w,
- XtPointer client,
- XtPointer call )
- {
- edmBoxClass *ebo = (edmBoxClass *) client;
- edmBoxClass::editUpdate( w, client, call );
- delete ebo->editBuf;
- ebo->editBuf = NULL;
- ebo->ef.popdown();
- ebo->operationComplete();
- }
- //---------------------------------------------------------------------------
- // X Windows callback function for the cancel button on the property dialog
- void edmBoxClass::editCancel (
- Widget w,
- XtPointer client,
- XtPointer call )
- {
- edmBoxClass *ebo = (edmBoxClass *) client;
- delete ebo->editBuf;
- ebo->editBuf = NULL;
- ebo->ef.popdown();
- ebo->operationCancel();
- }
- //---------------------------------------------------------------------------
- // X Windows callback function for the cancel button on the property dialog
- // when the object is being created. If user cancels edit, object creation
- // is being canceled thus deleteRequest must be set.
- void edmBoxClass::editCancelDelete (
- Widget w,
- XtPointer client,
- XtPointer call )
- {
- edmBoxClass *ebo = (edmBoxClass *) client;
- delete ebo->editBuf;
- ebo->editBuf = NULL;
- ebo->erase();
- ebo->deleteRequest = 1;
- ebo->ef.popdown();
- ebo->operationCancel();
- ebo->drawAll();
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::createFromFile (
- FILE *f,
- char *name,
- activeWindowClass *_actWin )
- {
- // Read widget properties from file
- int major, minor, release, stat;
- tagClass tag;
- int zero = 0;
- int one = 1;
- static char *emptyStr = "";
- int solid = LineSolid;
- static char *styleEnumStr[2] = {
- "solid",
- "dash"
- };
- static int styleEnum[2] = {
- LineSolid,
- LineOnOffDash
- };
- static int left = XmALIGNMENT_BEGINNING;
- static char *alignEnumStr[3] = {
- "left",
- "center",
- "right"
- };
- static int alignEnum[3] = {
- XmALIGNMENT_BEGINNING,
- XmALIGNMENT_CENTER,
- XmALIGNMENT_END
- };
- this->actWin = _actWin;
- tag.init();
- tag.loadR( "beginObjectProperties" );
- tag.loadR( "major", &major );
- tag.loadR( "minor", &minor );
- tag.loadR( "release", &release );
- tag.loadR( "x", &x );
- tag.loadR( "y", &y );
- tag.loadR( "w", &w );
- tag.loadR( "h", &h );
- tag.loadR( "controlPv", &pvExpStr, emptyStr );
- tag.loadR( "lineColor", actWin->ci, &lineColor );
- tag.loadR( "lineAlarm", &lineColorMode, &zero );
- tag.loadR( "fill", &fill, &zero );
- tag.loadR( "fillColor", actWin->ci, &fillColor );
- tag.loadR( "fillAlarm", &fillColorMode, &zero );
- tag.loadR( "lineWidth", &lineWidth, &one );
- tag.loadR( "lineStyle", 2, styleEnumStr, styleEnum, &lineStyle, &solid );
- tag.loadR( "min", &efReadMin );
- tag.loadR( "max", &efReadMax );
- tag.loadR( "precision", &efPrecision );
- tag.loadR( "font", 63, fontTag );
- tag.loadR( "fontAlign", 3, alignEnumStr, alignEnum, &alignment, &left );
- tag.loadR( "label", 63, label, emptyStr );
- tag.loadR( "endObjectProperties" );
- stat = tag.readTags( f, "endObjectProperties" );
- if ( !( stat & 1 ) ) {
- actWin->appCtx->postMessage( tag.errMsg() );
- }
- // If new object version is greater than current version then abort
- if ( major > MAJOR_VERSION ) {
- postIncompatable();
- return 0;
- }
- // If new object version is "old file format" then abort
- if ( major < 4 ) {
- postIncompatable();
- return 0;
- }
- // initSelectBox must always be call after getting x,y,w,h
- this->initSelectBox(); // call after getting x,y,w,h
- // Process pv alarm information
- if ( lineColorMode == COLORMODE_ALARM )
- lineColor.setAlarmSensitive();
- else
- lineColor.setAlarmInsensitive();
- if ( fillColorMode == COLORMODE_ALARM )
- fillColor.setAlarmSensitive();
- else
- fillColor.setAlarmInsensitive();
- // Process min, max, precision
- if ( efReadMin.isNull() ) {
- readMin = 0;
- }
- else{
- readMin = efReadMin.value();
- }
- if ( efReadMax.isNull() ) {
- readMax = 10;
- }
- else{
- readMax = efReadMax.value();
- }
- if ( ( efPrecision.isNull() ) ) {
- precision = 1;
- }
- else{
- precision = efPrecision.value();
- }
- // Make fonts available to X Server, get font struct and font metrics
- actWin->fi->loadFontTag( fontTag );
- fs = actWin->fi->getXFontStruct( fontTag );
- stringLength = strlen( label );
- updateFont( label, fontTag, &fs,
- &fontAscent, &fontDescent, &fontHeight,
- &stringWidth );
- // updateDimensions should be called whenever the widget size
- // or text fonts might have changed
- updateDimensions();
- // Do various calculations
- if ( readMax > readMin ) {
- factorW = (double) ( w - 2 ) / ( readMax - readMin );
- factorH = (double) boxH / ( readMax - readMin );
- }
- else {
- factorW = 1;
- factorH = 1;
- }
- centerX = x + (int) ( w * 0.5 + 0.5 );
- centerY = boxY + (int) ( boxH * 0.5 + 0.5 );
- curValue = 0;
- return stat;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::old_createFromFile (
- FILE *f,
- char *name,
- activeWindowClass *_actWin )
- {
- int r, g, b, index;
- int major, minor, release;
- unsigned int pixel;
- char oneName[PV_Factory::MAX_PV_NAME+1];
- this->actWin = _actWin;
- fscanf( f, "%d %d %d\n", &major, &minor, &release ); actWin->incLine();
- if ( major > MAJOR_VERSION ) {
- postIncompatable();
- return 0;
- }
- fscanf( f, "%d\n", &x ); actWin->incLine();
- fscanf( f, "%d\n", &y ); actWin->incLine();
- fscanf( f, "%d\n", &w ); actWin->incLine();
- fscanf( f, "%d\n", &h ); actWin->incLine();
- this->initSelectBox(); // call after getting x,y,w,h
- if ( ( major > 2 ) || ( ( major == 2 ) && ( minor > 0 ) ) ) {
- actWin->ci->readColorIndex( f, &index );
- actWin->incLine(); actWin->incLine();
- lineColor.setColorIndex( index, actWin->ci );
- fscanf( f, "%d\n", &lineColorMode ); actWin->incLine();
- if ( lineColorMode == COLORMODE_ALARM )
- lineColor.setAlarmSensitive();
- else
- lineColor.setAlarmInsensitive();
- fscanf( f, "%d\n", &fill ); actWin->incLine();
- actWin->ci->readColorIndex( f, &index );
- actWin->incLine(); actWin->incLine();
- fillColor.setColorIndex( index, actWin->ci );
- }
- else if ( major > 1 ) {
- fscanf( f, "%d\n", &index ); actWin->incLine();
- lineColor.setColorIndex( index, actWin->ci );
- fscanf( f, "%d\n", &lineColorMode ); actWin->incLine();
- if ( lineColorMode == COLORMODE_ALARM )
- lineColor.setAlarmSensitive();
- else
- lineColor.setAlarmInsensitive();
- fscanf( f, "%d\n", &fill ); actWin->incLine();
- fscanf( f, "%d\n", &index ); actWin->incLine();
- fillColor.setColorIndex( index, actWin->ci );
- }
- else {
- fscanf( f, "%d %d %d\n", &r, &g, &b ); actWin->incLine();
- actWin->ci->setRGB( r, g, b, &pixel );
- index = actWin->ci->pixIndex( pixel );
- lineColor.setColorIndex( index, actWin->ci );
- fscanf( f, "%d\n", &lineColorMode ); actWin->incLine();
- if ( lineColorMode == COLORMODE_ALARM )
- lineColor.setAlarmSensitive();
- else
- lineColor.setAlarmInsensitive();
- fscanf( f, "%d\n", &fill ); actWin->incLine();
- fscanf( f, "%d %d %d\n", &r, &g, &b ); actWin->incLine();
- actWin->ci->setRGB( r, g, b, &pixel );
- index = actWin->ci->pixIndex( pixel );
- fillColor.setColorIndex( index, actWin->ci );
- }
- fscanf( f, "%d\n", &fillColorMode ); actWin->incLine();
- if ( fillColorMode == COLORMODE_ALARM )
- fillColor.setAlarmSensitive();
- else
- fillColor.setAlarmInsensitive();
- readStringFromFile( oneName, PV_Factory::MAX_PV_NAME+1, f );
- actWin->incLine();
- pvExpStr.setRaw( oneName );
- fscanf( f, "%d\n", &lineWidth ); actWin->incLine();
- fscanf( f, "%d\n", &lineStyle ); actWin->incLine();
- efReadMin.read( f ); actWin->incLine();
- efReadMax.read( f ); actWin->incLine();
- if ( ( efReadMin.isNull() ) && ( efReadMax.isNull() ) ) {
- readMin = 0;
- readMax = 10;
- }
- else{
- readMin = efReadMin.value();
- readMax = efReadMax.value();
- }
- if ( ( major > 1 ) || ( minor > 3 ) ) {
- readStringFromFile( fontTag, 63+1, f ); actWin->incLine();
- readStringFromFile( label, 63+1, f ); actWin->incLine();
- actWin->fi->loadFontTag( fontTag );
- fs = actWin->fi->getXFontStruct( fontTag );
- stringLength = strlen( label );
- updateFont( label, fontTag, &fs,
- &fontAscent, &fontDescent, &fontHeight,
- &stringWidth );
- }
- else {
- strcpy( label, "" );
- stringLength = 0;
- strcpy( fontTag, actWin->defaultFontTag );
- fs = actWin->fi->getXFontStruct( fontTag );
- updateFont( label, fontTag, &fs,
- &fontAscent, &fontDescent, &fontHeight,
- &stringWidth );
- }
- if ( ( major > 1 ) || ( minor > 4 ) ) {
- fscanf( f, "%d\n", &alignment ); actWin->incLine();
- }
- else {
- alignment = XmALIGNMENT_BEGINNING;
- }
- if ( alignment == XmALIGNMENT_BEGINNING )
- labelX = x;
- else if ( alignment == XmALIGNMENT_CENTER )
- labelX = x + w/2 - stringWidth/2;
- else if ( alignment == XmALIGNMENT_END )
- labelX = x + w - stringWidth;
- labelY = y + h;
- boxH = h - fontHeight - fontHeight;
- if ( boxH < 5 ) {
- boxH = 5;
- h = boxH + fontHeight + fontHeight;
- }
- boxY = y + fontHeight;
- if ( readMax > readMin ) {
- factorW = (double) ( w - 2 ) / ( readMax - readMin );
- factorH = (double) boxH / ( readMax - readMin );
- }
- else {
- factorW = 1;
- factorH = 1;
- }
- centerX = x + (int) ( w * 0.5 + 0.5 );
- centerY = boxY + (int) ( boxH * 0.5 + 0.5 );
- curValue = 0;
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::save (
- FILE *f )
- {
- // Save widget properties to file
- int major, minor, release, stat;
- tagClass tag;
- int zero = 0;
- int one = 1;
- static char *emptyStr = "";
- int solid = LineSolid;
- static char *styleEnumStr[2] = {
- "solid",
- "dash"
- };
- static int styleEnum[2] = {
- LineSolid,
- LineOnOffDash
- };
- static int left = XmALIGNMENT_BEGINNING;
- static char *alignEnumStr[3] = {
- "left",
- "center",
- "right"
- };
- static int alignEnum[3] = {
- XmALIGNMENT_BEGINNING,
- XmALIGNMENT_CENTER,
- XmALIGNMENT_END
- };
- major = MAJOR_VERSION;
- minor = MINOR_VERSION;
- release = RELEASE;
- tag.init();
- tag.loadW( "beginObjectProperties" );
- tag.loadW( "major", &major );
- tag.loadW( "minor", &minor );
- tag.loadW( "release", &release );
- tag.loadW( "x", &x );
- tag.loadW( "y", &y );
- tag.loadW( "w", &w );
- tag.loadW( "h", &h );
- tag.loadW( "controlPv", &pvExpStr, emptyStr );
- tag.loadW( "lineColor", actWin->ci, &lineColor );
- tag.loadBoolW( "lineAlarm", &lineColorMode, &zero );
- tag.loadBoolW( "fill", &fill, &zero );
- tag.loadW( "fillColor", actWin->ci, &fillColor );
- tag.loadBoolW( "fillAlarm", &fillColorMode, &zero );
- tag.loadW( "lineWidth", &lineWidth, &one );
- tag.loadW( "lineStyle", 2, styleEnumStr, styleEnum, &lineStyle, &solid );
- tag.loadW( "min", &efReadMin );
- tag.loadW( "max", &efReadMax );
- tag.loadW( "precision", &efPrecision );
- tag.loadW( "font", fontTag );
- tag.loadW( "fontAlign", 3, alignEnumStr, alignEnum, &alignment, &left );
- tag.loadW( "label", label, emptyStr );
- tag.loadW( "endObjectProperties" );
- tag.loadW( "" );
- stat = tag.writeTags( f );
- return stat;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::old_save (
- FILE *f )
- {
- int index, stat;
- fprintf( f, "%-d %-d %-d\n", MAJOR_VERSION, MINOR_VERSION, RELEASE );
- fprintf( f, "%-d\n", x );
- fprintf( f, "%-d\n", y );
- fprintf( f, "%-d\n", w );
- fprintf( f, "%-d\n", h );
- index = lineColor.pixelIndex();
- actWin->ci->writeColorIndex( f, index );
- //fprintf( f, "%-d\n", index );
- fprintf( f, "%-d\n", lineColorMode );
- fprintf( f, "%-d\n", fill );
- index = fillColor.pixelIndex();
- actWin->ci->writeColorIndex( f, index );
- //fprintf( f, "%-d\n", index );
- fprintf( f, "%-d\n", fillColorMode );
- if ( pvExpStr.getRaw() )
- writeStringToFile( f, pvExpStr.getRaw() );
- else
- writeStringToFile( f, "" );
- fprintf( f, "%-d\n", lineWidth );
- fprintf( f, "%-d\n", lineStyle );
- stat = efReadMin.write( f );
- stat = efReadMax.write( f );
- writeStringToFile( f, fontTag );
- writeStringToFile( f, label );
- fprintf( f, "%-d\n", alignment );
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::draw ( void ) {
- // Draw edit mode image
- XRectangle xR = { x, y, w, h };
- int clipStat;
- int blink = 0;
- // if widget is being activated or has been deleted, return
- if ( activeMode || deleteRequest ) return 1;
- // Save foreground color
- actWin->drawGc.saveFg();
- // Set clipping region
- clipStat = actWin->drawGc.addNormXClipRectangle( xR );
- // If filled, fill in rectangle with specified color
- if ( fill ) {
- actWin->drawGc.setFG( fillColor.pixelIndex(), &blink );
- XFillRectangle( actWin->d, XtWindow(actWin->drawWidget),
- actWin->drawGc.normGC(), x+1, boxY, w-2, boxH );
- }
- // Set line color, style, and width to specified values
- actWin->drawGc.setFG( lineColor.pixelIndex(), &blink );
- actWin->drawGc.setLineWidth( lineWidth );
- actWin->drawGc.setLineStyle( lineStyle );
- // Draw rectangle outline
- XDrawRectangle( actWin->d, XtWindow(actWin->drawWidget),
- actWin->drawGc.normGC(), x+1, boxY, w-2, boxH );
- // Set graphic context font
- if ( strcmp( fontTag, "" ) != 0 ) {
- actWin->drawGc.setFontTag( fontTag, actWin->fi );
- }
- // Draw label text
- xDrawText( actWin->d, XtWindow(actWin->drawWidget),
- &actWin->drawGc, fs, labelX, labelY, alignment,
- label );
- // Remove clippling region
- if ( clipStat & 1 ) actWin->drawGc.removeNormXClipRectangle();
- // restore graphic context values
- actWin->drawGc.setLineWidth( 1 );
- actWin->drawGc.setLineStyle( LineSolid );
- actWin->drawGc.restoreFg();
- // This makes the blink magic work
- updateBlink( blink );
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::erase ( void ) {
- // Draw edit mode image
- // Colors are not set because the eraseGC is used; the eraseGC contains
- // the color of the display background
- XRectangle xR = { x, y, w, h };
- int clipStat;
- // if widget is being activated or has been deleted, return
- if ( activeMode || deleteRequest ) return 1;
- // Set clipping region
- clipStat = actWin->drawGc.addEraseXClipRectangle( xR );
- // If filled, erase fill
- if ( fill ) {
- XFillRectangle( actWin->d, XtWindow(actWin->drawWidget),
- actWin->drawGc.eraseGC(), x+1, boxY, w-2, boxH );
- }
- // Set line style and width to specified values
- actWin->drawGc.setLineWidth( lineWidth );
- actWin->drawGc.setLineStyle( lineStyle );
- // Erase rectangle outline
- XDrawRectangle( actWin->d, XtWindow(actWin->drawWidget),
- actWin->drawGc.eraseGC(), x+1, boxY, w-2, boxH );
- // Set graphic context font
- if ( strcmp( fontTag, "" ) != 0 ) {
- actWin->drawGc.setFontTag( fontTag, actWin->fi );
- }
- // Erase label text
- xEraseText( actWin->d, XtWindow(actWin->drawWidget),
- &actWin->drawGc, fs, labelX, labelY, alignment,
- label );
- // Remove clippling region
- if ( clipStat & 1 ) actWin->drawGc.removeEraseXClipRectangle();
- // restore graphic context values
- actWin->drawGc.setLineWidth( 1 );
- actWin->drawGc.setLineStyle( LineSolid );
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::checkResizeSelectBox (
- int _x,
- int _y,
- int _w,
- int _h ) {
- // Constrain minimum widget area size, input parameters are
- // delta values
- int tmpw, tmph, tmpBoxH, ret_stat;
- ret_stat = 1;
- tmpw = sboxW;
- tmph = sboxH;
- tmpw += _w;
- tmph += _h;
- tmpBoxH = tmph - fontHeight - fontHeight;
- if ( tmpBoxH < 5 ) ret_stat = 0;
- if ( tmpw < 5 ) ret_stat = 0;
- return ret_stat;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::checkResizeSelectBoxAbs (
- int _x,
- int _y,
- int _w,
- int _h ) {
- // Constrain minimum widget area size, input parameters are
- // absolute values
- int tmpw, tmph, tmpBoxH, ret_stat;
- ret_stat = 1;
- tmpw = _w;
- tmph = _h;
- if ( tmph != -1 ) {
- tmpBoxH = tmph - fontHeight - fontHeight;
- if ( tmpBoxH < 5 ) ret_stat = 0;
- }
- if ( tmpw != -1 ) {
- if ( tmpw < 5 ) ret_stat = 0;
- }
- return ret_stat;
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::updateDimensions ( void ) {
- // Update values of position and size of widget internal details
- boxY = y + fontHeight;
- labelY = y + h - fontHeight;
- textValueY = y;
- if ( alignment == XmALIGNMENT_BEGINNING )
- textValueX = x;
- else if ( alignment == XmALIGNMENT_CENTER )
- textValueX = x + w/2;
- else if ( alignment == XmALIGNMENT_END )
- textValueX = x + w;
- if ( alignment == XmALIGNMENT_BEGINNING )
- labelX = x;
- else if ( alignment == XmALIGNMENT_CENTER )
- labelX = x + w/2;
- else if ( alignment == XmALIGNMENT_END )
- labelX = x + w;
- boxH = h - fontHeight - fontHeight;
- if ( boxH < 5 ) {
- boxH = 5;
- h = boxH + fontHeight + fontHeight;
- sboxH = h;
- }
- if ( w < 5 ) {
- w = 5;
- sboxW = 5;
- }
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::changeDisplayParams (
- unsigned int _flag,
- char *_fontTag,
- int _alignment,
- char *_ctlFontTag,
- int _ctlAlignment,
- char *_btnFontTag,
- int _btnAlignment,
- int _textFgColor,
- int _fg1Color,
- int _fg2Color,
- int _offsetColor,
- int _bgColor,
- int _topShadowColor,
- int _botShadowColor )
- {
- // Depending on flag bits set, update various display properties; widgets
- // ignore properties that are not applicable
- if ( _flag & ACTGRF_FG1COLOR_MASK )
- lineColor.setColorIndex( _fg1Color, actWin->ci );
- if ( _flag & ACTGRF_BGCOLOR_MASK )
- fillColor.setColorIndex( _bgColor, actWin->ci );
- if ( _flag & ACTGRF_CTLFONTTAG_MASK ) {
- strcpy( fontTag, _ctlFontTag );
- alignment = _ctlAlignment;
- fs = actWin->fi->getXFontStruct( fontTag );
- updateFont( " ", fontTag, &fs,
- &fontAscent, &fontDescent, &fontHeight,
- &stringWidth );
- updateDimensions();
- }
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::changePvNames (
- int flag,
- int numCtlPvs,
- char *ctlPvs[],
- int numReadbackPvs,
- char *readbackPvs[],
- int numNullPvs,
- char *nullPvs[],
- int numVisPvs,
- char *visPvs[],
- int numAlarmPvs,
- char *alarmPvs[] )
- {
- // Depending on flag bits set, update various process variable
- // names; widgets ignore pv names that are not applicable
- if ( flag & ACTGRF_CTLPVS_MASK ) {
- if ( numCtlPvs ) {
- pvExpStr.setRaw( ctlPvs[0] );
- }
- }
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::drawActive ( void ) {
- XRectangle xR = { x, y, w, h };
- int clipStat;
- char string[31+1];
- int ascent, descent, height, width;
- int blink = 0;
- if ( !init ) {
- if ( needToDrawUnconnected ) {
- actWin->executeGc.saveFg();
- actWin->executeGc.setFG( lineColor.getDisconnectedIndex(), &blink );
- actWin->executeGc.setLineWidth( 1 );
- actWin->executeGc.setLineStyle( LineSolid );
- XDrawRectangle( actWin->d, XtWindow(actWin->executeWidget),
- actWin->executeGc.normGC(), x, y, w, h );
- actWin->executeGc.restoreFg();
- needToEraseUnconnected = 1;
- updateBlink( blink );
- }
- }
- else if ( needToEraseUnconnected ) {
- actWin->executeGc.setLineWidth( 1 );
- actWin->executeGc.setLineStyle( LineSolid );
- XDrawRectangle( actWin->d, XtWindow(actWin->executeWidget),
- actWin->executeGc.eraseGC(), x, y, w, h );
- needToEraseUnconnected = 0;
- }
- if ( !enabled || !activeMode || !init ) return 1;
- actWin->executeGc.saveFg();
- clipStat = actWin->executeGc.addNormXClipRectangle( xR );
- if ( fill ) {
- actWin->executeGc.setFG( fillColor.getIndex(), &blink );
- XFillRectangle( actWin->d, XtWindow(actWin->executeWidget),
- actWin->executeGc.normGC(), valueBoxX, valueBoxY, valueBoxW, valueBoxH );
- }
- actWin->executeGc.setFG( lineColor.getIndex(), &blink );
- actWin->executeGc.setLineWidth( lineWidth );
- actWin->executeGc.setLineStyle( lineStyle );
- XDrawRectangle( actWin->d, XtWindow(actWin->executeWidget),
- actWin->executeGc.normGC(), valueBoxX, valueBoxY, valueBoxW, valueBoxH );
- actWin->executeGc.setLineWidth( 1 );
- actWin->executeGc.setLineStyle( LineSolid );
- snprintf( string, 31, format, value );
- if ( strcmp( fontTag, "" ) != 0 ) {
- actWin->executeGc.setFontTag( fontTag, actWin->fi );
- }
- updateFont( string, fontTag, &fs,
- &ascent, &descent, &height, &width );
- xDrawText( actWin->d, XtWindow(actWin->executeWidget),
- &actWin->executeGc, fs, textValueX, textValueY, alignment,
- string );
- prevValue = value;
- if ( bufferInvalid ) {
- xDrawText( actWin->d, XtWindow(actWin->executeWidget),
- &actWin->executeGc, fs, labelX, labelY, alignment,
- label );
- bufferInvalid = 0;
- }
- if ( clipStat & 1 ) actWin->executeGc.removeNormXClipRectangle();
- actWin->executeGc.restoreFg();
- updateBlink( blink );
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::eraseActive ( void ) {
- XRectangle xR = { x, y, w, h };
- int clipStat;
- char string[31+1];
- if ( !enabled || !activeMode || !init ) return 1;
- clipStat = actWin->executeGc.addEraseXClipRectangle( xR );
- if ( fill ) {
- XFillRectangle( actWin->d, XtWindow(actWin->executeWidget),
- actWin->executeGc.eraseGC(), valueBoxX, valueBoxY, valueBoxW, valueBoxH );
- }
- actWin->executeGc.setLineWidth( lineWidth );
- actWin->executeGc.setLineStyle( lineStyle );
- XDrawRectangle( actWin->d, XtWindow(actWin->executeWidget),
- actWin->executeGc.eraseGC(), valueBoxX, valueBoxY, valueBoxW, valueBoxH );
- actWin->executeGc.setLineWidth( 1 );
- actWin->executeGc.setLineStyle( LineSolid );
- snprintf( string, 31, format, prevValue );
- if ( strcmp( fontTag, "" ) != 0 ) {
- actWin->executeGc.setFontTag( fontTag, actWin->fi );
- }
- xEraseText( actWin->d, XtWindow(actWin->executeWidget),
- &actWin->executeGc, fs, textValueX, textValueY, alignment,
- string );
- if ( bufferInvalid ) {
- xEraseText( actWin->d, XtWindow(actWin->executeWidget),
- &actWin->executeGc, fs, labelX, labelY, alignment,
- label );
- }
- if ( clipStat & 1 ) actWin->executeGc.removeEraseXClipRectangle();
- return 1;
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::bufInvalidate ( void )
- {
- bufferInvalid = 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::expand1st (
- int numMacros,
- char *macros[],
- char *expansions[] )
- {
- int stat;
- stat = pvExpStr.expand1st( numMacros, macros, expansions );
- return stat;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::expand2nd (
- int numMacros,
- char *macros[],
- char *expansions[] )
- {
- int stat;
- stat = pvExpStr.expand2nd( numMacros, macros, expansions );
- return stat;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::containsMacros ( void ) {
- if ( pvExpStr.containsPrimaryMacros() ) return 1;
- return 0;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::activate (
- int pass,
- void *ptr )
- {
- int stat;
- switch ( pass ) {
- case 1: // initialize
- opComplete = 0;
- break;
- case 2: // connect to pv
- if ( !opComplete ) {
- initEnable();
- aglPtr = ptr;
- needConnectInit = needUpdate = needDraw = 0;
- init = 0;
- active = 0;
- activeMode = 1;
- bufferInvalid = 0;
- pointerMotionDetected = 0;
- pvId = NULL;
- oldStat = oldSev = -1;
- value = prevValue = 0;
- needToDrawUnconnected = 0;
- needToEraseUnconnected = 0;
- unconnectedTimer = 0;
- if ( !unconnectedTimer ) {
- unconnectedTimer = appAddTimeOut( actWin->appCtx->appContext(),
- 2000, unconnectedTimeout, this );
- }
- if ( !pvExpStr.getExpanded() ||
- // ( strcmp( pvExpStr.getExpanded(), "" ) == 0 ) ) {
- blankOrComment( pvExpStr.getExpanded() ) ) {
- pvExists = 0;
- }
- else {
- pvExists = 1;
- lineColor.setConnectSensitive();
- fillColor.setConnectSensitive();
- }
- if ( pvExists ) {
- pvId = the_PV_Factory->create( pvExpStr.getExpanded() );
- if ( pvId ) {
- pvId->add_conn_state_callback( monitorPvConnectState, this );
- pvId->add_value_callback( pvUpdate, this );
- }
- else {
- printf( edmBoxComplete_str21 );
- }
- }
- else {
- active = 1;
- init = 1;
- valueBoxW = w-2;
- valueBoxX = x+1;
- valueBoxH = boxH;
- valueBoxY = boxY;
- stat = drawActive();
- }
- opComplete = 1;
- }
- break;
- case 3:
- case 4:
- case 5:
- case 6:
- break;
- }
- return 1;
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::deactivate (
- int pass )
- {
- if ( pass == 1 ) {
- if ( unconnectedTimer ) {
- XtRemoveTimeOut( unconnectedTimer );
- unconnectedTimer = 0;
- }
- activeMode = 0;
- if ( pvId ) {
- pvId->remove_conn_state_callback( monitorPvConnectState, this );
- pvId->remove_value_callback( pvUpdate, this );
- pvId->release();
- pvId = NULL;
- }
- }
- return 1;
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::btnUp (
- int x,
- int y,
- int buttonState,
- int buttonNumber,
- int *action )
- {
- double v, dInc;
- *action = 0;
- if ( !enabled ) return;
- dInc = 10.0;
- // wheel
- if ( buttonNumber == 4 ) {
- buttonNumber = 1;
- dInc = 1.0;
- }
- if ( buttonNumber == 5 ) {
- buttonNumber = 1;
- buttonState |= ShiftMask;
- dInc = 1.0;
- }
- // wheel
- if ( buttonNumber != 1 ) return;
- if ( pvExists && !pointerMotionDetected ) {
- if ( buttonState & ShiftMask ) {
- v = curValue - dInc;
- if ( v < readMin ) v = readMin;
- }
- else {
- v = curValue + dInc;
- if ( v > readMax ) v = readMax;
- }
- pvId->put( v );
- }
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::btnDown (
- int x,
- int y,
- int buttonState,
- int buttonNumber,
- int *action )
- {
- if ( !enabled ) return;
- if ( buttonNumber == 4 ) buttonNumber = 1;
- if ( buttonNumber == 5 ) buttonNumber = 1;
- if ( buttonNumber != 1 ) return;
- pointerMotionDetected = 0;
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::btnDrag (
- int x,
- int y,
- int buttonState,
- int buttonNumber )
- {
- double v;
- if ( !enabled ) return;
- if ( buttonNumber != 1 ) return;
- pointerMotionDetected = 1;
- if ( pvExists ) {
- if ( buttonState & ShiftMask ) {
- v = curValue - 1.0;
- if ( v < readMin ) v = readMin;
- }
- else {
- v = curValue + 1.0;
- if ( v > readMax ) v = readMax;
- }
- pvId->put( v );
- }
- }
- //---------------------------------------------------------------------------
- int edmBoxClass::getButtonActionRequest (
- int *up,
- int *down,
- int *drag,
- int *focus )
- {
- *drag = 1;
- *down = 1;
- *up = 1;
- if ( pvExists )
- *focus = 1;
- else
- *focus = 0;
- return 1;
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::executeDeferred ( void ) {
- int stat, nc, nu, nd;
- if ( actWin->isIconified ) return;
- actWin->appCtx->proc->lock();
- if ( !activeMode ) {
- actWin->remDefExeNode( aglPtr );
- actWin->appCtx->proc->unlock();
- return;
- }
- value = curValue;
- nc = needConnectInit; needConnectInit = 0;
- nu = needUpdate; needUpdate = 0;
- nd = needDraw; needDraw = 0;
- actWin->remDefExeNode( aglPtr );
- actWin->appCtx->proc->unlock();
- //--------------
- if ( nc ) {
- // require process variable to be numeric
- if ( ( fieldType == ProcessVariable::Type::real ) ||
- ( fieldType == ProcessVariable::Type::integer ) ) {
- snprintf( format, 15, "%%.%-df", precision );
- stat = eraseActive();
- if ( readMax > readMin ) {
- factorW = (double) ( w - 2 ) / ( readMax - readMin );
- factorH = (double) boxH / ( readMax - readMin );
- }
- else {
- factorW = 1;
- factorH = 1;
- }
- centerX = x + (int) ( w * 0.5 + 0.5 );
- centerY = boxY + (int) ( boxH * 0.5 + 0.5 );
- if ( value > 0.0 ) {
- valueBoxW = (int) ( value * factorW + 0.5 );
- valueBoxX = centerX - (int) ( (double) valueBoxW * 0.5 + 0.5 );
- valueBoxH = (int) ( value * factorH + 0.5 );
- valueBoxY = centerY - (int) ( (double) valueBoxH * 0.5 + 0.5 );
- }
- else {
- valueBoxW = 1;
- valueBoxX = centerX;
- valueBoxH = 1;
- valueBoxY = centerY;
- }
- init = 1;
- active = 1;
- lineColor.setConnected();
- fillColor.setConnected();
- bufInvalidate();
- #if SMARTDRAW
- smartDrawAllActive();
- #else
- drawActive();
- #endif
- }
- else { // force a draw in the non-active state & post error message
- actWin->appCtx->postMessage(
- edmBoxComplete_str22 );
- active = 0;
- init = 1;
- valueBoxW = w-2;
- valueBoxX = x+1;
- valueBoxH = boxH;
- valueBoxY = boxY;
- lineColor.setDisconnected();
- fillColor.setDisconnected();
- #if SMARTDRAW
- smartDrawAllActive();
- #else
- drawActive();
- #endif
- }
- }
- //--------------
- if ( nu ) {
- eraseActive();
- if ( value > 0.0 ) {
- valueBoxW = (int) ( value * factorW + 0.5 );
- valueBoxX = centerX - (int) ( (double) valueBoxW * 0.5 + 0.5 );
- valueBoxH = (int) ( value * factorH + 0.5 );
- valueBoxY = centerY - (int) ( (double) valueBoxH * 0.5 + 0.5 );
- }
- else {
- valueBoxW = 1;
- valueBoxX = centerX;
- valueBoxH = 1;
- valueBoxY = centerY;
- }
- #if SMARTDRAW
- smartDrawAllActive();
- #else
- drawActive();
- #endif
- }
- //--------------
- if ( nd ) {
- #if SMARTDRAW
- smartDrawAllActive();
- #else
- drawActive();
- #endif
- }
- }
- //---------------------------------------------------------------------------
- char *edmBoxClass::firstDragName ( void ) {
- if ( !enabled ) return NULL;
- dragIndex = 0;
- return dragName[dragIndex];
- }
- //---------------------------------------------------------------------------
- char *edmBoxClass::nextDragName ( void ) {
- return NULL;
- }
- //---------------------------------------------------------------------------
- char *edmBoxClass::dragValue (
- int i ) {
- if ( !enabled ) return NULL;
- if ( actWin->mode == AWC_EXECUTE ) {
- return pvExpStr.getExpanded();
- }
- else {
- return pvExpStr.getRaw();
- }
- }
- //---------------------------------------------------------------------------
- // X windows makes client code do blinking if color depth is
- // anything other than 8 bits
- void edmBoxClass::doBlink (
- void *ptr
- ) {
- edmBoxClass *ebo = (edmBoxClass *) ptr;
- if ( !ebo->activeMode ) {
- if ( ebo->isSelected() ) ebo->drawSelectBoxCorners(); // erase via xor
- #if SMARTDRAW
- ebo->smartDrawAll();
- #else
- ebo->draw();
- #endif
- if ( ebo->isSelected() ) ebo->drawSelectBoxCorners();
- }
- else {
- ebo->actWin->appCtx->proc->lock();
- ebo->bufInvalidate();
- ebo->needUpdate = 1;
- ebo->actWin->addDefExeNode( ebo->aglPtr );
- ebo->actWin->appCtx->proc->unlock();
- }
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::unconnectedTimeout (
- XtPointer client,
- XtIntervalId *id )
- {
- edmBoxClass *ebo = (edmBoxClass *) client;
- if ( !ebo->init ) {
- ebo->actWin->appCtx->proc->lock();
- ebo->bufInvalidate();
- ebo->needToDrawUnconnected = 1;
- ebo->needUpdate = 1;
- ebo->actWin->addDefExeNode( ebo->aglPtr );
- ebo->actWin->appCtx->proc->unlock();
- }
- ebo->unconnectedTimer = 0;
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::monitorPvConnectState (
- ProcessVariable *pv,
- void *userarg )
- {
- edmBoxClass *ebo = (edmBoxClass *) userarg;
- ebo->actWin->appCtx->proc->lock();
- if ( !ebo->activeMode ) {
- ebo->actWin->appCtx->proc->unlock();
- return;
- }
- if ( pv->is_valid() ) {
- ebo->fieldType = (int) pv->get_type().type;
- ebo->curValue = pv->get_double();
- if ( ebo->efReadMin.isNull() ) {
- ebo->readMin = pv->get_lower_disp_limit();
- }
- else {
- ebo->readMin = ebo->efReadMin.value();
- }
- if ( ebo->efReadMax.isNull() ) {
- ebo->readMax = pv->get_upper_disp_limit();
- }
- else {
- ebo->readMax = ebo->efReadMax.value();
- }
- if ( ebo->efPrecision.isNull() ) {
- ebo->precision = pv->get_precision();
- }
- else {
- ebo->precision = ebo->efPrecision.value();
- }
- ebo->needConnectInit = 1;
- }
- else { // lost connection
- ebo->active = 0;
- ebo->lineColor.setDisconnected();
- ebo->fillColor.setDisconnected();
- ebo->bufInvalidate();
- ebo->needDraw = 1;
- }
- ebo->actWin->addDefExeNode( ebo->aglPtr );
- ebo->actWin->appCtx->proc->unlock();
- }
- //---------------------------------------------------------------------------
- void edmBoxClass::pvUpdate (
- ProcessVariable *pv,
- void *userarg )
- {
- class edmBoxClass *ebo = (edmBoxClass *) userarg;
- int st, sev;
- if ( !ebo->activeMode ) return;
- ebo->actWin->appCtx->proc->lock();
- ebo->curValue = pv->get_double();
- ebo->needUpdate = 1;
- st = pv->get_status();
- sev = pv->get_severity();
- if ( ( st != ebo->oldStat ) || ( sev != ebo->oldSev ) ) {
- ebo->oldStat = st;
- ebo->oldSev = sev;
- ebo->lineColor.setStatus( st, sev );
- ebo->fillColor.setStatus( st, sev );
- ebo->needDraw = 1;
- ebo->bufInvalidate();
- }
- ebo->actWin->addDefExeNode( ebo->aglPtr );
- ebo->actWin->appCtx->proc->unlock();
- }
- void edmBoxClass::getPvs (
- int max,
- ProcessVariable *pvs[],
- int *n ) {
- if ( max < 1 ) {
- *n = 0;
- return;
- }
- *n = 1;
- pvs[0] = pvId;
- }
- //---------------------------------------------------------------------------
- // "C" compatible class factory functions
- extern "C" {
- void *create_2ed7d2e8_f439_11d2_8fed_00104b8742dfPtr ( void ) {
- edmBoxClass *ptr;
- ptr = new edmBoxClass;
- return (void *) ptr;
- }
- void *clone_2ed7d2e8_f439_11d2_8fed_00104b8742dfPtr (
- void *_srcPtr )
- {
- edmBoxClass *ptr, *srcPtr;
- srcPtr = (edmBoxClass *) _srcPtr;
- ptr = new edmBoxClass( srcPtr );
- return (void *) ptr;
- }
- }