Guest User

Untitled

a guest
Jan 2nd, 2018
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.63 KB | None | 0 0
  1. #require 6.5100
  2.  
  3. // Revision history:
  4. //
  5. // 1.00
  6. // - Initial release
  7. //
  8. // 1.01
  9. // - Dialog mask for text or html output selection corrected
  10. //
  11. // 1.02
  12. // - CSV export added after a suggestion of Christian Schlittler
  13. // - File extension for text file output changed from .bom to .txt
  14. //
  15. // 1.03
  16. // - Added missing description column in value mode.
  17. //
  18. // 1.04
  19. // - List also Packages bei Value
  20. //
  21. // 1.05
  22. // - 2012-03-01 change PartValue[], PartDevice[], PartPackage[], PartHeadline[], PartDescription[] to normal string. alf@cadsoft.de
  23. // numeric strings with only numericasl characters, sorts up to 8 characters!
  24. //
  25. // 1.06
  26. // - 2012-05-25 support now populated variants
  27. // switch on/off attributes
  28. // is now the standard bom.ulp alf@cadsoft.de
  29. //
  30. // 1.07
  31. // - 2012-06-22 set correct variant
  32. //
  33. // 1.08
  34. // - 2012-11-08 list different values of attributes
  35. //
  36. // 1.09
  37. // - 2012-12-04 now can change the separator character for CSV files.
  38. // change the character in line Separator = ',';
  39. //
  40. // 1.10
  41. // - 2014-08-07 extended to V7 hierarchical schematic
  42. //
  43. // 1.11
  44. // - 2015-12-10 fixed handling descriptions containing TAB characters
  45. //
  46. // Revision: 1.11
  47. //
  48. // 1.12
  49. // - 2017-12-27 Sheets by thx2112
  50.  
  51. string Version = "1.12";
  52.  
  53. char Separator = ';'; // 2012-12-04
  54.  
  55. #usage "en: <b>Export a Bill Of Material - with Sheets</b>\n"
  56. "<p>"
  57. "Generates a project's <i>Bill Of Material</i>&nbsp;&nbsp;including the attributes introduced in"
  58. " version 5.0.0."
  59. "<p>"
  60. "<hr>"
  61. "Added ability to output single sheets. (thx2112)"
  62. "<hr>"
  63. "<p>"
  64. "<author>Author: support@cadsoft.de</author><br>"
  65. "<author>Modified to use the new attributes by Carsten Wille.</author><br>"
  66. "<author>.csv export added by Christian Schlittler.</author>"
  67. "<author>Select variant and switch on/off attributes alf@cadsoft.de</author>",
  68. "de: <b>Stückliste exportieren</b>\n"
  69. "<p>"
  70. "Erzeugt die <i>Stückliste</i> (Bill Of Material) eines Projekts, einschließlich der"
  71. " mit Version 5.0.0 neu eingeführten Attribute."
  72. "<p>"
  73. "<author>Autor: support@cadsoft.de</author><br>"
  74. "<author>Modifiziert von Carsten Wille, um die neuen Attribute zu nutzen.</author><br>"
  75. "<author>Export als .csv-Datei durch Christian Schlittler hinzugefügt.</author>"
  76. "<author>Auswählen von Bestückungs-Varianten und Attribute können ein/ausgeschaltet werden alf@cadsoft.de</author>"
  77.  
  78. // THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
  79.  
  80. string HelpTextEN =
  81. "<b>How to generate the Bill Of Material</b>\n"
  82. "<p>\n"
  83. "<b>List type</b>\n"
  84. "<p>\n"
  85. "The <i>Bill Of Material</i> can be generated either as a list\n"
  86. "of parts (where every part is listed on a line of its own),\n"
  87. "or as a list of values, where all parts with the same value are grouped\n"
  88. "together in one line. Use the <b><u>P</u>arts</b> and <b><u>V</u>alues</b>\n"
  89. "radio buttons to select the list type.\n"
  90. "<p>\n"
  91. "<b>Output format</b>\n"
  92. "<p>\n"
  93. "Choose between pure ASCII <b><u>T</u>ext</b> format, <b><u>C</u>SV</b> or <b><u>H</u>TML</b>.\n"
  94. ;
  95.  
  96. string HelpTextDE =
  97. "<b>Erzeugen der Stückliste</b>\n"
  98. "<p>\n"
  99. "<b>Listen-Typ</b>\n"
  100. "<p>\n"
  101. "Die <i>Stückliste</i> kann entweder als Liste der Bauteile generiert werden\n"
  102. "(wobei jedes Bauteil in einer eigenen Zeile aufgeführt wird),\n"
  103. "oder als Liste der Werte, wobei alle Bauteile mit dem gleichen Wert in einer Zeile\n"
  104. "zusammengefasst werden. Mit den Radio-Buttons <b><u>B</u>auteile</b> und <b><u>W</u>erte</b>\n"
  105. "kann zwischen den beiden Listen-Typen gewählt werden.\n"
  106. "<p>\n"
  107. "<b>Ausgabeformat</b>\n"
  108. "<p>\n"
  109. "Wählen Sie zwischen reinem ASCII-<b><u>T</u>ext</b>, <b><u>C</u>SV</b> oder <b><u>H</u>TML</b>"
  110. "-Format.\n"
  111. ;
  112.  
  113. string I18N[] = {
  114. "en\v"
  115. "de\v"
  116. ,
  117. "<hr><b>ERROR: No schematic!</b><p>\nThis program can only work in the schematic editor.\v"
  118. "<hr><b>FEHLER: Kein Schaltplan!</b><p>\nDieses Programm kann nur in einem Schaltplan verwendet"
  119. " werden.\v"
  120. ,
  121. "Part\tValue\tDevice\tPackage\tDescription\v"
  122. "Bauteil\tWert\tDevice\tPackage\tDescription\v"
  123. ,
  124. "Qty\tValue\tDevice\tPackage\tParts\v" // 2011-04-08
  125. "Menge\tWert\tDevice\tGehäuse\tBauteile\v" // 2011-04-08
  126. ,
  127. "Partlist exported from %s at %s\v"
  128. "Stückliste exportiert aus %s am %s\v"
  129. ,
  130. "Bill Of Material - Preview\v"
  131. "Stückliste - Vorschau\v"
  132. ,
  133. "-Close\v"
  134. "-Schließen\v"
  135. ,
  136. "Save Bill Of Material\v"
  137. "Stückliste speichern\v"
  138. ,
  139. "File '\v"
  140. "Datei '\v"
  141. ,
  142. "' exists\n\nOverwrite?\v"
  143. "' existiert\n\nÜberschreiben?\v"
  144. ,
  145. "+&Yes\v"
  146. "+&Ja\v"
  147. ,
  148. "-&No\v"
  149. "-&Nein\v"
  150. ,
  151. "&No\v"
  152. "&Nein\v"
  153. ,
  154. "Name already defined!\v"
  155. "Name ist bereits definiert!\v"
  156. ,
  157. " Header\v"
  158. " Spaltenüberschrift\v"
  159. ,
  160. "&Name:\v"
  161. "&Name:\v"
  162. ,
  163. "+OK\v"
  164. "+OK\v"
  165. ,
  166. "Name can't be empty!\v"
  167. "Name kann nicht leer sein!\v"
  168. ,
  169. "-Cancel\v"
  170. "-Abbrechen\v"
  171. ,
  172. "&Headers\v"
  173. "&Spaltenüberschriften\v"
  174. ,
  175. "Bill Of Material - Help\v"
  176. "Stückliste - Hilfe\v"
  177. ,
  178. "Bill Of Material\v"
  179. "Stückliste\v"
  180. ,
  181. "List type\v"
  182. "Listen-Typ\v"
  183. ,
  184. "&Parts\v"
  185. "&Bauteile\v"
  186. ,
  187. "&Values\v"
  188. "&Werte\v"
  189. ,
  190. "Output format\v"
  191. "Ausgabeformat\v"
  192. ,
  193. "&Text\v"
  194. "&Text\v"
  195. ,
  196. "&CSV\v"
  197. "&CSV\v"
  198. ,
  199. "&HTML\v"
  200. "&HTML\v"
  201. ,
  202. "+Vie&w\v"
  203. "+&Vorschau\v"
  204. ,
  205. "&Save...\v"
  206. "&Speichern...\v"
  207. ,
  208. "H&elp\v"
  209. "H&ilfe\v"
  210. ,
  211. "Current &variant \v"
  212. "Aktuelle &Variante \v"
  213. ,
  214. "Sheet Number \v"
  215. "Sheet Number \v"
  216. ,
  217. "List &attributes\v"
  218. "&Attribute auflisten\v"
  219. };
  220. int Language = strstr(I18N[0], language()) / 3;
  221.  
  222. string tr(string s)
  223. {
  224. string t = lookup(I18N, s, Language, '\v');
  225. return t ? t : s;
  226. }
  227.  
  228. if (!schematic)
  229. {
  230. dlgMessageBox(usage + tr("<hr><b>ERROR: No schematic!</b><p>\nThis program can only work in"
  231. " the schematic editor."));
  232. exit(1);
  233. }
  234.  
  235. string SeparatorString;
  236. int NumParts;
  237. numeric string Lines[];
  238. numeric string PartName[];
  239. string PartValue[], PartDevice[], PartPackage[], PartHeadline[];
  240. numeric string PartDescription[];
  241. int PartValueOn[];
  242. int Selected;
  243.  
  244. string CurrentVariant = "";
  245. string Variants[] = { "" }; // 2012-04-16
  246. int cntVD = 0;
  247. int VDsel = 0;
  248.  
  249. // cwi: Added arrays for an arbitraty number of attributes.
  250. int UseAttributes = 1;
  251. int FoundAttributes = 0; // # of different attribute names found in schematic.
  252. numeric string AttributesList[]; // Sorted list of all attributes found in the schematic.
  253. numeric string PartAttributes[]; // Adjusted list of attributes per part.
  254.  
  255. enum { ltParts, ltValues }; // List Types
  256. enum { ofText, ofCSV, ofHTML }; // Output Formats
  257. int ListType = 0;
  258. int OutputFormat = 0;
  259.  
  260. int sheetNumber = 1;
  261.  
  262. string StripWhiteSpace(string s)
  263. {
  264. while (s && isspace(s[0]))
  265. s = strsub(s, 1);
  266. while (s && isspace(s[strlen(s) - 1]))
  267. s = strsub(s, 0, strlen(s) - 1);
  268. return s;
  269. }
  270.  
  271. string ReplaceTabs(string s)
  272. {
  273. int i;
  274. while ((i = strchr(s, '\t')) >= 0)
  275. s = strsub(s, 0, i) + "\\t" + strsub(s, i + 1);
  276. return s;
  277. }
  278.  
  279. // Collect part data from the schematic.
  280. //
  281. // Arguments: -
  282. //
  283. // Returns: NumParts - # of found parts
  284. // ParteName[]
  285. // PartValue[]
  286. // PartDevice[]
  287. // PartPackage[]
  288. // PartHeadline[]
  289. // PartDescription []
  290. // PartValueOn[] - 0=part value off, 1= part value on, 2=override with attr. VAL
  291. // FoundAttributes - # of different attribute names found in schematic.
  292. // AttributesList[] - Sorted list of all attributes found in the schematic.
  293. // PartAttributes[] - Adjusted list of attributes per part.
  294.  
  295. void CollectPartData(string var)
  296. {
  297. int Found = 0;
  298. int i;
  299. string attr[];
  300.  
  301. NumParts = 0;
  302.  
  303. // First, collect the names of all available attributes.
  304. FoundAttributes = 0;
  305. if (UseAttributes) {
  306. schematic(SCH)
  307. {
  308. SCH.allparts(P) // 2014-08-07
  309. {
  310. if (P.device.package)
  311. {
  312. if (P.populate)
  313. {
  314. P.attributes(A)
  315. {
  316. if (0 == FoundAttributes)
  317. {
  318. // First one
  319. AttributesList[0] = A.name;
  320. FoundAttributes = 1;
  321. }
  322. else
  323. {
  324. Found = 0;
  325. for (i = 0; i < FoundAttributes; i++)
  326. {
  327. if (A.name == AttributesList[i])
  328. {
  329. // Found an already listed atrribute
  330. Found = 1;
  331. break;
  332. }
  333. }
  334. if (0 == Found)
  335. {
  336. // Attribute not listed, add at the end.
  337. AttributesList[FoundAttributes] = A.name;
  338. FoundAttributes++;
  339. }
  340. }
  341. }
  342. }
  343. }
  344. }
  345. }
  346. sort(FoundAttributes, AttributesList);
  347. }
  348. // Second, collect all data
  349. schematic(SCH)
  350. {
  351. SCH.allparts(P)
  352. {
  353. if (P.device.package)
  354. {
  355. if (P.populate)
  356. {
  357. P.instances(I) // for SHEETS
  358. {
  359. if (I.sheet == sheetNumber)
  360. {
  361. PartName[NumParts] = P.name;
  362. PartValue[NumParts] = P.value;
  363. PartDevice[NumParts] = P.device.name;
  364. PartPackage[NumParts] = P.device.package.name;
  365. PartHeadline[NumParts] = ReplaceTabs(P.device.headline);
  366. // currently not used:
  367. // PartDescription[NumParts] = ReplaceTabs(P.device.description);
  368. PartValueOn[NumParts] = P.device.value == "On";
  369. // Zero all strings
  370. for (i = 0; i < FoundAttributes; i++)
  371. attr[i] = "";
  372. P.attributes(A)
  373. {
  374. for (i = 0; i < FoundAttributes; i++)
  375. if (A.name == AttributesList[i])
  376. {
  377. attr[i] = A.value;
  378. break;
  379. }
  380. if ("VALUE" == A.name && 0 < strlen(A.value))
  381. // Override old fashioned value information!
  382. PartValueOn[NumParts] = 2;
  383. }
  384. PartAttributes[NumParts] = strjoin(attr, Separator);
  385. NumParts++;
  386. }
  387. }
  388. }
  389. }
  390. }
  391. }
  392. }
  393.  
  394. void GeneratePartList(void)
  395. {
  396. int NumLines = 0;
  397. string attr[], s;
  398.  
  399. if (UseAttributes) s = strjoin(AttributesList, '\t');
  400. Lines[NumLines++] = tr("Part\tValue\tDevice\tPackage\tDescription\t") + s;
  401. for (int i = 0; i < NumParts; i++)
  402. {
  403. strsplit(attr, PartAttributes[i], Separator);
  404. if (UseAttributes) s = strjoin(attr, '\t');
  405. Lines[NumLines] = PartName[i] + "\t" + PartValue[i] + "\t" + PartDevice[i] + "\t" +
  406. PartPackage[i] + "\t" + PartHeadline[i] + "\t" + s;
  407. NumLines++;
  408. }
  409. Lines[NumLines] = "";
  410. }
  411.  
  412. // Generate list with one entry per value.
  413. // 'VALUE' is replaced by the value of attribute 'VAL', if existing.
  414.  
  415. void GenerateValueList(void)
  416. {
  417. int NumLines = 0;
  418. int Index[];
  419. string attr[], s, s_val;
  420.  
  421. if (UseAttributes) s = strjoin(AttributesList, '\t');
  422.  
  423. // 2010-04-17 cwi: Included description.
  424. Lines[NumLines++] = tr("Qty\tValue\tDevice\tPackage\tParts\tDescription\t") + s; // 2011-04-08
  425. sort(NumParts, Index, PartValue, PartDevice, PartPackage, PartAttributes, PartName, PartHeadline); // 2011-11-08 Partattribute jetzt nach Package alf@cadsoft.de
  426. for (int n1 = 0, n2 = 0; ++n2 <= NumParts; )
  427. {
  428. int i1 = Index[n1];
  429. strsplit(attr, PartAttributes[i1], Separator);
  430. if (UseAttributes) s = strjoin(attr, '\t');
  431. s_val = attr[i1];
  432. if (n2 < NumParts)
  433. {
  434. int i2 = Index[n2]; // 2012-11-08
  435. strsplit(attr, PartAttributes[i2], Separator);
  436. if (PartValue[i1] == PartValue[i2] && PartDevice[i1] == PartDevice[i2] && PartAttributes[i1] == PartAttributes[i2]) // 2012-11-08 check diffent values of attributes
  437. continue;
  438. }
  439. string Quantity;
  440. sprintf(Quantity, "%d", n2 - n1);
  441. Lines[NumLines] = Quantity + "\t" + PartValue[i1] + "\t" + PartDevice[i1] + "\t" + PartPackage[i1] + "\t";
  442. for (;;)
  443. {
  444. Lines[NumLines] += PartName[i1];
  445. if (++n1 < n2)
  446. {
  447. i1 = Index[n1];
  448. Lines[NumLines] += ", ";
  449. }
  450. else
  451. break;
  452. }
  453. // cwi: add extra information from attributes
  454. // 2010-04-17 cwi: Included description.
  455. Lines[NumLines] += "\t" + PartHeadline[i1] + "\t" + s;
  456. NumLines++;
  457. }
  458. Lines[NumLines] = "";
  459. }
  460.  
  461. void GenerateList(void)
  462. {
  463. switch (ListType)
  464. {
  465. case ltParts: GeneratePartList(); break;
  466. case ltValues: GenerateValueList(); break;
  467. }
  468. }
  469.  
  470. string MakeListHeader(void)
  471. {
  472. string s;
  473. schematic(SCH)
  474. sprintf(s, tr("Partlist for sheet %d exported from %s at %s"), sheetNumber, SCH.name, t2string(time()));
  475. return s;
  476. }
  477.  
  478. string MakeListText(void)
  479. {
  480. int l, Width[];
  481. string List;
  482. int numHeaders;
  483.  
  484. for (l = 0; Lines[l]; l++)
  485. {
  486. string a[];
  487. for (int n = strsplit(a, Lines[l], '\t'); n--; )
  488. Width[n] = max(Width[n], strlen(a[n]));
  489. }
  490.  
  491. List = MakeListHeader() + "\n\n";
  492.  
  493. for (l = 0; Lines[l]; l++)
  494. {
  495. string line, a[];
  496.  
  497. int n = strsplit(a, Lines[l], '\t');
  498. if (l == 0)
  499. numHeaders = n;
  500. else
  501. n = numHeaders; // for the hidden key!
  502. for (int i = 0; i < n; i++)
  503. {
  504. string s;
  505.  
  506. sprintf(s, "%s%-*s", line ? " " : "", Width[i], a[i]);
  507. line += s;
  508. }
  509. List += line + "\n";
  510. }
  511. return List;
  512. }
  513.  
  514. // 2008-11-24 Christian Schlittler:
  515. // Make comma-serparated list, with all values double-quoted.
  516.  
  517. string MakeListCSV(void)
  518. {
  519. string List;
  520. int numHeaders;
  521.  
  522. for (int l = 0; Lines[l]; l++)
  523. {
  524. string a[];
  525. int n = strsplit(a, Lines[l], '\t');
  526. if (l == 0)
  527. numHeaders = n;
  528. else
  529. n = numHeaders; // for the hidden key!
  530. for (int i = 0; i < n; i++)
  531. List += "\"" + a[i] + "\"" + SeparatorString;
  532. List += "\n";
  533. }
  534. return List;
  535. }
  536.  
  537. string MakeListHTML(void)
  538. {
  539. string List;
  540. int numHeaders;
  541.  
  542. List = "<b>" + MakeListHeader() + "</b>\n<p>\n";
  543. List += "<table>\n";
  544. for (int l = 0; Lines[l]; l++)
  545. {
  546. List += "<tr>";
  547. string a[];
  548. int n = strsplit(a, Lines[l], '\t');
  549. if (l == 0)
  550. numHeaders = n;
  551. else
  552. n = numHeaders; // for the hidden key!
  553. for (int i = 0; i < n; i++)
  554. {
  555. if (l == 0)
  556. a[i] = "<b>" + a[i] + "</b>";
  557. List += "<td>" + a[i] + "</td>";
  558. }
  559. List += "</tr>\n";
  560. }
  561. List += "</table>\n";
  562. return List;
  563. }
  564.  
  565. string MakeList(void)
  566. {
  567. switch (OutputFormat)
  568. {
  569. case ofText: return MakeListText(); break;
  570. case ofCSV: return MakeListCSV(); break;
  571. case ofHTML: return MakeListHTML(); break;
  572. }
  573. return "";
  574. }
  575.  
  576. void ViewList(void)
  577. {
  578. dlgDialog(tr("Bill Of Material - Preview"))
  579. {
  580. string s = MakeList();
  581. if (OutputFormat == ofText || OutputFormat == ofCSV)
  582. s = "<pre>" + s + "</pre>";
  583. dlgHBoxLayout dlgSpacing(400);
  584. dlgHBoxLayout
  585. {
  586. dlgVBoxLayout dlgSpacing(300);
  587. dlgTextView(s);
  588. }
  589. dlgHBoxLayout
  590. {
  591. dlgStretch(1);
  592. dlgPushButton(tr("-Close")) dlgReject();
  593. }
  594. };
  595. }
  596.  
  597. void SaveList(void)
  598. {
  599. // 2008-11-24 cwi:
  600. // - Added new format extension .csv
  601. // - Changed from .bom to .txt for text format.
  602. string FileName;
  603. string FileExt;
  604.  
  605. switch (OutputFormat)
  606. {
  607. case ofText: FileExt = ".txt"; break;
  608. case ofHTML: FileExt = ".html"; break;
  609. case ofCSV: FileExt = ".csv"; break;
  610. }
  611. schematic(SCH) FileName = filesetext(SCH.name, FileExt);
  612. FileName = dlgFileSave(tr("Save Bill Of Material"), FileName);
  613. if (FileName)
  614. {
  615. string a[];
  616. if (!fileglob(a, FileName) || dlgMessageBox(tr("File '") + FileName +
  617. tr("' exists\n\nOverwrite?"), tr("+&Yes"), tr("-&No")) == 0)
  618. {
  619. output(FileName, "wt")
  620. {
  621. printf("%s", MakeList()); // using "%s" to avoid problems if list contains any '%'
  622. }
  623. }
  624. }
  625. }
  626.  
  627. void DisplayHelp(void)
  628. {
  629. dlgDialog(tr("Bill Of Material - Help"))
  630. {
  631. dlgHBoxLayout dlgSpacing(400);
  632. dlgHBoxLayout
  633. {
  634. dlgVBoxLayout dlgSpacing(300);
  635. dlgTextView(language() == "de" ? HelpTextDE : HelpTextEN);
  636. }
  637. dlgHBoxLayout
  638. {
  639. dlgStretch(1);
  640. dlgPushButton(tr("-Close"))
  641. dlgReject();
  642. }
  643. };
  644. }
  645.  
  646. schematic(SCH) {
  647. sprintf(SeparatorString, "%c", Separator);
  648. CurrentVariant = variant();
  649. SCH.variantdefs(VD) {
  650. if (CurrentVariant == VD.name) VDsel = cntVD;
  651. sprintf(Variants[cntVD], "%s", VD.name);
  652. cntVD++;
  653. }
  654. }
  655. sheetNumber = sheetNumber;
  656. setvariant(CurrentVariant);
  657. CollectPartData(CurrentVariant);
  658. GenerateList();
  659.  
  660. dlgDialog(tr("Bill Of Material"))
  661. {
  662. dlgHBoxLayout{
  663. dlgLabel(tr("Current &variant "));
  664. dlgComboBox(Variants, VDsel) {
  665. CurrentVariant = Variants[VDsel];
  666. setvariant(CurrentVariant);
  667. CollectPartData(CurrentVariant);
  668. GenerateList();
  669. }
  670. dlgStretch(1);
  671. dlgLabel(tr("&Sheet Number:"));
  672. dlgSpinBox(sheetNumber, 1, 10);
  673. dlgPushButton(tr("Select"))
  674. {
  675. CollectPartData(CurrentVariant);
  676. GenerateList();
  677. }
  678. dlgStretch(6);
  679. }
  680. dlgListView("", Lines, Selected);
  681. dlgHBoxLayout{
  682. dlgGroup(tr("List type"))
  683. {
  684. dlgRadioButton(tr("&Parts"), ListType) GeneratePartList();
  685. dlgRadioButton(tr("&Values"), ListType) GenerateValueList();
  686. dlgCheckBox(tr("List &attributes"), UseAttributes) {
  687. if (!UseAttributes) {
  688. NumParts = 0;
  689. }
  690. CollectPartData(CurrentVariant);
  691. GenerateList();
  692. }
  693. }
  694. dlgGroup(tr("Output format"))
  695. {
  696. // 2008-10-09: Entries swapped for correct function.
  697. dlgRadioButton(tr("&Text"), OutputFormat);
  698. // 2008-11-24 cwi: New format added.
  699. dlgRadioButton(tr("&CSV"), OutputFormat);
  700. dlgRadioButton(tr("&HTML"), OutputFormat);
  701. }
  702. dlgStretch(1);
  703. }
  704. dlgHBoxLayout{
  705. dlgPushButton(tr("+Vie&w")) ViewList();
  706. dlgPushButton(tr("&Save...")) SaveList();
  707. dlgPushButton(tr("H&elp")) DisplayHelp();
  708. dlgPushButton(tr("-Close")) dlgAccept();
  709. dlgStretch(1);
  710. dlgLabel("Version " + Version);
  711. }
  712. };
Add Comment
Please, Sign In to add comment