namespace DevExpress.DevAV {
    using System;
    using System.ComponentModel.DataAnnotations;

    public enum ModuleType {
        Unknown,
        [Display(Name = "Employees")]
        Employees,
        EmployeesFilterPane,
        EmployeesFilterPaneCollapsed,
        EmployeesPeek,
        EmployeeView,
        [Display(Name = "Edit Contact")]
        EmployeeEditView,
        [Display(Name = "Contact Map")]
        EmployeeMapView,
        EmployeesCustomFilter,
        EmployeesGroupFilter,
        EmployeesExport,
        EmployeesPrint,
        [Display(Name = "Contact Mail Merge")]
        EmployeeMailMerge,
        [Display(Name = "Customers")]
        Customers,
        CustomersFilterPane,
        CustomersFilterPaneCollapsed,
        CustomersPeek,
        CustomerView,
        CustomerEditView,
        [Display(Name = "Sales Map")]
        CustomerMapView,
        [Display(Name = "Sales Analysis")]
        CustomerAnalysis,
        CustomersCustomFilter,
        CustomersGroupFilter,
        CustomersExport,
        CustomersPrint,
        [Display(Name = "Products")]
        Products,
        ProductsFilterPane,
        ProductsFilterPaneCollapsed,
        ProductsPeek,
        ProductView,
        ProductEditView,
        [Display(Name = "Sales Map")]
        ProductMapView,
        [Display(Name = "Sales Analysis")]
        ProductAnalysis,
        ProductsCustomFilter,
        ProductsGroupFilter,
        ProductsExport,
        ProductsPrint,
        [Display(Name = "Sales")]
        Orders,
        OrdersFilterPane,
        OrdersFilterPaneCollapsed,
        OrdersCustomFilter,
        OrdersPeek,
        OrderView,
        [Display(Name = "Edit Order")]
        OrderEditView,
        [Display(Name = "Shipping Map")]
        OrderMapView,
        OrdersExport,
        OrdersPrint,
        [Display(Name = "Sales Mail Merge")]
        OrderMailMerge,
        [Display(Name = "Invoice (PDF)")]
        OrderPdfQuickReportView,
        [Display(Name = "Invoice (DOC)")]
        OrderDocQuickReportView,
        [Display(Name = "Invoice (XLS)")]
        OrderXlsQuickReportView,
        [Display(Name = "Sales Report")]
        OrderRevenueView,
        [Display(Name = "Opportunities")]
        Quotes,
        QuotesFilterPane,
        QuotesFilterPaneCollapsed,
        QuotesCustomFilter,
        QuotesPeek,
        QuoteView,
        QuoteEditView,
        [Display(Name = "Opportunities Map")]
        QuoteMapView,
        QuotesExport,
        QuotesPrint,
    }
    //
    public interface IMainModule : IPeekModulesHost,
        ISupportModuleLayout, ISupportTransitions {
    }
    public interface ISupportCompactLayout {
        bool Compact { get; set; }
    }
    public interface ISupportZoom {
        int ZoomLevel { get; set; }
        event EventHandler ZoomChanged;
    }
    public interface ISupportTransitions {
        void StartTransition(bool forward, object waitParameter);
        void EndTransition();
    }
    public interface ISupportModuleLayout {
        void SaveLayoutToStream(System.IO.MemoryStream ms);
        void RestoreLayoutFromStream(System.IO.MemoryStream ms);
    }
    public interface IPeekModulesHost {
        bool IsDocked(ModuleType type);
        void DockModule(ModuleType moduleType);
        void UndockModule(ModuleType moduleType);
        void ShowPeek(ModuleType moduleType);
    }
    public interface ISupportMap {
        void ShowMap();
        bool CanShowMap();
    }
    public interface ISupportAnalysis {
        void ShowAnalysis();
    }
    public interface IZoomViewModel {
        object ZoomModule { get; }
        event EventHandler ZoomModuleChanged;
    }
    public interface ISupportModifications {
        bool Modified { get; }
        void Save();
    }
    public interface ISupportCustomFilters {
        void ResetCustomFilters();
        event EventHandler CustomFiltersReset;
    }
    public interface IRouteMapViewModel {
        DevExpress.XtraMap.BingTravelMode TravelMode { get; set; }
        Address PointA { get; set; }
        Address PointB { get; set; }
        double RouteDistance { get; set; }
        TimeSpan RouteTime { get; set; }
        //
        event EventHandler TravelModeChanged;
        event EventHandler PointAChanged;
        event EventHandler PointBChanged;
        event EventHandler UpdateRoute;
    }
    public interface ISalesMapViewModel {
        Period Period { get; set; }
        event EventHandler PeriodChanged;
    }
}