Workspace
=================

.. currentmodule:: axioma.gui

.. class:: Workspace

	Представление рабочего пространства во внутреннем формате. Используется как промежуточный контейнер при запаси или чтении рабочего пространства в формат MWS.

		.. py:method:: clear()

			Очистка всего внутреннего содержания

		.. py:method:: loadFile(filename)

			Чтение из внешнего файла WMS во внутренний формат представления информации

			:param filename: Наименование файла в файловой системе
			:type filename: :class:`str`
 
		.. py:method:: saveFile(filename)

			Запись внутренного представления рабочего пространства во внешний файл формата WMS

			:param filename: Наименование файла в файловой системе
			:type filename: :class:`str`

..

Чтение
######

		Для **чтения** рабочего набора из внешнего файла необходимо последовательно произвести следующие действия:

		* Создать объект внутреннего представления рабочего пространства :class:`~axioma.gui.Workspace`.
		* В него загрузить содержимое из внешнего файла посредством :class:`~axioma.gui.Workspace.loadFile`.
		* Создать контекст чтения :class:`~axioma.gui.WorkspaceLoadContext` и установить для него менеджеры, куда будут создаваться объекты из рабочего набора (менеджеры карт :class:`~axioma.gui.MapViewManager`, отчетов :class:`~axioma.gui.ReportViewManager` и таблиц просмотра :class:`~axioma.gui.BrowserManager`).
		* Создать объект-загрузчик рабочего пространства из внутреннего представления в данные для менеджеров.
		* Произвести непосредственное чтение посредством метода WorkspaceLoader :class:`~axioma.gui.WorkspaceLoader.load`.


		Пример чтения из файла:

		.. code-block:: python3
		
			# Чтение рабочего пространства из файла
			from axioma.core.dp import *
			from axioma.gui import *

			try:
				# Создаем контейнеры, куда мы будем в конечном счете загружать данные из рабочего набора
				catalog = DataCatalog() # Каталог с источниками данных
				mapManager = MapViewManager() # Менеджер карт
				reportManager = ReportViewManager() # Менеджер отчетов
				browserManager = BrowserManager() # Менеджер таблиц просмотра

				# Читаем рабочее пространство из файла
				workspaceIn = Workspace() # внутреннее представление рабочего пространства
				fileName = 'sampleWorkspace.mws' # Имя файла для чтения
				workspaceIn.loadFile(fileName)
				# Контекст для чтения. Устанавливаем куда мы будем сохранять прочитанное состояние
				context = WorkspaceLoadContext(gui, catalog)
				context.setMapViewManager(mapManager)
				context.setReportViewManager(reportManager)
				context.setBrowserManager(browserManager)
				loader = WorkspaceLoader(fileName, context)
				# Читаем из внутреннего представления
				loader.load(workspaceIn)
				# Контролируем зачитанную информацию из рабочего пространства
				print('tables={}, maps={}, reports={}, browsers={}'.format(len(catalog.allDataObjects()),
							len(mapManager.mapViews()), len(reportManager.views()), len(browserManager.tableWindows())))
			except Exception as ex:
				print(ex)


Запись
######

		Для **записи** рабочего набора во внешний файл необходимо выполнить следующие действия:
		
		* Предварительно должны существовать каталог с данными (:class:`~axioma.core.dp.DataCatalogInterface`) и менеджеры (карт :class:`~axioma.gui.MapViewManager`, отчетов :class:`~axioma.gui.ReportViewManager` и таблиц просмотра :class:`~axioma.gui.BrowserManager`). Они должны содержать информацию о состоянии, которое будет в последствии записано в файл.
		* Создаем контекст для записи  :class:`~axioma.gui.WorkspaceSaveContext` и установить для него менеджеры, откуда будут браться объекты для рабочего набора (менеджеры карт :class:`~axioma.gui.MapViewManager`, отчетов :class:`~axioma.gui.ReportViewManager` и таблиц просмотра :class:`~axioma.gui.BrowserManager`).
		* Создать объект преобразования данных контекста во внутреннюю структуру :class:`~axioma.gui.WorkspaceSaver` и произвести в него запись посредством :class:`~axioma.gui.WorkspaceSaver.save`, получив как результат :class:`~axioma.gui.Workspace`.
		* Произвести запись состояния :class:`~axioma.gui.Workspace` в файл посредством :class:`~axioma.gui.Workspace.saveFile`.


		Пример записи в файл:

		.. code-block:: python3

			# Сохранение рабочего пространства в файл
			from axioma.core.dp import *
			from axioma.gui import *

			try:
				# Создаем контейнеры
				catalog = DataCatalog() # Каталог с источниками данных
				mapManager = MapViewManager() # Менеджер карт
				reportManager = ReportViewManager() # Менеджер отчетов
				browserManager = BrowserManager() # Менеджер таблиц просмотра
				# каким-то образом заполняем контейнеры либо изменяем загруженные ранее из рабочего пространства данные
				fileNameOut = "sampleWorkspace.mws" # Имя файла для записи
				# Создаем контекст для сохранения
				contextSave = WorkspaceSaveContext(gui, catalog)
				# Устанавливаем в данном контексте ссылки на существующие менеджеры
				contextSave.setMapViewManager(mapManager)
				contextSave.setReportViewManager(reportManager)
				contextSave.setBrowserManager(browserManager)
				# Создаем объект преобразования данных контекста во внутреннюю структуру
				saver = WorkspaceSaver(fileNameOut, contextSave)
				# Сохраняем во внутренний формат
				workspaceOut = saver.save()
				# Сохраняем в файл
				workspaceOut.saveFile(fileNameOut)
			except Exception as ex:
				print(ex)
