00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "addattributedialog.h"
00022
#include "cppsupportpart.h"
00023
#include "backgroundparser.h"
00024
#include "cppsupport_utils.h"
00025
00026
#include <kdevpartcontroller.h>
00027
00028
#include <codemodel.h>
00029
00030
#include <kfiledialog.h>
00031
#include <kparts/part.h>
00032
#include <ktexteditor/editinterface.h>
00033
00034
#include <qfileinfo.h>
00035
#include <qcombobox.h>
00036
#include <qlineedit.h>
00037
#include <qlistview.h>
00038
#include <qcheckbox.h>
00039
#include <qpushbutton.h>
00040
#include <qtoolbutton.h>
00041
#include <qtextstream.h>
00042
00043 AddAttributeDialog::AddAttributeDialog(
CppSupportPart* cppSupport,
ClassDom klass,
00044
QWidget* parent,
const char* name,
bool modal, WFlags fl)
00045 :
AddAttributeDialogBase(parent,name, modal,fl), m_cppSupport( cppSupport ), m_klass( klass ), m_count( 0 )
00046 {
00047 access->insertStringList(
QStringList() <<
"Public" <<
"Protected" <<
"Private" );
00048
00049 storage->insertStringList(
QStringList() <<
"Normal" <<
"Static" );
00050
00051 returnType->setAutoCompletion(
true );
00052 returnType->insertStringList(
QStringList()
00053 <<
"void"
00054 <<
"char"
00055 <<
"wchar_t"
00056 <<
"bool"
00057 <<
"short"
00058 <<
"int"
00059 <<
"long"
00060 <<
"signed"
00061 <<
"unsigned"
00062 <<
"float"
00063 <<
"double" );
00064
00065 returnType->insertStringList(
typeNameList(
m_cppSupport->
codeModel()) );
00066
00067
updateGUI();
00068
addAttribute();
00069 }
00070
00071 AddAttributeDialog::~AddAttributeDialog()
00072 {
00073 }
00074
00075 void AddAttributeDialog::reject()
00076 {
00077 QDialog::reject();
00078 }
00079
00080 void AddAttributeDialog::accept()
00081 {
00082
m_cppSupport->
partController()->
editDocument(
m_klass->fileName() );
00083
KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>(
m_cppSupport->
partController()->
activePart() );
00084
if( !editIface ){
00086 QDialog::accept();
00087
return;
00088 }
00089
00090
int line, column;
00091
m_klass->getEndPosition( &line, &column );
00092
00093
00094
QMap<QString, QPair<int,int> > points;
00095
QStringList accessList;
00096
00097
const VariableList variableList =
m_klass->variableList();
00098
for( VariableList::ConstIterator it=variableList.begin(); it!=variableList.end(); ++it )
00099 {
00100
int varEndLine, varEndColumn;
00101 (*it)->getEndPosition( &varEndLine, &varEndColumn );
00102
QString access =
accessID( *it );
00103
QPair<int, int> varEndPoint = qMakePair( varEndLine, varEndColumn );
00104
00105
if( !points.contains(access) || points[access] < varEndPoint ){
00106 accessList.remove( access );
00107 accessList.push_back( access );
00108
00109 points[ access ] = varEndPoint;
00110 }
00111 }
00112
00113
int insertedLine = 0;
00114
00115 accessList +=
newAccessList( accessList );
00116
00117
for( QStringList::iterator it=accessList.begin(); it!=accessList.end(); ++it )
00118 {
00119
QListViewItem* item = attributes->firstChild();
00120
while( item ){
00121
QListViewItem* currentItem = item;
00122
00123 item = item->nextSibling();
00124
00125
if( currentItem->text(0) != *it )
00126
continue;
00127
00128
QString access = (*it).lower();
00129
00130
QString str =
variableDeclaration( currentItem );
00131
00132
QPair<int, int> pt;
00133
if( points.contains(*it) ) {
00134 pt = points[ *it ];
00135 }
else {
00136 str.prepend( access +
":\n" );
00137 points[ *it ] = qMakePair( line-1, 0 );
00138 pt = points[ *it ];
00139 }
00140
00141 editIface->
insertText( pt.first + insertedLine + 1, 0 , str );
00142 insertedLine += str.contains(
QChar(
'\n') );
00143 }
00144 }
00145
00146
m_cppSupport->
backgroundParser()->
addFile(
m_klass->fileName() );
00147
00148 QDialog::accept();
00149 }
00150
00151 QString AddAttributeDialog::variableDeclaration(
QListViewItem* item )
const
00152
{
00153
QString str;
00154
QTextStream stream( &str, IO_WriteOnly );
00155
QString ind;
00156 ind.fill(
QChar(
' '), 4 );
00157
00158 stream << ind;
00159
if( item->text(1) ==
"Static" )
00160 stream <<
"static ";
00161 stream << item->text( 2 ) <<
" " << item->text( 3 );
00162 stream <<
";\n";
00163
00164
return str;
00165 }
00166
00167
00168 void AddAttributeDialog::updateGUI()
00169 {
00170
bool enable = attributes->selectedItem() != 0;
00171
00172 returnType->setEnabled( enable );
00173 declarator->setEnabled( enable );
00174 access->setEnabled( enable );
00175 storage->setEnabled( enable );
00176
00177 deleteAttributeButton->setEnabled( enable );
00178
00179
if( enable ){
00180
QListViewItem* item = attributes->selectedItem();
00181 item->setText( 0, access->currentText() );
00182 item->setText( 1, storage->currentText() );
00183 item->setText( 2, returnType->currentText() );
00184 item->setText( 3, declarator->text() );
00185 }
00186 }
00187
00188 void AddAttributeDialog::addAttribute()
00189 {
00190
QListViewItem* item =
new QListViewItem( attributes,
"Protected",
"Normal",
"int",
QString(
"attribute_%1").arg(++
m_count) );
00191 attributes->setCurrentItem( item );
00192 attributes->setSelected( item,
true );
00193
00194 returnType->setFocus();
00195 }
00196
00197 void AddAttributeDialog::deleteCurrentAttribute()
00198 {
00199
delete( attributes->currentItem() );
00200 }
00201
00202 void AddAttributeDialog::currentChanged(
QListViewItem* item )
00203 {
00204
if( item ){
00205
QString _access = item->text( 0 );
00206
QString _storage = item->text( 1 );
00207
QString _returnType = item->text( 2 );
00208
QString _declarator = item->text( 3 );
00209
00210 access->setCurrentText( _access );
00211 storage->setCurrentText( _storage );
00212 returnType->setCurrentText( _returnType );
00213 declarator->setText( _declarator );
00214 }
00215
00216
updateGUI();
00217 }
00218
00219 QStringList AddAttributeDialog::newAccessList(
const QStringList& accessList )
const
00220
{
00221
QStringList newAccessList;
00222
00223
QListViewItem* item = attributes->firstChild();
00224
while( item ){
00225
QListViewItem* currentItem = item;
00226
00227 item = item->nextSibling();
00228
00229
QString access = currentItem->text( 0 );
00230
if( !(accessList.contains(access) || newAccessList.contains(access)) )
00231 newAccessList.push_back( access );
00232 }
00233
00234
return newAccessList;
00235 }
00236
00237 QString AddAttributeDialog::accessID(
VariableDom var )
const
00238
{
00239
switch( var->access() )
00240 {
00241
case CodeModelItem::Public:
00242
return QString::fromLatin1(
"Public" );
00243
00244
case CodeModelItem::Protected:
00245
return QString::fromLatin1(
"Protected" );
00246
00247
case CodeModelItem::Private:
00248
return QString::fromLatin1(
"Private" );
00249 }
00250
00251
return QString::null;
00252 }
00253
00254
#include "addattributedialog.moc"