summaryrefslogtreecommitdiff
path: root/app/bin/denum.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/denum.c')
-rw-r--r--app/bin/denum.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/app/bin/denum.c b/app/bin/denum.c
new file mode 100644
index 0000000..de5200b
--- /dev/null
+++ b/app/bin/denum.c
@@ -0,0 +1,240 @@
+/** \file denum.c
+ * Creating and showing the parts list.
+ */
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2005 Dave Bullis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <time.h>
+#include "track.h"
+#include "i18n.h"
+
+/****************************************************************************
+ *
+ * ENUMERATE
+ *
+ */
+
+
+static wWin_p enumW;
+
+#define ENUMOP_SAVE (1)
+#define ENUMOP_PRINT (5)
+#define ENUMOP_CLOSE (6)
+
+static void DoEnumOp( void * );
+static long enableListPrices;
+
+static paramTextData_t enumTextData = { 80, 24 };
+static char * priceLabels[] = { N_("Prices"), NULL };
+static paramData_t enumPLs[] = {
+#define I_ENUMTEXT (0)
+#define enumT ((wText_p)enumPLs[I_ENUMTEXT].control)
+ { PD_TEXT, NULL, "text", PDO_DLGRESIZE, &enumTextData, NULL, BT_CHARUNITS|BT_FIXEDFONT },
+ { PD_BUTTON, (void*)DoEnumOp, "save", PDO_DLGCMDBUTTON, NULL, N_("Save As ..."), 0, (void*)ENUMOP_SAVE },
+ { PD_BUTTON, (void*)DoEnumOp, "print", 0, NULL, N_("Print"), 0, (void*)ENUMOP_PRINT },
+ { PD_BUTTON, (void*)wPrintSetup, "printsetup", 0, NULL, N_("Print Setup"), 0, NULL },
+#define I_ENUMLISTPRICE (4)
+ { PD_TOGGLE, &enableListPrices, "list-prices", PDO_DLGRESETMARGIN, priceLabels, NULL, BC_HORZ|BC_NOBORDER } };
+static paramGroup_t enumPG = { "enum", 0, enumPLs, sizeof enumPLs/sizeof enumPLs[0] };
+
+static struct wFilSel_t * enumFile_fs;
+
+
+static int count_utf8_chars(char *s) {
+ int i = 0, j = 0;
+ while (s[i]) {
+ if ((s[i] & 0xc0) != 0x80) j++;
+ i++;
+ }
+ return j;
+}
+
+static int DoEnumSave(
+ const char * pathName,
+ const char * fileName,
+ void * data )
+{
+ if (pathName == NULL)
+ return TRUE;
+ memcpy( curDirName, pathName, fileName-pathName );
+ curDirName[fileName-pathName-1] = '\0';
+ return wTextSave( enumT, pathName );
+}
+
+
+static void DoEnumOp(
+ void * data )
+{
+ switch( (int)(long)data ) {
+ case ENUMOP_SAVE:
+ wFilSelect( enumFile_fs, curDirName );
+ break;
+ case ENUMOP_PRINT:
+ wTextPrint( enumT );
+ break;
+ case ENUMOP_CLOSE:
+ wHide( enumW );
+ ParamUpdate( &enumPG );
+ }
+}
+
+
+static void EnumDlgUpdate(
+ paramGroup_p pg,
+ int inx,
+ void * valueP )
+{
+ if ( inx != I_ENUMLISTPRICE ) return;
+ EnumerateTracks();
+}
+
+
+int enumerateMaxDescLen;
+static FLOAT_T enumerateTotal;
+
+void EnumerateList(
+ long count,
+ FLOAT_T price,
+ char * desc )
+{
+ char * cp;
+ int len;
+ sprintf( message, "%*ld | %s\n", count_utf8_chars(_("Count")), count, desc );
+ if (enableListPrices) {
+ cp = message + strlen( message )-1;
+ len = enumerateMaxDescLen-strlen(desc);
+ if (len<0) len = 0;
+ memset( cp, ' ', len );
+ cp += len;
+ if (price > 0.0) {
+ sprintf( cp, " | %7.2f |%9.2f\n", price, price*count );
+ enumerateTotal += price*count;
+ } else {
+ sprintf( cp, " | %-*s |\n", (int) max( 7, count_utf8_chars( _("Each"))), " " );
+ }
+ }
+ wTextAppend( enumT, message );
+}
+
+void EnumerateStart(void)
+{
+ time_t clock;
+ struct tm *tm;
+ char * cp;
+
+ if (enumW == NULL) {
+ ParamRegister( &enumPG );
+ enumW = ParamCreateDialog( &enumPG, MakeWindowTitle(_("Parts List")), NULL, NULL, wHide, TRUE, NULL, F_RESIZE, EnumDlgUpdate );
+ enumFile_fs = wFilSelCreate( mainW, FS_SAVE, 0, _("Parts List"), sPartsListFilePattern, DoEnumSave, NULL );
+ }
+
+ wTextClear( enumT );
+
+ sprintf( message, _("%s Parts List\n\n"), sProdName);
+ wTextAppend( enumT, message );
+
+ message[0] = '\0';
+ cp = message;
+ if ( Title1[0] ) {
+ strcpy( cp, Title1 );
+ cp += strlen(cp);
+ *cp++ = '\n';
+ }
+ if ( Title2[0] ) {
+ strcpy( cp, Title2 );
+ cp += strlen(cp);
+ *cp++ = '\n';
+ }
+ if ( cp > message ) {
+ *cp++ = '\n';
+ *cp++ = '\0';
+ wTextAppend( enumT, message );
+ }
+
+ time(&clock);
+ tm = localtime(&clock);
+ strftime( message, STR_LONG_SIZE, "%x\n", tm );
+ wTextAppend( enumT, message );
+
+ enumerateTotal = 0.0;
+
+ if( count_utf8_chars( _("Description")) > enumerateMaxDescLen )
+ enumerateMaxDescLen = count_utf8_chars( _("Description" ));
+
+ /* create the table header */
+ sprintf( message, "%s | %-*s", _("Count"), enumerateMaxDescLen, _("Description"));
+
+ if( enableListPrices )
+ sprintf( message+strlen(message), " | %-*s | %-*s\n", (int) max( 7, count_utf8_chars( _("Each"))), _("Each"), (int) max( 9, count_utf8_chars(_("Extended"))), _("Extended"));
+ else
+ strcat( message, "\n" );
+ wTextAppend( enumT, message );
+
+ /* underline the header */
+ cp = message;
+ while( *cp && *cp != '\n' )
+ if( *cp == '|' )
+ *cp++ = '+';
+ else
+ *cp++ = '-';
+
+ wTextAppend( enumT, message );
+}
+/**
+ * End of parts list. Print the footer line and the totals if necessary.
+ * \todo These formatting instructions could be re-written in an easier
+ * to understand fashion using the possibilities of the printf formatting
+ * and some string functions.
+ */
+
+void EnumerateEnd(void)
+{
+ int len;
+ char * cp;
+ ScaleLengthEnd();
+
+ memset( message, '\0', STR_LONG_SIZE );
+ memset( message, '-', strlen(_("Count")) + 1 );
+ strcpy( message + strlen(_("Count")) + 1, "+");
+ cp = message+strlen(message);
+ memset( cp, '-', enumerateMaxDescLen+2 );
+ if (enableListPrices){
+ strcpy( cp+enumerateMaxDescLen+2, "+-" );
+ memset( cp+enumerateMaxDescLen+4, '-', max( 7, strlen( _("Each"))));
+ strcat( cp, "-+-");
+ memset( message+strlen( message ), '-', max( 9, strlen(_("Extended"))));
+ *(message + strlen( message )) = '\n';
+ } else {
+ *(cp+enumerateMaxDescLen+2) = '\n';
+ *(cp+enumerateMaxDescLen+3) = '\0';
+ }
+ wTextAppend( enumT, message );
+
+ if (enableListPrices) {
+ len = strlen( message ) - strlen( _("Total")) - max( 9, strlen(_("Extended"))) - 4 ;
+ memset ( message, ' ', len );
+ cp = message+len;
+ sprintf( cp, ("%s |%9.2f\n"), _("Total"), enumerateTotal );
+ wTextAppend( enumT, message );
+ }
+ wTextSetPosition( enumT, 0 );
+
+ ParamLoadControls( &enumPG );
+ wShow( enumW );
+}