Fix bug #395
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / FontDialog.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2006, Alexander Olk
21 //
22 // Authors:
23 //      Alexander Olk   alex.olk@googlemail.com
24 //
25 //
26
27 // NOT COMPLETE - work in progress
28
29 using System.ComponentModel;
30 using System.Drawing;
31 using System.Text.RegularExpressions;
32 using System;
33 using System.Collections;
34
35 namespace System.Windows.Forms
36 {
37         [DefaultProperty( "Font" )]
38         [DefaultEvent("Apply")]
39         public class FontDialog : CommonDialog
40         {
41                 protected static readonly object EventApply = new object ();
42
43                 private Font font;
44                 private Color color = Color.Black;
45                 private bool allowSimulations = true;
46                 private bool allowVectorFonts = true;
47                 private bool allowVerticalFonts = true;
48                 private bool allowScriptChange = true;
49                 private bool fixedPitchOnly = false;
50                 private int maxSize = 0;
51                 private int minSize = 0;
52                 private bool scriptsOnly = false;
53                 private bool showApply = false;
54                 private bool showColor = false;
55                 private bool showEffects = true;
56                 private bool showHelp = false;
57                 
58                 private bool fontMustExist = false;
59                 
60                 private Panel examplePanel;
61                 
62                 private Button okButton;
63                 private Button cancelButton;
64                 private Button applyButton;
65                 private Button helpButton;
66                 
67                 private TextBox fontTextBox;
68                 private TextBox fontstyleTextBox;
69                 private TextBox fontsizeTextBox;
70                 
71                 private MouseWheelListBox fontListBox;
72                 private MouseWheelListBox fontstyleListBox;
73                 private MouseWheelListBox fontsizeListBox;
74                 
75                 private GroupBox effectsGroupBox;
76                 private CheckBox strikethroughCheckBox;
77                 private CheckBox underlinedCheckBox;
78                 private ComboBox scriptComboBox;
79                 
80                 private Label fontLabel;
81                 private Label fontstyleLabel;
82                 private Label sizeLabel;
83                 private Label scriptLabel;
84                 
85                 private GroupBox exampleGroupBox;
86                 
87                 private ColorComboBox colorComboBox;
88                 
89                 private string currentFontName;
90                 
91                 private float currentSize;
92                 
93                 private FontFamily currentFamily;
94                 
95                 private FontStyle currentFontStyle;
96                 
97                 private bool underlined = false;
98                 private bool strikethrough = false;
99                 
100                 private Hashtable fontHash = new Hashtable();
101                 
102                 private int[] a_sizes = {
103                         6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72
104                 };
105                 
106                 // char set stuff is only here to make me happy :-)
107                 private string [] char_sets_names = {
108                         "Western",
109                         "Symbol",
110                         "Shift Jis",
111                         "Hangul",
112                         "GB2312",
113                         "BIG5",
114                         "Greek",
115                         "Turkish",
116                         "Hebrew",
117                         "Arabic",
118                         "Baltic",
119                         "Vietname",
120                         "Cyrillic",
121                         "East European",
122                         "Thai",
123                         "Johab",
124                         "Mac",
125                         "OEM",
126                         "VISCII",
127                         "TCVN",
128                         "KOI-8",
129                         "ISO-8859-3",
130                         "ISO-8859-4",
131                         "ISO-8859-10",
132                         "Celtic"
133                 };
134                 
135                 private string [] char_sets = {
136                         "AaBbYyZz",
137                         "Symbol",
138                         "Aa" + (char)0x3042 + (char)0x3041 + (char)0x30a2  + (char)0x30a1 + (char)0x4e9c + (char)0x5b87,
139                         (char)0xac00 + (char)0xb098 + (char)0xb2e4 + "AaBYyZz",
140                         new String(new Char [] {(char)0x5fae, (char)0x8f6f, (char)0x4e2d, (char)0x6587, (char)0x8f6f, (char)0x4ef6}),
141                         new String(new Char [] {(char)0x4e2d, (char)0x6587, (char)0x5b57, (char)0x578b, (char)0x7bc4, (char)0x4f8b}),
142                         "AaBb" + (char)0x0391 + (char)0x03b1 + (char)0x0392 + (char)0x03b2,
143                         "AaBb" + (char)0x011e + (char)0x011f + (char)0x015e + (char)0x015f,
144                         "AaBb" + (char)0x05e0 + (char)0x05e1 + (char)0x05e9 + (char)0x05ea,
145                         "AaBb" + (char)0x0627 + (char)0x0628 + (char)0x062c + (char)0x062f + (char)0x0647 + (char)0x0648 + (char)0x0632,
146                         "AaBbYyZz",
147                         "AaBb" + (char)0x01a0 + (char)0x01a1 + (char)0x01af + (char)0x01b0,
148                         "AaBb" + (char)0x0411 + (char)0x0431 + (char)0x0424 + (char)0x0444,
149                         "AaBb" + (char)0xc1 + (char)0xe1 + (char)0xd4 + (char)0xf4,
150                         "AaBb" + (char)0x0e2d + (char)0x0e31 + (char)0x0e01 + (char)0x0e29 + (char)0x0e23 + (char)0x0e44 + (char)0x0e17 +(char)0x0e22,
151                         (char)0xac00 + (char)0xb098 + (char)0xb2e4 + "AaBYyZz",
152                         "AaBbYyZz",
153                         "AaBb" + (char)0xf8 + (char)0xf1 + (char)0xfd,
154                         "",
155                         "",
156                         "",
157                         "",
158                         "",
159                         "",
160                         ""
161                 };
162                 
163                 private string example_panel_text;
164                 
165                 private bool internal_change = false;
166                 
167                 #region Public Constructors
168                 public FontDialog( )
169                 {
170                         form = new DialogForm (this);
171                         example_panel_text = char_sets [0];
172                         
173                         okButton = new Button( );
174                         cancelButton = new Button( );
175                         applyButton = new Button( );
176                         helpButton = new Button( );
177                         
178                         fontTextBox = new TextBox( );
179                         fontstyleTextBox = new TextBox( );
180                         fontsizeTextBox = new TextBox( );
181                         
182                         fontListBox = new MouseWheelListBox ();
183                         fontsizeListBox = new MouseWheelListBox ();
184                         fontstyleListBox = new MouseWheelListBox ();
185                         
186                         fontLabel = new Label( );
187                         fontstyleLabel = new Label( );
188                         sizeLabel = new Label( );
189                         scriptLabel = new Label( );
190                         
191                         exampleGroupBox = new GroupBox( );
192                         
193                         effectsGroupBox = new GroupBox( );
194                         underlinedCheckBox = new CheckBox( );
195                         strikethroughCheckBox = new CheckBox( );
196                         scriptComboBox = new ComboBox( );
197                         
198                         examplePanel = new Panel( );
199                         
200                         colorComboBox = new ColorComboBox( this );
201                         
202                         exampleGroupBox.SuspendLayout( );
203                         effectsGroupBox.SuspendLayout( );
204                         form.SuspendLayout( );
205                         
206                         form.FormBorderStyle = FormBorderStyle.FixedDialog;
207                         form.MaximizeBox = false;
208                         
209                         // fontsizeListBox
210                         fontsizeListBox.Location = new Point( 284, 47 );
211                         fontsizeListBox.Size = new Size( 52, 95 );
212                         fontsizeListBox.TabIndex = 10;
213                         fontListBox.Sorted = true;
214                         // fontTextBox
215                         fontTextBox.Location = new Point( 16, 26 );
216                         fontTextBox.Size = new Size( 140, 21 );
217                         fontTextBox.TabIndex = 5;
218                         fontTextBox.Text = "";
219                         // fontstyleLabel
220                         fontstyleLabel.Location = new Point( 164, 10 );
221                         fontstyleLabel.Size = new Size( 100, 16 );
222                         fontstyleLabel.TabIndex = 1;
223                         fontstyleLabel.Text = "Font Style:";
224                         // typesizeTextBox
225                         fontsizeTextBox.Location = new Point( 284, 26 );
226                         fontsizeTextBox.Size = new Size( 52, 21 );
227                         fontsizeTextBox.TabIndex = 7;
228                         fontsizeTextBox.Text = "";
229                         fontsizeTextBox.MaxLength = 2;
230                         // schriftartListBox
231                         fontListBox.Location = new Point( 16, 47 );
232                         fontListBox.Size = new Size( 140, 95 );
233                         fontListBox.TabIndex = 8;
234                         fontListBox.Sorted = true;
235                         // exampleGroupBox
236                         exampleGroupBox.Controls.Add( examplePanel );
237                         exampleGroupBox.FlatStyle = FlatStyle.System;
238                         exampleGroupBox.Location = new Point( 164, 158 );
239                         exampleGroupBox.Size = new Size( 172, 70 );
240                         exampleGroupBox.TabIndex = 12;
241                         exampleGroupBox.TabStop = false;
242                         exampleGroupBox.Text = "Example";
243                         // fontstyleListBox
244                         fontstyleListBox.Location = new Point( 164, 47 );
245                         fontstyleListBox.Size = new Size( 112, 95 );
246                         fontstyleListBox.TabIndex = 9;
247                         // schriftartLabel
248                         fontLabel.Location = new Point( 16, 10 );
249                         fontLabel.Size = new Size( 88, 16 );
250                         fontLabel.TabIndex = 0;
251                         fontLabel.Text = "Font:";
252                         // effectsGroupBox
253                         effectsGroupBox.Controls.Add( underlinedCheckBox );
254                         effectsGroupBox.Controls.Add( strikethroughCheckBox );
255                         effectsGroupBox.Controls.Add( colorComboBox );
256                         effectsGroupBox.FlatStyle = FlatStyle.System;
257                         effectsGroupBox.Location = new Point( 16, 158 );
258                         effectsGroupBox.Size = new Size( 140, 116 );
259                         effectsGroupBox.TabIndex = 11;
260                         effectsGroupBox.TabStop = false;
261                         effectsGroupBox.Text = "Effects";
262                         // strikethroughCheckBox
263                         strikethroughCheckBox.FlatStyle = FlatStyle.System;
264                         strikethroughCheckBox.Location = new Point( 8, 16 );
265                         strikethroughCheckBox.TabIndex = 0;
266                         strikethroughCheckBox.Text = "Strikethrough";
267                         // colorComboBox
268                         colorComboBox.Location = new Point( 8, 70 );
269                         colorComboBox.Size = new Size( 130, 21 );
270                         // sizeLabel
271                         sizeLabel.Location = new Point( 284, 10 );
272                         sizeLabel.Size = new Size( 100, 16 );
273                         sizeLabel.TabIndex = 2;
274                         sizeLabel.Text = "Size:";
275                         // scriptComboBox
276                         scriptComboBox.Location = new Point( 164, 253 );
277                         scriptComboBox.Size = new Size( 172, 21 );
278                         scriptComboBox.TabIndex = 14;
279                         scriptComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
280                         // okButton
281                         okButton.FlatStyle = FlatStyle.System;
282                         okButton.Location = new Point( 352, 26 );
283                         okButton.Size = new Size( 70, 23 );
284                         okButton.TabIndex = 3;
285                         okButton.Text = "OK";
286                         // cancelButton
287                         cancelButton.FlatStyle = FlatStyle.System;
288                         cancelButton.Location = new Point( 352, 52 );
289                         cancelButton.Size = new Size( 70, 23 );
290                         cancelButton.TabIndex = 4;
291                         cancelButton.Text = "Cancel";
292                         // applyButton
293                         applyButton.FlatStyle = FlatStyle.System;
294                         applyButton.Location = new Point( 352, 78 );
295                         applyButton.Size = new Size( 70, 23 );
296                         applyButton.TabIndex = 5;
297                         applyButton.Text = "Apply";
298                         // helpButton
299                         helpButton.FlatStyle = FlatStyle.System;
300                         helpButton.Location = new Point( 352, 104 );
301                         helpButton.Size = new Size( 70, 23 );
302                         helpButton.TabIndex = 6;
303                         helpButton.Text = "Help";
304                         // underlinedCheckBox
305                         underlinedCheckBox.FlatStyle = FlatStyle.System;
306                         underlinedCheckBox.Location = new Point( 8, 36 );
307                         underlinedCheckBox.TabIndex = 1;
308                         underlinedCheckBox.Text = "Underlined";
309                         // fontstyleTextBox
310                         fontstyleTextBox.Location = new Point( 164, 26 );
311                         fontstyleTextBox.Size = new Size( 112, 21 );
312                         fontstyleTextBox.TabIndex = 6;
313                         fontstyleTextBox.Text = "";
314                         // scriptLabel
315                         scriptLabel.Location = new Point( 164, 236 );
316                         scriptLabel.Size = new Size( 100, 16 );
317                         scriptLabel.TabIndex = 13;
318                         scriptLabel.Text = "Script:";
319                         // examplePanel
320                         examplePanel.Location = new Point( 8, 20 );
321                         examplePanel.TabIndex = 0;
322                         examplePanel.Size = new Size( 156, 40 );
323                         examplePanel.BorderStyle = BorderStyle.Fixed3D;
324                         
325                         form.AcceptButton = okButton;
326                         form.CancelButton = cancelButton;
327                         
328                         form.Controls.Add( scriptComboBox );
329                         form.Controls.Add( scriptLabel );
330                         form.Controls.Add( exampleGroupBox );
331                         form.Controls.Add( effectsGroupBox );
332                         form.Controls.Add( fontsizeListBox );
333                         form.Controls.Add( fontstyleListBox );
334                         form.Controls.Add( fontListBox );
335                         form.Controls.Add( fontsizeTextBox );
336                         form.Controls.Add( fontstyleTextBox );
337                         form.Controls.Add( fontTextBox );
338                         form.Controls.Add( cancelButton );
339                         form.Controls.Add( okButton );
340                         form.Controls.Add( sizeLabel );
341                         form.Controls.Add( fontstyleLabel );
342                         form.Controls.Add( fontLabel );
343                         form.Controls.Add( applyButton );
344                         form.Controls.Add( helpButton );
345                         
346                         exampleGroupBox.ResumeLayout( false );
347                         effectsGroupBox.ResumeLayout( false );
348                         
349                         form.Size = new Size( 430, 318 );
350                         
351                         form.FormBorderStyle = FormBorderStyle.FixedDialog;
352                         form.MaximizeBox = false;
353                         
354                         form.Text = "Font";
355                         
356                         form.ResumeLayout( false );
357                         
358                         scriptComboBox.BeginUpdate ();
359                         scriptComboBox.Items.AddRange (char_sets_names);
360                         scriptComboBox.SelectedIndex = 0;
361                         scriptComboBox.EndUpdate ();
362                         
363                         applyButton.Hide( );
364                         helpButton.Hide( );
365                         colorComboBox.Hide( );
366                         
367                         cancelButton.Click += new EventHandler( OnClickCancelButton );
368                         okButton.Click += new EventHandler( OnClickOkButton );
369                         applyButton.Click += new EventHandler (OnApplyButton);
370                         examplePanel.Paint += new PaintEventHandler( OnPaintExamplePanel );
371                         fontListBox.SelectedIndexChanged += new EventHandler( OnSelectedIndexChangedFontListBox );
372                         fontsizeListBox.SelectedIndexChanged += new EventHandler( OnSelectedIndexChangedSizeListBox );
373                         fontstyleListBox.SelectedIndexChanged += new EventHandler( OnSelectedIndexChangedFontStyleListBox );
374                         underlinedCheckBox.CheckedChanged += new EventHandler( OnCheckedChangedUnderlinedCheckBox );
375                         strikethroughCheckBox.CheckedChanged += new EventHandler( OnCheckedChangedStrikethroughCheckBox );
376                         scriptComboBox.SelectedIndexChanged += new EventHandler (OnSelectedIndexChangedScriptComboBox);
377                         
378                         fontTextBox.KeyPress += new KeyPressEventHandler (OnFontTextBoxKeyPress);
379                         fontstyleTextBox.KeyPress += new KeyPressEventHandler (OnFontStyleTextBoxKeyPress);
380                         fontsizeTextBox.KeyPress += new KeyPressEventHandler (OnFontSizeTextBoxKeyPress);
381                         
382                         fontTextBox.TextChanged += new EventHandler (OnFontTextBoxTextChanged);
383                         fontstyleTextBox.TextChanged += new EventHandler (OnFontStyleTextTextChanged);
384                         fontsizeTextBox.TextChanged += new EventHandler (OnFontSizeTextBoxTextChanged);
385                         
386                         fontTextBox.KeyDown += new KeyEventHandler (OnFontTextBoxKeyDown);
387                         fontstyleTextBox.KeyDown += new KeyEventHandler (OnFontStyleTextBoxKeyDown);
388                         fontsizeTextBox.KeyDown += new KeyEventHandler (OnFontSizeTextBoxKeyDown);
389                         
390                         fontTextBox.MouseWheel += new MouseEventHandler (OnFontTextBoxMouseWheel);
391                         fontstyleTextBox.MouseWheel += new MouseEventHandler (OnFontStyleTextBoxMouseWheel);
392                         fontsizeTextBox.MouseWheel += new MouseEventHandler (OnFontSizeTextBoxMouseWheel);
393                         
394                         PopulateFontList ();
395                 }
396                 #endregion      // Public Constructors
397                 
398                 #region Public Instance Properties
399                 public Font Font
400                 {
401                         get {
402                                 return font;
403                         }
404                         
405                         set {
406                                 if (value != null) {
407                                         font = new Font(value, value.Style);
408                                         
409                                         currentFontStyle = font.Style;
410                                         currentSize = font.SizeInPoints;
411                                         currentFontName = font.Name;
412                                         
413                                         strikethroughCheckBox.Checked = font.Strikeout;
414                                         underlinedCheckBox.Checked = font.Underline;
415                                         
416                                         int index = fontListBox.FindString (currentFontName);
417                                         
418                                         if (index != -1) {
419                                                 fontListBox.SelectedIndex = index;
420                                         } else {
421                                                 fontListBox.SelectedIndex = 0;
422                                         }
423                                         
424                                         UpdateFontSizeListBox ();
425                                         UpdateFontStyleListBox ();
426                                         
427                                         fontListBox.TopIndex = fontListBox.SelectedIndex;
428                                 }
429                         }
430                 }
431                 
432                 [DefaultValue(false)]
433                 public bool FontMustExist
434                 {
435                         get {
436                                 return fontMustExist;
437                         }
438                         
439                         set {
440                                 fontMustExist = value;
441                         }
442                 }
443
444                 [DefaultValue ("Color [Black]")]
445                 public Color Color
446                 {
447                         set {
448                                 color = value;
449                                 examplePanel.Invalidate( );
450                         }
451                         
452                         get {
453                                 return color;
454                         }
455                 }
456                 
457                 [DefaultValue(true)]
458                 public bool AllowSimulations
459                 {
460                         set {
461                                 allowSimulations = value;
462                         }
463                         
464                         get {
465                                 return allowSimulations;
466                         }
467                 }
468                 
469                 [DefaultValue(true)]
470                 public bool AllowVectorFonts
471                 {
472                         set {
473                                 allowVectorFonts = value;
474                         }
475                         
476                         get {
477                                 return allowVectorFonts;
478                         }
479                 }
480                 
481                 [DefaultValue(true)]
482                 public bool AllowVerticalFonts
483                 {
484                         set {
485                                 allowVerticalFonts = value;
486                         }
487                         
488                         get {
489                                 return allowVerticalFonts;
490                         }
491                 }
492                 
493                 [DefaultValue(true)]
494                 public bool AllowScriptChange
495                 {
496                         set {
497                                 allowScriptChange = value;
498                         }
499                         
500                         get {
501                                 return allowScriptChange;
502                         }
503                 }
504                 
505                 [DefaultValue(false)]
506                 public bool FixedPitchOnly
507                 {
508                         set {
509                                 if (fixedPitchOnly != value) {
510                                         fixedPitchOnly = value;
511                                         PopulateFontList ();
512                                 }
513                         }
514                         
515                         get {
516                                 return fixedPitchOnly;
517                         }
518                 }
519                 
520                 [DefaultValue(0)]
521                 public int MaxSize
522                 {
523                         set {
524                                 maxSize = value;
525                                 
526                                 if (maxSize < 0)
527                                         maxSize = 0;
528                                 
529                                 if (maxSize < minSize)
530                                         minSize = maxSize;
531                                 
532                                 CreateFontSizeListBoxItems ();
533                         }
534                         
535                         get {
536                                 return maxSize;
537                         }
538                 }
539                 
540                 [DefaultValue(0)]
541                 public int MinSize
542                 {
543                         set {
544                                 minSize = value;
545                                 
546                                 if (minSize < 0)
547                                         minSize = 0;
548                                 
549                                 if (minSize > maxSize)
550                                         maxSize = minSize;
551                                 
552                                 CreateFontSizeListBoxItems ();
553                                 
554                                 if (minSize > currentSize)
555                                         if (font != null) {
556                                                 font.Dispose();
557                                                 
558                                                 currentSize = minSize;
559                                                 
560                                                 font = new Font( currentFamily, currentSize, currentFontStyle );
561                                                 
562                                                 UpdateExamplePanel ();
563                                                 
564                                                 fontsizeTextBox.Text = currentSize.ToString ();
565                                         }
566                         }
567                         
568                         get {
569                                 return minSize;
570                         }
571                 }
572                 
573                 [DefaultValue(false)]
574                 public bool ScriptsOnly
575                 {
576                         set {
577                                 scriptsOnly = value;
578                         }
579                         
580                         get {
581                                 return scriptsOnly;
582                         }
583                 }
584                 
585                 [DefaultValue(false)]
586                 public bool ShowApply
587                 {
588                         set {
589                                 if (value != showApply)
590                                 {
591                                         showApply = value;
592                                         if (showApply)
593                                                 applyButton.Show ();
594                                         else
595                                                 applyButton.Hide ();
596                                         
597                                         form.Refresh();
598                                 }
599                                 
600                         }
601                         
602                         get {
603                                 return showApply;
604                         }
605                 }
606                 
607                 [DefaultValue(false)]
608                 public bool ShowColor
609                 {
610                         set {
611                                 if (value != showColor)
612                                 {
613                                         showColor = value;
614                                         if (showColor)
615                                                 colorComboBox.Show ();
616                                         else
617                                                 colorComboBox.Hide ();
618                                         
619                                         form.Refresh();
620                                 }
621                         }
622                         
623                         get {
624                                 return showColor;
625                         }
626                 }
627                 
628                 [DefaultValue(true)]
629                 public bool ShowEffects
630                 {
631                         set {
632                                 if (value != showEffects)
633                                 {
634                                         showEffects = value;
635                                         if (showEffects)
636                                                 effectsGroupBox.Show ();
637                                         else
638                                                 effectsGroupBox.Hide ();
639                                         
640                                         form.Refresh();
641                                 }
642                         }
643                         
644                         get {
645                                 return showEffects;
646                         }
647                 }
648                 
649                 [DefaultValue(false)]
650                 public bool ShowHelp
651                 {
652                         set {
653                                 if (value != showHelp)
654                                 {
655                                         showHelp = value;
656                                         if (showHelp)
657                                                 helpButton.Show ();
658                                         else
659                                                 helpButton.Hide ();
660                                         
661                                         form.Refresh();
662                                 }
663                         }
664                         
665                         get {
666                                 return showHelp;
667                         }
668                 }
669                 
670                 #endregion      // Public Instance Properties
671                 
672                 #region Protected Instance Properties
673                 protected int Options {
674                         get { return 0; }
675                 }
676                 #endregion      // Protected Instance Properties
677                 
678                 #region Public Instance Methods
679                 public override void Reset( )
680                 {
681                         color = Color.Black;
682                         allowSimulations = true;
683                         allowVectorFonts = true;
684                         allowVerticalFonts = true;
685                         allowScriptChange = true;
686                         fixedPitchOnly = false;
687                         
688                         maxSize = 0;
689                         minSize = 0;
690                         CreateFontSizeListBoxItems ();
691                         
692                         scriptsOnly = false;
693                         
694                         showApply = false;
695                         applyButton.Hide ();
696                         
697                         showColor = false;
698                         colorComboBox.Hide ();
699                         
700                         showEffects = true;
701                         effectsGroupBox.Show ();
702                         
703                         showHelp = false;
704                         helpButton.Hide ();
705                         
706                         form.Refresh ();
707                 }
708
709                 public override string ToString ()
710                 {
711                         if (font == null)
712                                 return base.ToString ();
713                         return String.Concat (base.ToString (), ", Font: ", font.ToString ());
714                 }
715                 #endregion      // Public Instance Methods
716                 
717                 #region Protected Instance Methods
718                 protected override IntPtr HookProc (IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
719                 {
720                         return base.HookProc (hWnd, msg, wparam, lparam);
721                 }
722
723                 protected override bool RunDialog( IntPtr hWndOwner )
724                 {
725                         form.Refresh();
726                         
727                         return true;
728                 }
729
730                 internal void OnApplyButton (object sender, EventArgs e)
731                 {
732                         OnApply (e);
733                 }
734
735                 protected virtual void OnApply (EventArgs e)
736                 {
737                         EventHandler apply = (EventHandler) Events [EventApply];
738                         if (apply != null)
739                                 apply (this, e);
740                 }
741                 #endregion      // Protected Instance Methods
742                 
743                 void OnClickCancelButton( object sender, EventArgs e )
744                 {
745                         form.DialogResult = DialogResult.Cancel;
746                 }
747                 
748                 void OnClickOkButton( object sender, EventArgs e )
749                 {
750                         form.DialogResult = DialogResult.OK;
751                 }
752                 
753                 void OnPaintExamplePanel( object sender, PaintEventArgs e )
754                 {
755                         SolidBrush brush = ThemeEngine.Current.ResPool.GetSolidBrush( color );
756                         
757                         e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( SystemColors.Control ), 0, 0, 156, 40 );
758                         
759                         SizeF fontSizeF = e.Graphics.MeasureString( example_panel_text, font );
760                         
761                         int text_width = (int)fontSizeF.Width;
762                         int text_height = (int)fontSizeF.Height;
763                         
764                         int x = ( examplePanel.Width / 2 ) - ( text_width / 2 );
765                         if ( x < 0 ) x = 0;
766                         
767                         int y = ( examplePanel.Height / 2 ) - ( text_height / 2 );
768                         
769                         e.Graphics.DrawString( example_panel_text, font, brush, new Point( x, y ) );
770                 }
771                 
772                 void OnSelectedIndexChangedFontListBox( object sender, EventArgs e )
773                 {
774                         if ( fontListBox.SelectedIndex != -1 )
775                         {
776                                 currentFamily = FindByName( fontListBox.Items[ fontListBox.SelectedIndex ].ToString( ) );
777                                 
778                                 fontTextBox.Text = currentFamily.Name;
779                                 
780                                 internal_change = true;
781                                 
782                                 UpdateFontStyleListBox( );
783                                 
784                                 UpdateFontSizeListBox ();
785                                 
786                                 UpdateExamplePanel ();
787                                 
788                                 form.Select(fontTextBox);
789                                 
790                                 internal_change = false;
791                         }
792                 }
793                 
794                 void OnSelectedIndexChangedSizeListBox( object sender, EventArgs e )
795                 {
796                         if ( fontsizeListBox.SelectedIndex != -1 )
797                         {
798                                 currentSize = (float)System.Convert.ToDouble( fontsizeListBox.Items[ fontsizeListBox.SelectedIndex ] );
799                                 
800                                 fontsizeTextBox.Text = currentSize.ToString( );
801                                 
802                                 UpdateExamplePanel( );
803                                 
804                                 if (!internal_change)
805                                         form.Select(fontsizeTextBox);
806                         }
807                 }
808                 
809                 void OnSelectedIndexChangedFontStyleListBox( object sender, EventArgs e )
810                 {
811                         if ( fontstyleListBox.SelectedIndex != -1 )
812                         {
813                                 switch ( fontstyleListBox.SelectedIndex )
814                                 {
815                                 case 0:
816                                         currentFontStyle = FontStyle.Regular;
817                                         break;
818                                 case 1:
819                                         currentFontStyle = FontStyle.Bold;
820                                         break;
821                                 case 2:
822                                         currentFontStyle = FontStyle.Italic;
823                                         break;
824                                 case 3:
825                                         currentFontStyle = FontStyle.Bold | FontStyle.Italic;
826                                         break;
827                                 default:
828                                         currentFontStyle = FontStyle.Regular;
829                                         break;
830                                 }
831                                 
832                                 if (underlined) 
833                                         currentFontStyle = currentFontStyle | FontStyle.Underline;
834                                 
835                                 if (strikethrough)
836                                         currentFontStyle = currentFontStyle | FontStyle.Strikeout;
837                                 
838                                 fontstyleTextBox.Text = fontstyleListBox.Items[ fontstyleListBox.SelectedIndex ].ToString( );
839                                 
840                                 if (!internal_change) {
841                                         UpdateExamplePanel( );
842                                         
843                                         form.Select(fontstyleTextBox);
844                                 }
845                         }
846                 }
847                 
848                 void OnCheckedChangedUnderlinedCheckBox( object sender, EventArgs e )
849                 {
850                         if ( underlinedCheckBox.Checked ) {
851                                 currentFontStyle = currentFontStyle | FontStyle.Underline;
852                                 underlined = true;
853                         }
854                         else {
855                                 currentFontStyle = currentFontStyle ^ FontStyle.Underline;
856                                 underlined = false;
857                         }
858                         
859                         UpdateExamplePanel( );
860                 }
861                 
862                 void OnCheckedChangedStrikethroughCheckBox( object sender, EventArgs e )
863                 {
864                         if ( strikethroughCheckBox.Checked ) {
865                                 currentFontStyle = currentFontStyle | FontStyle.Strikeout;
866                                 strikethrough = true;
867                         }
868                         else {
869                                 currentFontStyle = currentFontStyle ^ FontStyle.Strikeout;
870                                 strikethrough = false;
871                         }
872                         
873                         UpdateExamplePanel( );
874                 }
875                 
876                 bool internal_textbox_change = false;
877                 
878                 void OnFontTextBoxMouseWheel (object sender, MouseEventArgs e)
879                 {
880                         fontListBox.SendMouseWheelEvent (e);
881                 }
882                 
883                 void OnFontStyleTextBoxMouseWheel (object sender, MouseEventArgs e)
884                 {
885                         fontstyleListBox.SendMouseWheelEvent (e);
886                 }
887                 
888                 void OnFontSizeTextBoxMouseWheel (object sender, MouseEventArgs e)
889                 {
890                         fontsizeListBox.SendMouseWheelEvent (e);
891                 }
892                 
893                 void OnFontTextBoxKeyDown (object sender, KeyEventArgs e)
894                 {
895                         // Forward these keys on to the font style listbox
896                         switch (e.KeyCode) {
897                                 case Keys.Up:
898                                 case Keys.Down:
899                                 case Keys.PageDown:
900                                 case Keys.PageUp:
901                                         fontListBox.HandleKeyDown (e.KeyCode);
902                                         break;
903                         }
904                 }
905                 
906                 void OnFontStyleTextBoxKeyDown (object sender, KeyEventArgs e)
907                 {
908                         // Forward these keys on to the font style listbox
909                         switch (e.KeyCode) {
910                                 case Keys.Up:
911                                 case Keys.Down:
912                                 case Keys.PageDown:
913                                 case Keys.PageUp:
914                                         fontstyleListBox.HandleKeyDown (e.KeyCode);
915                                         break;
916                         }
917                 }
918                 
919                 void OnFontSizeTextBoxKeyDown (object sender, KeyEventArgs e)
920                 {
921                         // Forward these keys on to the font size listbox
922                         switch (e.KeyCode) {
923                                 case Keys.Up:
924                                 case Keys.Down:
925                                 case Keys.PageDown:
926                                 case Keys.PageUp:
927                                         fontsizeListBox.HandleKeyDown (e.KeyCode);
928                                         break;
929                         }
930                 }
931                 
932                 void OnFontTextBoxKeyPress (object sender, KeyPressEventArgs e)
933                 {
934                         internal_textbox_change = true;
935                         
936                         if (fontListBox.SelectedIndex > -1)
937                                 fontListBox.SelectedIndex = -1;
938                 }
939                 
940                 void OnFontStyleTextBoxKeyPress (object sender, KeyPressEventArgs e)
941                 {
942                         internal_textbox_change = true;
943                         
944                         if (fontstyleListBox.SelectedIndex > -1)
945                                 fontstyleListBox.SelectedIndex = -1;
946                 }
947                 
948                 void OnFontSizeTextBoxKeyPress (object sender, KeyPressEventArgs e)
949                 {
950                         if (Char.IsLetter (e.KeyChar) || Char.IsWhiteSpace (e.KeyChar) || Char.IsPunctuation (e.KeyChar) || e.KeyChar == ',') {
951                                 e.Handled = true;
952                                 return; 
953                         }
954                         
955                         internal_textbox_change = true;
956                 }
957                 
958                 void OnFontTextBoxTextChanged (object sender, EventArgs e)
959                 {
960                         if (!internal_textbox_change)
961                                 return;
962                         
963                         internal_textbox_change = false;
964                         
965                         string search = fontTextBox.Text;
966                         
967                         // Look for an exact match
968                         int found = fontListBox.FindStringExact (search);
969                         
970                         if (found != ListBox.NoMatches) {
971                                 fontListBox.SelectedIndex = found;
972                                 return;
973                         }
974                         
975                         // Look for a partial match
976                         found = fontListBox.FindString (search);
977                         
978                         if (found != ListBox.NoMatches) {
979                                 fontListBox.TopIndex = found;
980                                 return;
981                         }
982
983                         // No match, scroll to the top
984                         if (fontListBox.Items.Count > 0)
985                                 fontListBox.TopIndex = 0;
986                 }
987                 
988                 void OnFontStyleTextTextChanged (object sender, EventArgs e)
989                 {
990                         if (!internal_textbox_change)
991                                 return;
992                         
993                         internal_textbox_change = false;
994
995                         // Look for an exact match
996                         int found = fontstyleListBox.FindStringExact (fontstyleTextBox.Text);
997
998                         if (found != ListBox.NoMatches)
999                                 fontstyleListBox.SelectedIndex = found;
1000                 }
1001                 
1002                 void OnFontSizeTextBoxTextChanged (object sender, EventArgs e)
1003                 {
1004                         if (!internal_textbox_change)
1005                                 return;
1006                         
1007                         internal_textbox_change = false;
1008                         
1009                         if (fontsizeTextBox.Text.Length == 0)
1010                                 return;
1011                         
1012                         for (int i = 0; i < fontsizeListBox.Items.Count; i++) {
1013                                 string name = fontsizeListBox.Items [i] as string;
1014                                 
1015                                 if (name.StartsWith(fontsizeTextBox.Text)) {
1016                                         if (name == fontsizeTextBox.Text)
1017                                                 fontsizeListBox.SelectedIndex = i;
1018                                         else
1019                                                 fontsizeListBox.TopIndex = i;
1020                                         
1021                                         break;
1022                                 }
1023                         }
1024                 }
1025                 
1026                 void OnSelectedIndexChangedScriptComboBox (object sender, EventArgs e)
1027                 {
1028                         string tmp_str = char_sets [scriptComboBox.SelectedIndex];
1029                         
1030                         if (tmp_str.Length > 0) {
1031                                 example_panel_text = tmp_str;
1032                                 
1033                                 UpdateExamplePanel ();
1034                         }
1035                 }
1036                 
1037                 void UpdateExamplePanel( )
1038                 {
1039                         if (font != null)
1040                                 font.Dispose();
1041                         
1042                         font = new Font( currentFamily, currentSize, currentFontStyle );
1043                         
1044                         examplePanel.Invalidate( );
1045                 }
1046                 
1047                 void UpdateFontSizeListBox ()
1048                 {
1049                         int index = fontsizeListBox.FindString(((int)Math.Round ((currentSize))).ToString());
1050                         
1051                         if (index != -1)
1052                                 fontsizeListBox.SelectedIndex = index;
1053                         else 
1054                                 fontsizeListBox.SelectedIndex = 0;
1055                 }
1056                 
1057                 void UpdateFontStyleListBox( )
1058                 {
1059                         // don't know if that works, IsStyleAvailable returns true for all styles under X
1060                         
1061                         fontstyleListBox.BeginUpdate( );
1062                         
1063                         fontstyleListBox.Items.Clear( );
1064                         
1065                         int index = -1;
1066                         int to_select = 0;
1067                         
1068                         if ( currentFamily.IsStyleAvailable( FontStyle.Regular ) )
1069                         {
1070                                 index = fontstyleListBox.Items.Add( "Regular" );
1071                                 
1072                                 if ((currentFontStyle & FontStyle.Regular) == FontStyle.Regular)
1073                                         to_select = index;
1074                         }
1075                         
1076                         if ( currentFamily.IsStyleAvailable( FontStyle.Bold ) )
1077                         {
1078                                 index = fontstyleListBox.Items.Add( "Bold" );
1079                                 
1080                                 if ((currentFontStyle & FontStyle.Bold) == FontStyle.Bold)
1081                                         to_select = index;
1082                         }
1083                         
1084                         if ( currentFamily.IsStyleAvailable( FontStyle.Italic ) )
1085                         {
1086                                 index = fontstyleListBox.Items.Add( "Italic" );
1087                                 
1088                                 if ((currentFontStyle & FontStyle.Italic) == FontStyle.Italic)
1089                                         to_select = index;
1090                         }
1091                         
1092                         if ( currentFamily.IsStyleAvailable( FontStyle.Bold ) && currentFamily.IsStyleAvailable( FontStyle.Italic ) )
1093                         {
1094                                 index = fontstyleListBox.Items.Add( "Bold Italic" );
1095                                 
1096                                 if ((currentFontStyle & (FontStyle.Bold | FontStyle.Italic)) == (FontStyle.Bold | FontStyle.Italic))
1097                                         to_select = index;
1098                         }
1099                         
1100                         if (fontstyleListBox.Items.Count > 0) {
1101                                 fontstyleListBox.SelectedIndex = to_select;
1102
1103                                 switch ((string)fontstyleListBox.SelectedItem) {
1104                                         case "Regular":
1105                                                 currentFontStyle = FontStyle.Regular;
1106                                                 break;
1107                                         case "Bold":
1108                                                 currentFontStyle = FontStyle.Bold;
1109                                                 break;
1110                                         case "Italic":
1111                                                 currentFontStyle = FontStyle.Italic;
1112                                                 break;
1113                                         case "Bold Italic":
1114                                                 currentFontStyle = FontStyle.Bold | FontStyle.Italic;
1115                                                 break;
1116                                 }
1117                                 
1118                                 if (strikethroughCheckBox.Checked)
1119                                         currentFontStyle |= FontStyle.Strikeout;
1120                                 if (underlinedCheckBox.Checked)
1121                                         currentFontStyle |= FontStyle.Underline;
1122                         }
1123                         
1124                         fontstyleListBox.EndUpdate( );
1125                 }
1126                 
1127                 FontFamily FindByName( string name )
1128                 {
1129                         return fontHash[ name ] as FontFamily;
1130                 }
1131                 
1132                 void CreateFontSizeListBoxItems ()
1133                 {
1134                         fontsizeListBox.BeginUpdate ();
1135                         
1136                         fontsizeListBox.Items.Clear();
1137                         
1138                         if (minSize == 0 && maxSize == 0)
1139                         {
1140                                 foreach (int i in a_sizes)
1141                                         fontsizeListBox.Items.Add (i.ToString());
1142                         } else {
1143                                 foreach (int i in a_sizes) {
1144                                         if (i >= minSize && i <= maxSize)
1145                                                 fontsizeListBox.Items.Add (i.ToString());
1146                                 }
1147                         }
1148                         
1149                         fontsizeListBox.EndUpdate ();
1150                 }
1151
1152                 #region Private Methods
1153                 private void PopulateFontList ()
1154                 {
1155                         fontListBox.Items.Clear ();
1156                         fontHash.Clear ();
1157
1158                         fontListBox.BeginUpdate ();
1159
1160                         foreach (FontFamily ff in FontFamily.Families) {
1161                                 if (!fontHash.ContainsKey (ff.Name)) {
1162                                         if (!fixedPitchOnly || (IsFontFamilyFixedPitch (ff))) {
1163                                                 fontListBox.Items.Add (ff.Name);
1164                                                 fontHash.Add (ff.Name, ff);
1165                                         }
1166                                 }
1167                         }
1168                         
1169                         fontListBox.EndUpdate ();
1170                         CreateFontSizeListBoxItems ();
1171
1172                         if (fixedPitchOnly)
1173                                 this.Font = new Font (FontFamily.GenericMonospace, 8.25f);
1174                         else
1175                                 this.Font = form.Font;  
1176                 }
1177                 
1178                 private bool IsFontFamilyFixedPitch (FontFamily family)
1179                 {
1180                         FontStyle fs;
1181                         
1182                         if (family.IsStyleAvailable (FontStyle.Regular))
1183                                 fs = FontStyle.Regular;
1184                         else if (family.IsStyleAvailable (FontStyle.Bold))
1185                                 fs = FontStyle.Bold;
1186                         else if (family.IsStyleAvailable (FontStyle.Italic))
1187                                 fs = FontStyle.Italic;
1188                         else if (family.IsStyleAvailable (FontStyle.Strikeout))
1189                                 fs = FontStyle.Strikeout;
1190                         else if (family.IsStyleAvailable (FontStyle.Underline))
1191                                 fs = FontStyle.Underline;
1192                         else
1193                                 return false;
1194
1195                         Font f = new Font (family.Name, 10, fs);
1196
1197                         if (TextRenderer.MeasureString ("i", f).Width == TextRenderer.MeasureString ("w", f).Width)
1198                                 return true;
1199                                 
1200                         return false;
1201                 }
1202                 #endregion
1203                 
1204                 internal class ColorComboBox : ComboBox
1205                 {
1206                         internal class ColorComboBoxItem
1207                         {
1208                                 private Color color;
1209                                 private string name;
1210                                 
1211                                 public ColorComboBoxItem( Color color, string name )
1212                                 {
1213                                         this.color = color;
1214                                         this.name = name;
1215                                 }
1216                                 
1217                                 public Color Color
1218                                 {
1219                                         set {
1220                                                 color = value;
1221                                         }
1222                                         
1223                                         get {
1224                                                 return color;
1225                                         }
1226                                 }
1227                                 
1228                                 public string Name
1229                                 {
1230                                         set {
1231                                                 name = value;
1232                                         }
1233                                         
1234                                         get {
1235                                                 return name;
1236                                         }
1237                                 }
1238
1239                                 public override string ToString()
1240                                 {
1241                                         return this.Name;
1242                                 }
1243                         }
1244                         
1245                         private Color selectedColor;
1246                         
1247                         private FontDialog fontDialog;
1248                         
1249                         public ColorComboBox( FontDialog fontDialog )
1250                         {
1251                                 this.fontDialog = fontDialog;
1252                                 
1253                                 DropDownStyle = ComboBoxStyle.DropDownList;
1254                                 DrawMode = DrawMode.OwnerDrawFixed;
1255                                 
1256                                 Items.AddRange (new object[] {
1257                                         new ColorComboBoxItem (Color.Black, "Black"),
1258                                         new ColorComboBoxItem (Color.Maroon, "Maroon"),
1259                                         new ColorComboBoxItem (Color.Green, "Green"),
1260                                         new ColorComboBoxItem (Color.Olive, "Olive"),
1261                                         new ColorComboBoxItem (Color.Navy, "Navy"),
1262                                         new ColorComboBoxItem (Color.Purple, "Purple"),
1263                                         new ColorComboBoxItem (Color.Teal, "Teal"),
1264                                         new ColorComboBoxItem (Color.Gray, "Gray"),
1265                                         new ColorComboBoxItem (Color.Silver, "Silver"),
1266                                         new ColorComboBoxItem (Color.Red, "Red"),
1267                                         new ColorComboBoxItem (Color.Lime, "Lime"),
1268                                         new ColorComboBoxItem (Color.Yellow, "Yellow"),
1269                                         new ColorComboBoxItem (Color.Blue, "Blue"),
1270                                         new ColorComboBoxItem (Color.Fuchsia, "Fuchsia"),
1271                                         new ColorComboBoxItem (Color.Aqua, "Aqua"),
1272                                         new ColorComboBoxItem (Color.White, "White") }
1273                                 );
1274                                 
1275                                 SelectedIndex = 0;
1276                                 MaxDropDownItems = 16;
1277                         }
1278                         
1279                         protected override void OnDrawItem( DrawItemEventArgs e )
1280                         {
1281                                 if ( e.Index == -1 )
1282                                         return;
1283                                 
1284                                 ColorComboBoxItem ccbi = Items[ e.Index ] as ColorComboBoxItem;
1285                                 
1286                                 Rectangle r = e.Bounds;
1287                                 r.X = r.X + 24;
1288                                 
1289                                 if ( ( e.State & DrawItemState.Selected ) == DrawItemState.Selected )
1290                                 {
1291                                         e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( Color.Blue ), e.Bounds ); // bot blue
1292                                         e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( ccbi.Color ), e.Bounds.X + 3, e.Bounds.Y + 3, e.Bounds.X + 16, e.Bounds.Bottom - 3 );
1293                                         e.Graphics.DrawRectangle( ThemeEngine.Current.ResPool.GetPen( Color.Black ), e.Bounds.X + 2, e. Bounds.Y + 2, e.Bounds.X + 17, e.Bounds.Bottom - 3 );
1294                                         e.Graphics.DrawString( ccbi.Name, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush( Color.White ), r );
1295                                 }
1296                                 else
1297                                 {
1298                                         e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( Color.White ), e.Bounds );
1299                                         e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( ccbi.Color ), e.Bounds.X + 3, e.Bounds.Y + 3, e.Bounds.X + 16, e.Bounds.Bottom - 3 );
1300                                         e.Graphics.DrawRectangle( ThemeEngine.Current.ResPool.GetPen( Color.Black ), e.Bounds.X + 2, e. Bounds.Y + 2, e.Bounds.X + 17, e.Bounds.Bottom - 3 );
1301                                         e.Graphics.DrawString( ccbi.Name, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush( Color.Black ), r );
1302                                 }
1303                         }
1304                         
1305                         protected override void OnSelectedIndexChanged( EventArgs e )
1306                         {
1307                                 ColorComboBoxItem ccbi = Items[ SelectedIndex ] as ColorComboBoxItem;
1308                                 selectedColor = ccbi.Color;
1309                                 
1310                                 fontDialog.Color = selectedColor;
1311                         }
1312                 }
1313
1314                 public event EventHandler Apply {
1315                         add { Events.AddHandler (EventApply, value); }
1316                         remove { Events.RemoveHandler (EventApply, value); }
1317                 }
1318         }
1319                 
1320         internal class MouseWheelListBox : ListBox
1321         {
1322                 public void SendMouseWheelEvent(MouseEventArgs e)
1323                 {
1324                         OnMouseWheel (e);
1325                 }
1326         }
1327 }
1328