[Gtk-sharp-list] Gtk.Entry and Gtk.TextView (MERGE?)
Christian Hoff
christian_hoff at gmx.net
Sun Jul 6 12:42:27 EDT 2008
Since this is a topic that most Gtk# developers(including me) are not
familiar with, it might be best to write a mail to one of the Gtk+
mailing lists(http://www.gtk.org/mailing-lists.html) or to have a look
at the Gtk+ documentation.
Christian
Draekz schrieb:
> Hey all,
>
> We are needing to create a widget that looks like a Gtk.Entry (Blue
> highlighted border when selected, and roundish shadow type border etc)
> yet we need to tools provided in the TextView.
>
> We have been able to draw a similar border around the TextView (its
> not 100% but its close) but we have been unable to get it to highlight
> the border blue when selected.
>
> Could someone with more experiencing drawing custom styles etc on
> widgets help us to mimic the Entry for our TextView? Any help in the
> right direction would be appreciated. Below we have provided the code
> we have so far (keep in mind there are a few extra tidbits in this
> code that have nothing to do with what i'm asking about, but its just
> text tags and stuff):
>
> ----------------------------------------
>
> public class ViewEntryWidget : Bin
> {
> const int _borderSize = 2;
>
> bool _editing;
> string _markup;
> TextView _view;
>
> TextTag _tagBold = new TextTag ("bold");
> TextTag _tagItalic = new TextTag ("italic");
> TextTag _tagUnderline = new TextTag ("underline");
> TextTag _tagStrikethrough = new TextTag ("strikethrough");
> TextTag _tagUri = new TextTag ("uri");
>
> public string Text
> {
> get { return _markup; }
> }
>
> public ViewEntryWidget ()
> {
> Entry entry = new Entry ();
>
> _view = new TextView ();
> _view.AcceptsTab = false;
> _view.BorderWidth = 3;
> _view.CursorVisible = true;
> _view.Editable = true;
> // This is going to show white instead of gray, but it should
> be using the theme color, not white.
> _view.ModifyBg (StateType.Normal, new Gdk.Color (255,255,255));
>
> _tagBold.Weight = Weight.Bold;
> _view.Buffer.TagTable.Add (_tagBold);
>
> _tagItalic.Style = Pango.Style.Italic;
> _view.Buffer.TagTable.Add (_tagItalic);
>
> _tagUnderline.Underline = Pango.Underline.Single;
> _view.Buffer.TagTable.Add (_tagUnderline);
>
> _tagStrikethrough.Strikethrough = true;
> _view.Buffer.TagTable.Add (_tagStrikethrough);
>
> //TODO: can this be gotten from the gtk theme?
> _tagUri.ForegroundGdk = new Gdk.Color (0, 0, 255);
> _tagUri.Underline = Pango.Underline.Single;
> _view.Buffer.TagTable.Add (_tagUri);
>
> _view.FocusInEvent += ViewFocusIn;
> _view.FocusOutEvent += ViewFocusOut;
> _view.KeyPressEvent += ViewKeyPress;
> Add (_view);
>
> _markup = string.Empty;
>
> _editing = false;
> SetContent ();
> }
>
> void SetContent ()
> {
> _view.Buffer.Clear ();
>
> if (string.IsNullOrEmpty (_markup))
> return;
>
> _view.Buffer.Text = _markup;
> }
>
> int PangoPixels (int p)
> {
> return ((int)(p) + 512) >> 10;
> }
>
> protected override void OnSizeRequested (ref Requisition requisition)
> {
> FontMetrics metrics = _view.PangoContext.GetMetrics
> (_view.Style.FontDesc, _view.PangoContext.Language);
>
> int charPixels = (int)((Math.Max
> (metrics.ApproximateCharWidth, metrics.ApproximateDigitWidth) +
> Pango.Scale.PangoScale - 1) / Pango.Scale.PangoScale);
>
> requisition.Width = (charPixels * _view.Buffer.Text.Length) +
> (_borderSize * 2);
> requisition.Height = PangoPixels (metrics.Ascent +
> metrics.Descent) + (int)(_view.BorderWidth * 2) + (_borderSize * 2);
>
> //Log.Debug ("Requisition = {0}x{1}", requisition.Width,
> requisition.Height);
>
> metrics.Dispose ();
> }
>
> protected override void OnSizeAllocated (Gdk.Rectangle allocation)
> {
> base.OnSizeAllocated (allocation);
>
> _view.SizeAllocate (new Gdk.Rectangle (allocation.X +
> _borderSize, allocation.Y + _borderSize,
> allocation.Width - (2 *
> _borderSize),
> allocation.Height - (2
> * _borderSize)));
> }
>
> protected override void OnRealized ()
> {
> base.OnRealized ();
>
> GdkWindow.Background = Style.Base (StateType.Prelight);
> }
>
> protected override void OnStyleSet (Gtk.Style previous_style)
> {
> base.OnStyleSet (previous_style);
>
> if (IsRealized && (previous_style != null))
> GdkWindow.Background = Style.Base (StateType.Normal);
> }
>
> protected override bool OnExposeEvent (Gdk.EventExpose evnt)
> {
> //Gtk.Style.PaintFlatBox (Style, evnt.Window,
> StateType.Normal, ShadowType.None, Allocation, this, "entry_bg",
> // Allocation.X, Allocation.Y,
> Allocation.Width, Allocation.Height);
>
> Gtk.Style.PaintShadow (Style, evnt.Window, StateType.Normal,
> ShadowType.In, Allocation, this, "entry",
> Allocation.X, Allocation.Y,
> Allocation.Width, Allocation.Height);
>
> //TODO: focus
>
> PropagateExpose (_view, evnt);
>
> return false;
> }
>
> void ViewFocusIn (object sender, FocusInEventArgs args)
> {
> QueueDraw ();
>
> if (!_editing)
> {
> _editing = true;
> SetContent ();
> }
> }
>
> void ViewFocusOut (object sender, FocusOutEventArgs args)
> {
> QueueDraw ();
>
> if (_editing)
> {
> _editing = false;
> _markup = _view.Buffer.Text;
> SetContent ();
> }
> }
>
> [GLib.ConnectBefore]
> void ViewKeyPress (object sender, KeyPressEventArgs args)
> {
> if (args.Event.Key == Gdk.Key.Return || args.Event.Key ==
> Gdk.Key.KP_Enter)
> {
> // Treat enter as tab
>
> Toplevel.ChildFocus (DirectionType.TabForward);
> args.RetVal = true;
> }
> }
> ------------------------------------------------------------------------
>
> _______________________________________________
> Gtk-sharp-list maillist - Gtk-sharp-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
>
More information about the Gtk-sharp-list
mailing list