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

List:       kdevelop-devel
Subject:    [PATCH] kmdi and kdevelop/src changes
From:       Alexander Dymo <cloudtemple () mksat ! net>
Date:       2003-12-17 23:39:10
[Download RAW message or body]

This patch addresses two issues:
1) it restores proper notification about modified and changed outside kdevelop
files (icons on tabs)
2) resolves the problem of long file names on mdi tabs (that appear after
save) introduced with the last commits to kmdi

-- 
Alexander Dymo
Ukrainian State Maritime Technical University, IT Department

["qextmdi.diff" (text/x-diff)]

? kmdi.diff
? kmdi2.diff
? kmdichildarea.cpp.diff
? qextmdi.diff
? qextmdi_new.patch.bz2
Index: kmdichildarea.cpp
===================================================================
RCS file: /home/kde/kdevelop/lib/qextmdi/kmdichildarea.cpp,v
retrieving revision 1.2
diff -U3 -r1.2 kmdichildarea.cpp
--- kmdichildarea.cpp	15 Dec 2003 22:20:53 -0000	1.2
+++ kmdichildarea.cpp	17 Dec 2003 23:29:17 -0000
@@ -71,6 +71,12 @@
 void KMdiChildArea::manageChild(KMdiChildFrm *lpC,bool bShow,bool bCascade)
 {
    KMdiChildFrm * top=topChild();
+   if (m_pZ->findRef(lpC)!=-1) { //first, remove old references
+       m_pZ->take();
+       while (m_pZ->findNext(lpC)!=-1) //sanity check
+           m_pZ->take();
+   }
+
    if (bShow)
       m_pZ->append(lpC); //visible -> first in the Z order
    else
@@ -168,7 +174,7 @@
       }
 
       KMdiChildFrm *pMaximizedChild = m_pZ->last();
-      if (pMaximizedChild->m_state != KMdiChildFrm::Maximized) {
+      if (pMaximizedChild && pMaximizedChild->m_state != KMdiChildFrm::Maximized) {
          pMaximizedChild = 0L;
       }
       m_pZ->setAutoDelete(true);
Index: kmdichildview.cpp
===================================================================
RCS file: /home/kde/kdevelop/lib/qextmdi/kmdichildview.cpp,v
retrieving revision 1.2
diff -U3 -r1.2 kmdichildview.cpp
--- kmdichildview.cpp	15 Dec 2003 22:20:53 -0000	1.2
+++ kmdichildview.cpp	17 Dec 2003 23:29:19 -0000
@@ -536,7 +536,7 @@
      //  the event. So manually forward the event the the eventFilter() functions
      //  (but only if the sending object is not this object; avoid deadlock).
      //  The main frame is one of the filtering objects for this one.
-     //  However this does not work for toplevel windows, but they don't distribute 
+     //  However this does not work for toplevel windows, but they don't distribute
      //  any events anyway (like Alt+F,... )
      qApp->sendEvent( this, e ); 
 #endif
@@ -642,13 +642,19 @@
       }
    }
    else
-        if (e->type()==QEvent::IconChange) {
-            qDebug("KMDiChildView:: QEvent:IconChange intercepted\n");
-	    if  (obj==this)
-		iconOrCaptionUdpated(this,icon()?(*icon()):QPixmap(),caption());
-	    else if (obj==m_trackChanges)
-		setIcon(m_trackChanges->icon()?(*(m_trackChanges->icon())):QPixmap());
-        }
+   {
+       if (e->type()==QEvent::IconChange) {
+          if  (obj==this)
+             iconUpdated(this,icon()?(*icon()):QPixmap());
+          else if (obj==m_trackChanges)
+             setIcon(m_trackChanges->icon()?(*(m_trackChanges->icon())):QPixmap());
+       }
+       if (e->type()==QEvent::CaptionChange) {
+          if (obj==this)
+             captionUpdated(this,caption());
+       }
+   }
+
 
    return false;                           // standard event processing
 }
Index: kmdichildview.h
===================================================================
RCS file: /home/kde/kdevelop/lib/qextmdi/kmdichildview.h,v
retrieving revision 1.2
diff -U3 -r1.2 kmdichildview.h
--- kmdichildview.h	15 Dec 2003 22:20:53 -0000	1.2
+++ kmdichildview.h	17 Dec 2003 23:29:21 -0000
@@ -516,7 +516,8 @@
    */
    void isDetachedNow();
 
-   void iconOrCaptionUdpated(QWidget*,QPixmap,const QString&);
+   void iconUpdated(QWidget*,QPixmap);
+   void captionUpdated(QWidget*,const QString&);
 
 
   private:
Index: kmdidocumentviewtabwidget.cpp
===================================================================
RCS file: /home/kde/kdevelop/lib/qextmdi/kmdidocumentviewtabwidget.cpp,v
retrieving revision 1.5
diff -U3 -r1.5 kmdidocumentviewtabwidget.cpp
--- kmdidocumentviewtabwidget.cpp	15 Dec 2003 22:20:53 -0000	1.5
+++ kmdidocumentviewtabwidget.cpp	17 Dec 2003 23:29:21 -0000
@@ -55,9 +55,14 @@
 	if (count()<2) tabBar()->hide();
 }
 
+void KMdiDocumentViewTabWidget::updateIconInView( QWidget *w, QPixmap icon )
+{
+    changeTab(w,icon,tabLabel(w));
+}
 
-void KMdiDocumentViewTabWidget::updateView(QWidget* w,QPixmap icon,const QString& caption) {
-	changeTab(w,icon,caption);
+void KMdiDocumentViewTabWidget::updateCaptionInView( QWidget *w, const QString &caption )
+{
+    changeTab(w, caption);
 }
 #ifndef NO_INCLUDE_MOCFILES
 #include "kmdidocumentviewtabwidget.moc"
Index: kmdidocumentviewtabwidget.h
===================================================================
RCS file: /home/kde/kdevelop/lib/qextmdi/kmdidocumentviewtabwidget.h,v
retrieving revision 1.3
diff -U3 -r1.3 kmdidocumentviewtabwidget.h
--- kmdidocumentviewtabwidget.h	15 Dec 2003 22:20:53 -0000	1.3
+++ kmdidocumentviewtabwidget.h	17 Dec 2003 23:29:21 -0000
@@ -22,7 +22,8 @@
 private slots:
 	void closeTab(QWidget* w);
 public slots:
-	void updateView(QWidget*,QPixmap,const QString&);
+	void updateIconInView(QWidget*,QPixmap);
+	void updateCaptionInView(QWidget*,const QString&);
 };
 
 
Index: kmdimainfrm.cpp
===================================================================
RCS file: /home/kde/kdevelop/lib/qextmdi/kmdimainfrm.cpp,v
retrieving revision 1.13
diff -U3 -r1.13 kmdimainfrm.cpp
--- kmdimainfrm.cpp	15 Dec 2003 22:20:53 -0000	1.13
+++ kmdimainfrm.cpp	17 Dec 2003 23:29:29 -0000
@@ -417,8 +417,10 @@
 //      const QPixmap& wndIcon = pWnd->icon() ? *(pWnd->icon()) : QPixmap();
      
       m_documentTabWidget->addTab(pWnd, pWnd->icon() ? *(pWnd->icon()) : QPixmap(),pWnd->tabCaption());
-	connect(pWnd,SIGNAL(iconOrCaptionUdpated(QWidget*,QPixmap,const QString&)),
-		m_documentTabWidget,SLOT(updateView(QWidget*,QPixmap,const QString&)));
+	connect(pWnd,SIGNAL(iconUpdated(QWidget*,QPixmap)),
+		m_documentTabWidget,SLOT(updateIconInView(QWidget*,QPixmap)));
+	connect(pWnd,SIGNAL(captionUpdated(QWidget*,const QString&)),
+		m_documentTabWidget,SLOT(updateCaptionInView(QWidget*,const QString&)));
 
 #if 0
       KDockWidget* pCover = createDockWidget( pWnd->name(),

["kdevelop_src.diff" (text/x-diff)]

? kdevelop_src.diff
? mainwindow.diff
Index: mainwindow.cpp
===================================================================
RCS file: /home/kde/kdevelop/src/mainwindow.cpp,v
retrieving revision 1.63
diff -U3 -r1.63 mainwindow.cpp
--- mainwindow.cpp	14 Dec 2003 10:04:29 -0000	1.63
+++ mainwindow.cpp	17 Dec 2003 23:28:44 -0000
@@ -363,10 +363,10 @@
         if (!ro_part || !ro_part->url().isLocalFile())
             continue;
         if ( ro_part->url().path() == fileName ) { /// @todo URL comparison sucks...
-             if ( PartController::getInstance()->isDirty( ro_part ) ) 
-		ro_part->widget()->setIcon(SmallIcon("revert"));
-	     else
-                ro_part->widget()->setIcon(QPixmap());
+            if ( PartController::getInstance()->isDirty( ro_part ) )
+                ro_part->widget()->setIcon(SmallIcon("revert"));
+            else
+                PartController::getInstance()->restorePartWidgetIcon(ro_part);
         }
     }
 }
@@ -448,6 +448,7 @@
 
   const QPixmap* wndIcon = view->icon();
   if (!wndIcon || (wndIcon && (wndIcon->size().height() > 16))) {
+    view->setIcon(SmallIcon("kdevelop"));
     child->setIcon(SmallIcon("kdevelop")); // was empty or too big, take something \
useful  }
 
@@ -527,7 +528,7 @@
         return;
     }
     
-    
+
     const QPixmap* wndIcon = view->icon();
     kdDebug(9000) << "icon = " << wndIcon << endl;
     if (!wndIcon ) { // || (wndIcon && (wndIcon->size().height() > 16))) {
@@ -538,7 +539,7 @@
     int length = shortName.length();
     shortName = shortName.right(length - (shortName.findRev('/') \
+1)).stripWhiteSpace();  checkAndFixToolViewObjectName(view, shortName);
-    
+
     KMdiToolViewAccessor *tmp=KMdiMainFrm::addToolWindow(view,
                                                          KDockWidget::DockRight,
                                                          getMainDockWidget(),
Index: partcontroller.cpp
===================================================================
RCS file: /home/kde/kdevelop/src/partcontroller.cpp,v
retrieving revision 1.108
diff -U3 -r1.108 partcontroller.cpp
--- partcontroller.cpp	11 Nov 2003 23:34:20 -0000	1.108
+++ partcontroller.cpp	17 Dec 2003 23:28:47 -0000
@@ -33,6 +33,10 @@
 #include <kcompletion.h>
 #include <kdirwatch.h>
 #include <kdeversion.h>
+#include <kiconloader.h>
+
+#include <ktexteditor/view.h>
+#include <ktexteditor/document.h>
 
 #include "toplevel.h"
 #include "api.h"
@@ -438,6 +442,7 @@
   }
 
   TopLevel::getInstance()->embedPartView(part->widget(), url.filename(), url.url());
+  savePartWidgetIcon(part);
 
   addPart(part);
 
@@ -462,7 +467,29 @@
 
   // let's get notified when a document has been changed
   connect(part, SIGNAL(completed()), this, SLOT(slotUploadFinished()));
+  connect(part, SIGNAL(completed()), this, SLOT(slotRestoreStatus()));
   connect(part, SIGNAL(fileNameChanged(const KURL &)), this, \
SLOT(slotFileNameChanged())); +
+  // Connect to the document's views newStatus() signal in order to keep track of \
the +  // modified-status of the document.
+
+  // What's potentially problematic is that this signal isn't officially part of the
+  // KTextEditor::View interface. It is nevertheless there, and used in kate and \
kwrite. +  // There doesn't seem to be any othere way of making this work with \
katepart, and since +  // signals are dynamic, if we try to connect to an editorpart \
that lacks this signal, +  // all we get is a runtime warning. At this point in time \
we are only really supported +  // by katepart anyway so IMHO this hack is justified. \
//teatime +  if (isTextEditor)
+  {
+    KTextEditor::Document * doc = static_cast<KTextEditor::Document*>( part );
+    QPtrList<KTextEditor::View> list = doc->views();
+    QPtrListIterator<KTextEditor::View> it( list );
+    while ( it.current() )
+    {
+      connect( it, SIGNAL( newStatus() ), this, SLOT( slotNewStatus() ) );
+      ++it;
+    }
+  }
 }
 
 void PartController::reinstallPopups( ){
@@ -574,6 +601,7 @@
       return false;
     }
   }
+  partWidgetIcons.remove(part);
 
   // If we didn't call removePart(), KParts::PartManager::slotObjectDestroyed would
   // get called from the destroyed signal of the part being deleted below.
@@ -643,6 +671,7 @@
     rw_part->save();
     TopLevel::getInstance()->statusBar()->message(i18n("Saved \
%1").arg(rw_part->url().prettyURL()), 2000);  }
+  restorePartWidgetIcon(part);
 }
 
 void PartController::saveAllFiles()
@@ -663,6 +692,8 @@
   if ( !part )
     return;
 
+  restorePartWidgetIcon(part);
+
   if (part->inherits("KParts::ReadWritePart")) {
       KParts::ReadWritePart *rw_part = static_cast<KParts::ReadWritePart*>(part);
       if ( rw_part->url().isLocalFile() )
@@ -1024,6 +1055,7 @@
 
   // embed the part
   TopLevel::getInstance()->embedPartView( part->widget(), name, shortDescription );
+  savePartWidgetIcon(part);
   addPart( part );
 }
 
@@ -1047,4 +1079,50 @@
   return false;
 }
 
+void PartController::savePartWidgetIcon( KParts::Part * part )
+{
+    if ((!part->widget()) || (!part->widget()->icon()))
+        return;
+    QPixmap m(*(part->widget()->icon()));
+    partWidgetIcons[part] = m;
+}
+
+void PartController::restorePartWidgetIcon( KParts::Part * part )
+{
+    if (!part->widget())
+        return;
+    if (partWidgetIcons.contains(part))
+        part->widget()->setIcon(partWidgetIcons[part]);
+}
+
+void PartController::slotNewStatus( )
+{
+    kdDebug(9000) << "PartController::slotNewStatus()" << endl;
+
+    QObject * senderobj = const_cast<QObject*>( sender() );
+    KTextEditor::View * view = dynamic_cast<KTextEditor::View*>( senderobj );
+
+    if ( view )
+    {
+        KParts::ReadWritePart * rw_part = view->document();
+        if ( isDirty( rw_part ) ) {
+        } else if ( rw_part->isModified() ) {
+            rw_part->widget()->setIcon(SmallIcon("filesave"));
+        } else {
+            restorePartWidgetIcon(rw_part);
+        }
+    }
+}
+
+void PartController::slotRestoreStatus( )
+{
+  KParts::ReadOnlyPart *ro_part = \
dynamic_cast<KParts::ReadOnlyPart*>(const_cast<QObject*>(sender())); +
+  if ( !ro_part )
+    return;
+
+  if (!isDirty(ro_part))
+    restorePartWidgetIcon(ro_part);
+}
+
 #include "partcontroller.moc"
Index: partcontroller.h
===================================================================
RCS file: /home/kde/kdevelop/src/partcontroller.h,v
retrieving revision 1.40
diff -U3 -r1.40 partcontroller.h
--- partcontroller.h	9 Nov 2003 01:03:25 -0000	1.40
+++ partcontroller.h	17 Dec 2003 23:28:47 -0000
@@ -57,6 +57,9 @@
 
   void showPart( KParts::Part* part, const QString& name, const QString& \
shortDescription );  
+  void savePartWidgetIcon(KParts::Part *part);
+  void restorePartWidgetIcon(KParts::Part *part);
+
 public slots:
 
   void slotCurrentChanged(QWidget *w);
@@ -99,6 +102,8 @@
   void addHistoryEntry( HistoryEntry* entry );
 
   void dirty( const QString& fileName );
+  void slotNewStatus();
+  void slotRestoreStatus();
 
 private:
   KURL findURLInProject(const KURL& url);
@@ -109,7 +114,7 @@
   bool closePart(KParts::Part *part);
 
   QPopupMenu *contextPopupMenu();
-  
+
   KParts::Factory *findPartFactory(const QString &mimeType, const QString &partType, \
const QString &preferredName = QString::null );  
   void integratePart(KParts::Part *part, const KURL &url, bool isTextEditor=false );
@@ -137,6 +142,7 @@
   QPtrList< HistoryEntry > m_history;
   KDirWatch* dirWatcher;
   QMap< const KParts::ReadOnlyPart*, QDateTime > accessTimeMap;
+  QMap< const KParts::Part*, QPixmap > partWidgetIcons;
   bool m_restoring;
 };
 


_______________________________________________
Kdevelop-devel mailing list
Kdevelop-devel@barney.cs.uni-potsdam.de
http://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-devel

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

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