%% options copyright owner = Dirk Krause copyright year = 2019-xxxx SPDX-License-Identifier: BSD-3-Clause %% wx-gui type = frame contents = mainSizer icon = wximgsz_icon status bar = 1 sTexts[8] menu bar = mbMain [wxMenuBar mbMain] contents = menuFile contents = menuHelp [wxMenu menuFile] text = sTexts[0] contents = miFileOpen contents = miFileExit [wxMenuItem miFileOpen] id = wxID_OPEN text = sTexts[40] tip = sTexts[41] [wxMenuItem miFileExit] id = wxID_EXIT text = sTexts[1] tip = sTexts[2] [wxMenu menuHelp] text = sTexts[3] contents = miHelpAbout contents = miHelpContents [wxMenuItem miHelpAbout] id = WximgszFrame::ID_HELP_ABOUT text = sTexts[4] tip = sTexts[5] [wxMenuItem miHelpContents] id = WximgszFrame::ID_HELP_TOC text = sTexts[6] tip = sTexts[7] [wxBoxSizer mainSizer] direction = horizontal contents = $space(10) contents = verticalSizer contents = $space(10) [wxBoxSizer verticalSizer] direction = vertical grow = yes proportion = 1 contents = $space(10) contents = contentsSizer contents = $space(10) [wxBoxSizer contentsSizer] direction = horizontal grow = yes proportion = 1 contents = inputSizer contents = $space(20,20) contents = runButtonSizer contents = $space(20,20) contents = resultSizer [wxGridBagSizer inputSizer] grid = 5 5 contents = lInput 0 0 1 2 left contents = lInputWidth +1 0 1 1 right centered-y contents = spInputWidth . +1 1 1 centered-y contents = lInputHeight +1 0 1 1 right centered-y contents = spInputHeight . +1 1 1 centered-y contents = $space(10) +1 0 1 1 contents = lChange +1 0 1 2 left contents = lOperation +1 0 1 1 right centered-y contents = cbOperation . +1 1 1 left centered-y contents = lOperationMin +1 0 1 1 right centered-y contents = spOperationMin . +1 1 1 left centered-y contents = lOperationMax +1 0 1 1 right centered-y contents = spOperationMax . +1 1 1 left centered-y [wxBoxSizer runButtonSizer] grow = yes direction = vertical contents = $stretch(10) contents = bRun contents = $stretch(10) [wxBoxSizer resultSizer] grow = yes proportion = 1 direction = vertical contents = lResults left contents = tResult left [wxStaticText lInput] text = sTexts[13] [wxStaticText lResults] text = sTexts[28] [wxStaticText lInputWidth] text = sTexts[14] [wxStaticText lInputHeight] text = sTexts[15] [wxSpinCtrl spInputWidth] value = 1 range = 1 65535 tip = sTexts[16] [wxBitmapButton bRun] tip = sTexts[29] bitmap = xpm_run_conversion id = ID_BUTTON_RUN [wxGrid tResult] text style = readonly column head = sTexts[30] column head = sTexts[31] column head = sTexts[32] column head = sTexts[33] rows = 4 # minimum size = 150 100 grow = true proportion = 1 [wxSpinCtrl spInputHeight] value = 1 range = 1 65535 tip = sTexts[17] [wxStaticText lChange] text = sTexts[18] [wxStaticText lOperation] text = sTexts[19] [wxChoice cbOperation] id = ID_CHOICE_OP choices = 3 saOperation tip = sTexts[20] proportion = 1 [wxStaticText lOperationMin] text = sTexts[24] [wxSpinCtrl spOperationMin] value = 1 range = 1 65535 tip = sTexts[26] [wxStaticText lOperationMax] text = sTexts[25] [wxSpinCtrl spOperationMax] value = 1 range = 1 65535 tip = sTexts[27] %% header start %% class start class WximgszFrame : public Dk4WxFrame { private: /** Event table for frame. */ DECLARE_EVENT_TABLE() protected: /** Auto start controller. */ Dk4WxAutostartController cas; /** Dark red text colour for group labels. */ wxColour cLabelRed; /** Light red background for table cells. */ wxColour cRed; /** Light green background for table cells. */ wxColour cGreen; /** Yellow background for table cells. */ wxColour cYellow; /** Text colour for table cells. */ wxColour cBlack; /** Image file name to process on autostart. */ wxString sImageFileName; /** Directory previous image file was read from. */ wxString sDirectory; /** Localized texts. */ wxChar const * const *sTexts; /** Non-localized texts. */ wxChar const * const *sNlWx; /** Non-localized texts. */ dkChar const * const *sNlDk; /* __CHANGE__ 011: Add further member variables. */ /** Maximum number of items in grid. */ int maxpass; /** Have image file name. */ bool bImageFileName; /** Flag: Application should still respond to onidle. */ bool bActive; /** Process the file name which was specified on command line. */ void ProcessSpecifiedFileName(void); %% class end public: /** Window IDs used in main window (frame). */ enum { ID_FRAME = (wxID_HIGHEST + 1), /**< Frame. */ ID_HELP_ABOUT , /**< Open information dialog box. */ ID_HELP_TOC , /**< Open help table of contents. */ ID_BUTTON_RUN , /**< Button to run calculation. */ ID_CHOICE_OP , /**< Choice box for operation. */ }; /** Maximum number of passes. */ enum { MAXPASS = 2000 }; /** Maximum image dimension adjustable in spin control. */ enum { /** Maximum image dimension adjustable in spin control. */ MAXIMGDIM = 65535 }; /** Constructor. @param wxid Window ID. @param applicationHelper Application helper object. @param hc Help controller for online help. @param argc Number of command line arguments. @param argv Command line arguments array. @param localizedTexts Localized wxChar texts. @param nlWx Non-localized wxChar texts. @param nlDk Non-localized dkChar texts. */ WximgszFrame( int wxid, Dk4WxApplicationHelper *applicationHelper, Dk4WxHelpController *hc, int argc, wxChar **argv, wxChar const * const *localizedTexts, wxChar const * const *nlWx, dkChar const * const *nlDk ); /** Destructor. */ ~WximgszFrame(); /** Check whether we can close the window. @param isLast Flag: Last main window to close. */ bool CanClose(bool isFinal); /** Handler for File/Open. @param event Event to process. */ void OnFileOpen(wxCommandEvent & event); /** Handler for File/Exit. @param event Event to process. */ void OnQuit(wxCommandEvent & event); /** Handler for Help/About. @param event Event to process. */ void OnAbout(wxCommandEvent & event); /** Handler for Help/Contents. @param event Event to process. */ void OnHelpContents(wxCommandEvent & event); /** Do the calculations and update table. */ void Calculations(void); /** Handler for Run button. @param event Event to process. */ void OnButtonRun(wxCommandEvent & event); /** Handler for operations choice box. @param event Event to process. */ void OnChoiceOperation(wxCommandEvent & event); /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ /** Handler for idle events. */ void OnIdle(wxIdleEvent & event); /* __CHANGE__ 017: Event handlers for further events. */ /* __CHANGE__ 014: Add further methods. */ /** Activate or deactivate idle processing. @param fl Flag to activate/deactivate. */ void ActivateIdleProcessing(bool fl = true); }; %% header end /* vim: set ai sw=4 ts=4 : */ %% module start #include "wximgsz.h" #if !defined(__WXMSW__) #include "gui-img/icons/dkicon.xpm" #endif #include "gui-img/shared/toolbar/run-conversion.xpm" $!trace-include /* __CHANGE__ 017: Add further events. */ /* Hint: Window IDs for main frame members are defined in an enum in the frame class. IDs defined in this enum should have WximgszFrame:: prepended for an optical distinction from predefined window IDs (i.e. from wxWidgets). */ /* __CHANGE__ 008: Remove OnIdle if no idle processing required. When removing the table entry here, remove the entire OnIdle() method. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(WximgszFrame,wxFrame) #else BEGIN_EVENT_TABLE(WximgszFrame,wxFrame) #endif EVT_MENU(\ wxID_OPEN,\ WximgszFrame::OnFileOpen\ ) EVT_MENU(\ wxID_EXIT,\ WximgszFrame::OnQuit\ ) EVT_MENU(\ WximgszFrame::ID_HELP_ABOUT,\ WximgszFrame::OnAbout\ ) EVT_MENU(\ WximgszFrame::ID_HELP_TOC,\ WximgszFrame::OnHelpContents\ ) EVT_BUTTON(\ WximgszFrame::ID_BUTTON_RUN,\ WximgszFrame::OnButtonRun\ ) EVT_CHOICE(\ WximgszFrame::ID_CHOICE_OP,\ WximgszFrame::OnChoiceOperation\ ) EVT_IDLE(\ WximgszFrame::OnIdle\ ) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif /** Image file types we can handle. */ static wxChar const image_files_to_open[] = { wxT("All files (*.*)|*.*") #if wxUSE_LIBPNG wxT("|PNG files (*.png)|*.png") #endif #if wxUSE_LIBJPEG wxT("|JPEG files (*.jpeg)|*.jpeg") wxT("|JPEG files (*.jpg)|*.jpg") #endif #if wxUSE_LIBTIFF wxT("|TIFF files (*.tiff)|*.tiff") wxT("|TIFF files (*.tif)|*.tif") #endif #if wxUSE_GIF wxT("|GIF files (*.gif)|*.gif") #endif #if wxUSE_PCX wxT("|PCX files (*.pcx)|*.pcx") #endif wxT("|BMP files (*.bmp)|*.bmp") #if wxUSE_ICO_CUR wxT("|ICO files (*.ico)|*.ico") wxT("|CUR files (*.cur)|*.cur") #endif #if wxUSE_XPM wxT("|XPM files (*.xpm)|*.xpm") wxT("|XBM files (*.xbm)|*.xbm") #endif #if wxUSE_TGA wxT("|TGA files (*.tga)|*.tga") #endif #if wxUSE_IFF wxT("|IFF files (*.iff)|*.iff") #endif wxT("|ANI files (*.ani)|*.ani") #if wxUSE_PNM wxT("|NetPBM files (*.pam)|*.pam") wxT("|NetPBM files (*.pnm)|*.pnm") wxT("|NetPBM files (*.ppm)|*.ppm") wxT("|NetPBM files (*.pgm)|*.pgm") wxT("|NetPBM files (*.pbm)|*.pbm") #endif }; /** Suffix and bitmap type relationship. */ typedef struct { wxChar const *s; /**< File name suffix. */ wxBitmapType t; /**< Bitmap type. */ } Suffix_and_type_t; /** Array to assign file name suffixes to file types. */ Suffix_and_type_t suffix_and_type[] = { #if wxUSE_LIBPNG { wxT(".png"), wxBITMAP_TYPE_PNG }, #endif #if wxUSE_LIBJPEG { wxT(".jpeg"), wxBITMAP_TYPE_JPEG }, { wxT(".jpg"), wxBITMAP_TYPE_JPEG }, #endif #if wxUSE_LIBTIFF { wxT(".tiff"), wxBITMAP_TYPE_TIFF }, { wxT(".tif"), wxBITMAP_TYPE_TIF }, #endif #if wxUSE_PNM { wxT(".pam"), wxBITMAP_TYPE_PNM }, { wxT(".pnm"), wxBITMAP_TYPE_PNM }, { wxT(".ppm"), wxBITMAP_TYPE_PNM }, { wxT(".pgm"), wxBITMAP_TYPE_PNM }, { wxT(".pbm"), wxBITMAP_TYPE_PNM }, #endif #if wxUSE_XPM { wxT(".xpm"), wxBITMAP_TYPE_XPM }, { wxT(".xbm"), wxBITMAP_TYPE_XBM }, #endif #if wxUSE_ICO_CUR { wxT(".ico"), wxBITMAP_TYPE_ICO }, { wxT(".cur"), wxBITMAP_TYPE_CUR }, #endif #if wxUSE_GIF { wxT(".gif"), wxBITMAP_TYPE_GIF }, #endif #if wxUSE_PCX { wxT(".pcx"), wxBITMAP_TYPE_PCX }, #endif { wxT(".bmp"), wxBITMAP_TYPE_BMP }, #if wxUSE_TGA { wxT(".tga"), wxBITMAP_TYPE_TGA }, #endif #if wxUSE_IFF { wxT(".iff"), wxBITMAP_TYPE_IFF }, #endif { wxT(".ani"), wxBITMAP_TYPE_ANI }, { NULL, wxBITMAP_TYPE_INVALID } }; static wxBitmapType bitmap_type_for_name(wxString & fn) { wxChar const *ptr = NULL; Suffix_and_type_t *sat = NULL; wxBitmapType back = wxBITMAP_TYPE_INVALID; wxCStrData strdata = fn.c_str(); ptr = (wxChar const *)strdata; if (NULL != ptr) { ptr = dk4strx_get_path_suffix(ptr, NULL); if (NULL != ptr) { sat = suffix_and_type; while((NULL != sat->s) && (wxBITMAP_TYPE_INVALID == back)) { if (0 == dk4strx_casecmp(sat->s, ptr)) { back = sat->t; } else { sat++; } } } } return back; } %% constructor start WximgszFrame::WximgszFrame( int wxid, Dk4WxApplicationHelper *applicationHelper, Dk4WxHelpController *hc, int argc, wxChar **argv, wxChar const * const *localizedTexts, wxChar const * const *nlWx, dkChar const * const *nlDk ) : Dk4WxFrame(nlWx[0], applicationHelper, hc, wxid), cas(), cLabelRed(127, 0, 0), cRed(255, 91, 91), cGreen(127, 255, 127), cYellow(255, 255, 0), cBlack(0, 0, 0), sImageFileName((1 < argc)?(argv[1]):(wxT(""))), sDirectory(wxEmptyString) { wxString saOperation[] = { wxString(localizedTexts[21]), wxString(localizedTexts[22]), wxString(localizedTexts[23]) }; $? "+ WximgszFrame::WximgszFrame" /* __CHANGE__ 012: Add further local variables. */ /* __CHANGE__ 012: Initialize further local variables. */ sTexts = localizedTexts; sNlWx = nlWx; sNlDk = nlDk; #if defined(__WXMSW__) wxIcon wximgsz_icon(sNlWx[4]); #else wxIcon wximgsz_icon(xpm_dkicon); #endif /* __CHANGE__ 011: Initialize further class members. */ maxpass = MAXPASS; bActive = false; bImageFileName = false; if (1 < argc) { bImageFileName = true; cas.SetAutoStart(); } %% constructor end if(dkctGUILayoutOK) { lInput->SetForegroundColour(cLabelRed); lChange->SetForegroundColour(cLabelRed); lResults->SetForegroundColour(cLabelRed); #if 0 spInputWidth->SetRange(1, INT_MAX); spInputHeight->SetRange(1, INT_MAX); spOperationMin->SetRange(1, INT_MAX); spOperationMax->SetRange(1, INT_MAX); inputSizer->Fit(spInputWidth); inputSizer->Fit(spInputHeight); inputSizer->Fit(spOperationMin); inputSizer->Fit(spOperationMax); mainSizer->Layout(); #endif cbOperation->SetSelection(0); spOperationMin->Enable(false); spOperationMax->Enable(false); SetTitle(nlWx[0]); #if 0 RestorePosition(); #endif } /* __CHANGE__ 012: Release resources allocated by local variables. */ $? "- WximgszFrame::WximgszFrame" } %% module end WximgszFrame::~WximgszFrame() { $? "+ WximgszFrame::~WximgszFrame" /* __CHANGE__ 011: Release resources allocated by further class members. */ $? "- WximgszFrame::~WximgszFrame" } bool WximgszFrame::CanClose(bool WXUNUSED(isLast)) { bool back = true; $? "+ WximgszFrame::CanClose" /* __CHANGE__ 013: Check for unsaved data. And probably change parameter to "bool WXUNUSED(isLast)" */ $? "- WximgszFrame::CanClose %d", (back ? 1 : 0) return back; } void WximgszFrame::OnFileOpen(wxCommandEvent & WXUNUSED(event)) { dkChar buf[DK4_MAX_PATH]; dk4_bif_t *pbif; const wxChar *ptrFilePath; bool success = false; int dke; int wxe; int res; #if wxCHECK_VERSION(2, 9, 0) wxFileDialog dlg( this, sTexts[42], sDirectory, wxEmptyString, image_files_to_open, (wxFD_OPEN | wxFD_FILE_MUST_EXIST) ); #else wxFileDialog dlg( this, sTexts[42], sDirectory, wxEmptyString, image_files_to_open, wxOPEN ); #endif $? "+ OnFileOpen" if(wxID_OK == dlg.ShowModal()) { wxString pa = dlg.GetPath(); wxFileName wxfn(pa); if (wxfn.FileExists() && wxfn.IsFileReadable()) { sDirectory = dlg.GetDirectory(); { wxCStrData sFilePath = pa.c_str(); ptrFilePath = (wxChar const *)sFilePath; if (NULL != ptrFilePath) { dke = pAppHelp->GetDkEncoding(); wxe = pAppHelp->GetWxEncoding(); res = dk4recwx_wxchar_to_dkchar( buf, DK4_SIZEOF(buf,dkChar), dke, ptrFilePath, wxe, NULL ); if (0 != res) { pbif = dk4bif_open(buf, 1, NULL, NULL); if (NULL != pbif) { dk4_bif_dim_t w = dk4bif_get_width(pbif); dk4_bif_dim_t h = dk4bif_get_height(pbif); if ( ((dk4_im_t)0L < (dk4_im_t)w) && ((dk4_im_t)0L < (dk4_im_t)h) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)w) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)h) ) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } dk4bif_close(pbif); } } } } if (!(success)) { $? ". no success yet" wxBitmapType t = bitmap_type_for_name(pa); if (wxBITMAP_TYPE_INVALID != t) { $? ". file suffix ok" wxBitmap bm(pa, t); if (bm.IsOk()) { int w = bm.GetWidth(); int h = bm.GetHeight(); if ((0 < w) && (0 < h)) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } else { $? "! dimensions" wxMessageBox( sTexts[44], sTexts[43], (wxOK | wxCENTRE | wxICON_ERROR) ); } } else { $? "! bitmap not ok" wxMessageBox( sTexts[44], sTexts[43], (wxOK | wxCENTRE | wxICON_ERROR) ); } } else { wxString s(sTexts[49]); s.Append(pa); s.Append(sTexts[50]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); } } if(success) { Calculations(); } } else { if (!(wxfn.FileExists())) { $? "! no such file" wxString s(sTexts[45]); s.Append(pa); s.Append(sTexts[46]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); } else { if (!(wxfn.IsFileReadable())) { $? "! permissions" wxString s(sTexts[47]); s.Append(pa); s.Append(sTexts[48]); wxMessageBox( s,wxString(sTexts[43]),(wxOK | wxCENTRE | wxICON_ERROR) ); } } } } $? "- OnFileOpen" Refresh(); Update(); } void WximgszFrame::OnQuit(wxCommandEvent & WXUNUSED(event)) { $? "+ WximgszFrame::OnQuit" bActive = false; $? "- WximgszFrame::OnQuit" Close(); } void WximgszFrame::OnAbout(wxCommandEvent & WXUNUSED(event)) { wxString text(wxT("")); wxString title(wxT("")); $? "+ WximgszFrame::OnAbout" /* Construct message text. */ text.Append(sNlWx[0]); text.Append(sNlWx[7]); #if 0 text.Append(sNlWx[1]); #endif text.Append(DKT_VERSION_WX); text.Append(sNlWx[8]); text.Append(sTexts[9]); text.Append(sNlWx[2]); text.Append(sNlWx[8]); text.Append(sNlWx[8]); text.Append(sTexts[11]); text.Append(sNlWx[8]); text.Append(sNlWx[9]); text.Append(sNlWx[8]); text.Append(sNlWx[8]); text.Append(sTexts[12]); text.Append(sNlWx[8]); text.Append(sNlWx[10]); text.Append(sNlWx[8]); text.Append(sNlWx[11]); text.Append(sNlWx[8]); text.Append(sNlWx[12]); text.Append(sNlWx[8]); text.Append(sNlWx[13]); text.Append(sNlWx[8]); text.Append(sNlWx[14]); text.Append(sNlWx[8]); text.Append(sNlWx[15]); text.Append(sNlWx[8]); /* Construct dialog box title. */ title.Append(sTexts[10]); title.Append(sNlWx[0]); /* Show dialog box. */ wxMessageBox(text, title); /* __CHANGE__ 019: Create better about box. */ $? "- WximgszFrame::OnAbout" } void WximgszFrame::OnHelpContents(wxCommandEvent & WXUNUSED(event)) { $? "+ WximgszFrame::OnHelpContents" DisplayContents(); $? "- WximgszFrame::OnHelpContents" } static int bits_in_int(int x) { int back = 0; int test = 1; int done = 0; while (0 == done) { if (0 != (x & test)) { if (1 < ++back) { done = 1; } } if ((INT_MAX / 2) >= test) { test = test * 2; if (test > x) { done = 1; } } else { done = 1; } } return back; } static int is_power_of_2(int x) { int back = 0; if (1 == bits_in_int(x)) { back = 1; } return back; } static int quality_for_fraction(int counter, int denom) { int back = 0; if (1 == denom) { back = 1; if (0 != is_power_of_2(counter)) { back = 2; } } else { if (1 == counter) { back = 1; if (0 != is_power_of_2(denom)) { back = 2; } } } return back; } static int gcd(int a, int b) { int h; $? "+ gcd a=%d b=%d", a, b while (0 < b) { h = a % b; a = b; b = h; } $? "- gcd %d", a return a; } /* __CHANGE__ 017: Event handlers for further events. */ void WximgszFrame::Calculations(void) { wxString s1; /* Width */ wxString s2; /* Height */ wxString s3; /* Factor */ wxString m2(sTexts[36]); wxString m1(sTexts[35]); wxString m0(sTexts[34]); int w_ori; /* Original width */ int h_ori; /* Original height */ int w_min; /* Minimum width */ int h_min; /* Minimum height */ int gcd_ori; /* Greatest common divisor original width height */ int min; /* Destination range minimum */ int max; /* Destination range maximum */ int opsel; /* Operation selection */ int f_min; /* Minimum factor */ int f_max; /* Maximum factor */ int nrows; /* Number of table rows */ int passno; /* Current pass number (table row index) */ int f; /* Current factor */ int w; /* Current width */ int h; /* Current height */ int counter; /* Fraction counter */ int denom; /* Fraction denominator */ int gcd_fr; /* Fraction greatest common divisor */ int q; /* Fraction quality */ int i; /* Walk through the columns */ bool bDidSkip; /* Flag: Restricted output to 2000 columns */ $? "+ Calculations" bDidSkip = false; w_ori = spInputWidth->GetValue(); h_ori = spInputHeight->GetValue(); min = spOperationMin->GetValue(); max = spOperationMax->GetValue(); opsel = cbOperation->GetSelection(); if (0 >= w_ori) { w_ori = 1; } if (0 >= h_ori) { h_ori = 1; } if (0 >= min) { min = 1; } if (0 >= max) { max = 1; } gcd_ori = gcd(w_ori, h_ori); w_min = w_ori / gcd_ori; h_min = h_ori / gcd_ori; f_min = 1; f_max = gcd_ori; switch (opsel) { case 1: { f_min = min / w_min; f_max = max / w_min; if (0 >= f_min) { f_min = 1; } if (0 >= f_max) { f_max = 1; } } break; case 2: { f_min = min / h_min; f_max = max / h_min; if (0 >= f_min) { f_min = 1; } if (0 >= f_max) { f_max = 1; } } break; } nrows = f_max - f_min + 1; if (nrows > maxpass) { nrows = maxpass; bDidSkip = true; } /* Delete old table columns, allocate new columns */ passno = tResult->GetNumberRows(); tResult->DeleteRows(0, passno); tResult->AppendRows(nrows); /* Fill table */ passno = 0; f = f_min; while (passno < nrows) { w = f * w_min; h = f * h_min; gcd_fr = gcd(f, gcd_ori); counter = f / gcd_fr; denom = gcd_ori / gcd_fr; q = quality_for_fraction(counter, denom); s1.Printf(wxT("%d"), w); s2.Printf(wxT("%d"), h); if (1 == denom) { s3.Printf(wxT("%d"), counter); } else { s3.Printf(wxT("%d / %d"), counter, denom); } for (i = 0; i < 4; i++) { tResult->SetCellTextColour(passno, i, cBlack); } tResult->SetCellValue(passno, 0, s1); tResult->SetCellValue(passno, 1, s2); tResult->SetCellValue(passno, 2, s3); switch (q) { case 2: { tResult->SetCellValue(passno, 3, m2); for (i = 0; i < 4; i++) { tResult->SetCellBackgroundColour( passno, i, cGreen ); } } break; case 1: { tResult->SetCellValue(passno, 3, m1); for (i = 0; i < 4; i++) { tResult->SetCellBackgroundColour( passno, i, cYellow ); } } break; case 0: { tResult->SetCellValue(passno, 3, m0); for (i = 0; i < 4; i++) { tResult->SetCellBackgroundColour( passno, i, cRed ); } } break; } tResult->SetCellAlignment(passno, 0, wxALIGN_CENTRE, wxALIGN_CENTRE); tResult->SetCellAlignment(passno, 1, wxALIGN_CENTRE, wxALIGN_CENTRE); tResult->SetCellAlignment(passno, 2, wxALIGN_CENTRE, wxALIGN_CENTRE); tResult->SetCellAlignment(passno, 3, wxALIGN_CENTRE, wxALIGN_CENTRE); passno++; f++; } tResult->AutoSizeColumns(); tResult->EnableDragColSize(true); if (bDidSkip) { wxMessageBox( sTexts[39], sTexts[38], (wxOK | wxCENTRE | wxICON_ERROR)); } $? "- Calculations" } void WximgszFrame::OnButtonRun(wxCommandEvent & WXUNUSED(event)) { $? "+ OnButtonRun" Calculations(); $? "- OnButtonRun" Refresh(); Update(); } void WximgszFrame::OnChoiceOperation(wxCommandEvent & WXUNUSED(event)) { $? "+ OnChoiceOperation" switch (cbOperation->GetSelection()) { case 2 : case 1 : { spOperationMin->Enable(); spOperationMax->Enable(); } break; default : { spOperationMin->Enable(false); spOperationMax->Enable(false); } break; } $? "- OnChoiceOperation" Refresh(); Update(); } /* __CHANGE__ 014: Implementation of further methods. */ void WximgszFrame::ActivateIdleProcessing(bool fl) { bActive = fl; } void WximgszFrame::ProcessSpecifiedFileName(void) { dkChar buf[DK4_MAX_PATH]; wxChar const *ptrImageFileName; dk4_bif_t *pbif; int dke; int wxe; int res; bool success; $? "+ ProcessSpecifiedFileName" success = false; wxFileName wxfn(sImageFileName); if (wxfn.FileExists() && wxfn.IsFileReadable()) { wxCStrData csImageFileName = sImageFileName.c_str(); ptrImageFileName = (wxChar const *)csImageFileName; if (NULL != ptrImageFileName) { $? ". have wxChar file name" dke = pAppHelp->GetDkEncoding(); wxe = pAppHelp->GetWxEncoding(); res = dk4recwx_wxchar_to_dkchar( buf, DK4_SIZEOF(buf,dkChar), dke, ptrImageFileName, wxe, NULL ); if (0 != res) { $? ". have dkChar file name" pbif = dk4bif_open(buf, 1, NULL, NULL); if (NULL != pbif) { dk4_bif_dim_t w = dk4bif_get_width(pbif); dk4_bif_dim_t h = dk4bif_get_height(pbif); if ( ((dk4_im_t)0L < (dk4_im_t)w) && ((dk4_im_t)0L < (dk4_im_t)h) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)w) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)h) ) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } #if TRACE_DEBUG else { $? "! dimensions out of range" } #endif dk4bif_close(pbif); } #if TRACE_DEBUG else { $? "! failed to open bif" } #endif } #if TRACE_DEBUG else { $? "! no dkChar file name" } #endif } #if TRACE_DEBUG else { $? "! no wxChar file name" } #endif if (!(success)) { $? ". not yet succeeded" wxBitmapType t = bitmap_type_for_name(sImageFileName); if (wxBITMAP_TYPE_INVALID != t) { $? ". valid file type" wxBitmap bm(sImageFileName, t); if (bm.IsOk()) { int w = bm.GetWidth(); int h = bm.GetHeight(); if ((0 < w) && (0 < h)) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } else { $? "! dimensions out of range" #if 0 wxMessageBox( sTexts[44], sTexts[43], (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } else { $? "! bitmap not ok" #if 0 wxMessageBox( sTexts[44],sTexts[43],(wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } else { $? "! invalid file suffix" #if 0 wxString s(sTexts[49]); s.Append(sImageFileName); s.Append(sTexts[50]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } if (success) { Calculations(); } } else { if (!(wxfn.FileExists())) { $? "! no such file" #if 0 wxString s(sTexts[45]); s.Append(sImageFileName); s.Append(sTexts[46]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } else { if (!(wxfn.IsFileReadable())) { $? "! permissions" #if 0 wxString s(sTexts[47]); s.Append(sImageFileName); s.Append(sTexts[48]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } } $? "- ProcessSpecifiedFileName" } /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ /* __CHANGE__ 008: Remove the request for more events if not needed. */ /* __CHANGE__ 008: Decide about Skip() call. The function name is irritating: Skip() or Skip(true) will continue to process the event, calling default handlers. Skip(false) or handlers without Skip() will skip further processing of the event. From the wxWidgets documenation: Skip() should be called for all non-command events to allow the default handling to take place. The command events are, however, normally not skipped as usually a single command such as a button click or menu item selection must only be processed by one handler. So my recommendation is to have a Skip() call in the idle event handler. */ void WximgszFrame::OnIdle(wxIdleEvent & event) { bool rqm = false; $? "+ WximgszFrame::OnIdle" /* __CHANGE__ */ if (bActive) { switch (cas.GetReaction()) { case Dk4WxAutostartController::REACTION_START : { cas.StartProcessing(); ProcessSpecifiedFileName(); cas.EndProcessing(); Refresh(); Update(); } break; } if (rqm) { event.RequestMore(); } } $? "- WximgszFrame::OnIdle" event.Skip(); } /* vim: set ai sw=4 ts=4 : */