/* 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 );
}
}
}
-/* 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 );
/* public slot */
void KitaDockWidgetBase::slotToggleShowHide()
{
- if( !isVisible() ) slotShowDock();
+ if( !isVisible() ) slotShowDock( TRUE, TRUE );
else slotHideDock();
}
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() );
}
}
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();
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; }
};
if( i != -1 ) jumpNum = refstr.left( i ).toInt();
else jumpNum = refstr.toInt();
}
- if( jumpNum == 0 ) jumpNum = Kita::DatManager::getKokoyonNum( datURL );
KitaThreadView* view = findMainView( datURL );
/* The view is already shown */
/* TODO: jump to jumpNum after reloading */
- else view->slotReloadButton();
+ else view->slotReloadButton( jumpNum );
}
else if ( withNewTab
/* public slot */
void KitaThreadDock::slotShowThread( const QString& url, bool withNewTab )
{
- slotShowDock();
+ showDock();
if( m_threadTab ) m_threadTab->slotShowMainThread( url, withNewTab );
}
/* 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 );
/* 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 );
/* 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 );
/* 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 );
/* res tree */ /* private slot */
void KitaThreadDock::slotShowKitaNaviResTree( const KURL& datURL, int resNum )
{
- slotShowDock();
+ showDock();
int num;
KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
/* reverse res tree */ /* private slot */
void KitaThreadDock::slotShowKitaNaviRevResTree( const KURL& datURL, int resNum )
{
- slotShowDock();
+ showDock();
int num;
KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
/* 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 );
}
void KitaHTMLPart::clearPart()
{
- deletePopup();
+ slotDeletePopup();
/* delete KitaDomTree */
if ( m_domtree ) delete m_domtree;
/* 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();
}
/*--------------------------------*/
m_centerNum = centerNum;
+ m_jumpNumAfterLoading = 0;
if( m_mode != HTMLPART_MODE_MAINPART ) return FALSE;
if( !m_domtree ) return FALSE;
/* see also slotReceiveData()
and slotFinishLoad(). */ /* public */
-bool KitaHTMLPart::reload()
+bool KitaHTMLPart::reload( int jumpNum )
{
/* config */
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 );
m_domtree->parseAllRes();
m_centerNum = 0;
+ if( m_jumpNumAfterLoading ) gotoAnchor( QString().setNum( m_jumpNumAfterLoading ), FALSE );
+ m_jumpNumAfterLoading = 0;
+
emit finishReload();
}
/* 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 );
m_popup->setText( innerHTML );
m_popup->adjustSize();
- m_popup->adjustPos();
+ m_popup->adjustPos( point );
m_popup->show();
}
-/* 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 )
{
if( isMultiPopupMode() ) return;
- deletePopup();
+ slotDeletePopup();
if ( url.isEmpty() ) return ;
if ( url.left( 7 ) == "mailto:" ) return;
/* public */
- void ResPopup::adjustPos()
+ void ResPopup::adjustPos( QPoint pos )
{
+ enum{
+ POS_LeftUp,
+ POS_RightUp,
+ POS_LeftDown,
+ POS_RightDown
+ };
+
/* config */
const int mrg = 10;
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 );
}
/* goto anchor */
QStringList m_anchorStack;
+ int m_jumpNumAfterLoading; /* see also slotFinishLoad() */
/* mouse event */
bool m_pushctrl;
/* cache */
bool load( int centerNum );
- bool reload();
+ bool reload( int jumpNum );
/* goto anchor */
bool gotoAnchor( const QString& anc, bool pushPosition );
void slotClickTmpNext100();
void slotClickShowAll();
+ /* res popup */
+ void slotDeletePopup();
+ void slotShowResPopup( QPoint point, int refNum, int refNum2 );
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();
~ResPopup();
void setText( const QString& str );
void adjustSize();
- void adjustPos();
+ void adjustPos( QPoint pos );
void moveMouseAbove();
signals:
{
/* 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();
/*---------*/
/* 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 ) );
}
/* stop loading the thread */ /* public slot */
void KitaThreadView::slotStopLoading()
{
+ m_threadPart->slotDeletePopup();
Kita::DatManager::stopLoading(m_datURL);
}
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.";
{
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 ;
}
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();