void replaceDirectoryVariable(ArchiveSharedData* shared, QString& io_pathString, const QString& varname, int pos, int len) { Listing* paths = shared->directoryVariableMap->findListing(varname.toStdString()); if(paths){ for(int i=0; i < paths->size(); ++i){ string vpath; QString replaced(io_pathString); replaced.replace(pos, len, paths->at(i)->toString().c_str()); filesystem::file_status fstatus = filesystem::status(filesystem::path(replaced.toStdString())); if(filesystem::is_directory(fstatus) || filesystem::exists(fstatus)) { io_pathString = replaced; return; } } } MessageView::mainInstance()->putln( MessageView::WARNING, QString(_("${%1} of \"%2\" cannot be expanded !")).arg(varname).arg(io_pathString)); }
bool ParametricPathProcessorImpl::replaceDirectoryVariable (QString& io_pathString, const string& varname, int pos, int len) { Listing* paths = variables->findListing(varname); if(paths) { for(int i=0; i < paths->size(); ++i) { string vpath; QString replaced(io_pathString); replaced.replace(pos, len, paths->at(i)->toString().c_str()); filesystem::file_status fstatus = filesystem::status(filesystem::path(replaced.toStdString())); if(filesystem::is_directory(fstatus) || filesystem::exists(fstatus)) { io_pathString = replaced; return true; } } } errorMessage = str(format(_("%1% of \"%2%\" cannot be expanded !")) % varname % io_pathString.toStdString()); return false; }
/** \todo Introduce a tree structure to improve the efficiency of searching matched directories */ bool ParametricPathProcessorImpl::findSubDirectoryOfDirectoryVariable (const filesystem::path& path, std::string& out_varName, filesystem::path& out_relativePath) { out_relativePath.clear(); int maxMatchSize = 0; filesystem::path relativePath; Mapping::const_iterator p; for(p = variables->begin(); p != variables->end(); ++p) { Listing* paths = p->second->toListing(); if(paths) { for(int i=0; i < paths->size(); ++i) { filesystem::path dirPath(paths->at(i)->toString()); int n = findSubDirectory(dirPath, path, relativePath); if(n > maxMatchSize) { maxMatchSize = n; out_relativePath = relativePath; out_varName = fromUTF8(p->first); } } } } return (maxMatchSize > 0); }
void ViewManager::restoreViews(ArchivePtr archive, const std::string& key, ViewManager::ViewStateInfo& out_viewStateInfo) { MessageView* mv = MessageView::instance(); typedef map<ViewInfo*, vector<View*> > ViewsMap; ViewsMap remainingViewsMap; Listing* viewList = archive->findListing(key); if(viewList->isValid() && !viewList->empty()){ vector<ViewState>* viewsToRestoreState = new vector<ViewState>(); out_viewStateInfo.data = viewsToRestoreState; int id; string moduleName; string className; string instanceName; for(int i=0; i < viewList->size(); ++i){ Archive* viewArchive = dynamic_cast<Archive*>(viewList->at(i)->toMapping()); if(viewArchive){ bool isHeaderValid = viewArchive->read("id", id) && viewArchive->read("plugin", moduleName) && viewArchive->read("class", className); if(isHeaderValid){ View* view = 0; if(!viewArchive->read("name", instanceName)){ view = getOrCreateView(moduleName, className); } else { // get one of the view instances having the instance name, or create a new instance. // Different instances are assigned even if there are instances with the same name in the archive ViewInfo* info = findViewInfo(moduleName, className); if(info){ vector<View*>* remainingViews; ViewsMap::iterator p = remainingViewsMap.find(info); if(p != remainingViewsMap.end()){ remainingViews = &p->second; } else { remainingViews = &remainingViewsMap[info]; InstanceInfoList& instances = info->instances; remainingViews->reserve(instances.size()); InstanceInfoList::iterator q = instances.begin(); if(info->hasDefaultInstance() && q != instances.end()){ ++q; } while(q != instances.end()){ remainingViews->push_back((*q++)->view); } } for(vector<View*>::iterator q = remainingViews->begin(); q != remainingViews->end(); ++q){ if((*q)->name() == instanceName){ view = *q; remainingViews->erase(q); break; } } if(!view){ if(!info->isSingleton() || info->instances.empty()){ view = info->createView(instanceName, true); } else { mv->putln(MessageView::ERROR, boost::format(_("A singleton view \"%1%\" of the %2% type cannot be created because its singleton instance has already been created.")) % instanceName % info->className()); } } } } if(view){ archive->registerViewId(view, id); ArchivePtr state = viewArchive->findSubArchive("state"); if(state->isValid()){ state->inheritSharedInfoFrom(*archive); viewsToRestoreState->push_back(ViewState(view, state)); } if(viewArchive->get("mounted", false)){ mainWindow->viewArea()->addView(view); } } } } } } }