using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Printing;
using System.Diagnostics;
using GraEditor.DrawTools;
using GraEditor.Elements;
namespace GraEditor
{
public class Canvas
{
//Construct graList to save the drawing actions
protected Canvas()
{
this.graList = new ArrayList(); // define an arraylist with name gralist for saving all the drawing actions
}
//Initialize the canvas. Set name,size and background color of canvas
public void Init(string name, Size size, Color backColor)
{
this.name = name;//Set name of canvas
this.Size = size;//Set size of canvas
this.backColor = backColor;//Set background color of canvas
this.graList.Clear();//Clear all the elements in graList
//this.mainView.AutoScrollMinSize = this.Size;//this.Size;//Set the size of mainView as canvas size
this.isSavedOnce = false;
this.IsModified = false;
}
private static Canvas _single;
public static Canvas Instance
{
//Get canvas instance
get
{
if (_single == null)
_single = new Canvas();
return _single;
}
}
public event EventHandler Modified;
protected void OnModified()
{
if (Modified != null)
Modified(this, EventArgs.Empty);
}
//Dirty flag
private bool isModified;
public bool IsModified
{
get { return this.isModified; }
set
{
this.isModified = value;
OnModified();
}
}
private bool isSavedOnce;
public bool IsSavedOnce
{
get { return this.isSavedOnce; }
set { this.isSavedOnce = value; }
}
private MainView mainView;//private Mainview variable of canvas
public MainView MainView
{
get { return mainView; }
set { mainView = value; }
}
public void Update()//Refresh canvas
{
this.mainView.UpdateView();
}
private string name;//canvas name
public string Name
{
get { return name; }
set { name = value; }
}
private Size size;//canvas size
public Size Size
{
get { return size; }
set
{
size = value;
this.mainView.AutoScrollMinSize = this.size;//this.Size;//Set the size of mainView as canvas size
}
}
private Color backColor;//canvas color i.e. background color of the image
public Color BackColor
{
get { return backColor; }
set
{
backColor = value;
this.Update();
}
}
private ArrayList graList;//Save drawing action on canvas
public ArrayList GraList
{
get { return graList; }
}
public void AddGra(GraElement gra)
{
this.graList.Add(gra);
this.IsModified = true;
this.Update();
}
public void DelGra(GraElement gra)
{
this.graList.Remove(gra);
this.IsModified = true;
this.Update();
}
//Draw function of canvas
public void Draw(Graphics g)
{
foreach (GraElement gra in graList)//Draw all the element in the graList
gra.Draw(g);
}
public bool Open()
{
OpenFileDialog dlg = new OpenFileDialog(); // new open dialog box is instantiated
dlg.Filter = "位图文件(*.bmp;*.jpg;*.gif;*.png)|*.bmp;*.jpg;*.gif;*.png";
dlg.FilterIndex = 1;
dlg.RestoreDirectory = true;
bool bRtn = false;
if (dlg.ShowDialog() == DialogResult.OK)
{
try
{
bRtn = this.OpenFile(dlg.FileName);
}
catch (Exception ex)
{
MessageBox.Show("文件打开错误 - " + ex.Message);
}
}
return bRtn;
}
private FileStream canvasStream;
public bool OpenFile(string fileName)
{
FileInfo fi = new FileInfo(fileName);
if (!fi.Exists)
{
MessageBox.Show("选择的文不存在!", "Open File");
return false;
}
try
{
canvasStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception ex)
{
MessageBox.Show("文件打开错误 - " + ex.Message);
}
Bitmap bmp = new Bitmap(canvasStream);
//fs.Close();
if (bmp != null)
{
Canvas.Instance.Init(fileName, bmp.Size, Color.White);
ImageGra imageGra = new ImageGra(bmp, new Rectangle(new Point(0, 0), bmp.Size));
Canvas.Instance.GraList.Clear();
Canvas.Instance.GraList.Add(imageGra);//Add to GraList
Canvas.Instance.Update();//Update canvas
CurrentBgImage = new Bitmap(bmp);
}
return true;
}
Bitmap currentBgImage = null;
public Bitmap CurrentBgImage
{
get { return currentBgImage; }
set {
if (currentBgImage != null) {
currentBgImage.Dispose();
}
currentBgImage = value; }
}
///
/// 重置 恢复打开时的原始状态
///
public void ReloadCanvas()
{
if (currentBgImage != null)
{
Bitmap bmp = new Bitmap(currentBgImage);
ImageGra imageGra = new ImageGra(bmp, new Rectangle(new Point(0, 0), bmp.Size));
Canvas.Instance.GraList.Clear();
Canvas.Instance.GraList.Add(imageGra);//Add to GraList
Canvas.Instance.Update();//Update canvas
}
else {
Canvas.Instance.GraList.Clear();
Canvas.Instance.Update();//Update canvas
}
}
private ImageFormat GetImageFormatByFileName(string fileName)
{
string ext = Path.GetExtension(fileName);
ImageFormat format = ImageFormat.Bmp;
switch (ext)
{
case ".jpg":
format = ImageFormat.Jpeg;
break;
case ".gif":
format = ImageFormat.Gif;
break;
default:
format = ImageFormat.Bmp;
break;
}
return format;
}
///
/// 获取新绘制的图片
///
///
public Bitmap GetNewBitmap()
{
Size s = Canvas.Instance.Size;
Bitmap bmp = new Bitmap(s.Width, s.Height);
Graphics gBmp = Graphics.FromImage(bmp);
gBmp.Clear(Canvas.Instance.BackColor);
this.Draw(gBmp);
return bmp;
}
public void Save()
{
//if(this.canvasStream == null)
// return;
if (this.name == null ||
this.name.Length == 0)
{
MessageBox.Show("文件名无效!", "警告");
return;
}
Bitmap bmp = GetNewBitmap();
try
{
if (this.canvasStream != null)
this.canvasStream.Close();
ImageFormat format = GetImageFormatByFileName(Canvas.Instance.Name);
bmp.Save(Canvas.Instance.Name, format);
bmp.Dispose();
this.IsModified = false;
this.IsSavedOnce = true;
// this.canvasStream = File.Open(this.name, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception ex)
{
MessageBox.Show("文件保存错误 - " + ex.Message);
}
}
public bool Close()
{
if (canvasStream != null)
{
canvasStream.Close();
canvasStream = null;
}
return true;
}
}
//Redo & Undo operation
public class GraEditStackMgr
{
private GraEditStackMgr()//construct a redo list
{
this.graRedoList = new ArrayList();
}
private static GraEditStackMgr instance;
public static GraEditStackMgr Instance
{
get
{
if (instance == null)
instance = new GraEditStackMgr();
return instance;
}
}
private ArrayList graRedoList;//Redo list
public ArrayList GraRedoList
{
get { return graRedoList; }
}
public void Clear()
{
this.graRedoList.Clear();
}
//Redo operation
public void Redo()
{
if (this.graRedoList.Count == 0)//no undo happen
return;
int lastIndex = this.graRedoList.Count - 1;//Get the last undo action
//Save last undo action to graLast
GraElement graLast = this.graRedoList[lastIndex] as GraElement;
this.graRedoList.RemoveAt(lastIndex);//Remove the last undo action from redo list
//Canvas.Instance.GraList.Add(graLast);//Save the last undo action to GraList
//Canvas.Instance.Update();//Update canvas
Canvas.Instance.AddGra(graLast);
}
//Undo operation
public void Undo()
{
ArrayList graList = Canvas.Instance.GraList;//Get the GraList of Canvas
if (graList.Count == 0)//No drawing action happen
return;
int lastIndex = graList.Count - 1;//Last drawing action position in graList
//Save the last drawing action to graLast
GraElement graLast = graList[lastIndex] as GraElement;
graList.RemoveAt(lastIndex);//Remove the last drawing action
this.graRedoList.Add(graLast);//Add the last drawing action to redo list
Canvas.Instance.Update();//Update canvas
Canvas.Instance.IsModified = true;
}
}
}