diff options
author | Christian Wieninger <winni@debian.(none)> | 2007-11-11 15:40:28 +0100 |
---|---|---|
committer | Christian Wieninger <winni@debian.(none)> | 2007-11-11 15:40:28 +0100 |
commit | 8d4f8607dc1558ce73eb4c376bdbf78ddb65da83 (patch) | |
tree | d0c5dde81a36ab2e8a2edc7c1e6922556518b312 /menu_searchtemplate.c | |
download | vdr-plugin-epgsearch-8d4f8607dc1558ce73eb4c376bdbf78ddb65da83.tar.gz vdr-plugin-epgsearch-8d4f8607dc1558ce73eb4c376bdbf78ddb65da83.tar.bz2 |
Initial commit
Diffstat (limited to 'menu_searchtemplate.c')
-rw-r--r-- | menu_searchtemplate.c | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/menu_searchtemplate.c b/menu_searchtemplate.c new file mode 100644 index 0000000..0c02fc5 --- /dev/null +++ b/menu_searchtemplate.c @@ -0,0 +1,252 @@ +/* +Copyright (C) 2004-2007 Christian Wieninger + +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 +Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + +The author can be reached at cwieninger@gmx.de + +The project's page is at http://winni.vdr-developer.org/epgsearch +*/ + +#include <vector> +#include <string> +#include <iomanip> +#include <sstream> + +#include "menu_searchtemplate.h" +#include "epgsearchtools.h" +#include "epgsearchcfg.h" +#include "recdone.h" +#include "menu_templateedit.h" +#include "menu_searchactions.h" + +using namespace std; + +// --- cMenuSearchTemplateItem ---------------------------------------------------------- +class cMenuSearchTemplateItem : public cOsdItem { + private: +public: + cSearchExt* searchExt; + cMenuSearchTemplateItem(cSearchExt* SearchExt); + int Compare(const cListObject &ListObject) const; + void Set(void); + }; + +cMenuSearchTemplateItem::cMenuSearchTemplateItem(cSearchExt* SearchExt) +{ + searchExt = SearchExt; + Set(); +} + +void cMenuSearchTemplateItem::Set(void) +{ + ostringstream line; + + if (searchExt->useAsSearchTimer) + if (searchExt->IsActiveAt(time(NULL))) + line << ">"; + else + line << "!"; + + line << "\t"; + if (searchExt->search && strlen(searchExt->search) > 0) + line << setiosflags(ios::left) << string(searchExt->search); + else + line << setiosflags(ios::left) << "*"; + + line << "\t"; + if (searchExt->useChannel == 1) + { + if (searchExt->channelMin != searchExt->channelMax) + line << setiosflags(ios::left) << searchExt->channelMin->Number() << " - " << searchExt->channelMax->Number(); + else + line << setiosflags(ios::left) << setw(11) << (searchExt->useChannel?CHANNELNAME(searchExt->channelMin):""); + } + else if (searchExt->useChannel == 2) + line << setiosflags(ios::left) << setw(11) << searchExt->channelGroup; + + line << "\t"; + if (searchExt->useTime) + { + ostringstream timeline; + timeline << setfill('0') << setw(2) << searchExt->startTime / 100 << ":" << setw(2) << searchExt->startTime % 100; + timeline << "\t"; + timeline << setfill('0') << setw(2) << searchExt->stopTime / 100 << ":" << setw(2) << searchExt->stopTime % 100; + line << timeline.str(); + } + else + line << "--:--\t--:--"; + + SetText(strdup(line.str().c_str()), false); +} + +int cMenuSearchTemplateItem::Compare(const cListObject &ListObject) const +{ + cMenuSearchTemplateItem *p = (cMenuSearchTemplateItem *)&ListObject; + return strcasecmp(searchExt->search, p->searchExt->search); +} + +// --- cMenuEPGSearchTemplate ---------------------------------------------------------- +cMenuEPGSearchTemplate::cMenuEPGSearchTemplate(cSearchExt* Search, cBlacklist* Blacklist, bool New) +:cOsdMenu(tr("Search templates"), 2, 20, 11, 6, 5) +{ + search = Search; + blacklist = Blacklist; + newSearch = New; + cMutexLock SearchTemplatesLock(&SearchTemplates); + cSearchExt *SearchExt = SearchTemplates.First(); + while (SearchExt) { + Add(new cMenuSearchTemplateItem(SearchExt)); + SearchExt = SearchTemplates.Next(SearchExt); + } + SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), tr("Button$Default")); + Sort(); + Display(); + +} + +cSearchExt *cMenuEPGSearchTemplate::CurrentSearchTemplate(void) +{ + cMenuSearchTemplateItem *item = (cMenuSearchTemplateItem *)Get(Current()); + return item ? item->searchExt : NULL; +} + +eOSState cMenuEPGSearchTemplate::New(void) +{ + if (HasSubMenu()) + return osContinue; + return AddSubMenu(new cMenuEditTemplate(new cSearchExt, true)); +} + +eOSState cMenuEPGSearchTemplate::Delete(void) +{ + cSearchExt *curSearchExt = CurrentSearchTemplate(); + if (curSearchExt) { + if (Interface->Confirm(tr("Edit$Delete template?"))) { + cMutexLock SearchTemplatesLock(&SearchTemplates); + SearchTemplates.Del(curSearchExt); + SearchTemplates.Save(); + cOsdMenu::Del(Current()); + Display(); + } + } + return osContinue; +} + +eOSState cMenuEPGSearchTemplate::DefaultTemplate(void) +{ + if (HasSubMenu()) + return osContinue; + cSearchExt *curSearchExt = CurrentSearchTemplate(); + + int current = Current(); + cMenuSearchTemplateItem *oldDefaultTemplateItem = NULL; + for(int i=0; i<Count(); i++) + { + cMenuSearchTemplateItem *item = (cMenuSearchTemplateItem *)Get(i); + if (item && item->searchExt && item->searchExt->ID == EPGSearchConfig.DefSearchTemplateID) + oldDefaultTemplateItem = item; + } + + if (curSearchExt) + { + if (EPGSearchConfig.DefSearchTemplateID == curSearchExt->ID) + EPGSearchConfig.DefSearchTemplateID = -1; + else + EPGSearchConfig.DefSearchTemplateID = curSearchExt->ID; + cPluginManager::GetPlugin("epgsearch")->SetupStore("DefSearchTemplateID", EPGSearchConfig.DefSearchTemplateID); + + SetCurrent(oldDefaultTemplateItem); + RefreshCurrent(); + DisplayCurrent(true); + + SetCurrent(Get(current)); + RefreshCurrent(); + DisplayCurrent(true); + + Display(); + } + return osContinue; +} + +eOSState cMenuEPGSearchTemplate::ProcessKey(eKeys Key) +{ + int SearchNumber = HasSubMenu() ? Count() : -1; + eOSState state = cOsdMenu::ProcessKey(Key); + if (state == osUnknown) { + if (HasSubMenu()) + return osContinue; + switch (Key) { + case kOk: + { + if (search) + { + if (!newSearch && !Interface->Confirm(tr("Overwrite existing entries?"))) + return osBack; + // duplicate template + cSearchExt* t =CurrentSearchTemplate(); + if (!t) return osContinue; + // copy all except the name and id + search->CopyFromTemplate(t); + } + if (blacklist) + { + if (!newSearch && !Interface->Confirm(tr("Overwrite existing entries?"))) + return osBack; + // duplicate template + cSearchExt* t =CurrentSearchTemplate(); + if (!t) return osContinue; + // copy all except the name and id + blacklist->CopyFromTemplate(t); + } + return osBack; + } + case kRed: + if (CurrentSearchTemplate()) + state = AddSubMenu(new cMenuEditTemplate(CurrentSearchTemplate())); + else + state = osContinue; + break; + case kGreen: state = New(); break; + case kYellow: state = Delete(); break; + case kBlue: state = DefaultTemplate(); break; + default: break; + } + } + if (SearchNumber >= 0 && !HasSubMenu()) + { + cSearchExt* search = SearchTemplates.Get(SearchNumber); + if (search) // a newly created template was confirmed with Ok + Add(new cMenuSearchTemplateItem(search)); + else + search = CurrentSearchTemplate(); + // always update all entries, since channel group names may have changed and affect other searches + Sort(); + for(int i=0; i<Count(); i++) + { + cMenuSearchTemplateItem *item = (cMenuSearchTemplateItem *)Get(i); + if (item) + { + item->Set(); + if (item->searchExt == search) + SetCurrent(item); + } + } + Display(); + } + + return state; +} |