/*************************************************************************** begin : Sun Aug 3 2003 copyright : (C) 2003 by Jeroen Wijnhout : (C) 2007 by Holger Danielsson email : Jeroen.Wijnhout@kdemail.net holger.danielsson@versanet.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ // 2007-02-15 (dani) // - cosmetic changes // - use of groupboxes to prepare further extensions // 2007-03-12 (dani) // - use KileDocument::Extensions // - allowed extensions are always defined as list, f.e.: .tex .ltx .latex #include "kileprojectdlgs.h" #include #include #include #include #include #include #include #include #include #include #include #include "kiledebug.h" #include #include #include "kileproject.h" #include "kiletoolmanager.h" #include "kiledocumentinfo.h" #include "kileconfig.h" #include "kileextensions.h" #include "templates.h" const TQString whatsthisName = i18n("Insert a short descriptive name of your project here."); const TQString whatsthisPath = i18n("Insert the path to your project file here. If this file does not yet exists, it will be created. The filename should have the extension: .kilepr. You can also use the browse button to insert a filename."); const TQString whatsthisExt = i18n("Insert a list (separated by spaces) of file extensions which should be treated also as files of the corresponding type in this project."); const TQString whatsthisMaster = i18n("Select the default master document. Leave empty for auto detection."); const TQString tool_default = i18n("(use global setting)"); KileProjectDlgBase::KileProjectDlgBase(const TQString &caption, KileDocument::Extensions *extensions, TQWidget *parent, const char * name) : KDialogBase( KDialogBase::Plain, caption, (Ok | Cancel), Ok, parent, name, true, true), m_extmanager(extensions), m_project(0) { // properties groupbox m_pgroup = new TQVGroupBox(i18n("Project"), plainPage()); m_pgroup->setColumnLayout(0, TQt::Vertical ); m_pgroup->layout()->setSpacing( 6 ); m_pgroup->layout()->setMargin( 11 ); m_pgrid = new TQGridLayout( m_pgroup->layout() ); m_pgrid->setAlignment( TQt::AlignTop ); m_title = new KLineEdit(m_pgroup, "le_projectname"); TQWhatsThis::add(m_title, whatsthisName); m_plabel = new TQLabel(i18n("Project &title:"), m_pgroup); m_plabel->setBuddy(m_title); TQWhatsThis::add(m_plabel, whatsthisName); // extensions groupbox m_egroup= new TQVGroupBox(i18n("Extensions"), plainPage()); m_egroup->setColumnLayout(0, TQt::Vertical ); m_egroup->layout()->setSpacing( 6 ); m_egroup->layout()->setMargin( 11 ); m_egrid = new TQGridLayout( m_egroup->layout() ); m_egrid->setAlignment( TQt::AlignTop ); m_extensions = new KLineEdit(m_egroup, "le_ext"); TQRegExp reg("[\\. a-zA-Z0-9]+"); TQRegExpValidator *extValidator = new TQRegExpValidator(reg,m_egroup); m_extensions->setValidator(extValidator); m_sel_extensions = new KComboBox(false, m_egroup, "le_sel_ext"); m_sel_extensions->insertItem(i18n("Source Files")); m_sel_extensions->insertItem(i18n("Package Files")); m_sel_extensions->insertItem(i18n("Image Files")); m_lbPredefinedExtensions = new TQLabel(i18n("Predefined:"),m_egroup); m_lbStandardExtensions = new TQLabel(TQString(),m_egroup); TQWhatsThis::add(m_sel_extensions, whatsthisExt); TQWhatsThis::add(m_extensions, whatsthisExt); fillProjectDefaults(); connect(m_sel_extensions, TQ_SIGNAL(highlighted(int)), this, TQ_SLOT(slotExtensionsHighlighted(int))); connect(m_extensions, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotExtensionsTextChanged(const TQString&))); } KileProjectDlgBase::~KileProjectDlgBase() { } void KileProjectDlgBase::slotExtensionsHighlighted(int index) { disconnect(m_extensions, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotExtensionsTextChanged(const TQString&))); m_extensions->setText(m_val_extensions[index]); connect(m_extensions, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotExtensionsTextChanged(const TQString&))); m_lbStandardExtensions->setText( m_val_standardExtensions[index] ); } void KileProjectDlgBase::slotExtensionsTextChanged(const TQString &text) { m_val_extensions[m_sel_extensions->currentItem()] = text; } bool KileProjectDlgBase::acceptUserExtensions() { TQRegExp reg("\\.\\w+"); for (int i=KileProjectItem::Source; icurrentItem() == type-1) m_extensions->setText(ext); else m_val_extensions[type-1] = ext; } void KileProjectDlgBase::setProject(KileProject *project, bool override) { m_project = project; if ((!override) || (project == 0)) return; for (int i = KileProjectItem::Source; i < KileProjectItem::Other; ++i) { m_val_extensions[i - 1] = project->extensions((KileProjectItem::Type) i); } m_title->setText(m_project->name()); m_extensions->setText(m_val_extensions[0]); m_lbStandardExtensions->setText( m_val_standardExtensions[0] ); } KileProject* KileProjectDlgBase::project() { return m_project; } void KileProjectDlgBase::fillProjectDefaults() { m_val_extensions[0] = TQString(); m_val_extensions[1] = TQString(); m_val_extensions[2] = TQString(); //m_val_extensions[3] = OTHER_EXTENSIONS; m_val_standardExtensions[0] = m_extmanager->latexDocuments(); m_val_standardExtensions[1] = m_extmanager->latexPackages(); m_val_standardExtensions[2] = m_extmanager->images(); m_extensions->setText(m_val_extensions[0]); m_lbStandardExtensions->setText( m_val_standardExtensions[0] ); } /* * KileNewProjectDlg */ KileNewProjectDlg::KileNewProjectDlg(KileTemplate::Manager *templateManager, KileDocument::Extensions *extensions, TQWidget* parent, const char* name) : KileProjectDlgBase(i18n("Create New Project"), extensions, parent, name), m_templateManager(templateManager), m_filename(TQString()) { // Layout TQVBoxLayout *vbox = new TQVBoxLayout(plainPage(), 6,6 ); // first groupbox m_pgrid->addWidget(m_plabel, 0,0); m_pgrid->addWidget(m_title, 0,2); connect(m_title, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(makeProjectPath())); m_location = new KLineEdit(m_pgroup, "le_projectlocation"); m_location->setMinimumWidth(200); TQLabel *lb1 = new TQLabel(i18n("Project &file:"), m_pgroup); TQWhatsThis::add(lb1, whatsthisPath); TQWhatsThis::add(m_location, whatsthisPath); lb1->setBuddy(m_location); m_pbChooseDir= new KPushButton(i18n("Select Folder..."), m_pgroup, "dirchooser_button" ); m_pbChooseDir->setPixmap( SmallIcon("document-open") ); int wpixmap = m_pbChooseDir->pixmap()->width(); m_pbChooseDir->setFixedWidth(wpixmap+10); m_pbChooseDir->setFixedHeight(wpixmap+10); m_pgrid->addWidget(lb1,1,0); m_pgrid->addMultiCellWidget(m_location,1,1,2,3); m_pgrid->addWidget(m_pbChooseDir,1,5); m_pgrid->setColSpacing(1,8); m_pgrid->setColSpacing(4,8); m_pgrid->setColStretch(3,1); connect(m_pbChooseDir, TQ_SIGNAL(clicked()), this, TQ_SLOT(browseLocation())); // second groupbox TQVGroupBox* group2= new TQVGroupBox(i18n("File"), plainPage()); TQWidget *widget2 = new TQWidget(group2); TQGridLayout *grid2 = new TQGridLayout(widget2, 3,2, 6,6); m_cb = new TQCheckBox(i18n("Create a new file and add it to this project"),widget2); m_cb->setChecked(true); m_lb = new TQLabel(i18n("File&name (relative to where the project file is):"),widget2); m_file = new KLineEdit(widget2); m_lb->setBuddy(m_file); m_templateIconView = new TemplateIconView(widget2); m_templateIconView->setTemplateManager(m_templateManager); m_templateManager->scanForTemplates(); m_templateIconView->fillWithTemplates(KileDocument::LaTeX); TQWhatsThis::add(m_cb, i18n("If you want Kile to create a new file and add it to the project, then check this option and select a template from the list that will appear below.")); grid2->addMultiCellWidget(m_cb, 0,0, 0,1); grid2->addWidget(m_lb, 1,0); grid2->addWidget(m_file, 1,1); grid2->addMultiCellWidget(m_templateIconView, 2,2, 0,1); grid2->setColStretch(1,1); connect(m_cb, TQ_SIGNAL(clicked()), this, TQ_SLOT(clickedCreateNewFileCb())); // third groupbox m_egrid->addWidget(m_sel_extensions, 6,0); m_egrid->addMultiCellWidget(m_extensions, 6,6, 1,3); m_egrid->addWidget(m_lbPredefinedExtensions, 7,0); m_egrid->addMultiCellWidget(m_lbStandardExtensions, 7,7, 1,3); // add to layout vbox->addWidget(m_pgroup); vbox->addWidget(group2); vbox->addWidget(m_egroup); vbox->addStretch(); fillProjectDefaults(); } KileNewProjectDlg::~KileNewProjectDlg() {} KileProject* KileNewProjectDlg::project() { if (!m_project) { m_project = new KileProject(projectTitle(), KURL(location()), m_extmanager); KileProjectItem::Type type; for (int i = KileProjectItem::Source; i < KileProjectItem::Other; ++i) { type = (KileProjectItem::Type) i; m_project->setExtensions(type, extensions(type)); } m_project->buildProjectTree(); } return m_project; } void KileNewProjectDlg::clickedCreateNewFileCb() { if (m_cb->isChecked()) { m_file->show(); m_lb->show(); m_templateIconView->show(); } else { m_file->hide(); m_lb->hide(); m_templateIconView->hide(); } } TQString KileNewProjectDlg::bare() { return projectTitle().lower().stripWhiteSpace().replace(TQRegExp("\\s*"),"")+".kilepr"; } void KileNewProjectDlg::browseLocation() { TQString dir = m_dir; if (!TQFileInfo(m_dir).exists()) dir = TQString(); dir = KFileDialog::getExistingDirectory(dir, this); if (! dir.isNull()) { m_dir = dir; if (m_dir.right(1) != "/") m_dir = m_dir + '/'; m_location->setText(m_dir+bare()); } } void KileNewProjectDlg::makeProjectPath() { m_filename=bare(); KILE_DEBUG() << "BEFORE " << TQFileInfo(location()).absFilePath() << " " << TQFileInfo(location()).dirPath() << endl; m_dir = TQFileInfo(location()).dirPath(); if (m_dir.right(1) != "/") m_dir = m_dir + '/'; KILE_DEBUG() << "LOCATION " << location() << " AND " << m_dir << endl; m_location->setText(m_dir+m_filename); } void KileNewProjectDlg::slotOk() { if ( ! acceptUserExtensions() ) return; //replace ~ and environment variables in the paths KURLCompletion uc; uc.setReplaceEnv(true); uc.setReplaceHome(true); m_location->setText(uc.replacedPath(location())); m_file->setText(uc.replacedPath(file())); if ( projectTitle().stripWhiteSpace().isEmpty()) { if (KMessageBox::warningYesNo(this, i18n("You did not enter a project name, if you continue the project name will be set to: Untitled."), i18n("No Name")) == KMessageBox::Yes) m_title->setText(i18n("Untitled")); else return; } if ( location().stripWhiteSpace().isEmpty() ) { KMessageBox::error(this, i18n("Please enter the location where the project file should be save to. Also make sure it ends with .kilepr ."), i18n("Empty Location")); return; } TQFileInfo fi(location().stripWhiteSpace()); TQFileInfo dr(fi.dirPath()); TQDir dir = dr.dir(); if ( location().stripWhiteSpace().right(7) != ".kilepr") { KMessageBox::error(this, i18n("The extension of the project filename is not .kilepr , please correct the extension"), i18n("Wrong Filename Extension")); return; } else { if (dir.isRelative()) { KMessageBox::error(this, i18n("The path for the project file is not an absolute path, absolute paths always begin with an /"),i18n("Relative Path")); return; } KILE_DEBUG() << "==KileNewProjectDlg::slotOk()==============" << endl; KILE_DEBUG() << "\t" << location() << " " << fi.dirPath() << endl; if (! dr.exists()) { bool suc = true; TQStringList dirs = TQStringList::split("/", fi.dirPath()); TQString path; for (uint i=0; i < dirs.count(); ++i) { path += '/' + dirs[i]; dir.setPath(path); KILE_DEBUG() << "\tchecking : " << dir.absPath() << endl; if ( ! dir.exists() ) { dir.mkdir(dir.absPath()); suc = dir.exists(); KILE_DEBUG() << "\t\tcreated : " << dir.absPath() << " suc = " << suc << endl; } if (!suc) { KMessageBox::error(this, i18n("Could not create the project folder, check your permissions.")); return; } } } if (! dr.isWritable()) { KMessageBox::error(this, i18n("The project folder is not writable, check your permissions.")); return; } } if ( createNewFile() ) { if ( file().stripWhiteSpace().isEmpty()) { KMessageBox::error(this, i18n("Please enter a filename for the file that should be added to this project."), i18n("No File Name Given")); return; } //check for validity of name first, then check for existence (fixed by tbraun) KURL fileURL; fileURL.setFileName(file()); KURL validURL = KileDocument::Info::makeValidTeXURL(fileURL,m_extmanager->isTexFile(fileURL),true); if ( validURL != fileURL ) m_file->setText(validURL.fileName()); if ( TQFileInfo( TQDir(fi.dirPath()) , file().stripWhiteSpace()).exists() ) { if (KMessageBox::warningYesNo(this, i18n("The file \"%1\" already exists, overwrite it?").arg(file()), i18n("File Already Exists")) == KMessageBox::No) return; } } if (TQFileInfo(location()).exists()) { KMessageBox::error(this, i18n("The project file already exists, please select another name. Delete the existing project file if your intention was to overwrite it."),i18n("Project File Already Exists")); return; } accept(); } void KileNewProjectDlg::fillProjectDefaults() { m_dir = KileConfig::defaultProjectLocation(); if( !m_dir.endsWith("/") ) m_dir += '/'; KILE_DEBUG() << "M_DIR " << m_dir << endl; m_location->setText(m_dir); m_cb->setChecked(true); KileProjectDlgBase::fillProjectDefaults(); } TemplateItem* KileNewProjectDlg::getSelection() const { return static_cast(m_templateIconView->currentItem()); } /* * KileProjectOptionsDlg */ KileProjectOptionsDlg::KileProjectOptionsDlg(KileProject *project, KileDocument::Extensions *extensions, TQWidget *parent, const char * name) : KileProjectDlgBase(i18n("Project Options"), extensions, parent, name ) { // Layout TQVBoxLayout *vbox = new TQVBoxLayout(plainPage(), 6,6 ); m_pgrid->addWidget(m_plabel, 0,0); m_pgrid->addWidget(m_title, 0,2); // m_pgrid->addWidget(labelEncoding, 1,0); // m_pgrid->addWidget(m_lbEncoding, 1,2); m_pgrid->setColSpacing(1,8); m_pgrid->setColStretch(3,1); // second groupbox m_egrid->addWidget(m_sel_extensions, 6,0); m_egrid->addMultiCellWidget(m_extensions, 6,6, 1,3); m_egrid->addWidget(m_lbPredefinedExtensions, 7,0); m_egrid->addMultiCellWidget(m_lbStandardExtensions, 7,7, 1,3); // third groupbox TQVGroupBox* group3 = new TQVGroupBox(i18n("Properties"), plainPage()); group3->setColumnLayout(0, TQt::Vertical ); group3->layout()->setSpacing( 6 ); group3->layout()->setMargin( 11 ); TQGridLayout *grid3 = new TQGridLayout( group3->layout() ); grid3->setAlignment( TQt::AlignTop ); m_master = new KComboBox(false, group3, "master"); //m_master->setDisabled(true); TQLabel *lb1 = new TQLabel(i18n("&Master document:"), group3); lb1->setBuddy(m_master); lb1->setMinimumWidth( m_sel_extensions->sizeHint().width() ); TQWhatsThis::add(m_master, whatsthisMaster); TQWhatsThis::add(lb1,whatsthisMaster); m_master->insertItem(i18n("(auto-detect)")); TQPtrListIterator rit(*(project->rootItems())); int index = 0; while (rit.current()) { if ((*rit)->type() == KileProjectItem::Source) { m_master->insertItem((*rit)->url().fileName()); ++index; if ( (*rit)->url().path() == project->masterDocument() ) m_master->setCurrentItem(index); } ++rit; } if (project->masterDocument().isNull()) m_master->setCurrentItem(0); TQLabel *lb2 = new TQLabel(i18n("&QuickBuild configuration:"), group3); m_cbQuick = new KComboBox(group3); lb2->setBuddy(m_cbQuick); m_cbQuick->insertItem(tool_default); m_cbQuick->insertStringList(KileTool::configNames("QuickBuild", kapp->config())); m_cbQuick->setCurrentText(project->quickBuildConfig().length() > 0 ? project->quickBuildConfig() : tool_default ); //don't put this after the call to toggleMakeIndex setProject(project, true); m_ckMakeIndex = new TQCheckBox(i18n("&MakeIndex options"), group3); connect(m_ckMakeIndex, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(toggleMakeIndex(bool))); m_leMakeIndex = new KLineEdit(group3); m_ckMakeIndex->setChecked(project->useMakeIndexOptions()); toggleMakeIndex(m_ckMakeIndex->isChecked()); grid3->addWidget(lb1,0,0); grid3->addWidget(m_master,0,1); grid3->addWidget(lb2,1,0); grid3->addWidget(m_cbQuick,1,1); grid3->addWidget(m_ckMakeIndex,2,0); grid3->addMultiCellWidget(m_leMakeIndex,2,2,1,2); grid3->setColStretch(2,1); // add to layout vbox->addWidget(m_pgroup); vbox->addWidget(m_egroup); vbox->addWidget(group3); vbox->addStretch(); } KileProjectOptionsDlg::~KileProjectOptionsDlg() { } void KileProjectOptionsDlg::toggleMakeIndex(bool on) { KILE_DEBUG() << "TOGGLED!" << endl; m_leMakeIndex->setEnabled(on); m_project->setUseMakeIndexOptions(on); m_project->writeUseMakeIndexOptions(); m_project->readMakeIndexOptions(); m_leMakeIndex->setText(m_project->makeIndexOptions()); } void KileProjectOptionsDlg::slotOk() { if ( ! acceptUserExtensions() ) return; this->m_project->setName(m_title->text()); TQPtrListIterator rit(*(m_project->rootItems())); while (rit.current()) { if ((*rit)->url().fileName() == m_master->currentText() ) m_project->setMasterDocument((*rit)->url().path()); ++rit; } if (m_master->currentItem() == 0) m_project->setMasterDocument(TQString()); m_val_extensions[m_sel_extensions->currentItem()] = m_extensions->text(); for (int i = KileProjectItem::Source; i < KileProjectItem::Other; ++i) { m_project->setExtensions( (KileProjectItem::Type) i, m_val_extensions[i-1] ); } if ( m_cbQuick->currentText() == tool_default ) m_project->setQuickBuildConfig(""); else m_project->setQuickBuildConfig(m_cbQuick->currentText()); m_project->setUseMakeIndexOptions(m_ckMakeIndex->isChecked()); if ( m_project->useMakeIndexOptions() ) m_project->setMakeIndexOptions(m_leMakeIndex->text()); m_project->save(); accept(); } #include "kileprojectdlgs.moc"