void MapWindow::DrawAspNearest(LKSurface& Surface, const RECT& rc) { SIZE ASPTextSize, DSTextSize, BETextSize, TYTextSize, ACTextSize, HLTextSize, MITextSize; SIZE phdrTextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXNEARAIRSPACES][MAXAIRSPACENUMPAGES][30], Buffer2[MAXNEARAIRSPACES][MAXAIRSPACENUMPAGES][12]; static TCHAR Buffer3[MAXNEARAIRSPACES][MAXAIRSPACENUMPAGES][12]; static TCHAR Buffer4[MAXNEARAIRSPACES][MAXAIRSPACENUMPAGES][12], Buffer5[MAXNEARAIRSPACES][MAXAIRSPACENUMPAGES][12]; static short s_maxnlname; static TCHAR s_trailspace[3]; short i, j, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double value; LKColor rcolor; // column0 starts after writing 1:2 (ModeIndex:CURTYPE+1) with a different font.. static short Column0; static short Column1, Column2, Column3, Column4, Column5; static POINT p1, p2; static short s_rawspace; static unsigned short lincr; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused // we lock to current mapspace for this drawing short curmapspace=MapSpaceMode; static int AspNumraws=0; static bool usetwolines=0; // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) BrushReference sortbrush; RECT invsel; if (INVERTCOLORS) { sortbrush=LKBrush_LightGreen; } else { sortbrush=LKBrush_DarkGreen; } if (DoInit[MDI_DRAWASPNEAREST]) { usetwolines=UseTwoLines; // Set screen borders to avoid writing on extreme pixels if ( !ScreenLandscape ) { // Portrait mode can work on two rows left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); s_maxnlname=7; _stprintf(Buffer,TEXT("AKSJSMMMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; s_maxnlname=15; _stprintf(Buffer,TEXT("ABCDEF GHIJK-LM")); // now resize for tuning on resolutions if (ScreenSize == ss320x240) s_maxnlname=9; if (ScreenSize == ss400x240) s_maxnlname=10; } Buffer[s_maxnlname]='\0'; /// WPT is now AIRSPACE name Surface.SelectObject(LK8InfoBigFont); // Text font for Nearest was LK8Title Surface.GetTextSize(Buffer, _tcslen(Buffer), &ASPTextSize); // DST is always distance _stprintf(Buffer,TEXT("000.0")); Surface.GetTextSize(Buffer, _tcslen(Buffer), &DSTextSize); // Bearing _stprintf(Buffer,TEXT("<<123")); Surface.GetTextSize(Buffer, _tcslen(Buffer), &BETextSize); // TYPE, 4 letters printed #define LKASP_TYPE_LEN 4 _stprintf(Buffer,TEXT("CTRA")); Surface.GetTextSize(Buffer, _tcslen(Buffer), &TYTextSize); // Flags can be SFE, three chars _stprintf(Buffer,TEXT("SFE")); Surface.GetTextSize(Buffer, _tcslen(Buffer), &ACTextSize); Surface.SelectObject(LK8InfoNormalFont); _stprintf(Buffer,TEXT("MMMM")); Surface.GetTextSize(Buffer, _tcslen(Buffer), &HLTextSize); Surface.SelectObject(LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); Surface.GetTextSize(Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+ASPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-TYTextSize.cx-ACTextSize.cx)/3; // Col0 is where ASP 1/3 can be written, after ModeIndex:Curtype Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left if (ScreenLandscape || !usetwolines) { Column2=afterwpname+TYTextSize.cx; // TY align right Column3=Column2+intercolumn+DSTextSize.cx; // DS align right Column4=Column3+intercolumn+BETextSize.cx; // BE align right Column5=Column4+intercolumn+ACTextSize.cx; // AC align right } else { Surface.SelectObject(LK8PanelMediumFont); Surface.GetTextSize(_T("2.4_ASP_3/3_"), 12, &phdrTextSize); int s=(rc.right - phdrTextSize.cx)/4; Column5= right - NIBLSCALE(2); Column4= Column5 - s; Column3= Column4 - s; Column2= Column3 - s; } if ( !ScreenLandscape ) { if (usetwolines) { lincr=2; TopSize=rc.top+HEADRAW*2+ASPTextSize.cy; } else { lincr=1; TopSize=rc.top+HEADRAW*2+HLTextSize.cy; } p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; AspNumraws=(bottom - TopSize) / (ASPTextSize.cy+(INTERRAW*2)); if (AspNumraws>MAXNEARAIRSPACES) AspNumraws=MAXNEARAIRSPACES; s_rawspace=(ASPTextSize.cy+INTERRAW); Column5=rc.right-NIBLSCALE(1)-1; _tcscpy(s_trailspace,_T("")); } else { lincr=1; TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; AspNumraws=(bottom - TopSize) / (ASPTextSize.cy+INTERRAW); if (AspNumraws>MAXNEARAIRSPACES) AspNumraws=MAXNEARAIRSPACES; s_rawspace=(ASPTextSize.cy+INTERRAW); _tcscpy(s_trailspace,_T(" ")); } #define INTERBOX intercolumn/2 s_sortBox[0].left=Column0; if (!ScreenLandscape && usetwolines) { s_sortBox[0].right=phdrTextSize.cx; } else { if ( !ScreenLandscape ) s_sortBox[0].right= left+ASPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+ASPTextSize.cx-NIBLSCALE(10); } s_sortBox[0].top=2; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_AIRSPACES][0]=s_sortBox[0].right; if (!ScreenLandscape && usetwolines) { s_sortBox[1].left=s_sortBox[0].right; } else { if ( !ScreenLandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); } if (!ScreenLandscape && usetwolines) s_sortBox[1].right=Column2+NIBLSCALE(2); else s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=2; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_AIRSPACES][1]=s_sortBox[1].right; if (!ScreenLandscape && usetwolines) { s_sortBox[2].left=Column2+NIBLSCALE(2); s_sortBox[2].right=Column3+NIBLSCALE(2); } else { s_sortBox[2].left=Column2+INTERBOX; s_sortBox[2].right=Column3+INTERBOX; } s_sortBox[2].top=2; s_sortBox[2].bottom=p1.y; SortBoxX[MSM_AIRSPACES][2]=s_sortBox[2].right; if (!ScreenLandscape && usetwolines) { s_sortBox[3].left=Column3+NIBLSCALE(2); s_sortBox[3].right=Column4+NIBLSCALE(2); } else { s_sortBox[3].left=Column3+INTERBOX; s_sortBox[3].right=Column4+INTERBOX; } s_sortBox[3].top=2; s_sortBox[3].bottom=p1.y; SortBoxX[MSM_AIRSPACES][3]=s_sortBox[3].right; if (!ScreenLandscape && usetwolines) { s_sortBox[4].left=Column4+NIBLSCALE(2); s_sortBox[4].right=rc.right-1; } else { s_sortBox[4].left=Column4+INTERBOX; s_sortBox[4].right=rc.right-1; } s_sortBox[4].top=2; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_AIRSPACES][4]=s_sortBox[4].right; SortBoxY[MSM_AIRSPACES]=p1.y; AspNumpages=roundupdivision(MAXNEARAIRSPACES*lincr, AspNumraws); if (AspNumpages>MAXAIRSPACENUMPAGES) AspNumpages=MAXAIRSPACENUMPAGES; else if (AspNumpages<1) AspNumpages=1; SelectedRaw[MSM_AIRSPACES]=0; SelectedPage[MSM_AIRSPACES]=0; DoInit[MDI_DRAWASPNEAREST]=false; return; } // doinit bool ndr; ndr=DoAirspaces(&DrawInfo, &DerivedDrawInfo); AspNumpages=roundupdivision(LKNumAirspaces*lincr, AspNumraws); if (AspNumpages>MAXAIRSPACENUMPAGES) AspNumpages=MAXAIRSPACENUMPAGES; else if (AspNumpages<1) AspNumpages=1; curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXAIRSPACENUMPAGES) { // TODO also >Numpages SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: LKevent=LKEVENT_NONE; i=LKSortedAirspaces[SelectedRaw[curmapspace] + (curpage*AspNumraws/lincr)]; if ( ValidAirspace(i)) { CCriticalSection::CGuard guard(CAirspaceManager::Instance().MutexRef()); CAirspaceManager::Instance().PopupAirspaceDetail(LKAirspaces[i].Pointer); } LKevent=LKEVENT_NONE; return; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=AspNumraws) SelectedRaw[curmapspace]=0; break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=AspNumraws-1; break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXNEARAIRSPACES; i++) { for (k=0; k<MAXAIRSPACENUMPAGES; k++) { _stprintf(Buffer1[i][k], _T("----------------------------")); // max 30 Buffer1[i][k][s_maxnlname+7]='\0'; // some more dashes _stprintf(Buffer2[i][k],_T("----")); _stprintf(Buffer3[i][k],_T("----")); _stprintf(Buffer4[i][k],_T("----")); _stprintf(Buffer5[i][k],_T(" ")); } } break; case LKEVENT_NEWPAGE: break; default: LKevent=LKEVENT_NONE; break; } if (INVERTCOLORS) Surface.DrawLine(PEN_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else Surface.DrawLine(PEN_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); Surface.SelectObject(LK8InfoNormalFont); // Heading line short cursortbox=SortedMode[curmapspace]; if ( !ScreenLandscape ) { // portrait mode Surface.FillRect(&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); Surface.SelectObject(LK8PanelMediumFont); LKWriteText(Surface, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); Surface.SelectObject(LK8InfoNormalFont); _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1642_")), curpage+1, AspNumpages); // ASP if (cursortbox == 0) LKWriteText(Surface, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); _tcscpy(Buffer,gettext(TEXT("_@M752_"))); // Type if (cursortbox==1) LKWriteText(Surface, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _tcscpy(Buffer,gettext(TEXT("_@M1300_"))); // Dist if (cursortbox==2) LKWriteText(Surface, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _tcscpy(Buffer,gettext(TEXT("_@M1301_"))); // Dir if (cursortbox==3) LKWriteText(Surface, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // Active mode _tcscpy(Buffer,TEXT("*")); if (cursortbox==4) LKWriteText(Surface, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { Surface.FillRect(&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); Surface.SelectObject(LK8PanelMediumFont); LKWriteText(Surface, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); Surface.SelectObject(LK8InfoNormalFont); _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1642_")), curpage+1, AspNumpages); // ASP if (cursortbox==0) LKWriteText(Surface, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); _tcscpy(Buffer,gettext(TEXT("_@M752_"))); // Type if (cursortbox==1) LKWriteText(Surface, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _tcscpy(Buffer,gettext(TEXT("_@M1300_"))); // Dist if (cursortbox==2) LKWriteText(Surface, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _tcscpy(Buffer,gettext(TEXT("_@M1301_"))); // dir if (cursortbox==3) LKWriteText(Surface, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer,TEXT("*")); if (cursortbox==4) LKWriteText(Surface, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(Surface, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } // landscape mode Surface.SelectObject(LK8InfoBigFont); // Text font for Nearest int *psortedindex; psortedindex=LKSortedAirspaces; for (i=0, j=0, drawn_items_onpage=0; i<AspNumraws; j++, i+=lincr) { iRaw=TopSize+(s_rawspace*i); short curraw=(curpage*AspNumraws); if (!ScreenLandscape && usetwolines) { curraw/=2; curraw+=j; } else { curraw+=i; } if (curraw>=MAXNEARAIRSPACES) break; rli=*(psortedindex+curraw); if (!ndr) { goto KeepOldValues; } if ( ValidAirspace(rli) ) { // // AIRSPACE NAME // wlen=_tcslen(LKAirspaces[rli].Name); if (!ScreenLandscape && usetwolines) { LK_tcsncpy(Buffer, LKAirspaces[rli].Name, 15); } else { if (wlen>s_maxnlname) { LK_tcsncpy(Buffer, LKAirspaces[rli].Name, s_maxnlname); } else { LK_tcsncpy(Buffer, LKAirspaces[rli].Name, wlen); } } CharUpper(Buffer); _tcscpy(Buffer1[i][curpage],Buffer); // // AIRSPACE TYPE // wlen=_tcslen(LKAirspaces[rli].Type); if (wlen>LKASP_TYPE_LEN) { LK_tcsncpy(Buffer, LKAirspaces[rli].Type, LKASP_TYPE_LEN); } else { LK_tcsncpy(Buffer, LKAirspaces[rli].Type, wlen); } CharUpper(Buffer); _tcscpy(Buffer2[i][curpage],Buffer); // // AIRSPACE DISTANCE // switch(LKAirspaces[rli].WarningLevel) { case awYellow: value=LKAirspaces[rli].Distance*DISTANCEMODIFY; if (!ScreenLandscape && usetwolines) _stprintf(Buffer3[i][curpage],TEXT("%0.1lf%s!"),value,Units::GetDistanceName()); else _stprintf(Buffer3[i][curpage],TEXT("%0.1lf!"),value); break; case awRed: _stprintf(Buffer3[i][curpage],TEXT("IN")); break; default: value=LKAirspaces[rli].Distance*DISTANCEMODIFY; if (!ScreenLandscape && usetwolines) _stprintf(Buffer3[i][curpage],TEXT("%0.1lf%s"),value,Units::GetDistanceName()); else _stprintf(Buffer3[i][curpage],TEXT("%0.1lf"),value); break; } // // AIRSPACE BEARING DIFFERENCE, OR BEARING IF CIRCLING // if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { value = LKAirspaces[rli].Bearing - DrawInfo.TrackBearing; if (value < -180.0) value += 360.0; else if (value > 180.0) value -= 360.0; if (value > 1) _stprintf(Buffer4[i][curpage], TEXT("%2.0f%s%s"), value, gettext(_T("_@M2179_")), gettext(_T("_@M2183_"))); else if (value < -1) _stprintf(Buffer4[i][curpage], TEXT("%s%2.0f%s"), gettext(_T("_@M2182_")), -value, gettext(_T("_@M2179_"))); else _stprintf(Buffer4[i][curpage], TEXT("%s%s"), gettext(_T("_@M2182_")), gettext(_T("_@M2183_"))); } else _stprintf(Buffer4[i][curpage], TEXT("%2.0f%s"), LKAirspaces[rli].Bearing, gettext(_T("_@M2179_"))); // // AIRSPACE FLAGS // TCHAR aspflags[5]; _stprintf(aspflags,_T("%s%s%s%s"), LKAirspaces[rli].Selected ? _T("S") : _T(""), LKAirspaces[rli].Flyzone ? _T("F") : _T(" "), LKAirspaces[rli].Enabled ? _T("E") : _T("D"), s_trailspace); if (!ScreenLandscape && usetwolines) _stprintf(Buffer5[i][curpage], TEXT("*%s"), aspflags); else _stprintf(Buffer5[i][curpage], TEXT("%s"), aspflags); } else { _stprintf(Buffer1[i][curpage], _T("----------------------------")); // max 30 Buffer1[i][curpage][s_maxnlname+7]='\0'; // some more dashes _stprintf(Buffer2[i][curpage],_T("----")); _stprintf(Buffer3[i][curpage],_T("----")); _stprintf(Buffer4[i][curpage],_T("----")); _stprintf(Buffer5[i][curpage],_T(" ")); } KeepOldValues: if ( ValidAirspace(rli) ) { drawn_items_onpage++; switch(LKAirspaces[rli].WarningLevel) { case awYellow: rcolor=RGB_LIGHTYELLOW; Surface.SelectObject(LK8InfoBigItalicFont); break; case awRed: rcolor=RGB_LIGHTRED; Surface.SelectObject(LK8InfoBigItalicFont); break; case awNone: default: rcolor=RGB_WHITE; Surface.SelectObject(LK8InfoBigFont); break; } } else { rcolor=RGB_GREY; } if (ScreenLandscape || !usetwolines) { LKWriteText(Surface, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); LKWriteText(Surface, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(Surface, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(Surface, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(Surface, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } else { LKWriteText(Surface, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); LKWriteText(Surface, Buffer2[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); iRaw+=s_rawspace; unsigned int iCol=ScreenSizeX/3; LKWriteText(Surface, Buffer3[i][curpage], iCol, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(Surface, Buffer4[i][curpage], iCol*2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(Surface, Buffer5[i][curpage], right-IBLSCALE(2), iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } } if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(AspNumraws-1)) { return; } if (SelectedRaw[curmapspace] >= drawn_items_onpage) { if (LKevent==LKEVENT_DOWN) SelectedRaw[curmapspace]=0; else if (LKevent==LKEVENT_UP) SelectedRaw[curmapspace]=drawn_items_onpage-1; else { // DoStatusMessage(_T("Cant find valid raw")); not needed anymore SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; if (!ScreenLandscape && usetwolines) invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace]*lincr); else invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(s_rawspace*(SelectedRaw[curmapspace]*lincr+1))-NIBLSCALE(1); if (!ScreenLandscape && usetwolines) invsel.bottom+=s_rawspace; Surface.InvertRect(invsel); } LKevent=LKEVENT_NONE; return; }
bool ButtonLabel::ExpandMacros(const TCHAR *In, TCHAR *OutBuffer, size_t Size) { // ToDo, check Buffer Size bool invalid = false; _tcsncpy(OutBuffer, In, Size); OutBuffer[Size-1] = '\0'; if (_tcsstr(OutBuffer, TEXT("$(")) == NULL) return false; if (task.isTaskAborted()) { if (_tcsstr(OutBuffer, TEXT("$(WaypointNext)"))) { // Waypoint\nNext invalid = !task.ValidTaskPoint(task.getActiveIndex()+1); CondReplaceInString(!task.ValidTaskPoint(task.getActiveIndex()+2), OutBuffer, TEXT("$(WaypointNext)"), TEXT("Landpoint\nFurthest"), TEXT("Landpoint\nNext"), Size); } else if (_tcsstr(OutBuffer, TEXT("$(WaypointPrevious)"))) { // Waypoint\nNext invalid = !task.ValidTaskPoint(task.getActiveIndex()-1); CondReplaceInString(!task.ValidTaskPoint(task.getActiveIndex()-2), OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("Landpoint\nClosest"), TEXT("Landpoint\nPrevious"), Size); } } else { if (_tcsstr(OutBuffer, TEXT("$(WaypointNext)"))) { // Waypoint\nNext invalid = !task.ValidTaskPoint(task.getActiveIndex()+1); CondReplaceInString(!task.ValidTaskPoint(task.getActiveIndex()+2), OutBuffer, TEXT("$(WaypointNext)"), TEXT("Waypoint\nFinish"), TEXT("Waypoint\nNext"), Size); } else if (_tcsstr(OutBuffer, TEXT("$(WaypointPrevious)"))) { if (task.getActiveIndex()==1) { invalid = !task.ValidTaskPoint(task.getActiveIndex()-1); ReplaceInString(OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("Waypoint\nStart"), Size); } else if (task.getSettings().EnableMultipleStartPoints) { invalid = !task.ValidTaskPoint(0); CondReplaceInString((task.getActiveIndex()==0), OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("StartPoint\nCycle"), TEXT("Waypoint\nPrevious"), Size); } else { invalid = (task.getActiveIndex()<=0); ReplaceInString(OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("Waypoint\nPrevious"), Size); } } } if (_tcsstr(OutBuffer, TEXT("$(AdvanceArmed)"))) { switch (task.getSettings().AutoAdvance) { case 0: ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(manual)"), Size); invalid = true; break; case 1: ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(auto)"), Size); invalid = true; break; case 2: if (task.getActiveIndex()>0) { if (task.ValidTaskPoint(task.getActiveIndex()+1)) { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("TURN"), Size); } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(finish)"), Size); invalid = true; } } else { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("START"), Size); } break; case 3: if (task.getActiveIndex()==0) { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("START"), Size); } else if (task.getActiveIndex()==1) { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("RESTART"), Size); } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(auto)"), Size); invalid = true; } // TODO bug: no need to arm finish default: break; } } if (_tcsstr(OutBuffer, TEXT("$(CheckReplay)"))) { if (!Basic().Replay && Basic().MovementDetected) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckReplay)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckWaypointFile)"))) { if (!way_points.verify_index(0)) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckWaypointFile)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckSettingsLockout)"))) { if (!is_simulator() && XCSoarInterface::LockSettingsInFlight && Calculated().Flying) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckSettingsLockout)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckTaskResumed)"))) { if (task.isTaskAborted()) { // TODO code: check, does this need to be set with temporary task? invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTaskResumed)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckTask)"))) { if (!task.Valid()) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTask)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckAirspace)"))) { if (!ValidAirspace()) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckAirspace)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckFLARM)"))) { if (!Basic().FLARM_Available) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckFLARM)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckTerrain)"))) { if (!Calculated().TerrainValid) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTerrain)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckAutoMc)"))) { if (!task.Valid() && ((SettingsComputer().AutoMcMode==0) || (SettingsComputer().AutoMcMode==2))) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckAutoMc)"), TEXT(""), Size); } CondReplaceInString(logger.isLoggerActive(), OutBuffer, TEXT("$(LoggerActive)"), TEXT("Stop"), TEXT("Start"), Size); if (_tcsstr(OutBuffer, TEXT("$(SnailTrailToggleName)"))) { switch(SettingsMap().TrailActive) { case 0: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Long"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Short"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Full"), Size); break; case 3: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Off"), Size); break; } } // VENTA3 VisualGlide if (_tcsstr(OutBuffer, TEXT("$(VisualGlideToggleName)"))) { switch(SettingsMap().VisualGlide) { case 0: ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Steady"), Size); break; case 1: if (SettingsMap().ExtendedVisualGlide) ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Moving"), Size); else ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Off"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Off"), Size); break; } } // VENTA3 AirSpace event if (_tcsstr(OutBuffer, TEXT("$(AirSpaceToggleName)"))) { switch(SettingsMap().OnAirSpace) { case 0: ReplaceInString(OutBuffer, TEXT("$(AirSpaceToggleName)"), TEXT("ON"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(AirSpaceToggleName)"), TEXT("OFF"), Size); break; } } if (_tcsstr(OutBuffer, TEXT("$(TerrainTopologyToggleName)"))) { char val; val = 0; if (SettingsMap().EnableTopology) val++; if (SettingsMap().EnableTerrain) val += (char)2; switch(val) { case 0: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), TEXT("Topology\nOn"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), TEXT("Terrain\nOn"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), TEXT("Terrain\nTopology"), Size); break; case 3: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), gettext(TEXT("Terrain\nOff")), Size); break; } } ////// CondReplaceInString(task.TaskIsTemporary(), OutBuffer, TEXT("$(TaskAbortToggleActionName)"), TEXT("Resume"), TEXT("Abort"), Size); CondReplaceInString(SettingsMap().FullScreen, OutBuffer, TEXT("$(FullScreenToggleActionName)"), TEXT("Off"), TEXT("On"), Size); CondReplaceInString(SettingsMap().AutoZoom, OutBuffer, TEXT("$(ZoomAutoToggleActionName)"), TEXT("Manual"), TEXT("Auto"), Size); CondReplaceInString(SettingsMap().EnableTopology, OutBuffer, TEXT("$(TopologyToggleActionName)"), TEXT("Off"), TEXT("On"), Size); CondReplaceInString(SettingsMap().EnableTerrain, OutBuffer, TEXT("$(TerrainToggleActionName)"), TEXT("Off"), TEXT("On"), Size); if (_tcsstr(OutBuffer, TEXT("$(MapLabelsToggleActionName)"))) { switch(SettingsMap().DeclutterLabels) { case 0: ReplaceInString(OutBuffer, TEXT("$(MapLabelsToggleActionName)"), TEXT("MID"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(MapLabelsToggleActionName)"), TEXT("OFF"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(MapLabelsToggleActionName)"), TEXT("ON"), Size); break; } } CondReplaceInString(SettingsComputer().AutoMacCready != 0, OutBuffer, TEXT("$(MacCreadyToggleActionName)"), TEXT("Manual"), TEXT("Auto"), Size); CondReplaceInString(SettingsMap().EnableAuxiliaryInfo, OutBuffer, TEXT("$(AuxInfoToggleActionName)"), TEXT("Off"), TEXT("On"), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmCircling, OutBuffer, TEXT("$(DispModeClimbShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmCruise, OutBuffer, TEXT("$(DispModeCruiseShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmNone, OutBuffer, TEXT("$(DispModeAutoShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmFinalGlide, OutBuffer, TEXT("$(DispModeFinalShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == ALLON, OutBuffer, TEXT("$(AirspaceModeAllShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == CLIP, OutBuffer, TEXT("$(AirspaceModeClipShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == AUTO, OutBuffer, TEXT("$(AirspaceModeAutoShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == ALLBELOW, OutBuffer, TEXT("$(AirspaceModeBelowShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == ALLOFF, OutBuffer, TEXT("$(AirspaceModeAllOffIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 0, OutBuffer, TEXT("$(SnailTrailOffShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 2, OutBuffer, TEXT("$(SnailTrailShortShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 1, OutBuffer, TEXT("$(SnailTrailLongShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 3, OutBuffer, TEXT("$(SnailTrailFullShortIndicator)"), TEXT("(*)"), TEXT(""), Size); // VENTA3 VisualGlide CondReplaceInString(SettingsMap().VisualGlide == 0, OutBuffer, TEXT("$(VisualGlideOffShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().VisualGlide == 1, OutBuffer, TEXT("$(VisualGlideLightShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().VisualGlide == 2, OutBuffer, TEXT("$(VisualGlideHeavyShortIndicator)"), TEXT("(*)"), TEXT(""), Size); // VENTA3 AirSpace CondReplaceInString(SettingsMap().OnAirSpace == 0, OutBuffer, TEXT("$(AirSpaceOffShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().OnAirSpace == 1, OutBuffer, TEXT("$(AirSpaceOnShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().EnableFLARMGauge != 0, OutBuffer, TEXT("$(FlarmDispToggleActionName)"), TEXT("Off"), TEXT("On"), Size); return invalid; }