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);
397 #endregion // Public Constructors
399 #region Public Instance Properties
408 font = new Font(value, value.Style);
410 currentFontStyle = font.Style;
411 currentSize = font.Size;
412 currentFontName = font.Name;
414 strikethroughCheckBox.Checked = font.Strikeout;
415 underlinedCheckBox.Checked = font.Underline;
417 int index = fontListBox.FindString (currentFontName);
420 fontListBox.SelectedIndex = index;
422 fontListBox.SelectedIndex = 0;
425 UpdateFontSizeListBox ();
426 UpdateFontStyleListBox ();
428 fontListBox.TopIndex = fontListBox.SelectedIndex;
433 [DefaultValue(false)]
434 public bool FontMustExist
437 return fontMustExist;
441 fontMustExist = value;
446 [DefaultValue ("Color [Black]")]
452 examplePanel.Invalidate( );
461 public bool AllowSimulations
464 allowSimulations = value;
468 return allowSimulations;
473 public bool AllowVectorFonts
476 allowVectorFonts = value;
480 return allowVectorFonts;
485 public bool AllowVerticalFonts
488 allowVerticalFonts = value;
492 return allowVerticalFonts;
497 public bool AllowScriptChange
500 allowScriptChange = value;
504 return allowScriptChange;
508 [DefaultValue(false)]
509 public bool FixedPitchOnly
512 if (fixedPitchOnly != value) {
513 fixedPitchOnly = value;
519 return fixedPitchOnly;
532 if (maxSize < minSize)
535 CreateFontSizeListBoxItems ();
552 if (minSize > maxSize)
555 CreateFontSizeListBoxItems ();
557 if (minSize > currentSize)
561 currentSize = minSize;
563 font = new Font( currentFamily, currentSize, currentFontStyle );
565 UpdateExamplePanel ();
567 fontsizeTextBox.Text = currentSize.ToString ();
576 [DefaultValue(false)]
577 public bool ScriptsOnly
588 [DefaultValue(false)]
589 public bool ShowApply
592 if (value != showApply)
610 [DefaultValue(false)]
611 public bool ShowColor
614 if (value != showColor)
618 colorComboBox.Show ();
620 colorComboBox.Hide ();
632 public bool ShowEffects
635 if (value != showEffects)
639 effectsGroupBox.Show ();
641 effectsGroupBox.Hide ();
652 [DefaultValue(false)]
656 if (value != showHelp)
673 #endregion // Public Instance Properties
675 #region Protected Instance Properties
676 protected int Options {
679 #endregion // Protected Instance Properties
681 #region Public Instance Methods
682 public override void Reset( )
685 allowSimulations = true;
686 allowVectorFonts = true;
687 allowVerticalFonts = true;
688 allowScriptChange = true;
689 fixedPitchOnly = false;
693 CreateFontSizeListBoxItems ();
701 colorComboBox.Hide ();
704 effectsGroupBox.Show ();
712 public override string ToString ()
715 return base.ToString ();
716 return String.Concat (base.ToString (), ", Font: ", font.ToString ());
718 #endregion // Public Instance Methods
720 #region Protected Instance Methods
721 protected override IntPtr HookProc (IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
723 return base.HookProc (hWnd, msg, wparam, lparam);
726 protected override bool RunDialog( IntPtr hWndOwner )
733 internal void OnApplyButton (object sender, EventArgs e)
738 protected virtual void OnApply (EventArgs e)
740 EventHandler apply = (EventHandler) Events [EventApply];
744 #endregion // Protected Instance Methods
746 void OnClickCancelButton( object sender, EventArgs e )
748 form.DialogResult = DialogResult.Cancel;
751 void OnClickOkButton( object sender, EventArgs e )
753 form.DialogResult = DialogResult.OK;
756 void OnPaintExamplePanel( object sender, PaintEventArgs e )
758 SolidBrush brush = ThemeEngine.Current.ResPool.GetSolidBrush( color );
760 e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( SystemColors.Control ), 0, 0, 156, 40 );
762 SizeF fontSizeF = e.Graphics.MeasureString( example_panel_text, font );
764 int text_width = (int)fontSizeF.Width;
765 int text_height = (int)fontSizeF.Height;
767 int x = ( examplePanel.Width / 2 ) - ( text_width / 2 );
770 int y = ( examplePanel.Height / 2 ) - ( text_height / 2 );
772 e.Graphics.DrawString( example_panel_text, font, brush, new Point( x, y ) );
775 void OnSelectedIndexChangedFontListBox( object sender, EventArgs e )
777 if ( fontListBox.SelectedIndex != -1 )
779 currentFamily = FindByName( fontListBox.Items[ fontListBox.SelectedIndex ].ToString( ) );
781 fontTextBox.Text = currentFamily.Name;
783 internal_change = true;
785 UpdateFontStyleListBox( );
787 UpdateFontSizeListBox ();
789 UpdateExamplePanel ();
791 form.Select(fontTextBox);
793 internal_change = false;
797 void OnSelectedIndexChangedSizeListBox( object sender, EventArgs e )
799 if ( fontsizeListBox.SelectedIndex != -1 )
801 currentSize = (float)System.Convert.ToDouble( fontsizeListBox.Items[ fontsizeListBox.SelectedIndex ] );
803 fontsizeTextBox.Text = currentSize.ToString( );
805 UpdateExamplePanel( );
807 if (!internal_change)
808 form.Select(fontsizeTextBox);
812 void OnSelectedIndexChangedFontStyleListBox( object sender, EventArgs e )
814 if ( fontstyleListBox.SelectedIndex != -1 )
816 switch ( fontstyleListBox.SelectedIndex )
819 currentFontStyle = FontStyle.Regular;
822 currentFontStyle = FontStyle.Bold;
825 currentFontStyle = FontStyle.Italic;
828 currentFontStyle = FontStyle.Bold | FontStyle.Italic;
831 currentFontStyle = FontStyle.Regular;
836 currentFontStyle = currentFontStyle | FontStyle.Underline;
839 currentFontStyle = currentFontStyle | FontStyle.Strikeout;
841 fontstyleTextBox.Text = fontstyleListBox.Items[ fontstyleListBox.SelectedIndex ].ToString( );
843 if (!internal_change) {
844 UpdateExamplePanel( );
846 form.Select(fontstyleTextBox);
851 void OnCheckedChangedUnderlinedCheckBox( object sender, EventArgs e )
853 if ( underlinedCheckBox.Checked ) {
854 currentFontStyle = currentFontStyle | FontStyle.Underline;
858 currentFontStyle = currentFontStyle ^ FontStyle.Underline;
862 UpdateExamplePanel( );
865 void OnCheckedChangedStrikethroughCheckBox( object sender, EventArgs e )
867 if ( strikethroughCheckBox.Checked ) {
868 currentFontStyle = currentFontStyle | FontStyle.Strikeout;
869 strikethrough = true;
872 currentFontStyle = currentFontStyle ^ FontStyle.Strikeout;
873 strikethrough = false;
876 UpdateExamplePanel( );
879 bool internal_textbox_change = false;
881 void OnFontTextBoxMouseWheel (object sender, MouseEventArgs e)
883 fontListBox.SendMouseWheelEvent (e);
886 void OnFontStyleTextBoxMouseWheel (object sender, MouseEventArgs e)
888 fontstyleListBox.SendMouseWheelEvent (e);
891 void OnFontSizeTextBoxMouseWheel (object sender, MouseEventArgs e)
893 fontsizeListBox.SendMouseWheelEvent (e);
896 void OnFontTextBoxKeyDown (object sender, KeyEventArgs e)
898 if (e.KeyCode == Keys.Up) {
899 int sel_index = fontListBox.SelectedIndex;
906 fontListBox.SelectedIndex = sel_index;
907 } else if (e.KeyCode == Keys.Down) {
908 int sel_index = fontListBox.SelectedIndex;
912 if (sel_index > fontListBox.Items.Count - 1)
913 sel_index = fontListBox.Items.Count - 1;
915 fontListBox.SelectedIndex = sel_index;
919 void OnFontStyleTextBoxKeyDown (object sender, KeyEventArgs e)
921 if (e.KeyCode == Keys.Up) {
922 int sel_index = fontstyleListBox.SelectedIndex;
929 fontstyleListBox.SelectedIndex = sel_index;
930 } else if (e.KeyCode == Keys.Down) {
931 int sel_index = fontstyleListBox.SelectedIndex;
935 if (sel_index > fontstyleListBox.Items.Count - 1)
936 sel_index = fontstyleListBox.Items.Count - 1;
938 fontstyleListBox.SelectedIndex = sel_index;
942 void OnFontSizeTextBoxKeyDown (object sender, KeyEventArgs e)
944 if (e.KeyCode == Keys.Up) {
945 int sel_index = fontsizeListBox.SelectedIndex;
952 fontsizeListBox.SelectedIndex = sel_index;
953 } else if (e.KeyCode == Keys.Down) {
954 int sel_index = fontsizeListBox.SelectedIndex;
958 if (sel_index > fontsizeListBox.Items.Count - 1)
959 sel_index = fontsizeListBox.Items.Count - 1;
961 fontsizeListBox.SelectedIndex = sel_index;
965 void OnFontTextBoxKeyPress (object sender, KeyPressEventArgs e)
967 internal_textbox_change = true;
969 if (fontListBox.SelectedIndex > -1)
970 fontListBox.SelectedIndex = -1;
973 void OnFontStyleTextBoxKeyPress (object sender, KeyPressEventArgs e)
975 internal_textbox_change = true;
977 if (fontstyleListBox.SelectedIndex > -1)
978 fontstyleListBox.SelectedIndex = -1;
981 void OnFontSizeTextBoxKeyPress (object sender, KeyPressEventArgs e)
983 if (Char.IsLetter (e.KeyChar) || Char.IsWhiteSpace (e.KeyChar) || Char.IsPunctuation (e.KeyChar) || e.KeyChar == ',') {
988 internal_textbox_change = true;
991 void OnFontTextBoxTextChanged (object sender, EventArgs e)
993 if (!internal_textbox_change)
996 internal_textbox_change = false;
998 for (int i = 0; i < fontListBox.Items.Count; i++) {
999 string name = fontListBox.Items [i] as string;
1001 if (name.StartsWith(fontTextBox.Text)) {
1002 if (name == fontTextBox.Text)
1003 fontListBox.SelectedIndex = i;
1005 fontListBox.TopIndex = i;
1012 void OnFontStyleTextTextChanged (object sender, EventArgs e)
1014 if (!internal_textbox_change)
1017 internal_textbox_change = false;
1019 for (int i = 0; i < fontstyleListBox.Items.Count; i++) {
1020 string name = fontstyleListBox.Items [i] as string;
1022 if (name.StartsWith(fontstyleTextBox.Text)) {
1023 if (name == fontstyleTextBox.Text)
1024 fontstyleListBox.SelectedIndex = i;
1031 void OnFontSizeTextBoxTextChanged (object sender, EventArgs e)
1033 if (!internal_textbox_change)
1036 internal_textbox_change = false;
1038 if (fontsizeTextBox.Text.Length == 0)
1041 for (int i = 0; i < fontsizeListBox.Items.Count; i++) {
1042 string name = fontsizeListBox.Items [i] as string;
1044 if (name.StartsWith(fontsizeTextBox.Text)) {
1045 if (name == fontsizeTextBox.Text)
1046 fontsizeListBox.SelectedIndex = i;
1048 fontsizeListBox.TopIndex = i;
1055 void OnSelectedIndexChangedScriptComboBox (object sender, EventArgs e)
1057 string tmp_str = char_sets [scriptComboBox.SelectedIndex];
1059 if (tmp_str.Length > 0) {
1060 example_panel_text = tmp_str;
1062 UpdateExamplePanel ();
1066 void UpdateExamplePanel( )
1071 font = new Font( currentFamily, currentSize, currentFontStyle );
1073 examplePanel.Invalidate( );
1076 void UpdateFontSizeListBox ()
1078 int index = fontsizeListBox.FindString(((int)(currentSize)).ToString());
1081 fontsizeListBox.SelectedIndex = index;
1083 fontsizeListBox.SelectedIndex = 0;
1086 void UpdateFontStyleListBox( )
1088 // don't know if that works, IsStyleAvailable returns true for all styles under X
1090 fontstyleListBox.BeginUpdate( );
1092 fontstyleListBox.Items.Clear( );
1097 if ( currentFamily.IsStyleAvailable( FontStyle.Regular ) )
1099 index = fontstyleListBox.Items.Add( "Regular" );
1101 if ((currentFontStyle & FontStyle.Regular) == FontStyle.Regular)
1105 if ( currentFamily.IsStyleAvailable( FontStyle.Bold ) )
1107 index = fontstyleListBox.Items.Add( "Bold" );
1109 if ((currentFontStyle & FontStyle.Bold) == FontStyle.Bold)
1113 if ( currentFamily.IsStyleAvailable( FontStyle.Italic ) )
1115 index = fontstyleListBox.Items.Add( "Italic" );
1117 if ((currentFontStyle & FontStyle.Italic) == FontStyle.Italic)
1121 if ( currentFamily.IsStyleAvailable( FontStyle.Bold ) && currentFamily.IsStyleAvailable( FontStyle.Italic ) )
1123 index = fontstyleListBox.Items.Add( "Bold Italic" );
1125 if ((currentFontStyle & (FontStyle.Bold | FontStyle.Italic)) == (FontStyle.Bold | FontStyle.Italic))
1129 if (fontstyleListBox.Items.Count > 0) {
1130 fontstyleListBox.SelectedIndex = to_select;
1132 switch ((string)fontstyleListBox.SelectedItem) {
1134 currentFontStyle = FontStyle.Regular;
1137 currentFontStyle = FontStyle.Bold;
1140 currentFontStyle = FontStyle.Italic;
1143 currentFontStyle = FontStyle.Bold | FontStyle.Italic;
1147 if (strikethroughCheckBox.Checked)
1148 currentFontStyle |= FontStyle.Strikeout;
1149 if (underlinedCheckBox.Checked)
1150 currentFontStyle |= FontStyle.Underline;
1153 fontstyleListBox.EndUpdate( );
1156 FontFamily FindByName( string name )
1158 return fontHash[ name ] as FontFamily;
1161 void CreateFontSizeListBoxItems ()
1163 fontsizeListBox.BeginUpdate ();
1165 fontsizeListBox.Items.Clear();
1167 if (minSize == 0 && maxSize == 0)
1169 foreach (int i in a_sizes)
1170 fontsizeListBox.Items.Add (i.ToString());
1172 foreach (int i in a_sizes) {
1173 if (i >= minSize && i <= maxSize)
1174 fontsizeListBox.Items.Add (i.ToString());
1178 fontsizeListBox.EndUpdate ();
1181 #region Private Methods
1182 private void PopulateFontList ()
1184 fontListBox.Items.Clear ();
1187 fontListBox.BeginUpdate ();
1189 foreach (FontFamily ff in FontFamily.Families) {
1190 if (!fontHash.ContainsKey (ff.Name)) {
1191 if (!fixedPitchOnly || (IsFontFamilyFixedPitch (ff))) {
1192 fontListBox.Items.Add (ff.Name);
1193 fontHash.Add (ff.Name, ff);
1198 fontListBox.EndUpdate ();
1199 CreateFontSizeListBoxItems ();
1202 this.Font = new Font (FontFamily.GenericMonospace, 8.25f);
1204 this.Font = form.Font;
1207 private bool IsFontFamilyFixedPitch (FontFamily family)
1211 if (family.IsStyleAvailable (FontStyle.Regular))
1212 fs = FontStyle.Regular;
1213 else if (family.IsStyleAvailable (FontStyle.Bold))
1214 fs = FontStyle.Bold;
1215 else if (family.IsStyleAvailable (FontStyle.Italic))
1216 fs = FontStyle.Italic;
1217 else if (family.IsStyleAvailable (FontStyle.Strikeout))
1218 fs = FontStyle.Strikeout;
1219 else if (family.IsStyleAvailable (FontStyle.Underline))
1220 fs = FontStyle.Underline;
1224 Font f = new Font (family.Name, 10, fs);
1226 if (TextRenderer.MeasureString ("i", f).Width == TextRenderer.MeasureString ("w", f).Width)
1233 internal class ColorComboBox : ComboBox
1235 internal class ColorComboBoxItem
1237 private Color color;
1238 private string name;
1240 public ColorComboBoxItem( Color color, string name )
1269 private Color selectedColor;
1271 private FontDialog fontDialog;
1273 public ColorComboBox( FontDialog fontDialog )
1275 this.fontDialog = fontDialog;
1277 DropDownStyle = ComboBoxStyle.DropDownList;
1278 DrawMode = DrawMode.OwnerDrawFixed;
1280 Items.AddRange( new object[] {
1281 new ColorComboBoxItem( Color.Black, "Black" ),
1282 new ColorComboBoxItem( Color.DarkRed, "Dark-Red" ),
1283 new ColorComboBoxItem( Color.Green, "Green" ),
1284 new ColorComboBoxItem( Color.Olive, "Olive-Green" ), // color not correct
1285 new ColorComboBoxItem( Color.Aquamarine, "Aquamarine" ), // color not correct
1286 new ColorComboBoxItem( Color.Crimson, "Crimson" ),
1287 new ColorComboBoxItem( Color.Cyan, "Cyan" ),
1288 new ColorComboBoxItem( Color.Gray, "Gray" ),
1289 new ColorComboBoxItem( Color.Silver, "Silver" ),
1290 new ColorComboBoxItem( Color.Red, "Red" ),
1291 new ColorComboBoxItem( Color.YellowGreen, "Yellow-Green" ),
1292 new ColorComboBoxItem( Color.Yellow, "Yellow" ),
1293 new ColorComboBoxItem( Color.Blue, "Blue" ),
1294 new ColorComboBoxItem( Color.Purple, "Purple" ),
1295 new ColorComboBoxItem( Color.Aquamarine, "Aquamarine" ),
1296 new ColorComboBoxItem( Color.White, "White" ) }
1302 protected override void OnDrawItem( DrawItemEventArgs e )
1304 if ( e.Index == -1 )
1307 ColorComboBoxItem ccbi = Items[ e.Index ] as ColorComboBoxItem;
1309 Rectangle r = e.Bounds;
1312 if ( ( e.State & DrawItemState.Selected ) == DrawItemState.Selected )
1314 e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( Color.Blue ), e.Bounds ); // bot blue
1315 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 );
1316 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 );
1317 e.Graphics.DrawString( ccbi.Name, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush( Color.White ), r );
1321 e.Graphics.FillRectangle( ThemeEngine.Current.ResPool.GetSolidBrush( Color.White ), e.Bounds );
1322 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 );
1323 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 );
1324 e.Graphics.DrawString( ccbi.Name, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush( Color.Black ), r );
1328 protected override void OnSelectedIndexChanged( EventArgs e )
1330 ColorComboBoxItem ccbi = Items[ SelectedIndex ] as ColorComboBoxItem;
1331 selectedColor = ccbi.Color;
1333 fontDialog.Color = selectedColor;
1337 public event EventHandler Apply {
1338 add { Events.AddHandler (EventApply, value); }
1339 remove { Events.RemoveHandler (EventApply, value); }
1343 internal class MouseWheelListBox : ListBox
1345 public void SendMouseWheelEvent(MouseEventArgs e)