00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kateviewspace.h"
00022 #include "kateviewspace.moc"
00023
00024 #include "katemainwindow.h"
00025 #include "kateviewspacecontainer.h"
00026 #include "katedocmanager.h"
00027 #include "kateapp.h"
00028 #include "katesession.h"
00029
00030 #include <kiconloader.h>
00031 #include <tdelocale.h>
00032 #include <ksqueezedtextlabel.h>
00033 #include <tdeconfig.h>
00034 #include <kdebug.h>
00035
00036 #include <tqwidgetstack.h>
00037 #include <tqpainter.h>
00038 #include <tqlabel.h>
00039 #include <tqcursor.h>
00040 #include <tqpopupmenu.h>
00041 #include <tqpixmap.h>
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 class KVSSBSep : public TQWidget {
00061 public:
00062 KVSSBSep( KateViewSpace *parent=0) : TQWidget(parent)
00063 {
00064 setFixedHeight( 2 );
00065 }
00066 protected:
00067 void paintEvent( TQPaintEvent *e )
00068 {
00069 TQPainter p( this );
00070 p.setPen( colorGroup().shadow() );
00071 p.drawLine( e->rect().left(), 0, e->rect().right(), 0 );
00072 p.setPen( ((KateViewSpace*)parentWidget())->isActiveSpace() ? colorGroup().light() : colorGroup().midlight() );
00073 p.drawLine( e->rect().left(), 1, e->rect().right(), 1 );
00074 }
00075 };
00076
00077
00078
00079 KateViewSpace::KateViewSpace( KateViewSpaceContainer *viewManager,
00080 TQWidget* parent, const char* name )
00081 : TQVBox(parent, name),
00082 m_viewManager( viewManager )
00083 {
00084 mViewList.setAutoDelete(false);
00085
00086 stack = new TQWidgetStack( this );
00087 setStretchFactor(stack, 1);
00088 stack->setFocus();
00089
00090 mStatusBar = new KateVSStatusBar(this);
00091 mIsActiveSpace = false;
00092 mViewCount = 0;
00093
00094 setMinimumWidth (mStatusBar->minimumWidth());
00095 m_group = TQString::null;
00096 }
00097
00098 KateViewSpace::~KateViewSpace()
00099 {
00100 }
00101
00102 void KateViewSpace::polish()
00103 {
00104 mStatusBar->show();
00105 }
00106
00107 void KateViewSpace::addView(Kate::View* v, bool show)
00108 {
00109
00110 if ( !m_group.isEmpty() )
00111 {
00112 TQString fn = v->getDoc()->url().prettyURL();
00113 if (!fn.isEmpty())
00114 {
00115 TQString vgroup = TQString("%1 %2").arg(m_group).arg(fn);
00116
00117 const KateSession *as = KateSessionManager::self()->getActiveSession();
00118 TDEConfig *asCfg = as->getConfig();
00119 if (asCfg && asCfg->hasGroup(vgroup))
00120 {
00121 asCfg->setGroup(vgroup);
00122 v->readSessionConfig(asCfg);
00123 }
00124 }
00125 }
00126
00127 uint id = mViewList.count();
00128 stack->addWidget(v, id);
00129 if (show) {
00130 mViewList.append(v);
00131 showView( v );
00132 }
00133 else {
00134 Kate::View* c = mViewList.current();
00135 mViewList.prepend( v );
00136 showView( c );
00137 }
00138 }
00139
00140 void KateViewSpace::removeView(Kate::View* v)
00141 {
00142 disconnect( v->getDoc(), TQT_SIGNAL(modifiedChanged()),
00143 mStatusBar, TQT_SLOT(modifiedChanged()) );
00144
00145 bool active = ( v == currentView() );
00146
00147 mViewList.remove (v);
00148 stack->removeWidget (v);
00149
00150 if ( ! active )
00151 return;
00152
00153 if (currentView() != 0L)
00154 showView(mViewList.current());
00155 else if (mViewList.count() > 0)
00156 showView(mViewList.last());
00157 }
00158
00159 bool KateViewSpace::showView(Kate::View* v)
00160 {
00161 return showView( v->getDoc()->documentNumber() );
00162 }
00163
00164 bool KateViewSpace::showView(uint documentNumber)
00165 {
00166 TQPtrListIterator<Kate::View> it (mViewList);
00167 it.toLast();
00168 for( ; it.current(); --it ) {
00169 if (((Kate::Document*)it.current()->getDoc())->documentNumber() == documentNumber) {
00170 if ( currentView() )
00171 disconnect( currentView()->getDoc(), TQT_SIGNAL(modifiedChanged()),
00172 mStatusBar, TQT_SLOT(modifiedChanged()) );
00173
00174 Kate::View* kv = it.current();
00175 connect( kv->getDoc(), TQT_SIGNAL(modifiedChanged()),
00176 mStatusBar, TQT_SLOT(modifiedChanged()) );
00177
00178 mViewList.removeRef( kv );
00179 mViewList.append( kv );
00180 stack->raiseWidget( kv );
00181 kv->show();
00182 mStatusBar->modifiedChanged();
00183 return true;
00184 }
00185 }
00186 return false;
00187 }
00188
00189
00190 Kate::View* KateViewSpace::currentView()
00191 {
00192 if (mViewList.count() > 0)
00193 return (Kate::View*)stack->visibleWidget();
00194
00195 return 0L;
00196 }
00197
00198 bool KateViewSpace::isActiveSpace()
00199 {
00200 return mIsActiveSpace;
00201 }
00202
00203 void KateViewSpace::setActive( bool active, bool )
00204 {
00205 mIsActiveSpace = active;
00206
00207
00208 TQPalette pal( palette() );
00209 if ( ! active )
00210 {
00211 pal.setColor( TQColorGroup::Background, pal.active().mid() );
00212 pal.setColor( TQColorGroup::Light, pal.active().midlight() );
00213 }
00214
00215 mStatusBar->setPalette( pal );
00216 mStatusBar->update();
00217
00218 }
00219
00220 bool KateViewSpace::event( TQEvent *e )
00221 {
00222 if ( e->type() == TQEvent::PaletteChange )
00223 {
00224 setActive( mIsActiveSpace );
00225 return true;
00226 }
00227 return TQVBox::event( e );
00228 }
00229
00230 void KateViewSpace::slotStatusChanged (Kate::View *view, int r, int c, int ovr, bool block, int mod, const TQString &msg)
00231 {
00232 if ((TQWidgetStack *)view->parentWidget() != stack)
00233 return;
00234 mStatusBar->setStatus( r, c, ovr, block, mod, msg );
00235 }
00236
00237 void KateViewSpace::saveConfig ( TDEConfig* config, int myIndex ,const TQString& viewConfGrp)
00238 {
00239
00240 TQString group = TQString(viewConfGrp+"-ViewSpace %1").arg( myIndex );
00241
00242 config->setGroup (group);
00243 config->writeEntry ("Count", mViewList.count());
00244
00245 if (currentView())
00246 config->writeEntry( "Active View", currentView()->getDoc()->url().prettyURL() );
00247
00248
00249 TQPtrListIterator<Kate::View> it(mViewList);
00250
00251 int idx = 0;
00252 for (; it.current(); ++it)
00253 {
00254 if ( !it.current()->getDoc()->url().isEmpty() )
00255 {
00256 long docListPos = it.current()->getDoc()->documentListPosition();
00257 config->setGroup( group );
00258 config->writeEntry( TQString("View %1").arg( (docListPos<0)?idx:docListPos ), it.current()->getDoc()->url().prettyURL() );
00259
00260
00261 TQString vgroup = TQString("%1 %2").arg(group).arg(it.current()->getDoc()->url().prettyURL());
00262 config->setGroup( vgroup );
00263 it.current()->writeSessionConfig( config );
00264 }
00265
00266 idx++;
00267 }
00268 }
00269
00270 void KateViewSpace::modifiedOnDisc(Kate::Document *, bool, unsigned char)
00271 {
00272 if ( currentView() )
00273 mStatusBar->updateMod( currentView()->getDoc()->isModified() );
00274 }
00275
00276 void KateViewSpace::restoreConfig ( KateViewSpaceContainer *viewMan, TDEConfig* config, const TQString &group )
00277 {
00278 config->setGroup (group);
00279 TQString fn = config->readEntry( "Active View" );
00280
00281 if ( !fn.isEmpty() )
00282 {
00283 Kate::Document *doc = KateDocManager::self()->findDocumentByUrl (KURL(fn));
00284
00285 if (doc)
00286 {
00287
00288 TQString vgroup = TQString("%1 %2").arg(group).arg(fn);
00289 config->setGroup( vgroup );
00290
00291 viewMan->createView (doc);
00292
00293 Kate::View *v = viewMan->activeView ();
00294
00295 if (v)
00296 v->readSessionConfig( config );
00297 }
00298 }
00299
00300 if (mViewList.isEmpty())
00301 viewMan->createView (KateDocManager::self()->document(0));
00302
00303 m_group = group;
00304 }
00305
00306
00307
00308 KateVSStatusBar::KateVSStatusBar ( KateViewSpace *parent, const char *name )
00309 : KStatusBar( parent, name ),
00310 m_viewSpace( parent )
00311 {
00312 m_lineColLabel = new TQLabel( this );
00313 addWidget( m_lineColLabel, 0, false );
00314 m_lineColLabel->setAlignment( Qt::AlignCenter );
00315 m_lineColLabel->installEventFilter( this );
00316
00317 m_modifiedLabel = new TQLabel( TQString(" "), this );
00318 addWidget( m_modifiedLabel, 0, false );
00319 m_modifiedLabel->setAlignment( Qt::AlignCenter );
00320 m_modifiedLabel->installEventFilter( this );
00321
00322 m_insertModeLabel = new TQLabel( i18n(" INS "), this );
00323 addWidget( m_insertModeLabel, 0, false );
00324 m_insertModeLabel->setAlignment( Qt::AlignCenter );
00325 m_insertModeLabel->installEventFilter( this );
00326
00327 m_selectModeLabel = new TQLabel( i18n(" NORM "), this );
00328 addWidget( m_selectModeLabel, 0, false );
00329 m_selectModeLabel->setAlignment( Qt::AlignCenter );
00330 m_selectModeLabel->installEventFilter( this );
00331
00332 m_fileNameLabel=new KSqueezedTextLabel( this );
00333 addWidget( m_fileNameLabel, 1, true );
00334 m_fileNameLabel->setMinimumSize( 0, 0 );
00335 m_fileNameLabel->setSizePolicy(TQSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::Fixed ));
00336 m_fileNameLabel->setAlignment( Qt::AlignLeft );
00337 m_fileNameLabel->installEventFilter( this );
00338
00339 installEventFilter( this );
00340 m_modPm = SmallIcon("modified");
00341 m_modDiscPm = SmallIcon("modonhd");
00342 m_modmodPm = SmallIcon("modmod");
00343 m_noPm = SmallIcon("null");
00344 }
00345
00346 KateVSStatusBar::~KateVSStatusBar ()
00347 {
00348 }
00349
00350 void KateVSStatusBar::setStatus( int r, int c, int ovr, bool block, int, const TQString &msg )
00351 {
00352 m_lineColLabel->setText(
00353 i18n(" Line: %1 Col: %2 ").arg(TDEGlobal::locale()->formatNumber(r+1, 0))
00354 .arg(TDEGlobal::locale()->formatNumber(c+1, 0)) );
00355
00356 if (ovr == 0)
00357 m_insertModeLabel->setText( i18n(" R/O ") );
00358 else if (ovr == 1)
00359 m_insertModeLabel->setText( i18n(" OVR ") );
00360 else if (ovr == 2)
00361 m_insertModeLabel->setText( i18n(" INS ") );
00362
00363
00364
00365 m_selectModeLabel->setText( block ? i18n(" BLK ") : i18n(" NORM ") );
00366
00367 m_fileNameLabel->setText( msg );
00368 }
00369
00370 void KateVSStatusBar::updateMod( bool mod )
00371 {
00372 Kate::View *v = m_viewSpace->currentView();
00373 if ( v )
00374 {
00375 const KateDocumentInfo *info
00376 = KateDocManager::self()->documentInfo ( v->getDoc() );
00377
00378 bool modOnHD = info && info->modifiedOnDisc;
00379
00380 m_modifiedLabel->setPixmap(
00381 mod ?
00382 info && modOnHD ?
00383 m_modmodPm :
00384 m_modPm :
00385 info && modOnHD ?
00386 m_modDiscPm :
00387 m_noPm
00388 );
00389 }
00390 }
00391
00392 void KateVSStatusBar::modifiedChanged()
00393 {
00394 Kate::View *v = m_viewSpace->currentView();
00395 if ( v )
00396 updateMod( v->getDoc()->isModified() );
00397 }
00398
00399 void KateVSStatusBar::showMenu()
00400 {
00401 TDEMainWindow* mainWindow = static_cast<TDEMainWindow*>( topLevelWidget() );
00402 TQPopupMenu* menu = static_cast<TQPopupMenu*>( mainWindow->factory()->container("viewspace_popup", mainWindow ) );
00403
00404 if (menu)
00405 menu->exec(TQCursor::pos());
00406 }
00407
00408 bool KateVSStatusBar::eventFilter(TQObject*,TQEvent *e)
00409 {
00410 if (e->type()==TQEvent::MouseButtonPress)
00411 {
00412 if ( m_viewSpace->currentView() )
00413 m_viewSpace->currentView()->setFocus();
00414
00415 if ( ((TQMouseEvent*)e)->button()==Qt::RightButton)
00416 showMenu();
00417
00418 return true;
00419 }
00420
00421 return false;
00422 }
00423
00424