/*************************************************************************** * Copyright (C) 2006-2007 by Rajko Albrecht * * ral@alwins-world.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. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "propertyitem.h" #include "propertylist.h" #include "propertiesdlg.h" #include "editproperty_impl.h" #include "svnitem.h" #include "client.h" #include #include #include #include #include #include #include #include #include #include #include /* * Constructs a PropertiesDlg as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * TRUE to construct a modal dialog. */ PropertiesDlg::PropertiesDlg(SvnItem*which, svn::Client*aClient, const svn::Revision&aRev, TQWidget* parent, const char* name, bool modal) : KDialogBase(parent,name,modal,i18n("Modify properties"),Ok|Cancel/*|Help|User1|User2*/, Ok, true/*, KStdGuiItem::add(),KStdGuiItem::remove() */), m_Item(which),m_changed(false), m_Client(aClient),m_Rev(aRev) { if ( !name ) setName( "PropertiesDlg" ); TQWidget * m = makeMainWidget(); PropertiesDlgLayout = new TQHBoxLayout(m, marginHint(), spacingHint(), "PropertiesDlgLayout"); m_PropertiesListview = new Propertylist(m, "m_PropertiesListview" ); m_PropertiesListview->setAllColumnsShowFocus( TRUE ); m_PropertiesListview->setShowSortIndicator( TRUE ); m_PropertiesListview->setCommitchanges(false); m_PropertiesListview->setItemsRenameable(true); m_PropertiesListview->setRenameable(0,true); m_PropertiesListview->setRenameable(1,true); m_PropertiesListview->setFullWidth( TRUE ); PropertiesDlgLayout->addWidget( m_PropertiesListview); m_rightLayout = new TQVBoxLayout(0, marginHint(), spacingHint(), "m_rightLayout"); m_AddButton = new KPushButton(m, "m_AddButton" ); m_rightLayout->addWidget( m_AddButton ); m_ModifyButton = new KPushButton(m, "m_ModifyButton" ); m_rightLayout->addWidget( m_ModifyButton ); m_DeleteButton = new KPushButton(m, "m_DeleteButton" ); m_rightLayout->addWidget( m_DeleteButton ); m_rightSpacer = new TQSpacerItem( 20, 40, TQSizePolicy::Minimum, TQSizePolicy::Expanding ); m_rightLayout->addItem(m_rightSpacer); PropertiesDlgLayout->addLayout(m_rightLayout); m_DeleteButton->setEnabled(false); m_ModifyButton->setEnabled(false); //PropertiesDlgLayout->addLayout(midLayout); languageChange(); clearWState( WState_Polished ); // signals and slots connections connect( m_AddButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotAdd())); connect( m_ModifyButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotModify())); connect( m_DeleteButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotDelete())); connect(this,TQT_SIGNAL(helpClicked()),TQT_SLOT(slotHelp())); connect(m_PropertiesListview,TQT_SIGNAL(selectionChanged(TQListViewItem*)),this,TQT_SLOT(slotSelectionChanged(TQListViewItem*))); // connect(m_PropertiesListview,TQT_SIGNAL(executed(TQListViewItem*)),this,TQT_SLOT(slotSelectionExecuted(TQListViewItem*))); if (!m_Client) { m_PropertiesListview->setEnabled(false); } } bool PropertiesDlg::hasChanged()const { return m_changed; } /* * Destroys the object and frees any allocated resources */ PropertiesDlg::~PropertiesDlg() { // no need to delete child widgets, TQt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void PropertiesDlg::languageChange() { setCaption( i18n("View and modify properties") ); TQToolTip::add(m_PropertiesListview, i18n( "List of properties set" )); m_AddButton->setText(i18n("Add property")); m_ModifyButton->setText(i18n("Modify property")); m_DeleteButton->setText(i18n("Delete property")); } void PropertiesDlg::slotHelp() { tqWarning( "PropertiesDlg::slotHelp(): Not implemented yet" ); } void PropertiesDlg::slotSelectionChanged(TQListViewItem*item) { m_DeleteButton->setEnabled(item); m_ModifyButton->setEnabled(item); if (!item || item->rtti()!=PropertyListViewItem::_RTTI_) return; PropertyListViewItem*ki = static_cast (item); if (PropertyListViewItem::protected_Property(ki->currentName())) { m_DeleteButton->setEnabled(false); m_ModifyButton->setEnabled(false); return; } if (ki->deleted()) { m_DeleteButton->setText(i18n("Undelete property")); } else { m_DeleteButton->setText(i18n("Delete property")); } } /*! \fn PropertiesDlg::initItem */ void PropertiesDlg::initItem() { TQString ex; if (!m_Client) { ex = i18n("Missing SVN link"); emit clientException(ex); return; } svn::Path what(m_Item->fullName()); svn::PathPropertiesMapListPtr propList; try { propList = m_Client->proplist(what,m_Rev,m_Rev); } catch (const svn::ClientException&e) { emit clientException(e.msg()); return; } m_PropertiesListview->displayList(propList,true,m_Item->fullName()); initDone = true; } /*! \fn PropertiesDlg::exec() */ int PropertiesDlg::exec() { return KDialogBase::exec(); } void PropertiesDlg::polish() { KDialogBase::polish(); initItem(); } /*! \fn PropertiesDlg::slotSelectionExecuted(TQListViewItem*) */ void PropertiesDlg::slotSelectionExecuted(TQListViewItem*) { } /*! \fn PropertiesDlg::slotAdd() */ void PropertiesDlg::slotAdd() { /// @TODO Use a object variable to store a reference to dlg for further reuse EditProperty_impl dlg(this); dlg.setDir(m_Item->isDir()); if (dlg.exec()==TQDialog::Accepted) { if (PropertyListViewItem::protected_Property(dlg.propName())) { KMessageBox::error(this,i18n("This property may not set by users.\nRejecting it."),i18n("Protected property")); return; } if (m_PropertiesListview->checkExisting(dlg.propName())) { KMessageBox::error(this,i18n("A property with that name exists.\nRejecting it."),i18n("Double property")); return; } PropertyListViewItem * ki = new PropertyListViewItem(m_PropertiesListview); ki->setMultiLinesEnabled(true); ki->setText(0,dlg.propName()); ki->setText(1,dlg.propValue()); ki->checkName(); ki->checkValue(); } } /*! \fn PropertiesDlg::slotDelete */ void PropertiesDlg::slotDelete() { TQListViewItem*qi = m_PropertiesListview->selectedItem(); if (!qi) return; PropertyListViewItem*ki = static_cast (qi); if (PropertyListViewItem::protected_Property(ki->currentName())) return; if (ki->deleted()) { ki->unDeleteIt(); } else { ki->deleteIt(); } slotSelectionChanged(qi); } /*! \fn PropertiesDlg::slotModify() */ void PropertiesDlg::slotModify() { TQListViewItem*qi = m_PropertiesListview->selectedItem(); if (!qi) return; PropertyListViewItem*ki = static_cast (qi); if (PropertyListViewItem::protected_Property(ki->currentName())) return; /// @TODO Use a object variable to store a reference to dlg for further reuse EditProperty_impl dlg(this); dlg.setDir(m_Item->isDir()); dlg.setPropName(ki->currentName()); dlg.setPropValue(ki->currentValue()); if (dlg.exec()==TQDialog::Accepted) { if (PropertyListViewItem::protected_Property(dlg.propName())) { KMessageBox::error(this,i18n("This property may not set by users.\nRejecting it."),i18n("Protected property")); return; } if (m_PropertiesListview->checkExisting(dlg.propName(),qi)) { KMessageBox::error(this,i18n("A property with that name exists.\nRejecting it."),i18n("Double property")); return; } ki->setText(0,dlg.propName()); ki->setText(1,dlg.propValue()); ki->checkName(); ki->checkValue(); } } void PropertiesDlg::changedItems(svn::PropertiesMap&toSet,TQValueList&toDelete) { toSet.clear(); toDelete.clear(); TQListViewItemIterator iter( m_PropertiesListview ); PropertyListViewItem*ki; while ( iter.current() ) { ki = static_cast (iter.current()); ++iter; if (PropertyListViewItem::protected_Property(ki->currentName())|| PropertyListViewItem::protected_Property(ki->startName())) { continue; } if (ki->deleted()) { toDelete.push_back(ki->currentName()); } else if (ki->currentName()!=ki->startName()){ toDelete.push_back(ki->startName()); toSet[ki->currentName()]=ki->currentValue(); } else if (ki->currentValue()!=ki->startValue()) { toSet[ki->currentName()]=ki->currentValue(); } } } #include "propertiesdlg.moc"