1 /**************************************************************************
2 * Copyright (C) 2003 by Hideki Ikemoto , (c)2004 by 421 *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 **************************************************************************/
14 #include <kstdaccel.h>
15 #include <kpopupmenu.h>
16 #include <qmessagebox.h>
19 #include "libkita/datmanager.h"
20 #include "libkita/kita_misc.h"
21 #include "libkita/kita-utf8.h"
22 #include "libkita/parsemisc.h"
23 #include "libkita/signalcollection.h"
26 #include "kitathreadview.h"
28 #define MAX_TABLABEL_LEN 8
30 /*----------------------------------------*/
32 /*----------------------------------------*/
34 KitaNavi* KitaNavi::m_kitanavi = NULL;
36 /* Don't call this directly. Call getKitaNavi instead. */
40 : QFrame( parent, "kita_navif" , WType_TopLevel)
42 /* default size of kita navi */
43 const int kitanavi_wd = 600;
44 const int kitanavi_ht = 400;
46 resize(kitanavi_wd,kitanavi_ht);
48 /* mode is defined in kitanavi.h */
49 m_navimode = navimode;
51 m_qtw = new KitaNaviTab(m_navimode,this, "kita_navitab", 0 );
52 m_qtw->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
53 QVBoxLayout *vl = new QVBoxLayout(this);
56 /* emit when this widget is deactivated */
57 connect( this, SIGNAL( windowDeactivated() ),
58 Kita::SignalCollection::getInstance(), SIGNAL( windowDeactivated() ));
60 /* If this widget is active and receives
61 signal isKitaActive, then emit signal kitaIsActive. */
62 connect( Kita::SignalCollection::getInstance(), SIGNAL( isKitaActive() ),
63 this, SLOT( slotIsKitaActive() ) );
65 connect( this, SIGNAL( kitaIsActive() ),
66 Kita::SignalCollection::getInstance(), SIGNAL( kitaIsActive() ) );
68 /* set keyboard accelerator */
69 KActionCollection *kac = new KActionCollection(this);
70 if(m_navimode == KITANAVI_NAVI) KStdAction::find( this, SLOT( slotEditFind() ), kac);
71 new KAction(i18n( "Close Current Thread Tab" ),
72 KStdAccel::close(),this,SLOT( slotCloseCurrentTab() ),kac,"close_tab" );
76 KitaNavi::~KitaNavi(){
77 if(m_qtw) delete m_qtw;
82 /*-------------------------*/
83 /* show thread on the tab */
84 /*-------------------------*/ /* private */
85 void KitaNavi::addTab(int mode,
91 if(m_navimode != KITANAVI_NAVI) return;
93 if(isMinimized()) showNormal();
98 int count = 0,totalNum = 0;
99 QString headstr = QString::null;
100 QString footstr = QString::null;
101 QString anchor = QString::null;
102 QString cmbstr = QString::null;
109 /* set title and label */
112 case KITANAVI_SHOWRES:
114 if(startnum == endnum) labelstr = QString().setNum(startnum);
115 else labelstr = QString( "%1-%2" ).arg(startnum).arg(endnum);
119 case KITANAVI_EXTBYID:
120 case KITANAVI_EXTBYWORD:
121 case KITANAVI_EXTBYNAME:
123 + " :"+ Kita::ParseMisc::utf8ToUnicode(KITAUTF8_EXTRACT);
126 case KITANAVI_SHOWRESTREE:
127 case KITANAVI_SHOWREVRESTREE:
128 labelstr = QString().setNum(startnum);
132 labelstr += " :"+QString( "[%1] %2" )
133 .arg( Kita::DatManager::thread_boardName( datURL ) )
134 .arg( Kita::DatManager::thread_name( datURL ) );
136 /* create KitaThreadView and setup it */
137 KitaThreadView *view = new KitaThreadView(m_qtw);
138 str = Kita::unescape( labelstr.left( MAX_TABLABEL_LEN ) );
139 m_qtw->addTab(view,str);
140 m_qtw->setTabToolTip(view,labelstr);
142 connect( Kita::SignalCollection::getInstance(), SIGNAL( signalChangeStatusbar( const QString&) ),
143 this,SLOT( slotChangeCaption( const QString& )));
145 view->setup( datURL, VIEWMODE_KITANAVI );
146 totalNum = Kita::DatManager::getMaxResNumber( datURL );
148 /*---------------------------------------------*/
149 /* copy data from DatManager to KitaThreadView */
153 case KITANAVI_SHOWRES:
155 for(int i = QMAX(1,startnum-margin); i <= QMIN(totalNum,endnum+margin); i++){
156 if(i == startnum) view->domAppendBelt("belt1");
157 str = Kita::DatManager::getDat( datURL ,i);
158 view->domAppendData(str,i,i);
159 if(i == endnum) view->domAppendBelt("belt2");
161 if(startnum == endnum) headstr = QString("No. %1").arg(startnum);
162 else headstr = QString("No. %1 - %2").arg(startnum).arg(endnum);
165 anchor = QString().setNum(startnum-1);
169 /*--------------------------------*/
171 case KITANAVI_EXTBYID:
173 for(int i = 1; i<= totalNum; i++){
174 if(Kita::DatManager::checkID( datURL, query, i )){
175 str = Kita::DatManager::getDat( datURL, i );
176 view->domAppendData(str,i,i);
180 headstr = QString("ID:%1 : [%2]").arg(query).arg(count);
185 /*--------------------------------*/
187 case KITANAVI_EXTBYNAME:
189 for(int i = 1; i<= totalNum; i++){
190 if( Kita::DatManager::getName( datURL, i ) == query ){
191 str = Kita::DatManager::getDat( datURL, i );
192 view->domAppendData( str, i, i );
196 headstr = Kita::ParseMisc::utf8ToUnicode(KITAUTF8_EXTRACT)
197 +QString(": %1 : [%2]").arg( query ).arg( count );
202 /*--------------------------------*/
204 case KITANAVI_EXTBYWORD:
206 if(query.at(0) == '|'){ /* OR */
214 str.replace(Kita::ParseMisc::utf8ToUnicode(KITAUTF8_ZENSPACE)," ");
215 str.replace(qrx," "); /* pack space */
216 queries = QStringList::split(" ", str);
218 for(int i = 1; i<= totalNum; i++){
219 if(Kita::DatManager::checkWord( datURL, queries, i, ext_OR )){
220 str = Kita::DatManager::getDat( datURL, i );
221 view->domAppendData(str,i,i);
225 headstr = Kita::ParseMisc::utf8ToUnicode(KITAUTF8_EXTRACT)
226 +QString(": %1 : [%2]").arg(query).arg(count);
232 /*--------------------------------*/
234 case KITANAVI_SHOWRESTREE:
235 case KITANAVI_SHOWREVRESTREE:
237 str = QString("[%1] %2 : No.%3 [%4]<br>")
238 .arg( Kita::DatManager::thread_boardName( datURL ) )
239 .arg( Kita::DatManager::thread_name( datURL ) )
240 .arg(startnum ).arg( endnum );
241 urlstr = Kita::DatManager::thread_url( datURL ) + QString().setNum( startnum );
242 str += "<a href=\""+urlstr+"\">"+urlstr+"</a><br>";
243 str += Kita::DatManager::getHtml( datURL, startnum, startnum );
245 str += "<div style=\"background-color: #CCCCCC; text-align: center\"><br></div>";
248 view->domSetInnerHTML(str);
256 m_qtw->showPage(view);
257 view->domApplyChange(labelstr,headstr,footstr,anchor,cmbstr);
264 void KitaNavi::slotChangeCaption( const QString& text )
266 setCaption("KitaNavi: "+text);
270 /* for keyboard acceleration */
271 void KitaNavi::slotCloseCurrentTab()
273 QWidget* view = m_qtw->currentPage();
274 m_qtw->myRemovePage( view ,TRUE);
277 /* for keyboard acceleration */
278 void KitaNavi::slotEditFind(){
280 KitaThreadView* view = static_cast<KitaThreadView*>(m_qtw->currentPage());
281 view->focusSearchCombo();
284 /* when window is deactivated, emit signal to popup */ /* protected */
285 void KitaNavi::windowActivationChange ( bool )
287 if(!isActiveWindow()) emit windowDeactivated();
291 void KitaNavi::slotIsKitaActive(){
292 if(isActiveWindow()) emit kitaIsActive();
296 /*----------------------------------------------------------------------*/
299 /* static & public */
301 /* Don't forget to call this in KitaMainWindow::setupView */ /* static & public */
302 void KitaNavi::createKitaNavi(QWidget* parent, KitaThreadTabWidget* ){
303 if(m_kitanavi == NULL){
304 m_kitanavi = new KitaNavi(parent,KITANAVI_NAVI);
308 KitaNavi* KitaNavi::getKitaNavi(){
309 if(m_kitanavi) m_kitanavi->show();
315 void KitaNavi::showKitaNavi( const KURL& datURL, int startnum, int endnum){
317 if( ! m_kitanavi ) return;
320 KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
321 m_kitanavi->addTab( KITANAVI_SHOWRES, parsedURL, QString::null, startnum, endnum );
327 void KitaNavi::showKitaNaviByID(const KURL& datURL, QString strid){
329 if( ! m_kitanavi ) return;
332 KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
333 m_kitanavi->addTab( KITANAVI_EXTBYID, parsedURL, strid, 0, 0 );
338 /* extract by keywords */
339 void KitaNavi::showKitaNaviByWord( const KURL& datURL, QString query){
341 if( ! m_kitanavi ) return;
344 KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
345 m_kitanavi->addTab( KITANAVI_EXTBYWORD, parsedURL, query, 0, 0 );
349 /* extract by name */
350 void KitaNavi::showKitaNaviByName( const KURL& datURL, QString query){
352 if( ! m_kitanavi ) return;
355 KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
356 m_kitanavi->addTab( KITANAVI_EXTBYNAME, parsedURL, query, 0, 0 );
362 void KitaNavi::showKitaNaviResTree( const KURL& datURL, int resNum){
364 if( ! m_kitanavi ) return;
368 KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
369 QString htmlstr = Kita::DatManager::getTreeByRes( parsedURL, resNum, num);
370 m_kitanavi->addTab( KITANAVI_SHOWRESTREE, parsedURL, htmlstr, resNum, num);
374 /* reverse res tree */
375 void KitaNavi::showKitaNaviRevResTree( const KURL& datURL, int resNum){
377 if( ! m_kitanavi ) return;
381 KURL parsedURL = Kita::ParseMisc::parseURLonly( datURL );
382 QString htmlstr = Kita::DatManager::getTreeByResReverse( parsedURL, resNum, num );
383 m_kitanavi->addTab( KITANAVI_SHOWREVRESTREE, parsedURL, htmlstr, resNum, num );
387 /*----------------------------------------------------------------------*/
390 /*----------------------------------------*/
391 /* class KitaNaviTabBar */
392 /*----------------------------------------*/
394 /* tabbar for kitanavi */
397 void KitaNaviTabBar::contextMenuEvent( QContextMenuEvent* e )
399 KitaNaviTab* tw = static_cast<KitaNaviTab*>(parentWidget());
400 QWidget* view = tw->currentPage();
401 QWidget* curview = view;
403 int max = tw->count();
404 int curnum = tw->currentPageIndex();
406 KPopupMenu popup( 0 );
407 popup.insertItem( i18n( "Close this tab" ) , 1 );
408 popup.insertSeparator();
410 popup.insertItem( i18n( "Close other tabs" ), 3 );
411 popup.insertItem( i18n( "Close right tabs" ), 4 );
412 popup.insertItem( i18n( "Close left tabs" ), 5 );
413 popup.insertItem( i18n( "Close all tabs" ), 2 );
415 switch ( popup.exec( e->globalPos() ) ) {
418 if(view != NULL) tw->myRemovePage( view ,TRUE);
422 while(tw->count() > 0 && view != NULL) view = tw->myRemovePage( view ,TRUE);
426 for(int i=0,i2 = 0;i < max;i++){
429 if(view != curview) tw->myRemovePage( view ,TRUE);
436 for(int i=curnum+1 ; i<max;i++){
437 view = tw->page(curnum+1);
438 if(view != NULL) tw->myRemovePage( view ,TRUE);
443 for(int i=0 ;i<curnum ;i++){
445 if(view != NULL) tw->myRemovePage( view ,TRUE);
454 /*---------------------------------------------------------------------------*/
456 /*-------------------------------------*/
457 /* class KitaNaviTab */
458 /*-------------------------------------*/
460 /* tab widget for kita navi */
462 KitaNaviTab::KitaNaviTab(int mode, QWidget* parent, const char* name, WFlags f)
463 : QTabWidget( parent, name, f )
465 setTabBar( new KitaNaviTabBar(mode, this ) );
467 connect( this, SIGNAL( currentChanged ( QWidget * ) ),
468 SLOT( slotCurrentChanged ( QWidget * ) ) );
475 KitaNaviTab::~KitaNaviTab(){
482 QWidget* view = currentPage();
483 while(count() > 0 && view != NULL) view = myRemovePage( view ,TRUE);
487 void KitaNaviTab::slotCurrentChanged( QWidget * w){
488 static_cast<KitaThreadView *>( w ) ->showStatusBar( "" );
492 /*----------------------------------------*/
494 /* remove w, then return new current page */
495 /*----------------------------------------*/
496 QWidget* KitaNaviTab::myRemovePage(QWidget* w, bool delCurView){
507 KitaThreadView* view;
508 view = static_cast<KitaThreadView*>(w);
511 /* Calling this function from KitaThreadView itself will
512 causes the crush. So, backup the instance and delete it later. */
513 if(delCurView) delete view;
514 else m_prevview = view;
519 retw = currentPage();
520 if(retw == NULL) parentWidget()->hide();