void ViewArea::restoreAllViewAreaLayouts(ArchivePtr archive) { ViewAreaImpl* mainViewAreaImpl = MainWindow::instance()->viewArea()->impl; if(archive){ Listing& layouts = *archive->findListing("viewAreas"); if(!layouts.isValid()){ // for the compatibility with the older (1.4 or earlier) versions Archive* layoutOfViews = archive->findSubArchive("layoutOfViews"); if(layoutOfViews->isValid()){ layoutOfViews->inheritSharedInfoFrom(*archive); mainViewAreaImpl->restoreLayout(layoutOfViews); } } else { QDesktopWidget* desktop = QApplication::desktop(); const int numScreens = desktop->screenCount(); for(int i=0; i < layouts.size(); ++i){ Mapping& layout = *layouts[i].toMapping(); Archive* contents = dynamic_cast<Archive*>(layout.get("contents").toMapping()); if(contents){ contents->inheritSharedInfoFrom(*archive); const string type = layout.get("type").toString(); if(type == "embedded"){ mainViewAreaImpl->restoreLayout(contents); mainViewAreaImpl->self->setViewTabsVisible(layout.get("tabs", mainViewAreaImpl->viewTabsVisible)); } else if(type == "independent"){ ViewArea* viewWindow = new ViewArea(); viewWindow->impl->viewTabsVisible = layout.get("tabs", true); viewWindow->impl->restoreLayout(contents); if(viewWindow->impl->numViews == 0){ delete viewWindow; } else { const Listing& geo = *layout.findListing("geometry"); if(geo.isValid() && geo.size() == 4){ // -1 means the primary screen int screen = -1; if(layout.read("screen", screen)){ if(screen >= numScreens){ screen = -1; } } const QRect s = desktop->screenGeometry(screen); const QRect r(geo[0].toInt(), geo[1].toInt(), geo[2].toInt(), geo[3].toInt()); viewWindow->setGeometry(r.translated(s.x(), s.y())); } if(layout.get("fullScreen", false)){ layout.read("maximized", viewWindow->impl->isMaximizedBeforeFullScreen); viewWindow->showFullScreen(); } else { if(layout.get("maximized"), false){ viewWindow->showMaximized(); } else { viewWindow->show(); } } } } } } } } if(isBeforeDoingInitialLayout){ mainViewAreaImpl->resetLayout(); } }
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); } } } } } } }