KDevelop API Documentation

astyle_part.cpp

Go to the documentation of this file.
00001 #include "astyle_part.h"
00002 
00003 #include <qwhatsthis.h>
00004 #include <qvbox.h>
00005 #include <qtextstream.h>
00006 
00007 #include <kdeversion.h>
00008 #include <kdebug.h>
00009 #include <kdialogbase.h>
00010 #include <kdevgenericfactory.h>
00011 #include <kiconloader.h>
00012 #include <klocale.h>
00013 #include <kparts/part.h>
00014 #include <kparts/partmanager.h>
00015 #include <ktexteditor/editinterface.h>
00016 #include <ktexteditor/document.h>
00017 #include <ktexteditor/viewcursorinterface.h>
00018 #include <ktexteditor/selectioninterface.h>
00019 
00020 #include <kdevcore.h>
00021 #include <kdevapi.h>
00022 #include <kdevpartcontroller.h>
00023 
00024 #include "astyle_widget.h"
00025 #include <astyle_adaptor.h>
00026 
00027 static const KAboutData data("kdevastyle", I18N_NOOP("Reformat Source"), "1.0");
00028 
00029 typedef KDevGenericFactory<AStylePart> AStyleFactory;
00030 K_EXPORT_COMPONENT_FACTORY( libkdevastyle, AStyleFactory( &data ) )
00031 
00032 AStylePart::AStylePart(QObject *parent, const char *name, const QStringList &)
00033   : KDevSourceFormatter("AStyle", "kdevelop", parent, name ? name : "AStylePart")
00034 {
00035   setInstance(AStyleFactory::instance());
00036 
00037   setXMLFile("kdevpart_astyle.rc");
00038 
00039   _action = new KAction(i18n("&Reformat Source"), 0,
00040               this, SLOT(beautifySource()), actionCollection(), "edit_astyle");
00041   _action->setEnabled(false);
00042   _action->setToolTip(i18n("Reformat source"));
00043   _action->setWhatsThis(i18n("<b>Reformat source</b><p>Source reformatting functionality using <b>astyle</b> library. "
00044                              "Also available in <b>New Class</b> and <b>Subclassing</b> wizards."));
00045 
00046   connect(core(), SIGNAL(configWidget(KDialogBase*)), this, SLOT(configWidget(KDialogBase*)));
00047 
00048   connect(partController(), SIGNAL(activePartChanged(KParts::Part*)), this, SLOT(activePartChanged(KParts::Part*)));
00049 }
00050 
00051 
00052 AStylePart::~AStylePart()
00053 {
00054 }
00055 
00056 
00057 void AStylePart::beautifySource()
00058 {
00059   KTextEditor::EditInterface *iface
00060       = dynamic_cast<KTextEditor::EditInterface*>(partController()->activePart());
00061   if (!iface)
00062     return;
00063 
00064     bool has_selection = false;
00065     
00066   KTextEditor::SelectionInterface *sel_iface
00067       = dynamic_cast<KTextEditor::SelectionInterface*>(partController()->activePart());
00068   if (sel_iface && sel_iface->hasSelection())
00069     has_selection = true;
00070 
00071   //if there is a selection, we only format it.  
00072   ASStringIterator is(has_selection ? sel_iface->selection() : iface->text());
00073   KDevFormatter formatter;
00074 
00075   formatter.init(&is);
00076 
00077   QString output;
00078   QTextStream os(&output, IO_WriteOnly);
00079 
00080   while (formatter.hasMoreLines())
00081     os << QString::fromUtf8(formatter.nextLine().c_str()) << endl;
00082 
00083   uint col = 0;
00084   uint line = 0;
00085     
00086   if(has_selection) //there was a selection, so only change the part of the text related to it
00087   {
00088     //remove the final newline character
00089     output.setLength(output.length()-1);
00090     
00091     sel_iface->removeSelectedText();
00092     cursorPos( partController()->activePart(), &col, &line );       
00093     iface->insertText( col, line, output);
00094     
00095     return;
00096   }
00097 
00098   cursorPos( partController()->activePart(), &col, &line );   
00099   
00100   iface->setText( output );
00101 
00102   setCursorPos( partController()->activePart(), col, line );
00103 }
00104 
00105 
00106 void AStylePart::configWidget(KDialogBase *dlg)
00107 {
00108     QVBox *vbox = dlg->addVBoxPage(i18n("Source Formatter"), i18n("Source Formatter"), BarIcon( icon(), KIcon::SizeMedium));
00109   AStyleWidget *w = new AStyleWidget(vbox, "astyle config widget");
00110   connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
00111 }
00112 
00113 
00114 void AStylePart::activePartChanged(KParts::Part *part)
00115 {
00116   bool enabled = false;
00117 
00118   KParts::ReadWritePart *rw_part = dynamic_cast<KParts::ReadWritePart*>(part);
00119 
00120   if (rw_part)
00121   {
00122     KTextEditor::EditInterface *iface = dynamic_cast<KTextEditor::EditInterface*>(rw_part);
00123 
00124     if (iface)
00125     {
00126       QString extension = rw_part->url().path();
00127 
00128       int pos = extension.findRev('.');
00129       if (pos >= 0)
00130         extension = extension.mid(pos);
00131       if (extension == ".h"   || extension == ".c" || extension == ".java"
00132        || extension == ".cpp" || extension == ".hpp"
00133        || extension == ".C"   || extension == ".H"
00134        || extension == ".cxx" || extension == ".hxx"
00135        || extension == ".inl" || extension == ".tlh"
00136        || extension == ".moc" || extension == ".xpm"
00137        || extension == ".diff"|| extension == ".patch"
00138        || extension == ".hh"  || extension == ".cc"
00139        || extension == ".c++" || extension == ".h++")
00140     enabled = true;
00141     }
00142   }
00143 
00144   _action->setEnabled(enabled);
00145 }
00146 
00147 QString AStylePart::formatSource( const QString text )
00148 {
00149   ASStringIterator is(text);
00150   KDevFormatter formatter;
00151 
00152   formatter.init(&is);
00153 
00154   QString output;
00155   QTextStream os(&output, IO_WriteOnly);
00156 
00157   while (formatter.hasMoreLines())
00158         os << QString::fromUtf8(formatter.nextLine().c_str()) << endl;
00159 
00160   return output;
00161 }
00162 
00163 void AStylePart::cursorPos( KParts::Part *part, uint * line, uint * col )
00164 {
00165     if (!part || !part->inherits("KTextEditor::Document")) return;
00166 
00167     KTextEditor::ViewCursorInterface *iface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
00168     if (iface)
00169     {
00170         iface->cursorPositionReal( line, col );
00171     }
00172 }
00173 
00174 void AStylePart::setCursorPos( KParts::Part *part, uint line, uint col )
00175 {
00176     if (!part || !part->inherits("KTextEditor::Document")) return;
00177 
00178     KTextEditor::ViewCursorInterface *iface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
00179     if (iface)
00180     {
00181         iface->setCursorPositionReal( line, col );
00182     }
00183 }
00184 
00185 #include "astyle_part.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 22 09:22:37 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003