mirror of
https://github.com/DevExpress/netcore-winforms-demos.git
synced 2025-12-22 09:28:11 +00:00
Add Outlook Inspired and Stock Market demos
This commit is contained in:
359
.gitignore
vendored
359
.gitignore
vendored
@@ -1,52 +1,319 @@
|
||||
# Prerequisites
|
||||
*.d
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# Linker output
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
6
NuGet.config
Normal file
6
NuGet.config
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="DevExpress-Early-Access" value="https://nuget.devexpress.com/early-access/api/" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
1
OutlookInspiredApp/Data/EnglishAlphabet.txt
Normal file
1
OutlookInspiredApp/Data/EnglishAlphabet.txt
Normal file
@@ -0,0 +1 @@
|
||||
ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
BIN
OutlookInspiredApp/Data/devav.sqlite3
Normal file
BIN
OutlookInspiredApp/Data/devav.sqlite3
Normal file
Binary file not shown.
56
OutlookInspiredApp/DevExpress.DevAV/Address.cs
Normal file
56
OutlookInspiredApp/DevExpress.DevAV/Address.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using DevExpress.Common;
|
||||
using DevExpress.DataAnnotations;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
[NotMapped]
|
||||
public partial class Address : IDataErrorInfo {
|
||||
[Display(Name = "Address")]
|
||||
public string Line { get; set; }
|
||||
public string City { get; set; }
|
||||
public StateEnum State { get; set; }
|
||||
[ZipCode, Display(Name = "Zip code")]
|
||||
public string ZipCode { get; set; }
|
||||
public double Latitude { get; set; }
|
||||
public double Longitude { get; set; }
|
||||
public string CityLine {
|
||||
get { return GetCityLine(City, State, ZipCode); }
|
||||
}
|
||||
public override string ToString() {
|
||||
return string.Format("{0}, {1}", Line, CityLine);
|
||||
}
|
||||
#region IDataErrorInfo
|
||||
string IDataErrorInfo.Error { get { return null; } }
|
||||
string IDataErrorInfo.this[string columnName] {
|
||||
get { return IDataErrorInfoHelper.GetErrorText(this, columnName); }
|
||||
}
|
||||
#endregion
|
||||
|
||||
internal static string GetCityLine(string city, StateEnum state, string zipCode) {
|
||||
return string.Format("{0}, {1} {2}", city, state, zipCode);
|
||||
}
|
||||
}
|
||||
public static class AddressHelper {
|
||||
public static Address DevAVHomeOffice { get { return devAVHomeOffice; } }
|
||||
|
||||
static Address devAVHomeOffice = new Address {
|
||||
City = "Glendale",
|
||||
Line = "505 N. Brand Blvd",
|
||||
State = StateEnum.CA,
|
||||
ZipCode = "91203",
|
||||
Latitude = 34.1532866,
|
||||
Longitude = -118.2555815
|
||||
};
|
||||
public static void UpdateAddress(Address address, string line, string city, StateEnum state, string zipCode, double latitude, double longtitude){
|
||||
address.Line = line;
|
||||
address.City = city;
|
||||
address.State = state;
|
||||
address.ZipCode = zipCode;
|
||||
address.Latitude = latitude;
|
||||
address.Longitude = longtitude;
|
||||
}
|
||||
}
|
||||
}
|
||||
13
OutlookInspiredApp/DevExpress.DevAV/AttachedFile.cs
Normal file
13
OutlookInspiredApp/DevExpress.DevAV/AttachedFile.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class TaskAttachedFile : DatabaseObject {
|
||||
public virtual EmployeeTask EmployeeTask { get; set; }
|
||||
public long? EmployeeTaskId { get; set; }
|
||||
public string Name { get; set; }
|
||||
public byte[] Content { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace DevExpress.Common {
|
||||
public static class IDataErrorInfoHelper {
|
||||
public static string GetErrorText(object owner, string propertyName) {
|
||||
string[] path = propertyName.Split('.');
|
||||
if(path.Length > 1)
|
||||
return GetErrorText(owner, path);
|
||||
PropertyInfo propertyInfo = owner.GetType().GetProperty(propertyName);
|
||||
if (propertyInfo == null) return null;
|
||||
object propertyValue = propertyInfo.GetValue(owner, null);
|
||||
ValidationContext validationContext = new ValidationContext(owner, null, null) { MemberName = propertyName };
|
||||
string[] errors = propertyInfo
|
||||
.GetCustomAttributes(false)
|
||||
.OfType<ValidationAttribute>()
|
||||
.Select(x => x.GetValidationResult(propertyValue, validationContext))
|
||||
.Where(x => x != null)
|
||||
.Select(x => x.ErrorMessage)
|
||||
.Where(x => !string.IsNullOrEmpty(x))
|
||||
.ToArray();
|
||||
return string.Join(" ", errors);
|
||||
}
|
||||
static string GetErrorText(object owner, string[] path) {
|
||||
string nestedPropertyName = string.Join(".", path.Skip(1));
|
||||
string propertyName = path[0];
|
||||
PropertyInfo propertyInfo = owner.GetType().GetProperty(propertyName);
|
||||
if(propertyInfo == null)
|
||||
return null;
|
||||
object propertyValue = propertyInfo.GetValue(owner, null);
|
||||
IDataErrorInfo nestedDataErrorInfo = propertyValue as IDataErrorInfo;
|
||||
return nestedDataErrorInfo == null ? string.Empty : nestedDataErrorInfo[nestedPropertyName];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using System.Resources;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
// This demo targets .NET Framework 4.0. A number of validation attributes that exist in .NET Framework 4.5 cannot be used.
|
||||
// That is why we have created our own counterparts of these attributes for this demo.
|
||||
// If your application targets .NET Framework 4.5, use default validation attributes.
|
||||
// If your application targets .NET Framework 4.0, you can copy and use these attributes or use DevExpress Validation Fluent API instead.
|
||||
|
||||
namespace DevExpress.DataAnnotations {
|
||||
public abstract class RegexAttributeBase : DataTypeAttribute {
|
||||
protected const RegexOptions DefaultRegexOptions = RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase;
|
||||
|
||||
readonly Regex regex;
|
||||
|
||||
public RegexAttributeBase(string regex, string defaultErrorMessage, DataType dataType)
|
||||
: this(new Regex(regex, DefaultRegexOptions), defaultErrorMessage, dataType) {
|
||||
}
|
||||
public RegexAttributeBase(Regex regex, string defaultErrorMessage, DataType dataType)
|
||||
: base(dataType) {
|
||||
this.regex = (Regex)regex;
|
||||
this.ErrorMessage = defaultErrorMessage;
|
||||
}
|
||||
public sealed override bool IsValid(object value) {
|
||||
if(value == null)
|
||||
return true;
|
||||
string input = value as string;
|
||||
return input != null && regex.Match(input).Length > 0;
|
||||
}
|
||||
}
|
||||
public sealed class ZipCodeAttribute : RegexAttributeBase {
|
||||
static Regex regex = new Regex(@"^[0-9][0-9][0-9][0-9][0-9]$", DefaultRegexOptions);
|
||||
const string Message = "The {0} field is not a valid ZIP code.";
|
||||
public ZipCodeAttribute()
|
||||
: base(regex, Message, DataType.Url) {
|
||||
}
|
||||
}
|
||||
public sealed class CreditCardAttribute : DataTypeAttribute {
|
||||
const string Message = "The {0} field is not a valid credit card number.";
|
||||
public CreditCardAttribute()
|
||||
: base(DataType.Custom) {
|
||||
this.ErrorMessage = Message;
|
||||
}
|
||||
public override bool IsValid(object value) {
|
||||
if(value == null)
|
||||
return true;
|
||||
string stringValue = value as string;
|
||||
if(stringValue == null)
|
||||
return false;
|
||||
stringValue = stringValue.Replace("-", "").Replace(" ", "");
|
||||
int number = 0;
|
||||
bool oddEvenFlag = false;
|
||||
foreach(char ch in stringValue.Reverse()) {
|
||||
if(ch < '0' || ch > '9')
|
||||
return false;
|
||||
int digitValue = (ch - '0') * (oddEvenFlag ? 2 : 1);
|
||||
oddEvenFlag = !oddEvenFlag;
|
||||
while(digitValue > 0) {
|
||||
number += digitValue % 10;
|
||||
digitValue = digitValue / 10;
|
||||
}
|
||||
}
|
||||
return (number % 10) == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
55
OutlookInspiredApp/DevExpress.DevAV/Converters.cs
Normal file
55
OutlookInspiredApp/DevExpress.DevAV/Converters.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace DevExpress.DevAV
|
||||
{
|
||||
public class DevAVByteImageConverter
|
||||
{
|
||||
public static Image FromByteArray(byte[] b)
|
||||
{
|
||||
if (b == null || b.Length == 0) return null;
|
||||
Image i = null;
|
||||
if (b.Length > 78)
|
||||
{
|
||||
if (b[0] == 0x15 && b[1] == 0x1c) //check signature
|
||||
i = FromByteArray(b, 78);
|
||||
}
|
||||
if (i == null)
|
||||
i = FromByteArray(b, 0);
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
protected static Image FromByteArray(byte[] b, int offset)
|
||||
{
|
||||
if (b == null || b.Length - offset <= 0) return null;
|
||||
Image tempI = null;
|
||||
System.IO.MemoryStream s = new System.IO.MemoryStream(b, offset, (int)b.Length - offset);
|
||||
try
|
||||
{
|
||||
tempI = ImageFromStream(s);
|
||||
}
|
||||
catch { }
|
||||
//s.Close();
|
||||
return tempI;
|
||||
}
|
||||
static Image ImageFromStream(Stream stream)
|
||||
{
|
||||
if (Object.ReferenceEquals(stream, null))
|
||||
return null;
|
||||
//if (!IsWin7 || !IsUnmanagedCodeGranted)
|
||||
// return Image.FromStream(stream);
|
||||
//else
|
||||
return Image.FromStream(stream, false, false);
|
||||
}
|
||||
static bool IsWin7 {
|
||||
get {
|
||||
Version version = Environment.OSVersion.Version;
|
||||
return (version.Major == 6 && version.Minor >= 1) || version.Major > 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
26
OutlookInspiredApp/DevExpress.DevAV/Crest.cs
Normal file
26
OutlookInspiredApp/DevExpress.DevAV/Crest.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class Crest : DatabaseObject {
|
||||
public string CityName { get; set; }
|
||||
public byte[] SmallImage { get; set; }
|
||||
public byte[] LargeImage { get; set; }
|
||||
public virtual ICollection<CustomerStore> CustomerStores { get; set; }
|
||||
Image img;
|
||||
public Image LargeImageEx {
|
||||
get {
|
||||
if (img == null)
|
||||
if (LargeImage == null)
|
||||
return null; //ResourceImageHelper.CreateImageFromResourcesEx("DevExpress.DevAV.Resources.Unknown-user.png", typeof(Employee).Assembly);
|
||||
else
|
||||
img = DevAVByteImageConverter.FromByteArray(LargeImage);
|
||||
return img;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
107
OutlookInspiredApp/DevExpress.DevAV/Customer.cs
Normal file
107
OutlookInspiredApp/DevExpress.DevAV/Customer.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Drawing;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum CustomerStatus {
|
||||
Active,
|
||||
Suspended
|
||||
}
|
||||
public partial class Customer : DatabaseObject {
|
||||
public Customer() {
|
||||
Employees = new List<CustomerEmployee>();
|
||||
Orders = new List<Order>();
|
||||
_homeOffice = new Address();
|
||||
_billingAddress = new Address();
|
||||
}
|
||||
[Required]
|
||||
public string Name { get; set; }
|
||||
Address _homeOffice;
|
||||
[NotMapped]
|
||||
public Address HomeOffice {
|
||||
get {
|
||||
AddressHelper.UpdateAddress(_homeOffice, HomeOffice_Line, HomeOffice_City, HomeOffice_State, HomeOffice_ZipCode, HomeOffice_Latitude, HomeOffice_Longitude);
|
||||
return _homeOffice;
|
||||
}
|
||||
set {
|
||||
AddressHelper.UpdateAddress(_homeOffice, value.Line, value.City, value.State, value.ZipCode, value.Latitude, value.Longitude);
|
||||
HomeOffice_Line = _homeOffice.Line;
|
||||
HomeOffice_City = _homeOffice.City;
|
||||
HomeOffice_State = _homeOffice.State;
|
||||
HomeOffice_ZipCode = _homeOffice.ZipCode;
|
||||
HomeOffice_Latitude = _homeOffice.Latitude;
|
||||
HomeOffice_Longitude = _homeOffice.Longitude;
|
||||
}
|
||||
}
|
||||
Address _billingAddress;
|
||||
[NotMapped]
|
||||
public Address BillingAddress {
|
||||
get {
|
||||
AddressHelper.UpdateAddress(_billingAddress, BillingAddress_Line, BillingAddress_City, BillingAddress_State, BillingAddress_ZipCode, BillingAddress_Latitude, BillingAddress_Longitude);
|
||||
return _billingAddress;
|
||||
}
|
||||
set {
|
||||
AddressHelper.UpdateAddress(_billingAddress, value.Line, value.City, value.State, value.ZipCode, value.Latitude, value.Longitude);
|
||||
BillingAddress_Line = _billingAddress.Line;
|
||||
BillingAddress_City = _billingAddress.City;
|
||||
BillingAddress_State = _billingAddress.State;
|
||||
BillingAddress_ZipCode = _billingAddress.ZipCode;
|
||||
BillingAddress_Latitude = _billingAddress.Latitude;
|
||||
BillingAddress_Longitude = _billingAddress.Longitude;
|
||||
}
|
||||
}
|
||||
#region EFCore
|
||||
public string HomeOffice_Line { get; set; }
|
||||
public string HomeOffice_City { get; set; }
|
||||
public StateEnum HomeOffice_State { get; set; }
|
||||
public string HomeOffice_ZipCode { get; set; }
|
||||
public double HomeOffice_Latitude { get; set; }
|
||||
public double HomeOffice_Longitude { get; set; }
|
||||
public string BillingAddress_Line { get; set; }
|
||||
public string BillingAddress_City { get; set; }
|
||||
public StateEnum BillingAddress_State { get; set; }
|
||||
public string BillingAddress_ZipCode { get; set; }
|
||||
public double BillingAddress_Latitude { get; set; }
|
||||
public double BillingAddress_Longitude { get; set; }
|
||||
#endregion
|
||||
|
||||
public virtual List<CustomerEmployee> Employees { get; set; }
|
||||
[Phone]
|
||||
public string Phone { get; set; }
|
||||
[Phone]
|
||||
public string Fax { get; set; }
|
||||
[Url]
|
||||
public string Website { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal AnnualRevenue { get; set; }
|
||||
[Display(Name = "Total Stores")]
|
||||
public int TotalStores { get; set; }
|
||||
[Display(Name = "Total Employees")]
|
||||
public int TotalEmployees { get; set; }
|
||||
public CustomerStatus Status { get; set; }
|
||||
[InverseProperty("Customer")]
|
||||
public virtual List<Order> Orders { get; set; }
|
||||
[InverseProperty("Customer")]
|
||||
public virtual List<Quote> Quotes { get; set; }
|
||||
[InverseProperty("Customer")]
|
||||
public virtual List<CustomerStore> CustomerStores { get; set; }
|
||||
public virtual string Profile { get; set; }
|
||||
public byte[] Logo { get; set; }
|
||||
Image img = null;
|
||||
public Image Image {
|
||||
get {
|
||||
if(img == null)
|
||||
img = CreateImage(Logo);
|
||||
return img;
|
||||
}
|
||||
}
|
||||
internal static Image CreateImage(byte[] data) {
|
||||
if (data == null)
|
||||
return null;// ResourceImageHelper.CreateImageFromResourcesEx("DevExpress.DevAV.Resources.Unknown-user.png", typeof(Employee).Assembly);
|
||||
else
|
||||
return DevAVByteImageConverter.FromByteArray(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
17
OutlookInspiredApp/DevExpress.DevAV/CustomerComminication.cs
Normal file
17
OutlookInspiredApp/DevExpress.DevAV/CustomerComminication.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class CustomerCommunication : DatabaseObject {
|
||||
public virtual Employee Employee { get; set; }
|
||||
public long? EmployeeId { get; set; }
|
||||
public virtual CustomerEmployee CustomerEmployee { get; set; }
|
||||
public long? CustomerEmployeeId { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public string Type { get; set; }
|
||||
public string Purpose { get; set; }
|
||||
}
|
||||
}
|
||||
53
OutlookInspiredApp/DevExpress.DevAV/CustomerEmployee.cs
Normal file
53
OutlookInspiredApp/DevExpress.DevAV/CustomerEmployee.cs
Normal file
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Drawing;
|
||||
using System.Runtime.Serialization;
|
||||
using DevExpress.DataAnnotations;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class CustomerEmployee : DatabaseObject {
|
||||
[Required, Display(Name = "First Name")]
|
||||
public string FirstName { get; set; }
|
||||
[Required, Display(Name = "Last Name")]
|
||||
public string LastName { get; set; }
|
||||
[Display(Name = "Full Name")]
|
||||
public string FullName { get; set; }
|
||||
public PersonPrefix Prefix { get; set; }
|
||||
[Required, Phone, Display(Name = "Mobile Phone")]
|
||||
public string MobilePhone { get; set; }
|
||||
[Required, EmailAddress]
|
||||
public string Email { get; set; }
|
||||
public virtual Picture Picture { get; set; }
|
||||
public long? PictureId { get; set; }
|
||||
public virtual Customer Customer { get; set; }
|
||||
public long? CustomerId { get; set; }
|
||||
public virtual CustomerStore CustomerStore { get; set; }
|
||||
public long? CustomerStoreId { get; set; }
|
||||
public string Position { get; set; }
|
||||
public bool IsPurchaseAuthority { get; set; }
|
||||
public virtual ICollection<CustomerCommunication> CustomerCommunications { get; set; }
|
||||
public Address Address {
|
||||
get { return (CustomerStore != null) ? CustomerStore.Address : null; }
|
||||
set { }
|
||||
}
|
||||
public virtual ICollection<EmployeeTask> EmployeeTasks { get; set; }
|
||||
Image _photo = null;
|
||||
[NotMapped]
|
||||
public Image Photo {
|
||||
get {
|
||||
if(_photo == null)
|
||||
_photo = Picture.CreateImage();
|
||||
return _photo;
|
||||
}
|
||||
set {
|
||||
_photo = value;
|
||||
Picture = PictureExtension.FromImage(value);
|
||||
}
|
||||
}
|
||||
public override string ToString() {
|
||||
return FullName;
|
||||
}
|
||||
}
|
||||
}
|
||||
89
OutlookInspiredApp/DevExpress.DevAV/CustomerStore.cs
Normal file
89
OutlookInspiredApp/DevExpress.DevAV/CustomerStore.cs
Normal file
@@ -0,0 +1,89 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class CustomerStore : DatabaseObject {
|
||||
public CustomerStore() {
|
||||
_address = new Address();
|
||||
}
|
||||
public virtual Customer Customer { get; set; }
|
||||
public long? CustomerId { get; set; }
|
||||
Address _address;
|
||||
[NotMapped]
|
||||
public Address Address {
|
||||
get {
|
||||
AddressHelper.UpdateAddress(_address, Address_Line, Address_City, Address_State, Address_ZipCode, Address_Latitude, Address_Longitude);
|
||||
return _address;
|
||||
}
|
||||
set {
|
||||
AddressHelper.UpdateAddress(_address, value.Line, value.City, value.State, value.ZipCode, value.Latitude, value.Longitude);
|
||||
Address_Line = _address.Line;
|
||||
Address_City = _address.City;
|
||||
Address_State = _address.State;
|
||||
Address_ZipCode = _address.ZipCode;
|
||||
Address_Latitude = _address.Latitude;
|
||||
Address_Longitude = _address.Longitude;
|
||||
}
|
||||
}
|
||||
#region EFCore
|
||||
public string Address_Line { get; set; }
|
||||
public string Address_City { get; set; }
|
||||
public StateEnum Address_State { get; set; }
|
||||
public string Address_ZipCode { get; set; }
|
||||
public double Address_Latitude { get; set; }
|
||||
public double Address_Longitude { get; set; }
|
||||
#endregion
|
||||
public string Phone { get; set; }
|
||||
public string Fax { get; set; }
|
||||
public int TotalEmployees { get; set; }
|
||||
public int SquereFootage { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal AnnualSales { get; set; }
|
||||
public virtual Crest Crest { get; set; }
|
||||
public long? CrestId { get; set; }
|
||||
public string Location { get; set; }
|
||||
public string City { get { return Address == null ? "" : Address.City; } }
|
||||
public StateEnum State { get { return Address == null ? StateEnum.CA : Address.State; } }
|
||||
public virtual ICollection<CustomerEmployee> CustomerEmployees { get; set; }
|
||||
public virtual ICollection<Order> Orders { get; set; }
|
||||
public virtual ICollection<Quote> Quotes { get; set; }
|
||||
public string CustomerName {
|
||||
get { return (Customer != null) ? Customer.Name : null; }
|
||||
}
|
||||
public string AddressLine {
|
||||
get { return (Address != null) ? Address.ToString() : null; }
|
||||
}
|
||||
public string AddressLines {
|
||||
get { return (Address != null) ? string.Format("{0}\r\n{1} {2}", Address.Line, Address.State, Address.ZipCode) : null; }
|
||||
}
|
||||
public string CrestCity {
|
||||
get { return (Crest != null) ? Crest.CityName : null; }
|
||||
}
|
||||
Image smallImg;
|
||||
public Image CrestSmallImage {
|
||||
get {
|
||||
if(smallImg == null && Crest != null)
|
||||
smallImg = CreateImage(Crest.SmallImage);
|
||||
return smallImg;
|
||||
}
|
||||
}
|
||||
Image largeImg;
|
||||
public Image CrestLargeImage {
|
||||
get {
|
||||
if(largeImg == null && Crest != null)
|
||||
largeImg = CreateImage(Crest.LargeImage);
|
||||
return largeImg;
|
||||
}
|
||||
}
|
||||
Image CreateImage(byte[] data) {
|
||||
if (data == null)
|
||||
return null;// ResourceImageHelper.CreateImageFromResourcesEx("DevExpress.DevAV.Resources.Unknown-user.png", typeof(Employee).Assembly);
|
||||
else
|
||||
return DevAVByteImageConverter.FromByteArray(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
19
OutlookInspiredApp/DevExpress.DevAV/DatabaseObject.cs
Normal file
19
OutlookInspiredApp/DevExpress.DevAV/DatabaseObject.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Runtime.Serialization;
|
||||
using DevExpress.Common;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public abstract class DatabaseObject : IDataErrorInfo {
|
||||
[Key]
|
||||
public long Id { get; set; }
|
||||
#region IDataErrorInfo
|
||||
string IDataErrorInfo.Error { get { return null; } }
|
||||
string IDataErrorInfo.this[string columnName] {
|
||||
get { return IDataErrorInfoHelper.GetErrorText(this, columnName); }
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
130
OutlookInspiredApp/DevExpress.DevAV/DevAVDb.cs
Normal file
130
OutlookInspiredApp/DevExpress.DevAV/DevAVDb.cs
Normal file
@@ -0,0 +1,130 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
|
||||
namespace DevExpress.DevAV
|
||||
{
|
||||
public class DevAVDb : DbContext {
|
||||
public DevAVDb(string connectionStringOrName) {
|
||||
connectionString = connectionStringOrName;
|
||||
}
|
||||
|
||||
string connectionString = @"Data Source=C:\Work\OutlookWpf\Data\devav.sqlite3";
|
||||
|
||||
public DevAVDb() : base()
|
||||
{
|
||||
}
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
|
||||
{
|
||||
optionbuilder.UseLazyLoadingProxies().UseSqlite(connectionString);
|
||||
}
|
||||
|
||||
public DbSet<Customer> Customers { get; set; }
|
||||
public DbSet<Employee> Employees { get; set; }
|
||||
public DbSet<Product> Products { get; set; }
|
||||
public DbSet<EmployeeTask> Tasks { get; set; }
|
||||
public DbSet<Crest> Crests { get; set; }
|
||||
public DbSet<CustomerCommunication> Communications { get; set; }
|
||||
public DbSet<CustomerStore> CustomerStores { get; set; }
|
||||
public DbSet<Order> Orders { get; set; }
|
||||
public DbSet<OrderItem> OrderItems { get; set; }
|
||||
public DbSet<Probation> Probations { get; set; }
|
||||
public DbSet<ProductCatalog> ProductCatalogs { get; set; }
|
||||
public DbSet<ProductImage> ProductImages { get; set; }
|
||||
public DbSet<Quote> Quotes { get; set; }
|
||||
public DbSet<QuoteItem> QuoteItems { get; set; }
|
||||
public DbSet<State> States { get; set; }
|
||||
public DbSet<CustomerEmployee> CustomerEmployees { get; set; }
|
||||
public DbSet<Evaluation> Evaluations { get; set; }
|
||||
public DbSet<Picture> Pictures { get; set; }
|
||||
public DbSet<TaskAttachedFile> AttachedFiles { get; set; }
|
||||
public DbSet<DatabaseVersion> Version { get; set; }
|
||||
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder) {
|
||||
base.OnModelCreating(modelBuilder);
|
||||
|
||||
modelBuilder.Entity<Employee>()
|
||||
.HasOne(x => x.Picture)
|
||||
.WithMany(x => x.Employees);
|
||||
|
||||
modelBuilder.Entity<Employee>()
|
||||
.HasOne(x => x.ProbationReason)
|
||||
.WithMany(x => x.Employees)
|
||||
.HasForeignKey(x => x.ProbationReason_Id);
|
||||
|
||||
modelBuilder.Entity<Evaluation>()
|
||||
.HasOne(x => x.CreatedBy)
|
||||
.WithMany(x => x.EvaluationsCreatedBy);
|
||||
|
||||
modelBuilder.Entity<CustomerEmployee>()
|
||||
.HasOne(x => x.CustomerStore)
|
||||
.WithMany(x => x.CustomerEmployees);
|
||||
|
||||
modelBuilder.Entity<CustomerEmployee>()
|
||||
.HasOne(x => x.Picture)
|
||||
.WithMany(x => x.CustomerEmployees);
|
||||
|
||||
modelBuilder.Entity<CustomerStore>()
|
||||
.HasOne(x => x.Crest)
|
||||
.WithMany(x => x.CustomerStores);
|
||||
|
||||
modelBuilder.Entity<Order>()
|
||||
.HasOne(x => x.Employee)
|
||||
.WithMany(x => x.Orders);
|
||||
|
||||
modelBuilder.Entity<Order>()
|
||||
.HasOne(x => x.Store)
|
||||
.WithMany(x => x.Orders);
|
||||
|
||||
modelBuilder.Entity<Product>()
|
||||
.HasOne(x => x.Engineer)
|
||||
.WithMany(x => x.Products);
|
||||
|
||||
modelBuilder.Entity<Product>()
|
||||
.HasOne(x => x.PrimaryImage)
|
||||
.WithMany(x => x.Products);
|
||||
|
||||
modelBuilder.Entity<Product>()
|
||||
.HasOne(x => x.Support)
|
||||
.WithMany(x => x.SupportedProducts);
|
||||
|
||||
modelBuilder.Entity<ProductImage>()
|
||||
.HasOne(x => x.Picture)
|
||||
.WithMany(x => x.ProductImages);
|
||||
|
||||
modelBuilder.Entity<Quote>()
|
||||
.HasOne(x => x.CustomerStore)
|
||||
.WithMany(x => x.Quotes);
|
||||
|
||||
modelBuilder.Entity<Quote>()
|
||||
.HasOne(x => x.Employee)
|
||||
.WithMany(x => x.Quotes);
|
||||
|
||||
modelBuilder.Entity<QuoteItem>()
|
||||
.HasOne(x => x.Product)
|
||||
.WithMany(x => x.QuoteItems);
|
||||
|
||||
modelBuilder.Entity<CustomerCommunication>()
|
||||
.HasOne(x => x.CustomerEmployee)
|
||||
.WithMany(x => x.CustomerCommunications);
|
||||
|
||||
modelBuilder.Entity<CustomerCommunication>()
|
||||
.HasOne(x => x.Employee)
|
||||
.WithMany(x => x.Employees);
|
||||
|
||||
modelBuilder.Entity<Employee>()
|
||||
.Ignore(x => x.AssignedEmployeeTasks);
|
||||
modelBuilder.Entity<EmployeeTask>()
|
||||
.Ignore(x => x.AssignedEmployees);
|
||||
modelBuilder.Entity<Employee>()
|
||||
.Ignore(x => x.AssignedTasks);
|
||||
modelBuilder.Entity<Employee>()
|
||||
.Ignore(x => x.OwnedTasks);
|
||||
modelBuilder.Entity<Employee>()
|
||||
.Ignore(x => x.Employees);
|
||||
}
|
||||
}
|
||||
public class DatabaseVersion : DatabaseObject {
|
||||
public DateTime Date { get; set; }
|
||||
}
|
||||
}
|
||||
15
OutlookInspiredApp/DevExpress.DevAV/DevExpress.DevAV.csproj
Normal file
15
OutlookInspiredApp/DevExpress.DevAV/DevExpress.DevAV.csproj
Normal file
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0-preview.18572.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview.18572.1" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="4.5.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
25
OutlookInspiredApp/DevExpress.DevAV/DevExpress.DevAV.sln
Normal file
25
OutlookInspiredApp/DevExpress.DevAV/DevExpress.DevAV.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.28315.86
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevExpress.DevAV", "DevExpress.DevAV.csproj", "{76AE4911-338A-43CA-81B9-C043FBB3B31E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{76AE4911-338A-43CA-81B9-C043FBB3B31E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{76AE4911-338A-43CA-81B9-C043FBB3B31E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{76AE4911-338A-43CA-81B9-C043FBB3B31E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{76AE4911-338A-43CA-81B9-C043FBB3B31E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {3FA2356F-A04A-43E2-9503-EFCD1578EB97}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
163
OutlookInspiredApp/DevExpress.DevAV/Employee.cs
Normal file
163
OutlookInspiredApp/DevExpress.DevAV/Employee.cs
Normal file
@@ -0,0 +1,163 @@
|
||||
using DevExpress.DataAnnotations;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Drawing;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum EmployeeStatus {
|
||||
[Display(Name = "Salaried")]
|
||||
Salaried,
|
||||
[Display(Name = "Commission")]
|
||||
Commission,
|
||||
[Display(Name = "Contract")]
|
||||
Contract,
|
||||
[Display(Name = "Terminated")]
|
||||
Terminated,
|
||||
[Display(Name = "On Leave")]
|
||||
OnLeave
|
||||
}
|
||||
public enum EmployeeDepartment {
|
||||
[Display(Name = "Sales")]
|
||||
Sales = 1,
|
||||
[Display(Name = "Support")]
|
||||
Support,
|
||||
[Display(Name = "Shipping")]
|
||||
Shipping,
|
||||
[Display(Name = "Engineering")]
|
||||
Engineering,
|
||||
[Display(Name = "Human Resources")]
|
||||
HumanResources,
|
||||
[Display(Name = "Management")]
|
||||
Management,
|
||||
[Display(Name = "IT")]
|
||||
IT
|
||||
}
|
||||
public enum PersonPrefix {
|
||||
Dr,
|
||||
Mr,
|
||||
Ms,
|
||||
Miss,
|
||||
Mrs
|
||||
}
|
||||
public partial class Employee : DatabaseObject {
|
||||
public Employee() {
|
||||
AssignedTasks = new List<EmployeeTask>();
|
||||
OwnedTasks = new List<EmployeeTask>();
|
||||
_address = new Address();
|
||||
AssignedEmployeeTasks = new List<EmployeeTask>();
|
||||
}
|
||||
[InverseProperty("AssignedEmployees")]
|
||||
public virtual List<EmployeeTask> AssignedEmployeeTasks { get; set; }
|
||||
public EmployeeDepartment Department { get; set; }
|
||||
[Required]
|
||||
public string Title { get; set; }
|
||||
public EmployeeStatus Status { get; set; }
|
||||
[Display(Name = "Hire Date")]
|
||||
public DateTime? HireDate { get; set; }
|
||||
[InverseProperty("AssignedEmployee")]
|
||||
public virtual List<EmployeeTask> AssignedTasks { get; set; }
|
||||
[InverseProperty("Owner")]
|
||||
public virtual List<EmployeeTask> OwnedTasks { get; set; }
|
||||
[InverseProperty("Employee")]
|
||||
public virtual List<Evaluation> Evaluations { get; set; }
|
||||
public string PersonalProfile { get; set; }
|
||||
public long? ProbationReason_Id { get; set; }
|
||||
public virtual Probation ProbationReason { get; set; }
|
||||
[Required, Display(Name = "First Name")]
|
||||
public string FirstName { get; set; }
|
||||
[Required, Display(Name = "Last Name")]
|
||||
public string LastName { get; set; }
|
||||
[Display(Name = "Full Name")]
|
||||
public string FullName { get; set; }
|
||||
public PersonPrefix Prefix { get; set; }
|
||||
[Phone, Display(Name = "Home Phone")]
|
||||
public string HomePhone { get; set; }
|
||||
[Required, Phone, Display(Name = "Mobile Phone")]
|
||||
public string MobilePhone { get; set; }
|
||||
[Required, EmailAddress]
|
||||
public string Email { get; set; }
|
||||
public string Skype { get; set; }
|
||||
[Display(Name = "Birth Date")]
|
||||
public DateTime? BirthDate { get; set; }
|
||||
public virtual Picture Picture { get; set; }
|
||||
public long? PictureId { get; set; }
|
||||
Address _address;
|
||||
[NotMapped]
|
||||
public Address Address { get {
|
||||
AddressHelper.UpdateAddress(_address, Address_Line, Address_City, Address_State, Address_ZipCode, Address_Latitude, Address_Longitude);
|
||||
return _address;
|
||||
}
|
||||
set {
|
||||
AddressHelper.UpdateAddress(_address, value.Line, value.City, value.State, value.ZipCode, value.Latitude, value.Longitude);
|
||||
Address_Line = _address.Line;
|
||||
Address_City = _address.City;
|
||||
Address_State = _address.State;
|
||||
Address_ZipCode = _address.ZipCode;
|
||||
Address_Latitude = _address.Latitude;
|
||||
Address_Longitude = _address.Longitude;
|
||||
}
|
||||
}
|
||||
|
||||
#region EFCore
|
||||
public string Address_Line { get; set; }
|
||||
public string Address_City { get; set; }
|
||||
public StateEnum Address_State { get; set; }
|
||||
public string Address_ZipCode { get; set; }
|
||||
public double Address_Latitude { get; set; }
|
||||
public double Address_Longitude { get; set; }
|
||||
#endregion
|
||||
|
||||
Image _photo = null;
|
||||
[NotMapped]
|
||||
public Image Photo {
|
||||
get {
|
||||
if(_photo == null)
|
||||
_photo = Picture.CreateImage();
|
||||
return _photo;
|
||||
}
|
||||
set {
|
||||
if(_photo == value) return;
|
||||
if(_photo != null)
|
||||
_photo.Dispose();
|
||||
_photo = value;
|
||||
Picture = PictureExtension.FromImage(value);
|
||||
}
|
||||
}
|
||||
bool unsetFullName = false;
|
||||
public virtual ICollection<Evaluation> EvaluationsCreatedBy { get; set; }
|
||||
public virtual ICollection<Order> Orders { get; set; }
|
||||
public virtual ICollection<Product> Products { get; set; }
|
||||
public virtual ICollection<Product> SupportedProducts { get; set; }
|
||||
public virtual ICollection<Quote> Quotes { get; set; }
|
||||
public virtual ICollection<CustomerCommunication> Employees { get; set; }
|
||||
[NotMapped, Display(Name = "Full Name")]
|
||||
public string FullNameBindable {
|
||||
get {
|
||||
return string.IsNullOrEmpty(FullName) || unsetFullName ? GetFullName() : FullName;
|
||||
}
|
||||
set {
|
||||
unsetFullName = string.IsNullOrEmpty(value);
|
||||
if(unsetFullName)
|
||||
FullName = GetFullName();
|
||||
else
|
||||
FullName = value;
|
||||
}
|
||||
}
|
||||
public void ResetBindable() {
|
||||
if(_photo != null)
|
||||
_photo.Dispose();
|
||||
_photo = null;
|
||||
unsetFullName = false;
|
||||
}
|
||||
string GetFullName() {
|
||||
return string.Format("{0} {1}", FirstName, LastName);
|
||||
}
|
||||
public override string ToString() {
|
||||
return FullName;
|
||||
}
|
||||
}
|
||||
}
|
||||
1
OutlookInspiredApp/DevExpress.DevAV/EnglishAlphabet.txt
Normal file
1
OutlookInspiredApp/DevExpress.DevAV/EnglishAlphabet.txt
Normal file
@@ -0,0 +1 @@
|
||||
ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
24
OutlookInspiredApp/DevExpress.DevAV/Evaluation.cs
Normal file
24
OutlookInspiredApp/DevExpress.DevAV/Evaluation.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum EvaluationRating {
|
||||
Unset,
|
||||
Good,
|
||||
Average,
|
||||
Poor
|
||||
}
|
||||
public partial class Evaluation : DatabaseObject {
|
||||
public virtual Employee CreatedBy { get; set; }
|
||||
public long? CreatedById { get; set; }
|
||||
public DateTime CreatedOn { get; set; }
|
||||
public virtual Employee Employee { get; set; }
|
||||
public long? EmployeeId { get; set; }
|
||||
public string Subject { get; set; }
|
||||
public string Details { get; set; }
|
||||
public virtual EvaluationRating Rating { get; set; }
|
||||
}
|
||||
}
|
||||
98
OutlookInspiredApp/DevExpress.DevAV/Order.cs
Normal file
98
OutlookInspiredApp/DevExpress.DevAV/Order.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum OrderShipMethod {
|
||||
[Display(Name = "Ground")]
|
||||
Ground,
|
||||
[Display(Name = "Air")]
|
||||
Air
|
||||
}
|
||||
public enum ShipmentCourier {
|
||||
None,
|
||||
[Display(Name = "FedEx")]
|
||||
FedEx,
|
||||
[Display(Name = "UPS")]
|
||||
UPS,
|
||||
[Display(Name = "DHL")]
|
||||
DHL
|
||||
}
|
||||
public enum ShipmentStatus {
|
||||
[Display(Name = "Awaiting")]
|
||||
Awaiting,
|
||||
[Display(Name = "Transit")]
|
||||
Transit,
|
||||
[Display(Name = "Received")]
|
||||
Received
|
||||
}
|
||||
public enum PaymentStatus {
|
||||
[Display(Name = "Unpaid")]
|
||||
Unpaid,
|
||||
[Display(Name = "Paid in full")]
|
||||
PaidInFull,
|
||||
[Display(Name = "Refund in full")]
|
||||
RefundInFull,
|
||||
[Display(Name = "")]
|
||||
Other
|
||||
}
|
||||
//
|
||||
public class Order : DatabaseObject {
|
||||
public Order() {
|
||||
OrderItems = new List<OrderItem>();
|
||||
}
|
||||
public string InvoiceNumber { get; set; }
|
||||
public virtual Customer Customer { get; set; }
|
||||
public long? CustomerId { get; set; }
|
||||
public virtual CustomerStore Store { get; set; }
|
||||
public long? StoreId { get; set; }
|
||||
public string PONumber { get; set; }
|
||||
public virtual Employee Employee { get; set; }
|
||||
public long? EmployeeId { get; set; }
|
||||
public DateTime OrderDate { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal SaleAmount { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal ShippingAmount { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal TotalAmount { get; set; }
|
||||
public DateTime? ShipDate { get; set; }
|
||||
public OrderShipMethod ShipMethod { get; set; }
|
||||
public string OrderTerms { get; set; }
|
||||
public virtual List<OrderItem> OrderItems { get; set; }
|
||||
public ShipmentCourier ShipmentCourier { get; set; }
|
||||
public string ShipmentCourierId { get; set; }
|
||||
public ShipmentStatus ShipmentStatus { get; set; }
|
||||
public string Comments { get; set; }
|
||||
// Payment/Refund
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal RefundTotal { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal PaymentTotal { get; set; }
|
||||
[NotMapped]
|
||||
public PaymentStatus PaymentStatus {
|
||||
get {
|
||||
if(PaymentTotal == decimal.Zero && RefundTotal == decimal.Zero)
|
||||
return DevAV.PaymentStatus.Unpaid;
|
||||
if(RefundTotal == TotalAmount)
|
||||
return DevAV.PaymentStatus.RefundInFull;
|
||||
if(PaymentTotal == TotalAmount)
|
||||
return DevAV.PaymentStatus.PaidInFull;
|
||||
return DevAV.PaymentStatus.Other;
|
||||
}
|
||||
}
|
||||
[NotMapped]
|
||||
public double ActualWeight {
|
||||
get {
|
||||
var weight = 0.0;
|
||||
if(OrderItems != null)
|
||||
foreach(var item in OrderItems)
|
||||
if(item.Product != null)
|
||||
weight += item.Product.Weight * item.ProductUnits;
|
||||
return weight;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
22
OutlookInspiredApp/DevExpress.DevAV/OrderItem.cs
Normal file
22
OutlookInspiredApp/DevExpress.DevAV/OrderItem.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class OrderItem : DatabaseObject {
|
||||
public virtual Order Order { get; set; }
|
||||
public long? OrderId { get; set; }
|
||||
public virtual Product Product { get; set; }
|
||||
public long? ProductId { get; set; }
|
||||
public int ProductUnits { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal ProductPrice { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal Discount { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal Total { get; set; }
|
||||
}
|
||||
}
|
||||
1
OutlookInspiredApp/DevExpress.DevAV/Person.cs
Normal file
1
OutlookInspiredApp/DevExpress.DevAV/Person.cs
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
33
OutlookInspiredApp/DevExpress.DevAV/Picture.cs
Normal file
33
OutlookInspiredApp/DevExpress.DevAV/Picture.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System.Drawing;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class Picture : DatabaseObject {
|
||||
public byte[] Data { get; set; }
|
||||
public virtual ICollection<Employee> Employees { get; set; }
|
||||
public virtual ICollection<CustomerEmployee> CustomerEmployees { get; set; }
|
||||
public virtual ICollection<Product> Products { get; set; }
|
||||
public virtual ICollection<ProductImage> ProductImages { get; set; }
|
||||
}
|
||||
static class PictureExtension {
|
||||
public const string DefaultPic = DefaultUserPic;
|
||||
public const string DefaultUserPic = "DevExpress.DevAV.Resources.Unknown-user.png";
|
||||
internal static Image CreateImage(this Picture picture, string defaultImage = null) {
|
||||
if (picture == null)
|
||||
{
|
||||
return null;
|
||||
//if (string.IsNullOrEmpty(defaultImage))
|
||||
// defaultImage = DefaultPic;
|
||||
//return ResourceImageHelper.CreateImageFromResourcesEx(defaultImage, typeof(Picture).Assembly);
|
||||
}
|
||||
else return DevAVByteImageConverter.FromByteArray(picture.Data);
|
||||
}
|
||||
internal static Picture FromImage(Image image) {
|
||||
return null;
|
||||
//return (image == null) ? null : new Picture()
|
||||
//{
|
||||
// Data = DevAVByteImageConverter.ToByteArray(image, image.RawFormat)
|
||||
//};
|
||||
}
|
||||
}
|
||||
}
|
||||
13
OutlookInspiredApp/DevExpress.DevAV/Probation.cs
Normal file
13
OutlookInspiredApp/DevExpress.DevAV/Probation.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class Probation : DatabaseObject {
|
||||
public string Reason { get; set; }
|
||||
public virtual ICollection<Employee> Employees { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
74
OutlookInspiredApp/DevExpress.DevAV/Product.cs
Normal file
74
OutlookInspiredApp/DevExpress.DevAV/Product.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum ProductCategory {
|
||||
[Display(Name = "Automation")]
|
||||
Automation,
|
||||
[Display(Name = "Monitors")]
|
||||
Monitors,
|
||||
[Display(Name = "Projectors")]
|
||||
Projectors,
|
||||
[Display(Name = "Televisions")]
|
||||
Televisions,
|
||||
[Display(Name = "Video Players")]
|
||||
VideoPlayers,
|
||||
}
|
||||
public class Product : DatabaseObject {
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public DateTime ProductionStart { get; set; }
|
||||
public bool Available { get; set; }
|
||||
public byte[] Image { get; set; }
|
||||
public virtual Employee Support { get; set; }
|
||||
public long? SupportId { get; set; }
|
||||
public virtual Employee Engineer { get; set; }
|
||||
public long? EngineerId { get; set; }
|
||||
public int? CurrentInventory { get; set; }
|
||||
public int Backorder { get; set; }
|
||||
public int Manufacturing { get; set; }
|
||||
public byte[] Barcode { get; set; }
|
||||
public virtual Picture PrimaryImage { get; set; }
|
||||
public long? PrimaryImageId { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal Cost { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal SalePrice { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal RetailPrice { get; set; }
|
||||
public double Weight { get; set; }
|
||||
public double ConsumerRating { get; set; }
|
||||
public ProductCategory Category { get; set; }
|
||||
[InverseProperty("Product")]
|
||||
public virtual List<ProductCatalog> Catalog { get; set; }
|
||||
[InverseProperty("Product")]
|
||||
public virtual List<OrderItem> OrderItems { get; set; }
|
||||
public virtual List<ProductImage> Images { get; set; }
|
||||
public virtual ICollection<QuoteItem> QuoteItems { get; set; }
|
||||
public Stream Brochure {
|
||||
get {
|
||||
if(Catalog != null && Catalog.Count > 0)
|
||||
return Catalog[0].PdfStream;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Image img;
|
||||
public Image ProductImage {
|
||||
get {
|
||||
if(img == null && PrimaryImage != null)
|
||||
img = CreateImage(PrimaryImage.Data);
|
||||
return img;
|
||||
}
|
||||
}
|
||||
Image CreateImage(byte[] data) {
|
||||
if (data == null)
|
||||
return null;// ResourceImageHelper.CreateImageFromResourcesEx("DevExpress.DevAV.Resources.Unknown-user.png", typeof(Employee).Assembly);
|
||||
else
|
||||
return DevAVByteImageConverter.FromByteArray(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
22
OutlookInspiredApp/DevExpress.DevAV/ProductCatalog.cs
Normal file
22
OutlookInspiredApp/DevExpress.DevAV/ProductCatalog.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class ProductCatalog : DatabaseObject {
|
||||
public virtual Product Product { get; set; }
|
||||
public long? ProductId { get; set; }
|
||||
public byte[] PDF { get; set; }
|
||||
Stream _pdfStream;
|
||||
public Stream PdfStream {
|
||||
get {
|
||||
if (_pdfStream == null)
|
||||
_pdfStream = new MemoryStream(PDF);
|
||||
return _pdfStream;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
14
OutlookInspiredApp/DevExpress.DevAV/ProductImage.cs
Normal file
14
OutlookInspiredApp/DevExpress.DevAV/ProductImage.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class ProductImage : DatabaseObject {
|
||||
public virtual Picture Picture { get; set; }
|
||||
public long? PictureId { get; set; }
|
||||
public virtual Product Product { get; set; }
|
||||
public long? ProductId { get; set; }
|
||||
}
|
||||
}
|
||||
583
OutlookInspiredApp/DevExpress.DevAV/Queries.cs
Normal file
583
OutlookInspiredApp/DevExpress.DevAV/Queries.cs
Normal file
@@ -0,0 +1,583 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class SaleSummaryInfo {
|
||||
public DateTime OrderDate { get; set; }
|
||||
public string InvoiceNumber { get; set; }
|
||||
public int ProductUnits { get; set; }
|
||||
public decimal ProductPrice { get; set; }
|
||||
public decimal Discount { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
public ProductCategory ProductCategory { get; set; }
|
||||
public long StoreId { get; set; }
|
||||
public string StoreCity { get; set; }
|
||||
public string StoreCustomerName { get; set; }
|
||||
}
|
||||
|
||||
public class SaleAnalisysInfo {
|
||||
public DateTime OrderDate { get; set; }
|
||||
public decimal ProductCost { get; set; }
|
||||
public int ProductUnits { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
}
|
||||
|
||||
public class CustomerSaleDetailOrderItemInfo {
|
||||
public long OrderId { get; set; }
|
||||
public DateTime OrderDate { get; set; }
|
||||
public string InvoiceNumber { get; set; }
|
||||
public ProductCategory ProductCategory { get; set; }
|
||||
public string PONumber { get; set; }
|
||||
public long StoreId { get; set; }
|
||||
public string StoreCity { get; set; }
|
||||
public string EmployeeFullName { get; set; }
|
||||
public decimal ShippingAmount { get; set; }
|
||||
public decimal TotalAmount { get; set; }
|
||||
public string CustomerName { get; set; }
|
||||
public string CustomerPhone { get; set; }
|
||||
public string CustomerFax { get; set; }
|
||||
public byte[] CustomerLogo { get; set; }
|
||||
Image img = null;
|
||||
public Image CustomerImage { get { return img ?? (img = Customer.CreateImage(CustomerLogo)); } }
|
||||
|
||||
public decimal Discount { get; set; }
|
||||
public int ProductUnits { get; set; }
|
||||
public decimal ProductPrice { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
|
||||
public string CustomerHomeOfficeLine { get; set; }
|
||||
public string CustomerHomeOfficeCity { get; set; }
|
||||
public StateEnum CustomerHomeOfficeState { get; set; }
|
||||
public string CustomerHomeOfficeZipCode { get; set; }
|
||||
public string CustomerHomeOfficeCityLine { get { return Address.GetCityLine(CustomerHomeOfficeCity, CustomerHomeOfficeState, CustomerHomeOfficeZipCode); } }
|
||||
|
||||
public string CustomerBillingAddressLine { get; set; }
|
||||
public string CustomerBillingAddressCity { get; set; }
|
||||
public StateEnum CustomerBillingAddressState { get; set; }
|
||||
public string CustomerBillingAddressZipCode { get; set; }
|
||||
public string CustomerBillingAddressCityLine { get { return Address.GetCityLine(CustomerBillingAddressCity, CustomerBillingAddressState, CustomerBillingAddressZipCode); } }
|
||||
}
|
||||
public class CustomerSaleDetailOrderInfo {
|
||||
public CustomerSaleDetailOrderItemInfo[] OrderItems { get; set; }
|
||||
|
||||
public long OrderId { get; set; }
|
||||
public ProductCategory ProductCategory { get; set; }
|
||||
public DateTime OrderDate { get; set; }
|
||||
public string InvoiceNumber { get; set; }
|
||||
public string PONumber { get; set; }
|
||||
public long StoreId { get; set; }
|
||||
public string StoreCity { get; set; }
|
||||
public string EmployeeFullName { get; set; }
|
||||
public string CustomerName { get; set; }
|
||||
public string CustomerPhone { get; set; }
|
||||
public string CustomerFax { get; set; }
|
||||
public Image CustomerImage { get; set; }
|
||||
public decimal ShippingAmount { get; set; }
|
||||
public decimal TotalAmount { get; set; }
|
||||
public string CustomerHomeOfficeLine { get; set; }
|
||||
public string CustomerHomeOfficeCityLine { get; set; }
|
||||
public string CustomerBillingAddressLine { get; set; }
|
||||
public string CustomerBillingAddressCityLine { get; set; }
|
||||
}
|
||||
public class QuoteInfo {
|
||||
public long Id { get; set; }
|
||||
public StateEnum State { get; set; }
|
||||
public string City { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
public double Opportunity { get; set; }
|
||||
public decimal MoneyOpportunity { get { return Total * (decimal)Opportunity; } }
|
||||
public decimal Percentage { get { return 100M * (decimal)Opportunity; } }
|
||||
}
|
||||
public class OrderInfo {
|
||||
public string InvoiceNumber { get; set; }
|
||||
public DateTime OrderDate { get; set; }
|
||||
public string Company { get; set; }
|
||||
public string Store { get; set; }
|
||||
public decimal TotalAmount { get; set; }
|
||||
}
|
||||
public class SalesProductInfo {
|
||||
public string Name { get; set; }
|
||||
public decimal Value { get; set; }
|
||||
}
|
||||
|
||||
public class SalesInfo {
|
||||
public string Caption { get; set; }
|
||||
public List<SalesProductInfo> ListProductInfo { get; set; }
|
||||
public DateTime time { get; set; }
|
||||
public SalesInfo() {
|
||||
ListProductInfo = new List<SalesProductInfo>();
|
||||
}
|
||||
}
|
||||
public class ProductInfoWithSales {
|
||||
public long Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public decimal Cost { get; set; }
|
||||
public decimal SalePrice { get; set; }
|
||||
public decimal RetailPrice { get; set; }
|
||||
public int? CurrentInventory { get; set; }
|
||||
public int Backorder { get; set; }
|
||||
public IEnumerable<double> MonthlySales { get; set; }
|
||||
public decimal? TotalSales { get; set; }
|
||||
}
|
||||
public class CustomerInfoWithSales {
|
||||
public long Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string HomeOfficeLine { get; set; }
|
||||
public string HomeOfficeCity { get; set; }
|
||||
public StateEnum HomeOfficeState { get; set; }
|
||||
public string HomeOfficeZipCode { get; set; }
|
||||
public string Phone { get; set; }
|
||||
public string Fax { get; set; }
|
||||
public decimal? TotalSales { get; set; }
|
||||
|
||||
Lazy<IEnumerable<CustomerStore>> customerStores;
|
||||
public IEnumerable<CustomerStore> CustomerStores { get { return customerStores.Value; } }
|
||||
Lazy<IEnumerable<CustomerEmployee>> customerEmployees;
|
||||
public IEnumerable<CustomerEmployee> Employees { get { return customerEmployees.Value; } }
|
||||
public IEnumerable<decimal> MonthlySales { get; private set; }
|
||||
public void Init(Func<IEnumerable<CustomerStore>> getStores, Func<IEnumerable<CustomerEmployee>> getEmployees, IEnumerable<decimal> monthlySales) {
|
||||
this.customerStores = new Lazy<IEnumerable<CustomerStore>>(getStores);
|
||||
this.customerEmployees = new Lazy<IEnumerable<CustomerEmployee>>(getEmployees);
|
||||
this.MonthlySales = monthlySales;
|
||||
}
|
||||
}
|
||||
public class MapItem {
|
||||
public Address Address { get; set; }
|
||||
public Customer Customer { get; set; }
|
||||
public Product Product { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
public string City { get { return Address.City; } }
|
||||
public double Latitude { get { return Address.Latitude; } }
|
||||
public double Longitude { get { return Address.Longitude; } }
|
||||
public string CustomerName { get { return Customer.Name; } }
|
||||
public string ProductName { get { return Product.Name; } }
|
||||
public ProductCategory ProductCategory { get { return Product.Category; } }
|
||||
}
|
||||
public class QuoteMapItem {
|
||||
public Address Address { get; set; }
|
||||
public Stage Stage { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public string City { get { return Address.City; } }
|
||||
public double Latitude { get { return Address.Latitude; } }
|
||||
public double Longitude { get { return Address.Longitude; } }
|
||||
public string Name { get { return Enum.GetName(typeof(Stage), Stage); } }
|
||||
public int Index { get { return (int)Stage; } }
|
||||
public decimal Value { get; set; }
|
||||
}
|
||||
public enum Stage {
|
||||
High,
|
||||
Medium,
|
||||
Low,
|
||||
Unlikely,
|
||||
Summary
|
||||
}
|
||||
public class SalesSummaryItem {
|
||||
public ProductCategory Category { get; set; }
|
||||
public decimal Sales { get; set; }
|
||||
}
|
||||
public class QuoteSummaryItem {
|
||||
public string StageName { get; set; }
|
||||
public decimal Summary { get; set; }
|
||||
}
|
||||
public class CostAverageItem {
|
||||
public ProductCategory Category { get; set; }
|
||||
public decimal Cost { get; set; }
|
||||
}
|
||||
public static class QueriesHelper {
|
||||
public static IQueryable<Order> ActualOrders(this IQueryable<Order> orders) {
|
||||
var actualDateTime = DateTime.Now.AddHours(0.5);
|
||||
return orders.Where(x => x.OrderDate <= actualDateTime);
|
||||
}
|
||||
public static IQueryable<Quote> ActualQuotes(this IQueryable<Quote> quotes) {
|
||||
var actualDateTime = DateTime.Now.AddHours(0.5);
|
||||
return quotes.Where(x => x.Date <= actualDateTime);
|
||||
}
|
||||
public static IQueryable<QuoteInfo> GetQuoteInfo(IQueryable<Quote> quotes) {
|
||||
return quotes.ActualQuotes().Select(x => new QuoteInfo {
|
||||
Id = x.Id,
|
||||
State = x.CustomerStore.Address.State,
|
||||
City = x.CustomerStore.Address.City,
|
||||
Date = x.Date,
|
||||
Total = x.Total,
|
||||
Opportunity = x.Opportunity,
|
||||
});
|
||||
}
|
||||
public static decimal CustomSum<T>(this IEnumerable<T> query, Expression<Func<T, decimal>> selector) {
|
||||
return query.AsQueryable<T>().Select(selector).DefaultIfEmpty(0).Sum();
|
||||
}
|
||||
public static IEnumerable<CustomerSaleDetailOrderInfo> GetCustomerSaleDetails(long customerId, IQueryable<OrderItem> orderItems) {
|
||||
List<CustomerSaleDetailOrderItemInfo> detailInfo = GetCustomerSaleOrderItemDetails(customerId, orderItems);
|
||||
return detailInfo
|
||||
.GroupBy(x => x.OrderId)
|
||||
.Select(x => new CustomerSaleDetailOrderInfo() {
|
||||
OrderId = x.Key,
|
||||
OrderItems = x.ToArray(),
|
||||
ProductCategory = x.First().ProductCategory,
|
||||
OrderDate = x.First().OrderDate,
|
||||
InvoiceNumber = x.First().InvoiceNumber,
|
||||
PONumber = x.First().PONumber,
|
||||
StoreCity = x.First().StoreCity,
|
||||
StoreId = x.First().StoreId,
|
||||
EmployeeFullName = x.First().EmployeeFullName,
|
||||
CustomerName = x.First().CustomerName,
|
||||
CustomerPhone = x.First().CustomerPhone,
|
||||
CustomerFax = x.First().CustomerFax,
|
||||
CustomerImage = x.First().CustomerImage,
|
||||
ShippingAmount = x.First().ShippingAmount,
|
||||
TotalAmount = x.First().TotalAmount,
|
||||
CustomerHomeOfficeLine = x.First().CustomerHomeOfficeLine,
|
||||
CustomerHomeOfficeCityLine = x.First().CustomerHomeOfficeCityLine,
|
||||
CustomerBillingAddressLine = x.First().CustomerBillingAddressLine,
|
||||
CustomerBillingAddressCityLine = x.First().CustomerBillingAddressCityLine
|
||||
}).ToArray();
|
||||
}
|
||||
public static List<CustomerSaleDetailOrderItemInfo> GetCustomerSaleOrderItemDetails(long customerId, IQueryable<OrderItem> orderItems) {
|
||||
return orderItems
|
||||
.Where(x => x.Order.CustomerId == customerId)
|
||||
.Select(x => new CustomerSaleDetailOrderItemInfo() {
|
||||
ProductCategory = x.Product.Category,
|
||||
OrderDate = x.Order.OrderDate,
|
||||
OrderId = x.OrderId.Value,
|
||||
InvoiceNumber = x.Order.InvoiceNumber,
|
||||
PONumber = x.Order.PONumber,
|
||||
StoreId = x.Order.Store.Id,
|
||||
StoreCity = x.Order.Store.Address.City,
|
||||
EmployeeFullName = x.Order.Employee.FullName,
|
||||
CustomerName = x.Order.Customer.Name,
|
||||
CustomerPhone = x.Order.Customer.Phone,
|
||||
CustomerFax = x.Order.Customer.Fax,
|
||||
CustomerLogo = x.Order.Customer.Logo,
|
||||
|
||||
CustomerHomeOfficeLine = x.Order.Customer.HomeOffice.Line,
|
||||
CustomerHomeOfficeCity = x.Order.Customer.HomeOffice.City,
|
||||
CustomerHomeOfficeZipCode = x.Order.Customer.HomeOffice.ZipCode,
|
||||
CustomerHomeOfficeState = x.Order.Customer.HomeOffice.State,
|
||||
CustomerBillingAddressLine = x.Order.Customer.BillingAddress.Line,
|
||||
CustomerBillingAddressCity = x.Order.Customer.BillingAddress.City,
|
||||
CustomerBillingAddressZipCode = x.Order.Customer.BillingAddress.ZipCode,
|
||||
CustomerBillingAddressState = x.Order.Customer.BillingAddress.State,
|
||||
|
||||
Total = x.Total,
|
||||
TotalAmount = x.Order.TotalAmount,
|
||||
Discount = x.Discount,
|
||||
ProductUnits = x.ProductUnits,
|
||||
ProductPrice = x.ProductPrice,
|
||||
ShippingAmount = x.Order.ShippingAmount,
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
public static IEnumerable<SaleSummaryInfo> GetSaleSummaries(IQueryable<OrderItem> orderItems) {
|
||||
return orderItems.Select(x => new SaleSummaryInfo() {
|
||||
OrderDate = x.Order.OrderDate,
|
||||
InvoiceNumber = x.Order.InvoiceNumber,
|
||||
ProductUnits = x.ProductUnits,
|
||||
ProductPrice = x.ProductPrice,
|
||||
Discount = x.Discount,
|
||||
Total = x.Total,
|
||||
ProductCategory = x.Product.Category,
|
||||
StoreId = x.Order.Store.Id,
|
||||
StoreCity = x.Order.Store.Address.City,
|
||||
StoreCustomerName = x.Order.Store.Customer.Name,
|
||||
}).ToList();
|
||||
}
|
||||
public static IEnumerable<SaleAnalisysInfo> GetSaleAnalysis(IQueryable<OrderItem> orderItems) {
|
||||
return orderItems.Select(x => new SaleAnalisysInfo() {
|
||||
OrderDate = x.Order.OrderDate,
|
||||
ProductCost = x.Product.Cost,
|
||||
ProductUnits = x.ProductUnits,
|
||||
Total = x.Total,
|
||||
}).ToList();
|
||||
}
|
||||
public static IEnumerable<string> GetStateNames(IQueryable<State> queryableStates, IEnumerable<StateEnum> states) {
|
||||
return
|
||||
from ss in queryableStates
|
||||
join s in states on ss.ShortName equals s
|
||||
select ss.LongName;
|
||||
}
|
||||
public static IList<OrderInfo> GetOrderInfo(IQueryable<Order> orders) {
|
||||
return orders.ActualOrders().Select(x => new OrderInfo {
|
||||
InvoiceNumber = x.InvoiceNumber,
|
||||
OrderDate = x.OrderDate,
|
||||
Company = x.Customer.Name,
|
||||
//Store = x.Customer.HomeOffice.City,
|
||||
TotalAmount = x.TotalAmount,
|
||||
}).ToList();
|
||||
}
|
||||
public static List<Order> GetAverageOrders(IQueryable<Order> orders, int NumberOfPoints) {
|
||||
DateTime startDate = orders.Min(q => q.OrderDate);
|
||||
DateTime endDate = orders.Max(q => q.OrderDate);
|
||||
int daysPerGroup = Math.Max(1, (endDate - startDate).Days / NumberOfPoints);
|
||||
var constDate = new DateTime(1990, 1, 1);
|
||||
List<decimal> groups = orders
|
||||
.Select(x => new { OrderDate = x.OrderDate, TotalAmount = x.TotalAmount })
|
||||
.ToList()
|
||||
.GroupBy(q => (q.OrderDate - constDate).Days / daysPerGroup)
|
||||
.Select(g => g.Average(q => q.TotalAmount))
|
||||
.ToList();
|
||||
DateTime currentDate = startDate;
|
||||
List<Order> averageOrders = new List<Order>();
|
||||
foreach(decimal total in groups) {
|
||||
averageOrders.Add(new Order { OrderDate = currentDate, TotalAmount = total });
|
||||
currentDate = currentDate.AddDays(daysPerGroup);
|
||||
}
|
||||
return averageOrders;
|
||||
}
|
||||
|
||||
public static List<Quote> GetAverageQuotes(IQueryable<Quote> quotes, int NumberOfPoints) {
|
||||
var startDate = quotes.Min(q => q.Date);
|
||||
var endDate = quotes.Max(q => q.Date);
|
||||
int daysPerGroup = Math.Max(1, (endDate - startDate).Days / NumberOfPoints);
|
||||
var constDate = new DateTime(1990, 1, 1);
|
||||
List<decimal> groups = quotes
|
||||
.Select(x => new { Date = x.Date, Total = x.Total })
|
||||
.ToList()
|
||||
.GroupBy(q => (q.Date - constDate).Days / daysPerGroup)
|
||||
.Select(g => g.Average(q => q.Total))
|
||||
.ToList();
|
||||
DateTime currentDate = startDate;
|
||||
List<Quote> averageQuotes = new List<Quote>();
|
||||
foreach(decimal total in groups) {
|
||||
averageQuotes.Add(new Quote { Date = currentDate, Total = total });
|
||||
currentDate = currentDate.AddDays(daysPerGroup);
|
||||
}
|
||||
return averageQuotes;
|
||||
}
|
||||
|
||||
public static List<SalesInfo> GetSales(IQueryable<OrderItem> orderItems) {
|
||||
var result = orderItems
|
||||
.Select(x => new { OrderDate = x.Order.OrderDate, ProductCategory = x.Product.Category, Total = x.Total })
|
||||
.OrderBy(x => x.OrderDate)
|
||||
.ToList()
|
||||
.GroupBy(x => x.OrderDate.Year)
|
||||
.Select(x => new SalesInfo() {
|
||||
time = new DateTime(x.Key, 1, 1),
|
||||
Caption = "Sales (FY" + x.Key + ")",
|
||||
ListProductInfo = x
|
||||
.GroupBy(y => y.ProductCategory)
|
||||
.Select(y => new SalesProductInfo() {
|
||||
Name = y.Key.ToString(),
|
||||
Value = y.Sum(z => z.Total)
|
||||
})
|
||||
.ToList()
|
||||
}).ToList();
|
||||
|
||||
return result;
|
||||
}
|
||||
public static IQueryable<ProductInfoWithSales> GetProductInfoWithSales(IQueryable<Product> products) {
|
||||
return products.Select(x => new ProductInfoWithSales {
|
||||
Id = x.Id,
|
||||
Name = x.Name,
|
||||
Cost = x.Cost,
|
||||
RetailPrice = x.RetailPrice,
|
||||
SalePrice = x.SalePrice,
|
||||
CurrentInventory = x.CurrentInventory,
|
||||
Backorder = x.Backorder,
|
||||
TotalSales = x.OrderItems.Sum(orderItem => orderItem.Total)
|
||||
});
|
||||
}
|
||||
public static void UpdateMonthlySales(IQueryable<OrderItem> orderItems, IEnumerable<ProductInfoWithSales> products) {
|
||||
foreach(var productInfo in products) {
|
||||
var sales = orderItems
|
||||
.Where(x => x.Product.Id == productInfo.Id)
|
||||
.GroupBy(x => x.Order.OrderDate.Month)
|
||||
.Select(x => new { Month = x.Key, Sum = (double)x.Sum(i => i.Total) }).ToArray();
|
||||
double[] monthlySales = new double[12];
|
||||
for(int i = 0; i < sales.Length; i++)
|
||||
monthlySales[sales[i].Month - 1] = sales[i].Sum;
|
||||
productInfo.MonthlySales = monthlySales;
|
||||
}
|
||||
}
|
||||
|
||||
public static IQueryable<CustomerInfoWithSales> GetCustomerInfoWithSales(IQueryable<Customer> customers) {
|
||||
return customers.Select(x => new CustomerInfoWithSales {
|
||||
Id = x.Id,
|
||||
Name = x.Name,
|
||||
HomeOfficeLine = x.HomeOffice.Line,
|
||||
HomeOfficeCity = x.HomeOffice.City,
|
||||
HomeOfficeState = x.HomeOffice.State,
|
||||
HomeOfficeZipCode = x.HomeOffice.ZipCode,
|
||||
Phone = x.Phone,
|
||||
Fax = x.Fax,
|
||||
TotalSales = x.Orders.Sum(orderItem => orderItem.TotalAmount)
|
||||
});
|
||||
}
|
||||
public static void UpdateCustomerInfoWithSales(IEnumerable<CustomerInfoWithSales> entities, IQueryable<CustomerStore> stores, IQueryable<CustomerEmployee> employees, IQueryable<Order> orders) {
|
||||
foreach(var item in entities) {
|
||||
item.Init(
|
||||
() => stores.Where(x => x.CustomerId == item.Id).ToArray(),
|
||||
() => employees.Where(x => x.CustomerId == item.Id).ToArray(),
|
||||
orders.Where(x => x.CustomerId == item.Id).GroupBy(o => o.OrderDate.Month).Select(g => g.Sum(i => i.TotalAmount)).ToArray()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public static IQueryable<Order> GetOrdersForPeriod(IQueryable<Order> orders, Period period, DateTime dateTime = new DateTime()) {
|
||||
switch(period) {
|
||||
case Period.ThisYear:
|
||||
return orders.Where(o => o.OrderDate.Year == DateTime.Now.Year);
|
||||
case Period.ThisMonth:
|
||||
return orders.Where(o => o.OrderDate.Month == DateTime.Now.Month && o.OrderDate.Year == DateTime.Now.Year);
|
||||
case Period.FixedDate:
|
||||
return orders.Where(o => o.OrderDate.Month == dateTime.Month && o.OrderDate.Year == dateTime.Year
|
||||
&& o.OrderDate.Day == dateTime.Day);
|
||||
}
|
||||
return orders;
|
||||
}
|
||||
public static IQueryable<Order> GetCustomerOrdersForPeriod(IQueryable<Order> orders, Period period, long customerId) {
|
||||
return GetOrdersForPeriod(orders.Where(o => o.CustomerId == customerId), period);
|
||||
}
|
||||
|
||||
public static IQueryable<OrderItem> GetOrderItemsForPeriod(IQueryable<OrderItem> orderItems, Period period, DateTime dateTime = new DateTime()) {
|
||||
return orderItems.Where(GetOrderItemsForPeriodFilter(period, dateTime));
|
||||
}
|
||||
public static Expression<Func<OrderItem, bool>> GetOrderItemsForPeriodFilter(Period period, DateTime dateTime = new DateTime()) {
|
||||
switch(period) {
|
||||
case Period.ThisYear:
|
||||
return x => x.Order.OrderDate.Year == DateTime.Now.Year;
|
||||
case Period.ThisMonth:
|
||||
return x => x.Order.OrderDate.Month == DateTime.Now.Month && x.Order.OrderDate.Year == DateTime.Now.Year;
|
||||
case Period.FixedDate:
|
||||
return x => x.Order.OrderDate.Month == dateTime.Month && x.Order.OrderDate.Year == dateTime.Year
|
||||
&& x.Order.OrderDate.Day == dateTime.Day;
|
||||
}
|
||||
return x => true;
|
||||
}
|
||||
|
||||
public static IEnumerable<CustomerStore> GetSalesStoresForPeriod(IQueryable<Order> orders, Period period = Period.Lifetime) {
|
||||
return QueriesHelper.GetOrdersForPeriod(orders, period).GroupBy(o => o.Store).Select(g => g.Key).Distinct();
|
||||
}
|
||||
|
||||
public static IEnumerable<MapItem> GetSaleMapItemsByCity(IQueryable<OrderItem> orderItems, long productId, string city, Period period = Period.Lifetime) {
|
||||
return GetSaleMapItems(orderItems.Where(x => x.Order.Store.Address.City == city), productId, period);
|
||||
}
|
||||
public static IEnumerable<MapItem> GetSaleMapItems(IQueryable<OrderItem> orderItems, long productId, Period period = Period.Lifetime) {
|
||||
return GetSaleMapItemsCore(orderItems.Where(QueriesHelper.GetOrderItemsForPeriodFilter(period)).Where(x => x.ProductId == productId));
|
||||
}
|
||||
public static IEnumerable<MapItem> GetSaleMapItemsByCustomer(IQueryable<OrderItem> orderItems, long customerId, Period period = Period.Lifetime) {
|
||||
return GetSaleMapItemsCore(orderItems.Where(x => x.Order.CustomerId == customerId).Where(QueriesHelper.GetOrderItemsForPeriodFilter(period)));
|
||||
}
|
||||
public static IEnumerable<MapItem> GetSaleMapItemsByCustomerAndCity(IQueryable<OrderItem> orderItems, long customerId, string city, Period period = Period.Lifetime) {
|
||||
return GetSaleMapItemsByCustomer(orderItems.Where(x => x.Order.Store.Address.City == city), customerId, period);
|
||||
}
|
||||
static IEnumerable<MapItem> GetSaleMapItemsCore(IQueryable<OrderItem> orderItems) {
|
||||
return orderItems
|
||||
.Select(x => new MapItem {
|
||||
Customer = x.Order.Customer,
|
||||
Product = x.Product,
|
||||
Total = x.Total,
|
||||
Address = x.Order.Store.Address
|
||||
});
|
||||
}
|
||||
|
||||
public static IEnumerable<SalesSummaryItem> GetSalesSummaryItems(IQueryable<OrderItem> orderItems, Period period, DateTime dateTime = new DateTime()) {
|
||||
return GetOrderItemsForPeriod(orderItems, period, dateTime)
|
||||
.GroupBy(oi => oi.Product.Category)
|
||||
.Select(g => new SalesSummaryItem { Category = g.Key, Sales = g.Sum(oi => oi.Total) })
|
||||
.ToList();
|
||||
}
|
||||
public static IEnumerable<CostAverageItem> GetCostAverageItems(IQueryable<OrderItem> orderItems, Period period, DateTime dateTime = new DateTime()) {
|
||||
return GetOrderItemsForPeriod(orderItems, period, dateTime)
|
||||
.GroupBy(oi => oi.Product.Category)
|
||||
.Select(g => new CostAverageItem { Category = g.Key, Cost = g.Average(oi => oi.ProductPrice) })
|
||||
.ToList();
|
||||
}
|
||||
public static IEnumerable<CustomerStore> GetDistinctStoresForPeriod(IQueryable<Order> orders, long customerId, Period period = Period.Lifetime) {
|
||||
return QueriesHelper.GetCustomerOrdersForPeriod(orders, period, customerId).GroupBy(o => o.Store).Select(g => g.Key).Distinct();
|
||||
}
|
||||
|
||||
public static decimal GetQuotesTotal(IQueryable<Quote> quotes, CustomerStore store, DateTime begin, DateTime end) {
|
||||
return quotes.Where(x => x.CustomerStoreId == store.Id && x.Date >= begin && x.Date <= end).CustomSum(x => x.Total);
|
||||
}
|
||||
public static IEnumerable<QuoteSummaryItem> GetSummaryOpportunities(IQueryable<Quote> quotes) {
|
||||
yield return GetSummaryItem(quotes, Stage.High);
|
||||
yield return GetSummaryItem(quotes, Stage.Medium);
|
||||
yield return GetSummaryItem(quotes, Stage.Low);
|
||||
yield return GetSummaryItem(quotes, Stage.Unlikely);
|
||||
}
|
||||
public static IEnumerable<QuoteMapItem> GetOpportunities(IQueryable<Quote> quotes, IQueryable<Customer> customers, Stage stage) {
|
||||
string name = Enum.GetName(typeof(Stage), stage);
|
||||
return from q in GetQuotes(quotes, stage)
|
||||
join c in customers on q.CustomerId equals c.Id
|
||||
select new QuoteMapItem { Stage = stage, Address = q.CustomerStore.Address, Value = q.Total, Date = q.Date };
|
||||
}
|
||||
public static IEnumerable<QuoteMapItem> GetOpportunities(IQueryable<Quote> quotes) {
|
||||
yield return GetOpportunity(quotes, Stage.High);
|
||||
yield return GetOpportunity(quotes, Stage.Medium);
|
||||
yield return GetOpportunity(quotes, Stage.Low);
|
||||
yield return GetOpportunity(quotes, Stage.Unlikely);
|
||||
}
|
||||
static QuoteMapItem GetOpportunity(IQueryable<Quote> quotes, Stage stage) {
|
||||
return new QuoteMapItem {
|
||||
Stage = stage,
|
||||
Value = GetQuotes(quotes, stage).CustomSum(q => q.Total)
|
||||
};
|
||||
}
|
||||
public static decimal GetOpportunity(IQueryable<Quote> quotes, Stage stage, string city) {
|
||||
return GetQuotes(quotes, stage).Where(q => q.CustomerStore.Address.City == city).CustomSum(q => q.Total);
|
||||
}
|
||||
public static IEnumerable<CustomerStore> GetCustomerStore(IQueryable<CustomerStore> stores, IQueryable<Quote> quotes, Stage stage) {
|
||||
return from q in GetQuotes(quotes, stage)
|
||||
join s in stores on q.CustomerStoreId equals s.Id
|
||||
select s;
|
||||
}
|
||||
public static IEnumerable<OrderItem> GetRevenueReportItems(IQueryable<OrderItem> orderItems) {
|
||||
bool hasItemsInCurrentMonth = orderItems.Where(x => x.Order.OrderDate.Month == DateTime.Now.Month && x.Order.OrderDate.Year == DateTime.Now.Year).Any();
|
||||
var dateOfLastOrder = orderItems.Max(x => x.Order.OrderDate);
|
||||
var revenueMonth = hasItemsInCurrentMonth ? DateTime.Now.Month : dateOfLastOrder.Month;
|
||||
var revenueYear = hasItemsInCurrentMonth ? DateTime.Now.Year : dateOfLastOrder.Year;
|
||||
return orderItems.Where(x => x.Order.OrderDate.Month == revenueMonth && x.Order.OrderDate.Year == revenueYear).ToList();
|
||||
}
|
||||
public static IEnumerable<OrderItem> GetRevenueAnalysisReportItems(IQueryable<OrderItem> orderItems, long storeId) {
|
||||
return orderItems.Where(x => x.Order.StoreId.Value == storeId).ToList();
|
||||
}
|
||||
static QuoteSummaryItem GetSummaryItem(IQueryable<Quote> quotes, Stage stage) {
|
||||
var query = GetQuotes(quotes, stage);
|
||||
return new QuoteSummaryItem {
|
||||
StageName = stage.ToString(),
|
||||
Summary = !query.Any() ? 0 : query.CustomSum(q => q.Total)
|
||||
};
|
||||
}
|
||||
static IQueryable<Quote> GetQuotes(IQueryable<Quote> quotes, Stage stage) {
|
||||
double min, max;
|
||||
switch(stage) {
|
||||
case Stage.High:
|
||||
max = 1.0;
|
||||
min = 0.6;
|
||||
break;
|
||||
case Stage.Medium:
|
||||
min = 0.3;
|
||||
max = 0.6;
|
||||
break;
|
||||
case Stage.Low:
|
||||
min = 0.12;
|
||||
max = 0.3;
|
||||
break;
|
||||
case Stage.Summary:
|
||||
min = 0.0;
|
||||
max = 1.0;
|
||||
break;
|
||||
default:
|
||||
min = 0.0;
|
||||
max = 0.12;
|
||||
break;
|
||||
}
|
||||
return quotes.Where(q => q.Opportunity > min && q.Opportunity < max);
|
||||
}
|
||||
}
|
||||
public enum Period {
|
||||
[Display(Name = "Lifetime")]
|
||||
Lifetime,
|
||||
[Display(Name = "This Year")]
|
||||
ThisYear,
|
||||
[Display(Name = "This Month")]
|
||||
ThisMonth,
|
||||
[Display(Name = "Fixed Date")]
|
||||
FixedDate
|
||||
}
|
||||
}
|
||||
27
OutlookInspiredApp/DevExpress.DevAV/Quote.cs
Normal file
27
OutlookInspiredApp/DevExpress.DevAV/Quote.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class Quote : DatabaseObject {
|
||||
public string Number { get; set; }
|
||||
public virtual Customer Customer { get; set; }
|
||||
public long? CustomerId { get; set; }
|
||||
public virtual CustomerStore CustomerStore { get; set; }
|
||||
public long? CustomerStoreId { get; set; }
|
||||
public virtual Employee Employee { get; set; }
|
||||
public long? EmployeeId { get; set; }
|
||||
public virtual DateTime Date { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal SubTotal { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal ShippingAmount { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal Total { get; set; }
|
||||
public double Opportunity { get; set; }
|
||||
public virtual List<QuoteItem> QuoteItems { get; set; }
|
||||
}
|
||||
}
|
||||
23
OutlookInspiredApp/DevExpress.DevAV/QuoteItem.cs
Normal file
23
OutlookInspiredApp/DevExpress.DevAV/QuoteItem.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class QuoteItem : DatabaseObject {
|
||||
public virtual Quote Quote { get; set; }
|
||||
public long? QuoteId { get; set; }
|
||||
public virtual Product Product { get; set; }
|
||||
public long? ProductId { get; set; }
|
||||
public int ProductUnits { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal ProductPrice { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal Discount { get; set; }
|
||||
[DataType(DataType.Currency)]
|
||||
public decimal Total { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
BIN
OutlookInspiredApp/DevExpress.DevAV/Resources/Unknown-user.png
Normal file
BIN
OutlookInspiredApp/DevExpress.DevAV/Resources/Unknown-user.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
16
OutlookInspiredApp/DevExpress.DevAV/State.cs
Normal file
16
OutlookInspiredApp/DevExpress.DevAV/State.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public class State {
|
||||
[Key]
|
||||
public StateEnum ShortName { get; set; }
|
||||
public string LongName { get; set; }
|
||||
public byte[] Flag48px { get; set; }
|
||||
public byte[] Flag24px { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
57
OutlookInspiredApp/DevExpress.DevAV/StateEnum.cs
Normal file
57
OutlookInspiredApp/DevExpress.DevAV/StateEnum.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum StateEnum {
|
||||
CA,
|
||||
AR,
|
||||
AL,
|
||||
AK,
|
||||
AZ,
|
||||
CO,
|
||||
CT,
|
||||
DE,
|
||||
DC,
|
||||
FL,
|
||||
GA,
|
||||
HI,
|
||||
ID,
|
||||
IL,
|
||||
IN,
|
||||
IA,
|
||||
KS,
|
||||
KY,
|
||||
LA,
|
||||
ME,
|
||||
MD,
|
||||
MA,
|
||||
MI,
|
||||
MN,
|
||||
MS,
|
||||
MO,
|
||||
MT,
|
||||
NE,
|
||||
NV,
|
||||
NH,
|
||||
NJ,
|
||||
NM,
|
||||
NY,
|
||||
NC,
|
||||
OH,
|
||||
OK,
|
||||
OR,
|
||||
PA,
|
||||
RI,
|
||||
SC,
|
||||
SD,
|
||||
TN,
|
||||
TX,
|
||||
UT,
|
||||
VT,
|
||||
VA,
|
||||
WA,
|
||||
WV,
|
||||
WI,
|
||||
WY,
|
||||
ND
|
||||
}
|
||||
}
|
||||
97
OutlookInspiredApp/DevExpress.DevAV/Task.cs
Normal file
97
OutlookInspiredApp/DevExpress.DevAV/Task.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization;
|
||||
//using System.Windows.Media;
|
||||
using System.Linq;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public enum EmployeeTaskStatus {
|
||||
[Display(Name = "Not Started")]
|
||||
NotStarted,
|
||||
[Display(Name = "Completed")]
|
||||
Completed,
|
||||
[Display(Name = "In Progress")]
|
||||
InProgress,
|
||||
[Display(Name = "Need Assistance")]
|
||||
NeedAssistance,
|
||||
[Display(Name = "Deferred")]
|
||||
Deferred
|
||||
}
|
||||
public enum EmployeeTaskPriority {
|
||||
Low,
|
||||
Normal,
|
||||
High,
|
||||
Urgent
|
||||
}
|
||||
public enum EmployeeTaskFollowUp {
|
||||
[Display(Name = "Today")]
|
||||
Today,
|
||||
[Display(Name = "Tomorrow")]
|
||||
Tomorrow,
|
||||
[Display(Name = "This Week")]
|
||||
ThisWeek,
|
||||
[Display(Name = "Next Week")]
|
||||
NextWeek,
|
||||
[Display(Name = "No Date")]
|
||||
NoDate,
|
||||
[Display(Name = "Custom")]
|
||||
Custom
|
||||
}
|
||||
|
||||
public class EmployeeTask : DatabaseObject {
|
||||
public EmployeeTask() {
|
||||
AssignedEmployees = new List<Employee>();
|
||||
}
|
||||
public virtual List<Employee> AssignedEmployees { get; set; }
|
||||
[Required]
|
||||
public string Subject { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string RtfTextDescription { get; set; }
|
||||
public DateTime? StartDate { get; set; }
|
||||
public DateTime? DueDate { get; set; }
|
||||
public EmployeeTaskStatus Status { get; set; }
|
||||
public EmployeeTaskPriority Priority { get; set; }
|
||||
public int Completion { get; set; }
|
||||
public bool Reminder { get; set; }
|
||||
public DateTime? ReminderDateTime { get; set; }
|
||||
public virtual Employee AssignedEmployee { get; set; }
|
||||
public long? AssignedEmployeeId { get; set; }
|
||||
public virtual Employee Owner { get; set; }
|
||||
public long? OwnerId { get; set; }
|
||||
public virtual CustomerEmployee CustomerEmployee { get; set; }
|
||||
public long? CustomerEmployeeId { get; set; }
|
||||
public EmployeeTaskFollowUp FollowUp { get; set; }
|
||||
public bool Private { get; set; }
|
||||
public string Category { get; set; }
|
||||
public virtual List<TaskAttachedFile> AttachedFiles { get; set; }
|
||||
public bool AttachedCollectionsChanged { get; set; }
|
||||
|
||||
public override string ToString() {
|
||||
return string.Format("{0} - {1}, due {2}, {3},\r\nOwner: {4}", Subject, Description, DueDate, Status, Owner);
|
||||
}
|
||||
public bool Overdue {
|
||||
get {
|
||||
if(Status == EmployeeTaskStatus.Completed || !DueDate.HasValue) return false;
|
||||
DateTime dDate = DueDate.Value.Date.AddDays(1);
|
||||
if(DateTime.Now >= dDate) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public int AttachedFilesCount {
|
||||
get {
|
||||
return (AttachedFiles == null) ? 0 : AttachedFiles.Count;
|
||||
}
|
||||
}
|
||||
public string AssignedEmployeesFullList {
|
||||
get {
|
||||
if(AssignedEmployees == null)
|
||||
return "";
|
||||
return string.Join(", ", AssignedEmployees.Select(x => x.FullName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
OutlookInspiredApp/DevExpress.OutlookInspiredApp.sln
Normal file
31
OutlookInspiredApp/DevExpress.OutlookInspiredApp.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28307.168
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevExpress.OutlookInspiredApp", "DevExpress.OutlookInspiredApp\DevExpress.OutlookInspiredApp.csproj", "{3E1753D3-E331-4156-9DC1-C3B49B1BB281}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevExpress.DevAV", "DevExpress.DevAV\DevExpress.DevAV.csproj", "{4BBCECE2-D8E1-41AB-BB97-D90C33575067}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{3E1753D3-E331-4156-9DC1-C3B49B1BB281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3E1753D3-E331-4156-9DC1-C3B49B1BB281}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3E1753D3-E331-4156-9DC1-C3B49B1BB281}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3E1753D3-E331-4156-9DC1-C3B49B1BB281}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4BBCECE2-D8E1-41AB-BB97-D90C33575067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4BBCECE2-D8E1-41AB-BB97-D90C33575067}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4BBCECE2-D8E1-41AB-BB97-D90C33575067}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4BBCECE2-D8E1-41AB-BB97-D90C33575067}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {EF4B80D3-8139-4F5C-B054-BD71E5337C2A}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
163
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Common/CommonResources.Designer.cs
generated
Normal file
163
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Common/CommonResources.Designer.cs
generated
Normal file
@@ -0,0 +1,163 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
|
||||
// This class was auto-generated.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
|
||||
namespace DevExpress.DevAV.Common {
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class CommonResources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal CommonResources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DevExpress.DevAV.Common.CommonResources", typeof(CommonResources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Do you want to delete this {0}?.
|
||||
/// </summary>
|
||||
internal static string Confirmation_Delete {
|
||||
get {
|
||||
return ResourceManager.GetString("Confirmation_Delete", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Do you want to save changes?.
|
||||
/// </summary>
|
||||
internal static string Confirmation_Save {
|
||||
get {
|
||||
return ResourceManager.GetString("Confirmation_Save", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Click OK to reload the entity and lose unsaved changes. Click Cancel to continue editing data..
|
||||
/// </summary>
|
||||
internal static string Confirmation_Reset {
|
||||
get {
|
||||
return ResourceManager.GetString("Confirmation_Reset", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Confirmation.
|
||||
/// </summary>
|
||||
internal static string Confirmation_Caption {
|
||||
get {
|
||||
return ResourceManager.GetString("Confirmation_Caption", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Warning.
|
||||
/// </summary>
|
||||
internal static string Warning_Caption {
|
||||
get {
|
||||
return ResourceManager.GetString("Warning_Caption", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Some fields contain invalid data. Click OK to close the page and lose unsaved changes. Press Cancel to continue editing data..
|
||||
/// </summary>
|
||||
internal static string Warning_SomeFieldsContainInvalidData {
|
||||
get {
|
||||
return ResourceManager.GetString("Warning_SomeFieldsContainInvalidData", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Update Error.
|
||||
/// </summary>
|
||||
internal static string Exception_UpdateErrorCaption {
|
||||
get {
|
||||
return ResourceManager.GetString("Exception_UpdateErrorCaption", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Validation Error.
|
||||
/// </summary>
|
||||
internal static string Exception_ValidationErrorCaption {
|
||||
get {
|
||||
return ResourceManager.GetString("Exception_ValidationErrorCaption", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to DataService Request Error.
|
||||
/// </summary>
|
||||
internal static string Exception_DataServiceRequestErrorCaption {
|
||||
get {
|
||||
return ResourceManager.GetString("Exception_DataServiceRequestErrorCaption", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to *.
|
||||
/// </summary>
|
||||
internal static string Entity_Changed {
|
||||
get {
|
||||
return ResourceManager.GetString("Entity_Changed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to (New).
|
||||
/// </summary>
|
||||
internal static string Entity_New {
|
||||
get {
|
||||
return ResourceManager.GetString("Entity_New", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Confirmation_Delete" xml:space="preserve">
|
||||
<value>Do you want to delete this {0}?</value>
|
||||
</data>
|
||||
<data name="Confirmation_Save" xml:space="preserve">
|
||||
<value>Do you want to save changes?</value>
|
||||
</data>
|
||||
<data name="Confirmation_Reset" xml:space="preserve">
|
||||
<value>Click OK to reload the entity and lose unsaved changes. Click Cancel to continue editing data.</value>
|
||||
</data>
|
||||
<data name="Confirmation_Caption" xml:space="preserve">
|
||||
<value>Confirmation</value>
|
||||
</data>
|
||||
<data name="Warning_Caption" xml:space="preserve">
|
||||
<value>Warning</value>
|
||||
</data>
|
||||
<data name="Warning_SomeFieldsContainInvalidData" xml:space="preserve">
|
||||
<value>Some fields contain invalid data. Click OK to close the page and lose unsaved changes. Press Cancel to continue editing data.</value>
|
||||
</data>
|
||||
<data name="Exception_UpdateErrorCaption" xml:space="preserve">
|
||||
<value>Update Error</value>
|
||||
</data>
|
||||
<data name="Exception_ValidationErrorCaption" xml:space="preserve">
|
||||
<value>Validation Error</value>
|
||||
</data>
|
||||
<data name="Exception_DataServiceRequestErrorCaption" xml:space="preserve">
|
||||
<value>DataService Request Error</value>
|
||||
</data>
|
||||
<data name="Entity_Changed" xml:space="preserve">
|
||||
<value> *</value>
|
||||
</data>
|
||||
<data name="Entity_New" xml:space="preserve">
|
||||
<value> (New)</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using DevExpress.DataAnnotations;
|
||||
|
||||
namespace DevExpress.DevAV.Common.Utils {
|
||||
public static class DataAnnotationHelper {
|
||||
public static bool IsRequired<TEntity>(string propertyName) {
|
||||
return IsSet<RequiredAttribute>(typeof(TEntity), propertyName);
|
||||
}
|
||||
public static bool IsPhone<TEntity>(string propertyName) {
|
||||
return IsSet<PhoneAttribute>(typeof(TEntity), propertyName);
|
||||
}
|
||||
public static bool IsEmail<TEntity>(string propertyName) {
|
||||
return IsSet<EmailAddressAttribute>(typeof(TEntity), propertyName);
|
||||
}
|
||||
public static bool IsZipcode<TEntity>(string propertyName) {
|
||||
return IsSet<ZipCodeAttribute>(typeof(TEntity), propertyName);
|
||||
}
|
||||
public static bool IsSet<TAttribute>(System.Type type, string propertyName) where TAttribute : ValidationAttribute {
|
||||
string[] path = propertyName.Split('.');
|
||||
if(path.Length > 1) {
|
||||
PropertyInfo nestedPropertyInfo = type.GetProperty(path[0]);
|
||||
if(nestedPropertyInfo == null)
|
||||
return false;
|
||||
return IsSet<TAttribute>(nestedPropertyInfo.PropertyType, string.Join(".", path.Skip(1)));
|
||||
}
|
||||
PropertyInfo propertyInfo = type.GetProperty(propertyName);
|
||||
if(propertyInfo == null)
|
||||
return false;
|
||||
return propertyInfo.GetCustomAttributes(false).OfType<TAttribute>().Any();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
|
||||
namespace DevExpress.DevAV.Common.Utils {
|
||||
/// <summary>
|
||||
/// Provides the extension method for implementations of the IQueryable interface.
|
||||
/// </summary>
|
||||
public static class DbExtensions {
|
||||
|
||||
/// <summary>
|
||||
/// Forces entities to be loaded locally from the IQueryable instance.
|
||||
/// </summary>
|
||||
/// <param name="source">An instance of the IQueryable interface from which to load entities.</param>
|
||||
public static void Load(this IQueryable source) {
|
||||
IEnumerator enumerator = source.GetEnumerator();
|
||||
while(enumerator.MoveNext()) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
|
||||
namespace DevExpress.DevAV.Common.Utils {
|
||||
/// <summary>
|
||||
/// Provides methods to perform operations with lambda expression trees.
|
||||
/// </summary>
|
||||
public class ExpressionHelper {
|
||||
class ValueHolder<T> {
|
||||
public readonly T value;
|
||||
public ValueHolder(T value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
static readonly Dictionary<Type, object> TraitsCache = new Dictionary<Type, object>();
|
||||
|
||||
/// <summary>
|
||||
/// Builds a lambda expression that compares an entity property value with a given constant value.
|
||||
/// </summary>
|
||||
/// <typeparam name="TPropertyOwner">An owner type of the property.</typeparam>
|
||||
/// <typeparam name="TProperty">A primary key property type.</typeparam>
|
||||
/// <param name="getPropertyExpression">A lambda expression that returns the property value for a given entity.</param>
|
||||
/// <param name="constant">A constant value to compare with entity property value.</param>
|
||||
public static Expression<Func<TPropertyOwner, bool>> GetValueEqualsExpression<TPropertyOwner, TProperty>(Expression<Func<TPropertyOwner, TProperty>> getPropertyExpression, TProperty constant) {
|
||||
Expression equalExpression = Expression.Equal(getPropertyExpression.Body, Expression.Convert(Expression.Field(Expression.Constant(new ValueHolder<TProperty>(constant)), "value"), getPropertyExpression.Body.Type));
|
||||
return Expression.Lambda<Func<TPropertyOwner, bool>>(equalExpression, getPropertyExpression.Parameters.Single());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an instance of the EntityTraits class that encapsulates operations to obtain and set the primary key value of a given entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TOwner">A type used as a key to cache compiled lambda expressions.</typeparam>
|
||||
/// <typeparam name="TPropertyOwner">An owner type of the primary key property.</typeparam>
|
||||
/// <typeparam name="TProperty">A primary key property type.</typeparam>
|
||||
/// <param name="owner">An instance of the TOwner type which type is used as a key to cache compiled lambda expressions.</param>
|
||||
/// <param name="getPropertyExpression">A lambda expression that returns the primary key value for a given entity.</param>
|
||||
public static EntityTraits<TPropertyOwner, TProperty> GetEntityTraits<TOwner, TPropertyOwner, TProperty>(TOwner owner, Expression<Func<TPropertyOwner, TProperty>> getPropertyExpression) {
|
||||
object traits = null;
|
||||
if(!TraitsCache.TryGetValue(owner.GetType(), out traits)) {
|
||||
traits = new EntityTraits<TPropertyOwner, TProperty>(getPropertyExpression.Compile(), GetSetValueActionExpression(getPropertyExpression).Compile(), GetHasValueFunctionExpression(getPropertyExpression).Compile());
|
||||
TraitsCache[owner.GetType()] = traits;
|
||||
}
|
||||
return (EntityTraits<TPropertyOwner, TProperty>)traits;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the given entity satisfies the condition represented by a lambda expression.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A type of the given object.</typeparam>
|
||||
/// <param name="entity">An object to test.</param>
|
||||
/// <param name="predicate">A function that determines whether the given object satisfies the condition.</param>
|
||||
public static bool IsFitEntity<TEntity>(TEntity entity, Expression<Func<TEntity, bool>> predicate) where TEntity : class {
|
||||
return predicate == null || (new TEntity[] { entity }.AsQueryable().Any(predicate));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a property reference represented as a lambda expression to a property name.
|
||||
/// </summary>
|
||||
/// <param name="expression">A lambda expression that returns the property value.</param>
|
||||
public static string GetPropertyName(LambdaExpression expression) {
|
||||
Expression body = expression.Body;
|
||||
if(body is UnaryExpression) {
|
||||
body = ((UnaryExpression)body).Operand;
|
||||
}
|
||||
var memberExpression = ValidateMemberExpression((MemberExpression)body);
|
||||
return memberExpression.Member.Name;
|
||||
}
|
||||
|
||||
static MemberExpression ValidateMemberExpression(MemberExpression memberExpression) {
|
||||
if(IsNullableValueExpression(memberExpression))
|
||||
memberExpression = (MemberExpression)memberExpression.Expression;
|
||||
return memberExpression;
|
||||
}
|
||||
|
||||
static bool IsNullableValueExpression(MemberExpression memberExpression) {
|
||||
var propertyInfo = (PropertyInfo)memberExpression.Member;
|
||||
return propertyInfo.PropertyType.IsValueType && propertyInfo.ReflectedType == typeof(Nullable<>).MakeGenericType(propertyInfo.PropertyType) && propertyInfo.Name == "Value";
|
||||
}
|
||||
|
||||
static Expression<Action<TPropertyOwner, TProperty>> GetSetValueActionExpression<TPropertyOwner, TProperty>(Expression<Func<TPropertyOwner, TProperty>> getPropertyExpression) {
|
||||
MemberExpression body = ValidateMemberExpression((MemberExpression)getPropertyExpression.Body);
|
||||
ParameterExpression thisParameter = getPropertyExpression.Parameters.Single();
|
||||
ParameterExpression propertyValueParameter = Expression.Parameter(typeof(TProperty), "propertyValue");
|
||||
|
||||
Expression keyValueExpression = propertyValueParameter;
|
||||
if(IsNullableValueExpression((MemberExpression)getPropertyExpression.Body)) {
|
||||
var constructor = typeof(Nullable<>).MakeGenericType(typeof(TProperty)).GetConstructor(new Type[] { typeof(TProperty) });
|
||||
keyValueExpression = Expression.New(constructor, keyValueExpression);
|
||||
}
|
||||
|
||||
BinaryExpression assignPropertyValueExpression = Expression.Assign(body, keyValueExpression);
|
||||
return Expression.Lambda<Action<TPropertyOwner, TProperty>>(assignPropertyValueExpression, thisParameter, propertyValueParameter);
|
||||
}
|
||||
|
||||
static Expression<Func<TPropertyOwner, bool>> GetHasValueFunctionExpression<TPropertyOwner, TProperty>(Expression<Func<TPropertyOwner, TProperty>> getPropertyExpression) {
|
||||
MemberExpression memberExpression = (MemberExpression)getPropertyExpression.Body;
|
||||
if(IsNullableValueExpression(memberExpression)) {
|
||||
Expression equalExpression = Expression.NotEqual(memberExpression.Expression, Expression.Constant(null));
|
||||
return Expression.Lambda<Func<TPropertyOwner, bool>>(equalExpression, getPropertyExpression.Parameters.Single());
|
||||
}
|
||||
return x => true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Incapsulates operations to obtain and set the primary key value of a given entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An owner type of the primary key property.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key property type.</typeparam>
|
||||
public class EntityTraits<TEntity, TPrimaryKey> {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of EntityTraits class.
|
||||
/// </summary>
|
||||
/// <param name="getPrimaryKeyFunction">A function that returns the primary key value of a given entity.</param>
|
||||
/// <param name="setPrimaryKeyAction">An action that assigns the primary key value to a given entity.</param>
|
||||
/// <param name="hasPrimaryKeyFunction">A function that determines whether given the entity has a primary key assigned.</param>
|
||||
public EntityTraits(Func<TEntity, TPrimaryKey> getPrimaryKeyFunction, Action<TEntity, TPrimaryKey> setPrimaryKeyAction, Func<TEntity, bool> hasPrimaryKeyFunction) {
|
||||
this.GetPrimaryKey = getPrimaryKeyFunction;
|
||||
this.SetPrimaryKey = setPrimaryKeyAction;
|
||||
this.HasPrimaryKey = hasPrimaryKeyFunction;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The function that returns the primary key value of a given entity.
|
||||
/// </summary>
|
||||
public Func<TEntity, TPrimaryKey> GetPrimaryKey { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The action that assigns the primary key value to a given entity.
|
||||
/// </summary>
|
||||
public Action<TEntity, TPrimaryKey> SetPrimaryKey { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// A function that determines whether the given entity has a primary key assigned (the primary key is not null). Always returns true if the primary key is a non-nullable value type.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public Func<TEntity, bool> HasPrimaryKey { get; private set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
namespace DevExpress.DevAV {
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
abstract class ProcessTracker : IObservable<string> {
|
||||
IList<IObserver<string>> observers;
|
||||
protected ProcessTracker() {
|
||||
observers = new List<IObserver<string>>();
|
||||
}
|
||||
public IDisposable StartTracking(IProcess process) {
|
||||
return new TrackingContext(process, this);
|
||||
}
|
||||
IDisposable IObservable<string>.Subscribe(IObserver<string> observer) {
|
||||
return new Subscription(this, observer);
|
||||
}
|
||||
void process_Start(object sender, ProcessStatusEventArgs e) {
|
||||
foreach(IObserver<string> observer in observers)
|
||||
observer.OnNext(e.Status);
|
||||
}
|
||||
void process_Running(object sender, ProcessStatusEventArgs e) {
|
||||
foreach(IObserver<string> observer in observers)
|
||||
observer.OnNext(e.Status);
|
||||
}
|
||||
void process_Complete(object sender, EventArgs e) {
|
||||
foreach(IObserver<string> observer in observers)
|
||||
observer.OnCompleted();
|
||||
}
|
||||
class TrackingContext : IDisposable {
|
||||
IProcess process;
|
||||
ProcessTracker tracker;
|
||||
public TrackingContext(IProcess process, ProcessTracker tracker) {
|
||||
process.Start += tracker.process_Start;
|
||||
process.Running += tracker.process_Running;
|
||||
process.Complete += tracker.process_Complete;
|
||||
this.process = process;
|
||||
this.tracker = tracker;
|
||||
}
|
||||
void IDisposable.Dispose() {
|
||||
process.Start -= tracker.process_Start;
|
||||
process.Running -= tracker.process_Running;
|
||||
process.Complete -= tracker.process_Complete;
|
||||
this.tracker = null;
|
||||
this.process = null;
|
||||
}
|
||||
}
|
||||
class Subscription : IDisposable {
|
||||
IObserver<string> observer;
|
||||
ProcessTracker tracker;
|
||||
public Subscription(ProcessTracker tracker, IObserver<string> observer) {
|
||||
if(!tracker.observers.Contains(observer))
|
||||
tracker.observers.Add(observer);
|
||||
this.tracker = tracker;
|
||||
this.observer = observer;
|
||||
}
|
||||
void IDisposable.Dispose() {
|
||||
tracker.observers.Remove(observer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
namespace DevExpress.DevAV {
|
||||
using System;
|
||||
|
||||
public interface IProcess {
|
||||
event ProcessStatusEventHandler Start;
|
||||
event ProcessStatusEventHandler Running;
|
||||
event EventHandler Complete;
|
||||
}
|
||||
public delegate void ProcessStatusEventHandler(
|
||||
object sender, ProcessStatusEventArgs e
|
||||
);
|
||||
public class ProcessStatusEventArgs : EventArgs {
|
||||
public ProcessStatusEventArgs(string status) {
|
||||
Status = status;
|
||||
}
|
||||
public string Status { get; private set; }
|
||||
}
|
||||
//
|
||||
class StartUpProcess : IProcess, IDisposable {
|
||||
static StartUpProcess process;
|
||||
IDisposable tracker;
|
||||
public StartUpProcess() {
|
||||
process = this;
|
||||
tracker = StartUpProcessTracker.Instance.StartTracking(this);
|
||||
}
|
||||
void IDisposable.Dispose() {
|
||||
tracker.Dispose();
|
||||
process = null;
|
||||
}
|
||||
public static IObservable<string> Status {
|
||||
get { return StartUpProcessTracker.Instance; }
|
||||
}
|
||||
public static void OnStart(string status) {
|
||||
if(process != null)
|
||||
process.RaiseStart(status);
|
||||
}
|
||||
public static void OnRunning(string status) {
|
||||
if(process != null)
|
||||
process.RaiseRunning(status);
|
||||
}
|
||||
public static void OnComplete() {
|
||||
if(process != null)
|
||||
process.RaiseComplete();
|
||||
}
|
||||
#region ProcessTracker
|
||||
class StartUpProcessTracker : ProcessTracker {
|
||||
internal static StartUpProcessTracker Instance = new StartUpProcessTracker();
|
||||
}
|
||||
#endregion ProcessTracker
|
||||
#region IProcess Members
|
||||
ProcessStatusEventHandler startCore;
|
||||
event ProcessStatusEventHandler IProcess.Start {
|
||||
add { startCore += value; }
|
||||
remove { startCore -= value; }
|
||||
}
|
||||
ProcessStatusEventHandler runningCore;
|
||||
event ProcessStatusEventHandler IProcess.Running {
|
||||
add { runningCore += value; }
|
||||
remove { runningCore -= value; }
|
||||
}
|
||||
EventHandler completeCore;
|
||||
event EventHandler IProcess.Complete {
|
||||
add { completeCore += value; }
|
||||
remove { completeCore -= value; }
|
||||
}
|
||||
void RaiseStart(string status) {
|
||||
if(startCore != null)
|
||||
startCore(this, new ProcessStatusEventArgs(status));
|
||||
}
|
||||
void RaiseRunning(string status) {
|
||||
if(runningCore != null)
|
||||
runningCore(this, new ProcessStatusEventArgs(status));
|
||||
}
|
||||
void RaiseComplete() {
|
||||
if(completeCore != null)
|
||||
completeCore(this, EventArgs.Empty);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,433 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// The base class for a POCO view models exposing a colection of entities of a given type and CRUD operations against these entities.
|
||||
/// This is a partial class that provides extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public partial class CollectionViewModel<TEntity, TPrimaryKey, TUnitOfWork> : CollectionViewModel<TEntity, TEntity, TPrimaryKey, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of CollectionViewModel as a POCO view model.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data.</param>
|
||||
/// <param name="newEntityInitializer">An optional parameter that provides a function to initialize a new entity. This parameter is used in the detail collection view models when creating a single object view model for a new entity.</param>
|
||||
/// <param name="ignoreSelectEntityMessage">An optional parameter that used to specify that the selected entity should not be managed by PeekCollectionViewModel.</param>
|
||||
public static CollectionViewModel<TEntity, TPrimaryKey, TUnitOfWork> CreateCollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TEntity>> projection = null,
|
||||
Action<TEntity> newEntityInitializer = null,
|
||||
bool ignoreSelectEntityMessage = false) {
|
||||
return ViewModelSource.Create(() => new CollectionViewModel<TEntity, TPrimaryKey, TUnitOfWork>(unitOfWorkFactory, getRepositoryFunc, projection, newEntityInitializer, ignoreSelectEntityMessage));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CollectionViewModel class.
|
||||
/// This constructor is declared protected to avoid an undesired instantiation of the CollectionViewModel type without the POCO proxy factory.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data.</param>
|
||||
/// <param name="newEntityInitializer">An optional parameter that provides a function to initialize a new entity. This parameter is used in the detail collection view models when creating a single object view model for a new entity.</param>
|
||||
/// <param name="ignoreSelectEntityMessage">An optional parameter that used to specify that the selected entity should not be managed by PeekCollectionViewModel.</param>
|
||||
protected CollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TEntity>> projection = null,
|
||||
Action<TEntity> newEntityInitializer = null,
|
||||
bool ignoreSelectEntityMessage = false
|
||||
) : base(unitOfWorkFactory, getRepositoryFunc, projection, newEntityInitializer, ignoreSelectEntityMessage) {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base class for a POCO view models exposing a collection of entities of a given type and CRUD operations against these entities.
|
||||
/// This is a partial class that provides extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public partial class CollectionViewModel<TEntity, TProjection, TPrimaryKey, TUnitOfWork> : CollectionViewModelBase<TEntity, TProjection, TPrimaryKey, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of CollectionViewModel as a POCO view model.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
/// <param name="newEntityInitializer">An optional parameter that provides a function to initialize a new entity. This parameter is used in the detail collection view models when creating a single object view model for a new entity.</param>
|
||||
/// <param name="ignoreSelectEntityMessage">An optional parameter that used to specify that the selected entity should not be managed by PeekCollectionViewModel.</param>
|
||||
public static CollectionViewModel<TEntity, TProjection, TPrimaryKey, TUnitOfWork> CreateProjectionCollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection,
|
||||
Action<TEntity> newEntityInitializer = null,
|
||||
bool ignoreSelectEntityMessage = false) {
|
||||
return ViewModelSource.Create(() => new CollectionViewModel<TEntity, TProjection, TPrimaryKey, TUnitOfWork>(unitOfWorkFactory, getRepositoryFunc, projection, newEntityInitializer, ignoreSelectEntityMessage));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CollectionViewModel class.
|
||||
/// This constructor is declared protected to avoid an undesired instantiation of the CollectionViewModel type without the POCO proxy factory.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
/// <param name="newEntityInitializer">An optional parameter that provides a function to initialize a new entity. This parameter is used in the detail collection view models when creating a single object view model for a new entity.</param>
|
||||
/// <param name="ignoreSelectEntityMessage">An optional parameter that used to specify that the selected entity should not be managed by PeekCollectionViewModel.</param>
|
||||
protected CollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection,
|
||||
Action<TEntity> newEntityInitializer = null,
|
||||
bool ignoreSelectEntityMessage = false
|
||||
) : base(unitOfWorkFactory, getRepositoryFunc, projection, newEntityInitializer, ignoreSelectEntityMessage) {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a collection of entities of a given type and CRUD operations against these entities.
|
||||
/// It is not recommended to inherit directly from this class. Use the CollectionViewModel class instead.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public abstract class CollectionViewModelBase<TEntity, TProjection, TPrimaryKey, TUnitOfWork> : ReadOnlyCollectionViewModel<TEntity, TProjection, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
EntitiesChangeTracker<TPrimaryKey> ChangeTrackerWithKey { get { return (EntitiesChangeTracker<TPrimaryKey>)ChangeTracker; } }
|
||||
readonly Action<TEntity> newEntityInitializer;
|
||||
IRepository<TEntity, TPrimaryKey> Repository { get { return (IRepository<TEntity, TPrimaryKey>)ReadOnlyRepository; } }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CollectionViewModelBase class.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
/// <param name="newEntityInitializer">A function to initialize a new entity. This parameter is used in the detail collection view models when creating a single object view model for a new entity.</param>
|
||||
/// <param name="ignoreSelectEntityMessage">A parameter used to specify whether the selected entity should be managed by PeekCollectionViewModel.</param>
|
||||
protected CollectionViewModelBase(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection,
|
||||
Action<TEntity> newEntityInitializer,
|
||||
bool ignoreSelectEntityMessage
|
||||
) : base(unitOfWorkFactory, getRepositoryFunc, projection) {
|
||||
VerifyProjectionType();
|
||||
this.newEntityInitializer = newEntityInitializer;
|
||||
this.ignoreSelectEntityMessage = ignoreSelectEntityMessage;
|
||||
if(!this.IsInDesignMode())
|
||||
RegisterSelectEntityMessage();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and shows a document that contains a single object view model for new entity.
|
||||
/// Since CollectionViewModelBase is a POCO view model, an the instance of this class will also expose the NewCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public virtual void New() {
|
||||
GetDocumentManagerService().ShowNewEntityDocument(this, newEntityInitializer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and shows a document that contains a single object view model for the existing entity.
|
||||
/// Since CollectionViewModelBase is a POCO view model, an the instance of this class will also expose the EditCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">Entity to edit.</param>
|
||||
public virtual void Edit(TProjection projectionEntity) {
|
||||
if(Repository.IsDetached(projectionEntity))
|
||||
return;
|
||||
TPrimaryKey primaryKey = Repository.GetProjectionPrimaryKey(projectionEntity);
|
||||
int index = Entities.IndexOf(projectionEntity);
|
||||
projectionEntity = ChangeTrackerWithKey.FindActualProjectionByKey(primaryKey);
|
||||
if(index >= 0) {
|
||||
if(projectionEntity == null)
|
||||
Entities.RemoveAt(index);
|
||||
else
|
||||
Entities[index] = projectionEntity;
|
||||
}
|
||||
if(projectionEntity == null) {
|
||||
DestroyDocument(GetDocumentManagerService().FindEntityDocument<TEntity, TPrimaryKey>(primaryKey));
|
||||
return;
|
||||
}
|
||||
GetDocumentManagerService().ShowExistingEntityDocument<TEntity, TPrimaryKey>(this, primaryKey);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether an entity can be edited.
|
||||
/// Since CollectionViewModelBase is a POCO view model, this method will be used as a CanExecute callback for EditCommand.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to edit.</param>
|
||||
public bool CanEdit(TProjection projectionEntity) {
|
||||
return projectionEntity != null && !IsLoading;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a given entity from the repository and saves changes if confirmed by the user.
|
||||
/// Since CollectionViewModelBase is a POCO view model, an the instance of this class will also expose the DeleteCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to edit.</param>
|
||||
public virtual void Delete(TProjection projectionEntity) {
|
||||
if(MessageBoxService.ShowMessage(string.Format(CommonResources.Confirmation_Delete, typeof(TEntity).Name), CommonResources.Confirmation_Caption, MessageButton.YesNo) != MessageResult.Yes)
|
||||
return;
|
||||
try {
|
||||
Entities.Remove(projectionEntity);
|
||||
TPrimaryKey primaryKey = Repository.GetProjectionPrimaryKey(projectionEntity);
|
||||
TEntity entity = Repository.Find(primaryKey);
|
||||
if(entity != null) {
|
||||
OnBeforeEntityDeleted(primaryKey, entity);
|
||||
Repository.Remove(entity);
|
||||
Repository.UnitOfWork.SaveChanges();
|
||||
OnEntityDeleted(primaryKey, entity);
|
||||
}
|
||||
} catch (DbException e) {
|
||||
Refresh();
|
||||
MessageBoxService.ShowMessage(e.ErrorMessage, e.ErrorCaption, MessageButton.OK, MessageIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether an entity can be deleted.
|
||||
/// Since CollectionViewModelBase is a POCO view model, this method will be used as a CanExecute callback for DeleteCommand.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to edit.</param>
|
||||
public virtual bool CanDelete(TProjection projectionEntity) {
|
||||
return projectionEntity != null && !IsLoading;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves the given entity.
|
||||
/// Since CollectionViewModelBase is a POCO view model, the instance of this class will also expose the SaveCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to save.</param>
|
||||
[Display(AutoGenerateField = false)]
|
||||
public virtual void Save(TProjection projectionEntity) {
|
||||
TPrimaryKey primaryKey = Repository.GetProjectionPrimaryKey(projectionEntity);
|
||||
TEntity entity = Repository.Find(primaryKey);
|
||||
if(typeof(TProjection) != typeof(TEntity))
|
||||
ApplyProjectionPropertiesToEntity(projectionEntity, entity);
|
||||
try {
|
||||
OnBeforeEntitySaved(primaryKey, entity);
|
||||
Repository.UnitOfWork.SaveChanges();
|
||||
OnEntitySaved(primaryKey, entity);
|
||||
} catch (DbException e) {
|
||||
MessageBoxService.ShowMessage(e.ErrorMessage, e.ErrorCaption, MessageButton.OK, MessageIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether entity local changes can be saved.
|
||||
/// Since CollectionViewModelBase is a POCO view model, this method will be used as a CanExecute callback for SaveCommand.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to save.</param>
|
||||
public virtual bool CanSave(TProjection projectionEntity) {
|
||||
return projectionEntity != null && !IsLoading;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Notifies that SelectedEntity has been changed by raising the PropertyChanged event.
|
||||
/// Since CollectionViewModelBase is a POCO view model, an the instance of this class will also expose the UpdateSelectedEntityCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
[Display(AutoGenerateField = false)]
|
||||
public virtual void UpdateSelectedEntity() {
|
||||
this.RaisePropertyChanged(x => x.SelectedEntity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the corresponding view.
|
||||
/// Since CollectionViewModelBase is a POCO view model, an the instance of this class will also expose the CloseCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
[Display(AutoGenerateField = false)]
|
||||
public void Close() {
|
||||
if(DocumentOwner != null)
|
||||
DocumentOwner.Close(this);
|
||||
}
|
||||
|
||||
protected IMessageBoxService MessageBoxService { get { return this.GetRequiredService<IMessageBoxService>(); } }
|
||||
|
||||
protected virtual IDocumentManagerService GetDocumentManagerService() { return this.GetService<IDocumentManagerService>(); }
|
||||
|
||||
protected virtual void OnBeforeEntityDeleted(TPrimaryKey primaryKey, TEntity entity) { }
|
||||
|
||||
protected virtual void OnEntityDeleted(TPrimaryKey primaryKey, TEntity entity) {
|
||||
Messenger.Default.Send(new EntityMessage<TEntity, TPrimaryKey>(primaryKey, EntityMessageType.Deleted));
|
||||
}
|
||||
|
||||
protected override Func<TProjection> GetSelectedEntityCallback() {
|
||||
var entity = SelectedEntity;
|
||||
return () => FindLocalProjectionWithSameKey(entity);
|
||||
}
|
||||
|
||||
TProjection FindLocalProjectionWithSameKey(TProjection projectionEntity) {
|
||||
bool primaryKeyAvailable = projectionEntity != null && Repository.ProjectionHasPrimaryKey(projectionEntity);
|
||||
return primaryKeyAvailable ? ChangeTrackerWithKey.FindLocalProjectionByKey(Repository.GetProjectionPrimaryKey(projectionEntity)) : null;
|
||||
}
|
||||
|
||||
protected virtual void OnBeforeEntitySaved(TPrimaryKey primaryKey, TEntity entity) { }
|
||||
|
||||
protected virtual void OnEntitySaved(TPrimaryKey primaryKey, TEntity entity) {
|
||||
Messenger.Default.Send(new EntityMessage<TEntity, TPrimaryKey>(primaryKey, EntityMessageType.Changed));
|
||||
}
|
||||
|
||||
protected virtual void ApplyProjectionPropertiesToEntity(TProjection projectionEntity, TEntity entity) {
|
||||
throw new NotImplementedException("Override this method in the collection view model class and apply projection properties to the entity so that it can be correctly saved by unit of work.");
|
||||
}
|
||||
|
||||
protected override void OnSelectedEntityChanged() {
|
||||
base.OnSelectedEntityChanged();
|
||||
UpdateCommands();
|
||||
}
|
||||
|
||||
protected override void RestoreSelectedEntity(TProjection existingProjectionEntity, TProjection newProjectionEntity) {
|
||||
base.RestoreSelectedEntity(existingProjectionEntity, newProjectionEntity);
|
||||
if(ReferenceEquals(SelectedEntity, existingProjectionEntity))
|
||||
SelectedEntity = newProjectionEntity;
|
||||
}
|
||||
|
||||
protected override void OnIsLoadingChanged() {
|
||||
base.OnIsLoadingChanged();
|
||||
UpdateCommands();
|
||||
if(!IsLoading)
|
||||
RequestSelectedEntity();
|
||||
}
|
||||
|
||||
void UpdateCommands() {
|
||||
TProjection projectionEntity = null;
|
||||
this.RaiseCanExecuteChanged(x => x.Edit(projectionEntity));
|
||||
this.RaiseCanExecuteChanged(x => x.Delete(projectionEntity));
|
||||
this.RaiseCanExecuteChanged(x => x.Save(projectionEntity));
|
||||
}
|
||||
|
||||
protected void DestroyDocument(IDocument document) {
|
||||
if(document != null)
|
||||
document.Close();
|
||||
}
|
||||
|
||||
protected IRepository<TEntity, TPrimaryKey> CreateRepository() {
|
||||
return (IRepository<TEntity, TPrimaryKey>)CreateReadOnlyRepository();
|
||||
}
|
||||
|
||||
protected override IEntitiesChangeTracker CreateEntitiesChangeTracker() {
|
||||
return new EntitiesChangeTracker<TPrimaryKey>(this);
|
||||
}
|
||||
|
||||
void VerifyProjectionType() {
|
||||
//string primaryKeyPropertyName = CreateRepository().GetPrimaryKeyExpression.Name;
|
||||
//if (TypeDescriptor.GetProperties(typeof(TProjection))[primaryKeyPropertyName] == null)
|
||||
// throw new ArgumentException(string.Format("Projection type {0} should have primary key property {1}", typeof(TProjection).Name, primaryKeyPropertyName), "TProjection");
|
||||
}
|
||||
|
||||
#region SelectEntityMessage
|
||||
protected class SelectEntityMessage {
|
||||
public SelectEntityMessage(TPrimaryKey primaryKey) {
|
||||
PrimaryKey = primaryKey;
|
||||
}
|
||||
public TPrimaryKey PrimaryKey { get; private set; }
|
||||
}
|
||||
|
||||
protected class SelectedEntityRequest { }
|
||||
|
||||
readonly bool ignoreSelectEntityMessage;
|
||||
|
||||
void RegisterSelectEntityMessage() {
|
||||
if(!ignoreSelectEntityMessage)
|
||||
Messenger.Default.Register<SelectEntityMessage>(this, x => OnSelectEntityMessage(x));
|
||||
}
|
||||
|
||||
void RequestSelectedEntity() {
|
||||
if(!ignoreSelectEntityMessage)
|
||||
Messenger.Default.Send(new SelectedEntityRequest());
|
||||
}
|
||||
|
||||
void OnSelectEntityMessage(SelectEntityMessage message) {
|
||||
if(!IsLoaded)
|
||||
return;
|
||||
var projectionEntity = ChangeTrackerWithKey.FindActualProjectionByKey(message.PrimaryKey);
|
||||
if(projectionEntity == null) {
|
||||
FilterExpression = null;
|
||||
projectionEntity = ChangeTrackerWithKey.FindActualProjectionByKey(message.PrimaryKey);
|
||||
}
|
||||
SelectedEntity = projectionEntity;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides the extension methods that are used to implement the IDocumentManagerService interface.
|
||||
/// </summary>
|
||||
public static class DocumentManagerServiceExtensions {
|
||||
|
||||
/// <summary>
|
||||
/// Creates and shows a document containing a single object view model for the existing entity.
|
||||
/// </summary>
|
||||
/// <param name="documentManagerService">An instance of the IDocumentManager interface used to create and show the document.</param>
|
||||
/// <param name="parentViewModel">An object that is passed to the view model of the created view.</param>
|
||||
/// <param name="primaryKey">An entity primary key.</param>
|
||||
public static void ShowExistingEntityDocument<TEntity, TPrimaryKey>(this IDocumentManagerService documentManagerService, object parentViewModel, TPrimaryKey primaryKey) {
|
||||
IDocument document = FindEntityDocument<TEntity, TPrimaryKey>(documentManagerService, primaryKey) ?? CreateDocument<TEntity>(documentManagerService, primaryKey, parentViewModel);
|
||||
if(document != null)
|
||||
document.Show();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and shows a document containing a single object view model for new entity.
|
||||
/// </summary>
|
||||
/// <param name="documentManagerService">An instance of the IDocumentManager interface used to create and show the document.</param>
|
||||
/// <param name="parentViewModel">An object that is passed to the view model of the created view.</param>
|
||||
/// <param name="newEntityInitializer">An optional parameter that provides a function that initializes a new entity.</param>
|
||||
public static void ShowNewEntityDocument<TEntity>(this IDocumentManagerService documentManagerService, object parentViewModel, Action<TEntity> newEntityInitializer = null) {
|
||||
IDocument document = CreateDocument<TEntity>(documentManagerService, newEntityInitializer != null ? newEntityInitializer : x => DefaultEntityInitializer(x), parentViewModel);
|
||||
if(document != null)
|
||||
document.Show();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Searches for a document that contains a single object view model editing entity with a specified primary key.
|
||||
/// </summary>
|
||||
/// <param name="documentManagerService">An instance of the IDocumentManager interface used to find a document.</param>
|
||||
/// <param name="primaryKey">An entity primary key.</param>
|
||||
public static IDocument FindEntityDocument<TEntity, TPrimaryKey>(this IDocumentManagerService documentManagerService, TPrimaryKey primaryKey) {
|
||||
if(documentManagerService == null)
|
||||
return null;
|
||||
foreach(IDocument document in documentManagerService.Documents) {
|
||||
ISingleObjectViewModel<TEntity, TPrimaryKey> entityViewModel = document.Content as ISingleObjectViewModel<TEntity, TPrimaryKey>;
|
||||
if(entityViewModel != null && object.Equals(entityViewModel.PrimaryKey, primaryKey))
|
||||
return document;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static void DefaultEntityInitializer<TEntity>(TEntity entity) { }
|
||||
|
||||
static IDocument CreateDocument<TEntity>(IDocumentManagerService documentManagerService, object parameter, object parentViewModel) {
|
||||
if(documentManagerService == null)
|
||||
return null;
|
||||
return documentManagerService.CreateDocument(typeof(TEntity).Name + "View", parameter, parentViewModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
partial class CollectionViewModel<TEntity, TPrimaryKey, TUnitOfWork> : ISupportParameter, IDocumentContent
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
protected override void OnInitializeInRuntime() {
|
||||
base.OnInitializeInRuntime();
|
||||
Messenger.Default.Register<SelectedItemSynchronizationMessage<TEntity>>(this, x => OnSelectedItemSynchronizationMessage(x));
|
||||
Messenger.Default.Register<EntityMessage<TEntity, TPrimaryKey>>(this, x => OnEntityMessage(x));
|
||||
}
|
||||
void OnEntityMessage(EntityMessage<TEntity, TPrimaryKey> m) {
|
||||
if(m.MessageType == EntityMessageType.Changed) {
|
||||
TEntity entity = ((EntitiesChangeTracker<TPrimaryKey>)ChangeTracker).FindLocalProjectionByKey(m.PrimaryKey);
|
||||
if(entity != null)
|
||||
OnEntityChanged(entity);
|
||||
RaiseEntityChanged(m.PrimaryKey);
|
||||
}
|
||||
else RaiseEntitiesCountChanged(Entities.Count);
|
||||
}
|
||||
protected virtual void OnEntityChanged(TEntity entity) { }
|
||||
protected override void OnIsLoadingChanged() {
|
||||
base.OnIsLoadingChanged();
|
||||
if(!IsLoading)
|
||||
RaiseEntitiesCountChanged(Entities.Count);
|
||||
}
|
||||
public event EventHandler<EntitiesCountEventArgs> EntitiesCountChanged;
|
||||
public event EventHandler<EntityEventArgs<TPrimaryKey>> EntityChanged;
|
||||
void RaiseEntityChanged(TPrimaryKey key) {
|
||||
EventHandler<EntityEventArgs<TPrimaryKey>> handler = EntityChanged;
|
||||
if(handler != null)
|
||||
handler(this, new EntityEventArgs<TPrimaryKey>(key));
|
||||
}
|
||||
void RaiseEntitiesCountChanged(int count) {
|
||||
EventHandler<EntitiesCountEventArgs> handler = EntitiesCountChanged;
|
||||
if(handler != null)
|
||||
handler(this, new EntitiesCountEventArgs(count));
|
||||
}
|
||||
[Command, Display(AutoGenerateField = false)]
|
||||
public virtual void OnLoaded() {
|
||||
//SelectedEntity = Parameter == null ? Entities.FirstOrDefault() : FindEntity((TPrimaryKey)Parameter); // TODO
|
||||
}
|
||||
public event EventHandler SelectedEntityChanged; // move to descendand
|
||||
protected override void OnSelectedEntityChanged() {
|
||||
//Parameter = SelectedEntity == null ? (object)null : CreateRepository().GetPrimaryKey(SelectedEntity);
|
||||
base.OnSelectedEntityChanged();
|
||||
Messenger.Default.Send(new SelectedItemSynchronizationMessage<TEntity>(SelectedEntity));
|
||||
if(SelectedEntityChanged != null)
|
||||
SelectedEntityChanged(this, EventArgs.Empty);
|
||||
}
|
||||
void OnSelectedItemSynchronizationMessage(SelectedItemSynchronizationMessage<TEntity> message) {
|
||||
//SelectedEntity = message.Entity == null ? null : FindEntity(GetPrimaryKey(message.Entity)); TODO
|
||||
}
|
||||
public event EventHandler ParameterChanged;
|
||||
protected virtual object GetTitle() {
|
||||
return null;
|
||||
}
|
||||
#region ISupportParameter
|
||||
object parameterCore;
|
||||
protected object Parameter {
|
||||
get { return parameterCore; }
|
||||
private set {
|
||||
parameterCore = value;
|
||||
EventHandler handler = ParameterChanged;
|
||||
if(handler != null)
|
||||
handler(this, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
object ISupportParameter.Parameter {
|
||||
get { return Parameter; }
|
||||
set { Parameter = value; }
|
||||
}
|
||||
#endregion
|
||||
protected IDocumentManagerService DocumentManagerService { get { return GetDocumentManagerService(); } }
|
||||
protected IDocument FindDocument<TViewModel>() {
|
||||
if(DocumentManagerService == null) return null;
|
||||
return DocumentManagerService.Documents.FirstOrDefault(d => d.Content is TViewModel);
|
||||
}
|
||||
protected IDocument FindDocument<TViewModel>(TPrimaryKey key) {
|
||||
if(DocumentManagerService == null) return null;
|
||||
foreach(IDocument document in DocumentManagerService.Documents) {
|
||||
ISingleObjectViewModel<TEntity, TPrimaryKey> entityViewModel = document.Content as ISingleObjectViewModel<TEntity, TPrimaryKey>;
|
||||
if(entityViewModel != null && entityViewModel is TViewModel && object.Equals(entityViewModel.PrimaryKey, key))
|
||||
return document;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TPrimaryKey SelectedEntityKey {
|
||||
get { return (SelectedEntity != null) ? CreateRepository().GetPrimaryKey(SelectedEntity) : default(TPrimaryKey); }
|
||||
}
|
||||
public virtual IQueryable<TEntity> GetEntities(Expression<Func<TEntity, bool>> filter = null) {
|
||||
try {
|
||||
return getRepositoryFunc(CreateUnitOfWork()).GetFilteredEntities(filter);
|
||||
}
|
||||
catch(Exception e) { throw new NotSupportedException("Error in Expression:" + filter.ToString(), e); }
|
||||
}
|
||||
public Data.Filtering.CriteriaOperator GetInOperator(IEnumerable<TEntity> entities) {
|
||||
string keyName = ((MemberExpression)CreateRepository().GetPrimaryKeyExpression.Body).Member.Name;
|
||||
return new Data.Filtering.InOperator(keyName, entities.Select(e => CreateRepository().GetPrimaryKey(e)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
namespace DevExpress.DevAV {
|
||||
using System.ComponentModel;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
|
||||
public abstract class DocumentContentViewModelBase : IDocumentContent {
|
||||
protected DocumentContentViewModelBase() { }
|
||||
[Command]
|
||||
public void Close() {
|
||||
((IDocumentContent)this).DocumentOwner.Close(this);
|
||||
}
|
||||
#region IDocumentContent
|
||||
void IDocumentContent.OnClose(CancelEventArgs e) { }
|
||||
void IDocumentContent.OnDestroy() { }
|
||||
IDocumentOwner IDocumentContent.DocumentOwner { get; set; }
|
||||
object IDocumentContent.Title {
|
||||
get { return GetTitle(); }
|
||||
}
|
||||
protected virtual string GetTitle() {
|
||||
return null;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,309 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a collection of entities of the given type.
|
||||
/// This is a partial class that provides an extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public abstract partial class EntitiesViewModel<TEntity, TProjection, TUnitOfWork> :
|
||||
EntitiesViewModelBase<TEntity, TProjection, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the EntitiesViewModel class.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
protected EntitiesViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection)
|
||||
: base(unitOfWorkFactory, getRepositoryFunc, projection) {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base class for a POCO view models exposing a collection of entities of the given type.
|
||||
/// It is not recommended to inherit directly from this class. Use the EntitiesViewModel class instead.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
[POCOViewModel]
|
||||
public abstract class EntitiesViewModelBase<TEntity, TProjection, TUnitOfWork> : IEntitiesViewModel<TProjection>
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
#region inner classes
|
||||
protected interface IEntitiesChangeTracker {
|
||||
void RegisterMessageHandler();
|
||||
void UnregisterMessageHandler();
|
||||
}
|
||||
|
||||
protected class EntitiesChangeTracker<TPrimaryKey> : IEntitiesChangeTracker {
|
||||
|
||||
readonly EntitiesViewModelBase<TEntity, TProjection, TUnitOfWork> owner;
|
||||
ObservableCollection<TProjection> Entities { get { return owner.Entities; } }
|
||||
IRepository<TEntity, TPrimaryKey> Repository { get { return (IRepository<TEntity, TPrimaryKey>)owner.ReadOnlyRepository; } }
|
||||
|
||||
public EntitiesChangeTracker(EntitiesViewModelBase<TEntity, TProjection, TUnitOfWork> owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
void IEntitiesChangeTracker.RegisterMessageHandler() {
|
||||
Messenger.Default.Register<EntityMessage<TEntity, TPrimaryKey>>(this, x => OnMessage(x));
|
||||
}
|
||||
|
||||
void IEntitiesChangeTracker.UnregisterMessageHandler() {
|
||||
Messenger.Default.Unregister(this);
|
||||
}
|
||||
|
||||
public TProjection FindLocalProjectionByKey(TPrimaryKey primaryKey) {
|
||||
var primaryKeyEqualsExpression = RepositoryExtensions.GetProjectionPrimaryKeyEqualsExpression<TEntity, TProjection, TPrimaryKey>(Repository, primaryKey);
|
||||
return Entities.AsQueryable().FirstOrDefault(primaryKeyEqualsExpression);
|
||||
}
|
||||
|
||||
public TProjection FindActualProjectionByKey(TPrimaryKey primaryKey) {
|
||||
var projectionEntity = Repository.FindActualProjectionByKey(owner.Projection, primaryKey);
|
||||
if(projectionEntity != null && ExpressionHelper.IsFitEntity(Repository.Find(primaryKey), owner.GetFilterExpression())) {
|
||||
owner.OnEntitiesLoaded(GetUnitOfWork(Repository), new TProjection[] { projectionEntity });
|
||||
return projectionEntity;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void OnMessage(EntityMessage<TEntity, TPrimaryKey> message) {
|
||||
if(!owner.IsLoaded)
|
||||
return;
|
||||
switch(message.MessageType) {
|
||||
case EntityMessageType.Added:
|
||||
OnEntityAdded(message.PrimaryKey);
|
||||
break;
|
||||
case EntityMessageType.Changed:
|
||||
OnEntityChanged(message.PrimaryKey);
|
||||
break;
|
||||
case EntityMessageType.Deleted:
|
||||
OnEntityDeleted(message.PrimaryKey);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnEntityAdded(TPrimaryKey primaryKey) {
|
||||
var projectionEntity = FindActualProjectionByKey(primaryKey);
|
||||
if(projectionEntity != null)
|
||||
Entities.Add(projectionEntity);
|
||||
}
|
||||
|
||||
void OnEntityChanged(TPrimaryKey primaryKey) {
|
||||
var existingProjectionEntity = FindLocalProjectionByKey(primaryKey);
|
||||
var projectionEntity = FindActualProjectionByKey(primaryKey);
|
||||
if(projectionEntity == null) {
|
||||
Entities.Remove(existingProjectionEntity);
|
||||
return;
|
||||
}
|
||||
if(existingProjectionEntity != null) {
|
||||
Entities[Entities.IndexOf(existingProjectionEntity)] = projectionEntity;
|
||||
owner.RestoreSelectedEntity(existingProjectionEntity, projectionEntity);
|
||||
return;
|
||||
}
|
||||
OnEntityAdded(primaryKey);
|
||||
}
|
||||
|
||||
void OnEntityDeleted(TPrimaryKey primaryKey) {
|
||||
Entities.Remove(FindLocalProjectionByKey(primaryKey));
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
ObservableCollection<TProjection> entities = new ObservableCollection<TProjection>();
|
||||
CancellationTokenSource loadCancellationTokenSource;
|
||||
protected readonly IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory;
|
||||
protected readonly Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc;
|
||||
protected Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> Projection { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the EntitiesViewModelBase class.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
protected EntitiesViewModelBase(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection
|
||||
) {
|
||||
this.unitOfWorkFactory = unitOfWorkFactory;
|
||||
this.getRepositoryFunc = getRepositoryFunc;
|
||||
this.Projection = projection;
|
||||
this.ChangeTracker = CreateEntitiesChangeTracker();
|
||||
if(!this.IsInDesignMode())
|
||||
OnInitializeInRuntime();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to check whether entities are currently being loaded in the background. The property can be used to show the progress indicator.
|
||||
/// </summary>
|
||||
public virtual bool IsLoading { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// The collection of entities loaded from the unit of work.
|
||||
/// </summary>
|
||||
public ObservableCollection<TProjection> Entities {
|
||||
get {
|
||||
if(!IsLoaded)
|
||||
LoadEntities(false);
|
||||
return entities;
|
||||
}
|
||||
}
|
||||
|
||||
protected IEntitiesChangeTracker ChangeTracker { get; private set; }
|
||||
|
||||
protected IReadOnlyRepository<TEntity> ReadOnlyRepository { get; private set; }
|
||||
|
||||
protected bool IsLoaded { get { return ReadOnlyRepository != null; } }
|
||||
|
||||
protected void LoadEntities(bool forceLoad) {
|
||||
if(forceLoad) {
|
||||
if(loadCancellationTokenSource != null)
|
||||
loadCancellationTokenSource.Cancel();
|
||||
} else if(IsLoading) {
|
||||
return;
|
||||
}
|
||||
loadCancellationTokenSource = LoadCore();
|
||||
}
|
||||
|
||||
void CancelLoading() {
|
||||
if(loadCancellationTokenSource != null)
|
||||
loadCancellationTokenSource.Cancel();
|
||||
IsLoading = false;
|
||||
}
|
||||
|
||||
CancellationTokenSource LoadCore() {
|
||||
IsLoading = true;
|
||||
var cancellationTokenSource = new CancellationTokenSource();
|
||||
var selectedEntityCallback = GetSelectedEntityCallback();
|
||||
Task.Factory.StartNew(() => {
|
||||
var repository = CreateReadOnlyRepository();
|
||||
var entities = new ObservableCollection<TProjection>(repository.GetFilteredEntities(GetFilterExpression(), Projection));
|
||||
OnEntitiesLoaded(GetUnitOfWork(repository), entities);
|
||||
return new Tuple<IReadOnlyRepository<TEntity>, ObservableCollection<TProjection>>(repository, entities);
|
||||
}).ContinueWith(x => {
|
||||
if(!x.IsFaulted) {
|
||||
ReadOnlyRepository = x.Result.Item1;
|
||||
entities = x.Result.Item2;
|
||||
this.RaisePropertyChanged(y => y.Entities);
|
||||
OnEntitiesAssigned(selectedEntityCallback);
|
||||
}
|
||||
IsLoading = false;
|
||||
}, cancellationTokenSource.Token, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
|
||||
return cancellationTokenSource;
|
||||
}
|
||||
|
||||
static TUnitOfWork GetUnitOfWork(IReadOnlyRepository<TEntity> repository) {
|
||||
return (TUnitOfWork)repository.UnitOfWork;
|
||||
}
|
||||
|
||||
protected virtual void OnEntitiesLoaded(TUnitOfWork unitOfWork, IEnumerable<TProjection> entities) {
|
||||
}
|
||||
|
||||
protected virtual void OnEntitiesAssigned(Func<TProjection> getSelectedEntityCallback) {
|
||||
}
|
||||
|
||||
protected virtual Func<TProjection> GetSelectedEntityCallback() {
|
||||
return null;
|
||||
}
|
||||
|
||||
protected virtual void RestoreSelectedEntity(TProjection existingProjectionEntity, TProjection projectionEntity) {
|
||||
}
|
||||
|
||||
protected virtual Expression<Func<TEntity, bool>> GetFilterExpression() {
|
||||
return null;
|
||||
}
|
||||
|
||||
protected virtual void OnInitializeInRuntime() {
|
||||
if(ChangeTracker != null)
|
||||
ChangeTracker.RegisterMessageHandler();
|
||||
}
|
||||
|
||||
protected virtual void OnDestroy() {
|
||||
CancelLoading();
|
||||
if(ChangeTracker != null)
|
||||
ChangeTracker.UnregisterMessageHandler();
|
||||
}
|
||||
|
||||
protected virtual void OnIsLoadingChanged() {
|
||||
}
|
||||
|
||||
protected IReadOnlyRepository<TEntity> CreateReadOnlyRepository() {
|
||||
return getRepositoryFunc(CreateUnitOfWork());
|
||||
}
|
||||
|
||||
protected TUnitOfWork CreateUnitOfWork() {
|
||||
return unitOfWorkFactory.CreateUnitOfWork();
|
||||
}
|
||||
|
||||
protected virtual IEntitiesChangeTracker CreateEntitiesChangeTracker() {
|
||||
return null;
|
||||
}
|
||||
|
||||
protected IDocumentOwner DocumentOwner { get; private set; }
|
||||
|
||||
#region IDocumentContent
|
||||
object IDocumentContent.Title { get { return null; } }
|
||||
|
||||
void IDocumentContent.OnClose(CancelEventArgs e) { }
|
||||
|
||||
void IDocumentContent.OnDestroy() {
|
||||
OnDestroy();
|
||||
}
|
||||
|
||||
IDocumentOwner IDocumentContent.DocumentOwner {
|
||||
get { return DocumentOwner; }
|
||||
set { DocumentOwner = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IEntitiesViewModel
|
||||
ObservableCollection<TProjection> IEntitiesViewModel<TProjection>.Entities { get { return Entities; } }
|
||||
|
||||
bool IEntitiesViewModel<TProjection>.IsLoading { get { return IsLoading; } }
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base interface for view models exposing a collection of entities of the given type.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
public interface IEntitiesViewModel<TEntity> : IDocumentContent where TEntity : class {
|
||||
|
||||
/// <summary>
|
||||
/// The loaded collection of entities.
|
||||
/// </summary>
|
||||
ObservableCollection<TEntity> Entities { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Used to check whether entities are currently being loaded in the background. The property can be used to show the progress indicator.
|
||||
/// </summary>
|
||||
bool IsLoading { get; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// The base interface for view models representing a single entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">An entity primary key type.</typeparam>
|
||||
public interface ISingleObjectViewModel<TEntity, TPrimaryKey> {
|
||||
|
||||
/// <summary>
|
||||
/// The entity represented by a view model.
|
||||
/// </summary>
|
||||
TEntity Entity { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The entity primary key value.
|
||||
/// </summary>
|
||||
TPrimaryKey PrimaryKey { get; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.ComponentModel;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using System.Collections.ObjectModel;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// Represents a POCO view models used by SingleObjectViewModel to exposing collections of related entities.
|
||||
/// This is a partial class that provides an extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public class LookUpEntitiesViewModel<TEntity, TProjection, TPrimaryKey, TUnitOfWork> : EntitiesViewModel<TEntity, TProjection, TUnitOfWork>, IDocumentContent
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of LookUpEntitiesViewModel as a POCO view model.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
public static LookUpEntitiesViewModel<TEntity, TProjection, TPrimaryKey, TUnitOfWork> Create(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection = null) {
|
||||
return ViewModelSource.Create(() => new LookUpEntitiesViewModel<TEntity, TProjection, TPrimaryKey, TUnitOfWork>(unitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the LookUpEntitiesViewModel class.
|
||||
/// This constructor is declared protected to avoid an undesired instantiation of the LookUpEntitiesViewModel type without the POCO proxy factory.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
protected LookUpEntitiesViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection
|
||||
) : base(unitOfWorkFactory, getRepositoryFunc, projection) {
|
||||
}
|
||||
|
||||
protected override IEntitiesChangeTracker CreateEntitiesChangeTracker() {
|
||||
return new EntitiesChangeTracker<TPrimaryKey>(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// Represents the type of an entity state change notification that is shown when the IUnitOfWork.SaveChanges method has been called.
|
||||
/// </summary>
|
||||
public enum EntityMessageType {
|
||||
|
||||
/// <summary>
|
||||
/// A new entity has been added to the unit of work.
|
||||
/// </summary>
|
||||
Added,
|
||||
|
||||
/// <summary>
|
||||
/// An entity has been removed from the unit of work.
|
||||
/// </summary>
|
||||
Deleted,
|
||||
|
||||
/// <summary>
|
||||
/// One of the entity properties has been modified.
|
||||
/// </summary>
|
||||
Changed
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides the information about an entity state change notification that is shown when an entity has been added, removed or modified, and the IUnitOfWork.SaveChanges method has been called.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
public class EntityMessage<TEntity, TPrimaryKey> {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the EntityMessage class.
|
||||
/// </summary>
|
||||
/// <param name="primaryKey">A primary key of an entity that has been added, removed or modified.</param>
|
||||
/// <param name="messageType">An entity state change notification type.</param>
|
||||
public EntityMessage(TPrimaryKey primaryKey, EntityMessageType messageType) {
|
||||
this.PrimaryKey = primaryKey;
|
||||
this.MessageType = messageType;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The primary key of entity that has been added, deleted or modified.
|
||||
/// </summary>
|
||||
public TPrimaryKey PrimaryKey { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The entity state change notification type.
|
||||
/// </summary>
|
||||
public EntityMessageType MessageType { get; private set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A message notifying that all view models should save changes. Usually sent by DocumentsViewModel when the SaveAll command is executed.
|
||||
/// </summary>
|
||||
public class SaveAllMessage {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A message notifying that all view models should close itself. Usually sent by DocumentsViewModel when the CloseAll command is executed.
|
||||
/// </summary>
|
||||
public class CloseAllMessage {
|
||||
|
||||
readonly CancelEventArgs cancelEventArgs;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CloseAllMessage class.
|
||||
/// </summary>
|
||||
/// <param name="cancelEventArgs">An argument of the System.ComponentModel.CancelEventArgs type which can be used to cancel closing.</param>
|
||||
public CloseAllMessage(CancelEventArgs cancelEventArgs) {
|
||||
this.cancelEventArgs = cancelEventArgs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to cancel closing and check whether the closing has already been cancelled.
|
||||
/// </summary>
|
||||
public bool Cancel {
|
||||
get { return cancelEventArgs.Cancel; }
|
||||
set { cancelEventArgs.Cancel = value; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used by the PeekCollectionViewModel to notify that DocumentsViewModel should navigate to the specified module.
|
||||
/// </summary>
|
||||
/// <typeparam name="TNavigationToken">The navigation token type.</typeparam>
|
||||
public class NavigateMessage<TNavigationToken> {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the NavigateMessage class.
|
||||
/// </summary>
|
||||
/// <param name="token">An object that is used to identify the module to which the DocumentsViewModel should navigate.</param>
|
||||
public NavigateMessage(TNavigationToken token) {
|
||||
Token = token;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An object that is used to identify the module to which the DocumentsViewModel should navigate.
|
||||
/// </summary>
|
||||
public TNavigationToken Token { get; private set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using System;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
public class SelectedItemSynchronizationMessage<TEntity> where TEntity : class {
|
||||
public SelectedItemSynchronizationMessage(TEntity entity) {
|
||||
Entity = entity;
|
||||
}
|
||||
public TEntity Entity { get; private set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// A POCO view model exposing a read-only collection of entities of a given type. It is designed for quick navigation between collection views.
|
||||
/// This is a partial class that provides an extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TNavigationToken">A navigation token type.</typeparam>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public partial class PeekCollectionViewModel<TNavigationToken, TEntity, TPrimaryKey, TUnitOfWork> : CollectionViewModelBase<TEntity, TEntity, TPrimaryKey, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of PeekCollectionViewModel as a POCO view model.
|
||||
/// </summary>
|
||||
/// <param name="navigationToken">Identifies the module that is the navigation target.</param>
|
||||
/// <param name="unitOfWorkFactory">A factory that is used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of a given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data.</param>
|
||||
public static PeekCollectionViewModel<TNavigationToken, TEntity, TPrimaryKey, TUnitOfWork> Create(
|
||||
TNavigationToken navigationToken,
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TEntity>> projection = null) {
|
||||
return ViewModelSource.Create(() => new PeekCollectionViewModel<TNavigationToken, TEntity, TPrimaryKey, TUnitOfWork>(navigationToken, unitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
TNavigationToken navigationToken;
|
||||
TEntity pickedEntity;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the PeekCollectionViewModel class.
|
||||
/// This constructor is declared protected to avoid an undesired instantiation of the PeekCollectionViewModel type without the POCO proxy factory.
|
||||
/// </summary>
|
||||
/// <param name="navigationToken">Identifies the module that is the navigation target.</param>
|
||||
/// <param name="unitOfWorkFactory">A factory that is used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of a given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data.</param>
|
||||
protected PeekCollectionViewModel(
|
||||
TNavigationToken navigationToken,
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TEntity>> projection = null
|
||||
) : base(unitOfWorkFactory, getRepositoryFunc, projection, null, true) {
|
||||
this.navigationToken = navigationToken;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Navigates to the corresponding collection view and selects the given entity.
|
||||
/// Since PeekCollectionViewModel is a POCO view model, an instance of this class will also expose the NavigateCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to select within the collection view.</param>
|
||||
[Display(AutoGenerateField = false)]
|
||||
public void Navigate(TEntity projectionEntity) {
|
||||
pickedEntity = projectionEntity;
|
||||
SendSelectEntityMessage();
|
||||
Messenger.Default.Send(new NavigateMessage<TNavigationToken>(navigationToken), navigationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines if a navigation to corresponding collection view can be performed.
|
||||
/// Since PeekCollectionViewModel is a POCO view model, this method will be used as a CanExecute callback for NavigateCommand.
|
||||
/// </summary>
|
||||
/// <param name="projectionEntity">An entity to select in the collection view.</param>
|
||||
public bool CanNavigate(TEntity projectionEntity) {
|
||||
return projectionEntity != null;
|
||||
}
|
||||
|
||||
protected override void OnInitializeInRuntime() {
|
||||
base.OnInitializeInRuntime();
|
||||
Messenger.Default.Register<SelectedEntityRequest>(this, x => SendSelectEntityMessage());
|
||||
}
|
||||
|
||||
void SendSelectEntityMessage() {
|
||||
if(IsLoaded && pickedEntity != null)
|
||||
Messenger.Default.Send(new SelectEntityMessage(CreateRepository().GetProjectionPrimaryKey(pickedEntity)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a read-only collection of entities of a given type.
|
||||
/// This is a partial class that provides the extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public partial class ReadOnlyCollectionViewModel<TEntity, TUnitOfWork> : ReadOnlyCollectionViewModel<TEntity, TEntity, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of ReadOnlyCollectionViewModel as a POCO view model.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data.</param>
|
||||
public static ReadOnlyCollectionViewModel<TEntity, TUnitOfWork> CreateReadOnlyCollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TEntity>> projection = null) {
|
||||
return ViewModelSource.Create(() => new ReadOnlyCollectionViewModel<TEntity, TUnitOfWork>(unitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the ReadOnlyCollectionViewModel class.
|
||||
/// This constructor is declared protected to avoid an undesired instantiation of the PeekCollectionViewModel type without the POCO proxy factory.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns a repository representing entities of the given type.</param>
|
||||
/// <param name="projection">An optional parameter that provides a LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data.</param>
|
||||
protected ReadOnlyCollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TEntity>> projection = null)
|
||||
: base(unitOfWorkFactory, getRepositoryFunc, projection) {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a read-only collection of entities of a given type.
|
||||
/// This is a partial class that provides the extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public partial class ReadOnlyCollectionViewModel<TEntity, TProjection, TUnitOfWork> : ReadOnlyCollectionViewModelBase<TEntity, TProjection, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of ReadOnlyCollectionViewModel as a POCO view model.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns the repository representing entities of a given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
public static ReadOnlyCollectionViewModel<TEntity, TProjection, TUnitOfWork> CreateReadOnlyProjectionCollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection) {
|
||||
return ViewModelSource.Create(() => new ReadOnlyCollectionViewModel<TEntity, TProjection, TUnitOfWork>(unitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the ReadOnlyCollectionViewModel class.
|
||||
/// This constructor is declared protected to avoid an undesired instantiation of the PeekCollectionViewModel type without the POCO proxy factory.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns the repository representing entities of a given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
protected ReadOnlyCollectionViewModel(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection)
|
||||
: base(unitOfWorkFactory, getRepositoryFunc, projection) {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a read-only collection of entities of a given type.
|
||||
/// It is not recommended to inherit directly from this class. Use the ReadOnlyCollectionViewModel class instead.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">A repository entity type.</typeparam>
|
||||
/// <typeparam name="TProjection">A projection entity type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
[POCOViewModel]
|
||||
public abstract class ReadOnlyCollectionViewModelBase<TEntity, TProjection, TUnitOfWork> : EntitiesViewModel<TEntity, TProjection, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TProjection : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the ReadOnlyCollectionViewModelBase class.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create a unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns the repository representing entities of a given type.</param>
|
||||
/// <param name="projection">A LINQ function used to customize a query for entities. The parameter, for example, can be used for sorting data and/or for projecting data to a custom type that does not match the repository entity type.</param>
|
||||
protected ReadOnlyCollectionViewModelBase(
|
||||
IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TEntity>> getRepositoryFunc,
|
||||
Func<IRepositoryQuery<TEntity>, IQueryable<TProjection>> projection
|
||||
) : base(unitOfWorkFactory, getRepositoryFunc, projection) {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The selected enity.
|
||||
/// Since ReadOnlyCollectionViewModelBase is a POCO view model, this property will raise INotifyPropertyChanged.PropertyEvent when modified so it can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public virtual TProjection SelectedEntity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The lambda expression used to filter which entities will be loaded locally from the unit of work.
|
||||
/// Since ReadOnlyCollectionViewModelBase is a POCO view model, this property will raise INotifyPropertyChanged.PropertyEvent when modified so it can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public virtual Expression<Func<TEntity, bool>> FilterExpression { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reloads entities.
|
||||
/// Since CollectionViewModelBase is a POCO view model, an instance of this class will also expose the RefreshCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public virtual void Refresh() {
|
||||
LoadEntities(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether entities can be reloaded.
|
||||
/// Since CollectionViewModelBase is a POCO view model, this method will be used as a CanExecute callback for RefreshCommand.
|
||||
/// </summary>
|
||||
public bool CanRefresh() {
|
||||
return !IsLoading;
|
||||
}
|
||||
|
||||
protected override void OnEntitiesAssigned(Func<TProjection> getSelectedEntityCallback) {
|
||||
base.OnEntitiesAssigned(getSelectedEntityCallback);
|
||||
SelectedEntity = getSelectedEntityCallback() ?? Entities.FirstOrDefault();
|
||||
}
|
||||
|
||||
protected override Func<TProjection> GetSelectedEntityCallback() {
|
||||
int selectedItemIndex = Entities.IndexOf(SelectedEntity);
|
||||
return () => (selectedItemIndex >= 0 && selectedItemIndex < Entities.Count) ? Entities[selectedItemIndex] : null;
|
||||
}
|
||||
|
||||
protected override void OnIsLoadingChanged() {
|
||||
base.OnIsLoadingChanged();
|
||||
this.RaiseCanExecuteChanged(x => x.Refresh());
|
||||
}
|
||||
|
||||
protected virtual void OnSelectedEntityChanged() { }
|
||||
|
||||
protected virtual void OnFilterExpressionChanged() {
|
||||
if(IsLoaded || IsLoading)
|
||||
LoadEntities(true);
|
||||
}
|
||||
|
||||
protected override Expression<Func<TEntity, bool>> GetFilterExpression() {
|
||||
return FilterExpression;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
public class SingleObjectChildViewModel<TEntity> : ISupportParameter where TEntity : class {
|
||||
public static SingleObjectChildViewModel<TEntity> Create() {
|
||||
return ViewModelSource.Create(() => new SingleObjectChildViewModel<TEntity>());
|
||||
}
|
||||
|
||||
protected SingleObjectChildViewModel() { }
|
||||
|
||||
public virtual TEntity Entity { get; set; }
|
||||
public virtual bool IsEnabled { get; protected set; }
|
||||
|
||||
protected virtual void OnEntityChanged() {
|
||||
IsEnabled = Entity != null;
|
||||
}
|
||||
#region ISupportParameter
|
||||
object ISupportParameter.Parameter {
|
||||
get { return Entity; }
|
||||
set { Entity = (TEntity)value; }
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,510 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a single entity of a given type and CRUD operations against this entity.
|
||||
/// This is a partial class that provides the extension point to add custom properties, commands and override methods without modifying the auto-generated code.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
public abstract partial class SingleObjectViewModel<TEntity, TPrimaryKey, TUnitOfWork> : SingleObjectViewModelBase<TEntity, TPrimaryKey, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SingleObjectViewModel class.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create the unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns the repository representing entities of a given type.</param>
|
||||
/// <param name="getEntityDisplayNameFunc">An optional parameter that provides a function to obtain the display text for a given entity. If ommited, the primary key value is used as a display text.</param>
|
||||
protected SingleObjectViewModel(IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory, Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc, Func<TEntity, object> getEntityDisplayNameFunc = null)
|
||||
: base(unitOfWorkFactory, getRepositoryFunc, getEntityDisplayNameFunc) {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The base class for POCO view models exposing a single entity of a given type and CRUD operations against this entity.
|
||||
/// It is not recommended to inherit directly from this class. Use the SingleObjectViewModel class instead.
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">An entity type.</typeparam>
|
||||
/// <typeparam name="TPrimaryKey">A primary key value type.</typeparam>
|
||||
/// <typeparam name="TUnitOfWork">A unit of work type.</typeparam>
|
||||
[POCOViewModel]
|
||||
public abstract class SingleObjectViewModelBase<TEntity, TPrimaryKey, TUnitOfWork> : ISingleObjectViewModel<TEntity, TPrimaryKey>, ISupportParameter, IDocumentContent
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
|
||||
object title;
|
||||
protected readonly Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc;
|
||||
protected readonly Func<TEntity, object> getEntityDisplayNameFunc;
|
||||
Action<TEntity> entityInitializer;
|
||||
bool isEntityNewAndUnmodified;
|
||||
readonly Dictionary<string, IDocumentContent> lookUpViewModels = new Dictionary<string, IDocumentContent>();
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SingleObjectViewModelBase class.
|
||||
/// </summary>
|
||||
/// <param name="unitOfWorkFactory">A factory used to create the unit of work instance.</param>
|
||||
/// <param name="getRepositoryFunc">A function that returns repository representing entities of a given type.</param>
|
||||
/// <param name="getEntityDisplayNameFunc">An optional parameter that provides a function to obtain the display text for a given entity. If ommited, the primary key value is used as a display text.</param>
|
||||
protected SingleObjectViewModelBase(IUnitOfWorkFactory<TUnitOfWork> unitOfWorkFactory, Func<TUnitOfWork, IRepository<TEntity, TPrimaryKey>> getRepositoryFunc, Func<TEntity, object> getEntityDisplayNameFunc) {
|
||||
UnitOfWorkFactory = unitOfWorkFactory;
|
||||
this.getRepositoryFunc = getRepositoryFunc;
|
||||
this.getEntityDisplayNameFunc = getEntityDisplayNameFunc;
|
||||
UpdateUnitOfWork();
|
||||
if(this.IsInDesignMode())
|
||||
this.Entity = this.Repository.FirstOrDefault();
|
||||
else
|
||||
OnInitializeInRuntime();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The display text for a given entity used as a title in the corresponding view.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public object Title { get { return title; } }
|
||||
|
||||
/// <summary>
|
||||
/// An entity represented by this view model.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, this property will raise INotifyPropertyChanged.PropertyEvent when modified so it can be used as a binding source in views.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public virtual TEntity Entity { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Updates the Title property value and raises CanExecute changed for relevant commands.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the UpdateCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
[Display(AutoGenerateField = false)]
|
||||
public void Update() {
|
||||
isEntityNewAndUnmodified = false;
|
||||
UpdateTitle();
|
||||
UpdateCommands();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves changes in the underlying unit of work.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the SaveCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public virtual void Save() {
|
||||
SaveCore();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether entity has local changes that can be saved.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, this method will be used as a CanExecute callback for SaveCommand.
|
||||
/// </summary>
|
||||
public virtual bool CanSave() {
|
||||
return Entity != null && !HasValidationErrors() && NeedSave();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves changes in the underlying unit of work and closes the corresponding view.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the SaveAndCloseCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
[Command(CanExecuteMethodName = "CanSave")]
|
||||
public void SaveAndClose() {
|
||||
if(SaveCore())
|
||||
Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves changes in the underlying unit of work and create new entity.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the SaveAndNewCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
[Command(CanExecuteMethodName = "CanSave")]
|
||||
public void SaveAndNew() {
|
||||
if(SaveCore())
|
||||
CreateAndInitializeEntity(this.entityInitializer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset entity local changes.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the ResetCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
[Display(Name = "Reset Changes")]
|
||||
public void Reset() {
|
||||
MessageResult confirmationResult = MessageBoxService.ShowMessage(CommonResources.Confirmation_Reset, CommonResources.Confirmation_Caption, MessageButton.OKCancel);
|
||||
if(confirmationResult == MessageResult.OK)
|
||||
Reload();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether entity has local changes.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, this method will be used as a CanExecute callback for ResetCommand.
|
||||
/// </summary>
|
||||
public bool CanReset() {
|
||||
return NeedReset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the entity, save changes and closes the corresponding view if confirmed by a user.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the DeleteCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public virtual void Delete() {
|
||||
if(MessageBoxService.ShowMessage(string.Format(CommonResources.Confirmation_Delete, typeof(TEntity).Name), GetConfirmationMessageTitle(), MessageButton.YesNo) != MessageResult.Yes)
|
||||
return;
|
||||
try {
|
||||
OnBeforeEntityDeleted(PrimaryKey, Entity);
|
||||
Repository.Remove(Entity);
|
||||
UnitOfWork.SaveChanges();
|
||||
TPrimaryKey primaryKeyForMessage = PrimaryKey;
|
||||
TEntity entityForMessage = Entity;
|
||||
Entity = null;
|
||||
OnEntityDeleted(primaryKeyForMessage, entityForMessage);
|
||||
Close();
|
||||
} catch (DbException e) {
|
||||
MessageBoxService.ShowMessage(e.ErrorMessage, e.ErrorCaption, MessageButton.OK, MessageIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the entity can be deleted.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, this method will be used as a CanExecute callback for DeleteCommand.
|
||||
/// </summary>
|
||||
public virtual bool CanDelete() {
|
||||
return Entity != null && !IsNew();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the corresponding view.
|
||||
/// Since SingleObjectViewModelBase is a POCO view model, an instance of this class will also expose the CloseCommand property that can be used as a binding source in views.
|
||||
/// </summary>
|
||||
public void Close() {
|
||||
if(!TryClose())
|
||||
return;
|
||||
if(DocumentOwner != null)
|
||||
DocumentOwner.Close(this);
|
||||
}
|
||||
|
||||
protected IUnitOfWorkFactory<TUnitOfWork> UnitOfWorkFactory { get; private set; }
|
||||
|
||||
protected TUnitOfWork UnitOfWork { get; private set; }
|
||||
|
||||
protected virtual bool SaveCore() {
|
||||
try {
|
||||
bool isNewEntity = IsNew();
|
||||
if(!isNewEntity) {
|
||||
Repository.SetPrimaryKey(Entity, PrimaryKey);
|
||||
Repository.Update(Entity);
|
||||
}
|
||||
OnBeforeEntitySaved(PrimaryKey, Entity, isNewEntity);
|
||||
UnitOfWork.SaveChanges();
|
||||
LoadEntityByKey(Repository.GetPrimaryKey(Entity));
|
||||
OnEntitySaved(PrimaryKey, Entity, isNewEntity);
|
||||
return true;
|
||||
} catch (DbException e) {
|
||||
MessageBoxService.ShowMessage(e.ErrorMessage, e.ErrorCaption, MessageButton.OK, MessageIcon.Error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void OnBeforeEntitySaved(TPrimaryKey primaryKey, TEntity entity, bool isNewEntity) { }
|
||||
|
||||
protected virtual void OnEntitySaved(TPrimaryKey primaryKey, TEntity entity, bool isNewEntity) {
|
||||
Messenger.Default.Send(new EntityMessage<TEntity, TPrimaryKey>(primaryKey, isNewEntity ? EntityMessageType.Added : EntityMessageType.Changed));
|
||||
}
|
||||
|
||||
protected virtual void OnBeforeEntityDeleted(TPrimaryKey primaryKey, TEntity entity) { }
|
||||
|
||||
protected virtual void OnEntityDeleted(TPrimaryKey primaryKey, TEntity entity) {
|
||||
Messenger.Default.Send(new EntityMessage<TEntity, TPrimaryKey>(primaryKey, EntityMessageType.Deleted));
|
||||
}
|
||||
|
||||
protected virtual void OnInitializeInRuntime() {
|
||||
Messenger.Default.Register<EntityMessage<TEntity, TPrimaryKey>>(this, x => OnEntityMessage(x));
|
||||
Messenger.Default.Register<SaveAllMessage>(this, x => Save());
|
||||
Messenger.Default.Register<CloseAllMessage>(this, x => OnClosing(x));
|
||||
}
|
||||
|
||||
protected virtual void OnEntityMessage(EntityMessage<TEntity, TPrimaryKey> message) {
|
||||
if(Entity == null) return;
|
||||
if(message.MessageType == EntityMessageType.Deleted && object.Equals(message.PrimaryKey, PrimaryKey))
|
||||
Close();
|
||||
}
|
||||
|
||||
protected virtual void OnEntityChanged() {
|
||||
if(Entity != null && Repository.HasPrimaryKey(Entity)) {
|
||||
PrimaryKey = Repository.GetPrimaryKey(Entity);
|
||||
RefreshLookUpCollections(true);
|
||||
}
|
||||
Update();
|
||||
}
|
||||
|
||||
protected IRepository<TEntity, TPrimaryKey> Repository { get { return getRepositoryFunc(UnitOfWork); } }
|
||||
|
||||
protected TPrimaryKey PrimaryKey { get; private set; }
|
||||
|
||||
protected IMessageBoxService MessageBoxService { get { return this.GetRequiredService<IMessageBoxService>(); } }
|
||||
|
||||
protected virtual void OnParameterChanged(object parameter) {
|
||||
var initializer = parameter as Action<TEntity>;
|
||||
if(initializer != null)
|
||||
CreateAndInitializeEntity(initializer);
|
||||
else if(parameter is TPrimaryKey)
|
||||
LoadEntityByKey((TPrimaryKey)parameter);
|
||||
else
|
||||
Entity = null;
|
||||
}
|
||||
|
||||
protected virtual TEntity CreateEntity() {
|
||||
return Repository.Create();
|
||||
}
|
||||
|
||||
protected void Reload() {
|
||||
if(Entity == null || IsNew())
|
||||
CreateAndInitializeEntity(this.entityInitializer);
|
||||
else
|
||||
LoadEntityByKey(PrimaryKey);
|
||||
}
|
||||
|
||||
protected void CreateAndInitializeEntity(Action<TEntity> entityInitializer) {
|
||||
UpdateUnitOfWork();
|
||||
this.entityInitializer = entityInitializer;
|
||||
var entity = CreateEntity();
|
||||
if(this.entityInitializer != null)
|
||||
this.entityInitializer(entity);
|
||||
Entity = entity;
|
||||
isEntityNewAndUnmodified = true;
|
||||
}
|
||||
|
||||
protected void LoadEntityByKey(TPrimaryKey primaryKey) {
|
||||
UpdateUnitOfWork();
|
||||
Entity = Repository.Find(primaryKey);
|
||||
}
|
||||
|
||||
void UpdateUnitOfWork() {
|
||||
UnitOfWork = UnitOfWorkFactory.CreateUnitOfWork();
|
||||
}
|
||||
|
||||
void UpdateTitle() {
|
||||
if(Entity == null)
|
||||
title = null;
|
||||
else if(IsNew())
|
||||
title = GetTitleForNewEntity();
|
||||
else
|
||||
title = GetTitle(GetState() == EntityState.Modified);
|
||||
this.RaisePropertyChanged(x => x.Title);
|
||||
}
|
||||
|
||||
protected virtual void UpdateCommands() {
|
||||
this.RaiseCanExecuteChanged(x => x.Save());
|
||||
this.RaiseCanExecuteChanged(x => x.SaveAndClose());
|
||||
this.RaiseCanExecuteChanged(x => x.SaveAndNew());
|
||||
this.RaiseCanExecuteChanged(x => x.Delete());
|
||||
this.RaiseCanExecuteChanged(x => x.Reset());
|
||||
}
|
||||
|
||||
protected IDocumentOwner DocumentOwner { get; private set; }
|
||||
|
||||
protected virtual void OnDestroy() {
|
||||
Messenger.Default.Unregister(this);
|
||||
RefreshLookUpCollections(false);
|
||||
}
|
||||
|
||||
protected virtual bool TryClose() {
|
||||
if(HasValidationErrors()) {
|
||||
MessageResult warningResult = MessageBoxService.ShowMessage(CommonResources.Warning_SomeFieldsContainInvalidData, CommonResources.Warning_Caption, MessageButton.OKCancel);
|
||||
return warningResult == MessageResult.OK;
|
||||
}
|
||||
if(!NeedReset()) return true;
|
||||
MessageResult result = MessageBoxService.ShowMessage(CommonResources.Confirmation_Save, GetConfirmationMessageTitle(), MessageButton.YesNoCancel);
|
||||
if(result == MessageResult.Yes)
|
||||
return SaveCore();
|
||||
return result != MessageResult.Cancel;
|
||||
}
|
||||
|
||||
protected virtual void OnClosing(CloseAllMessage message) {
|
||||
if(!message.Cancel)
|
||||
message.Cancel = !TryClose();
|
||||
}
|
||||
|
||||
protected virtual string GetConfirmationMessageTitle() {
|
||||
return GetTitle();
|
||||
}
|
||||
|
||||
protected bool IsNew() {
|
||||
return GetState() == EntityState.Added;
|
||||
}
|
||||
|
||||
protected virtual bool NeedSave() {
|
||||
if(Entity == null)
|
||||
return false;
|
||||
EntityState state = GetState();
|
||||
return state == EntityState.Modified || state == EntityState.Added;
|
||||
}
|
||||
|
||||
protected virtual bool NeedReset() {
|
||||
return NeedSave() && !isEntityNewAndUnmodified;
|
||||
}
|
||||
|
||||
protected virtual bool HasValidationErrors() {
|
||||
IDataErrorInfo dataErrorInfo = Entity as IDataErrorInfo;
|
||||
return dataErrorInfo != null && IDataErrorInfoHelper.HasErrors(dataErrorInfo);
|
||||
}
|
||||
|
||||
string GetTitle(bool entityModified) {
|
||||
return GetTitle() + (entityModified ? CommonResources.Entity_Changed : string.Empty);
|
||||
}
|
||||
|
||||
protected virtual string GetTitleForNewEntity() {
|
||||
return typeof(TEntity).Name + CommonResources.Entity_New;
|
||||
}
|
||||
|
||||
protected virtual string GetTitle() {
|
||||
return (typeof(TEntity).Name + " - " + Convert.ToString(getEntityDisplayNameFunc != null ? getEntityDisplayNameFunc(Entity) : PrimaryKey))
|
||||
.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
|
||||
}
|
||||
|
||||
protected EntityState GetState() {
|
||||
try {
|
||||
return Repository.GetState(Entity);
|
||||
} catch(InvalidOperationException) {
|
||||
Repository.SetPrimaryKey(Entity, PrimaryKey);
|
||||
return Repository.GetState(Entity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#region look up and detail view models
|
||||
protected virtual void RefreshLookUpCollections(bool raisePropertyChanged) {
|
||||
var values = lookUpViewModels.ToArray();
|
||||
lookUpViewModels.Clear();
|
||||
foreach(var item in values) {
|
||||
item.Value.OnDestroy();
|
||||
if(raisePropertyChanged)
|
||||
((IPOCOViewModel)this).RaisePropertyChanged(item.Key);
|
||||
}
|
||||
}
|
||||
|
||||
protected CollectionViewModel<TDetailEntity, TDetailPrimaryKey, TUnitOfWork> GetDetailsCollectionViewModel<TViewModel, TDetailEntity, TDetailPrimaryKey, TForeignKey>(
|
||||
Expression<Func<TViewModel, CollectionViewModel<TDetailEntity, TDetailPrimaryKey, TUnitOfWork>>> propertyExpression,
|
||||
Func<TUnitOfWork, IRepository<TDetailEntity, TDetailPrimaryKey>> getRepositoryFunc,
|
||||
Expression<Func<TDetailEntity, TForeignKey>> foreignKeyExpression,
|
||||
Action<TDetailEntity, TPrimaryKey> setMasterEntityKeyAction,
|
||||
Func<IRepositoryQuery<TDetailEntity>, IQueryable<TDetailEntity>> projection = null) where TDetailEntity : class {
|
||||
|
||||
return GetCollectionViewModelCore<CollectionViewModel<TDetailEntity, TDetailPrimaryKey, TUnitOfWork>, TDetailEntity, TDetailEntity, TForeignKey>(propertyExpression, foreignKeyExpression,
|
||||
() => CollectionViewModel<TDetailEntity, TDetailPrimaryKey, TUnitOfWork>.CreateCollectionViewModel(UnitOfWorkFactory, getRepositoryFunc, projection, CreateForeignKeyPropertyInitializer(setMasterEntityKeyAction, PrimaryKey), true));
|
||||
}
|
||||
|
||||
protected CollectionViewModel<TDetailEntity, TDetailProjection, TDetailPrimaryKey, TUnitOfWork> GetDetailProjectionsCollectionViewModel<TViewModel, TDetailEntity, TDetailProjection, TDetailPrimaryKey, TForeignKey>(
|
||||
Expression<Func<TViewModel, CollectionViewModel<TDetailEntity, TDetailProjection, TDetailPrimaryKey, TUnitOfWork>>> propertyExpression,
|
||||
Func<TUnitOfWork, IRepository<TDetailEntity, TDetailPrimaryKey>> getRepositoryFunc,
|
||||
Expression<Func<TDetailEntity, TForeignKey>> foreignKeyExpression,
|
||||
Action<TDetailEntity, TPrimaryKey> setMasterEntityKeyAction,
|
||||
Func<IRepositoryQuery<TDetailEntity>, IQueryable<TDetailProjection>> projection = null) where TDetailEntity : class where TDetailProjection : class {
|
||||
|
||||
return GetCollectionViewModelCore<CollectionViewModel<TDetailEntity, TDetailProjection, TDetailPrimaryKey, TUnitOfWork>, TDetailEntity, TDetailProjection, TForeignKey>(propertyExpression, foreignKeyExpression,
|
||||
() => CollectionViewModel<TDetailEntity, TDetailProjection, TDetailPrimaryKey, TUnitOfWork>.CreateProjectionCollectionViewModel(UnitOfWorkFactory, getRepositoryFunc, projection, CreateForeignKeyPropertyInitializer(setMasterEntityKeyAction, PrimaryKey), true));
|
||||
}
|
||||
|
||||
protected ReadOnlyCollectionViewModel<TDetailEntity, TUnitOfWork> GetReadOnlyDetailsCollectionViewModel<TViewModel, TDetailEntity, TForeignKey>(
|
||||
Expression<Func<TViewModel, ReadOnlyCollectionViewModel<TDetailEntity, TDetailEntity, TUnitOfWork>>> propertyExpression,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TDetailEntity>> getRepositoryFunc,
|
||||
Expression<Func<TDetailEntity, TForeignKey>> foreignKeyExpression,
|
||||
Func<IRepositoryQuery<TDetailEntity>, IQueryable<TDetailEntity>> projection = null) where TDetailEntity : class {
|
||||
|
||||
return GetCollectionViewModelCore<ReadOnlyCollectionViewModel<TDetailEntity, TUnitOfWork>, TDetailEntity, TDetailEntity, TForeignKey>(propertyExpression, foreignKeyExpression,
|
||||
() => ReadOnlyCollectionViewModel<TDetailEntity, TUnitOfWork>.CreateReadOnlyCollectionViewModel(UnitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
protected ReadOnlyCollectionViewModel<TDetailEntity, TDetailProjection, TUnitOfWork> GetReadOnlyDetailProjectionsCollectionViewModel<TViewModel, TDetailEntity, TDetailProjection, TForeignKey>(
|
||||
Expression<Func<TViewModel, ReadOnlyCollectionViewModel<TDetailEntity, TDetailProjection, TUnitOfWork>>> propertyExpression,
|
||||
Func<TUnitOfWork, IReadOnlyRepository<TDetailEntity>> getRepositoryFunc,
|
||||
Expression<Func<TDetailEntity, TForeignKey>> foreignKeyExpression,
|
||||
Func<IRepositoryQuery<TDetailEntity>, IQueryable<TDetailProjection>> projection) where TDetailEntity : class where TDetailProjection : class {
|
||||
|
||||
return GetCollectionViewModelCore<ReadOnlyCollectionViewModel<TDetailEntity, TDetailProjection, TUnitOfWork>, TDetailEntity, TDetailProjection, TForeignKey>(propertyExpression, foreignKeyExpression,
|
||||
() => ReadOnlyCollectionViewModel<TDetailEntity, TDetailProjection, TUnitOfWork>.CreateReadOnlyProjectionCollectionViewModel(UnitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
protected IEntitiesViewModel<TLookUpEntity> GetLookUpEntitiesViewModel<TViewModel, TLookUpEntity, TLookUpEntityKey>(Expression<Func<TViewModel, IEntitiesViewModel<TLookUpEntity>>> propertyExpression, Func<TUnitOfWork, IRepository<TLookUpEntity, TLookUpEntityKey>> getRepositoryFunc, Func<IRepositoryQuery<TLookUpEntity>, IQueryable<TLookUpEntity>> projection = null) where TLookUpEntity : class {
|
||||
return GetLookUpProjectionsViewModel(propertyExpression, getRepositoryFunc, projection);
|
||||
}
|
||||
|
||||
protected virtual IEntitiesViewModel<TLookUpProjection> GetLookUpProjectionsViewModel<TViewModel, TLookUpEntity, TLookUpProjection, TLookUpEntityKey>(Expression<Func<TViewModel, IEntitiesViewModel<TLookUpProjection>>> propertyExpression, Func<TUnitOfWork, IRepository<TLookUpEntity, TLookUpEntityKey>> getRepositoryFunc, Func<IRepositoryQuery<TLookUpEntity>, IQueryable<TLookUpProjection>> projection) where TLookUpEntity : class where TLookUpProjection : class {
|
||||
return GetEntitiesViewModelCore<IEntitiesViewModel<TLookUpProjection>, TLookUpProjection>(propertyExpression, () => LookUpEntitiesViewModel<TLookUpEntity, TLookUpProjection, TLookUpEntityKey, TUnitOfWork>.Create(UnitOfWorkFactory, getRepositoryFunc, projection));
|
||||
}
|
||||
|
||||
static Action<TDetailEntity> CreateForeignKeyPropertyInitializer<TDetailEntity, TForeignKey>(Action<TDetailEntity, TPrimaryKey> setMasterEntityKeyAction, TForeignKey masterEntityKey) where TDetailEntity : class {
|
||||
return x => setMasterEntityKeyAction(x, (TPrimaryKey)(object)masterEntityKey);
|
||||
}
|
||||
|
||||
TViewModel GetCollectionViewModelCore<TViewModel, TDetailEntity, TDetailProjection, TForeignKey>(
|
||||
LambdaExpression propertyExpression,
|
||||
Expression<Func<TDetailEntity, TForeignKey>> foreignKeyExpression,
|
||||
Func<TViewModel> createViewModelCallback)
|
||||
where TViewModel : ReadOnlyCollectionViewModel<TDetailEntity, TDetailProjection, TUnitOfWork>
|
||||
where TDetailEntity : class
|
||||
where TDetailProjection : class {
|
||||
|
||||
return GetEntitiesViewModelCore<TViewModel, TDetailProjection>(propertyExpression,
|
||||
() => CreateAndInitializeCollectionViewModel<TViewModel, TDetailEntity, TDetailProjection, TForeignKey>(createViewModelCallback, foreignKeyExpression));
|
||||
}
|
||||
|
||||
TViewModel CreateAndInitializeCollectionViewModel<TViewModel, TDetailEntity, TDetailProjection, TForeignKey>(Func<TViewModel> createViewModelCallback, Expression<Func<TDetailEntity, TForeignKey>> foreignKeyExpression)
|
||||
where TViewModel : ReadOnlyCollectionViewModel<TDetailEntity, TDetailProjection, TUnitOfWork>
|
||||
where TDetailEntity : class
|
||||
where TDetailProjection : class {
|
||||
TViewModel lookUpViewModel = createViewModelCallback().SetParentViewModel(this);
|
||||
lookUpViewModel.FilterExpression = ExpressionHelper.GetValueEqualsExpression(foreignKeyExpression, (TForeignKey)(object)PrimaryKey);
|
||||
return lookUpViewModel;
|
||||
}
|
||||
|
||||
TViewModel GetEntitiesViewModelCore<TViewModel, TDetailEntity>(LambdaExpression propertyExpression, Func<TViewModel> createViewModelCallback)
|
||||
where TViewModel : IEntitiesViewModel<TDetailEntity>
|
||||
where TDetailEntity : class {
|
||||
|
||||
IDocumentContent result = null;
|
||||
string propertyName = ExpressionHelper.GetPropertyName(propertyExpression);
|
||||
if(!lookUpViewModels.TryGetValue(propertyName, out result)) {
|
||||
result = createViewModelCallback();
|
||||
lookUpViewModels[propertyName] = result;
|
||||
}
|
||||
return (TViewModel)result;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ISupportParameter
|
||||
object ISupportParameter.Parameter {
|
||||
get { return null; }
|
||||
set { OnParameterChanged(value); }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IDocumentContent
|
||||
object IDocumentContent.Title { get { return Title; } }
|
||||
|
||||
void IDocumentContent.OnClose(CancelEventArgs e) {
|
||||
e.Cancel = !TryClose();
|
||||
}
|
||||
|
||||
void IDocumentContent.OnDestroy() {
|
||||
OnDestroy();
|
||||
}
|
||||
|
||||
IDocumentOwner IDocumentContent.DocumentOwner {
|
||||
get { return DocumentOwner; }
|
||||
set { DocumentOwner = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ISingleObjectViewModel
|
||||
TEntity ISingleObjectViewModel<TEntity, TPrimaryKey>.Entity { get { return Entity; } }
|
||||
|
||||
TPrimaryKey ISingleObjectViewModel<TEntity, TPrimaryKey>.PrimaryKey { get { return PrimaryKey; } }
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
|
||||
namespace DevExpress.DevAV.Common.ViewModel {
|
||||
partial class SingleObjectViewModel<TEntity, TPrimaryKey, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : IUnitOfWork {
|
||||
protected virtual bool EnableSelectedItemSynchronization {
|
||||
get { return false; }
|
||||
}
|
||||
protected override void OnInitializeInRuntime() {
|
||||
base.OnInitializeInRuntime();
|
||||
if(EnableSelectedItemSynchronization)
|
||||
SubscribeSelectedItemSynchronizationMessage();
|
||||
}
|
||||
protected void SubscribeSelectedItemSynchronizationMessage() {
|
||||
Messenger.Default.Register<SelectedItemSynchronizationMessage<TEntity>>(this, x => OnSelectedItemSynchronizationMessage(x));
|
||||
}
|
||||
protected virtual void OnSelectedItemSynchronizationMessage(SelectedItemSynchronizationMessage<TEntity> m) {
|
||||
if(m.Entity == null) Entity = null;
|
||||
else OnParameterChanged(Repository.GetPrimaryKey(m.Entity));
|
||||
}
|
||||
protected virtual bool EnableEntityChangedSynchronization {
|
||||
get { return false; }
|
||||
}
|
||||
protected override void OnEntityMessage(EntityMessage<TEntity, TPrimaryKey> msg) {
|
||||
if(EnableEntityChangedSynchronization && msg.MessageType == EntityMessageType.Changed) {
|
||||
if(object.Equals(msg.PrimaryKey, PrimaryKey))
|
||||
Reload();
|
||||
}
|
||||
base.OnEntityMessage(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
namespace DevExpress.DevAV {
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
using DevExpress.DevAV.Common.ViewModel;
|
||||
using DevExpress.XtraGrid.Views.Base;
|
||||
|
||||
class ColumnViewHelper<TEntity, TID, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : class, IUnitOfWork {
|
||||
CollectionViewModelBase<TEntity, TEntity, TID, TUnitOfWork> viewModel;
|
||||
ColumnView view;
|
||||
public ColumnViewHelper(ColumnView view, CollectionViewModel<TEntity, TID, TUnitOfWork> viewModel) {
|
||||
this.view = view;
|
||||
this.viewModel = viewModel;
|
||||
}
|
||||
public IEnumerable<TEntity> GetSelection() {
|
||||
int[] rowHandles = view.GetSelectedRows();
|
||||
TEntity[] entities = new TEntity[rowHandles.Length];
|
||||
for(int i = 0; i < entities.Length; i++)
|
||||
entities[i] = view.GetRow(rowHandles[i]) as TEntity;
|
||||
return entities;
|
||||
}
|
||||
public void PopulateEntityMenu(DevExpress.Utils.Menu.DXPopupMenu menu, int rowHandle) {
|
||||
if(!view.IsDataRow(rowHandle)) return;
|
||||
TEntity entity = view.GetRow(rowHandle) as TEntity;
|
||||
if(entity != null)
|
||||
CreateEntityMenu(menu, entity);
|
||||
}
|
||||
public bool ShowEntityMenu(Point pt, int rowHandle) {
|
||||
TEntity entity = view.GetRow(rowHandle) as TEntity;
|
||||
if(entity != null) {
|
||||
var rowMenu = new Utils.Menu.DXPopupMenu();
|
||||
CreateEntityMenu(rowMenu, entity);
|
||||
DevExpress.Utils.Menu.MenuManagerHelper.ShowMenu(rowMenu, view.GridControl.LookAndFeel,
|
||||
view.GridControl.MenuManager, view.GridControl, pt);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public bool EditEntity(int rowHandle) {
|
||||
if(!view.IsDataRow(rowHandle)) return false;
|
||||
TEntity entity = view.GetRow(rowHandle) as TEntity;
|
||||
if(entity != null && viewModel.CanEdit(entity)) {
|
||||
viewModel.Edit(entity);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public bool IsEntity(int rowHandle) {
|
||||
if(!view.IsValidRowHandle(rowHandle)) return false;
|
||||
return view.IsDataRow(rowHandle);
|
||||
}
|
||||
public bool SelectEntity(int rowHandle) {
|
||||
if(!view.IsValidRowHandle(rowHandle)) return false;
|
||||
if(view.IsDataRow(rowHandle))
|
||||
viewModel.SelectedEntity = view.GetRow(rowHandle) as TEntity;
|
||||
else
|
||||
viewModel.SelectedEntity = null;
|
||||
return true;
|
||||
}
|
||||
protected void CreateEntityMenu(DevExpress.Utils.Menu.DXPopupMenu rowMenu, TEntity entity) {
|
||||
var newItem = new Utils.Menu.DXMenuItem();
|
||||
newItem.Caption = "New";
|
||||
newItem.BindCommand(() => viewModel.New(), viewModel);
|
||||
|
||||
var editItem = new Utils.Menu.DXMenuItem();
|
||||
editItem.Caption = "Edit...";
|
||||
editItem.BindCommand((ee) => viewModel.Edit(ee), viewModel, () => entity);
|
||||
|
||||
var deleteItem = new Utils.Menu.DXMenuItem();
|
||||
deleteItem.Caption = "Delete";
|
||||
deleteItem.BindCommand((ee) => viewModel.Delete(ee), viewModel, () => entity);
|
||||
|
||||
rowMenu.Items.Add(newItem);
|
||||
rowMenu.Items.Add(editItem);
|
||||
rowMenu.Items.Add(deleteItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
namespace DevExpress.DevAV.Modules {
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
using DevExpress.DevAV.ViewModels;
|
||||
using DevExpress.Utils.Menu;
|
||||
using DevExpress.XtraTreeList;
|
||||
using DevExpress.XtraTreeList.Nodes;
|
||||
|
||||
class FilterTreeListHelper<TEntity, TID, TUnitOfWork>
|
||||
where TEntity : class
|
||||
where TUnitOfWork : class, IUnitOfWork {
|
||||
TreeList treeList;
|
||||
public FilterTreeListHelper(XtraTreeList.TreeList treeList) {
|
||||
this.treeList = treeList;
|
||||
}
|
||||
public void ModifyFilter(TreeListNode node, FilterTreeViewModel<TEntity, TID, TUnitOfWork> viewModel) {
|
||||
if(node != null && node.ParentNode != null) {
|
||||
if(MatchHierarchy(node, viewModel.CustomFilters))
|
||||
viewModel.Modify(GetRow<FilterTreeViewModel<TEntity, TID, TUnitOfWork>.FilterItem>(node));
|
||||
if(MatchHierarchy(node, viewModel.Groups))
|
||||
viewModel.ModifyGroup(GetRow<FilterTreeViewModel<TEntity, TID, TUnitOfWork>.FilterItem>(node));
|
||||
}
|
||||
}
|
||||
public bool PopulateFiltersMenu(DXPopupMenu nodeMenu, TreeListNode node, FilterTreeViewModel<TEntity, TID, TUnitOfWork> viewModel) {
|
||||
if(MatchHierarchy(node, viewModel.CustomFilters)) {
|
||||
var newItem = new DXMenuItem();
|
||||
newItem.Caption = "New...";
|
||||
newItem.BindCommand(() => viewModel.New(), viewModel);
|
||||
nodeMenu.Items.Add(newItem);
|
||||
if(node.ParentNode != null) {
|
||||
var filterItem = GetRow<FilterTreeViewModel<TEntity, TID, TUnitOfWork>.FilterItem>(node);
|
||||
var editItem = new DXMenuItem();
|
||||
editItem.Caption = "Modify...";
|
||||
editItem.BindCommand((f) => viewModel.Modify(f), viewModel, () => filterItem);
|
||||
nodeMenu.Items.Add(editItem);
|
||||
var deleteItem = new DXMenuItem();
|
||||
deleteItem.Caption = "Delete";
|
||||
deleteItem.BindCommand((f) => viewModel.Delete(f), viewModel, () => filterItem);
|
||||
nodeMenu.Items.Add(deleteItem);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if(MatchHierarchy(node, viewModel.Groups)) {
|
||||
var newItem = new DXMenuItem();
|
||||
newItem.Caption = "New Group...";
|
||||
newItem.BindCommand(() => viewModel.NewGroup(), viewModel);
|
||||
nodeMenu.Items.Add(newItem);
|
||||
if(node.ParentNode != null) {
|
||||
var filterItem = GetRow<FilterTreeViewModel<TEntity, TID, TUnitOfWork>.FilterItem>(node);
|
||||
var editItem = new DXMenuItem();
|
||||
editItem.Caption = "Modify Group...";
|
||||
editItem.BindCommand((f) => viewModel.ModifyGroup(f), viewModel, () => filterItem);
|
||||
nodeMenu.Items.Add(editItem);
|
||||
var deleteItem = new DXMenuItem();
|
||||
deleteItem.Caption = "Delete Group";
|
||||
deleteItem.BindCommand((f) => viewModel.DeleteGroup(f), viewModel, () => filterItem);
|
||||
nodeMenu.Items.Add(deleteItem);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public TreeListNode FindNode(object dataItem) {
|
||||
return treeList.FindNode((node) => Match(node, dataItem));
|
||||
}
|
||||
public bool Match(TreeListNode node, object dataItem) {
|
||||
return treeList.GetDataRecordByNode(node) == dataItem;
|
||||
}
|
||||
public bool MatchHierarchy(TreeListNode node, object dataItem) {
|
||||
while(node != null) {
|
||||
if(Match(node, dataItem))
|
||||
return true;
|
||||
node = node.ParentNode;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public T GetRow<T>(TreeListNode node) where T : class {
|
||||
return treeList.GetDataRecordByNode(node) as T;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,748 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq.Expressions;
|
||||
using System.Windows.Forms;
|
||||
using DevExpress.Data.Filtering.Helpers;
|
||||
using DevExpress.DevAV.Common.Utils;
|
||||
using DevExpress.Skins;
|
||||
using DevExpress.Utils;
|
||||
using DevExpress.XtraBars;
|
||||
using DevExpress.XtraEditors;
|
||||
using DevExpress.XtraEditors.Controls;
|
||||
using DevExpress.XtraEditors.Filtering;
|
||||
using DevExpress.XtraEditors.Repository;
|
||||
using DevExpress.XtraGrid;
|
||||
using DevExpress.XtraGrid.Controls;
|
||||
using DevExpress.XtraGrid.Views.Grid;
|
||||
using DevExpress.XtraLayout;
|
||||
using DevExpress.Utils.Svg;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
class TaskPreviewGridView : GridView {
|
||||
float rowFontSize = AppearanceObject.DefaultFont.Size;
|
||||
public TaskPreviewGridView() {
|
||||
Appearance.Row.Font = FontResources.GetSegoeUIFont(4);
|
||||
OptionsSelection.EnableAppearanceHideSelection = false;
|
||||
OptionsView.AutoCalcPreviewLineCount = true;
|
||||
OptionsView.EnableAppearanceEvenRow = true;
|
||||
OptionsView.ShowGroupPanel = false;
|
||||
OptionsView.ShowHorizontalLines = DevExpress.Utils.DefaultBoolean.False;
|
||||
OptionsView.ShowIndicator = false;
|
||||
OptionsView.ShowPreview = true;
|
||||
OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.False;
|
||||
PreviewIndent = 0;
|
||||
this.RowCellStyle += (s, e) => {
|
||||
e.Appearance.Font = FontResources.GetFont(e.Appearance.Font.FontFamily.Name, rowFontSize, e.Appearance.Font.Style);
|
||||
if(e.RowHandle == FocusedRowHandle && GridControl.Focused)
|
||||
e.Appearance.BackColor = PaintAppearance.FocusedRow.BackColor;
|
||||
else SetEvenRowAppearance(e.Appearance, e.RowHandle);
|
||||
};
|
||||
this.CustomDrawRowPreview += (s, e) => {
|
||||
if(e.RowHandle == FocusedRowHandle && GridControl.Focused) {
|
||||
e.Appearance.BackColor = PaintAppearance.FocusedRow.BackColor;
|
||||
e.Appearance.ForeColor = PaintAppearance.FocusedRow.ForeColor;
|
||||
}
|
||||
else SetEvenRowAppearance(e.Appearance, e.RowHandle);
|
||||
};
|
||||
}
|
||||
void SetEvenRowAppearance(AppearanceObject appearance, int rowHandle) {
|
||||
if(rowHandle % 2 == 0) {
|
||||
appearance.BackColor = PaintAppearance.EvenRow.BackColor;
|
||||
appearance.ForeColor = PaintAppearance.EvenRow.ForeColor;
|
||||
}
|
||||
else {
|
||||
appearance.BackColor = PaintAppearance.Row.BackColor;
|
||||
appearance.ForeColor = PaintAppearance.Row.ForeColor;
|
||||
}
|
||||
}
|
||||
public void SetViewFontSize(float rowFontSize, float previewFontSize) {
|
||||
if(previewFontSize > 0)
|
||||
Appearance.Preview.Font = FontResources.GetSegoeUIFont(previewFontSize);
|
||||
if(rowFontSize > 0) {
|
||||
this.rowFontSize += rowFontSize;
|
||||
Appearance.Row.Font = FontResources.GetSegoeUIFont(4);
|
||||
}
|
||||
}
|
||||
protected override bool IsAllowPixelScrollingPreview {
|
||||
get { return true; }
|
||||
}
|
||||
}
|
||||
class ZoomLevelManager {
|
||||
ZoomTrackBarControl zoomControlCore;
|
||||
int zoomLevelCore = 0;
|
||||
static int[] zoomValues = new int[] { 100, 110, 125, 150, 175, 200, 250, 300, 350, 400, 500 };
|
||||
BarEditItem editItem;
|
||||
BarButtonItem captionItem;
|
||||
IZoomViewModel viewModel;
|
||||
public ZoomLevelManager(BarEditItem beItem, BarButtonItem captionItem, IZoomViewModel viewModel) {
|
||||
this.viewModel = viewModel;
|
||||
if(viewModel != null)
|
||||
viewModel.ZoomModuleChanged += viewModel_SelectedModuleChanged;
|
||||
this.editItem = beItem;
|
||||
this.captionItem = captionItem;
|
||||
if(editItem != null) {
|
||||
editItem.HiddenEditor += beiZoom_HiddenEditor;
|
||||
editItem.ShownEditor += beiZoom_ShownEditor;
|
||||
}
|
||||
}
|
||||
ISupportZoom zoomModule;
|
||||
void viewModel_SelectedModuleChanged(object sender, EventArgs e) {
|
||||
if(zoomModule != null)
|
||||
zoomModule.ZoomChanged -= zoomModule_ZoomChanged;
|
||||
UpdateZoomLevelFromModule();
|
||||
zoomModule = viewModel.ZoomModule as ISupportZoom;
|
||||
if(zoomModule != null)
|
||||
zoomModule.ZoomChanged += zoomModule_ZoomChanged;
|
||||
}
|
||||
ZoomTrackBarControl ZoomControl {
|
||||
get { return zoomControlCore; }
|
||||
}
|
||||
public int ZoomLevel {
|
||||
get { return zoomLevelCore; }
|
||||
set {
|
||||
if(ZoomLevel == value) return;
|
||||
zoomLevelCore = value;
|
||||
OnZoomLevelChanged(value);
|
||||
}
|
||||
}
|
||||
void OnZoomLevelChanged(int value) {
|
||||
int index = Array.IndexOf(zoomValues, value);
|
||||
if(index == -1)
|
||||
value = (value / 10);
|
||||
else value = 10 + index;
|
||||
editItem.EditValue = value;
|
||||
captionItem.Caption = string.Format(" {0}%", ZoomLevel);
|
||||
UpdateModuleZoomLevel();
|
||||
}
|
||||
void UpdateModuleZoomLevel() {
|
||||
ISupportZoom supportZoom = viewModel.ZoomModule as ISupportZoom;
|
||||
if(supportZoom != null)
|
||||
supportZoom.ZoomLevel = ZoomLevel;
|
||||
}
|
||||
void UpdateZoomLevelFromModule() {
|
||||
ISupportZoom supportZoom = viewModel.ZoomModule as ISupportZoom;
|
||||
if(supportZoom != null)
|
||||
ZoomLevel = supportZoom.ZoomLevel;
|
||||
editItem.Visibility = captionItem.Visibility = (supportZoom != null) ? BarItemVisibility.Always : BarItemVisibility.Never;
|
||||
}
|
||||
void zoomModule_ZoomChanged(object sender, EventArgs e) {
|
||||
UpdateZoomLevelFromModule();
|
||||
}
|
||||
void beiZoom_ShownEditor(object sender, ItemClickEventArgs e) {
|
||||
this.zoomControlCore = editItem.Manager.ActiveEditor as ZoomTrackBarControl;
|
||||
if(ZoomControl != null) {
|
||||
ZoomControl.ValueChanged += OnZoomValueChanged;
|
||||
OnZoomValueChanged(ZoomControl, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
void beiZoom_HiddenEditor(object sender, ItemClickEventArgs e) {
|
||||
ZoomControl.ValueChanged -= OnZoomValueChanged;
|
||||
this.zoomControlCore = null;
|
||||
}
|
||||
void OnZoomValueChanged(object sender, EventArgs e) {
|
||||
int val = ZoomControl.Value * 10;
|
||||
if(ZoomControl.Value > 10) val = zoomValues[ZoomControl.Value - 10];
|
||||
ZoomLevel = val;
|
||||
}
|
||||
}
|
||||
static class GalleryItemAppearances {
|
||||
public static void Apply(RibbonGalleryBarItem galleryItem) {
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Normal.Font = AppearanceObject.DefaultFont;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Normal.Options.UseFont = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Normal.TextOptions.HAlignment = HorzAlignment.Near;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Normal.Options.UseTextOptions = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Hovered.Font = AppearanceObject.DefaultFont;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Hovered.Options.UseFont = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Hovered.TextOptions.HAlignment = HorzAlignment.Near;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Hovered.Options.UseTextOptions = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Pressed.Font = AppearanceObject.DefaultFont;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Pressed.Options.UseFont = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Pressed.TextOptions.HAlignment = HorzAlignment.Near;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Pressed.Options.UseTextOptions = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Disabled.Font = AppearanceObject.DefaultFont;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Disabled.Options.UseFont = true;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Disabled.TextOptions.HAlignment = HorzAlignment.Near;
|
||||
galleryItem.Gallery.Appearance.ItemCaptionAppearance.Disabled.Options.UseTextOptions = true;
|
||||
}
|
||||
}
|
||||
static class FiltersTreeListAppearances {
|
||||
public static void Apply(XtraTreeList.TreeList treeList) {
|
||||
treeList.BackColor = System.Drawing.Color.Transparent;
|
||||
treeList.Appearance.Empty.BackColor = System.Drawing.Color.Transparent;
|
||||
treeList.Appearance.Empty.Options.UseBackColor = true;
|
||||
treeList.Appearance.Row.BackColor = System.Drawing.Color.Transparent;
|
||||
treeList.Appearance.Row.Options.UseBackColor = true;
|
||||
treeList.LookAndFeel.StyleChanged += LookAndFeel_StyleChanged;
|
||||
//
|
||||
var font = FontResources.GetSegoeUIFont(System.Drawing.FontStyle.Bold);
|
||||
treeList.Appearance.FocusedRow.Font = font;
|
||||
treeList.Appearance.FocusedRow.Options.UseFont = true;
|
||||
treeList.Appearance.HideSelectionRow.Font = font;
|
||||
treeList.Appearance.HideSelectionRow.Options.UseFont = true;
|
||||
treeList.Appearance.SelectedRow.Font = font;
|
||||
treeList.Appearance.SelectedRow.Options.UseFont = true;
|
||||
}
|
||||
static void LookAndFeel_StyleChanged(object sender, EventArgs e) {
|
||||
var lf = (LookAndFeel.UserLookAndFeel)sender;
|
||||
if(lf != null) {
|
||||
var treeList = lf.OwnerControl as XtraTreeList.TreeList;
|
||||
if(treeList != null)
|
||||
treeList.Appearance.Row.ForeColor = GridHelper.GetTransparentRowForeColor(lf);
|
||||
}
|
||||
}
|
||||
}
|
||||
static class GroupFiltersListViewAppearances {
|
||||
public static void Apply(XtraGrid.Views.WinExplorer.WinExplorerView winExplorerView) {
|
||||
winExplorerView.Appearance.ItemDescriptionNormal.ForeColor = ColorHelper.DisabledTextColor;
|
||||
winExplorerView.Appearance.ItemDescriptionNormal.Options.UseForeColor = true;
|
||||
winExplorerView.Appearance.ItemDescriptionHovered.ForeColor = ColorHelper.DisabledTextColor;
|
||||
winExplorerView.Appearance.ItemDescriptionHovered.Options.UseForeColor = true;
|
||||
winExplorerView.Appearance.ItemDescriptionPressed.ForeColor = ColorHelper.DisabledTextColor;
|
||||
winExplorerView.Appearance.ItemDescriptionPressed.Options.UseForeColor = true;
|
||||
}
|
||||
}
|
||||
//
|
||||
static class AppHelper {
|
||||
public static void ProcessStart(string name) {
|
||||
ProcessStart(name, string.Empty);
|
||||
}
|
||||
public static void ProcessStart(string name, string arguments) {
|
||||
try {
|
||||
System.Diagnostics.Process process = new System.Diagnostics.Process();
|
||||
process.StartInfo.FileName = "cmd";
|
||||
process.StartInfo.Arguments = $"/c start {name}";
|
||||
process.StartInfo.CreateNoWindow = true;
|
||||
process.Start();
|
||||
}
|
||||
catch(System.ComponentModel.Win32Exception) { }
|
||||
}
|
||||
public static string ApplicationID {
|
||||
get { return string.Format("Components_{0}_Demo_Center_{0}", AssemblyInfo.VersionShort.Replace(".", "_")); }
|
||||
}
|
||||
public static Icon AppIcon {
|
||||
get { return DevExpress.Utils.ResourceImageHelper.CreateIconFromResourcesEx("DevExpress.DevAV.Resources.AppIcon.ico", typeof(MainForm).Assembly); }
|
||||
}
|
||||
static Image img;
|
||||
public static Image AppImage {
|
||||
get {
|
||||
if(img == null)
|
||||
img = AppIcon.ToBitmap();
|
||||
return img;
|
||||
}
|
||||
}
|
||||
static WeakReference wRef;
|
||||
public static MainForm MainForm {
|
||||
get { return (wRef != null) ? wRef.Target as MainForm : null; }
|
||||
set { wRef = new WeakReference(value); }
|
||||
}
|
||||
public static float GetDefaultSize() {
|
||||
return 8.25F;
|
||||
}
|
||||
}
|
||||
static class GridHelper {
|
||||
public static void SetFindControlImages(GridControl grid) { SetFindControlImages(grid, true); }
|
||||
public static void SetFindControlImages(GridControl grid, bool forceAlignment) {
|
||||
FindControl fControl = null;
|
||||
foreach(Control ctrl in grid.Controls) {
|
||||
fControl = ctrl as FindControl;
|
||||
if(fControl != null) break;
|
||||
}
|
||||
if(fControl != null) {
|
||||
EditorButton btn = fControl.FindEdit.Properties.Buttons[0];
|
||||
btn.Kind = XtraEditors.Controls.ButtonPredefines.Search;
|
||||
btn = new EditorButton(ButtonPredefines.Close);
|
||||
btn.Visible = false;
|
||||
fControl.FindEdit.Properties.Buttons.Add(btn);
|
||||
fControl.FindEdit.ButtonClick += (s, e) => {
|
||||
if(!e.Button.IsDefaultButton) {
|
||||
ButtonEdit edit = s as ButtonEdit;
|
||||
edit.Text = string.Empty;
|
||||
}
|
||||
};
|
||||
fControl.FindEdit.EditValueChanged += (s, e) => {
|
||||
MRUEdit edit = s as MRUEdit;
|
||||
edit.Properties.BeginUpdate();
|
||||
try {
|
||||
edit.Properties.Buttons[0].Visible = string.IsNullOrEmpty(edit.Text);
|
||||
edit.Properties.Buttons[1].Visible = !string.IsNullOrEmpty(edit.Text);
|
||||
}
|
||||
finally {
|
||||
edit.Properties.EndUpdate();
|
||||
}
|
||||
};
|
||||
if(forceAlignment) {
|
||||
//LayoutControl lc = fControl.FindEdit.Parent as LayoutControl;
|
||||
//lc.BeginUpdate();
|
||||
////lc.Root.AddItem(new EmptySpaceItem() { SizeConstraintsType = SizeConstraintsType.Custom, MinSize = new Size(1, 1) }, lc.Root.Items[0], XtraLayout.Utils.InsertType.Left);
|
||||
//try {
|
||||
// for(int i = lc.Root.Items.Count - 1; i >= 0; i--) {
|
||||
// LayoutControlItem item = lc.Root.Items[i] as LayoutControlItem;
|
||||
// if(item == null) continue;
|
||||
// if(item.Visibility == XtraLayout.Utils.LayoutVisibility.Never)
|
||||
// lc.Root.Remove(item);
|
||||
// else {
|
||||
// item.ControlAlignment = System.Drawing.ContentAlignment.MiddleRight;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//finally {
|
||||
// lc.EndUpdate();
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
internal static void HideCustomization(Control control) {
|
||||
if(control == null) return;
|
||||
foreach(Control child in control.Controls) {
|
||||
GridControl grid = child as GridControl;
|
||||
if(grid != null) {
|
||||
GridView gridView = grid.MainView as GridView;
|
||||
if(gridView != null)
|
||||
gridView.HideCustomization();
|
||||
continue;
|
||||
}
|
||||
else HideCustomization(child);
|
||||
}
|
||||
}
|
||||
internal static Color GetTransparentRowForeColor(LookAndFeel.UserLookAndFeel lf) {
|
||||
return
|
||||
(DevExpress.Utils.Frames.FrameHelper.IsDarkSkin(lf) || lf.ActiveSkinName == "VS2010") ?
|
||||
(lf.ActiveSkinName == "VS2010" ? ColorHelper.GetControlColor(lf) : ColorHelper.TextColor) : Color.Empty;
|
||||
}
|
||||
}
|
||||
static class ChartHelper {
|
||||
internal static Color GetBackColor(DevExpress.XtraCharts.ChartControl chartControl) {
|
||||
return ((DevExpress.XtraCharts.Native.IChartContainer)chartControl).Chart.ActualBackColor;
|
||||
}
|
||||
}
|
||||
class LabelTabController {
|
||||
LabelControl[] labels;
|
||||
public LabelTabController(object eValue, params LabelControl[] list) {
|
||||
this.labels = list;
|
||||
EditValue = eValue;
|
||||
foreach(LabelControl lb in list)
|
||||
lb.Click += (s, e) => EditValue = ((LabelControl)s).Tag;
|
||||
}
|
||||
object editValueCore;
|
||||
public object EditValue {
|
||||
get { return editValueCore; }
|
||||
set {
|
||||
if(object.Equals(editValueCore, value)) return;
|
||||
editValueCore = value;
|
||||
OnEditValueChanged();
|
||||
}
|
||||
}
|
||||
void OnEditValueChanged() {
|
||||
UpdateAppearance();
|
||||
RaiseEditValueChanged();
|
||||
}
|
||||
void UpdateAppearance() {
|
||||
foreach(LabelControl lc in labels) {
|
||||
bool isSelected = EditValue.Equals(lc.Tag);
|
||||
lc.Font = FontResources.GetFont(lc.Font.FontFamily.Name, 10.25f, isSelected ? FontStyle.Bold : FontStyle.Regular);
|
||||
lc.Appearance.ForeColor = isSelected ? ColorHelper.QuestionColor : Color.Empty;
|
||||
}
|
||||
}
|
||||
public event EventHandler EditValueChanged;
|
||||
void RaiseEditValueChanged() {
|
||||
EventHandler handler = EditValueChanged;
|
||||
if(handler != null) handler(EditValue, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
static class FontResources {
|
||||
static IDictionary<string, Font> cache;
|
||||
static FontResources() {
|
||||
cache = new Dictionary<string, Font>();
|
||||
}
|
||||
public static Font GetSegoeUIFont(FontStyle fontStyle) {
|
||||
float defaultSize = DevExpress.Utils.AppearanceObject.DefaultFont.Size;
|
||||
return GetFont("Segoe UI", defaultSize, fontStyle);
|
||||
}
|
||||
public static Font GetSegoeUIFont(float sizeGrow = 0) {
|
||||
float defaultSize = DevExpress.Utils.AppearanceObject.DefaultFont.Size;
|
||||
return GetFont("Segoe UI", defaultSize + sizeGrow);
|
||||
}
|
||||
public static Font GetSegoeUILightFont(float sizeGrow = 0) {
|
||||
float defaultSize = DevExpress.Utils.AppearanceObject.DefaultFont.Size;
|
||||
return GetFont("Segoe UI Light", defaultSize + sizeGrow);
|
||||
}
|
||||
public static Font GetFont(string familyName, float size, FontStyle style = FontStyle.Regular) {
|
||||
string key = familyName + "#" + size.ToString();
|
||||
if(style != FontStyle.Regular)
|
||||
key += ("#" + style.ToString());
|
||||
Font result;
|
||||
if(!cache.TryGetValue(key, out result)) {
|
||||
try {
|
||||
var family = FindFontFamily(familyName);
|
||||
result = new Font(family ?? FontFamily.GenericSansSerif, size, style);
|
||||
}
|
||||
catch(ArgumentException) { result = DevExpress.Utils.AppearanceObject.DefaultFont; }
|
||||
cache.Add(key, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
static FontFamily FindFontFamily(string familyName) {
|
||||
return Array.Find(FontFamily.Families, (f) => f.Name == familyName);
|
||||
}
|
||||
}
|
||||
static class ColorHelper {
|
||||
public static Color GetControlColor(DevExpress.LookAndFeel.UserLookAndFeel provider) {
|
||||
return DevExpress.LookAndFeel.LookAndFeelHelper.GetSystemColor(provider, SystemColors.Control);
|
||||
}
|
||||
public static Color TextColor {
|
||||
get { return CommonSkins.GetSkin(DevExpress.LookAndFeel.UserLookAndFeel.Default).Colors.GetColor(CommonColors.ControlText); }
|
||||
}
|
||||
public static Color WindowColor {
|
||||
get { return CommonSkins.GetSkin(DevExpress.LookAndFeel.UserLookAndFeel.Default).Colors.GetColor(CommonColors.Window); }
|
||||
}
|
||||
public static Color WindowTextColor {
|
||||
get { return CommonSkins.GetSkin(DevExpress.LookAndFeel.UserLookAndFeel.Default).Colors.GetColor(CommonColors.WindowText); }
|
||||
}
|
||||
public static Color DisabledTextColor {
|
||||
get { return CommonSkins.GetSkin(DevExpress.LookAndFeel.UserLookAndFeel.Default).Colors.GetColor(CommonColors.DisabledText); }
|
||||
}
|
||||
public static Color CriticalColor {
|
||||
get { return CommonColors.GetCriticalColor(DevExpress.LookAndFeel.UserLookAndFeel.Default); }
|
||||
}
|
||||
public static Color WarningColor {
|
||||
get { return CommonColors.GetWarningColor(DevExpress.LookAndFeel.UserLookAndFeel.Default); }
|
||||
}
|
||||
public static Color QuestionColor {
|
||||
get { return CommonColors.GetQuestionColor(DevExpress.LookAndFeel.UserLookAndFeel.Default); }
|
||||
}
|
||||
public static Color InformationColor {
|
||||
get { return CommonColors.GetInformationColor(DevExpress.LookAndFeel.UserLookAndFeel.Default); }
|
||||
}
|
||||
}
|
||||
static class EditorHelpers {
|
||||
public static RepositoryItemImageComboBox CreatePaymentStatusImageComboBox(ISkinProvider provider, RepositoryItemImageComboBox edit = null, RepositoryItemCollection collection = null) {
|
||||
RepositoryItemImageComboBox ret = CreateEnumImageComboBox<PaymentStatus>(edit, collection);
|
||||
ret.SmallImages = CreatePaymentStatusImageCollection(provider);
|
||||
if(edit == null)
|
||||
ret.GlyphAlignment = HorzAlignment.Center;
|
||||
return ret;
|
||||
}
|
||||
public static RepositoryItemImageComboBox CreateShipmentStatusImageComboBox(ISkinProvider provider, RepositoryItemImageComboBox edit = null, RepositoryItemCollection collection = null) {
|
||||
RepositoryItemImageComboBox ret = CreateEnumImageComboBox<ShipmentStatus>(edit, collection);
|
||||
ret.SmallImages = CreateShipmentStatusImageCollection(provider);
|
||||
if(edit == null)
|
||||
ret.GlyphAlignment = HorzAlignment.Center;
|
||||
return ret;
|
||||
}
|
||||
public static RepositoryItemImageComboBox CreatePersonPrefixImageComboBox(RepositoryItemImageComboBox edit = null, RepositoryItemCollection collection = null) {
|
||||
RepositoryItemImageComboBox ret = CreateEnumImageComboBox<PersonPrefix>(edit, collection);
|
||||
ret.SmallImages = CreatePersonPrefixImageCollection();
|
||||
if(edit == null)
|
||||
ret.GlyphAlignment = HorzAlignment.Center;
|
||||
return ret;
|
||||
}
|
||||
public static RepositoryItemImageComboBox CreateTaskPriorityImageComboBox(RepositoryItemImageComboBox edit = null, RepositoryItemCollection collection = null) {
|
||||
RepositoryItemImageComboBox ret = CreateEnumImageComboBox<EmployeeTaskPriority>(edit, collection);
|
||||
ret.SmallImages = CreateTaskPriorityImageCollection();
|
||||
if(edit == null)
|
||||
ret.GlyphAlignment = HorzAlignment.Center;
|
||||
return ret;
|
||||
}
|
||||
static SvgImageCollection CreatePersonPrefixImageCollection() {
|
||||
SvgImageCollection svgImageCollection = new SvgImageCollection();
|
||||
svgImageCollection.ImageSize = new Size(16, 16);
|
||||
svgImageCollection.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.PersonPrefix." + "Doctor.svg", typeof(EditorHelpers).Assembly));
|
||||
svgImageCollection.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.PersonPrefix." + "Mr.svg", typeof(EditorHelpers).Assembly));
|
||||
svgImageCollection.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.PersonPrefix." + "Ms.svg", typeof(EditorHelpers).Assembly));
|
||||
svgImageCollection.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.PersonPrefix." + "Miss.svg", typeof(EditorHelpers).Assembly));
|
||||
svgImageCollection.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.PersonPrefix." + "Mrs.svg", typeof(EditorHelpers).Assembly));
|
||||
return svgImageCollection;
|
||||
}
|
||||
static ImageCollection CreateTaskPriorityImageCollection() {
|
||||
ImageCollection ret = new ImageCollection();
|
||||
ret.ImageSize = new Size(16, 16);
|
||||
ret.AddImage(Properties.Resources.LowPriority);
|
||||
ret.AddImage(Properties.Resources.NormalPriority);
|
||||
ret.AddImage(Properties.Resources.MediumPriority);
|
||||
ret.AddImage(Properties.Resources.HighPriority);
|
||||
return ret;
|
||||
}
|
||||
internal static object CreatePaymentStatusImageCollection(ISkinProvider provider) {
|
||||
SvgImageCollection ret = new SvgImageCollection();
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Payment" + "Unpaid.svg", typeof(EditorHelpers).Assembly));
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Payment" + "Paid.svg", typeof(EditorHelpers).Assembly));
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Payment" + "Refund.svg", typeof(EditorHelpers).Assembly));
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Payment" + "Other.svg", typeof(EditorHelpers).Assembly));
|
||||
return ret;
|
||||
}
|
||||
internal static object CreateShipmentStatusImageCollection(ISkinProvider provider) { // TODO
|
||||
SvgImageCollection ret = new SvgImageCollection();
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Shipment" + "Awaiting.svg", typeof(EditorHelpers).Assembly));
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Shipment" + "Transit.svg", typeof(EditorHelpers).Assembly));
|
||||
ret.Add(SvgImage.FromResources("DevExpress.DevAV.Resources.Orders.Shipment" + "Received.svg", typeof(EditorHelpers).Assembly));
|
||||
return ret;
|
||||
}
|
||||
public static RepositoryItemImageComboBox CreateManeuverImageComboBox(RepositoryItemImageComboBox edit = null, RepositoryItemCollection collection = null) {
|
||||
RepositoryItemImageComboBox ret = CreateEnumImageComboBox<DevExpress.XtraMap.BingManeuverType>(edit, collection);
|
||||
foreach(ImageComboBoxItem item in ret.Items) {
|
||||
switch((DevExpress.XtraMap.BingManeuverType)item.Value) {
|
||||
case DevExpress.XtraMap.BingManeuverType.DepartStart:
|
||||
item.ImageIndex = 0;
|
||||
break;
|
||||
case DevExpress.XtraMap.BingManeuverType.TurnLeft:
|
||||
item.ImageIndex = 1;
|
||||
break;
|
||||
case DevExpress.XtraMap.BingManeuverType.TurnRight:
|
||||
item.ImageIndex = 2;
|
||||
break;
|
||||
case DevExpress.XtraMap.BingManeuverType.ArriveFinish:
|
||||
item.ImageIndex = 3;
|
||||
break;
|
||||
case DevExpress.XtraMap.BingManeuverType.UTurn:
|
||||
item.ImageIndex = 4;
|
||||
break;
|
||||
case DevExpress.XtraMap.BingManeuverType.BearLeft:
|
||||
item.ImageIndex = 5;
|
||||
break;
|
||||
case DevExpress.XtraMap.BingManeuverType.BearRight:
|
||||
item.ImageIndex = 6;
|
||||
break;
|
||||
}
|
||||
item.Description = string.Empty;
|
||||
}
|
||||
ret.SmallImages = CreateBingManeuverTypeImageCollection();
|
||||
ret.GlyphAlignment = HorzAlignment.Center;
|
||||
return ret;
|
||||
}
|
||||
static ImageCollection CreateBingManeuverTypeImageCollection() {
|
||||
ImageCollection ret = new ImageCollection();
|
||||
ret.ImageSize = new Size(32, 32);
|
||||
ret.AddImage(Properties.Resources.icon_A_32);
|
||||
ret.AddImage(Properties.Resources.icon_arrow_left_32);
|
||||
ret.AddImage(Properties.Resources.icon_arrow_right_32);
|
||||
ret.AddImage(Properties.Resources.icon_B_32);
|
||||
ret.AddImage(Properties.Resources.icon_arrow_uturn_32);
|
||||
ret.AddImage(Properties.Resources.icon_arrow_bear_left_32);
|
||||
ret.AddImage(Properties.Resources.icon_arrow_bear_right_32);
|
||||
ret.AddImage(Properties.Resources.icon_arrow_forward_32);
|
||||
return ret;
|
||||
}
|
||||
public static RepositoryItemImageComboBox CreateEnumImageComboBox<TEnum>(DevExpress.XtraEditors.Container.EditorContainer container,
|
||||
Converter<TEnum, string> displayTextConverter = null) {
|
||||
return CreatEdit<RepositoryItemImageComboBox>(null, (container != null) ? container.RepositoryItems : null, (e) => e.Items.AddEnum<TEnum>(displayTextConverter));
|
||||
}
|
||||
public static RepositoryItemImageComboBox CreateEnumImageComboBox<TEnum>(RepositoryItemImageComboBox edit = null, RepositoryItemCollection collection = null,
|
||||
Converter<TEnum, string> displayTextConverter = null) {
|
||||
return CreatEdit<RepositoryItemImageComboBox>(edit, collection, (e) => e.Items.AddEnum<TEnum>(displayTextConverter));
|
||||
}
|
||||
public static RepositoryItemDateEdit CreatDateEdit(RepositoryItemDateEdit edit = null, RepositoryItemCollection collection = null) {
|
||||
return CreatEdit<RepositoryItemDateEdit>(edit, collection);
|
||||
}
|
||||
public static TEdit CreatEdit<TEdit>(TEdit edit = null, RepositoryItemCollection collection = null, Action<TEdit> initialize = null)
|
||||
where TEdit : RepositoryItem, new() {
|
||||
edit = edit ?? new TEdit();
|
||||
if(collection != null) collection.Add(edit);
|
||||
if(initialize != null)
|
||||
initialize(edit);
|
||||
return edit;
|
||||
}
|
||||
public static void ApplyBindingSettings<TEntity>(BaseEdit edit, LayoutControl layoutControl) {
|
||||
var memberInfo = edit.DataBindings["EditValue"].BindingMemberInfo;
|
||||
if(DataAnnotationHelper.IsRequired<TEntity>(memberInfo.BindingMember)) {
|
||||
if(layoutControl != null) {
|
||||
var itemForEdit = layoutControl.GetItemByControl(edit);
|
||||
itemForEdit.AllowHtmlStringInCaption = true;
|
||||
itemForEdit.Text = itemForEdit.Text + " <color=red>*</color>";
|
||||
}
|
||||
}
|
||||
if(edit is TextEdit) {
|
||||
if(DataAnnotationHelper.IsPhone<TEntity>(memberInfo.BindingMember)) {
|
||||
((TextEdit)edit).Properties.Mask.MaskType = XtraEditors.Mask.MaskType.Simple;
|
||||
((TextEdit)edit).Properties.Mask.EditMask = "(999) 000-0000";
|
||||
((TextEdit)edit).Properties.Mask.UseMaskAsDisplayFormat = true;
|
||||
}
|
||||
if(DataAnnotationHelper.IsZipcode<TEntity>(memberInfo.BindingMember)) {
|
||||
((TextEdit)edit).Properties.Mask.MaskType = XtraEditors.Mask.MaskType.Simple;
|
||||
((TextEdit)edit).Properties.Mask.EditMask = "00000";
|
||||
((TextEdit)edit).Properties.Mask.UseMaskAsDisplayFormat = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
class FilterColumnCollectionBuilder<TEntity> {
|
||||
FilterColumnCollection filterColumns;
|
||||
public FilterColumnCollectionBuilder() {
|
||||
this.filterColumns = new FilterColumnCollection();
|
||||
}
|
||||
public FilterColumnCollectionBuilder(FilterColumnCollection filterColumns) {
|
||||
this.filterColumns = filterColumns;
|
||||
}
|
||||
public FilterColumnCollection Build() {
|
||||
return filterColumns;
|
||||
}
|
||||
public FilterColumnCollectionBuilder<TEntity> AddColumn<T>(Expression<Func<TEntity, T>> expression,
|
||||
DevExpress.XtraEditors.Repository.RepositoryItem repositoryItem = null,
|
||||
FilterColumnClauseClass clauseClass = FilterColumnClauseClass.String, string caption = null) {
|
||||
if(repositoryItem == null) {
|
||||
if(typeof(T) == typeof(bool) || (typeof(T) == typeof(bool?))) {
|
||||
repositoryItem = EditorHelpers.CreatEdit<RepositoryItemCheckEdit>();
|
||||
clauseClass = FilterColumnClauseClass.Generic;
|
||||
}
|
||||
if((typeof(T) == typeof(double)) || (typeof(T) == typeof(double?)) || (typeof(T) == typeof(decimal)) || (typeof(T) == typeof(decimal?))) {
|
||||
repositoryItem = EditorHelpers.CreatEdit<RepositoryItemSpinEdit>();
|
||||
clauseClass = FilterColumnClauseClass.Generic;
|
||||
}
|
||||
if(typeof(T) == typeof(int) || (typeof(T) == typeof(int?))) {
|
||||
var spinEdit = EditorHelpers.CreatEdit<RepositoryItemSpinEdit>();
|
||||
spinEdit.IsFloatValue = false;
|
||||
repositoryItem = spinEdit;
|
||||
clauseClass = FilterColumnClauseClass.Generic;
|
||||
}
|
||||
}
|
||||
filterColumns.Add(CreateColumn(expression, caption, null, repositoryItem, clauseClass));
|
||||
return this;
|
||||
}
|
||||
public FilterColumnCollectionBuilder<TEntity> AddLookupColumn<T>(Expression<Func<TEntity, T>> expression) {
|
||||
return AddColumn(expression, EditorHelpers.CreateEnumImageComboBox<T>(), FilterColumnClauseClass.Lookup);
|
||||
}
|
||||
public FilterColumnCollectionBuilder<TEntity> AddDateTimeColumn<T>(Expression<Func<TEntity, T>> expression) {
|
||||
return AddColumn(expression, EditorHelpers.CreatDateEdit(), FilterColumnClauseClass.DateTime);
|
||||
}
|
||||
UnboundFilterColumn CreateColumn<T>(Expression<Func<TEntity, T>> expression, string caption, string fieldName,
|
||||
DevExpress.XtraEditors.Repository.RepositoryItem repositoryItem, FilterColumnClauseClass clauseClass) {
|
||||
var member = (expression.Body as MemberExpression).Member;
|
||||
if(string.IsNullOrEmpty(fieldName))
|
||||
fieldName = GetFieldName<T>(expression);
|
||||
if(string.IsNullOrEmpty(caption))
|
||||
caption = GetDisplayName(member);
|
||||
return CreateColumn<T>(caption, fieldName, repositoryItem, clauseClass);
|
||||
}
|
||||
UnboundFilterColumn CreateColumn<T>(string caption, string fieldName,
|
||||
DevExpress.XtraEditors.Repository.RepositoryItem repositoryItem, FilterColumnClauseClass clauseClass) {
|
||||
return new UnboundFilterColumn(caption, fieldName, typeof(T), repositoryItem, clauseClass);
|
||||
}
|
||||
string GetFieldName<T>(Expression<Func<TEntity, T>> expression) {
|
||||
var sb = new System.Text.StringBuilder();
|
||||
MemberExpression me = expression.Body as MemberExpression;
|
||||
while(me != null) {
|
||||
if(sb.Length > 0)
|
||||
sb.Insert(0, ".");
|
||||
sb.Insert(0, me.Member.Name);
|
||||
me = me.Expression as MemberExpression;
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
string GetDisplayName(System.Reflection.MemberInfo member) {
|
||||
string displayName = member.Name;
|
||||
if(CheckDisplayNameAttribute<System.ComponentModel.DataAnnotations.DisplayAttribute>(member, a => a.GetName(), ref displayName))
|
||||
return displayName;
|
||||
if(CheckDisplayNameAttribute<System.ComponentModel.DisplayNameAttribute>(member, a => a.DisplayName, ref displayName))
|
||||
return displayName;
|
||||
return displayName;
|
||||
}
|
||||
bool CheckDisplayNameAttribute<TAttribute>(System.Reflection.MemberInfo member, Func<TAttribute, string> accessor, ref string displayName)
|
||||
where TAttribute : Attribute {
|
||||
var displayAttributes = member.GetCustomAttributes(typeof(TAttribute), true);
|
||||
if(displayAttributes.Length > 0) {
|
||||
displayName = accessor((TAttribute)displayAttributes[0]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
static class FilterControlWithoutLike {
|
||||
public static void Apply(FilterControl filterControl) {
|
||||
filterControl.PopupMenuShowing += filterControl_PopupMenuShowing;
|
||||
}
|
||||
static void filterControl_PopupMenuShowing(object sender, XtraEditors.Filtering.PopupMenuShowingEventArgs e) {
|
||||
for(int i = e.Menu.Items.Count - 1; i >= 0; i--) {
|
||||
if(e.Menu.Items[i].Caption == Localizer.Active.GetLocalizedString(StringId.FilterClauseLike) ||
|
||||
e.Menu.Items[i].Caption == Localizer.Active.GetLocalizedString(StringId.FilterClauseNotLike)) {
|
||||
e.Menu.Items.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
class DemoStartUp : IObserver<string> {
|
||||
void IObserver<string>.OnCompleted() {
|
||||
XtraSplashScreen.SplashScreenManager.CloseForm(false, 1500, AppHelper.MainForm);
|
||||
}
|
||||
void IObserver<string>.OnNext(string status) {
|
||||
if(DevExpress.XtraSplashScreen.SplashScreenManager.Default == null) {
|
||||
XtraSplashScreen.SplashScreenManager.ShowDefaultSplashScreen(AppHelper.MainForm, true, true, "DevExpress WinForms Controls", status);
|
||||
}
|
||||
else {
|
||||
XtraSplashScreen.SplashScreenManager.SetDefaultSplashScreenStatus(false, status);
|
||||
}
|
||||
}
|
||||
void IObserver<string>.OnError(Exception error) { throw error; }
|
||||
}
|
||||
class DataGenerationProgress : IObserver<string> {
|
||||
void IObserver<string>.OnNext(string status) {
|
||||
XtraSplashScreen.SplashScreenManager.SetDefaultSplashScreenStatus(false, status);
|
||||
}
|
||||
void IObserver<string>.OnCompleted() { }
|
||||
void IObserver<string>.OnError(Exception error) { throw error; }
|
||||
}
|
||||
//
|
||||
public class EntityEventArgs<TID> : EventArgs {
|
||||
TID entityKeyCore;
|
||||
public EntityEventArgs(TID entityKey) {
|
||||
this.entityKeyCore = entityKey;
|
||||
}
|
||||
public TID Key {
|
||||
get { return entityKeyCore; }
|
||||
}
|
||||
}
|
||||
public class EntitiesCountEventArgs : EventArgs {
|
||||
public EntitiesCountEventArgs(int count) {
|
||||
Count = count;
|
||||
}
|
||||
public int Count { get; private set; }
|
||||
}
|
||||
public class GroupEventArgs<TKey> : EventArgs {
|
||||
IEnumerable<TKey> keysCore;
|
||||
public GroupEventArgs(IEnumerable<TKey> keys) {
|
||||
this.keysCore = keys;
|
||||
}
|
||||
public IEnumerable<TKey> Entities {
|
||||
get { return keysCore; }
|
||||
}
|
||||
}
|
||||
public static class SVGHelper {
|
||||
public static Image CreateImageFromSvg(ISkinProvider skinProvider, string rootPath, string imageName) {
|
||||
var assembly = typeof(MainForm).Assembly;
|
||||
SvgBitmap svgBitmap;
|
||||
var stream = assembly.GetManifestResourceStream(rootPath + imageName);
|
||||
if(stream == null)
|
||||
stream = assembly.GetManifestResourceStream(imageName);
|
||||
if(stream == null) return null;
|
||||
using(stream) {
|
||||
svgBitmap = SvgBitmap.FromStream(stream);
|
||||
}
|
||||
if(svgBitmap == null) return null;
|
||||
var pallete = SvgPaletteHelper.GetSvgPalette(skinProvider, DevExpress.Utils.Drawing.ObjectState.Normal);
|
||||
return svgBitmap.Render(pallete, 1);
|
||||
}
|
||||
public static Image CreateImageFromSvg(ISkinProvider skinProvider, string rootPath, string imageName, Size imageSize) {
|
||||
var assembly = typeof(MainForm).Assembly;
|
||||
SvgBitmap svgBitmap;
|
||||
var stream = assembly.GetManifestResourceStream(rootPath + imageName);
|
||||
if(stream == null)
|
||||
stream = assembly.GetManifestResourceStream(imageName);
|
||||
if(stream == null) return null;
|
||||
using(stream) {
|
||||
svgBitmap = SvgBitmap.FromStream(stream);
|
||||
}
|
||||
if(svgBitmap == null) return null;
|
||||
var pallete = SvgPaletteHelper.GetSvgPalette(skinProvider, DevExpress.Utils.Drawing.ObjectState.Normal);
|
||||
return svgBitmap.Render(imageSize, pallete);
|
||||
}
|
||||
public static Dictionary<EmployeeTaskPriority, SvgImage> CreateTaskPriorityImages(ISkinProvider skinProvider, string rootPath) {
|
||||
var result = new Dictionary<EmployeeTaskPriority, SvgImage>();
|
||||
var asm = typeof(MainForm).Assembly;
|
||||
result.Add(EmployeeTaskPriority.Low, SvgImage.FromResources(String.Concat(rootPath, "PriorityLow.svg"), asm));
|
||||
result.Add(EmployeeTaskPriority.Normal, SvgImage.FromResources(String.Concat(rootPath, "PriorityNormal.svg"), asm));
|
||||
result.Add(EmployeeTaskPriority.High, SvgImage.FromResources(String.Concat(rootPath, "PriorityHigh.svg"), asm));
|
||||
result.Add(EmployeeTaskPriority.Urgent, SvgImage.FromResources(String.Concat(rootPath, "PriorityUrgent.svg"), asm));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
200
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/OverviewControl.Designer.cs
generated
Normal file
200
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/OverviewControl.Designer.cs
generated
Normal file
@@ -0,0 +1,200 @@
|
||||
namespace DevExpress.DevAV.Modules {
|
||||
partial class OverviewControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.buttonsPanel = new DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel();
|
||||
this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.logo = new DevExpress.XtraEditors.PictureEdit();
|
||||
this.layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.descriptionLabel = new DevExpress.XtraEditors.LabelControl();
|
||||
this.ItemForDescription = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.logo.Properties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).BeginInit();
|
||||
this.layoutControl1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForDescription)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// buttonsPanel
|
||||
//
|
||||
this.buttonsPanel.AllowGlyphSkinning = false;
|
||||
this.buttonsPanel.AppearanceButton.Hovered.Font = new System.Drawing.Font("Segoe UI", 11.25F);
|
||||
this.buttonsPanel.AppearanceButton.Hovered.Options.UseFont = true;
|
||||
this.buttonsPanel.AppearanceButton.Normal.Font = new System.Drawing.Font("Segoe UI", 11.25F);
|
||||
this.buttonsPanel.AppearanceButton.Normal.Options.UseFont = true;
|
||||
this.buttonsPanel.AppearanceButton.Pressed.Font = new System.Drawing.Font("Segoe UI", 11.25F);
|
||||
this.buttonsPanel.AppearanceButton.Pressed.Options.UseFont = true;
|
||||
this.buttonsPanel.ButtonInterval = 40;
|
||||
this.buttonsPanel.Buttons.AddRange(new DevExpress.XtraEditors.ButtonPanel.IBaseButton[] {
|
||||
new DevExpress.XtraBars.Docking2010.WindowsUIButton("Getting Started", global::DevExpress.DevAV.Properties.Resources.Overview_GettingStarted, -1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, -1),
|
||||
new DevExpress.XtraBars.Docking2010.WindowsUIButton("Free Support", global::DevExpress.DevAV.Properties.Resources.Overview_FreeSupport, -1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, -1),
|
||||
new DevExpress.XtraBars.Docking2010.WindowsUIButton("Buy Now", global::DevExpress.DevAV.Properties.Resources.Overview_Buy, -1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, -1)});
|
||||
this.buttonsPanel.Location = new System.Drawing.Point(24, 477);
|
||||
this.buttonsPanel.MaximumSize = new System.Drawing.Size(0, 128);
|
||||
this.buttonsPanel.MinimumSize = new System.Drawing.Size(0, 128);
|
||||
this.buttonsPanel.Name = "buttonsPanel";
|
||||
this.buttonsPanel.Size = new System.Drawing.Size(1032, 128);
|
||||
this.buttonsPanel.TabIndex = 3;
|
||||
this.buttonsPanel.UseButtonBackgroundImages = false;
|
||||
//
|
||||
// layoutControlGroup1
|
||||
//
|
||||
this.layoutControlGroup1.CustomizationFormText = "Root";
|
||||
this.layoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
|
||||
this.layoutControlGroup1.GroupBordersVisible = false;
|
||||
this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.ItemForDescription,
|
||||
this.layoutControlItem3});
|
||||
this.layoutControlGroup1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlGroup1.Name = "Root";
|
||||
this.layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(24, 24, 24, 24);
|
||||
this.layoutControlGroup1.Size = new System.Drawing.Size(1080, 710);
|
||||
this.layoutControlGroup1.Text = "Root";
|
||||
this.layoutControlGroup1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.logo;
|
||||
this.layoutControlItem1.ControlAlignment = System.Drawing.ContentAlignment.BottomRight;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 581);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(1032, 81);
|
||||
this.layoutControlItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.SupportHorzAlignment;
|
||||
this.layoutControlItem1.Text = "layoutControlItem1";
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextToControlDistance = 0;
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// logo
|
||||
//
|
||||
this.logo.EditValue = global::DevExpress.DevAV.Properties.Resources.Overview_Logo;
|
||||
this.logo.Location = new System.Drawing.Point(24, 605);
|
||||
this.logo.Name = "logo";
|
||||
this.logo.Properties.AllowFocused = false;
|
||||
this.logo.Properties.Appearance.BackColor = System.Drawing.Color.Transparent;
|
||||
this.logo.Properties.Appearance.Options.UseBackColor = true;
|
||||
this.logo.Properties.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
|
||||
this.logo.Properties.PictureAlignment = System.Drawing.ContentAlignment.BottomRight;
|
||||
this.logo.Properties.ShowMenu = false;
|
||||
this.logo.Size = new System.Drawing.Size(1032, 81);
|
||||
this.logo.StyleController = this.layoutControl1;
|
||||
this.logo.TabIndex = 16;
|
||||
//
|
||||
// layoutControl1
|
||||
//
|
||||
this.layoutControl1.AllowCustomization = false;
|
||||
this.layoutControl1.Controls.Add(this.buttonsPanel);
|
||||
this.layoutControl1.Controls.Add(this.descriptionLabel);
|
||||
this.layoutControl1.Controls.Add(this.logo);
|
||||
this.layoutControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.layoutControl1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControl1.Name = "layoutControl1";
|
||||
this.layoutControl1.Root = this.layoutControlGroup1;
|
||||
this.layoutControl1.Size = new System.Drawing.Size(1080, 710);
|
||||
this.layoutControl1.TabIndex = 2;
|
||||
this.layoutControl1.Text = "layoutControl1";
|
||||
//
|
||||
// descriptionLabel
|
||||
//
|
||||
this.descriptionLabel.AllowHtmlString = true;
|
||||
this.descriptionLabel.Appearance.Font = new System.Drawing.Font("Segoe UI Light", 18F);
|
||||
this.descriptionLabel.Appearance.Image = global::DevExpress.DevAV.Properties.Resources.Jolt_Logo;
|
||||
this.descriptionLabel.Appearance.ImageAlign = System.Drawing.ContentAlignment.TopRight;
|
||||
this.descriptionLabel.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
|
||||
this.descriptionLabel.Appearance.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center;
|
||||
this.descriptionLabel.Appearance.TextOptions.WordWrap = DevExpress.Utils.WordWrap.Wrap;
|
||||
this.descriptionLabel.AutoSizeMode = DevExpress.XtraEditors.LabelAutoSizeMode.None;
|
||||
this.descriptionLabel.Location = new System.Drawing.Point(24, 24);
|
||||
this.descriptionLabel.Name = "descriptionLabel";
|
||||
this.descriptionLabel.Size = new System.Drawing.Size(1032, 453);
|
||||
this.descriptionLabel.StyleController = this.layoutControl1;
|
||||
this.descriptionLabel.TabIndex = 16;
|
||||
this.descriptionLabel.Text = "UI SuperHero";
|
||||
//
|
||||
// ItemForDescription
|
||||
//
|
||||
this.ItemForDescription.Control = this.descriptionLabel;
|
||||
this.ItemForDescription.ControlAlignment = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.ItemForDescription.CustomizationFormText = "layoutControlItem2";
|
||||
this.ItemForDescription.Location = new System.Drawing.Point(0, 0);
|
||||
this.ItemForDescription.MinSize = new System.Drawing.Size(1, 1);
|
||||
this.ItemForDescription.Name = "layoutControlItem2";
|
||||
this.ItemForDescription.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.ItemForDescription.Size = new System.Drawing.Size(1032, 453);
|
||||
this.ItemForDescription.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
|
||||
this.ItemForDescription.Text = "layoutControlItem2";
|
||||
this.ItemForDescription.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.ItemForDescription.TextToControlDistance = 0;
|
||||
this.ItemForDescription.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem3
|
||||
//
|
||||
this.layoutControlItem3.Control = this.buttonsPanel;
|
||||
this.layoutControlItem3.CustomizationFormText = "layoutControlItem3";
|
||||
this.layoutControlItem3.Location = new System.Drawing.Point(0, 453);
|
||||
this.layoutControlItem3.Name = "layoutControlItem3";
|
||||
this.layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem3.Size = new System.Drawing.Size(1032, 128);
|
||||
this.layoutControlItem3.Text = "layoutControlItem3";
|
||||
this.layoutControlItem3.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem3.TextToControlDistance = 0;
|
||||
this.layoutControlItem3.TextVisible = false;
|
||||
//
|
||||
// OverviewControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.layoutControl1);
|
||||
this.Name = "OverviewControl";
|
||||
this.Size = new System.Drawing.Size(1080, 710);
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.logo.Properties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).EndInit();
|
||||
this.layoutControl1.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForDescription)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControlGroup layoutControlGroup1;
|
||||
private XtraLayout.LayoutControl layoutControl1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraEditors.PictureEdit logo;
|
||||
private XtraEditors.LabelControl descriptionLabel;
|
||||
private XtraLayout.LayoutControlItem ItemForDescription;
|
||||
private DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel buttonsPanel;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem3;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using DevExpress.DevAV.ViewModels;
|
||||
using DevExpress.XtraBars.Docking2010;
|
||||
using DevExpress.XtraEditors;
|
||||
|
||||
namespace DevExpress.DevAV.Modules {
|
||||
public partial class OverviewControl : XtraUserControl {
|
||||
public OverviewControl() {
|
||||
InitializeComponent();
|
||||
descriptionLabel.AutoSizeInLayoutControl = false;
|
||||
descriptionLabel.Text = "<image=#UISuperHero><br>"
|
||||
+ string.Format("<color=#{0:x6}><size=+24>Become a UI Superhero<br>", ColorHelper.TextColor.ToArgb())
|
||||
+ string.Format("<color=#{0:x6}><size=-18>And deliver compelling user-experiences on the WinForms platform<br>", ColorHelper.DisabledTextColor.ToArgb())
|
||||
+ "with award-winning DevExpress Controls and Libraries.";
|
||||
descriptionLabel.HyperlinkClick += descriptionLabel_HyperlinkClick;
|
||||
}
|
||||
void descriptionLabel_HyperlinkClick(object sender, Utils.HyperlinkClickEventArgs e) {
|
||||
viewModel.SelectedModuleType = ModuleType.Employees;
|
||||
var form = FindForm();
|
||||
if(form != null)
|
||||
form.Close();
|
||||
}
|
||||
MainViewModel viewModel;
|
||||
protected override void OnLoad(System.EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
if(viewModel == null && AppHelper.MainForm != null) {
|
||||
viewModel = (AppHelper.MainForm as ISupportViewModel).ViewModel as MainViewModel;
|
||||
if(viewModel != null)
|
||||
BindCommands();
|
||||
}
|
||||
}
|
||||
void BindCommands() {
|
||||
((WindowsUIButton)buttonsPanel.Buttons[0]).BindCommand(() => viewModel.GetStarted(), viewModel);
|
||||
((WindowsUIButton)buttonsPanel.Buttons[1]).BindCommand(() => viewModel.GetSupport(), viewModel);
|
||||
((WindowsUIButton)buttonsPanel.Buttons[2]).BindCommand(() => viewModel.BuyNow(), viewModel);
|
||||
}
|
||||
internal void SetDescription(string description) {
|
||||
descriptionLabel.Appearance.Image = null;
|
||||
descriptionLabel.Text = "<image=#UISuperHero><br>"
|
||||
+ string.Format("<color=#{0:x6}><size=+24>Become a UI Superhero<br>", ColorHelper.TextColor.ToArgb())
|
||||
+ string.Format("<color=#{0:x6}><size=-18>{1}", ColorHelper.DisabledTextColor.ToArgb(), description);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
188
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/Reports/ExportControl.Designer.cs
generated
Normal file
188
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/Reports/ExportControl.Designer.cs
generated
Normal file
@@ -0,0 +1,188 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class ReportExportControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.moduleLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.btnExport = new DevExpress.XtraEditors.DropDownButton();
|
||||
this.settingsPanel = new DevExpress.DevAV.SettingPanel();
|
||||
this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.captionLabelItem = new DevExpress.XtraLayout.SimpleLabelItem();
|
||||
this.ItemForSettings = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.separator = new DevExpress.XtraLayout.SimpleSeparator();
|
||||
this.ItemForButtonExport = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.buttonLabelItem = new DevExpress.XtraLayout.SimpleLabelItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.moduleLayout)).BeginInit();
|
||||
this.moduleLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.captionLabelItem)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForSettings)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.separator)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForButtonExport)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.buttonLabelItem)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// moduleLayout
|
||||
//
|
||||
this.moduleLayout.AllowCustomization = false;
|
||||
this.moduleLayout.Controls.Add(this.btnExport);
|
||||
this.moduleLayout.Controls.Add(this.settingsPanel);
|
||||
this.moduleLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.moduleLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.moduleLayout.Name = "moduleLayout";
|
||||
this.moduleLayout.Root = this.layoutControlGroup1;
|
||||
this.moduleLayout.Size = new System.Drawing.Size(310, 600);
|
||||
this.moduleLayout.TabIndex = 4;
|
||||
//
|
||||
// btnExport
|
||||
//
|
||||
this.btnExport.ImageLocation = DevExpress.XtraEditors.ImageLocation.TopCenter;
|
||||
this.btnExport.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnExport.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.Export.svg";
|
||||
this.btnExport.Location = new System.Drawing.Point(40, 89);
|
||||
this.btnExport.MaximumSize = new System.Drawing.Size(75, 75);
|
||||
this.btnExport.MinimumSize = new System.Drawing.Size(75, 75);
|
||||
this.btnExport.Name = "btnExport";
|
||||
this.btnExport.Size = new System.Drawing.Size(75, 75);
|
||||
this.btnExport.StyleController = this.moduleLayout;
|
||||
this.btnExport.TabIndex = 1;
|
||||
this.btnExport.Text = "Export";
|
||||
this.btnExport.Click += new System.EventHandler(this.btnExport_Click);
|
||||
//
|
||||
// settingsPanel
|
||||
//
|
||||
this.settingsPanel.Location = new System.Drawing.Point(40, 215);
|
||||
this.settingsPanel.Name = "settingsPanel";
|
||||
this.settingsPanel.Size = new System.Drawing.Size(228, 345);
|
||||
this.settingsPanel.TabIndex = 4;
|
||||
//
|
||||
// layoutControlGroup1
|
||||
//
|
||||
this.layoutControlGroup1.CustomizationFormText = "Root";
|
||||
this.layoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
|
||||
this.layoutControlGroup1.GroupBordersVisible = false;
|
||||
this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.captionLabelItem,
|
||||
this.ItemForSettings,
|
||||
this.separator,
|
||||
this.ItemForButtonExport,
|
||||
this.buttonLabelItem});
|
||||
this.layoutControlGroup1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlGroup1.Name = "Root";
|
||||
this.layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(40, 0, 0, 40);
|
||||
this.layoutControlGroup1.Size = new System.Drawing.Size(310, 600);
|
||||
//
|
||||
// captionLabelItem
|
||||
//
|
||||
this.captionLabelItem.AllowHotTrack = false;
|
||||
this.captionLabelItem.AppearanceItemCaption.Font = new System.Drawing.Font("Segoe UI", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.captionLabelItem.AppearanceItemCaption.Options.UseFont = true;
|
||||
this.captionLabelItem.CustomizationFormText = "Export";
|
||||
this.captionLabelItem.Location = new System.Drawing.Point(0, 0);
|
||||
this.captionLabelItem.Name = "captionLabelItem";
|
||||
this.captionLabelItem.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 24);
|
||||
this.captionLabelItem.Size = new System.Drawing.Size(228, 89);
|
||||
this.captionLabelItem.Text = "Export";
|
||||
this.captionLabelItem.TextSize = new System.Drawing.Size(138, 65);
|
||||
//
|
||||
// ItemForSettings
|
||||
//
|
||||
this.ItemForSettings.AppearanceItemCaption.Font = new System.Drawing.Font("Segoe UI", 18F);
|
||||
this.ItemForSettings.AppearanceItemCaption.Options.UseFont = true;
|
||||
this.ItemForSettings.Control = this.settingsPanel;
|
||||
this.ItemForSettings.CustomizationFormText = "Settings";
|
||||
this.ItemForSettings.Location = new System.Drawing.Point(0, 164);
|
||||
this.ItemForSettings.Name = "ItemForSettings";
|
||||
this.ItemForSettings.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 16, 0);
|
||||
this.ItemForSettings.Size = new System.Drawing.Size(228, 396);
|
||||
this.ItemForSettings.Text = "Settings";
|
||||
this.ItemForSettings.TextLocation = DevExpress.Utils.Locations.Top;
|
||||
this.ItemForSettings.TextSize = new System.Drawing.Size(138, 32);
|
||||
//
|
||||
// separator
|
||||
//
|
||||
this.separator.AllowHotTrack = false;
|
||||
this.separator.CustomizationFormText = "separator";
|
||||
this.separator.Location = new System.Drawing.Point(228, 0);
|
||||
this.separator.Name = "separator";
|
||||
this.separator.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.separator.Size = new System.Drawing.Size(42, 560);
|
||||
this.separator.Spacing = new DevExpress.XtraLayout.Utils.Padding(40, 0, 0, 0);
|
||||
//
|
||||
// ItemForButtonExport
|
||||
//
|
||||
this.ItemForButtonExport.Control = this.btnExport;
|
||||
this.ItemForButtonExport.CustomizationFormText = "ItemForButtonExport";
|
||||
this.ItemForButtonExport.Location = new System.Drawing.Point(0, 89);
|
||||
this.ItemForButtonExport.Name = "ItemForButtonExport";
|
||||
this.ItemForButtonExport.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.ItemForButtonExport.Size = new System.Drawing.Size(75, 75);
|
||||
this.ItemForButtonExport.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.ItemForButtonExport.TextVisible = false;
|
||||
//
|
||||
// buttonLabelItem
|
||||
//
|
||||
this.buttonLabelItem.AllowHotTrack = false;
|
||||
this.buttonLabelItem.AllowHtmlStringInCaption = true;
|
||||
this.buttonLabelItem.AppearanceItemCaption.Options.UseTextOptions = true;
|
||||
this.buttonLabelItem.AppearanceItemCaption.TextOptions.WordWrap = DevExpress.Utils.WordWrap.Wrap;
|
||||
this.buttonLabelItem.CustomizationFormText = "Specify how you want<br>the report to be printed";
|
||||
this.buttonLabelItem.Location = new System.Drawing.Point(75, 89);
|
||||
this.buttonLabelItem.Name = "buttonLabelItem";
|
||||
this.buttonLabelItem.Padding = new DevExpress.XtraLayout.Utils.Padding(12, 0, 0, 0);
|
||||
this.buttonLabelItem.Size = new System.Drawing.Size(153, 75);
|
||||
this.buttonLabelItem.Text = "The DevExpress Reporting<br>platform allows you to<br>export any report to<br>PDF" +
|
||||
", XLS, RTF and countless<br>image file formats.";
|
||||
this.buttonLabelItem.TextSize = new System.Drawing.Size(138, 65);
|
||||
//
|
||||
// ReportExportControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.moduleLayout);
|
||||
this.Name = "ReportExportControl";
|
||||
this.Size = new System.Drawing.Size(310, 600);
|
||||
((System.ComponentModel.ISupportInitialize)(this.moduleLayout)).EndInit();
|
||||
this.moduleLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.captionLabelItem)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForSettings)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.separator)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForButtonExport)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.buttonLabelItem)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl moduleLayout;
|
||||
private SettingPanel settingsPanel;
|
||||
private XtraEditors.DropDownButton btnExport;
|
||||
private XtraLayout.LayoutControlGroup layoutControlGroup1;
|
||||
private XtraLayout.SimpleLabelItem captionLabelItem;
|
||||
private XtraLayout.SimpleLabelItem buttonLabelItem;
|
||||
private XtraLayout.LayoutControlItem ItemForSettings;
|
||||
private XtraLayout.SimpleSeparator separator;
|
||||
private XtraLayout.LayoutControlItem ItemForButtonExport;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using DevExpress.Utils.Menu;
|
||||
using DevExpress.XtraEditors;
|
||||
using DevExpress.XtraLayout.Utils;
|
||||
using DevExpress.XtraPrinting;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class ReportExportControl : XtraUserControl {
|
||||
DXPopupMenu menuExport;
|
||||
public ReportExportControl() {
|
||||
InitializeComponent();
|
||||
SelectedExport = ExportTarget.Pdf;
|
||||
menuExport = new DXPopupMenu();
|
||||
AddExportTarget(ExportTarget.Pdf);
|
||||
AddExportTarget(ExportTarget.Html);
|
||||
AddExportTarget(ExportTarget.Mht);
|
||||
AddExportTarget(ExportTarget.Rtf);
|
||||
AddExportTarget(ExportTarget.Xls);
|
||||
AddExportTarget(ExportTarget.Xlsx);
|
||||
AddExportTarget(ExportTarget.Csv);
|
||||
AddExportTarget(ExportTarget.Text);
|
||||
AddExportTarget(ExportTarget.Image);
|
||||
btnExport.DropDownControl = menuExport;
|
||||
menuExport.BeforePopup += menuExport_BeforePopup;
|
||||
moduleLayout.BackColor = ColorHelper.GetControlColor(LookAndFeel);
|
||||
LookAndFeel.StyleChanged += LookAndFeel_StyleChanged;
|
||||
}
|
||||
void LookAndFeel_StyleChanged(object sender, EventArgs e) {
|
||||
moduleLayout.BackColor = ColorHelper.GetControlColor(LookAndFeel);
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
btnExport.MenuManager = MenuManagerHelper.FindMenuManager(AppHelper.MainForm);
|
||||
}
|
||||
void menuExport_BeforePopup(object sender, EventArgs e) {
|
||||
foreach(DXMenuCheckItem item in menuExport.Items)
|
||||
item.Checked = object.Equals(item.Tag, SelectedExport);
|
||||
}
|
||||
void AddExportTarget(ExportTarget target) {
|
||||
var exportItem = new DXMenuCheckItem()
|
||||
{
|
||||
Caption = target.ToString(),
|
||||
Tag = target
|
||||
};
|
||||
menuExport.Items.Add(exportItem);
|
||||
exportItem.Click += exportItem_Click;
|
||||
}
|
||||
void exportItem_Click(object sender, EventArgs e) {
|
||||
SelectedExport = (ExportTarget)((DXMenuItem)sender).Tag;
|
||||
}
|
||||
public void SetSettings(Control control) {
|
||||
for(int i = settingsPanel.Controls.Count - 1; i >= 0; i--)
|
||||
settingsPanel.Controls[i].Dispose();
|
||||
if(control != null) {
|
||||
control.Dock = DockStyle.Fill;
|
||||
control.Parent = settingsPanel;
|
||||
}
|
||||
}
|
||||
public bool ExportEnabled {
|
||||
set { btnExport.Enabled = value; }
|
||||
}
|
||||
public ExportTarget SelectedExport {
|
||||
get;
|
||||
set;
|
||||
}
|
||||
public event EventHandler ExportClick;
|
||||
void RaiseExportClick() {
|
||||
if(ExportClick != null)
|
||||
ExportClick(this, EventArgs.Empty);
|
||||
}
|
||||
void btnExport_Click(object sender, EventArgs e) {
|
||||
RaiseExportClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
318
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/Reports/PreviewControl.Designer.cs
generated
Normal file
318
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/Reports/PreviewControl.Designer.cs
generated
Normal file
@@ -0,0 +1,318 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class ReportPreviewControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ReportPreviewControl));
|
||||
this.documentViewerCore = new DevExpress.XtraPrinting.Preview.DocumentViewer();
|
||||
this.documentViewerBarManager1 = new DevExpress.XtraPrinting.Preview.DocumentViewerBarManager(this.components);
|
||||
this.previewBar1 = new DevExpress.XtraPrinting.Preview.PreviewBar();
|
||||
this.printPreviewBarItem18 = new DevExpress.XtraPrinting.Preview.PrintPreviewBarItem();
|
||||
this.printPreviewStaticItem1 = new DevExpress.XtraPrinting.Preview.PrintPreviewStaticItem();
|
||||
this.printPreviewBarItem19 = new DevExpress.XtraPrinting.Preview.PrintPreviewBarItem();
|
||||
this.progressBarEditItem1 = new DevExpress.XtraPrinting.Preview.ProgressBarEditItem();
|
||||
this.repositoryItemProgressBar1 = new DevExpress.XtraEditors.Repository.RepositoryItemProgressBar();
|
||||
this.printPreviewBarItem1 = new DevExpress.XtraPrinting.Preview.PrintPreviewBarItem();
|
||||
this.printPreviewStaticItem2 = new DevExpress.XtraPrinting.Preview.PrintPreviewStaticItem();
|
||||
this.zoomTrackBarEditItem1 = new DevExpress.XtraPrinting.Preview.ZoomTrackBarEditItem();
|
||||
this.repositoryItemZoomTrackBar1 = new DevExpress.XtraEditors.Repository.RepositoryItemZoomTrackBar();
|
||||
this.printPreviewBarItemWholePage = new DevExpress.XtraPrinting.Preview.PrintPreviewBarItem();
|
||||
this.printPreviewBarItemMultiplePages = new DevExpress.XtraPrinting.Preview.PrintPreviewBarItem();
|
||||
this.printPreviewBarItemScale = new DevExpress.XtraPrinting.Preview.PrintPreviewBarItem();
|
||||
this.barDockControlTop = new DevExpress.XtraBars.BarDockControl();
|
||||
this.barDockControlBottom = new DevExpress.XtraBars.BarDockControl();
|
||||
this.barDockControlLeft = new DevExpress.XtraBars.BarDockControl();
|
||||
this.barDockControlRight = new DevExpress.XtraBars.BarDockControl();
|
||||
this.printPreviewRepositoryItemComboBox1 = new DevExpress.XtraPrinting.Preview.PrintPreviewRepositoryItemComboBox();
|
||||
((System.ComponentModel.ISupportInitialize)(this.documentViewerBarManager1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.repositoryItemProgressBar1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.repositoryItemZoomTrackBar1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.printPreviewRepositoryItemComboBox1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// documentViewer
|
||||
//
|
||||
this.documentViewerCore.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.documentViewerCore.IsMetric = false;
|
||||
this.documentViewerCore.Location = new System.Drawing.Point(0, 0);
|
||||
this.documentViewerCore.Name = "documentViewer";
|
||||
this.documentViewerCore.Size = new System.Drawing.Size(1045, 553);
|
||||
this.documentViewerCore.TabIndex = 0;
|
||||
//
|
||||
// documentViewerBarManager1
|
||||
//
|
||||
this.documentViewerBarManager1.Bars.AddRange(new DevExpress.XtraBars.Bar[] {
|
||||
this.previewBar1});
|
||||
this.documentViewerBarManager1.DockControls.Add(this.barDockControlTop);
|
||||
this.documentViewerBarManager1.DockControls.Add(this.barDockControlBottom);
|
||||
this.documentViewerBarManager1.DockControls.Add(this.barDockControlLeft);
|
||||
this.documentViewerBarManager1.DockControls.Add(this.barDockControlRight);
|
||||
this.documentViewerBarManager1.DocumentViewer = this.documentViewerCore;
|
||||
this.documentViewerBarManager1.Form = this;
|
||||
//this.documentViewerBarManager1.ImageStream = ((DevExpress.Utils.ImageCollectionStreamer)(resources.GetObject("documentViewerBarManager1.ImageStream")));
|
||||
this.documentViewerBarManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] {
|
||||
this.printPreviewStaticItem1,
|
||||
this.progressBarEditItem1,
|
||||
this.printPreviewBarItem1,
|
||||
this.printPreviewStaticItem2,
|
||||
this.zoomTrackBarEditItem1,
|
||||
this.printPreviewBarItemScale,
|
||||
this.printPreviewBarItem18,
|
||||
this.printPreviewBarItem19,
|
||||
this.printPreviewBarItemMultiplePages,
|
||||
this.printPreviewBarItemWholePage});
|
||||
this.documentViewerBarManager1.MaxItemId = 57;
|
||||
this.documentViewerBarManager1.PreviewBar = this.previewBar1;
|
||||
this.documentViewerBarManager1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] {
|
||||
this.repositoryItemProgressBar1,
|
||||
this.repositoryItemZoomTrackBar1,
|
||||
this.printPreviewRepositoryItemComboBox1});
|
||||
this.documentViewerBarManager1.TransparentEditors = true;
|
||||
//
|
||||
// previewBar1
|
||||
//
|
||||
this.previewBar1.BarName = "Toolbar";
|
||||
this.previewBar1.CanDockStyle = DevExpress.XtraBars.BarCanDockStyle.Bottom;
|
||||
this.previewBar1.DockCol = 0;
|
||||
this.previewBar1.DockRow = 0;
|
||||
this.previewBar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Bottom;
|
||||
this.previewBar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] {
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewBarItem18),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewStaticItem1),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewBarItem19),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.progressBarEditItem1),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewBarItem1),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewStaticItem2, true),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.zoomTrackBarEditItem1),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewBarItemWholePage, true),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewBarItemMultiplePages),
|
||||
new DevExpress.XtraBars.LinkPersistInfo(this.printPreviewBarItemScale)});
|
||||
this.previewBar1.OptionsBar.AllowQuickCustomization = false;
|
||||
this.previewBar1.OptionsBar.DrawBorder = false;
|
||||
this.previewBar1.OptionsBar.DrawDragBorder = false;
|
||||
this.previewBar1.OptionsBar.UseWholeRow = true;
|
||||
this.previewBar1.Text = "Toolbar";
|
||||
//
|
||||
// printPreviewBarItem18
|
||||
//
|
||||
this.printPreviewBarItem18.Caption = "Previous Page";
|
||||
this.printPreviewBarItem18.Command = DevExpress.XtraPrinting.PrintingSystemCommand.ShowPrevPage;
|
||||
this.printPreviewBarItem18.Enabled = false;
|
||||
this.printPreviewBarItem18.Glyph = global::DevExpress.DevAV.Properties.Resources.icon_page_prev_16;
|
||||
this.printPreviewBarItem18.Hint = "Previous Page";
|
||||
this.printPreviewBarItem18.Id = 24;
|
||||
this.printPreviewBarItem18.Name = "printPreviewBarItem18";
|
||||
//
|
||||
// printPreviewStaticItem1
|
||||
//
|
||||
this.printPreviewStaticItem1.Border = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
|
||||
this.printPreviewStaticItem1.Caption = "Nothing";
|
||||
this.printPreviewStaticItem1.Id = 0;
|
||||
this.printPreviewStaticItem1.LeftIndent = 1;
|
||||
this.printPreviewStaticItem1.Name = "printPreviewStaticItem1";
|
||||
this.printPreviewStaticItem1.RightIndent = 1;
|
||||
this.printPreviewStaticItem1.TextAlignment = System.Drawing.StringAlignment.Near;
|
||||
this.printPreviewStaticItem1.Type = "PageOfPages";
|
||||
//
|
||||
// printPreviewBarItem19
|
||||
//
|
||||
this.printPreviewBarItem19.Caption = "Next Page";
|
||||
this.printPreviewBarItem19.Command = DevExpress.XtraPrinting.PrintingSystemCommand.ShowNextPage;
|
||||
this.printPreviewBarItem19.Enabled = false;
|
||||
this.printPreviewBarItem19.Glyph = global::DevExpress.DevAV.Properties.Resources.icon_page_next_16;
|
||||
this.printPreviewBarItem19.Hint = "Next Page";
|
||||
this.printPreviewBarItem19.Id = 25;
|
||||
this.printPreviewBarItem19.Name = "printPreviewBarItem19";
|
||||
//
|
||||
// progressBarEditItem1
|
||||
//
|
||||
this.progressBarEditItem1.Edit = this.repositoryItemProgressBar1;
|
||||
this.progressBarEditItem1.EditHeight = 12;
|
||||
this.progressBarEditItem1.Id = 2;
|
||||
this.progressBarEditItem1.Name = "progressBarEditItem1";
|
||||
this.progressBarEditItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
|
||||
this.progressBarEditItem1.Width = 150;
|
||||
//
|
||||
// repositoryItemProgressBar1
|
||||
//
|
||||
this.repositoryItemProgressBar1.Name = "repositoryItemProgressBar1";
|
||||
//
|
||||
// printPreviewBarItem1
|
||||
//
|
||||
this.printPreviewBarItem1.Caption = "Stop";
|
||||
this.printPreviewBarItem1.Command = DevExpress.XtraPrinting.PrintingSystemCommand.StopPageBuilding;
|
||||
this.printPreviewBarItem1.Enabled = false;
|
||||
this.printPreviewBarItem1.Hint = "Stop";
|
||||
this.printPreviewBarItem1.Id = 3;
|
||||
this.printPreviewBarItem1.Name = "printPreviewBarItem1";
|
||||
this.printPreviewBarItem1.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
|
||||
//
|
||||
// printPreviewStaticItem2
|
||||
//
|
||||
this.printPreviewStaticItem2.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
|
||||
this.printPreviewStaticItem2.Border = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
|
||||
this.printPreviewStaticItem2.Caption = "100%";
|
||||
this.printPreviewStaticItem2.Id = 5;
|
||||
this.printPreviewStaticItem2.Name = "printPreviewStaticItem2";
|
||||
this.printPreviewStaticItem2.TextAlignment = System.Drawing.StringAlignment.Far;
|
||||
this.printPreviewStaticItem2.Type = "ZoomFactor";
|
||||
//
|
||||
// zoomTrackBarEditItem1
|
||||
//
|
||||
this.zoomTrackBarEditItem1.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
|
||||
this.zoomTrackBarEditItem1.Edit = this.repositoryItemZoomTrackBar1;
|
||||
this.zoomTrackBarEditItem1.EditValue = 90;
|
||||
this.zoomTrackBarEditItem1.Enabled = false;
|
||||
this.zoomTrackBarEditItem1.Id = 6;
|
||||
this.zoomTrackBarEditItem1.Name = "zoomTrackBarEditItem1";
|
||||
this.zoomTrackBarEditItem1.Range = new int[] {
|
||||
10,
|
||||
500};
|
||||
this.zoomTrackBarEditItem1.Width = 140;
|
||||
//
|
||||
// repositoryItemZoomTrackBar1
|
||||
//
|
||||
this.repositoryItemZoomTrackBar1.Alignment = DevExpress.Utils.VertAlignment.Center;
|
||||
this.repositoryItemZoomTrackBar1.AllowFocused = false;
|
||||
this.repositoryItemZoomTrackBar1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
|
||||
this.repositoryItemZoomTrackBar1.Maximum = 180;
|
||||
this.repositoryItemZoomTrackBar1.Middle = 5;
|
||||
this.repositoryItemZoomTrackBar1.Name = "repositoryItemZoomTrackBar1";
|
||||
this.repositoryItemZoomTrackBar1.ScrollThumbStyle = DevExpress.XtraEditors.Repository.ScrollThumbStyle.ArrowDownRight;
|
||||
//
|
||||
// printPreviewBarItemWholePage
|
||||
//
|
||||
this.printPreviewBarItemWholePage.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
|
||||
this.printPreviewBarItemWholePage.Caption = "Fit To Page";
|
||||
this.printPreviewBarItemWholePage.Command = DevExpress.XtraPrinting.PrintingSystemCommand.ZoomToWholePage;
|
||||
this.printPreviewBarItemWholePage.Enabled = false;
|
||||
this.printPreviewBarItemWholePage.Glyph = global::DevExpress.DevAV.Properties.Resources.icon_fittopage_16;
|
||||
this.printPreviewBarItemWholePage.Hint = "Fit to Page";
|
||||
this.printPreviewBarItemWholePage.Id = 27;
|
||||
this.printPreviewBarItemWholePage.Name = "printPreviewBarItemWholePage";
|
||||
//
|
||||
// printPreviewBarItemMultiplePages
|
||||
//
|
||||
this.printPreviewBarItemMultiplePages.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
|
||||
this.printPreviewBarItemMultiplePages.ButtonStyle = DevExpress.XtraBars.BarButtonStyle.DropDown;
|
||||
this.printPreviewBarItemMultiplePages.Caption = "Multiple Pages";
|
||||
this.printPreviewBarItemMultiplePages.Command = DevExpress.XtraPrinting.PrintingSystemCommand.MultiplePages;
|
||||
this.printPreviewBarItemMultiplePages.Enabled = false;
|
||||
this.printPreviewBarItemMultiplePages.Glyph = global::DevExpress.DevAV.Properties.Resources.icon_pages_16;
|
||||
this.printPreviewBarItemMultiplePages.Hint = "Multiple Pages";
|
||||
this.printPreviewBarItemMultiplePages.Id = 27;
|
||||
this.printPreviewBarItemMultiplePages.Name = "printPreviewBarItemMultiplePages";
|
||||
//
|
||||
// printPreviewBarItemScale
|
||||
//
|
||||
this.printPreviewBarItemScale.ActAsDropDown = true;
|
||||
this.printPreviewBarItemScale.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
|
||||
this.printPreviewBarItemScale.ButtonStyle = DevExpress.XtraBars.BarButtonStyle.DropDown;
|
||||
this.printPreviewBarItemScale.Caption = "Scale";
|
||||
this.printPreviewBarItemScale.Command = DevExpress.XtraPrinting.PrintingSystemCommand.Scale;
|
||||
this.printPreviewBarItemScale.Enabled = false;
|
||||
this.printPreviewBarItemScale.Hint = "Scale";
|
||||
this.printPreviewBarItemScale.Id = 17;
|
||||
this.printPreviewBarItemScale.ImageIndex = 25;
|
||||
this.printPreviewBarItemScale.Name = "printPreviewBarItemScale";
|
||||
//
|
||||
// barDockControlTop
|
||||
//
|
||||
this.barDockControlTop.CausesValidation = false;
|
||||
this.barDockControlTop.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.barDockControlTop.Location = new System.Drawing.Point(0, 0);
|
||||
this.barDockControlTop.Size = new System.Drawing.Size(1045, 0);
|
||||
//
|
||||
// barDockControlBottom
|
||||
//
|
||||
this.barDockControlBottom.CausesValidation = false;
|
||||
this.barDockControlBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
|
||||
this.barDockControlBottom.Location = new System.Drawing.Point(0, 553);
|
||||
this.barDockControlBottom.Size = new System.Drawing.Size(1045, 31);
|
||||
//
|
||||
// barDockControlLeft
|
||||
//
|
||||
this.barDockControlLeft.CausesValidation = false;
|
||||
this.barDockControlLeft.Dock = System.Windows.Forms.DockStyle.Left;
|
||||
this.barDockControlLeft.Location = new System.Drawing.Point(0, 0);
|
||||
this.barDockControlLeft.Size = new System.Drawing.Size(0, 553);
|
||||
//
|
||||
// barDockControlRight
|
||||
//
|
||||
this.barDockControlRight.CausesValidation = false;
|
||||
this.barDockControlRight.Dock = System.Windows.Forms.DockStyle.Right;
|
||||
this.barDockControlRight.Location = new System.Drawing.Point(1045, 0);
|
||||
this.barDockControlRight.Size = new System.Drawing.Size(0, 553);
|
||||
//
|
||||
// printPreviewRepositoryItemComboBox1
|
||||
//
|
||||
this.printPreviewRepositoryItemComboBox1.AutoComplete = false;
|
||||
this.printPreviewRepositoryItemComboBox1.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.printPreviewRepositoryItemComboBox1.DropDownRows = 11;
|
||||
this.printPreviewRepositoryItemComboBox1.Name = "printPreviewRepositoryItemComboBox1";
|
||||
//
|
||||
// ReportPreviewControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.documentViewerCore);
|
||||
this.Controls.Add(this.barDockControlLeft);
|
||||
this.Controls.Add(this.barDockControlRight);
|
||||
this.Controls.Add(this.barDockControlBottom);
|
||||
this.Controls.Add(this.barDockControlTop);
|
||||
this.Name = "ReportPreviewControl";
|
||||
this.Size = new System.Drawing.Size(1045, 584);
|
||||
((System.ComponentModel.ISupportInitialize)(this.documentViewerBarManager1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.repositoryItemProgressBar1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.repositoryItemZoomTrackBar1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.printPreviewRepositoryItemComboBox1)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraPrinting.Preview.DocumentViewer documentViewerCore;
|
||||
private XtraPrinting.Preview.DocumentViewerBarManager documentViewerBarManager1;
|
||||
private XtraPrinting.Preview.PreviewBar previewBar1;
|
||||
private XtraPrinting.Preview.PrintPreviewBarItem printPreviewBarItem18;
|
||||
private XtraPrinting.Preview.PrintPreviewStaticItem printPreviewStaticItem1;
|
||||
private XtraPrinting.Preview.PrintPreviewBarItem printPreviewBarItem19;
|
||||
private XtraPrinting.Preview.ProgressBarEditItem progressBarEditItem1;
|
||||
private XtraEditors.Repository.RepositoryItemProgressBar repositoryItemProgressBar1;
|
||||
private XtraPrinting.Preview.PrintPreviewBarItem printPreviewBarItem1;
|
||||
private XtraPrinting.Preview.PrintPreviewStaticItem printPreviewStaticItem2;
|
||||
private XtraPrinting.Preview.ZoomTrackBarEditItem zoomTrackBarEditItem1;
|
||||
private XtraEditors.Repository.RepositoryItemZoomTrackBar repositoryItemZoomTrackBar1;
|
||||
private XtraPrinting.Preview.PrintPreviewBarItem printPreviewBarItemWholePage;
|
||||
private XtraPrinting.Preview.PrintPreviewBarItem printPreviewBarItemScale;
|
||||
private XtraPrinting.Preview.PrintPreviewBarItem printPreviewBarItemMultiplePages;
|
||||
private XtraBars.BarDockControl barDockControlTop;
|
||||
private XtraBars.BarDockControl barDockControlBottom;
|
||||
private XtraBars.BarDockControl barDockControlLeft;
|
||||
private XtraBars.BarDockControl barDockControlRight;
|
||||
private XtraPrinting.Preview.PrintPreviewRepositoryItemComboBox printPreviewRepositoryItemComboBox1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using DevExpress.XtraEditors;
|
||||
using DevExpress.XtraPrinting.Preview;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class ReportPreviewControl : XtraUserControl {
|
||||
public ReportPreviewControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public DocumentViewer DocumentViewer {
|
||||
get { return documentViewerCore; }
|
||||
}
|
||||
protected override void OnLoad(System.EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
DocumentViewer.BackColor = ColorHelper.GetControlColor(LookAndFeel);
|
||||
LookAndFeel.StyleChanged += LookAndFeel_StyleChanged;
|
||||
}
|
||||
void LookAndFeel_StyleChanged(object sender, EventArgs e) {
|
||||
DocumentViewer.BackColor = ColorHelper.GetControlColor(LookAndFeel);
|
||||
}
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false)]
|
||||
public object DocumentSource {
|
||||
get { return documentViewerCore.DocumentSource; }
|
||||
set {
|
||||
if(!ReferenceEquals(documentViewerCore.DocumentSource, value)) {
|
||||
documentViewerCore.DocumentSource = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="documentViewerBarManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
280
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/Reports/PrintControl.Designer.cs
generated
Normal file
280
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/Reports/PrintControl.Designer.cs
generated
Normal file
@@ -0,0 +1,280 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class ReportPrintControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
|
||||
if(imagesContainer != null) {
|
||||
imagesContainer.Dispose();
|
||||
imagesContainer = null;
|
||||
}
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.moduleLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.settingsPanel = new DevExpress.DevAV.SettingPanel();
|
||||
this.btnPrint = new DevExpress.XtraEditors.SimpleButton();
|
||||
this.btnOptions = new DevExpress.XtraEditors.SimpleButton();
|
||||
this.cbPrinters = new DevExpress.XtraEditors.ImageComboBoxEdit();
|
||||
this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.ItemForButtonPrint = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.ItemForPrinters = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.ItemForOptions = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
|
||||
this.captionLabelItem = new DevExpress.XtraLayout.SimpleLabelItem();
|
||||
this.buttonLabelItem = new DevExpress.XtraLayout.SimpleLabelItem();
|
||||
this.separator = new DevExpress.XtraLayout.SimpleSeparator();
|
||||
this.ItemForSettings = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.moduleLayout)).BeginInit();
|
||||
this.moduleLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.cbPrinters.Properties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForButtonPrint)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForPrinters)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForOptions)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.captionLabelItem)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.buttonLabelItem)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.separator)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForSettings)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// moduleLayout
|
||||
//
|
||||
this.moduleLayout.AllowCustomization = false;
|
||||
this.moduleLayout.Controls.Add(this.settingsPanel);
|
||||
this.moduleLayout.Controls.Add(this.btnPrint);
|
||||
this.moduleLayout.Controls.Add(this.btnOptions);
|
||||
this.moduleLayout.Controls.Add(this.cbPrinters);
|
||||
this.moduleLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.moduleLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.moduleLayout.Name = "moduleLayout";
|
||||
this.moduleLayout.Root = this.layoutControlGroup1;
|
||||
this.moduleLayout.Size = new System.Drawing.Size(310, 600);
|
||||
this.moduleLayout.TabIndex = 0;
|
||||
//
|
||||
// settingsPanel
|
||||
//
|
||||
this.settingsPanel.Location = new System.Drawing.Point(40, 318);
|
||||
this.settingsPanel.Name = "settingsPanel";
|
||||
this.settingsPanel.Size = new System.Drawing.Size(228, 242);
|
||||
this.settingsPanel.TabIndex = 4;
|
||||
//
|
||||
// btnPrint
|
||||
//
|
||||
this.btnPrint.Enabled = false;
|
||||
this.btnPrint.Image = global::DevExpress.DevAV.Properties.Resources.icon_print_42x40;
|
||||
this.btnPrint.ImageLocation = DevExpress.XtraEditors.ImageLocation.TopCenter;
|
||||
this.btnPrint.Location = new System.Drawing.Point(40, 89);
|
||||
this.btnPrint.MaximumSize = new System.Drawing.Size(75, 75);
|
||||
this.btnPrint.MinimumSize = new System.Drawing.Size(75, 75);
|
||||
this.btnPrint.Name = "btnPrint";
|
||||
this.btnPrint.Size = new System.Drawing.Size(75, 75);
|
||||
this.btnPrint.StyleController = this.moduleLayout;
|
||||
this.btnPrint.TabIndex = 1;
|
||||
this.btnPrint.Text = "Print";
|
||||
this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
|
||||
//
|
||||
// btnOptions
|
||||
//
|
||||
this.btnOptions.Enabled = false;
|
||||
this.btnOptions.Location = new System.Drawing.Point(40, 245);
|
||||
this.btnOptions.Name = "btnOptions";
|
||||
this.btnOptions.Size = new System.Drawing.Size(112, 22);
|
||||
this.btnOptions.StyleController = this.moduleLayout;
|
||||
this.btnOptions.TabIndex = 3;
|
||||
this.btnOptions.Text = "Print Options";
|
||||
this.btnOptions.Click += new System.EventHandler(this.btnOptions_Click);
|
||||
//
|
||||
// cbPrinters
|
||||
//
|
||||
this.cbPrinters.Location = new System.Drawing.Point(40, 217);
|
||||
this.cbPrinters.Name = "cbPrinters";
|
||||
this.cbPrinters.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.cbPrinters.Size = new System.Drawing.Size(228, 20);
|
||||
this.cbPrinters.StyleController = this.moduleLayout;
|
||||
this.cbPrinters.TabIndex = 2;
|
||||
//
|
||||
// layoutControlGroup1
|
||||
//
|
||||
this.layoutControlGroup1.CustomizationFormText = "Root";
|
||||
this.layoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
|
||||
this.layoutControlGroup1.GroupBordersVisible = false;
|
||||
this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.ItemForButtonPrint,
|
||||
this.ItemForPrinters,
|
||||
this.ItemForOptions,
|
||||
this.emptySpaceItem1,
|
||||
this.captionLabelItem,
|
||||
this.buttonLabelItem,
|
||||
this.separator,
|
||||
this.ItemForSettings});
|
||||
this.layoutControlGroup1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlGroup1.Name = "Root";
|
||||
this.layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(40, 0, 0, 40);
|
||||
this.layoutControlGroup1.Size = new System.Drawing.Size(310, 600);
|
||||
this.layoutControlGroup1.Text = "Root";
|
||||
//
|
||||
// ItemForButtonPrint
|
||||
//
|
||||
this.ItemForButtonPrint.Control = this.btnPrint;
|
||||
this.ItemForButtonPrint.CustomizationFormText = "Print";
|
||||
this.ItemForButtonPrint.Location = new System.Drawing.Point(0, 89);
|
||||
this.ItemForButtonPrint.Name = "layoutControlItem1";
|
||||
this.ItemForButtonPrint.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.ItemForButtonPrint.Size = new System.Drawing.Size(75, 75);
|
||||
this.ItemForButtonPrint.Text = "Print";
|
||||
this.ItemForButtonPrint.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.ItemForButtonPrint.TextToControlDistance = 0;
|
||||
this.ItemForButtonPrint.TextVisible = false;
|
||||
//
|
||||
// ItemForPrinters
|
||||
//
|
||||
this.ItemForPrinters.AppearanceItemCaption.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.ItemForPrinters.AppearanceItemCaption.Options.UseFont = true;
|
||||
this.ItemForPrinters.Control = this.cbPrinters;
|
||||
this.ItemForPrinters.CustomizationFormText = "Printer";
|
||||
this.ItemForPrinters.Location = new System.Drawing.Point(0, 164);
|
||||
this.ItemForPrinters.Name = "Printer";
|
||||
this.ItemForPrinters.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 16, 8);
|
||||
this.ItemForPrinters.Size = new System.Drawing.Size(228, 81);
|
||||
this.ItemForPrinters.Text = "Printer";
|
||||
this.ItemForPrinters.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
|
||||
this.ItemForPrinters.TextLocation = DevExpress.Utils.Locations.Top;
|
||||
this.ItemForPrinters.TextSize = new System.Drawing.Size(70, 32);
|
||||
this.ItemForPrinters.TextToControlDistance = 5;
|
||||
//
|
||||
// ItemForOptions
|
||||
//
|
||||
this.ItemForOptions.Control = this.btnOptions;
|
||||
this.ItemForOptions.CustomizationFormText = "layoutControlItem3";
|
||||
this.ItemForOptions.Location = new System.Drawing.Point(0, 245);
|
||||
this.ItemForOptions.Name = "layoutControlItem3";
|
||||
this.ItemForOptions.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.ItemForOptions.Size = new System.Drawing.Size(112, 22);
|
||||
this.ItemForOptions.Text = "layoutControlItem3";
|
||||
this.ItemForOptions.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.ItemForOptions.TextToControlDistance = 0;
|
||||
this.ItemForOptions.TextVisible = false;
|
||||
//
|
||||
// emptySpaceItem1
|
||||
//
|
||||
this.emptySpaceItem1.AllowHotTrack = false;
|
||||
this.emptySpaceItem1.CustomizationFormText = "emptySpaceItem1";
|
||||
this.emptySpaceItem1.Location = new System.Drawing.Point(112, 245);
|
||||
this.emptySpaceItem1.Name = "emptySpaceItem1";
|
||||
this.emptySpaceItem1.Size = new System.Drawing.Size(116, 22);
|
||||
this.emptySpaceItem1.Text = "emptySpaceItem1";
|
||||
this.emptySpaceItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
//
|
||||
// captionLabelItem
|
||||
//
|
||||
this.captionLabelItem.AllowHotTrack = false;
|
||||
this.captionLabelItem.AppearanceItemCaption.Font = new System.Drawing.Font("Segoe UI", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.captionLabelItem.AppearanceItemCaption.Options.UseFont = true;
|
||||
this.captionLabelItem.CustomizationFormText = "Print";
|
||||
this.captionLabelItem.Location = new System.Drawing.Point(0, 0);
|
||||
this.captionLabelItem.Name = "simpleLabelItem1";
|
||||
this.captionLabelItem.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 24);
|
||||
this.captionLabelItem.Size = new System.Drawing.Size(228, 89);
|
||||
this.captionLabelItem.Text = "Print";
|
||||
this.captionLabelItem.TextSize = new System.Drawing.Size(114, 65);
|
||||
//
|
||||
// buttonLabelItem
|
||||
//
|
||||
this.buttonLabelItem.AllowHotTrack = false;
|
||||
this.buttonLabelItem.AllowHtmlStringInCaption = true;
|
||||
this.buttonLabelItem.AppearanceItemCaption.Options.UseTextOptions = true;
|
||||
this.buttonLabelItem.AppearanceItemCaption.TextOptions.WordWrap = DevExpress.Utils.WordWrap.Wrap;
|
||||
this.buttonLabelItem.CustomizationFormText = "Specify how you want<br>the report to be printed";
|
||||
this.buttonLabelItem.Location = new System.Drawing.Point(75, 89);
|
||||
this.buttonLabelItem.Name = "simpleLabelItem2";
|
||||
this.buttonLabelItem.Padding = new DevExpress.XtraLayout.Utils.Padding(12, 0, 0, 0);
|
||||
this.buttonLabelItem.Size = new System.Drawing.Size(153, 75);
|
||||
this.buttonLabelItem.Text = "Specify how you want<br>the report to be printed";
|
||||
this.buttonLabelItem.TextSize = new System.Drawing.Size(114, 26);
|
||||
//
|
||||
// separator
|
||||
//
|
||||
this.separator.AllowHotTrack = false;
|
||||
this.separator.CustomizationFormText = "simpleSeparator1";
|
||||
this.separator.Location = new System.Drawing.Point(228, 0);
|
||||
this.separator.Name = "simpleSeparator1";
|
||||
this.separator.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.separator.Size = new System.Drawing.Size(42, 560);
|
||||
this.separator.Spacing = new DevExpress.XtraLayout.Utils.Padding(40, 0, 0, 0);
|
||||
this.separator.Text = "simpleSeparator1";
|
||||
//
|
||||
// ItemForSettings
|
||||
//
|
||||
this.ItemForSettings.AppearanceItemCaption.Font = new System.Drawing.Font("Segoe UI", 18F);
|
||||
this.ItemForSettings.AppearanceItemCaption.Options.UseFont = true;
|
||||
this.ItemForSettings.Control = this.settingsPanel;
|
||||
this.ItemForSettings.CustomizationFormText = "Settings";
|
||||
this.ItemForSettings.Location = new System.Drawing.Point(0, 267);
|
||||
this.ItemForSettings.Name = "ItemForSettings";
|
||||
this.ItemForSettings.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 16, 0);
|
||||
this.ItemForSettings.Size = new System.Drawing.Size(228, 293);
|
||||
this.ItemForSettings.Text = "Settings";
|
||||
this.ItemForSettings.TextLocation = DevExpress.Utils.Locations.Top;
|
||||
this.ItemForSettings.TextSize = new System.Drawing.Size(114, 32);
|
||||
//
|
||||
// ReportPrintControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.moduleLayout);
|
||||
this.Name = "ReportPrintControl";
|
||||
this.Size = new System.Drawing.Size(310, 600);
|
||||
((System.ComponentModel.ISupportInitialize)(this.moduleLayout)).EndInit();
|
||||
this.moduleLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.cbPrinters.Properties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForButtonPrint)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForPrinters)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForOptions)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.captionLabelItem)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.buttonLabelItem)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.separator)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ItemForSettings)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private DevExpress.XtraEditors.SimpleButton btnPrint;
|
||||
private XtraEditors.ImageComboBoxEdit cbPrinters;
|
||||
private DevExpress.XtraEditors.SimpleButton btnOptions;
|
||||
private DevExpress.XtraLayout.LayoutControl moduleLayout;
|
||||
private XtraLayout.LayoutControlGroup layoutControlGroup1;
|
||||
private XtraLayout.LayoutControlItem ItemForButtonPrint;
|
||||
private XtraLayout.LayoutControlItem ItemForOptions;
|
||||
private XtraLayout.EmptySpaceItem emptySpaceItem1;
|
||||
private XtraLayout.SimpleLabelItem captionLabelItem;
|
||||
private XtraLayout.LayoutControlItem ItemForPrinters;
|
||||
private XtraLayout.SimpleLabelItem buttonLabelItem;
|
||||
private XtraLayout.SimpleSeparator separator;
|
||||
private SettingPanel settingsPanel;
|
||||
private XtraLayout.LayoutControlItem ItemForSettings;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using DevExpress.XtraEditors;
|
||||
using DevExpress.XtraEditors.Controls;
|
||||
using DevExpress.XtraEditors.Preview;
|
||||
using DevExpress.XtraLayout.Utils;
|
||||
using System.Windows.Forms;
|
||||
using DevExpress.Printing;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class ReportPrintControl : XtraUserControl {
|
||||
PrinterImagesContainer imagesContainer;
|
||||
PrinterItemContainer printerItemContainer;
|
||||
public ReportPrintControl() {
|
||||
InitializeComponent();
|
||||
imagesContainer = new PrinterImagesContainer();
|
||||
CreatePrinterItemContainer();
|
||||
|
||||
moduleLayout.BackColor = ColorHelper.GetControlColor(LookAndFeel);
|
||||
LookAndFeel.StyleChanged += LookAndFeel_StyleChanged;
|
||||
}
|
||||
void CreatePrinterItemContainer() {
|
||||
try {
|
||||
printerItemContainer = new PrinterItemContainer();
|
||||
} catch { }
|
||||
}
|
||||
void LookAndFeel_StyleChanged(object sender, EventArgs e) {
|
||||
moduleLayout.BackColor = ColorHelper.GetControlColor(LookAndFeel);
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
cbPrinters.Properties.LargeImages = imagesContainer.LargeImages;
|
||||
cbPrinters.Properties.SmallImages = imagesContainer.SmallImages;
|
||||
if(printerItemContainer != null) {
|
||||
foreach(PrinterItem item in printerItemContainer.Items)
|
||||
cbPrinters.Properties.Items.Add(new ImageComboBoxItem(item.DisplayName, item, imagesContainer.GetImageIndex(item)));
|
||||
}
|
||||
}
|
||||
public bool PrintEnabled {
|
||||
set { btnOptions.Enabled = btnPrint.Enabled = value; }
|
||||
}
|
||||
public bool SettingsVisible {
|
||||
set {
|
||||
ItemForSettings.Visibility = value ?
|
||||
LayoutVisibility.Always : LayoutVisibility.Never;
|
||||
}
|
||||
}
|
||||
public void SetSettings(Control control) {
|
||||
for(int i = settingsPanel.Controls.Count - 1; i >= 0; i--)
|
||||
settingsPanel.Controls[i].Dispose();
|
||||
if(control != null) {
|
||||
control.Dock = DockStyle.Fill;
|
||||
control.Parent = settingsPanel;
|
||||
}
|
||||
}
|
||||
public string SelectedPrinterName {
|
||||
get {
|
||||
PrinterItem item = cbPrinters.EditValue as PrinterItem;
|
||||
if(item != null)
|
||||
return item.FullName;
|
||||
return string.Empty;
|
||||
}
|
||||
set { cbPrinters.EditValue = FindPrinterItem(value); }
|
||||
}
|
||||
PrinterItem FindPrinterItem(string value) {
|
||||
if(printerItemContainer != null) {
|
||||
for(int i = 0; i < printerItemContainer.Items.Count; i++) {
|
||||
if(printerItemContainer.Items[i].FullName != value) continue;
|
||||
return printerItemContainer.Items[i];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public event EventHandler PrintClick;
|
||||
public event EventHandler PrintOptionsClick;
|
||||
void RaisePrintOptionsClick() {
|
||||
if(PrintOptionsClick != null)
|
||||
PrintOptionsClick(this, EventArgs.Empty);
|
||||
}
|
||||
void RaisePrintClick() {
|
||||
if(PrintClick != null)
|
||||
PrintClick(this, EventArgs.Empty);
|
||||
}
|
||||
void btnPrint_Click(object sender, EventArgs e) {
|
||||
RaisePrintClick();
|
||||
}
|
||||
void btnOptions_Click(object sender, EventArgs e) {
|
||||
RaisePrintOptionsClick();
|
||||
}
|
||||
}
|
||||
[ToolboxItem(false), Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))]
|
||||
public class SettingPanel : XtraUserControl { }
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,145 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class ContactsControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.btnIncludeContacts = new DevExpress.XtraEditors.CheckButton();
|
||||
this.btnExcludeContacts = new DevExpress.XtraEditors.CheckButton();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.btnIncludeContacts);
|
||||
this.settingsLayout.Controls.Add(this.btnExcludeContacts);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// btnIncludeContacts
|
||||
//
|
||||
this.btnIncludeContacts.Checked = true;
|
||||
this.btnIncludeContacts.GroupIndex = 1;
|
||||
this.btnIncludeContacts.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnIncludeContacts.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.PrintIncludeEvaluations.svg";
|
||||
this.btnIncludeContacts.Location = new System.Drawing.Point(0, 0);
|
||||
this.btnIncludeContacts.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnIncludeContacts.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnIncludeContacts.Name = "btnIncludeContacts";
|
||||
this.btnIncludeContacts.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnIncludeContacts.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnIncludeContacts.StyleController = this.settingsLayout;
|
||||
this.btnIncludeContacts.TabIndex = 2;
|
||||
this.btnIncludeContacts.Text = "Include Contacts";
|
||||
this.btnIncludeContacts.CheckedChanged += new System.EventHandler(this.btnIncludeContacts_CheckedChanged);
|
||||
//
|
||||
// btnExcludeContacts
|
||||
//
|
||||
this.btnExcludeContacts.GroupIndex = 1;
|
||||
this.btnExcludeContacts.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnExcludeContacts.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.PrintExcludeEvaluations.svg";
|
||||
this.btnExcludeContacts.Location = new System.Drawing.Point(0, 40);
|
||||
this.btnExcludeContacts.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnExcludeContacts.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnExcludeContacts.Name = "btnExcludeContacts";
|
||||
this.btnExcludeContacts.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnExcludeContacts.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnExcludeContacts.StyleController = this.settingsLayout;
|
||||
this.btnExcludeContacts.TabIndex = 2;
|
||||
this.btnExcludeContacts.TabStop = false;
|
||||
this.btnExcludeContacts.Text = "Exclude Contacts";
|
||||
this.btnExcludeContacts.CheckedChanged += new System.EventHandler(this.btnExcludeContacts_CheckedChanged);
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.btnIncludeContacts;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.btnExcludeContacts;
|
||||
this.layoutControlItem2.CustomizationFormText = "layoutControlItem2";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 40);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(238, 192);
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem2.TextVisible = false;
|
||||
//
|
||||
// ContactsControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "ContactsControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraEditors.CheckButton btnIncludeContacts;
|
||||
private XtraEditors.CheckButton btnExcludeContacts;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class ContactsControl : UserControl {
|
||||
Action<bool> callback;
|
||||
bool defaultValue;
|
||||
public ContactsControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public ContactsControl(Action<bool> callback, bool defaultValue)
|
||||
: this() {
|
||||
this.callback = callback;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
if(defaultValue) btnIncludeContacts.Checked = true;
|
||||
else btnExcludeContacts.Checked = true;
|
||||
}
|
||||
void btnIncludeContacts_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(true);
|
||||
}
|
||||
void btnExcludeContacts_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,145 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class EvaluationsControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.btnIncludeEvaluations = new DevExpress.XtraEditors.CheckButton();
|
||||
this.btnExcludeEvaluations = new DevExpress.XtraEditors.CheckButton();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.btnIncludeEvaluations);
|
||||
this.settingsLayout.Controls.Add(this.btnExcludeEvaluations);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// btnIncludeEvaluations
|
||||
//
|
||||
this.btnIncludeEvaluations.Checked = true;
|
||||
this.btnIncludeEvaluations.GroupIndex = 1;
|
||||
this.btnIncludeEvaluations.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnIncludeEvaluations.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.PrintIncludeEvaluations.svg";
|
||||
this.btnIncludeEvaluations.Location = new System.Drawing.Point(0, 0);
|
||||
this.btnIncludeEvaluations.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnIncludeEvaluations.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnIncludeEvaluations.Name = "btnIncludeEvaluations";
|
||||
this.btnIncludeEvaluations.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnIncludeEvaluations.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnIncludeEvaluations.StyleController = this.settingsLayout;
|
||||
this.btnIncludeEvaluations.TabIndex = 2;
|
||||
this.btnIncludeEvaluations.Text = "Include Evaluations";
|
||||
this.btnIncludeEvaluations.CheckedChanged += new System.EventHandler(this.btnAscendingOrder_CheckedChanged);
|
||||
//
|
||||
// btnExcludeEvaluations
|
||||
//
|
||||
this.btnExcludeEvaluations.GroupIndex = 1;
|
||||
this.btnExcludeEvaluations.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnExcludeEvaluations.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.PrintExcludeEvaluations.svg";
|
||||
this.btnExcludeEvaluations.Location = new System.Drawing.Point(0, 40);
|
||||
this.btnExcludeEvaluations.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnExcludeEvaluations.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnExcludeEvaluations.Name = "btnExcludeEvaluations";
|
||||
this.btnExcludeEvaluations.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnExcludeEvaluations.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnExcludeEvaluations.StyleController = this.settingsLayout;
|
||||
this.btnExcludeEvaluations.TabIndex = 2;
|
||||
this.btnExcludeEvaluations.TabStop = false;
|
||||
this.btnExcludeEvaluations.Text = "Exclude Evaluations";
|
||||
this.btnExcludeEvaluations.CheckedChanged += new System.EventHandler(this.btnDescendingOrder_CheckedChanged);
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.btnIncludeEvaluations;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.btnExcludeEvaluations;
|
||||
this.layoutControlItem2.CustomizationFormText = "layoutControlItem2";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 40);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(238, 192);
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem2.TextVisible = false;
|
||||
//
|
||||
// EvaluationsControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "EvaluationsControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraEditors.CheckButton btnIncludeEvaluations;
|
||||
private XtraEditors.CheckButton btnExcludeEvaluations;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class EvaluationsControl : UserControl {
|
||||
Action<bool> callback;
|
||||
bool defaultValue;
|
||||
public EvaluationsControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public EvaluationsControl(Action<bool> callback, bool defaultValue)
|
||||
: this() {
|
||||
this.callback = callback;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
if(defaultValue) btnIncludeEvaluations.Checked = true;
|
||||
else btnExcludeEvaluations.Checked = true;
|
||||
}
|
||||
void btnAscendingOrder_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(true);
|
||||
}
|
||||
void btnDescendingOrder_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,145 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class ImagesControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.btnDisplayImages = new DevExpress.XtraEditors.CheckButton();
|
||||
this.btnHideImages = new DevExpress.XtraEditors.CheckButton();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.btnDisplayImages);
|
||||
this.settingsLayout.Controls.Add(this.btnHideImages);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// btnDisplayImages
|
||||
//
|
||||
this.btnDisplayImages.Checked = true;
|
||||
this.btnDisplayImages.GroupIndex = 1;
|
||||
this.btnDisplayImages.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnDisplayImages.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.ShowProduct.svg";
|
||||
this.btnDisplayImages.Location = new System.Drawing.Point(0, 0);
|
||||
this.btnDisplayImages.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnDisplayImages.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnDisplayImages.Name = "btnDisplayImages";
|
||||
this.btnDisplayImages.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnDisplayImages.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnDisplayImages.StyleController = this.settingsLayout;
|
||||
this.btnDisplayImages.TabIndex = 2;
|
||||
this.btnDisplayImages.Text = "Display Product Images";
|
||||
this.btnDisplayImages.CheckedChanged += new System.EventHandler(this.btnDisplayImages_CheckedChanged);
|
||||
//
|
||||
// btnHideImages
|
||||
//
|
||||
this.btnHideImages.GroupIndex = 1;
|
||||
this.btnHideImages.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnHideImages.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.HideProduct.svg";
|
||||
this.btnHideImages.Location = new System.Drawing.Point(0, 40);
|
||||
this.btnHideImages.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnHideImages.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnHideImages.Name = "btnHideImages";
|
||||
this.btnHideImages.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnHideImages.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnHideImages.StyleController = this.settingsLayout;
|
||||
this.btnHideImages.TabIndex = 2;
|
||||
this.btnHideImages.TabStop = false;
|
||||
this.btnHideImages.Text = "Hide Product Images";
|
||||
this.btnHideImages.CheckedChanged += new System.EventHandler(this.btnHideImages_CheckedChanged);
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.btnDisplayImages;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.btnHideImages;
|
||||
this.layoutControlItem2.CustomizationFormText = "layoutControlItem2";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 40);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(238, 192);
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem2.TextVisible = false;
|
||||
//
|
||||
// ImagesControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "ImagesControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraEditors.CheckButton btnDisplayImages;
|
||||
private XtraEditors.CheckButton btnHideImages;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class ImagesControl : UserControl {
|
||||
Action<bool> callback;
|
||||
bool defaultValue;
|
||||
public ImagesControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public ImagesControl(Action<bool> callback, bool defaultValue)
|
||||
: this() {
|
||||
this.callback = callback;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
if(defaultValue) btnDisplayImages.Checked = true;
|
||||
else btnHideImages.Checked = true;
|
||||
}
|
||||
void btnDisplayImages_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(true);
|
||||
}
|
||||
void btnHideImages_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,61 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class InvoiceSettingsControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.checkedListBoxControl1 = new DevExpress.XtraEditors.CheckedListBoxControl();
|
||||
((System.ComponentModel.ISupportInitialize)(this.checkedListBoxControl1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// checkedListBoxControl1
|
||||
//
|
||||
this.checkedListBoxControl1.Cursor = System.Windows.Forms.Cursors.Default;
|
||||
this.checkedListBoxControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.checkedListBoxControl1.Items.AddRange(new DevExpress.XtraEditors.Controls.CheckedListBoxItem[] {
|
||||
new DevExpress.XtraEditors.Controls.CheckedListBoxItem("Show Header"),
|
||||
new DevExpress.XtraEditors.Controls.CheckedListBoxItem("Show Footer"),
|
||||
new DevExpress.XtraEditors.Controls.CheckedListBoxItem("Show Status"),
|
||||
new DevExpress.XtraEditors.Controls.CheckedListBoxItem("Show Comments")});
|
||||
this.checkedListBoxControl1.Location = new System.Drawing.Point(0, 0);
|
||||
this.checkedListBoxControl1.Name = "checkedListBoxControl1";
|
||||
this.checkedListBoxControl1.Size = new System.Drawing.Size(204, 167);
|
||||
this.checkedListBoxControl1.TabIndex = 0;
|
||||
this.checkedListBoxControl1.ItemCheck += new DevExpress.XtraEditors.Controls.ItemCheckEventHandler(this.checkedListBoxControl1_ItemCheck);
|
||||
//
|
||||
// InvoiceSettingsControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.checkedListBoxControl1);
|
||||
this.Name = "InvoiceSettingsControl";
|
||||
this.Size = new System.Drawing.Size(204, 167);
|
||||
((System.ComponentModel.ISupportInitialize)(this.checkedListBoxControl1)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraEditors.CheckedListBoxControl checkedListBoxControl1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class InvoiceSettingsControl : UserControl {
|
||||
readonly List<Tuple<string, bool, Action<bool>>> settingList;
|
||||
InvoiceSettingsControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public InvoiceSettingsControl(List<Tuple<string, bool, Action<bool>>> settingList):this() {
|
||||
this.settingList = settingList;
|
||||
checkedListBoxControl1.Items.Clear();
|
||||
foreach(Tuple<string, bool, Action<bool>> setting in settingList) {
|
||||
checkedListBoxControl1.Items.Add(setting.Item1, setting.Item2);
|
||||
}
|
||||
}
|
||||
void checkedListBoxControl1_ItemCheck(object sender, XtraEditors.Controls.ItemCheckEventArgs e) {
|
||||
settingList[e.Index].Item3.Invoke(e.State == CheckState.Checked);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,237 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class SortFilterControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.dateEdit2 = new DevExpress.XtraEditors.DateEdit();
|
||||
this.dateEdit1 = new DevExpress.XtraEditors.DateEdit();
|
||||
this.btnOrderDate = new DevExpress.XtraEditors.CheckButton();
|
||||
this.btnInvoice = new DevExpress.XtraEditors.CheckButton();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.simpleLabelItem1 = new DevExpress.XtraLayout.SimpleLabelItem();
|
||||
this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit2.Properties.CalendarTimeProperties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit2.Properties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit1.Properties.CalendarTimeProperties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit1.Properties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.simpleLabelItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.dateEdit2);
|
||||
this.settingsLayout.Controls.Add(this.dateEdit1);
|
||||
this.settingsLayout.Controls.Add(this.btnOrderDate);
|
||||
this.settingsLayout.Controls.Add(this.btnInvoice);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// dateEdit2
|
||||
//
|
||||
this.dateEdit2.EditValue = new System.DateTime(2014, 1, 1, 0, 0, 0, 0);
|
||||
this.dateEdit2.Location = new System.Drawing.Point(0, 160);
|
||||
this.dateEdit2.Name = "dateEdit2";
|
||||
this.dateEdit2.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.dateEdit2.Properties.CalendarTimeProperties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.dateEdit2.Size = new System.Drawing.Size(238, 20);
|
||||
this.dateEdit2.StyleController = this.settingsLayout;
|
||||
this.dateEdit2.TabIndex = 5;
|
||||
this.dateEdit2.DateTimeChanged += new System.EventHandler(this.dateEdit2_DateTimeChanged);
|
||||
//
|
||||
// dateEdit1
|
||||
//
|
||||
this.dateEdit1.EditValue = new System.DateTime(2012, 1, 1, 0, 0, 0, 0);
|
||||
this.dateEdit1.Location = new System.Drawing.Point(0, 132);
|
||||
this.dateEdit1.Name = "dateEdit1";
|
||||
this.dateEdit1.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.dateEdit1.Properties.CalendarTimeProperties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.dateEdit1.Size = new System.Drawing.Size(238, 20);
|
||||
this.dateEdit1.StyleController = this.settingsLayout;
|
||||
this.dateEdit1.TabIndex = 4;
|
||||
this.dateEdit1.DateTimeChanged += new System.EventHandler(this.dateEdit1_DateTimeChanged);
|
||||
//
|
||||
// btnOrderDate
|
||||
//
|
||||
this.btnOrderDate.Checked = true;
|
||||
this.btnOrderDate.GroupIndex = 1;
|
||||
this.btnOrderDate.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnOrderDate.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.SortByOrderDate.svg";
|
||||
this.btnOrderDate.Location = new System.Drawing.Point(0, 0);
|
||||
this.btnOrderDate.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnOrderDate.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnOrderDate.Name = "btnOrderDate";
|
||||
this.btnOrderDate.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnOrderDate.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnOrderDate.StyleController = this.settingsLayout;
|
||||
this.btnOrderDate.TabIndex = 2;
|
||||
this.btnOrderDate.Text = "Sort by Order Date";
|
||||
this.btnOrderDate.CheckedChanged += new System.EventHandler(this.btnOrderDate_CheckedChanged);
|
||||
//
|
||||
// btnInvoice
|
||||
//
|
||||
this.btnInvoice.GroupIndex = 1;
|
||||
this.btnInvoice.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnInvoice.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.SortByInvoice.svg";
|
||||
this.btnInvoice.Location = new System.Drawing.Point(0, 40);
|
||||
this.btnInvoice.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnInvoice.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnInvoice.Name = "btnInvoice";
|
||||
this.btnInvoice.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnInvoice.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnInvoice.StyleController = this.settingsLayout;
|
||||
this.btnInvoice.TabIndex = 2;
|
||||
this.btnInvoice.TabStop = false;
|
||||
this.btnInvoice.Text = "Sort by Invoice #";
|
||||
this.btnInvoice.CheckedChanged += new System.EventHandler(this.btnInvoice_CheckedChanged);
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2,
|
||||
this.simpleLabelItem1,
|
||||
this.layoutControlItem3,
|
||||
this.layoutControlItem4});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.btnOrderDate;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.btnInvoice;
|
||||
this.layoutControlItem2.CustomizationFormText = "layoutControlItem2";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 40);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem2.TextVisible = false;
|
||||
//
|
||||
// simpleLabelItem1
|
||||
//
|
||||
this.simpleLabelItem1.AllowHotTrack = false;
|
||||
this.simpleLabelItem1.AppearanceItemCaption.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.simpleLabelItem1.AppearanceItemCaption.Options.UseFont = true;
|
||||
this.simpleLabelItem1.CustomizationFormText = "Range";
|
||||
this.simpleLabelItem1.Location = new System.Drawing.Point(0, 80);
|
||||
this.simpleLabelItem1.Name = "simpleLabelItem1";
|
||||
this.simpleLabelItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 16, 0);
|
||||
this.simpleLabelItem1.Size = new System.Drawing.Size(238, 48);
|
||||
this.simpleLabelItem1.Text = "Range";
|
||||
this.simpleLabelItem1.TextSize = new System.Drawing.Size(67, 32);
|
||||
//
|
||||
// layoutControlItem3
|
||||
//
|
||||
this.layoutControlItem3.Control = this.dateEdit1;
|
||||
this.layoutControlItem3.CustomizationFormText = "layoutControlItem3";
|
||||
this.layoutControlItem3.Location = new System.Drawing.Point(0, 128);
|
||||
this.layoutControlItem3.Name = "layoutControlItem3";
|
||||
this.layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 4, 4);
|
||||
this.layoutControlItem3.Size = new System.Drawing.Size(238, 28);
|
||||
this.layoutControlItem3.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem3.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem4
|
||||
//
|
||||
this.layoutControlItem4.Control = this.dateEdit2;
|
||||
this.layoutControlItem4.CustomizationFormText = "layoutControlItem4";
|
||||
this.layoutControlItem4.Location = new System.Drawing.Point(0, 156);
|
||||
this.layoutControlItem4.Name = "layoutControlItem4";
|
||||
this.layoutControlItem4.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 4, 0);
|
||||
this.layoutControlItem4.Size = new System.Drawing.Size(238, 76);
|
||||
this.layoutControlItem4.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem4.TextVisible = false;
|
||||
//
|
||||
// SortFilterControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "SortFilterControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit2.Properties.CalendarTimeProperties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit2.Properties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit1.Properties.CalendarTimeProperties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dateEdit1.Properties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.simpleLabelItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraEditors.CheckButton btnOrderDate;
|
||||
private XtraEditors.CheckButton btnInvoice;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
private XtraLayout.SimpleLabelItem simpleLabelItem1;
|
||||
private XtraEditors.DateEdit dateEdit2;
|
||||
private XtraEditors.DateEdit dateEdit1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem3;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem4;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using DevExpress.XtraEditors;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class SortFilterControl : UserControl {
|
||||
Action<bool> callback;
|
||||
Action<DateTime> toDate, fromDate;
|
||||
DateTime defaultFromDate, defaultToDate;
|
||||
bool defaultValue;
|
||||
public SortFilterControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public SortFilterControl(Action<bool> callback, bool defaultValue, Action<DateTime> fromDate, DateTime defaultFromDate, Action<DateTime> toDate, DateTime defaultToDate)
|
||||
: this() {
|
||||
this.callback = callback;
|
||||
this.toDate = toDate;
|
||||
this.fromDate = fromDate;
|
||||
this.defaultValue = defaultValue;
|
||||
this.defaultFromDate = defaultFromDate;
|
||||
this.defaultToDate = defaultToDate;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
|
||||
if(defaultValue) btnOrderDate.Checked = true;
|
||||
else btnInvoice.Checked = true;
|
||||
|
||||
dateEdit1.DateTime = defaultFromDate;
|
||||
dateEdit2.DateTime = defaultToDate;
|
||||
}
|
||||
void btnOrderDate_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(true);
|
||||
}
|
||||
void btnInvoice_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(false);
|
||||
}
|
||||
void dateEdit1_DateTimeChanged(object sender, EventArgs e) {
|
||||
if(fromDate != null) fromDate((sender as DateEdit).DateTime);
|
||||
}
|
||||
void dateEdit2_DateTimeChanged(object sender, EventArgs e) {
|
||||
if(toDate != null) toDate((sender as DateEdit).DateTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,145 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class SortOrderControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.btnAscendingOrder = new DevExpress.XtraEditors.CheckButton();
|
||||
this.btnDescendingOrder = new DevExpress.XtraEditors.CheckButton();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.btnAscendingOrder);
|
||||
this.settingsLayout.Controls.Add(this.btnDescendingOrder);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// btnAscendingOrder
|
||||
//
|
||||
this.btnAscendingOrder.Checked = true;
|
||||
this.btnAscendingOrder.GroupIndex = 1;
|
||||
this.btnAscendingOrder.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnAscendingOrder.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.SortDesc.svg";
|
||||
this.btnAscendingOrder.Location = new System.Drawing.Point(0, 0);
|
||||
this.btnAscendingOrder.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnAscendingOrder.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnAscendingOrder.Name = "btnAscendingOrder";
|
||||
this.btnAscendingOrder.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnAscendingOrder.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnAscendingOrder.StyleController = this.settingsLayout;
|
||||
this.btnAscendingOrder.TabIndex = 2;
|
||||
this.btnAscendingOrder.Text = "Ascending Order";
|
||||
this.btnAscendingOrder.CheckedChanged += new System.EventHandler(this.btnAscendingOrder_CheckedChanged);
|
||||
//
|
||||
// btnDescendingOrder
|
||||
//
|
||||
this.btnDescendingOrder.GroupIndex = 1;
|
||||
this.btnDescendingOrder.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnDescendingOrder.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.SortAsc.svg";
|
||||
this.btnDescendingOrder.Location = new System.Drawing.Point(0, 40);
|
||||
this.btnDescendingOrder.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnDescendingOrder.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnDescendingOrder.Name = "btnDescendingOrder";
|
||||
this.btnDescendingOrder.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnDescendingOrder.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnDescendingOrder.StyleController = this.settingsLayout;
|
||||
this.btnDescendingOrder.TabIndex = 2;
|
||||
this.btnDescendingOrder.TabStop = false;
|
||||
this.btnDescendingOrder.Text = "Descending Order";
|
||||
this.btnDescendingOrder.CheckedChanged += new System.EventHandler(this.btnDescendingOrder_CheckedChanged);
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.btnAscendingOrder;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.btnDescendingOrder;
|
||||
this.layoutControlItem2.CustomizationFormText = "layoutControlItem2";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 40);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(238, 192);
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem2.TextVisible = false;
|
||||
//
|
||||
// SortOrderControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "SortOrderControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraEditors.CheckButton btnAscendingOrder;
|
||||
private XtraEditors.CheckButton btnDescendingOrder;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class SortOrderControl : UserControl {
|
||||
Action<bool> callback;
|
||||
bool defaultValue;
|
||||
public SortOrderControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public SortOrderControl(Action<bool> callback, bool defaultValue)
|
||||
: this() {
|
||||
this.callback = callback;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
if(defaultValue) btnAscendingOrder.Checked = true;
|
||||
else btnDescendingOrder.Checked = true;
|
||||
}
|
||||
void btnAscendingOrder_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback!=null) callback(true);
|
||||
}
|
||||
void btnDescendingOrder_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,145 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class TasksSortControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.btnDueDate = new DevExpress.XtraEditors.CheckButton();
|
||||
this.btnStartDate = new DevExpress.XtraEditors.CheckButton();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.btnDueDate);
|
||||
this.settingsLayout.Controls.Add(this.btnStartDate);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// btnDueDate
|
||||
//
|
||||
this.btnDueDate.Checked = true;
|
||||
this.btnDueDate.GroupIndex = 1;
|
||||
this.btnDueDate.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnDueDate.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.ShowDueDate.svg";
|
||||
this.btnDueDate.Location = new System.Drawing.Point(0, 0);
|
||||
this.btnDueDate.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnDueDate.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnDueDate.Name = "btnDueDate";
|
||||
this.btnDueDate.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnDueDate.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnDueDate.StyleController = this.settingsLayout;
|
||||
this.btnDueDate.TabIndex = 2;
|
||||
this.btnDueDate.Text = "Sort by Due Date";
|
||||
this.btnDueDate.CheckedChanged += new System.EventHandler(this.btnDueDate_CheckedChanged);
|
||||
//
|
||||
// btnStartDate
|
||||
//
|
||||
this.btnStartDate.GroupIndex = 1;
|
||||
this.btnStartDate.ImageUri.ResourceType = typeof(DevExpress.DevAV.MainForm);
|
||||
this.btnStartDate.ImageUri.Uri = "resource://DevExpress.DevAV.Resources.ShowStartDate.svg";
|
||||
this.btnStartDate.Location = new System.Drawing.Point(0, 40);
|
||||
this.btnStartDate.MaximumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnStartDate.MinimumSize = new System.Drawing.Size(0, 40);
|
||||
this.btnStartDate.Name = "btnStartDate";
|
||||
this.btnStartDate.ShowFocusRectangle = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.btnStartDate.Size = new System.Drawing.Size(238, 40);
|
||||
this.btnStartDate.StyleController = this.settingsLayout;
|
||||
this.btnStartDate.TabIndex = 2;
|
||||
this.btnStartDate.TabStop = false;
|
||||
this.btnStartDate.Text = "Sort by Start Date";
|
||||
this.btnStartDate.CheckedChanged += new System.EventHandler(this.btnStartDate_CheckedChanged);
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.btnDueDate;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 40);
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.btnStartDate;
|
||||
this.layoutControlItem2.CustomizationFormText = "layoutControlItem2";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 40);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(238, 192);
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem2.TextVisible = false;
|
||||
//
|
||||
// TasksSortControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "TasksSortControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraEditors.CheckButton btnDueDate;
|
||||
private XtraEditors.CheckButton btnStartDate;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class TasksSortControl : UserControl {
|
||||
Action<bool> callback;
|
||||
bool defaultValue;
|
||||
public TasksSortControl() {
|
||||
InitializeComponent();
|
||||
}
|
||||
public TasksSortControl(Action<bool> callback, bool defaultValue)
|
||||
: this() {
|
||||
this.callback = callback;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
if(defaultValue) btnDueDate.Checked = true;
|
||||
else btnStartDate.Checked = true;
|
||||
}
|
||||
void btnDueDate_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(true);
|
||||
}
|
||||
void btnStartDate_CheckedChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,108 @@
|
||||
namespace DevExpress.DevAV {
|
||||
partial class YearsControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.settingsLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.checkedComboBoxEdit1 = new DevExpress.XtraEditors.CheckedComboBoxEdit();
|
||||
this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).BeginInit();
|
||||
this.settingsLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.checkedComboBoxEdit1.Properties)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// settingsLayout
|
||||
//
|
||||
this.settingsLayout.AllowCustomization = false;
|
||||
this.settingsLayout.Controls.Add(this.checkedComboBoxEdit1);
|
||||
this.settingsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.settingsLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.settingsLayout.Name = "settingsLayout";
|
||||
this.settingsLayout.Root = this.Root;
|
||||
this.settingsLayout.Size = new System.Drawing.Size(238, 232);
|
||||
this.settingsLayout.TabIndex = 3;
|
||||
//
|
||||
// checkedComboBoxEdit1
|
||||
//
|
||||
this.checkedComboBoxEdit1.EditValue = "";
|
||||
this.checkedComboBoxEdit1.Location = new System.Drawing.Point(0, 0);
|
||||
this.checkedComboBoxEdit1.Name = "checkedComboBoxEdit1";
|
||||
this.checkedComboBoxEdit1.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
|
||||
new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
|
||||
this.checkedComboBoxEdit1.Size = new System.Drawing.Size(238, 20);
|
||||
this.checkedComboBoxEdit1.StyleController = this.settingsLayout;
|
||||
this.checkedComboBoxEdit1.TabIndex = 4;
|
||||
//
|
||||
// Root
|
||||
//
|
||||
this.Root.CustomizationFormText = "Root";
|
||||
this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.Root.GroupBordersVisible = false;
|
||||
this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.layoutControlItem1});
|
||||
this.Root.Location = new System.Drawing.Point(0, 0);
|
||||
this.Root.Name = "Root";
|
||||
this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.Root.Size = new System.Drawing.Size(238, 232);
|
||||
this.Root.Text = "Root";
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.checkedComboBoxEdit1;
|
||||
this.layoutControlItem1.CustomizationFormText = "layoutControlItem1";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(238, 232);
|
||||
this.layoutControlItem1.Text = "layoutControlItem1";
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.layoutControlItem1.TextToControlDistance = 0;
|
||||
this.layoutControlItem1.TextVisible = false;
|
||||
//
|
||||
// YearsControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.settingsLayout);
|
||||
this.Name = "YearsControl";
|
||||
this.Size = new System.Drawing.Size(238, 232);
|
||||
((System.ComponentModel.ISupportInitialize)(this.settingsLayout)).EndInit();
|
||||
this.settingsLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.checkedComboBoxEdit1.Properties)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XtraLayout.LayoutControl settingsLayout;
|
||||
private XtraLayout.LayoutControlGroup Root;
|
||||
private XtraEditors.CheckedComboBoxEdit checkedComboBoxEdit1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DevExpress.DevAV {
|
||||
public partial class YearsControl : UserControl {
|
||||
Action<string> callback;
|
||||
string defaultValue;
|
||||
public YearsControl() {
|
||||
InitializeComponent();
|
||||
AddYearItems();
|
||||
}
|
||||
public YearsControl(Action<string> callback, string defaultValue)
|
||||
: this() {
|
||||
this.defaultValue = defaultValue;
|
||||
this.callback = callback;
|
||||
}
|
||||
void AddYearItems() {
|
||||
var yearItems = new DevExpress.XtraEditors.Controls.CheckedListBoxItem[5];
|
||||
int startYear = (DateTime.Now.Year - yearItems.Length) + 1;
|
||||
for(int i = 0; i < yearItems.Length; i++) {
|
||||
string year = (startYear + i).ToString();
|
||||
yearItems[i] = new DevExpress.XtraEditors.Controls.CheckedListBoxItem(year, year);
|
||||
}
|
||||
this.checkedComboBoxEdit1.Properties.Items.AddRange(yearItems);
|
||||
this.checkedComboBoxEdit1.EditValueChanged += checkedComboBoxEdit1_EditValueChanged;
|
||||
}
|
||||
protected override void OnLoad(EventArgs e) {
|
||||
base.OnLoad(e);
|
||||
checkedComboBoxEdit1.EditValue = defaultValue;
|
||||
}
|
||||
void checkedComboBoxEdit1_EditValueChanged(object sender, EventArgs e) {
|
||||
if(callback != null) callback((string)checkedComboBoxEdit1.EditValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
242
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/ViewSettingsControl.Designer.cs
generated
Normal file
242
OutlookInspiredApp/DevExpress.OutlookInspiredApp/Controls/ViewSettingsControl.Designer.cs
generated
Normal file
@@ -0,0 +1,242 @@
|
||||
namespace DevExpress.DevAV.Modules {
|
||||
partial class ViewSettingsControl {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if(disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.okBtn = new DevExpress.XtraEditors.SimpleButton();
|
||||
this.moduleLayout = new DevExpress.XtraLayout.LayoutControl();
|
||||
this.resetViewBtn = new DevExpress.XtraEditors.SimpleButton();
|
||||
this.resetFiltersBtn = new DevExpress.XtraEditors.SimpleButton();
|
||||
this.cancelBtn = new DevExpress.XtraEditors.SimpleButton();
|
||||
this.layoutControlGroup = new DevExpress.XtraLayout.LayoutControlGroup();
|
||||
this.itemForOkBtn = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.itemForCancelBtn = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.emptySpaceItem = new DevExpress.XtraLayout.EmptySpaceItem();
|
||||
this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
|
||||
this.separator = new DevExpress.XtraLayout.SimpleSeparator();
|
||||
this.emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
|
||||
((System.ComponentModel.ISupportInitialize)(this.moduleLayout)).BeginInit();
|
||||
this.moduleLayout.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.itemForOkBtn)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.itemForCancelBtn)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.separator)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// okBtn
|
||||
//
|
||||
this.okBtn.Location = new System.Drawing.Point(280, 254);
|
||||
this.okBtn.Name = "okBtn";
|
||||
this.okBtn.Size = new System.Drawing.Size(78, 22);
|
||||
this.okBtn.StyleController = this.moduleLayout;
|
||||
this.okBtn.TabIndex = 0;
|
||||
this.okBtn.Text = "OK";
|
||||
//
|
||||
// moduleLayout
|
||||
//
|
||||
this.moduleLayout.AllowCustomization = false;
|
||||
this.moduleLayout.Controls.Add(this.resetViewBtn);
|
||||
this.moduleLayout.Controls.Add(this.resetFiltersBtn);
|
||||
this.moduleLayout.Controls.Add(this.cancelBtn);
|
||||
this.moduleLayout.Controls.Add(this.okBtn);
|
||||
this.moduleLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.moduleLayout.Location = new System.Drawing.Point(0, 0);
|
||||
this.moduleLayout.Name = "moduleLayout";
|
||||
this.moduleLayout.Root = this.layoutControlGroup;
|
||||
this.moduleLayout.Size = new System.Drawing.Size(452, 288);
|
||||
this.moduleLayout.TabIndex = 0;
|
||||
//
|
||||
// resetViewBtn
|
||||
//
|
||||
this.resetViewBtn.Location = new System.Drawing.Point(12, 46);
|
||||
this.resetViewBtn.Name = "resetViewBtn";
|
||||
this.resetViewBtn.Size = new System.Drawing.Size(165, 22);
|
||||
this.resetViewBtn.StyleController = this.moduleLayout;
|
||||
this.resetViewBtn.TabIndex = 7;
|
||||
this.resetViewBtn.Text = "Reset View";
|
||||
//
|
||||
// resetFiltersBtn
|
||||
//
|
||||
this.resetFiltersBtn.Location = new System.Drawing.Point(12, 16);
|
||||
this.resetFiltersBtn.Name = "resetFiltersBtn";
|
||||
this.resetFiltersBtn.Size = new System.Drawing.Size(165, 22);
|
||||
this.resetFiltersBtn.StyleController = this.moduleLayout;
|
||||
this.resetFiltersBtn.TabIndex = 6;
|
||||
this.resetFiltersBtn.Text = "Reset Custom Filters";
|
||||
//
|
||||
// cancelBtn
|
||||
//
|
||||
this.cancelBtn.Location = new System.Drawing.Point(362, 254);
|
||||
this.cancelBtn.Name = "cancelBtn";
|
||||
this.cancelBtn.Size = new System.Drawing.Size(78, 22);
|
||||
this.cancelBtn.StyleController = this.moduleLayout;
|
||||
this.cancelBtn.TabIndex = 1;
|
||||
this.cancelBtn.Text = "Cancel";
|
||||
//
|
||||
// layoutControlGroup
|
||||
//
|
||||
this.layoutControlGroup.CustomizationFormText = "Root";
|
||||
this.layoutControlGroup.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.False;
|
||||
this.layoutControlGroup.GroupBordersVisible = false;
|
||||
this.layoutControlGroup.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
|
||||
this.itemForOkBtn,
|
||||
this.itemForCancelBtn,
|
||||
this.emptySpaceItem,
|
||||
this.layoutControlItem1,
|
||||
this.layoutControlItem2,
|
||||
this.separator,
|
||||
this.emptySpaceItem1});
|
||||
this.layoutControlGroup.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlGroup.Name = "Root";
|
||||
this.layoutControlGroup.OptionsItemText.TextToControlDistance = 6;
|
||||
this.layoutControlGroup.Size = new System.Drawing.Size(452, 288);
|
||||
this.layoutControlGroup.Text = "Root";
|
||||
//
|
||||
// itemForOkBtn
|
||||
//
|
||||
this.itemForOkBtn.Control = this.okBtn;
|
||||
this.itemForOkBtn.CustomizationFormText = "itemForOkBtn";
|
||||
this.itemForOkBtn.Location = new System.Drawing.Point(268, 242);
|
||||
this.itemForOkBtn.MaxSize = new System.Drawing.Size(92, 46);
|
||||
this.itemForOkBtn.MinSize = new System.Drawing.Size(92, 46);
|
||||
this.itemForOkBtn.Name = "itemForOkBtn";
|
||||
this.itemForOkBtn.Padding = new DevExpress.XtraLayout.Utils.Padding(12, 2, 12, 12);
|
||||
this.itemForOkBtn.Size = new System.Drawing.Size(92, 46);
|
||||
this.itemForOkBtn.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
|
||||
this.itemForOkBtn.Text = "itemForOkBtn";
|
||||
this.itemForOkBtn.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.itemForOkBtn.TextToControlDistance = 0;
|
||||
this.itemForOkBtn.TextVisible = false;
|
||||
//
|
||||
// itemForCancelBtn
|
||||
//
|
||||
this.itemForCancelBtn.Control = this.cancelBtn;
|
||||
this.itemForCancelBtn.CustomizationFormText = "itemForCancelBtn";
|
||||
this.itemForCancelBtn.Location = new System.Drawing.Point(360, 242);
|
||||
this.itemForCancelBtn.MaxSize = new System.Drawing.Size(92, 46);
|
||||
this.itemForCancelBtn.MinSize = new System.Drawing.Size(92, 46);
|
||||
this.itemForCancelBtn.Name = "itemForCancelBtn";
|
||||
this.itemForCancelBtn.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 12, 12, 12);
|
||||
this.itemForCancelBtn.Size = new System.Drawing.Size(92, 46);
|
||||
this.itemForCancelBtn.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
|
||||
this.itemForCancelBtn.Text = "itemForCancelBtn";
|
||||
this.itemForCancelBtn.TextSize = new System.Drawing.Size(0, 0);
|
||||
this.itemForCancelBtn.TextToControlDistance = 0;
|
||||
this.itemForCancelBtn.TextVisible = false;
|
||||
//
|
||||
// emptySpaceItem
|
||||
//
|
||||
this.emptySpaceItem.AllowHotTrack = false;
|
||||
this.emptySpaceItem.CustomizationFormText = "emptySpaceItem1";
|
||||
this.emptySpaceItem.Location = new System.Drawing.Point(0, 242);
|
||||
this.emptySpaceItem.Name = "emptySpaceItem1";
|
||||
this.emptySpaceItem.Size = new System.Drawing.Size(268, 46);
|
||||
this.emptySpaceItem.Text = "emptySpaceItem1";
|
||||
this.emptySpaceItem.TextSize = new System.Drawing.Size(0, 0);
|
||||
//
|
||||
// layoutControlItem1
|
||||
//
|
||||
this.layoutControlItem1.Control = this.resetFiltersBtn;
|
||||
this.layoutControlItem1.CustomizationFormText = "Reset Custom Filters";
|
||||
this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
|
||||
this.layoutControlItem1.Name = "layoutControlItem1";
|
||||
this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(12, 12, 16, 4);
|
||||
this.layoutControlItem1.Size = new System.Drawing.Size(452, 42);
|
||||
this.layoutControlItem1.Text = "Replace all the filters created by user with predefined";
|
||||
this.layoutControlItem1.TextLocation = DevExpress.Utils.Locations.Right;
|
||||
this.layoutControlItem1.TextSize = new System.Drawing.Size(257, 13);
|
||||
//
|
||||
// layoutControlItem2
|
||||
//
|
||||
this.layoutControlItem2.Control = this.resetViewBtn;
|
||||
this.layoutControlItem2.CustomizationFormText = "Reset View";
|
||||
this.layoutControlItem2.Location = new System.Drawing.Point(0, 42);
|
||||
this.layoutControlItem2.Name = "layoutControlItem2";
|
||||
this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(12, 12, 4, 4);
|
||||
this.layoutControlItem2.Size = new System.Drawing.Size(452, 30);
|
||||
this.layoutControlItem2.Text = "Change View type to default (List, Card etc.)";
|
||||
this.layoutControlItem2.TextLocation = DevExpress.Utils.Locations.Right;
|
||||
this.layoutControlItem2.TextSize = new System.Drawing.Size(257, 13);
|
||||
//
|
||||
// separator
|
||||
//
|
||||
this.separator.AllowHotTrack = false;
|
||||
this.separator.CustomizationFormText = "simpleSeparator1";
|
||||
this.separator.Location = new System.Drawing.Point(0, 240);
|
||||
this.separator.Name = "simpleSeparator1";
|
||||
this.separator.Size = new System.Drawing.Size(452, 2);
|
||||
this.separator.Text = "simpleSeparator1";
|
||||
//
|
||||
// emptySpaceItem1
|
||||
//
|
||||
this.emptySpaceItem1.AllowHotTrack = false;
|
||||
this.emptySpaceItem1.CustomizationFormText = "emptySpaceItem1";
|
||||
this.emptySpaceItem1.Location = new System.Drawing.Point(0, 72);
|
||||
this.emptySpaceItem1.Name = "emptySpaceItem1";
|
||||
this.emptySpaceItem1.Size = new System.Drawing.Size(452, 168);
|
||||
this.emptySpaceItem1.Text = "emptySpaceItem1";
|
||||
this.emptySpaceItem1.TextSize = new System.Drawing.Size(0, 0);
|
||||
//
|
||||
// ViewSettingsControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.moduleLayout);
|
||||
this.Name = "ViewSettingsControl";
|
||||
this.Size = new System.Drawing.Size(452, 288);
|
||||
((System.ComponentModel.ISupportInitialize)(this.moduleLayout)).EndInit();
|
||||
this.moduleLayout.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.itemForOkBtn)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.itemForCancelBtn)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.separator)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private DevExpress.XtraEditors.SimpleButton okBtn;
|
||||
private DevExpress.XtraEditors.SimpleButton cancelBtn;
|
||||
private DevExpress.XtraLayout.LayoutControl moduleLayout;
|
||||
private XtraLayout.LayoutControlGroup layoutControlGroup;
|
||||
private XtraLayout.LayoutControlItem itemForOkBtn;
|
||||
private XtraLayout.LayoutControlItem itemForCancelBtn;
|
||||
private XtraLayout.EmptySpaceItem emptySpaceItem;
|
||||
private XtraLayout.SimpleSeparator separator;
|
||||
private XtraEditors.SimpleButton resetViewBtn;
|
||||
private XtraEditors.SimpleButton resetFiltersBtn;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem1;
|
||||
private XtraLayout.LayoutControlItem layoutControlItem2;
|
||||
private XtraLayout.EmptySpaceItem emptySpaceItem1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
namespace DevExpress.DevAV.Modules {
|
||||
using DevExpress.DevAV.ViewModels;
|
||||
|
||||
public partial class ViewSettingsControl : BaseModuleControl {
|
||||
public ViewSettingsControl(CollectionUIViewModel collectionViewModel)
|
||||
: base(typeof(ViewSettingsViewModel), new object[] { collectionViewModel }) {
|
||||
InitializeComponent();
|
||||
BindCommands();
|
||||
}
|
||||
public ViewSettingsViewModel ViewModel {
|
||||
get { return GetViewModel<ViewSettingsViewModel>(); }
|
||||
}
|
||||
void BindCommands() {
|
||||
this.resetFiltersBtn.BindCommand(() => ViewModel.ResetCustomFilters(), ViewModel);
|
||||
this.resetViewBtn.BindCommand(() => ViewModel.ResetView(), ViewModel);
|
||||
//
|
||||
this.okBtn.BindCommand(() => ViewModel.OK(), ViewModel);
|
||||
this.cancelBtn.BindCommand(() => ViewModel.Cancel(), ViewModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
namespace DevExpress.DevAV.ViewModels {
|
||||
using DevExpress.Mvvm;
|
||||
using DevExpress.Mvvm.DataAnnotations;
|
||||
using DevExpress.Mvvm.POCO;
|
||||
|
||||
public class ViewSettingsViewModel {
|
||||
CollectionUIViewModel collectionUIViewModelCore;
|
||||
|
||||
public static ViewSettingsViewModel Create(CollectionUIViewModel collectionUIViewModel) {
|
||||
return ViewModelSource.Create(() => new ViewSettingsViewModel(collectionUIViewModel));
|
||||
}
|
||||
protected ViewSettingsViewModel(CollectionUIViewModel collectionUIViewModel) {
|
||||
this.collectionUIViewModelCore = collectionUIViewModel;
|
||||
}
|
||||
[Command]
|
||||
public void ResetCustomFilters() {
|
||||
var vm = ViewModelHelper.GetParentViewModel<ISupportCustomFilters>(this);
|
||||
if(vm != null)
|
||||
vm.ResetCustomFilters();
|
||||
}
|
||||
public CollectionUIViewModel CollectionUIViewModel {
|
||||
get { return collectionUIViewModelCore; }
|
||||
}
|
||||
[Command]
|
||||
public void ResetView() {
|
||||
CollectionUIViewModel.ResetView();
|
||||
}
|
||||
public IDocument Document { get; set; }
|
||||
[Command]
|
||||
public void OK() {
|
||||
Document.Close();
|
||||
}
|
||||
[Command]
|
||||
public void Cancel() {
|
||||
Document.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,102 @@
|
||||
using DevExpress.DevAV;
|
||||
using DevExpress.Mvvm.DataModel;
|
||||
using DevExpress.Mvvm.DataModel.EFCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace DevExpress.DevAV.DevAVDbDataModel
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// A DevAVDbUnitOfWork instance that represents the run-time implementation of the IDevAVDbUnitOfWork interface.
|
||||
/// </summary>
|
||||
public class DevAVDbUnitOfWork : DbUnitOfWork<DevAVDb>, IDevAVDbUnitOfWork
|
||||
{
|
||||
|
||||
public DevAVDbUnitOfWork(Func<DevAVDb> contextFactory)
|
||||
: base(contextFactory)
|
||||
{
|
||||
}
|
||||
|
||||
IRepository<TaskAttachedFile, long> IDevAVDbUnitOfWork.AttachedFiles {
|
||||
get { return GetRepository(x => x.Set<TaskAttachedFile>(), (TaskAttachedFile x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<EmployeeTask, long> IDevAVDbUnitOfWork.Tasks {
|
||||
get { return GetRepository(x => x.Set<EmployeeTask>(), (EmployeeTask x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Employee, long> IDevAVDbUnitOfWork.Employees {
|
||||
get { return GetRepository(x => x.Set<Employee>(), (Employee x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<CustomerCommunication, long> IDevAVDbUnitOfWork.Communications {
|
||||
get { return GetRepository(x => x.Set<CustomerCommunication>(), (CustomerCommunication x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<CustomerEmployee, long> IDevAVDbUnitOfWork.CustomerEmployees {
|
||||
get { return GetRepository(x => x.Set<CustomerEmployee>(), (CustomerEmployee x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Customer, long> IDevAVDbUnitOfWork.Customers {
|
||||
get { return GetRepository(x => x.Set<Customer>(), (Customer x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<CustomerStore, long> IDevAVDbUnitOfWork.CustomerStores {
|
||||
get { return GetRepository(x => x.Set<CustomerStore>(), (CustomerStore x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Crest, long> IDevAVDbUnitOfWork.Crests {
|
||||
get { return GetRepository(x => x.Set<Crest>(), (Crest x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Order, long> IDevAVDbUnitOfWork.Orders {
|
||||
get { return GetRepository(x => x.Set<Order>(), (Order x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<OrderItem, long> IDevAVDbUnitOfWork.OrderItems {
|
||||
get { return GetRepository(x => x.Set<OrderItem>(), (OrderItem x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Product, long> IDevAVDbUnitOfWork.Products {
|
||||
get { return GetRepository(x => x.Set<Product>(), (Product x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<ProductCatalog, long> IDevAVDbUnitOfWork.ProductCatalogs {
|
||||
get { return GetRepository(x => x.Set<ProductCatalog>(), (ProductCatalog x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<ProductImage, long> IDevAVDbUnitOfWork.ProductImages {
|
||||
get { return GetRepository(x => x.Set<ProductImage>(), (ProductImage x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Picture, long> IDevAVDbUnitOfWork.Pictures {
|
||||
get { return GetRepository(x => x.Set<Picture>(), (Picture x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<QuoteItem, long> IDevAVDbUnitOfWork.QuoteItems {
|
||||
get { return GetRepository(x => x.Set<QuoteItem>(), (QuoteItem x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Quote, long> IDevAVDbUnitOfWork.Quotes {
|
||||
get { return GetRepository(x => x.Set<Quote>(), (Quote x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Evaluation, long> IDevAVDbUnitOfWork.Evaluations {
|
||||
get { return GetRepository(x => x.Set<Evaluation>(), (Evaluation x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<Probation, long> IDevAVDbUnitOfWork.Probations {
|
||||
get { return GetRepository(x => x.Set<Probation>(), (Probation x) => x.Id); }
|
||||
}
|
||||
|
||||
IRepository<State, StateEnum> IDevAVDbUnitOfWork.States {
|
||||
get { return GetRepository(x => x.Set<State>(), (State x) => x.ShortName); }
|
||||
}
|
||||
|
||||
IRepository<DatabaseVersion, long> IDevAVDbUnitOfWork.Version {
|
||||
get { return GetRepository(x => x.Set<DatabaseVersion>(), (DatabaseVersion x) => x.Id); }
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user