OSDN Git Service

>>83
authorikemo <ikemo@56b19765-1e22-0410-a548-a0f45d66c51a>
Sat, 21 Aug 2004 11:56:01 +0000 (11:56 +0000)
committerikemo <ikemo@56b19765-1e22-0410-a548-a0f45d66c51a>
Sat, 21 Aug 2004 11:56:01 +0000 (11:56 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/kita/kita/trunk@1305 56b19765-1e22-0410-a548-a0f45d66c51a

kita/src/kitatabwidgetbase.cpp
kita/src/kitatabwidgetbase.h
kita/src/kitathreadtabwidget.cpp
kita/src/kitawritetabwidget.cpp
kita/src/part/kitahtmlpart.cpp
kita/src/part/kitahtmlpart.h
kita/src/part/kitathreadview.cpp
kita/src/part/kitathreadview.h

index 7182d66..241c3bc 100644 (file)
@@ -537,7 +537,7 @@ KitaDockWidgetBase::~KitaDockWidgetBase(){}
 /* public slot */
 void KitaDockWidgetBase::slotShowPart( const KURL& url, const QString& libName, const QString& mimetype )
 {
-    slotShowDock();
+    slotShowDock( TRUE, TRUE );
 
     static_cast<KitaTabWidgetBase*> ( getWidget() )->slotShowPart( url, libName, mimetype );
 }
@@ -562,37 +562,37 @@ void KitaDockWidgetBase::slotSaveDocStatus()
     }
 }
 
-/* show & activate dock widget */ /* public slot */
-void KitaDockWidgetBase::slotShowDock()
+/* This slot is called when user clicks the close button.      */
+/* m_closeButtonClicked is set to prevent from re-openning     */
+/* the dock. To reset m_closeButtonClicked, call showDock      */
+/* with force = TRUE.   See also slotShowDock() and showDock() */ /* private slot */
+void KitaDockWidgetBase::slotHeaderCloseButtonClicked()
 {
-    m_closeButtonClicked = FALSE;
-    ShowDockEvent* e = new ShowDockEvent( TRUE );
-    QApplication::postEvent( this, e );  // Qt will delete it when done
+    m_closeButtonClicked = TRUE;
+    slotSaveDocStatus();
 }
 
-/* show but not activate dock widget               */
-/* If m_closeButtonClicked = TRUE, then do nothing */ /* public slot */
-void KitaDockWidgetBase::slotShowDockNoActive()
+
+/* show this dock widget later.                   */
+/* Usually, call this slot instead of showDock(). */
+/* See also showDock() and customEvent().         */ /* public slot */
+void KitaDockWidgetBase::slotShowDock( bool activate, bool force )
 {
-    if( m_closeButtonClicked ) return;
-    ShowDockEvent* e = new ShowDockEvent( FALSE );
+    ShowDockEvent* e = new ShowDockEvent( activate, force );
     QApplication::postEvent( this, e );  // Qt will delete it when done
 }
 
-/* This slot is called when the close button is clicked.        */
-/* Some classes, ( e.g. KitaWriteTabWidget ), call
-   slotShowDockNoActive after clicked the close button.
-   So, set m_closeButtonClicked = TRUE, and forbid to re-open
-   the dock. See also KitaWriteTabWidget::slotChangeWriteTab.   */ /* private slot */
-void KitaDockWidgetBase::slotHeaderCloseButtonClicked()
-{
-    m_closeButtonClicked = TRUE;
-    slotSaveDocStatus();
-}
 
-/* show dock widget immediately */ /* public */
+/* show this dock widget immediately.          */
+/* If activate is TRUE, activate this dock.    */
+/* If force is TRUE, show this anyway.         */
+/* If force is FALSE and tab has no children,  */
+/* this dock is not shown.                     */ /* public */
 void KitaDockWidgetBase::showDock( bool activate, bool force )
 {
+    if( force ) m_closeButtonClicked = FALSE; /* see also slotHeaderCloseButtonClicked() */
+    if( m_closeButtonClicked ) return;
+
     QWidget* wd = getWidget();
     KitaTabWidgetBase* w = NULL;
     if( wd && wd->inherits( "KitaTabWidgetBase" )) w = static_cast<KitaTabWidgetBase*> ( wd );
@@ -661,7 +661,7 @@ void KitaDockWidgetBase::slotHideDock()
 /* public slot */
 void KitaDockWidgetBase::slotToggleShowHide()
 {
-    if( !isVisible() ) slotShowDock();
+    if( !isVisible() ) slotShowDock( TRUE, TRUE );
     else slotHideDock();
 }
 
@@ -686,7 +686,8 @@ void KitaDockWidgetBase::closeEvent( QCloseEvent* e )
 void KitaDockWidgetBase::customEvent( QCustomEvent * e )
 {
     if ( e->type() == EVENT_ShowDock ){
-       showDock( static_cast< ShowDockEvent* >( e )->getActivate(), FALSE );
+       ShowDockEvent* sde = static_cast< ShowDockEvent* >( e );
+       showDock( sde->getActivate(), sde->getForce() );
     }
 }
 
index 9476179..b22703d 100644 (file)
@@ -147,13 +147,12 @@ public:
            WFlags f = 0);
     ~KitaDockWidgetBase();
 
-    void showDock( bool active, bool force );
+    void showDock( bool active = TRUE, bool force = TRUE );
     
 public slots:
     void slotShowPart( const KURL&, const QString&, const QString& );
     void slotSaveDocStatus();
-    void slotShowDock();
-    void slotShowDockNoActive();
+    void slotShowDock( bool activate = TRUE , bool force = TRUE );
     void slotHideDock();
     void slotToggleShowHide();
 
@@ -198,10 +197,14 @@ class CloseTabEvent : public QCustomEvent
 class ShowDockEvent : public QCustomEvent
 {
     bool m_activate;
+    bool m_force;
+    
   public:
-    ShowDockEvent( bool activate ):QCustomEvent( EVENT_ShowDock ), m_activate( activate ){}
+    ShowDockEvent( bool activate, bool force ):QCustomEvent( EVENT_ShowDock )
+       , m_activate( activate ),m_force( force ){}
 
     const bool getActivate() const { return m_activate; }
+    const bool getForce() const { return m_force; }    
 };
 
 
index 67dff7f..1bd2a53 100644 (file)
@@ -74,7 +74,6 @@ void KitaThreadTabWidget::slotShowMainThread( const KURL& url, bool withNewTab )
        if( i != -1 ) jumpNum = refstr.left( i ).toInt();
        else jumpNum = refstr.toInt();
     }
-    if( jumpNum == 0 ) jumpNum = Kita::DatManager::getKokoyonNum( datURL );
 
     KitaThreadView* view = findMainView( datURL );
 
@@ -87,7 +86,7 @@ void KitaThreadTabWidget::slotShowMainThread( const KURL& url, bool withNewTab )
 
        /* The view is already shown */
        /* TODO: jump to jumpNum after reloading */
-       else  view->slotReloadButton();
+       else  view->slotReloadButton( jumpNum );
        
     }
     else if ( withNewTab
@@ -735,7 +734,7 @@ KitaThreadTabWidget* KitaThreadDock::setupAsMainView()
 /* public slot */
 void KitaThreadDock::slotShowThread( const QString& url, bool withNewTab )
 {
-    slotShowDock();
+    showDock();
 
     if( m_threadTab ) m_threadTab->slotShowMainThread( url, withNewTab );
 }
@@ -783,7 +782,7 @@ void KitaThreadDock::connectNaviSignals()
 /* show res */  /* private slot */
 void KitaThreadDock::slotShowKitaNavi( const KURL& datURL, int startnum, int endnum )
 {
-    slotShowDock();
+    showDock();
        
     KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
     m_threadTab->slotShowKitaNavi( KITANAVI_SHOWRES, parsedURL, QString::null, startnum, endnum );
@@ -793,7 +792,7 @@ void KitaThreadDock::slotShowKitaNavi( const KURL& datURL, int startnum, int end
 /* extract by ID */ /* private slot */
 void KitaThreadDock::slotShowKitaNaviByID( const KURL& datURL, QString strid )
 {
-    slotShowDock();
+    showDock();
     
     KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
     m_threadTab->slotShowKitaNavi( KITANAVI_EXTBYID, parsedURL, strid, 0, 0 );
@@ -804,7 +803,7 @@ void KitaThreadDock::slotShowKitaNaviByID( const KURL& datURL, QString strid )
 /* extract by keywords */ /* private slot */
 void KitaThreadDock::slotShowKitaNaviByWord( const KURL& datURL, QString query )
 {
-    slotShowDock();
+    showDock();
     
     KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
     m_threadTab->slotShowKitaNavi( KITANAVI_EXTBYWORD, parsedURL, query, 0, 0 );    
@@ -814,7 +813,7 @@ void KitaThreadDock::slotShowKitaNaviByWord( const KURL& datURL, QString query )
 /* extract by name */ /* private slot */
 void KitaThreadDock::slotShowKitaNaviByName( const KURL& datURL, QString query )
 {
-    slotShowDock();
+    showDock();
     
     KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
     m_threadTab->slotShowKitaNavi( KITANAVI_EXTBYNAME, parsedURL, query, 0, 0 );    
@@ -825,7 +824,7 @@ void KitaThreadDock::slotShowKitaNaviByName( const KURL& datURL, QString query )
 /* res tree */ /* private slot */
 void KitaThreadDock::slotShowKitaNaviResTree( const KURL& datURL, int resNum )
 {
-    slotShowDock();
+    showDock();
     
     int num;
     KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
@@ -837,7 +836,7 @@ void KitaThreadDock::slotShowKitaNaviResTree( const KURL& datURL, int resNum )
 /* reverse res tree */ /* private slot */
 void KitaThreadDock::slotShowKitaNaviRevResTree( const KURL& datURL, int resNum )
 {
-    slotShowDock();
+    showDock();
 
     int num;
     KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
index 0ced056..73a1d30 100644 (file)
@@ -181,7 +181,7 @@ void KitaWriteTabWidget::slotChangeWriteTab( const KURL& url )
     /* show current url page. */
     view = findWriteView( datURL );
     if ( view ){
-       static_cast< KitaDockWidgetBase* >( parentWidget() )->slotShowDockNoActive();
+       static_cast< KitaDockWidgetBase* >( parentWidget() )->slotShowDock( FALSE, FALSE );
        if( currentPage() != view ) setCurrentPage( indexOf( view ) );
        view->slotEnableWriting( TRUE );
     }
index d3792a3..75433fa 100644 (file)
@@ -65,7 +65,7 @@ KitaHTMLPart::~KitaHTMLPart()
 void KitaHTMLPart::clearPart()
 {
 
-    deletePopup();
+    slotDeletePopup();
 
     /* delete KitaDomTree */
     if ( m_domtree ) delete m_domtree;
@@ -87,12 +87,11 @@ void KitaHTMLPart::clearPart()
        /* emit deactivated all thread view SIGNAL */
        if( m_mode == HTMLPART_MODE_MAINPART ) emit activateThreadView( QString::null );
        
-       /* close write dock */
-//     if( m_mode == HTMLPART_MODE_MAINPART ) emit closeWriteTab( m_datURL );
     }
 
     m_anchorStack.clear();
     m_centerNum = 0;
+    m_jumpNumAfterLoading = 0;
     findTextInit();
 }
 
@@ -438,6 +437,7 @@ bool KitaHTMLPart::load( int centerNum )
 
     /*--------------------------------*/
     m_centerNum = centerNum;
+    m_jumpNumAfterLoading = 0;
 
     if( m_mode != HTMLPART_MODE_MAINPART ) return FALSE;
     if( !m_domtree ) return FALSE;
@@ -459,7 +459,7 @@ bool KitaHTMLPart::load( int centerNum )
 
 /* see also slotReceiveData()
    and slotFinishLoad().      */ /* public */
-bool KitaHTMLPart::reload()
+bool KitaHTMLPart::reload( int jumpNum )
 {
     /* config */
 
@@ -480,6 +480,7 @@ bool KitaHTMLPart::reload()
     m_domtree->StopParseThread();
     m_firstReceive = TRUE;
     if( m_centerNum == 0 ) m_centerNum = m_domtree->getBottomResNumber();
+    m_jumpNumAfterLoading = jumpNum;
 
     /* DatManager will call back slotReceiveData and slotFinishLoad. */
     Kita::DatManager::updateCache( m_datURL , this );
@@ -560,6 +561,9 @@ void KitaHTMLPart::slotFinishLoad()
     m_domtree->parseAllRes();
     m_centerNum = 0;
 
+    if( m_jumpNumAfterLoading ) gotoAnchor( QString().setNum( m_jumpNumAfterLoading ), FALSE );
+    m_jumpNumAfterLoading = 0;
+    
     emit finishReload();
 }
 
@@ -1677,11 +1681,36 @@ bool KitaHTMLPart::showNext100Etc( const QString& refstr )
 /* popup */
 
 
-/*---------------------*/
-/* show popup window   */ /* private */
+/* public slot */
+void KitaHTMLPart::slotDeletePopup()
+{
+    if ( m_popup ) delete m_popup;
+    m_popup = NULL;
+    m_multiPopup = FALSE;
+}
+
+
+/* for convenience */ /* public slot */
+void KitaHTMLPart::slotShowResPopup( QPoint point, int refNum, int refNum2 )
+{
+    QString innerHTML = Kita::DatManager::getHtml( m_datURL, refNum, refNum2 );
+    if ( innerHTML == QString::null ) return;
+
+    showPopupCore( m_datURL, innerHTML, point );
+}
+
+
+/* for convenience */ /* private */
 void KitaHTMLPart::showPopup( const KURL& url, const QString& innerHTML )
 {
-    deletePopup();
+    showPopupCore( url, innerHTML, QCursor::pos() );
+}
+
+
+/* show popup window   */  /* private */
+void KitaHTMLPart::showPopupCore( const KURL& url, const QString& innerHTML, QPoint point )
+{
+    slotDeletePopup();
     m_multiPopup = FALSE;
 
     m_popup = new Kita::ResPopup( view() , url );
@@ -1690,7 +1719,7 @@ void KitaHTMLPart::showPopup( const KURL& url, const QString& innerHTML )
 
     m_popup->setText( innerHTML );
     m_popup->adjustSize();
-    m_popup->adjustPos();
+    m_popup->adjustPos( point );
     m_popup->show();
 }
 
@@ -1730,15 +1759,6 @@ void KitaHTMLPart::hidePopup()
 
 
 
-/* private */
-void KitaHTMLPart::deletePopup()
-{
-    if ( m_popup ) delete m_popup;
-    m_popup = NULL;
-    m_multiPopup = FALSE;
-}
-
-
 /* return TRUE if this view is under mouse. */ /* private */
 bool KitaHTMLPart::isUnderMouse( int mrgwd, int mrght )
 {
@@ -1837,7 +1857,7 @@ void KitaHTMLPart::slotOnURL( const QString& url )
 
     if( isMultiPopupMode() ) return;
 
-    deletePopup();
+    slotDeletePopup();
 
     if ( url.isEmpty() ) return ;
     if ( url.left( 7 ) == "mailto:" ) return;
@@ -2045,8 +2065,15 @@ namespace Kita
 
 
     /* public */
-    void ResPopup::adjustPos()
+    void ResPopup::adjustPos( QPoint pos )
     {
+       enum{
+           POS_LeftUp,
+           POS_RightUp,            
+           POS_LeftDown,
+           POS_RightDown
+       };
+       
         /* config */
 
         const int mrg = 10;
@@ -2058,54 +2085,98 @@ namespace Kita
         QRect qr = QApplication::desktop() ->rect();
         int sw = qr.width(), sh = qr.height();
         int wd = width(), ht = height();
-
-        QPoint pos = QCursor::pos();
         int x = pos.x(), y = pos.y();
+       int idx;
 
-        if ( x + mrg + wd < sw )
-        {
+        if ( ( x + mrg ) + wd < sw
+            && ( y - mrg ) - ht >= 0 ) idx = POS_LeftUp;
+
+        else if ( ( x - mrg ) - wd >= 0
+                 && y - ( ht + mrg ) >= 0 ) idx = POS_RightUp;
+
+        else if ( ( x + mrg ) + wd < sw
+                 && ( y + mrg ) + ht < sh ) idx = POS_LeftDown;
+
+        else if ( ( x - mrg ) - wd >= 0
+                 && ( y + mrg ) + ht < sh ) idx = POS_RightDown;
+
+        else{
+           int area[4];
+           area[0] = ( sw - x ) * y;
+           area[1] = x * y;
+           area[2] = ( sw - x ) * ( sh - y );
+           area[3] = x * ( sh - y );
+
+           idx = 0;
+           for( int i = 1; i < 4; ++i) if( area[ i ] > area[ idx ] ) idx = i;
+       }
+
+       switch( idx ){
+
+       case POS_LeftUp: 
             x = x + mrg;
-            y = QMAX( 0, y - ( ht + mrg ) );
+            y = ( y - mrg ) - ht;
+           break;
 
-        }
-        else if ( y - ( mrg + ht ) >= 0 )
-        {
-            x = QMAX( 0, sw - wd );
-            y = y - ( ht + mrg );
+       case POS_RightUp:
+            x = ( x - mrg ) - wd;
+            y = ( y - mrg ) - ht;
+           break;
 
-        }
-        else if ( y + ( mrg + ht ) <= sh )
-        {
-            x = QMAX( 0, sw - wd );
+       case POS_LeftDown:
+            x = x + mrg;
+            y = y + mrg;
+           break;
+
+       case POS_RightDown:
+            x = ( x - mrg ) - wd;
             y = y + mrg;
+           break;
+       }
 
+        if( x < 0 ){
+
+           x = ht % 16;
         }
-        else if ( x - ( mrg + wd ) >= 0 )
-        {
-            x = x - ( mrg + wd );
-            y = QMAX( 0, y - ( ht + mrg ) );
+        if( x + wd >= sw ){
 
+           x = sw - wd - ( ht % 16 );
+
+           if( x < 0 ) {
+               m_htmlPart->view()->setVScrollBarMode( QScrollView::AlwaysOn );
+               x = 0;
+               wd = sw;
+           }
         }
-        else
-        {
-            x = x + mrg;
-            y = QMAX( 0, y - ( ht + mrg ) );
+       
+        if( y < 0 ){
+           if( x <= pos.x() && pos.x() < x + wd ){ 
+               m_htmlPart->view()->setVScrollBarMode( QScrollView::AlwaysOn );
+               ht += y;
+           }
+           y = 0;
         }
-
+        if( y + ht >= sh ){
+           
+           if( x <= pos.x() && pos.x() < x + wd ){ 
+               m_htmlPart->view()->setVScrollBarMode( QScrollView::AlwaysOn );
+               ht = sh - y;
+           }
+           else{
+               y = sh - ht;
+
+               if( y < 0 ){
+                   m_htmlPart->view()->setVScrollBarMode( QScrollView::AlwaysOn );
+                   y = 0;
+                   ht = sh;
+               }
+           }
+       }
+       
         pos.setX( x );
         pos.setY( y );
         move( pos );
 
-        if( x + wd >= sw )
-        {
-            m_htmlPart->view()->setVScrollBarMode( QScrollView::AlwaysOn );
-            wd = sw - x;
-        }
-        if( y + ht >= sh )
-        {
-            m_htmlPart->view()->setVScrollBarMode( QScrollView::AlwaysOn );
-            ht = sh - y;
-        }
         m_htmlPart->view()->resize( wd, ht );
         resize( wd, ht );
     }
index 8a8a92c..1745764 100644 (file)
@@ -62,6 +62,7 @@ class KitaHTMLPart : public KHTMLPart
 
     /* goto anchor */
     QStringList m_anchorStack;
+    int m_jumpNumAfterLoading; /* see also slotFinishLoad() */
 
     /* mouse event */
     bool m_pushctrl;
@@ -97,7 +98,7 @@ public:
 
     /* cache */
     bool load( int centerNum );
-    bool reload();
+    bool reload( int jumpNum );
 
     /* goto anchor */
     bool gotoAnchor( const QString& anc, bool pushPosition );
@@ -131,6 +132,9 @@ public slots:
     void slotClickTmpNext100();
     void slotClickShowAll();
 
+    /* res popup */
+    void slotDeletePopup();
+    void slotShowResPopup( QPoint point, int refNum, int refNum2 );
 
 private:
 
@@ -157,10 +161,10 @@ private:
 
     /* res popup */
     void showPopup(  const KURL& url, const QString& innerHTML );
+    void showPopupCore(  const KURL& url, const QString& innerHTML, QPoint point );    
     bool startMultiPopup();
     bool isMultiPopupMode();
     void hidePopup();
-    void deletePopup();
     bool isUnderMouse( int mrgwd, int mrght );
     bool showSelectedDigitPopup();
 
@@ -233,7 +237,7 @@ namespace Kita
         ~ResPopup();
         void setText( const QString& str );
         void adjustSize();
-        void adjustPos();
+        void adjustPos( QPoint pos );
         void moveMouseAbove();
 
     signals:
index 5f3a347..2a91d4a 100644 (file)
@@ -494,6 +494,8 @@ void KitaThreadView::showThread( const KURL& datURL, int num )
 {
     /* If this widget is not parent, then do nothing. */
     if ( m_viewmode != VIEWMODE_MAINVIEW ) return ;
+
+    if( num == 0 ) num = Kita::DatManager::getKokoyonNum( datURL );
     
     if ( topLevelWidget() ->isMinimized() ) topLevelWidget() ->showNormal();
     topLevelWidget() ->raise();
@@ -516,12 +518,12 @@ void KitaThreadView::showThread( const KURL& datURL, int num )
 /*---------*/
 /* reload  */
 /*---------*/ /* public slot */
-void KitaThreadView::slotReloadButton()
+void KitaThreadView::slotReloadButton( int jumpNum )
 {
     topLevelWidget() ->raise();
     setActiveWindow();
 
-    if( m_threadPart->reload() )
+    if( m_threadPart->reload( jumpNum ) )
     {
         showStatusBar( Kita::ParseMisc::utf8ToUnicode( KITAUTF8_NOWRENEW ) );
     }
@@ -532,6 +534,7 @@ void KitaThreadView::slotReloadButton()
 /* stop loading the thread           */ /* public slot */
 void KitaThreadView::slotStopLoading()
 {
+    m_threadPart->slotDeletePopup();
     Kita::DatManager::stopLoading(m_datURL);
 }
 
@@ -559,7 +562,7 @@ void KitaThreadView::showStatusBar( QString info )
         datSize =  Kita::DatManager::getDatSize(m_datURL);
 
         errstr = QString::null;
-        if ( m_rescode != 200 && m_rescode != 206 )
+        if ( m_rescode != 200 && m_rescode != 206 && m_rescode != 0 )
             errstr = QString( "Error %1" ).arg( m_rescode );
         if ( broken ) info += " This thread is broken.";
 
@@ -630,12 +633,21 @@ void KitaThreadView::slotSearchButton()
 {
     if ( m_datURL.isEmpty() ) return ; /* Nothing is shown on the screen.*/
 
-    /* jump */
     QString str = SearchCombo->currentText();
-    if ( str.at( 0 ) == ':' )
-    {
-        QString anc = str.mid( 1 );
-        m_threadPart->gotoAnchor( anc, FALSE );
+    if ( str.at( 0 ) == ':' ){
+
+       /* show res popup */
+       if ( str.at( 1 ) == 'p' ){
+           int refNum = str.mid( 2 ).toInt();
+           QPoint pos = mapToGlobal( SearchCombo->pos() );
+           pos.setY( pos.y() + SearchCombo->height()/2 );
+           m_threadPart->slotShowResPopup( pos , refNum, refNum );
+           return;
+       }
+
+       /* jump */      
+       QString anc = str.mid( 1 );
+       m_threadPart->gotoAnchor( anc, FALSE );
         SearchCombo->setFocus();
         return ;
     }
index 7726546..80c317b 100644 (file)
@@ -78,7 +78,7 @@ public slots:
     void subjectlinkMClicked( const QString &URL );
     void showThread( const KURL& datURL, int num );
     void setFont( const QFont& font );
-    void slotReloadButton();
+    void slotReloadButton( int jumpNum = 0 );
     void slotStopLoading();        
     void focusSearchCombo();
     void slotDeleteButtonClicked();