void MapWindow::DrawTraffic(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXTRAFFIC][MAXTRAFFICNUMPAGES][24], Buffer2[MAXTRAFFIC][MAXTRAFFICNUMPAGES][10]; static TCHAR Buffer3[MAXTRAFFIC][MAXTRAFFICNUMPAGES][10]; static TCHAR Buffer4[MAXTRAFFIC][MAXTRAFFICNUMPAGES][12], Buffer5[MAXTRAFFIC][MAXTRAFFICNUMPAGES][12]; static short s_maxnlname; char text[30]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double value; COLORREF 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; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused short curmapspace=MapSpaceMode; static int TrafficNumraws=0; //static int TrafficNumpages=0; global.. // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) HBRUSH sortbrush; RECT invsel; if (INVERTCOLORS) { sortbrush=LKBrush_LightGreen; } else { sortbrush=LKBrush_DarkGreen; } if (DoInit[MDI_DRAWTRAFFIC]) { if ( ScreenSize < (ScreenSize_t)sslandscape ) { left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); s_maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; s_maxnlname=MAXNLNAME-3; // 9 chars, sized 10 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); // Heading line was MapWindow QUI _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; TrafficNumraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (TrafficNumraws>MAXTRAFFIC) TrafficNumraws=MAXTRAFFIC; s_rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; TrafficNumraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (TrafficNumraws>MAXTRAFFIC) TrafficNumraws=MAXTRAFFIC; s_rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 // Traffic name s_sortBox[0].left=Column0; // FIX 090925 era solo 0 if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=2; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_TRAFFIC][0]=s_sortBox[0].right; // Distance if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=2; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_TRAFFIC][1]=s_sortBox[1].right; // Bearing 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_TRAFFIC][2]=s_sortBox[2].right; // Vario 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_TRAFFIC][3]=s_sortBox[3].right; // Altitude s_sortBox[4].left=Column4+INTERBOX; //s_sortBox[4].right=Column5+INTERBOX; s_sortBox[4].right=rc.right-1; s_sortBox[4].top=2; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_TRAFFIC][4]=s_sortBox[4].right; SortBoxY[MSM_TRAFFIC]=p1.y; TrafficNumpages=roundupdivision(MAXTRAFFIC, TrafficNumraws); if (TrafficNumpages>MAXTRAFFICNUMPAGES) TrafficNumpages=MAXTRAFFICNUMPAGES; else if (TrafficNumpages<1) TrafficNumpages=1; SelectedRaw[MSM_TRAFFIC]=0; SelectedPage[MSM_TRAFFIC]=0; DoInit[MDI_DRAWTRAFFIC]=false; return; } // doinit DoTraffic(&DrawInfo, &DerivedDrawInfo); TrafficNumpages=roundupdivision(LKNumTraffic, TrafficNumraws); if (TrafficNumpages>MAXTRAFFICNUMPAGES) TrafficNumpages=MAXTRAFFICNUMPAGES; else if (TrafficNumpages<1) TrafficNumpages=1; curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXTRAFFICNUMPAGES) { // DoStatusMessage(_T("ERR-041 traffic curpage invalid!")); // selection while waiting for data ready SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: LKevent=LKEVENT_NONE; i=LKSortedTraffic[SelectedRaw[curmapspace]+(curpage*TrafficNumraws)]; if ( (i<0) || (i>=MAXTRAFFIC) || (LKTraffic[i].ID<=0) ) { #if 0 // selection while waiting for data ready if (LKNumTraffic>0) DoStatusMessage(_T("ERR-045 Invalid selection")); #endif break; } LKevent=LKEVENT_NONE; // Do not update Traffic while in details mode, max 10m LastDoTraffic=DrawInfo.Time+600; dlgLKTrafficDetails(i); LastDoTraffic=0; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=TrafficNumraws) SelectedRaw[curmapspace]=0; // Reset LastDoTraffic so that it wont be updated while selecting an item LastDoTraffic=DrawInfo.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=TrafficNumraws-1; LastDoTraffic=DrawInfo.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXTRAFFIC; i++) { for (k=0; k<MAXTRAFFICNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line short cursortbox=SortedMode[curmapspace]; if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode FillRect(hdc,&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1331_ "TRF" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1331_")), curpage+1,TrafficNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1332_ "Var" _stprintf(Buffer, gettext(TEXT("_@M1332_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1334_ "Alt" _stprintf(Buffer, gettext(TEXT("_@M1334_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { FillRect(hdc,&s_sortBox[cursortbox], sortbrush); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240)|| ScreenSize==ss896x672 ) { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1331_ "TRF" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1331_")), curpage+1,TrafficNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1332_ "Var" _stprintf(Buffer, gettext(TEXT("_@M1332_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1334_ "Alt" _stprintf(Buffer, gettext(TEXT("_@M1334_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1331_ "TRF" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1331_")), curpage+1,TrafficNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer, gettext(TEXT("_@M1304_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer, gettext(TEXT("_@M1305_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1333_ "Vario" _stprintf(Buffer, gettext(TEXT("_@M1333_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1334_ "Alt" _stprintf(Buffer, gettext(TEXT("_@M1334_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest #ifdef DEBUG_LKT_DRAWTRAFFIC TCHAR v2buf[100]; wsprintf(v2buf,_T("MAXTRAFFIC=%d LKNumTraff=%d / TrafficNumraws=%d TrafficNumpages=%d calc=%d\n"),MAXTRAFFIC, LKNumTraffic,TrafficNumraws, TrafficNumpages, (short)(ceil(MAXTRAFFIC/TrafficNumraws))); StartupStore(v2buf); #endif for (i=0, drawn_items_onpage=0; i<TrafficNumraws; i++) { iRaw=TopSize+(s_rawspace*i); short curraw=(curpage*TrafficNumraws)+i; if (curraw>=MAXTRAFFIC) break; rli=LKSortedTraffic[curraw]; #ifdef DEBUG_LKT_DRAWTRAFFIC StartupStore(_T("..LKDrawTraff page=%d curraw=%d rli=%d \n"), curpage,curraw,rli); #endif if ( (rli>=0) && (LKTraffic[rli].ID>0) ) { // Traffic name wlen=wcslen(LKTraffic[rli].Name); // if name is unknown then it is a '?' if (wlen==1) { _stprintf(Buffer,_T("%06x"),LKTraffic[rli].ID); Buffer[s_maxnlname]='\0'; } else { // if XY I-ABCD doesnt fit.. if ( (wlen+3)>s_maxnlname) { LK_tcsncpy(Buffer, LKTraffic[rli].Name, s_maxnlname); } else { unsigned short cnlen=_tcslen(LKTraffic[rli].Cn); // if cn is XY create XY I-ABCD if (cnlen==1 || cnlen==2) { _tcscpy(Buffer,LKTraffic[rli].Cn); _tcscat(Buffer,_T(" ")); _tcscat(Buffer,LKTraffic[rli].Name); // for safety Buffer[s_maxnlname]='\0'; } else { // else use only long name LK_tcsncpy(Buffer, LKTraffic[rli].Name, wlen); } } ConvToUpper(Buffer); } if (LKTraffic[rli].Locked) { TCHAR buf2[LKSIZEBUFFERLARGE]; _stprintf(buf2,_T("*%s"),Buffer); buf2[s_maxnlname]='\0'; _tcscpy(Buffer,buf2); } #ifdef DEBUG_LKT_DRAWTRAFFIC StartupStore(_T(".. Traffic[%d] Name=<%s> Id=<%0x> Status=%d Named:<%s>\n"),rli,LKTraffic[rli].Name, LKTraffic[rli].ID, LKTraffic[rli].Status,Buffer); #endif _tcscpy(Buffer1[i][curpage],Buffer); // Distance value=LKTraffic[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),value); // relative bearing if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { value = LKTraffic[rli].Bearing - DrawInfo.TrackBearing; if (value < -180.0) value += 360.0; else if (value > 180.0) value -= 360.0; #ifndef __MINGW32__ if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); #else if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f°»"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("«%2.0f°"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("«»")); #endif } else { _stprintf(Buffer3[i][curpage], _T("%2.0f°"), LKTraffic[rli].Bearing); } // Vario value=LIFTMODIFY*LKTraffic[rli].Average30s; if (value<-6 || value>6) _stprintf(Buffer4[i][curpage],_T("---")); else { sprintf(text,"%+.1f",value); _stprintf(Buffer4[i][curpage],_T("%S"),text); } // Altitude value=ALTITUDEMODIFY*LKTraffic[rli].Altitude; if (value<-1000 || value >45000 ) strcpy(text,"---"); else sprintf(text,"%.0f",value); wsprintf(Buffer5[i][curpage], TEXT("%S"),text); } else { // Empty traffic, fill in all empty data and maybe break loop _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } if ((rli>=0) && (LKTraffic[rli].ID>0)) { drawn_items_onpage++; if (LKTraffic[rli].Status == LKT_REAL) { rcolor=RGB_WHITE; SelectObject(hdc, LK8InfoBigFont); } else { if (LKTraffic[rli].Status == LKT_GHOST) { rcolor=RGB_LIGHTYELLOW; } else { rcolor=RGB_LIGHTRED; } SelectObject(hdc, LK8InfoBigItalicFont); } } else rcolor=RGB_GREY; LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } // for if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(TrafficNumraws-1)) { LKevent=LKEVENT_NONE; // 100328 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 { SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(s_rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
void MapWindow::DrawThermalHistory(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXTHISTORY][MAXTHISTORYNUMPAGES][24], Buffer2[MAXTHISTORY][MAXTHISTORYNUMPAGES][10]; static TCHAR Buffer3[MAXTHISTORY][MAXTHISTORYNUMPAGES][10]; static TCHAR Buffer4[MAXTHISTORY][MAXTHISTORYNUMPAGES][12], Buffer5[MAXTHISTORY][MAXTHISTORYNUMPAGES][12]; static short s_maxnlname; char text[30]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double value; COLORREF 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; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused short curmapspace=MapSpaceMode; static int thistoryNumraws=0; // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) HBRUSH sortbrush; RECT invsel; if (INVERTCOLORS) { sortbrush=LKBrush_LightGreen; } else { sortbrush=LKBrush_DarkGreen; } if (DoInit[MDI_DRAWTHERMALHISTORY]) { if ( ScreenSize < (ScreenSize_t)sslandscape ) { left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); s_maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; s_maxnlname=MAXNLNAME-3; // 9 chars, sized 10 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); // Heading line was MapWindow QUI _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; thistoryNumraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (thistoryNumraws>MAXTHISTORY) thistoryNumraws=MAXTHISTORY; s_rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; thistoryNumraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (thistoryNumraws>MAXTHISTORY) thistoryNumraws=MAXTHISTORY; s_rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 // Thermal name s_sortBox[0].left=Column0; // FIX 090925 era solo 0 if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=2; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_THERMALS][0]=s_sortBox[0].right; // Distance if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=2; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_THERMALS][1]=s_sortBox[1].right; // Bearing 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_THERMALS][2]=s_sortBox[2].right; // Vario 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_THERMALS][3]=s_sortBox[3].right; // Altitude s_sortBox[4].left=Column4+INTERBOX; //s_sortBox[4].right=Column5+INTERBOX; s_sortBox[4].right=rc.right-1; s_sortBox[4].top=2; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_THERMALS][4]=s_sortBox[4].right; SortBoxY[MSM_THERMALS]=p1.y; THistoryNumpages=roundupdivision(MAXTHISTORY, thistoryNumraws); if (THistoryNumpages>MAXTHISTORYNUMPAGES) THistoryNumpages=MAXTHISTORYNUMPAGES; else if (THistoryNumpages<1) THistoryNumpages=1; SelectedRaw[MSM_THERMALS]=0; SelectedPage[MSM_THERMALS]=0; DoInit[MDI_DRAWTHERMALHISTORY]=false; return; } // doinit DoThermalHistory(&GPS_INFO, &CALCULATED_INFO); THistoryNumpages=roundupdivision(LKNumThermals, thistoryNumraws); if (THistoryNumpages>MAXTHISTORYNUMPAGES) THistoryNumpages=MAXTHISTORYNUMPAGES; else if (THistoryNumpages<1) THistoryNumpages=1; curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXTHISTORYNUMPAGES) { #if TESTBENCH DoStatusMessage(_T("ERR-041 thermals curpage invalid")); // selection while waiting for data ready #endif SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: LKevent=LKEVENT_NONE; i=LKSortedThermals[SelectedRaw[curmapspace]+(curpage*thistoryNumraws)]; if ( (i<0) || (i>=MAXTHISTORY) || (CopyThermalHistory[i].Valid != true) ) { #if 0 // selection while waiting for data ready if (LKNumThermals>0) DoStatusMessage(_T("ERR-045 Invalid selection")); #endif break; } LKevent=LKEVENT_NONE; // Do not update while in details mode, max 10m LastDoThermalH=GPS_INFO.Time+600; dlgThermalDetails(i); LastDoThermalH=0; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=thistoryNumraws) SelectedRaw[curmapspace]=0; // Reset LastDoThermalH so that it wont be updated while selecting an item LastDoThermalH=GPS_INFO.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=thistoryNumraws-1; LastDoThermalH=GPS_INFO.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXTHISTORY; i++) { for (k=0; k<MAXTHISTORYNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line short cursortbox=SortedMode[curmapspace]; if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode FillRect(hdc,&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1670_")), curpage+1,THistoryNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1673_"))); // Avg if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1307_"))); // AltArr if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { FillRect(hdc,&s_sortBox[cursortbox], sortbrush); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240)|| ScreenSize==ss896x672 ) { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1670_")), curpage+1,THistoryNumpages); // THE if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1673_"))); // Avg if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1307_"))); // AltArr if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1670_ "THE" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1670_")), curpage+1,THistoryNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer, gettext(TEXT("_@M1304_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer, gettext(TEXT("_@M1305_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1673_"))); // Avg if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1307_"))); // AltArr if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest #ifdef DEBUG_LKT_DRAWTHISTORY TCHAR v2buf[100]; wsprintf(v2buf,_T("MAXTHISTORY=%d LKNumTherm=%d / thistoryNumraws=%d THistoryNumpages=%d calc=%d\n"),MAXTHISTORY, LKNumThermals,thistoryNumraws, THistoryNumpages, (short)(ceil(MAXTHISTORY/thistoryNumraws))); StartupStore(v2buf); #endif for (i=0, drawn_items_onpage=0; i<thistoryNumraws; i++) { iRaw=TopSize+(s_rawspace*i); short curraw=(curpage*thistoryNumraws)+i; if (curraw>=MAXTHISTORY) break; rli=LKSortedThermals[curraw]; #ifdef DEBUG_LKT_DRAWTHISTORY StartupStore(_T("..LKDrawThistory page=%d curraw=%d rli=%d \n"), curpage,curraw,rli); #endif if ( (rli>=0) && (CopyThermalHistory[rli].Valid==true) ) { // Thermal name wlen=wcslen(CopyThermalHistory[rli].Name); if (wlen>s_maxnlname) { LKASSERT(CopyThermalHistory[rli].Name); _tcsncpy(Buffer, CopyThermalHistory[rli].Name, s_maxnlname); Buffer[s_maxnlname]='\0'; } else { LKASSERT(CopyThermalHistory[rli].Name); _tcsncpy(Buffer, CopyThermalHistory[rli].Name, wlen); Buffer[wlen]='\0'; } if (IsThermalMultitarget(rli)) { TCHAR Buffer2[40]; _stprintf(Buffer2,_T(">%s"),Buffer); wcscpy(Buffer,Buffer2); } ConvToUpper(Buffer); _tcscpy(Buffer1[i][curpage],Buffer); // Distance value=CopyThermalHistory[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),value); // relative bearing if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { value = CopyThermalHistory[rli].Bearing - GPS_INFO.TrackBearing; if (value < -180.0) value += 360.0; else if (value > 180.0) value -= 360.0; #ifndef __MINGW32__ if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); #else if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f°»"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("«%2.0f°"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("«»")); #endif } else { _stprintf(Buffer3[i][curpage], _T("%2.0f°"), CopyThermalHistory[rli].Bearing); } // Average lift value=LIFTMODIFY*CopyThermalHistory[rli].Lift; if (value<-99 || value>99) _stprintf(Buffer4[i][curpage],_T("---")); else { sprintf(text,"%+.1f",value); _stprintf(Buffer4[i][curpage],_T("%S"),text); } // Altitude value=ALTITUDEMODIFY*CopyThermalHistory[rli].Arrival; if (value<-1000 || value >45000 ) strcpy(text,"---"); else sprintf(text,"%.0f",value); wsprintf(Buffer5[i][curpage], TEXT("%S"),text); } else { // Empty thermals, fill in all empty data and maybe break loop _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } if ((rli>=0) && (CopyThermalHistory[rli].Valid==true)) { drawn_items_onpage++; if (CopyThermalHistory[rli].Arrival >=0) { rcolor=RGB_WHITE; SelectObject(hdc, LK8InfoBigFont); } else { rcolor=RGB_LIGHTRED; SelectObject(hdc, LK8InfoBigItalicFont); } } else rcolor=RGB_GREY; LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } // for if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(thistoryNumraws-1)) { LKevent=LKEVENT_NONE; // 100328 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 { SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(s_rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
void MapWindow::DrawNearest(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXNEAREST][MAXNUMPAGES][24], Buffer2[MAXNEAREST][MAXNUMPAGES][10], Buffer3[MAXNEAREST][MAXNUMPAGES][10]; static TCHAR Buffer4[MAXNEAREST][MAXNUMPAGES][12], Buffer5[MAXNEAREST][MAXNUMPAGES][12]; static short s_maxnlname; TCHAR text[30]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double value; COLORREF 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; // 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; // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) HBRUSH sortbrush; RECT invsel; if (INVERTCOLORS) { sortbrush=LKBrush_LightGreen; } else { sortbrush=LKBrush_DarkGreen; } if (DoInit[MDI_DRAWNEAREST]) { // Set screen borders to avoid writing on extreme pixels if ( ScreenSize < (ScreenSize_t)sslandscape ) { // Portrait mode has tight horizontal margins... left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); s_maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; s_maxnlname=MAXNLNAME-3; // 9 chars, sized 10 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); //: Bearing _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); //: reqE _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); //: Altitude Arrival _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; // Col0 is where APTS 1/3 can be written, after ModeIndex:Curtype Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left //Column2=Column1+WPTextSize.cx+intercolumn/2; // DS align right Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; //TopSize+=(WPTextSize.cy); TopSize+=HEADRAW; Numraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (Numraws>MAXNEAREST) Numraws=MAXNEAREST; s_rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; Numraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (Numraws>MAXNEAREST) Numraws=MAXNEAREST; s_rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 s_sortBox[0].left=Column0; if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=2; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_LANDABLE][0]=s_sortBox[0].right; SortBoxX[MSM_AIRPORTS][0]=s_sortBox[0].right; SortBoxX[MSM_NEARTPS][0]=s_sortBox[0].right; if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=2; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_LANDABLE][1]=s_sortBox[1].right; SortBoxX[MSM_AIRPORTS][1]=s_sortBox[1].right; SortBoxX[MSM_NEARTPS][1]=s_sortBox[1].right; 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_LANDABLE][2]=s_sortBox[2].right; SortBoxX[MSM_AIRPORTS][2]=s_sortBox[2].right; SortBoxX[MSM_NEARTPS][2]=s_sortBox[2].right; 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_LANDABLE][3]=s_sortBox[3].right; SortBoxX[MSM_AIRPORTS][3]=s_sortBox[3].right; SortBoxX[MSM_NEARTPS][3]=s_sortBox[3].right; 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_LANDABLE][4]=s_sortBox[4].right; SortBoxX[MSM_AIRPORTS][4]=s_sortBox[4].right; SortBoxX[MSM_NEARTPS][4]=s_sortBox[4].right; SortBoxY[MSM_LANDABLE]=p1.y; SortBoxY[MSM_AIRPORTS]=p1.y; SortBoxY[MSM_NEARTPS]=p1.y; Numpages=roundupdivision(MAXNEAREST, Numraws); if (Numpages>MAXNUMPAGES) Numpages=MAXNUMPAGES; else if (Numpages<1) Numpages=1; SelectedRaw[MSM_LANDABLE]=0; SelectedRaw[MSM_AIRPORTS]=0; SelectedRaw[MSM_NEARTPS]=0; SelectedPage[MSM_LANDABLE]=0; SelectedPage[MSM_AIRPORTS]=0; SelectedPage[MSM_NEARTPS]=0; DoInit[MDI_DRAWNEAREST]=false; return; } // doinit Numpages=roundupdivision(SortedNumber, Numraws); if (Numpages>MAXNUMPAGES) Numpages=MAXNUMPAGES; else if (Numpages<1) Numpages=1; curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXNUMPAGES) { // TODO also >Numpages // DoStatusMessage(_T("ERR-091 curpage invalid!")); // selection while waiting for data ready SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: LKevent=LKEVENT_NONE; switch(curmapspace) { case MSM_LANDABLE: i=SortedLandableIndex[SelectedRaw[curmapspace]+(curpage*Numraws)]; break; case MSM_AIRPORTS: i=SortedAirportIndex[SelectedRaw[curmapspace] + (curpage*Numraws)]; break; case MSM_NEARTPS: default: i=SortedTurnpointIndex[SelectedRaw[curmapspace] + (curpage*Numraws)]; break; } if ( !ValidWayPoint(i)) { #if 0 // selection while waiting for data ready if (SortedNumber>0) DoStatusMessage(_T("ERR-019 Invalid selection")); #endif break; } SelectedWaypoint=i; LastDoNearest = DrawInfo.Time+NEARESTONHOLD; PopupWaypointDetails(); LastDoNearest = 0; // SetModeType(LKMODE_MAP,MP_MOVING); EXperimental OFF 101219 LKevent=LKEVENT_NONE; return; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=Numraws) SelectedRaw[curmapspace]=0; LastDoNearest=DrawInfo.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=Numraws-1; LastDoNearest=DrawInfo.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXNEAREST; i++) { for (k=0; k<MAXNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line short cursortbox=SortedMode[curmapspace]; if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode FillRect(hdc,&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); switch(curmapspace) { case MSM_LANDABLE: // LKTOKEN _@M1311_ "LND" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1311_")), curpage+1,Numpages); break; case MSM_AIRPORTS: // LKTOKEN _@M1313_ "APT" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1313_")), curpage+1, Numpages); break; case MSM_NEARTPS: default: // LKTOKEN _@M1315_ "TPS" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1315_")), curpage+1, Numpages); break; } if (cursortbox == 0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer,gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer,gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1302_ "rEff" _stprintf(Buffer,gettext(TEXT("_@M1302_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1303_ "AltA" _stprintf(Buffer,gettext(TEXT("_@M1303_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { FillRect(hdc,&s_sortBox[cursortbox], sortbrush); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240) || (ScreenSize == ss896x672) ) { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); switch(curmapspace) { case MSM_LANDABLE: // LKTOKEN _@M1312_ "LNDB" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1312_")), curpage+1,Numpages); break; case MSM_AIRPORTS: // LKTOKEN _@M1314_ "APTS" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1314_")), curpage+1, Numpages); break; case MSM_NEARTPS: default: // LKTOKEN _@M1315_ "TPS" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1315_")), curpage+1, Numpages); break; } if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer,gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer,gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1302_ "rEff" _stprintf(Buffer,gettext(TEXT("_@M1302_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1308_ "Arriv" _stprintf(Buffer,gettext(TEXT("_@M1308_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); switch(curmapspace) { case MSM_LANDABLE: // LKTOKEN _@M1312_ "LNDB" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1312_")), curpage+1,Numpages); break; case MSM_AIRPORTS: // LKTOKEN _@M1314_ "APTS" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1314_")), curpage+1, Numpages); break; case MSM_NEARTPS: default: // LKTOKEN _@M1315_ "TPS" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1315_")), curpage+1, Numpages); break; } if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer,gettext(TEXT("_@M1304_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer,gettext(TEXT("_@M1305_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1306_ "ReqEff" _stprintf(Buffer,gettext(TEXT("_@M1306_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1307_ "AltArr" _stprintf(Buffer,gettext(TEXT("_@M1307_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest bool ndr=NearestDataReady; NearestDataReady=false; int *psortedindex; switch(curmapspace) { case MSM_LANDABLE: psortedindex=SortedLandableIndex; break; case MSM_AIRPORTS: psortedindex=SortedAirportIndex; break; case MSM_NEARTPS: default: psortedindex=SortedTurnpointIndex; break; } for (i=0, drawn_items_onpage=0; i<Numraws; i++) { iRaw=TopSize+(s_rawspace*i); short curraw=(curpage*Numraws)+i; if (curraw>=MAXNEAREST) break; rli=*(psortedindex+curraw); if (!ndr) { goto KeepOldValues; } if ( ValidWayPoint(rli) ) { wlen=_tcslen(WayPointList[rli].Name); if (wlen>s_maxnlname) { LK_tcsncpy(Buffer, WayPointList[rli].Name, s_maxnlname); } else { LK_tcsncpy(Buffer, WayPointList[rli].Name, wlen); } ConvToUpper(Buffer); _tcscpy(Buffer1[i][curpage],Buffer); value=WayPointCalc[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),value); if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { value = WayPointCalc[rli].Bearing - DrawInfo.TrackBearing; if (value < -180.0) value += 360.0; else if (value > 180.0) value -= 360.0; if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); } else _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0"), WayPointCalc[rli].Bearing); // 101219 value=WayPointCalc[rli].GR; if (value<1 || value>=MAXEFFICIENCYSHOW) _stprintf(Buffer4[i][curpage],_T("---")); else { if (value>99) _stprintf(text,_T("%.0f"),value); else _stprintf(text,_T("%.1f"),value); _stprintf(Buffer4[i][curpage],_T("%s"),text); } value=ALTITUDEMODIFY*WayPointCalc[rli].AltArriv[AltArrivMode]; if (value <-9999 || value >9999 ) _tcscpy(text,_T("---")); else _stprintf(text,_T("%+.0f"),value); _stprintf(Buffer5[i][curpage], TEXT("%s"),text); } else { _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } KeepOldValues: if ( ValidWayPoint(rli) ) { drawn_items_onpage++; if (WayPointCalc[rli].IsOutlanding) { rcolor=RGB_LIGHTYELLOW; SelectObject(hdc, LK8InfoBigItalicFont); } else { rcolor=RGB_WHITE; SelectObject(hdc, LK8InfoBigFont); } // 120601 extend search for tps, missing reachable status // If we are listing tps, and the current tp has a positive arrival altitude, // then check if it is really unreachable because we dont calculate tps for that. // Unless they are in a task, common, alternates, of course. if (curmapspace==MSM_NEARTPS) { if ( WayPointCalc[rli].AltArriv[AltArrivMode]>0) { if (CheckLandableReachableTerrainNew(&DrawInfo, &DerivedDrawInfo, WayPointCalc[rli].Distance, WayPointCalc[rli].Bearing )) { rcolor=RGB_WHITE; } else { rcolor=RGB_LIGHTRED; } } else { rcolor=RGB_LIGHTRED; } } else // old stuff as usual if ((WayPointCalc[rli].VGR == 3 )|| (!WayPointList[rli].Reachable)) { rcolor=RGB_LIGHTRED; } } else { rcolor=RGB_GREY; } LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, 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]>(Numraws-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 { // Here we are recovering a selection problem caused by a delay while switching. // DoStatusMessage(_T("Cant find valid raw")); // not needed anymore SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(s_rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
void MapWindow::DrawCommon(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXCOMMON][MAXCOMMONNUMPAGES][24], Buffer2[MAXCOMMON][MAXCOMMONNUMPAGES][10], Buffer3[MAXCOMMON][MAXCOMMONNUMPAGES][10]; static TCHAR Buffer4[MAXCOMMON][MAXCOMMONNUMPAGES][12], Buffer5[MAXCOMMON][MAXCOMMONNUMPAGES][12]; static short maxnlname; char text[LKSIZETEXT]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double Value; COLORREF rcolor; static short Column0, Column1, Column2, Column3, Column4, Column5; static POINT p1, p2; static short rawspace; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) RECT invsel; short curmapspace=MapSpaceMode; static bool doinit=true; if (doinit) { // Set screen borders to avoid writing on extreme pixels if ( ScreenSize < (ScreenSize_t)sslandscape ) { // Portrait mode has tight horizontal margins... left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; maxnlname=MAXNLNAME-3; // 9 chars, sized 10 100213 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); // Size distance _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); // Bearing _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); // reqE _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); // Altitude Arrival _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; CommonNumraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (CommonNumraws>MAXCOMMON) CommonNumraws=MAXCOMMON; rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; CommonNumraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (CommonNumraws>MAXCOMMON) CommonNumraws=MAXCOMMON; rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 // Wpname s_sortBox[0].left=0; if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=0; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_COMMON][0]=s_sortBox[0].right; SortBoxX[MSM_RECENT][0]= SortBoxX[MSM_COMMON][0]; // Distance if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=0; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_COMMON][1]=s_sortBox[1].right; SortBoxX[MSM_RECENT][1]= SortBoxX[MSM_COMMON][1]; // Bearing s_sortBox[2].left=Column2+INTERBOX; s_sortBox[2].right=Column3+INTERBOX; s_sortBox[2].top=0; s_sortBox[2].bottom=p1.y; SortBoxX[MSM_COMMON][2]=s_sortBox[2].right; SortBoxX[MSM_RECENT][2]= SortBoxX[MSM_COMMON][2]; // reqE s_sortBox[3].left=Column3+INTERBOX; s_sortBox[3].right=Column4+INTERBOX; s_sortBox[3].top=0; s_sortBox[3].bottom=p1.y; SortBoxX[MSM_COMMON][3]=s_sortBox[3].right; SortBoxX[MSM_RECENT][3]= SortBoxX[MSM_COMMON][3]; // AltArr s_sortBox[4].left=Column4+INTERBOX; s_sortBox[4].right=Column5+INTERBOX; s_sortBox[4].top=0; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_COMMON][4]=s_sortBox[4].right; SortBoxX[MSM_RECENT][4]= SortBoxX[MSM_COMMON][4]; SortBoxY[MSM_COMMON]=p1.y; SortBoxY[MSM_RECENT]=SortBoxY[MSM_COMMON]; // Caution: could be wrong? no.. //CommonNumpages=(short)ceil( (float)MAXCOMMON / (float)CommonNumraws ); CommonNumpages=roundupdivision(MAXCOMMON, CommonNumraws); if (CommonNumpages>MAXCOMMONNUMPAGES) CommonNumpages=MAXCOMMONNUMPAGES; else if (CommonNumpages<1) CommonNumpages=1; // set the initial highlighted item to the first, in each MapSpace SelectedRaw[MSM_COMMON]=0; SelectedRaw[MSM_RECENT]=0; SelectedPage[MSM_COMMON]=0; SelectedPage[MSM_RECENT]=0; doinit=false; return; } // doinit int *pNumber; int *pIndex; switch(curmapspace) { case MSM_COMMON: pNumber=&CommonNumber; pIndex=CommonIndex; break; case MSM_RECENT: default: pNumber=&RecentNumber; pIndex=RecentIndex; break; } // calculate again real number of pages CommonNumpages=roundupdivision(*pNumber, CommonNumraws); if (CommonNumpages>MAXCOMMONNUMPAGES) CommonNumpages=MAXCOMMONNUMPAGES; else if (CommonNumpages<1) CommonNumpages=1; // current page in use by current mapspacemode curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXCOMMONNUMPAGES) { // DoStatusMessage(_T("ERR-092 current page invalid!")); // selection while waiting for data ready // immediate action to resolve this problem, take it back to normality SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } // list changed, and we are now over the real new size> resetting if (curpage>=CommonNumpages) curpage=0; // synthetic event handler . Remember to always clear events! switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: // i=CommonIndex[SelectedRaw[curmapspace] + (curpage*CommonNumraws)]; OLD i=pIndex[SelectedRaw[curmapspace] + (curpage*CommonNumraws)]; if ( !ValidWayPoint(i)) { #if 0 // selection while waiting for data ready // dont say error if empty list and an enter was pressed if (*pNumber) DoStatusMessage(_T("ERR-018 Invalid selection")); #endif break; } SelectedWaypoint=i; LastDoCommon = GPS_INFO.Time+NEARESTONHOLD; //@ 101003 PopupWaypointDetails(); LastDoCommon = 0; //@ 101003 // SetModeType(LKMODE_MAP, MP_MOVING); Experimental OFF 101219 LKevent=LKEVENT_NONE; return; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=CommonNumraws) SelectedRaw[curmapspace]=0; LastDoCommon=GPS_INFO.Time+PAGINGTIMEOUT-1.0; //@ 101003 // Event to be cleared at the end break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=CommonNumraws-1; LastDoCommon=GPS_INFO.Time+PAGINGTIMEOUT-1.0; //@ 101003 break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXCOMMON; i++) { for (k=0; k<MAXCOMMONNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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; } // Draw Headline if (INVERTCOLORS) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); if (curmapspace == MSM_COMMON ) // LKTOKEN _@M1309_ "COMN" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1309_")), curpage+1, CommonNumpages); else // LKTOKEN _@M1310_ "HIST" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1310_")), curpage+1, CommonNumpages); LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer,gettext(TEXT("_@M1300_"))); // always sorted manually here! LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer,gettext(TEXT("_@M1301_"))); LKWriteText(hdc, Buffer, Column3, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1302_ "rEff" _stprintf(Buffer,gettext(TEXT("_@M1302_"))); LKWriteText(hdc, Buffer, Column4, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1303_ "AltA" _stprintf(Buffer,gettext(TEXT("_@M1303_"))); LKWriteText(hdc, Buffer, Column5, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240) || ScreenSize == ss896x672 ) { if (curmapspace == MSM_COMMON ) // LKTOKEN _@M1309_ "COMN" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1309_")), curpage+1,CommonNumpages); else // LKTOKEN _@M1310_ "HIST" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1310_")), curpage+1,CommonNumpages); LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer,gettext(TEXT("_@M1300_"))); LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer,gettext(TEXT("_@M1301_"))); LKWriteText(hdc, Buffer, Column3, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1302_ "rEff" _stprintf(Buffer,gettext(TEXT("_@M1302_"))); LKWriteText(hdc, Buffer, Column4, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1308_ "Arriv" _stprintf(Buffer,gettext(TEXT("_@M1308_"))); LKWriteText(hdc, Buffer, Column5, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { if (curmapspace==MSM_COMMON) // LKTOKEN _@M1309_ "COMN" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1309_")), curpage+1,CommonNumpages); else // LKTOKEN _@M1310_ "HIST" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1310_")), curpage+1,CommonNumpages); LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer,gettext(TEXT("_@M1304_"))); LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer,gettext(TEXT("_@M1305_"))); LKWriteText(hdc, Buffer, Column3, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1306_ "ReqEff" _stprintf(Buffer,gettext(TEXT("_@M1306_"))); LKWriteText(hdc, Buffer, Column4, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1307_ "AltArr" _stprintf(Buffer,gettext(TEXT("_@M1307_"))); LKWriteText(hdc, Buffer, Column5, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest // try to reduce conflicts, as task thread could change it while we are using it here. // so we copy it and clear it here once forever in this run bool ndr; switch (curmapspace) { case MSM_COMMON: ndr=CommonDataReady; CommonDataReady=false; break; case MSM_RECENT: ndr=RecentDataReady; RecentDataReady=false; break; default: ndr=false; break; } // numraws always <= MAXNEAREST for (i=0, drawn_items_onpage=0; i<CommonNumraws; i++) { iRaw=TopSize+(rawspace*i); short curraw=(curpage*CommonNumraws)+i; if (curraw>=MAXCOMMON) break; rli=pIndex[curraw]; if (!ndr) goto KeepOldValues; if ( ValidWayPoint(rli) ) { wlen=wcslen(WayPointList[rli].Name); if (wlen>maxnlname) { _tcsncpy(Buffer, WayPointList[rli].Name, maxnlname); Buffer[maxnlname]='\0'; } else { _tcsncpy(Buffer, WayPointList[rli].Name, wlen); Buffer[wlen]='\0'; } ConvToUpper(Buffer); // 100213 FIX UPPERCASE DRAWNEAREST _tcscpy(Buffer1[i][curpage],Buffer); // Distance Value=WayPointCalc[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),Value); // relative bearing if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { Value = WayPointCalc[rli].Bearing - GPS_INFO.TrackBearing; if (Value < -180.0) Value += 360.0; else if (Value > 180.0) Value -= 360.0; #ifndef __MINGW32__ if (Value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), Value); else if (Value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -Value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); #else if (Value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f°»"), Value); else if (Value < -1) _stprintf(Buffer3[i][curpage], TEXT("«%2.0f°"), -Value); else _tcscpy(Buffer3[i][curpage], TEXT("«»")); #endif } else _stprintf(Buffer3[i][curpage], TEXT("%2.0f°"), WayPointCalc[rli].Bearing); // Requested GR Value=WayPointCalc[rli].GR; if (Value<1 || Value>=MAXEFFICIENCYSHOW) _stprintf(Buffer4[i][curpage],_T("---")); else { if (Value>99) sprintf(text,"%.0f",Value); else sprintf(text,"%.1f",Value); _stprintf(Buffer4[i][curpage],_T("%S"),text); } // arrival altitude Value=ALTITUDEMODIFY*WayPointCalc[rli].AltArriv[AltArrivMode]; if (Value <-9999 || Value >9999 ) strcpy(text,"---"); else sprintf(text,"%+.0f",Value); wsprintf(Buffer5[i][curpage], TEXT("%S"),text); } else { // Invalid waypoint, fill in all empty data and maybe break loop _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } KeepOldValues: if ( ValidWayPoint(rli) ) { SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest drawn_items_onpage++; // Common turnpoints are mixed, so we must be sure that reachable is checked only against a landable if ((WayPointCalc[rli].VGR == 3 )|| ( WayPointCalc[rli].IsLandable && !WayPointList[rli].Reachable)) // 091205 rcolor=RGB_LIGHTRED; else rcolor=RGB_WHITE; } else rcolor=RGB_GREY; //TextDisplayMode.AsFlag.Color = TEXTGREY; LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); // set again correct font SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } // for // clear flag, and don't outbox if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } // BOXOUT SELECTED ITEM if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(CommonNumraws-1)) { LKevent=LKEVENT_NONE; return; } // avoid boxing and selecting nonexistent items // selectedraw starts from 0, drawnitems from 1... // In this case we set the first one, or last one, assuming we are rotating forward or backward if (SelectedRaw[curmapspace] >= drawn_items_onpage) { if (LKevent==LKEVENT_DOWN) SelectedRaw[curmapspace]=0; else // up from top to bottom, bottom empty, look for the last valid one (ie first going back from bottom) if (LKevent==LKEVENT_UP) SelectedRaw[curmapspace]=drawn_items_onpage-1; else { // DoStatusMessage(_T("Cant find valid raw")); // no more needed SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
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; }