using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using SftTreeLib70;
using AxSftTreeLib70;
using Softelvdm.OLEConvert;
namespace Email
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private AxSftTreeLib70.AxSftTree axSftTree1;
public System.Windows.Forms.TextBox EditControl;
public System.Windows.Forms.Button Command1;
public System.Windows.Forms.ToolTip ToolTip1;
public System.Windows.Forms.PictureBox Attach;
private Softelvdm.OCXHelper.SftHelperComponent sftHelperComponent1;
private System.ComponentModel.IContainer components;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (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.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.axSftTree1 = new AxSftTreeLib70.AxSftTree();
this.EditControl = new System.Windows.Forms.TextBox();
this.Command1 = new System.Windows.Forms.Button();
this.ToolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.Attach = new System.Windows.Forms.PictureBox();
this.sftHelperComponent1 = new Softelvdm.OCXHelper.SftHelperComponent(this.components);
((System.ComponentModel.ISupportInitialize)(this.axSftTree1)).BeginInit();
this.SuspendLayout();
//
// axSftTree1
//
this.axSftTree1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.axSftTree1.Location = new System.Drawing.Point(8, 8);
this.axSftTree1.Name = "axSftTree1";
this.axSftTree1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axSftTree1.OcxState")));
this.axSftTree1.Size = new System.Drawing.Size(472, 360);
this.axSftTree1.TabIndex = 0;
this.axSftTree1.ItemDblClick += new AxSftTreeLib70._DSftTreeEvents_ItemDblClickEventHandler(this.axSftTree1_ItemDblClick);
this.axSftTree1.EditAllowed += new AxSftTreeLib70._DSftTreeEvents_EditAllowedEventHandler(this.axSftTree1_EditAllowed);
this.axSftTree1.EditEnding += new AxSftTreeLib70._DSftTreeEvents_EditEndingEventHandler(this.axSftTree1_EditEnding);
this.axSftTree1.ItemClick += new AxSftTreeLib70._DSftTreeEvents_ItemClickEventHandler(this.axSftTree1_ItemClick);
this.axSftTree1.EditInitializing += new AxSftTreeLib70._DSftTreeEvents_EditInitializingEventHandler(this.axSftTree1_EditInitializing);
this.axSftTree1.CaretChange += new AxSftTreeLib70._DSftTreeEvents_CaretChangeEventHandler(this.axSftTree1_CaretChange);
this.axSftTree1.EditValidate += new AxSftTreeLib70._DSftTreeEvents_EditValidateEventHandler(this.axSftTree1_EditValidate);
this.axSftTree1.EditNavigating += new AxSftTreeLib70._DSftTreeEvents_EditNavigatingEventHandler(this.axSftTree1_EditNavigating);
//
// EditControl
//
this.EditControl.AcceptsReturn = true;
this.EditControl.AutoSize = false;
this.EditControl.BackColor = System.Drawing.SystemColors.Window;
this.EditControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.EditControl.Cursor = System.Windows.Forms.Cursors.IBeam;
this.EditControl.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.EditControl.ForeColor = System.Drawing.SystemColors.WindowText;
this.EditControl.Location = new System.Drawing.Point(488, 80);
this.EditControl.MaxLength = 0;
this.EditControl.Name = "EditControl";
this.EditControl.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.EditControl.Size = new System.Drawing.Size(73, 19);
this.EditControl.TabIndex = 4;
this.EditControl.Text = "EditControl";
this.EditControl.Visible = false;
//
// Command1
//
this.Command1.Anchor = (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right);
this.Command1.BackColor = System.Drawing.SystemColors.Control;
this.Command1.Cursor = System.Windows.Forms.Cursors.Default;
this.Command1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Command1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.Command1.ForeColor = System.Drawing.SystemColors.ControlText;
this.Command1.Location = new System.Drawing.Point(488, 8);
this.Command1.Name = "Command1";
this.Command1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.Command1.Size = new System.Drawing.Size(73, 24);
this.Command1.TabIndex = 3;
this.Command1.Text = "&Close";
this.Command1.Click += new System.EventHandler(this.Command1_Click);
//
// Attach
//
this.Attach.Cursor = System.Windows.Forms.Cursors.Default;
this.Attach.Image = ((System.Drawing.Bitmap)(resources.GetObject("Attach.Image")));
this.Attach.Location = new System.Drawing.Point(488, 56);
this.Attach.Name = "Attach";
this.Attach.Size = new System.Drawing.Size(10, 16);
this.Attach.TabIndex = 5;
this.Attach.TabStop = false;
this.Attach.Visible = false;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.CancelButton = this.Command1;
this.ClientSize = new System.Drawing.Size(568, 375);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.Command1,
this.Attach,
this.axSftTree1,
this.EditControl});
this.Name = "Form1";
this.Text = "Softel vdm, Inc. - Email Sample";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.axSftTree1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private int m_InboxFolder = 0; // IDs for various top-level folders
private int m_OutboxFolder = 0;
private int m_SavedFolder = 0;
private int m_DeletedFolder = 0;
private stdole.IFontDisp m_BoldFont = null; // saved bold font
// in case many cells use the same font, it preserves resources to
// save one instance of an OLE font object
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//--locate-marker--
private void Command1_Click(object sender, System.EventArgs e) {
Application.Exit();
}
private void Form1_Load(object sender, System.EventArgs e) {
int ItemIndex;
m_InboxFolder = AddFolder("Inbox", "Viewed and unviewed mail", 10);
AddMessage(1, "support@softelvdm.com", "Re: A support question", "10/09/05", 88, true);
AddMessage(1, "anyone@acompany.com", "Re: Why did you say that", "10/10/05", 5, false);
AddMessage(1, "anyone@acompany.com", "Re: You're fired", "10/11/05", 82, true);
AddMessage(1, "anyone@acompany.com", "Re: You're hired", "10/11/05", 6, false);
ItemIndex = axSftTree1.Items.get_ItemIndex(m_InboxFolder);
axSftTree1.get_Item(ItemIndex).Collapse(false);
m_OutboxFolder = AddFolder("Outbox", "Mail about to be sent", 2);
AddMessage(1, "me@mycompany.com", "Re: You're fired", "10/11/05", 5, false);
AddMessage(1, "anyone@acompany.com", "Re: Why did you say that", "10/10/05", 5, false);
ItemIndex = axSftTree1.Items.get_ItemIndex(m_OutboxFolder);
axSftTree1.get_Item(ItemIndex).Collapse(false);
m_SavedFolder = AddFolder("Saved", "Saved messages", 2);
AddMessage(1, "me@mycompany.com", "A support question", "10/09/05", 3, false);
AddMessage(2, "support@softelvdm.com", "Re: A support question", "10/09/05", 88, true);
AddMessage(3, "me@mycompany.com", "Re: A support question", "10/09/05", 3, false);
AddMessage(1, "me@mycompany.com", "Why did you say that", "10/06/05", 5, false);
AddMessage(2, "anyone@acompany.com", "Re: Why did you say that", "10/10/05", 5, false);
AddMessage(1, "me@mycompany.com", "You're fired", "10/08/05", 2, false);
AddMessage(2, "anyone@acompany.com", "Re: You're fired", "10/11/05", 82, false);
AddMessage(1, "me@mycompany.com", "You're hired", "10/01/05", 4, false);
AddMessage(1, "anyone@acompany.com", "Re: You're hired", "10/11/05", 6, false);
ItemIndex = axSftTree1.Items.get_ItemIndex(m_SavedFolder);
axSftTree1.get_Item(ItemIndex).Collapse(false);
m_DeletedFolder = AddFolder("Deleted", "Deleted messages", 0);
axSftTree1.ColumnsObj.MakeOptimal();
axSftTree1.Items.RecalcHorizontalExtent();
axSftTree1.Splitter.MakeOptimal();
// clear column header pictures
axSftTree1.get_Header(1).Image.Clear();
axSftTree1.get_Header(2).Image.Clear();
axSftTree1.get_Header(3).Image.Clear();
axSftTree1.Items.Current = 0;
axSftTree1_CaretChange(this, new _DSftTreeEvents_CaretChangeEvent(0));
}
private int AddFolder(string Folder, string Desc, int Count)
{
int ItemIndex = axSftTree1.Items.Add(Folder); // add folder
axSftTree1.get_Cell(ItemIndex, 1).Text = Desc; // add description
axSftTree1.get_Cell(ItemIndex, 3).Text = Count.ToString(); // add number of messages
axSftTree1.get_Cell(ItemIndex, 3).Data = Count; // also save number of messages for sorting
// make the folder name bold
if (m_BoldFont == null) {
m_BoldFont = axSftTree1.get_Cell(ItemIndex, 0).Font;
m_BoldFont.Bold = true;
}
axSftTree1.get_Cell(ItemIndex, 0).Font = m_BoldFont;
// if this folder has no messages (ie. dependents), we still want the
// folder graphic, not the email (leaf) graphic
if (Count == 0)
axSftTree1.get_Item(ItemIndex).Image = axSftTree1.Items.ItemImageExpandable;
return axSftTree1.get_Item(ItemIndex).ID;
}
private int AddMessage(short Level, string Email, string Desc, string Dt, int Size, bool Attachment)
{
int ItemIndex = axSftTree1.Items.Add(Email); // add folder
axSftTree1.get_Item(ItemIndex).Level = Level;
axSftTree1.get_Cell(ItemIndex, 1).Text = Desc; // add description
axSftTree1.get_Cell(ItemIndex, 2).Text = Dt; // add date
axSftTree1.get_Cell(ItemIndex, 3).Text = Size.ToString() + "K";
axSftTree1.get_Cell(ItemIndex, 3).Data = Size; // also save size for sorting
// if this email has replies (ie. dependents), we still want the
// email graphic, not the expand folder image
axSftTree1.get_Item(ItemIndex).Image = axSftTree1.Items.ItemImageLeaf;
// if the email has an attachment, show the image
if (Attachment) {
axSftTree1.get_Cell(ItemIndex, 1).Image.NETImageObject = Attach.Image;
axSftTree1.get_Cell(ItemIndex, 1).ImageHAlign = SftTreeHAlignConstants.halignSftTreeRight;
}
return axSftTree1.get_Item(ItemIndex).ID;
}
private void axSftTree1_CaretChange(object sender, AxSftTreeLib70._DSftTreeEvents_CaretChangeEvent e) {
// set column headers based on selected item
int ID = axSftTree1.get_Item(e.itemIndex).ID;
if (ID == m_InboxFolder || ID == m_OutboxFolder || ID == m_SavedFolder || ID == m_DeletedFolder) {
axSftTree1.get_Header(0).Text = "Folder";
axSftTree1.get_Header(1).Text = "Description";
axSftTree1.get_Header(2).Text = ""; // we can use this to merge the adjacent title
axSftTree1.get_Header(3).Text = "Msgs";
} else {
axSftTree1.get_Header(0).Text = "From";
axSftTree1.get_Header(1).Text = "Subject";
axSftTree1.get_Header(2).Text = "Received";
axSftTree1.get_Header(3).Text = "Size";
}
}
private void axSftTree1_ItemClick(object sender, AxSftTreeLib70._DSftTreeEvents_ItemClickEvent e) {
SftTreeAreaTypeConstants area = (SftTreeAreaTypeConstants) e.areaType;
if (area == SftTreeAreaTypeConstants.constSftTreeButton) {
if (axSftTree1.get_Item(e.itemIndex).Expanded)
axSftTree1.get_Item(e.itemIndex).Collapse(true);
else
axSftTree1.get_Item(e.itemIndex).Expand(true, false);
} else if (area == SftTreeAreaTypeConstants.constSftTreeText) {
// edit description
if (e.colIndex == 1)
axSftTree1.get_Cell(e.itemIndex, e.colIndex).Edit(0, 0);
} else if (area == SftTreeAreaTypeConstants.constSftTreeColumnHeader) {
bool Ascending = true;
if (axSftTree1.get_Header(e.colIndex).Image.Appearance == SftPictureImageConstants.sftImageSortAsc)
Ascending = false;
// we have to sort based on current column headers
int ItemIndex = axSftTree1.Items.Current;
int ID = 0;
if (ItemIndex >= 0)
ID = axSftTree1.get_Item(ItemIndex).ID;
if (ID == m_InboxFolder || ID == m_OutboxFolder || ID == m_SavedFolder || ID == m_DeletedFolder) {
// we're on a folder, so sort on folder level
if (Ascending) {
if (e.colIndex == 3)
// last column is sorted by Cell.Data (numeric values)
axSftTree1.Items.SortDependents(-1, e.colIndex, SftTreeSortTypeConstants.sortSftTreeAscCellItemData);
else
axSftTree1.Items.SortDependents(-1, e.colIndex, SftTreeSortTypeConstants.sortSftTreeAscending);
} else {
if (e.colIndex == 3)
axSftTree1.Items.SortDependents(-1, e.colIndex, SftTreeSortTypeConstants.sortSftTreeDscCellItemData);
else
axSftTree1.Items.SortDependents(-1, e.colIndex, SftTreeSortTypeConstants.sortSftTreeDescending);
}
} else {
// we're on a message, sort inside folders
// now sort the dependents of all folders
ItemIndex = 0;
do {
if (Ascending) {
if (e.colIndex == 3)
// last column is sorted by Cell.Data (numeric values)
axSftTree1.Items.SortDependents(ItemIndex, e.colIndex, SftTreeSortTypeConstants.sortSftTreeAscCellItemData);
else
axSftTree1.Items.SortDependents(ItemIndex, e.colIndex, SftTreeSortTypeConstants.sortSftTreeAscending);
} else {
if (e.colIndex == 3)
axSftTree1.Items.SortDependents(ItemIndex, e.colIndex, SftTreeSortTypeConstants.sortSftTreeDscCellItemData);
else
axSftTree1.Items.SortDependents(ItemIndex, e.colIndex, SftTreeSortTypeConstants.sortSftTreeDescending);
}
ItemIndex = axSftTree1.get_Item(ItemIndex).NextSibling;
} while (ItemIndex >= 0);
}
// change column header image
axSftTree1.get_Header(0).Image.Clear();
axSftTree1.get_Header(1).Image.Clear();
axSftTree1.get_Header(2).Image.Clear();
axSftTree1.get_Header(3).Image.Clear();
if (Ascending)
axSftTree1.get_Header(e.colIndex).Image.Appearance = SftPictureImageConstants.sftImageSortAsc;
else
axSftTree1.get_Header(e.colIndex).Image.Appearance = SftPictureImageConstants.sftImageSortDesc;
// update column headers by calling CaretChange
axSftTree1_CaretChange(this, new _DSftTreeEvents_CaretChangeEvent(axSftTree1.Items.Current));
}
}
private void axSftTree1_ItemDblClick(object sender, AxSftTreeLib70._DSftTreeEvents_ItemDblClickEvent e) {
SftTreeAreaTypeConstants area = (SftTreeAreaTypeConstants) e.areaType;
if (area == SftTreeAreaTypeConstants.constSftTreeText || area == SftTreeAreaTypeConstants.constSftTreeButton) {
// if an item on level 1 or lower is clicked, it's an
// email message, display message box
if (axSftTree1.get_Item(e.itemIndex).Level > 0 && area == SftTreeAreaTypeConstants.constSftTreeText) {
MessageBox.Show("You could be viewing the message from " + axSftTree1.get_Cell(e.itemIndex, 0).Text +
" with the subject '" + axSftTree1.get_Cell(e.itemIndex, 1).Text + "'.");
} else {
// otherwise just expand or collapse the item
if (axSftTree1.get_Item(e.itemIndex).Expanded)
axSftTree1.get_Item(e.itemIndex).Collapse(true);
else
axSftTree1.get_Item(e.itemIndex).Expand(true, false);
}
} else if (area == SftTreeAreaTypeConstants.constSftTreeColumnRes) {
if (e.colIndex >= 0) {
axSftTree1.get_Column(e.colIndex).MakeOptimal();
axSftTree1.Items.RecalcHorizontalExtent();
} else
axSftTree1.Splitter.MakeOptimal();
}
}
private void axSftTree1_EditAllowed(object sender, AxSftTreeLib70._DSftTreeEvents_EditAllowedEvent e) {
// Only allow editing in column 1
e.allowed = (e.colIndex == 1);
}
private void axSftTree1_EditInitializing(object sender, AxSftTreeLib70._DSftTreeEvents_EditInitializingEvent e) {
// LeftPix/TopPix/WidthPix/HeightPix describes the current cell area
// we need to return the position and size needed for editing.
// In this example, we use the height of the control on the form
// and center it over the cell.
e.topPix = e.topPix + (e.heightPix - EditControl.Height) / 2;
e.heightPix = EditControl.Height;
// Set the text in the control used for cell editing and
// set other control-specific properties
EditControl.Width = 200;
EditControl.Text = axSftTree1.get_Cell(e.editIndex, e.editCol).Text;
EditControl.SelectionStart = 0;
EditControl.SelectionLength = 999;
// Return the control's window handle
e.window = (int) EditControl.Handle;
e.vData = EditControl;
// Define navigation keys
// VK_TAB
axSftTree1.CellEditIntercept(9, SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeControlChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeShiftChar);
// VK_RETURN
axSftTree1.CellEditIntercept(13, SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeControlChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeShiftChar);
// VK_HOME
axSftTree1.CellEditIntercept(36, SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeControlChar);
// VK_END
axSftTree1.CellEditIntercept(35, SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeControlChar);
// VK_UP
axSftTree1.CellEditIntercept(38, SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeControlChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeShiftChar);
// VK_DOWN
axSftTree1.CellEditIntercept(40, SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeControlChar | SftTreeCellEditInterceptStyleConstants.cellEditInterceptSftTreeShiftChar);
}
private void axSftTree1_EditNavigating(object sender, AxSftTreeLib70._DSftTreeEvents_EditNavigatingEvent e) {
// Process key pressed
axSftTree1.EditNavigate(e.key, e.shift);
}
private void axSftTree1_EditValidate(object sender, AxSftTreeLib70._DSftTreeEvents_EditValidateEvent e) {
// Validate the new cell contents
string s = EditControl.Text;
s = s.Trim();
if (s.Length <= 0) {
MessageBox.Show("Please enter a description.");
e.inputValid = false;
}
}
private void axSftTree1_EditEnding(object sender, AxSftTreeLib70._DSftTreeEvents_EditEndingEvent e) {
// Save the new cell contents
if (e.saveInput)
axSftTree1.get_Cell(e.editIndex, e.editCol).Text = EditControl.Text;
Control ctrl = (Control) e.vData;
ctrl.Visible = false;
ctrl.Enabled = false;
}
}
}