%% options copyright owner = Dirk Krause copyright year = 2018-xxxx SPDX-License-Identifier: BSD-3-Clause %% wx-gui type = frame contents = mainSizer icon = wxbmpp_icon status bar = 1 sTexts[8] menu bar = mbMain tool bar = tbMain [wxMenuBar mbMain] contents = menuFile contents = menuConversion contents = menuExtras contents = menuHelp [wxMenu menuFile] text = sTexts[0] contents = miFileDirectory contents = miFileExit [wxMenu menuConversion] text = sTexts[67] contents = miConversionRun [wxMenuItem miFileDirectory] id = Bmpp4Frame_Choose_Directory text = sTexts[65] tip = sTexts[66] [wxMenuItem miFileExit] id = Bmpp4Frame_Quit text = sTexts[1] tip = sTexts[2] [wxMenuItem miConversionRun] id = Bmpp4Frame_Run_Conversion text = sTexts[68] tip = sTexts[69] [wxMenu menuExtras] text = sTexts[72] contents = miExtrasOptionReset [wxMenuItem miExtrasOptionReset] text = sTexts[73] id = Bmpp4Frame_Reset_Options tip = sTexts[122] [wxMenu menuHelp] text = sTexts[3] contents = miHelpAbout contents = miHelpContents [wxMenuItem miHelpAbout] id = Bmpp4Frame_Help_About text = sTexts[4] tip = sTexts[5] [wxMenuItem miHelpContents] id = Bmpp4Frame_Help_Contents text = sTexts[6] tip = sTexts[7] [wxToolBar tbMain] contents = bChooseDir contents = bRunConversion [wxToolBarToolBase bChooseDir] bitmap = xpm_choose_dir text = sTexts[65] tip = sTexts[66] id = Bmpp4Frame_Choose_Directory [wxToolBarToolBase bRunConversion] bitmap = xpm_run_conversion text = sTexts[68] tip = sTexts[69] id = Bmpp4Frame_Run_Conversion [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) [wxGridBagSizer contentsSizer] grid = 5 5 # __CHANGE__ 015: The dummy label was added to have at least # one GUI element in the sizer. # Remove lDummy (next 4 lines) and add the real # window contents here. contents = staticline0 0 0 1 11 centered-x centered-y contents = lDirectoryName +1 0 1 11 centered-x centered-y contents = staticline1 +1 0 1 11 centered-x centered-y contents = cbMakeMode +1 0 1 7 left centered-y contents = cbColorOutput . 7 1 1 left centered-y contents = $space(10,1) . +1 1 1 left centered-y contents = lRgbToGray . +1 1 1 left centered-y contents = chRgbToGray . +1 1 1 left centered-y contents = lOutputMode +1 0 1 1 right centered-y contents = chOutputMode . +1 1 2 left centered-y contents = cbImgInterpolation . 7 1 4 left centered-y contents = lPsLevel +1 0 1 1 right centered-y contents = chPsLevel . +1 1 1 left centered-y # contents = $space(10,1) . +1 1 1 left centered-y contents = cbDsc . +1 1 1 left centered-y # contents = $space(10,1) . +1 1 1 left centered-y contents = cbLzw . +1 1 1 left centered-y # contents = $space(10,1) . +1 1 1 left centered-y contents = cbDct . 7 1 4 left centered-y contents = lPaperSize +1 0 1 1 right centered-y # Choice box for Paper sizes here contents = chPaperSizes . +1 1 2 left centered-y contents = cbRotation . 3 1 2 left centered-y contents = cbDctInterpolation . 7 1 4 left centered-y contents = lFinishing +1 0 1 1 right centered-y contents = chFinishing . +1 1 2 left centered-y contents = cbAnBpc . 7 1 4 left centered-y contents = lResolution +1 0 1 1 right centered-y contents = chResolution . +1 1 2 left centered-y contents = tfResolution . 3 1 1 left centered-y contents = cbAnColor . 7 1 4 left centered-y contents = lBackground +1 0 1 1 right centered-y contents = ccBackground . +1 1 1 left centered-y contents = cbBackground . 2 1 3 left centered-y contents = cbAnAlpha . 7 1 4 left centered-y [wxStaticLine staticline0] grow = yes [wxStaticText lDirectoryName] text = slDirname text style = left grow = yes [wxStaticLine staticline1] grow = yes [wxCheckBox cbMakeMode] text = sTexts[13] tip = sTexts[14] [wxCheckBox cbColorOutput] text = sTexts[15] tip = sTexts[16] id = Bmpp4Frame_Color_Output [wxStaticText lRgbToGray] text = sTexts[89] [wxChoice chRgbToGray] choices = 13 saRgbToGray tip = sTexts[90] [wxStaticText lOutputMode] text = sTexts[17] [wxChoice chOutputMode] choices = 6 saOutputMode tip = sTexts[24] grow = yes id = Bmpp4Frame_Output_Type [wxCheckBox cbImgInterpolation] text = sTexts[25] tip = sTexts[26] id = Bmpp4Frame_Change_Interpolation [wxStaticText lPsLevel] text = sTexts[27] [wxChoice chPsLevel] choices = 2 saPsLevel tip = sTexts[30] id = Bmpp4Frame_PS_Level [wxCheckBox cbDsc] text = sTexts[31] tip = sTexts[32] [wxCheckBox cbLzw] text = sTexts[33] tip = sTexts[34] [wxCheckBox cbDct] text = sTexts[35] tip = sTexts[36] [wxStaticText lPaperSize] text = sTexts[37] [wxChoice chPaperSizes] choices = asPaperSizes tip = sTexts[38] grow = yes [wxCheckBox cbRotation] text = sTexts[39] tip = sTexts[40] [wxCheckBox cbDctInterpolation] text = sTexts[41] tip = sTexts[42] [wxStaticText lFinishing] text = sTexts[43] [wxChoice chFinishing] choices = 3 saFinishing tip = sTexts[47] grow = yes [wxCheckBox cbAnBpc] text = sTexts[48] tip = sTexts[49] [wxStaticText lResolution] text = sTexts[50] [wxChoice chResolution] choices = 3 saResolution tip = sTexts[51] grow = yes id = Bmpp4Frame_Resolution [wxTextCtrl tfResolution] text = sTexts[55] grow = yes [wxCheckBox cbAnColor] text = sTexts[57] tip = sTexts[58] [wxStaticText lBackground] text = sTexts[59] [Dk4WxColourView ccBackground] constructor = applicationHelper, 255, 255, 255 tip = sTexts[60] [wxCheckBox cbBackground] text = sTexts[61] tip = sTexts[62] [wxCheckBox cbAnAlpha] text = sTexts[63] tip = sTexts[64] %% header start %% class start class Bmpp4Frame : public Dk4WxFrame { private: /** Event table for frame. */ #if wxCHECK_VERSION(3,0,0) wxDECLARE_EVENT_TABLE(); #else DECLARE_EVENT_TABLE() #endif private: /** Start time. */ dk4_time_t firsttime; /** We are already correcting GUI, no recursive attempt. */ bool bIsCorrecting; protected: /** Auto start controller. */ Dk4WxAutostartController oAsc; /** Text color for status text on error. */ wxColour cRed; /** Text color for status text on success. */ wxColour cGreen; /** Normal text color. */ wxColour cBlack; /** 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. */ /** Graphics output configuration. */ dk4_gra_conf_t graconf; /** Known paper sizes. */ dk4_paper_size_t *pPaperSizes; /** Paper sizes. */ wxArrayString asPaperSizes; /** Directory name. */ wxString sDirname; /** Number of paper sizes in asPaperSizes. */ size_t szPaperSizes; /** Restore and save graphics conversion settings. */ bool bRestoreGx; /** Restore and save Make mode setting. */ bool bRestoreMake; /** Restore and save location to process. */ bool bRestoreLocation; /** Make mode setting from options, if not restored. */ bool bMakeMode; /** Automatically start. */ bool bAutorun; /** Flag: Processing idle events. */ bool bActive; %% class end public: /** Constructor. @param wxid Window ID. @param applicationHelper Application helper object. @param hc Help controller for online help. @param localizedTexts Localized wxChar texts. @param nlWx Non-localized wxChar texts. @param nlDk Non-localized dkChar texts. */ Bmpp4Frame( int wxid, Dk4WxApplicationHelper *applicationHelper, Dk4WxHelpController *hc, wxChar const * const *localizedTexts, wxChar const * const *nlWx, dkChar const * const *nlDk, dk4_gra_conf_t *pgc, wxArrayString *pPapSiz, wxChar *pDir, size_t szPap, bool bRGx, bool bRMa, bool bRLo, bool bMak, bool bRun, dk4_paper_size_t *pSizes ); /** Destructor. */ ~Bmpp4Frame(); /** Check whether we can close the window. @param isLast Flag: Last main window to close. */ bool CanClose(bool isFinal); /** Save current settings. */ void SaveSettings(void); /** Restore settings from previous session. */ void RestoreSettings(void); /** Modify enabled or disabled state of GUI components. */ void CorrectGUI(void); /** Check for documents whether paper size is usable. @return True on success, false on error. */ bool CheckPaperSizeForDocuments(void); /** Run Conversion. @return True on success, false on error. */ bool RunConversion(void); /** 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); /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ /** Handler for idle events. */ void OnIdle(wxIdleEvent & event); /* __CHANGE__ 017: Event handlers for further events. */ /** Handler for choose directory command. */ void OnChooseDirectory(wxCommandEvent & event); /** Handler for reset options command. */ void OnResetOptions(wxCommandEvent & event); /** Handler for run conversion command. */ void OnRunConversion(wxCommandEvent & event); /** Handler for output type change. */ void OnOutputType(wxCommandEvent & event); /** Handler for PS level change. */ void OnPSLevel(wxCommandEvent & event); /** Handler for resolution setting change. */ void OnResolution(wxCommandEvent & event); /** Handler for interpolation checkbox change. */ void OnInterpolationChange(wxCommandEvent & event); /** Handler for color output checkbox change. */ void OnColorOutput(wxCommandEvent & event); /* __CHANGE__ 014: Add further methods. */ /** Place configuration settings from graconf to GUI. */ void ConfigurationToGUI(void); /** Fill graconf from GUI. */ void ConfigurationFromGUI(void); }; %% header end /* vim: set ai sw=4 ts=4 : */ %% module start #include "wxbmpp.h" #if !defined(__WXMSW__) #include "gui-img/icons/dkicon.xpm" #endif #include "gui-img/shared/toolbar/choose-dir.xpm" #include "gui-img/shared/toolbar/run-conversion.xpm" #ifndef DK4MAIXDBL_H_INCLUDED #include "dk4maixdbl.h" #endif #ifndef DK4MAOXDBL_H_INCLUDED #include "dk4maoxdbl.h" #endif $!trace-include /* __CHANGE__ 017: Add further events. */ /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(Bmpp4Frame,wxFrame) #else BEGIN_EVENT_TABLE(Bmpp4Frame,wxFrame) #endif EVT_MENU(Bmpp4Frame_Quit, Bmpp4Frame::OnQuit) EVT_MENU(Bmpp4Frame_Help_About, Bmpp4Frame::OnAbout) EVT_MENU(Bmpp4Frame_Help_Contents, Bmpp4Frame::OnHelpContents) EVT_MENU(Bmpp4Frame_Choose_Directory, Bmpp4Frame::OnChooseDirectory) EVT_MENU(Bmpp4Frame_Run_Conversion, Bmpp4Frame::OnRunConversion) EVT_MENU(Bmpp4Frame_Reset_Options, Bmpp4Frame::OnResetOptions) EVT_CHOICE(Bmpp4Frame_Output_Type, Bmpp4Frame::OnOutputType) EVT_CHOICE(Bmpp4Frame_PS_Level, Bmpp4Frame::OnPSLevel) EVT_CHOICE(Bmpp4Frame_Resolution, Bmpp4Frame::OnResolution) EVT_CHECKBOX(Bmpp4Frame_Color_Output, Bmpp4Frame::OnColorOutput) EVT_CHECKBOX(Bmpp4Frame_Change_Interpolation, Bmpp4Frame::OnInterpolationChange) EVT_IDLE(Bmpp4Frame::OnIdle) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif /** Option name to restore make setting. */ static const wxChar * const i_dir_names[] = { $!string-table macro=wxT wxbmpp.location $!end }; /** Option name to restore make setting. */ static const wxChar * const i_make_names[] = { $!string-table macro=wxT wxbmpp.make $!end }; /** Names for saving and restoring options. */ static const wxChar * const i_option_names[] = { $!string-table macro=wxT wxbmpp.paper.choice wxbmpp.output.type wxbmpp.output.color wxbmpp.ps.level wxbmpp.ps.dsc wxbmpp.ps.lzw wxbmpp.paper.rotate wxbmpp.paper.duplex wxbmpp.resolution.type wxbmpp.image.background.red wxbmpp.image.background.green wxbmpp.image.background.blue wxbmpp.image.bg.enforce wxbmpp.image.interpolation wxbmpp.image.dct wxbmpp.image.dct-interpolation wxbmpp.image.analysis.bpc wxbmpp.image.analysis.color wxbmpp.image.analysis.alpha wxbmpp.image.rgb-to-gray $!end }; #if 0 /** Names for saving and restoring options. */ static const wxChar * const s_option_names[] = { $!string-table macro=wxT wxbmpp.paper.name $!end }; #endif #if 0 /** Names for saving and restoring options. */ static const wxChar * const d_option_names[] = { $!string-table macro=wxT wxbmpp.resolution.value $!end }; #endif %% constructor start Bmpp4Frame::Bmpp4Frame( int wxid, Dk4WxApplicationHelper *applicationHelper, Dk4WxHelpController *hc, wxChar const * const *localizedTexts, wxChar const * const *nlWx, dkChar const * const *nlDk, dk4_gra_conf_t *pgc, wxArrayString *pPapSiz, wxChar *pDir, size_t szPap, bool bRGx, bool bRMa, bool bRLo, bool bMak, bool bRun, dk4_paper_size_t *pSizes ) : Dk4WxFrame(nlWx[0], applicationHelper, hc, wxid), cRed(127, 0, 0), cGreen(0, 127, 0), cBlack(0, 0, 0), asPaperSizes(*pPapSiz) { wxString saOutputMode[] = { wxString(localizedTexts[18]), wxString(localizedTexts[19]), wxString(localizedTexts[20]), wxString(localizedTexts[21]), wxString(localizedTexts[22]), wxString(localizedTexts[23]) }; wxString saPsLevel[] = { wxString(localizedTexts[28]), wxString(localizedTexts[29]) }; wxString saFinishing[] = { wxString(localizedTexts[44]), wxString(localizedTexts[45]), wxString(localizedTexts[46]) }; wxString saResolution[] = { wxString(localizedTexts[52]), wxString(localizedTexts[53]), wxString(localizedTexts[54]) }; wxString saRgbToGray[] = { wxString(localizedTexts[76]), wxString(localizedTexts[77]), wxString(localizedTexts[78]), wxString(localizedTexts[79]), wxString(localizedTexts[80]), wxString(localizedTexts[81]), wxString(localizedTexts[82]), wxString(localizedTexts[83]), wxString(localizedTexts[84]), wxString(localizedTexts[85]), wxString(localizedTexts[86]), wxString(localizedTexts[87]), wxString(localizedTexts[88]) }; wxString slDirname(localizedTexts[70]); $? "+ Bmpp4Frame::Bmpp4Frame" /* __CHANGE__ 012: Add further local variables. */ /* __CHANGE__ 012: Initialize further local variables. */ bIsCorrecting = false; sTexts = localizedTexts; sNlWx = nlWx; sNlDk = nlDk; #if defined(__WXMSW__) wxIcon wxbmpp_icon(sNlWx[4]); #else wxIcon wxbmpp_icon(xpm_dkicon); #endif /* __CHANGE__ 011: Initialize further class members. */ pPaperSizes = pSizes; DK4_MEMCPY(&graconf,pgc,sizeof(dk4_gra_conf_t)); if (NULL != pDir) { sDirname = wxString(pDir); slDirname = sDirname; } szPaperSizes = szPap; bRestoreGx = bRGx; bRestoreMake = bRMa; bRestoreLocation = bRLo; bMakeMode = bMak; bAutorun = bRun; if (bAutorun) { oAsc.SetAutoStart(true); oAsc.SetAutoExit(true); } else { oAsc.SetAutoStart(false); oAsc.SetAutoExit(false); } bActive = true; dk4time_get(&firsttime); %% constructor end if(dkctGUILayoutOK) { chOutputMode->SetSelection(0); chPsLevel->SetSelection(0); chFinishing->SetSelection(0); chResolution->SetSelection(0); chPaperSizes->SetSelection(0); chRgbToGray->SetSelection(0); CorrectGUI(); SetTitle(nlWx[0]); #if 0 /* 2018-05-27 Test for setActive() method. This line was added temporarily just to test the new setActive() method. */ ccBackground->SetActive(false); $? ". ccBackground inactive" #endif ccBackground->SetPlaceColourChooser(); } /* __CHANGE__ 012: Release resources allocated by local variables. */ $? "- Bmpp4Frame::Bmpp4Frame" } %% module end Bmpp4Frame::~Bmpp4Frame() { $? "+ Bmpp4Frame::~Bmpp4Frame" /* __CHANGE__ 011: Release resources allocated by further class members. */ $? "- Bmpp4Frame::~Bmpp4Frame" } bool Bmpp4Frame::CanClose(bool isLast) { bool back = true; $? "+ Bmpp4Frame::CanClose isLast=%d", (isLast ? 1 : 0) /* __CHANGE__ 013: Check for unsaved data. */ if (isLast) { SaveSettings(); } $? "- Bmpp4Frame::CanClose %d", (back ? 1 : 0) return back; } void Bmpp4Frame::OnQuit(wxCommandEvent & WXUNUSED(event)) { $? "+ Bmpp4Frame::OnQuit" $? "- Bmpp4Frame::OnQuit" Close(); } void Bmpp4Frame::OnAbout(wxCommandEvent & WXUNUSED(event)) { wxString text(wxT("")); wxString title(wxT("")); $? "+ Bmpp4Frame::OnAbout" /* Construct message text. */ text.Append(sNlWx[0]); text.Append(sNlWx[7]); #if 0 text.Append(sNlWx[1]); #else text.Append(DKT_VERSION_WX); #endif 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. */ $? "- Bmpp4Frame::OnAbout" } void Bmpp4Frame::OnHelpContents(wxCommandEvent & WXUNUSED(event)) { $? "+ Bmpp4Frame::OnHelpContents" DisplayContents(); $? "- Bmpp4Frame::OnHelpContents" } /* __CHANGE__ 017: Event handlers for further events. */ void Bmpp4Frame::OnChooseDirectory(wxCommandEvent & WXUNUSED(event)) { $? "+ Bmpp4Frame::OnChooseDirectory" wxDirDialog dd( this, sTexts[71], sDirname, (wxDD_DIR_MUST_EXIST | wxDD_CHANGE_DIR) ); pAppHelp->ChooseChildPosition(*this, dd, false); if(dd.ShowModal() == wxID_OK) { sDirname = dd.GetPath(); lDirectoryName->SetLabel(sDirname); #if 0 lDirectoryName->(wxALIGN_CENTRE_HORIZONTAL); #endif Refresh(); Update(); } else { } $? "- Bmpp4Frame::OnChooseDirectory" } void Bmpp4Frame::OnResetOptions(wxCommandEvent & WXUNUSED(event)) { wxString sA4(wxT("a4")); int res; $? "+ OnResetOptions" res = wxMessageBox( sTexts[75], sTexts[74], (wxNO_DEFAULT | wxYES_NO | wxICON_QUESTION) ); if (wxYES == res) { dk4gra_conf_init(&graconf); res = asPaperSizes.Index(sA4); if (wxNOT_FOUND != res) { chPaperSizes->SetSelection(res); dk4mem_cpy( &(graconf.media), &(pPaperSizes[res]), sizeof(dk4_paper_size_t), NULL ); graconf.media.name = NULL; graconf.psi = (size_t)res; graconf.have_psi = 1; } ConfigurationToGUI(); CorrectGUI(); } $? "- OnResetOptions" } bool Bmpp4Frame::CheckPaperSizeForDocuments(void) { bool back = true; if (DK4_GRA_PURPOSE_DOCUMENT == graconf.purpose) { if (graconf.media.w < (graconf.media.i + graconf.media.o)) { back = false; } if (graconf.media.h < (graconf.media.b + graconf.media.t)) { back = false; } } return back; } bool Bmpp4Frame::RunConversion(void) { wxString errorString(wxT("")); bool back = false; $? "+ RunConversion" /* Transfer GUI state to grahpics output configuration if not specified on the command line. */ if (bRestoreGx) { ConfigurationFromGUI(); } if (!(bAutorun)) { bMakeMode = ((0 != cbMakeMode->GetValue()) ? (true) : (false)); } /* Check for usable paper size */ if (CheckPaperSizeForDocuments()) { /* Do conversion operations in idle events or modal dialog. */ Bmpp4Progress dPro( this, pAppHelp, sTexts, sDirname, &graconf, bMakeMode, &errorString ); if (dPro.PrepareProcessing()) { $? ". show windows and run processing" pAppHelp->ChooseChildPosition(*this, dPro); if (wxID_OK == dPro.ShowModal()) { back = true; } else { $? "! aborted or errors" /* ERRROR: Aborted or errors */ wxMessageBox( errorString, sTexts[102], (wxOK | wxCENTRE | wxICON_ERROR), this ); } $? ". processing done" } else { $? "! failed to prepare processing" /* ERROR: Failed to prepare processing */ wxMessageBox( errorString, sTexts[102], (wxOK | wxCENTRE | wxICON_ERROR), this ); } $? ". going to clean up" dPro.Cleanup(); $? ". clean up done" } else { $? "! unusable paper size" /* ERROR: Unusable paper size */ wxMessageBox( sTexts[111], sTexts[102], (wxOK | wxCENTRE | wxICON_ERROR), this ); } $? "- RunConversion %d", ((back) ? (1) : (0)) return back; } void Bmpp4Frame::OnRunConversion(wxCommandEvent & WXUNUSED(event)) { $? "+ Bmpp4Frame::OnRunConversion" (void)RunConversion(); $? "- Bmpp4Frame::OnRunConversion" } void Bmpp4Frame::OnOutputType(wxCommandEvent & WXUNUSED(event)) { $? "+ OnOutputType" CorrectGUI(); $? "- OnOutputType" } void Bmpp4Frame::OnPSLevel(wxCommandEvent & WXUNUSED(event)) { $? "+ OnPSLevel" CorrectGUI(); $? "- OnPSLevel" } void Bmpp4Frame::OnResolution(wxCommandEvent & WXUNUSED(event)) { $? "+ OnResolution" CorrectGUI(); $? "- OnResolution" } void Bmpp4Frame::OnInterpolationChange(wxCommandEvent & WXUNUSED(event)) { $? "+ OnInterpolationChange" CorrectGUI(); $? "- OnInterpolationChange" } void Bmpp4Frame::OnColorOutput(wxCommandEvent & WXUNUSED(event)) { $? "+ OnColorOutput" CorrectGUI(); $? "- OnColorOutput" } /* __CHANGE__ 014: Implementation of further methods. */ void Bmpp4Frame::SaveSettings(void) { int ival[20]; size_t i; $? "+ SaveSettings" if (bRestoreGx) { $? ". save conversion settings" for (i = 0; i < DK4_SIZEOF(ival,int); i++) { ival[i] = 0; } ival[ 0] = chPaperSizes->GetSelection(); ival[ 1] = chOutputMode->GetSelection(); ival[ 2] = cbColorOutput->GetValue(); ival[ 3] = chPsLevel->GetSelection(); ival[ 4] = cbDsc->GetValue(); ival[ 5] = cbLzw->GetValue(); ival[ 6] = cbRotation->GetValue(); ival[ 7] = chFinishing->GetSelection(); ival[ 8] = chResolution->GetSelection(); ival[ 9] = ccBackground->Red(); ival[10] = ccBackground->Green(); ival[11] = ccBackground->Blue(); ival[12] = cbBackground->GetValue(); ival[13] = cbImgInterpolation->GetValue(); ival[14] = cbDct->GetValue(); ival[15] = cbDctInterpolation->GetValue(); ival[16] = cbAnBpc->GetValue(); ival[17] = cbAnColor->GetValue(); ival[18] = cbAnAlpha->GetValue(); ival[19] = chRgbToGray->GetSelection(); pAppHelp->SetMultiple(i_option_names, ival, 20); } if (bRestoreMake) { $? ". save make mode settings" ival[0] = cbMakeMode->GetValue(); pAppHelp->SetMultiple(i_make_names, ival, 1); } if (bRestoreLocation) { $? ". save location" pAppHelp->SetString(i_dir_names[0], sDirname); } $? "- SaveSettings" } void Bmpp4Frame::RestoreSettings(void) { int ival[20]; size_t i; $? "+ RestoreSettings" if (bRestoreGx) { $? ". restore graphics settings" for (i = 0; i < DK4_SIZEOF(ival,int); i++) { ival[i] = 0; } ival[ 0] = 0; ival[ 1] = 0; ival[ 2] = 1; ival[ 3] = 1; ival[ 4] = 1; ival[ 5] = 0; ival[ 6] = 1; ival[ 7] = 1; ival[ 8] = 0; ival[ 9] = 255; ival[10] = 255; ival[11] = 255; ival[12] = 0; ival[13] = 1; ival[14] = 1; ival[15] = 0; ival[16] = 1; ival[17] = 1; ival[18] = 1; ival[19] = 0; pAppHelp->GetMultiple(i_option_names, ival, 20); if ((0 <= ival[0]) && ((int)szPaperSizes > ival[0])) { chPaperSizes->SetSelection(ival[0]); } if (0 <= ival[1]) { chOutputMode->SetSelection(ival[1]); } cbColorOutput->SetValue((0 != ival[2]) ? (true) : (false)); if (0 <= ival[3]) { chPsLevel->SetSelection(ival[3]); } cbDsc->SetValue((0 != ival[4]) ? (true) : (false)); cbLzw->SetValue((0 != ival[5]) ? (true) : (false)); cbRotation->SetValue((0 != ival[6]) ? (true) : (false)); if (0 <= ival[7]) { chFinishing->SetSelection(ival[7]); } if (0 <= ival[8]) { chResolution->SetSelection(ival[8]); } ccBackground->SetRGB(ival[9], ival[10], ival[11]); cbBackground->SetValue((0 != ival[12]) ? (true) : (false)); cbImgInterpolation->SetValue((0 != ival[13]) ? (true) : (false)); cbDct->SetValue((0 != ival[14]) ? (true) : (false)); cbDctInterpolation->SetValue((0 != ival[15]) ? (true) : (false)); cbAnBpc->SetValue((0 != ival[16]) ? (true) : (false)); cbAnColor->SetValue((0 != ival[17]) ? (true) : (false)); cbAnAlpha->SetValue((0 != ival[18]) ? (true) : (false)); if (0 <= ival[19]) { chRgbToGray->SetSelection(ival[19]); } } else { $? ". using graphics conversion options" ConfigurationToGUI(); } if (bRestoreMake) { $? ". restoring make mode" for (i = 0; i < DK4_SIZEOF(ival,int); i++) { ival[i] = 0; } ival[ 0] = 0; pAppHelp->GetMultiple(i_make_names, ival, 1); cbMakeMode->SetValue((0 != ival[0]) ? (true) : (false)); bMakeMode = ((0 != ival[0]) ? true : false); } else { cbMakeMode->SetValue(bMakeMode ? (1) : (0)); } if (bRestoreLocation) { $? ". restore location" if (pAppHelp->GetString(i_dir_names[0], &sDirname)) { lDirectoryName->SetLabel(sDirname); Refresh(); Update(); } } $? "- RestoreSettings" } void Bmpp4Frame::CorrectGUI(void) { $? "+ CorrectGUI" if (!bIsCorrecting) { $? ". must correct" /* Avoid recursive calls */ bIsCorrecting = true; /* Enable or disable PS specific components */ switch (chOutputMode->GetSelection()) { case 0 : case 1 : case 2 : { /* PDF */ chPsLevel->Enable(false); cbDsc->Enable(false); cbLzw->Enable(false); } break; default : { /* PS or EPS */ chPsLevel->Enable(true); cbDsc->Enable(true); if (0 == chPsLevel->GetSelection()) { /* PS 2 */ cbLzw->Enable(true); } else { /* PS 3 */ cbLzw->Enable(false); } } break; } /* Enable or disable job specific components */ switch (chOutputMode->GetSelection()) { case 2: case 5: { /* document */ chFinishing->Enable(true); cbRotation->Enable(true); chPaperSizes->Enable(true); } break; default: { /* not a document */ chFinishing->Enable(false); cbRotation->Enable(false); chPaperSizes->Enable(false); } break; } /* Enable or disable resolution text input field */ switch(chResolution->GetSelection()) { case 2: { tfResolution->Enable(true); } break; default: { tfResolution->Enable(false); } break; } /* Enable or disable Interpolation DCT */ if (0 != cbImgInterpolation->GetValue()) { cbDctInterpolation->Enable(true); } else { cbDctInterpolation->Enable(false); } /* Enable or disable RGB to gray method selection */ if (0 != cbColorOutput->GetValue()) { chRgbToGray->Enable(false); } else { chRgbToGray->Enable(true); } /* Mark as done */ bIsCorrecting = false; /* Update GUI */ Refresh(); Update(); } $? "- CorrectGUI" } void Bmpp4Frame::ConfigurationToGUI(void) { wxChar b1[64]; /* Conversion buffer */ wxChar b2[DK4_SIZEOF(b1,wxChar)]; /* Conversion buffer */ size_t szb = DK4_SIZEOF(b1,wxChar); /* Size of b1 and b2 (elems) */ size_t papi = 0; /* Paper size index */ int res = 0; /* Operation result */ $? "+ ConfigurationToGUI" /* Output mode */ switch (graconf.driver) { case DK4_GRA_DRIVER_PS : { switch (graconf.purpose) { case DK4_GRA_PURPOSE_DOCUMENT : { chOutputMode->SetSelection(5); } break; default : { chOutputMode->SetSelection(4); } break; } } break; case DK4_GRA_DRIVER_EPS : { chOutputMode->SetSelection(3); } break; default : { switch (graconf.purpose) { case DK4_GRA_PURPOSE_DOCUMENT : { chOutputMode->SetSelection(2); } break; case DK4_GRA_PURPOSE_IMAGE : { chOutputMode->SetSelection(1); } break; default : { /* DK4_GRA_PURPOSE_OBJECT */ chOutputMode->SetSelection(0); } break; } } break; } /* PS level */ chPsLevel->SetSelection((3 == graconf.ps_level) ? (1) : (0)); /* DSC */ cbDsc->SetValue((0 != graconf.ps_dsc) ? (1) : (0)); /* LZW */ cbLzw->SetValue((0 != graconf.ps_lzw) ? (1) : (0)); /* Paper size */ if ((0 != graconf.have_psi) && (szPaperSizes > graconf.psi)) { chPaperSizes->SetSelection((int)(graconf.psi)); } else { if (0 != graconf.have_psi) { chPaperSizes->SetSelection(graconf.psi); } else { res = dk4paper_find_nearest( &papi, pPaperSizes, szPaperSizes, &(graconf.media), NULL ); if (0 != res) { chPaperSizes->SetSelection(papi); } else { chPaperSizes->SetSelection(0); } } } /* Rotate */ cbRotation->SetValue((0 != graconf.img_rot) ? 1 : 0); /* Finishing */ if (0 != graconf.doc_tumble) { chFinishing->SetSelection(2); } else { chFinishing->SetSelection((0 != graconf.doc_duplex) ? (1) : (0)); } /* Resolution */ if ((0.0 < graconf.xres) && (0.0 < graconf.yres)) { chResolution->SetSelection(2); /* 2018-03-28 The buffer overflow reported from wxWidgets libraries magically disappeared after rebuilding the entire project with debug messages. May be rebuilding one module was missing before. */ $? ". writing double to buffer" if (0 != dk4ma_write_wx_double(b1,szb,graconf.xres,0,1,NULL)) { $? ". b1 written" if (0 != dk4ma_write_wx_double(b2,szb,graconf.yres,0,1,NULL)) { $? ". b2 written" tfResolution->SetValue(wxString(b1) + wxT(" ") + wxString(b2)); $? ". text field replaced" } else { $? "! failed to write b2" } } else { $? "! failed to write b1" } $? ". doubles written to buffer" } else { chResolution->SetSelection((graconf.img_ign_res) ? (1) : (0)); } /* Background */ if ((0 <= graconf.img_bg_r) && (256 > graconf.img_bg_r)) { if ((0 <= graconf.img_bg_g) && (256 > graconf.img_bg_g)) { if ((0 <= graconf.img_bg_b) && (256 > graconf.img_bg_b)) { ccBackground->SetRGB( graconf.img_bg_r, graconf.img_bg_g, graconf.img_bg_b ); } } } /* Enforce background */ cbBackground->SetValue((0 != graconf.img_bg_f) ? (1) : (0)); /* Color */ cbColorOutput->SetValue((0 != graconf.color) ? (1) : (0)); /* Interpolation */ cbImgInterpolation->SetValue((0 != graconf.img_int) ? (1) : (0)); /* DCT */ cbDct->SetValue((0 != graconf.img_dct) ? (1) : (0)); /* DCT interpolation */ cbDctInterpolation->SetValue((0 != graconf.img_dct_int) ? (1) : (0)); /* Analzse bpc */ cbAnBpc->SetValue((0 != graconf.img_an_bpc) ? (1) : (0)); /* Analzse color */ cbAnColor->SetValue((0 != graconf.img_an_color) ? (1) : (0)); /* Analyze alpha */ cbAnAlpha->SetValue((0 != graconf.img_an_alpha) ? (1) : (0)); /* RGB to gray method */ if (0 <= graconf.ctx.rgb_to_gray) { chRgbToGray->SetSelection(graconf.ctx.rgb_to_gray); } $? "- ConfigurationToGUI" } void Bmpp4Frame::ConfigurationFromGUI(void) { wxChar buffer[128]; wxChar const *ep; wxChar *p1 = NULL; wxChar *p2 = NULL; double xres = -1.0; double yres = -1.0; size_t szbu = DK4_SIZEOF(buffer,wxChar); int choiceindex; int ok = 0; $? "+ ConfigurationFromGUI" /* Output mode */ switch (chOutputMode->GetSelection()) { case 0 : { graconf.driver = DK4_GRA_DRIVER_PDF; graconf.purpose = DK4_GRA_PURPOSE_OBJECT; } break; case 1 : { graconf.driver = DK4_GRA_DRIVER_PDF; graconf.purpose = DK4_GRA_PURPOSE_IMAGE; } break; case 2 : { graconf.driver = DK4_GRA_DRIVER_PDF; graconf.purpose = DK4_GRA_PURPOSE_DOCUMENT; } break; case 3 : { graconf.driver = DK4_GRA_DRIVER_EPS; graconf.purpose = DK4_GRA_PURPOSE_IMAGE; } break; case 4 : { graconf.driver = DK4_GRA_DRIVER_PS; graconf.purpose = DK4_GRA_PURPOSE_IMAGE; } break; case 5 : { graconf.driver = DK4_GRA_DRIVER_PS; graconf.purpose = DK4_GRA_PURPOSE_DOCUMENT; } break; default : { graconf.driver = DK4_GRA_DRIVER_PDF; graconf.purpose = DK4_GRA_PURPOSE_OBJECT; } break; } /* PS level */ switch (chPsLevel->GetSelection()) { case 0 : { graconf.ps_level = 2; } break; default : { graconf.ps_level = 3; } break; } /* DSC */ graconf.ps_dsc = ((0 != cbDsc->GetValue()) ? 1 : 0); /* LZW */ graconf.ps_lzw = ((0 != cbLzw->GetValue()) ? 1 : 0); /* Paper size */ choiceindex = chPaperSizes->GetSelection(); if ((0 <= choiceindex) && (szPaperSizes > (size_t)choiceindex)) { dk4mem_cpy( &(graconf.media), &(pPaperSizes[choiceindex]), sizeof(dk4_paper_size_t), NULL ); } /* Rotate */ graconf.img_rot = ((0 != cbRotation->GetValue()) ? 1 : 0); /* Finishing */ switch (chFinishing->GetSelection()) { case 2 : { graconf.doc_duplex = 1; graconf.doc_tumble = 1; } break; case 1 : { graconf.doc_duplex = 1; graconf.doc_tumble = 0; } break; default : { graconf.doc_duplex = 0; graconf.doc_tumble = 0; } break; } /* Resolution */ switch (chResolution->GetSelection()) { case 2 : { /* specify */ /* ##### TODO: Implementation: Retrieve values from text field */ wxCStrData valuestrdata = tfResolution->GetValue().c_str(); if ( 0 != dk4strx_cpy_s( buffer, szbu, (wxChar const *)valuestrdata, NULL ) ) { p1 = dk4strx_start(buffer, NULL); if (NULL != p1) { p2 = dk4strx_next(p1, NULL); ep = NULL; if (0 != dk4ma_input_wx_double(&xres, p1, &ep, 1, NULL)) { ok = 1; yres = xres; } if (NULL != p2) { ep = NULL; if (0 == dk4ma_input_wx_double(&yres,p2,&ep,1,NULL)) { ok = 0; } } if (1 == ok) { if ((0.0 < xres) && (0.0 < yres)) { graconf.xres = xres; graconf.yres = yres; } } } } graconf.img_ign_res = 0; } break; case 1 : { /* ignore */ graconf.img_ign_res = 1; graconf.xres = graconf.yres = 72.0; } break; default : { /* chunk */ graconf.img_ign_res = 0; graconf.xres = graconf.yres = -1.0; } break; } /* Background */ graconf.img_bg_r = ccBackground->Red(); graconf.img_bg_g = ccBackground->Green(); graconf.img_bg_b = ccBackground->Blue(); /* Enforce background */ graconf.img_bg_f = ((0 != cbBackground->GetValue()) ? 1 : 0); /* Color */ graconf.color = ((0 != cbColorOutput->GetValue()) ? 1 : 0); /* Interpolation */ graconf.img_int = ((0 != cbImgInterpolation->GetValue()) ? 1 : 0); /* DCT */ graconf.img_dct = ((0 != cbDct->GetValue()) ? 1 : 0); /* DCT interpolation */ graconf.img_dct_int = ((0 != cbDctInterpolation->GetValue()) ? 1 : 0); /* Analzse bpc */ graconf.img_an_bpc = ((0 != cbAnBpc->GetValue()) ? 1 : 0); /* Analzse color */ graconf.img_an_color = ((0 != cbAnColor->GetValue()) ? 1 : 0); /* Analyze alpha */ graconf.img_an_alpha = ((0 != cbAnAlpha->GetValue()) ? 1 : 0); /* RGB to gray method */ switch (chRgbToGray->GetSelection()) { case 12 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_CHANNEL_BLUE; } break; case 11 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_CHANNEL_GREEN; } break; case 10 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_CHANNEL_RED; } break; case 9 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_MAX_DECOMPOSITION; } break; case 8 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_MEDIUM_DECOMPOSITION; } break; case 7 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_MIN_DECOMPOSITION; } break; case 6 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_DESATURATION; } break; case 5 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_AVERAGE; } break; case 4 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_VERY_FAST; } break; case 3 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_FAST; } break; case 2 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_ITU_BT709; } break; case 1 : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_LUMA; } break; default : { graconf.ctx.rgb_to_gray = DK4_CS_CONV_RGB_TO_GRAY_ITU_BT601; } break; } $? "- ConfigurationFromGUI" } void Bmpp4Frame::OnIdle(wxIdleEvent & event) { #if TRACE_DEBUG static unsigned long number = 0UL; dk4_time_t timer; #endif bool rqm = false; bool success; $? "+ Bmpp4Frame::OnIdle" #if TRACE_DEBUG dk4time_get(&timer); #endif $? "+ OnIdle %lu %lu", number, (unsigned long)(timer - firsttime) if (bActive) { $? ". active" if (bAutorun) { $? ". autorun" switch (oAsc.GetReaction()) { case Dk4WxAutostartController::REACTION_START : { $? ". start" oAsc.StartProcessing(); success = RunConversion(); rqm = true; if (success) { lDirectoryName->SetLabel(sTexts[91]); lDirectoryName->SetForegroundColour(cGreen); } else { #if 0 oAsc.SetAutoExit(false); rqm = false; #endif lDirectoryName->SetLabel(sTexts[92]); lDirectoryName->SetForegroundColour(cRed); } lDirectoryName->Refresh(); lDirectoryName->Update(); oAsc.EndProcessing(); $? ". finished, request more" } break; case Dk4WxAutostartController::REACTION_MORE : { $? ". more" rqm = true; } break; case Dk4WxAutostartController::REACTION_EXIT : { $? ". exit" bActive = false; Show(false); Close(); rqm = false; } break; default : { /* includes DK4WX_AUTOSTART_REACTION_IGNORE */ $? ". ignore" } break; } } else { $? ". no autorun" } } else { $? ". not active" } #if TRACE_DEBUG dk4time_get(&timer); #endif $? "- OnIdle %lu %d %lu", number++, (rqm ? 1 : 0), (unsigned long)(timer - firsttime) if (rqm) { event.RequestMore(); } event.Skip(); } /* vim: set ai sw=4 ts=4 : */