11 #include <klineedit.h> 12 #include <tqtextedit.h> 13 #include <tqcombobox.h> 15 #include <tqfileinfo.h> 19 #include <tdelocale.h> 20 #include <kiconloader.h> 21 #include <kcharsets.h> 23 #include <tdemessagebox.h> 25 #include "generalinfowidget.h" 26 #include "generalinfowidget.moc" 28 #include "projectmanager.h" 30 TQString makeRelativePath(
const TQString& fromPath,
const TQString& toPath);
32 GeneralInfoWidget::GeneralInfoWidget(TQDomDocument &projectDom, TQWidget *parent,
const char *name)
33 : GeneralInfoWidgetBase(parent, name), m_projectDom(projectDom) {
35 connect(project_directory_edit, TQT_SIGNAL(textChanged(
const TQString&)),
36 this, TQT_SLOT(slotProjectDirectoryChanged(
const TQString&)));
37 connect(project_directory_combo, TQT_SIGNAL(activated(
int)),
38 this, TQT_SLOT(slotProjectDirectoryComboChanged()));
44 GeneralInfoWidget::~GeneralInfoWidget() {}
46 void GeneralInfoWidget::readConfig() {
47 if(DomUtil::readBoolEntry(m_projectDom,
"/general/absoluteprojectpath",
false))
48 this->project_directory_combo->setCurrentItem(0);
50 this->project_directory_combo->setCurrentItem(1);
51 this->project_directory_edit->setText(DomUtil::readEntry(m_projectDom,
"/general/projectdirectory",
"."));
52 this->author_edit->setText(DomUtil::readEntry(m_projectDom,
"/general/author"));
53 this->email_edit->setText(DomUtil::readEntry(m_projectDom,
"/general/email"));
54 this->version_edit->setText(DomUtil::readEntry(m_projectDom,
"/general/version"));
55 this->description_edit->setText(DomUtil::readEntry(m_projectDom,
"/general/description"));
57 TQStringList encodings;
58 encodings << i18n(
"Use global editor settings");
59 encodings += TDEGlobal::charsets()->descriptiveEncodingNames();
60 TQStringList::const_iterator it = encodings.constBegin();
61 while ( it != encodings.constEnd() )
63 encoding_combo->insertItem( *it );
66 encoding_combo->setCurrentItem( 0 );
69 const TQString DefaultEncoding = DomUtil::readEntry( m_projectDom,
"/general/defaultencoding", TQString() );
70 for (
int i = 0; i < encoding_combo->count(); i++ )
72 if ( TDEGlobal::charsets()->encodingForName( encoding_combo->text( i ) ) == DefaultEncoding )
74 encoding_combo->setCurrentItem( i );
90 void GeneralInfoWidget::configureinUpdateVersion( TQString configureinpath, TQString newVersion )
92 TQFile configurein(configureinpath);
94 if ( !configurein.open( IO_ReadOnly ) ){
95 KMessageBox::error(
this, i18n(
"Could not open %1 for reading.").arg(configureinpath));
99 TQTextStream stream( &configurein);
107 TQRegExp ac_init(
"^AC_INIT\\s*\\(\\s*([^,]+),([^,\\)]+)(.*)");
111 TQRegExp am_autoSpace(
"^AM_INIT_AUTOMAKE\\s{0,}\\(\\s{0,}([\\[\\s]{0,}[^\\s]+)\\s+([^\\s\\)\\]]+)(.*)");
114 TQRegExp am_autoComma(
"^AM_INIT_AUTOMAKE\\s*\\(\\s*([^,]+),([^,\\)]+)(.*)");
118 TQRegExp ac_define(
"^AC_DEFINE\\s*\\(");
119 TQRegExp version(
"(\\bversion\\b)");
120 version.setCaseSensitive(FALSE);
122 while ( !stream.eof() ) {
123 TQString line = stream.readLine();
124 if ( ac_init.search(line) >= 0){
125 line =
"AC_INIT(" + ac_init.cap(1).stripWhiteSpace();
128 line += ac_init.cap(3).stripWhiteSpace();
130 else if ( am_autoComma.search(line) >= 0 ){
131 line=
"AM_INIT_AUTOMAKE(";
132 line += am_autoComma.cap(1).stripWhiteSpace();
135 line += am_autoComma.cap(3).stripWhiteSpace();
137 else if ( am_autoSpace.search(line) >= 0 ){
138 line =
"AM_INIT_AUTOMAKE(" + am_autoSpace.cap(1).stripWhiteSpace();
142 line += am_autoSpace.cap(3).stripWhiteSpace();
144 else if ( ac_define.search(line) >=0 && version.search(line) >=0) {
146 line=
"AC_DEFINE(" + version.cap(1).stripWhiteSpace()+
", \"" + newVersion +
"\")";
148 list.push_back(line);
153 TQFile configureout(configureinpath);
154 if ( !configureout.open( IO_WriteOnly ) ){
155 KMessageBox::error(
this, i18n(
"Could not open %1 for writing.").arg(configureinpath));
158 TQTextStream output( &configureout);
159 for(TQStringList::iterator iter = list.begin();iter!=list.end();iter++){
160 output << (*iter) <<
"\n";
162 configureout.close();
165 void GeneralInfoWidget::writeConfig() {
166 DomUtil::writeEntry(m_projectDom,
"/general/projectdirectory",project_directory_edit->text());
167 DomUtil::writeBoolEntry(m_projectDom,
"/general/absoluteprojectpath",isProjectDirectoryAbsolute());
168 DomUtil::writeEntry(m_projectDom,
"/general/email",email_edit->text());
169 DomUtil::writeEntry(m_projectDom,
"/general/author",author_edit->text());
170 DomUtil::writeEntry(m_projectDom,
"/general/email",email_edit->text());
171 if ( DomUtil::readEntry(m_projectDom,
"/general/version") != version_edit->text() && !DomUtil::elementByPath( m_projectDom,
"/kdevautoproject").isNull() ){
173 TQFile inInFile(projectDirectory() +
"/configure.in.in");
174 TQFile inFile(projectDirectory() +
"/configure.in");
175 TQFile acFile(projectDirectory() +
"/configure.ac");
176 if ( inInFile.exists()){
177 configureinUpdateVersion( inInFile.name(), version_edit->text() );
179 if ( inFile.exists()){
180 configureinUpdateVersion( inFile.name(), version_edit->text() );
182 if (acFile.exists()){
183 configureinUpdateVersion( acFile.name(), version_edit->text() );
185 if (! inInFile.exists()&& !inFile.exists() && !acFile.exists()) {
186 KMessageBox::error(
this, i18n(
"Could not find configure.in.in, configure.in or configure.ac to update the project version."));
189 DomUtil::writeEntry(m_projectDom,
"/general/version",version_edit->text());
190 DomUtil::writeEntry(m_projectDom,
"/general/description",description_edit->text());
192 TQString DefaultEncoding = TQString();
193 if ( encoding_combo->currentItem() > 0 )
195 DefaultEncoding = TDEGlobal::charsets()->encodingForName( encoding_combo->currentText() );
197 DomUtil::writeEntry( m_projectDom,
"/general/defaultencoding", DefaultEncoding );
200 void GeneralInfoWidget::accept() {
204 bool GeneralInfoWidget::isProjectDirectoryAbsolute() {
205 return project_directory_combo->currentItem() == 0;
208 TQString GeneralInfoWidget::projectDirectory() {
209 return ProjectManager::projectDirectory( project_directory_edit->text(), isProjectDirectoryAbsolute() );
212 void GeneralInfoWidget::slotProjectDirectoryChanged(
const TQString& text ) {
215 setProjectDirectoryError(i18n(
"Please enter a path."));
217 else if(isProjectDirectoryAbsolute() && text[0] !=
'/')
219 setProjectDirectoryError(
220 i18n(
"'%1' is not an absolute path.").arg(
221 project_directory_edit->text()));
223 else if(!isProjectDirectoryAbsolute() && text[0] ==
'/')
225 setProjectDirectoryError(
226 i18n(
"'%1' is not a relative path.").arg(
227 project_directory_edit->text()));
231 TQFileInfo info(projectDirectory());
233 setProjectDirectoryError(
234 i18n(
"'%1' does not exist.").arg(
235 project_directory_edit->text()));
236 else if(!info.isDir())
237 setProjectDirectoryError(
238 i18n(
"'%1' is not a directory.").arg(
239 project_directory_edit->text()));
241 setProjectDirectorySuccess();
245 void GeneralInfoWidget::slotProjectDirectoryComboChanged() {
246 TQString text = project_directory_edit->text();
247 if(isProjectDirectoryAbsolute() && text[0] !=
'/' )
248 project_directory_edit->setText(ProjectManager::projectDirectory(text,
false));
249 else if(!isProjectDirectoryAbsolute() && text[0] ==
'/')
251 project_directory_edit->setText(KURL(ProjectManager::getInstance()->projectFile(), text).url());
255 void GeneralInfoWidget::setProjectDirectoryError(
const TQString& error ) {
256 project_directory_diagnostic_icon->setPixmap(SmallIcon(
"no"));
257 project_directory_diagnostic_label->setText( error );
260 void GeneralInfoWidget::setProjectDirectorySuccess() {
261 project_directory_diagnostic_icon->setPixmap(SmallIcon(
"ok"));
262 if(isProjectDirectoryAbsolute())
263 project_directory_diagnostic_label->setText(
264 i18n(
"'%1' is a valid project directory.").arg(projectDirectory()));
266 project_directory_diagnostic_label->setText(
267 i18n(
"'%1' is a valid project directory.").arg(projectDirectory()));
270 TQString makeRelativePath(
const TQString& fromPath,
const TQString& toPath)
272 if ( fromPath == toPath )
275 TQStringList fromDirs = TQStringList::split(
'/', fromPath );
276 TQStringList toDirs = TQStringList::split(
'/', toPath );
277 TQStringList::iterator fromIt = fromDirs.begin();
278 TQStringList::iterator toIt = toDirs.begin();
282 for ( ; (*fromIt) == (*toIt); ++fromIt, ++toIt )
285 for ( ; fromIt != fromDirs.end(); ++fromIt )
288 for ( ; toIt != toDirs.end(); ++toIt )
289 relative += *toIt +
"/";