You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
9.3 KiB
259 lines
9.3 KiB
/***************************************************************************
|
|
codegenerationwizard.cpp - description
|
|
-------------------
|
|
begin : Wed Jul 24 2002
|
|
copyright : (C) 2002 by Paul Hensgen
|
|
email : phensgen@users.sourceforge.net
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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. *
|
|
* *
|
|
* copyright (C) 2003-2007 *
|
|
* Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
|
|
***************************************************************************/
|
|
|
|
// own header
|
|
#include "codegenerationwizard.h"
|
|
|
|
// qt/kde includes
|
|
#include <tqdir.h>
|
|
#include <tqlistview.h>
|
|
#include <tqfileinfo.h>
|
|
#include <tqapplication.h>
|
|
#include <kdebug.h>
|
|
#include <tdelocale.h>
|
|
#include <tdemessagebox.h>
|
|
|
|
// local includes
|
|
#include "codegenerationoptionspage.h"
|
|
#include "../classifier.h"
|
|
#include "../codegenerator.h"
|
|
#include "../uml.h"
|
|
#include "../umldoc.h"
|
|
|
|
|
|
CodeGenerationWizard::CodeGenerationWizard(UMLClassifierList *classList)
|
|
: CodeGenerationWizardBase((TQWidget*)UMLApp::app()) {
|
|
m_doc = UMLApp::app()->getDocument();
|
|
m_app = UMLApp::app();
|
|
m_availableList -> setAllColumnsShowFocus(true);
|
|
m_availableList -> setResizeMode(TQListView::AllColumns);
|
|
m_selectedList -> setAllColumnsShowFocus(true);
|
|
m_selectedList -> setResizeMode(TQListView::AllColumns);
|
|
m_statusList -> setAllColumnsShowFocus(true);
|
|
m_statusList -> setResizeMode(TQListView::AllColumns);
|
|
|
|
m_CodeGenerationOptionsPage = new CodeGenerationOptionsPage(this);
|
|
connect( m_CodeGenerationOptionsPage, TQT_SIGNAL(languageChanged()), this, TQT_SLOT(changeLanguage()) );
|
|
|
|
insertPage(m_CodeGenerationOptionsPage, i18n("Code Generation Options"), 1);
|
|
|
|
UMLClassifierList cList;
|
|
|
|
if (classList == NULL) {
|
|
cList = m_doc->getClassesAndInterfaces();
|
|
classList = &cList;
|
|
}
|
|
for (UMLClassifier *c = classList->first(); c ; c = classList->next()) {
|
|
new TQListViewItem( m_selectedList, c->getFullyQualifiedName());
|
|
}
|
|
|
|
setNextEnabled(page(0),m_selectedList->childCount() > 0);
|
|
|
|
setFinishEnabled(page(2),true);
|
|
finishButton()->disconnect();
|
|
finishButton()->setText(i18n("&Generate"));
|
|
connect(finishButton(),TQT_SIGNAL(clicked()),this,TQT_SLOT(generateCode()));
|
|
if ( TQApplication::reverseLayout() )
|
|
{
|
|
TQPixmap tmpPixmap( *m_addButton->pixmap() );
|
|
m_addButton->setPixmap(*m_removeButton->pixmap());
|
|
m_removeButton->setPixmap(tmpPixmap);
|
|
}
|
|
}
|
|
|
|
CodeGenerationWizard::~CodeGenerationWizard() {}
|
|
|
|
|
|
void CodeGenerationWizard::selectClass() {
|
|
moveSelectedItems(m_availableList, m_selectedList);
|
|
|
|
if (m_selectedList->childCount() > 0) {
|
|
setNextEnabled(currentPage(), true);
|
|
}
|
|
}
|
|
|
|
void CodeGenerationWizard::deselectClass() {
|
|
moveSelectedItems(m_selectedList, m_availableList);
|
|
|
|
if (m_selectedList->childCount() == 0) {
|
|
setNextEnabled(currentPage(), false);
|
|
}
|
|
}
|
|
|
|
void CodeGenerationWizard::generateCode() {
|
|
backButton()->setEnabled(false);
|
|
|
|
CodeGenerator* codeGenerator = m_app->getGenerator();
|
|
|
|
if (codeGenerator) {
|
|
|
|
cancelButton()->setEnabled(false);
|
|
|
|
connect( codeGenerator, TQT_SIGNAL(codeGenerated(UMLClassifier*, bool)),
|
|
this, TQT_SLOT(classGenerated(UMLClassifier*, bool)) );
|
|
|
|
UMLClassifierList cList;
|
|
cList.setAutoDelete(false);
|
|
|
|
for(TQListViewItem *item = m_statusList->firstChild(); item;
|
|
item = item-> nextSibling()) {
|
|
UMLClassifier *concept = m_doc->findUMLClassifier(item->text(0));
|
|
cList.append(concept);
|
|
}
|
|
codeGenerator->writeCodeToFile(cList);
|
|
finishButton()->setText(i18n("Finish"));
|
|
finishButton()->disconnect();
|
|
connect(finishButton(),TQT_SIGNAL(clicked()),this,TQT_SLOT(accept()));
|
|
|
|
}
|
|
}
|
|
|
|
void CodeGenerationWizard::classGenerated(UMLClassifier* concept, bool generated) {
|
|
TQListViewItem* item = m_statusList->findItem( concept->getFullyQualifiedName(), 0 );
|
|
if( !item ) {
|
|
kError()<<"GenerationStatusPage::Error finding class in list view"<<endl;
|
|
} else if (generated) {
|
|
item->setText( 1, i18n("Code Generated") );
|
|
} else {
|
|
item->setText( 1, i18n("Not Generated") );
|
|
}
|
|
}
|
|
|
|
void CodeGenerationWizard::populateStatusList() {
|
|
m_statusList->clear();
|
|
for(TQListViewItem* item = m_selectedList->firstChild(); item; item = item->nextSibling()) {
|
|
new TQListViewItem(m_statusList,item->text(0),i18n("Not Yet Generated"));
|
|
}
|
|
}
|
|
|
|
void CodeGenerationWizard::showPage(TQWidget *page) {
|
|
if (indexOf(page) == 2)
|
|
{
|
|
// first save the settings to the selected generator policy
|
|
((CodeGenerationOptionsPage*)TQWizard::page(1))->apply();
|
|
|
|
// before going on to the final page, check that the output directory exists and is
|
|
// writable
|
|
|
|
// get the policy for the current code generator
|
|
CodeGenerationPolicy *policy = UMLApp::app()->getCommonPolicy();
|
|
|
|
// get the output directory path
|
|
TQFileInfo info(policy->getOutputDirectory().absPath());
|
|
if(!info.exists())
|
|
{
|
|
if (KMessageBox::questionYesNo(this,
|
|
i18n("The folder %1 does not exist. Do you want to create it now?").arg(info.filePath()),
|
|
i18n("Output Folder Does Not Exist"), i18n("Create Folder"), i18n("Do Not Create")) == KMessageBox::Yes)
|
|
{
|
|
TQDir dir;
|
|
if(!dir.mkdir(info.filePath()))
|
|
{
|
|
KMessageBox::sorry(this,i18n("The folder could not be created.\nPlease make sure you have write access to its parent folder or select another, valid, folder."),
|
|
i18n("Error Creating Folder"));
|
|
return;
|
|
}
|
|
//else, directory created
|
|
}
|
|
else // do not create output directory
|
|
{
|
|
KMessageBox::information(this,i18n("Please select a valid folder."),
|
|
i18n("Output Folder Does Not Exist"));
|
|
return;
|
|
}
|
|
} else {
|
|
//directory exists.. make sure we can write to it
|
|
if(!info.isWritable())
|
|
{
|
|
KMessageBox::sorry(this,i18n("The output folder exists, but it is not writable.\nPlease set the appropriate permissions or choose another folder."),
|
|
i18n("Error Writing to Output Folder"));
|
|
return;
|
|
}
|
|
// it exits and we can write... make sure it is a directory
|
|
if(!info.isDir())
|
|
{
|
|
KMessageBox::sorry(this,i18n("%1 does not seem to be a folder. Please choose a valid folder.").arg(info.filePath()),
|
|
i18n("Please Choose Valid Folder"));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
populateStatusList();
|
|
TQWizard::showPage(page);
|
|
}
|
|
|
|
CodeGenerator* CodeGenerationWizard::generator() {
|
|
// FIX
|
|
/*
|
|
KLibLoader* loader = KLibLoader::self();
|
|
if(!loader) {
|
|
kDebug()<<"error getting KLibLoader!"<<endl;
|
|
return 0;
|
|
}
|
|
|
|
KLibFactory* fact = loader->factory(info->library.latin1());
|
|
if(!fact) {
|
|
kDebug()<<"error getting the Factory"<<endl;
|
|
return 0;
|
|
}
|
|
|
|
TQObject* o=fact->create(m_doc, 0, info->object.latin1());
|
|
if(!o) {
|
|
kDebug()<<"could not create object"<<endl;
|
|
return 0;
|
|
}
|
|
|
|
CodeGenerator* g = (CodeGenerator*)o;
|
|
// g->setDocument(m_doc);
|
|
return g;
|
|
*/
|
|
return (CodeGenerator*) NULL;
|
|
}
|
|
|
|
void CodeGenerationWizard::moveSelectedItems(TQListView* fromList, TQListView* toList) {
|
|
TQListViewItemIterator it(fromList, TQListViewItemIterator::Selected);
|
|
while (it.current()) {
|
|
TQListViewItem* selectedItem = it.current();
|
|
|
|
TQString name = selectedItem->text(0);
|
|
if (!toList->findItem(name, 0)) {
|
|
new TQListViewItem(toList, name);
|
|
}
|
|
|
|
++it;
|
|
|
|
//Removed here because it can't (really, shouldn't) be removed while
|
|
//iterator is pointing to it
|
|
fromList->removeItem(selectedItem);
|
|
}
|
|
}
|
|
|
|
// when we change language, we need to update the codegenoptions page
|
|
// language-dependent stuff. THe way to do this is to call its "apply" method.
|
|
void CodeGenerationWizard::changeLanguage()
|
|
{
|
|
m_app->setActiveLanguage( m_CodeGenerationOptionsPage->getCodeGenerationLanguage() );
|
|
/* @todo is this needed? if yes adapt to new scheme
|
|
m_CodeGenerationOptionsPage->setCodeGenerator(m_doc->getCurrentCodeGenerator());
|
|
*/
|
|
m_CodeGenerationOptionsPage->apply();
|
|
}
|
|
|
|
#include "codegenerationwizard.moc"
|