/************************************************************************ MeOS - Orienteering Software Copyright (C) 2009-2024 Melin Software HB 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 3 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, see . Melin Software HB - software@melin.nu - www.melin.nu Eksoppsvägen 16, SE-75646 UPPSALA, Sweden ************************************************************************/ #include "stdafx.h" #include "resource.h" #include #include #include "oEvent.h" #include "xmlparser.h" #include "gdioutput.h" #include "csvparser.h" #include "SportIdent.h" #include "oListInfo.h" #include "TabList.h" #include "TabRunner.h" #include "TabTeam.h" #include "TabSI.h" #include "TabAuto.h" #include "meos_util.h" #include #include "classconfiginfo.h" #include "metalist.h" #include "gdifonts.h" #include "listeditor.h" #include "meosexception.h" #include "pdfwriter.h" #include "methodeditor.h" #include "MeOSFeatures.h" #include "liveresult.h" #include "animationdata.h" #include #include "HTMLWriter.h" #include "generalresult.h" const static int CUSTOM_OFFSET = 10; const static int NUMTEXTSAMPLE = 13; const static int ForcePageBreak = 1024; const static int IgnoreLimitPer = 512; const static int AddTeamRogaining = 5; const static int AddTeamClasses = 4; const static int AddPatrolClasses = 3; const static int AddRogainingClasses = 2; const static int AddAllClasses = 1; TabList::TabList(oEvent *poe):TabBase(poe) { lastHtmlTarget = poe->getPropertyString("LastExportTarget", L""); clearCompetitionData(); } TabList::~TabList(void) { for (size_t k = 0; k < liveResults.size(); k++) { delete liveResults[k]; liveResults[k] = 0; } liveResults.clear(); } int ListsCB(gdioutput *gdi, GuiEventType type, BaseInfo *data); int ListsEventCB(gdioutput *gdi, GuiEventType type, BaseInfo *data) { if (type!=GUI_EVENT) return -1; TabList &tc = dynamic_cast(*gdi->getTabs().get(TListTab)); tc.rebuildList(*gdi); return 0; } void TabList::rebuildList(gdioutput &gdi) { if (!SelectedList.empty()) { ButtonInfo bi; bi.id=SelectedList; noReEvaluate = true; ListsCB(&gdi, GUI_BUTTON, &bi); noReEvaluate = false; } } int openRunnerTeamCB(gdioutput *gdi, GuiEventType type, BaseInfo *data) { if (type==GUI_LINK && data) { TextInfo *ti = dynamic_cast(data); int id = ti->getExtraInt(); if (id != 0 && ti->id == "T" && gdi->canClear()) { TabTeam &tt = dynamic_cast(*gdi->getTabs().get(TTeamTab)); tt.loadPage(*gdi, id); } else if (id != 0 && ti->id == "R" && gdi->canClear()) { TabRunner &tr = dynamic_cast(*gdi->getTabs().get(TRunnerTab)); tr.loadPage(*gdi, id); } } return 0; } int NoStartRunnerCB(gdioutput* gdi, GuiEventType type, BaseInfo* data) { if (type == GUI_LINK) { TextInfo* ti = dynamic_cast(data); int id = atoi(ti->id.c_str()); TabList& tc = dynamic_cast(*gdi->getTabs().get(TListTab)); pRunner p = tc.getEvent()->getRunner(id, 0); if (p) { p->setStatus(StatusDNS, true, oBase::ChangeType::Update); p->synchronize(); ti->callBack = 0; ti->highlight = false; ti->active = false; ti->color = RGB(255, 0, 0); gdi->setText(ti->id, L"Ej start", true); } } return 0; } int ListsCB(gdioutput *gdi, GuiEventType type, BaseInfo *data) { TabList &tc = dynamic_cast(*gdi->getTabs().get(TListTab)); return tc.listCB(*gdi, type, data); } int TabList::baseButtons(gdioutput &gdi, int extraButtons) { gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(baseButtonWidth), "Cancel", ownWindow ? "Stäng" : "Återgå", ListsCB, "", true, false); gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", ListsCB, "Skriv ut listan.", true, false); if (!ownWindow) { gdi.addButton(gdi.getWidth() + 20, 21 + 2 * gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "HTMLDesign", "Webb...", ListsCB, "Spara för webben.", true, false); } gdi.addButton(gdi.getWidth()+20, 24+3*gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "PDF", "PDF...", ListsCB, "Spara som PDF.", true, false); gdi.addButton(gdi.getWidth()+20, 27+4*gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Copy", "Kopiera", ListsCB, "Kopiera till urklipp.", true, false); int ypos = 30+5*gdi.getButtonHeight(); if (extraButtons == 1) { int w, h; gdi.addButton(gdi.getWidth()+20, ypos, gdi.scaleLength(baseButtonWidth), "EditInForest", "edit_in_forest", ListsCB, "", true, false).getDimension(gdi, w, h); ypos += h + 3; } return ypos; } void TabList::generateList(gdioutput &gdi, bool forceUpdate) { if (currentList.getListCode() == EFixedLiveResult) { liveResult(gdi, currentList); int baseY = 15; if (!gdi.isFullScreen()) { gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "Cancel", ownWindow ? "Stäng" : "Återgå", ListsCB, "", true, false); baseY += 3 + gdi.getButtonHeight(); gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "FullScreenLive", "Fullskärm", ListsCB, "Visa listan i fullskärm", true, false); } SelectedList = "GeneralList"; return; } DWORD storedWidth = 0; int oX = 0; int oY = 0; if (gdi.hasData("GeneralList")) { if (!forceUpdate && !currentList.needRegenerate(*oe)) return; gdi.takeShownStringsSnapshot(); oX = gdi.getOffsetX(); oY = gdi.getOffsetY(); gdi.getData("GeneralList", storedWidth); gdi.restoreNoUpdate("GeneralList"); } else { gdi.clearPage(false); if (currentList.getParam().filterMaxPer > 0 && !ownWindow && !gdi.isFullScreen()) { gdi.addInfoBox("infofilter", L"Visar de X bästa#" + itow(currentList.getParam().filterMaxPer), 6000, 0); } } gdi.setRestorePoint("GeneralList"); currentList.setCallback(ownWindow ? nullptr : openRunnerTeamCB); const auto &par = currentList.getParam(); int bgColor = par.bgColor; if (bgColor == -1 && par.screenMode == 1) { bgColor = RGB(255, 255, 255); } gdi.setColorMode(bgColor, -1, par.fgColor, par.bgImage); try { oe->generateList(gdi, !noReEvaluate, currentList, false); gdi.updatePosTight(gdi.getWidth(), gdi.getHeight(), gdi.scaleLength(10), gdi.scaleLength(30), 0, 0); } catch (const meosException &ex) { wstring err = lang.tl(ex.wwhat()); gdi.addString("", 1, L"List Error: X#" + err).setColor(colorRed); } bool wasAnimation = false; if (par.screenMode == 1 && !par.lockUpdate) { setAnimationMode(gdi); wasAnimation = true; } else { gdi.setOffset(oX, oY, false); } int currentWidth = gdi.getWidth(); gdi.setData("GeneralList", currentWidth); if (!hideButtons) { int extra = 0; if (currentList.getListCode() == EFixedInForest) extra = 1; int baseY = baseButtons(gdi, extra); if (!ownWindow) { gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(baseButtonWidth), "Window", "Eget fönster", ListsCB, "Öppna i ett nytt fönster.", true, false); gdi.addButton(gdi.getWidth()+20, baseY + 3 + 1*gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Automatic", "Automatisera", ListsCB, "Skriv ut eller exportera listan automatiskt.", true, false); baseY += 2*(3+gdi.getButtonHeight()); } if (currentList.supportUpdateClasses()) { baseY += 3 + gdi.getButtonHeight(); gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "ClassSelection", "Klassval...", ListsCB, "Välj klasser", true, false); } baseY += 3 + gdi.getButtonHeight(); gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "ListDesign", "Utseende...", ListsCB, "Justera visningsinställningar", true, false); if (!currentList.getParam().saved && !oe->isKiosk()) { baseY += 3 + gdi.getButtonHeight(); gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(baseButtonWidth), "Remember", "Kom ihåg listan...", ListsCB, "Spara den här listan som en favoritlista", true, false); } } gdi.registerEvent("DataUpdate", ListsEventCB); gdi.setData("DataSync", 1); if (currentList.needPunchCheck() != oListInfo::PunchMode::NoPunch) gdi.setData("PunchSync", 1); gdi.registerEvent("GeneralList", ListsCB); gdi.setOnClearCb(ListsCB); SelectedList="GeneralList"; if (!wasAnimation) { if (abs(int(currentWidth - storedWidth)) < 5) { gdi.refreshSmartFromSnapshot(true); } else gdi.refresh(); } } int TabList::listCB(gdioutput &gdi, GuiEventType type, BaseInfo *data) { int index; if (type==GUI_BUTTON || type==GUI_EVENT) { BaseInfo *tbi = 0; ButtonInfo button; EventInfo evnt; if (type == GUI_BUTTON) { button = dynamic_cast(*data); tbi = &button; } else if (type == GUI_EVENT) { evnt = dynamic_cast(*data); tbi = &evnt; } else throw 0; BaseInfo &bi=*tbi; if (bi.id=="Cancel") { if (ownWindow) gdi.closeWindow(); else { gdioutput *gdi_settings = getExtraWindow("html_settings", false); if (gdi_settings) { gdi_settings->closeWindow(); } gdi_settings = getExtraWindow("save_list", false); if (gdi_settings) { gdi_settings->closeWindow(); } SelectedList = ""; currentListType = EStdNone; loadPage(gdi); } } else if (bi.id=="Print") { gdi.print(oe, 0, true, false, currentList.getParam().pageBreak); } else if (bi.id=="Copy") { ostringstream fout; HTMLWriter::writeTableHTML(gdi, fout, L"MeOS", false, L"", true, 0, 1.0); string res = fout.str(); gdi.copyToClipboard(res, L""); } else if (bi.id=="PDF") { vector< pair > ext; ext.push_back(make_pair(L"Portable Document Format (PDF)", L"*.pdf")); wstring file=gdi.browseForSave(ext, L"pdf", index); if (!file.empty()) { pdfwriter pdf; pdf.generatePDF(gdi, file, oe->getName() + L", " + currentList.getName(), oe->getDCI().getString("Organizer"), gdi.getTL(), currentList.getParam().pageBreak); gdi.openDoc(file.c_str()); } } else if (bi.id == "ClassSelection") { gdioutput *gdi_settings = getExtraWindow("list_class", true); if (!gdi_settings) { gdi_settings = createExtraWindow("list_class", lang.tl("Klassval"), gdi.scaleLength(350), gdi.scaleLength(650), true); } if (gdi_settings) { loadClassSettings(*gdi_settings, gdi.getTag()); } } else if (bi.id == "ListDesign") { gdioutput *html_settings = getExtraWindow("html_settings", false); if (html_settings) { html_settings->closeWindow(); } gdioutput *gdi_settings = getExtraWindow("list_settings", true); if (!gdi_settings) { gdi_settings = createExtraWindow("list_settings", lang.tl("Inställningar"), gdi.scaleLength(600), gdi.scaleLength(400)); } if (gdi_settings) { loadSettings(*gdi_settings, gdi.getTag()); } } else if (bi.id == "HTMLDesign") { gdioutput *design_settings = getExtraWindow("list_settings", false); if (design_settings) { design_settings->closeWindow(); } gdioutput *gdi_settings = getExtraWindow("html_settings", true); if (!gdi_settings) { gdi_settings = createExtraWindow("html_settings", lang.tl("HTML Export"), gdi.scaleLength(600), gdi.scaleLength(500), true); } if (gdi_settings) { htmlSettings(*gdi_settings, gdi.getTag()); } } else if (bi.id == "Window" || bi.id == "AutoScroll" || bi.id == "FullScreen" || bi.id == "FullScreenLive") { gdioutput *gdi_new = nullptr; TabList *tl_new = this; if (!ownWindow) { auto nw = makeOwnWindow(gdi); if (nw.first) { tl_new = nw.second; gdi_new = nw.first; } } else gdi_new = &gdi; gdioutput *gdi_settings = getExtraWindow("html_settings", false); if (gdi_settings) { gdi_settings->closeWindow(); } if (gdi_new && bi.id == "AutoScroll" || bi.id == "FullScreen") { tl_new->hideButtons = true; gdi_new->alert("help:fullscreen"); if (bi.id == "FullScreen") gdi_new->setFullScreen(true); int h = gdi_new->setHighContrastMaxWidth(); tl_new->loadPage(*gdi_new); double sec = 6.0; double delta = h * 20. / (1000. * sec); gdi_new->setAutoScroll(delta); } else if (gdi_new && bi.id == "FullScreenLive") { gdi_new->setFullScreen(true); tl_new->hideButtons = true; tl_new->loadPage(*gdi_new); } } else if (bi.id == "Remember") { gdioutput *gdi_settings = getExtraWindow("save_list", true); if (!gdi_settings) { gdi_settings = createExtraWindow("save_list", lang.tl("Kom ihåg listan"), gdi.scaleLength(450), gdi.scaleLength(500), true); } if (gdi_settings) { loadRememberList(*gdi_settings, gdi.getTag()); } } else if (bi.id == "ShowSaved") { ListBoxInfo lbi; if (gdi.getSelectedItem("SavedInstance", lbi)) { oListParam &par = oe->getListContainer().getParam(lbi.data); oe->generateListInfo(gdi, par, currentList); currentList.getParam().sourceParam = lbi.data; generateList(gdi); } } else if (bi.id == "RenameSaved") { ListBoxInfo lbi; if (gdi.getSelectedItem("SavedInstance", lbi)) { const oListParam &par = oe->getListContainer().getParam(lbi.data); gdi.clearPage(true); gdi.addString("", boldLarge, L"Döp om X#" + par.getName()); gdi.setData("ParamIx", lbi.data); gdi.dropLine(); gdi.fillRight(); gdi.addInput("Name", par.getName(), 36); gdi.setInputFocus("Name", true); gdi.addButton("DoRenameSaved", "Döp om", ListsCB).setDefault(); gdi.addButton("Cancel", "Avbryt", ListsCB).setCancel(); gdi.dropLine(3); } } else if (bi.id == "DoRenameSaved") { int ix = gdi.getDataInt("ParamIx"); oListParam &par = oe->getListContainer().getParam(ix); wstring name = gdi.getText("Name"); par.setName(name); loadPage(gdi); } else if (bi.id == "MergeSaved") { ListBoxInfo lbi; if (gdi.getSelectedItem("SavedInstance", lbi)) { //oe->getListContainer().mergeParam(0, lbi.data); const oListParam &par = oe->getListContainer().getParam(lbi.data); gdi.clearPage(true); gdi.addString("", boldLarge, L"Slå ihop X#" + par.getName()); gdi.setData("ParamIx", lbi.data); gdi.dropLine(); gdi.addListBox("Merge", 350, 250, 0, L"Slå ihop med:"); vector < pair > cand; oe->getListContainer().getMergeCandidates(lbi.data, cand); gdi.setItems("Merge", cand); gdi.addCheckbox("ShowTitle", "Visa rubrik mellan listorna", 0, false); gdi.fillRight(); gdi.addButton("DoMerge", "Slå ihop", ListsCB).setDefault(); gdi.addButton("Cancel", "Avbryt", ListsCB).setCancel(); gdi.dropLine(3); } } else if (bi.id == "DoMerge") { ListBoxInfo lbi; if (gdi.getSelectedItem("Merge", lbi)) { int mergeWidth = lbi.data; int base = gdi.getDataInt("ParamIx"); oe->synchronize(false); bool showTitle = gdi.isChecked("ShowTitle"); oe->getListContainer().mergeParam(mergeWidth, base, showTitle); oe->synchronize(true); loadPage(gdi); } return 0; } else if (bi.id == "SplitSaved") { ListBoxInfo lbi; if (gdi.getSelectedItem("SavedInstance", lbi)) { oe->synchronize(false); oe->getListContainer().split(lbi.data); oe->synchronize(true); loadPage(gdi); return 0; } } else if (bi.id == "RemoveSaved") { ListBoxInfo lbi; if (gdi.getSelectedItem("SavedInstance", lbi)) { if (gdi.ask(L"Vill du ta bort 'X'?#" + lbi.text)) { oe->synchronize(false); oe->getListContainer().removeParam(lbi.data); oe->synchronize(true); loadPage(gdi); } } return 0; } else if (bi.id == "Automatic") { gdioutput *gdi_settings = getExtraWindow("html_settings", false); wstring htmlTarget; if (gdi_settings) { htmlTarget = lastHtmlTarget; gdi_settings->closeWindow(); } PrintResultMachine prm(60*10, currentList); if (!htmlTarget.empty()) { prm.setHTML(htmlTarget, currentList.getParam().timePerPage / 1000); } TabAuto::tabAutoAddMachinge(prm); dynamic_cast(gdi.getTabs().get(TAutoTab))->loadPage(gdi, true); } else if (bi.id == "WideFormat") { enableWideFormat(gdi, gdi.isChecked(bi.id)); } else if (bi.id=="SelectAll") { set lst; lst.insert(-1); gdi.setSelection("ListSelection", lst); if (gdi.hasWidget("ResultType")) { ListBoxInfo entry; gdi.getSelectedItem("ResultType", entry); gdi.setInputStatus("Generate", int(entry.data) >= 0); } } else if (bi.id=="SelectNone") { set lst; gdi.setSelection("ListSelection", lst); if (gdi.hasWidget("ResultType")) { gdi.setInputStatus("Generate", false); } } else if (bi.id=="CancelPS") { gdi.getTabs().get(TabType(bi.getExtraInt()))->loadPage(gdi); } else if (bi.id == "SavePS" || bi.id == "EditPS") { bool edit = bi.id == "EditPS"; string ctype; gdi.getData("Type", ctype); saveExtraLines(*oe, ctype.c_str(), gdi); if (gdi.hasWidget("SplitAnalysis")) { int aflag = (gdi.isChecked("SplitAnalysis") ? 0 : 1) + (gdi.isChecked("Speed") ? 0 : 2) + (gdi.isChecked("Results") ? 0 : 4); oe->getDI().setInt("Analysis", aflag); } if (gdi.hasWidget("SplitPrintList")) { auto res = gdi.getSelectedItem("SplitPrintList"); if (res.second) { if (res.first == -11) oe->getDI().setString("SplitPrint", L""); // Automatisk else if (res.first == -10) oe->getDI().setString("SplitPrint", L"*"); // Standard else { EStdListType type = oe->getListContainer().getType(res.first); string id = oe->getListContainer().getUniqueId(type); oe->getDI().setString("SplitPrint", gdioutput::widen(id)); } } } if (gdi.hasWidget("WideFormat")) { bool wide = gdi.isChecked("WideFormat"); oe->setProperty("WideSplitFormat", wide); if (wide && gdi.hasWidget("NumPerPage")) { pair res = gdi.getSelectedItem("NumPerPage"); if (res.second) oe->setProperty("NumSplitsOnePage", res.first); int no = gdi.getTextNo("MaxWaitTime"); if (no >= 0) oe->setProperty("SplitPrintMaxWait", no); } } if (edit) { auto res = gdi.getSelectedItem("SplitPrintList"); gdi.clearPage(false); auto &li = getListEditor(); auto& lc = oe->getListContainer(); int ix = li.load(oe->getListContainer(), res.first, true); EStdListType type = oe->getListContainer().getType(ix); string id = oe->getListContainer().getUniqueId(type); oe->getDI().setString("SplitPrint", gdioutput::widen(id)); li.show(this, gdi); gdi.refresh(); } else gdi.getTabs().get(TabType(bi.getExtraInt()))->loadPage(gdi); } else if (bi.id == "PrinterSetup") { ((TabSI *)gdi.getTabs().get(TSITab))->printerSetup(gdi); } else if (bi.id=="Generate") { ListBoxInfo lbi; bool advancedResults = false; if (gdi.getSelectedItem("ListType", lbi)) { currentListType = EStdListType(lbi.data); } else if (gdi.getSelectedItem("ResultType", lbi)) { currentListType = getTypeFromResultIndex(lbi.data); lastSelectedResultList = lbi.data; advancedResults = true; } else return 0; oListParam par; gdi.getSelectedItem("ResultSpecialTo", lbi); par.useControlIdResultTo = lbi.data; gdi.getSelectedItem("ResultSpecialFrom", lbi); par.useControlIdResultFrom = lbi.data; gdi.getSelectedItem("LegNumber", lbi); par.setLegNumberCoded(lbi.data); lastLeg = lbi.data; gdi.getSelection("ListSelection", par.selection); if (advancedResults) lastResultClassSelection = par.selection; par.filterMaxPer = gdi.getTextNo("ClassLimit"); par.inputNumber = gdi.getTextNo("InputNumber"); lastInputNumber = itow(par.inputNumber); par.pageBreak = gdi.isChecked("PageBreak"); par.showHeader = gdi.isChecked("ShowHeader"); par.listCode = (EStdListType)currentListType; par.showInterTimes = gdi.isChecked("ShowInterResults"); par.showSplitTimes = gdi.isChecked("ShowSplits"); par.splitAnalysis = gdi.isChecked("SplitAnalysis"); par.setCustomTitle(gdi.getText("Title")); par.useLargeSize = gdi.isChecked("UseLargeSize"); lastLimitPer = par.filterMaxPer; lastInterResult = par.showInterTimes; lastSplitState = par.showSplitTimes; lastLargeSize = par.useLargeSize; oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="GeneralList") { if (SelectedList=="GeneralList") { generateList(gdi); } else loadGeneralList(gdi); } else if (bi.id == "EditList") { gdi.clearPage(false); getListEditor().show(this, gdi); gdi.refresh(); } else if (bi.id == "EditMethod") { getMethodEditor().show(this, gdi); gdi.refresh(); } else if (bi.id=="ResultIndividual") { oe->sanityCheck(gdi, true); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); getResultIndividual(par, cnf); cnf.getIndividual(par.selection, false); readSettings(gdi, par, true); oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="ResultIndSplit") { oe->sanityCheck(gdi, true); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getIndividual(par.selection, false); par.listCode = EStdResultList; readSettings(gdi, par, true); par.showSplitTimes = true; par.setLegNumberCoded(-1); oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="StartIndividual") { oe->sanityCheck(gdi, false); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); getStartIndividual(par, cnf); readSettings(gdi, par, false); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="StartClub") { oe->sanityCheck(gdi, false); oListParam par; getStartClub(par); readSettings(gdi, par, false); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="ResultClub") { oe->sanityCheck(gdi, false); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); getResultClub(par, cnf); readSettings(gdi, par, false); par.splitAnalysis = gdi.isChecked("SplitAnalysis"); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="PreReport") { SelectedList=bi.id; gdi.clearPage(false); oe->generatePreReport(gdi); baseButtons(gdi, 0); gdi.refresh(); } else if (bi.id=="InForestList") { SelectedList=bi.id; gdi.clearPage(false); gdi.registerEvent("DataUpdate", ListsEventCB); gdi.setData("DataSync", 1); gdi.registerEvent(bi.id, ListsCB); oe->generateInForestList(gdi, openRunnerTeamCB, NoStartRunnerCB); baseButtons(gdi, 1); gdi.refresh(); } else if (bi.id=="TeamStartList") { oe->sanityCheck(gdi, false); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); getStartTeam(par, cnf); readSettings(gdi, par, false); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="RaceNStart") { oe->sanityCheck(gdi, false); oListParam par; int race = bi.getExtraInt(); par.setLegNumberCoded(race); par.listCode = EStdIndMultiStartListLeg; readSettings(gdi, par, false); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getRaceNStart(race, par.selection); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="LegNStart") { oe->sanityCheck(gdi, false); oListParam par; readSettings(gdi, par, false); int race = bi.getExtraInt(); par.setLegNumberCoded(race); par.listCode = EStdTeamStartListLeg; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getLegNStart(race, par.selection); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="TeamResults") { oe->sanityCheck(gdi, true); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); getResultTeam(par, cnf); readSettings(gdi, par, true); oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="MultiResults") { oe->sanityCheck(gdi, true); oListParam par; readSettings(gdi, par, true); par.listCode = EStdIndMultiResultListAll; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getRaceNRes(0, par.selection); oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="RaceNRes") { oe->sanityCheck(gdi, true); oListParam par; readSettings(gdi, par, true); int race = bi.getExtraInt(); par.setLegNumberCoded(race); par.listCode = EStdIndMultiResultListLeg; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getRaceNRes(race, par.selection); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="LegNResult") { oe->sanityCheck(gdi, true); oListParam par; readSettings(gdi, par, true); int race = bi.getExtraInt(); par.setLegNumberCoded(race); par.listCode = oe->getListContainer().getType("legresult"); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getLegNRes(race, par.selection); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="RogainingResultList") { oe->sanityCheck(gdi, true); oListParam par; ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); getResultRogaining(par, cnf); readSettings(gdi, par, true); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id=="CourseReport") { oe->sanityCheck(gdi, false); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); vector par; if (cnf.hasTeamClass()) { par.emplace_back(); readSettings(gdi, par.back(), false); par.back().listCode = ETeamCourseList; cnf.getTeamClass(par.back().selection); } if (cnf.hasIndividual()) { par.emplace_back(); readSettings(gdi, par.back(), false); par.back().listCode = EIndCourseList; par.back().showInterTitle = false; par.back().setLegNumberCoded(-1); cnf.getIndividual(par.back().selection, true); } oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="HiredCards") { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); oListParam par; par.listCode = EStdRentedCard; par.showHeader = gdi.isChecked("ShowHeader"); par.setLegNumberCoded(-1); oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="PriceList") { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); oListParam par; cnf.getIndividual(par.selection, false); par.listCode = EIndPriceList; par.showHeader = gdi.isChecked("ShowHeader"); par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; oe->generateListInfo(gdi, par, currentList); generateList(gdi); gdi.refresh(); } else if (bi.id=="MinuteStartList") { oe->sanityCheck(gdi, false); SelectedList=bi.id; gdi.clearPage(false); gdi.registerEvent("DataUpdate", ListsEventCB); gdi.setData("DataSync", 1); gdi.registerEvent(bi.id, ListsCB); currentList.getParam().pageBreak = true; oe->generateMinuteStartlist(gdi); baseButtons(gdi, 0); gdi.refresh(); } else if (bi.id=="ResultList") { settingsResultList(gdi); } else if (bi.id.substr(0, 7) == "Result:" || bi.id.substr(0, 7) == "StartL:" || bi.id.substr(0, 7) == "GenLst:") { bool isReport = bi.id.substr(0, 7) == "GenLst:"; int baseType = bi.getExtraInt() & 0xFF; int flags = bi.getExtraInt() & 0xFF00; bool isStartList = bi.id.substr(0, 7) == "StartL:"; bool allClasses = baseType == AddAllClasses; bool rogaining = baseType == AddRogainingClasses; bool rogainingTeam = baseType == AddTeamRogaining; bool patrol = baseType == AddPatrolClasses; bool team = baseType == AddTeamClasses; oe->sanityCheck(gdi, bi.id.substr(0, 7) == "Result:"); oListParam par; par.listCode = oe->getListContainer().getType(bi.id.substr(7)); readSettings(gdi, par, !isStartList); if ((flags & IgnoreLimitPer) == IgnoreLimitPer || isReport) par.filterMaxPer = 0; if ((flags & ForcePageBreak) == ForcePageBreak) par.pageBreak = true; par.setLegNumberCoded(-1); if (patrol) { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getPatrol(par.selection); } else if (rogaining) { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getRogaining(par.selection); } else if (rogainingTeam) { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getRogaining(par.selection); } else if (team) { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getRelay(par.selection); } else if (!isReport && !allClasses) { ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); cnf.getIndividual(par.selection, isStartList); cnf.getPatrol(par.selection); } oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id == "KnockoutTotal") { oe->sanityCheck(gdi, true); oListParam par; par.listCode = oe->getListContainer().getType("knockout-total"); readSettings(gdi, par, true); par.setLegNumberCoded(-1); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); par.selection = set(cnf.knockout.begin(), cnf.knockout.end()); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id == "LapCount" || bi.id == "LapCountExtra") { oe->sanityCheck(gdi, true); bool extra = bi.id == "LapCountExtra"; oListParam par; par.listCode = oe->getListContainer().getType(extra ? "lapcountextra" : "lapcount"); readSettings(gdi, par, true); par.setLegNumberCoded(-1); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); if (extra) par.selection = set(cnf.lapcountextra.begin(), cnf.lapcountextra.end()); else par.selection = set(cnf.lapcountsingle.begin(), cnf.lapcountsingle.end()); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id == "CustomList") { oe->synchronize(); oe->sanityCheck(gdi, false); oListParam par; int index = bi.getExtraInt(); par.listCode = oe->getListContainer().getType(index); readSettings(gdi, par, true); par.setLegNumberCoded(-1); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); oListInfo::EBaseType type = oe->getListContainer().getList(index).getListType(); if (oListInfo::addRunners(type)) cnf.getIndividual(par.selection, true); if (oListInfo::addPatrols(type)) cnf.getPatrol(par.selection); if (oListInfo::addTeams(type)) cnf.getTeamClass(par.selection); oe->generateListInfo(gdi, par, currentList); currentList.setCallback(openRunnerTeamCB); generateList(gdi); gdi.refresh(); } else if (bi.id == "ImportCustom") { MetaListContainer &lc = oe->getListContainer(); vector< pair > installedLists; set installedId; for (int k = 0; k < lc.getNumLists(); k++) { if (lc.isExternal(k)) { MetaList &mc = lc.getList(k); installedLists.push_back(make_pair(mc.getListName(), k)); mc.initUniqueIndex(); if (!mc.getUniqueId().empty()) installedId.insert(mc.getUniqueId()); } } vector< pair > > lists; lc.enumerateLists(lists); if (lists.empty() && installedLists.empty()) { bi.id = "BrowseList"; return listCB(gdi, GUI_BUTTON, &bi); } gdi.clearPage(false); gdi.addString("", boldLarge, "Tillgängliga listor"); int bx = gdi.getCX(); int xx = bx + gdi.scaleLength(360); TextInfo ti; for (size_t k = 0; k < installedLists.size(); k++) { ti.text = installedLists[k].first; gdi.calcStringSize(ti); xx = max(xx, bx + ti.realWidth + 10); } for (size_t k = 0; k < lists.size(); k++) { ti.text = lists[k].first; gdi.calcStringSize(ti); xx = max(xx, bx + ti.realWidth + 10); } if (!installedLists.empty()) { gdi.dropLine(); gdi.addString("", 1, "Listor i tävlingen"); gdi.fillRight(); gdi.pushX(); for (size_t k = 0; k < installedLists.size(); k++) { gdi.addStringUT(0, installedLists[k].first).setColor(colorDarkGreen); gdi.setCX(xx); gdi.addString("RemoveInstalled", 0, "Ta bort", ListsCB).setExtra(installedLists[k].second); gdi.addString("EditInstalled", 0, "Redigera", ListsCB).setExtra(installedLists[k].second); gdi.dropLine(); if (k+1 < installedLists.size()) { RECT rc = {bx, gdi.getCY(),gdi.getCX(),gdi.getCY()+1}; gdi.addRectangle(rc, colorDarkBlue); gdi.dropLine(0.1); } gdi.popX(); } gdi.fillDown(); gdi.popX(); } if (!lists.empty()) { gdi.dropLine(2); gdi.addString("", 1, "Installerbara listor"); gdi.fillRight(); gdi.pushX(); for (size_t k = 0; k < lists.size(); k++) { gdi.addStringUT(0, lists[k].first, 0); if (!installedId.count(lists[k].second.first)) { gdi.setCX(xx); gdi.addString("CustomList", 0, "Lägg till", ListsCB).setColor(colorDarkGreen).setExtra(k); gdi.addString("RemoveList", 0, "Radera permanent", ListsCB).setColor(colorDarkRed).setExtra(k); } gdi.dropLine(); if (k+1 < lists.size() && !installedId.count(lists[k].second.first)) { RECT rc = {bx, gdi.getCY(),gdi.getCX(),gdi.getCY()+1}; gdi.addRectangle(rc, colorDarkBlue); gdi.dropLine(0.1); } gdi.popX(); } gdi.fillDown(); gdi.popX(); } gdi.dropLine(2); gdi.fillRight(); gdi.addButton("BrowseList", "Bläddra...", ListsCB); gdi.addButton("Cancel", "Återgå", ListsCB).setCancel(); gdi.refresh(); } else if (bi.id == "BrowseList") { vector< pair > filter; filter.push_back(make_pair(L"xml-data", L"*.xml;*.meoslist")); wstring file = gdi.browseForOpen(filter, L"xml"); if (!file.empty()) { xmlparser xml; xml.read(file); xmlobject xlist = xml.getObject(0); oe->synchronize(); oe->getListContainer().load(MetaListContainer::ExternalList, xlist, false); set imgUsed; oe->getListContainer().getUsedImages(imgUsed); for (uint64_t id : imgUsed) oe->saveImage(id); oe->synchronize(true); loadPage(gdi); } } else if (bi.id == "EditInForest") { TabRunner &rt = dynamic_cast(*gdi.getTabs().get(TRunnerTab)); rt.showInForestList(gdi); } else if (bi.id == "SplitAnalysis") { oe->setProperty("splitanalysis", gdi.isChecked(bi.id)); } else if (bi.id == "PageBreak") { oe->setProperty("pagebreak", gdi.isChecked(bi.id)); } else if (bi.id == "ShowHeader") { oe->setProperty("showheader", gdi.isChecked(bi.id)); } else if (bi.id == "ShowInterResults"){ oe->setProperty("intertime", gdi.isChecked(bi.id)); } } else if (type==GUI_LISTBOX) { ListBoxInfo lbi=*(ListBoxInfo *)data; if (lbi.id == "SplitPrintList") { gdi.setInputStatus("EditPS", int(lbi.data) > 0); } else if (lbi.id == "NumPerPage") { enableWideFormat(gdi, true); } else if (lbi.id == "SavedInstance") { int ix = lbi.data; bool split = oe->getListContainer().canSplit(ix); gdi.setInputStatus("SplitSaved", split); } else if (lbi.id=="ListType"){ EStdListType type = EStdListType(lbi.data); selectGeneralList(gdi, type); } else if (lbi.id == "ListSelection") { gdi.getSelection(lbi.id, lastClassSelection); if (gdi.hasWidget("ResultType")) { lastResultClassSelection = lastClassSelection; ListBoxInfo entry; gdi.getSelectedItem("ResultType", entry); gdi.setInputStatus("Generate", !lastClassSelection.empty() && int(entry.data) >= 0); } } else if (lbi.id == "ClassLimit"){ oe->setProperty("classlimit", lbi.data); } else if (lbi.id=="ResultType") { setResultOptionsFromType(gdi, lbi.data); } else if (lbi.id=="ResultSpecialTo") { oe->setProperty("ControlTo", lbi.data); } else if (lbi.id=="ResultSpecialFrom") { oe->setProperty("ControlFrom", lbi.data); } } else if (type==GUI_CLEAR) { offsetY=gdi.getOffsetY(); offsetX=gdi.getOffsetX(); leavingList(gdi.getTag()); return true; } else if (type == GUI_LINK) { TextInfo ti = *(TextInfo *)data; if (ti.id == "CustomList") { vector< pair > > lists; oe->getListContainer().enumerateLists(lists); size_t ix = ti.getExtraSize(); if (ix < lists.size()) { xmlparser xml; xml.read(lists[ix].second.second); xmlobject xlist = xml.getObject(0); oe->synchronize(false); oe->getListContainer().load(MetaListContainer::ExternalList, xlist, false); set imgUsed; oe->getListContainer().getUsedImages(imgUsed); for (uint64_t id : imgUsed) oe->saveImage(id); oe->synchronize(true); oe->loadGeneralResults(true, false); } ButtonInfo bi; bi.id = "ImportCustom"; listCB(gdi, GUI_BUTTON, &bi); } else if (ti.id == "RemoveList") { vector< pair > > lists; oe->getListContainer().enumerateLists(lists); size_t ix = ti.getExtraSize(); if (ix < lists.size()) { if (gdi.ask(L"Vill du ta bort 'X'?#" + lists[ix].first)) { DeleteFile(lists[ix].second.second.c_str()); } } ButtonInfo bi; bi.id = "ImportCustom"; listCB(gdi, GUI_BUTTON, &bi); } else if (ti.id == "RemoveInstalled") { int ix = ti.getExtraInt(); if (gdi.ask(L"Vill du ta bort 'X'?#" + oe->getListContainer().getList(ix).getListName())) { oe->synchronize(false); oe->getListContainer().removeList(ix); oe->synchronize(true); ButtonInfo bi; bi.id = "ImportCustom"; listCB(gdi, GUI_BUTTON, &bi); } } else if (ti.id == "EditInstalled") { int ix = ti.getExtraInt(); if (!listEditor) listEditor = make_shared(oe); gdi.clearPage(false); listEditor->load(oe->getListContainer(), ix, false); listEditor->show(this, gdi); gdi.refresh(); } } return 0; } pair TabList::makeOwnWindow(gdioutput &gdi) { gdioutput *gdi_new = createExtraWindow(uniqueTag("list"), makeDash(L"MeOS - ") + currentList.getName(), gdi.getWidth() + 64 + gdi.scaleLength(baseButtonWidth)); TabList *tl_new = 0; if (gdi_new) { TabList &tl = dynamic_cast(*gdi_new->getTabs().get(TListTab)); tl.currentList = currentList; tl.SelectedList = SelectedList; tl.ownWindow = true; tl.loadPage(*gdi_new); tl_new = &tl; changeListSettingsTarget(gdi, *gdi_new); SelectedList = ""; currentList = oListInfo(); loadPage(gdi); } return make_pair(gdi_new, tl_new); } void TabList::enableFromTo(oEvent &oe, gdioutput &gdi, bool from, bool to) { vector< pair > d; oe.fillControls(d, oEvent::ControlType::CourseControl); if (from) { gdi.enableInput("ResultSpecialFrom"); vector< pair > ds; ds.push_back(make_pair(lang.tl("Start"), 0)); ds.insert(ds.end(), d.begin(), d.end()); gdi.setItems("ResultSpecialFrom", ds); if (!gdi.selectItemByData("ResultSpecialFrom", oe.getPropertyInt("ControlFrom", 0))) { gdi.selectItemByData("ResultSpecialFrom", 0); // Fallback } } else { gdi.clearList("ResultSpecialFrom"); gdi.disableInput("ResultSpecialFrom"); } if (to) { gdi.enableInput("ResultSpecialTo"); gdi.setItems("ResultSpecialTo", d); gdi.addItem("ResultSpecialTo", lang.tl("Mål"), 0); if (!gdi.selectItemByData("ResultSpecialTo", oe.getPropertyInt("ControlTo", 0))) { gdi.selectItemByData("ResultSpecialTo", 0); // Fallback } } else { gdi.clearList("ResultSpecialTo"); gdi.disableInput("ResultSpecialTo"); } } void TabList::selectGeneralList(gdioutput &gdi, EStdListType type) { oListInfo li; oe->getListType(type, li); oe->setProperty("ListType", type); if (li.supportClasses) { gdi.enableInput("ListSelection"); oe->fillClasses(gdi, "ListSelection", {}, oEvent::extraNone, oEvent::filterNone); if (lastClassSelection.empty()) lastClassSelection.insert(-1); gdi.setSelection("ListSelection", lastClassSelection); } else { gdi.clearList("ListSelection"); gdi.disableInput("ListSelection"); } gdi.setInputStatus("UseLargeSize", li.supportLarge); gdi.setInputStatus("InputNumber", li.supportParameter); gdi.setInputStatus("SplitAnalysis", li.supportSplitAnalysis); gdi.setInputStatus("ShowInterResults", li.supportInterResults); gdi.setInputStatus("PageBreak", li.supportPageBreak); gdi.setInputStatus("ClassLimit", li.supportClassLimit); //gdi.setInputStatus("Title", li.supportCustomTitle); if (li.supportLegs) { //gdi.enableInput("LegNumber"); //oe->fillLegNumbers(gdi, "LegNumber", li.isTeamList(), true); set clsUnused; vector< pair > out; oe->fillLegNumbers(clsUnused, li.isTeamList(), true, out); gdi.setItems("LegNumber", out); gdi.setInputStatus("LegNumber", !out.empty()); } else { gdi.disableInput("LegNumber"); gdi.clearList("LegNumber"); } enableFromTo(*oe, gdi, li.supportFrom, li.supportTo); } void TabList::makeClassSelection(gdioutput &gdi) { gdi.fillDown(); gdi.addListBox("ListSelection", 250, 300, ListsCB, L"Urval:", L"", true); gdi.pushX(); gdi.fillRight(); gdi.dropLine(0.5); gdi.addButton("SelectAll", "Välj allt", ListsCB); gdi.addButton("SelectNone", "Välj inget", ListsCB); gdi.popX(); } void TabList::loadGeneralList(gdioutput &gdi) { oe->sanityCheck(gdi, false); gdi.fillDown(); gdi.clearPage(false); gdi.addString("", boldLarge, "Skapa generell lista"); gdi.dropLine(0.8); gdi.pushY(); gdi.addSelection("ListType", 250, 300, ListsCB, L"Lista:"); oe->fillListTypes(gdi, "ListType", 0); makeClassSelection(gdi); gdi.setCX(gdi.scaleLength(290)+30); gdi.pushX(); gdi.popY(); gdi.fillDown(); gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser / klubbar", ListsCB, oe->getPropertyInt("pagebreak", 0)!=0); gdi.addCheckbox("ShowHeader", "Visa rubrik", ListsCB, oe->getPropertyInt("showheader", 0) != 0); gdi.addCheckbox("ShowInterResults", "Visa mellantider", ListsCB, oe->getPropertyInt("intertime", 1)!=0, "Mellantider visas för namngivna kontroller."); gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", ListsCB, oe->getPropertyInt("splitanalysis", 1)!=0); gdi.addCheckbox("UseLargeSize", "Använd stor font", 0, lastLargeSize); if (lastLimitPer == -1) { lastLimitPer = oe->getPropertyInt("classlimit", 0); } wstring lastClassLimit; if (lastLimitPer > 0) lastClassLimit = itow(lastLimitPer); gdi.addInput("ClassLimit", lastClassLimit, 5, 0, L"Begränsa antal per klass:"); gdi.dropLine(); makeFromTo(gdi); /*gdi.fillRight(); gdi.pushX(); gdi.addSelection("ResultSpecialFrom", 140, 300, ListsCB, "Från kontroll:"); gdi.disableInput("ResultSpecialFrom"); gdi.addSelection("ResultSpecialTo", 140, 300, ListsCB, "Till kontroll:"); gdi.disableInput("ResultSpecialTo"); gdi.fillDown(); gdi.popX(); gdi.dropLine(3); */ gdi.addSelection("LegNumber", 140, 300, ListsCB, L"Sträcka:"); gdi.disableInput("LegNumber"); gdi.addInput("InputNumber", lastInputNumber, 5, 0, L"Listparameter:", L"Ett värde vars tolkning beror på listan."); gdi.disableInput("InputNumber"); gdi.popX(); if (oe->getPropertyInt("ListType", 0) > 0) { gdi.selectItemByData("ListType", oe->getPropertyInt("ListType", 0)); selectGeneralList(gdi, EStdListType(oe->getPropertyInt("ListType", 0))); } gdi.dropLine(3); gdi.addInput("Title", L"", 32, ListsCB, L"Egen listrubrik:"); gdi.dropLine(); gdi.fillRight(); gdi.addButton("Generate", "Generera", ListsCB).setDefault(); gdi.addButton("Cancel", "Avbryt", ListsCB).setCancel(); gdi.refresh(); } static int getListIx(const map &tag2ListIx, set &usedListIx, const char *tag, int fallback) { map::const_iterator res = tag2ListIx.find(tag); if (res != tag2ListIx.end()) { usedListIx.insert(res->second); return res->second; } return fallback; } void TabList::makeFromTo(gdioutput &gdi) { gdi.fillRight(); gdi.pushX(); gdi.addSelection("ResultSpecialFrom", 140, 300, ListsCB, L"Från kontroll:"); gdi.disableInput("ResultSpecialFrom"); gdi.addSelection("ResultSpecialTo", 140, 300, ListsCB, L"Till kontroll:"); gdi.disableInput("ResultSpecialTo"); gdi.popX(); gdi.dropLine(3); } class TargetSettings : public GuiHandler { void handle(gdioutput &gdi, BaseInfo &info, GuiEventType type) final { string target; if (!gdi.getData("target", target)) return; gdioutput *dest_gdi = getExtraWindow(target, false); if (!dest_gdi) return; TabBase *tb = dest_gdi->getTabs().get(TabType::TListTab); TabList *list = dynamic_cast(tb); if (list) { handle(list, gdi, info, type, *dest_gdi); } } public: virtual void handle(TabList *list, gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) = 0; virtual ~TargetSettings() {} }; class HTMLSettings : public TargetSettings { void handle(TabList *list, gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) override { list->handleHTMLSettings(gdi, info, type, dest_gdi); } }; class ListSettings : public TargetSettings { void handle(TabList *list, gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) override { list->handleListSettings(gdi, info, type, dest_gdi); } }; class ClassSettings : public TargetSettings { public: void handle(TabList *list, gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) override { list->handleClassSettings(gdi, info, type, dest_gdi); } }; class RememberList : public TargetSettings { public: void handle(TabList *list, gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) override { list->handleRememberSettings(gdi, info, type, dest_gdi); } }; HTMLSettings htmlClass; ListSettings settingsClass; ClassSettings settingsClassSelection; RememberList settingsRememberList; void TabList::changeListSettingsTarget(gdioutput &oldWindow, gdioutput &newWindow) { gdioutput *gdi_settings = getExtraWindow("list_settings", true); if (gdi_settings) { string oldTag; gdi_settings->getData("target", oldTag); if (oldWindow.getTag() == oldTag) gdi_settings->setData("target", newWindow.getTag()); } } void TabList::leavingList(const string &wnd) { gdioutput *gdi_settings = getExtraWindow("list_settings", false); if (gdi_settings) { string oldTag; gdi_settings->getData("target", oldTag); if (wnd == oldTag) gdi_settings->closeWindow(); } gdi_settings = getExtraWindow("html_settings", false); if (gdi_settings) { string oldTag; gdi_settings->getData("target", oldTag); if (wnd == oldTag) gdi_settings->closeWindow(); } gdi_settings = getExtraWindow("save_list", false); if (gdi_settings) { string oldTag; gdi_settings->getData("target", oldTag); if (wnd == oldTag) gdi_settings->closeWindow(); } } void TabList::loadRememberList(gdioutput &gdi, string targetTag) { gdi.clearPage(false); gdi.setCX(10); gdi.setCY(15); gdi.setColorMode(RGB(242, 240, 250)); gdi.setData("target", targetTag); settingsTarget = targetTag; gdi.addString("", fontMediumPlus, L"Spara 'X'#" + currentList.getName()); gdi.dropLine(0.5); oListParam &par = currentList.getParam(); wstring baseName = par.getDefaultName(); if (!par.selection.empty()) { vector classes; oe->getClasses(classes, false); if (par.selection.size() != classes.size()) { wstring cls; for (pClass c : classes) { if (par.selection.count(c->getId())) { if (cls.length() > 16) { cls += L"..."; break; } if (!cls.empty()) cls += L", "; cls += c->getName(); } } baseName += L"; " + cls; } } if (!par.getLegName().empty()) baseName += L"; " + lang.tl(L"Sträcka X#" + par.getLegName()); gdi.addInput("Name", baseName, 40, 0, L"Namn:"); gdi.dropLine(); gdi.addCheckbox("DoMerge", "Slå ihop med befintlig lista", nullptr, false).setHandler(&settingsRememberList); gdi.addListBox("Merge", 350, 250); vector < pair > cand; oe->getListContainer().getMergeCandidates(-1, cand); gdi.setItems("Merge", cand); gdi.dropLine(-0.2); gdi.addCheckbox("ShowTitle", "Visa rubrik mellan listorna", 0, false); gdi.dropLine(0.5); gdi.disableInput("Merge"); gdi.disableInput("ShowTitle"); gdi.fillRight(); gdi.pushX(); gdi.addButton("SaveList", "OK").setDefault().setHandler(&settingsRememberList); gdi.addButton("Cancel", "Avbryt").setCancel().setHandler(&settingsRememberList); gdi.dropLine(3); gdi.popX(); gdi.refresh(); } void TabList::handleRememberSettings(gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) { if (type == GUI_BUTTON) { ButtonInfo bi = static_cast(info); if (bi.id == "Cancel") gdi.closeWindow(); else if (bi.id == "SaveList") { oListParam &par = currentList.getParam(); //wstring baseName = par.getDefaultName(); wstring baseName = gdi.getText("Name"); baseName = oe->getListContainer().makeUniqueParamName(baseName); par.setName(baseName); oe->synchronize(false); par.sourceParam = oe->getListContainer().addListParam(par); if (gdi.isChecked("DoMerge")) { ListBoxInfo lbi; if (gdi.getSelectedItem("Merge", lbi)) { int mergeWidth = lbi.data; bool showTitle = gdi.isChecked("ShowTitle"); oe->getListContainer().mergeParam(mergeWidth, par.sourceParam, showTitle); } } oe->synchronize(true); dest_gdi.removeWidget("Remember"); gdi.closeWindow(); } else if (bi.id == "DoMerge") { bool merge = gdi.isChecked(bi.id); gdi.setInputStatus("Merge", merge); gdi.setInputStatus("ShowTitle", merge); } } else if (type == GUI_LISTBOX) { ListBoxInfo lbi = static_cast(info); } } static void addAnimationSettings(gdioutput &gdi, oListParam &dst) { DWORD cx, cy; gdi.getData("xmode", cx); gdi.getData("ymode", cy); gdi.setCX(cx); gdi.setCY(cy); gdi.pushX(); gdi.fillRight(); gdi.addInput("Time", itow(dst.timePerPage), 5, 0, L"Visningstid:"); gdi.addSelection("NPage", 70, 200, 0, L"Sidor per skärm:"); for (int i = 1; i <= 8; i++) gdi.addItem("NPage", itow(i), i); if (dst.nColumns == 0) dst.nColumns = 1; gdi.selectItemByData("NPage", dst.nColumns); gdi.addInput("Margin", itow(dst.margin) + L" %", 5, 0, L"Marginal:"); gdi.dropLine(1); gdi.addCheckbox("Animate", "Animation", 0, dst.animate); } static void saveAnimationSettings(gdioutput &gdi, oListParam &dst) { dst.timePerPage = gdi.getTextNo("Time"); dst.nColumns = gdi.getSelectedItem("NPage").first; dst.animate = gdi.isChecked("Animate"); dst.margin = gdi.getTextNo("Margin"); } void TabList::loadSettings(gdioutput &gdi, string targetTag) { gdi.clearPage(false); gdi.setCX(10); gdi.setCY(15); gdi.setColorMode(RGB(242, 240, 250)); gdi.setData("target", targetTag); settingsTarget = targetTag; gdi.addString("", fontMediumPlus, L"Visningsinställningar för 'X'#" + currentList.getName()); gdi.dropLine(0.5); gdi.addSelection("Background", 200, 100, 0, L"Bakgrund:").setHandler(&settingsClass); gdi.addItem("Background", lang.tl("Standard"), 0); gdi.addItem("Background", lang.tl("Färg"), 1); //gdi.addItem("Background", lang.tl("Bild"), 2); tmpSettingsParam = currentList.getParam(); int bgColor = currentList.getParam().bgColor; int fgColor = currentList.getParam().fgColor; bool useColor = bgColor != -1; gdi.selectItemByData("Background", useColor ? 1 : 0); gdi.pushX(); gdi.fillRight(); gdi.addButton("BGColor", "Bakgrundsfärg...").setHandler(&settingsClass).setExtra(bgColor); gdi.setInputStatus("BGColor", useColor); gdi.addButton("FGColor", "Textfärg...").setHandler(&settingsClass).setExtra(fgColor); gdi.popX(); gdi.dropLine(3); gdi.addSelection("Mode", 200, 100, 0, L"Visning:").setHandler(&settingsClass); gdi.addItem("Mode", lang.tl("Fönster"), 0); gdi.addItem("Mode", lang.tl("Fönster (rullande)"), 3); gdi.addItem("Mode", lang.tl("Fullskärm (sidvis)"), 1); gdi.addItem("Mode", lang.tl("Fullskärm (rullande)"), 2); gdi.selectItemByData("Mode", tmpSettingsParam.screenMode); gdi.popX(); gdi.dropLine(3); gdi.setData("xmode", gdi.getCX()); gdi.setData("ymode", gdi.getCY()); gdi.dropLine(3); gdi.addButton("ApplyList", "Verkställ").setHandler(&settingsClass); if (tmpSettingsParam.screenMode == 1) addAnimationSettings(gdi, tmpSettingsParam); RECT rc; rc.left = gdi.getWidth() + gdi.scaleLength(80); rc.right = rc.left + gdi.scaleLength(150); rc.top = 20; gdi.addString("", rc.top, rc.left, 1, "Exempel"); rc.top += (gdi.getLineHeight() * 3) / 2; rc.bottom = rc.top + gdi.scaleLength(200); gdi.addRectangle(rc, bgColor != -1 ? GDICOLOR(bgColor) : GDICOLOR(colorTransparent)).id = "Background"; string val = "123. Abc MeOS"; int key = rand()%12; for (int i = 0; i < NUMTEXTSAMPLE; i++) { gdi.addString("Sample" + itos(i), rc.top + 3 + gdi.getLineHeight()*i, rc.left + 3 + 5*i, i == 0 ? boldText : normalText, "#" + val).setColor(GDICOLOR(fgColor)); string val2 = val; for (int j = 0; j < 13; j++) { val2[j] = val[((j+1)*(key+1)) % 13]; } val = val2; } gdi.refresh(); } void TabList::handleListSettings(gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) { if (type == GUI_BUTTON) { ButtonInfo bi = static_cast(info); if (bi.id == "BGColor") { wstring c = oe->getPropertyString("Colors", L""); int res = gdi.selectColor(c, bi.getExtraInt()); if (res > -1) { info.setExtra(res); oe->setProperty("Colors", c); RectangleInfo &rc = gdi.getRectangle("Background"); rc.setColor(GDICOLOR(res)); gdi.refreshFast(); } } else if (bi.id == "FGColor") { wstring c = oe->getPropertyString("Colors", L""); int inC = bi.getExtraInt(); if (inC == -1) inC = RGB(255,255,255); int res = gdi.selectColor(c, inC); if (res > -1) { info.setExtra(res); oe->setProperty("Colors", c); for (int i = 0; i < NUMTEXTSAMPLE; i++) { BaseInfo &bi = gdi.getBaseInfo(("Sample" + itos(i)).c_str()); dynamic_cast(bi).setColor(GDICOLOR(res)); } gdi.refreshFast(); } } else if (bi.id == "ApplyList") { oListParam ¶m = currentList.getParam(); param.lockUpdate = true; int type = gdi.getSelectedItem("Background").first; if (type == 1) param.bgColor = gdi.getExtraInt("BGColor"); else param.bgColor = -1; param.fgColor = gdi.getExtraInt("FGColor"); param.screenMode = gdi.getSelectedItem("Mode").first; if (param.screenMode == 1) { saveAnimationSettings(gdi, param); } TabList *dest = this; gdioutput *dgdi = &dest_gdi; int mode = param.screenMode; if (param.screenMode == 2 || param.screenMode == 3) { dgdi->alert("help:fullscreen"); } if ((mode==1 || mode==2) && !dest_gdi.isFullScreen()) { // Require fullscreen if (!ownWindow) { auto nw = makeOwnWindow(dest_gdi); dest = nw.second; dgdi = nw.first; } dgdi->setFullScreen(true); dest->hideButtons = true; } else if ((mode == 0 || mode == 3) && dest_gdi.isFullScreen()) { dest_gdi.setFullScreen(false); hideButtons = false; } if (mode == 2 || mode == 3) { if (!dest->ownWindow) { auto nw = makeOwnWindow(dest_gdi); dest = nw.second; dgdi = nw.first; } dest->hideButtons = true; int h = dgdi->setHighContrastMaxWidth(); dest->loadPage(*dgdi); double sec = 6.0; double delta = h * 20. / (1000. * sec); dgdi->setAutoScroll(delta); } else { dest->loadPage(*dgdi); } dest->currentList.getParam().lockUpdate = false; param.lockUpdate = false; SetForegroundWindow(dgdi->getHWNDMain()); SetWindowPos(dgdi->getHWNDMain(), HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); if (mode == 1) { dest->setAnimationMode(*dgdi); dgdi->refresh(); dest->generateList(*dgdi, true); } if (param.screenMode == 2 || param.screenMode == 3) { gdi.closeWindow(); } } } else if (type == GUI_LISTBOX) { ListBoxInfo lbi = static_cast(info); if (lbi.id == "Background") { gdi.setInputStatus("BGColor", lbi.data == 1); BaseInfo &bi = gdi.getBaseInfo("BGColor"); if (lbi.data == 1 && bi.getExtraInt() == -1) bi.setExtra(int(RGB(255,255,255))); RectangleInfo &rc = gdi.getRectangle("Background"); rc.setColor(GDICOLOR(lbi.data == 1 ? bi.getExtraInt() : colorTransparent)); gdi.refreshFast(); } else if (lbi.id == "Mode") { if (lbi.data == 1) { addAnimationSettings(gdi, tmpSettingsParam); } else { if (gdi.hasWidget("Time")) saveAnimationSettings(gdi, tmpSettingsParam); gdi.removeWidget("Time"); gdi.removeWidget("NPage"); gdi.removeWidget("Margin"); gdi.removeWidget("Animate"); } gdi.refresh(); } } } namespace { void htmlDetails(gdioutput &gdi, oListParam &tmpSettingsParam, wstring &info, bool withExtra) { gdi.restoreNoUpdate("htmlDetails"); gdi.setRestorePoint("htmlDetails"); gdi.pushX(); if (withExtra) { gdi.fillDown(); gdi.addString("", 0, info); gdi.dropLine(0.3); gdi.fillRight(); gdi.addInput("Margin", itow(tmpSettingsParam.margin) + L" %", 5, 0, L"Marginal:").setHandler(&htmlClass); gdi.addInput("Scale", itow(int(tmpSettingsParam.htmlScale*100)) + L" %", 5, 0, L"Skalfaktor:").setHandler(&htmlClass); if (tmpSettingsParam.nColumns <= 0) tmpSettingsParam.nColumns = 1; gdi.addInput("Columns", itow(tmpSettingsParam.nColumns), 5, 0, L"Kolumner:").setHandler(&htmlClass); gdi.addInput("Time", itow(tmpSettingsParam.timePerPage) + L"ms", 5, 0, L"Visningstid:").setHandler(&htmlClass); gdi.popX(); gdi.dropLine(3.4); gdi.addCheckbox("UseRows", "Begränsa antal rader per sida", 0, tmpSettingsParam.htmlRows>0).setHandler(&htmlClass); gdi.dropLine(-0.4); gdi.addInput("Rows", itow(tmpSettingsParam.htmlRows), 5).setHandler(&htmlClass); gdi.setInputStatus("Rows", tmpSettingsParam.htmlRows > 0); gdi.popX(); gdi.dropLine(3.0); } else { gdi.fillRight(); gdi.addInput("Scale", itow(int(tmpSettingsParam.htmlScale * 100)) + L" %", 5, 0, L"Skalfaktor:").setHandler(&htmlClass); gdi.popX(); gdi.dropLine(3.4); gdi.addCheckbox("Reload", "Automatisk omladdning", 0, tmpSettingsParam.timePerPage>999).setHandler(&htmlClass); gdi.dropLine(-0.4); gdi.addInput("ReloadTime", itow(tmpSettingsParam.timePerPage/1000) + L" s", 5).setHandler(&htmlClass); gdi.setInputStatus("Reload", tmpSettingsParam.timePerPage>999); gdi.popX(); gdi.dropLine(3.0); } gdi.fillRight(); gdi.addButton("ApplyList", "Lagra inställningar").setHandler(&htmlClass); if (tmpSettingsParam.sourceParam != -1) gdi.disableInput("ApplyList"); gdi.addButton("Automatic", "Automatisera", 0, "Skriv ut eller exportera listan automatiskt.").setHandler(&htmlClass); gdi.addButton("HTML", "Exportera").setHandler(&htmlClass); } } void TabList::htmlSettings(gdioutput &gdi, string targetTag) { gdi.clearPage(false); gdi.setCX(10); gdi.setCY(15); gdi.setColorMode(RGB(242, 240, 250)); gdi.setData("target", targetTag); settingsTarget = targetTag; gdi.addString("", fontMediumPlus, L"HTML Export för 'X'#" + currentList.getName()); tmpSettingsParam = currentList.getParam(); vector htmlTmpl; HTMLWriter::enumTemplates(HTMLWriter::TemplateType::List, htmlTmpl); vector > items; gdi.dropLine(0.5); gdi.addString("", 10, "htmlhelp"); items.emplace_back(lang.tl("Strukturerat webbdokument (html)"), 0); items.emplace_back(lang.tl("Formaterat webbdokument (html)"), 1); int id = 10; htmlTemplateTag2Id.clear(); html2IdToInfo.clear(); htmlTemplateTag2Id["free"] = 1; htmlTemplateTag2Id["table"] = 0; for (auto &t : htmlTmpl) { items.emplace_back(lang.tl(t.name), ++id); htmlTemplateTag2Id[t.tag] = id; html2IdToInfo[id] = t.desc; } gdi.addSelection("Format", 200, 100, 0, L"Format:").setHandler(&htmlClass); gdi.autoGrow("Format"); if (!htmlTemplateTag2Id.count(tmpSettingsParam.htmlTypeTag)) tmpSettingsParam.htmlTypeTag = "free"; gdi.setItems("Format", items); int tid = htmlTemplateTag2Id[tmpSettingsParam.htmlTypeTag]; gdi.selectItemByData("Format", tid); htmlDetails(gdi, tmpSettingsParam, html2IdToInfo[tid], tid > 5); gdi.refresh(); } void TabList::handleHTMLSettings(gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) { if (type == GUI_BUTTON) { int typeIx = gdi.getSelectedItem("Format").first; string typeTag = "free"; for (auto &m : htmlTemplateTag2Id) { if (m.second == typeIx) { typeTag = m.first; break; } } int margin = -1; int rows = 0; int cols = 0; int time_ms = 0; double scale = 0; if (gdi.hasWidget("Margin")) { margin = gdi.getTextNo("Margin"); if (gdi.isChecked("UseRows")) rows = gdi.getTextNo("Rows"); cols = gdi.getTextNo("Columns"); time_ms = gdi.getTextNo("Time"); scale = _wtoi(gdi.getText("Scale").c_str())*0.01; } else { scale = _wtoi(gdi.getText("Scale").c_str())*0.01; if (gdi.isChecked("Reload")) time_ms = 1000 * _wtoi(gdi.getText("ReloadTime").c_str()); } ButtonInfo bi = static_cast(info); if (bi.id == "ApplyList" || bi.id =="Automatic") { oListParam ¶m = currentList.getParam(); param.htmlTypeTag = typeTag; if (margin > 0) { param.htmlRows = rows; param.htmlScale = scale; param.timePerPage = time_ms; param.margin = margin; param.nColumns = cols; } else { param.htmlScale = scale; param.timePerPage = time_ms; } if (bi.id == "ApplyList") { if (param.sourceParam != -1) { auto &dest = oe->getListContainer().getParam(param.sourceParam); if (margin > 0) { dest.htmlRows = rows; dest.htmlScale = scale; dest.timePerPage = time_ms; dest.margin = margin; dest.nColumns = cols; } else { dest.htmlScale = scale; dest.timePerPage = time_ms; } dest.htmlTypeTag = typeTag; } else { dest_gdi.sendCtrlMessage("Remember"); } gdi.disableInput("ApplyList"); } else { if (lastHtmlTarget.empty()) { WCHAR bf[260]; bf[0] = 0; GetCurrentDirectory(260, bf); lastHtmlTarget = bf; lastHtmlTarget += L"\\exported.html"; } dest_gdi.sendCtrlMessage("Automatic"); } } else if (bi.id == "HTML") { oListParam ¶m = currentList.getParam(); int index = 0; vector< pair > ext; ext.push_back(make_pair(L"Webbdokument", L"*.html;*.htm")); wstring file = gdi.browseForSave(ext, L"html", index); if (!file.empty()) { HTMLWriter::reset(); // Force template reload HTMLWriter::write(dest_gdi, file, oe->getName(), param.getContentsDescriptor(*oe), param.pageBreak, typeTag, 0, rows, cols, time_ms, margin, scale); gdi.openDoc(file.c_str()); lastHtmlTarget = file; oe->setProperty("LastExportTarget", file); } } else if (bi.id == "UseRows") { gdi.setInputStatus("Rows", gdi.isChecked(bi.id)); gdi.enableInput("ApplyList"); } else if (bi.id == "Reload") { gdi.setInputStatus("ReloadTime", gdi.isChecked(bi.id)); gdi.enableInput("ApplyList"); } } else if (type == GUI_LISTBOX) { ListBoxInfo lbi = dynamic_cast(info); if (lbi.id == "Format") { htmlDetails(gdi, tmpSettingsParam, html2IdToInfo[lbi.data], lbi.data > 5); gdi.enableInput("ApplyList"); gdi.refresh(); } } else if (type == GUI_INPUTCHANGE) { gdi.enableInput("ApplyList"); } } void TabList::loadClassSettings(gdioutput &gdi, string targetTag) { gdi.clearPage(false); gdi.setCX(gdi.scaleLength(10)); gdi.setCY(gdi.scaleLength(15)); gdi.setColorMode(RGB(242, 240, 250)); gdi.setData("target", targetTag); settingsTarget = targetTag; gdi.addString("", fontMediumPlus, L"Klassval för 'X'#" + currentList.getName()); gdi.dropLine(0.5); gdi.pushX(); // int sx = gdi.getCX() - gdi.scaleLength(5); // int sy = gdi.getCY(); // gdi.dropLine(0.7); makeClassSelection(gdi); oEvent::ClassFilter ct = currentList.isTeamList() ? oEvent::filterOnlyMulti : oEvent::filterNone; oe->fillClasses(gdi, "ListSelection", {}, oEvent::extraNone, ct); gdi.setSelection("ListSelection", currentList.getParam().selection); gdi.dropLine(2.5); gdi.fillDown(); gdi.addSelection("AgeFilter", 200, 150, nullptr, L"Åldersfiltrering:"); vector> ages; ages.emplace_back(lang.tl("Alla"), size_t(oListParam::AgeFilter::All)); ages.emplace_back(lang.tl("Ungdom"), size_t(oListParam::AgeFilter::OnlyYouth)); ages.emplace_back(lang.tl("Vuxna"), size_t(oListParam::AgeFilter::ExludeYouth)); gdi.setItems("AgeFilter", ages); gdi.selectItemByData("AgeFilter", int(currentList.getParam().ageFilter)); gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser", 0, currentList.getParam().pageBreak).setHandler(&settingsClassSelection); gdi.addCheckbox("ShowHeader", "Visa rubrik", 0, currentList.getParam().showHeader).setHandler(&settingsClassSelection); gdi.dropLine(-0.3); wstring hdr; gdi.addInput("Heading", currentList.getParam().getCustomTitle(hdr), 28, 0, L"Egen listrubrik:"); gdi.setInputStatus("Heading", currentList.getParam().showHeader); gdi.dropLine(0.5); gdi.fillRight(); gdi.addButton("UpdateClass", "Uppdatera").setDefault().setHandler(&settingsClassSelection); gdi.addButton("Cancel", "Avbryt").setCancel().setHandler(&settingsClassSelection); gdi.dropLine(2.5); gdi.popX(); gdi.refresh(); } void TabList::handleClassSettings(gdioutput &gdi, BaseInfo &info, GuiEventType type, gdioutput &dest_gdi) { if (type == GUI_BUTTON) { ButtonInfo bi = static_cast(info); if (bi.id == "Cancel") gdi.closeWindow(); else if (bi.id == "UpdateClass") { oListParam ¶m = currentList.getParam(); param.lockUpdate = true; gdi.getSelection("ListSelection", param.selection); auto filter = gdi.getSelectedItem("AgeFilter"); param.ageFilter = oListParam::AgeFilter(filter.first); bool pb = gdi.isChecked("PageBreak"); param.pageBreak = pb; bool sh = gdi.isChecked("ShowHeader"); param.showHeader = sh; param.setCustomTitle(makeDash(trim(gdi.getText("Heading")))); loadPage(dest_gdi); param.lockUpdate = false; gdi.closeWindow(); } else if (bi.id == "PageBreak" || bi.id == "ShowHeader") { gdi.setInputStatus("Heading", gdi.isChecked("ShowHeader")); } } else if (type == GUI_LISTBOX) { ListBoxInfo lbi = static_cast(info); } } void TabList::settingsResultList(gdioutput &gdi) { lastFilledResultClassType = -1; oe->sanityCheck(gdi, true); gdi.fillDown(); gdi.clearPage(false); gdi.addString("", boldLarge, makeDash(L"Resultatlista - inställningar")); //gdi.addSelection("ListType", 200, 300, ListsCB, "Lista"); //oe->fillListTypes(gdi, "ListType", 0); const int boxHeight = 380; gdi.pushY(); gdi.fillDown(); gdi.addListBox("ListSelection", 200, boxHeight, ListsCB, L"Urval:", L"", true); gdi.dropLine(0.5); gdi.fillRight(); gdi.addButton("SelectAll", "Välj allt", ListsCB); gdi.addButton("SelectNone", "Välj inget", ListsCB); gdi.popY(); gdi.setCX(gdi.scaleLength(250)); infoCX = gdi.getCX(); infoCY = gdi.getCY() + gdi.scaleLength(boxHeight) + 2 *gdi.getLineHeight(); gdi.fillDown(); gdi.addString("", 0, "Typ av lista:"); gdi.pushX(); gdi.fillRight(); gdi.addListBox("ResultType", 180, boxHeight, ListsCB); vector< pair > lists; vector< pair > dlists; const MetaListContainer &lc = oe->getListContainer(); lc.getLists(dlists, false, true, !oe->hasTeam(), false); set usedListIx; map tag2ListIx; for (size_t k = 0; k < dlists.size(); k++) { int ix = dlists[k].second; if (lc.isInternal(ix)) tag2ListIx[lc.getTag(ix)] = dlists[k].second + CUSTOM_OFFSET; } lists.reserve(dlists.size() + 10); lists.push_back(make_pair(lang.tl(L"Individuell"), 1)); if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Patrol)) lists.push_back(make_pair(lang.tl(L"Patrull"), 2)); if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Relay)) { lists.push_back(make_pair(lang.tl(L"Stafett - total"), 3)); lists.push_back(make_pair(lang.tl(L"Stafett - sammanställning"), 4)); lists.push_back(make_pair(lang.tl(L"Stafett - sträcka"), getListIx(tag2ListIx, usedListIx, "legresult", 5))); } lists.push_back(make_pair(lang.tl(L"Allmänna resultat"), 6)); size_t startIx = lists.size(); for (size_t k = 0; k < dlists.size(); k++) { int ix = dlists[k].second + CUSTOM_OFFSET; if (usedListIx.count(ix)) continue; lists.push_back(make_pair(dlists[k].first, ix)); } sort(lists.begin() + startIx, lists.end()); gdi.setItems("ResultType", lists); gdi.autoGrow("ResultType"); int lastSelectedResultListOK = -1; for (size_t k = 0; k < lists.size(); k++) { if (lastSelectedResultList == lists[k].second) lastSelectedResultListOK = lists[k].second; } if (lastSelectedResultListOK >= 0) gdi.selectItemByData("ResultType", lastSelectedResultListOK); gdi.fillDown(); gdi.pushX(); gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser", ListsCB, oe->getPropertyInt("pagebreak", 0)!=0); gdi.addCheckbox("ShowHeader", "Visa rubrik", ListsCB, oe->getPropertyInt("showheader", 1) != 0); gdi.addCheckbox("ShowInterResults", "Visa mellantider", 0, lastInterResult, "Mellantider visas för namngivna kontroller."); gdi.addCheckbox("ShowSplits", "Lista med sträcktider", 0, lastSplitState); gdi.addCheckbox("UseLargeSize", "Använd stor font", 0, lastLargeSize); gdi.fillRight(); gdi.popX(); gdi.addString("", 0, "Topplista, N bästa:"); gdi.dropLine(-0.2); if (lastLimitPer == -1) { lastLimitPer = oe->getPropertyInt("classlimit", 0); } wstring lastClassLimit; if (lastLimitPer > 0) lastClassLimit = itow(lastLimitPer); gdi.addInput("ClassLimit", lastClassLimit, 5, 0); gdi.popX(); gdi.dropLine(2); gdi.addString("", 0, "Listparameter:"); gdi.dropLine(-0.2); gdi.addInput("InputNumber", lastInputNumber, 5, 0, L"", L"Ett värde vars tolkning beror på listan."); gdi.disableInput("InputNumber"); gdi.popX(); gdi.dropLine(2); makeFromTo(gdi); gdi.addSelection("LegNumber", 140, 300, ListsCB, L"Sträcka:"); gdi.disableInput("LegNumber"); gdi.popX(); gdi.dropLine(3); gdi.addInput("Title", L"", 32, ListsCB, L"Egen listrubrik:"); gdi.popX(); gdi.dropLine(3.5); createListButtons(gdi); gdi.setRestorePoint("ListInfo"); infoCY = max(infoCY, gdi.getCY()); gdi.setCX(infoCX); gdi.setCY(infoCY); if (lastSelectedResultListOK >= 0) setResultOptionsFromType(gdi, lastSelectedResultListOK); gdi.refresh(); } void TabList::createListButtons(gdioutput &gdi) { gdi.fillRight(); gdi.addButton("Generate", "Skapa listan", ListsCB).setDefault(); gdi.disableInput("Generate"); gdi.addButton("Cancel", "Avbryt", ListsCB).setCancel(); gdi.popX(); } void checkWidth(gdioutput &gdi) { int h,w; gdi.getTargetDimension(w, h); w = max (w, gdi.scaleLength(300)); if (gdi.getCX() + gdi.scaleLength(110) > w) { gdi.popX(); gdi.dropLine(2.5); } } bool TabList::loadPage(gdioutput &gdi, const string &command) { SelectedList = command; offsetX = 0; offsetY = 0; return loadPage(gdi); } bool TabList::loadPage(gdioutput &gdi) { oe->checkDB(); oe->synchronize(); gdi.selectTab(tabId); if (getMethodEditor().isShown(this)) { getMethodEditor().show(this, gdi); gdi.refresh(); return true; } if (getListEditor().isShown(this)) { getListEditor().show(this, gdi); gdi.refresh(); return true; } noReEvaluate = false; gdi.clearPage(false); if (SelectedList!="") { ButtonInfo bi; bi.id=SelectedList; ListsCB(&gdi, GUI_BUTTON, &bi); //gdi.SendCtrlMessage(SelectedList); gdi.setOffset(offsetX, offsetY, false); return 0; } // Make sure all lists are loaded oListInfo li; oe->getListType(EStdNone, li); gdi.addString("", boldLarge, "Listor och sammanställningar"); gdi.addString("", 10, "help:30750"); ClassConfigInfo cnf; oe->getClassConfigurationInfo(cnf); gdi.pushX(); if (!cnf.empty()) { gdi.dropLine(1); gdi.addString("", fontMediumPlus, "Startlistor").setColor(colorDarkGrey); gdi.fillRight(); if (cnf.hasIndividual()) { gdi.addButton("StartIndividual", "Individuell", ListsCB); checkWidth(gdi); if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) gdi.addButton("StartClub", "Klubbstartlista", ListsCB); } if (cnf.hasPatrol()) { checkWidth(gdi); gdi.addButton("StartL:patrolstart", "Patrull", ListsCB).setExtra(AddPatrolClasses); } for (size_t k = 0; k < cnf.raceNStart.size(); k++) { if (cnf.raceNStart[k].size() > 0) { checkWidth(gdi); gdi.addButton("RaceNStart", "Lopp X#" + itos(k + 1), ListsCB, "Startlista ett visst lopp.").setExtra(k); } } if (cnf.hasRelay()) { checkWidth(gdi); gdi.addButton("TeamStartList", "Stafett (sammanställning)", ListsCB); } for (size_t k = 0; k < cnf.legNStart.size(); k++) { if (cnf.legNStart[k].size() > 0) { checkWidth(gdi); gdi.addButton("LegNStart", "Sträcka X#" + itos(k + 1), ListsCB).setExtra(k); } } if (cnf.hasRogainingTeam()) { checkWidth(gdi); gdi.addButton("StartL:teamstartlist", "Rogaining", ListsCB).setExtra(AddRogainingClasses); } checkWidth(gdi); gdi.addButton("MinuteStartList", "Minutstartlista", ListsCB); if (cnf.isMultiStageEvent()) { checkWidth(gdi); gdi.addButton("StartL:inputresult", "Input Results", ListsCB); } gdi.dropLine(3); gdi.fillDown(); gdi.popX(); gdi.addString("", fontMediumPlus, "Resultatlistor").setColor(colorDarkGrey); gdi.fillRight(); if (cnf.hasIndividual()) { gdi.addButton("ResultIndividual", "Individuell", ListsCB); checkWidth(gdi); } if (cnf.hasPatrol()) { gdi.addButton("Result:patrolresult", "Patrull", ListsCB).setExtra(AddPatrolClasses); checkWidth(gdi); } if (cnf.hasIndividual()) { gdi.addButton("Result:liveresultradio", "Liveresultat", ListsCB); checkWidth(gdi); gdi.addButton("Result:latestresult", "Latest Results", ListsCB).setExtra(AddAllClasses); checkWidth(gdi); if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { gdi.addButton("ResultClub", "Klubbresultat", ListsCB); checkWidth(gdi); } gdi.addButton("ResultIndSplit", "Sträcktider", ListsCB); if (cnf.isMultiStageEvent()) { checkWidth(gdi); gdi.addButton("Result:stageresult", "Etappresultat", ListsCB); checkWidth(gdi); gdi.addButton("Result:finalresult", "Slutresultat", ListsCB); } } if (!cnf.knockout.empty()) { checkWidth(gdi); gdi.addButton("KnockoutTotal", "Knockout sammanställning", ListsCB); } if (!cnf.lapcountsingle.empty()) { checkWidth(gdi); gdi.addButton("LapCount", "Varvräkning", ListsCB); } if (!cnf.lapcountextra.empty()) { checkWidth(gdi); gdi.addButton("LapCountExtra", "Varvräkning med mellantid", ListsCB); } bool hasMulti = false; for (size_t k = 0; k < cnf.raceNStart.size(); k++) { if (cnf.raceNRes[k].size() > 0) { checkWidth(gdi); gdi.addButton("RaceNRes", "Lopp X#" + itos(k + 1), ListsCB, "Resultat för ett visst lopp.").setExtra(k); hasMulti = true; } } if (hasMulti) { checkWidth(gdi); gdi.addButton("MultiResults", "Alla lopp", ListsCB, "Individuell resultatlista, sammanställning av flera lopp."); } if (cnf.hasRelay()) { checkWidth(gdi); gdi.addButton("TeamResults", "Stafett (sammanställning)", ListsCB); } for (map >::const_iterator it = cnf.legResult.begin(); it != cnf.legResult.end(); ++it) { checkWidth(gdi); gdi.addButton("LegNResult", "Sträcka X#" + itos(it->first + 1), ListsCB).setExtra(it->first); } if (cnf.hasRogaining()) { checkWidth(gdi); gdi.addButton("Result:rogainingind", "Rogaining", ListsCB).setExtra(AddRogainingClasses); } if (cnf.hasRogainingTeam()) { checkWidth(gdi); gdi.addButton("Result:teamrogainingresult", "Rogaining", ListsCB).setExtra(AddTeamRogaining); } checkWidth(gdi); gdi.addButton("ResultList", "Avancerat...", ListsCB); gdi.fillDown(); gdi.popX(); gdi.dropLine(3); } MetaListContainer &lc = oe->getListContainer(); if (lc.getNumLists(MetaListContainer::ExternalList) > 0) { bool init = false; for (int k = 0; k < lc.getNumLists(); k++) { if (lc.isExternal(k) && !lc.isSplitPrintList(k)) { if (!init) { gdi.addString("", fontMediumPlus, "Egna listor").setColor(colorDarkGrey); gdi.fillRight(); gdi.pushX(); init = true; } MetaList &mc = lc.getList(k); checkWidth(gdi); gdi.addButton("CustomList", mc.getListName(), ListsCB).setExtra(k); } } if (init) { gdi.popX(); gdi.dropLine(3); gdi.fillDown(); } } vector< pair > savedParams; lc.getListParam(savedParams); if (savedParams.size() > 0) { gdi.addString("", fontMediumPlus, "Sparade listval").setColor(colorDarkGrey); gdi.fillRight(); gdi.pushX(); gdi.addSelection("SavedInstance", 250, 200, ListsCB); gdi.setItems("SavedInstance", savedParams); gdi.autoGrow("SavedInstance"); gdi.selectFirstItem("SavedInstance"); gdi.addButton("ShowSaved", "Visa", ListsCB); gdi.addButton("RenameSaved", "Döp om", ListsCB); gdi.addButton("MergeSaved", "Slå ihop...", ListsCB); gdi.addButton("SplitSaved", "Dela upp...", ListsCB); bool split = oe->getListContainer().canSplit(savedParams[0].second); gdi.setInputStatus("SplitSaved", split); gdi.addButton("RemoveSaved", "Ta bort", ListsCB); gdi.popX(); gdi.dropLine(3); gdi.fillDown(); } gdi.addString("", fontMediumPlus, "Rapporter").setColor(colorDarkGrey); gdi.fillRight(); gdi.pushX(); bool hasVac = false; bool hasAPIEntry = false; bool hasModifiedCard = false; { vector rr; oe->getRunners(0, 0, rr, false); for (pRunner r : rr) { if (r->isVacant()) hasVac = true; if (r->hasFlag(oRunner::FlagAddedViaAPI)) hasAPIEntry = true; if (r->getCard() && r->getCard()->isOriginalCard() == oCard::PunchOrigin::Manual) hasModifiedCard = true; } } if (hasModifiedCard) { gdi.addButton("GenLst:modifiedcard", "Modifierade resultat", ListsCB); checkWidth(gdi); } gdi.addButton("InForestList", "Kvar-i-skogen", ListsCB, "tooltip:inforest").setExtra(IgnoreLimitPer); if (cnf.hasIndividual()) { gdi.addButton("PriceList", "Prisutdelningslista", ListsCB); } gdi.addButton("PreReport", "Kör kontroll inför tävlingen...", ListsCB); checkWidth(gdi); if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy) && cnf.hasIndividual()) { gdi.addButton("GenLst:unexpectedfee", "Unexpected Fee", ListsCB); checkWidth(gdi); } if (cnf.hasMultiCourse) { gdi.addButton("CourseReport", "Bantilldelning", ListsCB).setExtra(IgnoreLimitPer); checkWidth(gdi); if (cnf.hasTeamClass()) { gdi.addButton("GenLst:courseteamtable", "Gafflingar i tabellformat", ListsCB, "Från den här listan kan man skapa etiketter att klistra på kartor"); checkWidth(gdi); } } if (cnf.hasTeamClass()) { gdi.addButton("GenLst:teamchanges", "Lagändringblankett", ListsCB).setExtra(AddTeamClasses | ForcePageBreak); checkWidth(gdi); } if (hasVac) { gdi.addButton("GenLst:vacnacy", "Vakanser", ListsCB); checkWidth(gdi); } if (hasAPIEntry) { gdi.addButton("GenLst:apientry", "EFilterAPIEntry", ListsCB); checkWidth(gdi); } if (oe->getMeOSFeatures().withCourses(oe)) { gdi.addButton("GenLst:courseusage", "Bananvändning", ListsCB); checkWidth(gdi); gdi.addButton("GenLst:controloverview", "Kontroller", ListsCB); checkWidth(gdi); gdi.addButton("GenLst:controlstatistics", "Control Statistics", ListsCB); checkWidth(gdi); } if (cnf.hasRentedCard) gdi.addButton("HiredCards", "Hyrbricksrapport", ListsCB).setExtra(IgnoreLimitPer); gdi.popX(); gdi.dropLine(3); RECT rc; rc.left = gdi.getCX(); gdi.setCX(rc.left + gdi.scaleLength(10)); rc.top = gdi.getCY(); gdi.dropLine(0.5); gdi.addString("", fontMediumPlus, "Inställningar").setColor(colorDarkGrey); gdi.setCX(rc.left + gdi.scaleLength(10)); gdi.dropLine(2); gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser / klubbar", ListsCB, oe->getPropertyInt("pagebreak", 0)!=0); gdi.addCheckbox("ShowHeader", "Visa rubrik", ListsCB, oe->getPropertyInt("showheader", 1) != 0); gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", ListsCB, oe->getPropertyInt("splitanalysis", 1)!=0); gdi.setCX(rc.left + gdi.scaleLength(10)); gdi.dropLine(2); gdi.addString("", 0, "Begränsning, antal visade per klass: "); gdi.dropLine(-0.2); gdi.addSelection("ClassLimit", 70, 350, ListsCB); gdi.addItem("ClassLimit", lang.tl("Ingen"), 0); for (int k = 1; k<=12+9; k++) { int v = k; if (v>12) v=(v-11)*10; gdi.addItem("ClassLimit", itow(v), v); } gdi.selectItemByData("ClassLimit", oe->getPropertyInt("classlimit", 0)); gdi.dropLine(2); rc.bottom = gdi.getCY(); rc.right = gdi.getWidth() - gdi.scaleLength(5); gdi.addRectangle(rc, colorLightBlue); gdi.dropLine(1.5); gdi.popX(); gdi.addButton("GeneralList", "Alla listor...", ListsCB); gdi.addButton("EditList", "Redigera lista...", ListsCB); gdi.addButton("ImportCustom", "Hantera egna listor...", ListsCB); checkWidth(gdi); gdi.addButton("EditMethod", "Result Modules...", ListsCB); //gdi.registerEvent("DataUpdate", ListsEventCB); gdi.refresh(); gdi.setOnClearCb(ListsCB); offsetY=0; offsetX=0; gdi.refresh(); return true; } void TabList::enableWideFormat(gdioutput &gdi, bool wide) { if (gdi.hasWidget("NumPerPage")) { gdi.setInputStatus("NumPerPage", wide); bool needTime = gdi.getSelectedItem("NumPerPage").first != 1; gdi.setInputStatus("MaxWaitTime", wide & needTime); } } void TabList::splitPrintSettings(oEvent &oe, gdioutput &gdi, bool setupPrinter, TabType returnMode, PrintSettingsSelection type) { if (!gdi.canClear()) return; gdi.clearPage(false); gdi.fillDown(); if (type == Splits) gdi.addString("", boldLarge, "Inställningar sträcktidsutskrift"); else gdi.addString("", boldLarge, "Inställningar startbevis"); gdi.dropLine(); gdi.pushX(); if (!oe.empty() && type == Splits) { gdi.fillRight(); gdi.addSelection("SplitPrintList", 200, 200, ListsCB, L"Sträcktidslista:"); vector> lists; oe.getListContainer().getLists(lists, false, false, false, true); lists.insert(lists.begin(), make_pair(lang.tl("Standard"), -10)); lists.insert(lists.begin(), make_pair(lang.tl("Automatisk"), -11)); gdi.setItems("SplitPrintList", lists); gdi.autoGrow("SplitPrintList"); gdi.dropLine(0.8); gdi.addButton("EditPS", "Redigera...", ListsCB); if (setupPrinter) gdi.addButton("PrinterSetup", "Skrivare...", ListsCB, "Skrivarinställningar"); gdi.dropLine(2.8); gdi.fillDown(); gdi.popX(); gdi.addString("", 10, "info:customsplitprint"); gdi.dropLine(); wstring listId = oe.getDCI().getString("SplitPrint"); EStdListType type = EStdListType::EStdNone; if (listId.length() > 1) type = oe.getListContainer().getCodeFromUnqiueId(gdioutput::narrow(listId)); gdi.setInputStatus("EditPS", type != EStdListType::EStdNone); if (listId == L"*") gdi.selectItemByData("SplitPrintList", -10); // Standard else if (type == EStdListType::EStdNone) gdi.selectFirstItem("SplitPrintList"); // Automatisk else { for (auto& t : lists) { if (type == oe.getListContainer().getType(t.second)) gdi.selectItemByData("SplitPrintList", t.second); } } //if () /* bool withSplitAnalysis = (oe.getDCI().getInt("Analysis") & 1) == 0; bool withSpeed = (oe.getDCI().getInt("Analysis") & 2) == 0; bool withResult = (oe.getDCI().getInt("Analysis") & 4) == 0; gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", 0, withSplitAnalysis); gdi.addCheckbox("Speed", "Med km-tid", 0, withSpeed); gdi.addCheckbox("Results", "Med resultat", 0, withResult);*/ } else if (setupPrinter) { gdi.dropLine(0.2); gdi.addButton("PrinterSetup", "Skrivare...", ListsCB, "Skrivarinställningar"); } gdi.popX(); RECT rc; rc.top = gdi.getCY(); rc.left = gdi.getCX(); gdi.setCX(gdi.getCX() + gdi.scaleLength(8)); gdi.dropLine(); const char *ctype = type == Splits ? "SPExtra" : "EntryExtra"; customTextLines(oe, ctype, !oe.empty(), gdi); gdi.dropLine(); rc.right = gdi.getWidth(); rc.bottom = gdi.getCY(); gdi.addRectangle(rc, colorLightCyan); if (type == Splits) { gdi.dropLine(1.5); const bool wideFormat = oe.getPropertyInt("WideSplitFormat", 0) == 1; gdi.addCheckbox("WideFormat", "Sträcktider i kolumner (för standardpapper)", ListsCB, wideFormat); if (returnMode == TSITab) { int printLen = oe.getPropertyInt("NumSplitsOnePage", 3); vector< pair > nsp; for (size_t j = 1; j < 8; j++) nsp.push_back(make_pair(itow(j), j)); gdi.addSelection("NumPerPage", 90, 200, ListsCB, L"Max antal brickor per sida"); gdi.setItems("NumPerPage", nsp); gdi.selectItemByData("NumPerPage", printLen); int maxWait = oe.getPropertyInt("SplitPrintMaxWait", 60); gdi.addInput("MaxWaitTime", itow(maxWait), 8, 0, L"Längsta tid i sekunder att vänta med utskrift"); enableWideFormat(gdi, wideFormat); } } gdi.dropLine(); gdi.fillRight(); gdi.setData("Type", ctype); gdi.addButton("SavePS", "OK", ListsCB).setDefault().setExtra(returnMode); gdi.addButton("CancelPS", "Avbryt", ListsCB).setCancel().setExtra(returnMode); gdi.refresh(); } void TabList::saveExtraLines(oEvent &oe, const char *dataField, gdioutput &gdi) { vector< pair > lines; for (int k = 0; k < 5; k++) { string row = "row"+itos(k); string key = "font"+itos(k); ListBoxInfo lbi; gdi.getSelectedItem(key, lbi); wstring r = gdi.getText(row); lines.push_back(make_pair(r, lbi.data)); } oe.setExtraLines(dataField, lines); } void TabList::customTextLines(oEvent &oe, const char *dataField, bool withSymbols, gdioutput &gdi) { gdi.addString("", fontMediumPlus, "Egna textrader"); if (withSymbols) { gdi.dropLine(0.3); gdi.addString("", 10, "help:custom_text_lines"); } gdi.dropLine(0.8); int yp = gdi.getCY(); vector< pair > fonts; vector< pair > lines; MetaListPost::getAllFonts(fonts); oe.getExtraLines(dataField, lines); int xp = gdi.getCX(); for (int k = 0; k < 5; k++) { gdi.fillRight(); gdi.pushX(); string row = "row"+itos(k); gdi.addInput(row, L"", 24); string key = "font"+itos(k); gdi.addSelection(key, 100, 100); gdi.setItems(key, fonts); if (lines.size() > size_t(k)) { gdi.selectItemByData(key.c_str(), lines[k].second); gdi.setText(row, lines[k].first); } else gdi.selectFirstItem(key); xp = max(xp, gdi.getCX()); gdi.popX(); gdi.fillDown(); gdi.dropLine(2); } if (withSymbols) { gdi.pushX(); gdi.pushY(); gdi.setCX(xp); gdi.setCY(yp); gdi.addListBox("Symbols", 500, 160); gdi.setTabStops("Symbols", 300); vector < pair> symb; MetaList::fillSymbols(symb); gdi.setItems("Symbols", symb); gdi.popX(); gdi.popY(); } } void TabList::liveResult(gdioutput &gdi, oListInfo &li) { if (liveResults.empty() || !liveResults.back()) { liveResults.push_back(0); LiveResult *lr = new LiveResult(oe); liveResults.back() = lr; } liveResults.back()->showTimer(gdi, li); } EStdListType TabList::getTypeFromResultIndex(int ix) const { switch(ix) { case 1: return EStdResultList; case 2: return oe->getListContainer().getType("patrolresult"); case 3: return EStdTeamResultListAll; case 4: return EStdTeamResultList; //case 5: // return EStdTeamResultListLeg; case 6: return EGeneralResultList; default: if (ix >= CUSTOM_OFFSET) { int index = ix - CUSTOM_OFFSET; const string &uid = oe->getListContainer().getList(index).getUniqueId(); return oe->getListContainer().getCodeFromUnqiueId(uid); } } return EStdNone; } void TabList::setResultOptionsFromType(gdioutput &gdi, int data) { bool builtIn = data < CUSTOM_OFFSET; wstring info, title; bool hasResMod = false; oListInfo li; EStdListType type = getTypeFromResultIndex(data); oe->getListType(type, li); ListBoxInfo lbi; if (gdi.getSelectedItem("LegNumber", lbi) && int(lbi.data) >= 0) lastLeg = lbi.data; if (builtIn) { enableFromTo(*oe, gdi, data==1 || data==6, data==1 || data==6); if (data==6) { gdi.enableInput("UseLargeSize"); } else { gdi.disableInput("UseLargeSize"); gdi.check("UseLargeSize", false); } gdi.setInputStatus("ShowInterResults", builtIn); gdi.setInputStatus("ShowSplits", builtIn); set clsUnused; vector< pair > out; oe->fillLegNumbers(clsUnused, li.isTeamList(), true, out); gdi.setItems("LegNumber", out); gdi.setInputStatus("LegNumber", !out.empty()); if (!out.empty() && lastLeg >= 0) gdi.selectItemByData("LegNumber", lastLeg); gdi.setInputStatus("InputNumber", false); } else { gdi.setInputStatus("UseLargeSize", li.supportLarge); gdi.setInputStatus("InputNumber", li.supportParameter); if (li.supportLegs) { gdi.enableInput("LegNumber"); set clsUnused; vector< pair > out; oe->fillLegNumbers(clsUnused, li.isTeamList(), true, out); gdi.setItems("LegNumber", out); if (!out.empty() && lastLeg >= 0) gdi.selectItemByData("LegNumber", lastLeg); gdi.setInputStatus("LegNumber", !out.empty()); } else { ListBoxInfo lbi; if (gdi.getSelectedItem("LegNumber", lbi) && int(lbi.data) >= 0) lastLeg = lbi.data; gdi.disableInput("LegNumber"); gdi.clearList("LegNumber"); } enableFromTo(*oe, gdi, li.supportFrom, li.supportTo); } if (!builtIn) { int index = data - CUSTOM_OFFSET; const MetaList &ml = oe->getListContainer().getList(index); info = ml.getListInfo(*oe); title = ml.getListName(); hasResMod = !ml.getResultModule().empty(); } if (info.empty() && gdi.getText("ListInfo", true).empty()) { // Do nothing } else { gdi.restore("ListInfo", false); gdi.setCX(infoCX); gdi.setCY(infoCY); if (!info.empty()) { gdi.setRestorePoint("ListInfo"); gdi.fillDown(); gdi.addString("", fontMediumPlus, title); gdi.dropLine(0.3); gdi.addString("ListInfo", 10, info); gdi.dropLine(0.7); } //createListButtons(gdi); gdi.refresh(); } oEvent::ClassFilter ct = li.isTeamList() ? oEvent::filterOnlyMulti : oEvent::filterNone; set curSel; gdi.getSelection("ListSelection", curSel); if (lastFilledResultClassType != ct) { lastFilledResultClassType = ct; lastResultClassSelection.insert(curSel.begin(), curSel.end()); oe->fillClasses(gdi, "ListSelection", {}, oEvent::extraNone, ct); gdi.setSelection("ListSelection", lastResultClassSelection); } gdi.setInputStatus("Generate", data >= 0 && hasSelectedClass(gdi)); } bool TabList::hasSelectedClass(gdioutput& gdi) { set sel; gdi.getSelection("ListSelection", sel); return !sel.empty(); } void TabList::clearCompetitionData() { SelectedList = ""; lastResultClassSelection.clear(); lastClassSelection.clear(); ownWindow = false; hideButtons = false; currentListType=EStdNone; noReEvaluate = false; infoCX = 0; infoCY = 0; lastLimitPer = -1; lastInterResult = false; lastSplitState = false; lastLargeSize = false; lastSelectedResultList = -1; lastLeg = 0; lastFilledResultClassType = -1; listEditor.reset(); methodEditor.reset(); } void TabList::setAnimationMode(gdioutput &gdi) { auto par = currentList.getParam(); gdi.setAnimationMode(make_shared(gdi, par.timePerPage, par.nColumns, par.margin, par.animate, par.pageBreak)); } void TabList::getStartIndividual(oListParam &par, ClassConfigInfo &cnf){ par.listCode = EStdStartList; par.setLegNumberCoded(-1); cnf.getIndividual(par.selection, true); } void TabList::getStartClub(oListParam &par) { par.listCode = EStdClubStartList; par.setLegNumberCoded(-1); } void TabList::getResultIndividual(oListParam &par, ClassConfigInfo &cnf) { cnf.getIndividual(par.selection, false); par.listCode = EStdResultList; par.showInterTimes = true; par.setLegNumberCoded(-1); } void TabList::getResultClub(oListParam &par, ClassConfigInfo &cnf) { par.listCode = EStdClubResultList; par.setLegNumberCoded(-1); cnf.getIndividual(par.selection, true); cnf.getPatrol(par.selection); } void TabList::getStartPatrol(oEvent &oe, oListParam &par, ClassConfigInfo &cnf) { par.listCode = oe.getListContainer().getType("patrolstart"); cnf.getPatrol(par.selection); } void TabList::getResultPatrol(oEvent &oe, oListParam &par, ClassConfigInfo &cnf) { par.listCode = oe.getListContainer().getType("patrolresult"); cnf.getPatrol(par.selection); } void TabList::getStartTeam(oListParam &par, ClassConfigInfo &cnf) { par.listCode = EStdTeamStartList; cnf.getRelay(par.selection); par.setLegNumberCoded(0); } void TabList::getResultTeam(oListParam &par, ClassConfigInfo &cnf) { par.listCode = EStdTeamResultListAll; cnf.getRelay(par.selection); } void TabList::getResultRogaining(oListParam &par, ClassConfigInfo &cnf) { par.listCode = ERogainingInd; cnf.getRogaining(par.selection); } void TabList::getPublicLists(oEvent &oe, vector &lists) { lists.clear(); ClassConfigInfo cnf; oe.getClassConfigurationInfo(cnf); if (!cnf.empty()) { if (cnf.hasIndividual()) { lists.push_back(oListParam()); getStartIndividual(lists.back(), cnf); if (oe.getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { lists.push_back(oListParam()); getStartClub(lists.back()); } } if (cnf.hasRelay()) { lists.push_back(oListParam()); getStartTeam(lists.back(), cnf); } if (cnf.hasPatrol()) { lists.push_back(oListParam()); getStartPatrol(oe, lists.back(), cnf); } if (cnf.isMultiStageEvent()) { //gdi.addButton("StartL:inputresult", "Input Results", ListsCB); } if (cnf.hasIndividual()) { lists.push_back(oListParam()); getResultIndividual(lists.back(), cnf); if (oe.getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { lists.push_back(oListParam()); getResultClub(lists.back(), cnf); } //gdi.addButton("ResultIndSplit", "Sträcktider", ListsCB); if (cnf.isMultiStageEvent()) { //gdi.addButton("Result:stageresult", "Etappresultat", ListsCB); //gdi.addButton("Result:finalresult", "Slutresultat", ListsCB); } } if (cnf.hasRelay()) { lists.push_back(oListParam()); getResultTeam(lists.back(), cnf); } if (cnf.hasPatrol()) { lists.push_back(oListParam()); getResultPatrol(oe, lists.back(), cnf); } } MetaListContainer &lc = oe.getListContainer(); vector< pair > savedParams; lc.getListParam(savedParams); for (auto &p : savedParams) { oListParam &par = lc.getParam(p.second); lists.push_back(par); } if (cnf.hasIndividual()) { //gdi.addButton("PriceList", "Prisutdelningslista", ListsCB); } } void TabList::readSettings(gdioutput &gdi, oListParam &par, bool forResult) { par.pageBreak = gdi.isChecked("PageBreak"); par.showHeader = gdi.isChecked("ShowHeader"); if (forResult) { par.splitAnalysis = gdi.isChecked("SplitAnalysis"); par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; } } MethodEditor &TabList::getMethodEditor() { if (!methodEditor) methodEditor = make_shared(oe); return *methodEditor; } ListEditor &TabList::getListEditor() { if (!listEditor) listEditor = make_shared(oe); return *listEditor; } ListEditor *TabList::getListEditorPtr() const { return listEditor.get(); }