//Copyright (C) 2000 Microsoft Corporation. All rights reserved. //This source code is intended only as a supplement to Microsoft //Development Tools and/or on-line documentation. See these other //materials for detailed information regarding Microsoft code samples. //THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY //KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE //IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A //PARTICULAR PURPOSE. namespace Scribble { using System; using System.IO ; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using Softelvdm.SftTabsNET; /// <summary> /// Summary description for Form2. /// </summary> public class ScribbleView : System.Windows.Forms.Form { /// <summary> /// Required designer variable /// </summary> private System.ComponentModel.Container components; private ScribbleDoc myDoc; private MainWindow mainWin; public Point previousPoint; // the last mouse pt in the stroke in progress public Stroke currentStroke;// the stroke in progress public ScribbleView(ScribbleDoc doc,MainWindow parent) { // // Required for Win Form Designer support // InitializeComponent(); this.myDoc = doc; this.MdiParent = parent; //Make this view Mdi child of the main window mainWin = parent; // Add a new tab TabClass t = parent.sftTabs1.TabCollection.Add(); // create a new tab t.Tag1 = this; // save reference of view associated with this tab t.BackColorStart = Color.FromArgb(0xdd, 0xec, 0xfe); t.BackColorEnd = Color.FromArgb(0x81, 0xA9, 0xE2); t.BackColor = Color.FromArgb(0x81, 0xA9, 0xE2); t.BackColorSelectedStart = Color.FromArgb(0xDD, 0xEC, 0xFE); t.BackColorSelectedEnd = Color.FromArgb(0x81, 0xA9, 0xE2); t.BackColorActive = Color.FromArgb(0x81, 0xA9, 0xE2); SetTitle(""); } /// <summary> /// Clean up any resources being used /// </summary> protected override void Dispose( bool disposing ) { // Find the tab that describes this form (we saved a reference // to the form object in the tab's Tag1 property) // We have to delete that tab because the MDI Child // is going away MainWindow parent = MdiParent as MainWindow; // remove the tab representing this form if (parent.sftTabs1 != null) { foreach (TabClass t in parent.sftTabs1.TabCollection) { if (t.Tag1 == this) { parent.sftTabs1.TabCollection.RemoveAt(t.Index); break; } } } if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor /// </summary> private void InitializeComponent() { // // ScribbleView // this.AutoScaleBaseSize = new System.Drawing.Size(6, 15); this.BackColor = System.Drawing.Color.White; this.ClientSize = new System.Drawing.Size(373, 320); this.Name = "ScribbleView"; this.Text = "ScribbleDoc"; this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MouseDownHandler); this.Closing += new System.ComponentModel.CancelEventHandler(this.ClosingHandler); this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.MouseUpHandler); this.Closed += new System.EventHandler(this.ClosedHandler); this.Paint += new System.Windows.Forms.PaintEventHandler(this.PaintHandler); this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MouseMoveHandler); } public void SetTitle(string fileName) { if (fileName == "") { // empty, new document if (myDoc.viewList.Count <= 1) this.Text = "New Document" + myDoc.docID.ToString(); else this.Text = "New Document" + myDoc.docID.ToString() + ":" + myDoc.viewList.Count.ToString(); fileName = "New Document"; } else { // existing file if (myDoc.viewList.Count <= 1) this.Text = Path.GetFileName(fileName); else this.Text = Path.GetFileName(fileName) + ":" + myDoc.viewList.Count.ToString(); } foreach (TabClass t in mainWin.sftTabs1.TabCollection) { if (t.Tag1 == this) { t.Text = this.Text; t.ToolTip = fileName; break; } } } private void MouseDownHandler(Object sender, MouseEventArgs e) { if(!this.Capture) return; try{ Point p = new Point(e.X,e.Y); currentStroke = myDoc.NewStroke(); currentStroke.pointArray.Add(p);// Add first point to the new stroke previousPoint = p; this.Capture = true; // Capture the mouse until button up } catch(Exception ex) { MessageBox.Show(ex.ToString()); } } private void MouseMoveHandler(Object sender,MouseEventArgs e) { if(!this.Capture) return; try{ Point p = new Point(e.X , e.Y); currentStroke.pointArray.Add(p); Graphics g = this.CreateGraphics(); g.DrawLine(myDoc.GetCurrentPen(),previousPoint,p); previousPoint = p; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void MouseUpHandler(Object sender,MouseEventArgs e) { //If the current stroke is null, ignore this event if(currentStroke==null) return; try{ Point p= new Point(e.X,e.Y); currentStroke.pointArray.Add(p); Graphics g = this.CreateGraphics(); g.DrawLine(myDoc.GetCurrentPen(),previousPoint,p); previousPoint=p; // Tell the stroke item that we're done adding points to it. // This is so it can finish computing its bounding rectangle. currentStroke.FinishStroke(); // Now that a stoke is added, inform all the views of the document about this myDoc.UpdateAllViews(this,currentStroke); this.Capture = false; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void PaintHandler(Object sender, PaintEventArgs e) { Rectangle rectClip = e.ClipRectangle;; rectClip.Inflate(1,1); Rectangle rectStroke; for(int i=0; i < myDoc.strokeList.Count; i++) { Stroke st = (Stroke)myDoc.strokeList[i]; rectStroke = st.GetBoundingRectangle(); rectStroke.Inflate(1, 1); // avoid rounding to nothing if (!rectStroke.IntersectsWith(rectClip)) continue; st.DrawStroke(e.Graphics) ; } } public void ClosingHandler(Object sender, CancelEventArgs e) { if(myDoc.isDirty && myDoc.viewList.Count == 1) { DialogResult save = MessageBox.Show("Do you want to save changes ?","Scribble",MessageBoxButtons.YesNoCancel); if(save == DialogResult.Yes) { SaveFileDialog saveDlg = new SaveFileDialog(); saveDlg.Filter = "Scribble Files (*.scb)|*.scb|All Files (*.*)|*.*"; saveDlg.DefaultExt = ".scb"; if (myDoc.docFileName == "") saveDlg.FileName = "Untitled"; else saveDlg.FileName = myDoc.docFileName; DialogResult res = saveDlg.ShowDialog (); if(res == DialogResult.OK) { myDoc.SaveDocument(saveDlg.FileName); myDoc.viewList.Remove(this); this.MdiParent=null;// remove this view(child) from the parent list } else if(res == DialogResult.Cancel) e.Cancel = true; } else if(save == DialogResult.Cancel) e.Cancel = true; //If user selected 'Cancel',don't close the form else if(save == DialogResult.No) { myDoc.viewList.Remove(this); } } else { myDoc.viewList.Remove(this); } } public void ClosedHandler(Object sender,EventArgs e) { //If there are no child views, then disable menu and toolbar items if (mainWin.MdiChildren.Length <= 1 ) mainWin.DisableItems(); } public ScribbleDoc GetDocument() { return myDoc; } } }