using PaintDotNet.SystemLayer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace PaintDotNet
{
///
/// Zyh
/// 原本是继承ImageStrip
/// copy了一个ImageNameStrip
///
internal class DocumentStrip : ImageNameStrip, IDocumentList
{
private List documents = new List();
private List documentButtons = new List();
private Dictionary dw2button = new Dictionary();
private Dictionary thumbs = new Dictionary();
private DocumentWorkspace selectedDocument = null;
private bool ensureSelectedIsVisible = true;
private AppWorkspace appWorkspace;
public DocumentWorkspace[] DocumentList
{
get
{
return this.documents.ToArray();
}
}
public int DocumentCount
{
get
{
return this.documents.Count;
}
}
public event EventHandler DocumentListChanged;
protected virtual void OnDocumentListChanged()
{
if (DocumentListChanged != null)
{
DocumentListChanged(this, EventArgs.Empty);
}
}
public DocumentWorkspace SelectedDocument
{
get
{
return this.selectedDocument;
}
set
{
if (!this.documents.Contains(value))
{
throw new ArgumentException("DocumentWorkspace isn't being tracked by this instance of DocumentStrip");
}
if (this.selectedDocument != value)
{
SelectDocumentWorkspace(value);
OnDocumentClicked(value, DocumentClickAction.Select);
Refresh();
}
}
}
public int SelectedDocumentIndex
{
get
{
return this.documents.IndexOf(this.selectedDocument);
}
}
private bool OnDigitHotKeyPressed(Keys keys)
{
keys &= ~Keys.Alt;
keys &= ~Keys.Control;
if (keys < Keys.D0 || keys > Keys.D9)
{
return false;
}
int digit = (int)keys - (int)Keys.D0;
int index;
if (digit == 0)
{
index = 9;
}
else
{
index = digit - 1;
}
if (index < this.documents.Count)
{
PerformItemClick(index, ItemPart.Image, MouseButtons.Left);
return true;
}
else
{
return false;
}
}
public DocumentStrip(AppWorkspace appWorkspace)
{
this.appWorkspace = appWorkspace;
PdnBaseForm.RegisterFormHotKey(Keys.Delete, OnDeleteHotKeyPressed);
PdnBaseForm.RegisterFormHotKey(Keys.Control | Keys.Tab, OnNextTabHotKeyPressed);
PdnBaseForm.RegisterFormHotKey(Keys.Control | Keys.PageDown, OnNextTabHotKeyPressed);
PdnBaseForm.RegisterFormHotKey(Keys.Control | Keys.Shift | Keys.Tab, OnPreviousTabHotKeyPressed);
PdnBaseForm.RegisterFormHotKey(Keys.Control | Keys.PageUp, OnPreviousTabHotKeyPressed);
//thumbnailManager = new ThumbnailManager(this); // allow for a 1px black border
InitializeComponent();
//#18291
//for (int i = 0; i <= 9; ++i)
//{
// Keys digit = Utility.LetterOrDigitCharToKeys((char)(i + '0'));
// PdnBaseForm.RegisterFormHotKey(Keys.Control | digit, OnDigitHotKeyPressed);
// PdnBaseForm.RegisterFormHotKey(Keys.Alt | digit, OnDigitHotKeyPressed);
//}
this.ShowCloseButtons = true;
}
///
/// 删除按键
///
///
///
private bool OnDeleteHotKeyPressed(Keys keys)
{
if (this.selectedDocument != null)
{
this.selectedDocument.MouseEvent_Del(null, null);
}
if (this.appWorkspace!=null)
{
if(this.appWorkspace.cameraPreviewDialog!=null && !this.appWorkspace.cameraPreviewDialog.IsDisposed)
{
if(this.appWorkspace.cameraPreviewDialog.documentWorkspace!=null)
this.appWorkspace.cameraPreviewDialog.documentWorkspace.MouseEvent_Del(null, null);
}
}
return true;
}
private bool OnNextTabHotKeyPressed(Keys keys)
{
bool processed = NextTab();
return processed;
}
private bool OnPreviousTabHotKeyPressed(Keys keys)
{
bool processed = PreviousTab();
return processed;
}
public bool NextTab()
{
bool changed = false;
if (this.selectedDocument != null)
{
int currentIndex = this.documents.IndexOf(this.selectedDocument);
int newIndex = (currentIndex + 1) % this.documents.Count;
SelectedDocument = this.documents[newIndex];
changed = true;
}
return changed;
}
public bool PreviousTab()
{
bool changed = false;
if (this.selectedDocument != null)
{
int currentIndex = this.documents.IndexOf(this.selectedDocument);
int newIndex = (currentIndex + (this.documents.Count - 1)) % this.documents.Count;
SelectedDocument = this.documents[newIndex];
changed = true;
}
return changed;
}
private void InitializeComponent()
{
this.Name = "DocumentStrip";
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
while (this.documents.Count > 0)
{
RemoveDocumentWorkspace(this.documents[this.documents.Count - 1]);
}
/*if (this.thumbnailManager != null)
{
this.thumbnailManager.Dispose();
this.thumbnailManager = null;
}*/
foreach (DocumentWorkspace dw in this.thumbs.Keys)
{
RenderArgs ra = this.thumbs[dw];
ra.Dispose();
}
this.thumbs.Clear();
this.thumbs = null;
}
base.Dispose(disposing);
}
protected override void OnScrollArrowClicked(ArrowDirection arrowDirection)
{
int sign = 0;
switch (arrowDirection)
{
case ArrowDirection.Left:
sign = -1;
break;
case ArrowDirection.Right:
sign = +1;
break;
}
int delta = ItemSize.Width;
ScrollOffset += sign * delta;
base.OnScrollArrowClicked(arrowDirection);
}
protected override void OnItemClicked(Item item, ItemPart itemPart, MouseButtons mouseButtons)
{
DocumentWorkspace dw = item.Tag as DocumentWorkspace;
if (dw != null)
{
switch (itemPart)
{
case ItemPart.None:
// do nothing
break;
case ItemPart.CloseButton:
if (mouseButtons == MouseButtons.Left)
{
OnDocumentClicked(dw, DocumentClickAction.Close);
}
break;
case ItemPart.Image:
if (mouseButtons == MouseButtons.Left)
{
SelectedDocument = dw;
}
else if (mouseButtons == MouseButtons.Right)
{
// TODO ZYH 预留右键菜单
}
break;
default:
throw new InvalidEnumArgumentException();
}
}
base.OnItemClicked(item, itemPart, mouseButtons);
}
public event EventHandler>> DocumentClicked;
protected virtual void OnDocumentClicked(DocumentWorkspace dw, DocumentClickAction action)
{
if (DocumentClicked != null)
{
DocumentClicked(this, new EventArgs>(
Pair.Create(dw, action)));
}
}
public void UnlockDocumentWorkspaceDirtyValue(DocumentWorkspace unlockMe)
{
Item docItem = this.dw2button[unlockMe];
docItem.UnlockDirtyValue();
}
public void LockDocumentWorkspaceDirtyValue(DocumentWorkspace lockMe, bool forceDirtyValue)
{
Item docItem = this.dw2button[lockMe];
docItem.LockDirtyValue(forceDirtyValue);
}
public void AddDocumentWorkspace(DocumentWorkspace addMe)
{
this.documents.Add(addMe);
ImageNameStrip.Item docButton = new ImageNameStrip.Item();
docButton.Image = null;
docButton.Tag = addMe;
AddItem(docButton);
this.documentButtons.Add(docButton);
addMe.CompositionUpdated += Workspace_CompositionUpdated;
this.dw2button.Add(addMe, docButton);
if (addMe.Document != null)
{
QueueThumbnailUpdate(addMe);
docButton.Dirty = addMe.Document.Dirty;
addMe.Document.DirtyChanged += Document_DirtyChanged;
}
addMe.DocumentChanging += Workspace_DocumentChanging;
addMe.DocumentChanged += Workspace_DocumentChanged;
OnDocumentListChanged();
}
private void Workspace_DocumentChanging(object sender, EventArgs e)
{
if (e.Data != null)
{
e.Data.DirtyChanged -= Document_DirtyChanged;
}
}
private void Workspace_DocumentChanged(object sender, EventArgs e)
{
DocumentWorkspace dw = (DocumentWorkspace)sender;
ImageNameStrip.Item docButton = this.dw2button[dw];
if (dw.Document != null)
{
docButton.Dirty = dw.Document.Dirty;
dw.Document.DirtyChanged += Document_DirtyChanged;
}
else
{
docButton.Dirty = false;
}
}
private void Document_DirtyChanged(object sender, EventArgs e)
{
for (int i = 0; i < this.documents.Count; ++i)
{
if (object.ReferenceEquals(sender, this.documents[i].Document))
{
ImageNameStrip.Item docButton = this.dw2button[this.documents[i]];
docButton.Dirty = ((Document)sender).Dirty;
}
}
}
private void Workspace_CompositionUpdated(object sender, EventArgs e)
{
DocumentWorkspace dw = (DocumentWorkspace)sender;
QueueThumbnailUpdate(dw);
}
public void RemoveDocumentWorkspace(DocumentWorkspace removeMe)
{
removeMe.CompositionUpdated -= Workspace_CompositionUpdated;
if (this.selectedDocument == removeMe)
{
this.selectedDocument = null;
}
removeMe.DocumentChanging -= Workspace_DocumentChanging;
removeMe.DocumentChanged -= Workspace_DocumentChanged;
if (removeMe.Document != null)
{
removeMe.Document.DirtyChanged -= Document_DirtyChanged;
}
this.documents.Remove(removeMe);
ImageNameStrip.Item docButton = this.dw2button[removeMe];
this.RemoveItem(docButton);
this.dw2button.Remove(removeMe);
this.documentButtons.Remove(docButton);
if (this.thumbs.ContainsKey(removeMe))
{
RenderArgs thumbRA = this.thumbs[removeMe];
Surface surface = thumbRA.Surface;
thumbRA.Dispose();
this.thumbs.Remove(removeMe);
surface.Dispose();
}
OnDocumentListChanged();
}
protected override void OnLayout(LayoutEventArgs levent)
{
base.OnLayout(levent);
if (this.ensureSelectedIsVisible &&
(!Focused && !LeftScrollButton.Focused && !RightScrollButton.Focused))
{
int index = this.documents.IndexOf(this.selectedDocument);
EnsureItemFullyVisible(index);
}
}
public void SelectDocumentWorkspace(DocumentWorkspace selectMe)
{
UI.SuspendControlPainting(this);
this.selectedDocument = selectMe;
if (this.thumbs.ContainsKey(selectMe))
{
//RenderArgs thumb = this.thumbs[selectMe];
//Bitmap bitmap = thumb.Bitmap;
}
else
{
QueueThumbnailUpdate(selectMe);
}
foreach (ImageNameStrip.Item docItem in this.documentButtons)
{
if ((docItem.Tag as DocumentWorkspace) == selectMe)
{
EnsureItemFullyVisible(docItem);
docItem.Checked = true;
}
else
{
docItem.Checked = false;
}
}
UI.ResumeControlPainting(this);
Invalidate(true);
}
public void RefreshAllThumbnails()
{
foreach (DocumentWorkspace dw in this.documents)
{
QueueThumbnailUpdate(dw);
}
}
private void OnThumbnailUpdated(DocumentWorkspace dw)
{
if (this.dw2button.ContainsKey(dw))
{
ImageNameStrip.Item docButton = this.dw2button[dw];
docButton.Name = dw.GetFriendlyName();
docButton.Update();
}
}
public void SetDw2buttonName(DocumentWorkspace dw, string buttonName)
{
if (this.dw2button.ContainsKey(dw))
{
ImageNameStrip.Item docButton = this.dw2button[dw];
docButton.Name = buttonName;
docButton.Update();
}
}
public void QueueThumbnailUpdate(DocumentWorkspace dw)
{
OnThumbnailUpdated(dw);
}
}
}