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:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
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.
20 // Copyright (c) 2006, Alexander Olk
23 // Alexander Olk alex.olk@googlemail.com
27 // NOT COMPLETE - work in progress
29 using System.ComponentModel;
31 using System.Text.RegularExpressions;
33 using System.Collections;
35 namespace System.Windows.Forms
37 [DefaultProperty( "Font" )]
38 [DefaultEvent("Apply")]
39 public class FontDialog : CommonDialog
41 protected static readonly object EventApply = new object ();
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;
58 private bool fontMustExist = false;
60 private Panel examplePanel;
62 private Button okButton;
63 private Button cancelButton;
64 private Button applyButton;
65 private Button helpButton;
67 private TextBox fontTextBox;
68 private TextBox fontstyleTextBox;
69 private TextBox fontsizeTextBox;
71 private MouseWheelListBox fontListBox;
72 private MouseWheelListBox fontstyleListBox;
73 private MouseWheelListBox fontsizeListBox;
75 private GroupBox effectsGroupBox;
76 private CheckBox strikethroughCheckBox;
77 private CheckBox underlinedCheckBox;
78 private ComboBox scriptComboBox;
80 private Label fontLabel;
81 private Label fontstyleLabel;
82 private Label sizeLabel;
83 private Label scriptLabel;
85 private GroupBox exampleGroupBox;
87 private ColorComboBox colorComboBox;
89 private string currentFontName;
91 private float currentSize;
93 private FontFamily currentFamily;
95 private FontStyle currentFontStyle;
97 private bool underlined = false;
98 private bool strikethrough = false;
100 private Hashtable fontHash = new Hashtable();
102 private int[] a_sizes = {
103 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72
106 // char set stuff is only here to make me happy :-)
107 private string [] char_sets_names = {
135 private string [] char_sets = {
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,
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",
153 "AaBb" + (char)0xf8 + (char)0xf1 + (char)0xfd,
163 private string example_panel_text;
165 private bool internal_change = false;
167 #region Public Constructors
170 form = new DialogForm (this);
171 example_panel_text = char_sets [0];
173 okButton = new Button( );
174 cancelButton = new Button( );
175 applyButton = new Button( );
176 helpButton = new Button( );
178 fontTextBox = new TextBox( );
179 fontstyleTextBox = new TextBox( );
180 fontsizeTextBox = new TextBox( );
182 fontListBox = new MouseWheelListBox ();
183 fontsizeListBox = new MouseWheelListBox ();
184 fontstyleListBox = new MouseWheelListBox ();
186 fontLabel = new Label( );
187 fontstyleLabel = new Label( );
188 sizeLabel = new Label( );
189 scriptLabel = new Label( );
191 exampleGroupBox = new GroupBox( );
193 effectsGroupBox = new GroupBox( );
194 underlinedCheckBox = new CheckBox( );
195 strikethroughCheckBox = new CheckBox( );
196 scriptComboBox = new ComboBox( );
198 examplePanel = new Panel( );
200 colorComboBox = new ColorComboBox( this );
202 exampleGroupBox.SuspendLayout( );
203 effectsGroupBox.SuspendLayout( );
204 form.SuspendLayout( );
206 form.FormBorderStyle = FormBorderStyle.FixedDialog;
207 form.MaximizeBox = false;
210 fontsizeListBox.Location = new Point( 284, 47 );
211 fontsizeListBox.Size = new Size( 52, 95 );
212 fontsizeListBox.TabIndex = 10;
213 fontListBox.Sorted = true;
215 fontTextBox.Location = new Point( 16, 26 );
216 fontTextBox.Size = new Size( 140, 21 );
217 fontTextBox.TabIndex = 5;
218 fontTextBox.Text = "";
220 fontstyleLabel.Location = new Point( 164, 10 );
221 fontstyleLabel.Size = new Size( 100, 16 );
222 fontstyleLabel.TabIndex = 1;
223 fontstyleLabel.Text = "Font Style:";
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;
231 fontListBox.Location = new Point( 16, 47 );
232 fontListBox.Size = new Size( 140, 95 );
233 fontListBox.TabIndex = 8;
234 fontListBox.Sorted = true;
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";
244 fontstyleListBox.Location = new Point( 164, 47 );
245 fontstyleListBox.Size = new Size( 112, 95 );
246 fontstyleListBox.TabIndex = 9;
248 fontLabel.Location = new Point( 16, 10 );
249 fontLabel.Size = new Size( 88, 16 );
250 fontLabel.TabIndex = 0;
251 fontLabel.Text = "Font:";
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";
268 colorComboBox.Location = new Point( 8, 70 );
269 colorComboBox.Size = new Size( 130, 21 );
271 sizeLabel.Location = new Point( 284, 10 );
272 sizeLabel.Size = new Size( 100, 16 );
273 sizeLabel.TabIndex = 2;
274 sizeLabel.Text = "Size:";
276 scriptComboBox.Location = new Point( 164, 253 );
277 scriptComboBox.Size = new Size( 172, 21 );
278 scriptComboBox.TabIndex = 14;
279 scriptComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
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";
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";
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";
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";
310 fontstyleTextBox.Location = new Point( 164, 26 );
311 fontstyleTextBox.Size = new Size( 112, 21 );
312 fontstyleTextBox.TabIndex = 6;
313 fontstyleTextBox.Text = "";
315 scriptLabel.Location = new Point( 164, 236 );
316 scriptLabel.Size = new Size( 100, 16 );
317 scriptLabel.TabIndex = 13;
318 scriptLabel.Text = "Script:";
320 examplePanel.Location = new Point( 8, 20 );
321 examplePanel.TabIndex = 0;
322 examplePanel.Size = new Size( 156, 40 );
323 examplePanel.BorderStyle = BorderStyle.Fixed3D;
325 form.AcceptButton = okButton;
326 form.CancelButton = cancelButton;
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 );
346 exampleGroupBox.ResumeLayout( false );
347 effectsGroupBox.ResumeLayout( false );
349 form.Size = new Size( 430, 318 );
351 form.FormBorderStyle = FormBorderStyle.FixedDialog;
352 form.MaximizeBox = false;
356 form.ResumeLayout( false );
358 scriptComboBox.BeginUpdate ();
359 scriptComboBox.Items.AddRange (char_sets_names);
360 scriptComboBox.SelectedIndex = 0;
361 scriptComboBox.EndUpdate ();
365 colorComboBox.Hide( );
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);
378 fontTextBox.KeyPress += new KeyPressEventHandler (OnFontTextBoxKeyPress);
379 fontstyleTextBox.KeyPress += new KeyPressEventHandler (OnFontStyleTextBoxKeyPress);
380 fontsizeTextBox.KeyPress += new KeyPressEventHandler (OnFontSizeTextBoxKeyPress);
382 fontTextBox.TextChanged += new EventHandler (OnFontTextBoxTextChanged);
383 fontstyleTextBox.TextChanged += new EventHandler (OnFontStyleTextTextChanged);
384 fontsizeTextBox.TextChanged += new EventHandler (OnFontSizeTextBoxTextChanged);
386 fontTextBox.KeyDown += new KeyEventHandler (OnFontTextBoxKeyDown);
387 fontstyleTextBox.KeyDown += new KeyEventHandler (OnFontStyleTextBoxKeyDown);
388 fontsizeTextBox.KeyDown += new KeyEventHandler (OnFontSizeTextBoxKeyDown);
390 fontTextBox.MouseWheel += new MouseEventHandler (OnFontTextBoxMouseWheel);
391 fontstyleTextBox.MouseWheel += new MouseEventHandler (OnFontStyleTextBoxMouseWheel);
392 fontsizeTextBox.MouseWheel += new MouseEventHandler (OnFontSizeTextBoxMouseWheel);
396 #endregion // Public Constructors
398 #region Public Instance Properties
407 font = new Font(value, value.Style);
409 currentFontStyle = font.Style;
410 currentSize = font.SizeInPoints;
411 currentFontName = font.Name;
413 strikethroughCheckBox.Checked = font.Strikeout;
414 underlinedCheckBox.Checked = font.Underline;
416 int index = fontListBox.FindString (currentFontName);
419 fontListBox.SelectedIndex = index;
421 fontListBox.SelectedIndex = 0;
424 UpdateFontSizeListBox ();
425 UpdateFontStyleListBox ();
427 fontListBox.TopIndex = fontListBox.SelectedIndex;
432 [DefaultValue(false)]
433 public bool FontMustExist
436 return fontMustExist;
440 fontMustExist = value;
445 [DefaultValue ("Color [Black]")]
451 examplePanel.Invalidate( );
460 public bool AllowSimulations
463 allowSimulations = value;
467 return allowSimulations;
472 public bool AllowVectorFonts
475 allowVectorFonts = value;
479 return allowVectorFonts;
484 public bool AllowVerticalFonts
487 allowVerticalFonts = value;
491 return allowVerticalFonts;
496 public bool AllowScriptChange
499 allowScriptChange = value;
503 return allowScriptChange;
507 [DefaultValue(false)]
508 public bool FixedPitchOnly
511 if (fixedPitchOnly != value) {
512 fixedPitchOnly = value;
518 return fixedPitchOnly;
531 if (maxSize < minSize)
534 CreateFontSizeListBoxItems ();
551 if (minSize > maxSize)
554 CreateFontSizeListBoxItems ();
556 if (minSize > currentSize)
560 currentSize = minSize;
562 font = new Font( currentFamily, currentSize, currentFontStyle );
564 UpdateExamplePanel ();
566 fontsizeTextBox.Text = currentSize.ToString ();
575 [DefaultValue(false)]
576 public bool ScriptsOnly
587 [DefaultValue(false)]
588 public bool ShowApply
591 if (value != showApply)
609 [DefaultValue(false)]
610 public bool ShowColor
613 if (value != showColor)
617 colorComboBox.Show ();
619 colorComboBox.Hide ();
631 public bool ShowEffects
634 if (value != showEffects)
638 effectsGroupBox.Show ();
640 effectsGroupBox.Hide ();
651 [DefaultValue(false)]
655 if (value != showHelp)
672 #endregion // Public Instance Properties
674 #region Protected Instance Properties
675 protected int Options {
678 #endregion // Protected Instance Properties
680 #region Public Instance Methods
681 public override void Reset( )
684 allowSimulations = true;
685 allowVectorFonts = true;
686 allowVerticalFonts = true;
687 allowScriptChange = true;
688 fixedPitchOnly = false;
692 CreateFontSizeListBoxItems ();
700 colorComboBox.Hide ();
703 effectsGroupBox.Show ();
711 public override string ToString ()
714 return base.ToString ();
715 return String.Concat (base.ToString (), ", Font: ", font.ToString ());
717 #endregion // Public Instance Methods
719 #region Protected Instance Methods
720 protected override IntPtr HookProc (IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
722 return base.HookProc (hWnd, msg, wparam, lparam);
725 protected override bool RunDialog( IntPtr hWndOwner )
732 internal void OnApplyButton (object sender, EventArgs e)
737 protected virtual void OnApply (EventArgs e)
739 EventHandler apply = (EventHandler) Events [EventApply];
743 #endregion // Protected Instance Methods
745 void OnClickCancelButton( object sender, EventArgs e )
747 form.DialogResult = DialogResult.Cancel;
750 void OnClickOkButton( object sender, EventArgs e )
752 form.DialogResult = DialogResult.OK;
755 void OnPaintExamplePanel( object sender, PaintEventArgs e )
757 SolidBrush brush = ThemeEngine.Current.ResPool.GetSolidBrush( color );
759 e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( SystemColors.Control ), 0, 0, 156, 40 );
761 SizeF fontSizeF = e.Graphics.MeasureString( example_panel_text, font );
763 int text_width = (int)fontSizeF.Width;
764 int text_height = (int)fontSizeF.Height;
766 int x = ( examplePanel.Width / 2 ) - ( text_width / 2 );
769 int y = ( examplePanel.Height / 2 ) - ( text_height / 2 );
771 e.Graphics.DrawString( example_panel_text, font, brush, new Point( x, y ) );
774 void OnSelectedIndexChangedFontListBox( object sender, EventArgs e )
776 if ( fontListBox.SelectedIndex != -1 )
778 currentFamily = FindByName( fontListBox.Items[ fontListBox.SelectedIndex ].ToString( ) );
780 fontTextBox.Text = currentFamily.Name;
782 internal_change = true;
784 UpdateFontStyleListBox( );
786 UpdateFontSizeListBox ();
788 UpdateExamplePanel ();
790 form.Select(fontTextBox);
792 internal_change = false;
796 void OnSelectedIndexChangedSizeListBox( object sender, EventArgs e )
798 if ( fontsizeListBox.SelectedIndex != -1 )
800 currentSize = (float)System.Convert.ToDouble( fontsizeListBox.Items[ fontsizeListBox.SelectedIndex ] );
802 fontsizeTextBox.Text = currentSize.ToString( );
804 UpdateExamplePanel( );
806 if (!internal_change)
807 form.Select(fontsizeTextBox);
811 void OnSelectedIndexChangedFontStyleListBox( object sender, EventArgs e )
813 if ( fontstyleListBox.SelectedIndex != -1 )
815 switch ( fontstyleListBox.SelectedIndex )
818 currentFontStyle = FontStyle.Regular;
821 currentFontStyle = FontStyle.Bold;
824 currentFontStyle = FontStyle.Italic;
827 currentFontStyle = FontStyle.Bold | FontStyle.Italic;
830 currentFontStyle = FontStyle.Regular;
835 currentFontStyle = currentFontStyle | FontStyle.Underline;
838 currentFontStyle = currentFontStyle | FontStyle.Strikeout;
840 fontstyleTextBox.Text = fontstyleListBox.Items[ fontstyleListBox.SelectedIndex ].ToString( );
842 if (!internal_change) {
843 UpdateExamplePanel( );
845 form.Select(fontstyleTextBox);
850 void OnCheckedChangedUnderlinedCheckBox( object sender, EventArgs e )
852 if ( underlinedCheckBox.Checked ) {
853 currentFontStyle = currentFontStyle | FontStyle.Underline;
857 currentFontStyle = currentFontStyle ^ FontStyle.Underline;
861 UpdateExamplePanel( );
864 void OnCheckedChangedStrikethroughCheckBox( object sender, EventArgs e )
866 if ( strikethroughCheckBox.Checked ) {
867 currentFontStyle = currentFontStyle | FontStyle.Strikeout;
868 strikethrough = true;
871 currentFontStyle = currentFontStyle ^ FontStyle.Strikeout;
872 strikethrough = false;
875 UpdateExamplePanel( );
878 bool internal_textbox_change = false;
880 void OnFontTextBoxMouseWheel (object sender, MouseEventArgs e)
882 fontListBox.SendMouseWheelEvent (e);
885 void OnFontStyleTextBoxMouseWheel (object sender, MouseEventArgs e)
887 fontstyleListBox.SendMouseWheelEvent (e);
890 void OnFontSizeTextBoxMouseWheel (object sender, MouseEventArgs e)
892 fontsizeListBox.SendMouseWheelEvent (e);
895 void OnFontTextBoxKeyDown (object sender, KeyEventArgs e)
897 // Forward these keys on to the font style listbox
903 fontListBox.HandleKeyDown (e.KeyCode);
908 void OnFontStyleTextBoxKeyDown (object sender, KeyEventArgs e)
910 // Forward these keys on to the font style listbox
916 fontstyleListBox.HandleKeyDown (e.KeyCode);
921 void OnFontSizeTextBoxKeyDown (object sender, KeyEventArgs e)
923 // Forward these keys on to the font size listbox
929 fontsizeListBox.HandleKeyDown (e.KeyCode);
934 void OnFontTextBoxKeyPress (object sender, KeyPressEventArgs e)
936 internal_textbox_change = true;
938 if (fontListBox.SelectedIndex > -1)
939 fontListBox.SelectedIndex = -1;
942 void OnFontStyleTextBoxKeyPress (object sender, KeyPressEventArgs e)
944 internal_textbox_change = true;
946 if (fontstyleListBox.SelectedIndex > -1)
947 fontstyleListBox.SelectedIndex = -1;
950 void OnFontSizeTextBoxKeyPress (object sender, KeyPressEventArgs e)
952 if (Char.IsLetter (e.KeyChar) || Char.IsWhiteSpace (e.KeyChar) || Char.IsPunctuation (e.KeyChar) || e.KeyChar == ',') {
957 internal_textbox_change = true;
960 void OnFontTextBoxTextChanged (object sender, EventArgs e)
962 if (!internal_textbox_change)
965 internal_textbox_change = false;
967 string search = fontTextBox.Text;
969 // Look for an exact match
970 int found = fontListBox.FindStringExact (search);
972 if (found != ListBox.NoMatches) {
973 fontListBox.SelectedIndex = found;
977 // Look for a partial match
978 found = fontListBox.FindString (search);
980 if (found != ListBox.NoMatches) {
981 fontListBox.TopIndex = found;
985 // No match, scroll to the top
986 if (fontListBox.Items.Count > 0)
987 fontListBox.TopIndex = 0;
990 void OnFontStyleTextTextChanged (object sender, EventArgs e)
992 if (!internal_textbox_change)
995 internal_textbox_change = false;
997 // Look for an exact match
998 int found = fontstyleListBox.FindStringExact (fontstyleTextBox.Text);
1000 if (found != ListBox.NoMatches)
1001 fontstyleListBox.SelectedIndex = found;
1004 void OnFontSizeTextBoxTextChanged (object sender, EventArgs e)
1006 if (!internal_textbox_change)
1009 internal_textbox_change = false;
1011 if (fontsizeTextBox.Text.Length == 0)
1014 for (int i = 0; i < fontsizeListBox.Items.Count; i++) {
1015 string name = fontsizeListBox.Items [i] as string;
1017 if (name.StartsWith(fontsizeTextBox.Text)) {
1018 if (name == fontsizeTextBox.Text)
1019 fontsizeListBox.SelectedIndex = i;
1021 fontsizeListBox.TopIndex = i;
1028 void OnSelectedIndexChangedScriptComboBox (object sender, EventArgs e)
1030 string tmp_str = char_sets [scriptComboBox.SelectedIndex];
1032 if (tmp_str.Length > 0) {
1033 example_panel_text = tmp_str;
1035 UpdateExamplePanel ();
1039 void UpdateExamplePanel( )
1044 font = new Font( currentFamily, currentSize, currentFontStyle );
1046 examplePanel.Invalidate( );
1049 void UpdateFontSizeListBox ()
1051 int index = fontsizeListBox.FindString(((int)Math.Round ((currentSize))).ToString());
1054 fontsizeListBox.SelectedIndex = index;
1056 fontsizeListBox.SelectedIndex = 0;
1059 void UpdateFontStyleListBox( )
1061 // don't know if that works, IsStyleAvailable returns true for all styles under X
1063 fontstyleListBox.BeginUpdate( );
1065 fontstyleListBox.Items.Clear( );
1070 if ( currentFamily.IsStyleAvailable( FontStyle.Regular ) )
1072 index = fontstyleListBox.Items.Add( "Regular" );
1074 if ((currentFontStyle & FontStyle.Regular) == FontStyle.Regular)
1078 if ( currentFamily.IsStyleAvailable( FontStyle.Bold ) )
1080 index = fontstyleListBox.Items.Add( "Bold" );
1082 if ((currentFontStyle & FontStyle.Bold) == FontStyle.Bold)
1086 if ( currentFamily.IsStyleAvailable( FontStyle.Italic ) )
1088 index = fontstyleListBox.Items.Add( "Italic" );
1090 if ((currentFontStyle & FontStyle.Italic) == FontStyle.Italic)
1094 if ( currentFamily.IsStyleAvailable( FontStyle.Bold ) && currentFamily.IsStyleAvailable( FontStyle.Italic ) )
1096 index = fontstyleListBox.Items.Add( "Bold Italic" );
1098 if ((currentFontStyle & (FontStyle.Bold | FontStyle.Italic)) == (FontStyle.Bold | FontStyle.Italic))
1102 if (fontstyleListBox.Items.Count > 0) {
1103 fontstyleListBox.SelectedIndex = to_select;
1105 switch ((string)fontstyleListBox.SelectedItem) {
1107 currentFontStyle = FontStyle.Regular;
1110 currentFontStyle = FontStyle.Bold;
1113 currentFontStyle = FontStyle.Italic;
1116 currentFontStyle = FontStyle.Bold | FontStyle.Italic;
1120 if (strikethroughCheckBox.Checked)
1121 currentFontStyle |= FontStyle.Strikeout;
1122 if (underlinedCheckBox.Checked)
1123 currentFontStyle |= FontStyle.Underline;
1126 fontstyleListBox.EndUpdate( );
1129 FontFamily FindByName( string name )
1131 return fontHash[ name ] as FontFamily;
1134 void CreateFontSizeListBoxItems ()
1136 fontsizeListBox.BeginUpdate ();
1138 fontsizeListBox.Items.Clear();
1140 if (minSize == 0 && maxSize == 0)
1142 foreach (int i in a_sizes)
1143 fontsizeListBox.Items.Add (i.ToString());
1145 foreach (int i in a_sizes) {
1146 if (i >= minSize && i <= maxSize)
1147 fontsizeListBox.Items.Add (i.ToString());
1151 fontsizeListBox.EndUpdate ();
1154 #region Private Methods
1155 private void PopulateFontList ()
1157 fontListBox.Items.Clear ();
1160 fontListBox.BeginUpdate ();
1162 foreach (FontFamily ff in FontFamily.Families) {
1163 if (!fontHash.ContainsKey (ff.Name)) {
1164 if (!fixedPitchOnly || (IsFontFamilyFixedPitch (ff))) {
1165 fontListBox.Items.Add (ff.Name);
1166 fontHash.Add (ff.Name, ff);
1171 fontListBox.EndUpdate ();
1172 CreateFontSizeListBoxItems ();
1175 this.Font = new Font (FontFamily.GenericMonospace, 8.25f);
1177 this.Font = form.Font;
1180 private bool IsFontFamilyFixedPitch (FontFamily family)
1184 if (family.IsStyleAvailable (FontStyle.Regular))
1185 fs = FontStyle.Regular;
1186 else if (family.IsStyleAvailable (FontStyle.Bold))
1187 fs = FontStyle.Bold;
1188 else if (family.IsStyleAvailable (FontStyle.Italic))
1189 fs = FontStyle.Italic;
1190 else if (family.IsStyleAvailable (FontStyle.Strikeout))
1191 fs = FontStyle.Strikeout;
1192 else if (family.IsStyleAvailable (FontStyle.Underline))
1193 fs = FontStyle.Underline;
1197 Font f = new Font (family.Name, 10, fs);
1199 if (TextRenderer.MeasureString ("i", f).Width == TextRenderer.MeasureString ("w", f).Width)
1206 internal class ColorComboBox : ComboBox
1208 internal class ColorComboBoxItem
1210 private Color color;
1211 private string name;
1213 public ColorComboBoxItem( Color color, string name )
1241 public override string ToString()
1247 private Color selectedColor;
1249 private FontDialog fontDialog;
1251 public ColorComboBox( FontDialog fontDialog )
1253 this.fontDialog = fontDialog;
1255 DropDownStyle = ComboBoxStyle.DropDownList;
1256 DrawMode = DrawMode.OwnerDrawFixed;
1258 Items.AddRange (new object[] {
1259 new ColorComboBoxItem (Color.Black, "Black"),
1260 new ColorComboBoxItem (Color.Maroon, "Maroon"),
1261 new ColorComboBoxItem (Color.Green, "Green"),
1262 new ColorComboBoxItem (Color.Olive, "Olive"),
1263 new ColorComboBoxItem (Color.Navy, "Navy"),
1264 new ColorComboBoxItem (Color.Purple, "Purple"),
1265 new ColorComboBoxItem (Color.Teal, "Teal"),
1266 new ColorComboBoxItem (Color.Gray, "Gray"),
1267 new ColorComboBoxItem (Color.Silver, "Silver"),
1268 new ColorComboBoxItem (Color.Red, "Red"),
1269 new ColorComboBoxItem (Color.Lime, "Lime"),
1270 new ColorComboBoxItem (Color.Yellow, "Yellow"),
1271 new ColorComboBoxItem (Color.Blue, "Blue"),
1272 new ColorComboBoxItem (Color.Fuchsia, "Fuchsia"),
1273 new ColorComboBoxItem (Color.Aqua, "Aqua"),
1274 new ColorComboBoxItem (Color.White, "White") }
1278 MaxDropDownItems = 16;
1281 protected override void OnDrawItem( DrawItemEventArgs e )
1283 if ( e.Index == -1 )
1286 ColorComboBoxItem ccbi = Items[ e.Index ] as ColorComboBoxItem;
1288 Rectangle r = e.Bounds;
1291 if ( ( e.State & DrawItemState.Selected ) == DrawItemState.Selected )
1293 e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( Color.Blue ), e.Bounds ); // bot blue
1294 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 );
1295 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 );
1296 e.Graphics.DrawString( ccbi.Name, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush( Color.White ), r );
1300 e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( Color.White ), e.Bounds );
1301 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 );
1302 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 );
1303 e.Graphics.DrawString( ccbi.Name, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush( Color.Black ), r );
1307 protected override void OnSelectedIndexChanged( EventArgs e )
1309 ColorComboBoxItem ccbi = Items[ SelectedIndex ] as ColorComboBoxItem;
1310 selectedColor = ccbi.Color;
1312 fontDialog.Color = selectedColor;
1316 public event EventHandler Apply {
1317 add { Events.AddHandler (EventApply, value); }
1318 remove { Events.RemoveHandler (EventApply, value); }
1322 internal class MouseWheelListBox : ListBox
1324 public void SendMouseWheelEvent(MouseEventArgs e)