/*************************************************************************** smb4kpreviewdialog.cpp - The preview dialog of Smb4K ------------------- begin : Fre Jul 4 2003 copyright : (C) 2003-2007 by Alexander Reinholdt email : dustpuppy@users.berlios.de ***************************************************************************/ /*************************************************************************** * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301 USA * ***************************************************************************/ // TQt includes #include #include #include // KDE includes #include #include #include #include #include // application specific includes #include "smb4kpreviewdialog.h" #include "../core/smb4kcore.h" #include "../core/smb4knetworkitems.h" #include "../core/smb4ksettings.h" Smb4KPreviewDialog::Smb4KPreviewDialog( Smb4KShareItem *item, TQWidget *parent, const char *name ) : KDialogBase( Plain, i18n( "Preview" ), Close, Close, parent, name, false, true ) { setWFlags( TQt::WDestructiveClose ); m_item = new Smb4KPreviewItem( item ); if ( m_item ) { if ( Smb4KHostItem *host = Smb4KCore::scanner()->getHost( item->host(), item->workgroup() ) ) { m_item->setIP( host->ip() ); } m_button_id = None; m_current_item = m_history.end(); setupView(); setInitialSize( configDialogSize( *(Smb4KSettings::self()->config()), "PreviewDialog" ) ); connect( m_view, TQ_SIGNAL( executed( TQIconViewItem * ) ), this, TQ_SLOT( slotItemExecuted( TQIconViewItem * ) ) ); connect( m_toolbar, TQ_SIGNAL( clicked( int ) ), this, TQ_SLOT( slotButtonClicked( int ) ) ); connect( m_combo, TQ_SIGNAL( activated( const TQString & ) ), this, TQ_SLOT( slotItemActivated( const TQString & ) ) ); connect( Smb4KCore::previewer(), TQ_SIGNAL( result( Smb4KPreviewItem * ) ), this, TQ_SLOT( slotReceivedData( Smb4KPreviewItem * ) ) ); m_initialized = Smb4KCore::previewer()->preview( m_item ); } setMinimumSize( (sizeHint().width() > 350 ? sizeHint().width() : 350), sizeHint().height() ); } Smb4KPreviewDialog::~Smb4KPreviewDialog() { delete m_item; } void Smb4KPreviewDialog::setupView() { TQFrame *frame = plainPage(); TQGridLayout *layout = new TQGridLayout( frame ); m_view = new TDEIconView( frame, 0, 0 ); m_view->setItemTextPos( TDEIconView::Right ); m_view->setResizeMode( TDEIconView::Adjust ); m_view->setArrangement( TDEIconView::TopToBottom ); m_view->setSpacing( 1 ); m_view->setGridX( 200 ); m_view->setWordWrapIconText( false ); m_view->setShowToolTips( true ); m_view->setAutoArrange( true ); m_view->setSorting( true, true ); m_toolbar = new TDEToolBar( frame, 0, true, false ); m_toolbar->insertButton( "reload", Reload, true, i18n( "Reload" ), 0 ); m_toolbar->insertButton( "back", Back, false, i18n( "Back" ), 1 ); m_toolbar->insertButton( "forward", Forward, false, i18n( "Forward" ), 2 ); m_toolbar->insertButton( "go-up", Up, false, i18n( "Up" ), 3 ); m_combo = new KComboBox( false, m_toolbar, 0 ); m_combo->listBox()->setHScrollBarMode( TQScrollView::Auto ); m_combo->listBox()->setVScrollBarMode( TQScrollView::Auto ); m_combo->listBox()->setMinimumHeight( 100 ); m_toolbar->insertWidget( Combo, 10, m_combo, 4 ); m_toolbar->setItemAutoSized( Combo, true ); layout->addWidget( m_view, 0, 0, 0 ); layout->addWidget( m_toolbar, 1, 0, 0 ); } ///////////////////////////////////////////////////////////////////////////// // SLOT IMPLEMENTATIONS ///////////////////////////////////////////////////////////////////////////// void Smb4KPreviewDialog::slotReceivedData( Smb4KPreviewItem *item ) { // If the item is NULL or not equal to m_item, // stop right here: if ( !item || item != m_item ) { return; } // Clear the icon view: m_view->clear(); // The item should be equal to m_item, so we can use either of those // pointers. // Process the data: if ( !item->contents().isEmpty() ) { // Generate the history. switch ( m_button_id ) { case Reload: /* Really? */ case Back: case Forward: { // Do not insert anything into the history if // one of these three buttons was clicked. break; } default: { m_history.append( item->location() ); m_current_item = --m_history.end(); break; } } // Clear the combo box, put the new history there and set the // current item: m_combo->clear(); for ( TQStringList::Iterator it = m_history.begin(); it != m_history.end(); it++ ) { if ( !m_combo->listBox()->findItem( *it, TQt::CaseSensitive|TQt::ExactMatch ) ) { m_combo->insertItem( *it, -1 ); } } m_combo->setCurrentText( *m_current_item ); // Now put the contents in the icon view: for ( TQValueList::ConstIterator it = item->contents().begin(); it != item->contents().end(); ++it ) { switch ( (*it).first ) { case Smb4KPreviewItem::File: { TDEIconViewItem *view_item = new TDEIconViewItem( m_view, (*it).second, SmallIcon( "file" ) ); view_item->setKey( TQString( "[file]_%1" ).arg( (*it).second ) ); break; } case Smb4KPreviewItem::Directory: { // We do not want to show the '.' and '..' directories. if ( TQString::compare( (*it).second, "." ) != 0 && TQString::compare( (*it).second, ".." ) != 0 ) { TDEIconViewItem *view_item = new TDEIconViewItem( m_view, (*it).second, SmallIcon( "folder" ) ); view_item->setKey( TQString( "[directory]_%1" ).arg( (*it).second ) ); } break; } case Smb4KPreviewItem::HiddenFile: { if ( Smb4KSettings::previewHiddenItems() ) { TDEIconViewItem *view_item = new TDEIconViewItem( m_view, (*it).second, SmallIcon( "file" ) ); view_item->setKey( TQString( "[file]_%1" ).arg( (*it).second ) ); } break; } case Smb4KPreviewItem::HiddenDirectory: { if ( Smb4KSettings::previewHiddenItems() && TQString::compare( (*it).second, "." ) != 0 && TQString::compare( (*it).second, ".." ) != 0 ) { TDEIconViewItem *view_item = new TDEIconViewItem( m_view, (*it).second, SmallIcon( "folder" ) ); view_item->setKey( TQString( "[directory]_%1" ).arg( (*it).second ) ); } break; } default: { break; } } } // Now activate or deactivate the buttons: // Activate the 'Up' button if the current address is // not equal to the base address. m_toolbar->setItemEnabled( Up, TQString::compare( "//"+item->host()+"/"+item->share()+"/", item->location() ) != 0 ); // Activate/Deactivate 'Back' and 'Forward' buttons. m_toolbar->setItemEnabled( Back, m_current_item != m_history.at( 0 ) ); m_toolbar->setItemEnabled( Forward, m_current_item != m_history.at( m_history.count() - 1 ) ); } else { return; } } void Smb4KPreviewDialog::slotItemExecuted( TQIconViewItem *item ) { if ( !item->key().startsWith( "[file]_" ) ) { m_button_id = None; m_item->setPath( m_item->path()+item->text()+"/" ); Smb4KCore::previewer()->preview( m_item ); } } void Smb4KPreviewDialog::slotButtonClicked( int id ) { m_button_id = id; m_item->clearContents(); switch ( id ) { case Reload: { Smb4KCore::previewer()->preview( m_item ); break; } case Up: { // Do nothing if the path is empty because // we are already in the root directory. if ( m_item->path().isEmpty() ) { return; } if ( m_item->path().contains( "/" ) > 1 ) { m_item->setPath( m_item->path().section( "/", 0, -3 ).append( "/" ) ); } else if ( m_item->path().contains( "/", true ) == 1 ) { m_item->setPath( TQString() ); } Smb4KCore::previewer()->preview( m_item ); break; } case Back: { // Move one item back in the list: if ( m_current_item != m_history.at( 0 ) ) { m_current_item--; } else { return; } // Get the path: if ( (*m_current_item).contains( "/", true ) == 3 ) { m_item->setPath( TQString() ); } else { m_item->setPath( (*m_current_item).section( "/", 4, -1 ) ); if ( !m_item->path().isEmpty() ) { m_item->setPath( m_item->path()+"/" ); } else { // Do nothing. } } Smb4KCore::previewer()->preview( m_item ); break; } case Forward: { // Move one item forward in the list: if ( m_current_item != m_history.at( m_history.count() - 1 ) ) { m_current_item++; } else { return; } // Get the path: if ( (*m_current_item).contains( "/", true ) == 3 ) { m_item->setPath( TQString() ); } else { m_item->setPath( (*m_current_item).section( "/", 4, -1 ) ); if ( !m_item->path().isEmpty() ) { m_item->setPath( m_item->path()+"/" ); } else { // Do nothing. } } Smb4KCore::previewer()->preview( m_item ); break; } default: { break; } } } void Smb4KPreviewDialog::slotItemActivated( const TQString &item ) { m_button_id = Combo; // First we have to strip the address: m_item->setPath( item.section( "//"+m_item->host()+"/"+m_item->share()+"/", 1, 1 ).stripWhiteSpace() ); Smb4KCore::previewer()->preview( m_item ); } void Smb4KPreviewDialog::slotClose() { saveDialogSize( *(Smb4KSettings::self()->config()), "PreviewDialog" ); KDialogBase::slotClose(); } #include "smb4kpreviewdialog.moc"