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
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)
00087 {
00088
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"
This file is part of the documentation for KDevelop Version 3.1.2.