// frmContactEditor-Picture.cpp - frmContactEditor Picture tab subroutines. // // (c) 2012-2016 Xestia Software Development. // // This file is part of Xestia Address Book. // // Xestia Address Book is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // // Xestia Address Book is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with Xestia Address Book. If not, see #include #include "frmContactEditor.h" #include "frmContactEditorPicture.h" #include "../common/base64.h" void frmContactEditor::AddPicture( wxCommandEvent& event ) { // Bring up window for adding a picture. frmContactEditorPicture *frameCEPicture = new frmContactEditorPicture ( this ); frameCEPicture->SetEditorMode(FALSE); frameCEPicture->SetupPointers(&ContactEditorData.PicturesList, &ContactEditorData.PicturesListAltID, &ContactEditorData.PicturesListPID, &ContactEditorData.PicturesListType, &ContactEditorData.PicturesListPicEncType, &ContactEditorData.PicturesListPictureType, &ContactEditorData.PicturesListTokens, &ContactEditorData.PicturesListMediatype, &ContactEditorData.PicturesListPref, lboPictures, (intValueSeek), TRUE); frameCEPicture->ShowModal(); delete frameCEPicture; frameCEPicture = NULL; } void frmContactEditor::ModifyPicture( wxCommandEvent& event ) { // Bring up window for modifying a picture. long longSelected = -1; int intSelectedData = 0; if (lboPictures->GetItemCount() == 0 || !GetSelectedItem(lboPictures, &longSelected, &intSelectedData)){ return; } frmContactEditorPicture *frameCEPicture = new frmContactEditorPicture ( this ); frameCEPicture->SetupPointers(&ContactEditorData.PicturesList, &ContactEditorData.PicturesListAltID, &ContactEditorData.PicturesListPID, &ContactEditorData.PicturesListType, &ContactEditorData.PicturesListPicEncType, &ContactEditorData.PicturesListPictureType, &ContactEditorData.PicturesListTokens, &ContactEditorData.PicturesListMediatype, &ContactEditorData.PicturesListPref, lboPictures, intSelectedData, TRUE); frameCEPicture->SetEditorMode(TRUE); frameCEPicture->ShowModal(); delete frameCEPicture; frameCEPicture = NULL; } void frmContactEditor::DeletePicture( wxCommandEvent& event ) { // Bring up window for deleting a picture. long longSelected = -1; int intSelectedData = 0; if (lboPictures->GetItemCount() == 0 || !GetSelectedItem(lboPictures, &longSelected, &intSelectedData)){ return; } lboPictures->DeleteItem(longSelected); DeleteMapData(intSelectedData, &ContactEditorData.PicturesList, &ContactEditorData.PicturesListAltID, &ContactEditorData.PicturesListPID, &ContactEditorData.PicturesListType, &ContactEditorData.PicturesListPicEncType, &ContactEditorData.PicturesListPictureType, &ContactEditorData.PicturesListTokens, &ContactEditorData.PicturesListMediatype, &ContactEditorData.PicturesListPref); wxMemoryInputStream istream(misc_emptyimage_png, sizeof(misc_emptyimage_png)); wxImage misc_emptyimage_png(istream, wxBITMAP_TYPE_PNG); PictureImage = (wxBitmap)misc_emptyimage_png; imgPicture->SetBitmap(PictureImage); } void frmContactEditor::LoadPicture( wxListEvent& event ) { // Load the picture. long longSelected = -1; int intSelectedData = 0; if (lboPictures->GetItemCount() == 0 || !GetSelectedItem(lboPictures, &longSelected, &intSelectedData)){ return; } std::string base64dec; std::map::iterator initier; std::map::iterator pictypeiter; initier = ContactEditorData.PicturesList.find(intSelectedData); pictypeiter = ContactEditorData.PicturesListPictureType.find(intSelectedData); base64dec = base64_decode(initier->second); wxMemoryInputStream istream(base64dec.c_str(), (size_t)base64dec.size()); wxImage photo; if (pictypeiter->second == wxT("image/jpeg")){ if (!photo.LoadFile(istream, wxBITMAP_TYPE_JPEG)){ return; } } else if (pictypeiter->second == wxT("image/png")){ if (!photo.LoadFile(istream, wxBITMAP_TYPE_PNG)){ return; } } else if (pictypeiter->second == wxT("image/gif")){ if (!photo.LoadFile(istream, wxBITMAP_TYPE_GIF)){ return; } } else { return; } PictureImage = (wxBitmap)photo; imgPicture->SetBitmap(PictureImage); } void frmContactEditor::SavePicture( wxCommandEvent &event ) { // Save the picture to a file. long longSelected = -1; int intSelectedData = 0; if (lboPictures->GetItemCount() == 0 || !GetSelectedItem(lboPictures, &longSelected, &intSelectedData)){ return; } wxString FileTypes; wxString FinalFilename; std::map::iterator initier; std::map::iterator pictypeiter; initier = ContactEditorData.PicturesList.find(intSelectedData); pictypeiter = ContactEditorData.PicturesListPictureType.find(intSelectedData); if (pictypeiter->second == wxT("image/jpeg")){ FileTypes.Append("JPEG Image (*.jpeg)|*.jpeg"); } else if (pictypeiter->second == wxT("image/png")){ FileTypes.Append("PNG Image (*.png)|*.png"); } else if (pictypeiter->second == wxT("image/gif")){ FileTypes.Append("GIF Image (*.gif)|*.gif"); } else { wxMessageBox(_("Picture format for saving is not supported."), _("Picture format unsupported"), wxOK, this); return; } // Open up the dialog to save the picture. wxFileDialog ExportDlg(this, wxT("Save Picture"), wxT(""), wxT(""), FileTypes, wxFD_SAVE|wxFD_OVERWRITE_PROMPT); if (ExportDlg.ShowModal() == wxID_CANCEL){ return; } // Write out the picture to the file. wxFile PictureFile; if (PictureFile.Open(ExportDlg.GetPath(), wxFile::write)){ std::string base64dec; initier = ContactEditorData.PicturesList.find(intSelectedData); base64dec = base64_decode(initier->second); PictureFile.Write(base64dec.c_str(), (size_t)base64dec.size()); PictureFile.Close(); } else { wxMessageBox(_("An error occured whilst saving the picture. Check that you have free space and permissions to write the picture at this location."), _("Picture save error"), wxOK, this); return; } }