Author: mkrueger
Date: 2008-01-24 20:37:47 -0500 (Thu, 24 Jan 2008)
New Revision: 93872

Modified:
   trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.Highlighting/Style.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
Log:
* Mono.TextEditor/DefaultEditActions.cs,
  Mono.TextEditor/TextEditorData.cs, Mono.TextEditor/TextEditor.cs,
  Mono.TextEditor.Highlighting/Style.cs: Editor is now capable of
  outputting rtf to clipboard.

Modified: trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog
===================================================================
--- trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog 2008-01-25 
01:28:22 UTC (rev 93871)
+++ trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog 2008-01-25 
01:37:47 UTC (rev 93872)
@@ -1,13 +1,17 @@
 2008-01-25  Mike Krüger <[EMAIL PROTECTED]> 
 
-       * OblivionStyle.xml, Mono.TextEditor/RedBlackTree.cs,
-         Mono.TextEditor/LineSegmentTree.cs, Mono.TextEditor/TextEditor.cs,
-         Mono.TextEditor.Highlighting/Style.cs,
-         Mono.TextEditor.Highlighting/DefaultStyle.cs, C64Style.xml: Selected
-         foreground colors are now part of the highlighting style.
+       * Mono.TextEditor/DefaultEditActions.cs, 
Mono.TextEditor/TextEditorData.cs,
+         Mono.TextEditor/TextEditor.cs, Mono.TextEditor.Highlighting/Style.cs:
+         Editor is now capable of outputting rtf to clipboard.
 
 2008-01-25  Mike Krüger <[EMAIL PROTECTED]> 
 
+       * Mono.TextEditor/DefaultEditActions.cs, 
Mono.TextEditor/TextEditorData.cs,
+         Mono.TextEditor/TextEditor.cs, Mono.TextEditor.Highlighting/Style.cs:
+         Editor is now capable of outputting rtf to clipboard.
+
+2008-01-25  Mike Krüger <[EMAIL PROTECTED]> 
+
        * OblivionStyle.xml, Mono.TextEditor/RedBlackTree.cs,
          Mono.TextEditor/LineSegmentTree.cs, Mono.TextEditor/TextEditor.cs,
          Mono.TextEditor.Highlighting/Style.cs,
@@ -31,30 +35,15 @@
 
 2008-01-22  Mike Krüger <[EMAIL PROTECTED]> 
 
-       * Mono.TextEditor.Highlighting/SyntaxModeService.cs: Worked on style 
panel.
-
-2008-01-22  Mike Krüger <[EMAIL PROTECTED]> 
-
        * OblivionStyle.xml, Mono.TextEditor.Highlighting/Style.cs, 
C64Style.xml:
          Color styles now have descriptions. Name/Description is now 
localizable.
 
 2008-01-22  Mike Krüger <[EMAIL PROTECTED]> 
 
-       * OblivionStyle.xml, Mono.TextEditor.Highlighting/Style.cs, 
C64Style.xml:
-         Color styles now have descriptions. Name/Description is now 
localizable.
-
-2008-01-22  Mike Krüger <[EMAIL PROTECTED]> 
-
        * Mono.TextEditor/TextEditor.cs, Mono.TextEditor/TextEditorOptions.cs,
          Mono.TextEditor/GutterMargin.cs: Added some text editor options -
          options are now virtual.
 
-2008-01-22  Mike Krüger <[EMAIL PROTECTED]> 
-
-       * Mono.TextEditor/TextEditor.cs, Mono.TextEditor/TextEditorOptions.cs,
-         Mono.TextEditor/GutterMargin.cs: Added some text editor options -
-         options are now virtual.
-
 2008-01-21  Mike Krüger <[EMAIL PROTECTED]> 
 
        * Mono.TextEditor.mdp, Mono.TextEditor.mds: Added changelogs to the 
project

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
     2008-01-25 01:28:22 UTC (rev 93871)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
     2008-01-25 01:37:47 UTC (rev 93872)
@@ -666,11 +666,149 @@
        
        public class CopyAction : EditAction
        {
+               const int TextType     = 1;             
+               const int RichTextType = 2;
+               
+               const int UTF8_FORMAT = 8;
+               
+               public static readonly Gdk.Atom CLIPBOARD_ATOM = 
Gdk.Atom.Intern ("CLIPBOARD", false);
+               static readonly Gdk.Atom RTF_ATOM = Gdk.Atom.Intern 
("text/rtf", false);
+               
+               void ClipboardGetFunc (Clipboard clipboard, SelectionData 
selection_data, uint info)
+               {
+                       switch (info) {
+                       case TextType:
+                               selection_data.Text = text;
+                               break;
+                       case RichTextType:
+                               selection_data.Set (RTF_ATOM, UTF8_FORMAT, 
System.Text.Encoding.UTF8.GetBytes (rtf.ToString ()));
+                               break;
+                       }
+               }
+               void ClipboardClearFunc (Clipboard clipboard)
+               {
+                       // NOTHING ?
+               }
+               
+               string text;
+               string rtf;
+               void GenerateRtf (TextEditorData data)
+               {
+                       StringBuilder rtf = new StringBuilder();
+               
+                       rtf.Append (@"{\rtf1\ansi\deff0\adeflang1025");
+                       
+                       // font table
+                       rtf.Append(@"{\fonttbl");
+                       rtf.Append(@"{\f0\fnil\fprq1\fcharset128 " + 
TextEditorOptions.Options.Font.Family + ";}");
+                       rtf.Append("}");
+                       
+                       // color table
+                       rtf.Append (@"{\colortbl ;");
+                       Dictionary<Gdk.Color, int> colorTable = new 
Dictionary<Gdk.Color,int> ();
+                       for (int i = 0; i < 
Mono.TextEditor.Highlighting.Style.ColorTableCount; i++) {
+                               Gdk.Color color = data.ColorStyle.GetColor 
(Mono.TextEditor.Highlighting.Style.GetColorName (i));
+                               rtf.Append (@"\red");
+                               rtf.Append (color.Red);
+                               rtf.Append (@"\green");
+                               rtf.Append (color.Green); 
+                               rtf.Append (@"\blue");
+                               rtf.Append (color.Blue);
+                               rtf.Append (";");
+                               colorTable[color] = i;
+                       }
+                       rtf.Append ("}");
+                       rtf.Append (@"\viewkind4\uc1\pard");
+                       rtf.Append (@"\f0");
+                       try {
+                               string fontName = 
TextEditorOptions.Options.Font.ToString ();
+                               double fontSize = Double.Parse 
(fontName.Substring (fontName.LastIndexOf (' ')  + 1)) * 2;
+                               rtf.Append (@"\fs");
+                               rtf.Append (fontSize);
+                       } catch (Exception) {};
+                       
+                       rtf.Append (@"\cf1");
+
+                       ISegment selection = data.SelectionRange;
+                       LineSegment line    = 
data.Document.Splitter.GetByOffset (selection.Offset);
+                       LineSegment endLine = 
data.Document.Splitter.GetByOffset (selection.EndOffset);
+                       
+                       
RedBlackTree<LineSegmentTree.TreeNode>.RedBlackTreeIterator iter = line.Iter;
+                       bool isItalic = false;
+                       bool isBold   = false;
+                       int curColor  = 0;
+                       do {
+                               line = iter.Current;
+                               Chunk[] chunks = 
data.Document.SyntaxMode.GetChunks (data.Document, 
+                                                                               
     data.ColorStyle, 
+                                                                               
     line, 
+                                                                               
     line.Offset, 
+                                                                               
     line.Offset + line.EditableLength);
+                               foreach (Chunk chunk in chunks) {
+                                       int start = System.Math.Max 
(selection.Offset, chunk.Offset);
+                                       int end   = System.Math.Min 
(chunk.EndOffset, selection.EndOffset);
+                                       if (start < end) {
+                                               bool appendSpace = false;
+                                               if (isBold != chunk.Style.Bold) 
{
+                                                       rtf.Append 
(chunk.Style.Bold ? @"\b" : @"\b0");
+                                                       isBold = 
chunk.Style.Bold;
+                                                       appendSpace = true;
+                                               }
+                                               if (isItalic != 
chunk.Style.Italic) {
+                                                       rtf.Append 
(chunk.Style.Italic ? @"\b" : @"\b0");
+                                                       isItalic = 
chunk.Style.Italic;
+                                                       appendSpace = true;
+                                               }
+                                               if (curColor != 
colorTable[chunk.Style.Color]) {
+                                                       curColor = 
colorTable[chunk.Style.Color];
+                                                       rtf.Append (@"\cf" + 
(curColor + 1));                                   
+                                                       appendSpace = true;
+                                               }
+                                               if (appendSpace)
+                                                       rtf.Append (' ');
+                                               for (int i = start; i < end; 
i++) {
+                                                       char ch = 
data.Document.Buffer.GetCharAt (i);
+                                                       switch (ch) {
+                                                       case '\\':
+                                                               rtf.Append 
(@"\\");
+                                                               break;
+                                                       case '{':
+                                                               rtf.Append 
(@"\{");
+                                                               break;
+                                                       case '}':
+                                                               rtf.Append 
(@"\}");
+                                                               break;
+                                                       case '\t':
+                                                               rtf.Append 
(@"\tab");
+                                                               break;
+                                                       default:
+                                                               rtf.Append (ch);
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                               if (line == endLine)
+                                       break;
+                               rtf.Append (@"\par");
+                       } while (iter.MoveNext ());
+                       rtf.Append("}");
+                       System.Console.WriteLine(rtf);
+                       this.rtf = rtf.ToString ();
+               }
+               
                public override void Run (TextEditorData data)
                {
                        if (data.IsSomethingSelected) {
-                               Clipboard clipboard = Clipboard.Get 
(Gdk.Atom.Intern ("CLIPBOARD", false));
-                               clipboard.Text = data.Document.Buffer.GetTextAt 
(data.SelectionRange);
+                               Clipboard clipboard = Clipboard.Get 
(CopyAction.CLIPBOARD_ATOM);
+                               
+                               text = data.Document.Buffer.GetTextAt 
(data.SelectionRange);
+                               GenerateRtf (data);
+                               
+                               Gtk.TargetList list = new Gtk.TargetList ();
+                               list.Add (RTF_ATOM, /* FLAGS */ 0, 
RichTextType);
+                               list.AddTextTargets (TextType);
+                               clipboard.SetWithData ((Gtk.TargetEntry[])list, 
ClipboardGetFunc, ClipboardClearFunc);
                        }
                }
        }
@@ -679,7 +817,7 @@
        {
                public override void Run (TextEditorData data)
                {
-                       Clipboard clipboard = Clipboard.Get (Gdk.Atom.Intern 
("CLIPBOARD", false));
+                       Clipboard clipboard = Clipboard.Get 
(CopyAction.CLIPBOARD_ATOM);
                        if (clipboard.WaitIsTextAvailable ()) {
                                if (data.IsSomethingSelected) {
                                        DeleteAction.DeleteSelection (data);

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs 
    2008-01-25 01:28:22 UTC (rev 93871)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs 
    2008-01-25 01:37:47 UTC (rev 93872)
@@ -451,10 +451,10 @@
 
                public Mono.TextEditor.Highlighting.Style ColorStyle {
                        get {
-                               return style;
+                               return this.textEditorData.ColorStyle;
                        }
                        set {
-                               style = value;
+                               this.textEditorData.ColorStyle = value;
                        }
                }
 

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
 2008-01-25 01:28:22 UTC (rev 93871)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
 2008-01-25 01:37:47 UTC (rev 93872)
@@ -62,6 +62,16 @@
                        }
                }
                
+               Mono.TextEditor.Highlighting.Style colorStyle;
+               public Mono.TextEditor.Highlighting.Style ColorStyle {
+                       get {
+                               return colorStyle;
+                       }
+                       set {
+                               colorStyle = value;
+                       }
+               }
+               
                public bool IsSomethingSelected {
                        get {
                                return SelectionStart != null && SelectionEnd 
!= null; 

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.Highlighting/Style.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.Highlighting/Style.cs
     2008-01-25 01:28:22 UTC (rev 93871)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.Highlighting/Style.cs
     2008-01-25 01:37:47 UTC (rev 93872)
@@ -187,7 +187,35 @@
                        invalidLineMarker = new Gdk.Color (210, 0, 0);
                        
                }
+               static readonly string[] colorTable = new string[] { "Comment", 
+                                           "String",
+                                           "Punctuation",
+                                           "Keyword1",
+                                           "Keyword2",
+                                           "Keyword3",
+                                           "Keyword4",
+                                           "PreProcessorDirective" };
                
+               public static int ColorTableCount {
+                       get {
+                               return colorTable.Length;
+                       }
+               }
+               
+               public static string GetColorName (int number)
+               {
+                       return colorTable[number];
+               }
+               
+               public static int GetColorNumber (string name)
+               {
+                       for (int i = 0; i < colorTable.Length; i++) {
+                               if (colorTable[i] == name)
+                                       return i;
+                       }
+                       return -1;
+               }
+               
                public Gdk.Color GetColor (string name)
                {
                        switch (name) {

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to