/* Neutrino-GUI - DBoxII-Project Part of Movieplayer (c) 2003, 2004 by gagga Based on code by Zwen. Thanks. $Id: bookmarkmanager.cpp,v 1.12 2004/05/20 07:38:34 thegoodguy Exp $ Homepage: http://www.giggo.de/dbox2/movieplayer.html License: GPL 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define info_height 60 CBookmark::CBookmark(const std::string & inName, const std::string & inUrl, const std::string & inTime) { name = inName; url = inUrl; time = inTime; } //------------------------------ int CBookmarkManager::addBookmark (CBookmark inBookmark) { if (bookmarks.size() < MAXBOOKMARKS) { bookmarks.push_back(inBookmark); printf("CBookmarkManager: addBookmark: %s %s\n", inBookmark.getName(), inBookmark.getTime()); bookmarksmodified = true; return 0; } // TODO:show dialog to delete old bookmark return -1; } //------------------------------------------------------------------------ inline int CBookmarkManager::createBookmark (const std::string & name, const std::string & url, const std::string & time) { return addBookmark(CBookmark(name, url, time)); } int CBookmarkManager::createBookmark (const std::string & url, const std::string & time) { std::string bookmarkname; CStringInputSMS bookmarkname_input(LOCALE_MOVIEPLAYER_BOOKMARKNAME, &bookmarkname, 25, LOCALE_MOVIEPLAYER_BOOKMARKNAME_HINT1, LOCALE_MOVIEPLAYER_BOOKMARKNAME_HINT2, "abcdefghijklmnopqrstuvwxyz0123456789-_", this); bookmarkname_input.exec(NULL, ""); if (bookmarkname_entered) { bookmarkname_entered = false; return createBookmark(bookmarkname, url, time); } return -1; } //------------------------------------------------------------------------ #if 0 //never used void CBookmarkManager::removeBookmark (unsigned int index) { std::vector::iterator p = bookmarks.begin()+index; bookmarks.erase(p); bookmarksmodified=true; } //------------------------------------------------------------------------ void CBookmarkManager::renameBookmark (unsigned int index) { if (index >= bookmarks.size()) return; CBookmark & theBookmark = bookmarks[index]; char bookmarkname[26]; strncpy (bookmarkname, theBookmark.getName(), 25); CStringInputSMS bookmarkname_input(LOCALE_MOVIEPLAYER_BOOKMARKNAME, bookmarkname, 25, LOCALE_MOVIEPLAYER_BOOKMARKNAME_HINT1, LOCALE_MOVIEPLAYER_BOOKMARKNAME_HINT2, "abcdefghijklmnopqrstuvwxyz0123456789-_"); bookmarkname_input.exec(NULL, ""); if (strcmp(theBookmark.getName(), bookmarkname) != 0) { theBookmark.setName(std::string(bookmarkname)); bookmarksmodified=true; } } #endif //------------------------------------------------------------------------ void CBookmarkManager::readBookmarkFile() { if (bookmarkfile.loadConfig(BOOKMARKFILE)) { bookmarksmodified = false; bookmarks.clear(); unsigned int bookmarkcount = bookmarkfile.getInt32("bookmarkcount", 0); if (bookmarkcount > MAXBOOKMARKS) bookmarkcount = MAXBOOKMARKS; while (bookmarkcount-- > 0) { std::string bookmarkstring = "bookmark" + to_string(bookmarkcount) + "."; std::string bookmarkname = bookmarkfile.getString(bookmarkstring + "name", ""); std::string bookmarkurl = bookmarkfile.getString(bookmarkstring + "url", ""); std::string bookmarktime = bookmarkfile.getString(bookmarkstring + "time", ""); bookmarks.push_back(CBookmark(bookmarkname, bookmarkurl, bookmarktime)); } } } //------------------------------------------------------------------------ void CBookmarkManager::writeBookmarkFile() { printf("CBookmarkManager: Writing bookmark file\n"); bookmarkfile.clear(); unsigned int bookmarkcount = 0; for (std::vector::const_iterator it = bookmarks.begin(); it != bookmarks.end(); ++it, bookmarkcount++) { std::string bookmarkstring = "bookmark" + to_string(bookmarkcount) + "."; bookmarkfile.setString(bookmarkstring + "name", it->getName()); bookmarkfile.setString(bookmarkstring + "url", it->getUrl()); bookmarkfile.setString(bookmarkstring + "time", it->getTime()); } bookmarkfile.setInt32("bookmarkcount", bookmarks.size()); bookmarkfile.saveConfig(BOOKMARKFILE); bookmarksmodified = false; } //------------------------------------------------------------------------ CBookmarkManager::CBookmarkManager() : bookmarkfile ('\t') { bookmarkname_entered = false; bookmarksmodified = false; readBookmarkFile(); } //------------------------------------------------------------------------ CBookmarkManager::~CBookmarkManager () { flush(); } //------------------------------------------------------------------------ bool CBookmarkManager::changeNotify(const neutrino_locale_t, void *) { bookmarkname_entered = true; return false; } //------------------------------------------------------------------------ #if 0 //never used int CBookmarkManager::getBookmarkCount(void) const { return bookmarks.size(); } //------------------------------------------------------------------------ int CBookmarkManager::getMaxBookmarkCount(void) const { return MAXBOOKMARKS; } #endif //------------------------------------------------------------------------ void CBookmarkManager::flush() { if (bookmarksmodified) { writeBookmarkFile(); } } //------------------------------------------------------------------------ #if 0 //never used const CBookmark * CBookmarkManager::getBookmark(CMenuTarget* parent) { if (parent) { parent->hide(); } frameBuffer = CFrameBuffer::getInstance(); visible = false; selected = 0; // Max width = 90; footerHeight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]->getHeight()+8; //initial height value for buttonbar theight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); fheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight(); x=getScreenStartX( width ); y=getScreenStartY( height + info_height ); listmaxshow = (height-theight-0)/(fheight*2); liststart = 0; height = (g_settings.screen_EndY-g_settings.screen_StartY)-(info_height+50); listmaxshow = (height-theight-0)/(fheight*2); height = theight+0+listmaxshow*fheight*2; // recalc height if (bookmarks.size() < listmaxshow) { listmaxshow=bookmarks.size(); height = theight+0+listmaxshow*fheight*2; // recalc height } if ((!bookmarks.empty() && selected==bookmarks.size())) { selected=bookmarks.size()-1; liststart = (selected/listmaxshow)*listmaxshow; } int res = -1; uint64_t timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU]); neutrino_msg_t msg; neutrino_msg_data_t data; bool loop=true; bool update=true; while (loop) { if (update) { hide(); update=false; paint(); } g_RCInput->getMsgAbsoluteTimeout( &msg, &data, &timeoutEnd ); if ( msg <= CRCInput::RC_MaxRC ) timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU]); if ( ( msg == CRCInput::RC_timeout ) || ( msg == CRCInput::RC_home) ) { //Exit after timeout or cancel key res = -1; loop=false; } else if ((msg == CRCInput::RC_up) && !(bookmarks.empty())) { int prevselected=selected; if (selected==0) { selected = bookmarks.size()-1; } else selected--; paintItem(prevselected - liststart); unsigned int oldliststart = liststart; liststart = (selected/listmaxshow)*listmaxshow; if (oldliststart!=liststart) { paint(); } else { paintItem(selected - liststart); } } else if ((msg == CRCInput::RC_down) && !(bookmarks.empty())) { int prevselected=selected; selected = (selected+1)%bookmarks.size(); paintItem(prevselected - liststart); unsigned int oldliststart = liststart; liststart = (selected/listmaxshow)*listmaxshow; if (oldliststart!=liststart) { paint(); } else { paintItem(selected - liststart); } } else if ((msg == CRCInput::RC_ok) && !(bookmarks.empty())) { res = selected; loop=false; } else if ((msg == CRCInput::RC_red) && !(bookmarks.empty())) { removeBookmark(selected); update=true; } else if ((msg==CRCInput::RC_yellow) && !(bookmarks.empty())) { renameBookmark(selected); update=true; } else if ((msg==CRCInput::RC_blue)||(msg==CRCInput::RC_green)|| (CRCInput::isNumeric(msg)) ) { //Ignore } else if (msg==CRCInput::RC_setup) { res=-1; loop=false; } else if ( msg == CRCInput::RC_help ) { // TODO Add Help } else { if ( CNeutrinoApp::getInstance()->handleMsg( msg, data ) & messages_return::cancel_all ) { loop = false; res = menu_return::RETURN_EXIT_ALL; } } } hide(); if ((res >=0) && (((unsigned int)res) < bookmarks.size())) return &bookmarks[res]; else return NULL; } #endif //------------------------------------------------------------------------ void CBookmarkManager::paintItem(int pos) { int ypos = y+ theight+0 + pos*fheight*2; unsigned int currpos = liststart + pos; bool i_selected = currpos == selected; bool i_marked = false; bool i_switch = false; //(currpos < bookmarks.size()) && (pos & 1); fb_pixel_t color; fb_pixel_t bgcolor; getItemColors(color, bgcolor, i_selected, i_marked, i_switch); int real_width=width; if (bookmarks.size()>listmaxshow) { real_width-=15; //scrollbar } frameBuffer->paintBoxRel(x,ypos, real_width, 2*fheight, bgcolor); if (currpos < bookmarks.size()) { CBookmark theBookmark = bookmarks[currpos]; g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+10,ypos+fheight, real_width-10, theBookmark.getName(), color, fheight); g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+10,ypos+2*fheight, real_width-10, theBookmark.getUrl(), color, fheight); // LCD Display if (i_selected) { CVFD::getInstance()->showMenuText(0, theBookmark.getName(), -1, true); // UTF-8 CVFD::getInstance()->showMenuText(1, theBookmark.getUrl(), -1, true); // UTF-8 } } } //------------------------------------------------------------------------ void CBookmarkManager::hide() { if (visible) { frameBuffer->paintBackgroundBoxRel(x, y, width, height+ info_height+ 5); visible = false; } } //------------------------------------------------------------------------ void CBookmarkManager::paintHead() { CComponentsHeader header(x, y, width, theight, LOCALE_BOOKMARKMANAGER_NAME, NEUTRINO_ICON_BOOKMARK_MANAGER, CComponentsHeader::CC_BTN_HELP); header.paint(CC_SAVE_SCREEN_NO); } const struct button_label BookmarkmanagerButtons[2] = { { NEUTRINO_ICON_BUTTON_RED , LOCALE_BOOKMARKMANAGER_DELETE }, { NEUTRINO_ICON_BUTTON_YELLOW, LOCALE_BOOKMARKMANAGER_RENAME } }; //------------------------------------------------------------------------ void CBookmarkManager::paintFoot() { int ButtonWidth = (width - 20) / 4; frameBuffer->paintBoxRel(x,y+height, width, footerHeight, COL_MENUFOOT_PLUS_0); frameBuffer->paintHLine(x, x+width, y, COL_MENUFOOT_PLUS_0); if (bookmarks.empty()) { frameBuffer->paintIcon(NEUTRINO_ICON_BUTTON_OKAY, x+width- 1* ButtonWidth + 10, y+height); g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]->RenderString(x+width-1 * ButtonWidth + 38, y+height+footerHeight - 2, ButtonWidth- 28, g_Locale->getText(LOCALE_BOOKMARKMANAGER_SELECT), COL_INFOBAR_TEXT); } else { ::paintButtons(x + 10, y + height + 4, width, 2, BookmarkmanagerButtons, footerHeight, ButtonWidth); frameBuffer->paintIcon(NEUTRINO_ICON_BUTTON_OKAY, x+width- 1* ButtonWidth + 10, y+height); g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]->RenderString(x+width-1 * ButtonWidth + 38, y+height+footerHeight - 2, ButtonWidth- 28, g_Locale->getText(LOCALE_BOOKMARKMANAGER_SELECT), COL_INFOBAR_TEXT); } } //------------------------------------------------------------------------ void CBookmarkManager::paint() { unsigned int page_nr = (listmaxshow == 0) ? 0 : (selected / listmaxshow); liststart = page_nr * listmaxshow; CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8, g_Locale->getText(LOCALE_BOOKMARKMANAGER_NAME)); paintHead(); for (unsigned int count=0; countlistmaxshow) { int ypos = y+ theight; int sb = 2*fheight* listmaxshow; frameBuffer->paintBoxRel(x+ width- 15,ypos, 15, sb, COL_SCROLLBAR_PLUS_0); unsigned int tmp_max = listmaxshow; if(!tmp_max) tmp_max = 1; int sbc= ((bookmarks.size()- 1)/ tmp_max)+ 1; if (sbc < 1) sbc = 1; frameBuffer->paintBoxRel(x+ width- 13, ypos+ 2+ page_nr * (sb-4)/sbc, 11, (sb-4)/sbc, COL_SCROLLBAR_ACTIVE_PLUS_0); } paintFoot(); visible = true; }