/* BAE_LOAD (STD) -- BAE Load/Close Action */ /* BAE_LOAD (STD) -- BAE Lade/Schliessen-Aktion */ /* -- EXECUTED AFTER LOADING, CREATING OR CLOSING SOME BAE ELEMENT -- */ /* // Copyright (c) 1997-2013 Bartels System GmbH, Muenchen // Author: Roman Ludwig // Changes History: // rl (131029) RELEASED FOR BAE V8.0. // rl (120427) RELEASED FOR BAE V7.8. // rl (110420) ENHANCEMENT: // Added automatic default library selection option. // rl (110221) ENHANCEMENT: // Added file access mode check. // rl (101019) RELEASED FOR BAE V7.6. // rl (101005) ENHANCEMENT: // Added automatic draw assisten startup options. // rl (091020) RELEASED FOR BAE V7.4. // rl (090526) ENHANCEMENT: // Improved error message handling. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (070126) ENHANCEMENT: // Added dialog box management support. // rl (061103) ENHANCEMENT: // Added fixed autosave interval setting option. // Added fixed toolbar setting option. // rl (060829) RELEASED FOR BAE V6.8. // rl (060620) ENHANCEMENT: // Added net highlight/visibility load option. // rl (060216) ENHANCEMENT: // Added element lock support. // rl (050906) RELEASED FOR BAE V6.6. // rl (050329) ENHANCEMENT: // Added automatic layout plan DRC support. // rl (040831) RELEASED FOR BAE V6.4. // rl (030904) RELEASED FOR BAE V6.2. // rl (030818) ENHANCEMENT: // Added history support. // rl (021209) RELEASED FOR BAE V6.0. // rl (021205) ENHANCEMENT: // Added user specific program call support. // rl (020618) RELEASED FOR BAE V5.4. // rl (010625) RELEASED FOR BAE V5.0. // rl (010330) ENHANCEMENT: // Added display of mouse operation mode. // rl (000905) RELEASED FOR BAE V4.6. // rl (000718) ENHANCEMENT: // Added handling of 'nil' element for info text display. // rl (990625) RELEASED FOR BAE V4.4. // rl (981019) CHANGE // Set Toolbar attachment mode job specific for non-layout // class elements. // rl (980910) RELEASED FOR BAE V4.2. // rl (980910) ENHANCEMENT: // Changed to V4.2 general access program. // mb (980710) ENHANCEMENT: // Dynamic multi-language support introduced. // mb (980707) CHANGE: // Skipped unused variable view. // rl (980626) IMPROVEMENT: // Added toolbar attachment restore. // rl (970929) RELEASED FOR BAE V4.0. // rl (970609) ORIGINAL CODING: // // DESCRIPTION // // The bae_load User Language program is automatically activated // after loading or closing an element. bae_load displays the // file and element name of the loaded element within the info/status // information area if operated under pull-down menu user interface. // On element close, bae_load clears the file and element name display. // bae_load also restores any element-specific toolbar display/attachment // preference previously stored with bae_save. */ // Enforce standard caller type #pragma ULCALLERSTD // Includes #include "pop.ulh" // User Language popup utilities #include "popdraw.ulh" // User Language popup draw. util. #include "sql.ulh" // User Language SQL utilities // Messages static string FMTELMINF = M("Datei %s, %s %s" ,"File %s, %s %s"); static string FMTSELMINF= M("Datei ...%s, %s %s","File ...%s, %s %s"); static string UPRMODE2 = M("Kontextfunktionen" ,"Context Functions"); static string UPRMODE3 = M("Loeschen" ,"Delete"); static string UPRMODE4 = M("Bewegen" ,"Move"); static string UPRMODE5 = M("Selektieren" ,"Select"); static string UPRMODE6 = M("Selektieren (kreuzend)" ,"Select (Crossing)"); string REPLOCK = M("%s '%s' aus Datei '%s' wird von Benutzer '%s' bearbeitet!", "%s '%s' in '%s' is locked by user '%s'!"); string REPNOSAVE = M(" Speichern nicht moeglich!"," Open read only. Save not possible!"); string REPNOLOAD = M(" Laden nicht erlaubt!"," Open not permitted!"); string REPREADONLY = M("WARNUNG: '%s' ist schreibgeschuetzt. Kein Speichern von Aenderungen moeglich!", "WARNING: '%s' is write protected. Changes cannot be written!"); string REPDIFFLVAR = M("WARNUNG: Im Layout ist eine andere Variante aktiv (%d)!", "WARNING: Layout has other active variant (%d)!"); string REPDIFFSVAR = M("WARNUNG: Im Schaltplan ist eine andere Variante aktiv (%d)!", "WARNING: Schematic has other active variant (%d)!"); string REPSETSVAR = M("Schaltplanvariante aktiviert (%d)!", "Schematic variant activated (%d)!"); string ERRDBCREA = M("SQL/DB-Datei '%s' kann nicht angelegt werden!", "Error creating SQL/DB file '%s'!"); string ERRDBACC = M("SQL/DB-Datei '%s' Zugriffsfehler!", "SQL/DB file '%s' access error!"); string ERRDBRDONLY = M("DDB-Datei '%s' ist schreibgeschuetzt!", "DDB file '%s' is write protected!"); string ERRNOLOCK = M(" Element wird nicht fuer Doppelbearbeitung gesperrt!", " Element won't be protected against double usage!"); // INI file parameter name definitions #define PAR_USERLPROG "USERLPROG_STD" // User defined load program name #define PAR_MAXFNAMED "MAXFNAMED_STD" // Max. file name display length #define PAR_HISTCNT "HISTCOUNT_STD" // History item count #define PAR_HISTSAVE "HISTSAVE_STD" // History save mode #define PAR_HISTPLAN "HISTPLAN_STD" // History plan mode #define PAR_DVALLFILES "DVALLFILES_STD"// Design view window all files mode #define PAR_TITLEMODE "TITLEMODE_STD" // BAE windows title bar mode #define PAR_ZOOMRESTORE "ZOOMRESTORE_STD"// Zoom window restore mode #define PAR_TOOLBAR "TOOLBAR_STD" // Toolbar activation flag #define PAR_TOOLBARULC "TOOLBARULC_STD"// Toolbar ULC program name #define PAR_TBPALPREF "TB_PALPREF_LAY"// Toolbar color table name prefix #define PAR_AUTOSVAR "AUTOSVAR_LAY" // Automatic layout variant activation #define PAR_AUTODRC "AUTODRC_GED" // Automatic DRC on layout load flag #define PAR_NETASSIBOX "NETASSIBOX_GED"// Net assistent box flag #define PAR_GDRAWASSIB "DRAWASSIBOX_GED"// Draw assistent box flag #define PAR_SDRAWASSIB "DRAWASSIBOX_SCM"// Draw assistent box flag #define PAR_LOCKMODE "LOCKMODE_STD" // Element lock mode #define PAR_LOCKEXT "LOCKEXT_STD" // Lock file extension #define PAR_FMODEWARN "FMODEWARN_STD" // File mode warning #define PAR_MACLIBCHK "MACLIBCHECK_STD"// Macro library check flag #define PAR_SAUTODLIB "AUTODEFLIB_SCM"// Automatic default library set #define PAR_GAUTODLIB "AUTODEFLIB_GED"// Automatic default library set #define PAR_AAUTODLIB "AUTODEFLIB_AR" // Automatic default library set #define PAR_SAUTOSAVEI "AUTOSAVEI_SCM" // Autosave interval #define PAR_SAUTOSAVEF "AUTOSAVEFIX_SCM"// Fix autosave interval #define PAR_GAUTOSAVEI "AUTOSAVEI_GED" // Autosave intervall #define PAR_GAUTOSAVEF "AUTOSAVEFIX_GED"// Fix autosave interval #define PAR_AAUTOSAVEI "AUTOSAVEI_AR" // Autosave interval #define PAR_AAUTOSAVEF "AUTOSAVEFIX_AR"// Fix autosave interval #define PAR_PROJDOC "PROJDOCEXT_STD"// Project documentation extension // Menu and key definitions #define INFOMENUNUM 51 // Info field menu number // Standard menu sel. enable codes #define MSELENALL 0x80000000 // Always enable selection code // Global variable names #define GV_VIEW_FN "VIEW_FN" // File name variable name pattern #define GV_VIEW_CL "VIEW_CL" // DDB class variable name pattern #define GV_VIEW_EN "VIEW_EN" // Element name variable name pattern #define GV_VIEW_LX "VIEW_LX" // Lower X variable name pattern #define GV_VIEW_LY "VIEW_LY" // Lower Y variable name pattern #define GV_VIEW_UX "VIEW_UX" // Upper X variable name pattern #define GV_VIEW_UY "VIEW_UY" // Upper Y variable name pattern #define GV_VIEW_MD "VIEW_MD" // Mirror display variable name pattern #define GV_VIEW_DF "VIEW_DF" // View drawn variable name pattern #define GV_VIEW_CO "VIEW_CO" // Color table name var. name pattern #define VAR_EMDIM "scm_rv_md" // Element maximum dimension #define GV_LOCKFN "lockfname" // Locked element file name #define GV_LOCKEN "lockename" // Locked element plan name #define GV_LOCKCL "lockclass" // Locked element plan class #define GV_LASTFN "lastfname" // Last element file name #define GV_LASTDFN "lastdfname" // Last document file name #define GV_MODID "MODULEID" // Module instance ID #define GV_TYPFIELD "da_typidx" // Draw ass. polygon type field index // SQL command definitions #define Z_SELECT1 "select lx,ly,ux,uy from zoominfo " #define Z_SELECT2 "where class=%d AND ename=%s;" #define D_SELECT1O "select lx,ly,ux,uy,colname,view from dvinfo " #define D_SELECT1 "select lx,ly,ux,uy,colname,fn,en,cl,view from dvninfo " #define D_SELECT2 "where class=%d AND ename=%s;" #define T_SELECT1 "select attach from toolinfo " #define T_SELECT2 "where class=%d AND ename=%s;" #define H_CREATE0 "create table historyinfo (ptyp integer,class integer," #define H_CREATE1 "ename string,fname string,modidx integer);" #define H_DELETE "delete from historyinfo where ptyp=%d AND modidx=%d;" #define H_INSERT "insert into historyinfo values(%d,%d,%s,%s,%d);" #define H_SELECT1 "select class,ename,fname from historyinfo where " #define H_SELECT2 "ptyp=%d AND modidx=%d;" #define I_CREATE "create table historyindex (ptyp integer,sidx integer);" #define I_INSERT "insert into historyindex values(%d,%d);" #define I_DELETE "delete from historyindex where ptyp=%d;" #define I_SELECT "select sidx from historyindex where ptyp=%d;" #define C_SELECT1 "select prefix from colprefix " #define C_SELECT2 "where class=%d AND ename=%s;" #define L_CREATE0 "create table lockinfo (class integer,ename string," #define L_CREATE1 "username string,mode integer,modid string);" #define L_INSERT "insert into lockinfo values(%d,%s,%s,%d,%s);" #define L_DELETE1 "delete from lockinfo" #define L_DELETE2 " where class=%d AND ename=%s AND modid=%s;" #define L_CHKEXIST "select username from lockinfo;" #define L_SELECT1 "select username,mode from lockinfo" #define L_SELECT2 " where class=%d AND ename=%s;" #define M_SELECT1 "select variant from modvarinfo where modtype=%s AND" #define M_SELECT2 " ename=%s;" #define V_SELECT "select name from varinfo where variant=%d;" string sqlcommand /* SQL command string */; // User Language program names #define UL_TBDVSCM "tbdvscm" // ULP: SCM Toolbar Design View #define UL_TBDVLAY "tbdvlay" // ULP: Layout Toolbar Design View #define UL_TOOLBAR "toolbar" // ULP: Toolbar Attachment #define UL_NETSTAT "netstat" // ULP: Net status Management // Globals static string userlprog = bae_inistrval(PAR_USERLPROG,"") /* User definied load prog. name */; static string docext = bae_inistrval(PAR_PROJDOC,"") /* Project document extension */; static int maxflen = bae_iniintval(PAR_MAXFNAMED,999) /* Max. displayed file name lenght */; static int histcnt = bae_iniintval(PAR_HISTCNT,32) /* History item count */; static int histsave = bae_iniintval(PAR_HISTSAVE,1) /* History save mode */; static int histplan = bae_iniintval(PAR_HISTPLAN,0) /* History plan mode */; static int fmodewarn = bae_iniintval(PAR_FMODEWARN,3) /* File mode warning mode */; static int maclibchk = bae_iniintval(PAR_MACLIBCHK,0) /* Macro library check flag */; static int lockmode = bae_iniintval(PAR_LOCKMODE,0) /* Element lock mode */; static int titlemode = bae_iniintval(PAR_TITLEMODE,2) /* Windows title bar display mode */; static int zoomrestore = bae_iniintval(PAR_ZOOMRESTORE,1) /* Zoom window restore mode */; static int dvallfiles = bae_iniintval(PAR_DVALLFILES,1) /* Design view win. all files mode */; static int autodrc = bae_iniintval(PAR_AUTODRC,0) /* Auto. DRC on layout load mode */; static string BAEHISTDB = strgetconffilename(HISTVNAME,HISTFNAME,2); static string lockext = bae_inistrval(PAR_LOCKEXT,".lck") /* Lock database file name extension */; #define SMALLVAL 0.000005 // Small compare value static int callertype=uliptype() /* Calling environment type */; static int fabview=(bae_swconfig(1)==BAE_FabView ? 1 : 0) /* FabView SW flag */; static int demoflag=(bae_swconfig(1)==BAE_Demo ? 1 : 0) /* Demo SW flag */; static int histidx=(-1) /* History start index */; static string hfname /* History last DDB file name */; static string hename /* History last DDB element name */; static int hddbcl = DDBCLUNDEF /* History last DDB class */; static int ddbcl = bae_planddbclass() /* DDB class */; static string fname = bae_planfname() /* DDB file name */; static string ename = bae_planename() /* DDB element name */; static double wslx,wsly /* Workspace lower corner */; static double wsux,wsuy /* Workspace upper corner */; static string coltname /* Color table name */; static string variant_name /* Variant name */; static string vfname /* View window file name */; static string vename /* View window element name */; static int vddbcl /* View window element class */; static int mirrdisp /* Mirror display mode */; static int tbattach /* Toolbar attachment mode */; static string lockuser /* Lock user name */; static int datlockmode /* Data lock mode */; static int found /* Data found flag */; // Main program void main() { string msgbuf /* Message buffer */; string modestr /* Mode string */; string blkref /* Block reference name */; string varname /* Variable name */; string modid /* Module ID name */; string lastfname /* Last file name */; string docfname /* Documentation file name */; string docfext /* Documentation file name extension */; string cmd /* Documentation command */; int fh /* File handle */; string lockfname /* Lock file name */; string lockhost /* Lock host name */; int errcode /* Database access error code */; string ofname /* Old lock file name */; string oename /* Old lock element name */; int oddbcl /* Old lock element class */; int oldtbattach /* Old toolbar attachment mode */; int msmode /* Mouse context operation mode */; int palflag = 0 /* Color palette environment */; int varnum = 0 /* Active variant number */; int warnmode = 0 /* Warning mode */; int drawassi /* Draw assistent mode */; double lx,ly /* Workspace lower corner */; double ux,uy /* Workspace upper corner */; double cx,cy /* Workspace middle point */; double xdim,ydim /* Workspace dimensions */; int histmax /* History max. count */; int histpos /* History position count */; int histbase /* History base position */; int boxidx /* Dialog box index */; int boxmode /* Dialog box mode */; string actseq /* Action sequence */; string pdefprefix /* Predicate def. prefix */; int pdefend /* Predicate def. end */; string prulel[] /* Rule list */; int prulen /* Rule count */; string rn /* Rule name buffer */; int rnc /* Rule name count */; int batmode /* Batch mode */; int i /* Loop control variable */; // Check if extra user specific ULC program call requested if (userlprog!="") ulsystem(userlprog,0); // Get the module ID if (varget(GV_MODID,modid)!=0) modid=""; // Check if old element was locked if (varget(GV_LOCKFN,ofname)==0 && varget(GV_LOCKEN,oename)==0 && varget(GV_LOCKCL,oddbcl)==0) { // Build the lock file name lockfname=convstring(ofname,0)+lockext; sprintf(sqlcommand,L_DELETE1+L_DELETE2, oddbcl,sql_quotestr(oename),sql_quotestr(modid)); sqlcmd(lockfname,sqlcommand,NULL); // Delete the lock entry vardelete(GV_LOCKFN); vardelete(GV_LOCKEN); vardelete(GV_LOCKCL); // Check if all locks to file released found=0; lockuser=""; sqlcmd(lockfname,L_CHKEXIST,lockchkfunc); if (!found) remove(lockfname); } if (ddbcl!=DDBCLUNDEF && ddbcl!=DDBCLGTAB) { // Check if element locked by other user found=0; lockuser=""; lockfname=convstring(fname,0)+lockext; sprintf(sqlcommand,L_SELECT1+L_SELECT2,ddbcl, sql_quotestr(ename)); sqlcmd(lockfname,sqlcommand,lockchkfunc); if (found) { if (lockmode>datlockmode) datlockmode=lockmode; sprintf(msgbuf,REPLOCK, ddbclassname(ddbcl),ename,fname,lockuser); switch (datlockmode) { // Issue warning only case 1 : bae_msgbox(1,msgbuf,""); break; // Issue warning and disable save case 2 : bae_msgbox(1,msgbuf+REPNOSAVE,""); bae_setintpar(13,1); break; // Disable locked element load case 3 : bae_msgbox(2,msgbuf+REPNOLOAD,""); if (bae_plannotsaved()) bae_storetextiact(3,"n"); bae_callmenu(9005); bae_prtdialog(msgbuf+REPNOLOAD); ddbcl=DDBCLUNDEF; fname=ename=""; break; } } else { datlockmode=lockmode; } if (varget(GV_LASTFN,lastfname)!=0) lastfname=""; if (lastfname!=fname && ((fabview && ddbcl!=DDBCLLAY && (fmodewarn&1)) || (!fabview && ((demoflag && (fmodewarn&2)) || (!demoflag && (fmodewarn&1)))))) { fseterrmode(0); if ((fh=fopen(fname,2|8))==(-1)) { sprintf(msgbuf,REPREADONLY,fname); bae_msgbox(1,msgbuf,""); } } varset(GV_LASTFN,fname); bae_getintpar(22,batmode); if (batmode==0 && docext!="" && (ddbcl==DDBCLSCM || ddbcl==DDBCLLAY || ddbcl==DDBCLILAY)) { if (varget(GV_LASTDFN,lastfname)!=0) lastfname=""; if (lastfname!=fname) { docfname=convstring(fname,0)+docext; if ((docfext=strextract(docfname, strlen(convstring(docfname,0)), strlen(docfname)))!="" && getextprog(docfext,cmd)==0) { fseterrmode(0); if ((fh=fopen(docfname,0|8))!=(-1)) launch(cmd+" \""+docfname+"\""); } } varset(GV_LASTDFN,fname); } // Mark loaded element if ((!found || datlockmode!=3) && (ddbcl!=DDBCLLAY || !fabview)) { // Create/init lock database file if (sqlinit(lockfname,0)==(-1) && sqlinit(lockfname,1)==(-1)) { // SQL/DB creation error if (filemode(fname)==1) { sprintf(msgbuf, ERRDBRDONLY+ERRNOLOCK,fname); bae_setstrpar(9,msgbuf); bae_setintpar(31, ((uliptype()&ULIPLAY)!=0 && fabview) ? 1 : 2); } else { sprintf(msgbuf, ERRDBCREA+ERRNOLOCK,lockfname); if (fabview) { bae_setstrpar(9,msgbuf); bae_setintpar(31,2); } else { bae_msgbox(2,msgbuf,""); } } } // Create lock table in database else if (sqlcmd( lockfname,L_CREATE0+L_CREATE1,NULL)==0) { // Query host name if (getenv("HOST",lockhost)!=0 && lockuser=="" && getenv("USERDOMAIN",lockhost)!=0) lockhost=""; // Query user name if (getenv("USER",lockuser)!=0 && lockuser=="" && getenv("USERNAME",lockuser)!=0) lockuser=""; if (lockuser=="") lockuser=lockhost; else if (lockhost!="") lockuser=lockuser+"/"+lockhost; // Store lock entry sprintf(sqlcommand,L_INSERT,ddbcl, sql_quotestr(ename),sql_quotestr(lockuser), datlockmode,sql_quotestr(modid)); sqlcmd(lockfname,sqlcommand,NULL); varset(GV_LOCKFN,fname); varset(GV_LOCKEN,ename); varset(GV_LOCKCL,ddbcl); } else { // Get the error code sqlerr(errcode,""); // Issue warning if not table already defined if (errcode!=25) { if (filemode(fname)==1) { sprintf(msgbuf, ERRDBRDONLY+ERRNOLOCK,fname); bae_setstrpar(9,msgbuf); bae_setintpar(31, ((uliptype()&ULIPLAY)!=0 && fabview) ? 1 : 2); } else { sprintf(msgbuf, ERRDBACC+ERRNOLOCK,lockfname); if (fabview) { bae_setstrpar(9,msgbuf); bae_setintpar(31,2); } else { bae_msgbox(2,msgbuf,""); } } } } } } // Check if pulldown menu interface is active if (bae_swconfig(3)==BAE_WinPulldwn || bae_swconfig(3)==BAE_MotifPdwn) { // Get the mouse mode if (varget(VAR_MSMODE,msmode)) msmode=MS_NONE; switch (msmode) { case MS_CONT : modestr=", "+UPRMODE2; break; case MS_DEL : modestr=", "+UPRMODE3; break; case MS_MOVE : modestr=", "+UPRMODE4; break; case MS_GSEL : modestr=", "+UPRMODE5; break; case MS_GCSEL : modestr=", "+UPRMODE6; break; default : modestr=""; } // Get the mouse shift mode if (varget(VAR_MSMODES,msmode)) msmode=MS_NONE; switch (msmode) { case MS_CONT : modestr+="/"+UPRMODE2; break; case MS_DEL : modestr+="/"+UPRMODE3; break; case MS_MOVE : modestr+="/"+UPRMODE4; break; case MS_GSEL : modestr+="/"+UPRMODE5; break; case MS_GCSEL : modestr+="/"+UPRMODE6; break; default : } // Display loaded element info in info field if (ddbcl==DDBCLUNDEF) { msgbuf=" "; } else { if (strlen(fname)>maxflen) sprintf(msgbuf,FMTSELMINF,strextract( fname,strlen(fname)-maxflen,strlen(fname)), ddbclassid(ddbcl),ename); else sprintf(msgbuf,FMTELMINF,fname, ddbclassid(ddbcl),ename); } bae_defmenuprog(INFOMENUNUM,3,msgbuf+modestr," ",MSELENALL); } // Update window title bar if (titlemode) { switch (uliptype()) { case ULIPSCM : modestr="SCM"; break; case ULIPGED : modestr="GED"; break; case ULIPAR : modestr="AR"; break; case ULIPCAM : modestr="CAM"; break; case ULIPCED : modestr="CED"; break; case ULIPCV : modestr="CV"; break; default : modestr=""; } if (ddbcl==DDBCLUNDEF) bae_setmoduleid(modestr); else switch (titlemode) { case 1 : bae_setmoduleid("BAE "+convstring(fname,2)); break; case 2 : bae_setmoduleid("BAE/"+modestr+" "+convstring(fname,2)); break; case 3 : bae_setmoduleid("BAE "+ename); break; case 4 : bae_setmoduleid("BAE/"+modestr+" "+ename); break; case 5 : bae_setmoduleid("BAE "+ename+" "+convstring(fname,2)); break; case 6 : bae_setmoduleid( "BAE/"+modestr+" "+ename+" "+convstring(fname,2)); break; } } // Check if any layout specific dialog boxes should be dismissed for (boxidx=1;boxidx=0) { varnum=histidx; // Check variant number against layout histidx=(-1); sprintf(sqlcommand,M_SELECT1+M_SELECT2, sql_quotestr("lay"), sql_quotestr(getnewestlay())); sqlcmd(fname,sqlcommand,idxselfunc); if (histidx>=0 && histidx!=varnum) { sprintf(msgbuf,REPDIFFLVAR,histidx); bae_msgbox(1,msgbuf,""); } } } sprintf(sqlcommand,T_SELECT1+T_SELECT2,ddbcl, sql_quotestr("[plan]")); if (varget(GV_TB_HIERREQ,blkref)==0) { scm_setstrpar(11,blkref); vardelete(GV_TB_HIERREQ); } // Check if fix autosave intervall if (bae_iniintval(PAR_SAUTOSAVEF,0)!=0) { // Set autosave intervall bae_clriactqueue(); bae_storetextiact(1,bae_inistrval(PAR_SAUTOSAVEI,"0")); bae_callmenu(808); } break; case ULIPAR : ar_getintpar(2,warnmode); // Check if fix autosave intervall if (bae_iniintval(PAR_AAUTOSAVEF,0)!=0) { // Set autosave intervall bae_clriactqueue(); bae_storetextiact(1,bae_inistrval(PAR_AAUTOSAVEI,"0")); bae_callmenu(803); } if (bae_iniintval(PAR_AAUTODLIB,0)!=0) { // Set default library bae_clriactqueue(); bae_storetextiact(1,lay_deflibname()); bae_callmenu(800); } case ULIPGED : if (callertype==ULIPGED) { if (maclibchk && ddbcl!=DDBCLLPAD) { bae_getintpar(22,batmode); if (batmode==0) ulsystem("llibutil:s16",0); } ged_getintpar(10,warnmode); if (bae_iniintval(PAR_GAUTODLIB,0)!=0) { // Set default library bae_clriactqueue(); bae_storetextiact(1,lay_deflibname()); bae_callmenu(800); } } // Check if fix autosave intervall if (bae_iniintval(PAR_GAUTOSAVEF,0)!=0) { // Set autosave intervall bae_clriactqueue(); bae_storetextiact(1,bae_inistrval(PAR_GAUTOSAVEI,"0")); bae_callmenu(812); } case ULIPCAM : if (callertype==ULIPCAM) cam_getintpar(2,warnmode); palflag=1; if (ddbcl==DDBCLLAY) { // Query the current active variant histidx=0; sprintf(sqlcommand,M_SELECT1+M_SELECT2, sql_quotestr("lay"),sql_quotestr(ename)); sqlcmd(fname,sqlcommand,idxselfunc); varnum=histidx; // Check if automatic layout variant activation if (bae_iniintval(PAR_AUTOSVAR,0)!=0) { // Query schematic variant number histidx=(-1); sprintf(sqlcommand,M_SELECT1+M_SELECT2, sql_quotestr("scm"),sql_quotestr("[plan]")); sqlcmd(fname,sqlcommand,idxselfunc); if (histidx>=0 && histidx!=varnum) { // Activate schematic variant varnum=histidx; // Get predicate rule definition prefix pdefprefix=":pcb_rules:variant="; pdefend=strlen(pdefprefix)-1; // Get the rule count prulen=0; if ((rnc=lay_getrulecnt(0,0))>0) // Scan the rule name list for (i=0;i=0 && histidx!=varnum) { sprintf(msgbuf, REPDIFFSVAR,histidx); bae_msgbox(1,msgbuf,""); } } // Query the current variant name if (lay_rulequery(0,0,"pcb_rules", "variant_name","?s",variant_name)<1) variant_name=""; } if (variant_name=="") { sprintf(sqlcommand,V_SELECT,varnum>=0 ? varnum : 0); sqlcmd(fname,sqlcommand,nameselfunc); if (variant_name!="") { // Get predicate rule definition prefix pdefprefix=":pcb_rules:variant_name="; pdefend=strlen(pdefprefix)-1; // Get the rule count prulen=0; if ((rnc=lay_getrulecnt(0,0))>0) // Scan the rule name list for (i=0;i=HISTMAX) histbase++; varset(GV_TB_HISTBASE,histbase); histmax=histpos-histbase+1; varset(GV_TB_HISTMAX,histmax); histpos=histpos%HISTMAX; } sprintf(varname,GV_TB_HISTFN,histpos); varset(varname,fname); sprintf(varname,GV_TB_HISTEN,histpos); varset(varname,ename); sprintf(varname,GV_TB_HISTCL,histpos); varset(varname,ddbcl); } // Check if highlight/net visibility restore possible if (ddbcl==DDBCLLAY) { if (callertype==ULIPGED) { bae_clriactqueue(); bae_storemenuiact(1,0,LMB); bae_storetextiact(1,fname); bae_storetextiact(1,ename); ulsystem(UL_NETSTAT,0); bae_clriactqueue(); bae_storemenuiact(1,3,LMB); bae_storetextiact(1,fname); bae_storetextiact(1,ename); ulsystem(UL_NETSTAT,0); } else if (callertype==ULIPAR) { bae_clriactqueue(); bae_storemenuiact(1,0,LMB); bae_storetextiact(1,fname); bae_storetextiact(1,ename); ulsystem(UL_NETSTAT,0); } // Display net assistent if (bae_iniintval(PAR_NETASSIBOX,0)) { ulsystem("conutil:s6",0); // Set focus to BAE window bae_callmenu(9052); } } // Check if draw assistant active if (varget(GV_TYPFIELD,0)!=0 && !bae_chkbatmode()) { if (callertype==ULIPGED) { drawassi=bae_iniintval(PAR_GDRAWASSIB,0); switch (ddbcl) { case DDBCLLAY : drawassi= (drawassi&1) ? 1 : 0 ; break; case DDBCLLPRT : drawassi= (drawassi&2) ? 1 : 0 ; break; case DDBCLLSTK : drawassi= (drawassi&4) ? 1 : 0 ; break; case DDBCLLPAD : drawassi= (drawassi&8) ? 1 : 0 ; break; default : drawassi=0; } if (drawassi) { ulsystem("geddraw:s9",0); // Set focus to BAE window bae_callmenu(9052); } } else if (callertype==ULIPSCM) { drawassi=bae_iniintval(PAR_SDRAWASSIB,0); switch (ddbcl) { case DDBCLSCM : drawassi= (drawassi&1) ? 1 : 0 ; break; case DDBCLSSYM : drawassi= (drawassi&2) ? 1 : 0 ; break; case DDBCLSMRK : drawassi= (drawassi&4) ? 1 : 0 ; break; case DDBCLSLAB : drawassi= (drawassi&8) ? 1 : 0 ; break; default : drawassi=0; } if (drawassi) { ulsystem("scmdraw:s8",0); // Set focus to BAE window bae_callmenu(9052); } } } // Get the zoom window if (bae_chkbatmode()!=1 && varget(GV_TB_HISTACT,histpos)!=0) { found=0; sprintf(sqlcommand,Z_SELECT1+Z_SELECT2,ddbcl,sql_quotestr(ename)); sqlcmd(fname,sqlcommand,datafunc); // Check if zoom window found if (found && zoomrestore) { // Store current zoom window lx=bae_wswinlx(); ly=bae_wswinly(); ux=bae_wswinux(); uy=bae_wswinuy(); // Get the window center point cx=0.5*(lx+ux); cy=0.5*(ly+uy); // Get the workspace dimensions xdim=ux-lx; ydim=uy-ly; // Do some zoom reduction xdim*=0.95; ydim*=0.95; // Ajust the workspace size lx=cx-0.5*xdim; ux=cx+0.5*xdim; ly=cy-0.5*ydim; uy=cy+0.5*ydim; if (wslxSMALLVAL || fabs(wsly-ly)>SMALLVAL || fabs(wsux-ux)>SMALLVAL || fabs(wsuy-uy)>SMALLVAL)) { // Zoom to window bae_clriactqueue(); bae_storemouseiact(1,wslx,wsly,0,LMB); bae_storemouseiact(1,wsux,wsuy,0,LMB); call(MNU_BAEZOOMWND); } else { call(MNU_BAEZOOMALL); } } else { call(MNU_BAEZOOMALL); } } // Get the design view windows found=0; vfname=fname; vename=ename; vddbcl=ddbcl; sprintf(sqlcommand,D_SELECT1O+D_SELECT2,ddbcl,sql_quotestr(ename)); sqlcmd(fname,sqlcommand,datafunc); sprintf(sqlcommand,D_SELECT1+D_SELECT2,ddbcl,sql_quotestr(ename)); sqlcmd(fname,sqlcommand,datafunc); // Call the toolbar view maintenance UL program name switch (callertype) { case ULIPSCM : bae_clriactqueue(); bae_storetextiact(1,"d0"); runulprog(UL_TBDVSCM); break; case ULIPGED : case ULIPAR : case ULIPCAM : bae_clriactqueue(); bae_storetextiact(1,"d0"); runulprog(UL_TBDVLAY); break; default : ; } // Check if automatic layout DRC request if (callertype==ULIPGED && autodrc && ddbcl==DDBCLLAY) ged_setintpar(1,autodrc); // Check if load history enabled if (bae_chkbatmode()==0 && histcnt>0 && !histsave && (!histplan || ddbcl==DDBCLSCM || ddbcl==DDBCLLAY || ddbcl==DDBCLILAY)) { // Create/init history database file if (sqlinit(BAEHISTDB,0)==(-1) && sqlinit(BAEHISTDB,1)==(-1)) // SQL/DB creation error errormsg(ERRDBCREA,BAEHISTDB); // Create history start index table in database if (sqlcmd(BAEHISTDB,I_CREATE,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Create history data table in database sprintf(sqlcommand,H_CREATE0+H_CREATE1); if (sqlcmd(BAEHISTDB,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Get the history index sprintf(sqlcommand,I_SELECT,callertype); histidx=(-1); sqlcmd(BAEHISTDB,sqlcommand,idxselfunc); sprintf(sqlcommand,H_SELECT1+H_SELECT2,callertype,histidx); sqlcmd(BAEHISTDB,sqlcommand,histselfunc); if (ddbcl==hddbcl && ename==hename && fname==hfname) exit(0); // Delete last index sprintf(sqlcommand,I_DELETE,callertype); sqlcmd(BAEHISTDB,sqlcommand,NULL); // Store data to next index histidx++; if (histidx>=histcnt) histidx=0; sprintf(sqlcommand,I_INSERT,callertype,histidx); sqlcmd(BAEHISTDB,sqlcommand,NULL); // Delete last index data sprintf(sqlcommand,H_DELETE,callertype,histidx); sqlcmd(BAEHISTDB,sqlcommand,NULL); sprintf(sqlcommand,H_INSERT,callertype,ddbcl, sql_quotestr(ename),sql_quotestr(fname),histidx); sqlcmd(BAEHISTDB,sqlcommand,NULL); } } void viewstorewsdata(int viewidx) /* // Store the design view workspace data // Parameters : // int viewidx : Design view index */ { string viewid = itoa(viewidx) /* Design view id */; string strval /* String value */; int intval /* Integer value */; double dblval /* Double value */; // Check if own file element if (vfname=="*") vfname=fname; // Check if other file display disabled if (!dvallfiles && vfname!=fname) return; // Get the old design view characteristics, check if change if (varget(GV_VIEW_FN+viewid,strval) || strval!=vfname || varget(GV_VIEW_CL+viewid,intval) || intval!=vddbcl || varget(GV_VIEW_EN+viewid,strval) || strval!=vename || varget(GV_VIEW_LX+viewid,dblval) || dblval!=wslx || varget(GV_VIEW_LY+viewid,dblval) || dblval!=wsly || varget(GV_VIEW_UX+viewid,dblval) || dblval!=wsux || varget(GV_VIEW_UY+viewid,dblval) || dblval!=wsuy || varget(GV_VIEW_MD+viewid,intval) || intval!=mirrdisp || varget(GV_VIEW_CO+viewid,strval) || strval!=coltname) // Clear the draw flag for new data varset(GV_VIEW_DF+viewid,0); // Store the design view characteristics varset(GV_VIEW_FN+viewid,vfname); varset(GV_VIEW_CL+viewid,vddbcl); varset(GV_VIEW_EN+viewid,vename); varset(GV_VIEW_LX+viewid,wslx); varset(GV_VIEW_LY+viewid,wsly); varset(GV_VIEW_UX+viewid,wsux); varset(GV_VIEW_UY+viewid,wsuy); varset(GV_VIEW_MD+viewid,mirrdisp); varset(GV_VIEW_CO+viewid,coltname); } int datafunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Data query callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { // Check the data field switch (didx) { case 1 : if (dtype==2) { tbattach=dint; found=1; break; } wslx=ddbl; break; case 2 : wsly=ddbl; break; case 3 : wsux=ddbl; break; case 4 : wsuy=ddbl; found=1; break; case 5 : coltname=dstr; break; case 6 : if (dtype==2) { viewstorewsdata(dint); break; } vfname=dstr; break; case 7 : vename=dstr; break; case 8 : vddbcl=dint; if (vddbcl>10000) { vddbcl-=10000; mirrdisp=1; } else { mirrdisp=0; } break; case 9 : viewstorewsdata(dint); break; default : ; } // Return without errors return(0); } int colpalfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Color palette prefix query callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { varset(PAR_TBPALPREF,dstr); // Return without errors return(0); } static int idxselfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Macro selection callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { histidx=dint; // Return without errors return(0); } static int nameselfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Macro selection callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { variant_name=dstr; // Return without errors return(0); } static int histselfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // History data selection callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { // Store the current entry switch (didx) { // Class case 1 : hddbcl=dint; break; // Element name case 2 : hename=dstr; break; // File name case 3 : hfname=dstr; break; } // Return without errors return(0); } static int lockchkfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Macro selection callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { switch (didx) { // User name case 1 : if (lockuser=="" || lockuser==dstr) lockuser=dstr; else lockuser=lockuser+", "+dstr; found=1; break; // Lock mode case 2 : datlockmode=dint; break; } // Return without errors return(0); } static string getnewestlay() /* // Get newest backannotated/packaged layout element in database // Return value : // name of newest layout element */ { int sec,min,hour,day,mon,year /* Update time designators */; int nsec,nmin,nhour,nday,nmon,nyear /* Newest time designators */; string nename = "" /* Newest element name */; string ename = "" /* Scan element name */; /* Reset newest element info */ nsec=nmin=nhour=nday=nmon=nyear=0; while (scanddbenames(fname,DDBCLBASS,ename)==1) { // Get the update time ddbupdtime(fname,DDBCLBASS,ename,sec,min,hour,day,mon,year); // Check if newest element if (year>nyear || (year==nyear && (mon>nmon || (mon==nmon && (day>nday || (day==nday && (hour>nhour || (hour==nhour && (min>nmin || (min==nmin && sec>nsec)))))))))) { // Store element data nename=ename; nyear=year; nmon=mon; nday=day; nhour=hour; nmin=min; nsec=sec; } } // Return newest backannotated/packaged layout element name return(nename); } // User Language program end