Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
smb4k/smb4k/dialogs/smb4kpreviewdialog.cpp

400 рядки
11 KiB

/***************************************************************************
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 <tqlayout.h>
#include <tqtooltip.h>
#include <tqiconset.h>
// KDE includes
#include <tdelocale.h>
#include <tdeapplication.h>
#include <kiconloader.h>
#include <kdebug.h>
#include <tdetoolbarbutton.h>
// 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<ContentsItem>::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"