/** * @author Edouard DUPIN * * @copyright 2010, Edouard DUPIN, all right reserved * * @license GPL v3 (see license file) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace appl { std::string getVersion(void) { #define FIRST_YEAR (2010) std::string tmpOutput = std::to_string(date::getYear()-FIRST_YEAR); tmpOutput += "."; tmpOutput += std::to_string(date::getMonth()); tmpOutput += "."; tmpOutput += std::to_string(date::getDay()); return tmpOutput; } } #undef __class__ #define __class__ "AboutGui" #include #include class ParameterAboutGui : public ewol::widget::Sizer { public : ParameterAboutGui(void) : ewol::widget::Sizer(ewol::widget::Sizer::modeVert) { ewol::widget::Spacer* mySpacer = NULL; mySpacer = new ewol::widget::Spacer(); if (NULL == mySpacer) { APPL_ERROR("Can not allocate widget == > display might be in error"); } else { mySpacer->setExpand(bvec2(true,true)); subWidgetAdd(mySpacer); } std::string tmpLabel = ""; tmpLabel += " Editeur De N'ours : v:"; tmpLabel += appl::getVersion(); tmpLabel += "
"; tmpLabel += " Build Time : "; tmpLabel += date::getYear(); tmpLabel += "/"; tmpLabel += date::getMonth(); tmpLabel += "/"; tmpLabel += date::getDay(); tmpLabel += " "; tmpLabel += date::getHour(); tmpLabel += "h"; tmpLabel += date::getMinute(); tmpLabel += "
"; tmpLabel += " Website : https://github.com/HeeroYui/edn
"; tmpLabel += " License : GPL v3
"; tmpLabel += " Copyright : 2010 Edouard DUPIN
"; tmpLabel += "
"; tmpLabel += " dependency librairies :
"; tmpLabel += " libPng, ogg-tremor, portaudio, libZip
"; tmpLabel += " tinyXml, freetype, agg2.4, etk
"; tmpLabel += "
"; ewol::widget::Label* myLabel = new ewol::widget::Label(tmpLabel); if (NULL == myLabel) { APPL_ERROR("Can not allocate widget == > display might be in error"); } else { myLabel->setExpand(bvec2(true,false)); subWidgetAdd(myLabel); } }; ~ParameterAboutGui(void) { }; }; // Local main windows event : static const char* mainWindowsRequestSaveFile = "appl-event-main-windows-save-file"; static const char* mainWindowsRequestSaveFileAs = "appl-event-main-windows-save-file-as"; static const char* mainWindowsRequestcloseFileNoCheck = "appl-event-main-windows-close-file-no-check"; static const char* l_MsgNameGuiChangeShape = "appl-event-main-windows-Change-shape"; const char* l_smoothChick = "tmpEvent_smooth"; const char* l_smoothMin = "tmpEvent_minChange"; const char* l_smoothMax = "tmpEvent_maxChange"; #undef __class__ #define __class__ "MainWindows" MainWindows::MainWindows(void) { addObjectType("appl::MainWindows"); APPL_DEBUG("CREATE WINDOWS ... "); ewol::widget::Sizer * mySizerVert = NULL; ewol::widget::Sizer * mySizerVert2 = NULL; ewol::widget::Sizer * mySizerHori = NULL; //ewol::Button * myButton = NULL; appl::TextViewer * myTextView = NULL; BufferView * myBufferView = NULL; ewol::widget::Menu * myMenu = NULL; // load buffer manager: m_bufferManager = appl::BufferManager::keep(); mySizerVert = new ewol::widget::Sizer(ewol::widget::Sizer::modeVert); setSubWidget(mySizerVert); mySizerHori = new ewol::widget::Sizer(ewol::widget::Sizer::modeHori); mySizerVert->subWidgetAdd(mySizerHori); myBufferView = new BufferView(); myBufferView->setExpand(bvec2(false,true)); myBufferView->setFill(bvec2(true,true)); mySizerHori->subWidgetAdd(myBufferView); mySizerVert2 = new ewol::widget::Sizer(ewol::widget::Sizer::modeVert); mySizerHori->subWidgetAdd(mySizerVert2); // main buffer Area : #if defined(__TARGET_OS__Android) myTextView = new appl::TextViewer("FreeMono;DejaVuSansMono;FreeSerif", 16); #else myTextView = new appl::TextViewer("FreeMono;DejaVuSansMono;FreeSerif", 11); #endif myTextView->setExpand(bvec2(true,true)); myTextView->setFill(bvec2(true,true)); mySizerVert2->subWidgetAdd(myTextView); /* myTextView = new appl::TextViewer("FreeMono;DejaVuSansMono;FreeSerif", 11); myTextView->setExpand(bvec2(true,true)); myTextView->setFill(bvec2(true,true)); mySizerVert2->subWidgetAdd(myTextView); */ // search area : Search * mySearch = new Search(); mySizerVert2->subWidgetAdd(mySearch); #ifdef APPL_BUFFER_FONT_DISTANCE_FIELD { ewol::widget::Sizer * mySizerHori2 = new widget::Sizer(ewol::widget::Sizer::modeHori); mySizerVert2->subWidgetAdd(mySizerHori2); ewol::widget::CheckBox* tmpCheck = new widget::CheckBox("smooth"); mySizerHori2->subWidgetAdd(tmpCheck); tmpCheck->registerOnEvent(this, "clicked", l_smoothChick); ewol::widget::Slider* tmpSlider = new widget::Slider(); mySizerHori2->subWidgetAdd(tmpSlider); tmpSlider->registerOnEvent(this, "change", l_smoothMin); tmpSlider->setExpand(bvec2(true,false)); tmpSlider->setMin(0); tmpSlider->setMax(1000); tmpSlider->setValue(0450); tmpSliderMin = tmpSlider; tmpSlider = new ewol::widget::Slider(); mySizerHori2->subWidgetAdd(tmpSlider); tmpSlider->registerOnEvent(this, "change", l_smoothMax); tmpSlider->setExpand(bvec2(true,false)); tmpSlider->setMin(0); tmpSlider->setMax(1000); tmpSlider->setValue(0550); tmpSliderMax = tmpSlider; } #endif mySizerHori = new ewol::widget::Sizer(ewol::widget::Sizer::modeHori); mySizerVert->subWidgetAdd(mySizerHori); myMenu = new ewol::widget::Menu(); mySizerHori->subWidgetAdd(myMenu); int32_t idMenuFile = myMenu->addTitle("File"); (void)myMenu->add(idMenuFile, "New", "", ednMsgGuiNew); (void)myMenu->addSpacer(); (void)myMenu->add(idMenuFile, "Open", "THEME:GUI:Load.edf", ednMsgGuiOpen); (void)myMenu->add(idMenuFile, "Close", "THEME:GUI:Close.edf", ednMsgGuiClose, "current"); (void)myMenu->add(idMenuFile, "Close (all)", "", ednMsgGuiClose, "All"); (void)myMenu->add(idMenuFile, "Save", "THEME:GUI:Save.edf", ednMsgGuiSave, "current"); (void)myMenu->add(idMenuFile, "Save As ...", "", ednMsgGuiSaveAs); (void)myMenu->addSpacer(); //(void)myMenu->add(idMenuFile, "Exit", "", ednMsgGuiExit); (void)myMenu->addSpacer(); (void)myMenu->add(idMenuFile, "Properties", "THEME:GUI:Parameter.edf", ednMsgProperties); int32_t idMenuEdit = myMenu->addTitle("Edit"); (void)myMenu->add(idMenuEdit, "Undo", "THEME:GUI:Undo.edf", ednMsgGuiUndo); (void)myMenu->add(idMenuEdit, "Redo", "THEME:GUI:Redo.edf", ednMsgGuiRedo); (void)myMenu->addSpacer(); (void)myMenu->add(idMenuEdit, "Copy", "", ednMsgGuiCopy, "STD"); (void)myMenu->add(idMenuEdit, "Cut", "", ednMsgGuiCut, "STD"); (void)myMenu->add(idMenuEdit, "Paste", "", ednMsgGuiPaste, "STD"); (void)myMenu->add(idMenuEdit, "Remove", "", ednMsgGuiRm); (void)myMenu->addSpacer(); (void)myMenu->add(idMenuEdit, "Select All","", ednMsgGuiSelect, "ALL"); (void)myMenu->add(idMenuEdit, "Un-Select","", ednMsgGuiSelect, "NONE"); (void)myMenu->add(idMenuEdit, "Goto line ...","", ednMsgGuiGotoLine, "???"); int32_t idMenuSearch = myMenu->addTitle("Search"); (void)myMenu->add(idMenuSearch, "Search", "THEME:GUI:Search.edf", ednMsgGuiSearch); (void)myMenu->add(idMenuSearch, "Replace", "THEME:GUI:Replace.edf", ednMsgGuiReplace); (void)myMenu->addSpacer(); (void)myMenu->add(idMenuSearch, "Find (previous)","", ednMsgGuiFind, "Previous"); (void)myMenu->add(idMenuSearch, "Find (next)", "", ednMsgGuiFind, "Next"); (void)myMenu->add(idMenuSearch, "Find (all)", "", ednMsgGuiFind, "All"); (void)myMenu->add(idMenuSearch, "Un-Select", "", ednMsgGuiFind, "None"); /* ==> must be in the pluggin list control ... int32_t idMenuCTags = myMenu->addTitle("C-tags"); (void)myMenu->add(idMenuCTags, "Load", "", ednMsgGuiCtags, "Load"); (void)myMenu->add(idMenuCTags, "ReLoad", "", ednMsgGuiCtags, "ReLoad"); (void)myMenu->add(idMenuCTags, "Jump", "", ednMsgGuiCtags, "Jump"); (void)myMenu->add(idMenuCTags, "Back", "", ednMsgGuiCtags, "Back"); */ int32_t idMenugDisplay = myMenu->addTitle("Display"); (void)myMenu->add(idMenugDisplay, "Color Black", "", appl::MsgNameGuiChangeColor, "color/black/"); (void)myMenu->add(idMenugDisplay, "Color White", "", appl::MsgNameGuiChangeColor, "color/white/"); (void)myMenu->add(idMenugDisplay, "Shape square", "", l_MsgNameGuiChangeShape, "shape/square/"); (void)myMenu->add(idMenugDisplay, "Shape round", "", l_MsgNameGuiChangeShape, "shape/round/"); (void)myMenu->addSpacer(); (void)myMenu->add(idMenugDisplay, "Reload openGl Shader", "", ednMsgGuiReloadShader); m_widgetLabelFileName = new ewol::widget::Label("FileName"); m_widgetLabelFileName->setExpand(bvec2(true,false)); m_widgetLabelFileName->setFill(bvec2(true,false));; mySizerHori->subWidgetAdd(m_widgetLabelFileName); // add generic shortcut ... // (shift, control, alt, meta, char32_t unicodeValue, const char * generateEventId, std::string& data) shortCutAdd("ctrl+o", ednMsgGuiOpen, "", true); shortCutAdd("ctrl+n", ednMsgGuiNew, "", true); shortCutAdd("ctrl+s", ednMsgGuiSave, "current", true); shortCutAdd("ctrl+shift+s", ednMsgGuiSave, "All", true); shortCutAdd("ctrl+q", ednMsgGuiClose, "current", true); shortCutAdd("ctrl+shift+q", ednMsgGuiClose, "All", true); shortCutAdd("ctrl+z", ednMsgGuiUndo, "", true); shortCutAdd("ctrl+shift+z", ednMsgGuiRedo, "", true); shortCutAdd("ctrl+l", ednMsgGuiGotoLine, "???", true); shortCutAdd("ctrl+f", ednMsgGuiSearch, "", true); shortCutAdd("F12", ednMsgGuiReloadShader, "", true); //shortCutAdd("ctrl+d", ednMsgGuiCtags, "Jump", true); // Generic event ... registerMultiCast(ednMsgGuiSave); registerMultiCast(ednMsgGuiSaveAs); registerMultiCast(ednMsgProperties); registerMultiCast(ednMsgGuiNew); registerMultiCast(ednMsgGuiOpen); registerMultiCast(ednMsgGuiClose); // to update the title ... registerMultiCast(ednMsgBufferState); registerMultiCast(ednMsgBufferId); registerMultiCast(ednMsgGuiReloadShader); registerMultiCast(appl::MsgNameGuiChangeColor); registerMultiCast(l_MsgNameGuiChangeShape); registerMultiCast(appl::MsgSelectNewFile); } MainWindows::~MainWindows(void) { appl::BufferManager::release(m_bufferManager); } const char *const ednEventPopUpFileSelected = "edn-mainWindows-openSelected"; const char *const ednEventPopUpFileSaveAs = "edn-mainWindows-saveAsSelected"; void MainWindows::onReceiveMessage(const ewol::object::Message& _msg) { ewol::widget::Windows::onReceiveMessage(_msg); APPL_VERBOSE("Receive Event from the main windows: " << _msg ); // open file Section ... if (_msg.getMessage() == ednMsgGuiOpen) { ewol::widget::FileChooser* tmpWidget = new ewol::widget::FileChooser(); if (tmpWidget == NULL) { APPL_ERROR("Can not open File chooser !!! "); return; } tmpWidget->setTitle("Open files ..."); tmpWidget->setValidateLabel("Open"); if (m_bufferManager == NULL) { APPL_ERROR("can not call unexistant buffer manager ... "); return; } // Get a ref on the buffer selected (if null, no buffer was selected ...) appl::Buffer* tmpBuffer = m_bufferManager->getBufferSelected(); if (tmpBuffer != NULL) { etk::FSNode tmpFile = tmpBuffer->getFileName(); tmpWidget->setFolder(tmpFile.getNameFolder()); } // apply widget pop-up ... popUpWidgetPush(tmpWidget); tmpWidget->registerOnEvent(this, "validate", ednEventPopUpFileSelected); } else if (_msg.getMessage() == ednMsgProperties) { // Request the parameter GUI ewol::widget::Parameter* tmpWidget = new ewol::widget::Parameter(); if (NULL == tmpWidget) { APPL_ERROR("Can not allocate widget == > display might be in error"); } else { tmpWidget->setTitle("Properties"); popUpWidgetPush(tmpWidget); tmpWidget->menuAddGroup("Editor"); ewol::Widget* tmpSubWidget = new globals::ParameterGlobalsGui(); tmpWidget->menuAdd("Editor", "", tmpSubWidget); tmpWidget->menuAdd("Font & Color", "", NULL); tmpWidget->menuAdd("Highlight", "", NULL); tmpWidget->menuAddGroup("General"); tmpWidget->menuAdd("Display", "", NULL); tmpSubWidget = new ParameterAboutGui(); tmpWidget->menuAdd("About", "", tmpSubWidget); } } else if (_msg.getMessage() == appl::MsgNameGuiChangeColor) { etk::theme::setName("COLOR", _msg.getData()); ewol::getContext().getResourcesManager().reLoadResources(); ewol::getContext().forceRedrawAll(); } else if (_msg.getMessage() == l_MsgNameGuiChangeShape) { etk::theme::setName("GUI", _msg.getData()); ewol::getContext().getResourcesManager().reLoadResources(); ewol::getContext().forceRedrawAll(); } else if (_msg.getMessage() == ednMsgGuiReloadShader) { ewol::getContext().getResourcesManager().reLoadResources(); ewol::getContext().forceRedrawAll(); } else if (_msg.getMessage() == ednMsgGuiExit) { // TODO : ... } // Note : Fore all next message we need to acces to the buffer manager ==> just check one time ... if (m_bufferManager == NULL) { APPL_ERROR("can not call unexistant buffer manager ... "); return; } if ( _msg.getMessage() == appl::MsgSelectNewFile || _msg.getMessage() == appl::Buffer::eventIsModify || _msg.getMessage() == appl::Buffer::eventIsSave || _msg.getMessage() == appl::Buffer::eventChangeName) { // select a new Buffer ==> change title: appl::Buffer* tmpp = m_bufferManager->getBufferSelected(); if (tmpp == NULL) { setTitle("Edn"); if (m_widgetLabelFileName != NULL) { m_widgetLabelFileName->setLabel(""); } } else { if (_msg.getMessage() == appl::MsgSelectNewFile) { tmpp->registerOnEvent(this, appl::Buffer::eventIsModify); tmpp->registerOnEvent(this, appl::Buffer::eventIsSave); tmpp->registerOnEvent(this, appl::Buffer::eventChangeName); } setTitle(std::string("Edn : ") + (tmpp->isModify()==true?" *":"") + tmpp->getFileName()); if (m_widgetLabelFileName != NULL) { m_widgetLabelFileName->setLabel(tmpp->getFileName() + (tmpp->isModify()==true?" *":"")); } } } else if (_msg.getMessage() == ednMsgGuiNew) { (void)m_bufferManager->createNewBuffer(); } else if (_msg.getMessage() == ednEventPopUpFileSelected) { APPL_DEBUG("Request opening the file : " << _msg.getData()); m_bufferManager->open(_msg.getData()); } else if (_msg.getMessage() == ednMsgGuiSave) { APPL_DEBUG("Request saving the file : " << _msg.getData()); if (std::tolower(_msg.getData()) == "current") { appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile("", false); return; } else if (std::tolower(_msg.getData()) == "all") { appl::WorkerSaveAllFile* tmpWorker = new appl::WorkerSaveAllFile(); return; } else { APPL_ERROR("UNKNOW request : " << _msg); } } else if (_msg.getMessage() == ednMsgGuiSaveAs) { appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile("", true); } else if (_msg.getMessage() == ednMsgGuiClose) { // Get a ref on the buffer selected (if null, no buffer was selected ...) if (_msg.getData() == "current") { appl::WorkerCloseFile* tmpWorker = new appl::WorkerCloseFile(""); } else { appl::WorkerCloseAllFile* tmpWorker = new appl::WorkerCloseAllFile(); } } else if (_msg.getMessage() == mainWindowsRequestSaveFile) { // return after a choice of close... if (m_bufferManager->exist(_msg.getData()) == false) { APPL_ERROR("Try to save an non-existant file :" << _msg.getData()); return; } appl::Buffer* tmpBuffer = m_bufferManager->get(_msg.getData()); if (tmpBuffer == NULL) { APPL_ERROR("Error to get the buffer : " << _msg.getData()); return; } if (tmpBuffer->hasFileName() == false) { APPL_ERROR("Will never arrive"); saveAsPopUp(tmpBuffer); } else { if (tmpBuffer->storeFile() == false) { APPL_ERROR("Error when loading the file " << _msg.getData()); displayErrorMessage("Error when loading the file
" + _msg.getData() + ""); } } } else if (_msg.getMessage() == mainWindowsRequestSaveFileAs) { // return after a choice of close... if (m_bufferManager->exist(_msg.getData()) == false) { APPL_ERROR("Try to save an non-existant file :" << _msg.getData()); return; } appl::Buffer* tmpBuffer = m_bufferManager->get(_msg.getData()); if (tmpBuffer == NULL) { APPL_ERROR("Error to get the buffer : " << _msg.getData()); return; } saveAsPopUp(tmpBuffer); } else if (_msg.getMessage() == mainWindowsRequestcloseFileNoCheck) { // return after a choice of close... if (m_bufferManager->exist(_msg.getData()) == false) { APPL_ERROR("Try to save an non-existant file :" << _msg.getData()); return; } appl::Buffer* tmpBuffer = m_bufferManager->get(_msg.getData()); if (tmpBuffer == NULL) { APPL_ERROR("Error to get the buffer : " << _msg.getData()); return; } // note: just remove ==> no check : normal case ... tmpBuffer->removeObject(); } return; } void MainWindows::saveAsPopUp(appl::Buffer* _buffer) { if (_buffer == NULL) { APPL_ERROR("Call With NULL input..."); return; } appl::WorkerSaveFile* tmpObject = new appl::WorkerSaveFile(_buffer->getFileName()); } void MainWindows::closeNotSavedFile(appl::Buffer* _buffer) { if (_buffer == NULL) { APPL_ERROR("Call With NULL input..."); return; } ewol::widget::StdPopUp* tmpPopUp = new ewol::widget::StdPopUp(); if (tmpPopUp == NULL) { APPL_ERROR("Can not create a simple pop-up"); return; } tmpPopUp->setTitle("Close un-saved file:"); tmpPopUp->setComment("The file named : \"" + _buffer->getFileName() + "\" is curently modify.
If you don't saves these modifications,
they will be definitly lost..."); ewol::Widget* bt = NULL; if (_buffer->hasFileName() == true) { bt = tmpPopUp->addButton("Save", true); if (bt != NULL) { // TODO : The element is removed before beeing pressed bt->registerOnEvent(this, "pressed", mainWindowsRequestSaveFile, _buffer->getFileName()); bt->registerOnEvent(this, "pressed", mainWindowsRequestcloseFileNoCheck, _buffer->getFileName()); } } bt = tmpPopUp->addButton("Save As", true); if (bt != NULL) { bt->registerOnEvent(this, "pressed", mainWindowsRequestSaveFileAs, _buffer->getFileName()); //bt->registerOnEvent(this, "pressed", mainWindowsRequestcloseFileNoCheck, _buffer->getFileName()); // TODO : Request the close when saved ... } bt = tmpPopUp->addButton("Close", true); if (bt != NULL) { bt->registerOnEvent(this, "pressed", mainWindowsRequestcloseFileNoCheck, _buffer->getFileName()); } tmpPopUp->addButton("Cancel", true); tmpPopUp->setRemoveOnExternClick(true); popUpWidgetPush(tmpPopUp); } void MainWindows::onObjectRemove(ewol::Object* _removeObject) { ewol::widget::Windows::onObjectRemove(_removeObject); if (m_widgetLabelFileName == _removeObject) { m_widgetLabelFileName = NULL; } }