Serious-Engine/Sources/LWSkaExporter/SDK/lwmonitor.h
2016-03-11 15:57:17 +02:00

155 lines
5.5 KiB
C

/*
* LWSDK Header File
* Copyright 1999, NewTek, Inc.
*
* LWMONITOR.H -- LightWave Progress Monitor
*
* Monitors are simple data structures defining an interface which the
* server can use to give feedback to the host on its progress in
* performing some task. They are sometimes passed servers to give
* feedback on the progress of the particular operation, and can sometimes
* be accessed from within a server that wants to show its progress on a
* slow operation using the host's normal feedback display.
*/
#ifndef LWSDK_MONITOR_H
#define LWSDK_MONITOR_H
/*
* An LWMonitor struct consists of some generic data and three functions:
* init, step and done. The 'init' function is called first with the
* number of steps in the process to be monitored, which is computed by
* the server. As the task is processed, the 'step' function is called
* with the number of steps just completed (often one). These step
* increments should eventually add up to the total number and then the
* 'done' function is called, but 'done' may be called early if there was
* a problem or the process was aborted. The 'step' function will return
* one if the user requested an abort and zero otherwise.
*
* The server is masked from any errors in the monitor that may occur on
* the host side of the interface. If there is a problem with putting up
* a monitor, the functions will still return normally, since the monitor
* is for user feedback and is not that critical.
*/
typedef struct st_LWMonitor {
void *data;
void (*init) (void *, unsigned int);
int (*step) (void *, unsigned int);
void (*done) (void *);
} LWMonitor;
/*
* Macros are provided to call a monitor which will do nothing if the
* monitor pointer is null. MON_INCR is used for step sizes greater than
* one and MON_STEP is used for step sizes exactly one.
*/
#define MON_INIT(mon,count) if (mon) (*mon->init) (mon->data, count)
#define MON_INCR(mon,d) (mon ? (*mon->step) (mon->data, d) : 0)
#define MON_STEP(mon) MON_INCR (mon, 1)
#define MON_DONE(mon) if (mon) (*mon->done) (mon->data)
#define LWLMONFUNCS_GLOBAL "LWLMonFuncs"
/****
* create:
* Creates a new monitor instance
*
* setup:
* Configures the progress monitor
* title - Monitor Title
* uiflags - a bitmask of desired LMO_* flags
* histfile - if given, filename where messages will also be written
* uiflags - takes a bitmask of ui options
*
* setwinpos:
* xywh - position and size of monitor window
*
* init:
* Sets total number of steps and OOpens the monitor progress window
* total - Total number of steps
* msg - Initial message string for user
*
* step:
* Increments the current step and sets the display message
* incr - Increment to increase counter (0 is valid)
* msg - Message string for user
*
* done:
* Indicates the processing is complete. If review option enabled,
* monitor remains open in a modal state for user review of output.
* Control will not return to caller until the user dismisses the window.
*
* destroy:
* Closes the window (if open) and destroys the instance.
*
****
*/
/* defines */
/****
* UI Option Flags
* NOABORT:
* Abort button is disabled. Default is operation can be aborted.
* REVIEW:
* Monitor remains open after 'done' method is called. This allows user
* to review messages. Default is no review and mediately from done method
* HISTAPPEND:
* History file is appended with new messages. Default is overwrite.
* IMMUPD:
* Enables immediate update of the monitor on every step. The default
* is to delay updates to avoid incurring too much overhead for rapid
* step events.
****
*/
#define LMO_NOABORT (1<<0)
#define LMO_REVIEW (1<<1)
#define LMO_HISTAPPEND (1<<2)
#define LMO_IMMUPD (1<<3)
/* TypeDefs */
typedef struct st_LMONDATA *LWLMonID;
typedef struct st_LWLMonFuncs {
LWLMonID (*create) ( void );
void (*setup) ( LWLMonID mon, char *title,
unsigned int uiflags, const char *histfile );
void (*setwinpos) ( LWLMonID mon, int x, int y, int w, int h );
void (*init) ( LWLMonID mon, unsigned int total, const char *msg );
int (*step) ( LWLMonID mon, unsigned int incr, const char *msg );
void (*done) ( LWLMonID mon );
void (*destroy) ( LWLMonID mon );
} LWLMonFuncs;
/****
* Macros to simplify some common operations.
****
*/
/* Creates a monitor instance */
#define LMON_NEW(fun) ((*fun->create)())
/* Initailizes a default monitor */
#define LMON_DFLT(fun,mon,tot) {(*fun->setup)(mon,"Processing...",0,NULL);\
(*fun->init)(mon,tot,NULL);}
#define LMON_WPOS(fun,mon,x,y,w,h) ((*fun->setwinpos)(mon,x,y,w,h))
#define LMON_INIT(fun,mon,tot) ((*fun->init)(mon,tot,NULL))
/* The following are various incrementing macros */
#define LMON_STEP(fun,mon) ((*fun->step)(mon,1,NULL))
#define LMON_INCR(fun,mon,s) ((*fun->step)(mon,s,NULL))
#define LMON_MSG(fun,mon,msg) ((*fun->step)(mon,0,msg))
#define LMON_MSGS(fun,mon,msg) ((*fun->step)(mon,1,msg))
#define LMON_MSGI(fun,mon,s,msg) ((*fun->step)(mon,s,msg))
/* These finish and destroy the monitor */
#define LMON_DONE(fun,mon) ((*fun->done)(mon))
#define LMON_KILL(fun,mon) ((*fun->destroy)(mon))
#endif