You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1080 lines
33 KiB
1080 lines
33 KiB
/***************************************************************************
|
|
smb4ksystemtray - This is the system tray window class of Smb4K.
|
|
-------------------
|
|
begin : Mi Jun 13 2007
|
|
copyright : (C) 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 <tqtooltip.h>
|
|
#include <tqiconset.h>
|
|
#include <tqpixmap.h>
|
|
#include <tqimage.h>
|
|
|
|
// KDE specific includes
|
|
#include <kiconloader.h>
|
|
#include <klocale.h>
|
|
#include <kdebug.h>
|
|
#include <kpopupmenu.h>
|
|
#include <kaction.h>
|
|
#include <klibloader.h>
|
|
#include <kmessagebox.h>
|
|
#include <kconfigdialog.h>
|
|
#include <kiconeffect.h>
|
|
|
|
// application specific includes
|
|
#include "smb4ksystemtray.h"
|
|
#include "dialogs/smb4kmountdialog.h"
|
|
#include "dialogs/smb4kbookmarkeditor.h"
|
|
#include "dialogs/smb4ksynchronizationdialog.h"
|
|
#include "core/smb4kcore.h"
|
|
#include "core/smb4kbookmark.h"
|
|
#include "core/smb4kshare.h"
|
|
#include "core/smb4ksettings.h"
|
|
|
|
|
|
Smb4KSystemTray::Smb4KSystemTray( TQWidget *parent, const char *name )
|
|
: KSystemTray( parent, name )
|
|
{
|
|
setPixmap( loadIcon( "smb4k" ) );
|
|
|
|
TQToolTip::add( this, i18n( "Smb4K" ) );
|
|
|
|
m_action = NULL;
|
|
|
|
// Enable highlighting of actions:
|
|
actionCollection()->setHighlightingEnabled( true );
|
|
|
|
// Set up the context menu (skeleton):
|
|
m_shares_menu = new KActionMenu( i18n( "Mounted Shares" ), "hdd_mount",
|
|
actionCollection(), "st_mounted_shares_action_menu" );
|
|
m_bookmarks_menu = new KActionMenu( i18n( "Bookmarks" ), "bookmark_folder",
|
|
actionCollection(), "st_bookmark_action_menu" );
|
|
KActionSeparator *sep = new KActionSeparator( TQT_TQOBJECT(this) );
|
|
KAction *manual_mount = new KAction( i18n( "M&ount Manually" ), "connect_creating",
|
|
0, TQT_TQOBJECT(this), TQT_SLOT( slotMountManually() ),
|
|
actionCollection(), "st_mount_manually_action" );
|
|
KAction *configure = KStdAction::preferences( TQT_TQOBJECT(this), TQT_SLOT( slotConfigDialog() ),
|
|
actionCollection(), "st_configure_action" );
|
|
|
|
m_shares_menu->plug( contextMenu() );
|
|
m_bookmarks_menu->plug( contextMenu() );
|
|
sep->plug( contextMenu() );
|
|
manual_mount->plug( contextMenu() );
|
|
configure->plug( contextMenu() );
|
|
|
|
// Set up the menus:
|
|
slotSetupBookmarksMenu();
|
|
slotSetupSharesMenu();
|
|
|
|
// Connections:
|
|
connect( actionCollection(), TQT_SIGNAL( actionHighlighted( KAction * ) ),
|
|
this, TQT_SLOT( slotActionHighlighted( KAction * ) ) );
|
|
|
|
connect( Smb4KCore::bookmarkHandler(), TQT_SIGNAL( bookmarksUpdated() ),
|
|
this, TQT_SLOT( slotSetupBookmarksMenu() ) );
|
|
|
|
connect( Smb4KCore::mounter(), TQT_SIGNAL( updated() ),
|
|
this, TQT_SLOT( slotEnableBookmarks() ) );
|
|
|
|
connect( Smb4KCore::mounter(), TQT_SIGNAL( updated() ),
|
|
this, TQT_SLOT( slotSetupSharesMenu() ) );
|
|
|
|
// Connection to quitSelected() signal must be done in parent widget.
|
|
}
|
|
|
|
|
|
Smb4KSystemTray::~Smb4KSystemTray()
|
|
{
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::embed( bool ebd )
|
|
{
|
|
if ( ebd )
|
|
{
|
|
show();
|
|
}
|
|
else
|
|
{
|
|
hide();
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::loadSettings()
|
|
{
|
|
// Adjust the bookmarks menu.
|
|
// Since the menu is rebuilt everytime slotSetupBookmarksMenu() is
|
|
// called, we just call it and are done.
|
|
slotSetupBookmarksMenu();
|
|
|
|
// Adjust the shares menu.
|
|
// slotSetupSharesMenu() is doing everything for us, so just call it.
|
|
slotSetupSharesMenu();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// TQT_SLOT IMPLEMENTATIONS
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void Smb4KSystemTray::slotMountManually()
|
|
{
|
|
Smb4KMountDialog *dlg = NULL;
|
|
|
|
if ( parentWidget() )
|
|
{
|
|
dlg = static_cast<Smb4KMountDialog *>( TQT_TQWIDGET(parentWidget()->child( "MountDialog", "Smb4KMountDialog", true )) );
|
|
}
|
|
else
|
|
{
|
|
dlg = static_cast<Smb4KMountDialog *>( TQT_TQWIDGET(child( "MountDialog", "Smb4KMountDialog", true )) );
|
|
}
|
|
|
|
if ( !dlg )
|
|
{
|
|
if ( parentWidget() && parentWidget()->isShown() )
|
|
{
|
|
dlg = new Smb4KMountDialog( parentWidget(), "MountDialog" );
|
|
}
|
|
else
|
|
{
|
|
dlg = new Smb4KMountDialog( this, "MountDialog" );
|
|
}
|
|
}
|
|
|
|
// The dialog will be closed destructively.
|
|
if ( !dlg->isShown() )
|
|
{
|
|
dlg->exec();
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotConfigDialog()
|
|
{
|
|
// If the config dialog is already created and cached,
|
|
// we do not create a new one but show the old instead:
|
|
KConfigDialog *dlg = NULL;
|
|
|
|
if ( (dlg = KConfigDialog::exists( "ConfigDialog" )) && KConfigDialog::showDialog( "ConfigDialog" ) )
|
|
{
|
|
// To make sure we do not connect the config dialog several times
|
|
// to slotSettingsChanged(), we break the connection first and re-
|
|
// establish it afterwards:
|
|
disconnect( dlg, TQT_SIGNAL( settingsChanged() ), TQT_TQOBJECT(this), TQT_SLOT( slotSettingsChanged() ) );
|
|
connect( dlg, TQT_SIGNAL( settingsChanged() ), TQT_TQOBJECT(this), TQT_SLOT( slotSettingsChanged() ) );
|
|
|
|
return;
|
|
}
|
|
|
|
// Load the factory of the config dialog:
|
|
KLibFactory *config_factory = KLibLoader::self()->factory( "libsmb4kconfigdialog" );
|
|
|
|
if ( config_factory )
|
|
{
|
|
if ( parentWidget() && parentWidget()->isShown() )
|
|
{
|
|
dlg = static_cast<KConfigDialog *>( TQT_TQWIDGET(config_factory->create( TQT_TQOBJECT(parentWidget()), "ConfigDialog", "KConfigDialog" )) );
|
|
}
|
|
else
|
|
{
|
|
dlg = static_cast<KConfigDialog *>( TQT_TQWIDGET(config_factory->create( TQT_TQOBJECT(this), "ConfigDialog", "KConfigDialog" )) );
|
|
}
|
|
|
|
// ... and show it.
|
|
if ( dlg )
|
|
{
|
|
connect( dlg, TQT_SIGNAL( settingsChanged() ), TQT_TQOBJECT(this), TQT_SLOT( slotSettingsChanged() ) );
|
|
|
|
dlg->show();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
KMessageBox::error( 0, "<qt>"+KLibLoader::self()->lastErrorMessage()+"</qt>" );
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
void Smb4KSystemTray::slotSettingsChanged()
|
|
{
|
|
// Notify the parent that the settings changed:
|
|
emit settingsChanged();
|
|
|
|
// Execute loadSettings():
|
|
loadSettings();
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotSetupBookmarksMenu()
|
|
{
|
|
// First check if we have to set up the menu completely:
|
|
if ( !actionCollection()->action( "st_edit_bookmarks_action" ) )
|
|
{
|
|
// OK, build the menu from ground up:
|
|
KAction *edit_bookmarks = new KAction( i18n( "&Edit Bookmarks" ), "bookmark", 0,
|
|
TQT_TQOBJECT(this), TQT_SLOT( slotBookmarkEditor() ), actionCollection(),
|
|
"st_edit_bookmarks_action" );
|
|
edit_bookmarks->setGroup( "BookmarkActions" );
|
|
edit_bookmarks->plug( m_bookmarks_menu->popupMenu() );
|
|
|
|
KActionSeparator *sep = new KActionSeparator( actionCollection(), "st_bookmark_action_separator" );
|
|
sep->setGroup( "BookmarkActions" );
|
|
sep->plug( m_bookmarks_menu->popupMenu() );
|
|
}
|
|
|
|
// Get the list of bookmark actions and delete all entries. We could
|
|
// also try to keep those actions that are not obsolete, but I think
|
|
// this is the cleanest way.
|
|
KActionPtrList list = actionCollection()->actions( "Bookmarks" );
|
|
|
|
for ( KActionPtrList::Iterator it = list.begin(); it != list.end(); ++it )
|
|
{
|
|
(*it)->unplug( m_bookmarks_menu->popupMenu() );
|
|
actionCollection()->remove( *it );
|
|
}
|
|
|
|
// Get the list of bookmarks:
|
|
TQValueList<Smb4KBookmark *> bookmarks = Smb4KCore::bookmarkHandler()->getBookmarks();
|
|
TQStringList display_strings;
|
|
|
|
// Prepare the list of bookmarks for display:
|
|
if ( !bookmarks.isEmpty() )
|
|
{
|
|
// Enable the "Edit Bookmarks" action:
|
|
actionCollection()->action( "st_edit_bookmarks_action" )->setEnabled( true );
|
|
|
|
// Work around sorting problems:
|
|
for ( TQValueListIterator<Smb4KBookmark *> it = bookmarks.begin(); it != bookmarks.end(); ++it )
|
|
{
|
|
if ( !(*it)->label().isEmpty() && Smb4KSettings::showCustomBookmarkLabel() )
|
|
{
|
|
display_strings.append( (*it)->label() );
|
|
}
|
|
else
|
|
{
|
|
display_strings.append( (*it)->bookmark() );
|
|
}
|
|
}
|
|
|
|
display_strings.sort();
|
|
}
|
|
else
|
|
{
|
|
// Disable the "Edit Bookmarks" action:
|
|
actionCollection()->action( "st_edit_bookmarks_action" )->setEnabled( false );
|
|
}
|
|
|
|
for ( TQStringList::ConstIterator it = display_strings.begin(); it != display_strings.end(); ++it )
|
|
{
|
|
// Create the bookmark action:
|
|
KAction *a = new KAction( *it, "folder", KShortcut::null(), 0, 0, actionCollection(), "st_"+*it );
|
|
a->setGroup( "Bookmarks" );
|
|
connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( slotBookmarkActivated() ) );
|
|
|
|
// Let's have a look if the bookmark action has to be enabled or disabled:
|
|
TQString name;
|
|
|
|
if ( !(*it).startsWith( "//" ) )
|
|
{
|
|
Smb4KBookmark *bookmark = Smb4KCore::bookmarkHandler()->findBookmarkByLabel( *it );
|
|
|
|
name = bookmark->bookmark();
|
|
}
|
|
else
|
|
{
|
|
name = *it;
|
|
}
|
|
|
|
TQValueList<Smb4KShare> share_list = Smb4KCore::mounter()->findShareByName( name );
|
|
|
|
bool enable = true;
|
|
|
|
for ( TQValueList<Smb4KShare>::ConstIterator i = share_list.begin(); i != share_list.end(); ++i )
|
|
{
|
|
if ( !(*i).isForeign() )
|
|
{
|
|
enable = false;
|
|
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
a->setEnabled( enable );
|
|
|
|
// Plug the bookmark to the menu:
|
|
a->plug( m_bookmarks_menu->popupMenu() );
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotBookmarkEditor()
|
|
{
|
|
Smb4KBookmarkEditor *dlg = NULL;
|
|
|
|
if ( parentWidget() )
|
|
{
|
|
dlg = static_cast<Smb4KBookmarkEditor *>( TQT_TQWIDGET(parentWidget()->child( "BookmarkEditor", "Smb4KBookmarkEditor", true )) );
|
|
}
|
|
else
|
|
{
|
|
dlg = static_cast<Smb4KBookmarkEditor *>( TQT_TQWIDGET(child( "BookmarkEditor", "Smb4KBookmarkEditor", true )) );
|
|
}
|
|
|
|
if ( !dlg )
|
|
{
|
|
if ( parentWidget() && parentWidget()->isShown() )
|
|
{
|
|
dlg = new Smb4KBookmarkEditor( parentWidget(), "BookmarkEditor" );
|
|
}
|
|
else
|
|
{
|
|
dlg = new Smb4KBookmarkEditor( this, "BookmarkEditor" );
|
|
}
|
|
}
|
|
|
|
if ( !dlg->isShown() )
|
|
{
|
|
dlg->show();
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotBookmarkActivated()
|
|
{
|
|
if ( m_action && TQString::compare( m_action->group(), "Bookmarks" ) == 0 )
|
|
{
|
|
Smb4KBookmark *bookmark = NULL;
|
|
|
|
if ( !m_action->plainText().startsWith( "//" ) )
|
|
{
|
|
bookmark = Smb4KCore::bookmarkHandler()->findBookmarkByLabel( m_action->plainText() );
|
|
}
|
|
else
|
|
{
|
|
bookmark = Smb4KCore::bookmarkHandler()->findBookmarkByName( m_action->plainText() );
|
|
}
|
|
|
|
if ( bookmark )
|
|
{
|
|
Smb4KCore::mounter()->mountShare( bookmark->workgroup(), bookmark->host(),
|
|
bookmark->ip(), bookmark->share() );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Do nothing
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotEnableBookmarks()
|
|
{
|
|
// Get the list of bookmarks:
|
|
KActionPtrList list = actionCollection()->actions( "Bookmarks" );
|
|
|
|
// Enable/diable the bookmark actions:
|
|
for ( KActionPtrList::Iterator it = list.begin(); it != list.end(); ++it )
|
|
{
|
|
TQString name;
|
|
|
|
if ( !(*it)->plainText().startsWith( "//" ) )
|
|
{
|
|
Smb4KBookmark *bookmark = Smb4KCore::bookmarkHandler()->findBookmarkByLabel( (*it)->plainText() );
|
|
|
|
name = bookmark->bookmark();
|
|
}
|
|
else
|
|
{
|
|
name = (*it)->plainText();
|
|
}
|
|
|
|
TQValueList<Smb4KShare> share_list = Smb4KCore::mounter()->findShareByName( name );
|
|
|
|
bool enable = true;
|
|
|
|
for ( TQValueList<Smb4KShare>::ConstIterator i = share_list.begin(); i != share_list.end(); ++i )
|
|
{
|
|
if ( !(*i).isForeign() )
|
|
{
|
|
enable = false;
|
|
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
(*it)->setEnabled( enable );
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotSetupSharesMenu()
|
|
{
|
|
// First check if we have to set up the menu completely:
|
|
if ( !actionCollection()->action( "st_unmount_all_action" ) )
|
|
{
|
|
// OK, build the menu from ground up:
|
|
KAction *unmount_all = new KAction( i18n( "U&nmount All" ), "gear", KShortcut::null(),
|
|
TQT_TQOBJECT(this), TQT_SLOT( slotUnmountAllShares() ), actionCollection(),
|
|
"st_unmount_all_action" );
|
|
unmount_all->setGroup( "ShareActions" );
|
|
unmount_all->plug( m_shares_menu->popupMenu(), 0 );
|
|
|
|
KActionSeparator *sep = new KActionSeparator( actionCollection(), "st_shares_action_separator" );
|
|
sep->setGroup( "ShareActions" );
|
|
sep->plug( m_shares_menu->popupMenu(), 1 );
|
|
}
|
|
|
|
// Since we are updating the list of shares very frequently, we should
|
|
// not delete all entries in the menu, but look for changes.
|
|
|
|
// Get the list of share actions:
|
|
KActionPtrList actions_list = actionCollection()->actions( "ShareMenus" );
|
|
|
|
// Get the list of mounted shares:
|
|
TQValueList<Smb4KShare *> shares_list = Smb4KCore::mounter()->getShares();
|
|
|
|
if ( !shares_list.isEmpty() )
|
|
{
|
|
// Enable the "Unmount All" action:
|
|
actionCollection()->action( "st_unmount_all_action" )->setEnabled( true );
|
|
|
|
// Delete all obsolete actions:
|
|
for ( KActionPtrList::Iterator it = actions_list.begin(); it != actions_list.end(); ++it )
|
|
{
|
|
// Get the canonical path of the share action:
|
|
TQString action_name = (*it)->name();
|
|
TQString canonical_path = action_name.section( "st_[share_menu]_", 1, -1 );
|
|
|
|
// Check if the share is still present:
|
|
Smb4KShare *share = Smb4KCore::mounter()->findShareByPath( canonical_path );
|
|
|
|
// Decide if the share action has to be deleted or if it can stay:
|
|
if ( share )
|
|
{
|
|
// Keep the share if it either isn't foreign or all shares should
|
|
// be shown.
|
|
if ( !share->isForeign() || Smb4KSettings::showAllShares() )
|
|
{
|
|
// To avoid sorting problems later, we remove *all* actions that
|
|
// have *displayed texts* that do not match the current criterions.
|
|
if ( (!Smb4KSettings::showMountPoint() &&
|
|
TQString::compare( (*it)->plainText(), share->name() ) == 0) ||
|
|
(Smb4KSettings::showMountPoint() &&
|
|
TQString::compare( (*it)->plainText(), share->canonicalPath() ) == 0) )
|
|
{
|
|
// Find the "Force Unmount" action and decide if it needs to be
|
|
// enabled/disabled:
|
|
KAction *force = actionCollection()->action( "st_[force]_"+canonical_path );
|
|
|
|
if ( force )
|
|
{
|
|
force->setEnabled( Smb4KSettings::useForceUnmount() );
|
|
}
|
|
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
// First remove all actions that are in the submenu:
|
|
KAction *action = NULL;
|
|
KActionMenu *menu = static_cast<KActionMenu *>( *it );
|
|
|
|
if ( menu )
|
|
{
|
|
// Unmount action
|
|
action = actionCollection()->action( "st_[unmount]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
#ifdef __linux__
|
|
// Force Unmount action
|
|
action = actionCollection()->action( "st_[force]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
#endif
|
|
|
|
// Synchronize action
|
|
action = actionCollection()->action( "st_[synchronize]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konsole action
|
|
action = actionCollection()->action( "st_[konsole]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konqueror action
|
|
action = actionCollection()->action( "st_[filemanager]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
}
|
|
|
|
// Now remove the menu itself:
|
|
(*it)->unplug( m_shares_menu->popupMenu() );
|
|
actionCollection()->remove( *it );
|
|
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// First remove all actions that are in the submenu:
|
|
KAction *action = NULL;
|
|
KActionMenu *menu = static_cast<KActionMenu *>( *it );
|
|
|
|
if ( menu )
|
|
{
|
|
// Unmount action
|
|
action = actionCollection()->action( "st_[unmount]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
#ifdef __linux__
|
|
// Force Unmount action
|
|
action = actionCollection()->action( "st_[force]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
#endif
|
|
|
|
// Synchronize action
|
|
action = actionCollection()->action( "st_[synchronize]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konsole action
|
|
action = actionCollection()->action( "st_[konsole]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konqueror action
|
|
action = actionCollection()->action( "st_[filemanager]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
}
|
|
|
|
// Now remove the menu itself:
|
|
(*it)->unplug( m_shares_menu->popupMenu() );
|
|
actionCollection()->remove( *it );
|
|
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// First remove all actions that are in the submenu:
|
|
KAction *action = NULL;
|
|
KActionMenu *menu = static_cast<KActionMenu *>( *it );
|
|
|
|
if ( menu )
|
|
{
|
|
// Unmount action
|
|
action = actionCollection()->action( "st_[unmount]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
#ifdef __linux__
|
|
// Force Unmount action
|
|
action = actionCollection()->action( "st_[force]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
#endif
|
|
|
|
// Synchronize action
|
|
action = actionCollection()->action( "st_[synchronize]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konsole action
|
|
action = actionCollection()->action( "st_[konsole]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konqueror action
|
|
action = actionCollection()->action( "st_[filemanager]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
}
|
|
|
|
// Now remove the menu itself:
|
|
(*it)->unplug( m_shares_menu->popupMenu() );
|
|
actionCollection()->remove( *it );
|
|
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// Since we cannot sort the Smb4kShare items appropriately, we have to
|
|
// work around this problem. For that, let's create a string list:
|
|
TQStringList strings;
|
|
|
|
for ( TQValueList<Smb4KShare *>::ConstIterator it = shares_list.begin(); it != shares_list.end(); ++it )
|
|
{
|
|
if ( !(*it)->isForeign() || Smb4KSettings::showAllShares() )
|
|
{
|
|
if ( Smb4KSettings::showMountPoint() )
|
|
{
|
|
strings.append( (*it)->canonicalPath() );
|
|
}
|
|
else
|
|
{
|
|
// _::_ is the devider between share name and the canonical path of
|
|
// the share.
|
|
TQString item = TQString( "%1_::_%2" ).tqarg( TQString((*it)->name()), TQString((*it)->canonicalPath()) );
|
|
strings.append( item );
|
|
}
|
|
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
strings.sort();
|
|
|
|
// We are ready to insert the new shares into the menu.
|
|
// We loop through the list of mounted shares and check if the
|
|
// single shares are already in the menu. If not, we plug them
|
|
// there:
|
|
for ( TQValueList<Smb4KShare *>::ConstIterator it = shares_list.begin(); it != shares_list.end(); ++it )
|
|
{
|
|
KActionMenu *action_menu = NULL;
|
|
|
|
// Reread the list of share action menus:
|
|
KActionPtrList new_actions_list = actionCollection()->actions( "ShareMenus" );
|
|
|
|
for ( KActionPtrList::ConstIterator i = new_actions_list.begin(); i != new_actions_list.end(); ++i )
|
|
{
|
|
TQString item = TQString( "st_[share_menu]_%1" ).tqarg( TQString((*it)->canonicalPath()) );
|
|
|
|
if ( TQString::compare( (*i)->name(), item ) == 0 )
|
|
{
|
|
action_menu = static_cast<KActionMenu *>( *i );
|
|
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( !action_menu )
|
|
{
|
|
// Create a new KAction menu:
|
|
TQIconSet set;
|
|
TQPixmap pix;
|
|
KIconLoader loader;
|
|
|
|
int icon_state = (*it)->isForeign() ? KIcon::DisabledState : KIcon::DefaultState;
|
|
|
|
if ( (*it)->isBroken() )
|
|
{
|
|
TQImage over = loader.loadIcon( "button_cancel", KIcon::Small,
|
|
0, icon_state, 0L, false ).convertToImage();
|
|
TQImage src = loader.loadIcon( "hdd_mount", KIcon::Small,
|
|
0, icon_state, 0L, false ).convertToImage();
|
|
|
|
KIconEffect e;
|
|
e.semiTransparent( over );
|
|
e.overlay( src, over );
|
|
|
|
pix = TQPixmap( src );
|
|
}
|
|
else
|
|
{
|
|
pix = loader.loadIcon( "hdd_mount", KIcon::Small,
|
|
0, icon_state, 0L, false );
|
|
}
|
|
|
|
set.reset( pix, TQIconSet::Automatic );
|
|
|
|
action_menu = new KActionMenu( Smb4KSettings::showMountPoint() ? (*it)->path() : (*it)->name(),
|
|
set, actionCollection(), "st_[share_menu]_"+(*it)->canonicalPath() );
|
|
action_menu->setGroup( "ShareMenus" );
|
|
|
|
|
|
// Define the actions that can be performed on a share from within
|
|
// the system tray widget:
|
|
KAction *umount = new KAction( i18n( "&Unmount" ), "hdd_unmount", KShortcut::null(), TQT_TQOBJECT(this),
|
|
TQT_SLOT( slotUnmountShare() ), actionCollection(), "st_[unmount]_"+(*it)->canonicalPath() );
|
|
umount->setGroup( "ShareActions" );
|
|
#ifdef __linux__
|
|
KAction *force_umount = new KAction( i18n( "&Force Unmounting" ), "hdd_unmount", KShortcut::null(), TQT_TQOBJECT(this),
|
|
TQT_SLOT( slotForceUnmountShare() ), actionCollection(), "st_[force]_"+(*it)->canonicalPath() );
|
|
force_umount->setGroup( "ShareActions" );
|
|
force_umount->setEnabled( Smb4KSettings::useForceUnmount() );
|
|
#endif
|
|
KAction *synchronize = new KAction( i18n( "S&ynchronize" ), "bottom", KShortcut::null(), TQT_TQOBJECT(this),
|
|
TQT_SLOT( slotSynchronize() ), actionCollection(), "st_[synchronize]_"+(*it)->canonicalPath() );
|
|
synchronize->setGroup( "ShareActions" );
|
|
synchronize->setEnabled( !Smb4KSettings::rsync().isEmpty() );
|
|
|
|
KAction *konsole = new KAction( i18n( "Open with Konso&le" ), "terminal", KShortcut::null(), TQT_TQOBJECT(this),
|
|
TQT_SLOT( slotKonsole() ), actionCollection(), "st_[konsole]_"+(*it)->canonicalPath() );
|
|
konsole->setGroup( "ShareActions" );
|
|
konsole->setEnabled( !Smb4KSettings::konsole().isEmpty() );
|
|
|
|
KAction *konqueror = new KAction( i18n( "Open with &Konqueror" ), "kfm_home", KShortcut::null(), TQT_TQOBJECT(this),
|
|
TQT_SLOT( slotFilemanager() ), actionCollection(), "st_[filemanager]_"+(*it)->canonicalPath() );
|
|
konqueror->setGroup( "ShareActions" );
|
|
|
|
// Set up the action submenu:
|
|
action_menu->insert( umount );
|
|
#ifdef __linux__
|
|
action_menu->insert( force_umount );
|
|
#endif
|
|
action_menu->popupMenu()->insertSeparator( -1 );
|
|
action_menu->insert( synchronize );
|
|
action_menu->popupMenu()->insertSeparator( -1 );
|
|
action_menu->insert( konsole );
|
|
action_menu->insert( konqueror );
|
|
|
|
// Plug the new menu to the popup menu:
|
|
int index = 0;
|
|
|
|
if ( !Smb4KSettings::showMountPoint() )
|
|
{
|
|
TQString item = TQString( "%1_::_%2" ).tqarg( TQString((*it)->name()), TQString((*it)->canonicalPath()) );
|
|
|
|
index = strings.findIndex( item );
|
|
}
|
|
else
|
|
{
|
|
index = strings.findIndex( (*it)->canonicalPath() );
|
|
}
|
|
|
|
m_shares_menu->insert( action_menu, index + 2 ); // +2 due to "Unmount All" and separator
|
|
}
|
|
else
|
|
{
|
|
// Change icon and disable some actions, if the share got inaccessible
|
|
// in the meantime:
|
|
if ( (*it)->isBroken() )
|
|
{
|
|
TQIconSet set;
|
|
TQPixmap pix;
|
|
KIconLoader loader;
|
|
|
|
int icon_state = (*it)->isForeign() ? KIcon::DisabledState : KIcon::DefaultState;
|
|
|
|
TQImage over = loader.loadIcon( "button_cancel", KIcon::Small,
|
|
0, icon_state, 0L, false ).convertToImage();
|
|
TQImage src = loader.loadIcon( "hdd_mount", KIcon::Small,
|
|
0, icon_state, 0L, false ).convertToImage();
|
|
|
|
KIconEffect e;
|
|
e.semiTransparent( over );
|
|
e.overlay( src, over );
|
|
|
|
pix = TQPixmap( src );
|
|
|
|
set.reset( pix, TQIconSet::Automatic );
|
|
|
|
action_menu->setIconSet( set );
|
|
|
|
// Disable actions that should not be performed on an inaccessible
|
|
// share:
|
|
actionCollection()->action( TQString("st_[synchronize]_"+(*it)->canonicalPath()) )->setEnabled( false );
|
|
actionCollection()->action( TQString("st_[konsole]_"+(*it)->canonicalPath()) )->setEnabled( false );
|
|
actionCollection()->action( TQString("st_[filemanager]_"+(*it)->canonicalPath()) )->setEnabled( false );
|
|
}
|
|
|
|
// Change the text if necessary:
|
|
if ( !Smb4KSettings::showMountPoint() &&
|
|
TQString::compare( action_menu->plainText(), (*it)->name() ) != 0 )
|
|
{
|
|
action_menu->setText( (*it)->name() );
|
|
}
|
|
else if ( Smb4KSettings::showMountPoint() &&
|
|
TQString::compare( action_menu->plainText(), (*it)->path() ) != 0 )
|
|
{
|
|
action_menu->setText( (*it)->path() );
|
|
}
|
|
else
|
|
{
|
|
// Do nothing
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Remove all share action menus:
|
|
for ( KActionPtrList::Iterator it = actions_list.begin(); it != actions_list.end(); ++it )
|
|
{
|
|
KActionMenu *action_menu = static_cast<KActionMenu *>( *it );
|
|
|
|
// Get the canonical path of the share action:
|
|
TQString action_name = action_menu->name();
|
|
TQString canonical_path = action_name.section( "st_[share_menu]_", 1, -1 );
|
|
|
|
// Remove all tqchildren of the share action menus:
|
|
KAction *action = NULL;
|
|
|
|
// Unmount action
|
|
action = actionCollection()->action( "st_[unmount]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( action_menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
#ifdef __linux__
|
|
// Force Unmount action
|
|
action = actionCollection()->action( "st_[force]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( action_menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
#endif
|
|
|
|
// Synchronize action
|
|
action = actionCollection()->action( "st_[synchronize]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( action_menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konsole action
|
|
action = actionCollection()->action( "st_[konsole]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( action_menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Konqueror action
|
|
action = actionCollection()->action( "st_[filemanager]_"+canonical_path );
|
|
|
|
if ( action )
|
|
{
|
|
action->unplug( action_menu->popupMenu() );
|
|
actionCollection()->remove( action );
|
|
}
|
|
|
|
// Remove action menu itself:
|
|
action_menu->unplug( m_shares_menu->popupMenu() );
|
|
actionCollection()->remove( action_menu );
|
|
}
|
|
|
|
// Disable the "Unmount All" action:
|
|
actionCollection()->action( "st_unmount_all_action" )->setEnabled( false );
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotUnmountAllShares()
|
|
{
|
|
Smb4KCore::mounter()->unmountAllShares();
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotUnmountShare()
|
|
{
|
|
if ( m_action && TQString( m_action->name() ).startsWith( "st_[unmount]_" ) )
|
|
{
|
|
TQString canonical_path = TQString( m_action->name() ).section( "st_[unmount]_", 1, 1 );
|
|
|
|
Smb4KShare *share = Smb4KCore::mounter()->findShareByPath( canonical_path );
|
|
|
|
if ( share )
|
|
{
|
|
Smb4KCore::mounter()->unmountShare( share, false, false );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotForceUnmountShare()
|
|
{
|
|
if ( m_action && TQString( m_action->name() ).startsWith( "st_[force]_" ) )
|
|
{
|
|
TQString canonical_path = TQString( m_action->name() ).section( "st_[force]_", 1, 1 );
|
|
|
|
Smb4KShare *share = Smb4KCore::mounter()->findShareByPath( canonical_path );
|
|
|
|
if ( share )
|
|
{
|
|
Smb4KCore::mounter()->unmountShare( share, true, false );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotSynchronize()
|
|
{
|
|
// Since we want to allow the possibility to open several instances
|
|
// of the synchronization dialog, we do not checks like in slotConfigDialog()
|
|
if ( m_action && TQString( m_action->name() ).startsWith( "st_[synchronize]_" ) )
|
|
{
|
|
TQString canonical_path = TQString( m_action->name() ).section( "st_[synchronize]_", 1, 1 );
|
|
|
|
Smb4KShare *share = Smb4KCore::mounter()->findShareByPath( canonical_path );
|
|
|
|
if ( share && !share->isBroken() )
|
|
{
|
|
Smb4KSynchronizationDialog *dlg = NULL;
|
|
|
|
if ( parentWidget() && parentWidget()->isShown() )
|
|
{
|
|
dlg = new Smb4KSynchronizationDialog( share, parentWidget(), "SynchronizationDialog" );
|
|
}
|
|
else
|
|
{
|
|
dlg = new Smb4KSynchronizationDialog( share, this, "SynchronizationDialog" );
|
|
}
|
|
|
|
dlg->show();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotKonsole()
|
|
{
|
|
if ( m_action && TQString( m_action->name() ).startsWith( "st_[konsole]_" ) )
|
|
{
|
|
TQString canonical_path = TQString( m_action->name() ).section( "st_[konsole]_", 1, 1 );
|
|
|
|
Smb4KShare *share = Smb4KCore::mounter()->findShareByPath( canonical_path );
|
|
|
|
if ( share && !share->isBroken() )
|
|
{
|
|
Smb4KCore::open( share, Smb4KCore::Konsole );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotFilemanager()
|
|
{
|
|
if ( m_action && TQString( m_action->name() ).startsWith( "st_[filemanager]_" ) )
|
|
{
|
|
TQString canonical_path = TQString( m_action->name() ).section( "st_[filemanager]_", 1, 1 );
|
|
|
|
Smb4KShare *share = Smb4KCore::mounter()->findShareByPath( canonical_path );
|
|
|
|
if ( share && !share->isBroken() )
|
|
{
|
|
Smb4KCore::open( share, Smb4KCore::Konqueror );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Smb4KSystemTray::slotActionHighlighted( KAction *action )
|
|
{
|
|
// If the main window is not shown, the last action that
|
|
// is highlighted when the user clicks an action in a
|
|
// mounted-share-submenu is "st_mounted_shares_action_menu"
|
|
// and not the action the user clicked. That's why we need
|
|
// to filter this action out:
|
|
if ( action && !qstrcmp( action->name(), "st_mounted_shares_action_menu" ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_action = action;
|
|
}
|
|
|
|
#include "smb4ksystemtray.moc"
|
|
|