#ifndef PLUGCOMMON_H_INCLUDED
#define PLUGCOMMON_H_INCLUDED

#define PLGENUM_CANCEL 0
#define PLGENUM_OK     1

#include "..\..\Models\IToModel.hpp"

typedef enum
{
  dsUndeterminate,
  dsValid
} TDataState;

typedef struct
{
  int Left,Top,Right,Bottom;
} TRect;

typedef enum
{
  acNew,
  acOpen,
  acSave,
  acSaveAs,
  acClose,
  acCreateReport,
  // Импорт
  acImportAll,
  acImportCode,
  acImportNatural,
  acImportML,
  acImportDF,
  acImportY,
  // Экспорт
  acExportAll,
  acExportCode,
  acExportNatural,
  acExportML,
  acExportDF,
  acExportY,
  acExportReport,
  // Эксперимент
  acKNames,
  acCreateY,
  acCheckPoint,
  acAverageY,
  acFullAnalisys,
  acCohrenAnalisys,
  acRegenerateCode,
  // Модель
  acStudentAnalisys,
  acFisherAnalisys,
  acExtremum,
  acTranslate,
  // Меню "Диаграмма"
  acNewGraph,
  acNewSurface,
  acExportGraph,
  acExportSurface,
  acImportGraph,
  acImportSurface,
  // Меню "Окно"
  acShowCode,
  acShowNatural,
  acShowML,
  acShowDF,
  acShowY,
  acShowReport,
  acShowDiagram,
  acHideCode,
  acHideNatural,
  acHideML,
  acHideDF,
  acHideY,
  acHideReport,
  acHideDiagram,
  acMinimizeForms,
  acShowForms,
  acArrangeForms
} TPlanAction;

typedef enum
{
  acBeginGraph,
  acBeginSurface,
  acEndGraph,
  acEndSurface,
  acSetNames,
  acAddVertex,
  acImport,
  acReset,
  acShow,
  acHide,
  acArrange
} TGraphAction;

// Структура, через которую передаются имена для графика.
typedef struct
{
  char  *FirstName;
  char  *SecondName;
  char  *ResponseName;
} TSourceNames;

typedef TSourceNames *PSourceNames;

typedef int Boolean;

class IPlugIn
{
  // Строка меню
  virtual char* __stdcall MenuName() = 0;
  // Дееспособность
  virtual Boolean __stdcall CanDo() = 0;
  // Основная функция (Типа TNotifyEvent)
  virtual void __stdcall PluginMain() = 0;
};

typedef int (__stdcall *TEnumPlugInsProc)(IPlugIn *PlugIn);
typedef int (__stdcall *TPlugInsEnumerate)(TEnumPlugInsProc EnumProc);

#ifdef  __WATCOMC__
#ifdef  SYSDEFS_H
#undef  SYSDEFS_H
#endif  //SYSDEFS_H
#endif  //__WATCOMC__

#ifndef SYSDEFS_H

#endif  //SYSDEFS_H

// =======================================================================
// * * *                    СЕРВЕР   ГРАФИКИ                         * * *
// =======================================================================

class IGraphServer
{
  virtual void __stdcall Vertex2D(double x,double y) = 0;
  virtual void __stdcall Vertex3D(double x,double y,double z) = 0;
  virtual void __stdcall BeginGraph(long Count,long Reserved) = 0;
  virtual void __stdcall BeginSurface(long SizeX,long SizeY) = 0;
  virtual void __stdcall SetNames(PSourceNames GNames,PSourceNames SNames) = 0;
  virtual void __stdcall EndGraph(long Count,long Reserved) = 0;
  virtual void __stdcall EndSurface(long SizeX,long SizeY) = 0;
  virtual void __stdcall Show(Boolean ShowWindow) = 0;
  virtual void __stdcall Arrange() = 0;
  virtual void __stdcall Reset() = 0;
  virtual void __stdcall SetupChanged() = 0;
  virtual Boolean __stdcall CanDo(TGraphAction Action) = 0;
  virtual void __stdcall DisplayChange(int cx,int cy,int bpp) = 0;
    //           5.08.99
  virtual void __stdcall BeginPoints2D(int Count) = 0;
  virtual void __stdcall BeginPoints3D(int Count) = 0;
  virtual void __stdcall EndPoints2D(int Count) = 0;
  virtual void __stdcall EndPoints3D(int Count) = 0;
};

// =======================================================================
// * * *                    СЕРВЕР МАТЕМАТИКИ                        * * *
// =======================================================================

class IMathPlan
{
public:
  // Функция возврата состояния - возможна ли указанная операция
  virtual Boolean __stdcall CanDo(TPlanAction Action) = 0;
  // ---------------------------------------------------------------------
  // Операции.
  // ---------------------------------------------------------------------
  // Меню "Файл"
  virtual Boolean __stdcall New() = 0;
  virtual Boolean __stdcall Open(char *szFile) = 0;
  virtual Boolean __stdcall SaveAs() = 0;
  virtual Boolean __stdcall Save() = 0;
  virtual Boolean __stdcall CreateReport() = 0;
  virtual Boolean __stdcall Close() = 0;
  // ---------------------------------------------------------------------
  // Меню "Экспорт"
  virtual Boolean __stdcall ExportAll() = 0;
  virtual Boolean __stdcall ExportMainMatrix() = 0;
  virtual Boolean __stdcall ExportNaturalMatrix() = 0;
  virtual Boolean __stdcall ExportMLVector() = 0;
  virtual Boolean __stdcall ExportDFVector() = 0;
  virtual Boolean __stdcall ExportYMatrix() = 0;
  virtual Boolean __stdcall ExportReport() = 0;
  // ---------------------------------------------------------------------
  // Меню "Импорт"
  virtual Boolean __stdcall Matrix() = 0;
  virtual Boolean __stdcall ImportMLVector() = 0;
  virtual Boolean __stdcall ImportDFVector() = 0;
  virtual Boolean __stdcall ImportYMatrix() = 0;
  virtual Boolean __stdcall ImportAll() = 0;
  // ---------------------------------------------------------------------
  // Меню "Эксперимент"
  virtual Boolean __stdcall SetKNames() = 0;
  virtual Boolean __stdcall NewData() = 0;
  virtual Boolean __stdcall CheckPoint() = 0;
  virtual Boolean __stdcall ShowAverageData() = 0;
  // Расчет средних, дисперсий, стандартных отклонений и критерия Кохрена
  virtual Boolean __stdcall CohrenAnalisys() = 0;
  // Регенерация кодовой матрицы
  virtual Boolean __stdcall RegenerateCode() = 0;
  // ---------------------------------------------------------------------
  // Меню "Анализ"
  virtual Boolean __stdcall FullAnalisys() = 0;
  // Расчет  критерия Стьюдента; отсев коэффициентов, корректировка расши-
  // ренной матрицы плана и пересчет коэффициентов.
  virtual Boolean __stdcall StudentAnalisys() = 0;
  // Расчет невязок, дисперсии адекватности и критерия Фишера.
  virtual Boolean __stdcall FisherAnalisys() = 0;
  virtual Boolean __stdcall FindExtremum() = 0;
  virtual Boolean __stdcall Translate() = 0;
  // ---------------------------------------------------------------------
  // Меню "Диаграммы"
  virtual Boolean __stdcall NewGraph() = 0;
  virtual Boolean __stdcall NewSurface() = 0;
  virtual Boolean __stdcall ExportGraph() = 0;
  virtual Boolean __stdcall ExportSurface() = 0;
  // ---------------------------------------------------------------------
  // Меню "Окно"
  virtual Boolean __stdcall ShowMainMatrix() = 0;
  virtual Boolean __stdcall ShowNaturalMatrix() = 0;
  virtual Boolean __stdcall ShowMLVector() = 0;
  virtual Boolean __stdcall ShowDFVector() = 0;
  virtual Boolean __stdcall ShowYMatrix() = 0;
  virtual Boolean __stdcall ShowReport() = 0;
  virtual Boolean __stdcall HideMainMatrix() = 0;
  virtual Boolean __stdcall HideNaturalMatrix() = 0;
  virtual Boolean __stdcall HideMLVector() = 0;
  virtual Boolean __stdcall HideDFVector() = 0;
  virtual Boolean __stdcall HideYMatrix() = 0;
  virtual Boolean __stdcall HideReport() = 0;
  virtual Boolean __stdcall MinimizeForms() = 0;
  virtual Boolean __stdcall ShowForms() = 0;
  virtual Boolean __stdcall ArrangeForms(TRect *Rc) = 0;
  // ---------------------------------------------------------------------
  // Были ли изменения
  virtual Boolean __stdcall Modified() = 0;
  // Синхронизация матриц
  virtual void __stdcall SynchronizeMatrices(void *Sender) = 0;
  // Использование новых установок
  virtual void __stdcall OnChangeSetup() = 0;
  // Возврат статуса (для статусной строки)
  virtual char *__stdcall GetStateString() = 0;
  virtual void __stdcall ClearStatus() = 0;
  // Текущее имя файла (для заголовка)
  virtual char *__stdcall FileName() = 0;
  virtual IGraphServer *__stdcall GetGServer() = 0;
  // Скрытие / показ форм (при изменении стиля главного окна)
  virtual void __stdcall TemporaryClose(Boolean *c,Boolean *n,Boolean *m,
    Boolean *d,Boolean *y,Boolean *r,Boolean *g) = 0;
  virtual void __stdcall RestoreVisibleForms(Boolean c,Boolean n,Boolean m,
    Boolean d,Boolean y,Boolean r,Boolean g) = 0;
  // Параметры плана
  virtual void __stdcall GetKNR(int *K,int *N,int *R) = 0;
  // Пересчет координат точек
  virtual void __stdcall NaturalToCode(double *Dst,double *Src) = 0;
  virtual void __stdcall CodeToNatural(double *Dst,double *Src) = 0;
  // Вычисление значения в точке кодового пространства
  virtual void __stdcall GetY(double *Pt,double *Res) = 0;
  virtual void* __stdcall GetMainFormHandle(void) = 0;
  // 23.11.99
  virtual IGenerator*   __stdcall GetCurrentGen() = 0;
  virtual IModel*       __stdcall GetCurrentModel() = 0;
  virtual IAdden*       __stdcall GetModelAdden(int nAdden) = 0;
  virtual double*       __stdcall GetCurrentBVector() = 0;
};

typedef IMathPlan* PIMathPlan;

extern "C" 
{
  void __declspec(dllexport) __stdcall SetMainServer(IMathPlan *MainServer);
  PIMathPlan __declspec(dllexport) __stdcall GetMainServer();
}

#endif
