#include "viewdisplayplugin.h" #include "../config.h" /*********************************************************** * cViewPlugin ***********************************************************/ cViewPlugin::cViewPlugin(int id, int plugId) { this->id = id; this->plugId = plugId; viewId = eViewType::DisplayPlugin; viewName = strdup("displayplugin"); if (id == 0) numViews = plgManager->GetNumSubviews(plugId) + 1; else numViews = 1; views = new cViewPlugin*[numViews]; views[0] = this; for (int i=1; i < numViews; i++) { views[i] = NULL; } numViewElements = plgManager->GetNumViewElements(plugId, id); viewElements = new cViewElement*[numViewElements]; for (int i=0; i < numViewElements; i++) { viewElements[i] = NULL; } SetViewElements(); numViewGrids = plgManager->GetNumViewGrids(plugId, id); viewGrids = new cViewGrid*[numViewGrids]; for (int i=0; i < numViewGrids; i++) { viewGrids[i] = NULL; } SetViewGrids(); tabView = NULL; viewChanged = true; newViewId = 0; } cViewPlugin::~cViewPlugin(void) { for (int i=0; i< numViewGrids; i++) delete viewGrids[i]; delete[] viewGrids; delete tabView; for (int i=1; i < numViews; i++) { delete views[i]; } delete[] views; } /*********************************************************** * Public Functions ***********************************************************/ bool cViewPlugin::ReadFromXML(const char *plugName, const char *tplName, cSdOsd *osd) { cString xmlFile = cString::sprintf("plug-%s-%s", plugName, tplName); cXmlParser parser; if (osd) parser.SetOsd(osd); else parser.SetOsd(&sdOsd); if (!parser.ReadView(this, *xmlFile)) { return false; } if (!parser.ParsePluginView()) { return false; } return true; } bool cViewPlugin::ReadSubViews(const char *plugName) { plgManager->InitPluginSubviewIterator(plugId); int svId = -1; string svTpl = ""; while (plgManager->GetNextSubView(svId, svTpl)) { cViewPlugin *plugSubView = new cViewPlugin(svId, plugId); if (!plugSubView->ReadFromXML(plugName, svTpl.c_str(), &sdOsd)) return false; views[svId] = plugSubView; } return true; } void cViewPlugin::SetGlobals(cGlobals *globals) { cView::SetGlobals(globals); for (int i=0; i < numViewGrids; i++) { if (viewGrids[i]) viewGrids[i]->SetGlobals(globals); } for (int i=1; i < numViews; i++) { views[i]->SetGlobals(globals); } if (tabView) { tabView->SetGlobals(globals); } } void cViewPlugin::AddViewElement(cVePlugin *viewElement) { int veId = ViewElementId(viewElement->Name()); if (veId == ATTR_UNKNOWN) return; viewElement->SetId(veId); viewElement->SetPluginId(plugId); viewElement->SetViewId(id); viewElement->SetTokenContainer(); viewElements[veId] = viewElement; } void cViewPlugin::AddViewGrid(cViewGrid *viewGrid) { int gId = GridId(viewGrid->Name()); if (gId == ATTR_UNKNOWN) return; viewGrid->SetId(gId); viewGrid->SetPluginId(plugId); viewGrid->SetViewId(id); viewGrid->SetTokenContainer(); viewGrids[gId] = viewGrid; } void cViewPlugin::AddTab(cArea *tab) { if (!tabView) { tabView = new cPluginTabView(id, plugId); tabView->SetOsd(&sdOsd); } tabView->AddTab(tab); } void cViewPlugin::AddScrollbar(cVeDmScrollbar *scrollbar) { if (!tabView) { tabView = new cPluginTabView(id, plugId); tabView->SetOsd(&sdOsd); } int id = ViewElementId("scrollbar"); scrollbar->SetId(id); scrollbar->SetTokenContainer(); tabView->AddScrollbar(scrollbar); } void cViewPlugin::AddTablabels(cVeDmTablabels *tablabels) { if (!tabView) { tabView = new cPluginTabView(id, plugId); tabView->SetOsd(&sdOsd); } int id = ViewElementId("tablabels"); tablabels->SetId(id); tablabels->SetTokenContainer(); tabView->AddTablabels(tablabels); } void cViewPlugin::PreCache(void) { if (container.Width() > 0) { attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height()); attribs->Cache(); } cView::PreCache(); for (int i=0; i < numViewGrids; i++) { if (viewGrids[i]) { viewGrids[i]->SetContainer(0, 0, attribs->Width(), attribs->Height()); viewGrids[i]->PreCache(); } } for (int i=1; i < numViews; i++) { views[i]->SetContainer(0, 0, attribs->Width(), attribs->Height()); views[i]->PreCache(); } if (tabView) { tabView->PreCache(0, 0, attribs->Width(), attribs->Height()); } } cVePlugin *cViewPlugin::GetViewElement(int veId) { if (!viewElements[veId]) return NULL; cVePlugin *ve = dynamic_cast(viewElements[veId]); return ve; } cViewGrid *cViewPlugin::GetViewGrid(int gId) { return viewGrids[gId]; } cPluginTabView *cViewPlugin::GetViewTab(void) { return tabView; } void cViewPlugin::Hide(void) { for (int i=0; i < numViewGrids; i++) { if (viewGrids[i]) viewGrids[i]->Hide(); } for (int i=0; i < numViewElements; i++) { if (viewElements[i]) viewElements[i]->Hide(); } } void cViewPlugin::Show(void) { for (int i=0; i < numViewGrids; i++) { if (viewGrids[i]) viewGrids[i]->Show(); } for (int i=0; i < numViewElements; i++) { if (viewElements[i]) viewElements[i]->Show(); } } /*********************************************************** * libskindesigner api interface ***********************************************************/ bool cViewPlugin::InitOsd(void) { return Init(); } void cViewPlugin::CloseOsd(void) { viewChanged = true; newViewId = 0; Close(); for (int i=0 ; i < numViewGrids; i++) { if (viewGrids[i]) viewGrids[i]->Close(); } for (int i=1 ; i < numViews; i++) { if (views[i]) views[i]->Close(); } } void cViewPlugin::Deactivate(int viewId, bool hide) { for (int i=0; i < numViewElements; i++) { if (viewElements[i]) viewElements[i]->StopScrolling(false); } if (hide) views[viewId]->Hide(); } void cViewPlugin::Activate(int viewId) { viewChanged = true; newViewId = viewId; views[viewId]->Show(); } void cViewPlugin::SetViewElementTokens(int veId, int viewId, skindesignerapi::cTokenContainer *tk) { cVePlugin *ve = views[viewId]->GetViewElement(veId); if (!ve) return; ve->Set(tk); } void cViewPlugin::ClearViewElement(int veId, int viewId) { cVePlugin *ve = views[viewId]->GetViewElement(veId); if (!ve) return; ve->StopScrolling(); ve->Clear(); } void cViewPlugin::DisplayViewElement(int veId, int viewId) { cVePlugin *ve = views[viewId]->GetViewElement(veId); if (!ve) return; if (ve->Parse()) ve->Render(); } void cViewPlugin::SetGrid(long gId, int viewId, int viewGridId, double x, double y, double width, double height, skindesignerapi::cTokenContainer *tk){ cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId); if (!grid) return; grid->CheckSize(gId); grid->PositionGrid(gId, x, y, width, height); if (tk) { //only set tokens new if necessary grid->SetTokens(gId, tk); } } void cViewPlugin::SetGridCurrent(long gId, int viewId, int viewGridId, bool current) { if (gId < 0) return; cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId); if (!grid) return; grid->SetCurrentGrid(gId, current); } void cViewPlugin::DeleteGrid(long gId, int viewId, int viewGridId) { cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId); if (!grid) return; grid->DeleteGrid(gId); } void cViewPlugin::DisplayGrids(int viewId, int viewGridId) { cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId); if (!grid) return; grid->Render(); } void cViewPlugin::ClearGrids(int viewId, int viewGridId) { cViewGrid *grid = views[viewId]->GetViewGrid(viewGridId); if (!grid) return; grid->ClearGrids(); } void cViewPlugin::SetTabTokens(int viewId, skindesignerapi::cTokenContainer *tk) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->SetOsd(&sdOsd); tab->Set(tk); } void cViewPlugin::TabLeft(int viewId) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->KeyLeft(); } void cViewPlugin::TabRight(int viewId) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->KeyRight(); } void cViewPlugin::TabUp(int viewId) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->KeyUp(); } void cViewPlugin::TabDown(int viewId) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->KeyDown(); } void cViewPlugin::DisplayTabs(int viewId) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->Render(); } void cViewPlugin::ClearTab(int viewId) { cPluginTabView *tab = views[viewId]->GetViewTab(); if (!tab) return; tab->Clear(); } void cViewPlugin::Flush(void) { if (viewChanged) { viewChanged = false; newTvFrame = views[newViewId]->GetTvFrame(); menuInit = true; } cView::Flush(); } bool cViewPlugin::ChannelLogoExists(string channelId) { return imgCache->LogoExists(channelId); } string cViewPlugin::GetEpgImagePath(void) { return *config.epgImagePath; } /*********************************************************** * Private Functions ***********************************************************/ void cViewPlugin::SetViewElements(void) { plgManager->InitViewElementIterator(plugId, id); int veId = -1; string veName = ""; while (plgManager->GetNextViewElement(veId, veName)) { viewElementNames.insert(pair(veName, veId)); } } void cViewPlugin::SetViewGrids(void) { plgManager->InitViewGridIterator(plugId, id); int gId = -1; string gName = ""; while (plgManager->GetNextViewGrid(gId, gName)) { gridNames.insert(pair(gName, gId)); } } int cViewPlugin::GridId(const char *name) { map::iterator hit = gridNames.find(name); if (hit != gridNames.end()) return (int)hit->second; return ATTR_UNKNOWN; } /*********************************************************** * cPluginTabView ***********************************************************/ cPluginTabView::cPluginTabView(int viewId, int plugId) { sdOsd = NULL; init = true; drawScrollbar = true; scrollbar = NULL; tablabels = NULL; detailView = new cViewDetailAdvancedPlugin(viewId, plugId); firstTab = true; } cPluginTabView::~cPluginTabView(void) { delete scrollbar; delete tablabels; delete detailView; } void cPluginTabView::SetGlobals(cGlobals *globals) { detailView->SetGlobals(globals); if (scrollbar) scrollbar->SetGlobals(globals); if (tablabels) tablabels->SetGlobals(globals); } void cPluginTabView::AddTab(cArea *tab) { if (firstTab) { tab->SetActiveTab(true); firstTab = false; } detailView->AddArea(tab); } void cPluginTabView::AddScrollbar(cVeDmScrollbar *scrollbar) { this->scrollbar = scrollbar; } void cPluginTabView::AddTablabels(cVeDmTablabels *tablabels) { this->tablabels = tablabels; } void cPluginTabView::PreCache(int containerX, int containerY, int containerWidth, int containerHeight) { detailView->SetOsd(sdOsd); detailView->SetTokenContainer(); detailView->SetContainer(containerX, containerY, containerWidth, containerHeight); detailView->Cache(); if (scrollbar) { scrollbar->SetContainer(containerX, containerY, containerWidth, containerHeight); scrollbar->Cache(); } if (tablabels) { tablabels->SetContainer(containerX, containerY, containerWidth, containerHeight); tablabels->Cache(); } } void cPluginTabView::Set(skindesignerapi::cTokenContainer *tk) { detailView->Set(tk); } void cPluginTabView::Render(void) { detailView->Render(); if (drawScrollbar) { drawScrollbar = false; DrawScrollbar(); } if (!init) return; init = false; vector tabs; int activeTab = detailView->GetTabs(tabs); if (tablabels) { tablabels->SetTabs(tabs); tablabels->SetActiveTab(activeTab); if (tablabels->Parse()) tablabels->Render(); } } void cPluginTabView::Clear(void) { init = true; drawScrollbar = true; detailView->ResetTabs(); detailView->Close(); if (tablabels) tablabels->Close(); if (scrollbar) scrollbar->Close(); } void cPluginTabView::KeyLeft(void) { if (detailView->NumTabs() > 1) { detailView->Clear(); detailView->PrevTab(); detailView->SetDirty(); if (tablabels) { tablabels->Clear(); tablabels->SetActiveTab(detailView->ActiveTab()); if (tablabels->Parse()) tablabels->Render(); } sdOsd->Flush(); drawScrollbar = true; } else { //scroll page if (detailView->ScrollUp(true)) { drawScrollbar = true; } } } void cPluginTabView::KeyRight(void) { if (detailView->NumTabs() > 1) { detailView->Clear(); detailView->NextTab(); detailView->SetDirty(); if (tablabels) { tablabels->Clear(); tablabels->SetActiveTab(detailView->ActiveTab()); if (tablabels->Parse()) tablabels->Render(); } sdOsd->Flush(); drawScrollbar = true; } else { //scroll page if (detailView->ScrollDown(true)) { drawScrollbar = true; } } } void cPluginTabView::KeyUp(void) { if (detailView->ScrollUp()) { drawScrollbar = true; } } void cPluginTabView::KeyDown(void) { if (detailView->ScrollDown()) { drawScrollbar = true; } } void cPluginTabView::DrawScrollbar(void) { if (!scrollbar) return; int barheight = 0; int offset = 0; bool end = true; detailView->Scrollbar(barheight, offset, end); scrollbar->SetDetail(barheight, offset, end); scrollbar->Render(); }