Commit for development environment setup

This commit is contained in:
2023-06-19 16:12:33 -04:00
parent be72063a3c
commit bbce2ad0a6
2209 changed files with 1171775 additions and 625 deletions

View File

@@ -0,0 +1,67 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{B390C88E-66FD-4E84-8149-29852AFA8723}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>EnterpriseServicesHostcs</RootNamespace>
<AssemblyName>EnterpriseServicesHostcs</AssemblyName>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>eskey.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Csla, Version=2.0.0.0, Culture=neutral, PublicKeyToken=93be5fdc093e4c30, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\csla20cs\Csla\bin\Debug\Csla.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="EnterpriseServicesPortal.cs" />
<Compile Include="EnterpriseServicesProxy.cs" />
<Compile Include="EnterpriseServicesSettings.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="application.config" />
<None Include="application.manifest" />
<None Include="eskey.snk" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ProjectTracker.Library\ProjectTracker.Library.csproj">
<Project>{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}</Project>
<Name>ProjectTracker.Library</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
namespace EnterpriseServicesHost
{
[EventTrackingEnabled(true)]
[ComVisible(true)]
public class EnterpriseServicesPortal :
Csla.Server.Hosts.EnterpriseServicesPortal
{
// no code needed - implementation is in the base class
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace EnterpriseServicesHost
{
public class EnterpriseServicesProxy :
Csla.DataPortalClient.EnterpriseServicesProxy
{
protected override
Csla.Server.Hosts.EnterpriseServicesPortal GetServerObject()
{
return new EnterpriseServicesPortal();
}
}
}

View File

@@ -0,0 +1,7 @@
using System;
using System.EnterpriseServices;
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationName("ProjectTracker20cs Portal")]
[assembly: Description("Project Tracker DataPortal host")]
[assembly: ApplicationAccessControl(false)]

View File

@@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("EnterpriseServicesHostcs")]
[assembly: AssemblyDescription("Enterprise Services host")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ProjectTracker")]
[assembly: AssemblyCopyright("Copyright © Rockford Lhotka 2006")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0baa668e-9d03-48e3-860e-36628322b5ef")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="CslaAuthentication" value="Csla" />
</appSettings>
<connectionStrings>
<add name="PTracker"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=&quot;C:\Visual Studio Projects\csla20\ProjectTracker20cs\PTracker.mdf&quot;;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
<add name="Security"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=&quot;C:\Visual Studio Projects\csla20\ProjectTracker20cs\Security.mdf&quot;;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
</assembly>

View File

@@ -0,0 +1,25 @@
# Microsoft Developer Studio Project File - Database Project
Begin DataProject = "PTData"
MSDTVersion = "80"
DefDBRef = "PTracker.mdf"
Begin DBRefFolder = "Database References"
Begin DBRefNode = "PTracker.mdf"
ConnectStr = "Data Source=.\SQLEXPRESS;AttachDbFilename=""D:\Visual Studio Projects\csla20\ProjectTracker20vb\PTracker.mdf"";Integrated Security=True;Connect Timeout=30;User Instance=True"
Provider = "{91510608-8809-4020-8897-FBA057E22D54}"
Colorizer = 6
End
Begin DBRefNode = "Security.mdf"
ConnectStr = "Data Source=.\SQLEXPRESS;AttachDbFilename=""D:\Visual Studio Projects\csla20\ProjectTracker20vb\Security.mdf"";Integrated Security=True;Connect Timeout=30;User Instance=True"
Provider = "{91510608-8809-4020-8897-FBA057E22D54}"
Colorizer = 6
End
End
Begin Folder = "PTracker"
Script = "StoredProcedures.SQL"
Script = "Tables.SQL"
End
Begin Folder = "Security"
Script = "StoredProcedures.SQL"
Script = "Tables.SQL"
End
End

View File

@@ -0,0 +1,997 @@
/****** Object: StoredProcedure [dbo].[addAssignment] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addAssignment]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[addAssignment]
GO
/****** Object: StoredProcedure [dbo].[updateRole] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateRole]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[updateRole]
GO
/****** Object: StoredProcedure [dbo].[addProject] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addProject]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[addProject]
GO
/****** Object: StoredProcedure [dbo].[addResource] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addResource]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[addResource]
GO
/****** Object: StoredProcedure [dbo].[addRole] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addRole]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[addRole]
GO
/****** Object: StoredProcedure [dbo].[deleteAssignment] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteAssignment]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[deleteAssignment]
GO
/****** Object: StoredProcedure [dbo].[deleteProject] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteProject]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[deleteProject]
GO
/****** Object: StoredProcedure [dbo].[deleteResource] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteResource]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[deleteResource]
GO
/****** Object: StoredProcedure [dbo].[deleteRole] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteRole]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[deleteRole]
GO
/****** Object: StoredProcedure [dbo].[existsProject] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[existsProject]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[existsProject]
GO
/****** Object: StoredProcedure [dbo].[existsResource] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[existsResource]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[existsResource]
GO
/****** Object: StoredProcedure [dbo].[getProject] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getProject]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[getProject]
GO
/****** Object: StoredProcedure [dbo].[getProjects] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getProjects]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[getProjects]
GO
/****** Object: StoredProcedure [dbo].[getResource] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getResource]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[getResource]
GO
/****** Object: StoredProcedure [dbo].[getResources] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getResources]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[getResources]
GO
/****** Object: StoredProcedure [dbo].[getRoles] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getRoles]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[getRoles]
GO
/****** Object: StoredProcedure [dbo].[updateAssignment] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateAssignment]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[updateAssignment]
GO
/****** Object: StoredProcedure [dbo].[updateProject] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateProject]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[updateProject]
GO
/****** Object: StoredProcedure [dbo].[updateResource] Script Date: 01/18/2006 09:28:48 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateResource]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[updateResource]
GO
/****** Object: StoredProcedure [dbo].[addAssignment] Script Date: 01/18/2006 09:28:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addAssignment]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE addAssignment
(
@projectId uniqueidentifier,
@resourceId int,
@assigned datetime,
@role int,
@newLastChanged timestamp output
)
AS
INSERT INTO Assignments
(ProjectId,ResourceId,Assigned,Role)
VALUES
(@projectId,@resourceId,@assigned,@role)
SELECT @newLastChanged = LastChanged
FROM Assignments
WHERE ProjectId=@projectId AND ResourceId=@resourceId
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[updateRole] Script Date: 01/18/2006 09:28:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateRole]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[updateRole]
(
@id int,
@name varchar(50),
@lastChanged timestamp,
@newLastChanged timestamp output
)
AS
UPDATE Roles
SET
Name=@name
WHERE Id=@id
AND LastChanged=@lastChanged
IF @@ROWCOUNT = 0
RAISERROR(''Row has been edited by another user'', 16, 1)
SELECT @newLastChanged = LastChanged
FROM Roles WHERE Id=@id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[addProject] Script Date: 01/18/2006 09:28:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addProject]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE addProject
(
@id uniqueidentifier,
@name varchar(50),
@started datetime,
@ended datetime,
@description varchar(MAX),
@newLastChanged timestamp output
)
AS
INSERT INTO Projects
(Id,Name,Started,Ended,Description)
VALUES
(@id,@name,@started,@ended,@description)
SELECT @newLastChanged = LastChanged
FROM Projects WHERE Id=@id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[addResource] Script Date: 01/18/2006 09:28:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addResource]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE addResource
(
@lastName varchar(50),
@firstName varchar(50),
@newId int output,
@newLastChanged timestamp output
)
AS
INSERT INTO Resources
(LastName,FirstName)
VALUES
(@lastName,@firstName)
SELECT @newId = Id, @newLastChanged = LastChanged
FROM Resources WHERE Id=SCOPE_IDENTITY()
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[addRole] Script Date: 01/18/2006 09:28:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[addRole]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[addRole]
(
@id int,
@name varchar(50),
@newLastChanged timestamp output
)
AS
INSERT INTO Roles
(Id,Name)
VALUES
(@id,@name)
SELECT @newLastChanged = LastChanged
FROM Roles WHERE Id=@id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[deleteAssignment] Script Date: 01/18/2006 09:28:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteAssignment]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE deleteAssignment
(
@projectId uniqueidentifier,
@resourceId int
)
AS
DELETE Assignments
WHERE ProjectId=@projectId AND ResourceId=@resourceId
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[deleteProject] Script Date: 01/18/2006 09:28:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteProject]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE deleteProject
(
@id uniqueidentifier
)
AS
DELETE Assignments
WHERE ProjectId=@id
DELETE Projects
WHERE Id=@id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[deleteResource] Script Date: 01/18/2006 09:28:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteResource]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE deleteResource
(
@id int
)
AS
DELETE Assignments
WHERE ResourceId=@id
DELETE Resources
WHERE Id=@id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[deleteRole] Script Date: 01/18/2006 09:28:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[deleteRole]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[deleteRole]
(
@id int
)
AS
DELETE Roles
WHERE Id=@id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[existsProject] Script Date: 01/18/2006 09:28:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[existsProject]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE dbo.existsProject
(
@id uniqueidentifier
)
AS
SELECT COUNT(*)
FROM Projects WHERE Id=@id
RETURN
'
END
GO
/****** Object: StoredProcedure [dbo].[existsResource] Script Date: 01/18/2006 09:28:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[existsResource]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE dbo.existsResource
(
@id int
)
AS
SELECT COUNT(*)
FROM Resources WHERE Id=@id
RETURN
'
END
GO
/****** Object: StoredProcedure [dbo].[getProject] Script Date: 01/18/2006 09:28:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getProject]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE getProject
(
@id uniqueidentifier
)
AS
SELECT Id,Name,Started,Ended,Description,LastChanged
FROM Projects
WHERE Id=@id
SELECT ResourceId,LastName,FirstName,Assigned,Role,Assignments.LastChanged AS LastChanged
FROM Resources,Assignments
WHERE ProjectId=@id AND ResourceId=Id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[getProjects] Script Date: 01/18/2006 09:28:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getProjects]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE getProjects
AS
SELECT Id, Name
FROM Projects
RETURN '
END
GO
/****** Object: StoredProcedure [dbo].[getResource] Script Date: 01/18/2006 09:28:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getResource]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE getResource
(
@id int
)
AS
SELECT Id,LastName,FirstName,LastChanged
FROM Resources
WHERE Id=@id
SELECT ProjectId,Name,Assigned,Role,Assignments.LastChanged AS LastChanged
FROM Projects,Assignments
WHERE ResourceId=@id AND ProjectId=Id
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[getResources] Script Date: 01/18/2006 09:28:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getResources]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE getResources
AS
SELECT Id,LastName,FirstName
FROM Resources
RETURN'
END
GO
/****** Object: StoredProcedure [dbo].[getRoles] Script Date: 01/18/2006 09:28:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[getRoles]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[getRoles]
AS
SELECT Id,Name,LastChanged
FROM Roles
RETURN '
END
GO
/****** Object: StoredProcedure [dbo].[updateAssignment] Script Date: 01/18/2006 09:28:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateAssignment]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE updateAssignment
(
@projectId uniqueidentifier,
@resourceId int,
@assigned datetime,
@role int,
@lastChanged timestamp,
@newLastChanged timestamp output
)
AS
UPDATE Assignments
SET
Assigned=@assigned,
Role=@role
WHERE ProjectId=@projectId AND ResourceId=@resourceId
AND LastChanged=@lastChanged
IF @@ROWCOUNT = 0
RAISERROR(''Row has been edited by another user'', 16, 1)
SELECT @newLastChanged = LastChanged
FROM Assignments
WHERE ProjectId=@projectId AND ResourceId=@resourceId
RETURN
'
END
GO
/****** Object: StoredProcedure [dbo].[updateProject] Script Date: 01/18/2006 09:28:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateProject]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE updateProject
(
@id uniqueidentifier,
@name varchar(50),
@started datetime,
@ended datetime,
@description varchar(MAX),
@lastChanged timestamp,
@newLastChanged timestamp output
)
AS
UPDATE Projects
SET
Name=@name,
Started=@started,
Ended=@ended,
Description=@description
WHERE Id=@id
AND LastChanged=@lastChanged
IF @@ROWCOUNT = 0
RAISERROR(''Row has been edited by another user'', 16, 1)
SELECT @newLastChanged = LastChanged
FROM Projects WHERE Id=@id
RETURN
'
END
GO
/****** Object: StoredProcedure [dbo].[updateResource] Script Date: 01/18/2006 09:28:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[updateResource]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE updateResource
(
@id int,
@lastName varchar(50),
@firstName varchar(50),
@lastChanged timestamp,
@newLastChanged timestamp output
)
AS
UPDATE Resources
SET
LastName=@lastName,
FirstName=@firstName
WHERE Id=@id
AND LastChanged=@lastChanged
IF @@ROWCOUNT = 0
RAISERROR(''Row has been edited by another user'', 16, 1)
SELECT @newLastChanged = LastChanged
FROM Resources WHERE Id=@id
RETURN'
END
GO

View File

@@ -0,0 +1,256 @@
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Assignments_Projects]') AND parent_object_id = OBJECT_ID(N'[dbo].[Assignments]'))
ALTER TABLE [dbo].[Assignments] DROP CONSTRAINT [FK_Assignments_Projects]
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Assignments_Resources]') AND parent_object_id = OBJECT_ID(N'[dbo].[Assignments]'))
ALTER TABLE [dbo].[Assignments] DROP CONSTRAINT [FK_Assignments_Resources]
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Assignments_Roles]') AND parent_object_id = OBJECT_ID(N'[dbo].[Assignments]'))
ALTER TABLE [dbo].[Assignments] DROP CONSTRAINT [FK_Assignments_Roles]
GO
/****** Object: Table [dbo].[Assignments] Script Date: 12/06/2005 11:11:16 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Assignments]') AND type in (N'U'))
DROP TABLE [dbo].[Assignments]
GO
/****** Object: Table [dbo].[Roles] Script Date: 12/06/2005 11:11:16 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Roles]') AND type in (N'U'))
DROP TABLE [dbo].[Roles]
GO
/****** Object: Table [dbo].[Projects] Script Date: 12/06/2005 11:11:16 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Projects]') AND type in (N'U'))
DROP TABLE [dbo].[Projects]
GO
/****** Object: Table [dbo].[Resources] Script Date: 12/06/2005 11:11:16 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Resources]') AND type in (N'U'))
DROP TABLE [dbo].[Resources]
GO
/****** Object: Table [dbo].[Assignments] Script Date: 12/06/2005 11:11:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Assignments]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Assignments](
[ProjectId] [uniqueidentifier] NOT NULL,
[ResourceId] [int] NOT NULL,
[Assigned] [datetime] NOT NULL,
[Role] [int] NOT NULL,
[LastChanged] [timestamp] NOT NULL,
CONSTRAINT [PK_Assignments] PRIMARY KEY CLUSTERED
(
[ProjectId] ASC,
[ResourceId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
/****** Object: Table [dbo].[Roles] Script Date: 12/06/2005 11:11:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Roles]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Roles](
[Id] [int] NOT NULL,
[Name] [varchar](50) NOT NULL,
[LastChanged] [timestamp] NOT NULL,
CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Projects] Script Date: 12/06/2005 11:11:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Projects]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Projects](
[Id] [uniqueidentifier] NOT NULL,
[Name] [varchar](50) NOT NULL,
[Started] [datetime] NULL,
[Ended] [datetime] NULL,
[Description] [varchar](max) NULL,
[LastChanged] [timestamp] NOT NULL,
CONSTRAINT [PK_Projects] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Resources] Script Date: 12/06/2005 11:11:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Resources]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Resources](
[Id] [int] IDENTITY(1,1) NOT NULL,
[LastName] [varchar](50) NULL,
[FirstName] [varchar](50) NULL,
[LastChanged] [timestamp] NOT NULL,
CONSTRAINT [PK_Resources] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Assignments_Projects]') AND parent_object_id = OBJECT_ID(N'[dbo].[Assignments]'))
ALTER TABLE [dbo].[Assignments] WITH CHECK ADD CONSTRAINT [FK_Assignments_Projects] FOREIGN KEY([ProjectId])
REFERENCES [dbo].[Projects] ([Id])
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Assignments_Resources]') AND parent_object_id = OBJECT_ID(N'[dbo].[Assignments]'))
ALTER TABLE [dbo].[Assignments] WITH CHECK ADD CONSTRAINT [FK_Assignments_Resources] FOREIGN KEY([ResourceId])
REFERENCES [dbo].[Resources] ([Id])
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Assignments_Roles]') AND parent_object_id = OBJECT_ID(N'[dbo].[Assignments]'))
ALTER TABLE [dbo].[Assignments] WITH CHECK ADD CONSTRAINT [FK_Assignments_Roles] FOREIGN KEY([Role])
REFERENCES [dbo].[Roles] ([Id])
GO

View File

@@ -0,0 +1,56 @@
/****** Object: StoredProcedure [dbo].[Login] Script Date: 12/06/2005 11:21:14 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Login]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Login]
GO
/****** Object: StoredProcedure [dbo].[Login] Script Date: 12/06/2005 11:21:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Login]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE Login
(
@user varchar(20),
@pw varchar(20)
)
AS
SELECT Username
FROM Users
WHERE Username=@user AND Password=@pw;
SELECT R.Role
FROM Users AS U INNER JOIN Roles AS R ON
R.UserName = U.UserName
WHERE U.Username = @user and U.Password = @pw
RETURN'
END
GO

View File

@@ -0,0 +1,116 @@
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Roles_Users]') AND parent_object_id = OBJECT_ID(N'[dbo].[Roles]'))
ALTER TABLE [dbo].[Roles] DROP CONSTRAINT [FK_Roles_Users]
GO
/****** Object: Table [dbo].[Roles] Script Date: 12/06/2005 11:21:00 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Roles]') AND type in (N'U'))
DROP TABLE [dbo].[Roles]
GO
/****** Object: Table [dbo].[Users] Script Date: 12/06/2005 11:21:00 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Users]') AND type in (N'U'))
DROP TABLE [dbo].[Users]
GO
/****** Object: Table [dbo].[Roles] Script Date: 12/06/2005 11:21:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Roles]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Roles](
[Username] [varchar](20) NOT NULL,
[Role] [varchar](20) NOT NULL,
CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED
(
[Username] ASC,
[Role] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Users] Script Date: 12/06/2005 11:21:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Users]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Users](
[Username] [varchar](20) NOT NULL,
[Password] [varchar](20) NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[Username] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Roles_Users]') AND parent_object_id = OBJECT_ID(N'[dbo].[Roles]'))
ALTER TABLE [dbo].[Roles] WITH CHECK ADD CONSTRAINT [FK_Roles_Users] FOREIGN KEY([Username])
REFERENCES [dbo].[Users] ([Username])
GO

View File

@@ -0,0 +1,667 @@
namespace PTServiceClient
{
partial class MainForm
{
/// <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 Windows Form 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.Windows.Forms.Label DescriptionLabel;
System.Windows.Forms.Label EndedLabel;
System.Windows.Forms.Label StartedLabel;
System.Windows.Forms.Label NameLabel;
System.Windows.Forms.Label IdLabel;
System.Windows.Forms.Label NameLabel3;
System.Windows.Forms.Label IdLabel4;
System.Windows.Forms.Label NameLabel1;
System.Windows.Forms.Label IdLabel2;
this.Label3 = new System.Windows.Forms.Label();
this.Label2 = new System.Windows.Forms.Label();
this.Label1 = new System.Windows.Forms.Label();
this.Label5 = new System.Windows.Forms.Label();
this.Label4 = new System.Windows.Forms.Label();
this.NameLabel2 = new System.Windows.Forms.Label();
this.ProjectDataBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.AssignToProjectButton = new System.Windows.Forms.Button();
this.NameLabel4 = new System.Windows.Forms.Label();
this.ResourceDataBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.GroupBox1 = new System.Windows.Forms.GroupBox();
this.ProjectResourcesDataGridView = new System.Windows.Forms.DataGridView();
this.RoleDataBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.ProjectResourcesBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.ProjectDetailBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.ClearProjectButton = new System.Windows.Forms.Button();
this.SaveProjectButton = new System.Windows.Forms.Button();
this.DescriptionTextBox = new System.Windows.Forms.TextBox();
this.EndedTextBox = new System.Windows.Forms.TextBox();
this.StartedTextBox = new System.Windows.Forms.TextBox();
this.NameTextBox = new System.Windows.Forms.TextBox();
this.IdLabel1 = new System.Windows.Forms.Label();
this.ResourceIdLabel = new System.Windows.Forms.Label();
this.ProjectIdLabel = new System.Windows.Forms.Label();
this.GroupBox2 = new System.Windows.Forms.GroupBox();
this.RoleInfoDataGridView = new System.Windows.Forms.DataGridView();
this.idDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.nameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ProjectDataDataGridView = new System.Windows.Forms.DataGridView();
this.DataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ResourceDataDataGridView = new System.Windows.Forms.DataGridView();
this.DataGridViewTextBoxColumn6 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn7 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.label6 = new System.Windows.Forms.Label();
this.usernameTextBox = new System.Windows.Forms.TextBox();
this.label7 = new System.Windows.Forms.Label();
this.passwordTextBox = new System.Windows.Forms.TextBox();
this.DataGridViewTextBoxColumn4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn5 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn10 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn11 = new System.Windows.Forms.DataGridViewComboBoxColumn();
DescriptionLabel = new System.Windows.Forms.Label();
EndedLabel = new System.Windows.Forms.Label();
StartedLabel = new System.Windows.Forms.Label();
NameLabel = new System.Windows.Forms.Label();
IdLabel = new System.Windows.Forms.Label();
NameLabel3 = new System.Windows.Forms.Label();
IdLabel4 = new System.Windows.Forms.Label();
NameLabel1 = new System.Windows.Forms.Label();
IdLabel2 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.ProjectDataBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ResourceDataBindingSource)).BeginInit();
this.GroupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ProjectResourcesDataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.RoleDataBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ProjectResourcesBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ProjectDetailBindingSource)).BeginInit();
this.GroupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.RoleInfoDataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ProjectDataDataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ResourceDataDataGridView)).BeginInit();
this.SuspendLayout();
//
// DescriptionLabel
//
DescriptionLabel.AutoSize = true;
DescriptionLabel.Location = new System.Drawing.Point(7, 148);
DescriptionLabel.Name = "DescriptionLabel";
DescriptionLabel.Size = new System.Drawing.Size(63, 13);
DescriptionLabel.TabIndex = 8;
DescriptionLabel.Text = "Description:";
//
// EndedLabel
//
EndedLabel.AutoSize = true;
EndedLabel.Location = new System.Drawing.Point(7, 117);
EndedLabel.Name = "EndedLabel";
EndedLabel.Size = new System.Drawing.Size(41, 13);
EndedLabel.TabIndex = 6;
EndedLabel.Text = "Ended:";
//
// StartedLabel
//
StartedLabel.AutoSize = true;
StartedLabel.Location = new System.Drawing.Point(7, 88);
StartedLabel.Name = "StartedLabel";
StartedLabel.Size = new System.Drawing.Size(44, 13);
StartedLabel.TabIndex = 4;
StartedLabel.Text = "Started:";
//
// NameLabel
//
NameLabel.AutoSize = true;
NameLabel.Location = new System.Drawing.Point(7, 59);
NameLabel.Name = "NameLabel";
NameLabel.Size = new System.Drawing.Size(38, 13);
NameLabel.TabIndex = 2;
NameLabel.Text = "Name:";
//
// IdLabel
//
IdLabel.AutoSize = true;
IdLabel.Location = new System.Drawing.Point(7, 30);
IdLabel.Name = "IdLabel";
IdLabel.Size = new System.Drawing.Size(19, 13);
IdLabel.TabIndex = 0;
IdLabel.Text = "Id:";
//
// NameLabel3
//
NameLabel3.AutoSize = true;
NameLabel3.Location = new System.Drawing.Point(9, 153);
NameLabel3.Name = "NameLabel3";
NameLabel3.Size = new System.Drawing.Size(38, 13);
NameLabel3.TabIndex = 7;
NameLabel3.Text = "Name:";
//
// IdLabel4
//
IdLabel4.AutoSize = true;
IdLabel4.Location = new System.Drawing.Point(9, 130);
IdLabel4.Name = "IdLabel4";
IdLabel4.Size = new System.Drawing.Size(19, 13);
IdLabel4.TabIndex = 5;
IdLabel4.Text = "Id:";
//
// NameLabel1
//
NameLabel1.AutoSize = true;
NameLabel1.Location = new System.Drawing.Point(7, 68);
NameLabel1.Name = "NameLabel1";
NameLabel1.Size = new System.Drawing.Size(38, 13);
NameLabel1.TabIndex = 2;
NameLabel1.Text = "Name:";
//
// IdLabel2
//
IdLabel2.AutoSize = true;
IdLabel2.Location = new System.Drawing.Point(9, 44);
IdLabel2.Name = "IdLabel2";
IdLabel2.Size = new System.Drawing.Size(19, 13);
IdLabel2.TabIndex = 0;
IdLabel2.Text = "Id:";
//
// Label3
//
this.Label3.AutoSize = true;
this.Label3.Location = new System.Drawing.Point(596, 93);
this.Label3.Name = "Label3";
this.Label3.Size = new System.Drawing.Size(34, 13);
this.Label3.TabIndex = 13;
this.Label3.Text = "Roles";
//
// Label2
//
this.Label2.AutoSize = true;
this.Label2.Location = new System.Drawing.Point(293, 93);
this.Label2.Name = "Label2";
this.Label2.Size = new System.Drawing.Size(204, 13);
this.Label2.TabIndex = 12;
this.Label2.Text = "Resources (double-click to change name)";
//
// Label1
//
this.Label1.AutoSize = true;
this.Label1.Location = new System.Drawing.Point(10, 93);
this.Label1.Name = "Label1";
this.Label1.Size = new System.Drawing.Size(45, 13);
this.Label1.TabIndex = 11;
this.Label1.Text = "Projects";
//
// Label5
//
this.Label5.AutoSize = true;
this.Label5.Location = new System.Drawing.Point(9, 109);
this.Label5.Name = "Label5";
this.Label5.Size = new System.Drawing.Size(56, 13);
this.Label5.TabIndex = 4;
this.Label5.Text = "Resource:";
//
// Label4
//
this.Label4.AutoSize = true;
this.Label4.Location = new System.Drawing.Point(9, 25);
this.Label4.Name = "Label4";
this.Label4.Size = new System.Drawing.Size(43, 13);
this.Label4.TabIndex = 4;
this.Label4.Text = "Project:";
//
// NameLabel2
//
this.NameLabel2.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDataBindingSource, "Name", true));
this.NameLabel2.Location = new System.Drawing.Point(53, 68);
this.NameLabel2.Name = "NameLabel2";
this.NameLabel2.Size = new System.Drawing.Size(227, 23);
this.NameLabel2.TabIndex = 3;
//
// ProjectDataBindingSource
//
this.ProjectDataBindingSource.DataSource = typeof(PTServiceClient.PTService.ProjectData);
//
// AssignToProjectButton
//
this.AssignToProjectButton.Location = new System.Drawing.Point(196, 205);
this.AssignToProjectButton.Name = "AssignToProjectButton";
this.AssignToProjectButton.Size = new System.Drawing.Size(75, 23);
this.AssignToProjectButton.TabIndex = 9;
this.AssignToProjectButton.Text = "Assign";
this.AssignToProjectButton.UseVisualStyleBackColor = true;
this.AssignToProjectButton.Click += new System.EventHandler(this.AssignToProjectButton_Click);
//
// NameLabel4
//
this.NameLabel4.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ResourceDataBindingSource, "Name", true));
this.NameLabel4.Location = new System.Drawing.Point(53, 153);
this.NameLabel4.Name = "NameLabel4";
this.NameLabel4.Size = new System.Drawing.Size(218, 23);
this.NameLabel4.TabIndex = 8;
//
// ResourceDataBindingSource
//
this.ResourceDataBindingSource.DataSource = typeof(PTServiceClient.PTService.ResourceData);
//
// GroupBox1
//
this.GroupBox1.Controls.Add(this.ProjectResourcesDataGridView);
this.GroupBox1.Controls.Add(this.ClearProjectButton);
this.GroupBox1.Controls.Add(this.SaveProjectButton);
this.GroupBox1.Controls.Add(DescriptionLabel);
this.GroupBox1.Controls.Add(this.DescriptionTextBox);
this.GroupBox1.Controls.Add(EndedLabel);
this.GroupBox1.Controls.Add(this.EndedTextBox);
this.GroupBox1.Controls.Add(StartedLabel);
this.GroupBox1.Controls.Add(this.StartedTextBox);
this.GroupBox1.Controls.Add(NameLabel);
this.GroupBox1.Controls.Add(this.NameTextBox);
this.GroupBox1.Controls.Add(IdLabel);
this.GroupBox1.Controls.Add(this.IdLabel1);
this.GroupBox1.Location = new System.Drawing.Point(10, 335);
this.GroupBox1.Name = "GroupBox1";
this.GroupBox1.Size = new System.Drawing.Size(583, 282);
this.GroupBox1.TabIndex = 14;
this.GroupBox1.TabStop = false;
this.GroupBox1.Text = "Project";
//
// ProjectResourcesDataGridView
//
this.ProjectResourcesDataGridView.AllowUserToAddRows = false;
this.ProjectResourcesDataGridView.AllowUserToDeleteRows = false;
this.ProjectResourcesDataGridView.AutoGenerateColumns = false;
this.ProjectResourcesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.DataGridViewTextBoxColumn4,
this.DataGridViewTextBoxColumn3,
this.DataGridViewTextBoxColumn5,
this.DataGridViewTextBoxColumn10,
this.DataGridViewTextBoxColumn11});
this.ProjectResourcesDataGridView.DataSource = this.ProjectResourcesBindingSource;
this.ProjectResourcesDataGridView.Location = new System.Drawing.Point(257, 56);
this.ProjectResourcesDataGridView.MultiSelect = false;
this.ProjectResourcesDataGridView.Name = "ProjectResourcesDataGridView";
this.ProjectResourcesDataGridView.ReadOnly = true;
this.ProjectResourcesDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.ProjectResourcesDataGridView.Size = new System.Drawing.Size(313, 220);
this.ProjectResourcesDataGridView.TabIndex = 12;
//
// RoleDataBindingSource
//
this.RoleDataBindingSource.DataSource = typeof(PTServiceClient.PTService.RoleInfo);
//
// ProjectResourcesBindingSource
//
this.ProjectResourcesBindingSource.DataMember = "ProjectResources";
this.ProjectResourcesBindingSource.DataSource = this.ProjectDetailBindingSource;
//
// ProjectDetailBindingSource
//
this.ProjectDetailBindingSource.DataSource = typeof(PTServiceClient.PTService.ProjectData);
//
// ClearProjectButton
//
this.ClearProjectButton.Location = new System.Drawing.Point(95, 253);
this.ClearProjectButton.Name = "ClearProjectButton";
this.ClearProjectButton.Size = new System.Drawing.Size(75, 23);
this.ClearProjectButton.TabIndex = 11;
this.ClearProjectButton.Text = "Clear";
this.ClearProjectButton.UseVisualStyleBackColor = true;
this.ClearProjectButton.Click += new System.EventHandler(this.ClearProjectButton_Click);
//
// SaveProjectButton
//
this.SaveProjectButton.Location = new System.Drawing.Point(176, 253);
this.SaveProjectButton.Name = "SaveProjectButton";
this.SaveProjectButton.Size = new System.Drawing.Size(75, 23);
this.SaveProjectButton.TabIndex = 10;
this.SaveProjectButton.Text = "Save";
this.SaveProjectButton.UseVisualStyleBackColor = true;
this.SaveProjectButton.Click += new System.EventHandler(this.SaveProjectButton_Click);
//
// DescriptionTextBox
//
this.DescriptionTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDetailBindingSource, "Description", true));
this.DescriptionTextBox.Location = new System.Drawing.Point(76, 145);
this.DescriptionTextBox.Multiline = true;
this.DescriptionTextBox.Name = "DescriptionTextBox";
this.DescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.DescriptionTextBox.Size = new System.Drawing.Size(175, 102);
this.DescriptionTextBox.TabIndex = 9;
//
// EndedTextBox
//
this.EndedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDetailBindingSource, "Ended", true));
this.EndedTextBox.Location = new System.Drawing.Point(76, 114);
this.EndedTextBox.Name = "EndedTextBox";
this.EndedTextBox.Size = new System.Drawing.Size(175, 20);
this.EndedTextBox.TabIndex = 7;
//
// StartedTextBox
//
this.StartedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDetailBindingSource, "Started", true));
this.StartedTextBox.Location = new System.Drawing.Point(76, 85);
this.StartedTextBox.Name = "StartedTextBox";
this.StartedTextBox.Size = new System.Drawing.Size(175, 20);
this.StartedTextBox.TabIndex = 5;
//
// NameTextBox
//
this.NameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDetailBindingSource, "Name", true));
this.NameTextBox.Location = new System.Drawing.Point(76, 56);
this.NameTextBox.Name = "NameTextBox";
this.NameTextBox.Size = new System.Drawing.Size(175, 20);
this.NameTextBox.TabIndex = 3;
//
// IdLabel1
//
this.IdLabel1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDetailBindingSource, "Id", true));
this.IdLabel1.Location = new System.Drawing.Point(73, 30);
this.IdLabel1.Name = "IdLabel1";
this.IdLabel1.Size = new System.Drawing.Size(175, 23);
this.IdLabel1.TabIndex = 1;
//
// ResourceIdLabel
//
this.ResourceIdLabel.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ResourceDataBindingSource, "Id", true));
this.ResourceIdLabel.Location = new System.Drawing.Point(53, 130);
this.ResourceIdLabel.Name = "ResourceIdLabel";
this.ResourceIdLabel.Size = new System.Drawing.Size(218, 23);
this.ResourceIdLabel.TabIndex = 6;
//
// ProjectIdLabel
//
this.ProjectIdLabel.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ProjectDataBindingSource, "Id", true));
this.ProjectIdLabel.Location = new System.Drawing.Point(53, 44);
this.ProjectIdLabel.Name = "ProjectIdLabel";
this.ProjectIdLabel.Size = new System.Drawing.Size(227, 23);
this.ProjectIdLabel.TabIndex = 1;
//
// GroupBox2
//
this.GroupBox2.Controls.Add(this.AssignToProjectButton);
this.GroupBox2.Controls.Add(NameLabel3);
this.GroupBox2.Controls.Add(this.NameLabel4);
this.GroupBox2.Controls.Add(IdLabel4);
this.GroupBox2.Controls.Add(this.ResourceIdLabel);
this.GroupBox2.Controls.Add(this.Label5);
this.GroupBox2.Controls.Add(this.Label4);
this.GroupBox2.Controls.Add(NameLabel1);
this.GroupBox2.Controls.Add(this.NameLabel2);
this.GroupBox2.Controls.Add(IdLabel2);
this.GroupBox2.Controls.Add(this.ProjectIdLabel);
this.GroupBox2.Location = new System.Drawing.Point(600, 335);
this.GroupBox2.Name = "GroupBox2";
this.GroupBox2.Size = new System.Drawing.Size(300, 282);
this.GroupBox2.TabIndex = 15;
this.GroupBox2.TabStop = false;
this.GroupBox2.Text = "Add assignment";
//
// RoleInfoDataGridView
//
this.RoleInfoDataGridView.AutoGenerateColumns = false;
this.RoleInfoDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.idDataGridViewTextBoxColumn,
this.nameDataGridViewTextBoxColumn});
this.RoleInfoDataGridView.DataSource = this.RoleDataBindingSource;
this.RoleInfoDataGridView.Location = new System.Drawing.Point(599, 109);
this.RoleInfoDataGridView.MultiSelect = false;
this.RoleInfoDataGridView.Name = "RoleInfoDataGridView";
this.RoleInfoDataGridView.ReadOnly = true;
this.RoleInfoDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.RoleInfoDataGridView.Size = new System.Drawing.Size(300, 220);
this.RoleInfoDataGridView.TabIndex = 10;
//
// idDataGridViewTextBoxColumn
//
this.idDataGridViewTextBoxColumn.DataPropertyName = "Id";
this.idDataGridViewTextBoxColumn.HeaderText = "Id";
this.idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
this.idDataGridViewTextBoxColumn.ReadOnly = true;
//
// nameDataGridViewTextBoxColumn
//
this.nameDataGridViewTextBoxColumn.DataPropertyName = "Name";
this.nameDataGridViewTextBoxColumn.HeaderText = "Name";
this.nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn";
this.nameDataGridViewTextBoxColumn.ReadOnly = true;
//
// ProjectDataDataGridView
//
this.ProjectDataDataGridView.AutoGenerateColumns = false;
this.ProjectDataDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.DataGridViewTextBoxColumn1,
this.DataGridViewTextBoxColumn2});
this.ProjectDataDataGridView.DataSource = this.ProjectDataBindingSource;
this.ProjectDataDataGridView.Location = new System.Drawing.Point(10, 109);
this.ProjectDataDataGridView.MultiSelect = false;
this.ProjectDataDataGridView.Name = "ProjectDataDataGridView";
this.ProjectDataDataGridView.ReadOnly = true;
this.ProjectDataDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.ProjectDataDataGridView.Size = new System.Drawing.Size(277, 220);
this.ProjectDataDataGridView.TabIndex = 8;
this.ProjectDataDataGridView.SelectionChanged += new System.EventHandler(this.ProjectDataDataGridView_SelectionChanged);
//
// DataGridViewTextBoxColumn1
//
this.DataGridViewTextBoxColumn1.DataPropertyName = "Id";
this.DataGridViewTextBoxColumn1.HeaderText = "Id";
this.DataGridViewTextBoxColumn1.Name = "DataGridViewTextBoxColumn1";
this.DataGridViewTextBoxColumn1.ReadOnly = true;
//
// DataGridViewTextBoxColumn2
//
this.DataGridViewTextBoxColumn2.DataPropertyName = "Name";
this.DataGridViewTextBoxColumn2.HeaderText = "Name";
this.DataGridViewTextBoxColumn2.Name = "DataGridViewTextBoxColumn2";
this.DataGridViewTextBoxColumn2.ReadOnly = true;
//
// ResourceDataDataGridView
//
this.ResourceDataDataGridView.AutoGenerateColumns = false;
this.ResourceDataDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.DataGridViewTextBoxColumn6,
this.DataGridViewTextBoxColumn7});
this.ResourceDataDataGridView.DataSource = this.ResourceDataBindingSource;
this.ResourceDataDataGridView.Location = new System.Drawing.Point(293, 109);
this.ResourceDataDataGridView.MultiSelect = false;
this.ResourceDataDataGridView.Name = "ResourceDataDataGridView";
this.ResourceDataDataGridView.ReadOnly = true;
this.ResourceDataDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.ResourceDataDataGridView.Size = new System.Drawing.Size(300, 220);
this.ResourceDataDataGridView.TabIndex = 9;
this.ResourceDataDataGridView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.ResourceDataDataGridView_CellDoubleClick);
//
// DataGridViewTextBoxColumn6
//
this.DataGridViewTextBoxColumn6.DataPropertyName = "Id";
this.DataGridViewTextBoxColumn6.HeaderText = "Id";
this.DataGridViewTextBoxColumn6.Name = "DataGridViewTextBoxColumn6";
this.DataGridViewTextBoxColumn6.ReadOnly = true;
//
// DataGridViewTextBoxColumn7
//
this.DataGridViewTextBoxColumn7.DataPropertyName = "Name";
this.DataGridViewTextBoxColumn7.HeaderText = "Name";
this.DataGridViewTextBoxColumn7.Name = "DataGridViewTextBoxColumn7";
this.DataGridViewTextBoxColumn7.ReadOnly = true;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(10, 21);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(58, 13);
this.label6.TabIndex = 16;
this.label6.Text = "Username:";
//
// usernameTextBox
//
this.usernameTextBox.Location = new System.Drawing.Point(70, 18);
this.usernameTextBox.Name = "usernameTextBox";
this.usernameTextBox.Size = new System.Drawing.Size(127, 20);
this.usernameTextBox.TabIndex = 17;
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(10, 47);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(56, 13);
this.label7.TabIndex = 18;
this.label7.Text = "Password:";
//
// passwordTextBox
//
this.passwordTextBox.Location = new System.Drawing.Point(70, 44);
this.passwordTextBox.Name = "passwordTextBox";
this.passwordTextBox.PasswordChar = '*';
this.passwordTextBox.Size = new System.Drawing.Size(127, 20);
this.passwordTextBox.TabIndex = 19;
//
// DataGridViewTextBoxColumn4
//
this.DataGridViewTextBoxColumn4.DataPropertyName = "ResourceId";
this.DataGridViewTextBoxColumn4.HeaderText = "ResourceId";
this.DataGridViewTextBoxColumn4.Name = "DataGridViewTextBoxColumn4";
this.DataGridViewTextBoxColumn4.ReadOnly = true;
this.DataGridViewTextBoxColumn4.Visible = false;
//
// DataGridViewTextBoxColumn3
//
this.DataGridViewTextBoxColumn3.DataPropertyName = "LastName";
this.DataGridViewTextBoxColumn3.HeaderText = "LastName";
this.DataGridViewTextBoxColumn3.Name = "DataGridViewTextBoxColumn3";
this.DataGridViewTextBoxColumn3.ReadOnly = true;
//
// DataGridViewTextBoxColumn5
//
this.DataGridViewTextBoxColumn5.DataPropertyName = "FirstName";
this.DataGridViewTextBoxColumn5.HeaderText = "FirstName";
this.DataGridViewTextBoxColumn5.Name = "DataGridViewTextBoxColumn5";
this.DataGridViewTextBoxColumn5.ReadOnly = true;
//
// DataGridViewTextBoxColumn10
//
this.DataGridViewTextBoxColumn10.DataPropertyName = "Assigned";
this.DataGridViewTextBoxColumn10.HeaderText = "Assigned";
this.DataGridViewTextBoxColumn10.Name = "DataGridViewTextBoxColumn10";
this.DataGridViewTextBoxColumn10.ReadOnly = true;
//
// DataGridViewTextBoxColumn11
//
this.DataGridViewTextBoxColumn11.DataPropertyName = "Role";
this.DataGridViewTextBoxColumn11.DataSource = this.RoleDataBindingSource;
this.DataGridViewTextBoxColumn11.DisplayMember = "Name";
this.DataGridViewTextBoxColumn11.HeaderText = "Role";
this.DataGridViewTextBoxColumn11.Name = "DataGridViewTextBoxColumn11";
this.DataGridViewTextBoxColumn11.ReadOnly = true;
this.DataGridViewTextBoxColumn11.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.DataGridViewTextBoxColumn11.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
this.DataGridViewTextBoxColumn11.ValueMember = "Id";
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(914, 638);
this.Controls.Add(this.passwordTextBox);
this.Controls.Add(this.label7);
this.Controls.Add(this.usernameTextBox);
this.Controls.Add(this.label6);
this.Controls.Add(this.Label3);
this.Controls.Add(this.Label2);
this.Controls.Add(this.Label1);
this.Controls.Add(this.GroupBox1);
this.Controls.Add(this.GroupBox2);
this.Controls.Add(this.RoleInfoDataGridView);
this.Controls.Add(this.ProjectDataDataGridView);
this.Controls.Add(this.ResourceDataDataGridView);
this.Name = "MainForm";
this.Text = "Project Tracker Client";
this.Load += new System.EventHandler(this.MainForm_Load);
((System.ComponentModel.ISupportInitialize)(this.ProjectDataBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ResourceDataBindingSource)).EndInit();
this.GroupBox1.ResumeLayout(false);
this.GroupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ProjectResourcesDataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.RoleDataBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ProjectResourcesBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ProjectDetailBindingSource)).EndInit();
this.GroupBox2.ResumeLayout(false);
this.GroupBox2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.RoleInfoDataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ProjectDataDataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ResourceDataDataGridView)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.Label Label3;
internal System.Windows.Forms.Label Label2;
internal System.Windows.Forms.Label Label1;
internal System.Windows.Forms.BindingSource RoleDataBindingSource;
internal System.Windows.Forms.BindingSource ProjectResourcesBindingSource;
internal System.Windows.Forms.BindingSource ProjectDetailBindingSource;
internal System.Windows.Forms.Label Label5;
internal System.Windows.Forms.Label Label4;
internal System.Windows.Forms.Label NameLabel2;
internal System.Windows.Forms.BindingSource ProjectDataBindingSource;
internal System.Windows.Forms.Button AssignToProjectButton;
internal System.Windows.Forms.Label NameLabel4;
internal System.Windows.Forms.BindingSource ResourceDataBindingSource;
internal System.Windows.Forms.GroupBox GroupBox1;
internal System.Windows.Forms.DataGridView ProjectResourcesDataGridView;
internal System.Windows.Forms.Button ClearProjectButton;
internal System.Windows.Forms.Button SaveProjectButton;
internal System.Windows.Forms.TextBox DescriptionTextBox;
internal System.Windows.Forms.TextBox EndedTextBox;
internal System.Windows.Forms.TextBox StartedTextBox;
internal System.Windows.Forms.TextBox NameTextBox;
internal System.Windows.Forms.Label IdLabel1;
internal System.Windows.Forms.Label ResourceIdLabel;
internal System.Windows.Forms.Label ProjectIdLabel;
internal System.Windows.Forms.GroupBox GroupBox2;
internal System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn1;
internal System.Windows.Forms.DataGridView RoleInfoDataGridView;
internal System.Windows.Forms.DataGridView ProjectDataDataGridView;
internal System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn2;
internal System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn6;
internal System.Windows.Forms.DataGridView ResourceDataDataGridView;
internal System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn7;
private System.Windows.Forms.DataGridViewTextBoxColumn idDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox usernameTextBox;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox passwordTextBox;
private System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn4;
private System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn3;
private System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn5;
private System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn10;
private System.Windows.Forms.DataGridViewComboBoxColumn DataGridViewTextBoxColumn11;
}
}

View File

@@ -0,0 +1,151 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using PTServiceClient;
namespace PTServiceClient
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
using (PTService.PTService svc = new PTService.PTService())
{
this.ProjectDataBindingSource.DataSource =
svc.GetProjectList();
this.ResourceDataBindingSource.DataSource =
svc.GetResourceList();
this.RoleDataBindingSource.DataSource =
svc.GetRoles();
}
}
private void ProjectDataDataGridView_SelectionChanged(object sender, EventArgs e)
{
if (this.ProjectDataDataGridView.SelectedRows.Count > 0)
{
string projectId = this.ProjectDataDataGridView.SelectedRows[0].Cells[0].Value.ToString();
if (projectId != this.IdLabel1.Text)
{
using (PTService.PTService svc = new PTService.PTService())
{
PTService.ProjectRequest request = new PTServiceClient.PTService.ProjectRequest();
request.Id = new Guid(projectId);
this.ProjectDetailBindingSource.DataSource = svc.GetProject(request);
}
}
}
}
private void SaveProjectButton_Click(object sender, EventArgs e)
{
using (PTService.PTService svc = new PTService.PTService())
{
SetCredentials(svc);
Guid id = new Guid(this.IdLabel1.Text);
if (Guid.Empty.Equals(id))
{
// adding
this.ProjectDetailBindingSource.DataSource =
svc.AddProject(
this.NameTextBox.Text,
this.StartedTextBox.Text,
this.EndedTextBox.Text,
this.DescriptionTextBox.Text);
}
else
{
// updating
this.ProjectDetailBindingSource.DataSource =
svc.EditProject(new Guid(this.IdLabel1.Text),
this.NameTextBox.Text,
this.StartedTextBox.Text,
this.EndedTextBox.Text,
this.DescriptionTextBox.Text);
}
// refresh project list
this.ProjectDataBindingSource.DataSource = svc.GetProjectList();
}
}
private void ClearProjectButton_Click(object sender, EventArgs e)
{
this.ProjectDetailBindingSource.Clear();
this.ProjectDetailBindingSource.AddNew();
}
private void AssignToProjectButton_Click(
object sender, EventArgs e)
{
if (this.ResourceIdLabel.Text.Trim().Length == 0)
MessageBox.Show(
"You must select a resource first", "Assign resource",
MessageBoxButtons.OK, MessageBoxIcon.Information);
if (this.ProjectIdLabel.Text.Trim().Length == 0 ||
Guid.Empty.Equals(new Guid(this.ProjectIdLabel.Text)))
MessageBox.Show(
"You must select a project first", "Assign resource",
MessageBoxButtons.OK, MessageBoxIcon.Information);
using (PTService.PTService svc = new PTService.PTService())
{
SetCredentials(svc);
try
{
// do the assignment
svc.AssignResource(
int.Parse(this.ResourceIdLabel.Text),
new Guid(this.ProjectIdLabel.Text));
// refresh the detail view
PTService.ProjectRequest request =
new PTServiceClient.PTService.ProjectRequest();
request.Id = new Guid(this.ProjectIdLabel.Text);
this.ProjectDetailBindingSource.DataSource =
svc.GetProject(request);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Assign resource",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
private void ResourceDataDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
ResourceName dlg = new ResourceName(this.ResourceDataDataGridView.SelectedRows[0].Cells[0].Value.ToString(),
this.ResourceDataDataGridView.SelectedRows[0].Cells[1].Value.ToString());
if (dlg.ShowDialog() == DialogResult.OK)
{
using (PTService.PTService svc = new PTService.PTService())
{
SetCredentials(svc);
// save the changes
int resourceId = int.Parse(dlg.IdLabel1.Text);
string firstName = dlg.FirstNameTextBox.Text;
string lastName = dlg.LastNameTextBox.Text;
svc.ChangeResourceName(resourceId, firstName, lastName);
// refresh the resource list.
this.ResourceDataBindingSource.DataSource = svc.GetResourceList();
}
}
}
private void SetCredentials(PTService.PTService svc)
{
PTService.CslaCredentials credentials =
new PTService.CslaCredentials();
credentials.Username = usernameTextBox.Text;
credentials.Password = passwordTextBox.Text;
svc.CslaCredentialsValue = credentials;
}
}
}

View File

@@ -0,0 +1,162 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="DescriptionLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="EndedLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="StartedLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="NameLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="IdLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="NameLabel3.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="IdLabel4.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="NameLabel1.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="IdLabel2.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="ProjectDataBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>375, 17</value>
</metadata>
<metadata name="ResourceDataBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>184, 17</value>
</metadata>
<metadata name="RoleDataBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="ProjectResourcesBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>555, 17</value>
</metadata>
<metadata name="ProjectDetailBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>763, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,129 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{457C09F3-B15D-474F-A761-DC3419E745EF}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PTServiceClient</RootNamespace>
<AssemblyName>PTServiceClient</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="MainForm.resx">
<SubType>Designer</SubType>
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ResourceName.resx">
<SubType>Designer</SubType>
<DependentUpon>ResourceName.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="ResourceName.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ResourceName.Designer.cs">
<DependentUpon>ResourceName.cs</DependentUpon>
</Compile>
<Compile Include="Web References\PTService\Reference.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Reference.map</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<WebReferences Include="Web References\" />
</ItemGroup>
<ItemGroup>
<WebReferenceUrl Include="http://localhost/PTWebServicecs/PTService.asmx">
<UrlBehavior>Dynamic</UrlBehavior>
<RelPath>Web References\PTService\</RelPath>
<UpdateFromURL>http://localhost/PTWebServicecs/PTService.asmx</UpdateFromURL>
<ServiceLocationURL>
</ServiceLocationURL>
<CachedDynamicPropName>
</CachedDynamicPropName>
<CachedAppSettingsObjectName>Settings</CachedAppSettingsObjectName>
<CachedSettingsPropName>PTServiceClient_PTService_PTService</CachedSettingsPropName>
</WebReferenceUrl>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Web References\PTService\ProjectData.datasource">
<DependentUpon>Reference.map</DependentUpon>
</None>
<None Include="Web References\PTService\PTService.disco" />
<None Include="Web References\PTService\PTService.wsdl" />
<None Include="Web References\PTService\Reference.map">
<Generator>MSDiscoCodeGenerator</Generator>
<LastGenOutput>Reference.cs</LastGenOutput>
</None>
<None Include="Web References\PTService\ResourceData.datasource">
<DependentUpon>Reference.map</DependentUpon>
</None>
<None Include="Web References\PTService\RoleInfo.datasource">
<DependentUpon>Reference.map</DependentUpon>
</None>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace PTServiceClient
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PTServiceClient")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PTServiceClient")]
[assembly: AssemblyCopyright("Copyright © 2006")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("ffc67a41-6945-4a9a-83ab-9d0d88fe37d7")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PTServiceClient.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PTServiceClient.Properties.Resources", typeof(Resources).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(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,36 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PTServiceClient.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)]
[global::System.Configuration.DefaultSettingValueAttribute("http://localhost/PTWebServicecs/PTService.asmx")]
public string PTServiceClient_PTService_PTService {
get {
return ((string)(this["PTServiceClient_PTService_PTService"]));
}
}
}
}

View File

@@ -0,0 +1,9 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="PTServiceClient.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="PTServiceClient_PTService_PTService" Type="(Web Service URL)" Scope="Application">
<Value Profile="(Default)">http://localhost/PTWebServicecs/PTService.asmx</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -0,0 +1,192 @@
namespace PTServiceClient
{
partial class ResourceName
{
/// <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 Windows Form 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()
{
System.Windows.Forms.Label NameLabel;
System.Windows.Forms.Label IdLabel;
this.Cancel_Button = new System.Windows.Forms.Button();
this.NameLabel1 = new System.Windows.Forms.Label();
this.OK_Button = new System.Windows.Forms.Button();
this.IdLabel1 = new System.Windows.Forms.Label();
this.LastNameTextBox = new System.Windows.Forms.TextBox();
this.Label2 = new System.Windows.Forms.Label();
this.FirstNameTextBox = new System.Windows.Forms.TextBox();
this.Label1 = new System.Windows.Forms.Label();
this.TableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
NameLabel = new System.Windows.Forms.Label();
IdLabel = new System.Windows.Forms.Label();
this.TableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// NameLabel
//
NameLabel.AutoSize = true;
NameLabel.Location = new System.Drawing.Point(10, 38);
NameLabel.Name = "NameLabel";
NameLabel.Size = new System.Drawing.Size(38, 13);
NameLabel.TabIndex = 15;
NameLabel.Text = "Name:";
//
// Cancel_Button
//
this.Cancel_Button.Anchor = System.Windows.Forms.AnchorStyles.None;
this.Cancel_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel_Button.Location = new System.Drawing.Point(76, 3);
this.Cancel_Button.Name = "Cancel_Button";
this.Cancel_Button.Size = new System.Drawing.Size(67, 23);
this.Cancel_Button.TabIndex = 1;
this.Cancel_Button.Text = "Cancel";
this.Cancel_Button.Click += new System.EventHandler(this.Cancel_Button_Click);
//
// NameLabel1
//
this.NameLabel1.Location = new System.Drawing.Point(97, 38);
this.NameLabel1.Name = "NameLabel1";
this.NameLabel1.Size = new System.Drawing.Size(236, 23);
this.NameLabel1.TabIndex = 17;
//
// OK_Button
//
this.OK_Button.Anchor = System.Windows.Forms.AnchorStyles.None;
this.OK_Button.Location = new System.Drawing.Point(3, 3);
this.OK_Button.Name = "OK_Button";
this.OK_Button.Size = new System.Drawing.Size(67, 23);
this.OK_Button.TabIndex = 0;
this.OK_Button.Text = "OK";
this.OK_Button.Click += new System.EventHandler(this.OK_Button_Click);
//
// IdLabel
//
IdLabel.AutoSize = true;
IdLabel.Location = new System.Drawing.Point(10, 15);
IdLabel.Name = "IdLabel";
IdLabel.Size = new System.Drawing.Size(19, 13);
IdLabel.TabIndex = 14;
IdLabel.Text = "Id:";
//
// IdLabel1
//
this.IdLabel1.Location = new System.Drawing.Point(97, 15);
this.IdLabel1.Name = "IdLabel1";
this.IdLabel1.Size = new System.Drawing.Size(236, 23);
this.IdLabel1.TabIndex = 16;
//
// LastNameTextBox
//
this.LastNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.LastNameTextBox.Location = new System.Drawing.Point(100, 106);
this.LastNameTextBox.Name = "LastNameTextBox";
this.LastNameTextBox.Size = new System.Drawing.Size(244, 20);
this.LastNameTextBox.TabIndex = 13;
//
// Label2
//
this.Label2.AutoSize = true;
this.Label2.Location = new System.Drawing.Point(10, 109);
this.Label2.Name = "Label2";
this.Label2.Size = new System.Drawing.Size(59, 13);
this.Label2.TabIndex = 12;
this.Label2.Text = "Last name:";
//
// FirstNameTextBox
//
this.FirstNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.FirstNameTextBox.Location = new System.Drawing.Point(100, 80);
this.FirstNameTextBox.Name = "FirstNameTextBox";
this.FirstNameTextBox.Size = new System.Drawing.Size(244, 20);
this.FirstNameTextBox.TabIndex = 11;
//
// Label1
//
this.Label1.AutoSize = true;
this.Label1.Location = new System.Drawing.Point(10, 83);
this.Label1.Name = "Label1";
this.Label1.Size = new System.Drawing.Size(58, 13);
this.Label1.TabIndex = 10;
this.Label1.Text = "First name:";
//
// TableLayoutPanel1
//
this.TableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.TableLayoutPanel1.ColumnCount = 2;
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Controls.Add(this.OK_Button, 0, 0);
this.TableLayoutPanel1.Controls.Add(this.Cancel_Button, 1, 0);
this.TableLayoutPanel1.Location = new System.Drawing.Point(198, 148);
this.TableLayoutPanel1.Name = "TableLayoutPanel1";
this.TableLayoutPanel1.RowCount = 1;
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Size = new System.Drawing.Size(146, 29);
this.TableLayoutPanel1.TabIndex = 9;
//
// ResourceName
//
this.AcceptButton = this.OK_Button;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel_Button;
this.ClientSize = new System.Drawing.Size(355, 193);
this.Controls.Add(NameLabel);
this.Controls.Add(this.NameLabel1);
this.Controls.Add(IdLabel);
this.Controls.Add(this.IdLabel1);
this.Controls.Add(this.LastNameTextBox);
this.Controls.Add(this.Label2);
this.Controls.Add(this.FirstNameTextBox);
this.Controls.Add(this.Label1);
this.Controls.Add(this.TableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ResourceName";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "ResourceName";
this.TableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.Button Cancel_Button;
internal System.Windows.Forms.Label NameLabel1;
internal System.Windows.Forms.Button OK_Button;
internal System.Windows.Forms.Label IdLabel1;
internal System.Windows.Forms.TextBox LastNameTextBox;
internal System.Windows.Forms.Label Label2;
internal System.Windows.Forms.TextBox FirstNameTextBox;
internal System.Windows.Forms.Label Label1;
internal System.Windows.Forms.TableLayoutPanel TableLayoutPanel1;
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace PTServiceClient
{
public partial class ResourceName : Form
{
public ResourceName(string id, string name)
{
InitializeComponent();
this.IdLabel1.Text = id;
this.NameLabel1.Text = name;
}
private void OK_Button_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
private void Cancel_Button_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
}

View File

@@ -0,0 +1,126 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="NameLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="IdLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">
<contractRef ref="http://localhost/PTWebServicecs/PTService.asmx?wsdl" docRef="http://localhost/PTWebServicecs/PTService.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address="http://localhost/PTWebServicecs/PTService.asmx" xmlns:q1="http://ws.lhotka.net/" binding="q1:PTServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address="http://localhost/PTWebServicecs/PTService.asmx" xmlns:q2="http://ws.lhotka.net/" binding="q2:PTServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
</discovery>

View File

@@ -0,0 +1,515 @@
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://ws.lhotka.net/" xmlns:s1="http://microsoft.com/wsdl/types/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://ws.lhotka.net/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://ws.lhotka.net/">
<s:import namespace="http://microsoft.com/wsdl/types/" />
<s:element name="GetProjectList">
<s:complexType />
</s:element>
<s:element name="GetProjectListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetProjectListResult" type="tns:ArrayOfProjectData" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfProjectData">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ProjectData" nillable="true" type="tns:ProjectData" />
</s:sequence>
</s:complexType>
<s:complexType name="ProjectData">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s1:guid" />
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Started" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Ended" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="ProjectResources" type="tns:ArrayOfProjectResourceData" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfProjectResourceData">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ProjectResourceData" nillable="true" type="tns:ProjectResourceData" />
</s:sequence>
</s:complexType>
<s:complexType name="ProjectResourceData">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="ResourceId" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="FirstName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="LastName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Assigned" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="Role" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="GetProject">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="request" type="tns:ProjectRequest" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ProjectRequest">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s1:guid" />
</s:sequence>
</s:complexType>
<s:element name="GetProjectResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetProjectResult" type="tns:ProjectData" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddProject">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="started" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="ended" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddProjectResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="AddProjectResult" type="tns:ProjectData" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="CslaCredentials" type="tns:CslaCredentials" />
<s:complexType name="CslaCredentials">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
</s:sequence>
<s:anyAttribute />
</s:complexType>
<s:element name="EditProject">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="id" type="s1:guid" />
<s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="started" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="ended" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="EditProjectResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="EditProjectResult" type="tns:ProjectData" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetResourceList">
<s:complexType />
</s:element>
<s:element name="GetResourceListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetResourceListResult" type="tns:ArrayOfResourceData" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfResourceData">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ResourceData" nillable="true" type="tns:ResourceData" />
</s:sequence>
</s:complexType>
<s:complexType name="ResourceData">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="ResourceAssignments" type="tns:ArrayOfResourceAssignmentData" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfResourceAssignmentData">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ResourceAssignmentData" nillable="true" type="tns:ResourceAssignmentData" />
</s:sequence>
</s:complexType>
<s:complexType name="ResourceAssignmentData">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="ProjectId" type="s1:guid" />
<s:element minOccurs="0" maxOccurs="1" name="ProjectName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Assigned" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="Role" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="GetResource">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="request" type="tns:ResourceRequest" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ResourceRequest">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="GetResourceResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetResourceResult" type="tns:ResourceData" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ChangeResourceName">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="firstName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="lastName" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ChangeResourceNameResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ChangeResourceNameResult" type="tns:ResourceData" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AssignResource">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="resourceId" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="projectId" type="s1:guid" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AssignResourceResponse">
<s:complexType />
</s:element>
<s:element name="GetRoles">
<s:complexType />
</s:element>
<s:element name="GetRolesResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetRolesResult" type="tns:ArrayOfRoleInfo" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfRoleInfo">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="RoleInfo" nillable="true" type="tns:RoleInfo" />
</s:sequence>
</s:complexType>
<s:complexType name="RoleInfo">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
</s:sequence>
</s:complexType>
</s:schema>
<s:schema elementFormDefault="qualified" targetNamespace="http://microsoft.com/wsdl/types/">
<s:simpleType name="guid">
<s:restriction base="s:string">
<s:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
</s:restriction>
</s:simpleType>
</s:schema>
</wsdl:types>
<wsdl:message name="GetProjectListSoapIn">
<wsdl:part name="parameters" element="tns:GetProjectList" />
</wsdl:message>
<wsdl:message name="GetProjectListSoapOut">
<wsdl:part name="parameters" element="tns:GetProjectListResponse" />
</wsdl:message>
<wsdl:message name="GetProjectSoapIn">
<wsdl:part name="parameters" element="tns:GetProject" />
</wsdl:message>
<wsdl:message name="GetProjectSoapOut">
<wsdl:part name="parameters" element="tns:GetProjectResponse" />
</wsdl:message>
<wsdl:message name="AddProjectSoapIn">
<wsdl:part name="parameters" element="tns:AddProject" />
</wsdl:message>
<wsdl:message name="AddProjectSoapOut">
<wsdl:part name="parameters" element="tns:AddProjectResponse" />
</wsdl:message>
<wsdl:message name="AddProjectCslaCredentials">
<wsdl:part name="CslaCredentials" element="tns:CslaCredentials" />
</wsdl:message>
<wsdl:message name="EditProjectSoapIn">
<wsdl:part name="parameters" element="tns:EditProject" />
</wsdl:message>
<wsdl:message name="EditProjectSoapOut">
<wsdl:part name="parameters" element="tns:EditProjectResponse" />
</wsdl:message>
<wsdl:message name="EditProjectCslaCredentials">
<wsdl:part name="CslaCredentials" element="tns:CslaCredentials" />
</wsdl:message>
<wsdl:message name="GetResourceListSoapIn">
<wsdl:part name="parameters" element="tns:GetResourceList" />
</wsdl:message>
<wsdl:message name="GetResourceListSoapOut">
<wsdl:part name="parameters" element="tns:GetResourceListResponse" />
</wsdl:message>
<wsdl:message name="GetResourceSoapIn">
<wsdl:part name="parameters" element="tns:GetResource" />
</wsdl:message>
<wsdl:message name="GetResourceSoapOut">
<wsdl:part name="parameters" element="tns:GetResourceResponse" />
</wsdl:message>
<wsdl:message name="ChangeResourceNameSoapIn">
<wsdl:part name="parameters" element="tns:ChangeResourceName" />
</wsdl:message>
<wsdl:message name="ChangeResourceNameSoapOut">
<wsdl:part name="parameters" element="tns:ChangeResourceNameResponse" />
</wsdl:message>
<wsdl:message name="ChangeResourceNameCslaCredentials">
<wsdl:part name="CslaCredentials" element="tns:CslaCredentials" />
</wsdl:message>
<wsdl:message name="AssignResourceSoapIn">
<wsdl:part name="parameters" element="tns:AssignResource" />
</wsdl:message>
<wsdl:message name="AssignResourceSoapOut">
<wsdl:part name="parameters" element="tns:AssignResourceResponse" />
</wsdl:message>
<wsdl:message name="AssignResourceCslaCredentials">
<wsdl:part name="CslaCredentials" element="tns:CslaCredentials" />
</wsdl:message>
<wsdl:message name="GetRolesSoapIn">
<wsdl:part name="parameters" element="tns:GetRoles" />
</wsdl:message>
<wsdl:message name="GetRolesSoapOut">
<wsdl:part name="parameters" element="tns:GetRolesResponse" />
</wsdl:message>
<wsdl:portType name="PTServiceSoap">
<wsdl:operation name="GetProjectList">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get a list of projects</wsdl:documentation>
<wsdl:input message="tns:GetProjectListSoapIn" />
<wsdl:output message="tns:GetProjectListSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetProject">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get a project</wsdl:documentation>
<wsdl:input message="tns:GetProjectSoapIn" />
<wsdl:output message="tns:GetProjectSoapOut" />
</wsdl:operation>
<wsdl:operation name="AddProject">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Add a project</wsdl:documentation>
<wsdl:input message="tns:AddProjectSoapIn" />
<wsdl:output message="tns:AddProjectSoapOut" />
</wsdl:operation>
<wsdl:operation name="EditProject">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Edit a project</wsdl:documentation>
<wsdl:input message="tns:EditProjectSoapIn" />
<wsdl:output message="tns:EditProjectSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetResourceList">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get a list of resources</wsdl:documentation>
<wsdl:input message="tns:GetResourceListSoapIn" />
<wsdl:output message="tns:GetResourceListSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetResource">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get a resource</wsdl:documentation>
<wsdl:input message="tns:GetResourceSoapIn" />
<wsdl:output message="tns:GetResourceSoapOut" />
</wsdl:operation>
<wsdl:operation name="ChangeResourceName">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Change a resource's name</wsdl:documentation>
<wsdl:input message="tns:ChangeResourceNameSoapIn" />
<wsdl:output message="tns:ChangeResourceNameSoapOut" />
</wsdl:operation>
<wsdl:operation name="AssignResource">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Assign resource to a project</wsdl:documentation>
<wsdl:input message="tns:AssignResourceSoapIn" />
<wsdl:output message="tns:AssignResourceSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetRoles">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get a list of roles</wsdl:documentation>
<wsdl:input message="tns:GetRolesSoapIn" />
<wsdl:output message="tns:GetRolesSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PTServiceSoap" type="tns:PTServiceSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetProjectList">
<soap:operation soapAction="http://ws.lhotka.net/GetProjectList" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetProject">
<soap:operation soapAction="http://ws.lhotka.net/GetProject" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="AddProject">
<soap:operation soapAction="http://ws.lhotka.net/AddProject" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:AddProjectCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="EditProject">
<soap:operation soapAction="http://ws.lhotka.net/EditProject" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:EditProjectCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetResourceList">
<soap:operation soapAction="http://ws.lhotka.net/GetResourceList" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetResource">
<soap:operation soapAction="http://ws.lhotka.net/GetResource" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ChangeResourceName">
<soap:operation soapAction="http://ws.lhotka.net/ChangeResourceName" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:ChangeResourceNameCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="AssignResource">
<soap:operation soapAction="http://ws.lhotka.net/AssignResource" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:AssignResourceCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetRoles">
<soap:operation soapAction="http://ws.lhotka.net/GetRoles" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="PTServiceSoap12" type="tns:PTServiceSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetProjectList">
<soap12:operation soapAction="http://ws.lhotka.net/GetProjectList" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetProject">
<soap12:operation soapAction="http://ws.lhotka.net/GetProject" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="AddProject">
<soap12:operation soapAction="http://ws.lhotka.net/AddProject" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:AddProjectCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="EditProject">
<soap12:operation soapAction="http://ws.lhotka.net/EditProject" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:EditProjectCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetResourceList">
<soap12:operation soapAction="http://ws.lhotka.net/GetResourceList" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetResource">
<soap12:operation soapAction="http://ws.lhotka.net/GetResource" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ChangeResourceName">
<soap12:operation soapAction="http://ws.lhotka.net/ChangeResourceName" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:ChangeResourceNameCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="AssignResource">
<soap12:operation soapAction="http://ws.lhotka.net/AssignResource" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:AssignResourceCslaCredentials" part="CslaCredentials" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetRoles">
<soap12:operation soapAction="http://ws.lhotka.net/GetRoles" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PTService">
<wsdl:port name="PTServiceSoap" binding="tns:PTServiceSoap">
<soap:address location="http://localhost/PTWebServicecs/PTService.asmx" />
</wsdl:port>
<wsdl:port name="PTServiceSoap12" binding="tns:PTServiceSoap12">
<soap12:address location="http://localhost/PTWebServicecs/PTService.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="ProjectData" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>PTServiceClient.PTService.ProjectData, Web References.PTService.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Results>
<DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://localhost/PTWebServicecs/PTService.asmx?wsdl" filename="PTService.wsdl" />
<DiscoveryClientResult referenceType="System.Web.Services.Discovery.DiscoveryDocumentReference" url="http://localhost/PTWebServicecs/PTService.asmx?disco" filename="PTService.disco" />
</Results>
</DiscoveryClientResultsFile>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="ResourceData" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>PTServiceClient.PTService.ResourceData, Web References.PTService.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="RoleInfo" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>PTServiceClient.PTService.RoleInfo, Web References.PTService.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="PTServiceClient.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<PTServiceClient.Properties.Settings>
<setting name="PTServiceClient_PTService_PTService" serializeAs="String">
<value>http://localhost/PTWebServicecs/PTService.asmx</value>
</setting>
</PTServiceClient.Properties.Settings>
</applicationSettings>
</configuration>

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<appSettings>
<add key="CslaAuthentication" value="Csla" />
<!--<add key="CslaDataPortalProxy"
value="Csla.DataPortalClient.RemotingProxy, Csla"/>
<add key="CslaDataPortalUrl"
value="http://localhost:3187/RemotingHost/RemotingPortal.rem"/>-->
<!--<add key="CslaDataPortalProxy"
value="Csla.DataPortalClient.WebServicesProxy, Csla"/>
<add key="CslaDataPortalUrl"
value="http://localhost:4334/WebServicesHost/WebServicePortal.asmx"/>-->
<!--<add key="CslaDataPortalProxy"
value="EnterpriseServicesHost.EnterpriseServicesProxy, EnterpriseServicesHostcs"/>-->
</appSettings>
<connectionStrings>
<add name="PTracker"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=&quot;C:\Visual Studio Projects\csla20\ProjectTracker20cs\PTracker.mdf&quot;;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
<add name="Security"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=&quot;C:\Visual Studio Projects\csla20\ProjectTracker20cs\Security.mdf&quot;;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- Uncomment the below section to write to the Application Event Log -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
</configuration>

View File

@@ -0,0 +1,141 @@
namespace PTWin
{
partial class LoginForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm));
this.Cancel = new System.Windows.Forms.Button();
this.OK = new System.Windows.Forms.Button();
this.PasswordTextBox = new System.Windows.Forms.TextBox();
this.UsernameTextBox = new System.Windows.Forms.TextBox();
this.PasswordLabel = new System.Windows.Forms.Label();
this.UsernameLabel = new System.Windows.Forms.Label();
this.LogoPictureBox = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.LogoPictureBox)).BeginInit();
this.SuspendLayout();
//
// Cancel
//
this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel.Location = new System.Drawing.Point(300, 161);
this.Cancel.Name = "Cancel";
this.Cancel.Size = new System.Drawing.Size(94, 23);
this.Cancel.TabIndex = 12;
this.Cancel.Text = "&Cancel";
this.Cancel.Click += new System.EventHandler(this.Cancel_Click);
//
// OK
//
this.OK.Location = new System.Drawing.Point(197, 161);
this.OK.Name = "OK";
this.OK.Size = new System.Drawing.Size(94, 23);
this.OK.TabIndex = 11;
this.OK.Text = "&OK";
this.OK.Click += new System.EventHandler(this.OK_Click);
//
// PasswordTextBox
//
this.PasswordTextBox.Location = new System.Drawing.Point(174, 101);
this.PasswordTextBox.Name = "PasswordTextBox";
this.PasswordTextBox.PasswordChar = '*';
this.PasswordTextBox.Size = new System.Drawing.Size(220, 20);
this.PasswordTextBox.TabIndex = 10;
//
// UsernameTextBox
//
this.UsernameTextBox.Location = new System.Drawing.Point(174, 44);
this.UsernameTextBox.Name = "UsernameTextBox";
this.UsernameTextBox.Size = new System.Drawing.Size(220, 20);
this.UsernameTextBox.TabIndex = 8;
//
// PasswordLabel
//
this.PasswordLabel.Location = new System.Drawing.Point(172, 81);
this.PasswordLabel.Name = "PasswordLabel";
this.PasswordLabel.Size = new System.Drawing.Size(220, 23);
this.PasswordLabel.TabIndex = 9;
this.PasswordLabel.Text = "&Password";
this.PasswordLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// UsernameLabel
//
this.UsernameLabel.Location = new System.Drawing.Point(172, 24);
this.UsernameLabel.Name = "UsernameLabel";
this.UsernameLabel.Size = new System.Drawing.Size(220, 23);
this.UsernameLabel.TabIndex = 6;
this.UsernameLabel.Text = "&User name";
this.UsernameLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// LogoPictureBox
//
this.LogoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("LogoPictureBox.Image")));
this.LogoPictureBox.Location = new System.Drawing.Point(0, 0);
this.LogoPictureBox.Name = "LogoPictureBox";
this.LogoPictureBox.Size = new System.Drawing.Size(165, 193);
this.LogoPictureBox.TabIndex = 7;
this.LogoPictureBox.TabStop = false;
//
// LoginForm
//
this.AcceptButton = this.OK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel;
this.ClientSize = new System.Drawing.Size(401, 192);
this.Controls.Add(this.Cancel);
this.Controls.Add(this.OK);
this.Controls.Add(this.PasswordTextBox);
this.Controls.Add(this.UsernameTextBox);
this.Controls.Add(this.PasswordLabel);
this.Controls.Add(this.UsernameLabel);
this.Controls.Add(this.LogoPictureBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LoginForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Log in";
this.Load += new System.EventHandler(this.LoginForm_Load);
((System.ComponentModel.ISupportInitialize)(this.LogoPictureBox)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.Button Cancel;
internal System.Windows.Forms.Button OK;
internal System.Windows.Forms.TextBox PasswordTextBox;
internal System.Windows.Forms.TextBox UsernameTextBox;
internal System.Windows.Forms.Label PasswordLabel;
internal System.Windows.Forms.Label UsernameLabel;
internal System.Windows.Forms.PictureBox LogoPictureBox;
}
}

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace PTWin
{
public partial class LoginForm : Form
{
public LoginForm()
{
InitializeComponent();
}
private void OK_Click(object sender, EventArgs e)
{
using (StatusBusy busy =
new StatusBusy("Verifying credentials..."))
{
ProjectTracker.Library.Security.PTPrincipal.Login(
this.UsernameTextBox.Text, this.PasswordTextBox.Text);
}
this.Close();
}
private void Cancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void LoginForm_Load(object sender, EventArgs e)
{
this.UsernameTextBox.Focus();
}
}
}

View File

@@ -0,0 +1,772 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LogoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@@ -0,0 +1,240 @@
namespace PTWin
{
partial class MainForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.ProjectsStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();
this.NewProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.EditProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.DeleteProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ResourcesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
this.NewResourceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.EditResourceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.DeleteResourceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.AdminToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
this.EditRolesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.LoginToolStripLabel = new System.Windows.Forms.ToolStripLabel();
this.LoginToolStripButton = new System.Windows.Forms.ToolStripButton();
this.DocumentsToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
this.Panel1 = new System.Windows.Forms.Panel();
this.StatusStrip1 = new System.Windows.Forms.StatusStrip();
this.StatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStrip1.SuspendLayout();
this.StatusStrip1.SuspendLayout();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ProjectsStripDropDownButton1,
this.ResourcesToolStripDropDownButton,
this.AdminToolStripDropDownButton,
this.LoginToolStripLabel,
this.LoginToolStripButton,
this.DocumentsToolStripDropDownButton});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(827, 25);
this.toolStrip1.TabIndex = 1;
//
// ProjectsStripDropDownButton1
//
this.ProjectsStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.NewProjectToolStripMenuItem,
this.EditProjectToolStripMenuItem,
this.DeleteProjectToolStripMenuItem});
this.ProjectsStripDropDownButton1.Image = ((System.Drawing.Image)(resources.GetObject("ProjectsStripDropDownButton1.Image")));
this.ProjectsStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ProjectsStripDropDownButton1.Name = "ProjectsStripDropDownButton1";
this.ProjectsStripDropDownButton1.Size = new System.Drawing.Size(75, 22);
this.ProjectsStripDropDownButton1.Text = "Projects";
//
// NewProjectToolStripMenuItem
//
this.NewProjectToolStripMenuItem.Name = "NewProjectToolStripMenuItem";
this.NewProjectToolStripMenuItem.Size = new System.Drawing.Size(142, 22);
this.NewProjectToolStripMenuItem.Text = "New project";
this.NewProjectToolStripMenuItem.Click += new System.EventHandler(this.NewProjectToolStripMenuItem_Click);
//
// EditProjectToolStripMenuItem
//
this.EditProjectToolStripMenuItem.Name = "EditProjectToolStripMenuItem";
this.EditProjectToolStripMenuItem.Size = new System.Drawing.Size(142, 22);
this.EditProjectToolStripMenuItem.Text = "Edit project";
this.EditProjectToolStripMenuItem.Click += new System.EventHandler(this.EditProjectToolStripMenuItem_Click);
//
// DeleteProjectToolStripMenuItem
//
this.DeleteProjectToolStripMenuItem.Name = "DeleteProjectToolStripMenuItem";
this.DeleteProjectToolStripMenuItem.Size = new System.Drawing.Size(142, 22);
this.DeleteProjectToolStripMenuItem.Text = "Delete project";
this.DeleteProjectToolStripMenuItem.Click += new System.EventHandler(this.DeleteProjectToolStripMenuItem_Click);
//
// ResourcesToolStripDropDownButton
//
this.ResourcesToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.NewResourceToolStripMenuItem,
this.EditResourceToolStripMenuItem,
this.DeleteResourceToolStripMenuItem});
this.ResourcesToolStripDropDownButton.Image = ((System.Drawing.Image)(resources.GetObject("ResourcesToolStripDropDownButton.Image")));
this.ResourcesToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ResourcesToolStripDropDownButton.Name = "ResourcesToolStripDropDownButton";
this.ResourcesToolStripDropDownButton.Size = new System.Drawing.Size(86, 22);
this.ResourcesToolStripDropDownButton.Text = "Resources";
//
// NewResourceToolStripMenuItem
//
this.NewResourceToolStripMenuItem.Name = "NewResourceToolStripMenuItem";
this.NewResourceToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.NewResourceToolStripMenuItem.Text = "New resource";
this.NewResourceToolStripMenuItem.Click += new System.EventHandler(this.NewResourceToolStripMenuItem_Click);
//
// EditResourceToolStripMenuItem
//
this.EditResourceToolStripMenuItem.Name = "EditResourceToolStripMenuItem";
this.EditResourceToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.EditResourceToolStripMenuItem.Text = "Edit resource";
this.EditResourceToolStripMenuItem.Click += new System.EventHandler(this.EditResourceToolStripMenuItem_Click);
//
// DeleteResourceToolStripMenuItem
//
this.DeleteResourceToolStripMenuItem.Name = "DeleteResourceToolStripMenuItem";
this.DeleteResourceToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.DeleteResourceToolStripMenuItem.Text = "Delete resource";
this.DeleteResourceToolStripMenuItem.Click += new System.EventHandler(this.DeleteResourceToolStripMenuItem_Click);
//
// AdminToolStripDropDownButton
//
this.AdminToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.EditRolesToolStripMenuItem});
this.AdminToolStripDropDownButton.Image = ((System.Drawing.Image)(resources.GetObject("AdminToolStripDropDownButton.Image")));
this.AdminToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.AdminToolStripDropDownButton.Name = "AdminToolStripDropDownButton";
this.AdminToolStripDropDownButton.Size = new System.Drawing.Size(65, 22);
this.AdminToolStripDropDownButton.Text = "Admin";
//
// EditRolesToolStripMenuItem
//
this.EditRolesToolStripMenuItem.Name = "EditRolesToolStripMenuItem";
this.EditRolesToolStripMenuItem.Size = new System.Drawing.Size(118, 22);
this.EditRolesToolStripMenuItem.Text = "Edit roles";
this.EditRolesToolStripMenuItem.Click += new System.EventHandler(this.EditRolesToolStripMenuItem_Click);
//
// LoginToolStripLabel
//
this.LoginToolStripLabel.Name = "LoginToolStripLabel";
this.LoginToolStripLabel.Size = new System.Drawing.Size(70, 22);
this.LoginToolStripLabel.Text = "Not logged in";
//
// LoginToolStripButton
//
this.LoginToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.LoginToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("LoginToolStripButton.Image")));
this.LoginToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.LoginToolStripButton.Name = "LoginToolStripButton";
this.LoginToolStripButton.Size = new System.Drawing.Size(36, 22);
this.LoginToolStripButton.Text = "Login";
this.LoginToolStripButton.Click += new System.EventHandler(this.LoginToolStripButton_Click);
//
// DocumentsToolStripDropDownButton
//
this.DocumentsToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.DocumentsToolStripDropDownButton.Image = ((System.Drawing.Image)(resources.GetObject("DocumentsToolStripDropDownButton.Image")));
this.DocumentsToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.DocumentsToolStripDropDownButton.Name = "DocumentsToolStripDropDownButton";
this.DocumentsToolStripDropDownButton.Size = new System.Drawing.Size(73, 22);
this.DocumentsToolStripDropDownButton.Text = "Documents";
this.DocumentsToolStripDropDownButton.DropDownOpening += new System.EventHandler(this.DocumentsToolStripDropDownButton_DropDownOpening);
//
// Panel1
//
this.Panel1.BackColor = System.Drawing.SystemColors.ControlDark;
this.Panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.Panel1.Location = new System.Drawing.Point(0, 25);
this.Panel1.Name = "Panel1";
this.Panel1.Size = new System.Drawing.Size(827, 393);
this.Panel1.TabIndex = 2;
//
// StatusStrip1
//
this.StatusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.StatusLabel});
this.StatusStrip1.Location = new System.Drawing.Point(0, 396);
this.StatusStrip1.Name = "StatusStrip1";
this.StatusStrip1.Size = new System.Drawing.Size(827, 22);
this.StatusStrip1.TabIndex = 3;
this.StatusStrip1.Text = "statusStrip1";
//
// StatusLabel
//
this.StatusLabel.Name = "StatusLabel";
this.StatusLabel.Size = new System.Drawing.Size(0, 17);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(827, 418);
this.Controls.Add(this.StatusStrip1);
this.Controls.Add(this.Panel1);
this.Controls.Add(this.toolStrip1);
this.Name = "MainForm";
this.Text = "Project Tracker";
this.Load += new System.EventHandler(this.MainForm_Load);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.StatusStrip1.ResumeLayout(false);
this.StatusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.ToolStrip toolStrip1;
internal System.Windows.Forms.ToolStripDropDownButton ProjectsStripDropDownButton1;
internal System.Windows.Forms.ToolStripMenuItem NewProjectToolStripMenuItem;
internal System.Windows.Forms.ToolStripMenuItem EditProjectToolStripMenuItem;
internal System.Windows.Forms.ToolStripMenuItem DeleteProjectToolStripMenuItem;
internal System.Windows.Forms.ToolStripLabel LoginToolStripLabel;
internal System.Windows.Forms.ToolStripButton LoginToolStripButton;
internal System.Windows.Forms.ToolStripDropDownButton ResourcesToolStripDropDownButton;
internal System.Windows.Forms.ToolStripMenuItem NewResourceToolStripMenuItem;
internal System.Windows.Forms.ToolStripMenuItem EditResourceToolStripMenuItem;
internal System.Windows.Forms.ToolStripMenuItem DeleteResourceToolStripMenuItem;
internal System.Windows.Forms.ToolStripDropDownButton AdminToolStripDropDownButton;
internal System.Windows.Forms.ToolStripMenuItem EditRolesToolStripMenuItem;
internal System.Windows.Forms.ToolStripDropDownButton DocumentsToolStripDropDownButton;
internal System.Windows.Forms.Panel Panel1;
internal System.Windows.Forms.StatusStrip StatusStrip1;
internal System.Windows.Forms.ToolStripStatusLabel StatusLabel;
}
}

View File

@@ -0,0 +1,462 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ProjectTracker.Library;
namespace PTWin
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
_main = this;
}
private static MainForm _main;
internal static MainForm Instance
{
get { return _main; }
}
private void MainForm_Load(object sender, EventArgs e)
{
if (Csla.ApplicationContext.AuthenticationType == "Windows")
AppDomain.CurrentDomain.SetPrincipalPolicy(
System.Security.Principal.PrincipalPolicy.WindowsPrincipal);
else
DoLogin();
if (DocumentCount == 0)
this.DocumentsToolStripDropDownButton.Enabled = false;
ApplyAuthorizationRules();
}
#region Projects
private void NewProjectToolStripMenuItem_Click(
object sender, EventArgs e)
{
using (StatusBusy busy =
new StatusBusy("Creating project..."))
{
AddWinPart(new ProjectEdit(Project.NewProject()));
}
}
private void EditProjectToolStripMenuItem_Click(
object sender, EventArgs e)
{
using (ProjectSelect dlg = new ProjectSelect())
{
dlg.Text = "Edit Project";
if (dlg.ShowDialog() == DialogResult.OK)
{
ShowEditProject(dlg.ProjectId);
}
}
}
public void ShowEditProject(Guid projectId)
{
// see if this project is already loaded
foreach (Control ctl in Panel1.Controls)
{
if (ctl is ProjectEdit)
{
ProjectEdit part = (ProjectEdit)ctl;
if (part.Project.Id.Equals(projectId))
{
// project already loaded so just
// display the existing winpart
ShowWinPart(part);
return;
}
}
}
// the project wasn't already loaded
// so load it and display the new winpart
using (StatusBusy busy = new StatusBusy("Loading project..."))
{
try
{
AddWinPart(new ProjectEdit(Project.GetProject(projectId)));
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error loading", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error loading", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
}
private void DeleteProjectToolStripMenuItem_Click(object sender, EventArgs e)
{
ProjectSelect dlg = new ProjectSelect();
dlg.Text = "Delete Project";
if (dlg.ShowDialog() == DialogResult.OK)
{
// get the project id
Guid projectId = dlg.ProjectId;
if (MessageBox.Show("Are you sure?", "Delete project",
MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
using (StatusBusy busy = new StatusBusy("Deleting project..."))
{
try
{
Project.DeleteProject(projectId);
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error deleting", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error deleting", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
}
}
}
#endregion
#region Resources
private void NewResourceToolStripMenuItem_Click(object sender, EventArgs e)
{
using (StatusBusy busy = new StatusBusy("Creating resource..."))
{
AddWinPart(new ResourceEdit(Resource.NewResource()));
}
}
private void EditResourceToolStripMenuItem_Click(
object sender, EventArgs e)
{
ResourceSelect dlg = new ResourceSelect();
dlg.Text = "Edit Resource";
if (dlg.ShowDialog() == DialogResult.OK)
{
// get the resource id
ShowEditResource(dlg.ResourceId);
}
}
public void ShowEditResource(int resourceId)
{
// see if this resource is already loaded
foreach (Control ctl in Panel1.Controls)
{
if (ctl is ResourceEdit)
{
ResourceEdit part = (ResourceEdit)ctl;
if (part.Resource.Id.Equals(resourceId))
{
// resource already loaded so just
// display the existing winpart
ShowWinPart(part);
return;
}
}
}
// the resource wasn't already loaded
// so load it and display the new winpart
using (StatusBusy busy = new StatusBusy("Loading resource..."))
{
try
{
AddWinPart(new ResourceEdit(Resource.GetResource(resourceId)));
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error loading", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error loading", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
}
private void DeleteResourceToolStripMenuItem_Click(
object sender, EventArgs e)
{
ResourceSelect dlg = new ResourceSelect();
dlg.Text = "Delete Resource";
if (dlg.ShowDialog() == DialogResult.OK)
{
// get the resource id
int resourceId = dlg.ResourceId;
if (MessageBox.Show("Are you sure?", "Delete resource",
MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
using (StatusBusy busy =
new StatusBusy("Deleting resource..."))
{
try
{
Resource.DeleteResource(resourceId);
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error deleting", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error deleting", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
}
}
}
#endregion
#region Roles
private void EditRolesToolStripMenuItem_Click(
object sender, EventArgs e)
{
// see if this form is already loaded
foreach (Control ctl in Panel1.Controls)
{
if (ctl is RolesEdit)
{
ShowWinPart((WinPart)ctl);
return;
}
}
// it wasn't already loaded, so show it.
AddWinPart(new RolesEdit());
}
#endregion
#region ApplyAuthorizationRules
private void ApplyAuthorizationRules()
{
// Project menu
this.NewProjectToolStripMenuItem.Enabled =
Project.CanAddObject();
this.EditProjectToolStripMenuItem.Enabled =
Project.CanGetObject();
if (Project.CanEditObject())
this.EditProjectToolStripMenuItem.Text =
"Edit project";
else
this.EditProjectToolStripMenuItem.Text =
"View project";
this.DeleteProjectToolStripMenuItem.Enabled =
Project.CanDeleteObject();
// Resource menu
this.NewResourceToolStripMenuItem.Enabled =
Resource.CanAddObject();
this.EditResourceToolStripMenuItem.Enabled =
Resource.CanGetObject();
if (Resource.CanEditObject())
this.EditResourceToolStripMenuItem.Text =
"Edit resource";
else
this.EditResourceToolStripMenuItem.Text =
"View resource";
this.DeleteResourceToolStripMenuItem.Enabled =
Resource.CanDeleteObject();
// Admin menu
this.EditRolesToolStripMenuItem.Enabled =
ProjectTracker.Library.Admin.Roles.CanEditObject();
}
#endregion
#region Login/Logout
private void LoginToolStripButton_Click(
object sender, EventArgs e)
{
DoLogin();
}
private void DoLogin()
{
ProjectTracker.Library.Security.PTPrincipal.Logout();
if (this.LoginToolStripButton.Text == "Login")
{
LoginForm loginForm = new LoginForm();
loginForm.ShowDialog(this);
}
System.Security.Principal.IPrincipal user =
Csla.ApplicationContext.User;
if (user.Identity.IsAuthenticated)
{
this.LoginToolStripLabel.Text = "Logged in as " +
user.Identity.Name;
this.LoginToolStripButton.Text = "Logout";
}
else
{
this.LoginToolStripLabel.Text = "Not logged in";
this.LoginToolStripButton.Text = "Login";
}
// reset menus, etc.
ApplyAuthorizationRules();
// notify all documents
foreach (Control ctl in Panel1.Controls)
if (ctl is WinPart)
((WinPart)ctl).OnCurrentPrincipalChanged(this, EventArgs.Empty);
}
#endregion
#region WinPart handling
/// <summary>
/// Add a new WinPart control to the
/// list of available documents and
/// make it the active WinPart.
/// </summary>
/// <param name="part">The WinPart control to add and display.</param>
private void AddWinPart(WinPart part)
{
part.CloseWinPart += new EventHandler(CloseWinPart);
part.BackColor = toolStrip1.BackColor;
Panel1.Controls.Add(part);
this.DocumentsToolStripDropDownButton.Enabled = true;
ShowWinPart(part);
}
/// <summary>
/// Make the specified WinPart the
/// active, displayed control.
/// </summary>
/// <param name="part">The WinPart control to display.</param>
private void ShowWinPart(WinPart part)
{
part.Dock = DockStyle.Fill;
part.Visible = true;
part.BringToFront();
this.Text = "Project Tracker - " + part.ToString();
}
/// <summary>
/// Populate the Documents dropdown list.
/// </summary>
private void DocumentsToolStripDropDownButton_DropDownOpening(
object sender, EventArgs e)
{
ToolStripItemCollection items =
DocumentsToolStripDropDownButton.DropDownItems;
foreach (ToolStripItem item in items)
item.Click -= new EventHandler(DocumentClick);
items.Clear();
foreach (Control ctl in Panel1.Controls)
if (ctl is WinPart)
{
ToolStripItem item = new ToolStripMenuItem();
item.Text = ((WinPart)ctl).ToString();
item.Tag = ctl;
item.Click += new EventHandler(DocumentClick);
items.Add(item);
}
}
/// <summary>
/// Make selected WinPart the active control.
/// </summary>
private void DocumentClick(object sender, EventArgs e)
{
WinPart ctl = (WinPart)((ToolStripItem)sender).Tag;
ShowWinPart(ctl);
}
/// <summary>
/// Gets a count of the number of loaded
/// documents.
/// </summary>
public int DocumentCount
{
get
{
int count = 0;
foreach (Control ctl in Panel1.Controls)
if (ctl is WinPart)
count++;
return count;
}
}
/// <summary>
/// Handles event from WinPart when that
/// WinPart is closing.
/// </summary>
private void CloseWinPart(object sender, EventArgs e)
{
WinPart part = (WinPart)sender;
part.CloseWinPart -= new EventHandler(CloseWinPart);
part.Visible = false;
Panel1.Controls.Remove(part);
part.Dispose();
if (DocumentCount == 0)
{
this.DocumentsToolStripDropDownButton.Enabled = false;
this.Text = "Project Tracker";
}
else
{
// Find the first WinPart control and set
// the main form's Text property accordingly.
// This works because the first WinPart
// is the active one.
foreach (Control ctl in Panel1.Controls)
{
if (ctl is WinPart)
{
this.Text = "Project Tracker - " + ((WinPart)ctl).ToString();
break;
}
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,403 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ProjectsStripDropDownButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
/g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
</value>
</data>
<data name="ResourcesToolStripDropDownButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
/g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
</value>
</data>
<data name="AdminToolStripDropDownButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
/g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
</value>
</data>
<data name="LoginToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
/g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
</value>
</data>
<data name="DocumentsToolStripDropDownButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL
U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI
VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ
QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4
/g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9
cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j
3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR
dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb
NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE
s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC
</value>
</data>
<metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>116, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,164 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{DAB85BA2-86A3-4D3B-8D34-324D939D952C}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PTWin</RootNamespace>
<AssemblyName>PTWin</AssemblyName>
<StartupObject>PTWin.Program</StartupObject>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Csla, Version=2.0.0.0, Culture=neutral, PublicKeyToken=93be5fdc093e4c30, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\csla20cs\Csla\bin\Debug\Csla.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="LoginForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="LoginForm.Designer.cs">
<DependentUpon>LoginForm.cs</DependentUpon>
</Compile>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="ProjectEdit.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="ProjectEdit.Designer.cs">
<DependentUpon>ProjectEdit.cs</DependentUpon>
</Compile>
<Compile Include="ProjectSelect.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ProjectSelect.Designer.cs">
<DependentUpon>ProjectSelect.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="LoginForm.resx">
<SubType>Designer</SubType>
<DependentUpon>LoginForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<SubType>Designer</SubType>
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ProjectEdit.resx">
<SubType>Designer</SubType>
<DependentUpon>ProjectEdit.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ProjectSelect.resx">
<SubType>Designer</SubType>
<DependentUpon>ProjectSelect.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ResourceEdit.resx">
<SubType>Designer</SubType>
<DependentUpon>ResourceEdit.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ResourceSelect.resx">
<SubType>Designer</SubType>
<DependentUpon>ResourceSelect.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="RolesEdit.resx">
<SubType>Designer</SubType>
<DependentUpon>RolesEdit.cs</DependentUpon>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="App.config" />
<None Include="Properties\DataSources\ProjectTracker.Library.Admin.Roles.datasource" />
<None Include="Properties\DataSources\ProjectTracker.Library.Project.datasource" />
<None Include="Properties\DataSources\ProjectTracker.Library.ProjectList.datasource" />
<None Include="Properties\DataSources\ProjectTracker.Library.Resource.datasource" />
<None Include="Properties\DataSources\ProjectTracker.Library.ResourceList.datasource" />
<None Include="Properties\DataSources\ProjectTracker.Library.RoleList.datasource" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="ResourceEdit.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="ResourceEdit.Designer.cs">
<DependentUpon>ResourceEdit.cs</DependentUpon>
</Compile>
<Compile Include="ResourceSelect.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ResourceSelect.Designer.cs">
<DependentUpon>ResourceSelect.cs</DependentUpon>
</Compile>
<Compile Include="RolesEdit.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="RolesEdit.Designer.cs">
<DependentUpon>RolesEdit.cs</DependentUpon>
</Compile>
<Compile Include="StatusBusy.cs" />
<Compile Include="WinPart.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="WinPart.Designer.cs">
<DependentUpon>WinPart.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ProjectTracker.Library\ProjectTracker.Library.csproj">
<Project>{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}</Project>
<Name>ProjectTracker.Library</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace PTWin
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@@ -0,0 +1,414 @@
namespace PTWin
{
partial class ProjectEdit
{
/// <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.Windows.Forms.Label DescriptionLabel;
System.Windows.Forms.Label EndedLabel;
System.Windows.Forms.Label IdLabel;
System.Windows.Forms.Label NameLabel;
System.Windows.Forms.Label StartedLabel;
this.CloseButton = new System.Windows.Forms.Button();
this.ApplyButton = new System.Windows.Forms.Button();
this.Cancel_Button = new System.Windows.Forms.Button();
this.OKButton = new System.Windows.Forms.Button();
this.GroupBox1 = new System.Windows.Forms.GroupBox();
this.UnassignButton = new System.Windows.Forms.Button();
this.AssignButton = new System.Windows.Forms.Button();
this.ResourcesDataGridView = new System.Windows.Forms.DataGridView();
this.ResourceId = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.FullName = new System.Windows.Forms.DataGridViewLinkColumn();
this.Role = new System.Windows.Forms.DataGridViewComboBoxColumn();
this.roleListBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.assignedDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.resourcesBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.projectBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.DescriptionTextBox = new System.Windows.Forms.TextBox();
this.EndedTextBox = new System.Windows.Forms.TextBox();
this.IdLabel1 = new System.Windows.Forms.Label();
this.NameTextBox = new System.Windows.Forms.TextBox();
this.StartedTextBox = new System.Windows.Forms.TextBox();
this.ErrorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);
this.ReadWriteAuthorization1 = new Csla.Windows.ReadWriteAuthorization(this.components);
this.BindingSourceRefresh1 = new Csla.Windows.BindingSourceRefresh(this.components);
DescriptionLabel = new System.Windows.Forms.Label();
EndedLabel = new System.Windows.Forms.Label();
IdLabel = new System.Windows.Forms.Label();
NameLabel = new System.Windows.Forms.Label();
StartedLabel = new System.Windows.Forms.Label();
this.GroupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ResourcesDataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.roleListBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.resourcesBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.projectBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ErrorProvider1)).BeginInit();
this.SuspendLayout();
//
// DescriptionLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(DescriptionLabel, false);
DescriptionLabel.AutoSize = true;
DescriptionLabel.Location = new System.Drawing.Point(12, 120);
DescriptionLabel.Name = "DescriptionLabel";
DescriptionLabel.Size = new System.Drawing.Size(63, 13);
DescriptionLabel.TabIndex = 31;
DescriptionLabel.Text = "Description:";
//
// EndedLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(EndedLabel, false);
EndedLabel.AutoSize = true;
EndedLabel.Location = new System.Drawing.Point(12, 94);
EndedLabel.Name = "EndedLabel";
EndedLabel.Size = new System.Drawing.Size(41, 13);
EndedLabel.TabIndex = 33;
EndedLabel.Text = "Ended:";
//
// IdLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(IdLabel, false);
IdLabel.AutoSize = true;
IdLabel.Location = new System.Drawing.Point(12, 13);
IdLabel.Name = "IdLabel";
IdLabel.Size = new System.Drawing.Size(19, 13);
IdLabel.TabIndex = 35;
IdLabel.Text = "Id:";
//
// NameLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(NameLabel, false);
NameLabel.AutoSize = true;
NameLabel.Location = new System.Drawing.Point(12, 42);
NameLabel.Name = "NameLabel";
NameLabel.Size = new System.Drawing.Size(38, 13);
NameLabel.TabIndex = 37;
NameLabel.Text = "Name:";
//
// StartedLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(StartedLabel, false);
StartedLabel.AutoSize = true;
StartedLabel.Location = new System.Drawing.Point(12, 68);
StartedLabel.Name = "StartedLabel";
StartedLabel.Size = new System.Drawing.Size(44, 13);
StartedLabel.TabIndex = 39;
StartedLabel.Text = "Started:";
//
// CloseButton
//
this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.CloseButton, false);
this.CloseButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.CloseButton.Location = new System.Drawing.Point(578, 100);
this.CloseButton.Name = "CloseButton";
this.CloseButton.Size = new System.Drawing.Size(75, 23);
this.CloseButton.TabIndex = 45;
this.CloseButton.Text = "Close";
this.CloseButton.UseVisualStyleBackColor = true;
this.CloseButton.Click += new System.EventHandler(this.CloseButton_Click);
//
// ApplyButton
//
this.ApplyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.ApplyButton, false);
this.ApplyButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.ApplyButton.Location = new System.Drawing.Point(578, 42);
this.ApplyButton.Name = "ApplyButton";
this.ApplyButton.Size = new System.Drawing.Size(75, 23);
this.ApplyButton.TabIndex = 44;
this.ApplyButton.Text = "Apply";
this.ApplyButton.UseVisualStyleBackColor = true;
this.ApplyButton.Click += new System.EventHandler(this.ApplyButton_Click);
//
// Cancel_Button
//
this.Cancel_Button.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.Cancel_Button, false);
this.Cancel_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel_Button.Location = new System.Drawing.Point(578, 71);
this.Cancel_Button.Name = "Cancel_Button";
this.Cancel_Button.Size = new System.Drawing.Size(75, 23);
this.Cancel_Button.TabIndex = 43;
this.Cancel_Button.Text = "Cancel";
this.Cancel_Button.UseVisualStyleBackColor = true;
this.Cancel_Button.Click += new System.EventHandler(this.Cancel_Button_Click);
//
// OKButton
//
this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.OKButton, false);
this.OKButton.Location = new System.Drawing.Point(578, 13);
this.OKButton.Name = "OKButton";
this.OKButton.Size = new System.Drawing.Size(75, 23);
this.OKButton.TabIndex = 42;
this.OKButton.Text = "OK";
this.OKButton.UseVisualStyleBackColor = true;
this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
//
// GroupBox1
//
this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.GroupBox1, false);
this.GroupBox1.Controls.Add(this.UnassignButton);
this.GroupBox1.Controls.Add(this.AssignButton);
this.GroupBox1.Controls.Add(this.ResourcesDataGridView);
this.GroupBox1.Location = new System.Drawing.Point(81, 231);
this.GroupBox1.Name = "GroupBox1";
this.GroupBox1.Size = new System.Drawing.Size(460, 210);
this.GroupBox1.TabIndex = 41;
this.GroupBox1.TabStop = false;
this.GroupBox1.Text = "Resources";
//
// UnassignButton
//
this.UnassignButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.UnassignButton, false);
this.UnassignButton.Location = new System.Drawing.Point(379, 48);
this.UnassignButton.Name = "UnassignButton";
this.UnassignButton.Size = new System.Drawing.Size(75, 23);
this.UnassignButton.TabIndex = 12;
this.UnassignButton.Text = "Unassign";
this.UnassignButton.UseVisualStyleBackColor = true;
this.UnassignButton.Click += new System.EventHandler(this.UnassignButton_Click);
//
// AssignButton
//
this.AssignButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.AssignButton, false);
this.AssignButton.Location = new System.Drawing.Point(379, 19);
this.AssignButton.Name = "AssignButton";
this.AssignButton.Size = new System.Drawing.Size(75, 23);
this.AssignButton.TabIndex = 11;
this.AssignButton.Text = "Assign";
this.AssignButton.UseVisualStyleBackColor = true;
this.AssignButton.Click += new System.EventHandler(this.AssignButton_Click);
//
// ResourcesDataGridView
//
this.ResourcesDataGridView.AllowUserToAddRows = false;
this.ResourcesDataGridView.AllowUserToDeleteRows = false;
this.ResourcesDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.ResourcesDataGridView, false);
this.ResourcesDataGridView.AutoGenerateColumns = false;
this.ResourcesDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.ResourcesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ResourceId,
this.FullName,
this.Role,
this.assignedDataGridViewTextBoxColumn});
this.ResourcesDataGridView.DataSource = this.resourcesBindingSource;
this.ResourcesDataGridView.Location = new System.Drawing.Point(6, 19);
this.ResourcesDataGridView.MultiSelect = false;
this.ResourcesDataGridView.Name = "ResourcesDataGridView";
this.ResourcesDataGridView.RowHeadersVisible = false;
this.ResourcesDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.ResourcesDataGridView.Size = new System.Drawing.Size(367, 185);
this.ResourcesDataGridView.TabIndex = 10;
this.ResourcesDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.ResourcesDataGridView_CellContentClick);
//
// ResourceId
//
this.ResourceId.DataPropertyName = "ResourceId";
this.ResourceId.HeaderText = "ResourceId";
this.ResourceId.Name = "ResourceId";
this.ResourceId.ReadOnly = true;
this.ResourceId.Visible = false;
this.ResourceId.Width = 87;
//
// FullName
//
this.FullName.DataPropertyName = "FullName";
this.FullName.HeaderText = "FullName";
this.FullName.Name = "FullName";
this.FullName.ReadOnly = true;
this.FullName.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.FullName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
this.FullName.Width = 76;
//
// Role
//
this.Role.DataPropertyName = "Role";
this.Role.DataSource = this.roleListBindingSource;
this.Role.DisplayMember = "Value";
this.Role.HeaderText = "Role";
this.Role.Name = "Role";
this.Role.ValueMember = "Key";
this.Role.Width = 35;
//
// roleListBindingSource
//
this.roleListBindingSource.DataSource = typeof(ProjectTracker.Library.RoleList);
this.BindingSourceRefresh1.SetReadValuesOnChange(this.roleListBindingSource, false);
//
// assignedDataGridViewTextBoxColumn
//
this.assignedDataGridViewTextBoxColumn.DataPropertyName = "Assigned";
this.assignedDataGridViewTextBoxColumn.HeaderText = "Assigned";
this.assignedDataGridViewTextBoxColumn.Name = "assignedDataGridViewTextBoxColumn";
this.assignedDataGridViewTextBoxColumn.ReadOnly = true;
this.assignedDataGridViewTextBoxColumn.Width = 75;
//
// resourcesBindingSource
//
this.resourcesBindingSource.DataMember = "Resources";
this.resourcesBindingSource.DataSource = this.projectBindingSource;
this.BindingSourceRefresh1.SetReadValuesOnChange(this.resourcesBindingSource, false);
//
// projectBindingSource
//
this.projectBindingSource.DataSource = typeof(ProjectTracker.Library.Project);
this.BindingSourceRefresh1.SetReadValuesOnChange(this.projectBindingSource, true);
//
// DescriptionTextBox
//
this.DescriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.DescriptionTextBox, true);
this.DescriptionTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.projectBindingSource, "Description", true));
this.DescriptionTextBox.Location = new System.Drawing.Point(81, 117);
this.DescriptionTextBox.Multiline = true;
this.DescriptionTextBox.Name = "DescriptionTextBox";
this.DescriptionTextBox.Size = new System.Drawing.Size(460, 108);
this.DescriptionTextBox.TabIndex = 32;
//
// EndedTextBox
//
this.EndedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.EndedTextBox, true);
this.EndedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.projectBindingSource, "Ended", true));
this.EndedTextBox.Location = new System.Drawing.Point(81, 91);
this.EndedTextBox.Name = "EndedTextBox";
this.EndedTextBox.Size = new System.Drawing.Size(460, 20);
this.EndedTextBox.TabIndex = 34;
//
// IdLabel1
//
this.IdLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.IdLabel1, false);
this.IdLabel1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.projectBindingSource, "Id", true));
this.IdLabel1.Location = new System.Drawing.Point(81, 13);
this.IdLabel1.Name = "IdLabel1";
this.IdLabel1.Size = new System.Drawing.Size(460, 23);
this.IdLabel1.TabIndex = 36;
//
// NameTextBox
//
this.NameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.NameTextBox, true);
this.NameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.projectBindingSource, "Name", true));
this.NameTextBox.Location = new System.Drawing.Point(81, 39);
this.NameTextBox.Name = "NameTextBox";
this.NameTextBox.Size = new System.Drawing.Size(460, 20);
this.NameTextBox.TabIndex = 38;
//
// StartedTextBox
//
this.StartedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.StartedTextBox, true);
this.StartedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.projectBindingSource, "Started", true));
this.StartedTextBox.Location = new System.Drawing.Point(81, 65);
this.StartedTextBox.Name = "StartedTextBox";
this.StartedTextBox.Size = new System.Drawing.Size(460, 20);
this.StartedTextBox.TabIndex = 40;
//
// ErrorProvider1
//
this.ErrorProvider1.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
this.ErrorProvider1.ContainerControl = this;
this.ErrorProvider1.DataSource = this.projectBindingSource;
//
// ProjectEdit
//
this.ReadWriteAuthorization1.SetApplyAuthorization(this, false);
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.CloseButton);
this.Controls.Add(this.ApplyButton);
this.Controls.Add(this.Cancel_Button);
this.Controls.Add(this.OKButton);
this.Controls.Add(this.GroupBox1);
this.Controls.Add(DescriptionLabel);
this.Controls.Add(this.DescriptionTextBox);
this.Controls.Add(EndedLabel);
this.Controls.Add(IdLabel);
this.Controls.Add(NameLabel);
this.Controls.Add(StartedLabel);
this.Controls.Add(this.EndedTextBox);
this.Controls.Add(this.IdLabel1);
this.Controls.Add(this.NameTextBox);
this.Controls.Add(this.StartedTextBox);
this.Name = "ProjectEdit";
this.Size = new System.Drawing.Size(665, 454);
this.CurrentPrincipalChanged += new System.EventHandler(this.ProjectEdit_CurrentPrincipalChanged);
this.GroupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.ResourcesDataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.roleListBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.resourcesBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.projectBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ErrorProvider1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.Button CloseButton;
internal System.Windows.Forms.Button ApplyButton;
internal System.Windows.Forms.Button Cancel_Button;
internal System.Windows.Forms.Button OKButton;
internal System.Windows.Forms.GroupBox GroupBox1;
internal System.Windows.Forms.Button UnassignButton;
internal System.Windows.Forms.Button AssignButton;
internal System.Windows.Forms.DataGridView ResourcesDataGridView;
internal System.Windows.Forms.TextBox DescriptionTextBox;
internal System.Windows.Forms.TextBox EndedTextBox;
internal System.Windows.Forms.Label IdLabel1;
internal System.Windows.Forms.TextBox NameTextBox;
internal System.Windows.Forms.TextBox StartedTextBox;
internal Csla.Windows.ReadWriteAuthorization ReadWriteAuthorization1;
internal System.Windows.Forms.ErrorProvider ErrorProvider1;
internal System.Windows.Forms.BindingSource projectBindingSource;
internal Csla.Windows.BindingSourceRefresh BindingSourceRefresh1;
internal System.Windows.Forms.BindingSource resourcesBindingSource;
internal System.Windows.Forms.BindingSource roleListBindingSource;
private System.Windows.Forms.DataGridViewTextBoxColumn ResourceId;
private System.Windows.Forms.DataGridViewLinkColumn FullName;
private System.Windows.Forms.DataGridViewComboBoxColumn Role;
private System.Windows.Forms.DataGridViewTextBoxColumn assignedDataGridViewTextBoxColumn;
}
}

View File

@@ -0,0 +1,187 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ProjectTracker.Library;
namespace PTWin
{
public partial class ProjectEdit : WinPart
{
private Project _project;
public Project Project
{
get { return _project; }
}
#region WinPart Code
public override string ToString()
{
return _project.Name;
}
protected internal override object GetIdValue()
{
return _project;
}
private void ProjectEdit_CurrentPrincipalChanged(
object sender, EventArgs e)
{
ApplyAuthorizationRules();
}
#endregion
private void ApplyAuthorizationRules()
{
// have the controls enable/disable/etc
this.ReadWriteAuthorization1.ResetControlAuthorization();
bool canEdit =
ProjectTracker.Library.Project.CanEditObject();
// enable/disable appropriate buttons
this.OKButton.Enabled = canEdit;
this.ApplyButton.Enabled = canEdit;
this.Cancel_Button.Enabled = canEdit;
this.AssignButton.Enabled = canEdit;
this.UnassignButton.Enabled = canEdit;
// enable/disable role column in grid
this.ResourcesDataGridView.Columns[2].ReadOnly =
!canEdit;
}
private void SaveProject(bool rebind)
{
using (StatusBusy busy = new StatusBusy("Saving..."))
{
this.projectBindingSource.RaiseListChangedEvents = false;
this.resourcesBindingSource.RaiseListChangedEvents = false;
// do the save
this.projectBindingSource.EndEdit();
this.resourcesBindingSource.EndEdit();
try
{
Project temp = _project.Clone();
_project = temp.Save();
if (rebind)
{
// rebind the UI
this.projectBindingSource.DataSource = null;
this.resourcesBindingSource.DataSource = this.projectBindingSource;
this.projectBindingSource.DataSource = _project;
ApplyAuthorizationRules();
}
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error saving", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error Saving", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
finally
{
this.projectBindingSource.RaiseListChangedEvents = true;
this.resourcesBindingSource.RaiseListChangedEvents = true;
this.projectBindingSource.ResetBindings(false);
this.resourcesBindingSource.ResetBindings(false);
}
}
}
public ProjectEdit(Project project)
{
InitializeComponent();
_project = project;
this.roleListBindingSource.DataSource = RoleList.GetList();
this.projectBindingSource.DataSource = _project;
ApplyAuthorizationRules();
}
private void OKButton_Click(object sender, EventArgs e)
{
SaveProject(false);
this.Close();
}
private void ApplyButton_Click(object sender, EventArgs e)
{
SaveProject(true);
}
private void Cancel_Button_Click(object sender, EventArgs e)
{
this.projectBindingSource.CancelEdit();
this.resourcesBindingSource.CancelEdit();
}
private void CloseButton_Click(object sender, EventArgs e)
{
this.projectBindingSource.CancelEdit();
this.resourcesBindingSource.CancelEdit();
this.Close();
}
private void AssignButton_Click(object sender, EventArgs e)
{
ResourceSelect dlg = new ResourceSelect();
if (dlg.ShowDialog() == DialogResult.OK)
try
{
_project.Resources.Assign(dlg.ResourceId);
}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.ToString(),
"Error Assigning", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error Assigning", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
private void UnassignButton_Click(object sender, EventArgs e)
{
if (this.ResourcesDataGridView.SelectedRows.Count > 0)
{
int resourceId = int.Parse(
this.ResourcesDataGridView.SelectedRows[0].
Cells[0].Value.ToString());
_project.Resources.Remove(resourceId);
}
}
private void ResourcesDataGridView_CellContentClick(
object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 1 && e.RowIndex > -1)
{
int resourceId = int.Parse(
this.ResourcesDataGridView.Rows[
e.RowIndex].Cells[0].Value.ToString());
MainForm.Instance.ShowEditResource(resourceId);
}
}
}
}

View File

@@ -0,0 +1,186 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="DescriptionLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="ReadWriteAuthorization1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>297, 17</value>
</metadata>
<metadata name="EndedLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="IdLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="NameLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="StartedLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="ResourceId.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="FullName.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Role.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="resourcesBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>472, 17</value>
</metadata>
<metadata name="ResourceId.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="FullName.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Role.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="roleListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>645, 17</value>
</metadata>
<metadata name="roleListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>645, 17</value>
</metadata>
<metadata name="BindingSourceRefresh1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>806, 17</value>
</metadata>
<metadata name="resourcesBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>472, 17</value>
</metadata>
<metadata name="projectBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>140, 17</value>
</metadata>
<metadata name="projectBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>140, 17</value>
</metadata>
<metadata name="ReadWriteAuthorization1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>297, 17</value>
</metadata>
<metadata name="ErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="BindingSourceRefresh1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>806, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,164 @@
namespace PTWin
{
partial class ProjectSelect
{
/// <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 Windows Form 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();
this.GetListButton = new System.Windows.Forms.Button();
this.NameTextBox = new System.Windows.Forms.TextBox();
this.NameLabel = new System.Windows.Forms.Label();
this.ProjectListListBox = new System.Windows.Forms.ListBox();
this.projectListBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.TableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.OK_Button = new System.Windows.Forms.Button();
this.Cancel_Button = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.projectListBindingSource)).BeginInit();
this.TableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// GetListButton
//
this.GetListButton.Location = new System.Drawing.Point(356, 9);
this.GetListButton.Name = "GetListButton";
this.GetListButton.Size = new System.Drawing.Size(75, 23);
this.GetListButton.TabIndex = 10;
this.GetListButton.Text = "Get list";
this.GetListButton.UseVisualStyleBackColor = true;
this.GetListButton.Click += new System.EventHandler(this.GetListButton_Click);
//
// NameTextBox
//
this.NameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.NameTextBox.Location = new System.Drawing.Point(83, 9);
this.NameTextBox.Name = "NameTextBox";
this.NameTextBox.Size = new System.Drawing.Size(267, 20);
this.NameTextBox.TabIndex = 9;
//
// NameLabel
//
this.NameLabel.AutoSize = true;
this.NameLabel.Location = new System.Drawing.Point(12, 12);
this.NameLabel.Name = "NameLabel";
this.NameLabel.Size = new System.Drawing.Size(38, 13);
this.NameLabel.TabIndex = 8;
this.NameLabel.Text = "Name:";
//
// ProjectListListBox
//
this.ProjectListListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ProjectListListBox.DataSource = this.projectListBindingSource;
this.ProjectListListBox.DisplayMember = "Name";
this.ProjectListListBox.Location = new System.Drawing.Point(12, 41);
this.ProjectListListBox.Name = "ProjectListListBox";
this.ProjectListListBox.Size = new System.Drawing.Size(419, 238);
this.ProjectListListBox.TabIndex = 7;
this.ProjectListListBox.ValueMember = "Id";
//
// projectListBindingSource
//
this.projectListBindingSource.DataSource = typeof(ProjectTracker.Library.ProjectInfo);
//
// TableLayoutPanel1
//
this.TableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.TableLayoutPanel1.ColumnCount = 2;
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Controls.Add(this.OK_Button, 0, 0);
this.TableLayoutPanel1.Controls.Add(this.Cancel_Button, 1, 0);
this.TableLayoutPanel1.Location = new System.Drawing.Point(285, 285);
this.TableLayoutPanel1.Name = "TableLayoutPanel1";
this.TableLayoutPanel1.RowCount = 1;
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Size = new System.Drawing.Size(146, 29);
this.TableLayoutPanel1.TabIndex = 6;
//
// OK_Button
//
this.OK_Button.Anchor = System.Windows.Forms.AnchorStyles.None;
this.OK_Button.DialogResult = System.Windows.Forms.DialogResult.OK;
this.OK_Button.Location = new System.Drawing.Point(3, 3);
this.OK_Button.Name = "OK_Button";
this.OK_Button.Size = new System.Drawing.Size(67, 23);
this.OK_Button.TabIndex = 0;
this.OK_Button.Text = "OK";
this.OK_Button.Click += new System.EventHandler(this.OK_Button_Click);
//
// Cancel_Button
//
this.Cancel_Button.Anchor = System.Windows.Forms.AnchorStyles.None;
this.Cancel_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel_Button.Location = new System.Drawing.Point(76, 3);
this.Cancel_Button.Name = "Cancel_Button";
this.Cancel_Button.Size = new System.Drawing.Size(67, 23);
this.Cancel_Button.TabIndex = 1;
this.Cancel_Button.Text = "Cancel";
this.Cancel_Button.Click += new System.EventHandler(this.Cancel_Button_Click);
//
// ProjectSelect
//
this.AcceptButton = this.OK_Button;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel_Button;
this.ClientSize = new System.Drawing.Size(443, 323);
this.Controls.Add(this.GetListButton);
this.Controls.Add(this.NameTextBox);
this.Controls.Add(this.NameLabel);
this.Controls.Add(this.ProjectListListBox);
this.Controls.Add(this.TableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ProjectSelect";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Select Project";
this.Load += new System.EventHandler(this.ProjectSelect_Load);
((System.ComponentModel.ISupportInitialize)(this.projectListBindingSource)).EndInit();
this.TableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.Button GetListButton;
internal System.Windows.Forms.TextBox NameTextBox;
internal System.Windows.Forms.Label NameLabel;
internal System.Windows.Forms.ListBox ProjectListListBox;
internal System.Windows.Forms.TableLayoutPanel TableLayoutPanel1;
internal System.Windows.Forms.Button OK_Button;
internal System.Windows.Forms.Button Cancel_Button;
private System.Windows.Forms.BindingSource projectListBindingSource;
}
}

View File

@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ProjectTracker.Library;
namespace PTWin
{
public partial class ProjectSelect : Form
{
private Guid _projectId;
public Guid ProjectId
{
get { return _projectId; }
}
public ProjectSelect()
{
InitializeComponent();
}
private void OK_Button_Click(object sender, EventArgs e)
{
_projectId = (Guid)this.ProjectListListBox.SelectedValue;
this.Close();
}
private void Cancel_Button_Click(object sender, EventArgs e)
{
this.Close();
}
private void ProjectSelect_Load(object sender, EventArgs e)
{
DisplayList(ProjectList.GetProjectList());
}
private void DisplayList(ProjectList list)
{
Csla.SortedBindingList<ProjectInfo> sortedList =
new Csla.SortedBindingList<ProjectInfo>(list);
sortedList.ApplySort("Name", ListSortDirection.Ascending);
this.projectListBindingSource.DataSource = sortedList;
}
private void GetListButton_Click(
object sender, EventArgs e)
{
DisplayList(ProjectList.GetProjectList(NameTextBox.Text));
}
}
}

View File

@@ -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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="projectListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PTWin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Rockford Lhotka")]
[assembly: AssemblyProduct("ProjectTracker")]
[assembly: AssemblyCopyright("Copyright © Rockford Lhotka 2006")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e8881d52-b4d0-431b-894b-7919c175f24c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="Roles" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ProjectTracker.Library.Admin.Roles, ProjectTracker.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="Project" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ProjectTracker.Library.Project, ProjectTracker.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
<TypeUISetting>
<PropertyUISettings>
<PropertyUISetting Name="Id">
<ControlSettings>
<ControlSetting ArtifactName="Microsoft:System.Windows.Forms:Form">
<BindableControlInfo Name="Label" Type="System.Windows.Forms.Label" AssemblyName="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</ControlSetting>
</ControlSettings>
</PropertyUISetting>
</PropertyUISettings>
</TypeUISetting>
</GenericObjectDataSource>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="ProjectList" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ProjectTracker.Library.ProjectList, ProjectTracker.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="Resource" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ProjectTracker.Library.Resource, ProjectTracker.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="ResourceList" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ProjectTracker.Library.ResourceList, ProjectTracker.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="RoleList" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>ProjectTracker.Library.RoleList, ProjectTracker.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PTWin.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.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("PTWin.Properties.Resources", typeof(Resources).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(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PTWin.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -0,0 +1,358 @@
namespace PTWin
{
partial class ResourceEdit
{
/// <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.Windows.Forms.Label FirstNameLabel;
System.Windows.Forms.Label IdLabel;
System.Windows.Forms.Label LastNameLabel;
this.CloseButton = new System.Windows.Forms.Button();
this.ApplyButton = new System.Windows.Forms.Button();
this.Cancel_Button = new System.Windows.Forms.Button();
this.OKButton = new System.Windows.Forms.Button();
this.GroupBox1 = new System.Windows.Forms.GroupBox();
this.AssignmentsDataGridView = new System.Windows.Forms.DataGridView();
this.RoleListBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.AssignmentsBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.ResourceBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.UnassignButton = new System.Windows.Forms.Button();
this.AssignButton = new System.Windows.Forms.Button();
this.FirstNameTextBox = new System.Windows.Forms.TextBox();
this.IdLabel1 = new System.Windows.Forms.Label();
this.LastNameTextBox = new System.Windows.Forms.TextBox();
this.ErrorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);
this.BindingSourceRefresh1 = new Csla.Windows.BindingSourceRefresh(this.components);
this.ReadWriteAuthorization1 = new Csla.Windows.ReadWriteAuthorization(this.components);
this.projectIdDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.projectNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewLinkColumn();
this.assignedDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Role = new System.Windows.Forms.DataGridViewComboBoxColumn();
FirstNameLabel = new System.Windows.Forms.Label();
IdLabel = new System.Windows.Forms.Label();
LastNameLabel = new System.Windows.Forms.Label();
this.GroupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.AssignmentsDataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.RoleListBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.AssignmentsBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ResourceBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ErrorProvider1)).BeginInit();
this.SuspendLayout();
//
// FirstNameLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(FirstNameLabel, false);
FirstNameLabel.AutoSize = true;
FirstNameLabel.Location = new System.Drawing.Point(13, 42);
FirstNameLabel.Name = "FirstNameLabel";
FirstNameLabel.Size = new System.Drawing.Size(60, 13);
FirstNameLabel.TabIndex = 35;
FirstNameLabel.Text = "First Name:";
//
// IdLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(IdLabel, false);
IdLabel.AutoSize = true;
IdLabel.Location = new System.Drawing.Point(13, 13);
IdLabel.Name = "IdLabel";
IdLabel.Size = new System.Drawing.Size(19, 13);
IdLabel.TabIndex = 37;
IdLabel.Text = "Id:";
//
// LastNameLabel
//
this.ReadWriteAuthorization1.SetApplyAuthorization(LastNameLabel, false);
LastNameLabel.AutoSize = true;
LastNameLabel.Location = new System.Drawing.Point(13, 68);
LastNameLabel.Name = "LastNameLabel";
LastNameLabel.Size = new System.Drawing.Size(61, 13);
LastNameLabel.TabIndex = 39;
LastNameLabel.Text = "Last Name:";
//
// CloseButton
//
this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.CloseButton, false);
this.CloseButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.CloseButton.Location = new System.Drawing.Point(501, 100);
this.CloseButton.Name = "CloseButton";
this.CloseButton.Size = new System.Drawing.Size(75, 23);
this.CloseButton.TabIndex = 45;
this.CloseButton.Text = "Close";
this.CloseButton.UseVisualStyleBackColor = true;
this.CloseButton.Click += new System.EventHandler(this.CloseButton_Click);
//
// ApplyButton
//
this.ApplyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.ApplyButton, false);
this.ApplyButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.ApplyButton.Location = new System.Drawing.Point(501, 42);
this.ApplyButton.Name = "ApplyButton";
this.ApplyButton.Size = new System.Drawing.Size(75, 23);
this.ApplyButton.TabIndex = 44;
this.ApplyButton.Text = "Apply";
this.ApplyButton.UseVisualStyleBackColor = true;
this.ApplyButton.Click += new System.EventHandler(this.ApplyButton_Click);
//
// Cancel_Button
//
this.Cancel_Button.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.Cancel_Button, false);
this.Cancel_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel_Button.Location = new System.Drawing.Point(501, 71);
this.Cancel_Button.Name = "Cancel_Button";
this.Cancel_Button.Size = new System.Drawing.Size(75, 23);
this.Cancel_Button.TabIndex = 43;
this.Cancel_Button.Text = "Cancel";
this.Cancel_Button.UseVisualStyleBackColor = true;
this.Cancel_Button.Click += new System.EventHandler(this.Cancel_Button_Click);
//
// OKButton
//
this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.OKButton, false);
this.OKButton.Location = new System.Drawing.Point(501, 13);
this.OKButton.Name = "OKButton";
this.OKButton.Size = new System.Drawing.Size(75, 23);
this.OKButton.TabIndex = 42;
this.OKButton.Text = "OK";
this.OKButton.UseVisualStyleBackColor = true;
this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
//
// GroupBox1
//
this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.GroupBox1, false);
this.GroupBox1.Controls.Add(this.AssignmentsDataGridView);
this.GroupBox1.Controls.Add(this.UnassignButton);
this.GroupBox1.Controls.Add(this.AssignButton);
this.GroupBox1.Location = new System.Drawing.Point(16, 91);
this.GroupBox1.Name = "GroupBox1";
this.GroupBox1.Size = new System.Drawing.Size(449, 310);
this.GroupBox1.TabIndex = 41;
this.GroupBox1.TabStop = false;
this.GroupBox1.Text = "Assigned projects";
//
// AssignmentsDataGridView
//
this.AssignmentsDataGridView.AllowUserToAddRows = false;
this.AssignmentsDataGridView.AllowUserToDeleteRows = false;
this.AssignmentsDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.AssignmentsDataGridView, false);
this.AssignmentsDataGridView.AutoGenerateColumns = false;
this.AssignmentsDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.AssignmentsDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.projectIdDataGridViewTextBoxColumn,
this.projectNameDataGridViewTextBoxColumn,
this.assignedDataGridViewTextBoxColumn,
this.Role});
this.AssignmentsDataGridView.DataSource = this.AssignmentsBindingSource;
this.AssignmentsDataGridView.Location = new System.Drawing.Point(6, 19);
this.AssignmentsDataGridView.MultiSelect = false;
this.AssignmentsDataGridView.Name = "AssignmentsDataGridView";
this.AssignmentsDataGridView.RowHeadersVisible = false;
this.AssignmentsDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.AssignmentsDataGridView.Size = new System.Drawing.Size(356, 285);
this.AssignmentsDataGridView.TabIndex = 15;
this.AssignmentsDataGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.AssignmentsDataGridView_CellContentClick);
//
// RoleListBindingSource
//
this.RoleListBindingSource.DataSource = typeof(ProjectTracker.Library.RoleList);
this.BindingSourceRefresh1.SetReadValuesOnChange(this.RoleListBindingSource, false);
//
// AssignmentsBindingSource
//
this.AssignmentsBindingSource.DataMember = "Assignments";
this.AssignmentsBindingSource.DataSource = this.ResourceBindingSource;
this.BindingSourceRefresh1.SetReadValuesOnChange(this.AssignmentsBindingSource, false);
//
// ResourceBindingSource
//
this.ResourceBindingSource.DataSource = typeof(ProjectTracker.Library.Resource);
this.BindingSourceRefresh1.SetReadValuesOnChange(this.ResourceBindingSource, true);
//
// UnassignButton
//
this.UnassignButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.UnassignButton, false);
this.UnassignButton.Location = new System.Drawing.Point(368, 48);
this.UnassignButton.Name = "UnassignButton";
this.UnassignButton.Size = new System.Drawing.Size(75, 23);
this.UnassignButton.TabIndex = 14;
this.UnassignButton.Text = "Unassign";
this.UnassignButton.UseVisualStyleBackColor = true;
this.UnassignButton.Click += new System.EventHandler(this.UnassignButton_Click);
//
// AssignButton
//
this.AssignButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.AssignButton, false);
this.AssignButton.Location = new System.Drawing.Point(368, 19);
this.AssignButton.Name = "AssignButton";
this.AssignButton.Size = new System.Drawing.Size(75, 23);
this.AssignButton.TabIndex = 13;
this.AssignButton.Text = "Assign";
this.AssignButton.UseVisualStyleBackColor = true;
this.AssignButton.Click += new System.EventHandler(this.AssignButton_Click);
//
// FirstNameTextBox
//
this.FirstNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.FirstNameTextBox, true);
this.FirstNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ResourceBindingSource, "FirstName", true));
this.FirstNameTextBox.Location = new System.Drawing.Point(80, 39);
this.FirstNameTextBox.Name = "FirstNameTextBox";
this.FirstNameTextBox.Size = new System.Drawing.Size(385, 20);
this.FirstNameTextBox.TabIndex = 36;
//
// IdLabel1
//
this.IdLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.IdLabel1, true);
this.IdLabel1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ResourceBindingSource, "Id", true));
this.IdLabel1.Location = new System.Drawing.Point(80, 13);
this.IdLabel1.Name = "IdLabel1";
this.IdLabel1.Size = new System.Drawing.Size(385, 23);
this.IdLabel1.TabIndex = 38;
//
// LastNameTextBox
//
this.LastNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ReadWriteAuthorization1.SetApplyAuthorization(this.LastNameTextBox, true);
this.LastNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ResourceBindingSource, "LastName", true));
this.LastNameTextBox.Location = new System.Drawing.Point(80, 65);
this.LastNameTextBox.Name = "LastNameTextBox";
this.LastNameTextBox.Size = new System.Drawing.Size(385, 20);
this.LastNameTextBox.TabIndex = 40;
//
// ErrorProvider1
//
this.ErrorProvider1.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
this.ErrorProvider1.ContainerControl = this;
this.ErrorProvider1.DataSource = this.ResourceBindingSource;
//
// projectIdDataGridViewTextBoxColumn
//
this.projectIdDataGridViewTextBoxColumn.DataPropertyName = "ProjectId";
this.projectIdDataGridViewTextBoxColumn.HeaderText = "ProjectId";
this.projectIdDataGridViewTextBoxColumn.Name = "projectIdDataGridViewTextBoxColumn";
this.projectIdDataGridViewTextBoxColumn.ReadOnly = true;
this.projectIdDataGridViewTextBoxColumn.Visible = false;
this.projectIdDataGridViewTextBoxColumn.Width = 74;
//
// projectNameDataGridViewTextBoxColumn
//
this.projectNameDataGridViewTextBoxColumn.DataPropertyName = "ProjectName";
this.projectNameDataGridViewTextBoxColumn.HeaderText = "Project Name";
this.projectNameDataGridViewTextBoxColumn.Name = "projectNameDataGridViewTextBoxColumn";
this.projectNameDataGridViewTextBoxColumn.ReadOnly = true;
this.projectNameDataGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.projectNameDataGridViewTextBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
this.projectNameDataGridViewTextBoxColumn.Width = 96;
//
// assignedDataGridViewTextBoxColumn
//
this.assignedDataGridViewTextBoxColumn.DataPropertyName = "Assigned";
this.assignedDataGridViewTextBoxColumn.HeaderText = "Assigned";
this.assignedDataGridViewTextBoxColumn.Name = "assignedDataGridViewTextBoxColumn";
this.assignedDataGridViewTextBoxColumn.ReadOnly = true;
this.assignedDataGridViewTextBoxColumn.Width = 75;
//
// Role
//
this.Role.DataPropertyName = "Role";
this.Role.DataSource = this.RoleListBindingSource;
this.Role.DisplayMember = "Value";
this.Role.HeaderText = "Role";
this.Role.Name = "Role";
this.Role.ValueMember = "Key";
this.Role.Width = 35;
//
// ResourceEdit
//
this.ReadWriteAuthorization1.SetApplyAuthorization(this, false);
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.CloseButton);
this.Controls.Add(this.ApplyButton);
this.Controls.Add(this.Cancel_Button);
this.Controls.Add(this.OKButton);
this.Controls.Add(this.GroupBox1);
this.Controls.Add(FirstNameLabel);
this.Controls.Add(this.FirstNameTextBox);
this.Controls.Add(IdLabel);
this.Controls.Add(this.IdLabel1);
this.Controls.Add(LastNameLabel);
this.Controls.Add(this.LastNameTextBox);
this.Name = "ResourceEdit";
this.Size = new System.Drawing.Size(588, 415);
this.GroupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.AssignmentsDataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.RoleListBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.AssignmentsBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ResourceBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ErrorProvider1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal System.Windows.Forms.Button CloseButton;
internal System.Windows.Forms.Button ApplyButton;
internal System.Windows.Forms.Button Cancel_Button;
internal System.Windows.Forms.Button OKButton;
internal System.Windows.Forms.GroupBox GroupBox1;
internal System.Windows.Forms.Button UnassignButton;
internal System.Windows.Forms.Button AssignButton;
internal System.Windows.Forms.TextBox FirstNameTextBox;
internal System.Windows.Forms.Label IdLabel1;
internal System.Windows.Forms.TextBox LastNameTextBox;
internal Csla.Windows.ReadWriteAuthorization ReadWriteAuthorization1;
internal System.Windows.Forms.DataGridView AssignmentsDataGridView;
internal System.Windows.Forms.BindingSource RoleListBindingSource;
internal Csla.Windows.BindingSourceRefresh BindingSourceRefresh1;
internal System.Windows.Forms.BindingSource AssignmentsBindingSource;
internal System.Windows.Forms.BindingSource ResourceBindingSource;
internal System.Windows.Forms.ErrorProvider ErrorProvider1;
private System.Windows.Forms.DataGridViewTextBoxColumn projectIdDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewLinkColumn projectNameDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn assignedDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewComboBoxColumn Role;
}
}

View File

@@ -0,0 +1,190 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ProjectTracker.Library;
namespace PTWin
{
public partial class ResourceEdit : WinPart
{
private Resource _resource;
public Resource Resource
{
get { return _resource; }
}
public ResourceEdit(Resource resource)
{
InitializeComponent();
_resource = resource;
this.CurrentPrincipalChanged += new EventHandler(ResourceEdit_CurrentPrincipalChanged);
_resource.PropertyChanged += new PropertyChangedEventHandler(mResource_PropertyChanged);
this.RoleListBindingSource.DataSource = RoleList.GetList();
this.ResourceBindingSource.DataSource = _resource;
ApplyAuthorizationRules();
}
#region WinPart Code
protected internal override object GetIdValue()
{
return _resource;
}
public override string ToString()
{
return _resource.FullName;
}
private void ResourceEdit_CurrentPrincipalChanged(object sender, EventArgs e)
{
ApplyAuthorizationRules();
}
#endregion
private void ApplyAuthorizationRules()
{
// have the controls enable/disable/etc
this.ReadWriteAuthorization1.ResetControlAuthorization();
bool canEdit = ProjectTracker.Library.Project.CanEditObject();
// enable/disable appropriate buttons
this.OKButton.Enabled = canEdit;
this.ApplyButton.Enabled = canEdit;
this.Cancel_Button.Enabled = canEdit;
// enable/disable role column in grid
this.AssignmentsDataGridView.Columns[3].ReadOnly = !canEdit;
}
private void SaveResource(bool rebind)
{
using (StatusBusy busy = new StatusBusy("Saving..."))
{
// stop the flow of events
this.ResourceBindingSource.RaiseListChangedEvents = false;
this.AssignmentsBindingSource.RaiseListChangedEvents = false;
// do the save
this.ResourceBindingSource.EndEdit();
this.AssignmentsBindingSource.EndEdit();
try
{
Resource temp = Resource.Clone();
_resource = temp.Save();
if (rebind)
{
// rebind the UI
this.ResourceBindingSource.DataSource = null;
this.AssignmentsBindingSource.DataSource = this.ResourceBindingSource;
this.ResourceBindingSource.DataSource = _resource;
ApplyAuthorizationRules();
}
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error saving", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error Saving", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
finally
{
this.ResourceBindingSource.RaiseListChangedEvents = true;
this.AssignmentsBindingSource.RaiseListChangedEvents = true;
this.ResourceBindingSource.ResetBindings(false);
this.AssignmentsBindingSource.ResetBindings(false);
}
}
}
private void OKButton_Click(object sender, EventArgs e)
{
SaveResource(false);
this.Close();
}
private void ApplyButton_Click(object sender, EventArgs e)
{
SaveResource(true);
}
private void Cancel_Button_Click(object sender, EventArgs e)
{
this.ResourceBindingSource.CancelEdit();
this.AssignmentsBindingSource.CancelEdit();
}
private void CloseButton_Click(object sender, EventArgs e)
{
this.ResourceBindingSource.CancelEdit();
this.AssignmentsBindingSource.CancelEdit();
this.Close();
}
private void AssignButton_Click(object sender, EventArgs e)
{
ProjectSelect dlg = new ProjectSelect();
if (dlg.ShowDialog() == DialogResult.OK)
try
{
_resource.Assignments.AssignTo(dlg.ProjectId);
}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.ToString(),
"Error Assigning", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Error Assigning", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
private void UnassignButton_Click(object sender, EventArgs e)
{
if (this.AssignmentsDataGridView.SelectedRows.Count > 0)
{
Guid projectId = (Guid)this.AssignmentsDataGridView.SelectedRows[0].Cells[0].Value;
_resource.Assignments.Remove(projectId);
}
}
private void mResource_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsDirty")
{
this.ResourceBindingSource.ResetBindings(true);
this.AssignmentsBindingSource.ResetBindings(true);
}
}
private void AssignmentsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 1 && e.RowIndex > -1)
{
Guid projectId = (Guid)this.AssignmentsDataGridView.Rows[e.RowIndex].Cells[0].Value;
MainForm.Instance.ShowEditProject(projectId);
}
}
}
}

View File

@@ -0,0 +1,159 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="FirstNameLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="ReadWriteAuthorization1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>21, 38</value>
</metadata>
<metadata name="IdLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="LastNameLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="ReadWriteAuthorization1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>21, 38</value>
</metadata>
<metadata name="Role.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="RoleListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>15, 9</value>
</metadata>
<metadata name="BindingSourceRefresh1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>652, 9</value>
</metadata>
<metadata name="AssignmentsBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>344, 9</value>
</metadata>
<metadata name="ResourceBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>176, 9</value>
</metadata>
<metadata name="ResourceBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>176, 9</value>
</metadata>
<metadata name="ErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>529, 9</value>
</metadata>
<metadata name="BindingSourceRefresh1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>652, 9</value>
</metadata>
</root>

View File

@@ -0,0 +1,121 @@
namespace PTWin
{
partial class ResourceSelect
{
/// <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 Windows Form 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();
this.ResourceListListBox = new System.Windows.Forms.ListBox();
this.ResourceListBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.TableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.OK_Button = new System.Windows.Forms.Button();
this.Cancel_Button = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.ResourceListBindingSource)).BeginInit();
this.TableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// ResourceListListBox
//
this.ResourceListListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ResourceListListBox.DataSource = this.ResourceListBindingSource;
this.ResourceListListBox.Location = new System.Drawing.Point(12, 12);
this.ResourceListListBox.Name = "ResourceListListBox";
this.ResourceListListBox.Size = new System.Drawing.Size(416, 264);
this.ResourceListListBox.TabIndex = 4;
//
// ResourceListBindingSource
//
this.ResourceListBindingSource.DataSource = typeof(ProjectTracker.Library.ResourceList);
//
// TableLayoutPanel1
//
this.TableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.TableLayoutPanel1.ColumnCount = 2;
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Controls.Add(this.OK_Button, 0, 0);
this.TableLayoutPanel1.Controls.Add(this.Cancel_Button, 1, 0);
this.TableLayoutPanel1.Location = new System.Drawing.Point(285, 282);
this.TableLayoutPanel1.Name = "TableLayoutPanel1";
this.TableLayoutPanel1.RowCount = 1;
this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.TableLayoutPanel1.Size = new System.Drawing.Size(146, 29);
this.TableLayoutPanel1.TabIndex = 3;
//
// OK_Button
//
this.OK_Button.Anchor = System.Windows.Forms.AnchorStyles.None;
this.OK_Button.DialogResult = System.Windows.Forms.DialogResult.OK;
this.OK_Button.Location = new System.Drawing.Point(3, 3);
this.OK_Button.Name = "OK_Button";
this.OK_Button.Size = new System.Drawing.Size(67, 23);
this.OK_Button.TabIndex = 0;
this.OK_Button.Text = "OK";
this.OK_Button.Click += new System.EventHandler(this.OK_Button_Click);
//
// Cancel_Button
//
this.Cancel_Button.Anchor = System.Windows.Forms.AnchorStyles.None;
this.Cancel_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel_Button.Location = new System.Drawing.Point(76, 3);
this.Cancel_Button.Name = "Cancel_Button";
this.Cancel_Button.Size = new System.Drawing.Size(67, 23);
this.Cancel_Button.TabIndex = 1;
this.Cancel_Button.Text = "Cancel";
this.Cancel_Button.Click += new System.EventHandler(this.Cancel_Button_Click);
//
// ResourceSelect
//
this.ClientSize = new System.Drawing.Size(443, 323);
this.Controls.Add(this.ResourceListListBox);
this.Controls.Add(this.TableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ResourceSelect";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "ResourceSelect";
this.Load += new System.EventHandler(this.ResourceSelect_Load);
((System.ComponentModel.ISupportInitialize)(this.ResourceListBindingSource)).EndInit();
this.TableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
internal System.Windows.Forms.ListBox ResourceListListBox;
internal System.Windows.Forms.TableLayoutPanel TableLayoutPanel1;
internal System.Windows.Forms.Button OK_Button;
internal System.Windows.Forms.Button Cancel_Button;
internal System.Windows.Forms.BindingSource ResourceListBindingSource;
}
}

View File

@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ProjectTracker.Library;
namespace PTWin
{
public partial class ResourceSelect : Form
{
private int _resourceId;
public int ResourceId
{
get { return _resourceId; }
}
public ResourceSelect()
{
InitializeComponent();
}
private void OK_Button_Click(object sender, EventArgs e)
{
_resourceId =
((ResourceInfo)
this.ResourceListListBox.SelectedValue).Id;
this.Close();
}
private void Cancel_Button_Click(object sender, EventArgs e)
{
this.Close();
}
private void ResourceSelect_Load(object sender, EventArgs e)
{
this.ResourceListBindingSource.DataSource =
ResourceList.GetResourceList();
}
}
}

View File

@@ -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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ResourceListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,122 @@
namespace PTWin
{
partial class RolesEdit
{
/// <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();
this.CancelButton = new System.Windows.Forms.Button();
this.SaveButton = new System.Windows.Forms.Button();
this.rolesBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.RolesDataGridView = new System.Windows.Forms.DataGridView();
this.DataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.rolesBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.RolesDataGridView)).BeginInit();
this.SuspendLayout();
//
// CancelButton
//
this.CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.CancelButton.Location = new System.Drawing.Point(453, 42);
this.CancelButton.Name = "CancelButton";
this.CancelButton.Size = new System.Drawing.Size(75, 23);
this.CancelButton.TabIndex = 6;
this.CancelButton.Text = "Cancel";
this.CancelButton.UseVisualStyleBackColor = true;
this.CancelButton.Click += new System.EventHandler(this.CancelButton_Click);
//
// SaveButton
//
this.SaveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.SaveButton.Location = new System.Drawing.Point(453, 13);
this.SaveButton.Name = "SaveButton";
this.SaveButton.Size = new System.Drawing.Size(75, 23);
this.SaveButton.TabIndex = 5;
this.SaveButton.Text = "Save";
this.SaveButton.UseVisualStyleBackColor = true;
this.SaveButton.Click += new System.EventHandler(this.SaveButton_Click);
//
// rolesBindingSource
//
this.rolesBindingSource.DataSource = typeof(ProjectTracker.Library.Admin.Roles);
//
// RolesDataGridView
//
this.RolesDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.RolesDataGridView.AutoGenerateColumns = false;
this.RolesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.DataGridViewTextBoxColumn1,
this.DataGridViewTextBoxColumn2});
this.RolesDataGridView.DataSource = this.rolesBindingSource;
this.RolesDataGridView.Location = new System.Drawing.Point(12, 13);
this.RolesDataGridView.MultiSelect = false;
this.RolesDataGridView.Name = "RolesDataGridView";
this.RolesDataGridView.Size = new System.Drawing.Size(435, 323);
this.RolesDataGridView.TabIndex = 7;
//
// DataGridViewTextBoxColumn1
//
this.DataGridViewTextBoxColumn1.DataPropertyName = "Id";
this.DataGridViewTextBoxColumn1.HeaderText = "Id";
this.DataGridViewTextBoxColumn1.Name = "DataGridViewTextBoxColumn1";
//
// DataGridViewTextBoxColumn2
//
this.DataGridViewTextBoxColumn2.DataPropertyName = "Name";
this.DataGridViewTextBoxColumn2.HeaderText = "Name";
this.DataGridViewTextBoxColumn2.Name = "DataGridViewTextBoxColumn2";
//
// RolesEdit
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.RolesDataGridView);
this.Controls.Add(this.CancelButton);
this.Controls.Add(this.SaveButton);
this.Name = "RolesEdit";
this.Size = new System.Drawing.Size(541, 348);
this.Load += new System.EventHandler(this.RolesEdit_Load);
this.CurrentPrincipalChanged += new System.EventHandler(this.RolesEdit_CurrentPrincipalChanged);
((System.ComponentModel.ISupportInitialize)(this.rolesBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.RolesDataGridView)).EndInit();
this.ResumeLayout(false);
}
#endregion
internal System.Windows.Forms.Button CancelButton;
internal System.Windows.Forms.Button SaveButton;
internal System.Windows.Forms.BindingSource rolesBindingSource;
internal System.Windows.Forms.DataGridView RolesDataGridView;
internal System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn1;
internal System.Windows.Forms.DataGridViewTextBoxColumn DataGridViewTextBoxColumn2;
}
}

View File

@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ProjectTracker.Library.Admin;
namespace PTWin
{
public partial class RolesEdit : WinPart
{
private Roles _roles;
public RolesEdit()
{
InitializeComponent();
}
private void RolesEdit_Load(object sender, EventArgs e)
{
try
{
_roles = Roles.GetRoles();
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Data load error", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),
"Data load error", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
if (_roles != null)
this.rolesBindingSource.DataSource = _roles;
}
protected internal override object GetIdValue()
{
return "Edit Roles";
}
private void SaveButton_Click(object sender, EventArgs e)
{
this.rolesBindingSource.RaiseListChangedEvents = false;
this.rolesBindingSource.EndEdit();
try
{
Roles temp = _roles.Clone();
_roles = temp.Save();
this.Close();
}
catch (Csla.DataPortalException ex)
{
MessageBox.Show(ex.BusinessException.ToString(),
"Error saving", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error saving",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
this.rolesBindingSource.RaiseListChangedEvents = true;
this.rolesBindingSource.ResetBindings(false);
}
}
private void CancelButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void RolesEdit_CurrentPrincipalChanged(
object sender, EventArgs e)
{
if (!Roles.CanEditObject())
this.Close();
}
}
}

View File

@@ -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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="rolesBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,40 @@
using System;
using System.Windows.Forms;
namespace PTWin
{
public class StatusBusy : IDisposable
{
private string _oldStatus;
private Cursor _oldCursor;
public StatusBusy(string statusText)
{
_oldStatus = MainForm.Instance.StatusLabel.Text;
MainForm.Instance.StatusLabel.Text = statusText;
_oldCursor = MainForm.Instance.Cursor;
MainForm.Instance.Cursor = Cursors.WaitCursor;
}
// IDisposable
private bool _disposedValue = false; // To detect redundant calls
protected void Dispose(bool disposing)
{
if (!_disposedValue)
if (disposing)
{
MainForm.Instance.StatusLabel.Text = _oldStatus;
MainForm.Instance.Cursor = _oldCursor;
}
_disposedValue = true;
}
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above
Dispose(true);
GC.SuppressFinalize(this);
}
}
}

View File

@@ -0,0 +1,37 @@
namespace PTWin
{
partial class WinPart
{
/// <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()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
}
#endregion
}
}

View File

@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace PTWin
{
public partial class WinPart : UserControl
{
public WinPart()
{
InitializeComponent();
}
protected internal virtual object GetIdValue()
{
return null;
}
public override bool Equals(object obj)
{
if (this.DesignMode)
return base.Equals(obj);
else
{
object id = GetIdValue();
if (this.GetType().Equals(obj.GetType()) && id != null)
return ((WinPart)obj).GetIdValue().Equals(id);
else
return false;
}
}
public override int GetHashCode()
{
object id = GetIdValue();
if (id != null)
return GetIdValue().GetHashCode();
else
return base.GetHashCode();
}
public override string ToString()
{
object id = GetIdValue();
if (id != null)
return id.ToString();
else
return base.ToString();
}
#region CloseWinPart
public event EventHandler CloseWinPart;
protected void Close()
{
if (CloseWinPart != null)
CloseWinPart(this, EventArgs.Empty);
}
#endregion
#region CurrentPrincipalChanged
public event EventHandler CurrentPrincipalChanged;
protected internal virtual void OnCurrentPrincipalChanged(
object sender, EventArgs e)
{
if (CurrentPrincipalChanged != null)
CurrentPrincipalChanged(sender, e);
}
#endregion
}
}

View File

@@ -0,0 +1,220 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
namespace ProjectTracker.Library.Admin
{
[Serializable()]
public class Role : BusinessBase<Role>
{
#region Business Methods
private int _id;
private bool _idSet;
private string _name = String.Empty;
private byte[] _timestamp = new byte[8];
[System.ComponentModel.DataObjectField(true, true)]
public int Id
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
if (!_idSet)
{
// generate a default id value
_idSet = true;
Roles parent = (Roles)this.Parent;
int max = 0;
foreach (Role item in parent)
{
if (item.Id > max)
max = item.Id;
}
_id = max + 1;
}
return _id;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (!_id.Equals(value))
{
_idSet = true;
_id = value;
PropertyHasChanged();
}
}
}
public string Name
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _name;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (!_name.Equals(value))
{
_name = value;
PropertyHasChanged();
}
}
}
protected override object GetIdValue()
{
return _id;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(
Csla.Validation.CommonRules.StringRequired, "Name");
}
protected override void AddInstanceBusinessRules()
{
ValidationRules.AddInstanceRule(NoDuplicates, "Id");
}
private bool NoDuplicates(object target, Csla.Validation.RuleArgs e)
{
Roles parent = (Roles)this.Parent;
foreach (Role item in parent)
if (item.Id == _id && !ReferenceEquals(item, this))
{
e.Description = "Role Id must be unique";
return false;
}
return true;
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
AuthorizationRules.AllowWrite(
"Id", "Administrator");
AuthorizationRules.AllowWrite(
"Name", "Administrator");
}
#endregion
#region Factory Methods
internal static Role NewRole()
{
return new Role();
}
internal static Role
GetRole(Csla.Data.SafeDataReader dr)
{
return new Role(dr);
}
private Role()
{
MarkAsChild();
}
#endregion
#region Data Access
private Role(Csla.Data.SafeDataReader dr)
{
MarkAsChild();
_id = dr.GetInt32("id");
_idSet = true;
_name = dr.GetString("name");
dr.GetBytes("lastChanged", 0, _timestamp, 0, 8);
MarkOld();
}
internal void Insert(SqlConnection cn)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "addRole";
DoInsertUpdate(cm);
}
}
internal void Update(SqlConnection cn)
{
// if we're not dirty then don't update the database.
if (!this.IsDirty) return;
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "updateRole";
cm.Parameters.AddWithValue("@lastChanged", _timestamp);
DoInsertUpdate(cm);
}
}
void DoInsertUpdate(SqlCommand cm)
{
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@id", _id);
cm.Parameters.AddWithValue("@name", _name);
SqlParameter param =
new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
_timestamp = (byte[])cm.Parameters["@newLastChanged"].Value;
MarkOld();
}
internal void DeleteSelf(SqlConnection cn)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
// if we're new then don't update the database
if (this.IsNew) return;
DeleteRole(cn, _id);
MarkNew();
}
internal static void DeleteRole(SqlConnection cn, int id)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "deleteRole";
cm.Parameters.AddWithValue("@id", id);
cm.ExecuteNonQuery();
}
}
#endregion
}
}

View File

@@ -0,0 +1,175 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library.Admin
{
/// <summary>
/// Used to maintain the list of roles
/// in the system.
/// </summary>
[Serializable()]
public class Roles :
BusinessListBase<Roles, Role>
{
#region Business Methods
/// <summary>
/// Remove a role based on the role's
/// id value.
/// </summary>
/// <param name="id">Id value of the role to remove.</param>
public void Remove(int id)
{
foreach (Role item in this)
{
if (item.Id == id)
{
Remove(item);
break;
}
}
}
/// <summary>
/// Get a role based on its id value.
/// </summary>
/// <param name="id">Id valud of the role to return</param>
public Role GetRoleById(int id)
{
foreach (Role item in this)
if (item.Id == id)
return item;
return null;
}
protected override object AddNewCore()
{
Role item = Role.NewRole();
Add(item);
return item;
}
#endregion
#region Authorization Rules
public static bool CanAddObject()
{
return Csla.ApplicationContext.User.IsInRole("Administrator");
}
public static bool CanGetObject()
{
return true;
}
public static bool CanDeleteObject()
{
return Csla.ApplicationContext.User.IsInRole("Administrator");
}
public static bool CanEditObject()
{
return Csla.ApplicationContext.User.IsInRole("Administrator");
}
#endregion
#region Factory Methods
public static Roles GetRoles()
{
return DataPortal.Fetch<Roles>(new Criteria());
}
private Roles()
{
this.AllowNew = true;
}
#endregion
#region Data Access
[Serializable()]
private class Criteria
{ /* no criteria */ }
public override Roles Save()
{
// see if save is allowed
if (!CanEditObject())
throw new System.Security.SecurityException(
"User not authorized to save roles");
// do the save
Roles result;
result = base.Save();
// this runs on the client and invalidates
// the RoleList cache
RoleList.InvalidateCache();
return result;
}
protected override void DataPortal_OnDataPortalInvokeComplete(
DataPortalEventArgs e)
{
if (ApplicationContext.ExecutionLocation ==
ApplicationContext.ExecutionLocations.Server)
{
// this runs on the server and invalidates
// the RoleList cache
RoleList.InvalidateCache();
}
}
private void DataPortal_Fetch(Criteria criteria)
{
RaiseListChangedEvents = false;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getRoles";
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
while (dr.Read())
this.Add(Role.GetRole(dr));
}
}
RaiseListChangedEvents = true;
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Update()
{
this.RaiseListChangedEvents = false;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
foreach (Role item in DeletedList)
{
item.DeleteSelf(cn);
}
DeletedList.Clear();
foreach (Role item in this)
{
if (item.IsNew)
item.Insert(cn);
else
item.Update(cn);
}
}
this.RaiseListChangedEvents = true;
}
#endregion
}
}

View File

@@ -0,0 +1,114 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Validation;
using Csla.Data;
using System.Reflection;
namespace ProjectTracker.Library
{
internal interface IHoldRoles
{
int Role { get; set;}
}
internal static class Assignment
{
#region Business Methods
public static DateTime GetDefaultAssignedDate()
{
return DateTime.Today;
}
#endregion
#region Validation Rules
/// <summary>
/// Ensure the Role property value exists
/// in RoleList
/// </summary>
public static bool ValidRole(object target, RuleArgs e)
{
int role = ((IHoldRoles)target).Role;
if (RoleList.GetList().ContainsKey(role))
return true;
else
{
e.Description = "Role must be in RoleList";
return false;
}
}
#endregion
#region Data Access
public static byte[] AddAssignment(
SqlConnection cn, Guid projectId, int resourceId,
SmartDate assigned, int role)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "addAssignment";
return DoAddUpdate(
cm, projectId, resourceId, assigned, role);
}
}
public static byte[] UpdateAssignment(SqlConnection cn,
Guid projectId, int resourceId, SmartDate assigned,
int newRole, byte[] timestamp)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "updateAssignment";
cm.Parameters.AddWithValue("@lastChanged", timestamp);
return DoAddUpdate(
cm, projectId, resourceId, assigned, newRole);
}
}
private static byte[] DoAddUpdate(SqlCommand cm,
Guid projectId, int resourceId, SmartDate assigned,
int newRole)
{
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@projectId", projectId);
cm.Parameters.AddWithValue("@resourceId", resourceId);
cm.Parameters.AddWithValue("@assigned", assigned.DBValue);
cm.Parameters.AddWithValue("@role", newRole);
SqlParameter param =
new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
return (byte[])cm.Parameters["@newLastChanged"].Value;
}
public static void RemoveAssignment(
SqlConnection cn, Guid projectId, int resourceId)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "deleteAssignment";
cm.Parameters.AddWithValue("@projectId", projectId);
cm.Parameters.AddWithValue("@resourceId", resourceId);
cm.ExecuteNonQuery();
}
}
#endregion
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace ProjectTracker.Library
{
public static class Database
{
public static string PTrackerConnection
{
get
{
return ConfigurationManager.ConnectionStrings
["PTracker"].ConnectionString;
}
}
public static string SecurityConnection
{
get { return System.Configuration.ConfigurationManager.ConnectionStrings["Security"].ConnectionString; }
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<ClassDiagram MajorVersion="1" MinorVersion="1">
<Font Name="Tahoma" Size="8.25" />
<Class Name="ProjectTracker.Library.Project" Collapsed="true">
<Position X="1" Y="2.75" Width="1.5" />
<TypeIdentifier>
<FileName>Project.cs</FileName>
<HashCode>EAACIIwBIgAgRAEEAAjIAgQAAAJAgAECAhgBAAEAmAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="Csla.BusinessBase&lt;T&gt;" Collapsed="true">
<Position X="1" Y="1.5" Width="1.5" />
<TypeIdentifier />
</Class>
</ClassDiagram>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<ClassDiagram MajorVersion="1" MinorVersion="1">
<Font Name="Tahoma" Size="8.25" />
<Class Name="ProjectTracker.Library.Project" Collapsed="true">
<Position X="2" Y="1.75" Width="2.25" />
<TypeIdentifier>
<FileName>Project.cs</FileName>
<HashCode>EAACIIwBIgAgRAEEAAjIAgQAAAJAgAECAhgBAAEAmAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.Resource" Collapsed="true">
<Position X="5" Y="1.75" Width="2.25" />
<TypeIdentifier>
<FileName>Resource.cs</FileName>
<HashCode>FAMCgMgAAAAARIAAAAlIAAAAAABAgAECABgJCAEAiAg=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="Csla.BusinessBase&lt;T&gt;" Collapsed="true">
<Position X="4.5" Y="0.5" Width="2.25" />
<TypeIdentifier />
</Class>
<Class Name="ProjectTracker.Library.ProjectResource" Collapsed="true">
<Position X="2" Y="2.75" Width="2.25" />
<TypeIdentifier>
<FileName>ProjectResource.cs</FileName>
<HashCode>EAUAAEAAAgAAgIAAEAEAAAAAAAAAAAoAAAABCEAAigg=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.ResourceAssignment" Collapsed="true">
<Position X="5" Y="2.75" Width="2.25" />
<TypeIdentifier>
<FileName>ResourceAssignment.cs</FileName>
<HashCode>EAQAAEAAAAAAAABAGAAAAAAABAAAAAIAAgABAEAIigA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.ProjectResources" Collapsed="true">
<Position X="0.5" Y="5.75" Width="3.25" />
<TypeIdentifier>
<FileName>ProjectResources.cs</FileName>
<HashCode>AAQAAAQAAAAAAGAAAAAABAAAAAAAAAAAAAAAQBAQCAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.ResourceAssignments" Collapsed="true">
<Position X="4" Y="5.75" Width="3.25" />
<TypeIdentifier>
<FileName>ResourceAssignments.cs</FileName>
<HashCode>AAQAAAAAAAAAAAAACAAABAAAIAAAgAAAEAAAAAAACAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="Csla.BusinessListBase&lt;T, C&gt;" Collapsed="true">
<Position X="4.5" Y="4.5" Width="2.25" />
<TypeIdentifier />
<Lollipop Position="0.2" />
</Class>
<Class Name="ProjectTracker.Library.Admin.Roles" Collapsed="true">
<Position X="7.5" Y="5.75" Width="1.75" />
<TypeIdentifier>
<FileName>Admin\Roles.cs</FileName>
<HashCode>AAAAAIAAAAAARAAAEAAAhAACACAAgAECAAgAAAAAAAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.Admin.Role" Collapsed="true">
<Position X="7.75" Y="1.75" Width="1.5" />
<TypeIdentifier>
<FileName>Admin\Role.cs</FileName>
<HashCode>UAQCIEEAAAAAAAAAgARAAAQAAAAAAAAAAAAAAEAAgAA=</HashCode>
</TypeIdentifier>
</Class>
</ClassDiagram>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<ClassDiagram MajorVersion="1" MinorVersion="1">
<Font Name="Tahoma" Size="8.25" />
<Class Name="ProjectTracker.Library.ResourceList" Collapsed="true">
<Position X="4.5" Y="1.75" Width="2.5" />
<TypeIdentifier>
<FileName>ResourceList.cs</FileName>
<HashCode>AAAAAAAAAAAABAAAgAAAAAAAAAAAIAAAAAAAAAAAAAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.ProjectList" Collapsed="true">
<Position X="1.75" Y="1.75" Width="2.5" />
<TypeIdentifier>
<FileName>ProjectList.cs</FileName>
<HashCode>AAAAAAAAAAAABEAAAAEAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="Csla.ReadOnlyListBase&lt;T, C&gt;" Collapsed="true">
<Position X="3.25" Y="0.5" Width="2.25" />
<TypeIdentifier />
<Lollipop Position="0.2" />
</Class>
<Class Name="ProjectTracker.Library.RoleList" Collapsed="true">
<Position X="3.5" Y="5" Width="2.25" />
<TypeIdentifier>
<FileName>RoleList.cs</FileName>
<HashCode>AAABAAAAAAAABAAAAAAAAAAAAAAAAABAQAAAAAAAAAI=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="Csla.NameValueListBase&lt;K, V&gt;" Collapsed="true">
<Position X="3.5" Y="3.75" Width="2.25" />
<TypeIdentifier />
<Lollipop Position="0.2" />
</Class>
</ClassDiagram>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<ClassDiagram MajorVersion="1" MinorVersion="1">
<Font Name="Tahoma" Size="8.25" />
<Class Name="ProjectTracker.Library.Security.PTPrincipal" Collapsed="true">
<Position X="3" Y="2.75" Width="1.75" />
<TypeIdentifier>
<FileName>Security\PTPrincipal.cs</FileName>
<HashCode>AAAAAAAACAAAAAAAAAAAAAIAAAAAAAAAAAAQAAAAAAA=</HashCode>
</TypeIdentifier>
</Class>
<Class Name="ProjectTracker.Library.Security.PTIdentity" Collapsed="true">
<Position X="5.25" Y="2.75" Width="1.75" />
<TypeIdentifier>
<FileName>Security\PTIdentity.cs</FileName>
<HashCode>AAAAIAAACAAABAAACAAAAAQgAAAEAAAAAAABAIAAABA=</HashCode>
</TypeIdentifier>
<Lollipop Position="0.2" />
</Class>
<Class Name="Csla.Security.BusinessPrincipalBase" Collapsed="true">
<Position X="3" Y="1.5" Width="1.75" />
<TypeIdentifier />
<Lollipop Position="0.2" />
</Class>
<Class Name="Csla.ReadOnlyBase&lt;T&gt;" Collapsed="true">
<Position X="5.25" Y="1.5" Width="1.75" />
<TypeIdentifier />
<Lollipop Position="0.2" />
</Class>
</ClassDiagram>

View File

@@ -0,0 +1,440 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class Project : BusinessBase<Project>
{
#region Business Methods
private Guid _id;
private string _name = string.Empty;
private SmartDate _started;
private SmartDate _ended = new SmartDate(false);
private string _description = string.Empty;
private byte[] _timestamp = new byte[8];
private ProjectResources _resources =
ProjectResources.NewProjectResources();
[System.ComponentModel.DataObjectField(true, true)]
public Guid Id
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _id;
}
}
public string Name
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _name;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (_name != value)
{
_name = value;
PropertyHasChanged();
}
}
}
public string Started
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _started.Text;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (_started != value)
{
_started.Text = value;
PropertyHasChanged();
}
}
}
public string Ended
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _ended.Text;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (_ended != value)
{
_ended.Text = value;
PropertyHasChanged();
}
}
}
public string Description
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _description;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (_description != value)
{
_description = value;
PropertyHasChanged();
}
}
}
public ProjectResources Resources
{
get { return _resources; }
}
public override bool IsValid
{
get { return base.IsValid && _resources.IsValid; }
}
public override bool IsDirty
{
get { return base.IsDirty || _resources.IsDirty; }
}
protected override object GetIdValue()
{
return _id;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(
Csla.Validation.CommonRules.StringRequired, "Name");
ValidationRules.AddRule(
Csla.Validation.CommonRules.StringMaxLength,
new Csla.Validation.CommonRules.MaxLengthRuleArgs("Name", 50));
ValidationRules.AddRule<Project>(
StartDateGTEndDate<Project>, "Started");
ValidationRules.AddRule<Project>(
StartDateGTEndDate<Project>, "Ended");
ValidationRules.AddDependantProperty("Started", "Ended", true);
}
private static bool StartDateGTEndDate<T>(
T target, Csla.Validation.RuleArgs e) where T : Project
{
if (target._started > target._ended)
{
e.Description =
"Start date can't be after end date";
return false;
}
else
return true;
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
AuthorizationRules.AllowWrite(
"Name", "ProjectManager");
AuthorizationRules.AllowWrite(
"Started", "ProjectManager");
AuthorizationRules.AllowWrite(
"Ended", "ProjectManager");
AuthorizationRules.AllowWrite(
"Description", "ProjectManager");
}
public static bool CanAddObject()
{
return Csla.ApplicationContext.User.IsInRole(
"ProjectManager");
}
public static bool CanGetObject()
{
return true;
}
public static bool CanDeleteObject()
{
bool result = false;
if (Csla.ApplicationContext.User.IsInRole(
"ProjectManager"))
result = true;
if (Csla.ApplicationContext.User.IsInRole(
"Administrator"))
result = true;
return result;
}
public static bool CanEditObject()
{
return Csla.ApplicationContext.User.IsInRole("ProjectManager");
}
#endregion
#region Factory Methods
public static Project NewProject()
{
if (!CanAddObject())
throw new System.Security.SecurityException(
"User not authorized to add a project");
return DataPortal.Create<Project>();
}
public static Project GetProject(Guid id)
{
if (!CanGetObject())
throw new System.Security.SecurityException(
"User not authorized to view a project");
return DataPortal.Fetch<Project>(new Criteria(id));
}
public static void DeleteProject(Guid id)
{
if (!CanDeleteObject())
throw new System.Security.SecurityException(
"User not authorized to remove a project");
DataPortal.Delete(new Criteria(id));
}
private Project()
{ /* require use of factory methods */ }
public override Project Save()
{
if (IsDeleted && !CanDeleteObject())
throw new System.Security.SecurityException(
"User not authorized to remove a project");
else if (IsNew && !CanAddObject())
throw new System.Security.SecurityException(
"User not authorized to add a project");
else if (!CanEditObject())
throw new System.Security.SecurityException(
"User not authorized to update a project");
return base.Save();
}
#endregion
#region Data Access
[Serializable()]
private class Criteria
{
private Guid _id;
public Guid Id
{
get { return _id; }
}
public Criteria(Guid id)
{ _id = id; }
}
[RunLocal()]
protected override void DataPortal_Create()
{
_id = Guid.NewGuid();
_started.Date = DateTime.Today;
ValidationRules.CheckRules();
}
private void DataPortal_Fetch(Criteria criteria)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getProject";
cm.Parameters.AddWithValue("@id", criteria.Id);
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
dr.Read();
_id = dr.GetGuid("Id");
_name = dr.GetString("Name");
_started = dr.GetSmartDate("Started", _started.EmptyIsMin);
_ended = dr.GetSmartDate("Ended", _ended.EmptyIsMin);
_description = dr.GetString("Description");
dr.GetBytes("LastChanged", 0, _timestamp, 0, 8);
// load child objects
dr.NextResult();
_resources = ProjectResources.GetProjectResources(dr);
}
}
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Insert()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "addProject";
DoInsertUpdate(cm);
}
}
// update child objects
_resources.Update(this);
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Update()
{
if (base.IsDirty)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "updateProject";
cm.Parameters.AddWithValue("@lastChanged", _timestamp);
DoInsertUpdate(cm);
}
}
}
// update child objects
_resources.Update(this);
}
private void DoInsertUpdate(SqlCommand cm)
{
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@id", _id);
cm.Parameters.AddWithValue("@name", _name);
cm.Parameters.AddWithValue("@started", _started.DBValue);
cm.Parameters.AddWithValue("@ended", _ended.DBValue);
cm.Parameters.AddWithValue("@description", _description);
SqlParameter param =
new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
_timestamp = (byte[])cm.Parameters["@newLastChanged"].Value;
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_DeleteSelf()
{
DataPortal_Delete(new Criteria(_id));
}
[Transactional(TransactionalTypes.TransactionScope)]
private void DataPortal_Delete(Criteria criteria)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "deleteProject";
cm.Parameters.AddWithValue("@id", criteria.Id);
cm.ExecuteNonQuery();
}
}
}
#endregion
#region Exists
public static bool Exists(Guid id)
{
ExistsCommand result;
result = DataPortal.Execute<ExistsCommand>
(new ExistsCommand(id));
return result.Exists;
}
[Serializable()]
private class ExistsCommand : CommandBase
{
private Guid _id;
private bool _exists;
public bool Exists
{
get { return _exists; }
}
public ExistsCommand(Guid id)
{
_id = id;
}
protected override void DataPortal_Execute()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "existsProject";
cm.Parameters.AddWithValue("@id", _id);
int count = (int)cm.ExecuteScalar();
_exists = (count > 0);
}
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ProjectInfo :
ReadOnlyBase<ProjectInfo>
{
#region Business Methods
private Guid _id;
private string _name;
public Guid Id
{
get { return _id; }
}
public string Name
{
get { return _name; }
}
protected override object GetIdValue()
{
return _id;
}
public override string ToString()
{
return _name;
}
#endregion
#region Constructors
private ProjectInfo()
{ /* require use of factory methods */ }
internal ProjectInfo(Guid id, string name)
{
_id = id;
_name = name;
}
#endregion
}
}

View File

@@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ProjectList :
ReadOnlyListBase<ProjectList, ProjectInfo>
{
#region Factory Methods
/// <summary>
/// Return a list of all projects.
/// </summary>
public static ProjectList GetProjectList()
{
return DataPortal.Fetch<ProjectList>(new Criteria());
}
/// <summary>
/// Return a list of projects filtered
/// by project name.
/// </summary>
public static ProjectList GetProjectList(string name)
{
return DataPortal.Fetch<ProjectList>
(new FilteredCriteria(name));
}
private ProjectList()
{ /* require use of factory methods */ }
#endregion
#region Data Access
[Serializable()]
private class Criteria
{ /* no criteria - retrieve all projects */ }
[Serializable()]
private class FilteredCriteria
{
private string _name;
public string Name
{
get { return _name; }
}
public FilteredCriteria(string name)
{
_name = name;
}
}
private void DataPortal_Fetch(Criteria criteria)
{
// fetch with no filter
Fetch("");
}
private void DataPortal_Fetch(FilteredCriteria criteria)
{
Fetch(criteria.Name);
}
private void Fetch(string nameFilter)
{
this.RaiseListChangedEvents = false;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getProjects";
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
IsReadOnly = false;
while (dr.Read())
{
ProjectInfo info = new ProjectInfo(
dr.GetGuid(0),
dr.GetString(1));
// apply filter if necessary
if ((nameFilter.Length == 0) || (info.Name.IndexOf(nameFilter) == 0))
this.Add(info);
}
IsReadOnly = true;
}
}
}
this.RaiseListChangedEvents = true;
}
#endregion
}
}

View File

@@ -0,0 +1,228 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
using Csla.Validation;
namespace ProjectTracker.Library
{
[Serializable()]
public class ProjectResource :
BusinessBase<ProjectResource>, IHoldRoles
{
#region Business Methods
private int _resourceId;
private string _firstName = string.Empty;
private string _lastName = string.Empty;
private SmartDate _assigned;
private int _role;
private byte[] _timestamp = new byte[8];
[System.ComponentModel.DataObjectField(false, true)]
public int ResourceId
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _resourceId;
}
}
public string FirstName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _firstName;
}
}
public string LastName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _lastName;
}
}
public string FullName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
if (CanReadProperty("FirstName") &&
CanReadProperty("LastName"))
return string.Format("{0}, {1}", LastName, FirstName);
else
throw new System.Security.SecurityException(
"Property read not allowed");
}
}
public string Assigned
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _assigned.Text;
}
}
public int Role
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _role;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (!_role.Equals(value))
{
_role = value;
PropertyHasChanged();
}
}
}
public Resource GetResource()
{
return Resource.GetResource(_resourceId);
}
protected override object GetIdValue()
{
return _resourceId;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(
new Csla.Validation.RuleHandler(
Assignment.ValidRole), "Role");
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
AuthorizationRules.AllowWrite(
"Role", "ProjectManager");
}
#endregion
#region Factory Methods
internal static ProjectResource NewProjectResource(int resourceId)
{
return new ProjectResource(
Resource.GetResource(resourceId),
RoleList.DefaultRole());
}
internal static ProjectResource GetResource(SafeDataReader dr)
{
return new ProjectResource(dr);
}
private ProjectResource()
{
MarkAsChild();
}
private ProjectResource(Resource resource, int role)
{
MarkAsChild();
_resourceId = resource.Id;
_lastName = resource.LastName;
_firstName = resource.FirstName;
_assigned.Date = Assignment.GetDefaultAssignedDate();
_role = role;
}
private ProjectResource(SafeDataReader dr)
{
MarkAsChild();
Fetch(dr);
}
#endregion
#region Data Access
private void Fetch(SafeDataReader dr)
{
_resourceId = dr.GetInt32("ResourceId");
_lastName = dr.GetString("LastName");
_firstName = dr.GetString("FirstName");
_assigned = dr.GetSmartDate("Assigned");
_role = dr.GetInt32("Role");
dr.GetBytes("LastChanged", 0, _timestamp, 0, 8);
MarkOld();
}
internal void Insert(Project project)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
_timestamp = Assignment.AddAssignment(
cn, project.Id, _resourceId, _assigned, _role);
MarkOld();
}
}
internal void Update(Project project)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
_timestamp = Assignment.UpdateAssignment(
cn, project.Id, _resourceId, _assigned, _role, _timestamp);
MarkOld();
}
}
internal void DeleteSelf(Project project)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
// if we're new then don't update the database
if (this.IsNew) return;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
Assignment.RemoveAssignment(cn, project.Id, _resourceId);
MarkNew();
}
}
#endregion
}
}

View File

@@ -0,0 +1,125 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ProjectResources :
BusinessListBase<ProjectResources, ProjectResource>
{
#region Business Methods
public ProjectResource GetItem(int resourceId)
{
foreach (ProjectResource res in this)
if (res.ResourceId == resourceId)
return res;
return null;
}
public void Assign(int resourceId)
{
if (!Contains(resourceId))
{
ProjectResource resource =
ProjectResource.NewProjectResource(resourceId);
this.Add(resource);
}
else
throw new InvalidOperationException(
"Resource already assigned to project");
}
public void Remove(int resourceId)
{
foreach (ProjectResource res in this)
{
if (res.ResourceId == resourceId)
{
Remove(res);
break;
}
}
}
public bool Contains(int resourceId)
{
foreach (ProjectResource res in this)
if (res.ResourceId == resourceId)
return true;
return false;
}
public bool ContainsDeleted(int resourceId)
{
foreach (ProjectResource res in DeletedList)
if (res.ResourceId == resourceId)
return true;
return false;
}
#endregion
#region Factory Methods
internal static ProjectResources NewProjectResources()
{
return new ProjectResources();
}
internal static ProjectResources GetProjectResources(SafeDataReader dr)
{
return new ProjectResources(dr);
}
private ProjectResources()
{
MarkAsChild();
}
private ProjectResources(SafeDataReader dr)
{
MarkAsChild();
Fetch(dr);
}
#endregion
#region Data Access
// called to load data from the database
private void Fetch(SafeDataReader dr)
{
this.RaiseListChangedEvents = false;
while (dr.Read())
this.Add(ProjectResource.GetResource(dr));
this.RaiseListChangedEvents = true;
}
internal void Update(Project project)
{
this.RaiseListChangedEvents = false;
// update (thus deleting) any deleted child objects
foreach (ProjectResource obj in DeletedList)
obj.DeleteSelf(project);
// now that they are deleted, remove them from memory too
DeletedList.Clear();
// add/update any current child objects
foreach (ProjectResource obj in this)
{
if (obj.IsNew)
obj.Insert(project);
else
obj.Update(project);
}
this.RaiseListChangedEvents = true;
}
#endregion
}
}

View File

@@ -0,0 +1,74 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ProjectTracker.Library</RootNamespace>
<AssemblyName>ProjectTracker.Library</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Csla, Version=2.0.0.0, Culture=neutral, PublicKeyToken=93be5fdc093e4c30, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\csla20cs\Csla\bin\Debug\Csla.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Admin\Role.cs" />
<Compile Include="Admin\Roles.cs" />
<Compile Include="Assignment.cs" />
<Compile Include="Database.cs" />
<Compile Include="Project.cs" />
<Compile Include="ProjectInfo.cs" />
<Compile Include="ProjectList.cs" />
<Compile Include="ProjectResource.cs" />
<Compile Include="ProjectResources.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resource.cs" />
<Compile Include="ResourceAssignment.cs" />
<Compile Include="ResourceAssignments.cs" />
<Compile Include="ResourceInfo.cs" />
<Compile Include="ResourceList.cs" />
<Compile Include="RoleList.cs" />
<Compile Include="Security\PTIdentity.cs" />
<Compile Include="Security\PTPrincipal.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Diagrams\BaseClasses.cd" />
<None Include="Diagrams\EditableObjects.cd" />
<None Include="Diagrams\ReadOnlyObjects.cd" />
<None Include="Diagrams\Security.cd" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ProjectTracker.Library")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Rockford Lhotka")]
[assembly: AssemblyProduct("ProjectTracker")]
[assembly: AssemblyCopyright("Copyright © Rockford Lhotka 2006")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("52a894db-5427-450c-9924-b11ce791853a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,395 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
using Csla.Validation;
namespace ProjectTracker.Library
{
[Serializable()]
public class Resource : BusinessBase<Resource>
{
#region Business Methods
private int _id;
private string _lastName = string.Empty;
private string _firstName = string.Empty;
private byte[] _timestamp = new byte[8];
private ResourceAssignments _assignments = ResourceAssignments.NewResourceAssignments();
[System.ComponentModel.DataObjectField(true, true)]
public int Id
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _id;
}
}
public string LastName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _lastName;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (value == null) value = string.Empty;
if (_lastName != value)
{
_lastName = value;
PropertyHasChanged();
}
}
}
public string FirstName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _firstName;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty();
if (value == null) value = string.Empty;
if (_firstName != value)
{
_firstName = value;
PropertyHasChanged();
}
}
}
public string FullName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
if (CanReadProperty("FirstName") && CanReadProperty("LastName"))
return string.Format("{0}, {1}", _lastName, _firstName);
else
throw new System.Security.SecurityException("Property read not allowed");
}
}
public ResourceAssignments Assignments
{
get { return _assignments; }
}
public override bool IsValid
{
get { return base.IsValid && _assignments.IsValid; }
}
public override bool IsDirty
{
get { return base.IsDirty || _assignments.IsDirty; }
}
protected override object GetIdValue()
{
return _id;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(new RuleHandler(CommonRules.StringRequired), "FirstName");
ValidationRules.AddRule(new RuleHandler(CommonRules.StringMaxLength),
new CommonRules.MaxLengthRuleArgs("FirstName", 50));
ValidationRules.AddRule(new RuleHandler(CommonRules.StringMaxLength),
new CommonRules.MaxLengthRuleArgs("LastName", 50));
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
// add AuthorizationRules here
AuthorizationRules.AllowWrite("LastName", "ProjectManager");
AuthorizationRules.AllowWrite("FirstName", "ProjectManager");
}
public static bool CanAddObject()
{
return Csla.ApplicationContext.User.IsInRole("ProjectManager");
}
public static bool CanGetObject()
{
return true;
}
public static bool CanDeleteObject()
{
bool result = false;
if (Csla.ApplicationContext.User.IsInRole("ProjectManager"))
result = true;
if (Csla.ApplicationContext.User.IsInRole("Administrator"))
result = true;
return result;
}
public static bool CanEditObject()
{
return Csla.ApplicationContext.User.IsInRole("ProjectManager");
}
#endregion
#region Factory Methods
public static Resource NewResource()
{
if (!CanAddObject())
throw new System.Security.SecurityException(
"User not authorized to add a resource");
return DataPortal.Create<Resource>();
}
public static void DeleteResource(int id)
{
if (!CanDeleteObject())
throw new System.Security.SecurityException(
"User not authorized to remove a resource");
DataPortal.Delete(new Criteria(id));
}
public static Resource GetResource(int id)
{
if (!CanGetObject())
throw new System.Security.SecurityException(
"User not authorized to view a resource");
return DataPortal.Fetch<Resource>(new Criteria(id));
}
public override Resource Save()
{
if (IsDeleted && !CanDeleteObject())
throw new System.Security.SecurityException(
"User not authorized to remove a resource");
else if (IsNew && !CanAddObject())
throw new System.Security.SecurityException(
"User not authorized to add a resource");
else if (!CanEditObject())
throw new System.Security.SecurityException(
"User not authorized to update a resource");
return base.Save();
}
private Resource()
{ /* require use of factory methods */ }
#endregion
#region Data Access
[Serializable()]
private class Criteria
{
private int _id;
public int Id
{
get { return _id; }
}
public Criteria(int id)
{ _id = id; }
}
[RunLocal()]
protected override void DataPortal_Create()
{
// nothing to initialize
ValidationRules.CheckRules();
}
private void DataPortal_Fetch(Criteria criteria)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getResource";
cm.Parameters.AddWithValue("@id", criteria.Id);
using (SafeDataReader dr =
new SafeDataReader(cm.ExecuteReader()))
{
dr.Read();
_id = dr.GetInt32("Id");
_lastName = dr.GetString("LastName");
_firstName = dr.GetString("FirstName");
dr.GetBytes("LastChanged", 0, _timestamp, 0, 8);
// load child objects
dr.NextResult();
_assignments =
ResourceAssignments.GetResourceAssignments(dr);
}
}
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Insert()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
ApplicationContext.LocalContext["cn"] = cn;
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "addResource";
cm.Parameters.AddWithValue("@lastName", _lastName);
cm.Parameters.AddWithValue("@firstName", _firstName);
SqlParameter param =
new SqlParameter("@newId",SqlDbType.Int);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
param = new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
_id = (int)cm.Parameters["@newId"].Value;
_timestamp = (byte[])cm.Parameters["@newLastChanged"].Value;
}
// update child objects
_assignments.Update(this);
// removing of item only needed for local data portal
if (ApplicationContext.ExecutionLocation==ApplicationContext.ExecutionLocations.Client)
ApplicationContext.LocalContext.Remove("cn");
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_Update()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
ApplicationContext.LocalContext["cn"] = cn;
if (base.IsDirty)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "updateResource";
cm.Parameters.AddWithValue("@id", _id);
cm.Parameters.AddWithValue("@lastName", _lastName);
cm.Parameters.AddWithValue("@firstName", _firstName);
cm.Parameters.AddWithValue("@lastChanged", _timestamp);
SqlParameter param =
new SqlParameter("@newLastChanged", SqlDbType.Timestamp);
param.Direction = ParameterDirection.Output;
cm.Parameters.Add(param);
cm.ExecuteNonQuery();
_timestamp = (byte[])cm.Parameters["@newLastChanged"].Value;
}
}
// update child objects
_assignments.Update(this);
// removing of item only needed for local data portal
if (ApplicationContext.ExecutionLocation == ApplicationContext.ExecutionLocations.Client)
ApplicationContext.LocalContext.Remove("cn");
}
}
[Transactional(TransactionalTypes.TransactionScope)]
protected override void DataPortal_DeleteSelf()
{
DataPortal_Delete(new Criteria(_id));
}
[Transactional(TransactionalTypes.TransactionScope)]
private void DataPortal_Delete(Criteria criteria)
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "deleteResource";
cm.Parameters.AddWithValue("@id", criteria.Id);
cm.ExecuteNonQuery();
}
}
}
#endregion
#region Exists
public static bool Exists(string id)
{
ExistsCommand result;
result = DataPortal.Execute<ExistsCommand>(new ExistsCommand(id));
return result.Exists;
}
[Serializable()]
private class ExistsCommand : CommandBase
{
private string _id;
private bool _exists;
public bool Exists
{
get { return _exists; }
}
public ExistsCommand(string id)
{
_id = id;
}
protected override void DataPortal_Execute()
{
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "existsResource";
cm.Parameters.AddWithValue("@id", _id);
int count = (int)cm.ExecuteScalar();
_exists = (count > 0);
}
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,192 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ResourceAssignment : BusinessBase<ResourceAssignment>, IHoldRoles
{
#region Business Methods
private Guid _projectId = Guid.Empty;
private string _projectName = string.Empty;
private SmartDate _assigned = new SmartDate(DateTime.Today);
private int _role;
private byte[] _timestamp = new byte[8];
public Guid ProjectId
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _projectId;
}
}
public string ProjectName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _projectName;
}
}
public string Assigned
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _assigned.Text;
}
}
public int Role
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _role;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (!_role.Equals(value))
{
_role = value;
PropertyHasChanged();
}
}
}
public Project GetProject()
{
return Project.GetProject(_projectId);
}
protected override object GetIdValue()
{
return _projectId;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(
new Csla.Validation.RuleHandler(
Assignment.ValidRole), "Role");
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
AuthorizationRules.AllowWrite(
"Role", "ProjectManager");
}
#endregion
#region Factory Methods
internal static ResourceAssignment NewResourceAssignment(
Guid projectId)
{
return new ResourceAssignment(
Project.GetProject(projectId), RoleList.DefaultRole());
}
internal static ResourceAssignment GetResourceAssignment(
SafeDataReader dr)
{
return new ResourceAssignment(dr);
}
private ResourceAssignment()
{ MarkAsChild(); }
#endregion
#region Data Access
/// <summary>
/// Called to when a new object is created.
/// </summary>
private ResourceAssignment(Project project, int role)
{
MarkAsChild();
_projectId = project.Id;
_projectName = project.Name;
_assigned.Date = Assignment.GetDefaultAssignedDate();
_role = role;
}
/// <summary>
/// Called when loading data from the database.
/// </summary>
private ResourceAssignment(SafeDataReader dr)
{
MarkAsChild();
_projectId = dr.GetGuid("ProjectId");
_projectName = dr.GetString("Name");
_assigned = dr.GetSmartDate("Assigned");
_role = dr.GetInt32("Role");
dr.GetBytes("LastChanged", 0, _timestamp, 0, 8);
MarkOld();
}
internal void Insert(Resource resource)
{
SqlConnection cn = (SqlConnection)ApplicationContext.LocalContext["cn"];
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
_timestamp = Assignment.AddAssignment(
cn, _projectId, resource.Id, _assigned, _role);
MarkOld();
}
internal void Update(Resource resource)
{
SqlConnection cn = (SqlConnection)ApplicationContext.LocalContext["cn"];
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
_timestamp = Assignment.UpdateAssignment(
cn, _projectId, resource.Id, _assigned, _role, _timestamp);
MarkOld();
}
internal void DeleteSelf(Resource resource)
{
SqlConnection cn = (SqlConnection)ApplicationContext.LocalContext["cn"];
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
// if we're new then don't update the database
if (this.IsNew) return;
Assignment.RemoveAssignment(cn, _projectId, resource.Id);
MarkNew();
}
#endregion
}
}

View File

@@ -0,0 +1,123 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ResourceAssignments : BusinessListBase<ResourceAssignments, ResourceAssignment>
{
#region Business Methods
public ResourceAssignment this[Guid projectId]
{
get
{
foreach (ResourceAssignment res in this)
if (res.ProjectId.Equals(projectId))
return res;
return null;
}
}
public void AssignTo(Guid projectId)
{
if (!Contains(projectId))
{
ResourceAssignment project = ResourceAssignment.NewResourceAssignment(projectId);
this.Add(project);
}
else
throw new InvalidOperationException("Resource already assigned to project");
}
public void Remove(Guid projectId)
{
foreach (ResourceAssignment res in this)
{
if (res.ProjectId.Equals(projectId))
{
Remove(res);
break;
}
}
}
public bool Contains(Guid projectId)
{
foreach (ResourceAssignment project in this)
if (project.ProjectId == projectId)
return true;
return false;
}
public bool ContainsDeleted(Guid projectId)
{
foreach (ResourceAssignment project in DeletedList)
if (project.ProjectId == projectId)
return true;
return false;
}
#endregion
#region Factory Methods
internal static ResourceAssignments NewResourceAssignments()
{
return new ResourceAssignments();
}
internal static ResourceAssignments GetResourceAssignments(SafeDataReader dr)
{
return new ResourceAssignments(dr);
}
private ResourceAssignments()
{
MarkAsChild();
}
private ResourceAssignments(SafeDataReader dr)
{
MarkAsChild();
Fetch(dr);
}
#endregion
#region Data Access
private void Fetch(SafeDataReader dr)
{
RaiseListChangedEvents = false;
while (dr.Read())
this.Add(ResourceAssignment.GetResourceAssignment(dr));
RaiseListChangedEvents = true;
}
internal void Update(Resource resource)
{
RaiseListChangedEvents = false;
// update (thus deleting) any deleted child objects
foreach (ResourceAssignment item in DeletedList)
item.DeleteSelf(resource);
// now that they are deleted, remove them from memory too
DeletedList.Clear();
// add/update any current child objects
foreach (ResourceAssignment item in this)
{
if (item.IsNew)
item.Insert(resource);
else
item.Update(resource);
}
RaiseListChangedEvents = true;
}
#endregion
}
}

View File

@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ResourceInfo :
ReadOnlyBase<ResourceInfo>
{
#region Business Methods
private int _id;
private string _name;
public int Id
{
get { return _id; }
}
public string Name
{
get { return _name; }
}
protected override object GetIdValue()
{
return _id;
}
public override string ToString()
{
return _name;
}
#endregion
#region Constructors
private ResourceInfo()
{ /* require use of factory methods */ }
internal ResourceInfo(SafeDataReader dr)
{
_id = dr.GetInt32("Id");
_name = string.Format("{0}, {1}",
dr.GetString("LastName"),
dr.GetString("FirstName"));
}
#endregion
}
}

View File

@@ -0,0 +1,61 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class ResourceList :
ReadOnlyListBase<ResourceList, ResourceInfo>
{
#region Factory Methods
public static ResourceList GetResourceList()
{
return DataPortal.Fetch<ResourceList>(new Criteria());
}
private ResourceList()
{ /* require use of factory methods */ }
#endregion
#region Data Access
[Serializable()]
private class Criteria
{ /* no criteria - retrieve all resources */ }
private void DataPortal_Fetch(Criteria criteria)
{
this.RaiseListChangedEvents = false;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getResources";
using (SafeDataReader dr =
new SafeDataReader(cm.ExecuteReader()))
{
IsReadOnly = false;
while (dr.Read())
{
ResourceInfo info = new ResourceInfo(dr);
this.Add(info);
}
IsReadOnly = true;
}
}
}
this.RaiseListChangedEvents = true;
}
#endregion
}
}

View File

@@ -0,0 +1,88 @@
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
namespace ProjectTracker.Library
{
[Serializable()]
public class RoleList :
NameValueListBase<int, string>
{
#region Business Methods
public static int DefaultRole()
{
RoleList list = GetList();
if (list.Count > 0)
return list.Items[0].Key;
else
throw new NullReferenceException(
"No roles available; default role can not be returned");
}
#endregion
#region Factory Methods
private static RoleList _list;
/// <summary>
/// Returns a list of roles.
/// </summary>
public static RoleList GetList()
{
if (_list == null)
_list = DataPortal.Fetch<RoleList>
(new Criteria(typeof(RoleList)));
return _list;
}
/// <summary>
/// Clears the in-memory RoleList cache
/// so the list of roles is reloaded on
/// next request.
/// </summary>
public static void InvalidateCache()
{
_list = null;
}
private RoleList()
{ /* require use of factory methods */ }
#endregion
#region Data Access
private void DataPortal_Fetch(Criteria criteria)
{
this.RaiseListChangedEvents = false;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getRoles";
using (SafeDataReader dr =
new SafeDataReader(cm.ExecuteReader()))
{
IsReadOnly = false;
while (dr.Read())
{
this.Add(new NameValuePair(
dr.GetInt32("id"), dr.GetString("name")));
}
IsReadOnly = true;
}
}
}
this.RaiseListChangedEvents = true;
}
#endregion
}
}

View File

@@ -0,0 +1,128 @@
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Security.Principal;
using Csla;
namespace ProjectTracker.Library.Security
{
[Serializable()]
public class PTIdentity :
ReadOnlyBase<PTIdentity>, IIdentity
{
#region Business Methods
private bool _isAuthenticated;
private string _name = string.Empty;
private List<string> _roles = new List<string>();
public string AuthenticationType
{
get { return "Csla"; }
}
public bool IsAuthenticated
{
get { return _isAuthenticated; }
}
public string Name
{
get { return _name; }
}
protected override object GetIdValue()
{
return _name;
}
internal bool IsInRole(string role)
{
return _roles.Contains(role);
}
#endregion
#region Factory Methods
internal static PTIdentity UnauthenticatedIdentity()
{
return new PTIdentity();
}
internal static PTIdentity GetIdentity(
string username, string password)
{
return DataPortal.Fetch<PTIdentity>
(new Criteria(username, password));
}
private PTIdentity()
{ /* require use of factory methods */ }
#endregion
#region Data Access
[Serializable()]
private class Criteria
{
private string _username;
public string Username
{
get { return _username; }
}
private string _password;
public string Password
{
get { return _password; }
}
public Criteria(string username, string password)
{
_username = username;
_password = password;
}
}
private void DataPortal_Fetch(Criteria criteria)
{
using (SqlConnection cn =
new SqlConnection(Database.SecurityConnection))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "Login";
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@user", criteria.Username);
cm.Parameters.AddWithValue("@pw", criteria.Password);
using (SqlDataReader dr = cm.ExecuteReader())
{
if (dr.Read())
{
_name = criteria.Username;
_isAuthenticated = true;
if (dr.NextResult())
{
while (dr.Read())
{
_roles.Add(dr.GetString(0));
}
}
}
else
{
_name = string.Empty;
_isAuthenticated = false;
_roles.Clear();
}
}
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,39 @@
using System;
using System.Security.Principal;
namespace ProjectTracker.Library.Security
{
[Serializable()]
public class PTPrincipal : Csla.Security.BusinessPrincipalBase
{
private PTPrincipal(IIdentity identity)
: base(identity) { }
public static bool Login(string username, string password)
{
PTIdentity identity =
PTIdentity.GetIdentity(username, password);
if (identity.IsAuthenticated)
{
PTPrincipal principal = new PTPrincipal(identity);
Csla.ApplicationContext.User = principal;
}
return identity.IsAuthenticated;
}
public static void Logout()
{
PTIdentity identity = PTIdentity.UnauthenticatedIdentity();
PTPrincipal principal = new PTPrincipal(identity);
Csla.ApplicationContext.User = principal;
}
public override bool IsInRole(string role)
{
PTIdentity identity = (PTIdentity)this.Identity;
return identity.IsInRole(role);
}
}
}

View File

@@ -0,0 +1,198 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PTWin", "PTWin\PTWin.csproj", "{DAB85BA2-86A3-4D3B-8D34-324D939D952C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectTracker.Library", "ProjectTracker.Library\ProjectTracker.Library.csproj", "{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}"
EndProject
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "C:\...\PTWeb\", "www\PTWeb\", "{D8F59D26-50C8-4DFD-B8B9-C529530297F1}"
ProjectSection(WebsiteProperties) = preProject
ProjectReferences = "{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}|ProjectTracker.Library.dll;{B390C88E-66FD-4E84-8149-29852AFA8723}|EnterpriseServicesHostcs.dll;"
Debug.AspNetCompiler.VirtualPath = "/PTWeb"
Debug.AspNetCompiler.PhysicalPath = "www\PTWeb\"
Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\PTWeb\"
Debug.AspNetCompiler.Updateable = "true"
Debug.AspNetCompiler.ForceOverwrite = "true"
Debug.AspNetCompiler.FixedNames = "false"
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.VirtualPath = "/PTWeb"
Release.AspNetCompiler.PhysicalPath = "www\PTWeb\"
Release.AspNetCompiler.TargetPath = "PrecompiledWeb\PTWeb\"
Release.AspNetCompiler.Updateable = "true"
Release.AspNetCompiler.ForceOverwrite = "true"
Release.AspNetCompiler.FixedNames = "false"
Release.AspNetCompiler.Debug = "False"
VWDPort = "2161"
DefaultWebSiteLanguage = "Visual C#"
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FAC3F50C-78A8-4F17-A4E3-B6BAE7BB612F}"
ProjectSection(SolutionItems) = preProject
license.txt = license.txt
readme.txt = readme.txt
EndProjectSection
EndProject
Project("{4F174C21-8C12-11D0-8340-0000F80270F8}") = "PTData", "PTData\PTData.dbp", "{09B6FE9B-E21E-4454-8E64-928422F60E08}"
EndProject
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "C:\...\RemotingHost\", "www\RemotingHost\", "{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}"
ProjectSection(WebsiteProperties) = preProject
ProjectReferences = "{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}|ProjectTracker.Library.dll;"
Debug.AspNetCompiler.VirtualPath = "/RemotingHost"
Debug.AspNetCompiler.PhysicalPath = "www\RemotingHost\"
Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\RemotingHost\"
Debug.AspNetCompiler.Updateable = "true"
Debug.AspNetCompiler.ForceOverwrite = "true"
Debug.AspNetCompiler.FixedNames = "false"
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.VirtualPath = "/RemotingHost"
Release.AspNetCompiler.PhysicalPath = "www\RemotingHost\"
Release.AspNetCompiler.TargetPath = "PrecompiledWeb\RemotingHost\"
Release.AspNetCompiler.Updateable = "true"
Release.AspNetCompiler.ForceOverwrite = "true"
Release.AspNetCompiler.FixedNames = "false"
Release.AspNetCompiler.Debug = "False"
VWDPort = "3187"
DefaultWebSiteLanguage = "Visual C#"
EndProjectSection
EndProject
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "C:\...\PTWebService\", "www\PTWebService\", "{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}"
ProjectSection(WebsiteProperties) = preProject
ProjectReferences = "{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}|ProjectTracker.Library.dll;{B390C88E-66FD-4E84-8149-29852AFA8723}|EnterpriseServicesHostcs.dll;"
Debug.AspNetCompiler.VirtualPath = "/PTWebService"
Debug.AspNetCompiler.PhysicalPath = "www\PTWebService\"
Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\PTWebService\"
Debug.AspNetCompiler.Updateable = "true"
Debug.AspNetCompiler.ForceOverwrite = "true"
Debug.AspNetCompiler.FixedNames = "false"
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.VirtualPath = "/PTWebService"
Release.AspNetCompiler.PhysicalPath = "www\PTWebService\"
Release.AspNetCompiler.TargetPath = "PrecompiledWeb\PTWebService\"
Release.AspNetCompiler.Updateable = "true"
Release.AspNetCompiler.ForceOverwrite = "true"
Release.AspNetCompiler.FixedNames = "false"
Release.AspNetCompiler.Debug = "False"
VWDPort = "7411"
DefaultWebSiteLanguage = "Visual C#"
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PTServiceClient", "PTServiceClient\PTServiceClient.csproj", "{457C09F3-B15D-474F-A761-DC3419E745EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnterpriseServicesHostcs", "EnterpriseServicesHostcs\EnterpriseServicesHostcs.csproj", "{B390C88E-66FD-4E84-8149-29852AFA8723}"
EndProject
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "C:\...\WebServicesHost\", "www\WebServicesHost\", "{68865A7C-0792-4757-89D1-874F5A2FF551}"
ProjectSection(WebsiteProperties) = preProject
ProjectReferences = "{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}|ProjectTracker.Library.dll;"
Debug.AspNetCompiler.VirtualPath = "/WebServicesHost"
Debug.AspNetCompiler.PhysicalPath = "www\WebServicesHost\"
Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\WebServicesHost\"
Debug.AspNetCompiler.Updateable = "true"
Debug.AspNetCompiler.ForceOverwrite = "true"
Debug.AspNetCompiler.FixedNames = "false"
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.VirtualPath = "/WebServicesHost"
Release.AspNetCompiler.PhysicalPath = "www\WebServicesHost\"
Release.AspNetCompiler.TargetPath = "PrecompiledWeb\WebServicesHost\"
Release.AspNetCompiler.Updateable = "true"
Release.AspNetCompiler.ForceOverwrite = "true"
Release.AspNetCompiler.FixedNames = "false"
Release.AspNetCompiler.Debug = "False"
VWDPort = "4334"
DefaultWebSiteLanguage = "Visual C#"
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|.NET = Debug|.NET
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Release|.NET = Release|.NET
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Debug|.NET.ActiveCfg = Debug|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Release|.NET.ActiveCfg = Release|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Release|Any CPU.Build.0 = Release|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{DAB85BA2-86A3-4D3B-8D34-324D939D952C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Debug|.NET.ActiveCfg = Debug|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Release|.NET.ActiveCfg = Release|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Release|Any CPU.Build.0 = Release|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{366FD3E8-E0AA-40CF-99ED-BB2966E30C96}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Debug|.NET.ActiveCfg = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Debug|.NET.Build.0 = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Debug|Any CPU.ActiveCfg = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Debug|Mixed Platforms.ActiveCfg = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Debug|Mixed Platforms.Build.0 = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Release|.NET.ActiveCfg = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Release|.NET.Build.0 = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Release|Any CPU.ActiveCfg = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Release|Mixed Platforms.ActiveCfg = Debug|.NET
{D8F59D26-50C8-4DFD-B8B9-C529530297F1}.Release|Mixed Platforms.Build.0 = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Debug|.NET.ActiveCfg = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Debug|.NET.Build.0 = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Debug|Any CPU.ActiveCfg = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Debug|Mixed Platforms.ActiveCfg = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Debug|Mixed Platforms.Build.0 = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Release|.NET.ActiveCfg = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Release|.NET.Build.0 = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Release|Any CPU.ActiveCfg = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Release|Mixed Platforms.ActiveCfg = Debug|.NET
{5A15CF97-BBA1-4C15-990D-AF08907C8A0C}.Release|Mixed Platforms.Build.0 = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Debug|.NET.ActiveCfg = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Debug|.NET.Build.0 = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Debug|Any CPU.ActiveCfg = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Debug|Mixed Platforms.ActiveCfg = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Debug|Mixed Platforms.Build.0 = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Release|.NET.ActiveCfg = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Release|.NET.Build.0 = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Release|Any CPU.ActiveCfg = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Release|Mixed Platforms.ActiveCfg = Debug|.NET
{86BA904A-AC1A-4CC1-AA54-98F3A090AD83}.Release|Mixed Platforms.Build.0 = Debug|.NET
{457C09F3-B15D-474F-A761-DC3419E745EF}.Debug|.NET.ActiveCfg = Debug|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Release|.NET.ActiveCfg = Release|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Release|Any CPU.Build.0 = Release|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{457C09F3-B15D-474F-A761-DC3419E745EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Debug|.NET.ActiveCfg = Debug|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Release|.NET.ActiveCfg = Release|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Release|Any CPU.Build.0 = Release|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B390C88E-66FD-4E84-8149-29852AFA8723}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{68865A7C-0792-4757-89D1-874F5A2FF551}.Debug|.NET.ActiveCfg = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Debug|.NET.Build.0 = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Debug|Any CPU.ActiveCfg = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Debug|Mixed Platforms.ActiveCfg = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Debug|Mixed Platforms.Build.0 = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Release|.NET.ActiveCfg = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Release|.NET.Build.0 = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Release|Any CPU.ActiveCfg = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Release|Mixed Platforms.ActiveCfg = Debug|.NET
{68865A7C-0792-4757-89D1-874F5A2FF551}.Release|Mixed Platforms.Build.0 = Debug|.NET
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,99 @@
LICENSE AND WARRANTY
The CSLA .NET framework is Copyright 2006 by Rockford Lhotka.
You can use this Software for any noncommercial purpose, including
distributing derivative works. You can use this Software for any commercial
purpose other than you may not use it, in whole or in part, to create a
commercial framework product.
In short, you can use CSLA .NET and modify it to create other commercial or
business software, you just can't take the framework itself, modify it and
sell it as a product.
In return, the owner simply requires that you agree:
This Software License Agreement ("Agreement") is effective
upon your use of CSLA .NET ("Software").
1. Ownership.
The CSLA .NET framework is Copyright 2006 by Rockford Lhotka,
Eden Prairie, MN, USA.
2. Copyright Notice.
You must not remove any copyright notices from the Software source code.
3. License.
The owner hereby grants a perpetual, non-exclusive, limited license to use
the Software as set forth in this Agreement.
4. Source Code Distribution.
If you distribute the Software in source code form you must do so only under
this License (i.e. you must include a complete copy of this License with
your distribution).
5. Binary or Object Distribution.
You may distribute the Software in binary or object form with no requirement
to display copyright notices to the end user. The binary or object form must
retain the copyright notices included in the Software source code.
6. Restrictions.
You may not sell the Software. If you create a software development framework
based on the Software as a derivative work, you may not sell that derivative
work. This does not restrict the use of the Software for creation of other
types of non-commercial or commercial applications or derivative works.
7. Disclaimer of Warranty.
The Software comes "as is", with no warranties. None whatsoever. This means
no express, implied, statutory or other warranty, including without
limitation, warranties of merchantability or fitness for a particular
purpose, noninfringement, or the presence or absence of errors, whether or
not discoverable. Also, you must pass this disclaimer on whenever you
distribute the Software.
8. Liability.
Neither Rockford Lhotka nor any contributor to the Software will be liable
for any of those types of damages known as indirect, special, consequential,
incidental, punitive or exemplary related to the Software or this License, to
the maximum extent the law permits, no matter what legal theory it<69>s based
on. Also, you must pass this limitation of liability on whenever you
distribute the Software.
9. Patents.
If you sue anyone over patents that you think may apply to the Software
for a person's use of the Software, your license to the Software ends
automatically.
The patent rights, if any, licensed hereunder only apply to the Software,
not to any derivative works you make.
10. Termination.
Your rights under this License end automatically if you breach it in any way.
Rockford Lhotka reserves the right to release the Software under different
license terms or to stop distributing the Software at any time. Such an
election will not serve to withdraw this Agreement, and this Agreement will
continue in full force and effect unless terminated as stated above.
11. Governing Law.
This Agreement shall be construed and enforced in accordance with the laws
of the state of Minnesota, USA.
12. No Assignment.
Neither this Agreement nor any interest in this Agreement may be assigned
by Licensee without the prior express written approval of Developer.
13. Final Agreement.
This Agreement terminates and supersedes all prior understandings or
agreements on the subject matter hereof. This Agreement may be modified
only by a further writing that is duly executed by both parties.
14. Severability.
If any term of this Agreement is held by a court of competent jurisdiction
to be invalid or unenforceable, then this Agreement, including all of the
remaining terms, will remain in full force and effect as if such invalid
or unenforceable term had never been included.
15. Headings.
Headings used in this Agreement are provided for convenience only and shall
not be used to construe meaning or intent.

View File

@@ -0,0 +1,2 @@
For information on installation, book errata, updates to the framework and so forth,
please visit http://www.lhotka.net/cslanet.

View File

@@ -0,0 +1,161 @@
using System;
using ProjectTracker.Library.Security;
using System.Web;
using System.Web.Security;
public class PTMembershipProvider : MembershipProvider
{
public override bool ValidateUser(
string username, string password)
{
bool result = PTPrincipal.Login(username, password);
HttpContext.Current.Session["CslaPrincipal"] =
Csla.ApplicationContext.User;
return result;
}
#region Non-Implemented Members
// the following members must be implemented due to the abstract class MembershipProvider,
// but not required to be functional for using the Login control.
public override bool ChangePassword(string username, string oldPassword, string newPassword)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override bool EnablePasswordReset
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override bool EnablePasswordRetrieval
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override int GetNumberOfUsersOnline()
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override string GetPassword(string username, string answer)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override string GetUserNameByEmail(string email)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override int MaxInvalidPasswordAttempts
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override int MinRequiredNonAlphanumericCharacters
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override int MinRequiredPasswordLength
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override int PasswordAttemptWindow
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override MembershipPasswordFormat PasswordFormat
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override string PasswordStrengthRegularExpression
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override bool RequiresQuestionAndAnswer
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override bool RequiresUniqueEmail
{
get { throw new NotSupportedException("The method or operation is not implemented."); }
}
public override string ResetPassword(string username, string answer)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override bool UnlockUser(string userName)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override void UpdateUser(MembershipUser user)
{
throw new NotSupportedException("The method or operation is not implemented.");
}
public override string ApplicationName
{
get
{
throw new NotSupportedException("The method or operation is not implemented.");
}
set
{
throw new NotSupportedException("The method or operation is not implemented.");
}
}
#endregion
}

View File

@@ -0,0 +1,106 @@
html,body
{
background-color: #DEDEDE;
height: 90%;
}
a
{
color: #000000;
text-decoration: none;
}
a:hover
{
text-decoration: underline;
}
.nav
{
color: #FFFFFF;
text-decoration: none;
}
.nav:hover
{
text-decoration: underline;
}
#mainTable
{
border: solid 1px #000000;
width: 798px;
height: 90%;
min-height: 100%;
padding: 0px;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
background-color: #FFFFFF;
}
#header
{
background-image: url('images/background.jpg');
background-repeat: no-repeat;
height: 64px;
line-height: 60px;
text-align: left;
color: #FFFFFF;
font-family:
Verdana, Arial, Helvetica, sans-serif;
font-size: 36px;
font-weight: bold;
font-style: italic;
padding-left: 10px
}
#navigation
{
float: left;
width: 150px;
background-color: #000000;
height: 100%
}
#navigationContent
{
color: #FFFFFF;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
font-weight: bold;
font-style: italic;
margin-left: 25px;
white-space: nowrap;
margin-top: 30px;
}
#subnavigation
{
background-color: #DEDEDE;
height: 19px;
background-image: url('images/corner.png');
position: relative;
left: -3px;
background-repeat: no-repeat;
background-position: left top;
line-height: 19px
}
#logout
{
text-align: right;
padding-right: 10px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
#content
{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
float: left;
padding: 10px;
padding-top: 10px;
width: 625px;
}

Some files were not shown because too many files have changed in this diff Show More