diff --git a/glabels/LabelModel.cpp b/glabels/LabelModel.cpp index ed0fd99..bc9fbd8 100644 --- a/glabels/LabelModel.cpp +++ b/glabels/LabelModel.cpp @@ -28,6 +28,7 @@ #include #include +#include "MergeNone.h" #include "LabelModelObject.h" #include "LabelRegion.h" #include "XmlLabelCreator.h" @@ -45,6 +46,7 @@ namespace /// LabelModel::LabelModel() : mUntitledInstance(0), mModified(true), mTmplate(0), mRotate(false) { + mMerge = new MergeNone(); } @@ -283,10 +285,7 @@ void LabelModel::setMerge( Merge* merge ) { if ( merge != mMerge ) { - if ( mMerge ) - { - delete mMerge; - } + delete mMerge; mMerge = merge; emit mergeChanged(); diff --git a/glabels/MainWindow.cpp b/glabels/MainWindow.cpp index 832d7d9..56b76c5 100644 --- a/glabels/MainWindow.cpp +++ b/glabels/MainWindow.cpp @@ -169,6 +169,7 @@ void MainWindow::setModel( LabelModel *label ) mPropertiesView->setModel( mModel, mUndoRedoModel ); mLabelEditor->setModel( mModel, mUndoRedoModel ); mObjectEditor->setModel( mModel, mUndoRedoModel ); + mMergeView->setModel( mModel , mUndoRedoModel ); mPrintView->setModel( mModel ); mContents->setEnabled( true ); diff --git a/glabels/Merge.h b/glabels/Merge.h index 8731607..70bdf36 100644 --- a/glabels/Merge.h +++ b/glabels/Merge.h @@ -23,6 +23,7 @@ #include #include +#include #include #include "MergeRecord.h" @@ -78,7 +79,7 @@ public: // Virtual methods ///////////////////////////////// public: - virtual QList keyList() const = 0; + virtual QStringList keyList() const = 0; virtual QString primaryKey() const = 0; protected: virtual void open() = 0; diff --git a/glabels/MergeFactory.cpp b/glabels/MergeFactory.cpp index 665fbd1..bd786a5 100644 --- a/glabels/MergeFactory.cpp +++ b/glabels/MergeFactory.cpp @@ -79,9 +79,9 @@ Merge* MergeFactory::createMerge( const QString& id ) /// /// Get name list /// -QList MergeFactory::nameList() +QStringList MergeFactory::nameList() { - QList list; + QStringList list; foreach ( BackendEntry backend, mBackendIdMap ) { @@ -124,6 +124,22 @@ QString MergeFactory::nameToId( const QString& name ) } +/// +/// Convert ID to type +/// +MergeFactory::SourceType MergeFactory::idToType( const QString& id ) +{ + if ( mBackendIdMap.contains( id ) ) + { + return mBackendIdMap[id].type; + } + else + { + return NONE; + } +} + + /// /// Register backend /// diff --git a/glabels/MergeFactory.h b/glabels/MergeFactory.h index 03527f9..1bced79 100644 --- a/glabels/MergeFactory.h +++ b/glabels/MergeFactory.h @@ -23,6 +23,7 @@ #include "Merge.h" #include +#include /// @@ -55,9 +56,10 @@ public: static Merge* createMerge( const QString& id ); - static QList nameList(); + static QStringList nameList(); static QString idToName( const QString& id ); static QString nameToId( const QString& name ); + static SourceType idToType( const QString& id ); ///////////////////////////////// diff --git a/glabels/MergeNone.cpp b/glabels/MergeNone.cpp index 985afd8..ace7180 100644 --- a/glabels/MergeNone.cpp +++ b/glabels/MergeNone.cpp @@ -76,9 +76,9 @@ Merge* MergeNone::create() /// /// Get key list /// -QList MergeNone::keyList() const +QStringList MergeNone::keyList() const { - QList emptyList; + QStringList emptyList; return emptyList; } diff --git a/glabels/MergeNone.h b/glabels/MergeNone.h index a10b288..6d051c0 100644 --- a/glabels/MergeNone.h +++ b/glabels/MergeNone.h @@ -33,7 +33,7 @@ struct MergeNone : public Merge ///////////////////////////////// // Life Cycle ///////////////////////////////// -protected: +public: MergeNone(); MergeNone( const MergeNone* merge ); virtual ~MergeNone(); @@ -57,7 +57,7 @@ public: // Implementation of virtual methods ///////////////////////////////// public: - QList keyList() const; + QStringList keyList() const; QString primaryKey() const; protected: void open(); diff --git a/glabels/MergeText.cpp b/glabels/MergeText.cpp index 395f9e6..e389af3 100644 --- a/glabels/MergeText.cpp +++ b/glabels/MergeText.cpp @@ -20,6 +20,9 @@ #include "MergeText.h" +#include +#include + /// /// Constructor @@ -52,9 +55,9 @@ MergeText::~MergeText() /// /// Get key list /// -QList MergeText::keyList() const +QStringList MergeText::keyList() const { - QList keys; + QStringList keys; for ( int iField = 0; iField < mNFieldsMax; iField++ ) { keys << keyFromIndex(iField); @@ -89,6 +92,10 @@ void MergeText::open() { mKeys.clear(); } + else + { + mNFieldsMax = mKeys.size(); + } } } @@ -110,7 +117,7 @@ void MergeText::close() /// MergeRecord* MergeText::readNextRecord() { - QList values = parseLine(); + QStringList values = parseLine(); if ( !values.isEmpty() ) { MergeRecord* record = new MergeRecord(); @@ -121,6 +128,7 @@ MergeRecord* MergeText::readNextRecord() (*record)[ keyFromIndex(iField) ] = value; iField++; } + mNFieldsMax = std::max( mNFieldsMax, iField ); return record; } @@ -161,9 +169,9 @@ QString MergeText::keyFromIndex( int iField ) const /// Returns a list of fields. A blank line is considered a line with one /// empty field. Returns an empty list when done. /// -QList MergeText::parseLine() +QStringList MergeText::parseLine() { - QList fields; + QStringList fields; enum State { diff --git a/glabels/MergeText.h b/glabels/MergeText.h index 35f2311..5c76f15 100644 --- a/glabels/MergeText.h +++ b/glabels/MergeText.h @@ -45,7 +45,7 @@ protected: // Implementation of virtual methods ///////////////////////////////// public: - QList keyList() const; + QStringList keyList() const; QString primaryKey() const; protected: void open(); @@ -57,7 +57,7 @@ protected: // Private methods ///////////////////////////////// QString keyFromIndex( int iField ) const; - QList parseLine(); + QStringList parseLine(); ///////////////////////////////// @@ -68,7 +68,7 @@ private: bool mLine1HasKeys; QFile mFile; - QList mKeys; + QStringList mKeys; int mNFieldsMax; }; diff --git a/glabels/MergeTextCsv.cpp b/glabels/MergeTextCsv.cpp index d951606..086b885 100644 --- a/glabels/MergeTextCsv.cpp +++ b/glabels/MergeTextCsv.cpp @@ -26,7 +26,7 @@ /// MergeTextCsv::MergeTextCsv() : MergeText(',',false) { - mId = "Text/CSV"; + mId = "Text/Comma"; } @@ -60,7 +60,7 @@ MergeTextCsv* MergeTextCsv::clone() const /// QString MergeTextCsv::id() { - return "Text/CSV"; + return "Text/Comma"; } diff --git a/glabels/MergeView.cpp b/glabels/MergeView.cpp index 986beb4..b408dce 100644 --- a/glabels/MergeView.cpp +++ b/glabels/MergeView.cpp @@ -21,6 +21,7 @@ #include "MergeView.h" #include "LabelModel.h" +#include "MergeFactory.h" #include @@ -31,6 +32,9 @@ MergeView::MergeView( QWidget *parent ) : QWidget(parent), mModel(0) { setupUi( this ); + + mMergeFormatNames = MergeFactory::nameList(); + formatCombo->addItems( mMergeFormatNames ); } @@ -45,17 +49,114 @@ MergeView::~MergeView() /// /// Set Model /// -void MergeView::setModel( LabelModel* model ) +void MergeView::setModel( LabelModel* model, UndoRedoModel* undoRedoModel ) { mModel = model; + mUndoRedoModel = undoRedoModel; - connect( mModel, SIGNAL(changed()), this, SLOT(onLabelChanged()) ); + onMergeChanged(); + connect( mModel, SIGNAL(changed()), this, SLOT(onMergeChanged()) ); } /// -/// Label changed handler +/// Merge changed handler /// -void MergeView::onLabelChanged() +void MergeView::onMergeChanged() { + int index = mMergeFormatNames.indexOf( MergeFactory::idToName( mModel->merge()->id() ) ); + formatCombo->setCurrentIndex( index ); + + switch ( MergeFactory::idToType( mModel->merge()->id() ) ) + { + case MergeFactory::NONE: + case MergeFactory::FIXED: + locationLabel->setEnabled( false ); + locationButton->setEnabled( false ); + locationButton->setText( "" ); + break; + + case MergeFactory::FILE: + locationLabel->setEnabled( true ); + locationButton->setEnabled( true ); + if ( mModel->merge()->source().isEmpty() ) + { + locationButton->setText( "" ); + } + else + { + locationButton->setText( mModel->merge()->source() ); + } + break; + + default: + qWarning( "MergeView::onMergeChanged()::Should not be reached!" ); + break; + } + + loadHeaders( mModel->merge() ); + loadTable( mModel->merge() ); +} + + +/// +/// Load headers +/// +void MergeView::loadHeaders( Merge* merge ) +{ + mKeys = merge->keyList(); + + recordsTable->setColumnCount( mKeys.size() + 1 ); + + QTableWidgetItem* item = new QTableWidgetItem(); + item->setFlags( Qt::ItemIsEnabled ); + recordsTable->setHorizontalHeaderItem( 0, item ); + + int iCol = 1; + foreach ( QString key, mKeys ) + { + QTableWidgetItem* item = new QTableWidgetItem( key ); + item->setFlags( Qt::ItemIsEnabled ); + recordsTable->setHorizontalHeaderItem( iCol, item ); + + iCol++; + } +} + + +/// +/// Load table +/// +void MergeView::loadTable( Merge* merge ) +{ + const QList& records = merge->recordList(); + recordsTable->setRowCount( records.size() ); + + int iRow = 0; + foreach ( MergeRecord* record, records ) + { + QTableWidgetItem* item = new QTableWidgetItem(); + item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ); + item->setCheckState( record->isSelected() ? Qt::Checked : Qt::Unchecked ); + recordsTable->setItem( iRow, 0, item ); + recordsTable->resizeColumnToContents( 0 ); + + int iCol = 1; + foreach ( QString key, mKeys ) + { + if ( record->contains( key ) ) + { + QTableWidgetItem* item = new QTableWidgetItem( (*record)[key] ); + item->setFlags( Qt::ItemIsEnabled ); + recordsTable->setItem( iRow, iCol, item ); + recordsTable->resizeColumnToContents( iCol ); + } + + iCol++; + } + + iRow++; + } + + } diff --git a/glabels/MergeView.h b/glabels/MergeView.h index 2a2d6ba..43b99a9 100644 --- a/glabels/MergeView.h +++ b/glabels/MergeView.h @@ -24,7 +24,10 @@ #include "ui_MergeView.h" -class LabelModel; // Forward reference +// Forward references +class LabelModel; +class UndoRedoModel; +class Merge; /// @@ -46,21 +49,34 @@ public: ///////////////////////////////// // Public methods ///////////////////////////////// - void setModel( LabelModel* model ); + void setModel( LabelModel* model, UndoRedoModel* undoRedoModel ); ///////////////////////////////// // Slots ///////////////////////////////// private slots: - void onLabelChanged(); + void onMergeChanged(); + + + ///////////////////////////////// + // Private methods + ///////////////////////////////// +private: + void loadHeaders( Merge* merge ); + void loadTable( Merge* merge ); ///////////////////////////////// // Private Data ///////////////////////////////// private: + QStringList mMergeFormatNames; + LabelModel* mModel; + UndoRedoModel* mUndoRedoModel; + + QStringList mKeys; }; diff --git a/glabels/glabels_main.cpp b/glabels/glabels_main.cpp index 2b3fc94..0d4514c 100644 --- a/glabels/glabels_main.cpp +++ b/glabels/glabels_main.cpp @@ -23,6 +23,7 @@ #include "libglabels/Db.h" #include "Settings.h" +#include "MergeFactory.h" #include "StartupWizard.h" @@ -36,6 +37,7 @@ int main( int argc, char **argv ) Settings::init(); glabels::Db::init(); + MergeFactory::init(); ////// TEMPORARY TESTING //////// #if 0 glabels::Db::printKnownPapers();