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`.
		* Создать объект-загрузчик рабочего пространства из внутреннего представления в данные для менеджеров.
		* Произвести непосредственное чтение посредством метода WorkspaceLoader :class:`~axioma.gui.WorkspaceLoader.load`.


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

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

			try:
				# Создаем контейнеры, куда мы будем в конечном счете загружать данные из рабочего набора
				catalog = DataCatalog() # Каталог с источниками данных
				# Читаем рабочее пространство из файла
				workspaceIn = Workspace() # внутреннее представление рабочего пространства
				fileName = 'sampleWorkspace.mws' # Имя файла для чтения
				workspaceIn.loadFile(fileName)
				# Контекст для чтения. Устанавливаем куда мы будем сохранять прочитанное состояние
				context = WorkspaceLoadContext(gui, catalog)
				loader = WorkspaceLoader(fileName, context)
				# Читаем из внутреннего представления
				loader.load(workspaceIn)
				# Контролируем зачитанную информацию из рабочего пространства
				wm = axioma.app.gui.widgetManager
				print('tables={}, maps={}, reports={}, browsers={}'.format(len(catalog.allDataObjects()),
				    wm.count(MapView.staticMetaObject), wm.count(ReportView.staticMetaObject), wm.count(TableWindow.staticMetaObject)))
			except Exception as ex:
				print(ex)


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

		Для **записи** рабочего набора во внешний файл необходимо выполнить следующие действия:
		
		* Предварительно должны существовать каталог с данными (:class:`~axioma.core.dp.DataCatalogInterface`).
		* Создаем контекст для записи  :class:`~axioma.gui.WorkspaceSaveContext`.
		* Создать объект преобразования данных контекста во внутреннюю структуру :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() # Каталог с источниками данных
				# каким-то образом заполняем контейнеры либо изменяем загруженные ранее из рабочего пространства данные
				fileNameOut = "sampleWorkspace.mws" # Имя файла для записи
				# Создаем контекст для сохранения
				contextSave = WorkspaceSaveContext(gui, catalog)
				# Создаем объект преобразования данных контекста во внутреннюю структуру
				saver = WorkspaceSaver(fileNameOut, contextSave)
				# Сохраняем во внутренний формат
				workspaceOut = saver.save()
				# Сохраняем в файл
				workspaceOut.saveFile(fileNameOut)
			except Exception as ex:
				print(ex)
