407 lines
10 KiB
C#

/*********************************************************************************************
* Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------
* $Workfile: Archive.cs $ $Revision: 3 $
* $Author: Kathy $ $Date: 1/31/05 11:05a $
*
* $History: Archive.cs $
*
* ***************** Version 3 *****************
* User: Kathy Date: 1/31/05 Time: 11:05a
* Updated in $/LibSource/VEObject
* Fix B2005-005 - this just fixed empty icon usage
*
* ***************** Version 2 *****************
* User: Kathy Date: 1/24/05 Time: 2:45p
* Updated in $/LibSource/VEObject
* B2005-004 fixes - icon clean-up
*
* ***************** Version 1 *****************
* User: Kathy Date: 7/27/04 Time: 8:52a
* Created in $/LibSource/VEObject
*********************************************************************************************/
using System;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.ComponentModel;
using System.IO;
using System.Text;
using Utils;
using System.Collections.Specialized;
namespace VEObject
{
/// <summary>
/// Archive Object.
/// </summary>
public class VEO_Archive: VEO_Base
{
public bool isnew;
// These three strings are stored in the Zip file's
// comment field
private String tmpArchiveTitle;
private String _Comment;
public ArchiveTypeOptions _ArchiveType;
private String tmpComment;
private bool _ReadOnly;
private bool oldReadOnly;
private bool NeedToGetReadOnly;
private bool changeReadOnly;
private bool changeComment;
private bool changeArchiveTitle;
public VEO_Archive(string ipath, VEO_DummyZip dz)
{
iconStates = new int[5] {0,0,0,0,0};
_Location = ipath; // full path to the Zip file
VEObjectType = (int)VEObjectTypesDefs.Archive;
changeReadOnly = false;
changeComment = false;
changeArchiveTitle = false;
NeedToGetReadOnly = true;
isnew = IsThisANewArchive(ipath);
if (isnew)
{
_Title = "New Archive";
_Comment = "Created: " + System.DateTime.Now.ToString();
}
else // get the title and comment from the Zip file
{
GetInfoFromZipComment();
}
LoadLockInfo();
icon = iconStates[(int)Lock.LockStatus];
parentObj = dz;
usrRunTime = dz.usrRunTime;
}
// Read in the Title, Archive Type, and Comment from the Zip file's
// comment field.
private void GetInfoFromZipComment()
{
string tmpstr;
ZipFuncs ZipInfo = new ZipFuncs(_Location);
// just opening the zip file like this will read the zip's comment field
if (ZipInfo.strArcTitle != null)
tmpstr = ZipInfo.strArcTitle.Trim();
else
tmpstr = "";
// if the title is blank, then use the zip file name as the title
if (tmpstr.Length == 0)
this._Title = _Location.Substring(_Location.LastIndexOf("\\")+1);
else
this._Title = tmpstr;
_Comment = ZipInfo.strComment;
if (ZipInfo.ArchiveType == (int)VEO_Base.ArchiveTypeOptions.Full)
_ArchiveType = VEO_Base.ArchiveTypeOptions.Full;
else
_ArchiveType = VEO_Base.ArchiveTypeOptions.Partial;
}
private bool IsThisANewArchive(string arcPath)
{
string tmpstr = arcPath.ToUpper();
return (!tmpstr.EndsWith(".ZIP") || !File.Exists(tmpstr));
}
private string ParseOutZipPath()
{
string zpath = _Location.Substring(0,_Location.LastIndexOf("\\"));
return zpath;
}
// Gets and Sets for the Property Page
[Description("Location"),Category("Archive"),ReadOnly(true)]
public string Location
{
get{return _Location;}
//note: we don't allow them to change the zip file name or path.
}
[Description("Archive Title"),Category("Archive")]public string Description
{
get
{
if (!changeArchiveTitle)
return _Title;
else
return tmpArchiveTitle;
}
set
{
changeArchiveTitle = true;
tmpArchiveTitle = value;
}
}
[Description("Archive Type"),Category("Archive"),ReadOnly(true)]public ArchiveTypeOptions ArchiveType
{
get
{
return _ArchiveType;
}
set
{
_ArchiveType=value;
}
}
[Description("Comment"),Category("Archive")]public string Comment
{ get
{
if (!changeComment)
return _Comment;
else
return tmpComment;
}
set
{
changeComment = true;
tmpComment = value;
}
}
[Description("ReadOnly"),Category("Archive")]public bool ReadOnlyArchiveFile
{
get
{
if (!changeReadOnly && NeedToGetReadOnly)
{
FileAttributes attrib = File.GetAttributes(_Location);
_ReadOnly = (attrib & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
NeedToGetReadOnly = false;
}
return _ReadOnly;
}
set
{
if (!changeReadOnly) // only save previous value once
oldReadOnly = _ReadOnly;
changeReadOnly = true;
_ReadOnly = value;
}
}
// When the Save Button is pressed on the Property page, this function
// is called.
public override bool Write()
{
if (changeReadOnly)
{
changeReadOnly = false;
NeedToGetReadOnly = true;
FileAttributes attrib = File.GetAttributes(_Location);
if (_ReadOnly != ((attrib & FileAttributes.ReadOnly) == FileAttributes.ReadOnly))
attrib ^= FileAttributes.ReadOnly; //toggle
File.SetAttributes(_Location,attrib);
}
if (changeComment)
{
changeComment = false;
_Comment = tmpComment;
}
if (changeArchiveTitle)
{
changeArchiveTitle = false;
_Title = tmpArchiveTitle;
}
return true;
}
// When the Cancel Button on the Property Page is pressed,
// this function is called.
public override void CancelWrite()
{
if (changeReadOnly)
{
_ReadOnly = oldReadOnly;
}
changeArchiveTitle = false;
changeComment = false;
changeReadOnly = false;
NeedToGetReadOnly = true;
}
public override bool Read(bool dummy)
{
//load archive file list
return true;
}
public override void AddToTree(TreeNode parentnd)
{
}
public override bool Expand(TreeNode parentnd)
{
return true;
}
public override bool PropertiesDlg(Object parent)
{
ARProperties propdlg = new ARProperties(parent, this);
if (propdlg.ShowDialog() == DialogResult.OK) return true;
return false;
}
public bool Exists(string dname)
{
if(dname==null||dname=="") return false;
string archname=null;
// see if this is a pathname, it needs to be for the Exists check.
if (dname.IndexOf("\\") < 0) // it's not a path, prepend the path
archname = _Location + "\\" + dname;
else
archname = dname;
return File.Exists(archname);
}
public override bool mnuAllowNew()
{
return false;
}
public override bool mnuAllowDelete()
{
// VEO_DummyArchive ds = (VEO_DummyArchive) this.parentObj;
// VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
// if (ps.isApproved == true) return false;
// if (amILockedByMe()==false) return false;
// if ((ps.accessFlags&Security.DOCMAINT)==Security.DOCMAINT) return true;
return true;
}
public override bool mnuAllowUpdateArch()
{
if (amILockedByMe()==false) return false;
return true;
}
public override bool mnuAllowExtractArch()
{
if (amILockedByMe()==false) return false;
return true;
}
public override bool mnuAllowTestArchive()
{
return true;
}
public override void DoListView(ListView veoListView)
{
ZipFuncs ZipInfo = new ZipFuncs(_Location);
ListViewItem item=null;
veoListView.Columns.Add("Date/Time", 150, HorizontalAlignment.Left);
veoListView.Columns.Add("File", 450, HorizontalAlignment.Left);
StringCollection ZipFileList;
// veoListView.Sorting = SortOrder.Ascending;
ZipFileList = ZipInfo.ZipFileContents();
for (int i=0; i< ZipFileList.Count; i++)
{
string tmpstr = ZipFileList[i].ToString();
int subIdx = tmpstr.IndexOf('!');
item = new ListViewItem(tmpstr.Substring(0,subIdx));
item.SubItems.Add(tmpstr.Substring(subIdx+1));
item.Tag = this;
veoListView.Items.Add(item);
}
AllowListViewSort = true;
}
public override bool Delete()
{
if ((File.GetAttributes(_Location) & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly)
File.SetAttributes(_Location,System.IO.FileAttributes.Normal);
File.Delete(_Location);
// if this is the last zip, then change parent's icon to empty
VEO_DummyZip zip = (VEO_DummyZip) this.parentObj;
if (zip.Children.Count==1) zip.IsEmpty=true; // just this one.
return true;
}
}
// This class is used when creating a new archive
public class VEO_ArchiveN: VEO_Archive
{
public VEO_ArchiveN(string ipath, VEO_DummyZip dz)
: base(ipath, dz)
{
}
[Description("Location"),Category("Archive"),ReadOnly(false),EditorAttribute(typeof(PropSaveFileAsDlg), typeof(System.Drawing.Design.UITypeEditor))]
public new string Location
{
get{return _Location;}
set
{
_Location=value.ToString();
}
}
[Description("Archive Type"),Category("Archive"),ReadOnly(false)]public new ArchiveTypeOptions ArchiveType
{
get
{
return _ArchiveType;
}
set
{
_ArchiveType=value;
}
}
}
/*
* Setup a class that will display the SaveFileAs dialog from the property dialog
* when the "..." is pressed.
*/
public class PropSaveFileAsDlg : System.Drawing.Design.UITypeEditor
{
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return System.Drawing.Design.UITypeEditorEditStyle.Modal;
}
public override object EditValue(
System.ComponentModel.ITypeDescriptorContext context,
System.IServiceProvider provider, object value)
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.AddExtension = true;
saveFileDialog1.CheckPathExists = true;
saveFileDialog1.DefaultExt = ".zip";
saveFileDialog1.Filter = "ZIP Files|*.zip|All Files|*.*||";
saveFileDialog1.DereferenceLinks = true;
saveFileDialog1.OverwritePrompt = true;
saveFileDialog1.Title = "Archive Location and Name";
saveFileDialog1.FileName = value.ToString();
saveFileDialog1.ShowDialog();
return saveFileDialog1.FileName;
}
public override bool GetPaintValueSupported(
System.ComponentModel.ITypeDescriptorContext context)
{
return false;
}
}
}