00001
00002 #include "customedit.h"
00003
00004
00005 #include <QSqlError>
00006
00007
00008 #include "mythdb.h"
00009
00010
00011 #include "mythcorecontext.h"
00012
00013
00014 #include "mythuibuttonlist.h"
00015 #include "mythuitextedit.h"
00016 #include "mythuibutton.h"
00017 #include "mythdialogbox.h"
00018
00019
00020 #include "recordingrule.h"
00021
00022
00023 #include "scheduleeditor.h"
00024 #include "proglist.h"
00025
00026 CustomEdit::CustomEdit(MythScreenStack *parent, ProgramInfo *pginfo)
00027 : MythScreenType(parent, "CustomEdit")
00028 {
00029 if (pginfo)
00030 m_pginfo = new ProgramInfo(*pginfo);
00031 else
00032 m_pginfo = new ProgramInfo();
00033
00034 m_prevItem = 0;
00035 m_maxex = 0;
00036 m_seSuffix = QString(" (%1)").arg(tr("stored search"));
00037 m_exSuffix = QString(" (%1)").arg(tr("stored example"));
00038
00039 gCoreContext->addListener(this);
00040 }
00041
00042 CustomEdit::~CustomEdit(void)
00043 {
00044 delete m_pginfo;
00045
00046 gCoreContext->removeListener(this);
00047 }
00048
00049 bool CustomEdit::Create()
00050 {
00051 if (!LoadWindowFromXML("schedule-ui.xml", "customedit", this))
00052 return false;
00053
00054 bool err = false;
00055 UIUtilE::Assign(this, m_ruleList, "rules", &err);
00056 UIUtilE::Assign(this, m_clauseList, "clauses", &err);
00057
00058 UIUtilE::Assign(this, m_titleEdit, "title", &err);
00059 UIUtilE::Assign(this, m_subtitleEdit, "subtitle", &err);
00060 UIUtilE::Assign(this, m_descriptionEdit, "description", &err);
00061 UIUtilE::Assign(this, m_clauseText, "clausetext", &err);
00062 UIUtilE::Assign(this, m_testButton, "test", &err);
00063 UIUtilE::Assign(this, m_recordButton, "record", &err);
00064 UIUtilE::Assign(this, m_storeButton, "store", &err);
00065 UIUtilE::Assign(this, m_cancelButton, "cancel", &err);
00066
00067 if (err)
00068 {
00069 VERBOSE(VB_IMPORTANT, "Cannot load screen 'customedit'");
00070 return false;
00071 }
00072
00073 connect(m_ruleList, SIGNAL(itemSelected(MythUIButtonListItem *)),
00074 SLOT(ruleChanged(MythUIButtonListItem *)));
00075 connect(m_titleEdit, SIGNAL(valueChanged(void)), this,
00076 SLOT(textChanged(void)));
00077 m_titleEdit->SetMaxLength(128);
00078 m_subtitleEdit->SetMaxLength(128);
00079 connect(m_descriptionEdit, SIGNAL(valueChanged(void)), this,
00080 SLOT(textChanged(void)));
00081 m_descriptionEdit->SetMaxLength(0);
00082
00083 connect(m_clauseList, SIGNAL(itemSelected(MythUIButtonListItem *)),
00084 SLOT(clauseChanged(MythUIButtonListItem *)));
00085 connect(m_clauseList, SIGNAL(itemClicked(MythUIButtonListItem *)),
00086 SLOT(clauseClicked(MythUIButtonListItem *)));
00087
00088 connect(m_testButton, SIGNAL(Clicked()), SLOT(testClicked()));
00089 connect(m_recordButton, SIGNAL(Clicked()), SLOT(recordClicked()));
00090 connect(m_storeButton, SIGNAL(Clicked()), SLOT(storeClicked()));
00091 connect(m_cancelButton, SIGNAL(Clicked()), SLOT(Close()));
00092
00093 loadData();
00094 BuildFocusList();
00095
00096 return true;
00097 }
00098
00099
00100 void CustomEdit::loadData(void)
00101 {
00102 QString baseTitle = m_pginfo->GetTitle();
00103 baseTitle.remove(QRegExp(" \\(.*\\)$"));
00104
00105 CustomRuleInfo rule;
00106 rule.recordid = '0';
00107
00108 new MythUIButtonListItem(m_ruleList, tr("<New rule>"),
00109 qVariantFromValue(rule));
00110
00111 MSqlQuery result(MSqlQuery::InitCon());
00112 result.prepare("SELECT recordid, title, subtitle, description "
00113 "FROM record WHERE search = :SEARCH ORDER BY title;");
00114 result.bindValue(":SEARCH", kPowerSearch);
00115
00116 if (result.exec())
00117 {
00118 while (result.next())
00119 {
00120 QString trimTitle = result.value(1).toString();
00121 trimTitle.remove(QRegExp(" \\(.*\\)$"));
00122
00123 rule.recordid = result.value(0).toString();
00124 rule.title = trimTitle;
00125 rule.subtitle = result.value(2).toString();
00126 rule.description = result.value(3).toString();
00127
00128 MythUIButtonListItem *item =
00129 new MythUIButtonListItem(m_ruleList, rule.title,
00130 qVariantFromValue(rule));
00131
00132 if (trimTitle == baseTitle ||
00133 result.value(0).toUInt() == m_pginfo->GetRecordingRuleID())
00134 m_ruleList->SetItemCurrent(item);
00135 }
00136 }
00137 else
00138 MythDB::DBError("Get power search rules query", result);
00139
00140 loadClauses();
00141
00142 if (m_ruleList->GetCurrentPos() == 0 && !m_pginfo->GetTitle().isEmpty())
00143 {
00144 m_titleEdit->SetText(baseTitle);
00145 QString quoteTitle = baseTitle;
00146 quoteTitle.replace("\'","\'\'");
00147 m_descriptionEdit->SetText("program.title = '" + quoteTitle + "' ");
00148 }
00149 textChanged();
00150 }
00151
00152 void CustomEdit::loadClauses()
00153 {
00154 QString baseTitle = m_pginfo->GetTitle();
00155 baseTitle.remove(QRegExp(" \\(.*\\)$"));
00156
00157 QString quoteTitle = baseTitle;
00158 quoteTitle.replace("\'","\'\'");
00159
00160 CustomRuleInfo rule;
00161
00162 rule.title = tr("Match an exact title");
00163 if (!m_pginfo->GetTitle().isEmpty())
00164 rule.description = QString("program.title = '%1' ").arg(quoteTitle);
00165 else
00166 rule.description = "program.title = 'Nova' ";
00167 new MythUIButtonListItem(m_clauseList, rule.title,
00168 qVariantFromValue(rule));
00169
00170 if (!m_pginfo->GetSeriesID().isEmpty())
00171 {
00172 rule.title = tr("Match this series");
00173 rule.subtitle.clear();
00174 rule.description = QString("program.seriesid = '%1' ")
00175 .arg(m_pginfo->GetSeriesID());
00176 new MythUIButtonListItem(m_clauseList, rule.title,
00177 qVariantFromValue(rule));
00178 }
00179
00180 rule.title = tr("Match words in the title");
00181 rule.subtitle.clear();
00182 if (!m_pginfo->GetTitle().isEmpty())
00183 rule.description = QString("program.title LIKE '\%%1\%' ")
00184 .arg(quoteTitle);
00185 else
00186 rule.description = "program.title LIKE 'CSI: %' ";
00187 new MythUIButtonListItem(m_clauseList, rule.title,
00188 qVariantFromValue(rule));
00189
00190 rule.title = tr("Match words in the subtitle");
00191 rule.subtitle.clear();
00192 if (!m_pginfo->GetSubtitle().isEmpty())
00193 {
00194 QString subt = m_pginfo->GetSubtitle();
00195 subt.replace("\'","\'\'");
00196 rule.description = QString("program.subtitle LIKE '\%%1\%' ")
00197 .arg(subt);
00198 }
00199 else
00200 rule.description = "program.subtitle LIKE '%Las Vegas%' ";
00201 new MythUIButtonListItem(m_clauseList, rule.title,
00202 qVariantFromValue(rule));
00203
00204 if (!m_pginfo->GetProgramID().isEmpty())
00205 {
00206 rule.title = tr("Match this episode");
00207 rule.subtitle.clear();
00208 rule.description = QString("program.programid = '%1' ")
00209 .arg(m_pginfo->GetProgramID());
00210 }
00211 else if (!m_pginfo->GetSubtitle().isEmpty())
00212 {
00213 rule.title = tr("Match this episode");
00214 rule.subtitle.clear();
00215 rule.description = QString("program.subtitle = '%1' \n"
00216 "AND program.description = '%2' ")
00217 .arg(m_pginfo->GetSubtitle().replace("\'","\'\'"))
00218 .arg(m_pginfo->GetDescription().replace("\'","\'\'"));
00219 }
00220 else
00221 {
00222 rule.title = tr("Match an exact episode");
00223 rule.subtitle.clear();
00224 rule.description = QString("program.title = 'Seinfeld' \n"
00225 "AND program.subtitle = 'The Soup' ");
00226 }
00227 new MythUIButtonListItem(m_clauseList, rule.title,
00228 qVariantFromValue(rule));
00229
00230 rule.title = tr("Match in any descriptive field");
00231 rule.subtitle.clear();
00232 rule.description = QString("(program.title LIKE '%Japan%' \n"
00233 " OR program.subtitle LIKE '%Japan%' \n"
00234 " OR program.description LIKE '%Japan%') ");
00235 new MythUIButtonListItem(m_clauseList, rule.title,
00236 qVariantFromValue(rule));
00237
00238 rule.title = tr("New episodes only");
00239 rule.subtitle.clear();
00240 rule.description = "program.previouslyshown = 0 ";
00241 new MythUIButtonListItem(m_clauseList, rule.title,
00242 qVariantFromValue(rule));
00243
00244 rule.title = tr("Exclude unidentified episodes");
00245 rule.subtitle.clear();
00246 rule.description = "program.generic = 0 ";
00247 new MythUIButtonListItem(m_clauseList, rule.title,
00248 qVariantFromValue(rule));
00249
00250 rule.title = tr("First showing of each episode");
00251 rule.subtitle.clear();
00252 rule.description = "program.first > 0 ";
00253 new MythUIButtonListItem(m_clauseList, rule.title,
00254 qVariantFromValue(rule));
00255
00256 rule.title = tr("Last showing of each episode");
00257 rule.subtitle.clear();
00258 rule.description = "program.last > 0 ";
00259 new MythUIButtonListItem(m_clauseList, rule.title,
00260 qVariantFromValue(rule));
00261
00262 rule.title = tr("Anytime on a specific day of the week");
00263 rule.subtitle.clear();
00264 rule.description = QString("DAYNAME(program.starttime) = '%1' ")
00265 .arg(m_pginfo->GetScheduledStartTime().toString("dddd"));
00266 new MythUIButtonListItem(m_clauseList, rule.title,
00267 qVariantFromValue(rule));
00268
00269 rule.title = tr("Only on weekdays (Monday through Friday)");
00270 rule.subtitle.clear();
00271 rule.description = "WEEKDAY(program.starttime) < 5 ";
00272 new MythUIButtonListItem(m_clauseList, rule.title,
00273 qVariantFromValue(rule));
00274
00275 rule.title = tr("Only on weekends");
00276 rule.subtitle.clear();
00277 rule.description = "WEEKDAY(program.starttime) >= 5 ";
00278 new MythUIButtonListItem(m_clauseList, rule.title,
00279 qVariantFromValue(rule));
00280
00281 rule.title = tr("Only in primetime");
00282 rule.subtitle.clear();
00283 rule.description = QString("HOUR(program.starttime) >= 19 \n"
00284 "AND HOUR(program.starttime) < 23 ");
00285 new MythUIButtonListItem(m_clauseList, rule.title,
00286 qVariantFromValue(rule));
00287
00288 rule.title = tr("Not in primetime");
00289 rule.subtitle.clear();
00290 rule.description = QString("(HOUR(program.starttime) < 19 \n"
00291 " OR HOUR(program.starttime) >= 23) ");
00292 new MythUIButtonListItem(m_clauseList, rule.title,
00293 qVariantFromValue(rule));
00294
00295 rule.title = tr("Only on a specific station");
00296 rule.subtitle.clear();
00297 if (!m_pginfo->GetChannelSchedulingID().isEmpty())
00298 rule.description = QString("channel.callsign = '%1' ")
00299 .arg(m_pginfo->GetChannelSchedulingID());
00300 else
00301 rule.description = "channel.callsign = 'ESPN' ";
00302 new MythUIButtonListItem(m_clauseList, rule.title,
00303 qVariantFromValue(rule));
00304
00305 rule.title = tr("Exclude one station");
00306 rule.subtitle.clear();
00307 rule.description = "channel.callsign != 'GOLF' ";
00308 new MythUIButtonListItem(m_clauseList, rule.title,
00309 qVariantFromValue(rule));
00310
00311 rule.title = tr("Match related callsigns");
00312 rule.subtitle.clear();
00313 rule.description = "channel.callsign LIKE 'HBO%' ";
00314 new MythUIButtonListItem(m_clauseList, rule.title,
00315 qVariantFromValue(rule));
00316
00317 rule.title = tr("Only channels from the Favorites group");
00318 rule.subtitle = ", channelgroup cg, channelgroupnames cgn";
00319 rule.description = "cgn.name = 'Favorites' \n"
00320 "AND cg.grpid = cgn.grpid \n"
00321 "AND program.chanid = cg.chanid ";
00322 new MythUIButtonListItem(m_clauseList, rule.title,
00323 qVariantFromValue(rule));
00324
00325 rule.title = tr("Only channels from a specific video source");
00326 rule.subtitle.clear();
00327 rule.description = "channel.sourceid = 2 ";
00328 new MythUIButtonListItem(m_clauseList, rule.title,
00329 qVariantFromValue(rule));
00330
00331 rule.title = tr("Only channels marked as commercial free");
00332 rule.subtitle.clear();
00333 rule.description = QString("channel.commmethod = %1 ")
00334 .arg(COMM_DETECT_COMMFREE);
00335 new MythUIButtonListItem(m_clauseList, rule.title,
00336 qVariantFromValue(rule));
00337
00338 rule.title = tr("Only shows marked as HDTV");
00339 rule.subtitle.clear();
00340 rule.description = "program.hdtv > 0 ";
00341 new MythUIButtonListItem(m_clauseList, rule.title,
00342 qVariantFromValue(rule));
00343
00344 rule.title = tr("Only shows marked as widescreen");
00345 rule.subtitle.clear();
00346 rule.description = "FIND_IN_SET('WIDESCREEN', program.videoprop) > 0 ";
00347 new MythUIButtonListItem(m_clauseList, rule.title,
00348 qVariantFromValue(rule));
00349
00350 rule.title = tr("Exclude H.264 encoded streams (EIT only)");
00351 rule.subtitle.clear();
00352 rule.description = "FIND_IN_SET('AVC', program.videoprop) = 0 ";
00353 new MythUIButtonListItem(m_clauseList, rule.title,
00354 qVariantFromValue(rule));
00355
00356 rule.title = tr("Only shows with in-vision signing");
00357 rule.subtitle.clear();
00358 rule.description = "FIND_IN_SET('SIGNED', program.subtitletypes) > 0 ";
00359 new MythUIButtonListItem(m_clauseList, rule.title,
00360 qVariantFromValue(rule));
00361
00362 rule.title = tr("Only shows with in-vision subtitles");
00363 rule.subtitle.clear();
00364 rule.description = "FIND_IN_SET('ONSCREEN', program.subtitletypes) > 0 ";
00365 new MythUIButtonListItem(m_clauseList, rule.title,
00366 qVariantFromValue(rule));
00367
00368 rule.title = tr("Limit by category");
00369 rule.subtitle.clear();
00370 if (!m_pginfo->GetCategory().isEmpty())
00371 rule.description = QString("program.category = '%1' ")
00372 .arg(m_pginfo->GetCategory());
00373 else
00374 rule.description = "program.category = 'Reality' ";
00375 new MythUIButtonListItem(m_clauseList, rule.title,
00376 qVariantFromValue(rule));
00377
00378 rule.title = tr("All matches for a genre (Data Direct)");
00379 rule.subtitle = "LEFT JOIN programgenres ON "
00380 "program.chanid = programgenres.chanid AND "
00381 "program.starttime = programgenres.starttime ";
00382 if (!m_pginfo->GetCategory().isEmpty())
00383 rule.description = QString("programgenres.genre = '%1' ")
00384 .arg(m_pginfo->GetCategory());
00385 else
00386 rule.description = "programgenres.genre = 'Reality' ";
00387 new MythUIButtonListItem(m_clauseList, rule.title,
00388 qVariantFromValue(rule));
00389
00390 rule.title = tr("Limit by MPAA or VCHIP rating (Data Direct)");
00391 rule.subtitle = "LEFT JOIN programrating ON "
00392 "program.chanid = programrating.chanid AND "
00393 "program.starttime = programrating.starttime ";
00394 rule.description = "(programrating.rating = 'G' OR programrating.rating "
00395 "LIKE 'TV-Y%') ";
00396 new MythUIButtonListItem(m_clauseList, rule.title,
00397 qVariantFromValue(rule));
00398
00399 rule.title = QString(tr("Category type") +
00400 " ('movie', 'series', 'sports' " + tr("or") + " 'tvshow')");
00401 rule.subtitle.clear();
00402 rule.description = "program.category_type = 'sports' ";
00403 new MythUIButtonListItem(m_clauseList, rule.title,
00404 qVariantFromValue(rule));
00405
00406 rule.title = tr("Limit movies by the year of release");
00407 rule.subtitle.clear();
00408 rule.description = "program.category_type = 'movie' AND "
00409 "program.airdate >= 2000 ";
00410 new MythUIButtonListItem(m_clauseList, rule.title,
00411 qVariantFromValue(rule));
00412
00413 rule.title = tr("Minimum star rating (0.0 to 1.0 for movies only)");
00414 rule.subtitle.clear();
00415 rule.description = "program.stars >= 0.75 ";
00416 new MythUIButtonListItem(m_clauseList, rule.title,
00417 qVariantFromValue(rule));
00418
00419 rule.title = tr("Person named in the credits (Data Direct)");
00420 rule.subtitle = ", people, credits";
00421 rule.description = "people.name = 'Tom Hanks' \n"
00422 "AND credits.person = people.person \n"
00423 "AND program.chanid = credits.chanid \n"
00424 "AND program.starttime = credits.starttime ";
00425 new MythUIButtonListItem(m_clauseList, rule.title,
00426 qVariantFromValue(rule));
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 rule.title = tr("Re-record SDTV in HDTV (disable duplicate matching)");
00441 rule.subtitle = ", recordedprogram rp1 LEFT OUTER JOIN recordedprogram rp2"
00442 " ON rp1.programid = rp2.programid AND rp2.hdtv = 1";
00443 rule.description = "program.programid = rp1.programid \n"
00444 "AND rp1.hdtv = 0 \n"
00445 "AND program.hdtv = 1 \n"
00446 "AND rp2.starttime IS NULL ";
00447 new MythUIButtonListItem(m_clauseList, rule.title,
00448 qVariantFromValue(rule));
00449
00450 rule.title = tr("Multiple sports teams (complete example)");
00451 rule.subtitle.clear();
00452 rule.description = "program.title = 'NBA Basketball' \n"
00453 "AND program.subtitle REGEXP '(Miami|Cavaliers|Lakers)' \n"
00454 "AND program.first > 0 \n";
00455 new MythUIButtonListItem(m_clauseList, rule.title,
00456 qVariantFromValue(rule));
00457
00458 rule.title = tr("Sci-fi B-movies (complete example)");
00459 rule.subtitle.clear();
00460 rule.description = "program.category_type='movie' \n"
00461 "AND program.category='Science fiction' \n"
00462 "AND program.stars <= 0.5 AND program.airdate < 1970 ";
00463 new MythUIButtonListItem(m_clauseList, rule.title,
00464 qVariantFromValue(rule));
00465
00466 rule.title =
00467 tr("SportsCenter Overnight (complete example - use FindDaily)");
00468 rule.subtitle.clear();
00469 rule.description = "program.title = 'SportsCenter' \n"
00470 "AND HOUR(program.starttime) >= 2 \n"
00471 "AND HOUR(program.starttime) <= 6 ";
00472 new MythUIButtonListItem(m_clauseList, rule.title,
00473 qVariantFromValue(rule));
00474
00475 rule.title = tr("Movie of the Week (complete example - use FindWeekly)");
00476 rule.subtitle.clear();
00477 rule.description = "program.category_type='movie' \n"
00478 "AND program.stars >= 1.0 AND program.airdate >= 1965 \n"
00479 "AND DAYNAME(program.starttime) = 'Friday' \n"
00480 "AND HOUR(program.starttime) >= 12 ";
00481 new MythUIButtonListItem(m_clauseList, rule.title,
00482 qVariantFromValue(rule));
00483
00484 rule.title = tr("First Episodes (complete example for Data Direct)");
00485 rule.subtitle.clear();
00486 rule.description = "program.first > 0 \n"
00487 "AND program.programid LIKE 'EP%0001' \n"
00488 "AND program.originalairdate = DATE(program.starttime) ";
00489 new MythUIButtonListItem(m_clauseList, rule.title,
00490 qVariantFromValue(rule));
00491
00492 m_maxex = m_clauseList->GetCount();
00493
00494 MSqlQuery result(MSqlQuery::InitCon());
00495 result.prepare("SELECT rulename,fromclause,whereclause,search "
00496 "FROM customexample;");
00497
00498 if (result.exec())
00499 {
00500 while (result.next())
00501 {
00502 QString str = result.value(0).toString();
00503
00504 if (result.value(3).toInt() > 0)
00505 str += m_seSuffix;
00506 else
00507 str += m_exSuffix;
00508
00509 rule.title = str;
00510 rule.subtitle = result.value(1).toString();
00511 rule.description = result.value(2).toString();
00512 new MythUIButtonListItem(m_clauseList, rule.title,
00513 qVariantFromValue(rule));
00514 }
00515 }
00516 }
00517
00518 void CustomEdit::ruleChanged(MythUIButtonListItem *item)
00519 {
00520 int curItem = m_ruleList->GetCurrentPos();
00521
00522 if (curItem == m_prevItem)
00523 return;
00524
00525 if (!item)
00526 return;
00527
00528 CustomRuleInfo rule = qVariantValue<CustomRuleInfo>(item->GetData());
00529
00530 m_titleEdit->SetText(rule.title);
00531 m_descriptionEdit->SetText(rule.description);
00532 m_subtitleEdit->SetText(rule.subtitle);
00533
00534 textChanged();
00535
00536 m_prevItem = curItem;
00537 }
00538
00539 void CustomEdit::textChanged(void)
00540 {
00541 bool hastitle = !m_titleEdit->GetText().isEmpty();
00542 bool hasdesc = !m_descriptionEdit->GetText().isEmpty();
00543
00544 m_testButton->SetEnabled(hasdesc);
00545 m_recordButton->SetEnabled(hastitle && hasdesc);
00546 m_storeButton->SetEnabled(m_clauseList->GetCurrentPos() >= m_maxex ||
00547 (hastitle && hasdesc));
00548 }
00549
00550 void CustomEdit::clauseChanged(MythUIButtonListItem *item)
00551 {
00552 if (!item)
00553 return;
00554
00555 CustomRuleInfo rule = qVariantValue<CustomRuleInfo>(item->GetData());
00556
00557 QString msg = rule.description;
00558 msg.replace('\n', ' ');
00559 msg.replace(QRegExp(" [ ]*"), " ");
00560 msg = QString("\"%1\"").arg(msg);
00561 m_clauseText->SetText(msg);
00562
00563 bool hastitle = !m_titleEdit->GetText().isEmpty();
00564 bool hasdesc = !m_descriptionEdit->GetText().isEmpty();
00565
00566 m_storeButton->SetEnabled(m_clauseList->GetCurrentPos() >= m_maxex ||
00567 (hastitle && hasdesc));
00568 }
00569
00570 void CustomEdit::clauseClicked(MythUIButtonListItem *item)
00571 {
00572 if (!item)
00573 return;
00574
00575 CustomRuleInfo rule = qVariantValue<CustomRuleInfo>(item->GetData());
00576
00577 QString clause;
00578 QString desc = m_descriptionEdit->GetText();
00579
00580 if (desc.contains(QRegExp("\\S")))
00581 clause = "AND ";
00582 clause += rule.description;
00583 m_descriptionEdit->SetText(desc.append(clause));
00584
00585 QString sub = m_subtitleEdit->GetText();
00586 m_subtitleEdit->SetText(sub.append(rule.subtitle));
00587 }
00588
00589 void CustomEdit::testClicked(void)
00590 {
00591 if (!checkSyntax())
00592 {
00593 return;
00594 }
00595
00596 MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
00597 ProgLister *pl = new ProgLister(mainStack, plSQLSearch,
00598 m_descriptionEdit->GetText(),
00599 m_subtitleEdit->GetText());
00600 if (pl->Create())
00601 {
00602 mainStack->AddScreen(pl);
00603 }
00604 else
00605 delete pl;
00606 }
00607
00608 void CustomEdit::recordClicked(void)
00609 {
00610 if (!checkSyntax())
00611 return;
00612
00613 RecordingRule *record = new RecordingRule();
00614
00615 MythUIButtonListItem* item = m_ruleList->GetItemCurrent();
00616 CustomRuleInfo rule = qVariantValue<CustomRuleInfo>(item->GetData());
00617
00618 int cur_recid = rule.recordid.toInt();
00619 if (cur_recid > 0)
00620 {
00621 record->ModifyPowerSearchByID(cur_recid, m_titleEdit->GetText(),
00622 m_descriptionEdit->GetText(),
00623 m_subtitleEdit->GetText());
00624 }
00625 else
00626 {
00627 record->LoadBySearch(kPowerSearch, m_titleEdit->GetText(),
00628 m_descriptionEdit->GetText(),
00629 m_subtitleEdit->GetText());
00630 }
00631
00632 MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
00633 ScheduleEditor *schededit = new ScheduleEditor(mainStack, record);
00634 if (schededit->Create())
00635 {
00636 mainStack->AddScreen(schededit);
00637 connect(schededit, SIGNAL(ruleSaved(int)), SLOT(scheduleCreated(int)));
00638 }
00639 else
00640 delete schededit;
00641 }
00642
00643 void CustomEdit::scheduleCreated(int ruleID)
00644 {
00645 if (ruleID > 0)
00646 Close();
00647 }
00648
00649 void CustomEdit::storeClicked(void)
00650 {
00651 bool exampleExists = false;
00652
00653 MSqlQuery query(MSqlQuery::InitCon());
00654 query.prepare("SELECT rulename,whereclause FROM customexample "
00655 "WHERE rulename = :RULE;");
00656 query.bindValue(":RULE", m_titleEdit->GetText());
00657
00658 if (query.exec() && query.next())
00659 exampleExists = true;
00660
00661 QString msg = QString("%1: %2\n\n").arg(tr("Current Example"))
00662 .arg(m_titleEdit->GetText());
00663
00664 if (m_subtitleEdit->GetText().length())
00665 msg += m_subtitleEdit->GetText() + "\n\n";
00666
00667 msg += m_descriptionEdit->GetText();
00668
00669 MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
00670 MythDialogBox *storediag = new MythDialogBox(msg, mainStack,
00671 "storePopup", true);
00672
00673 storediag->SetReturnEvent(this, "storeruledialog");
00674 if (storediag->Create())
00675 {
00676 if (!m_titleEdit->GetText().isEmpty())
00677 {
00678 QString str;
00679
00680 if (exampleExists)
00681 str = tr("Replace as a search");
00682 else
00683 str = tr("Store as a search");
00684 storediag->AddButton(str);
00685
00686 if (exampleExists)
00687 str = tr("Replace as an example");
00688 else
00689 str = tr("Store as an example");
00690 storediag->AddButton(str);
00691 }
00692
00693 if (m_clauseList->GetCurrentPos() >= m_maxex)
00694 {
00695 MythUIButtonListItem* item = m_clauseList->GetItemCurrent();
00696 QString str = QString("%1 \"%2\"").arg(tr("Delete"))
00697 .arg(item->GetText());
00698 storediag->AddButton(str);
00699 }
00700 mainStack->AddScreen(storediag);
00701 }
00702 else
00703 delete storediag;
00704 }
00705
00706
00707 bool CustomEdit::checkSyntax(void)
00708 {
00709 bool ret = false;
00710 QString msg;
00711
00712 QString desc = m_descriptionEdit->GetText();
00713 QString from = m_subtitleEdit->GetText();
00714 if (desc.contains(QRegExp("^\\s*AND\\s", Qt::CaseInsensitive)))
00715 {
00716 msg = tr("Power Search rules no longer require a leading \"AND\".");
00717 }
00718 else if (desc.contains(';'))
00719 {
00720 msg = tr("Power Search rules can not include semicolon ( ; ) ");
00721 msg += tr("statement terminators.");
00722 }
00723 else
00724 {
00725 MSqlQuery query(MSqlQuery::InitCon());
00726 query.prepare(QString("SELECT NULL FROM (program,channel) "
00727 "%1 WHERE\n%2").arg(from).arg(desc));
00728
00729 if (query.exec())
00730 {
00731 ret = true;
00732 }
00733 else
00734 {
00735 msg = tr("An error was found when checking") + ":\n\n";
00736 msg += query.executedQuery();
00737 msg += "\n\n" + tr("The database error was") + ":\n";
00738 msg += query.lastError().databaseText();
00739 }
00740 }
00741
00742 if (!msg.isEmpty())
00743 {
00744 MythScreenStack *popupStack = GetMythMainWindow()->
00745 GetStack("popup stack");
00746 MythConfirmationDialog *checkSyntaxPopup =
00747 new MythConfirmationDialog(popupStack, msg, false);
00748
00749 if (checkSyntaxPopup->Create())
00750 {
00751 checkSyntaxPopup->SetReturnEvent(this, "checkSyntaxPopup");
00752 popupStack->AddScreen(checkSyntaxPopup);
00753 }
00754 else
00755 {
00756 delete checkSyntaxPopup;
00757 }
00758 ret = false;
00759 }
00760 return ret;
00761 }
00762
00763 void CustomEdit::storeRule(bool is_search, bool is_new)
00764 {
00765 CustomRuleInfo rule;
00766 rule.recordid = '0';
00767 rule.title = m_titleEdit->GetText();
00768 rule.subtitle = m_subtitleEdit->GetText();
00769 rule.description = m_descriptionEdit->GetText();
00770
00771 MSqlQuery query(MSqlQuery::InitCon());
00772 query.prepare("REPLACE INTO customexample "
00773 "(rulename,fromclause,whereclause,search) "
00774 "VALUES(:RULE,:FROMC,:WHEREC,:SEARCH);");
00775 query.bindValue(":RULE", rule.title);
00776 query.bindValue(":FROMC", rule.subtitle);
00777 query.bindValue(":WHEREC", rule.description);
00778 query.bindValue(":SEARCH", is_search);
00779
00780 if (is_search)
00781 rule.title += m_seSuffix;
00782 else
00783 rule.title += m_exSuffix;
00784
00785 if (!query.exec())
00786 MythDB::DBError("Store custom example", query);
00787 else if (is_new)
00788 {
00789 new MythUIButtonListItem(m_clauseList, rule.title,
00790 qVariantFromValue(rule));
00791 }
00792 else
00793 {
00794
00795
00796
00797 for (int i = m_maxex; i < m_clauseList->GetCount(); i++)
00798 {
00799 MythUIButtonListItem* item = m_clauseList->GetItemAt(i);
00800 QString removedStr = item->GetText().remove(m_seSuffix)
00801 .remove(m_exSuffix);
00802 if (m_titleEdit->GetText() == removedStr)
00803 {
00804 item->SetData(qVariantFromValue(rule));
00805 clauseChanged(item);
00806 break;
00807 }
00808 }
00809 }
00810 }
00811
00812 void CustomEdit::deleteRule(void)
00813 {
00814 MythUIButtonListItem* item = m_clauseList->GetItemCurrent();
00815 if (!item)
00816 return;
00817
00818 MSqlQuery query(MSqlQuery::InitCon());
00819 query.prepare("DELETE FROM customexample "
00820 "WHERE rulename = :RULE;");
00821 query.bindValue(":RULE", item->GetText().remove(m_seSuffix)
00822 .remove(m_exSuffix));
00823
00824 if (!query.exec())
00825 MythDB::DBError("Delete custom example", query);
00826 else
00827 {
00828 m_clauseList->RemoveItem(item);
00829 }
00830 }
00831
00832 void CustomEdit::customEvent(QEvent *event)
00833 {
00834 if (event->type() == DialogCompletionEvent::kEventType)
00835 {
00836 DialogCompletionEvent *dce = (DialogCompletionEvent*)(event);
00837
00838 QString resultid = dce->GetId();
00839 QString resulttext = dce->GetResultText();
00840
00841 if (resultid == "storeruledialog")
00842 {
00843 if (resulttext.startsWith(tr("Delete")))
00844 {
00845 deleteRule();
00846 }
00847 else if (!resulttext.isEmpty())
00848 {
00849 storeRule(resulttext.contains(tr("as a search")),
00850 !resulttext.startsWith(tr("Replace")));
00851 loadData();
00852 }
00853 }
00854 }
00855 }