/* SYMSEL (SCM) -- SCM Symbol Placement with Attribute Selection */ /* SYMSEL (SCM) -- SCM-Symbolplatzierung mit Auswahl aus Attributdatenbank */ /* // Copyright (c) 2003-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (110228) ENHANCEMENT: // Added report box to ID replacement function. // rl (101019) RELEASED FOR BAE V7.6. // rl (100225) ENHANCEMENT: // Added symbol macro change warnings to update function. // rl (091027) RELEASED FOR BAE V7.4. // rl (090916) BUGFIX: // Suppressed $plname change warnings for valid // alternate macro list selections. // rl (090528) ENHANCEMENT: // Added standalone symbol pool dialog box. // rl (090519) ENHANCEMENT: // Added automatic base variant $plname filter to search mask. // rl (090305) ENHANCEMENT: // Added symbol macro specific documentation query support. // rl (081014) RELEASED FOR BAE V7.2. // rl (080605) ENHANCEMENT: // Added .doc file support. // rl (080410) ENHANCEMENT: // Added full variant support to ID update and replacment. // rl (080116) ENHANCEMENT: // Fixed problem with sorted list symbol preview. // rl (071029) RELEASED FOR BAE V7.0. // rl (071009) ENHANCEMENT: // Added $plname change check options. // rl (070423) ENHANCEMENT: // Added bae.ini controlled full $plname update mode. // rl (061129) ENHANCEMENT: // Changed symbol preview to activation on single click mark. // rl (060829) RELEASED FOR BAE V6.8. // rl (051004) RELEASED FOR BAE V6.6. // rl (050919) ENHANCEMENT: // Added named symbol pool import support. // rl (050509) ENHANCEMENT: // Added status field support. // rl (050506) ENHANCEMENT: // Added sort by table field option. // rl (050427) ENHANCEMENT: // Added symbol preview option. // rl (041018) ENHANCEMENT: // Fixed problem with subtree misselection in search mask. // rl (040914) ENHANCEMENT: // Allowing symbol macro change for multisymbol entries // in symbol and group replacement functions. // rl (040830) RELEASED FOR BAE V6.4. // rl (040603) ENHANCEMENT: // Added symbol pool support. // rl (040602) ENHANCEMENT: // Added documentation query to selection list. // Added layout part load request to selection list. // rl (031202) ENHANCEMENT: // Added symbol data search by symbol pick option to search mask. // rl (031025) ENHANCEMENT: // Added selection sort option. // rl (031024) ENHANCEMENT: // Added verification prompt for symbol macro change operation. // rl (030912) RELEASED FOR BAE V6.2. // rl (030807) ENHANCEMENT: // Added field width to data length adjustment option. // rl (030611) ENHANCEMENT: // Added history button autosize. // Added scrollable selection field options. // rl (030606) ENHANCEMENT: // Added orphant key report to update function. // rl (030520) ORIGINAL CODING. // // DESCRIPTION // // The symsel User Language program provides symbol placement // capability with attribute selection from a database generated with // the symattdb utility. */ // Includes #include "pop.ulh" // User Language popup utilities #include "popdraw.ulh" // User Language popup draw. util. #include "scm.ulh" // User Language SCM utilities #include "sql.ulh" // User Language SQL utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRTOP = M("TOP","TOP"); string UPRSEARCHBUT = M("&Suche","&Search"); string UPRSELECTBUT = M("&Selektion","&Selection"); string UPRUPDATEBUT = M("&Update","&Update"); string UPRIMPORTBUT = M("&Import","&Import"); string UPRDOCBUT = M("&Doku","&Doc"); string UPRTRIMBUT = M("Trim","Trim"); string UPRSANDBUT = M("&UND-Suche","&AND Search"); string UPRSORBUT = M("&ODER-Suche","&OR Search"); string UPRSYMBUT = M("S&ymbol-Suche","S&ymbol Search"); string UPRDELBUT = M("&Loeschen","&Delete"); string UPREMPTYBUT = M("L&eeren","&Empty"); string UPRALLRES = M("Alle &ruecksetzen","&Reset All"); string UPRNEXTDIAL = M("&Weitere","&Next"); string UPRPREVDIAL = M("&Vorherige","&Previous"); string UPRSEARCHMASK = M("Suchmaske","Search Mask"); string UPRFCT00 = M("S&ymbolplatzierung","S&ymbol Placement"); string UPRFCT01 = M("&Warenkorb","Symbol P&ool"); string UPRFCT02 = M("Einzel&tausch","Single Re&placement"); string UPRFCT03 = M("&Gruppentausch","&Group Replacement"); string UPRFCT04 = M("&Nummerntausch","&ID Replacement"); string UPRAUTONAME = M("Autoname","Autoname"); string UPRAUTOCLOSE = M("schliessen","close"); string UPROLDID = M("!Zu ersetzender Schluessel ? ", "!Key to be replaced ? "); string UPRSELBMOD = M("Bearbeitungsmodus auswaehlen!", "Select process mode!"); string UPRSELBMOD0 = M("Aktuelles &Blatt","&Current Sheet"); string UPRSELBMOD1 = M("&Gruppenelemente","&Group Elements"); string UPRSELBMOD2 = M("&Alle Blaetter","&All Sheets"); string UPRSELDOC = M("Bearbeitungsmodus auswaehlen!", "Select process mode!"); string UPRSELDOC0 = M("&PDF-Datei","&PDF File"); string UPRSELDOC0D = M("&DOC-Datei","&DOC File"); string UPRSELDOC0E = M("%s-Datei","%s File"); string UPRSELDOC1 = M("&Internetlink","&Internet Link"); string UPRSEL = M("Datenbankselektion","Database selection"); string UPRPICKSYM = M("Symbole selektieren!","Pick symbols!"); string UPRPICKSSYM = M("Symbol selektieren!","Pick symbol!"); string UPRASKREF = M("Bauteilname ? ","Part Name ? "); string UPRSYMCHG = M("Symbolwechsel von '%s' zu '%s'! Durchfuehren? ", "Symbol change from '%s' to '%s'! Confirm ? "); string UPRMSYMCHG = M("Symbolmakrowechsel bei %d Symbolen! Durchfuehren? ", "Symbol macro change at %d Symbols! Confirm ? "); string UPRPLNCHG = M("Layoutgehaeusewechsel! Durchfuehren? ", "Layout macro change! Confirm ? "); string UPRMPLNCHG = M("Layoutgehaeusewechsel bei %d Symbolen! Durchfuehren? ", "Layout macro change at %d Symbols! Confirm ? "); string UPRMAPSEL = M("Untersymbolauswahl","Sub Symbol Selection"); string UPRSYMSEL = M("Warenkorb","Symbol Pool"); string UPRIMPFILE = M("Warenkorbdatei ? ","Symbol Pool File Name ? "); string UPREMPTYBASKET = M("Gesamten Warenkorbinhalt loeschen?", "Dismiss complete symbol basket contents?"); string UPRLOCKWARN = M("Blatt '%s' ist von Benutzer '%s' gealden. Trotzdem Update ?", "Page '%s' is loaded by '%s'. Update Anyway ?"); string REPLIB = M("Bibliothek : %s","Library : %s'"); string REPSYM = M("Symbol : %s","Symbol : %s"); string REPNODOC = M("Keine Dokumentation zu Symbol gefunden!", "No Documentation for symbol found!"); string REPNOMDOC = M("Keine Dokumentation zu Symbolmakro '%s' gefunden!", "No Documentation for symbol macro '%s' found!"); string REPNOSYM = M("Keine Symbole zu Suchanfrage gefunden!", "No Symbols for given query found!"); string REPNOSYMSEL = M("Kein Symbol selektiert!","No Symbol selected!"); string REPNOKEYATTR = M("Kein Schluesselattribut in der Datenbank!", "Database misses key field!"); string REPSTOREPOOL = M("Lege %d '%s' in Warenkorb...", "Adding %d '%s' to symbol basket..."); string REPSTORENPOOL = M("Lege %s ('%s') in Warenkorb...", "Adding %s ('%s') to symbol basket..."); string REPSYMPROC = M("%d/%d/%d Symbole bearbeitet.", "%d/%d/%d Symbols processed."); string REPIDREPLACE = M("Ersetzung Sachnummer '%s' durch '%s':", "ID Replacement '%s' by '%s':"); string REPSYMCHECK = M("%d Symbole gesannt.","%d Symbols scanned"); string REPIDFOUND = M("%d alte Sachnummern gefunden.", "%d old IDs found."); string REPIDREPCNT = M("%d Attributersetzungen.", "%d Attribute replacements."); string REPATTCHG = M("Symbol '%s' Attribute geaendert.", "Symbol '%s' attributes changed."); string REPVATTCHG = M("Symbol '%s' Variantenattribute geaendert.", "Symbol '%s' variant attributes changed."); string REPIDMISS = M("Verwaiste Sachnummern:","Orphant Keys:"); string REPPLCHANGE = M("WARNUNG: Symbol '%s' $plname-Attribut/Gehaeuseaenderung '%s'->'%s'!", "WARNING: Symbol '%s' changed $plname attribute/part macro '%s'->'%s'!"); string REPSYMCHANGE = M("WARNUNG: Symbol '%s' Symbolmakroaenderung '%s'->'%s'!", "WARNING: Symbol '%s' changed symbol macro '%s'->'%s'!"); string REPIMPIDMISS = M("Unbekannte ignorierte Sachnummern:", "Unknown Keys (ignored):"); string WRNIDMSG = M("WARNUNG: Bauteil '%s' Sachnummer '%s' %s", "WARNING: Part '%s' Key '%s' %s"); string WRNVIDMSG = M("WARNUNG: Variante %d Bauteil '%s' Sachnummer '%s' %s", "WARNING: Variant %d Part '%s' Key '%s' %s"); string ERRMAPERR = M("Symbol '%s' passt nicht zu Mapping '%s'!", "Symbol '%s' doesn't match mapping '%s'!"); string ERRIDMISS = M("Bauteil '%s' Sachnummer '%s' nicht in Datenbank!", "Part '%s' Key '%s' not in database!"); string ERRIMPIDMISS = M("Sachnummer '%s' nicht in Datenbank!", "Key '%s' not in database!"); string ERRPLVARERR = M("Gehaeusewechsel in der Variante nicht moeglich!", "Layout macro change for variants not allowed!"); string ERRPLVARERRV = M("Gehaeusewechsel in der Variante nicht moeglich ('%s'<>'%s'!", "Layout macro change for variants not allowed ('%s'<>'%s'!"); string ERRNOWIN = M("Nur in Windowsumgebungen verfuegbar!", "Windows Environment needed!"); string ERRVARFUNC = M("Diese Funktion ist fuer Varianten nicht erlaubt!", "Not allowed in variant edit mode!"); string ERRSETATT = M("Fehler beim Eintragen des Attributes '%s' fuer '%s'!", "Error setting attribute '%s' for '%s'!"); string ERRATTTMIS = M("Symbol '%s' ('%s') kein Attributtext fuer '%s'!", "Symbol '%s' ('%s') no attribute text for '%s'!"); string ERRNOKEYID = M("Keine Symbole mit gesetzter Sachnummer vorhanden!", "No symbols with valid key attribute found!"); string ERRNOMAP = M("Symbol '%s' nicht in Mappingdefinition!", "Symbol '%s' not in mapping definition!"); string ERRDBLPOOL = M("Warenkorbfenster ist bereits aktiv!", "Symbol pool box already active!"); string ERRDBLSBOX = M("Symboldatenbankfenster ist bereits aktiv!", "Symbol library window already active!"); string ERRELEMLOCK = M("Blatt '%s' ist von Benutzer '%s' geladen. Solange kein Update moeglich!", "Page '%s' is loaded by '%s'. Update not permitted!"); string ERRDBINIT = M("SQL/DB-Datei '%s' kann nicht initialisiert werden!", "Error initialyzing SQL/DB file '%s'!"); // INI file parameter name definitions #define PAR_SYMSELDB "SYMSELDB_SCM" // Symbol selection database #define PAR_LSYMSELDB "LSYMSELDB_SCM" // Symbol selection dest. database file #define PAR_SSELDLIB "SSELDLIB_SCM" // Default symbol library #define PAR_SSELLSEL "SSELLSEL_SCM" // Last selection flag #define PAR_SSELAUTO "SSELAUTO_SCM" // Symbol auto name flag #define PAR_SSELCLOSE "SSELCLOSE_SCM" // Symbol auto close box flag #define PAR_NAMEPROMPT "NAMEPROMPT_SCM"// Name prompt mode #define PAR_SSELASORT "SSELASORT_SCM" // Attribute sort flag #define PAR_SSELTSORT "SSELTSORT_SCM" // Table tree selection sort flag #define PAR_SSELLSORT "SSELLSORT_SCM" // Selection list sort flag #define PAR_SSELSORTF "SSELSORTF_SCM" // Selection list sort field #define PAR_SSELAPAT "SSELAPAT_SCM" // Automatic pattern search flag #define PAR_SPATHDOC "SSELPDOC_SCM" // Symbol search path documentation #define PAR_SYMBTABF "SYMBTABF_SCM" // Symbol table field name #define PAR_LMACTABF "LMACTABF_SCM" // Layout macro table field name #define PAR_LIBTABF "LIBTABF_SCM" // Library table field name #define PAR_MAPLIB "MAPLIB_SCM" // Mapping library name #define PAR_SYMMAPDB "SYMMAPDB_SCM" // Symbol mapping database #define PAR_LSYMMAPDB "LSYMMAPDB_SCM" // Local mapping database #define PAR_ATTRKEY "SSELKEYID_SCM" // Key attribute name #define PAR_STATUS "SSELSTATUSF_SCM" // Status field name #define PAR_STATUSL "SSELSTATUSL_SCM" // Status value list #define PAR_SSELBALST "SSELBALST_SCM" // Symbol basket display attribute list #define PAR_RLKEY "SSELRLKEY_SCM" // $rlname key field #define PAR_PDFFILE "SSELPDF_SCM" // PDF file field name #define PAR_PDFCMD "SSELPDFC_SCM" // PDF file access command #define PAR_PDFMODE "SSELPDFM_SCM" // PDF file access mode #define PAR_PDFDIR "SSELPDFD_SCM" // PDF document folder #define PAR_DOCCMD "DOCCMD_STD" // DOC file access command #define PAR_WWWLINK "SSELWWW_SCM" // Internet link field name #define PAR_WWWCMD "SSELWWWC_SCM" // Internet link access command #define PAR_SSELBOXW "SSELBOXW_SCM" // Selection box width #define PAR_SSELBOXH "SSELBOXH_SCM" // Selection box height #define PAR_SSELPICW "SSELPICW_SCM" // Picture box width #define PAR_SSELBUTW "SSELBUTW_SCM" // History button width #define PAR_SSELBUTX "SSELBUTX_SCM" // History button x step #define PAR_SSELTBW "SSELTBW_SCM" // Top button width #define PAR_SSELTBX "SSELTBX_SCM" // Top button x step #define PAR_SSELSEPX "SSELSEPX_SCM" // History separator x step #define PAR_SSELFULLH "SSELFULLH_SCM" // Full header length trimming #define PAR_SSELAUTOT "SSELATRIM_SCM" // Automatic column trimming #define PAR_SSELSFW "SSELSFW_SCM" // Search edit field width #define PAR_SSELSFN "SSELSFN_SCM" // Search field count #define PAR_SSELSFVS "SSELSFVS_SCM" // Search field vertical spacing #define PAR_SSELATTR "SSELATTR_%s_SCM" // Attribute mask #define PAR_SSELATTRD "SSELATTRDEFAULT_SCM" // Default attribute mask #define PAR_SSELATTRW "SSELATTRW_%s_SCM" // Attribute field width #define PAR_SSELFIELD "SSELFIELD_%s_SCM" // Field mask #define PAR_SSELFIELDD "SSELFIELDDEFAULT_SCM" // Default field mask #define PAR_SSELFIELDW "SSELFIELDW_%s_SCM" // Field width #define PAR_SSELFIELDDW "SSELFIELDWIDTH_SCM" // Default field width #define PAR_SSELFDISP "SSELFIELDDISP_SCM" // Field display mode #define PAR_SSELAALIAS "SSELATTRALIAS_%s_SCM" // Attribute alias pattern #define PAR_SSELLMACUPD "SSELLMACUPD_SCM" // Layout macro update flag #define PAR_SSELLMACQRY "SSELLMACQRY_SCM" // Lay. macro change query flag #define PAR_ATTRCOMMP "ATTR_%s_STD" // Attribute comment pattern #define PAR_DISPTEXT "DISPTEXT_SCM" // Display text flag #define PAR_DISPPLNAME "DISPPLNAME_SCM"// $plname part display flag #define PAR_SBOXID "SSELSBOXID_SCM"// Single dialog box ID // Database structure definitions string DEFSYMLIB = bae_inistrval(PAR_SSELDLIB,"stdsym") /* Default symbol library */; string MAPLIB = bae_inistrval(PAR_MAPLIB,"mehrfach") /* Mapping library name */; string SYMMAPDB /* Symbol mapping database file name */; int SBOXID = bae_iniintval(PAR_SBOXID,0) /* Single dialog box ID */; int LASTSEL = bae_iniintval(PAR_SSELLSEL,1) /* Last selection flag */; int AUTONAME = bae_iniintval(PAR_SSELAUTO,0) /* Symbol auto name flag */; int AUTOCLOSE = bae_iniintval(PAR_SSELCLOSE,0) /* Symbol auto close mode */; int NAMEPROMPT = bae_iniintval(PAR_NAMEPROMPT,1) /* Symbol name prompt mode */; int NAMEMODE /* Symbol name mode */; int AUTOPATTERN = bae_iniintval(PAR_SSELAPAT,0) /* Automatic pattern search flag */; int SPATHDOC = bae_iniintval(PAR_SPATHDOC,1) /* Symbol search path documentation */; int ATTRSORT = bae_iniintval(PAR_SSELASORT,0) /* Attribute sort flag */; int TREESORT = bae_iniintval(PAR_SSELTSORT,1) /* Tree selection sort flag */; int LISTSORT = bae_iniintval(PAR_SSELLSORT,0) /* List selection sort flag */; string SORTFIELD = bae_inistrval(PAR_SSELSORTF,"") /* List selection sort field */; int LMACUPD = bae_iniintval(PAR_SSELLMACUPD,0) /* Layout macro update flag */; int LMACQRY = bae_iniintval(PAR_SSELLMACQRY,1) /* Layout macro change query flag */; string SYMFIELD /* Symbol field name */; string LIBFIELD = bae_inistrval(PAR_LIBTABF,M("Bibliothek","Library")) /* Library field name */; string ATTRKEY = bae_inistrval(PAR_ATTRKEY,"") /* Key (part id) attribute */; string STATUSFIELD = bae_inistrval(PAR_STATUS,"") /* Status field name */; string LMACTABF = bae_inistrval(PAR_LMACTABF,M("Gehaeuse","Footprint")) /* Layout macro field name */; string RLKEY = bae_inistrval(PAR_RLKEY,"") /* Requested library attribute */; string PDFFILE = bae_inistrval(PAR_PDFFILE,"") /* PDF file field name */; string PDFCOMMAND = bae_inistrval(PAR_PDFCMD,"") /* PDF file access command name */; int PDFMODE = bae_iniintval(PAR_PDFMODE,0) /* PDF file access mode */; string PDFDIR = bae_inistrval(PAR_PDFDIR,"") /* PDF document folder name */; string DOCCOMMAND = bae_inistrval(PAR_DOCCMD,"") /* DOC file access command name */; string WWWLINK = bae_inistrval(PAR_WWWLINK,"") /* WWW link field name */; string WWWCOMMAND = bae_inistrval(PAR_WWWCMD,"") /* WWW access command name */; double SELBOXWIDTH = bae_inidblval(PAR_SSELBOXW,95.0) /* Selection box width */; double SELBOXHEIGHT = bae_inidblval(PAR_SSELBOXH,16.0) /* Selection box height */; double PICBOXWIDTH = bae_inidblval(PAR_SSELPICW,30.0) /* Picture box width */; double TOPBWIDTH = bae_inidblval(PAR_SSELTBW,0.0) /* Top button width */; double TOPBXSTEP = bae_inidblval(PAR_SSELTBX,1.5) /* Top button x step */; double BUTWIDTH = bae_inidblval(PAR_SSELBUTW,0.0) /* History button width */; double BUTXSTEP = bae_inidblval(PAR_SSELBUTX,1.5) /* History button x step */; double SEPXSTEP = bae_inidblval(PAR_SSELSEPX,1.2) /* History separator x step */; double SEDITWIDTH = bae_inidblval(PAR_SSELSFW,20.0) /* Search edit field width */; int SEDITN = bae_iniintval(PAR_SSELSFN,12) /* Search edit field count */; double SEDITSPC = bae_inidblval(PAR_SSELSFVS,1.2) /* Search edit field spacing */; int DEFATTRMODE = bae_iniintval(PAR_SSELATTRD,3) /* Default attribute process mode */; int DEFFIELDMODE = bae_iniintval(PAR_SSELFIELDD,0) /* Default field process mode */; int DEFFIELDWIDTH = bae_iniintval(PAR_SSELFIELDDW,999) /* Default field width */; int FIELDDISP = bae_iniintval(PAR_SSELFDISP,2) /* Field display mode */; int FULLTABHEAD = bae_iniintval(PAR_SSELFULLH,1) /* Full table header trimming */; int AUTOTRIM = bae_iniintval(PAR_SSELAUTOT,0) /* Automatic table column trimming */; int DISPTEXT = bae_iniintval(PAR_DISPTEXT,1) /* Text display mode */; #define DBUTWIDTH 6.5 // Dialog box button width #define DBUTSPACE 8.5 // Dialog box button hor. spacing double ABUTXSTEP = bae_swconfig(3)==2 ? 2.0 : 0.0 /* Action button x step */; string attrdb /* Attributes database file name */; struct statdes { // Status descriptor string val /* Status value */; int proc /* Status process mode */; string msg /* Status message */; }; struct statdes statdl[] /* Status descriptor list */; int statdn /* Status descriptor count */; STRINGS defbdattrl = { // Default basket display attributes "$val", "$gp", "$rpname", "$rbname", "$" }; STRINGS bdattrl /* Basket display attribute list */; int bdattrn /* Basket display attribute count */; // Global variable names #define GV_NAMEMODE "ssel_namemode" // Symbol place name mode #define GV_NAMEPAT "ssel_namepat" // Symbol current name pattern #define GV_AUTOCLOSE "ssel_autoclose"// Symbol place autoclose box mode #define GV_SELAIDX "ssel_aidx" // Selection attribute index #define GV_SELSTKN "ssel_stkn" // Selection stack count #define GV_SELTYP "ssel_typ_%d" // Selection stack entry type #define GV_SELID "ssel_id_%d" // Selection stack entry ID #define GV_SELNAME "ssel_name_%d" // Selection stack entry name #define GV_SELLN "ssel_ln" // Selection list count #define GV_SELLTYP "ssel_ltyp_%d" // Selection list entry type #define GV_SELLID "ssel_lid_%d" // Selection list entry ID #define GV_SELLNAME "ssel_lname_%d" // Selection list entry name #define GV_TABN "ssel_tn" // Selection table entry count #define GV_TABNAME "ssel_tname_%d" // Selection table name #define GV_TABATTR "ssel_tattr_%d" // Selection table attribute #define GV_TABNMODE "ssel_tnmode_%d"// Selection table name mode #define GV_TABAMODE "ssel_tamode_%d"// Selection table attribute mode #define GV_TABWIDTH "ssel_twidth_%d"// Selection table width #define GV_TABCOL "ssel_tcol_%d" // Selection table control item #define GV_TABFID "ssel_tfid_%d" // Selection table name ID #define GV_TABAID "ssel_taid_%d" // Selection table attribute ID #define GV_TABREAD "ssel_tread_%d" // Selection table read flag #define GV_ATTRN "ssel_an" // Selection attribute count #define GV_ATTRL "ssel_a_%d_%d" // Selection attribute #define GV_ETRANSL "ssel_et_%d" // Selection entry translation list #define GV_LASTSEL "ssel_lastsel" // Symbol place name mode #define GV_NAMESIDX "ssel_namesidx" // Symbol search name list start #define GV_SEARCHN "ssel_sfn" // Search field count #define GV_SEARCHFN "ssel_sname_%d" // Search field count #define GV_SEARCHFT "ssel_styp_%d" // Search field name type #define GV_SEARCHFI "ssel_sid_%d" // Search field name ID #define GV_SEARCHFA "ssel_saname_%d"// Search field attribute name #define GV_SEARCHFL "ssel_slow_%d" // Search field lowercase name #define GV_SEARCHFV "ssel_sval_%d" // Search field value #define GV_SEDITN "ssel_sefn" // Search edit field count #define GV_SEDITL "ssel_sel_%d" // Search edit field item #define GV_SEDITV "ssel_sev_%d" // Search edit field value #define GV_RESN "ssel_resn" // Result entry count #define GV_RESDID "ssel_rdatid_%d"// Result entry data ID #define GV_RESPAR "ssel_rpar_%d" // Result entry parent ID #define GV_RESFOUND "ssel_rf_%d" // Result entry found #define GV_SYMPDIS "sp_sympooldis" // Symbol pool query disable flag #define GV_SYMBID "sp_symbaskid" // Symbol pool basket ID #define GV_SYMNAME "sp_symname" // Symbol pool symbol name #define GV_LIBNAME "sp_libname" // Symbol pool library name #define GV_RLNAME "sp_rlname" // Symbol pool $rlname value #define GV_FILENAME "sp_filename" // Symbol pool file name #define GV_SBOXID "s_boxid" // Symbol selection box ID #define GV_SPBOXID "sp_boxid" // Symbol pool box ID #define GV_SPITEMFIELD "sp_itemidx" // Symbol pool item list index #define GV_SPAUTONAME "sp_autoname" // Symbol pool autoname item index #define GV_SPAUTOCLOSE "sp_autoclose" // Symbol pool auto close item index #define GV_SITEMFIELD "sa_itemidx" // Symbol function/attr. list index #define GV_SAUTONAME "sa_autoname" // Symbol autoname item index #define GV_SAUTOCLOSE "sa_autoclose" // Symbol auto close item index #define GV_CNTFIELD "sa_cntidx" // Symbol count index #define GV_H1FIELD "sa_h1idx" // Symbol 1st header label index #define GV_H2FIELD "sa_h2idx" // Symbol 2nd header label index #define GV_BMFIELD "sa_bmidx" // Symbol bitmap label index #define GV_BMHEIGHT "sa_bmheight" // Symbol bitmap height #define GV_PREVBUT "sm_pbidx" // Symbol previous button index #define GV_NEXTBUT "sm_nbidx" // Symbol next button index // SQL command definitions #define C_READ "cache read on;" #define C_OFF "cache off;" #define S_SELECT "select seltyp,selid,selname from selentry where parent=%d;" #define SN_SELECT "select selname from selentry where selid=%d;" #define SP_SELECT "select parent from selentry where selid=%d;" #define ST_SELECT "select selname,parent from selentry where selid=%d;" #define T_SELECT "select fieldidx,attrid,fieldid from tabfield where parent=%d;" #define AN_SELECT "select attrname from attrnames where attrid=%d;" #define A_SELECT "select attrid,attrname from attrnames;" #define AI_SELECT "select attrid from attrnames where attrname=%s;" #define FN_SELECT "select fieldname from fieldnames where fieldid=%d;" #define F_SELECT "select fieldid,fieldname from fieldnames;" #define FI_SELECT "select fieldid from fieldnames where fieldname=%s;" #define DI_SELECT "select datid from datentry where parent=%d AND fieldidx=0;" #define D_SELECT "select entval from datentry where datid=%d AND fieldidx=%d;" #define DF_SELECT "select datid,parent from datentry where fieldid=%d AND lowval" #define DA_SELECT "select datid,parent from datentry where attrid=%d AND lowval" #define DK_SELECT "select datid,parent from datentry where attrid=%d AND entval=%s;" #define DE_SELECT "select entval from datentry where datid=%d AND fieldid=%d;" #define DP_SELECT "select entval,parent from datentry where datid=%d AND fieldid=%d;" #define M_SELECT "select symbol,symcnt,libname,rlname,id from mapdef where mapname=%s;" #define MA_SELECT "select attrname,attrval from mapattr where id=%d;" #define SB_CREATE1 "create table msymbasket (basketid integer,cnt integer," #define SB_CREATE2 "symbol string,library string,rlname string,mapid integer);" #define SB_HELP "help msymbasket;" #define SB_INSERT "insert into msymbasket values(%d,%d,%s,%s,%s,%d);" #define SB_SELECT "select symbol,basketid,cnt,library,rlname,mapid from msymbasket;" #define SB_DELETE1 "delete from msymbasket where basketid=%d AND symbol=%s" #define SB_DELETE2 " AND library=%s AND rlname=%s AND mapid=%d;" #define SB_DELALL "delete from msymbasket;" #define SC_SELECT "select basketid from msymbasket where basketid=%d AND mapid=%d;" #define BA_CREATE1 "create table mbasketattr (basketid integer," #define BA_CREATE2 "attrname string,attrval string,mapid integer);" #define BA_HELP "help mbasketattr;" #define BA_INSERT "insert into mbasketattr values(%d,%s,%s,%d);" #define BA_SELECT1 "select attrval from mbasketattr where " #define BA_SELECT2 "basketid=%d AND mapid=%d AND attrname=%s;" #define BV_SELECT1 "select attrname,attrval from mbasketattr where " #define BV_SELECT2 "basketid=%d AND mapid=%d;" #define BA_DELETE "delete from mbasketattr where basketid=%d AND mapid=%d;" #define BA_DELALL "delete from mbasketattr;" #define BI_CREATE "create table basketid (maxbasketid integer);" #define BI_HELP "help basketid;" #define BI_INSERT "insert into basketid values(%d);" #define BI_SELECT "select maxbasketid from basketid;" #define BI_DELETE "delete from basketid;" #define V_SELECT "select variant from varinfo;" #define W_HELP "help lvhead;" #define W_CREATE1 "create table lvhead (colhead string," #define W_CREATE2 "colidx integer,colwidth float);" #define W_INSERT "insert into lvhead values(%s,%d,%.2f);" #define W_SELECT "select colidx,colwidth from lvhead where colhead=%s;" #define W_DELETE "delete from lvhead where colhead=%s;" string sqlcommand /* SQL command string */; static string WPOSDB = strgetconffilename(WPOSVARNAME,WPOSFILENAME,2); // Selection definitions string curname = "" /* Current name */; string ddbfname = bae_planfname() /* Current project file name */; struct seldes { // Selection descriptor int typ /* Selection type */; int id /* Selection ID */; string name /* Selection name */; } sell[] /* Selection list */; int seln /* Selection count */; struct seldes selstk[] /* Selection stack */; struct seldes cursel /* Current selection */; int selstkn /* Selection count */; struct tfdesc { // Table field entry descriptor string name /* Table field name */; string attr /* Table field attribute name */; int nmode /* Table field name mode */; int amode /* Table field attribute mode */; int width /* Table field width */; double colw /* Table listview column width */; int colctrl /* Table listview column index */; int fid /* Table field name ID */; int aid /* Table field attribute ID */; int read /* Table field read flag */; } tfl[] /* Table field list */; int tfn = 0 /* Table field count */; int curtf /* Current table field index */; int cursidx /* Cur. table sort key field index */; int curstidx /* Cur. table status key field index */; int keyid /* Current key attribute ID */; int ntyp /* Current name type */; int datidl[] /* Data ID list */; int curid /* Current ID */; string attrl[][] /* Attribute list */; int attrn /* Attribute count */; int curattridx /* Current attribute index */; string curattr /* Current attribute name */; int atextflag /* Attribute text flag */; struct snamedes { // Search name descriptor int typ /* Name type */; int id /* Name ID */; string aname /* Attribute name */; string name /* Name */; string lowname /* Lower case name */; string val /* Field value */; } sfl[] /* Name list */; int sfn = 0 /* Selection field count */; int lastselid = bae_iniintval(GV_LASTSEL,(-1)) /* Last selection ID */; int nlsidx = 0 /* Name list start idx. */; struct resdes { // Search result descriptor int datid /* Result data ID */; int parent /* Result parent ID */; int found /* Result found */; } resl[] /* Result list */; int resn = 0 /* Result count */; int selmode /* Selection mode */; int seldatid /* Selection data ID */; string attrval /* Attribute value */; STRINGS hl /* Report list */; int hn = 0 /* Report count */; STRINGS msgl /* Message list */; int msgn = 0 /* Message count */; struct mapdes { // Mapping descriptor string name /* Symbol name */; int cnt /* Symbol count */; string libname /* Library name */; string rlname /* Requested library name */; int id /* Mapping attribute ID count */; } mapl[] /* Mapping list */; int mapn /* Mapping count */; struct symdes { // Symbol pool descriptor int cnt /* Symbol count */; int id /* Symbol basket ID */; string name /* Symbol name */; string libname /* Library name */; string rlname /* Requested library name */; string attr /* Symbol attributes */; int mapid /* Mapping attributes ID */; } syml[] /* Symbol pool list */; int symn /* Symbol pool count */; int cursym /* Current symbol pool index */; struct attrdef { // Attribute assignment descriptor string name /* Attribute name */; string val /* Attribute value */; } vall[] /* Attribute value list */; int valn /* Attribute value count */; STRINGS elist /* Entry list */; STRINGS klist /* Key list */; int color /* Current color */; int boxidx /* Dialog box index */; int h1idx = (-1) /* 1st header label item index */; int h2idx = (-1) /* 2nd header label item index */; int bmlabidx = (-1) /* Bitmap label item index */; int anidx = (-1) /* Autoname item index */; int acidx = (-1) /* Autoclose item index */; double picheight /* Picture box height */; int etransl[] /* Entry index transfer list */; int act_var = 0 /* Active variant */; int varn = 0 /* Variant count */; int cflag = 0 /* Change flag */; // Main program void main() { int done = 0 /* Done flag */; // Abort if invalid plan class if (bae_planddbclass()!=DDBCLSCM) error_class(); // Set database name if ((attrdb=bae_inistrval(PAR_LSYMSELDB,""))=="") attrdb=scmlibdir()+bae_inistrval(PAR_SYMSELDB,"symsel.dat"); if ((SYMMAPDB=bae_inistrval(PAR_LSYMMAPDB,""))=="") SYMMAPDB=scmlibdir()+bae_inistrval(PAR_SYMMAPDB,"symmap.dat"); // Init. the attribute flags initattrvar(); // Init. the selection stack initselstack(); // Check if automated interaction if (bae_peekiact()==2) switch (askstr("",MAXTEXTLEN)) { // Query symbol documentation case "docu" : documentation(-1); exit(0); // Update symbol pool display case "poolupdate" : symbolpool(1); exit(0); // Update next symbol name display case "nameupdate" : if (varget(GV_SBOXID,boxidx)==0 && varget(GV_SAUTONAME,anidx)==0) nameupdate(boxidx); exit(0); // Open symbol pool dialog box case "pool" : symbolpool(0); exit(0); // Attribute box case "selattr" : selectattr(); break; // Search mask box case "searchmask" : searchmask(); break; // Search result box case "searchresult" : searchresult(); break; // Function selection box case "selfunc" : selectfunc(); varset(GV_SELAIDX,-1); break; } // Check if dialog box support if (bae_dialclr()) error(ERRNOWIN); // Perform the selection loop while (!done) { // Check if table selection if (selstk[selstkn-1].typ) { storeselstack(); selectattr(); } else { // Select next function level selectfunc(); varset(GV_SELAIDX,-1); } } } void initattrvar() /* // Init. the attribute variables */ { if (varget(GV_NAMEMODE,NAMEMODE)) NAMEMODE=(AUTONAME || !NAMEPROMPT); if (varget(GV_AUTOCLOSE,AUTOCLOSE)) AUTOCLOSE=bae_iniintval(PAR_SSELCLOSE,0); // Check if symbol table field defined if (varget(PAR_SYMBTABF,SYMFIELD)) { // Set default attribute variables SYMFIELD="Symbol"; varset(PAR_SYMBTABF,SYMFIELD); varset("SSELATTR_VAL_SCM",11); varset("SSELFIELD_PLNAME_SCM",3); varset( M("SSELFIELD_GEHAEUSE_SCM","SSELFIELD_FOOTPRINT_SCM"),3); varset("SSELFIELD_TYP_SCM",3); varset("SSELFIELDW_TYP_SCM",15); varset( M("SSELFIELD_KOMMENTAR_SCM","SSELFIELD_COMMENT_SCM"),3); varset( M("SSELFIELDW_KOMMENTAR_SCM","SSELFIELDW_COMMENT_SCM"),1); varset( M("SSELFIELD_KATEGORIE_SCM","SSELFIELD_CATEGORY_SCM"),3); varset( M("SSELFIELDW_KATEGORIE_SCM","SSELFIELDW_CATEGORY_SCM"),0); varset( M("SSELFIELD_HERSTELLER_SCM","SSELFIELD_MANUFACTURER_SCM"),3); varset( M("SSELFIELDW_HERSTELLER_SCM","SSELFIELDW_MANUFACTURER_SCM"),0); varset( M("SSELFIELD_BIBLIOTHEK_SCM","SSELFIELD_LIBRARY_SCM"),3); varset( M("SSELFIELDW_BIBLIOTHEK_SCM","SSELFIELDW_LIBRARY_SCM"),0); } if (PDFFILE!="") { if (PDFCOMMAND=="") getextprog(".pdf",PDFCOMMAND); if (DOCCOMMAND=="") getextprog(".doc",DOCCOMMAND); } if (WWWCOMMAND=="") getextprog(".htm",WWWCOMMAND); // Get the status description list for (statdn=0;statdn<1000;statdn++) { if ((statdl[statdn].val=bae_inistrval( bae_inifieldvarname(PAR_STATUSL,statdn,0),""))=="") break; if (statdl[statdn].val==" ") statdl[statdn].val=""; statdl[statdn].proc=bae_iniintval( bae_inifieldvarname(PAR_STATUSL,statdn,1),0); statdl[statdn].msg=bae_inistrval( bae_inifieldvarname(PAR_STATUSL,statdn,2),""); } // Get the basket display attribute list for (bdattrn=0;bdattrn<100;bdattrn++) { if ((bdattrl[bdattrn]=bae_inistrval( bae_iniarrayvarname(PAR_SSELBALST,bdattrn),""))=="") { // Check if list defined at all if (bdattrn==0) { // Use default printer device name list bdattrl=defbdattrl; bdattrn=arylength(bdattrl); } break; } } // Get the key attribute ID curid=(-1); sprintf(sqlcommand,AI_SELECT,sql_quotestr(ATTRKEY)); if (sqlcmd(attrdb,sqlcommand,idfunc)!=0) // SQL/DB error sql_dberror(0); keyid=curid; // Query the current active variant if (cap_rulequery(RS_OCSCMDB,0,RS_SCMSUBJ,RS_VARIANT,"?d",act_var)<1) // Set default variant act_var=0; // Query variant count varn=1; sqlcmd(ddbfname,V_SELECT,varfunc); // Create/init report column info database file if (sqlinit(WPOSDB,0)==(-1) && sqlinit(WPOSDB,1)==(-1)) // SQL/DB creation error errormsg(ERRDBINIT,WPOSDB); // Create tables in database if (sqlcmd(WPOSDB,W_HELP,NULL)!=0) if (sqlcmd(WPOSDB,W_CREATE1+W_CREATE2,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); } int varfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Variant 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 if new max. variant number if (dint>=varn) varn=dint+1; // Return without errors return(0); } void initselstack() /* // Init. the selection stack */ { string varname /* Variable name */; int i /* Loop control variable */; // Check selection stored if (varget(GV_SELSTKN,selstkn)) { // Init. the selection stack selstk[0].typ=0; selstk[0].id=0; selstk[0].name=UPRTOP; selstkn=1; varset(GV_SELAIDX,-1); } else { // Get last selection stack for (i=0;i=0 && i=6 && actcode<=(selstkn+4)) { selstkn=actcode-5; storeselstack(); break; } if (actcode!=(-2)) exit(0); } if (actcode!=(-2)) return; } if (varget(GV_SITEMFIELD,lbidx)==0) error(ERRDBLSBOX); // Check if dialog box support if (bae_dialclr()) error(ERRNOWIN); baseheight= DIAL_TOPMARG+DIAL_BUTVSTEP+2.0*DIAL_SEPVSTEP+DIAL_CTRVSTEP+0.2; dialwidth=1.0+bae_dialgettextlen(0,UPRFCT01)+ bae_dialgettextlen(0,UPRSEARCHBUT)+bae_dialgettextlen(0,UPRUPDATEBUT)+ bae_dialgettextlen(0,UPRDOCBUT)+5.0*ABUTXSTEP; butx=0.0; for (i=0;i<(selstkn-1);i++) { width= i==0 ? TOPBWIDTH : BUTWIDTH; if (width==0.0) butx+=bae_dialgettextlen(0,selstk[i].name); butx+= i==0 ? TOPBXSTEP : BUTXSTEP; butx+=SEPXSTEP; } if (dialwidth>butx) butx=dialwidth; boxid=bae_iniintval(PAR_MODALBOX,0) ? (PA_MODALBOX|3044) : 3044; dial_getboxsizemin(boxid,dialwidth,dialheight, DIAL_LEFTMARG+SELBOXWIDTH+DIAL_RIGHTSMARG,baseheight+SELBOXHEIGHT, DIAL_LEFTMARG+butx+DIAL_RIGHTSMARG,baseheight+2.0); SELBOXWIDTH=dialwidth-DIAL_LEFTMARG-DIAL_RIGHTSMARG; // Get selection entries seln=0; sprintf(sqlcommand,S_SELECT,selstk[selstkn-1].id); if (sqlcmd(attrdb,sqlcommand,selfunc)!=0) // SQL/DB error sql_dberror(0); // Check if single entry if (seln==1) { // Autoselect entry selstk[selstkn]=sell[0]; selstkn++; return; } // Store symbol pool button butx=DIAL_LEFTMARG+1.0; bae_dialaddcontrol( PA_ACT,0,5,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT01); butx+=bae_dialgettextlen(0,UPRFCT01)+ABUTXSTEP; // Store search mask button bae_dialaddcontrol( PA_ACT,0,2,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRSEARCHBUT); butx+=bae_dialgettextlen(0,UPRSEARCHBUT)+ABUTXSTEP; // Store update button bae_dialaddcontrol(PA_ACT|(ATTRKEY!="" ? 0 : PA_GRAYED), 0,3,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRUPDATEBUT); butx+=bae_dialgettextlen(0,UPRUPDATEBUT)+ABUTXSTEP; // Store document button bae_dialaddcontrol(PA_ACT|((selstkn==1 && ((WWWLINK!="" && WWWCOMMAND!="") || (PDFFILE!="" && (PDFCOMMAND!="" || DOCCOMMAND!="")))) ? 0 : PA_GRAYED),0,4,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRDOCBUT); cy+=DIAL_BUTVSTEP; dial_hsep(cy); // Display selection history buttons butx=DIAL_LEFTMARG; for (i=0;i<(selstkn-1);i++) { // Store entry button width= i==0 ? TOPBWIDTH : BUTWIDTH; bae_dialaddcontrol(PA_ACT,0,i+6,0,0.0,0.0,0.0,"", 0,butx,cy,width,selstk[i].name); if (width==0.0) butx+=bae_dialgettextlen(0,selstk[i].name); butx+= i==0 ? TOPBXSTEP : BUTXSTEP; // Store seperator dial_label(butx,cy,"/"); butx+=SEPXSTEP; } // Store selection label dial_label(butx,cy,selstk[selstkn-1].name); cy+=DIAL_CTRVSTEP; // Store list box lbidx=bae_dialadvcontrol(PA_LB|PA_SCALLBACK|PA_HSCROLL|PA_HBRDREL| PA_VBRDREL,(-1),0,(-1),0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); // Store list box entries for (i=0;i=0 && curattridx0) { bae_msgbox(1,ERRVARFUNC,""); break; } if (AUTOCLOSE==1) { vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); if (dialsupport&DIAL_LIST) tabcolstore( selstk[selstkn-1].id); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); storeselstack(); varset(GV_SELAIDX,aidx); } mousegrab(1); plcnewsymbol(curattridx); if (!AUTOCLOSE) nameupdate(boxidx); break; // Place into symbol pool case 9 : bae_dialsetcurrent(boxidx); bae_dialsetdata( cntidx,PA_INT|PA_CHKLL,1,0.0,""); bae_dialsetcurrent(0); if (symbolpooladd(scnt,curattridx,"")) { boxbuf=bae_dialboxbufstore(); symbolpool(1); bae_dialboxbufload(boxbuf); } break; default : } exit(0); // Search case 6 : vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); if (dialsupport&DIAL_LIST) tabcolstore(selstk[selstkn-1].id); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); searchmask(); exit(0); // Update symbol preview case 8 : varset(GV_SELAIDX,aidx); sympreview(boxidx,aidx,0); exit(0); default : vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); if (dialsupport&DIAL_LIST) tabcolstore(selstk[selstkn-1].id); bae_dialclr(); bae_dialsetcurrent(0); if (actcode>=1000 || actcode==(-2) || actcode==10) { if (actcode>=1000) { sortidx=actcode-1000; LISTSORT=1; } update= actcode==10 ? 2 : 1; break; } // Quit/Abort bae_clriactqueue(); storeselstack(); varset(GV_SELAIDX,aidx); if (actcode>=11 && actcode=0) cursidx=sortidx; // Get the data ID list attrn=0; sprintf(sqlcommand,DI_SELECT,selstk[selstkn-1].id); if (sqlcmd(attrdb,sqlcommand,datidlfunc)!=0) // SQL/DB error sql_dberror(0); // Get data fields for (curtf=0;curtftfl[curtf].width) tfl[curtf].width=dcnt; } } sprintf(varname,GV_TABNAME,curtf); varset(varname,tfl[curtf].name); sprintf(varname,GV_TABATTR,curtf); varset(varname,tfl[curtf].attr); sprintf(varname,GV_TABNMODE,curtf); varset(varname,tfl[curtf].nmode); sprintf(varname,GV_TABAMODE,curtf); varset(varname,tfl[curtf].amode); sprintf(varname,GV_TABWIDTH,curtf); varset(varname,tfl[curtf].width); sprintf(varname,GV_TABCOL,curtf); varset(varname,-1); sprintf(varname,GV_TABFID,curtf); varset(varname,tfl[curtf].fid); sprintf(varname,GV_TABAID,curtf); varset(varname,tfl[curtf].aid); sprintf(varname,GV_TABREAD,curtf); varset(varname,tfl[curtf].read); } varset(GV_TABN,tfn); varset(GV_ATTRN,attrn); // Terminate cached file access if (sqlcmd(attrdb,C_OFF,NULL)!=0) // SQL/DB error sql_dberror(0); // Store function buttons butx=DIAL_LEFTMARG+1.0; bae_dialaddcontrol(PA_ACT,0,0,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT00); butx+=bae_dialgettextlen(0,UPRFCT00)+ABUTXSTEP; anidx=bae_dialaddcontrol( PA_TOGGLE,0,0,NAMEMODE,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRAUTONAME); butx+=bae_dialgettextlen(0,UPRAUTONAME)+ABUTXSTEP+2.0; acidx=bae_dialaddcontrol(PA_TOGGLE,0,0,AUTOCLOSE ? 1 : 0, 0.0,0.0,0.0,"",0,butx,cy,0.0,UPRAUTOCLOSE); butx+=bae_dialgettextlen(0,UPRAUTOCLOSE)+ABUTXSTEP+2.0; cntidx=bae_dialaddcontrol( PA_INT|PA_CHKLL,0,0,1,0.0,0.0,0.0,"",20,butx,cy,4.0,""); butx+=4.0; bae_dialaddcontrol(PA_ACT,0,9,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT01); butx+=bae_dialgettextlen(0,UPRFCT01)+ABUTXSTEP; bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT02); butx+=bae_dialgettextlen(0,UPRFCT02)+ABUTXSTEP; bae_dialaddcontrol(PA_ACT,0,3,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT03); butx+=bae_dialgettextlen(0,UPRFCT03)+ABUTXSTEP; bae_dialaddcontrol(PA_ACT|(ATTRKEY!="" ? 0 : PA_GRAYED), 0,4,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT04); butx+=bae_dialgettextlen(0,UPRFCT04)+ABUTXSTEP; // Store document button bae_dialaddcontrol(PA_ACT|(((WWWLINK!="" && WWWCOMMAND!="") || (PDFFILE!="" && (PDFCOMMAND!="" || DOCCOMMAND!=""))) ? 0 : PA_GRAYED), 0,5,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRDOCBUT); butx+=bae_dialgettextlen(0,UPRDOCBUT)+ABUTXSTEP; // Store search mask button bae_dialaddcontrol( PA_ACT,0,6,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRSEARCHBUT); butx+=bae_dialgettextlen(0,UPRSEARCHBUT)+ABUTXSTEP; // Store trim button if (dialsupport&DIAL_LIST) bae_dialaddcontrol( PA_ACT,0,10,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRTRIMBUT); cy+=DIAL_BUTVSTEP; dial_hsep(cy); // Display selection history buttons butx=DIAL_LEFTMARG; for (i=0;i<(selstkn-1);i++) { // Store entry button width= i==0 ? TOPBWIDTH : BUTWIDTH; bae_dialaddcontrol(PA_ACT,0,i+11,0,0.0,0.0,0.0,"", 0,butx,cy,width,selstk[i].name); if (width==0.0) butx+=bae_dialgettextlen(0,selstk[i].name); butx+= i==0 ? TOPBXSTEP : BUTXSTEP; // Store seperator dial_label(butx,cy,"/"); // Reserve seperator space butx+=SEPXSTEP; } // Store selection label dial_label(butx,cy,selstk[selstkn-1].name); cy+=DIAL_CTRVSTEP; // Build header label header=tabhead(); if (FIELDDISP!=2 && (dialsupport&DIAL_LIST)==0) { bae_dialaddcontrol(PA_LAB|(FIELDDISP!=0 ? PA_FNTFIX : 0), 0,0,0,0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,0.0,header); cy+=DIAL_TXTVSTEP; } if (PICBOXWIDTH!=0.0) { sprintf(buf,REPLIB,"-"); h1idx=bae_dialaddcontrol(PA_LAB,0,0,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SELBOXWIDTH+1.0,cy,PICBOXWIDTH-1.0,buf); sprintf(buf,REPSYM,"-"); h2idx=bae_dialaddcontrol(PA_LAB,0,0,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SELBOXWIDTH+1.0,cy+DIAL_TXTVSTEP, PICBOXWIDTH-1.0,buf); // Store the symbol display label picheight=dialheight-cy-2.0*DIAL_TXTVSTEP-DIAL_SEPVSTEP; bmlabidx=bae_dialadvcontrol(PA_BMLAB|PA_HBRDREL|PA_VBRDREL,0,0, 29,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SELBOXWIDTH+1.0,cy+2.0*DIAL_TXTVSTEP, DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); bae_dialbmpalloc(PICBOXWIDTH-1.0,picheight,29,0,0); } // Get last attribute selection if (!LASTSEL || varget(GV_SELAIDX,aidx)) aidx=(-1); if (dialsupport&DIAL_LIST) { // Query the column header width values if (update==2 || AUTOTRIM) { tabcoltrim(); } else { sprintf(sqlcommand,W_SELECT,sql_quotestr(tabspec())); if (sqlcmd(WPOSDB,sqlcommand,colwfunc)!=0) sql_dberror(0); } lbidx=bae_dialadvcontrol(PA_LV|PA_SCALLBACK|PA_VBRDREL| (PICBOXWIDTH!=0.0 ? PA_MCALLBACK : 0),(-1),8,aidx,0.0,0.0,0.0, "",0,DIAL_LEFTMARG,cy,SELBOXWIDTH,DIAL_SEPVSTEP,""); tabcolhead(); if (LISTSORT) { // Store list box entries for (curattridx=0;curattridx=0) klist[curattridx]= attrl[curattridx][cursidx]; } if (cursidx>=0) quicksort(etransl,attrn,keycmp); else quicksort(etransl,attrn,entrycmp); for (curattridx=0;curattridx=0) klist[curattridx]= attrl[curattridx][cursidx]; } if (cursidx>=0) quicksort(etransl,attrn,keycmp); else quicksort(etransl,attrn,entrycmp); for (curattridx=0;curattridxidx2 // Parameters : // int idx1 : First compare index // int idx2 : Second compare index */ { // Return compare result return(numstrcmp(elist[idx1],elist[idx2])); } static int keycmp(int idx1,int idx2) /* // Key value compare function // Return value : // (-1) if idx1idx2 // Parameters : // int idx1 : First compare index // int idx2 : Second compare index */ { // Return compare result return(numstrcmp(klist[idx1],klist[idx2])); } void searchmask() /* // Select attributes with search mask from database */ { string attrcommn /* Attribute comment name */; string attrcommv /* Attribute comment value */; string aname /* Attribute name */; string name /* Field name */; string lname /* Lowercase field name */; int nbutidx /* Next button index */; int pbutidx /* Previous button index */; int nlidxl[] /* Field name label index list */; int nvidxl[] /* Field name value index list */; int sfidx /* Current search field index */; double cy = DIAL_TOPMARG /* Current y value */; double butx = DIAL_LEFTMARG+1.0 /* Dialog box button x coordinate */; int id /* Current ID */; int typ /* Current type */; int sefn /* Search edit field count */; string varname /* Variable name */; int actcode /* Action code */; int reason /* Callback reason */; int intval /* Dialog box item integer value */; int i, j /* Loop control variables */; // Check for cached search data if (varget(GV_SEARCHN,sfn)) sfn=0; for (i=0;i0 && sfn>SEDITN) ? 0 : PA_GRAYED), 0,0.0,""); bae_dialsetdata(nbutidx,PA_ACT|(((nlsidx+SEDITN)SEDITN) ? 0 : PA_GRAYED),0,0.0,""); // Build the attribute table menu for (i=0;i=0) { if ((tfl[i].amode&2)==0) continue; id=tfl[i].aid; aname=tfl[i].attr; // Build comment variable name sprintf(attrcommn,PAR_ATTRCOMMP, strextract(aname,1,strlen(aname))); strupper(attrcommn); // Query comment variable if (varget(attrcommn,attrcommv)==0 && attrcommv!="") // Att. comm. to variable name sprintf(name,"%s %s", aname,attrcommv); else name=aname; typ=1; } else { if ((tfl[i].nmode&2)==0) continue; id=tfl[i].fid; aname=name=tfl[i].name; typ=0; } strlower(lname=name); if (ATTRSORT) { for (j=sfn;j>0;j--) if (sfl[j-1].lowname>lname) sfl[j]=sfl[j-1]; else break; sfl[j].val=""; sfl[j].id=id; sfl[j].aname=aname; sfl[j].name=name; sfl[j].lowname=lname; sfl[j].typ=typ; } else { sfl[sfn].val=""; sfl[sfn].id=id; sfl[sfn].aname=aname; sfl[sfn].name=name; sfl[sfn].lowname=lname; sfl[sfn].typ=typ; } sfn++; } } else { ntyp=0; if (sqlcmd(attrdb,F_SELECT,namelfunc)!=0) // SQL/DB error sql_dberror(0); ntyp=1; if (sqlcmd(attrdb,A_SELECT,namelfunc)!=0) // SQL/DB error sql_dberror(0); for (i=0;i0 && sfn>SEDITN) ? 0 : PA_GRAYED), 0,2,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRPREVDIAL); butx+=bae_dialgettextlen(0,UPRPREVDIAL)+ABUTXSTEP; nbutidx=bae_dialaddcontrol( PA_ACT|(((nlsidx+SEDITN)SEDITN) ? 0 : PA_GRAYED), 0,3,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRNEXTDIAL); butx+=bae_dialgettextlen(0,UPRNEXTDIAL)+ABUTXSTEP; bae_dialaddcontrol( PA_ACT,0,4,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRALLRES); butx+=bae_dialgettextlen(0,UPRALLRES)+ABUTXSTEP; // Store selection button bae_dialaddcontrol( PA_ACT,0,5,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRSELECTBUT); butx+=bae_dialgettextlen(0,UPRSELECTBUT)+DBUTSPACE; if (butx0) { strlower(val); for (i=0;i=0;j--) // Check if pattern character if (val[j]=='*') { val[j]='%'; patflag=1; } else if (val[j]=='?') { patflag=1; } // Build the query string sprintf(sqlcommand,sfl[i].typ ? DA_SELECT : DF_SELECT, sfl[i].id); if (AUTOPATTERN) sqlcommand=sqlcommand+" LIKE '%"+val+"%';"; else if (patflag) sqlcommand=sqlcommand+" LIKE '"+val+"';"; else sqlcommand=sqlcommand+"='"+val+"';"; // Clear all found flags if (smode==0 && qcnt>0) for (j=0;j0) { // Purge result list for (j=0,dstidx=0;j0) { bae_msgbox(1,ERRVARFUNC,""); break; } if (AUTOCLOSE==1) { vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); } mousegrab(1); plcnewsymbol(0); if (!AUTOCLOSE) nameupdate(boxidx); break; // Place into symbol pool case 10 : bae_dialsetcurrent(boxidx); bae_dialsetdata( cntidx,PA_INT|PA_CHKLL,1,0.0,""); bae_dialsetcurrent(0); if (symbolpooladd(scnt,0,"")) { boxbuf=bae_dialboxbufstore(); symbolpool(1); bae_dialboxbufload(boxbuf); } break; default : } exit(0); // New search case 6 : vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); searchmask(); exit(0); // New selection case 7 : vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); return; // Update symbol preview case 9 : sympreview(boxidx,aidx,1); exit(0); // Quit/Abort case (-1) : default : vardelete(GV_SITEMFIELD); vardelete(GV_SAUTONAME); vardelete(GV_SAUTOCLOSE); vardelete(GV_CNTFIELD); vardelete(GV_H1FIELD); vardelete(GV_H2FIELD); vardelete(GV_BMFIELD); vardelete(GV_BMHEIGHT); vardelete(GV_NAMEPAT); vardelete(GV_SBOXID); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); } if (actcode!=(-2)) return; } // Check if dialog box support if (bae_dialclr()) error(ERRNOWIN); baseheight=DIAL_TOPMARG+DIAL_BUTVSTEP+DIAL_SEPVSTEP+0.2; boxid=bae_iniintval(PAR_MODALBOX,0) ? (PA_MODALBOX|(SBOXID ? 3044 : 3047)) : (SBOXID ? 3044 : 3047); dial_getboxsizemin(boxid,dialwidth,dialheight, DIAL_LEFTMARG+SELBOXWIDTH+PICBOXWIDTH+DIAL_RIGHTSMARG, baseheight+SELBOXHEIGHT, DIAL_LEFTMARG+9.0+bae_dialgettextlen(0,UPRFCT00)+ bae_dialgettextlen(0,UPRAUTOCLOSE)+bae_dialgettextlen(0,UPRAUTONAME)+ bae_dialgettextlen(0,UPRFCT01)+bae_dialgettextlen(0,UPRFCT02)+ bae_dialgettextlen(0,UPRFCT03)+bae_dialgettextlen(0,UPRFCT04)+ bae_dialgettextlen(0,UPRDOCBUT)+bae_dialgettextlen(0,UPRSEARCHBUT)+ bae_dialgettextlen(0,UPRSELECTBUT)+10.0*ABUTXSTEP+DIAL_RIGHTSMARG, baseheight+5.0); SELBOXWIDTH=dialwidth-DIAL_LEFTMARG-PICBOXWIDTH-DIAL_RIGHTSMARG; // Store list box cy=DIAL_TOPMARG; // Store function buttons butx=DIAL_LEFTMARG+1.0; bae_dialaddcontrol(PA_ACT,0,0,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT00); butx+=bae_dialgettextlen(0,UPRFCT00)+ABUTXSTEP; anidx=bae_dialaddcontrol( PA_TOGGLE,0,0,NAMEMODE,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRAUTONAME); butx+=bae_dialgettextlen(0,UPRAUTONAME)+ABUTXSTEP+2.0; acidx=bae_dialaddcontrol( PA_TOGGLE,0,0,AUTOCLOSE,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRAUTOCLOSE); butx+=bae_dialgettextlen(0,UPRAUTOCLOSE)+ABUTXSTEP+2.0; cntidx=bae_dialaddcontrol( PA_INT|PA_CHKLL,0,0,1,0.0,0.0,0.0,"",20,butx,cy,4.0,""); butx+=4.0; bae_dialaddcontrol(PA_ACT,0,10,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT01); butx+=bae_dialgettextlen(0,UPRFCT01)+ABUTXSTEP; bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT02); butx+=bae_dialgettextlen(0,UPRFCT02)+ABUTXSTEP; bae_dialaddcontrol(PA_ACT,0,3,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT03); butx+=bae_dialgettextlen(0,UPRFCT03)+ABUTXSTEP; bae_dialaddcontrol(PA_ACT|(ATTRKEY!="" ? 0 : PA_GRAYED), 0,4,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRFCT04); butx+=bae_dialgettextlen(0,UPRFCT04)+ABUTXSTEP; // Store document button bae_dialaddcontrol(PA_ACT|(((WWWLINK!="" && WWWCOMMAND!="") || (PDFFILE!="" && (PDFCOMMAND!="" || DOCCOMMAND!=""))) ? 0 : PA_GRAYED), 0,5,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRDOCBUT); butx+=bae_dialgettextlen(0,UPRDOCBUT)+ABUTXSTEP; // Store search button bae_dialaddcontrol( PA_ACT,0,6,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRSEARCHBUT); butx+=bae_dialgettextlen(0,UPRSEARCHBUT)+ABUTXSTEP; // Store selection button bae_dialaddcontrol( PA_ACT,0,7,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRSELECTBUT); cy+=DIAL_BUTVSTEP; if (PICBOXWIDTH!=0.0) { sprintf(buf,REPLIB,"-"); h1idx=bae_dialaddcontrol(PA_LAB,0,0,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SELBOXWIDTH+1.0,cy,PICBOXWIDTH-1.0,buf); sprintf(buf,REPSYM,"-"); h2idx=bae_dialaddcontrol(PA_LAB,0,0,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SELBOXWIDTH+1.0,cy+DIAL_TXTVSTEP, PICBOXWIDTH-1.0,buf); // Store the symbol display label picheight=dialheight-cy-2.0*DIAL_TXTVSTEP-DIAL_SEPVSTEP; bmlabidx=bae_dialadvcontrol(PA_BMLAB|PA_HBRDREL|PA_VBRDREL,0,0, 29,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SELBOXWIDTH+1.0,cy+2.0*DIAL_TXTVSTEP, DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); bae_dialbmpalloc(PICBOXWIDTH-1.0,picheight,29,0,0); } lbmode= (PA_LB|PA_SCALLBACK|(FIELDDISP!=0 ? PA_FNTFIX : 0)| (FIELDDISP==2 ? PA_HSCROLL : 0)|PA_VBRDREL| (PICBOXWIDTH!=0.0 ? PA_MCALLBACK : 0)); lbidx=bae_dialadvcontrol(lbmode,(-1),9,(-1),0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,SELBOXWIDTH,DIAL_SEPVSTEP,""); // Set cached file access if (sqlcmd(attrdb,C_READ,NULL)!=0) // SQL/DB error sql_dberror(0); // Build the result selection list lheader=""; varset(GV_RESN,resn); for (i=0,lastparent=(-1);i0;i--) if (docufile[i]=='.') { // Check the file extension docuext=strextract(docufile,i,len); strlower(docuext); if (docuext==".doc") { docucmd=DOCCOMMAND; documenu=UPRSELDOC0D; } else if (docuext!=".pdf") { getextprog(docuext,docucmd); sprintf(documenu,UPRSELDOC0E,docuext); } break; } if (bae_swversion(4)=="\\") for (i=0;i=0) bae_dialsetdata(h1idx,PA_LAB,0,0.0,hd1); if (h2idx>=0) bae_dialsetdata(h2idx,PA_LAB,0,0.0,hd2); if (bmlabidx>=0) { bae_dialbmpalloc(labwidth,labheight,29,0,0); bae_dialsetdata(bmlabidx,PA_BMLAB,29,0.0,""); } bae_dialsetcurrent(0); vardelete(GV_NAMEPAT); return; } if (PICBOXWIDTH==0.0) return; if (attrmode) { // Get search result data curattridx=0; gettabstruc(resl[itemid].parent); for (curtf=0;curtfwsydim ? wsxdim : wsydim)*0.05; if (bmp_setsize(wslx-wsbrd,wsuy+wsbrd, wsux+wsbrd,wsly-wsbrd,labwidth,labheight,xoff,yoff) || bae_dialbmpalloc(PICBOXWIDTH-1.0,picheight,29,0,0)!=29) return; // Draw the picture label bitmap bae_popsetarea(29); // Set the dash base length btp_setdashlen(0.002,0.4); // Scan object data if (DISPTEXT) { if (cap_scanpool(pool, xoff-pool.MACRO.MNX,yoff-pool.MACRO.MNY, 0.0,1,NULL,NULL,polyfunc,textfunc)!=0) { // Release the macro element bae_popsetarea(0); cap_macrelease(pool); error_scan(); } } else { if (cap_scanpool(pool, xoff-pool.MACRO.MNX,yoff-pool.MACRO.MNY, 0.0,1,NULL,NULL,polyfunc,NULL)!=0) { bae_popsetarea(0); // Release the macro element cap_macrelease(pool); error_scan(); } } bae_popsetarea(0); nextname=pool.MACRO.PNAMEPAT; varset(GV_NAMEPAT,nextname); nameupdate(boxidx); // Release the macro element cap_macrelease(pool); } // Store the symbol data labels bae_dialsetcurrent(boxidx); if (h1idx>=0) bae_dialsetdata(h1idx,PA_LAB,0,0.0,hd1); if (h2idx>=0) bae_dialsetdata(h2idx,PA_LAB,0,0.0,hd2); if (bmlabidx>=0) bae_dialsetdata(bmlabidx,PA_BMLAB,29,0.0,""); bae_dialsetcurrent(0); } void nameupdate(int boxidx) /* // Symbol next name update // Parameter : // int boxidx : Dialog box index */ { string nextname /* Next symbol name */; if (anidx<0) return; if (varget(GV_NAMEPAT,nextname)!=0 || scm_getstrpar(10,nextname)!=0) nextname=""; bae_dialsetcurrent(boxidx); bae_dialsetdata(anidx,PA_TOGGLE,NAMEMODE,0.0, nextname=="" ? UPRAUTONAME : nextname); bae_dialsetcurrent(0); } void gettabstruc(int tabid) /* // Get table structure */ { string varname /* Variable name */; int mode = 0 /* Process mode */; tfn=0; cursidx=(-1); curstidx=(-1); sprintf(sqlcommand,T_SELECT,tabid); if (sqlcmd(attrdb,sqlcommand,tabstrucfunc)!=0) // SQL/DB error sql_dberror(0); // Get data fields for (curtf=0;curtf=0) { curname=""; sprintf(sqlcommand,AN_SELECT,tfl[curtf].aid); if (sqlcmd(attrdb,sqlcommand,namefunc)!=0) // SQL/DB error sql_dberror(0); tfl[curtf].attr=curname; if (curname!="") { strupper(curname); sprintf(varname,PAR_SSELATTR, strextract(curname,1,strlen(curname))); if (varget(varname,mode)!=0) mode=DEFATTRMODE; } else { mode=0; } tfl[curtf].amode=mode; } else { tfl[curtf].attr=""; tfl[curtf].amode=0; } curname=""; sprintf(sqlcommand,FN_SELECT,tfl[curtf].fid); if (sqlcmd(attrdb,sqlcommand,namefunc)!=0) // SQL/DB error sql_dberror(0); tfl[curtf].name=curname; tfl[curtf].colw=0.0; tfl[curtf].colctrl=(-1); if (curname!="") { if (curname==SORTFIELD) cursidx=curtf; if (curname==STATUSFIELD) curstidx=curtf; strupper(curname); if (curname[0]=='$') { sprintf(varname,PAR_SSELATTRW, strextract(curname,1,strlen(curname))); if (varget(varname,tfl[curtf].width)) tfl[curtf].width=DEFFIELDWIDTH; mode=0; } else { sprintf(varname,PAR_SSELFIELDW,curname); if (varget(varname,tfl[curtf].width)) tfl[curtf].width=DEFFIELDWIDTH; sprintf(varname,PAR_SSELFIELD,curname); if (varget(varname,mode)) { if (tfl[curtf].name==SYMFIELD) mode=3; else if (tfl[curtf].name==LIBFIELD || tfl[curtf].name==PDFFILE || tfl[curtf].name==WWWLINK) mode=2; else mode=DEFFIELDMODE; } } } else { mode=0; tfl[curtf].width=DEFFIELDWIDTH; } tfl[curtf].nmode=mode; tfl[curtf].read= ((mode&1) || (tfl[curtf].amode&1) || tfl[curtf].name==LIBFIELD || tfl[curtf].name==SYMFIELD || curtf==cursidx || curtf==curstidx) ? 1 : 0 ; } } static void getsymdata(int attridx,string libname=DEFSYMLIB,string symname="") /* // Get symbol data // Parameters : // int attridx : Attribute index // string libname : Library name // string symname : Symbol name */ { int i /* Loop control variable */; symname=""; // Get library and symbol name for (i=0;i0;i--) if (sell[i-1].name>dstr) sell[i]=sell[i-1]; else break; sell[i]=cursel; break; case 2 : for (i=seln;i>0;i--) if (numstrcmp(sell[i-1].name,dstr)>0) sell[i]=sell[i-1]; else break; sell[i]=cursel; break; default : sell[seln]=cursel; } seln++; break; } // Return without errors return(0); } int namefunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Any name 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 */ { // Get name curname=dstr; // Return without errors return(0); } int namelfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Name list 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 */ { string lname /* Lowercase field name */; int mode = 0 /* Process mode */; int i /* Loop control variable */; switch (didx) { // Name ID case 1 : curid=dint; break; // Selection ID case 2 : // Build process mode variable name strupper(curname=dstr); if (ntyp) { sprintf(curname,PAR_SSELATTR, strextract(curname,1,strlen(curname))); if (varget(curname,mode)) mode=DEFATTRMODE; } else { sprintf(curname,PAR_SSELFIELD,curname); if (varget(curname,mode)) { if (dstr==SYMFIELD) mode=3; else mode=DEFFIELDMODE; } } // Query search process mode if ((mode&2)==2) { // Store name sorted to list strlower(lname=dstr); if (ntyp) { for (i=0;i=lname) break; if (i0;i--) if (sfl[i-1].lowname>lname) sfl[i]=sfl[i-1]; else break; sfl[i].val=""; sfl[i].id=curid; sfl[i].aname=dstr; sfl[i].name=dstr; sfl[i].lowname=lname; sfl[i].typ=ntyp; sfn++; } break; } // Return without errors return(0); } int resfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Name list 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 */ { int slb = 0 /* Search lower boundary */; int sub = resn-1 /* Search upper boundary */; int sidx /* Search index */; int compres /* Compare result */; int i /* Loop control variable */; switch (didx) { // Data ID case 1 : seldatid=dint; break; // Selection ID case 2 : // Loop until search area empty while (slb<=sub) { // Get the search index sidx=(slb+sub)>>1; // Compare levels if ((compres=dint-resl[sidx].parent)==0 && (compres=seldatid-resl[sidx].datid)==0) { // Data set found resl[sidx].found=1; return(0); } // Update the search area if (compres<0) sub=sidx-1; else slb=sidx+1; } if (selmode==0) { // Update result list for (i=resn;i>slb;i--) resl[i]=resl[i-1]; resl[slb].parent=dint; resl[slb].datid=seldatid; resl[slb].found=0; resn++; } break; } // Return without errors return(0); } int datidlfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Data ID 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 */ { // Get data ID datidl[attrn]=dint; attrn++; // Return without errors return(0); } int sresfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Single result 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) { // Data ID case 1 : seldatid=dint; break; // Selection ID case 2 : curid=dint; break; } // Return without errors return(0); } int colwfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Column width 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 */ { switch (didx) { // Column field index case 1 : curtf=dint; break; // Column width ID case 2 : tfl[curtf].colw=ddbl; break; } // Return without errors return(0); } int docufunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Document query result 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) { // Document file spec. case 1 : attrval=dstr; break; // Selection ID case 2 : curid=dint; break; } // Return without errors return(0); } int idfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Any ID 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 */ { // Get ID curid=dint; // Return without errors return(0); } int attrfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Attribute 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 */ { // Get ID attrl[curattridx][curtf]=dstr; // Return without errors return(0); } int attrvalfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Attribute 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 */ { // Attribute value attrval=dstr; // Return without errors return(0); } int tabstrucfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Table structure 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 */ { switch (didx) { // Field index case 1 : curtf=dint; if (curtf>=tfn) tfn=curtf+1; break; // Attribute ID case 2 : tfl[curtf].aid=dint; break; // Field ID case 3 : tfl[curtf].fid=dint; break; } // Return without errors return(0); } int mapfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Mapping 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 */ { switch (didx) { // Symbol name case 1 : strlower(dstr); mapl[mapn].name=dstr; break; // Symbol count case 2 : mapl[mapn].cnt=dint; break; // Library name case 3 : mapl[mapn].libname=dstr; break; // Requested library name case 4 : mapl[mapn].rlname=dstr; break; // Mapping attribute ID case 5 : mapl[mapn].id=dint; mapn++; break; } // Return without errors return(0); } int symfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Symbol pool 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 */ { switch (didx) { // Symbol name case 1 : // Store sorted to list for (cursym=symn;cursym>0;cursym--) if (numstrcmp(syml[cursym-1].name,dstr)>0) syml[cursym]=syml[cursym-1]; else break; syml[cursym].name=dstr; break; // Symbol basket ID case 2 : syml[cursym].id=dint; break; // Symbol count case 3 : syml[cursym].cnt=dint; break; // Library name case 4 : syml[cursym].libname=dstr; break; // Requested library name case 5 : syml[cursym].rlname=dstr; break; // Mapping attribute id case 6 : syml[cursym].mapid=dint; symn++; break; } // Return without errors return(0); } int symattrfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Symbol pool 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 */ { if (dstr!="") syml[cursym].attr+=","+dstr; // Return without errors return(0); } int attrassfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Symbol attribute 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 */ { switch (didx) { // Attribute name case 1 : vall[valn].name=dstr; break; // Attribute value case 2 : vall[valn].val=dstr; valn++; break; } // Return without errors return(0); } static void plcnewsymbol(int attridx) /* // Place new symbol and transfer the selected attributes to it // Parameters : // int attridx : Attribute index */ { index C_FIGURE newfig /* New figure list element */; index C_FIGURE lastfig /* Last figure list element */; int lastflag /* Last figure element known flag */; string refname = "" /* Reference name */; string libname /* Library name */; string rlname = "" /* Requested library name */; string symname /* Symbol name */; string msg /* Message */; int oldnameprompt /* Old name prompt mode */; int lastidx = 0 /* Last attribute index */; int first = 1 /* First attribute flag */; int i /* Loop control variable */; // Get library and symbol name getsymdata(attridx,libname,symname); // Check if mapping symbol selection if (mapn) if (selmapping(libname,rlname,symname)!=0) return; // Get last placed element lastflag= cap_lastfigelem(lastfig)==0 ? 1 : 0 ; // Get new reference name if (!NAMEMODE && (refname=askstr(UPRASKREF,MAXKEYLEN))==UINPOPABORT) error_abort(); // Disable symbol pool query varset(GV_SYMPDIS,1); bae_clriactqueue(); bae_storetextiact(1,refname); if (libname=="") bae_storetextiact(1,symname); else bae_storetextiact(1,libname+"/"+symname); scm_getintpar(8,oldnameprompt); scm_setintpar(8,1); bae_callmenu(MNU_SCMADDSYM); scm_setintpar(8,oldnameprompt); // Reenable symbol pool query vardelete(GV_SYMPDIS); // Check if symbol successfully placed scm_getstrpar(1,refname); if (cap_lastfigelem(newfig)==0 && (!lastflag || newfig!=lastfig) && cap_nrefsearch("",newfig)==0 && newfig.NAME==refname) { // Search last attribute index if (rlname!="") { lastidx=(-1); } else { for (i=0;i=valn && !NAMEMODE && (refname=askstr(UPRASKREF,MAXKEYLEN))==UINPOPABORT) error_abort(); varset(GV_SYMBID,syml[cursym].id); varset(GV_SYMNAME,syml[cursym].name); varset(GV_LIBNAME,syml[cursym].libname); varset(GV_RLNAME,syml[cursym].rlname); varset(GV_FILENAME,ddbfname); // Disable symbol pool query varset(GV_SYMPDIS,1); mousegrab(1); bae_clriactqueue(); bae_storetextiact(1,refname); if (syml[cursym].libname=="") bae_storetextiact(1,syml[cursym].name); else bae_storetextiact(1, syml[cursym].libname+"/"+syml[cursym].name); scm_getintpar(8,oldnameprompt); scm_setintpar(8,1); bae_callmenu(MNU_SCMADDSYM); scm_setintpar(8,oldnameprompt); // Reenable symbol pool query vardelete(GV_SYMPDIS); // Check if symbol successfully placed scm_getstrpar(1,refname); if (cap_lastfigelem(newfig)==0 && (!lastflag || newfig!=lastfig) && cap_nrefsearch("",newfig)==0 && newfig.NAME==refname) { // Transfer attributes for (i=0;i1) { sprintf(sqlcommand,SB_INSERT, syml[cursym].id,syml[cursym].cnt-1, sql_quotestr(syml[cursym].name), sql_quotestr(syml[cursym].libname), sql_quotestr(syml[cursym].rlname),syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); return(1); } else { curid=(-1); sprintf(sqlcommand,SC_SELECT, syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,idfunc)!=0) // SQL/DB error sql_dberror(0); if (curid==(-1)) { sprintf(sqlcommand,BA_DELETE, syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); } return(0); } } else { bae_clriactqueue(); exit(0); } // Unreachable statement return(1); } static void delpoolsymbol() /* // Delete pool symbol */ { // Delete old basket entry sprintf(sqlcommand,SB_DELETE1+SB_DELETE2,syml[cursym].id, sql_quotestr(syml[cursym].name),sql_quotestr(syml[cursym].libname), sql_quotestr(syml[cursym].rlname),syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); curid=(-1); sprintf(sqlcommand,SC_SELECT,syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,idfunc)!=0) // SQL/DB error sql_dberror(29); if (curid==(-1)) { sprintf(sqlcommand,BA_DELETE, syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); } } static int symbolpooladd(int cnt,int attridx,string symname) /* // Add parts to project symbol pool // Return value : // symbol count added to pool // Parameters : // int cnt : Part count // int attridx : Attribute index // string symname : Symbol name */ { index C_FIGURE fig /* Figure list element */; string libname /* Library name */; string symmacro /* Symbol macro name */; int i, j /* Loop control variables */; if (cnt<=0) return(0); // Create/init database file if (sqlinit(ddbfname,0)==(-1) && sqlinit(ddbfname,1)==(-1)) // SQL/DB creation error errormsg(ERRDBINIT,attrdb); // Create tables in database if (sqlcmd(ddbfname,SB_HELP,NULL)!=0) if (sqlcmd(ddbfname,SB_CREATE1+SB_CREATE2,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); if (sqlcmd(ddbfname,BI_HELP,NULL)!=0) if (sqlcmd(ddbfname,BI_CREATE,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); if (sqlcmd(ddbfname,BA_HELP,NULL)!=0) if (sqlcmd(ddbfname,BA_CREATE1+BA_CREATE2,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Check if name already defined strlower(symname); if (symname!="" && cnt==1 && (cap_nrefsearch(symname,fig)==0 || cap_partplan(bae_planfname(),symname)!="")) // Ignore already placed symbol return(0); // Query last ID curid=0; if (sqlcmd(ddbfname,BI_SELECT,idfunc)!=0) // SQL/DB error sql_dberror(0); // Delete last ID if (sqlcmd(ddbfname,BI_DELETE,NULL)!=0) // SQL/DB error sql_dberror(0); // Allocate next ID curid++; // Store new ID sprintf(sqlcommand,BI_INSERT,curid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); // Get library and symbol name getsymdata(attridx,libname,symmacro); // Check if mapping symbol selection if (mapn) { for (i=0;i0) { bae_msgbox(1,ERRVARFUNC,""); break; } cursym=intval; if (cursym>=0 && cursym1) abortmode=0; if (AUTOCLOSE) exit(0); } break; // Symbol delete case 3 : readsymbolpool(); cursym=intval; if (cursym>=0 && cursym=mapn) { sprintf(msg,ERRMAPERR, fig.NREF.MACRO.NAME,symname); bae_msgbox(2,msg,""); continue; } } // Check if macro replacement else if (fig.NREF.MACRO.NAME!=symname) { bae_callmenu(MNU_SCMGRPRESE); scm_elemgrpchg(fig,1); bae_clriactqueue(); bae_storemenuiact(1,0,LMB); bae_storetextiact(1,libname+"/"+symname); bae_callmenu(MNU_SCMGRPMACN); bae_callmenu(MNU_SCMGRPRESE); } // Get old phys. library name if (getvattribval(lastname, varattrname("$plname",varidx),oldplname)!=0) oldplname=""; // Transfer attributes for (i=0;i=mapn) { sprintf(msg,ERRNOMAP,symname); bae_msgbox(2,msg,""); return(-1); } // Return without errors return(0); } int checkplname(string macname,string libplname) /* // Check a physical library part name // Return value : // zero if plname OK, 1 if normal plname set or (-1) on invalid macname // Parameters : // string macname : Part macro name // string libplname : Predefined physical library name */ { string altprefix /* Alternate part name prefix */; string altphext /* Alternate part name extension */; int dstidx1 /* Destination string 1st index */; int dstidx2 /* Destination string 2nd index */; int dstid /* Destination string ID */; char c /* Scan character */; int i /* Loop control variable */; // Check if macro set if (LMACUPD || macname=="") return(1); // Check if already set if (macname==libplname) return(0); // Check if single name library definition if (libplname[0]!='[') // Invalid $plname replace return(-1); // Scan alternate physical part name list for (i=1,dstidx1=0,dstidx2=0,dstid=0;(c=libplname[i])!='\0';i++) switch (c) { case ']' : case ',' : // Check name scan state if (dstid==0) { if (dstidx1!=0) { // Store pure prefix name altprefix[dstidx1]='\0'; dstidx1=0; // Store the new alternate name if (altprefix==macname) return(0); } } else { /* Build name combination */ altphext[dstidx2]='\0'; dstidx2=0; /* Store the new alternate name */ if ((altprefix+altphext)==macname) return(0); if (c==']') { dstid=0; dstidx1=0; } } break; case '[' : if (dstid==0) { altprefix[dstidx1]='\0'; dstid=1; dstidx2=0; break; } default : if (dstid==0) { if (dstidx1200) { // Build specification string buf=""; for (curtf=dcnt=0;curtf200) buf[200]='\0'; } // Return table specification string return(buf); } void tabcolhead() /* // Build table header column list */ { string name /* Field name */; string varname /* Variable name */; string aliasname /* Field alias name */; // Scan header columns for (curtf=0;curtfminw) minw=curw; } tfl[curtf].colw=minw; } } void tabcolstore(int tabid) /* // Store table header column width values */ { string header /* Table header string */; string varname /* Variable name */; // Get the table structure gettabstruc(tabid); // Get the table identifier string header=tabspec(); // Dismiss any previos table info sprintf(sqlcommand,W_DELETE,sql_quotestr(header)); if (sqlcmd(WPOSDB,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); // Scan header columns for (curtf=0;curtf