[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdevelop/lib
From:       Dukju Ahn <dukjuahn () gmail ! com>
Date:       2007-05-19 8:14:34
Message-ID: 1179562474.512374.14340.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 666233 by dukjuahn:

Implemented outputview filtering.

Components who want to hookup special action into outputview item
or who want to paint their output string with special apprearance(font/color) 
will now register their own outputview item factory. This factory will
create customized item for outputview.


 M  +1 -0      kdevexport.h  
 M  +16 -2     plugins/outputviews/CMakeLists.txt  
 M  +9 -1      plugins/outputviews/interfaces/ioutputview.h  
 A             plugins/outputviews/interfaces/ioutputviewitem.cpp   [License: GPL \
(v2+)]  A             plugins/outputviews/interfaces/ioutputviewitem.h   [License: \
GPL (v2+)]  A             plugins/outputviews/interfaces/ioutputviewitemfactory.cpp   \
[License: GPL (v2+)]  A             \
plugins/outputviews/interfaces/ioutputviewitemfactory.h   [License: GPL (v2+)]  M  \
+34 -10    plugins/outputviews/outputviewcommand.cpp    M  +4 -1      \
plugins/outputviews/outputviewcommand.h    M  +58 -2     \
plugins/outputviews/outputwidget.cpp    M  +18 -1     \
plugins/outputviews/outputwidget.h    M  +6 -2      \
plugins/outputviews/simpleoutputview.cpp    M  +3 -1      \
plugins/outputviews/simpleoutputview.h  


--- trunk/KDE/kdevelop/lib/kdevexport.h #666232:666233
@@ -109,6 +109,7 @@
 #define KDEVPLATFORMPROJECT_EXPORT KDE_EXPORT
 #define KDEVPLATFORMUTIL_EXPORT KDE_EXPORT
 #define SUBLIME_EXPORT KDE_EXPORT
+#define OUTPUTVIEWINTERFACES_EXPORT KDE_EXPORT
 #endif /* KDEVEXPORT_H*/
 #endif
 
--- trunk/KDE/kdevelop/lib/plugins/outputviews/CMakeLists.txt #666232:666233
@@ -17,13 +17,27 @@
 kde4_automoc(${simpleoutputview_LIB_SRCS})
 kde4_add_plugin(kdevsimpleoutputview ${simpleoutputview_LIB_SRCS})
 target_link_libraries(kdevsimpleoutputview ${KDE4_KDECORE_LIBS}
-    ${QT_QTDESIGNER_LIBRARY} kdevplatforminterfaces kdevplatformutil)
+    ${QT_QTDESIGNER_LIBRARY} kdevplatforminterfaces kdevplatformutil \
kdevoutputviewinterfaces)  
 install(TARGETS kdevsimpleoutputview DESTINATION ${PLUGIN_INSTALL_DIR} )
 
+# interfaces
 
+set( outputviewinterfaces_LIB_SRCS
+     interfaces/ioutputviewitem.cpp
+     interfaces/ioutputviewitemfactory.cpp
+)
+kde4_add_library( kdevoutputviewinterfaces SHARED ${outputviewinterfaces_LIB_SRCS} )
+target_link_libraries(kdevoutputviewinterfaces ${KDE4_KDECORE_LIBS} \
${QT_QTGUI_LIBRARY} ) +set_target_properties(kdevoutputviewinterfaces PROPERTIES \
VERSION 4.0.0 SOVERSION 4) +install(TARGETS kdevoutputviewinterfaces DESTINATION \
${LIB_INSTALL_DIR} ) +
 ########### install files ###############
-install( FILES interfaces/ioutputview.h DESTINATION \
${INCLUDE_INSTALL_DIR}/kdevelop/outputviews ) +install( FILES
+         interfaces/ioutputview.h
+         interfaces/ioutputviewitem.h
+         interfaces/ioutputviewitemfactory.h
+         DESTINATION ${INCLUDE_INSTALL_DIR}/kdevelop/outputviews )
 install( FILES kdevsimpleoutputview.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
 
 
--- trunk/KDE/kdevelop/lib/plugins/outputviews/interfaces/ioutputview.h \
#666232:666233 @@ -26,6 +26,7 @@
 class KUrl;
 class QString;
 template <typename T1, typename T2> class QMap;
+class IOutputViewItemFactory;
 
 /**
 @author Andreas Pakulat
@@ -56,8 +57,15 @@
     /**
      * Execute the Command in a K3Process and capture the output in
      * a new tab with the command as title
+     * 
+     * @param factory Custom factory that will process output strings from KProcess \
and +     * create corresponding IOutputViewItem subclasses. Note that factory \
objected +     * handed to queueCommand() will be deleted after the command finishes. \
So the +     * caller of this method shouldn't delete or reuse it.
+     * When null, use default factory.
      */
-    virtual void queueCommand( const KUrl& workingdir, const QStringList&, const \
QMap<QString, QString>& ) = 0; +    virtual void queueCommand( const KUrl& \
workingdir, const QStringList&, const QMap<QString, QString>&, +                      \
IOutputViewItemFactory *factory = 0 ) = 0;  
     /**
      * Register a new Tab for Outputting logging information, this can be used
--- trunk/KDE/kdevelop/lib/plugins/outputviews/outputviewcommand.cpp #666232:666233
@@ -20,22 +20,49 @@
 
 #include "outputviewcommand.h"
 #include "processlinemaker.h"
+#include "ioutputviewitem.h"
+#include "ioutputviewitemfactory.h"
 
 #include <QtCore/QMap>
 #include <QtGui/QStandardItemModel>
+#include <QtCore/QList>
+#include <QAction>
 
 #include <kurl.h>
 #include <k3process.h>
 #include <kdebug.h>
 
+class DefaultOutputItemFactory : public IOutputViewItemFactory
+{
+public:
+    virtual ~DefaultOutputItemFactory()
+    {}
+
+    IOutputViewItem* createItem( const QString& lineOutput )
+    {
+        return new DefaultOutputItem( lineOutput );
+    }
+};
+
 OutputViewCommand::OutputViewCommand( const KUrl& workdir, const QStringList& \
command,  const QMap<QString, QString>& env,
-                                      QStandardItemModel* model )
+                                      QStandardItemModel* model,
+                                      IOutputViewItemFactory *itemFactory )
     : QObject(0), m_proc(0), m_model(model)
 {
     m_proc = new K3Process();
     m_proc->setWorkingDirectory( workdir.toLocalFile() );
     m_procLineMaker = new ProcessLineMaker( m_proc );
+    
+    if( itemFactory )
+    {
+        m_factory = itemFactory;
+    }
+    else
+    {
+        m_factory = new DefaultOutputItemFactory();
+    }
+    
     foreach( QString s, env.keys() )
         m_proc->setEnvironment( s, env[s] );
     foreach(QString s, command)
@@ -43,10 +70,6 @@
             *m_proc << s;
 
     m_command = command.join(" ");
-//     connect( m_proc, SIGNAL(receivedStdout(K3Process* , char*, int) ),
-//              this, SLOT( procReadStdout(K3Process* , char*, int) ) );
-//     connect( m_proc, SIGNAL(receivedStderr(K3Process* , char*, int) ),
-//              this, SLOT( procReadStderr(K3Process* , char*, int) ) );
     connect( m_procLineMaker, SIGNAL(receivedStdoutLine(const QString&)),
              this, SLOT(procReadStdout(const QString&) ));
     connect( m_procLineMaker, SIGNAL(receivedStderrLine(const QString&)),
@@ -60,12 +83,13 @@
     delete m_proc;
     delete m_procLineMaker;
 //     delete m_model; // model is created and deleted in OutputViewPart
+    delete m_factory;
     kDebug(9004) << "OutputViewCommand destructor.." << endl;
 }
 
 void OutputViewCommand::start()
 {
-    QStandardItem* i = new QStandardItem( m_command );
+    IOutputViewItem *i = m_factory->createItem( m_command );
     m_model->appendRow( i );
     m_proc->start( K3Process::OwnGroup, K3Process::AllOutput );
 }
@@ -87,19 +111,19 @@
 
 void OutputViewCommand::procReadStdout(const QString &line)
 {
-    m_model->appendRow( new QStandardItem( line ) );
+    m_model->appendRow( m_factory->createItem( line ) );
 }
 
 void OutputViewCommand::procReadStderr(const QString &line)
 {
-    m_model->appendRow( new QStandardItem( line ) );
+    m_model->appendRow( m_factory->createItem( line ) );
 }
 
 void OutputViewCommand::procFinished( K3Process* proc )
 {
     if( !m_proc->exitStatus() )
     {
-        QStandardItem* endItem = new QStandardItem(QString("Finished \
(%1)").arg(m_proc->exitStatus()) ); +        IOutputViewItem* endItem = \
m_factory->createItem(QString("Finished (%1)").arg(m_proc->exitStatus()));  \
m_model->appendRow( endItem );  kDebug(9004) << "Finished Sucessfully" << endl;
         QString titlestring = title();
@@ -107,7 +131,7 @@
     }
     else
     {
-        QStandardItem* endItem = new QStandardItem(QString("Failed \
(%1)").arg(m_proc->exitStatus())); +        IOutputViewItem* endItem = \
m_factory->createItem(QString("Failed (%1)").arg(m_proc->exitStatus()));  \
m_model->appendRow( endItem );  kDebug(9004) << "Failed" << endl;
         QString titlestring = title();
--- trunk/KDE/kdevelop/lib/plugins/outputviews/outputviewcommand.h #666232:666233
@@ -30,13 +30,15 @@
 class K3Process;
 class ProcessLineMaker;
 template <typename T1, typename T2> class QMap;
+class IOutputViewItemFactory;
 
 class OutputViewCommand : public QObject
 {
 Q_OBJECT
 public:
     OutputViewCommand( const KUrl& workdir, const QStringList& command,
-                       const QMap<QString, QString>& env, QStandardItemModel* model \
= 0 ); +                       const QMap<QString, QString>& env, QStandardItemModel* \
model = 0, +                       IOutputViewItemFactory *factory = 0 );
     virtual ~OutputViewCommand();
     virtual void start();
 
@@ -56,6 +58,7 @@
         ProcessLineMaker *m_procLineMaker;
         QStandardItemModel* m_model;
         QString m_command;
+        IOutputViewItemFactory *m_factory;
 };
 
 
--- trunk/KDE/kdevelop/lib/plugins/outputviews/outputwidget.cpp #666232:666233
@@ -20,10 +20,12 @@
 
 #include "outputwidget.h"
 #include "outputviewcommand.h"
+#include "ioutputviewitem.h"
 
 #include "simpleoutputview.h"
-#include <QtGui/QListView>
 #include <QtGui/QStandardItemModel>
+#include <kmenu.h>
+#include <kdebug.h>
 
 OutputWidget::OutputWidget(QWidget* parent, SimpleOutputView* view)
     : KTabWidget( parent )
@@ -56,7 +58,7 @@
     if( !m_listviews.contains( cmd->title() ) )
     {
         // create new listview, assign view's model.
-        QListView* listview = new QListView(this);
+        QListView* listview = new OutputListView(this);
         listview->setModel( cmd->model() );
 
         m_listviews[cmd->title()] = listview;
@@ -70,6 +72,60 @@
     }
 }
 
+//////////////////////////////////////////////////////////////////////
+
+OutputListView::OutputListView( QWidget* parent )
+    : QListView( parent )
+{
+//     setWordWrap( true ); // doesn't work!
+    setContextMenuPolicy( Qt::CustomContextMenu );
+    connect( this, SIGNAL(customContextMenuRequested( const QPoint & )),
+             this, SLOT( customContextMenuRequested( const QPoint & ) ) );
+    connect( this, SIGNAL(activated( const QModelIndex& )),
+             this, SLOT(slotActivated( const QModelIndex& )) );
+    connect( this, SIGNAL(clicked( const QModelIndex& )),
+             this, SLOT(slotActivated( const QModelIndex& )) );
+}
+
+OutputListView::~OutputListView()
+{}
+
+void OutputListView::slotActivated( const QModelIndex& index )
+{
+    if( !index.isValid() )
+    {
+        kDebug(9004) << "contextMenu is invalid" << endl;
+        return;
+    }
+    QStandardItemModel *stdmodel = (QStandardItemModel*)model();
+    QStandardItem *stditem = stdmodel->itemFromIndex( index );
+    IOutputViewItem *outitem = dynamic_cast<IOutputViewItem*>( stditem );
+    Q_ASSERT( outitem );
+
+    outitem->activated();
+}
+
+void OutputListView::customContextMenuRequested( const QPoint & point )
+{
+    QModelIndex modelIndex = indexAt( point );
+    if( !modelIndex.isValid() )
+    {
+        kDebug(9004) << "contextMenu is invalid" << endl;
+        return;
+    }
+
+    QStandardItemModel *stdmodel = (QStandardItemModel*)model();
+    QStandardItem *stditem = stdmodel->itemFromIndex( modelIndex );
+    IOutputViewItem *outitem = dynamic_cast<IOutputViewItem*>( stditem );
+    Q_ASSERT(outitem);
+
+    QList<QAction*> actions = outitem->contextMenuActions();
+    KMenu menu( this );
+    menu.addActions( actions );
+
+    menu.exec( viewport()->mapToGlobal(point) );
+}
+
 #include "outputwidget.moc"
 
 //kate: space-indent on; indent-width 4; replace-tabs on; auto-insert-doxygen on; \
                indent-mode cstyle;
--- trunk/KDE/kdevelop/lib/plugins/outputviews/outputwidget.h #666232:666233
@@ -23,11 +23,12 @@
 
 #include <ktabwidget.h>
 #include <QtCore/QMap>
-class QListView;
+#include <QtGui/QListView>
 class QStandardItemModel;
 class QString;
 class SimpleOutputView;
 class OutputViewCommand;
+class QModelIndex;
 
 class OutputWidget : public KTabWidget
 {
@@ -44,6 +45,22 @@
         QMap<QString, QListView*> m_listviews;
 };
 
+/** @class OutputListView
+ * Actual listview that will be embedded in OutputWidget's tab
+ * Subclassed to handle context-menu and item activation.
+ */
+class OutputListView : public QListView
+{
+    Q_OBJECT
+public:
+    OutputListView( QWidget* parent );
+    virtual ~OutputListView();
+
+protected Q_SLOTS:
+    void slotActivated( const QModelIndex& index );
+    void customContextMenuRequested( const QPoint & point );
+};
+
 #endif
 
 //kate: space-indent on; indent-width 4; replace-tabs on; auto-insert-doxygen on; \
                indent-mode cstyle;
--- trunk/KDE/kdevelop/lib/plugins/outputviews/simpleoutputview.cpp #666232:666233
@@ -21,6 +21,7 @@
 #include "simpleoutputview.h"
 #include "outputwidget.h"
 #include "outputviewcommand.h"
+#include "ioutputviewitemfactory.h"
 
 #include <QtCore/QStringList>
 
@@ -103,7 +104,9 @@
     delete d;
 }
 
-void SimpleOutputView::queueCommand(const KUrl& dir, const QStringList& command, \
const QMap<QString, QString>& env ) +void SimpleOutputView::queueCommand(const KUrl& \
dir, const QStringList& command, +                                    const \
QMap<QString, QString>& env, +                                    \
IOutputViewItemFactory *factory)  {
     if( command.isEmpty() )
         return;
@@ -111,7 +114,7 @@
     QString title = command.first();
     // todo: when all the outputviews using this model are closed by user, delete \
this model  // maybe use KSharedPtr or something.. 
-    OutputViewCommand* cmd = new OutputViewCommand( dir, command, env, 0 );
+    OutputViewCommand* cmd = new OutputViewCommand( dir, command, env, 0, factory );
     if( !d->m_jobs.contains(title) )
     {
         // set model into command. Model lives longer than command, so although the \
command @@ -223,6 +226,7 @@
     QQueue<OutputViewCommand*> &cmdQ = d->m_jobs[id];
     Q_ASSERT( cmdQ.isEmpty() == false );
     OutputViewCommand *cmd = cmdQ.dequeue();
+    cmd->disconnect();
     cmd->deleteLater();
     kDebug(9004) << "OutputViewCommand removed and deleteLater()ed " << (long)cmd << \
endl;  
--- trunk/KDE/kdevelop/lib/plugins/outputviews/simpleoutputview.h #666232:666233
@@ -30,6 +30,7 @@
 class K3Process;
 class QString;
 class OutputViewCommand;
+class IOutputViewItemFactory;
 
 /**
 @author Andreas Pakulat
@@ -43,7 +44,8 @@
 public:
     explicit SimpleOutputView(QObject *parent = 0, const QStringList &args = \
QStringList());  virtual ~SimpleOutputView();
-    void queueCommand(const KUrl& dir, const QStringList& command, const \
QMap<QString, QString>& env ); +    void queueCommand(const KUrl& dir, const \
QStringList& command, const QMap<QString, QString>& env, +                      \
IOutputViewItemFactory *factory = 0 );  
     void registerLogView( const QString& id, const QString& title );
     void appendLine( const QString& id, const QString& line );


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic