summaryrefslogtreecommitdiffstats
path: root/plugins/gui-docking-menu
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gui-docking-menu')
-rw-r--r--plugins/gui-docking-menu/CMakeL10n.txt6
-rw-r--r--plugins/gui-docking-menu/Makefile.am18
-rw-r--r--plugins/gui-docking-menu/docking-configuration.cpp114
-rw-r--r--plugins/gui-docking-menu/docking-configuration.h55
-rw-r--r--plugins/gui-docking-menu/docking.cpp674
-rw-r--r--plugins/gui-docking-menu/docking.h190
-rw-r--r--plugins/gui-docking-menu/po/Makefile.am2
-rw-r--r--plugins/gui-docking-menu/po/de.po123
-rw-r--r--plugins/gui-docking-menu/po/ru.po121
-rw-r--r--plugins/gui-docking-menu/po/tderadio-gui-docking-menu.pot119
10 files changed, 1422 insertions, 0 deletions
diff --git a/plugins/gui-docking-menu/CMakeL10n.txt b/plugins/gui-docking-menu/CMakeL10n.txt
new file mode 100644
index 0000000..a6da2f2
--- /dev/null
+++ b/plugins/gui-docking-menu/CMakeL10n.txt
@@ -0,0 +1,6 @@
+##### create translation templates ##############
+
+tde_l10n_create_template(
+ CATALOG "tderadio-gui-docking-menu"
+ DESTINATION "po"
+)
diff --git a/plugins/gui-docking-menu/Makefile.am b/plugins/gui-docking-menu/Makefile.am
new file mode 100644
index 0000000..3c72711
--- /dev/null
+++ b/plugins/gui-docking-menu/Makefile.am
@@ -0,0 +1,18 @@
+SUBDIRS = po .
+
+INCLUDES = -I$(top_builddir)/src $(all_includes)
+METASOURCES = AUTO
+
+libtderadio_LTLIBRARIES = libdocking-menu.la
+libdocking_menu_la_SOURCES = docking-configuration.cpp docking.cpp
+libdocking_menu_la_LDFLAGS = -module -avoid-version $(KDE_RPATH) $(all_libraries)
+
+noinst_HEADERS = docking-configuration.h docking.h
+
+
+#messages: rc.cpp
+# $(XGETTEXT) *.cpp *.h -o po/tderadio-gui-docking-menu.pot
+
+messages: rc.cpp
+ $(EXTRACTRC) *.rc *.ui >> rc.cpp
+ $(XGETTEXT) rc.cpp *.h *.cpp -o po/tderadio-gui-docking-menu.pot
diff --git a/plugins/gui-docking-menu/docking-configuration.cpp b/plugins/gui-docking-menu/docking-configuration.cpp
new file mode 100644
index 0000000..dd1a18c
--- /dev/null
+++ b/plugins/gui-docking-menu/docking-configuration.cpp
@@ -0,0 +1,114 @@
+/***************************************************************************
+ docking-configuration.cpp - description
+ -------------------
+ begin : Son Aug 3 2003
+ copyright : (C) 2003 by Martin Witte
+ email : witte@kawo1.rwth-aachen.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. *
+ * *
+ ***************************************************************************/
+
+#include "docking-configuration.h"
+
+#include <tqcombobox.h>
+#include <tqlabel.h>
+#include <tqlayout.h>
+#include <tqframe.h>
+
+#include <tdelocale.h>
+
+using namespace std;
+
+DockingConfiguration::DockingConfiguration (RadioDocking *docking, TQWidget *parent)
+ : StationSelector(parent),
+ m_docking(docking),
+ m_disableGUIUpdates(false)
+{
+ TQHBoxLayout *layout = new TQHBoxLayout();
+ TQHBoxLayout *layout2 = new TQHBoxLayout();
+
+ m_labelClickMode = new TQLabel(this);
+ layout->addWidget(m_labelClickMode);
+
+ m_comboClickMode = new TQComboBox(this);
+ layout->addWidget(m_comboClickMode);
+
+ TQSpacerItem *spacer = new TQSpacerItem( 20, 2, TQSizePolicy::Expanding, TQSizePolicy::Minimum);
+ layout->addItem(spacer);
+
+ TQFrame *line = new TQFrame(this);
+ line->setFrameShape ( TQFrame::HLine );
+ line->setFrameShadow( TQFrame::Sunken );
+ layout2->addWidget(line);
+
+ StationSelectorUILayout->expand(2,0);
+ StationSelectorUILayout->addMultiCellLayout(layout2, 2, 2, 0, 2);
+ StationSelectorUILayout->addMultiCellLayout(layout, 3, 3, 0, 2);
+
+ connect(m_comboClickMode, TQT_SIGNAL(activated( int )), this, TQT_SLOT(slotSetDirty()));
+
+ languageChange();
+ slotCancel();
+}
+
+
+DockingConfiguration::~DockingConfiguration ()
+{
+}
+
+
+void DockingConfiguration::languageChange()
+{
+ StationSelector::languageChange();
+ m_labelClickMode->setText( i18n( "Left Mouse Click on Tray" ) );
+
+ m_comboClickMode->clear();
+ m_comboClickMode->insertItem(i18n("Show/Hide all GUI Elements"));
+ m_comboClickMode->insertItem(i18n("Power On/Off"));
+}
+
+void DockingConfiguration::slotOK()
+{
+ if (m_dirty) {
+ StationSelector::slotOK();
+ bool old = m_disableGUIUpdates;
+ m_disableGUIUpdates = true;
+ if (m_docking)
+ m_docking->setLeftClickAction((LeftClickAction)m_comboClickMode->currentItem());
+ m_disableGUIUpdates = old;
+ m_dirty = false;
+ }
+}
+
+void DockingConfiguration::slotCancel()
+{
+ if (m_dirty) {
+ StationSelector::slotCancel();
+ if (m_docking)
+ m_comboClickMode->setCurrentItem(m_docking->getLeftClickAction());
+ m_dirty = false;
+ }
+}
+
+void DockingConfiguration::slotLeftClickActionChanged(LeftClickAction action)
+{
+ if (!m_disableGUIUpdates) {
+ if (m_docking)
+ m_comboClickMode->setCurrentItem(action);
+ }
+}
+
+void DockingConfiguration::slotSetDirty()
+{
+ m_dirty = true;
+}
+
+
+#include "docking-configuration.moc"
diff --git a/plugins/gui-docking-menu/docking-configuration.h b/plugins/gui-docking-menu/docking-configuration.h
new file mode 100644
index 0000000..61133c3
--- /dev/null
+++ b/plugins/gui-docking-menu/docking-configuration.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ docking-configuration.h - description
+ -------------------
+ begin : Son Aug 3 2003
+ copyright : (C) 2003 by Martin Witte
+ email : witte@kawo1.rwth-aachen.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KRADIO_DOCKING_CONFIGURATION_H
+#define KRADIO_DOCKING_CONFIGURATION_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "../../src/include/stationselector.h"
+#include "docking.h"
+
+class TQComboBox;
+class TQLabel;
+
+class DockingConfiguration : public StationSelector
+{
+Q_OBJECT
+
+public :
+ DockingConfiguration (RadioDocking *docking, TQWidget *parent);
+ ~DockingConfiguration ();
+
+protected slots:
+
+ void slotOK();
+ void slotCancel();
+ void slotSetDirty();
+
+ void slotLeftClickActionChanged(LeftClickAction action);
+ void languageChange();
+
+protected:
+ RadioDocking *m_docking;
+ TQComboBox *m_comboClickMode;
+ TQLabel *m_labelClickMode;
+ bool m_disableGUIUpdates;
+};
+
+#endif
diff --git a/plugins/gui-docking-menu/docking.cpp b/plugins/gui-docking-menu/docking.cpp
new file mode 100644
index 0000000..aae4f3f
--- /dev/null
+++ b/plugins/gui-docking-menu/docking.cpp
@@ -0,0 +1,674 @@
+/***************************************************************************
+ docking.cpp - description
+ -------------------
+ begin : Don M�r 8 21:57:17 CET 2001
+ copyright : (C) 2002 by Ernst Martin Witte
+ email : witte@kawo1.rwth-aachen.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. *
+ * *
+ ***************************************************************************/
+
+#include <kiconloader.h>
+#include <tqtooltip.h>
+#include <tdepopupmenu.h>
+#include <tdeapplication.h>
+#include <tdeaction.h>
+#include <kdialogbase.h>
+#include <tdeaboutdata.h>
+#include <tdeconfig.h>
+#include <twin.h>
+
+#include "../../src/include/radiodevice_interfaces.h"
+#include "../../src/include/stationlist.h"
+#include "../../src/include/pluginmanager.h"
+#include "../../src/include/widgetplugins.h"
+#include "../../src/include/radiostation.h"
+#include "../../src/include/aboutwidget.h"
+#include "../../src/include/station-drag-object.h"
+
+#include "docking.h"
+#include "docking-configuration.h"
+
+#define POPUP_ID_START_RECORDING_DEFAULT 0
+#define POPUP_ID_STOP_RECORDING_BASE 100
+
+///////////////////////////////////////////////////////////////////////
+
+PLUGIN_LIBRARY_FUNCTIONS(RadioDocking, "tderadio-gui-docking-menu", i18n("Tray Menu for TDERadio"));
+
+/////////////////////////////////////////////////////////////////////////////
+
+RadioDocking::RadioDocking(const TQString &name)
+ : KSystemTray (NULL, name.ascii()),
+ PluginBase(name, i18n("Docking Plugin")),
+ m_pluginMenu(NULL),
+ m_recordingMenu(NULL),
+ m_NextRecordingMenuID(POPUP_ID_STOP_RECORDING_BASE),
+ m_leftClickAction(lcaShowHide)
+{
+ setPixmap(BarIcon("tderadio"));
+
+ m_menu = contextMenu();
+ TQObject::connect(m_menu, TQT_SIGNAL(activated(int)),
+ this, TQT_SLOT(slotMenuItemActivated(int)));
+
+ buildContextMenu ();
+ show();
+ setAcceptDrops(true);
+}
+
+RadioDocking::~RadioDocking()
+{
+}
+
+
+bool RadioDocking::connectI (Interface *i)
+{
+ bool a = IRadioClient::connectI(i);
+ bool b = ITimeControlClient::connectI(i);
+ bool c = IRadioDevicePoolClient::connectI(i);
+ bool d = IStationSelection::connectI(i);
+ bool e = ISoundStreamClient::connectI(i);
+ bool f = PluginBase::connectI(i);
+ return a || b || c || d || e || f;
+}
+
+
+bool RadioDocking::disconnectI (Interface *i)
+{
+ bool a = IRadioClient::disconnectI(i);
+ bool b = ITimeControlClient::disconnectI(i);
+ bool c = IRadioDevicePoolClient::disconnectI(i);
+ bool d = IStationSelection::disconnectI(i);
+ bool e = ISoundStreamClient::disconnectI(i);
+ bool f = PluginBase::disconnectI(i);
+ return a || b || c || d || e || f;
+}
+
+
+void RadioDocking::noticeConnectedI (ISoundStreamServer *s, bool pointer_valid)
+{
+ ISoundStreamClient::noticeConnectedI(s, pointer_valid);
+ if (s && pointer_valid) {
+ s->register4_sendStartRecordingWithFormat(this);
+ s->register4_sendStopRecording (this);
+ s->register4_notifySoundStreamChanged (this);
+ }
+}
+
+
+
+bool RadioDocking::setStationSelection(const TQStringList &sl)
+{
+ if (m_stationIDs != sl) {
+ m_stationIDs = sl;
+ buildContextMenu();
+ notifyStationSelectionChanged(m_stationIDs);
+ }
+ return true;
+}
+
+
+// PluginBase
+
+void RadioDocking::restoreState (TDEConfig *config)
+{
+ config->setGroup(TQString("radiodocking-") + name());
+
+ m_stationIDs.clear();
+ int nStations = config->readNumEntry("nStations", 0);
+ for (int i = 1; i <= nStations; ++i) {
+ TQString s = config->readEntry(TQString("stationID-") + TQString().setNum(i), TQString());
+ if (s.length())
+ m_stationIDs += s;
+ }
+
+ m_leftClickAction = (LeftClickAction)config->readNumEntry("left_click_action", lcaShowHide);
+
+ buildContextMenu();
+ notifyStationSelectionChanged(m_stationIDs);
+
+ int n = config->readNumEntry("show_hide_cache_entries", 0);
+ for (int i = 1; i <= n; ++i) {
+ TQString s = config->readEntry(TQString("show_hide_cache_id_%1").arg(i), TQString());
+ bool b = config->readBoolEntry(TQString("show_hide_cache_value_%1").arg(i), false);
+ if (!s.isNull()) {
+ m_widgetsShownCache.insert(s,b);
+ }
+ }
+}
+
+
+void RadioDocking::saveState (TDEConfig *config) const
+{
+ config->setGroup(TQString("radiodocking-") + name());
+
+ config->writeEntry("nStations", m_stationIDs.size());
+ int i = 1;
+ TQStringList::const_iterator end = m_stationIDs.end();
+ for (TQStringList::const_iterator it = m_stationIDs.begin(); it != end; ++it, ++i) {
+ config->writeEntry(TQString("stationID-") + TQString().setNum(i), *it);
+ }
+ config->writeEntry("left_click_action", (int)m_leftClickAction);
+
+ config->writeEntry("show_hide_cache_entries", m_widgetsShownCache.count());
+ i = 1;
+ for (TQMapConstIterator<TQString, bool> it = m_widgetsShownCache.begin(); it != m_widgetsShownCache.end(); ++it, ++i) {
+ config->writeEntry(TQString("show_hide_cache_id_%1").arg(i), it.key());
+ config->writeEntry(TQString("show_hide_cache_value_%1").arg(i), *it);
+ }
+}
+
+
+ConfigPageInfo RadioDocking::createConfigurationPage()
+{
+ DockingConfiguration *conf = new DockingConfiguration(this, NULL);
+ connectI (conf);
+
+ TQObject::connect(this, TQT_SIGNAL(sigLeftClickActionChanged(LeftClickAction)),
+ conf, TQT_SLOT(slotLeftClickActionChanged(LeftClickAction)));
+
+ return ConfigPageInfo(
+ conf,
+ i18n("Docking Menu"),
+ i18n("Docking Menu Configuration"),
+ "kmenuedit"
+ );
+}
+
+AboutPageInfo RadioDocking::createAboutPage()
+{
+/* TDEAboutData aboutData("tderadio",
+ NULL,
+ NULL,
+ I18N_NOOP("Docking Menu for TDERadio"),
+ TDEAboutData::License_GPL,
+ "(c) 2002-2005 Martin Witte, Klas Kalass",
+ 0,
+ "http://sourceforge.net/projects/tderadio",
+ 0);
+ aboutData.addAuthor("Martin Witte", "", "witte@kawo1.rwth-aachen.de");
+ aboutData.addAuthor("Klas Kalass", "", "klas.kalass@gmx.de");
+
+ return AboutPageInfo(
+ new TDERadioAboutWidget(aboutData, TDERadioAboutWidget::AbtTabbed),
+ i18n("Docking Menu"),
+ i18n("Docking Menu Plugin"),
+ "kmenuedit"
+ );*/
+ return AboutPageInfo();
+}
+
+
+
+void RadioDocking::buildContextMenu()
+{
+ m_menu->clear();
+ m_pluginMenu = NULL;
+ m_recordingMenu = NULL;
+
+ m_titleID = m_menu->insertTitle ("title-dummy");
+
+ buildStationList();
+
+ m_alarmID = m_menu->insertTitle ("alarm-dummy");
+ noticeNextAlarmChanged(queryNextAlarm());
+
+ m_sleepID = m_menu->insertItem(SmallIcon("tderadio_zzz"), "sleep-dummy",
+ this, TQT_SLOT(slotSleepCountdown()));
+ noticeCountdownStarted(queryCountdownEnd());
+
+ m_seekfwID = m_menu->insertItem(SmallIcon("forward"), i18n("Search Next Station"),
+ this, TQT_SLOT(slotSeekFwd()));
+ m_seekbwID = m_menu->insertItem(SmallIcon("back"), i18n("Search Previous Station"),
+ this, TQT_SLOT(slotSeekBkwd()));
+
+ // recording menu
+ buildRecordingMenu();
+ m_menu->insertItem(i18n("Recording"), m_recordingMenu);
+
+
+ m_powerID = m_menu->insertItem(SmallIcon("tderadio_muteoff"), "power-dummy",
+ this, TQT_SLOT(slotPower()));
+ m_pauseID = m_menu->insertItem(SmallIcon("tderadio_pause"), i18n("Pause Radio"),
+ this, TQT_SLOT(slotPause()));
+ noticePowerChanged(queryIsPowerOn());
+
+ m_menu->insertSeparator();
+
+ m_menu->insertItem(SmallIcon("tderadio"), i18n("&About"), this, TQT_SLOT(slotShowAbout()));
+
+ // build list of widgets for hide/show items
+ m_pluginMenu = new TDEPopupMenu(m_menu);
+ if (m_manager) {
+ m_manager->addWidgetPluginMenuItems(m_pluginMenu, m_widgetPluginIDs);
+ m_menu->insertItem(SmallIcon("tderadio_plugins"), i18n("Show/Hide Plugins"), m_pluginMenu);
+ }
+
+ m_menu->insertSeparator();
+ m_menu->insertItem( SmallIcon("system-log-out"), i18n("&Quit" ), kapp, TQT_SLOT(quit()) );
+
+
+ noticeStationChanged(queryCurrentStation(), -1);
+
+}
+
+
+void RadioDocking::buildStationList()
+{
+ m_stationMenuIDs.clear();
+
+ const RawStationList &sl = queryStations().all();
+ const RadioStation &crs = queryCurrentStation();
+
+ int k = 0;
+ TQStringList::iterator end = m_stationIDs.end();
+ for (TQStringList::iterator it = m_stationIDs.begin(); it != end; ++it) {
+ const RadioStation &rs = sl.stationWithID(*it);
+
+ if (rs.isValid()) {
+
+ ++k;
+ TQString shortcut = k < 10 ? "&"+TQString().setNum(k) : k == 10 ? "1&0" : TQString().setNum(k);
+ TQString name = rs.longName().replace("&", "&&");
+ TQString item = shortcut + " " + name;
+ int id = m_menu->insertItem(item);
+
+ m_stationMenuIDs.push_back(id);
+ m_menu->setItemChecked (id, rs.compare(crs) == 0);
+
+ } else {
+ m_stationMenuIDs.push_back(-1);
+ }
+ }
+}
+
+
+void RadioDocking::slotSeekFwd()
+{
+ ISeekRadio *seeker = dynamic_cast<ISeekRadio*>(queryActiveDevice());
+ if (seeker)
+ seeker->startSeekUp();
+}
+
+
+void RadioDocking::slotSeekBkwd()
+{
+ ISeekRadio *seeker = dynamic_cast<ISeekRadio*>(queryActiveDevice());
+ if (seeker)
+ seeker->startSeekUp();
+}
+
+
+
+void RadioDocking::slotShowAbout()
+{
+ if (m_manager) {
+ KDialogBase *d = m_manager->getAboutDialog();
+ if (d) d->show();
+ }
+}
+
+
+void RadioDocking::slotPower()
+{
+ if (queryIsPowerOn()) {
+ sendPowerOff();
+ } else {
+ sendPowerOn();
+ }
+}
+
+
+void RadioDocking::slotPause()
+{
+ if (queryIsPowerOn()) {
+ sendPausePlayback(queryCurrentSoundStreamID());
+ }
+}
+
+
+void RadioDocking::slotSleepCountdown()
+{
+ if (queryCountdownEnd().isValid()) {
+ sendStopCountdown();
+ } else {
+ sendStartCountdown();
+ }
+}
+
+
+bool RadioDocking::noticeNextAlarmChanged(const Alarm *a)
+{
+ TQDateTime d;
+ if (a) d = a->nextAlarm();
+
+ if (d.isValid())
+ m_menu->changeTitle (m_alarmID, i18n("next alarm: %1").arg(d.toString()));
+ else
+ m_menu->changeTitle (m_alarmID, i18n("<no alarm pending>"));
+ return true;
+}
+
+
+bool RadioDocking::noticeCountdownStarted(const TQDateTime &end)
+{
+ if (end.isValid())
+ m_menu->changeItem (m_sleepID, SmallIcon("tderadio_zzz"), i18n("Stop Sleep Countdown (running until %1)").arg(end.toString()));
+ else
+ m_menu->changeItem (m_sleepID, SmallIcon("tderadio_zzz"), i18n("Start Sleep Countdown"));
+ return true;
+}
+
+
+bool RadioDocking::noticeCountdownStopped()
+{
+ m_menu->changeItem (m_sleepID, SmallIcon("tderadio_zzz"), i18n("Start Sleep Countdown"));
+ return true;
+}
+
+
+bool RadioDocking::noticeCountdownZero()
+{
+ m_menu->changeItem (m_sleepID, SmallIcon("tderadio_zzz"), i18n("Start Sleep Countdown"));
+ return true;
+}
+
+
+bool RadioDocking::noticePowerChanged(bool on)
+{
+ m_menu->changeItem(m_powerID, SmallIcon(on ? "tderadio_muteon" : "tderadio_muteoff"),
+ on ? i18n("Power Off") : i18n("Power On"));
+ m_menu->setItemEnabled(m_pauseID, on);
+ return true;
+}
+
+bool RadioDocking::noticeCountdownSecondsChanged(int /*n*/)
+{
+ return false;
+}
+
+
+
+bool RadioDocking::noticeStationChanged (const RadioStation &rs, int /*idx*/)
+{
+ TQString s = i18n("invalid station");
+ if (rs.isValid())
+ s = rs.longName();
+
+ TQToolTip::add(this, s);
+ m_menu->changeTitle (m_titleID, i18n("TDERadio: %1").arg(s));
+ // FIXME: title does not change in opened popupmenu
+
+ TQValueList<int>::iterator iit = m_stationMenuIDs.begin();
+ TQValueList<int>::iterator end = m_stationMenuIDs.end();
+ TQStringList::iterator sit = m_stationIDs.begin();
+ for (; iit != end; ++iit, ++sit) {
+ if (*iit != -1) {
+ bool on = rs.stationID() == *sit;
+ m_menu->setItemChecked (*iit, on);
+ }
+ }
+
+ bool r = false;
+ SoundFormat sf;
+ queryIsRecordingRunning(queryCurrentSoundStreamID(), r, sf);
+ m_recordingMenu->setItemEnabled(m_recordingID, !r);
+ return true;
+}
+
+
+bool RadioDocking::noticeStationsChanged(const StationList &/*sl*/)
+{
+ buildContextMenu();
+ return true;
+}
+
+
+void RadioDocking::mousePressEvent( TQMouseEvent *e )
+{
+ KSystemTray::mousePressEvent(e);
+
+ switch ( e->button() ) {
+ case Qt::LeftButton:
+ switch (m_leftClickAction) {
+ case lcaShowHide :
+ ShowHideWidgetPlugins();
+ // FIXME: [mcamen] According the KDE usability guidelines a left
+ // click on the systray icon should show/hide the
+ // application window
+ // TODO: [mcamen] Use KSystemtray::toggleActive and friends once we
+ // depend on KDE 3.3
+ break;
+ case lcaPowerOnOff :
+ if (queryIsPowerOn())
+ sendPowerOff();
+ else
+ sendPowerOn();
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ // nothing
+ break;
+ }
+}
+
+void RadioDocking::ShowHideWidgetPlugins()
+{
+ // nothing in cache => hide everything
+ if (!m_widgetsShownCache.count()) {
+ for (TQMapIterator<WidgetPluginBase*, int> it = m_widgetPluginIDs.begin(); it != m_widgetPluginIDs.end(); ++it) {
+ WidgetPluginBase *p = it.key();
+ if (p) {
+ bool visible = p->isAnywhereVisible();
+ TQString name = p->name();
+ logDebug(TQString("visibility of %1: %2").arg(name).arg(visible));
+ m_widgetsShownCache.insert(name, visible);
+ p->getWidget()->hide();
+ }
+ }
+ }
+ else {
+ TQMap<TQString, bool> tmpCache = m_widgetsShownCache;
+ int d = KWin::currentDesktop();
+ for (TQMapIterator<WidgetPluginBase*, int> it = m_widgetPluginIDs.begin(); it != m_widgetPluginIDs.end(); ++it) {
+ WidgetPluginBase *p = it.key();
+ TQString name = p ? p->name() : TQString();
+ if (p && tmpCache.contains(name) && tmpCache[name]) {
+ p->showOnOrgDesktop();
+ }
+ }
+ m_widgetsShownCache.clear();
+ KWin::setCurrentDesktop(d);
+ }
+}
+
+void RadioDocking::slotMenuItemActivated(int id)
+{
+ const StationList &sl = queryStations();
+ TQValueList<int>::iterator iit = m_stationMenuIDs.begin();
+ TQValueList<int>::iterator end = m_stationMenuIDs.end();
+ TQStringList::iterator sit = m_stationIDs.begin();
+ for (; iit != end; ++iit, ++sit) {
+ if (*iit == id) {
+ const RadioStation &rs = sl.stationWithID(*sit);
+ if (rs.isValid())
+ sendActivateStation(rs);
+ }
+ }
+}
+
+
+void RadioDocking::noticeWidgetPluginShown(WidgetPluginBase *b, bool shown)
+{
+ if (!m_manager || !b || !m_widgetPluginIDs.contains(b))
+ return;
+ m_manager->updateWidgetPluginMenuItem(b, m_pluginMenu, m_widgetPluginIDs, shown);
+
+ if (shown)
+ m_widgetsShownCache.clear();
+}
+
+
+void RadioDocking::noticePluginsChanged(const PluginList &/*l*/)
+{
+ buildContextMenu();
+}
+
+
+// ISoundStreamClient
+
+bool RadioDocking::startRecordingWithFormat(
+ SoundStreamID id,
+ const SoundFormat &/*proposed_format*/,
+ SoundFormat &/*real_format*/)
+{
+ if (!id.isValid() || id != queryCurrentSoundStreamID() || m_StreamID2MenuID.contains(id))
+ return false;
+
+ TQString descr;
+ querySoundStreamDescription(id, descr);
+ int menu_id = m_NextRecordingMenuID++;
+ m_recordingMenu->insertItem(SmallIcon("tderadio_record"),
+ i18n("Stop Recording of %1").arg(descr),
+ menu_id);
+ m_MenuID2StreamID.insert(menu_id, id);
+ m_StreamID2MenuID.insert(id, menu_id);
+
+ if (id == queryCurrentSoundStreamID())
+ m_recordingMenu->setItemEnabled(m_recordingID, false);
+
+ setPixmap(BarIcon("tderadio_plus_rec"));
+ return false; // this is only a "hook" that does not initiate the recording so don't say that we handled the event
+}
+
+
+bool RadioDocking::stopRecording (SoundStreamID id)
+{
+ if (!id.isValid() || !m_StreamID2MenuID.contains(id))
+ return false;
+
+ int menu_id = m_StreamID2MenuID[id];
+ m_recordingMenu->removeItem(menu_id);
+ m_MenuID2StreamID.remove(menu_id);
+ m_StreamID2MenuID.remove(id);
+
+ if (id == queryCurrentSoundStreamID())
+ m_recordingMenu->setItemEnabled(m_recordingID, true);
+
+ setPixmap(BarIcon("tderadio"));
+
+ return false;
+}
+
+
+void RadioDocking::slotRecordingMenu(int i)
+{
+ if (i == POPUP_ID_START_RECORDING_DEFAULT) {
+ SoundStreamID id = queryCurrentSoundStreamID();
+ bool r = false;
+ SoundFormat sf;
+ queryIsRecordingRunning(id, r, sf);
+ if (!r) {
+ if (!queryIsPowerOn())
+ sendPowerOn();
+ sendStartRecording(id);
+ }
+ } else if (m_MenuID2StreamID.contains(i)) {
+ sendStopRecording(m_MenuID2StreamID[i]);
+ }
+}
+
+void RadioDocking::buildRecordingMenu()
+{
+ TQMap<TQString, SoundStreamID> streams;
+ queryEnumerateSoundStreams(streams);
+
+ TDEPopupMenu *m = new TDEPopupMenu(m_menu);
+
+ m_recordingID = m->insertItem(SmallIcon("tderadio_record"), i18n("Start Recording"),
+ POPUP_ID_START_RECORDING_DEFAULT);
+ TQObject::connect(m, TQT_SIGNAL(activated(int)),
+ this, TQT_SLOT(slotRecordingMenu(int)));
+ SoundStreamID currentID = queryCurrentSoundStreamID();
+
+ TQMapIterator<TQString, SoundStreamID> end = streams.end();
+ for (TQMapIterator<TQString, SoundStreamID> it = streams.begin(); it != end; ++it) {
+
+ SoundStreamID id = *it;
+ TQString descr = it.key();
+ bool r = false;
+ SoundFormat sf;
+ queryIsRecordingRunning(id, r, sf);
+ if (r) {
+ int menu_id = m_NextRecordingMenuID++;
+ m->insertItem(SmallIcon("tderadio_record"),
+ i18n("Stop Recording of %1").arg(descr),
+ menu_id);
+ m_MenuID2StreamID.insert(menu_id, id);
+ m_StreamID2MenuID.insert(id, menu_id);
+
+ if (id == currentID)
+ m_recordingMenu->setItemEnabled(m_recordingID, false);
+ }
+ }
+ m_recordingMenu = m;
+}
+
+
+bool RadioDocking::noticeSoundStreamChanged(SoundStreamID id)
+{
+ if (m_StreamID2MenuID.contains(id)) {
+ TQString descr;
+ querySoundStreamDescription(id, descr);
+ m_recordingMenu->changeItem(m_StreamID2MenuID[id],
+ SmallIcon("tderadio_record"),
+ i18n("Stop Recording of %1").arg(descr));
+ return true;
+ }
+ return false;
+}
+
+
+void RadioDocking::setLeftClickAction(LeftClickAction action)
+{
+ if (m_leftClickAction != action) {
+ m_leftClickAction = action;
+ emit sigLeftClickActionChanged(m_leftClickAction);
+ }
+}
+
+void RadioDocking::dragEnterEvent(TQDragEnterEvent* event)
+{
+ bool a = StationDragObject::canDecode(event);
+ if (a)
+ IErrorLogClient::staticLogDebug("contentsDragEnterEvent accepted");
+ else
+ IErrorLogClient::staticLogDebug("contentsDragEnterEvent rejected");
+ event->accept(a);
+}
+
+void RadioDocking::dropEvent(TQDropEvent* event)
+{
+ TQStringList list;
+
+ if ( StationDragObject::decode(event, list) ) {
+ TQStringList l = getStationSelection();
+ for (TQValueListConstIterator<TQString> it = list.begin(); it != list.end(); ++it)
+ if (!l.contains(*it))
+ l.append(*it);
+ setStationSelection(l);
+ }
+}
+
+#include "docking.moc"
diff --git a/plugins/gui-docking-menu/docking.h b/plugins/gui-docking-menu/docking.h
new file mode 100644
index 0000000..c4e5f6d
--- /dev/null
+++ b/plugins/gui-docking-menu/docking.h
@@ -0,0 +1,190 @@
+/***************************************************************************
+ docking.h - description
+ -------------------
+ begin : Mon Jan 14 2002
+ copyright : (C) 2001, 2002 by Frank Schwanz, Ernst Martin Witte
+ email : schwanz@fh-brandenburg.de, witte@kawo1.rwth-aachen.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KRADIO_DOCKING_H
+#define KRADIO_DOCKING_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <ksystemtray.h>
+#include <tqpixmap.h>
+#include <tqptrdict.h>
+
+#include "../../src/include/timecontrol_interfaces.h"
+#include "../../src/include/radio_interfaces.h"
+#include "../../src/include/radiodevicepool_interfaces.h"
+#include "../../src/include/stationselection_interfaces.h"
+#include "../../src/include/plugins.h"
+#include "../../src/include/soundstreamclient_interfaces.h"
+
+enum LeftClickAction { lcaShowHide = 0, lcaPowerOnOff = 1 };
+
+class RadioDocking : public KSystemTray,
+ public PluginBase,
+ public IRadioClient,
+ public ITimeControlClient,
+ public IRadioDevicePoolClient,
+ public IStationSelection,
+ public ISoundStreamClient
+{
+Q_OBJECT
+
+public:
+ RadioDocking (const TQString &name);
+ virtual ~RadioDocking();
+
+ virtual bool connectI (Interface *);
+ virtual bool disconnectI (Interface *);
+
+ virtual TQString pluginClassName() const { return "RadioDocking"; }
+
+ virtual const TQString &name() const { return PluginBase::name(); }
+ virtual TQString &name() { return PluginBase::name(); }
+
+
+ // PluginBase
+
+public:
+ virtual void saveState (TDEConfig *) const;
+ virtual void restoreState (TDEConfig *);
+
+ virtual ConfigPageInfo createConfigurationPage();
+ virtual AboutPageInfo createAboutPage();
+
+
+ // IStationSelection
+
+RECEIVERS:
+ bool setStationSelection(const TQStringList &sl);
+
+ANSWERS:
+ const TQStringList & getStationSelection () const { return m_stationIDs; }
+
+
+ // IRadioDevicePoolClient
+
+RECEIVERS:
+ bool noticeActiveDeviceChanged(IRadioDevice *) { return false; }
+ bool noticeDevicesChanged(const TQPtrList<IRadioDevice> &) { return false; }
+ bool noticeDeviceDescriptionChanged(const TQString &) { return false; }
+
+ // ITimeControlClient
+
+RECEIVERS:
+ bool noticeAlarmsChanged(const AlarmVector &) { return false; }
+ bool noticeAlarm(const Alarm &) { return false; }
+ bool noticeNextAlarmChanged(const Alarm *);
+ bool noticeCountdownStarted(const TQDateTime &/*end*/);
+ bool noticeCountdownStopped();
+ bool noticeCountdownZero();
+ bool noticeCountdownSecondsChanged(int n);
+
+
+ // IRadioClient
+
+RECEIVERS:
+ bool noticePowerChanged(bool on);
+ bool noticeStationChanged (const RadioStation &, int idx);
+ bool noticeStationsChanged(const StationList &sl);
+ bool noticePresetFileChanged(const TQString &/*f*/) { return false; }
+
+ bool noticeCurrentSoundStreamIDChanged(SoundStreamID /*id*/) { return false; }
+
+ // ISoundStreamClient
+
+RECEIVERS:
+ void noticeConnectedI (ISoundStreamServer *s, bool pointer_valid);
+
+ bool startRecordingWithFormat(SoundStreamID /*id*/,
+ const SoundFormat &/*proposed_format*/,
+ SoundFormat &/*real_format*/);
+ bool stopRecording(SoundStreamID /*id*/);
+
+ bool noticeSoundStreamChanged(SoundStreamID id);
+
+
+protected slots:
+
+ void slotSeekFwd();
+ void slotSeekBkwd();
+
+ void slotPower();
+ void slotPause();
+ void slotSleepCountdown();
+ void slotShowAbout();
+
+ void slotMenuItemActivated(int id);
+ void slotRecordingMenu(int i);
+
+protected:
+ void mousePressEvent( TQMouseEvent *e );
+
+ void buildContextMenu();
+ void buildRecordingMenu();
+ void buildStationList();
+
+ void noticeWidgetPluginShown(WidgetPluginBase *, bool shown);
+ void noticePluginsChanged(const PluginList &);
+
+ void showEvent(TQShowEvent *) {} // do nothing, original implementation adds "Quit" menu item
+
+ void ShowHideWidgetPlugins();
+
+ void dragEnterEvent(TQDragEnterEvent* event);
+ void dropEvent(TQDropEvent* event);
+
+public:
+
+ LeftClickAction getLeftClickAction() const { return m_leftClickAction; }
+ void setLeftClickAction(LeftClickAction action);
+
+signals:
+ void sigLeftClickActionChanged(LeftClickAction action);
+
+protected:
+
+ TDEPopupMenu *m_menu;
+ TDEPopupMenu *m_pluginMenu;
+ TDEPopupMenu *m_recordingMenu;
+ TQStringList m_stationIDs;
+
+ // menu Item IDs
+ int m_titleID;
+ int m_alarmID;
+ int m_recordingID;
+ int m_powerID;
+ int m_pauseID;
+ int m_sleepID;
+ int m_seekfwID;
+ int m_seekbwID;
+ TQValueList<int> m_stationMenuIDs;
+
+ TQMap<WidgetPluginBase *, int> m_widgetPluginIDs;
+
+ int m_NextRecordingMenuID;
+ TQMap<int, SoundStreamID> m_MenuID2StreamID;
+ TQMap<SoundStreamID, int> m_StreamID2MenuID;
+
+ LeftClickAction m_leftClickAction;
+
+ TQMap<TQString, bool> m_widgetsShownCache;
+};
+
+
+#endif
diff --git a/plugins/gui-docking-menu/po/Makefile.am b/plugins/gui-docking-menu/po/Makefile.am
new file mode 100644
index 0000000..075b9c1
--- /dev/null
+++ b/plugins/gui-docking-menu/po/Makefile.am
@@ -0,0 +1,2 @@
+PACKAGE = tderadio-gui-docking-menu
+POFILES = AUTO
diff --git a/plugins/gui-docking-menu/po/de.po b/plugins/gui-docking-menu/po/de.po
new file mode 100644
index 0000000..81b9f3a
--- /dev/null
+++ b/plugins/gui-docking-menu/po/de.po
@@ -0,0 +1,123 @@
+# translation of de.po to
+# translation of tderadio-gui-docking-menu.po to
+# This file is put in the public domain.
+#
+# Ernst Martin Witte <emw@nocabal.de>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-05-11 04:30+0200\n"
+"PO-Revision-Date: 2019-11-27 16:56+0000\n"
+"Last-Translator: Chris <xchrisx@uber.space>\n"
+"Language-Team: German <https://mirror.git.trinitydesktop.org/weblate/"
+"projects/applications/tderadio-gui-docking-menu/de/>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.9.1\n"
+
+#. Instead of a literal translation, add your name to the end of the list (separated by a comma).
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Ernst Martin Witte"
+
+#. Instead of a literal translation, add your email to the end of the list (separated by a comma).
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "emw@nocabal.de"
+
+#: docking-configuration.cpp:70
+msgid "Left Mouse Click on Tray"
+msgstr "Linker Mausklick auf Kontrolleistensymbol"
+
+#: docking-configuration.cpp:73
+msgid "Show/Hide all GUI Elements"
+msgstr "Alle Fenster anzeigen/verstecken"
+
+#: docking-configuration.cpp:74
+msgid "Power On/Off"
+msgstr "Ein/Ausschalten"
+
+#: docking.cpp:44
+msgid "Tray Menu for TDERadio"
+msgstr "Kontrollleistenmenü für TDERadio"
+
+#: docking.cpp:50
+msgid "Docking Plugin"
+msgstr "Plugin für die Kontrolleiste"
+
+#: docking.cpp:180
+msgid "Docking Menu"
+msgstr "Kontrolleisten-Menü"
+
+#: docking.cpp:181
+msgid "Docking Menu Configuration"
+msgstr "Einrichtung des Kontrollleisten-Menüs"
+
+#: docking.cpp:228
+msgid "Search Next Station"
+msgstr "Suche nächsten Sender"
+
+#: docking.cpp:230
+msgid "Search Previous Station"
+msgstr "Suche vorherigen Sender"
+
+#: docking.cpp:235
+msgid "Recording"
+msgstr "Aufnahme"
+
+#: docking.cpp:240
+msgid "Pause Radio"
+msgstr "Radiowiedergabe pausieren"
+
+#: docking.cpp:252
+msgid "Show/Hide Plugins"
+msgstr "Plugins anzeigen/verstecken"
+
+#: docking.cpp:354
+#, c-format
+msgid "next alarm: %1"
+msgstr "Nächstes Wecken: %1"
+
+#: docking.cpp:356
+msgid "<no alarm pending>"
+msgstr "<Wecker nicht aktiv>"
+
+#: docking.cpp:364
+msgid "Stop Sleep Countdown (running until %1)"
+msgstr "Schlummermodus abbrechen (liefe bis %1)"
+
+#: docking.cpp:366 docking.cpp:373 docking.cpp:380
+msgid "Start Sleep Countdown"
+msgstr "Schlummermodus einschalten"
+
+#: docking.cpp:388
+msgid "Power Off"
+msgstr "Ausschalten"
+
+#: docking.cpp:388
+msgid "Power On"
+msgstr "Einschalten"
+
+#: docking.cpp:402
+msgid "invalid station"
+msgstr "ungültiger Sender"
+
+#: docking.cpp:407
+#, c-format
+msgid "TDERadio: %1"
+msgstr "TDERadio: %1"
+
+#: docking.cpp:543 docking.cpp:616 docking.cpp:636
+#, c-format
+msgid "Stop Recording of %1"
+msgstr "Aufnahme %1 abbrechen"
+
+#: docking.cpp:599
+msgid "Start Recording"
+msgstr "Aufnahme starten"
diff --git a/plugins/gui-docking-menu/po/ru.po b/plugins/gui-docking-menu/po/ru.po
new file mode 100644
index 0000000..2cfe6cf
--- /dev/null
+++ b/plugins/gui-docking-menu/po/ru.po
@@ -0,0 +1,121 @@
+# translation of ru.po to
+# translation of tderadio-gui-docking-menu.po to
+# This file is put in the public domain.
+# Алексей Кузнецов <Alexey.Kouznetsov@GMail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ru\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-05-11 04:30+0200\n"
+"PO-Revision-Date: 2006-11-08 12:16+0300\n"
+"Last-Translator: Алексей Кузнецов <Alexey.Kouznetsov@GMail.com>\n"
+"Language-Team: <ru@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10\n"
+
+#. Instead of a literal translation, add your name to the end of the list (separated by a comma).
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Алексей Кузнецов"
+
+#. Instead of a literal translation, add your email to the end of the list (separated by a comma).
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "Alexey.Kouznetsov@GMail.com"
+
+#: docking-configuration.cpp:70
+msgid "Left Mouse Click on Tray"
+msgstr "По щелчку левой кнопкой мыши"
+
+#: docking-configuration.cpp:73
+msgid "Show/Hide all GUI Elements"
+msgstr "Показать/скрыть все окна"
+
+#: docking-configuration.cpp:74
+msgid "Power On/Off"
+msgstr "Включить/выключить"
+
+#: docking.cpp:44
+msgid "Tray Menu for TDERadio"
+msgstr "Меню лотка для TDERadio"
+
+#: docking.cpp:50
+msgid "Docking Plugin"
+msgstr "Модуль системного лотка"
+
+#: docking.cpp:180
+msgid "Docking Menu"
+msgstr "Меню лотка"
+
+#: docking.cpp:181
+msgid "Docking Menu Configuration"
+msgstr "Конфигурация меню лотка"
+
+#: docking.cpp:228
+msgid "Search Next Station"
+msgstr "Искать следующую станцию"
+
+#: docking.cpp:230
+msgid "Search Previous Station"
+msgstr "Искать предыдущую станцию"
+
+#: docking.cpp:235
+msgid "Recording"
+msgstr "Запись"
+
+#: docking.cpp:240
+msgid "Pause Radio"
+msgstr "Приостановить"
+
+#: docking.cpp:252
+msgid "Show/Hide Plugins"
+msgstr "Показать/скрыть"
+
+#: docking.cpp:354
+#, c-format
+msgid "next alarm: %1"
+msgstr "След. действие: %1"
+
+#: docking.cpp:356
+msgid "<no alarm pending>"
+msgstr "<Расписание пусто>"
+
+#: docking.cpp:364
+msgid "Stop Sleep Countdown (running until %1)"
+msgstr "Остановить таймер отключения (установлено на %1)"
+
+#: docking.cpp:366 docking.cpp:373 docking.cpp:380
+msgid "Start Sleep Countdown"
+msgstr "Запустить таймер отключения"
+
+#: docking.cpp:388
+msgid "Power Off"
+msgstr "Выключить"
+
+#: docking.cpp:388
+msgid "Power On"
+msgstr "Включить"
+
+#: docking.cpp:402
+msgid "invalid station"
+msgstr "Неверная станция"
+
+#: docking.cpp:407
+#, c-format
+msgid "TDERadio: %1"
+msgstr "Радиоприёмник KDE"
+
+#: docking.cpp:543 docking.cpp:616 docking.cpp:636
+#, c-format
+msgid "Stop Recording of %1"
+msgstr "Остановить запись %1"
+
+#: docking.cpp:599
+msgid "Start Recording"
+msgstr "Начать запись"
diff --git a/plugins/gui-docking-menu/po/tderadio-gui-docking-menu.pot b/plugins/gui-docking-menu/po/tderadio-gui-docking-menu.pot
new file mode 100644
index 0000000..f687bf3
--- /dev/null
+++ b/plugins/gui-docking-menu/po/tderadio-gui-docking-menu.pot
@@ -0,0 +1,119 @@
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2020-05-11 04:30+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Instead of a literal translation, add your name to the end of the list (separated by a comma).
+#, ignore-inconsistent
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+
+#. Instead of a literal translation, add your email to the end of the list (separated by a comma).
+#, ignore-inconsistent
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: docking-configuration.cpp:70
+msgid "Left Mouse Click on Tray"
+msgstr ""
+
+#: docking-configuration.cpp:73
+msgid "Show/Hide all GUI Elements"
+msgstr ""
+
+#: docking-configuration.cpp:74
+msgid "Power On/Off"
+msgstr ""
+
+#: docking.cpp:44
+msgid "Tray Menu for TDERadio"
+msgstr ""
+
+#: docking.cpp:50
+msgid "Docking Plugin"
+msgstr ""
+
+#: docking.cpp:180
+msgid "Docking Menu"
+msgstr ""
+
+#: docking.cpp:181
+msgid "Docking Menu Configuration"
+msgstr ""
+
+#: docking.cpp:228
+msgid "Search Next Station"
+msgstr ""
+
+#: docking.cpp:230
+msgid "Search Previous Station"
+msgstr ""
+
+#: docking.cpp:235
+msgid "Recording"
+msgstr ""
+
+#: docking.cpp:240
+msgid "Pause Radio"
+msgstr ""
+
+#: docking.cpp:252
+msgid "Show/Hide Plugins"
+msgstr ""
+
+#: docking.cpp:354
+#, c-format
+msgid "next alarm: %1"
+msgstr ""
+
+#: docking.cpp:356
+msgid "<no alarm pending>"
+msgstr ""
+
+#: docking.cpp:364
+msgid "Stop Sleep Countdown (running until %1)"
+msgstr ""
+
+#: docking.cpp:366 docking.cpp:373 docking.cpp:380
+msgid "Start Sleep Countdown"
+msgstr ""
+
+#: docking.cpp:388
+msgid "Power Off"
+msgstr ""
+
+#: docking.cpp:388
+msgid "Power On"
+msgstr ""
+
+#: docking.cpp:402
+msgid "invalid station"
+msgstr ""
+
+#: docking.cpp:407
+#, c-format
+msgid "TDERadio: %1"
+msgstr ""
+
+#: docking.cpp:543 docking.cpp:616 docking.cpp:636
+#, c-format
+msgid "Stop Recording of %1"
+msgstr ""
+
+#: docking.cpp:599
+msgid "Start Recording"
+msgstr ""