Subversion Repositories svn1-original

Rev

Rev 174 | Rev 225 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
148 - 1
#include "qmdialogloadexternalteams.h"
2
#include "ui_qmdialogloadexternalteams.h"
149 - 3
#include "QFile"
4
#include "QTextStream"
5
#include "mainwindow.h"
6
#include <QRegExp>
148 - 7
 
149 - 8
#include    "consts.h"
9
#include    "structs.h"
10
#include    "proto.h"
11
 
12
QmDialogLoadExternalTeams::QmDialogLoadExternalTeams(const QString &efile,QWidget *parent) :
148 - 13
    QDialog(parent),
14
    ui(new Ui::QmDialogLoadExternalTeams)
15
{
16
    ui->setupUi(this);
149 - 17
    setWindowTitle("Load External Team Data");
18
    ui->fileName->setText(efile);
19
 
20
    // Open the users file
21
 
22
    QFile file(efile);
23
    if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) )
24
    {
25
        MainWindow::showMessage("Cannot open external data file");
26
        return;
27
    }
153 - 28
    MainWindow::showMessage("Loading External Data");
149 - 29
 
153 - 30
    // Insert column headers
149 - 31
    ui->tableWidget->setColumnCount(3 + ( 2 * config.num_legs) );
153 - 32
    QStringList labels;
33
    labels << "Team" << "Team Name" << "Cat";
34
    for (int ii = 1; ii <= config.num_legs; ii++ )
35
    {
36
        labels += QString("Leg:%1").arg(QString::number(ii));
155 david 37
        labels += QString("Age:%1").arg(QString::number(ii));
153 - 38
    }
39
    ui->tableWidget->setHorizontalHeaderLabels(labels);
149 - 40
 
41
    // Process Each line of the file
42
    QTextStream in(&file);
43
    int ii = 0;
152 - 44
    int bad_cat = 0;
149 - 45
    QRegExp csv_split("\"?,\"?");
46
    while (!in.atEnd())
47
    {
48
         QString line = in.readLine();
49
         line = line.trimmed();             // Remove leading and training White Space
50
         line.remove(0xA0);                 // M$ special uglyness
51
 
155 david 52
         QStringList parts = splitCsvData(line);
149 - 53
         QString first = parts.value(0);
54
         bool ok;
55
         if ( first.isEmpty() )
56
             continue;
57
         int team = first.toInt(&ok);
58
         if ( ! ok || team <= 0 )
59
             continue;
60
         ui->tableWidget->setRowCount(1+ii);
61
 
62
         // Insert Team number
63
         ui->tableWidget->setItem(ii, 0, new QTableWidgetItem(first));
64
         parts.removeFirst();
65
 
66
         // Extract Team Name
67
         ui->tableWidget->setItem(ii, 1, new QTableWidgetItem( parts.value(0) ) );
68
         parts.removeFirst();
69
 
70
         // Extract Team Cat
152 - 71
         QTableWidgetItem *item = new QTableWidgetItem( parts.value(0)) ;
72
         ui->tableWidget->setItem(ii, 2, item );
149 - 73
 
180 - 74
        if (config.lookup_class(qPrintable(parts.value(0)) ) <= 0 )
152 - 75
        {
76
            item->setBackgroundColor(QColor(200,0,0,50));
77
            bad_cat++;
78
        }
79
        parts.removeFirst();
80
 
149 - 81
         int yy = 0;
82
         while ( parts.count() > 0)
83
         {
84
             // Name of competitor
85
             ui->tableWidget->setItem(ii, 3+yy, new QTableWidgetItem( parts.value(0)));
86
             parts.removeFirst();
87
 
88
             // Posible age - if its a number
89
             int age = parts.value(0).toInt(&ok);
155 david 90
             if ( ok )
149 - 91
             {
155 david 92
                 if ( age > 0 )
93
                 {
94
                     ui->tableWidget->setItem(ii, 4+yy, new QTableWidgetItem( parts.value(0)));
95
                 }
149 - 96
                 parts.removeFirst();
97
             }
98
             yy += 2;
99
         }
100
         ii++;
150 david 101
     }
153 - 102
    ui->tableWidget->resizeColumnsToContents();
149 - 103
 
152 - 104
    // Report errors
105
    if (bad_cat)
106
    {
107
        MainWindow::showMessage("Invalid Categories in data");
108
    }
109
 
150 david 110
    // Connect up buttons
149 - 111
 
152 - 112
    connect (ui->load, SIGNAL(clicked()), this, SLOT(loadData()));
148 - 113
}
114
 
115
QmDialogLoadExternalTeams::~QmDialogLoadExternalTeams()
116
{
117
    delete ui;
118
}
150 david 119
 
120
void QmDialogLoadExternalTeams::loadData(void)
121
{
122
    qDebug ("LoadData");
123
    team_type team_buf;
152 - 124
    int bad_cat = 0;
150 david 125
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
126
    {
152 - 127
        if ( ui->tableWidget->isRowHidden(ii))
128
        {
129
            continue;
130
        }
131
        bool bad = false;
150 david 132
        QTableWidgetItem *item;
133
        item = ui->tableWidget->item(ii,0);
134
        if (item)
135
        {
136
            int team = item->data(Qt::EditRole).toInt();
137
            if ( team > 0 && team <= config.max_team )
138
            {
139
                g_record( team, &team_buf );
140
 
141
                // Name
142
                item = ui->tableWidget->item(ii,1);
143
                if (item)
144
                {
145
                    strncpy(team_buf.name , qPrintable(item->data(Qt::EditRole).toString()), sizeof(team_buf.name));
146
                }
147
 
148
                // Category
149
                item = ui->tableWidget->item(ii,2);
150
                if (item)
151
                {
180 - 152
                    int category = config.lookup_class(qPrintable(item->data(Qt::EditRole).toString()) );
150 david 153
                    if (category)
154
                    {
155
                        team_buf.teamclass = category;
156
                    }
152 - 157
                    else
158
                    {
159
                        bad_cat++;
160
                        bad = true;
161
                    }
150 david 162
                }
163
 
164
                // Team member names and ages
165
                int member = 0;
151 david 166
                for (int yy = 3; yy < ui->tableWidget->columnCount(); yy+= 2, member++)
150 david 167
                {
151 david 168
                    if (member > config.num_legs)
169
                    {
170
                        break;
171
                    }
150 david 172
                    item = ui->tableWidget->item(ii,yy);
173
                    if (item)
174
                    {
175
                        strncpy(team_buf.members[member].name , qPrintable(item->data(Qt::EditRole).toString()), sizeof(team_buf.members[member].name));
176
                    }
177
                    item = ui->tableWidget->item(ii,1+yy);
178
                    if (item)
179
                    {
180
                        int age = item->data(Qt::EditRole).toInt();
181
                        if (age)
182
                        {
183
                            team_buf.members[member].age = age;
184
                        }
185
                    }
186
                }
187
 
188
                put_team_record( team, &team_buf );
189
            }
152 - 190
            else
191
            {
192
                bad = true;
193
            }
150 david 194
        }
152 - 195
        else
196
        {
197
            bad = true;
198
        }
199
        if (!bad)
200
        {
201
            ui->tableWidget->hideRow(ii);
202
        }
150 david 203
    }
152 - 204
 
205
    // Report errors
206
    if (bad_cat)
207
    {
208
        MainWindow::showMessage("Invalid Categories in data");
209
    }
150 david 210
}
153 - 211
 
212
/*========================================================================
213
 *
214
 *  Generate team name file
215
 *
216
 *  Purpose:
217
 *      This function is called to Generate team name file in the format
218
 *      that can be read by the load command
219
 *
220
 *      The file contains team number,Team name,Team class
221
 *      The operator is prompted to enter the name of the file
222
 *
223
 *  Parameters:
224
 *      None
225
 *
226
 *  Returns:
227
 *      Nothing
228
 *
229
 *========================================================================*/
230
void QmDialogLoadExternalTeams::storeData(const QString &efile)
231
{
232
    QFile file(efile);
233
    if ( ! file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) )
234
    {
235
        MainWindow::showMessage("Cannot open external data file");
236
        return;
237
    }
238
    QTextStream out(&file);
239
 
240
    // Print headings
155 david 241
    out << toCsv("Team Number");
242
    out << "," << toCsv("Team Name");
243
    out << "," <<  toCsv("Class Abr");
153 - 244
 
245
    for( int j = 1; j <= config.num_legs; j++ )
246
    {
155 david 247
        out << "," << toCsv("Competitor Name");
248
        out << "," << toCsv("Age");
153 - 249
    }
250
    out << endl;
251
 
252
    /*
253
     * Put the data into the file
254
     */
174 - 255
    team_type   team_buf;
153 - 256
    for(int i = config.min_team; i <= config.max_team; i++ )
257
    {
258
        if( valid_field( i ) && g_record( i, &team_buf ) )
259
        {
260
            /*
261
            **  Basic information
262
            **      - Team number
263
            **      - Full team name
264
            */
155 david 265
            out << toCsv(team_buf.numb);
266
            out << "," << toCsv(team_buf.name);
267
            out << "," << toCsv(team_buf.teamclass == 0 ? "" : config.team_class[team_buf.teamclass - 1].abr);
153 - 268
 
269
            for(int j = 1; j <= config.num_legs; j++ )
270
            {
155 david 271
                out << "," << toCsv(team_buf.members[j-1].name);
272
                out << "," << toCsv(team_buf.members[j-1].age);
153 - 273
            }
274
            out <<endl;
275
        }
276
    }
277
}
155 david 278
 
279
QStringList QmDialogLoadExternalTeams::splitCsvData( const QString str)
280
{
281
    QStringList results;
282
 
283
    const QChar *data = str.constData();
284
    while (!data->isNull())
285
    {
286
        QString result;
287
        bool quoted = false;
288
        /*
289
        **  Extract the next record
290
        */
291
        while ( TRUE )
292
        {
293
            QChar uch = *data;
294
 
295
            /*
296
            **  End of the field
297
            */
298
            if ( uch == '\n' || uch == '\r' || uch == '\0' )
299
                break;
300
 
301
            data++;
302
 
303
            /*
304
            ** Ugly character from MS CSV files
305
            */
306
            if ( uch == (char) 0xA0 )
307
            {
308
                continue;
309
            }
310
 
311
            if ( !quoted && uch == ',' )
312
            {
313
                break;
314
            }
315
 
316
            /*
317
            **  An unquoted " will start scanning for a matching quote
318
            */
319
            if ( !quoted && uch == '"' )
320
            {
321
                quoted = true;
322
                continue;
323
            }
324
 
325
            /*
326
            **  A quoted " may be an embedded quote or the end of a quote
327
            */
328
            if ( quoted && uch == '"' )
329
            {
330
                if ( *data != '"' )
331
                {
332
                    quoted = FALSE;
333
                    continue;
334
                }
335
 
336
                /*
337
                **  Skip one " and pick up the next
338
                */
339
                ++data;
340
            }
341
 
342
            /*
343
            **  Save this character
344
            */
345
            result += uch;
346
        }
347
 
348
        /*
349
        **  Clean up the extracted string
350
        */
351
        results += result.trimmed();
352
     }
353
    return results;
354
}
355
 
156 david 356
/*========================================================================
357
 *
358
 *  Generate team name file
359
 *
360
 *  Purpose:
361
 *      This function is called to Generate team name file
362
 *
363
 *      The file contains team number,Team name,Team class
364
 *      The operator is prompted to enter the name of the file
365
 *
366
 *  Parameters:
367
 *      None
368
 *
369
 *  Returns:
370
 *      Nothing
371
 *
372
 *========================================================================*/
373
 
374
void QmDialogLoadExternalTeams::storeTeamInfo(const QString &efile)
375
{
376
    QFile file(efile);
377
    if ( ! file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) )
378
    {
379
        MainWindow::showMessage("Cannot open external team info file");
380
        return;
381
    }
382
    QTextStream out(&file);
383
 
384
     /*
385
     * Put the data into the file
386
     */
174 - 387
    team_type   team_buf;
156 david 388
    for(int i = config.min_team; i <= config.max_team; i++ )
389
    {
390
        if( valid_field( i ) && g_record( i, &team_buf ) )
391
        {
392
            /*
393
            **  Basic information
394
            **      - Team number
395
            **      - Full team name
396
            **      - Category
397
            */
398
            out.setFieldAlignment(QTextStream::AlignLeft);
399
            out.setFieldWidth(5);
400
            out << team_buf.numb;
401
            out.setFieldWidth(0);
402
            out << ",";
403
            out.setFieldWidth(MAX_TM_NAME+1);
404
            out << team_buf.name;
405
            out.setFieldWidth(0);
406
            out << ",";
407
            out << (team_buf.teamclass <= 0 ? "" : config.team_class[team_buf.teamclass - 1].abr);
408
            out <<endl;
409
        }
410
    }
411
}
412
 
155 david 413
QString QmDialogLoadExternalTeams::toCsv(const QString &str)
414
{
415
    QString result = QString(str);
416
    if ( result.contains("\"") || result.contains(",") )
417
    {
418
        result.replace("\"", "\"\"");
419
        result.prepend("\"");
420
        result.append("\"");
421
    }
422
    return result;
423
}
424
 
425
QString QmDialogLoadExternalTeams::toCsv(const int data)
426
{
427
    return QString::number(data);
428
}