* samples/GtkDemo/*.cs: General fixup and cleanup; Remove some
gratuitous differences from the C version. Make comment and indent style consistent. Don't use "this." where not needed. Override OnDeleteEvent rather than connecting one's own DeleteEvent signal. * sample/GtkDemo/DemoApplicationWindow.cs (static DemoApplicationWindow): register the Gtk logo icon with StockManager so it shows up correctly in the toolbar. (AddActions): Register the radio items as radio items so they work right. * sample/GtkDemo/DemoHyperText.cs (EventAfter): handle link-clicking from Widget.WidgetEventAfter (as in the C version), rather than ButtonRelease, now that WidgetEventAfter is wrapped. * sample/GtkDemo/DemoImages.cs (DemoImages): use Gtk.Image.LoadFromResource (particularly to make the animation work right). (OnDestroyed): handle clean up (remove the timeout, etc) * sample/GtkDemo/DemoMain.cs (LoadStream): Fix handling of blank lines and whitespace to match the C version. * sample/GtkDemo/DemoPixbuf.cs (Expose): Use System.Runtime.InteropServices.Marshal.Copy() to copy pixbuf.Pixels to pass to DrawRgbImageDithalign, to make this more like the C version (and probably faster?) (timeout): Remove the FIXME since it seems to work now * sample/GtkDemo/DemoStockBrowser.cs: Simplify a bunch. Use reflection to get the C# names of the stock icons rather than trying to correctly re-mangle the ids. Display the Label with the accelerator underlined. * sample/GtkDemo/DemoTextView.cs (AttachWidgets): use Gtk.Image.LoadFromResource, so the image is properly loaded as an animation, not a static image. Don't set the combobox's "Active" property (for consistency with the C version). (InsertText): Fix miscellaneous differences with the C version. Remove some leftover cruft from earlier workarounds for gtk# bugs. * sample/GtkDemo/DemoTreeStore.cs (AddColumns): Make this more like the C version so the checkboxes are sensitized and hidden correctly on a per-row basis. * sample/GtkDemo/DemoUIManager.cs: Make the radio menu items work. * sample/GtkDemo/README: * sample/GtkDemo/TODO: update svn path=/trunk/gtk-sharp/; revision=42481
This commit is contained in:
parent
8a88e202e1
commit
246d4e1620
25 changed files with 1608 additions and 1776 deletions
52
ChangeLog
52
ChangeLog
|
@ -1,3 +1,55 @@
|
|||
2005-04-01 Dan Winship <danw@novell.com>
|
||||
|
||||
* samples/GtkDemo/*.cs: General fixup and cleanup; Remove some
|
||||
gratuitous differences from the C version. Make comment and indent
|
||||
style consistent. Don't use "this." where not needed. Override
|
||||
OnDeleteEvent rather than connecting one's own DeleteEvent signal.
|
||||
|
||||
* sample/GtkDemo/DemoApplicationWindow.cs (static
|
||||
DemoApplicationWindow): register the Gtk logo icon with
|
||||
StockManager so it shows up correctly in the toolbar.
|
||||
(AddActions): Register the radio items as radio items so they work
|
||||
right.
|
||||
|
||||
* sample/GtkDemo/DemoHyperText.cs (EventAfter): handle
|
||||
link-clicking from Widget.WidgetEventAfter (as in the C version),
|
||||
rather than ButtonRelease, now that WidgetEventAfter is wrapped.
|
||||
|
||||
* sample/GtkDemo/DemoImages.cs (DemoImages): use
|
||||
Gtk.Image.LoadFromResource (particularly to make the animation
|
||||
work right).
|
||||
(OnDestroyed): handle clean up (remove the timeout, etc)
|
||||
|
||||
* sample/GtkDemo/DemoMain.cs (LoadStream): Fix handling of blank
|
||||
lines and whitespace to match the C version.
|
||||
|
||||
* sample/GtkDemo/DemoPixbuf.cs (Expose): Use
|
||||
System.Runtime.InteropServices.Marshal.Copy() to copy
|
||||
pixbuf.Pixels to pass to DrawRgbImageDithalign, to make this more
|
||||
like the C version (and probably faster?)
|
||||
(timeout): Remove the FIXME since it seems to work now
|
||||
|
||||
* sample/GtkDemo/DemoStockBrowser.cs: Simplify a bunch. Use
|
||||
reflection to get the C# names of the stock icons rather than
|
||||
trying to correctly re-mangle the ids. Display the Label with the
|
||||
accelerator underlined.
|
||||
|
||||
* sample/GtkDemo/DemoTextView.cs (AttachWidgets): use
|
||||
Gtk.Image.LoadFromResource, so the image is properly loaded as an
|
||||
animation, not a static image. Don't set the combobox's "Active"
|
||||
property (for consistency with the C version).
|
||||
(InsertText): Fix miscellaneous differences with the C version.
|
||||
Remove some leftover cruft from earlier workarounds for gtk# bugs.
|
||||
|
||||
* sample/GtkDemo/DemoTreeStore.cs (AddColumns): Make this more
|
||||
like the C version so the checkboxes are sensitized and hidden
|
||||
correctly on a per-row basis.
|
||||
|
||||
* sample/GtkDemo/DemoUIManager.cs: Make the radio menu items work.
|
||||
|
||||
* sample/GtkDemo/README:
|
||||
* sample/GtkDemo/TODO: update
|
||||
|
||||
2005-04-01 Mike Kestner <mkestner@novell.com>
|
||||
|
||||
* gtk/TreeModelFilter.custom : manually implement SetVisibleFunc and
|
||||
|
|
|
@ -1,12 +1,3 @@
|
|||
//
|
||||
// ApplicationWindow.cs, port of appwindow.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
// John Luke <john.luke@gmail.com>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
|
||||
/* Application main window
|
||||
*
|
||||
* Demonstrates a typical application window, with menubar, toolbar, statusbar.
|
||||
|
@ -20,14 +11,23 @@ namespace GtkDemo
|
|||
[Demo ("Application Window", "DemoApplicationWindow.cs")]
|
||||
public class DemoApplicationWindow : Window
|
||||
{
|
||||
// for the statusbar
|
||||
const int ctx = 1;
|
||||
const string fmt = "Cursor at row {0} column {1} - {2} chars in document";
|
||||
int row, column, count = 0;
|
||||
|
||||
Statusbar statusbar;
|
||||
VBox vbox;
|
||||
|
||||
static DemoApplicationWindow ()
|
||||
{
|
||||
// Register our custom toolbar icons, for themability
|
||||
|
||||
Gdk.Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource ("gtk-logo-rgb.gif");
|
||||
Gdk.Pixbuf transparent = pixbuf.AddAlpha (true, 0xff, 0xff, 0xff);
|
||||
|
||||
IconFactory factory = new IconFactory ();
|
||||
factory.Add ("demo-gtk-logo", new IconSet (transparent));
|
||||
factory.AddDefault ();
|
||||
|
||||
StockManager.Add (new StockItem ("demo-gtk-logo", "_GTK#", 0, 0, null));
|
||||
}
|
||||
|
||||
const string uiInfo =
|
||||
"<ui>" +
|
||||
" <menubar name='MenuBar'>" +
|
||||
|
@ -64,13 +64,12 @@ namespace GtkDemo
|
|||
" </toolbar>" +
|
||||
"</ui>";
|
||||
|
||||
public DemoApplicationWindow () : base ("Demo Application Window")
|
||||
public DemoApplicationWindow () : base ("Application Window")
|
||||
{
|
||||
this.SetDefaultSize (400, 300);
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
SetDefaultSize (200, 200);
|
||||
|
||||
vbox = new VBox (false, 0);
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
AddActions ();
|
||||
|
||||
|
@ -78,11 +77,30 @@ namespace GtkDemo
|
|||
UpdateStatus ();
|
||||
vbox.PackEnd (statusbar, false, false, 0);
|
||||
|
||||
TextView textview = new TextView ();
|
||||
textview.Buffer.MarkSet += new MarkSetHandler (OnMarkSet);
|
||||
vbox.PackEnd (textview, true, true, 0);
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
sw.ShadowType = ShadowType.In;
|
||||
vbox.PackEnd (sw, true, true, 0);
|
||||
|
||||
this.ShowAll ();
|
||||
TextView textview = new TextView ();
|
||||
textview.Buffer.MarkSet += new MarkSetHandler (MarkSet);
|
||||
sw.Add (textview);
|
||||
|
||||
textview.GrabFocus ();
|
||||
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
enum Color {
|
||||
Red,
|
||||
Green,
|
||||
Blue
|
||||
}
|
||||
|
||||
enum Shape {
|
||||
Square,
|
||||
Rectangle,
|
||||
Oval
|
||||
}
|
||||
|
||||
void AddActions ()
|
||||
|
@ -94,64 +112,94 @@ namespace GtkDemo
|
|||
new ActionEntry ("ColorMenu", null, "_Color", null, null, null),
|
||||
new ActionEntry ("ShapeMenu", null, "_Shape", null, null, null),
|
||||
new ActionEntry ("HelpMenu", null, "_Help", null, null, null),
|
||||
new ActionEntry ("New", Stock.New, "_New", "<control>N", "Create a new file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Open", Stock.Open, "_Open", "<control>O", "Open a file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Save", Stock.Save, "_Save", "<control>S", "Save current file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("SaveAs", Stock.SaveAs, "Save _As", null, "Save to a file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Quit", Stock.Quit, "_Quit", "<control>Q", "Quit", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("About", null, "_About", "<control>A", "About", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Logo", "demo-gtk-logo", "Gtk#", null, "Gtk#", new EventHandler (OnActionActivated))
|
||||
new ActionEntry ("New", Stock.New, "_New", "<control>N", "Create a new file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Open", Stock.Open, "_Open", "<control>O", "Open a file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Save", Stock.Save, "_Save", "<control>S", "Save current file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("SaveAs", Stock.SaveAs, "Save _As", null, "Save to a file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Quit", Stock.Quit, "_Quit", "<control>Q", "Quit", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("About", null, "_About", "<control>A", "About", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Logo", "demo-gtk-logo", null, null, "Gtk#", new EventHandler (ActionActivated))
|
||||
};
|
||||
|
||||
ToggleActionEntry[] toggleActions = new ToggleActionEntry[]
|
||||
{
|
||||
new ToggleActionEntry ("Bold", Stock.Bold, "_Bold", "<control>B", "Bold", new EventHandler (OnActionActivated), false)
|
||||
new ToggleActionEntry ("Bold", Stock.Bold, "_Bold", "<control>B", "Bold", new EventHandler (ActionActivated), true)
|
||||
};
|
||||
|
||||
ActionEntry[] colorActions = new ActionEntry[]
|
||||
RadioActionEntry[] colorActions = new RadioActionEntry[]
|
||||
{
|
||||
new ActionEntry ("Red", null, "_Red", "<control>R", "Blood", null),
|
||||
new ActionEntry ("Green", null, "_Green", "<control>G", "Grass", null),
|
||||
new ActionEntry ("Blue", null, "_Blue", "<control>B", "Sky", null)
|
||||
new RadioActionEntry ("Red", null, "_Red", "<control>R", "Blood", (int)Color.Red),
|
||||
new RadioActionEntry ("Green", null, "_Green", "<control>G", "Grass", (int)Color.Green),
|
||||
new RadioActionEntry ("Blue", null, "_Blue", "<control>B", "Sky", (int)Color.Blue)
|
||||
};
|
||||
|
||||
ActionEntry[] shapeActions = new ActionEntry[]
|
||||
RadioActionEntry[] shapeActions = new RadioActionEntry[]
|
||||
{
|
||||
new ActionEntry ("Square", null, "_Square", "<control>S", "Square", null),
|
||||
new ActionEntry ("Rectangle", null, "_Rectangle", "<control>R", "Rectangle", null),
|
||||
new ActionEntry ("Oval", null, "_Oval", "<control>O", "Oval", null)
|
||||
new RadioActionEntry ("Square", null, "_Square", "<control>S", "Square", (int)Shape.Square),
|
||||
new RadioActionEntry ("Rectangle", null, "_Rectangle", "<control>R", "Rectangle", (int)Shape.Rectangle),
|
||||
new RadioActionEntry ("Oval", null, "_Oval", "<control>O", "Egg", (int)Shape.Oval)
|
||||
};
|
||||
|
||||
ActionGroup group = new ActionGroup ("group");
|
||||
ActionGroup group = new ActionGroup ("AppWindowActions");
|
||||
group.Add (actions);
|
||||
group.Add (toggleActions);
|
||||
group.Add (colorActions);
|
||||
group.Add (shapeActions);
|
||||
group.Add (colorActions, (int)Color.Red, new ChangedHandler (RadioActionActivated));
|
||||
group.Add (shapeActions, (int)Shape.Square, new ChangedHandler (RadioActionActivated));
|
||||
|
||||
UIManager uim = new UIManager ();
|
||||
uim.InsertActionGroup (group, (int) uim.NewMergeId ());
|
||||
uim.AddWidget += new AddWidgetHandler (OnAddWidget);
|
||||
uim.InsertActionGroup (group, 0);
|
||||
uim.AddWidget += new AddWidgetHandler (AddWidget);
|
||||
uim.AddUiFromString (uiInfo);
|
||||
|
||||
AddAccelGroup (uim.AccelGroup);
|
||||
}
|
||||
|
||||
private void OnActionActivated (object sender, EventArgs a)
|
||||
private void ActionActivated (object sender, EventArgs a)
|
||||
{
|
||||
Action action = sender as Action;
|
||||
MessageDialog md;
|
||||
|
||||
using (MessageDialog md = new MessageDialog (this, DialogFlags.DestroyWithParent, MessageType.Info, ButtonsType.Close, "You activated action: {0}", action.Name)) {
|
||||
md = new MessageDialog (this, DialogFlags.DestroyWithParent,
|
||||
MessageType.Info, ButtonsType.Close,
|
||||
"You activated action: \"{0}\" of type \"{1}\"",
|
||||
action.Name, action.GetType ());
|
||||
md.Run ();
|
||||
md.Hide ();
|
||||
}
|
||||
md.Destroy ();
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
private void RadioActionActivated (object sender, ChangedArgs args)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
RadioAction action = args.Current;
|
||||
MessageDialog md;
|
||||
|
||||
if (action.Active) {
|
||||
md = new MessageDialog (this, DialogFlags.DestroyWithParent,
|
||||
MessageType.Info, ButtonsType.Close,
|
||||
"You activated radio action: \"{0}\" of type \"{1}\".\nCurrent value: {2}",
|
||||
action.Name, action.GetType (),
|
||||
args.Current.Value);
|
||||
md.Run ();
|
||||
md.Destroy ();
|
||||
}
|
||||
}
|
||||
|
||||
void OnMarkSet (object o, MarkSetArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override bool OnWindowStateEvent (Gdk.EventWindowState evt)
|
||||
{
|
||||
if ((evt.ChangedMask & (Gdk.WindowState.Maximized | Gdk.WindowState.Fullscreen)) != 0)
|
||||
statusbar.HasResizeGrip = (evt.NewWindowState & (Gdk.WindowState.Maximized | Gdk.WindowState.Fullscreen)) == 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
const string fmt = "Cursor at row {0} column {1} - {2} chars in document";
|
||||
int row, column, count = 0;
|
||||
|
||||
void MarkSet (object o, MarkSetArgs args)
|
||||
{
|
||||
TextIter iter = args.Location;
|
||||
row = iter.Line + 1;
|
||||
|
@ -162,15 +210,14 @@ namespace GtkDemo
|
|||
|
||||
void UpdateStatus ()
|
||||
{
|
||||
statusbar.Pop (ctx);
|
||||
statusbar.Push (ctx, String.Format (fmt, row, column, count));
|
||||
statusbar.Pop (0);
|
||||
statusbar.Push (0, String.Format (fmt, row, column, count));
|
||||
}
|
||||
|
||||
void OnAddWidget (object sender, AddWidgetArgs a)
|
||||
void AddWidget (object sender, AddWidgetArgs a)
|
||||
{
|
||||
a.Widget.Show ();
|
||||
vbox.PackStart (a.Widget, false, true, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,9 +27,7 @@ namespace GtkDemo
|
|||
}
|
||||
|
||||
public string Parent {
|
||||
get {
|
||||
return parent;
|
||||
}
|
||||
get { return parent; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,3 @@
|
|||
//
|
||||
// DemoButtonBox.cs, port of buttonbox.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
|
||||
/* Button Boxes
|
||||
*
|
||||
* The Button Box widgets are used to arrange buttons with padding.
|
||||
|
@ -21,56 +13,51 @@ namespace GtkDemo
|
|||
{
|
||||
public DemoButtonBox () : base ("Button Boxes")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.BorderWidth = 10;
|
||||
BorderWidth = 10;
|
||||
|
||||
// Add Vertical Box
|
||||
VBox mainVbox = new VBox (false,0);
|
||||
this.Add (mainVbox);
|
||||
Add (mainVbox);
|
||||
|
||||
// Add Horizontal Frame
|
||||
Frame horizontalFrame = new Frame ("Horizontal Button Boxes");
|
||||
mainVbox.PackStart (horizontalFrame);
|
||||
mainVbox.PackStart (horizontalFrame, true, true, 10);
|
||||
VBox vbox = new VBox (false, 0);
|
||||
vbox.BorderWidth = 10;
|
||||
horizontalFrame.Add (vbox);
|
||||
|
||||
// Pack Buttons
|
||||
vbox.PackStart(CreateButtonBox (true, "Spread (spacing 40)", 40, 85, 20, ButtonBoxStyle.Spread));
|
||||
vbox.PackStart(CreateButtonBox (true, "Edge (spacing 30)", 30, 85, 20, ButtonBoxStyle.Edge));
|
||||
vbox.PackStart(CreateButtonBox (true, "Start (spacing 20)", 20, 85, 20, ButtonBoxStyle.Start));
|
||||
vbox.PackStart(CreateButtonBox (true, "End (spacing 10)", 10, 85, 20, ButtonBoxStyle.End));
|
||||
vbox.PackStart (CreateButtonBox (true, "Spread", 40, ButtonBoxStyle.Spread), true, true, 0);
|
||||
vbox.PackStart (CreateButtonBox (true, "Edge", 40, ButtonBoxStyle.Edge), true, true, 5);
|
||||
vbox.PackStart (CreateButtonBox (true, "Start", 40, ButtonBoxStyle.Start), true, true, 5);
|
||||
vbox.PackStart (CreateButtonBox (true, "End", 40, ButtonBoxStyle.End), true, true, 5);
|
||||
|
||||
// Add Vertical Frame
|
||||
Frame verticalFrame = new Frame ("Vertical Button Boxes");
|
||||
mainVbox.PackStart (verticalFrame);
|
||||
mainVbox.PackStart (verticalFrame, true, true, 10);
|
||||
HBox hbox = new HBox (false, 0);
|
||||
hbox.BorderWidth = 10;
|
||||
verticalFrame.Add (hbox);
|
||||
|
||||
// Pack Buttons
|
||||
hbox.PackStart(CreateButtonBox (false, "Spread (spacing 5)", 5, 85, 20, ButtonBoxStyle.Spread));
|
||||
hbox.PackStart(CreateButtonBox (false, "Edge (spacing 30)", 30, 85, 20, ButtonBoxStyle.Edge));
|
||||
hbox.PackStart(CreateButtonBox (false, "Start (spacing 20)", 20, 85, 20, ButtonBoxStyle.Start));
|
||||
hbox.PackStart(CreateButtonBox (false, "End (spacing 20)", 20, 85, 20, ButtonBoxStyle.End));
|
||||
hbox.PackStart(CreateButtonBox (false, "Spread", 30, ButtonBoxStyle.Spread), true, true, 0);
|
||||
hbox.PackStart(CreateButtonBox (false, "Edge", 30, ButtonBoxStyle.Edge), true, true, 5);
|
||||
hbox.PackStart(CreateButtonBox (false, "Start", 30, ButtonBoxStyle.Start), true, true, 5);
|
||||
hbox.PackStart(CreateButtonBox (false, "End", 30, ButtonBoxStyle.End), true, true, 5);
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
// Create a Button Box with the specified parameters
|
||||
private Frame CreateButtonBox (bool horizontal, string title, int spacing, int childW , int childH , ButtonBoxStyle layout)
|
||||
private Frame CreateButtonBox (bool horizontal, string title, int spacing, ButtonBoxStyle layout)
|
||||
{
|
||||
Frame frame = new Frame (title);
|
||||
Gtk.ButtonBox bbox ;
|
||||
|
||||
if (horizontal == true)
|
||||
{
|
||||
if (horizontal)
|
||||
bbox = new Gtk.HButtonBox ();
|
||||
}
|
||||
else
|
||||
{
|
||||
bbox = new Gtk.VButtonBox ();
|
||||
}
|
||||
|
||||
bbox.BorderWidth = 5;
|
||||
frame.Add (bbox);
|
||||
|
@ -79,21 +66,17 @@ namespace GtkDemo
|
|||
bbox.Layout = layout;
|
||||
bbox.Spacing = spacing;
|
||||
|
||||
Button buttonOk = new Button (Stock.Ok);
|
||||
bbox.Add (buttonOk);
|
||||
Button buttonCancel = new Button (Stock.Cancel);
|
||||
bbox.Add (buttonCancel);
|
||||
Button buttonHelp = new Button (Stock.Help);
|
||||
bbox.Add (buttonHelp);
|
||||
bbox.Add (new Button (Stock.Ok));
|
||||
bbox.Add (new Button (Stock.Cancel));
|
||||
bbox.Add (new Button (Stock.Help));
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
*
|
||||
* GtkClipboard is used for clipboard handling. This demo shows how to
|
||||
* copy and paste text to and from the clipboard.
|
||||
*
|
||||
* This is actually from gtk+ 2.6's gtk-demo, but doesn't use any 2.6
|
||||
* functionality
|
||||
*/
|
||||
using System;
|
||||
using Gtk;
|
||||
|
@ -15,8 +18,6 @@ namespace GtkDemo
|
|||
|
||||
public DemoClipboard () : base ("Demo Clipboard")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (OnDelete);
|
||||
|
||||
VBox vbox = new VBox ();
|
||||
vbox.BorderWidth = 8;
|
||||
Label copyLabel = new Label ("\"Copy\" will copy the text\nin the entry to the clipboard");
|
||||
|
@ -27,8 +28,8 @@ namespace GtkDemo
|
|||
vbox.PackStart (pasteLabel, false, false, 0);
|
||||
vbox.PackStart (CreatePasteBox (), false, false, 0);
|
||||
|
||||
this.Add (vbox);
|
||||
this.ShowAll ();
|
||||
Add (vbox);
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
HBox CreateCopyBox ()
|
||||
|
@ -37,7 +38,7 @@ namespace GtkDemo
|
|||
hbox.BorderWidth = 8;
|
||||
copyEntry = new Entry ();
|
||||
Button copyButton = new Button (Stock.Copy);
|
||||
copyButton.Clicked += new EventHandler (OnCopyClicked);
|
||||
copyButton.Clicked += new EventHandler (CopyClicked);
|
||||
hbox.PackStart (copyEntry, true, true, 0);
|
||||
hbox.PackStart (copyButton, false, false, 0);
|
||||
return hbox;
|
||||
|
@ -49,30 +50,33 @@ namespace GtkDemo
|
|||
hbox.BorderWidth = 8;
|
||||
pasteEntry = new Entry ();
|
||||
Button pasteButton = new Button (Stock.Paste);
|
||||
pasteButton.Clicked += new EventHandler (OnPasteClicked);
|
||||
pasteButton.Clicked += new EventHandler (PasteClicked);
|
||||
hbox.PackStart (pasteEntry, true, true, 0);
|
||||
hbox.PackStart (pasteButton, false, false, 0);
|
||||
return hbox;
|
||||
}
|
||||
|
||||
void OnCopyClicked (object sender, EventArgs a)
|
||||
void CopyClicked (object obj, EventArgs args)
|
||||
{
|
||||
Clipboard clipboard = copyEntry.GetClipboard (Gdk.Selection.Clipboard);
|
||||
clipboard.SetText (copyEntry.Text);
|
||||
}
|
||||
|
||||
void OnPasteClicked (object sender, EventArgs a)
|
||||
void PasteClicked (object obj, EventArgs args)
|
||||
{
|
||||
Clipboard clipboard = pasteEntry.GetClipboard (Gdk.Selection.Clipboard);
|
||||
pasteEntry.Text = clipboard.WaitForText ();
|
||||
clipboard.RequestText (new ClipboardTextReceivedFunc (PasteReceived));
|
||||
}
|
||||
|
||||
void OnDelete (object sender, DeleteEventArgs a)
|
||||
void PasteReceived (Clipboard clipboard, string text)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
a.RetVal = true;
|
||||
}
|
||||
}
|
||||
pasteEntry.Text = text;
|
||||
}
|
||||
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
//
|
||||
// DemoColorSelection.cs, port of colorsel.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
/* Color Selector
|
||||
*
|
||||
* GtkColorSelection lets the user choose a color. GtkColorSelectionDialog is
|
||||
|
@ -26,11 +19,10 @@ namespace GtkDemo
|
|||
|
||||
public DemoColorSelection () : base ("Color Selection")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.BorderWidth = 8;
|
||||
BorderWidth = 8;
|
||||
VBox vbox = new VBox (false,8);
|
||||
vbox.BorderWidth = 8;
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
// Create the color swatch area
|
||||
Frame frame = new Frame ();
|
||||
|
@ -52,14 +44,13 @@ namespace GtkDemo
|
|||
alignment.Add (button);
|
||||
vbox.PackStart (alignment);
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Expose callback for the drawing area
|
||||
|
@ -84,8 +75,7 @@ namespace GtkDemo
|
|||
colorSelectionDialog.ColorSelection.CurrentColor = color;
|
||||
colorSelectionDialog.ColorSelection.HasPalette = true;
|
||||
|
||||
if (colorSelectionDialog.Run () == (int) ResponseType.Ok)
|
||||
{
|
||||
if (colorSelectionDialog.Run () == (int) ResponseType.Ok) {
|
||||
Gdk.Color selected = colorSelectionDialog.ColorSelection.CurrentColor;
|
||||
drawingArea.ModifyBg (StateType.Normal, selected);
|
||||
}
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
//
|
||||
// DemoDialog.cs, port of dialog.c from gtk-demo
|
||||
//
|
||||
// Author Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
/* Dialog and Message Boxes
|
||||
*
|
||||
* Dialog widgets are used to pop up a transient window for user feedback.
|
||||
|
@ -23,11 +16,10 @@ namespace GtkDemo
|
|||
|
||||
public DemoDialog () : base ("Dialogs")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler(WindowDelete);
|
||||
this.BorderWidth = 8;
|
||||
BorderWidth = 8;
|
||||
|
||||
Frame frame = new Frame ("Dialogs");
|
||||
this.Add (frame);
|
||||
Add (frame);
|
||||
|
||||
VBox vbox = new VBox (false, 8);
|
||||
vbox.BorderWidth = 8;
|
||||
|
@ -39,7 +31,7 @@ namespace GtkDemo
|
|||
Button button = new Button ("_Message Dialog");
|
||||
button.Clicked += new EventHandler (MessageDialogClicked);
|
||||
hbox.PackStart (button, false, false, 0);
|
||||
vbox.PackStart (new HSeparator());
|
||||
vbox.PackStart (new HSeparator(), false, false, 0);
|
||||
|
||||
// Interactive dialog
|
||||
hbox = new HBox (false, 8);
|
||||
|
@ -54,7 +46,7 @@ namespace GtkDemo
|
|||
Table table = new Table (2, 2, false);
|
||||
table.RowSpacing = 4;
|
||||
table.ColumnSpacing = 4;
|
||||
hbox.PackStart (table);
|
||||
hbox.PackStart (table, false, false, 0);
|
||||
|
||||
Label label = new Label ("_Entry1");
|
||||
table.Attach (label, 0, 1, 0, 1);
|
||||
|
@ -68,14 +60,13 @@ namespace GtkDemo
|
|||
table.Attach (entry2, 1, 2, 1, 2);
|
||||
label.MnemonicWidget = entry2;
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private int i = 1;
|
||||
|
@ -85,7 +76,7 @@ namespace GtkDemo
|
|||
DialogFlags.Modal | DialogFlags.DestroyWithParent,
|
||||
MessageType.Info,
|
||||
ButtonsType.Ok,
|
||||
"This message box has been popped up the following\n number of times:\n\n {0:D} ",
|
||||
"This message box has been popped up the following\nnumber of times:\n\n {0}",
|
||||
i)) {
|
||||
dialog.Run ();
|
||||
dialog.Hide ();
|
||||
|
@ -96,16 +87,22 @@ namespace GtkDemo
|
|||
|
||||
private void InteractiveDialogClicked (object o, EventArgs args)
|
||||
{
|
||||
Dialog dialog = new Dialog ("Interactive Dialog", this, DialogFlags.Modal | DialogFlags.DestroyWithParent, Gtk.Stock.Ok, ResponseType.Ok, "_Non-stock Button", ResponseType.Cancel);
|
||||
Dialog dialog = new Dialog ("Interactive Dialog", this,
|
||||
DialogFlags.Modal | DialogFlags.DestroyWithParent,
|
||||
Gtk.Stock.Ok, ResponseType.Ok,
|
||||
"_Non-stock Button", ResponseType.Cancel);
|
||||
|
||||
HBox hbox = new HBox (false, 8);
|
||||
hbox.BorderWidth = 8;
|
||||
dialog.VBox.PackStart (hbox, false, false, 0);
|
||||
|
||||
Image stock = new Image (Stock.DialogQuestion, IconSize.Dialog);
|
||||
hbox.PackStart (stock, false, false, 0);
|
||||
|
||||
Table table = new Table (2, 2, false);
|
||||
table.RowSpacing = 4;
|
||||
table.ColumnSpacing = 4;
|
||||
hbox.PackStart (table, false, false, 0);
|
||||
hbox.PackStart (table, true, true, 0);
|
||||
|
||||
Label label = new Label ("_Entry1");
|
||||
table.Attach (label, 0, 1, 0, 1);
|
||||
|
@ -134,4 +131,3 @@ namespace GtkDemo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,12 +1,3 @@
|
|||
//
|
||||
// DemoDrawingArea.cs, port of drawingarea.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
// Rachel Hestilow <hestilow@ximian.com>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
//
|
||||
|
||||
/* Drawing Area
|
||||
*
|
||||
* GtkDrawingArea is a blank area where you can draw custom displays
|
||||
|
@ -31,109 +22,101 @@ namespace GtkDemo
|
|||
[Demo ("Drawing Area", "DemoDrawingArea.cs")]
|
||||
public class DemoDrawingArea : Gtk.Window
|
||||
{
|
||||
private static Pixmap pixmap = null;
|
||||
private static DrawingArea drawingArea;
|
||||
private static DrawingArea drawingArea1;
|
||||
private Pixmap pixmap = null;
|
||||
|
||||
public DemoDrawingArea () : base ("Drawing Area")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.BorderWidth = 8;
|
||||
BorderWidth = 8;
|
||||
|
||||
VBox vbox = new VBox (false, 8);
|
||||
vbox.BorderWidth = 8;
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
// Create the checkerboard area
|
||||
Label label = new Label ();
|
||||
label.Markup = "<u>Checkerboard pattern</u>";
|
||||
Label label = new Label ("<u>Checkerboard pattern</u>");
|
||||
label.UseMarkup = true;
|
||||
vbox.PackStart (label, false, false, 0);
|
||||
|
||||
Frame frame = new Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
vbox.PackStart (frame, true, true, 0);
|
||||
|
||||
drawingArea = new DrawingArea ();
|
||||
DrawingArea da = new DrawingArea ();
|
||||
// set a minimum size
|
||||
drawingArea.SetSizeRequest (100,100);
|
||||
frame.Add (drawingArea);
|
||||
drawingArea.ExposeEvent += new ExposeEventHandler (CheckerboardExpose);
|
||||
da.SetSizeRequest (100,100);
|
||||
frame.Add (da);
|
||||
da.ExposeEvent += new ExposeEventHandler (CheckerboardExpose);
|
||||
|
||||
// Create the scribble area
|
||||
Label label1 = new Label ("<u>Scribble area</u>");
|
||||
label1.UseMarkup = true;
|
||||
vbox.PackStart (label1, false, false, 0);
|
||||
label = new Label ("<u>Scribble area</u>");
|
||||
label.UseMarkup = true;
|
||||
vbox.PackStart (label, false, false, 0);
|
||||
|
||||
Frame frame1 = new Frame ();
|
||||
frame1.ShadowType = ShadowType.In;
|
||||
vbox.PackStart (frame1, true, true, 0);
|
||||
frame = new Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
vbox.PackStart (frame, true, true, 0);
|
||||
|
||||
da = new DrawingArea ();
|
||||
// set a minimum size
|
||||
da.SetSizeRequest (100, 100);
|
||||
frame.Add (da);
|
||||
|
||||
drawingArea1 = new DrawingArea ();
|
||||
// set a minimun size
|
||||
drawingArea1.SetSizeRequest (100, 100);
|
||||
frame1.Add (drawingArea1);
|
||||
// Signals used to handle backing pixmap
|
||||
drawingArea1.ExposeEvent += new ExposeEventHandler (ScribbleExpose);
|
||||
drawingArea1.ConfigureEvent += new ConfigureEventHandler (ScribbleConfigure);
|
||||
da.ExposeEvent += new ExposeEventHandler (ScribbleExpose);
|
||||
da.ConfigureEvent += new ConfigureEventHandler (ScribbleConfigure);
|
||||
|
||||
// Event signals
|
||||
drawingArea1.MotionNotifyEvent += new MotionNotifyEventHandler (ScribbleMotionNotify);
|
||||
drawingArea1.ButtonPressEvent += new ButtonPressEventHandler (ScribbleButtonPress);
|
||||
da.MotionNotifyEvent += new MotionNotifyEventHandler (ScribbleMotionNotify);
|
||||
da.ButtonPressEvent += new ButtonPressEventHandler (ScribbleButtonPress);
|
||||
|
||||
|
||||
// Ask to receive events the drawing area doesn't normally
|
||||
// subscribe to
|
||||
|
||||
drawingArea1.Events = EventMask.LeaveNotifyMask | EventMask.ButtonPressMask |
|
||||
da.Events |= EventMask.LeaveNotifyMask | EventMask.ButtonPressMask |
|
||||
EventMask.PointerMotionMask | EventMask.PointerMotionHintMask;
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CheckerboardExpose (object o, ExposeEventArgs args)
|
||||
{
|
||||
|
||||
// Defining the size of the Checks
|
||||
const int CheckSize = 10;
|
||||
const int Spacing = 2;
|
||||
|
||||
// Defining the color of the Checks
|
||||
DrawingArea da = o as DrawingArea;
|
||||
|
||||
// It would be a bit more efficient to keep these
|
||||
// GC's around instead of recreating on each expose, but
|
||||
// this is the lazy/slow way.
|
||||
Gdk.GC gc1 = new Gdk.GC (da.GdkWindow);
|
||||
gc1.RgbFgColor = new Gdk.Color (117, 0, 117);
|
||||
|
||||
Gdk.GC gc2 = new Gdk.GC (da.GdkWindow);
|
||||
gc2.RgbFgColor = new Gdk.Color (255, 255, 255);
|
||||
|
||||
int i, j, xcount, ycount;
|
||||
Gdk.GC gc, gc1, gc2;
|
||||
Gdk.Color color = new Gdk.Color ();
|
||||
EventExpose eventExpose = args.Event;
|
||||
Gdk.Window window = eventExpose.Window;
|
||||
gc1 = new Gdk.GC (window);
|
||||
|
||||
color.Red = 30000;
|
||||
color.Green = 0;
|
||||
color.Blue = 30000;
|
||||
gc1.RgbFgColor = color;
|
||||
|
||||
gc2 = new Gdk.GC (window);
|
||||
color.Red = 65535;
|
||||
color.Green = 65535;
|
||||
color.Blue = 65535;
|
||||
gc2.RgbFgColor = color;
|
||||
Gdk.Rectangle alloc = da.Allocation;
|
||||
|
||||
// Start redrawing the Checkerboard
|
||||
xcount = 0;
|
||||
i = Spacing;
|
||||
while (i < drawingArea.Allocation.Width){
|
||||
while (i < alloc.Width) {
|
||||
j = Spacing;
|
||||
ycount = xcount % 2; // start with even/odd depending on row
|
||||
while (j < drawingArea.Allocation.Height){
|
||||
gc = new Gdk.GC (window);
|
||||
if (ycount % 2 != 0){
|
||||
gc = gc1;}
|
||||
else{
|
||||
gc = gc2;}
|
||||
window.DrawRectangle(gc, true, i, j, CheckSize, CheckSize);
|
||||
while (j < alloc.Height) {
|
||||
Gdk.GC gc;
|
||||
if (ycount % 2 != 0)
|
||||
gc = gc1;
|
||||
else
|
||||
gc = gc2;
|
||||
da.GdkWindow.DrawRectangle (gc, true, i, j,
|
||||
CheckSize, CheckSize);
|
||||
|
||||
j += CheckSize + Spacing;
|
||||
++ycount;
|
||||
|
@ -141,6 +124,7 @@ namespace GtkDemo
|
|||
i += CheckSize + Spacing;
|
||||
++xcount;
|
||||
}
|
||||
|
||||
// return true because we've handled this event, so no
|
||||
// further processing is required.
|
||||
args.RetVal = true;
|
||||
|
@ -148,35 +132,32 @@ namespace GtkDemo
|
|||
|
||||
private void ScribbleExpose (object o, ExposeEventArgs args)
|
||||
{
|
||||
Widget widget = o as Widget;
|
||||
Gdk.Window window = widget.GdkWindow;
|
||||
Rectangle area = args.Event.Area;
|
||||
|
||||
// We use the "ForegroundGC" for the widget since it already exists,
|
||||
// but honestly any GC would work. The only thing to worry about
|
||||
// is whether the GC has an inappropriate clip region set.
|
||||
|
||||
EventExpose eventExpose = args.Event;
|
||||
Gdk.Window window = eventExpose.Window;
|
||||
Rectangle area = eventExpose.Area;
|
||||
|
||||
window.DrawDrawable (drawingArea1.Style.ForegroundGC(StateType.Normal),
|
||||
window.DrawDrawable (widget.Style.ForegroundGC (StateType.Normal),
|
||||
pixmap,
|
||||
area.X, area.Y,
|
||||
area.X, area.Y,
|
||||
area.Width, area.Height);
|
||||
args.RetVal = false;
|
||||
}
|
||||
|
||||
// Create a new pixmap of the appropriate size to store our scribbles
|
||||
private void ScribbleConfigure (object o, ConfigureEventArgs args)
|
||||
{
|
||||
EventConfigure eventConfigure = args.Event;
|
||||
Gdk.Window window = eventConfigure.Window;
|
||||
Rectangle allocation = drawingArea1.Allocation;
|
||||
pixmap = new Pixmap (window,
|
||||
allocation.Width,
|
||||
allocation.Height,
|
||||
-1);
|
||||
Widget widget = o as Widget;
|
||||
Rectangle allocation = widget.Allocation;
|
||||
|
||||
pixmap = new Pixmap (widget.GdkWindow, allocation.Width, allocation.Height, -1);
|
||||
|
||||
// Initialize the pixmap to white
|
||||
pixmap.DrawRectangle (drawingArea1.Style.WhiteGC, true, 0, 0,
|
||||
pixmap.DrawRectangle (widget.Style.WhiteGC, true, 0, 0,
|
||||
allocation.Width, allocation.Height);
|
||||
|
||||
// We've handled the configure event, no need for further processing.
|
||||
args.RetVal = true;
|
||||
}
|
||||
|
@ -184,59 +165,52 @@ namespace GtkDemo
|
|||
private void ScribbleMotionNotify (object o, MotionNotifyEventArgs args)
|
||||
{
|
||||
|
||||
// paranoia check, in case we haven't gotten a configure event
|
||||
if (pixmap == null)
|
||||
return;
|
||||
|
||||
// This call is very important; it requests the next motion event.
|
||||
// If you don't call Window.GetPointer() you'll only get
|
||||
// a single motion event. The reason is that we specified
|
||||
// PointerMotionHintMask in drawingArea1.Events.
|
||||
// If we hadn't specified that, we could just use ExposeEvent.x, ExposeEvent.y
|
||||
// as the pointer location. But we'd also get deluged in events.
|
||||
// By requesting the next event as we handle the current one,
|
||||
// we avoid getting a huge number of events faster than we
|
||||
// can cope.
|
||||
// If you don't call Window.GetPointer() you'll only get a single
|
||||
// motion event. The reason is that we specified PointerMotionHintMask
|
||||
// in widget.Events. If we hadn't specified that, we could just use
|
||||
// args.Event.X, args.Event.Y as the pointer location. But we'd also
|
||||
// get deluged in events. By requesting the next event as we handle
|
||||
// the current one, we avoid getting a huge number of events faster
|
||||
// than we can cope.
|
||||
|
||||
int x, y;
|
||||
ModifierType state;
|
||||
EventMotion ev = args.Event;
|
||||
Gdk.Window window = ev.Window;
|
||||
args.Event.Window.GetPointer (out x, out y, out state);
|
||||
|
||||
if (ev.IsHint) {
|
||||
ModifierType s;
|
||||
window.GetPointer (out x, out y, out s);
|
||||
state = s;
|
||||
} else {
|
||||
x = (int) ev.X;
|
||||
y = (int) ev.Y;
|
||||
state = (ModifierType) ev.State;
|
||||
}
|
||||
if ((state & ModifierType.Button1Mask) != 0)
|
||||
DrawBrush (o as Widget, x, y);
|
||||
|
||||
if ((state & ModifierType.Button1Mask) != 0 && pixmap != null)
|
||||
DrawBrush (x, y);
|
||||
// We've handled it, stop processing
|
||||
args.RetVal = true;
|
||||
}
|
||||
|
||||
// Draw a rectangle on the screen
|
||||
static void DrawBrush (double x, double y)
|
||||
private void DrawBrush (Widget widget, double x, double y)
|
||||
{
|
||||
Rectangle update_rect = new Rectangle ();
|
||||
update_rect.X = (int) x - 3;
|
||||
update_rect.Y = (int) y - 3;
|
||||
update_rect.Width = 6;
|
||||
update_rect.Height = 6;
|
||||
Rectangle update_rect = new Rectangle ((int)x - 3, (int)y - 3, 6, 6);
|
||||
|
||||
// Paint to the pixmap, where we store our state
|
||||
pixmap.DrawRectangle (drawingArea1.Style.BlackGC, true,
|
||||
pixmap.DrawRectangle (widget.Style.BlackGC, true,
|
||||
update_rect.X, update_rect.Y,
|
||||
update_rect.Width, update_rect.Height);
|
||||
drawingArea1.QueueDrawArea (update_rect.X, update_rect.Y,
|
||||
update_rect.Width, update_rect.Height);
|
||||
widget.GdkWindow.InvalidateRect (update_rect, false);
|
||||
}
|
||||
|
||||
private void ScribbleButtonPress (object o, ButtonPressEventArgs args)
|
||||
{
|
||||
// paranoia check, in case we haven't gotten a configure event
|
||||
if (pixmap == null)
|
||||
return;
|
||||
|
||||
EventButton ev = args.Event;
|
||||
if (ev.Button == 1 && pixmap != null)
|
||||
DrawBrush (ev.X, ev.Y);
|
||||
if (ev.Button == 1)
|
||||
DrawBrush (o as Widget, ev.X, ev.Y);
|
||||
|
||||
// We've handled the event, stop processing
|
||||
args.RetVal = true;
|
||||
}
|
||||
|
|
|
@ -1,11 +1,3 @@
|
|||
//
|
||||
// DemoEditableCells.cs, port of appwindow.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
|
||||
/* Tree View/Editable Cells
|
||||
*
|
||||
* This demo demonstrates the use of editable cells in a Gtk.TreeView. If
|
||||
|
@ -27,25 +19,29 @@ namespace GtkDemo
|
|||
private TreeView treeView;
|
||||
private ArrayList articles;
|
||||
|
||||
public DemoEditableCells () : base ("Color Selection")
|
||||
public DemoEditableCells () : base ("Shopping list")
|
||||
{
|
||||
this.SetDefaultSize (320, 200);
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
SetDefaultSize (320, 200);
|
||||
BorderWidth = 5;
|
||||
|
||||
VBox vbox = new VBox (false, 5);
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
vbox.PackStart (new Label ("Shopping list (you can edit the cells!)"), false, false, 0);
|
||||
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow (null, null);
|
||||
scrolledWindow.ShadowType = ShadowType.In;
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow ();
|
||||
scrolledWindow.ShadowType = ShadowType.EtchedIn;
|
||||
scrolledWindow.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vbox.PackStart (scrolledWindow);
|
||||
vbox.PackStart (scrolledWindow, true, true, 0);
|
||||
|
||||
// create model
|
||||
store = CreateModel ();
|
||||
|
||||
// create tree view
|
||||
treeView = new TreeView ();
|
||||
CreateModel ();
|
||||
treeView.Model = store ;
|
||||
treeView = new TreeView (store);
|
||||
treeView.RulesHint = true;
|
||||
treeView.Selection.Mode = SelectionMode.Single;
|
||||
|
||||
AddColumns ();
|
||||
scrolledWindow.Add (treeView);
|
||||
|
||||
|
@ -61,17 +57,17 @@ namespace GtkDemo
|
|||
button.Clicked += new EventHandler (RemoveItem);
|
||||
hbox.PackStart (button, true, true, 0);
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void AddColumns ()
|
||||
{
|
||||
CellRendererText renderer;
|
||||
|
||||
// number column
|
||||
renderer = new CellRendererText ();
|
||||
renderer.Edited += new EditedHandler (NumberCellEdited);
|
||||
renderer.Editable = true;
|
||||
// renderer.Data ("column", (int) Column.Number);
|
||||
treeView.AppendColumn ("Number", renderer,
|
||||
"text", (int) Column.Number);
|
||||
|
||||
|
@ -79,89 +75,88 @@ namespace GtkDemo
|
|||
renderer = new CellRendererText ();
|
||||
renderer.Edited += new EditedHandler (TextCellEdited);
|
||||
renderer.Editable = true;
|
||||
// renderer.Data ("column", (int) Column.Product);
|
||||
treeView.AppendColumn ("Product", renderer ,
|
||||
"text", (int) Column.Product);
|
||||
}
|
||||
|
||||
private void CreateModel ()
|
||||
private ListStore CreateModel ()
|
||||
{
|
||||
// create array
|
||||
articles = new ArrayList ();
|
||||
AddItems ();
|
||||
|
||||
// create list store
|
||||
store = new ListStore (typeof (int), typeof (string), typeof (bool));
|
||||
ListStore store = new ListStore (typeof (int), typeof (string), typeof (bool));
|
||||
|
||||
// add items
|
||||
foreach (Item item in articles)
|
||||
store.AppendValues (item.Number, item.Product, item.Editable);
|
||||
store.AppendValues (item.Number, item.Product);
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
private void AddItems ()
|
||||
{
|
||||
Item foo;
|
||||
|
||||
foo = new Item (3, "bottles of coke", true);
|
||||
foo = new Item (3, "bottles of coke");
|
||||
articles.Add (foo);
|
||||
|
||||
foo = new Item (5, "packages of noodles", true);
|
||||
foo = new Item (5, "packages of noodles");
|
||||
articles.Add (foo);
|
||||
|
||||
foo = new Item (2, "packages of chocolate chip cookies", true);
|
||||
foo = new Item (2, "packages of chocolate chip cookies");
|
||||
articles.Add (foo);
|
||||
|
||||
foo = new Item (1, "can of vanilla ice cream", true);
|
||||
foo = new Item (1, "can vanilla ice cream");
|
||||
articles.Add (foo);
|
||||
|
||||
foo = new Item (6, "eggs", true);
|
||||
foo = new Item (6, "eggs");
|
||||
articles.Add (foo);
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void NumberCellEdited (object o, EditedArgs args)
|
||||
{
|
||||
int i;
|
||||
Item foo;
|
||||
TreePath path = new TreePath (args.Path);
|
||||
TreeIter iter;
|
||||
store.GetIter (out iter, path);
|
||||
int i = path.Indices[0];
|
||||
|
||||
try
|
||||
{
|
||||
i = Convert.ToInt32 (args.Path);
|
||||
Item foo;
|
||||
try {
|
||||
foo = (Item) articles[i];
|
||||
foo.Number = int.Parse (args.NewText);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine (e.ToString ());
|
||||
} catch (Exception e) {
|
||||
Console.WriteLine (e);
|
||||
return;
|
||||
}
|
||||
|
||||
TreeIter iter;
|
||||
store.GetIterFromString (out iter, args.Path);
|
||||
store.SetValue (iter, (int) Column.Number, foo.Number);
|
||||
}
|
||||
|
||||
|
||||
private void TextCellEdited (object o, EditedArgs args)
|
||||
{
|
||||
int i = int.Parse (args.Path);
|
||||
TreePath path = new TreePath (args.Path);
|
||||
TreeIter iter;
|
||||
store.GetIter (out iter, path);
|
||||
int i = path.Indices[0];
|
||||
|
||||
Item foo = (Item) articles[i];
|
||||
foo.Product = args.NewText;
|
||||
TreeIter iter;
|
||||
store.GetIterFromString (out iter, args.Path);
|
||||
store.SetValue (iter, (int) Column.Product, foo.Product);
|
||||
}
|
||||
|
||||
private void AddItem (object o, EventArgs args)
|
||||
{
|
||||
Item foo = new Item (0, "Description here", true);
|
||||
Item foo = new Item (0, "Description here");
|
||||
articles.Add (foo);
|
||||
store.AppendValues (foo.Number, foo.Product, foo.Editable);
|
||||
store.AppendValues (foo.Number, foo.Product);
|
||||
}
|
||||
|
||||
private void RemoveItem (object o, EventArgs args)
|
||||
|
@ -169,47 +164,38 @@ namespace GtkDemo
|
|||
TreeIter iter;
|
||||
TreeModel model;
|
||||
|
||||
if (treeView.Selection.GetSelected (out model, out iter))
|
||||
{
|
||||
int position = int.Parse (store.GetPath (iter).ToString ());
|
||||
if (treeView.Selection.GetSelected (out model, out iter)) {
|
||||
int position = store.GetPath (iter).Indices[0];
|
||||
store.Remove (ref iter);
|
||||
articles.RemoveAt (position);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum Column
|
||||
enum Column
|
||||
{
|
||||
Number,
|
||||
Product,
|
||||
Editable,
|
||||
Product
|
||||
};
|
||||
|
||||
public struct Item
|
||||
struct Item
|
||||
{
|
||||
public int Number {
|
||||
get {return NumberItem;}
|
||||
set {NumberItem = value;}
|
||||
get { return number; }
|
||||
set { number = value; }
|
||||
}
|
||||
public string Product {
|
||||
get {return ProductItem;}
|
||||
set {ProductItem = value;}
|
||||
get { return product; }
|
||||
set { product = value; }
|
||||
}
|
||||
|
||||
public bool Editable {
|
||||
get {return EditableItem;}
|
||||
set {EditableItem = value;}
|
||||
}
|
||||
private int number;
|
||||
private string product;
|
||||
|
||||
private int NumberItem;
|
||||
private string ProductItem;
|
||||
private bool EditableItem;
|
||||
|
||||
public Item (int number, string product, bool editable)
|
||||
public Item (int number, string product)
|
||||
{
|
||||
NumberItem = number;
|
||||
ProductItem = product;
|
||||
EditableItem = editable;
|
||||
this.number = number;
|
||||
this.product = product;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,25 +14,28 @@ namespace GtkDemo
|
|||
{
|
||||
public DemoEntryCompletion () : base ("Demo Entry Completion", null, DialogFlags.DestroyWithParent)
|
||||
{
|
||||
this.BorderWidth = 10;
|
||||
this.Resizable = false;
|
||||
Resizable = false;
|
||||
|
||||
VBox vbox = new VBox (false, 5);
|
||||
vbox.BorderWidth = 5;
|
||||
this.VBox.PackStart (vbox, true, true, 0);
|
||||
|
||||
Label label = new Label ("Completion demo, try writing <b>total</b> or <b>gnome</b> for example.");
|
||||
label.UseMarkup = true;
|
||||
this.VBox.PackStart (label, false, true, 0);
|
||||
vbox.PackStart (label, false, true, 0);
|
||||
|
||||
Entry entry = new Entry ();
|
||||
vbox.PackStart (entry, false, true, 0);
|
||||
|
||||
entry.Completion = new EntryCompletion ();
|
||||
entry.Completion.Model = CreateCompletionModel ();
|
||||
entry.Completion.TextColumn = 0;
|
||||
this.VBox.PackStart (entry, false, true, 0);
|
||||
|
||||
this.AddButton (Stock.Close, ResponseType.Close);
|
||||
AddButton (Stock.Close, ResponseType.Close);
|
||||
|
||||
this.ShowAll ();
|
||||
this.Run ();
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
ShowAll ();
|
||||
Run ();
|
||||
Destroy ();
|
||||
}
|
||||
|
||||
TreeModel CreateCompletionModel ()
|
||||
|
@ -47,4 +50,3 @@ namespace GtkDemo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,11 +14,12 @@ namespace GtkDemo
|
|||
{
|
||||
public DemoExpander () : base ("Demo Expander", null, DialogFlags.DestroyWithParent)
|
||||
{
|
||||
this.Resizable = false;
|
||||
this.BorderWidth = 10;
|
||||
Resizable = false;
|
||||
|
||||
VBox vbox = new VBox (false, 5);
|
||||
this.VBox.PackStart (vbox, true, true, 0);
|
||||
vbox.BorderWidth = 5;
|
||||
|
||||
vbox.PackStart (new Label ("Expander demo. Click on the triangle for details."), false, false, 0);
|
||||
|
||||
// Create the expander
|
||||
|
@ -26,12 +27,11 @@ namespace GtkDemo
|
|||
expander.Add (new Label ("Details can be shown or hidden."));
|
||||
vbox.PackStart (expander, false, false, 0);
|
||||
|
||||
this.AddButton (Stock.Close, ResponseType.Close);
|
||||
AddButton (Stock.Close, ResponseType.Close);
|
||||
|
||||
this.ShowAll ();
|
||||
this.Run ();
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
ShowAll ();
|
||||
Run ();
|
||||
Destroy ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,3 @@
|
|||
//
|
||||
// Author: John Luke <john.luke@gmail.com>
|
||||
// ported from gtk-demo in GTK+
|
||||
// Demonstrates HyperLinks in the TextView
|
||||
//
|
||||
|
||||
/* Text Widget/Hypertext
|
||||
*
|
||||
* Usually, tags modify the appearance of text in the view, e.g. making it
|
||||
|
@ -20,44 +14,30 @@ namespace GtkDemo
|
|||
[Demo ("Hyper Text", "DemoHyperText.cs", "Text Widget")]
|
||||
public class DemoHyperText : Gtk.Window
|
||||
{
|
||||
// FIXME: useless counter
|
||||
int uid = 0;
|
||||
bool hoveringOverLink = false;
|
||||
Gdk.Cursor handCursor, regularCursor;
|
||||
|
||||
public DemoHyperText () : base ("HyperText")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (OnWindowDelete);
|
||||
this.SetDefaultSize (450, 450);
|
||||
CreateCursors ();
|
||||
this.Add (CreateScrolledWindow ());
|
||||
this.ShowAll ();
|
||||
}
|
||||
|
||||
void CreateCursors ()
|
||||
{
|
||||
handCursor = new Gdk.Cursor (Gdk.CursorType.Hand2);
|
||||
regularCursor = new Gdk.Cursor (Gdk.CursorType.Xterm);
|
||||
}
|
||||
|
||||
ScrolledWindow CreateScrolledWindow ()
|
||||
{
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.Add (CreateTextView ());
|
||||
return sw;
|
||||
}
|
||||
SetDefaultSize (450, 450);
|
||||
|
||||
TextView CreateTextView ()
|
||||
{
|
||||
TextView view = new TextView ();
|
||||
view.WrapMode = WrapMode.Word;
|
||||
view.KeyPressEvent += new KeyPressEventHandler (OnKeyPress);
|
||||
view.MotionNotifyEvent += new MotionNotifyEventHandler (OnMotionNotify);
|
||||
view.VisibilityNotifyEvent += new VisibilityNotifyEventHandler (OnVisibilityNotify);
|
||||
view.ButtonReleaseEvent += new ButtonReleaseEventHandler (OnButtonRelease);
|
||||
view.KeyPressEvent += new KeyPressEventHandler (KeyPress);
|
||||
view.WidgetEventAfter += new WidgetEventAfterHandler (EventAfter);
|
||||
view.MotionNotifyEvent += new MotionNotifyEventHandler (MotionNotify);
|
||||
view.VisibilityNotifyEvent += new VisibilityNotifyEventHandler (VisibilityNotify);
|
||||
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.SetPolicy (Gtk.PolicyType.Automatic, Gtk.PolicyType.Automatic);
|
||||
Add (sw);
|
||||
sw.Add (view);
|
||||
|
||||
ShowPage (view.Buffer, 1);
|
||||
return view;
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
// Inserts a piece of text into the buffer, giving it the usual
|
||||
|
@ -66,7 +46,7 @@ namespace GtkDemo
|
|||
// as a link.
|
||||
void InsertLink (TextBuffer buffer, ref TextIter iter, string text, int page)
|
||||
{
|
||||
TextTag tag = new TextTag ("link" + uid++);
|
||||
TextTag tag = new TextTag (null);
|
||||
tag.Foreground = "blue";
|
||||
tag.Underline = Pango.Underline.Single;
|
||||
tag.PersistentData.Add ("page", page);
|
||||
|
@ -79,18 +59,15 @@ namespace GtkDemo
|
|||
void ShowPage (TextBuffer buffer, int page)
|
||||
{
|
||||
buffer.Text = "";
|
||||
TextIter iter = buffer.GetIterAtOffset (0);
|
||||
TextIter iter = buffer.StartIter;
|
||||
|
||||
if (page == 1)
|
||||
{
|
||||
if (page == 1) {
|
||||
buffer.Insert (ref iter, "Some text to show that simple ");
|
||||
InsertLink (buffer, ref iter, "hypertext", 3);
|
||||
buffer.Insert (ref iter, " can easily be realized with ");
|
||||
InsertLink (buffer, ref iter, "tags", 2);
|
||||
buffer.Insert (ref iter, ".");
|
||||
}
|
||||
else if (page == 2)
|
||||
{
|
||||
} else if (page == 2) {
|
||||
buffer.Insert (ref iter,
|
||||
"A tag is an attribute that can be applied to some range of text. " +
|
||||
"For example, a tag might be called \"bold\" and make the text inside " +
|
||||
|
@ -99,9 +76,7 @@ namespace GtkDemo
|
|||
"behavior of mouse and key presses, \"lock\" a range of text so the " +
|
||||
"user can't edit it, or countless other things.\n");
|
||||
InsertLink (buffer, ref iter, "Go back", 1);
|
||||
}
|
||||
else if (page == 3)
|
||||
{
|
||||
} else if (page == 3) {
|
||||
TextTag tag = buffer.TagTable.Lookup ("bold");
|
||||
if (tag == null) {
|
||||
tag = new TextTag ("bold");
|
||||
|
@ -121,11 +96,10 @@ namespace GtkDemo
|
|||
// by the data attached to it.
|
||||
void FollowIfLink (TextView view, TextIter iter)
|
||||
{
|
||||
foreach (TextTag tag in iter.Tags)
|
||||
{
|
||||
int page = (int) tag.PersistentData ["page"];
|
||||
if (page != 0)
|
||||
ShowPage (view.Buffer, page);
|
||||
foreach (TextTag tag in iter.Tags) {
|
||||
object page = tag.PersistentData ["page"];
|
||||
if (page is int)
|
||||
ShowPage (view.Buffer, (int)page);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -137,50 +111,30 @@ namespace GtkDemo
|
|||
bool hovering = false;
|
||||
TextIter iter = view.GetIterAtLocation (x, y);
|
||||
|
||||
foreach (TextTag tag in iter.Tags)
|
||||
{
|
||||
if (tag.PersistentData ["page"] != null && ((int) tag.PersistentData ["page"]) != 0) {
|
||||
foreach (TextTag tag in iter.Tags) {
|
||||
if (tag.PersistentData ["page"] is int) {
|
||||
hovering = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hovering != hoveringOverLink)
|
||||
{
|
||||
if (hovering != hoveringOverLink) {
|
||||
Gdk.Window window = view.GetWindow (Gtk.TextWindowType.Text);
|
||||
|
||||
hoveringOverLink = hovering;
|
||||
if (hoveringOverLink)
|
||||
view.GdkWindow.Cursor = handCursor;
|
||||
window.Cursor = handCursor;
|
||||
else
|
||||
view.GdkWindow.Cursor = regularCursor;
|
||||
window.Cursor = regularCursor;
|
||||
}
|
||||
}
|
||||
|
||||
[GLib.ConnectBefore]
|
||||
void OnButtonRelease (object sender, ButtonReleaseEventArgs a)
|
||||
{
|
||||
if (a.Event.Button != 1)
|
||||
return;
|
||||
|
||||
TextView view = sender as TextView;
|
||||
TextIter start, end, iter;
|
||||
int x, y;
|
||||
|
||||
view.Buffer.GetSelectionBounds (out start, out end);
|
||||
if (start.Offset != end.Offset)
|
||||
return;
|
||||
|
||||
view.WindowToBufferCoords (TextWindowType.Widget, (int) a.Event.X, (int) a.Event.Y, out x, out y);
|
||||
iter = view.GetIterAtLocation (x, y);
|
||||
|
||||
FollowIfLink (view, iter);
|
||||
}
|
||||
|
||||
// Links can be activated by pressing Enter.
|
||||
void OnKeyPress (object sender, KeyPressEventArgs a)
|
||||
void KeyPress (object sender, KeyPressEventArgs args)
|
||||
{
|
||||
TextView view = sender as TextView;
|
||||
|
||||
switch ((Gdk.Key) a.Event.KeyValue) {
|
||||
switch ((Gdk.Key) args.Event.KeyValue) {
|
||||
case Gdk.Key.Return:
|
||||
case Gdk.Key.KP_Enter:
|
||||
TextIter iter = view.Buffer.GetIterAtMark (view.Buffer.InsertMark);
|
||||
|
@ -191,19 +145,48 @@ namespace GtkDemo
|
|||
}
|
||||
}
|
||||
|
||||
// Links can also be activated by clicking.
|
||||
void EventAfter (object sender, WidgetEventAfterArgs args)
|
||||
{
|
||||
if (args.Event.Type != Gdk.EventType.ButtonRelease)
|
||||
return;
|
||||
|
||||
Gdk.EventButton evt = (Gdk.EventButton)args.Event;
|
||||
|
||||
if (evt.Button != 1)
|
||||
return;
|
||||
|
||||
TextView view = sender as TextView;
|
||||
TextIter start, end, iter;
|
||||
int x, y;
|
||||
|
||||
// we shouldn't follow a link if the user has selected something
|
||||
view.Buffer.GetSelectionBounds (out start, out end);
|
||||
if (start.Offset != end.Offset)
|
||||
return;
|
||||
|
||||
view.WindowToBufferCoords (TextWindowType.Widget, (int) evt.X, (int) evt.Y, out x, out y);
|
||||
iter = view.GetIterAtLocation (x, y);
|
||||
|
||||
FollowIfLink (view, iter);
|
||||
}
|
||||
|
||||
// Update the cursor image if the pointer moved.
|
||||
void OnMotionNotify (object sender, MotionNotifyEventArgs a)
|
||||
void MotionNotify (object sender, MotionNotifyEventArgs args)
|
||||
{
|
||||
TextView view = sender as TextView;
|
||||
int x, y;
|
||||
Gdk.ModifierType state;
|
||||
|
||||
view.WindowToBufferCoords (TextWindowType.Widget, (int) a.Event.X, (int) a.Event.Y, out x, out y);
|
||||
view.WindowToBufferCoords (TextWindowType.Widget, (int) args.Event.X, (int) args.Event.Y, out x, out y);
|
||||
SetCursorIfAppropriate (view, x, y);
|
||||
|
||||
view.GdkWindow.GetPointer (out x, out y, out state);
|
||||
}
|
||||
|
||||
// Also update the cursor image if the window becomes visible
|
||||
// (e.g. when a window covering it got iconified).
|
||||
void OnVisibilityNotify (object sender, VisibilityNotifyEventArgs a)
|
||||
void VisibilityNotify (object sender, VisibilityNotifyEventArgs a)
|
||||
{
|
||||
TextView view = sender as TextView;
|
||||
int wx, wy, bx, by;
|
||||
|
@ -211,15 +194,12 @@ namespace GtkDemo
|
|||
view.GetPointer (out wx, out wy);
|
||||
view.WindowToBufferCoords (TextWindowType.Widget, wx, wy, out bx, out by);
|
||||
SetCursorIfAppropriate (view, bx, by);
|
||||
|
||||
}
|
||||
|
||||
void OnWindowDelete (object sender, DeleteEventArgs a)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
a.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,12 +1,3 @@
|
|||
//
|
||||
// DemoImages.cs - port of images.c gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
//
|
||||
|
||||
|
||||
/* Images
|
||||
*
|
||||
* Gtk.Image is used to display an image; the image can be in a number of formats.
|
||||
|
@ -36,14 +27,13 @@ namespace GtkDemo
|
|||
private VBox vbox;
|
||||
BinaryReader imageStream;
|
||||
|
||||
public DemoImages () : base ("images")
|
||||
public DemoImages () : base ("Images")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.BorderWidth = 8;
|
||||
BorderWidth = 8;
|
||||
|
||||
vbox = new VBox (false, 8);
|
||||
vbox.BorderWidth = 8;
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
Gtk.Label label = new Gtk.Label ("<u>Image loaded from a file</u>");
|
||||
label.UseMarkup = true;
|
||||
|
@ -58,13 +48,13 @@ namespace GtkDemo
|
|||
alignment.Add (frame);
|
||||
vbox.PackStart (alignment, false, false, 0);
|
||||
|
||||
Gtk.Image image = new Gtk.Image (Gdk.Pixbuf.LoadFromResource ("gtk-logo-rgb.gif"));
|
||||
Gtk.Image image = Gtk.Image.LoadFromResource ("gtk-logo-rgb.gif");
|
||||
frame.Add (image);
|
||||
|
||||
// Animation
|
||||
label = new Gtk.Label ("<u>Animation loaded from a file</u>");
|
||||
label.UseMarkup = true;
|
||||
vbox.PackStart (label);
|
||||
vbox.PackStart (label, false, false, 0);
|
||||
|
||||
frame = new Gtk.Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
|
@ -73,13 +63,13 @@ namespace GtkDemo
|
|||
alignment.Add (frame);
|
||||
vbox.PackStart (alignment, false, false, 0);
|
||||
|
||||
image = new Gtk.Image (Gdk.Pixbuf.LoadFromResource ("floppybuddy.gif"));
|
||||
image = Gtk.Image.LoadFromResource ("floppybuddy.gif");
|
||||
frame.Add (image);
|
||||
|
||||
// Progressive
|
||||
label = new Gtk.Label ("<u>Progressive image loading</u>");
|
||||
label.UseMarkup = true;
|
||||
vbox.PackStart (label);
|
||||
vbox.PackStart (label, false, false, 0);
|
||||
|
||||
frame = new Gtk.Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
|
@ -90,7 +80,6 @@ namespace GtkDemo
|
|||
|
||||
// Create an empty image for now; the progressive loader
|
||||
// will create the pixbuf and fill it in.
|
||||
//
|
||||
|
||||
progressiveImage = new Gtk.Image ();
|
||||
frame.Add (progressiveImage);
|
||||
|
@ -102,41 +91,62 @@ namespace GtkDemo
|
|||
vbox.PackStart (button, false, false, 0);
|
||||
button.Toggled += new EventHandler (ToggleSensitivity);
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override void OnDestroyed ()
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
if (timeout_id != 0) {
|
||||
GLib.Source.Remove (timeout_id);
|
||||
timeout_id = 0;
|
||||
}
|
||||
|
||||
if (pixbufLoader != null) {
|
||||
pixbufLoader.Close ();
|
||||
pixbufLoader = null;
|
||||
}
|
||||
|
||||
if (imageStream != null) {
|
||||
imageStream.Close ();
|
||||
imageStream = null;
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void ToggleSensitivity (object o, EventArgs args)
|
||||
{
|
||||
ToggleButton toggle = o as ToggleButton;
|
||||
|
||||
Widget[] children = vbox.Children;
|
||||
foreach (Widget widget in children)
|
||||
foreach (Widget widget in children) {
|
||||
// don't disable our toggle
|
||||
if (widget.GetType () != o.GetType () )
|
||||
widget.Sensitive = !widget.Sensitive;
|
||||
if (widget != toggle)
|
||||
widget.Sensitive = !toggle.Active;
|
||||
}
|
||||
}
|
||||
|
||||
private uint timeout_id;
|
||||
private void StartProgressiveLoading ()
|
||||
{
|
||||
/* This is obviously totally contrived (we slow down loading
|
||||
* on purpose to show how incremental loading works).
|
||||
* The real purpose of incremental loading is the case where
|
||||
* you are reading data from a slow source such as the network.
|
||||
* The timeout simply simulates a slow data source by inserting
|
||||
* pauses in the reading process.
|
||||
*/
|
||||
// This is obviously totally contrived (we slow down loading
|
||||
// on purpose to show how incremental loading works).
|
||||
// The real purpose of incremental loading is the case where
|
||||
// you are reading data from a slow source such as the network.
|
||||
// The timeout simply simulates a slow data source by inserting
|
||||
// pauses in the reading process.
|
||||
|
||||
timeout_id = GLib.Timeout.Add (150, new GLib.TimeoutHandler (ProgressiveTimeout));
|
||||
}
|
||||
|
||||
Gdk.PixbufLoader pixbufLoader;
|
||||
|
||||
// TODO: Decide if we want to perform crazy error handling
|
||||
// TODO: Decide if we want to perform the same crazy error handling
|
||||
// gtk-demo does
|
||||
private bool ProgressiveTimeout ()
|
||||
{
|
||||
if (imageStream == null) {
|
||||
|
@ -151,8 +161,7 @@ namespace GtkDemo
|
|||
byte[] bytes = imageStream.ReadBytes (256);
|
||||
pixbufLoader.Write (bytes, (uint) bytes.Length);
|
||||
return true; // leave the timeout active
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
imageStream.Close ();
|
||||
return false; // removes the timeout
|
||||
}
|
||||
|
|
|
@ -1,11 +1,4 @@
|
|||
//
|
||||
// DemoListItem.cs, port of tree_store.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
/* List View/List Store
|
||||
/* Tree View/List Store
|
||||
*
|
||||
* The Gtk.ListStore is used to store data in tree form, to be
|
||||
* used later on by a Gtk.ListView to display it. This demo builds
|
||||
|
@ -28,40 +21,40 @@ namespace GtkDemo
|
|||
|
||||
public DemoListStore () : base ("ListStore Demo")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
BorderWidth = 8;
|
||||
|
||||
VBox vbox = new VBox (false, 8);
|
||||
vbox.BorderWidth = 8;
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
vbox.PackStart (new Label ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though)."), false, false, 0);
|
||||
Label label = new Label ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though).");
|
||||
vbox.PackStart (label, false, false, 0);
|
||||
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.ShadowType = ShadowType.EtchedIn;
|
||||
sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vbox.PackStart (sw, true, true, 0);
|
||||
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow ();
|
||||
scrolledWindow.ShadowType = ShadowType.EtchedIn;
|
||||
scrolledWindow.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vbox.PackStart (scrolledWindow, true, true, 0);
|
||||
// create model
|
||||
CreateModel ();
|
||||
store = CreateModel ();
|
||||
|
||||
// create tree view
|
||||
TreeView treeView = new TreeView (store);
|
||||
treeView.RulesHint = true;
|
||||
treeView.SearchColumn = (int) ColumnNumber.Description;
|
||||
treeView.SearchColumn = (int) Column.Description;
|
||||
sw.Add (treeView);
|
||||
|
||||
AddColumns (treeView);
|
||||
scrolledWindow.Add (treeView);
|
||||
|
||||
// finish & show
|
||||
this.SetDefaultSize (650, 400);
|
||||
this.ShowAll ();
|
||||
SetDefaultSize (280, 250);
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void ItemToggled (object o, ToggledArgs args)
|
||||
private void FixedToggled (object o, ToggledArgs args)
|
||||
{
|
||||
Gtk.TreeIter iter;
|
||||
if (store.GetIterFromString (out iter, args.Path))
|
||||
{
|
||||
if (store.GetIterFromString (out iter, args.Path)) {
|
||||
bool val = (bool) store.GetValue (iter, 0);
|
||||
Console.WriteLine ("toggled {0} with value {1}", args.Path, val);
|
||||
store.SetValue (iter, 0, !val);
|
||||
}
|
||||
}
|
||||
|
@ -70,43 +63,42 @@ namespace GtkDemo
|
|||
{
|
||||
// column for fixed toggles
|
||||
CellRendererToggle rendererToggle = new CellRendererToggle ();
|
||||
rendererToggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
TreeViewColumn column = new TreeViewColumn ("Fixed", rendererToggle, "active", 0);
|
||||
rendererToggle.Active = true;
|
||||
rendererToggle.Activatable = true;
|
||||
rendererToggle.Visible = true;
|
||||
rendererToggle.Toggled += new ToggledHandler (FixedToggled);
|
||||
TreeViewColumn column = new TreeViewColumn ("Fixed?", rendererToggle, "active", Column.Fixed);
|
||||
|
||||
// set this column to a fixed sizing (of 50 pixels)
|
||||
column.Sizing = TreeViewColumnSizing.Fixed;
|
||||
column.FixedWidth = 50;
|
||||
treeView.AppendColumn (column);
|
||||
|
||||
// column for bug numbers
|
||||
CellRendererText rendererText = new CellRendererText ();
|
||||
column = new TreeViewColumn ("Bug number", rendererText, "text", ColumnNumber.Number);
|
||||
column.SortColumnId = (int) ColumnNumber.Number;
|
||||
column = new TreeViewColumn ("Bug number", rendererText, "text", Column.Number);
|
||||
column.SortColumnId = (int) Column.Number;
|
||||
treeView.AppendColumn (column);
|
||||
|
||||
// column for severities
|
||||
rendererText = new CellRendererText ();
|
||||
column = new TreeViewColumn ("Severity", rendererText, "text", ColumnNumber.Severity);
|
||||
column.SortColumnId = (int) ColumnNumber.Severity;
|
||||
column = new TreeViewColumn ("Severity", rendererText, "text", Column.Severity);
|
||||
column.SortColumnId = (int) Column.Severity;
|
||||
treeView.AppendColumn(column);
|
||||
|
||||
// column for description
|
||||
rendererText = new CellRendererText ();
|
||||
column = new TreeViewColumn ("Description", rendererText, "text", ColumnNumber.Description);
|
||||
column.SortColumnId = (int) ColumnNumber.Description;
|
||||
column = new TreeViewColumn ("Description", rendererText, "text", Column.Description);
|
||||
column.SortColumnId = (int) Column.Description;
|
||||
treeView.AppendColumn (column);
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CreateModel ()
|
||||
private ListStore CreateModel ()
|
||||
{
|
||||
store = new ListStore (
|
||||
typeof(bool),
|
||||
ListStore store = new ListStore (typeof(bool),
|
||||
typeof(int),
|
||||
typeof(string),
|
||||
typeof(string));
|
||||
|
@ -118,16 +110,15 @@ namespace GtkDemo
|
|||
bug.Description);
|
||||
}
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
// FIXME: Instead of using number convert enum to array using
|
||||
// GetValues and then get the Length Property
|
||||
public enum ColumnNumber
|
||||
private enum Column
|
||||
{
|
||||
Fixed,
|
||||
Number,
|
||||
Severity,
|
||||
Description,
|
||||
Description
|
||||
}
|
||||
|
||||
private static Bug[] bugs =
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
//
|
||||
// DemoMain.cs, port of main.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
|
@ -50,7 +43,7 @@ namespace GtkDemo
|
|||
|
||||
notebook.AppendPage (CreateText (infoBuffer, false), new Label ("_Info"));
|
||||
TextTag heading = new TextTag ("heading");
|
||||
heading.Scale = heading.Scale * 2;
|
||||
heading.Font = "Sans 18";
|
||||
infoBuffer.TagTable.Add (heading);
|
||||
|
||||
notebook.AppendPage (CreateText (sourceBuffer, true), new Label ("_Source"));
|
||||
|
@ -61,17 +54,12 @@ namespace GtkDemo
|
|||
private void LoadFile (string filename)
|
||||
{
|
||||
Stream file = Assembly.GetExecutingAssembly ().GetManifestResourceStream (filename);
|
||||
if (file != null)
|
||||
{
|
||||
if (file != null) {
|
||||
LoadStream (file);
|
||||
}
|
||||
else if (File.Exists (filename))
|
||||
{
|
||||
} else if (File.Exists (filename)) {
|
||||
file = File.OpenRead (filename);
|
||||
LoadStream (file);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
infoBuffer.Text = String.Format ("{0} was not found.", filename);
|
||||
sourceBuffer.Text = String.Empty;
|
||||
}
|
||||
|
@ -79,52 +67,64 @@ namespace GtkDemo
|
|||
Fontify ();
|
||||
}
|
||||
|
||||
private enum LoadState {
|
||||
Title,
|
||||
Info,
|
||||
SkipWhitespace,
|
||||
Body
|
||||
};
|
||||
|
||||
private void LoadStream (Stream file)
|
||||
{
|
||||
StreamReader sr = new StreamReader (file);
|
||||
bool insideComment = false;
|
||||
bool headingValid = true;
|
||||
LoadState state = LoadState.Title;
|
||||
bool inPara = false;
|
||||
|
||||
infoBuffer.Text = "";
|
||||
sourceBuffer.Text = "";
|
||||
|
||||
TextIter infoIter = infoBuffer.EndIter;
|
||||
TextIter sourceIter = sourceBuffer.EndIter;
|
||||
|
||||
// mostly broken comment parsing for splitting
|
||||
// out the special comments to display in the infobuffer
|
||||
|
||||
string line, trimmed;
|
||||
while (sr.Peek () != -1) {
|
||||
line = sr.ReadLine ();
|
||||
trimmed = line.Trim ();
|
||||
if (headingValid && line.Trim ().StartsWith ("//"))
|
||||
{
|
||||
continue;
|
||||
|
||||
switch (state) {
|
||||
case LoadState.Title:
|
||||
if (trimmed.StartsWith ("/* ")) {
|
||||
infoBuffer.InsertWithTagsByName (ref infoIter, trimmed.Substring (3), "heading");
|
||||
state = LoadState.Info;
|
||||
}
|
||||
else if (headingValid && trimmed.StartsWith ("/*"))
|
||||
{
|
||||
TextIter iter = infoBuffer.EndIter;
|
||||
infoBuffer.InsertWithTagsByName (ref iter, trimmed.Substring (2) + Environment.NewLine, "heading");
|
||||
infoBuffer.Insert (ref iter, Environment.NewLine);
|
||||
insideComment = true;
|
||||
}
|
||||
else if (headingValid && trimmed.StartsWith ("*/"))
|
||||
{
|
||||
insideComment = false;
|
||||
headingValid = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (insideComment)
|
||||
{
|
||||
TextIter iter = infoBuffer.EndIter;
|
||||
if (trimmed.StartsWith ("*"))
|
||||
infoBuffer.Insert (ref iter, trimmed.Substring (1));
|
||||
else
|
||||
infoBuffer.Insert (ref iter, trimmed);
|
||||
}
|
||||
else
|
||||
{
|
||||
TextIter iter = sourceBuffer.EndIter;
|
||||
sourceBuffer.Insert (ref iter, line + Environment.NewLine);
|
||||
break;
|
||||
|
||||
case LoadState.Info:
|
||||
if (trimmed == "*") {
|
||||
infoBuffer.Insert (ref infoIter, "\n");
|
||||
inPara = false;
|
||||
} else if (trimmed.StartsWith ("* ")) {
|
||||
if (inPara)
|
||||
infoBuffer.Insert (ref infoIter, " ");
|
||||
infoBuffer.Insert (ref infoIter, trimmed.Substring (2));
|
||||
inPara = true;
|
||||
} else if (trimmed.StartsWith ("*/"))
|
||||
state = LoadState.SkipWhitespace;
|
||||
break;
|
||||
|
||||
case LoadState.SkipWhitespace:
|
||||
if (trimmed != "") {
|
||||
state = LoadState.Body;
|
||||
goto case LoadState.Body;
|
||||
}
|
||||
break;
|
||||
|
||||
case LoadState.Body:
|
||||
sourceBuffer.Insert (ref sourceIter, line + "\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
sr.Close ();
|
||||
|
@ -140,8 +140,7 @@ namespace GtkDemo
|
|||
{
|
||||
Gdk.Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource ("gtk-logo-rgb.gif");
|
||||
|
||||
if (pixbuf != null)
|
||||
{
|
||||
if (pixbuf != null) {
|
||||
// The gtk-logo-rgb icon has a white background
|
||||
// make it transparent instead
|
||||
Pixbuf transparent = pixbuf.AddAlpha (true, 0xff, 0xff, 0xff);
|
||||
|
@ -160,8 +159,8 @@ namespace GtkDemo
|
|||
column.AddAttribute (cr, "style" , 2);
|
||||
view.AppendColumn (column);
|
||||
|
||||
view.Selection.Changed += new EventHandler (OnTreeChanged);
|
||||
view.RowActivated += new RowActivatedHandler (OnRowActivated);
|
||||
view.Selection.Changed += new EventHandler (TreeChanged);
|
||||
view.RowActivated += new RowActivatedHandler (RowActivated);
|
||||
view.ExpandAll ();
|
||||
view.SetSizeRequest (200, -1);
|
||||
view.Selection.Mode = Gtk.SelectionMode.Browse;
|
||||
|
@ -180,14 +179,11 @@ namespace GtkDemo
|
|||
|
||||
scrolledWindow.Add (textView);
|
||||
|
||||
if (IsSource)
|
||||
{
|
||||
if (IsSource) {
|
||||
FontDescription fontDescription = FontDescription.FromString ("Courier 12");
|
||||
textView.ModifyFont (fontDescription);
|
||||
textView.WrapMode = Gtk.WrapMode.None;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
// Make it a bit nicer for text
|
||||
textView.WrapMode = Gtk.WrapMode.Word;
|
||||
textView.PixelsAboveLines = 2;
|
||||
|
@ -205,42 +201,32 @@ namespace GtkDemo
|
|||
TreeIter parent;
|
||||
|
||||
Type[] types = Assembly.GetExecutingAssembly ().GetTypes ();
|
||||
foreach (Type t in types)
|
||||
{
|
||||
if (t.IsDefined (typeof (DemoAttribute), false))
|
||||
{
|
||||
foreach (Type t in types) {
|
||||
object[] att = t.GetCustomAttributes (typeof (DemoAttribute), false);
|
||||
foreach (DemoAttribute demo in att)
|
||||
{
|
||||
if (demo.Parent != null)
|
||||
{
|
||||
foreach (DemoAttribute demo in att) {
|
||||
if (demo.Parent != null) {
|
||||
if (!parents.Contains (demo.Parent))
|
||||
parents.Add (demo.Parent, store.AppendValues (demo.Parent));
|
||||
|
||||
parent = (TreeIter) parents[demo.Parent];
|
||||
store.AppendValues (parent, demo.Label, t, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
store.AppendValues (demo.Label, t, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
store.SetSortColumnId (0, SortType.Ascending);
|
||||
return store;
|
||||
}
|
||||
|
||||
private void OnTreeChanged (object o, EventArgs args)
|
||||
private void TreeChanged (object o, EventArgs args)
|
||||
{
|
||||
TreeIter iter;
|
||||
TreeModel model;
|
||||
|
||||
if (treeView.Selection.GetSelected (out model, out iter))
|
||||
{
|
||||
if (treeView.Selection.GetSelected (out model, out iter)) {
|
||||
Type type = (Type) model.GetValue (iter, 1);
|
||||
if (type != null)
|
||||
{
|
||||
if (type != null) {
|
||||
object[] atts = type.GetCustomAttributes (typeof (DemoAttribute), false);
|
||||
string file = ((DemoAttribute) atts[0]).Filename;
|
||||
LoadFile (file);
|
||||
|
@ -253,12 +239,11 @@ namespace GtkDemo
|
|||
}
|
||||
}
|
||||
|
||||
private void OnRowActivated (object o, RowActivatedArgs args)
|
||||
private void RowActivated (object o, RowActivatedArgs args)
|
||||
{
|
||||
TreeIter iter;
|
||||
|
||||
if (treeView.Model.GetIter (out iter, args.Path))
|
||||
{
|
||||
if (treeView.Model.GetIter (out iter, args.Path)) {
|
||||
Type type = (Type) treeView.Model.GetValue (iter, 1);
|
||||
if (type != null)
|
||||
Activator.CreateInstance (type);
|
||||
|
@ -272,4 +257,3 @@ namespace GtkDemo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,45 +1,29 @@
|
|||
//
|
||||
// TestMenus.cs
|
||||
//
|
||||
// Author: Duncan Mak (duncan@ximian.com)
|
||||
//
|
||||
// Copyright (C) 2002, Duncan Mak, Ximian Inc.
|
||||
//
|
||||
|
||||
/* Menus
|
||||
*
|
||||
* There are several widgets involved in displaying menus. The
|
||||
* MenuBar widget is a horizontal menu bar, which normally appears
|
||||
* at the top of an application. The Menu widget is the actual menu
|
||||
* that pops up. Both MenuBar and Menu are subclasses of
|
||||
* MenuShell; a MenuShell contains menu items
|
||||
* (MenuItem). Each menu item contains text and/or images and can
|
||||
* be selected by the user.
|
||||
* There are several widgets involved in displaying menus. The MenuBar
|
||||
* widget is a horizontal menu bar, which normally appears at the top
|
||||
* of an application. The Menu widget is the actual menu that pops up.
|
||||
* Both MenuBar and Menu are subclasses of MenuShell; a MenuShell
|
||||
* contains menu items (MenuItem). Each menu item contains text and/or
|
||||
* images and can be selected by the user.
|
||||
*
|
||||
* There are several kinds of menu item, including plain MenuItem,
|
||||
* CheckMenuItem which can be checked/unchecked, RadioMenuItem
|
||||
* which is a check menu item that's in a mutually exclusive group,
|
||||
* SeparatorMenuItem which is a separator bar, TearoffMenuItem
|
||||
* which allows a Menu to be torn off, and ImageMenuItem which
|
||||
* can place a Image or other widget next to the menu text.
|
||||
* CheckMenuItem which can be checked/unchecked, RadioMenuItem which
|
||||
* is a check menu item that's in a mutually exclusive group,
|
||||
* SeparatorMenuItem which is a separator bar, TearoffMenuItem which
|
||||
* allows a Menu to be torn off, and ImageMenuItem which can place a
|
||||
* Image or other widget next to the menu text.
|
||||
*
|
||||
* A MenuItem can have a submenu, which is simply a Menu to pop
|
||||
* up when the menu item is selected. Typically, all menu items in a menu bar
|
||||
* have submenus.
|
||||
* A MenuItem can have a submenu, which is simply a Menu to pop up
|
||||
* when the menu item is selected. Typically, all menu items in a menu
|
||||
* bar have submenus.
|
||||
*
|
||||
* The OptionMenu widget is a button that pops up a Menu when clicked.
|
||||
* It's used inside dialogs and such.
|
||||
*
|
||||
* ItemFactory provides a higher-level interface for creating menu bars
|
||||
* and menus; while you can construct menus manually, most people don't
|
||||
* do that. There's a separate demo for ItemFactory.
|
||||
* UIManager provides a higher-level interface for creating menu bars
|
||||
* and menus; while you can construct menus manually, most people
|
||||
* don't do that. There's a separate demo for UIManager.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// TODO : window width is not exactly equal
|
||||
// point on the right side
|
||||
|
||||
using System;
|
||||
using Gtk;
|
||||
|
||||
|
@ -50,101 +34,78 @@ namespace GtkDemo
|
|||
{
|
||||
public DemoMenus () : base ("Menus")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
|
||||
AccelGroup accel_group = new AccelGroup ();
|
||||
this.AddAccelGroup (accel_group);
|
||||
AddAccelGroup (accel_group);
|
||||
|
||||
VBox box1 = new VBox (false, 0);
|
||||
this.Add (box1);
|
||||
Add (box1);
|
||||
|
||||
MenuBar menubar = new MenuBar ();
|
||||
box1.PackStart (menubar, false, false, 0);
|
||||
|
||||
Menu menu = Create_Menu (2, true);
|
||||
box1.PackStart (menubar, false, true, 0);
|
||||
|
||||
MenuItem menuitem = new MenuItem ("test\nline2");
|
||||
menuitem.Submenu = menu;
|
||||
menuitem.Submenu = CreateMenu (2, true);
|
||||
menubar.Append (menuitem);
|
||||
|
||||
MenuItem menuitem1 = new MenuItem ("foo");
|
||||
menuitem1.Submenu = Create_Menu (3, true);
|
||||
menuitem1.Submenu = CreateMenu (3, true);
|
||||
menubar.Append (menuitem1);
|
||||
|
||||
menuitem = new MenuItem ("bar");
|
||||
menuitem.Submenu = Create_Menu (4, true);
|
||||
menuitem.Submenu = CreateMenu (4, true);
|
||||
menuitem.RightJustified = true;
|
||||
menubar.Append (menuitem);
|
||||
|
||||
menubar = new MenuBar ();
|
||||
box1.PackStart (menubar, false, true, 0);
|
||||
|
||||
VBox box2 = new VBox (false, 10);
|
||||
box2.BorderWidth = 10;
|
||||
box1.PackStart (box2, true, true, 0);
|
||||
|
||||
box2 = new VBox (false, 10);
|
||||
box2.BorderWidth = 10;
|
||||
box1.PackStart (box2, false, true, 0);
|
||||
|
||||
Button close_button = new Button ("close");
|
||||
close_button.Clicked += new EventHandler (Close_Button);
|
||||
box2.PackStart (close_button, true, true, 0);
|
||||
Button close = new Button ("close");
|
||||
close.Clicked += new EventHandler (CloseClicked);
|
||||
box2.PackStart (close, true, true, 0);
|
||||
|
||||
close_button.CanDefault = true;
|
||||
close_button.GrabDefault ();
|
||||
close.CanDefault = true;
|
||||
close.GrabDefault ();
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private Menu Create_Menu (int depth, bool tearoff)
|
||||
private Menu CreateMenu (int depth, bool tearoff)
|
||||
{
|
||||
if (depth < 1)
|
||||
return null;
|
||||
|
||||
Menu menu = new Menu ();
|
||||
MenuItem menuitem;
|
||||
string label;
|
||||
GLib.SList group = new GLib.SList (IntPtr.Zero);
|
||||
|
||||
if (tearoff)
|
||||
{
|
||||
menuitem = new TearoffMenuItem ();
|
||||
if (tearoff) {
|
||||
TearoffMenuItem menuitem = new TearoffMenuItem ();
|
||||
menu.Append (menuitem);
|
||||
menuitem.Show ();
|
||||
}
|
||||
|
||||
for (int i = 0, j = 1; i < 5; i++, j++)
|
||||
{
|
||||
label = String.Format ("item {0} - {1}", depth, j);
|
||||
menuitem = new RadioMenuItem (group, label);
|
||||
group = ((RadioMenuItem) menuitem).Group;
|
||||
menuitem = new MenuItem (label);
|
||||
menu.Append (menuitem);
|
||||
for (int i = 0, j = 1; i < 5; i++, j++) {
|
||||
RadioMenuItem menuitem = new RadioMenuItem (group, String.Format ("item {0} - {1}", depth, j));
|
||||
group = menuitem.Group;
|
||||
|
||||
menu.Append (menuitem);
|
||||
if (i == 3)
|
||||
menuitem.Sensitive = false;
|
||||
|
||||
Menu child = Create_Menu ((depth - 1), true);
|
||||
|
||||
if (child != null)
|
||||
menuitem.Submenu = child;
|
||||
menuitem.Submenu = CreateMenu ((depth - 1), true);
|
||||
}
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
private void Close_Button (object o, EventArgs args)
|
||||
private void CloseClicked (object o, EventArgs args)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
Destroy ();
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,3 @@
|
|||
//
|
||||
// DemoPanes.cs
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2002, Daniel Kornhauser, Ximian Inc.
|
||||
//
|
||||
|
||||
|
||||
/* Paned Widgets
|
||||
*
|
||||
* The HPaned and VPaned Widgets divide their content
|
||||
|
@ -22,6 +13,7 @@
|
|||
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Gtk;
|
||||
|
||||
namespace GtkDemo
|
||||
|
@ -29,151 +21,119 @@ namespace GtkDemo
|
|||
[Demo ("Paned Widget", "DemoPanes.cs")]
|
||||
public class DemoPanes : Gtk.Window
|
||||
{
|
||||
private VPaned vpaned;
|
||||
private HPaned top;
|
||||
private Frame left;
|
||||
private Frame right;
|
||||
private Frame bottom;
|
||||
|
||||
private CheckButton resizeLeft;
|
||||
private CheckButton shrinkLeft;
|
||||
private CheckButton resizeRight;
|
||||
private CheckButton shrinkRight;
|
||||
private CheckButton resizeTop;
|
||||
private CheckButton shrinkTop;
|
||||
private CheckButton resizeBottom;
|
||||
private CheckButton shrinkBottom;
|
||||
private Button button;
|
||||
Hashtable children = new Hashtable ();
|
||||
|
||||
public DemoPanes () : base ("Panes")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.BorderWidth = 0;
|
||||
|
||||
VBox vbox = new VBox (false, 0);
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
vpaned = new VPaned ();
|
||||
VPaned vpaned = new VPaned ();
|
||||
vbox.PackStart (vpaned, true, true, 0);
|
||||
vpaned.BorderWidth = 5;
|
||||
|
||||
top = new HPaned ();
|
||||
vpaned.Add1 (top);
|
||||
HPaned hpaned = new HPaned ();
|
||||
vpaned.Add1 (hpaned);
|
||||
|
||||
left = new Frame ();
|
||||
left.ShadowType = ShadowType.In;
|
||||
left.SetSizeRequest (60, 60);
|
||||
top.Add1 (left);
|
||||
button = new Button ("_Hi there");
|
||||
left.Add (button);
|
||||
Frame frame = new Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
frame.SetSizeRequest (60, 60);
|
||||
hpaned.Add1 (frame);
|
||||
|
||||
right = new Frame ();
|
||||
right.ShadowType = ShadowType.In;
|
||||
right.SetSizeRequest (80, 60);
|
||||
top.Add2 (right);
|
||||
Gtk.Button button = new Button ("_Hi there");
|
||||
frame.Add (button);
|
||||
|
||||
bottom = new Frame ();
|
||||
bottom.ShadowType = ShadowType.In;
|
||||
bottom.SetSizeRequest (80, 60);
|
||||
vpaned.Add2 (bottom);
|
||||
frame = new Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
frame.SetSizeRequest (80, 60);
|
||||
hpaned.Add2 (frame);
|
||||
|
||||
frame = new Frame ();
|
||||
frame.ShadowType = ShadowType.In;
|
||||
frame.SetSizeRequest (60, 80);
|
||||
vpaned.Add2 (frame);
|
||||
|
||||
// Now create toggle buttons to control sizing
|
||||
vbox.PackStart (CreatePaneOptions (hpaned,
|
||||
"Horizontal",
|
||||
"Left",
|
||||
"Right"),
|
||||
false, false, 0);
|
||||
|
||||
Frame frame = new Frame ("Horizonal");
|
||||
vbox.PackStart (CreatePaneOptions (vpaned,
|
||||
"Vertical",
|
||||
"Top",
|
||||
"Bottom"),
|
||||
false, false, 0);
|
||||
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
Frame CreatePaneOptions (Paned paned, string frameLabel,
|
||||
string label1, string label2)
|
||||
{
|
||||
Frame frame = new Frame (frameLabel);
|
||||
frame.BorderWidth = 4;
|
||||
vbox.PackStart (frame);
|
||||
|
||||
Table table = new Table (3, 2, true);
|
||||
frame.Add (table);
|
||||
|
||||
Label label = new Label ("Left");
|
||||
Label label = new Label (label1);
|
||||
table.Attach (label, 0, 1, 0, 1);
|
||||
|
||||
resizeLeft = new CheckButton ("_Resize");
|
||||
table.Attach (resizeLeft, 0, 1, 1, 2);
|
||||
resizeLeft.Toggled += new EventHandler (LeftCB);
|
||||
CheckButton check = new CheckButton ("_Resize");
|
||||
table.Attach (check, 0, 1, 1, 2);
|
||||
check.Toggled += new EventHandler (ToggleResize);
|
||||
children[check] = paned.Child1;
|
||||
|
||||
shrinkLeft = new CheckButton ("_Shrink");
|
||||
table.Attach (shrinkLeft, 0, 1, 2, 3);
|
||||
shrinkLeft.Active = true;
|
||||
shrinkLeft.Toggled += new EventHandler (LeftCB);
|
||||
check = new CheckButton ("_Shrink");
|
||||
table.Attach (check, 0, 1, 2, 3);
|
||||
check.Active = true;
|
||||
check.Toggled += new EventHandler (ToggleShrink);
|
||||
children[check] = paned.Child1;
|
||||
|
||||
label = new Label ("Right");
|
||||
label = new Label (label2);
|
||||
table.Attach (label, 1, 2, 0, 1);
|
||||
|
||||
resizeRight = new CheckButton ("_Resize");
|
||||
table.Attach (resizeRight, 1, 2, 1, 2);
|
||||
resizeRight.Active = true;
|
||||
resizeRight.Toggled += new EventHandler (RightCB);
|
||||
check = new CheckButton ("_Resize");
|
||||
table.Attach (check, 1, 2, 1, 2);
|
||||
check.Active = true;
|
||||
check.Toggled += new EventHandler (ToggleResize);
|
||||
children[check] = paned.Child2;
|
||||
|
||||
shrinkRight = new CheckButton ("_Shrink");
|
||||
table.Attach (shrinkRight, 1, 2, 2, 3);
|
||||
shrinkRight.Active = true;
|
||||
shrinkRight.Toggled += new EventHandler (RightCB);
|
||||
check = new CheckButton ("_Shrink");
|
||||
table.Attach (check, 1, 2, 2, 3);
|
||||
check.Active = true;
|
||||
check.Toggled += new EventHandler (ToggleShrink);
|
||||
children[check] = paned.Child2;
|
||||
|
||||
frame = new Frame ("Vertical");
|
||||
frame.BorderWidth = 4;
|
||||
vbox.PackStart (frame);
|
||||
|
||||
table = new Table (3, 2, true);
|
||||
frame.Add (table);
|
||||
|
||||
label = new Label ("Top");
|
||||
table.Attach (label, 0, 1, 0, 1);
|
||||
|
||||
resizeTop = new CheckButton ("_Resize");
|
||||
table.Attach (resizeTop, 0, 1, 1, 2);
|
||||
resizeTop.Toggled += new EventHandler (TopCB);
|
||||
|
||||
shrinkTop = new CheckButton ("_Shrink");
|
||||
table.Attach (shrinkTop, 0, 1, 2, 3);
|
||||
shrinkTop.Active = true;
|
||||
shrinkTop.Toggled += new EventHandler (TopCB);
|
||||
|
||||
label = new Label ("Bottom");
|
||||
table.Attach (label, 1, 2, 0, 1);
|
||||
|
||||
resizeBottom = new CheckButton ("_Resize");
|
||||
table.Attach (resizeBottom, 1, 2, 1, 2);
|
||||
resizeBottom.Active = true;
|
||||
resizeBottom.Toggled += new EventHandler (BottomCB);
|
||||
|
||||
shrinkBottom = new CheckButton ("_Shrink");
|
||||
table.Attach (shrinkBottom, 1, 2, 2, 3);
|
||||
shrinkBottom.Active = true;
|
||||
shrinkBottom.Toggled += new EventHandler (BottomCB);
|
||||
|
||||
this.ShowAll ();
|
||||
return frame;
|
||||
}
|
||||
|
||||
private void LeftCB (object o, EventArgs args)
|
||||
private void ToggleResize (object obj, EventArgs args)
|
||||
{
|
||||
top.Remove (left);
|
||||
top.Pack1 (left, resizeLeft.Active, shrinkLeft.Active);
|
||||
ToggleButton toggle = obj as ToggleButton;
|
||||
Widget child = children[obj] as Widget;
|
||||
Paned paned = child.Parent as Paned;
|
||||
|
||||
Paned.PanedChild pc = paned[child] as Paned.PanedChild;
|
||||
pc.Resize = toggle.Active;
|
||||
}
|
||||
|
||||
private void RightCB (object o, EventArgs args)
|
||||
private void ToggleShrink (object obj, EventArgs args)
|
||||
{
|
||||
top.Remove (right);
|
||||
top.Pack2 (right, resizeRight.Active, shrinkRight.Active);
|
||||
ToggleButton toggle = obj as ToggleButton;
|
||||
Widget child = children[obj] as Widget;
|
||||
Paned paned = child.Parent as Paned;
|
||||
|
||||
Paned.PanedChild pc = paned[child] as Paned.PanedChild;
|
||||
pc.Shrink = toggle.Active;
|
||||
}
|
||||
|
||||
private void TopCB (object o, EventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
vpaned.Remove (top);
|
||||
vpaned.Pack1 (top, resizeTop.Active, shrinkTop.Active);
|
||||
}
|
||||
|
||||
private void BottomCB (object o, EventArgs args)
|
||||
{
|
||||
vpaned.Remove (bottom);
|
||||
vpaned.Pack2 (bottom, resizeBottom.Active, shrinkBottom.Active);
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,3 @@
|
|||
// DemoPixbuf.cs: Pixbuf demonstration
|
||||
//
|
||||
// Gtk# port of pixbuf demo in gtk-demo app.
|
||||
//
|
||||
// Author: Yves Kurz <yves@magnific.ch>
|
||||
//
|
||||
// <c> 2003 Yves Kurz
|
||||
|
||||
/* Pixbufs
|
||||
*
|
||||
* A Pixbuf represents an image, normally in RGB or RGBA format.
|
||||
|
@ -24,6 +16,7 @@ using Gdk;
|
|||
using Gtk;
|
||||
|
||||
using System;
|
||||
using System.Runtime.InteropServices; // for Marshal.Copy
|
||||
|
||||
namespace GtkDemo
|
||||
{
|
||||
|
@ -34,7 +27,7 @@ namespace GtkDemo
|
|||
const int CycleLen = 60;
|
||||
const string BackgroundName = "background.jpg";
|
||||
|
||||
string [] ImageNames = {
|
||||
static string[] ImageNames = {
|
||||
"apple-red.png",
|
||||
"gnome-applets.png",
|
||||
"gnome-calendar.png",
|
||||
|
@ -45,23 +38,26 @@ namespace GtkDemo
|
|||
"gnu-keys.png"
|
||||
};
|
||||
|
||||
// background image
|
||||
static Pixbuf background;
|
||||
static int backWidth, backHeight;
|
||||
|
||||
// images
|
||||
static Pixbuf[] images;
|
||||
|
||||
// current frame
|
||||
Pixbuf frame;
|
||||
int frameNum;
|
||||
|
||||
// background image
|
||||
Pixbuf background;
|
||||
int backWidth, backHeight;
|
||||
|
||||
// images
|
||||
Pixbuf[] images;
|
||||
|
||||
// drawing area
|
||||
DrawingArea drawingArea;
|
||||
|
||||
// Loads the images for the demo
|
||||
void LoadPixbuf ()
|
||||
uint timeoutId;
|
||||
|
||||
static DemoPixbuf ()
|
||||
{
|
||||
// Load the images for the demo
|
||||
|
||||
background = Gdk.Pixbuf.LoadFromResource (BackgroundName);
|
||||
|
||||
backWidth = background.Width;
|
||||
|
@ -78,15 +74,20 @@ namespace GtkDemo
|
|||
void Expose (object o, ExposeEventArgs args)
|
||||
{
|
||||
Widget widget = (Widget) o;
|
||||
Gdk.Rectangle area = args.Event.Area;
|
||||
byte[] pixels;
|
||||
int rowstride;
|
||||
|
||||
frame.RenderToDrawableAlpha(
|
||||
widget.GdkWindow,
|
||||
0, 0,
|
||||
0, 0,
|
||||
backWidth, backHeight,
|
||||
Gdk.PixbufAlphaMode.Full, 8,
|
||||
RgbDither.Normal,
|
||||
100, 100);
|
||||
rowstride = frame.Rowstride;
|
||||
pixels = new byte[(frame.Height - area.Y) * rowstride];
|
||||
Marshal.Copy (frame.Pixels, pixels, rowstride * area.Y + area.X * 3, pixels.Length);
|
||||
|
||||
widget.GdkWindow.DrawRgbImageDithalign (widget.Style.BlackGC,
|
||||
area.X, area.Y, area.Width, area.Height,
|
||||
Gdk.RgbDither.Normal,
|
||||
pixels, rowstride,
|
||||
area.X, area.Y);
|
||||
args.RetVal = true;
|
||||
}
|
||||
|
||||
// timeout handler to regenerate the frame
|
||||
|
@ -102,52 +103,38 @@ namespace GtkDemo
|
|||
double radius = Math.Min (xmid, ymid) / 2;
|
||||
|
||||
for (int i = 0; i < images.Length; i++) {
|
||||
double ang = 2 * Math.PI * i / images.Length - f * 2 *
|
||||
Math.PI;
|
||||
double ang = 2 * Math.PI * (double) i / images.Length - f * 2 * Math.PI;
|
||||
|
||||
int iw = images[i].Width;
|
||||
int ih = images[i].Height;
|
||||
|
||||
double r = radius + (radius / 3) * Math.Sin (f * 2 *
|
||||
Math.PI);
|
||||
double r = radius + (radius / 3) * Math.Sin (f * 2 * Math.PI);
|
||||
|
||||
int xpos = (int) Math.Floor (xmid + r * Math.Cos (ang) -
|
||||
iw / 2 + 0.5);
|
||||
iw / 2.0 + 0.5);
|
||||
int ypos = (int) Math.Floor (ymid + r * Math.Sin (ang) -
|
||||
ih / 2 + 0.5);
|
||||
ih / 2.0 + 0.5);
|
||||
|
||||
double k = (i % 2 == 1) ? Math.Sin (f * 2 * Math.PI) :
|
||||
Math.Cos (f * 2 * Math.PI);
|
||||
k = 2 * k * k;
|
||||
k = Math.Max (0.25, k);
|
||||
|
||||
Rectangle r1; /*, r2, dest*/
|
||||
|
||||
r1 = new Rectangle (xpos, ypos,(int) (iw * k),
|
||||
(int) (ih * k));
|
||||
|
||||
/* FIXME: Why is that code not working (in the original gtk-demo it works
|
||||
Rectangle r1, r2, dest;
|
||||
|
||||
r1 = new Rectangle (xpos, ypos, (int) (iw * k), (int) (ih * k));
|
||||
r2 = new Rectangle (0, 0, backWidth, backHeight);
|
||||
|
||||
dest = new Rectangle (0, 0, 0, 0);
|
||||
r1.Intersect (r2, dest);
|
||||
|
||||
images[i].Composite (frame, dest.x, dest.y, dest.width,
|
||||
dest.height, xpos, ypos, k, k,
|
||||
InterpType.Nearest, (int) ((i % 2 == 1)
|
||||
? Math.Max (127, Math.Abs (255 * Math.Sin (f *
|
||||
2 * Math.PI)))
|
||||
: Math.Max (127, Math.Abs (255 * Math.Cos (f *
|
||||
2 * Math.PI)))));
|
||||
*/
|
||||
images[i].Composite (frame, r1.X, r1.Y, r1.Width,
|
||||
r1.Height, xpos, ypos, k, k,
|
||||
InterpType.Nearest, (int) ((i % 2 == 1)
|
||||
? Math.Max (127, Math.Abs (255 * Math.Sin (f *
|
||||
2 * Math.PI)))
|
||||
: Math.Max (127, Math.Abs (255 * Math.Cos (f *
|
||||
2 * Math.PI)))));
|
||||
dest = Rectangle.Intersect (r1, r2);
|
||||
if (!dest.IsEmpty) {
|
||||
images[i].Composite (frame, dest.X, dest.Y,
|
||||
dest.Width, dest.Height,
|
||||
xpos, ypos, k, k,
|
||||
InterpType.Nearest,
|
||||
(int) ((i % 2 == 1) ?
|
||||
Math.Max (127, Math.Abs (255 * Math.Sin (f * 2 * Math.PI))) :
|
||||
Math.Max (127, Math.Abs (255 * Math.Cos (f * 2 * Math.PI)))));
|
||||
}
|
||||
}
|
||||
|
||||
drawingArea.QueueDraw ();
|
||||
|
@ -156,47 +143,34 @@ namespace GtkDemo
|
|||
return true;
|
||||
}
|
||||
|
||||
public DemoPixbuf () : base ("Gdk Pixbuf Demo")
|
||||
public DemoPixbuf () : base ("Pixbufs")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (OnWindowDelete);
|
||||
Resizable = false;
|
||||
SetSizeRequest (backWidth, backHeight);
|
||||
|
||||
try
|
||||
{
|
||||
LoadPixbuf ();
|
||||
} catch (Exception e)
|
||||
{
|
||||
using (MessageDialog md = new MessageDialog (this,
|
||||
DialogFlags.DestroyWithParent,
|
||||
MessageType.Error,
|
||||
ButtonsType.Close,
|
||||
"Error: \n" + e.Message)) {
|
||||
md.Run ();
|
||||
md.Hide ();
|
||||
}
|
||||
|
||||
throw;
|
||||
}
|
||||
|
||||
frame = new Pixbuf (Colorspace.Rgb, true, 8, backWidth,
|
||||
backHeight);
|
||||
frame = new Pixbuf (Colorspace.Rgb, false, 8, backWidth, backHeight);
|
||||
|
||||
drawingArea = new DrawingArea ();
|
||||
drawingArea.ExposeEvent += new ExposeEventHandler (Expose);
|
||||
|
||||
Add (drawingArea);
|
||||
GLib.Timeout.Add (FrameDelay, new GLib.TimeoutHandler(timeout));
|
||||
timeoutId = GLib.Timeout.Add (FrameDelay, new GLib.TimeoutHandler(timeout));
|
||||
|
||||
this.SetDefaultSize (backWidth, backHeight);
|
||||
// this.Resizable = false;
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
void OnWindowDelete (object obj, DeleteEventArgs args)
|
||||
protected override void OnDestroyed ()
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
}
|
||||
if (timeoutId != 0) {
|
||||
GLib.Source.Remove (timeoutId);
|
||||
timeoutId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,3 @@
|
|||
//
|
||||
// DemoSizeGroup.cs
|
||||
//
|
||||
// Author: Duncan Mak (duncan@ximian.com)
|
||||
//
|
||||
// Copyright (C) 2002, Duncan Mak, Ximian Inc.
|
||||
//
|
||||
|
||||
/* Size Groups
|
||||
*
|
||||
* SizeGroup provides a mechanism for grouping a number of
|
||||
|
@ -31,10 +23,14 @@ namespace GtkDemo
|
|||
{
|
||||
private SizeGroup sizeGroup;
|
||||
|
||||
public DemoSizeGroup ()
|
||||
static string [] colors = { "Red", "Green", "Blue" };
|
||||
static string [] dashes = { "Solid", "Dashed", "Dotted" };
|
||||
static string [] ends = { "Square", "Round", "Arrow" };
|
||||
|
||||
public DemoSizeGroup () : base ("SizeGroup", null, DialogFlags.DestroyWithParent,
|
||||
Gtk.Stock.Close, Gtk.ResponseType.Close)
|
||||
{
|
||||
this.Title = "Size groups";
|
||||
this.Resizable = false;
|
||||
Resizable = false;
|
||||
|
||||
VBox vbox = new VBox (false, 5);
|
||||
this.VBox.PackStart (vbox, true, true, 0);
|
||||
|
@ -52,10 +48,6 @@ namespace GtkDemo
|
|||
table.ColumnSpacing = 10;
|
||||
frame.Add (table);
|
||||
|
||||
string [] colors = {"Red", "Green", "Blue", };
|
||||
string [] dashes = {"Solid", "Dashed", "Dotted", };
|
||||
string [] ends = {"Square", "Round", "Arrow", };
|
||||
|
||||
AddRow (table, 0, sizeGroup, "_Foreground", colors);
|
||||
AddRow (table, 1, sizeGroup, "_Background", colors);
|
||||
|
||||
|
@ -76,17 +68,13 @@ namespace GtkDemo
|
|||
CheckButton checkButton = new CheckButton ("_Enable grouping");
|
||||
vbox.PackStart (checkButton, false, false, 0);
|
||||
checkButton.Active = true;
|
||||
checkButton.Toggled += new EventHandler (ButtonToggleCb);
|
||||
checkButton.Toggled += new EventHandler (ToggleGrouping);
|
||||
|
||||
Button CloseButton = new Button (Stock.Close);
|
||||
this.AddActionWidget (CloseButton, ResponseType.Close);
|
||||
this.Response += new ResponseHandler (ResponseCallback);
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
// Convenience function to create an option menu holding a number of strings
|
||||
private ComboBox CreateOptionMenu (string [] strings)
|
||||
// Convenience function to create a combo box holding a number of strings
|
||||
private ComboBox CreateComboBox (string [] strings)
|
||||
{
|
||||
ComboBox combo = ComboBox.NewText ();
|
||||
|
||||
|
@ -104,29 +92,26 @@ namespace GtkDemo
|
|||
|
||||
table.Attach (label,
|
||||
0, 1, row, row + 1,
|
||||
AttachOptions.Expand, AttachOptions.Fill,
|
||||
AttachOptions.Expand | AttachOptions.Fill, 0,
|
||||
0, 0);
|
||||
|
||||
ComboBox combo = CreateOptionMenu (options);
|
||||
ComboBox combo = CreateComboBox (options);
|
||||
label.MnemonicWidget = combo;
|
||||
|
||||
sizeGroup.AddWidget (combo);
|
||||
table.Attach (combo,
|
||||
1, 2, row, row + 1,
|
||||
AttachOptions.Expand, AttachOptions.Expand,
|
||||
0, 0,
|
||||
0, 0);
|
||||
}
|
||||
|
||||
private void ButtonToggleCb (object o, EventArgs args)
|
||||
private void ToggleGrouping (object o, EventArgs args)
|
||||
{
|
||||
ToggleGrouping ((ToggleButton) o, sizeGroup);
|
||||
}
|
||||
ToggleButton checkButton = (ToggleButton)o;
|
||||
|
||||
// SizeGroupMode.None is not generally useful, but is useful
|
||||
// here to show the effect of SizeGroupMode.Horizontal by
|
||||
// contrast
|
||||
|
||||
private void ToggleGrouping (ToggleButton checkButton, SizeGroup sizeGroup)
|
||||
{
|
||||
SizeGroupMode mode;
|
||||
|
||||
if (checkButton.Active)
|
||||
|
@ -137,13 +122,9 @@ namespace GtkDemo
|
|||
sizeGroup.Mode = mode;
|
||||
}
|
||||
|
||||
private void ResponseCallback (object obj, ResponseArgs args)
|
||||
protected override void OnResponse (Gtk.ResponseType responseId)
|
||||
{
|
||||
if ((args.ResponseId) == ResponseType.Close) {
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
Destroy ();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
//
|
||||
// StockBrowser.cs, port of stock_browser.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@media.mit.edu>
|
||||
//
|
||||
// (C) 2003 Ximian, Inc.
|
||||
|
||||
/* Stock Item and Icon Browser
|
||||
*
|
||||
* This source code for this demo doesn't demonstrate anything
|
||||
|
@ -15,6 +8,7 @@
|
|||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Reflection;
|
||||
using Gtk;
|
||||
|
||||
namespace GtkDemo
|
||||
|
@ -22,207 +16,182 @@ namespace GtkDemo
|
|||
[Demo ("Stock Item and Icon Browser", "DemoStockBrowser.cs")]
|
||||
public class DemoStockBrowser : Gtk.Window
|
||||
{
|
||||
class StockInfo
|
||||
enum Column {
|
||||
Id,
|
||||
Name,
|
||||
Label,
|
||||
Accel,
|
||||
};
|
||||
|
||||
Label typeLabel, nameLabel, idLabel, accelLabel;
|
||||
Image iconImage;
|
||||
|
||||
public DemoStockBrowser () : base ("Stock Icons and Items")
|
||||
{
|
||||
internal string Name;
|
||||
internal string Label;
|
||||
internal string Accel;
|
||||
internal string ID;
|
||||
internal Gdk.Pixbuf Icon;
|
||||
}
|
||||
|
||||
// in a real application this would be
|
||||
// split into its own file
|
||||
class StockFrame : Gtk.Frame
|
||||
{
|
||||
StockInfo info;
|
||||
Label category;
|
||||
Label name;
|
||||
Label id;
|
||||
Label label;
|
||||
Image icon;
|
||||
|
||||
internal StockFrame () : base ("Selected Item")
|
||||
{
|
||||
this.SetSizeRequest (200, -1);
|
||||
// Icon and Item / Icon Only / ???
|
||||
category = new Label ("???");
|
||||
// icon / blank
|
||||
icon = new Image ("");
|
||||
// _Add / blank
|
||||
label = new Label ();
|
||||
label.UseUnderline = true;
|
||||
// Gtk.Stock.Cancel
|
||||
name = new Label ();
|
||||
// gtk-stock-cancel
|
||||
id = new Label ();
|
||||
|
||||
VBox vbox = new VBox (false, 3);
|
||||
vbox.PackStart (category, false, true, 0);
|
||||
vbox.PackStart (icon, false, true, 0);
|
||||
vbox.PackStart (label, false, true, 0);
|
||||
vbox.PackStart (name, false, true, 0);
|
||||
vbox.PackStart (id, false, true, 0);
|
||||
|
||||
this.Add (vbox);
|
||||
this.ShowAll ();
|
||||
}
|
||||
|
||||
internal StockInfo Info
|
||||
{
|
||||
get { return info; }
|
||||
set {
|
||||
info = value;
|
||||
name.Text = info.Name;
|
||||
label.Text = info.Label;
|
||||
id.Text = info.ID;
|
||||
icon.Pixbuf = info.Icon;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StockFrame stockFrame;
|
||||
|
||||
public DemoStockBrowser () : base ("Stock Item Browser Demo")
|
||||
{
|
||||
this.SetDefaultSize (600, 400);
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.BorderWidth = 8;
|
||||
SetDefaultSize (-1, 500);
|
||||
BorderWidth = 8;
|
||||
|
||||
HBox hbox = new HBox (false, 8);
|
||||
this.Add (hbox);
|
||||
Add (hbox);
|
||||
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow (null, null);
|
||||
scrolledWindow.SetPolicy (PolicyType.Never, PolicyType.Automatic);
|
||||
hbox.PackStart (scrolledWindow, true, true, 0);
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.SetPolicy (PolicyType.Never, PolicyType.Automatic);
|
||||
hbox.PackStart (sw, false, false, 0);
|
||||
|
||||
TreeView list = new TreeView ();
|
||||
list.AppendColumn ("Icon", new CellRendererPixbuf (), "pixbuf", 0);
|
||||
list.AppendColumn ("Name", new CellRendererText (), "text", 1);
|
||||
list.AppendColumn ("Label", new CellRendererText (), "text", 2);
|
||||
list.AppendColumn ("Accel", new CellRendererText (), "text", 3);
|
||||
list.AppendColumn ("ID", new CellRendererText (), "text", 4);
|
||||
list.Model = CreateStore ();
|
||||
ListStore model = CreateModel ();
|
||||
|
||||
list.Selection.Changed += new EventHandler (OnSelectionChanged);
|
||||
scrolledWindow.Add (list);
|
||||
TreeView treeview = new TreeView (model);
|
||||
sw.Add (treeview);
|
||||
|
||||
stockFrame = new StockFrame ();
|
||||
hbox.PackStart (stockFrame, false, false, 0);
|
||||
TreeViewColumn column = new TreeViewColumn ();
|
||||
column.Title = "Name";
|
||||
CellRenderer renderer = new CellRendererPixbuf ();
|
||||
column.PackStart (renderer, false);
|
||||
column.SetAttributes (renderer, "stock_id", Column.Id);
|
||||
renderer = new CellRendererText ();
|
||||
column.PackStart (renderer, true);
|
||||
column.SetAttributes (renderer, "text", Column.Name);
|
||||
|
||||
this.ShowAll ();
|
||||
treeview.AppendColumn (column);
|
||||
treeview.AppendColumn ("Label", new CellRendererText (), "text", Column.Label);
|
||||
treeview.AppendColumn ("Accel", new CellRendererText (), "text", Column.Accel);
|
||||
treeview.AppendColumn ("ID", new CellRendererText (), "text", Column.Id);
|
||||
|
||||
Alignment align = new Alignment (0.5f, 0.0f, 0.0f, 0.0f);
|
||||
hbox.PackEnd (align, false, false, 0);
|
||||
|
||||
Frame frame = new Frame ("Selected Item");
|
||||
align.Add (frame);
|
||||
|
||||
VBox vbox = new VBox (false, 8);
|
||||
vbox.BorderWidth = 8;
|
||||
frame.Add (vbox);
|
||||
|
||||
typeLabel = new Label ();
|
||||
vbox.PackStart (typeLabel, false, false, 0);
|
||||
iconImage = new Gtk.Image ();
|
||||
vbox.PackStart (iconImage, false, false, 0);
|
||||
accelLabel = new Label ();
|
||||
vbox.PackStart (accelLabel, false, false, 0);
|
||||
nameLabel = new Label ();
|
||||
vbox.PackStart (nameLabel, false, false, 0);
|
||||
idLabel = new Label ();
|
||||
vbox.PackStart (idLabel, false, false, 0);
|
||||
|
||||
treeview.Selection.Mode = Gtk.SelectionMode.Single;
|
||||
treeview.Selection.Changed += new EventHandler (SelectionChanged);
|
||||
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private ListStore CreateStore ()
|
||||
private ListStore CreateModel ()
|
||||
{
|
||||
// FIXME: tremendous duplication of info
|
||||
// image, name, label, accel, id, StockInfo
|
||||
ListStore store = new Gtk.ListStore (typeof (Gdk.Pixbuf), typeof(string), typeof(string), typeof(string), typeof (string), typeof (StockInfo));
|
||||
ListStore store = new Gtk.ListStore (typeof (string), typeof(string), typeof(string), typeof(string), typeof (string));
|
||||
|
||||
string[] stock_ids = Gtk.Stock.ListIds ();
|
||||
string[] stockIds = Gtk.Stock.ListIds ();
|
||||
Array.Sort (stockIds);
|
||||
|
||||
foreach (string s in stock_ids)
|
||||
{
|
||||
// Use reflection to get the list of C# names
|
||||
Hashtable idToName = new Hashtable ();
|
||||
foreach (PropertyInfo info in typeof (Gtk.Stock).GetProperties (BindingFlags.Public | BindingFlags.Static)) {
|
||||
if (info.PropertyType == typeof (string))
|
||||
idToName[info.GetValue (null, null)] = "Gtk.Stock." + info.Name;
|
||||
}
|
||||
|
||||
foreach (string id in stockIds) {
|
||||
Gtk.StockItem si;
|
||||
si = Gtk.Stock.Lookup (s);
|
||||
if (si.StockId != null) {
|
||||
Gdk.Pixbuf icon = this.RenderIcon (s, IconSize.Menu, "");
|
||||
StockInfo info = new StockInfo ();
|
||||
info.Icon = icon;
|
||||
info.Name = GetCLSName (si.StockId);
|
||||
info.Label = si.Label;
|
||||
info.Accel = GetKeyName (si);
|
||||
info.ID = si.StockId;
|
||||
string accel;
|
||||
|
||||
// FIXME: si.Label needs to _AccelAware
|
||||
store.AppendValues (icon, GetCLSName (si.StockId), si.Label, GetKeyName (si), si.StockId, info);
|
||||
}
|
||||
else {
|
||||
//Console.WriteLine ("StockItem '{0}' could not be found.", s);
|
||||
}
|
||||
si = Gtk.Stock.Lookup (id);
|
||||
if (si.Keyval != 0)
|
||||
accel = Accelerator.Name (si.Keyval, si.Modifier);
|
||||
else
|
||||
accel = "";
|
||||
|
||||
store.AppendValues (id, idToName[id], si.Label, accel);
|
||||
}
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
// changes 'gtk-stock-close' into 'Gtk.Stock.Close'
|
||||
// should use StudlyCaps from gapi2xml.pl instead
|
||||
string GetCLSName (string stockID)
|
||||
{
|
||||
string cls = "";
|
||||
if (stockID.StartsWith ("gtk-"))
|
||||
cls = stockID.Substring (4, stockID.Length - 4);
|
||||
|
||||
char[] split = cls.ToCharArray ();
|
||||
bool raiseNext = false;
|
||||
ArrayList tmp = new ArrayList ();
|
||||
tmp.Add (char.ToUpper (split[0]));
|
||||
|
||||
for (int i = 1; i < split.Length; i ++)
|
||||
{
|
||||
if (split[i] == '-') {
|
||||
raiseNext = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (raiseNext) {
|
||||
tmp.Add (char.ToUpper (split[i]));
|
||||
raiseNext = false;
|
||||
}
|
||||
else {
|
||||
tmp.Add (split[i]);
|
||||
}
|
||||
}
|
||||
|
||||
split = new char[tmp.Count];
|
||||
int j = 0;
|
||||
foreach (char c in tmp)
|
||||
split[j++] = c;
|
||||
|
||||
return "Gtk.Stock." + new string (split);
|
||||
}
|
||||
|
||||
// use si.Keyval and si.Modifier
|
||||
// to produce a reasonable representation
|
||||
// of the key binding
|
||||
string GetKeyName (StockItem si)
|
||||
{
|
||||
string mod = "";
|
||||
string key = "";
|
||||
|
||||
switch (si.Modifier) {
|
||||
// seems to be the only one used
|
||||
case Gdk.ModifierType.ControlMask:
|
||||
mod = "<Control>";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (si.Keyval > 0)
|
||||
key = Gdk.Keyval.Name (si.Keyval);
|
||||
|
||||
return String.Format ("{0} {1}", mod, key);
|
||||
}
|
||||
|
||||
void OnSelectionChanged (object o, EventArgs args)
|
||||
void SelectionChanged (object o, EventArgs args)
|
||||
{
|
||||
TreeSelection selection = (TreeSelection)o;
|
||||
TreeIter iter;
|
||||
TreeModel model;
|
||||
|
||||
if (((TreeSelection) o).GetSelected (out model, out iter))
|
||||
{
|
||||
StockInfo info = (StockInfo) model.GetValue (iter, 5);
|
||||
stockFrame.Info = info;
|
||||
if (selection.GetSelected (out model, out iter)) {
|
||||
string id = (string) model.GetValue (iter, (int)Column.Id);
|
||||
string name = (string) model.GetValue (iter, (int)Column.Name);
|
||||
string label = (string) model.GetValue (iter, (int)Column.Label);
|
||||
string accel = (string) model.GetValue (iter, (int)Column.Accel);
|
||||
|
||||
IconSize size = GetLargestSize (id);
|
||||
bool icon = (size != IconSize.Invalid);
|
||||
|
||||
if (icon && label != null)
|
||||
typeLabel.Text = "Icon and Item";
|
||||
else if (icon)
|
||||
typeLabel.Text = "Icon Only";
|
||||
else if (label != null)
|
||||
typeLabel.Text = "Item Only";
|
||||
else
|
||||
typeLabel.Text = "???????";
|
||||
|
||||
if (name != null)
|
||||
nameLabel.Text = name;
|
||||
else
|
||||
nameLabel.Text = "";
|
||||
|
||||
idLabel.Text = id;
|
||||
|
||||
if (label != null)
|
||||
accelLabel.TextWithMnemonic = label + " " + accel;
|
||||
else
|
||||
accelLabel.Text = "";
|
||||
|
||||
if (icon)
|
||||
iconImage.SetFromStock (id, size);
|
||||
else
|
||||
iconImage.Pixbuf = null;
|
||||
} else {
|
||||
typeLabel.Text = "No selected item";
|
||||
nameLabel.Text = "";
|
||||
idLabel.Text = "";
|
||||
accelLabel.Text = "";
|
||||
iconImage.Pixbuf = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
// Finds the largest size at which the given image stock id is
|
||||
// available. This would not be useful for a normal application
|
||||
|
||||
private IconSize GetLargestSize (string stockId)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
}
|
||||
IconSet set = IconFactory.LookupDefault (stockId);
|
||||
if (set == null)
|
||||
return IconSize.Invalid;
|
||||
|
||||
IconSize[] sizes = set.Sizes;
|
||||
IconSize bestSize = IconSize.Invalid;
|
||||
int bestPixels = 0;
|
||||
|
||||
foreach (IconSize size in sizes) {
|
||||
int width, height;
|
||||
Gtk.Icon.SizeLookup (size, out width, out height);
|
||||
if (width * height > bestPixels) {
|
||||
bestSize = size;
|
||||
bestPixels = width * height;
|
||||
}
|
||||
}
|
||||
|
||||
return bestSize;
|
||||
}
|
||||
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,4 @@
|
|||
//
|
||||
// DemoTextView.cs, port of textview.c form gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// (C) 2003 Ximian, Inc.
|
||||
|
||||
/* Text Widget
|
||||
/* Text Widget/Multiple Views
|
||||
*
|
||||
* The Gtk.TextView widget displays a Gtk.TextBuffer. One Gtk.TextBuffer
|
||||
* can be displayed by multiple Gtk.TextViews. This demo has two views
|
||||
|
@ -27,34 +20,31 @@ namespace GtkDemo
|
|||
TextView view1;
|
||||
TextView view2;
|
||||
|
||||
public DemoTextView () : base ("TextView Demo")
|
||||
public DemoTextView () : base ("TextView")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
this.SetDefaultSize (450,450);
|
||||
this.BorderWidth = 6;
|
||||
SetDefaultSize (450,450);
|
||||
BorderWidth = 0;
|
||||
|
||||
VPaned vpaned = new VPaned ();
|
||||
vpaned.BorderWidth = 5;
|
||||
this.Add (vpaned);
|
||||
Add (vpaned);
|
||||
|
||||
/* For convenience, we just use the autocreated buffer from
|
||||
* the first text view; you could also create the buffer
|
||||
* by itself with new Gtk.TextBuffer (), then later create
|
||||
* a view widget.
|
||||
*/
|
||||
// For convenience, we just use the autocreated buffer from
|
||||
// the first text view; you could also create the buffer
|
||||
// by itself, then later create a view widget.
|
||||
view1 = new TextView ();
|
||||
TextBuffer buffer = view1.Buffer;
|
||||
view2 = new TextView (buffer);
|
||||
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow ();
|
||||
scrolledWindow.SetPolicy (PolicyType.Automatic, Gtk.PolicyType.Automatic);
|
||||
vpaned.Add1 (scrolledWindow);
|
||||
scrolledWindow.Add (view1);
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vpaned.Add1 (sw);
|
||||
sw.Add (view1);
|
||||
|
||||
scrolledWindow = new Gtk.ScrolledWindow ();
|
||||
scrolledWindow.SetPolicy (Gtk.PolicyType.Automatic, Gtk.PolicyType.Automatic);
|
||||
vpaned.Add2 (scrolledWindow);
|
||||
scrolledWindow.Add (view2);
|
||||
sw = new ScrolledWindow ();
|
||||
sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vpaned.Add2 (sw);
|
||||
sw.Add (view2);
|
||||
|
||||
CreateTags (buffer);
|
||||
InsertText (buffer);
|
||||
|
@ -62,9 +52,7 @@ namespace GtkDemo
|
|||
AttachWidgets (view1);
|
||||
AttachWidgets (view2);
|
||||
|
||||
vpaned.ShowAll();
|
||||
|
||||
this.ShowAll ();
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private TextChildAnchor buttonAnchor;
|
||||
|
@ -75,6 +63,9 @@ namespace GtkDemo
|
|||
|
||||
private void AttachWidgets (TextView textView)
|
||||
{
|
||||
// This is really different from the C version, but the
|
||||
// C versions seems a little pointless.
|
||||
|
||||
Button button = new Button ("Click Me");
|
||||
button.Clicked += new EventHandler(EasterEggCB);
|
||||
textView.AddChildAtAnchor (button, buttonAnchor);
|
||||
|
@ -84,7 +75,6 @@ namespace GtkDemo
|
|||
combo.AppendText ("Option 1");
|
||||
combo.AppendText ("Option 2");
|
||||
combo.AppendText ("Option 3");
|
||||
combo.Active = 0;
|
||||
|
||||
textView.AddChildAtAnchor (combo, menuAnchor);
|
||||
|
||||
|
@ -94,7 +84,7 @@ namespace GtkDemo
|
|||
textView.AddChildAtAnchor (scale, scaleAnchor);
|
||||
scale.ShowAll ();
|
||||
|
||||
Gtk.Image image = new Gtk.Image (Gdk.Pixbuf.LoadFromResource ("floppybuddy.gif"));
|
||||
Gtk.Image image = Gtk.Image.LoadFromResource ("floppybuddy.gif");
|
||||
textView.AddChildAtAnchor (image, animationAnchor);
|
||||
image.ShowAll ();
|
||||
|
||||
|
@ -103,26 +93,29 @@ namespace GtkDemo
|
|||
entry.ShowAll ();
|
||||
}
|
||||
|
||||
const int gray50_width = 2;
|
||||
const int gray50_height = 2;
|
||||
const string gray50_bits = "\x02\x01";
|
||||
|
||||
private void CreateTags (TextBuffer buffer)
|
||||
{
|
||||
/* Create a bunch of tags. Note that it's also possible to
|
||||
* create tags with gtk_text_tag_new() then add them to the
|
||||
* tag table for the buffer, gtk_text_buffer_create_tag() is
|
||||
* just a convenience function. Also note that you don't have
|
||||
* to give tags a name; pass NULL for the name to create an
|
||||
* anonymous tag.
|
||||
*
|
||||
* In any real app, another useful optimization would be to create
|
||||
* a GtkTextTagTable in advance, and reuse the same tag table for
|
||||
* all the buffers with the same tag set, instead of creating
|
||||
* new copies of the same tags for every buffer.
|
||||
*
|
||||
* Tags are assigned default priorities in order of addition to the
|
||||
* tag table. That is, tags created later that affect the same text
|
||||
* property affected by an earlier tag will override the earlier
|
||||
* tag. You can modify tag priorities with
|
||||
* gtk_text_tag_set_priority().
|
||||
*/
|
||||
// Create a bunch of tags. Note that it's also possible to
|
||||
// create tags with gtk_text_tag_new() then add them to the
|
||||
// tag table for the buffer, gtk_text_buffer_create_tag() is
|
||||
// just a convenience function. Also note that you don't have
|
||||
// to give tags a name; pass NULL for the name to create an
|
||||
// anonymous tag.
|
||||
//
|
||||
// In any real app, another useful optimization would be to create
|
||||
// a GtkTextTagTable in advance, and reuse the same tag table for
|
||||
// all the buffers with the same tag set, instead of creating
|
||||
// new copies of the same tags for every buffer.
|
||||
//
|
||||
// Tags are assigned default priorities in order of addition to the
|
||||
// tag table. That is, tags created later that affect the same text
|
||||
// property affected by an earlier tag will override the earlier
|
||||
// tag. You can modify tag priorities with
|
||||
// gtk_text_tag_set_priority().
|
||||
|
||||
TextTag tag = new TextTag ("heading");
|
||||
tag.Weight = Pango.Weight.Bold;
|
||||
|
@ -161,15 +154,11 @@ namespace GtkDemo
|
|||
tag.Background = "red";
|
||||
buffer.TagTable.Add (tag);
|
||||
|
||||
int gray50_width = 2;
|
||||
int gray50_height = 2;
|
||||
string gray50_bits = new string ((char) 0x02, (char) 0x01);
|
||||
|
||||
// The C gtk-demo passes NULL for the drawable param, which isn't
|
||||
// multi-head safe, so it seems bad to allow it in the C# API.
|
||||
// But the Window isn't realized at this point, so we can't get
|
||||
// an actual Drawable from it. So we kludge for now.
|
||||
Pixmap stipple = Pixmap.CreateBitmapFromData (Gdk.Screen.Default.RootWindow, (string) gray50_bits, gray50_width, gray50_height);
|
||||
Pixmap stipple = Pixmap.CreateBitmapFromData (Gdk.Screen.Default.RootWindow, gray50_bits, gray50_width, gray50_height);
|
||||
|
||||
tag = new TextTag ("background_stipple");
|
||||
tag.BackgroundStipple = stipple;
|
||||
|
@ -253,21 +242,18 @@ namespace GtkDemo
|
|||
|
||||
private void InsertText (TextBuffer buffer)
|
||||
{
|
||||
// we use resources for portability and convenience
|
||||
Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource ("gtk-logo-rgb.gif");
|
||||
pixbuf.ScaleSimple (32, 32, InterpType.Bilinear);
|
||||
pixbuf = pixbuf.ScaleSimple (32, 32, InterpType.Bilinear);
|
||||
|
||||
/* get start of buffer; each insertion will revalidate the
|
||||
* iterator to point to just after the inserted text.
|
||||
*/
|
||||
// get start of buffer; each insertion will revalidate the
|
||||
// iterator to point to just after the inserted text.
|
||||
|
||||
TextIter insertIter;
|
||||
|
||||
insertIter = buffer.GetIterAtOffset (0);
|
||||
TextIter insertIter = buffer.StartIter;
|
||||
buffer.Insert (ref insertIter,
|
||||
"The text widget can display text with all kinds of nifty attributes. It also supports multiple views of the same buffer; this demo is showing the same buffer in two places.\n\n");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Font styles. ", "heading");
|
||||
|
||||
buffer.Insert (ref insertIter, "For example, you can have ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "italic", "italic");
|
||||
buffer.Insert (ref insertIter, ", ");
|
||||
|
@ -276,106 +262,122 @@ namespace GtkDemo
|
|||
buffer.InsertWithTagsByName (ref insertIter, "monospace (typewriter)", "monospace");
|
||||
buffer.Insert (ref insertIter, ", or ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "big", "big");
|
||||
buffer.Insert (ref insertIter, " text");
|
||||
buffer.Insert (ref insertIter, " text. ");
|
||||
buffer.Insert (ref insertIter,
|
||||
"It's best not to hardcode specific text sizes; you can use relative sizes as with CSS, such as ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "xx-small", "xx-small");
|
||||
buffer.Insert (ref insertIter, ", or");
|
||||
buffer.Insert (ref insertIter, " or");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "x-large", "x-large");
|
||||
buffer.Insert (ref insertIter,
|
||||
" to ensure that your program properly adapts if the user changes the default font size.\n\n");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Colors such as", "heading");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Colors. ", "heading");
|
||||
|
||||
buffer.Insert (ref insertIter, "Colors such as ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "a blue foreground", "blue_foreground");
|
||||
buffer.Insert (ref insertIter, ", or ");
|
||||
buffer.Insert (ref insertIter, " or ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "a red background", "red_background");
|
||||
buffer.Insert (ref insertIter, " or even ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "a stippled red background",
|
||||
"red_background",
|
||||
"background_stipple");
|
||||
buffer.Insert (ref insertIter, ", or ");
|
||||
|
||||
buffer.Insert (ref insertIter, " or ");
|
||||
buffer.InsertWithTagsByName (ref insertIter,
|
||||
"a stippled blue foreground on solid red background",
|
||||
"blue_foreground",
|
||||
"red_background",
|
||||
"foreground_stipple");
|
||||
buffer.Insert (ref insertIter, " (select that to read it) can be used.\n\n");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Underline, strikethrough, and rise. ", "heading");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Strikethrough", "strikethrough");
|
||||
buffer.Insert (ref insertIter, ", ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "underline", "underline");
|
||||
buffer.Insert (ref insertIter, ", ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "double_underline", "double_underline");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "double underline", "double_underline");
|
||||
buffer.Insert (ref insertIter, ", ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "superscript", "superscript");
|
||||
buffer.Insert (ref insertIter, ", and ");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "subscript", "subscript");
|
||||
buffer.Insert (ref insertIter, " are all supported.\n\n");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Images. ", "heading");
|
||||
|
||||
buffer.Insert (ref insertIter, "The buffer can have images in it: ");
|
||||
|
||||
insertIter = buffer.GetIterAtMark (buffer.InsertMark);
|
||||
buffer.InsertPixbuf (ref insertIter, pixbuf);
|
||||
insertIter = buffer.GetIterAtMark (buffer.InsertMark);
|
||||
buffer.InsertPixbuf (ref insertIter, pixbuf);
|
||||
insertIter = buffer.GetIterAtMark (buffer.InsertMark);
|
||||
buffer.InsertPixbuf (ref insertIter, pixbuf);
|
||||
|
||||
buffer.Insert (ref insertIter, " for example.\n\n");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Spacing. ", "heading");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "You can adjust the amount of space before each line.\n", "big_gap_before_line", "wide_margins");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "You can also adjust the amount of space after each line; this line has a whole lot of space after it.\n", "big_gap_after_line", "wide_margins");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "You can also adjust the amount of space between wrapped lines; this line has extra space between each wrapped line in the same paragraph. To show off wrapping, some filler text: the quick brown fox jumped over the lazy dog. Blah blah blah blah blah blah blah blah blah.\n", "double_spaced_line", "wide_margins");
|
||||
|
||||
buffer.Insert (ref insertIter, "You can adjust the amount of space before each line.\n");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line has a whole lot of space before it.\n",
|
||||
"big_gap_before_line", "wide_margins");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "You can also adjust the amount of space after each line; this line has a whole lot of space after it.\n",
|
||||
"big_gap_after_line", "wide_margins");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "You can also adjust the amount of space between wrapped lines; this line has extra space between each wrapped line in the same paragraph. To show off wrapping, some filler text: the quick brown fox jumped over the lazy dog. Blah blah blah blah blah blah blah blah blah.\n",
|
||||
"double_spaced_line", "wide_margins");
|
||||
|
||||
buffer.Insert (ref insertIter, "Also note that those lines have extra-wide margins.\n\n");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Editability. ", "heading");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line is 'locked down' and can't be edited by the user - just try it! You can't delete this line.\n\n", "not_editable");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line is 'locked down' and can't be edited by the user - just try it! You can't delete this line.\n\n",
|
||||
"not_editable");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Wrapping. ", "heading");
|
||||
|
||||
buffer.Insert (ref insertIter, "This line (and most of the others in this buffer) is word-wrapped, using the proper Unicode algorithm. Word wrap should work in all scripts and languages that GTK+ supports. Let's make this a long paragraph to demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah\n\n");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line has character-based wrapping, and can wrap between any two character glyphs. Let's make this a long paragraph to demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah\n\n", "char_wrap");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line has all wrapping turned off, so it makes the horizontal scrollbar appear.\n\n\n", "no_wrap");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line has character-based wrapping, and can wrap between any two character glyphs. Let's make this a long paragraph to demonstrate: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah\n\n",
|
||||
"char_wrap");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line has all wrapping turned off, so it makes the horizontal scrollbar appear.\n\n\n",
|
||||
"no_wrap");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Justification. ", "heading");
|
||||
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "\nThis line has center justification.\n", "center");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "This line has right justification.\n", "right_justify");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "\nThis line has big wide margins. Text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text.\n", "wide_margins");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "\nThis line has big wide margins. Text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text.\n",
|
||||
"wide_margins");
|
||||
|
||||
buffer.InsertWithTagsByName (ref insertIter, "Internationalization. ", "heading");
|
||||
|
||||
buffer.Insert (ref insertIter, "You can put all sorts of Unicode text in the buffer.\n\nGerman (Deutsch S\u00fcd) Gr\u00fc\u00df Gott\nGreek (\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac) \u0393\u03b5\u03b9\u03ac \u03c3\u03b1\u03c2\nHebrew \u05e9\u05dc\u05d5\u05dd\nJapanese (\u65e5\u672c\u8a9e)\n\nThe widget properly handles bidirectional text, word wrapping, DOS/UNIX/Unicode paragraph separators, grapheme boundaries, and so on using the Pango internationalization framework.\n");
|
||||
buffer.Insert (ref insertIter, "Here's a word-wrapped quote in a right-to-left language:\n");
|
||||
|
||||
buffer.Insert (ref insertIter, "Here's a word-wrapped quote in a right-to-left language:\n");
|
||||
buffer.InsertWithTagsByName (ref insertIter, "\u0648\u0642\u062f \u0628\u062f\u0623 \u062b\u0644\u0627\u062b \u0645\u0646 \u0623\u0643\u062b\u0631 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u062a\u0642\u062f\u0645\u0627 \u0641\u064a \u0634\u0628\u0643\u0629 \u0627\u0643\u0633\u064a\u0648\u0646 \u0628\u0631\u0627\u0645\u062c\u0647\u0627 \u0643\u0645\u0646\u0638\u0645\u0627\u062a \u0644\u0627 \u062a\u0633\u0639\u0649 \u0644\u0644\u0631\u0628\u062d\u060c \u062b\u0645 \u062a\u062d\u0648\u0644\u062a \u0641\u064a \u0627\u0644\u0633\u0646\u0648\u0627\u062a \u0627\u0644\u062e\u0645\u0633 \u0627\u0644\u0645\u0627\u0636\u064a\u0629 \u0625\u0644\u0649 \u0645\u0624\u0633\u0633\u0627\u062a \u0645\u0627\u0644\u064a\u0629 \u0645\u0646\u0638\u0645\u0629\u060c \u0648\u0628\u0627\u062a\u062a \u062c\u0632\u0621\u0627 \u0645\u0646 \u0627\u0644\u0646\u0638\u0627\u0645 \u0627\u0644\u0645\u0627\u0644\u064a \u0641\u064a \u0628\u0644\u062f\u0627\u0646\u0647\u0627\u060c \u0648\u0644\u0643\u0646\u0647\u0627 \u062a\u062a\u062e\u0635\u0635 \u0641\u064a \u062e\u062f\u0645\u0629 \u0642\u0637\u0627\u0639 \u0627\u0644\u0645\u0634\u0631\u0648\u0639\u0627\u062a \u0627\u0644\u0635\u063a\u064a\u0631\u0629\u002e \u0648\u0623\u062d\u062f \u0623\u0643\u062b\u0631 \u0647\u0630\u0647 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u0646\u062c\u0627\u062d\u0627 \u0647\u0648 \u00bb\u0628\u0627\u0646\u0643\u0648\u0633\u0648\u0644\u00ab \u0641\u064a \u0628\u0648\u0644\u064a\u0641\u064a\u0627.\n\n", "rtl_quote");
|
||||
|
||||
buffer.Insert (ref insertIter, "You can put widgets in the buffer: Here's a button: ");
|
||||
insertIter = buffer.GetIterAtMark(buffer.InsertMark);
|
||||
buttonAnchor = buffer.CreateChildAnchor (ref insertIter);
|
||||
|
||||
buffer.Insert (ref insertIter, "and a menu");
|
||||
insertIter = buffer.GetIterAtMark(buffer.InsertMark);
|
||||
buffer.Insert (ref insertIter, " and a menu: ");
|
||||
menuAnchor = buffer.CreateChildAnchor (ref insertIter);
|
||||
|
||||
buffer.Insert (ref insertIter, "and a scale");
|
||||
insertIter = buffer.GetIterAtMark(buffer.InsertMark);
|
||||
buffer.Insert (ref insertIter, " and a scale: ");
|
||||
scaleAnchor = buffer.CreateChildAnchor (ref insertIter);
|
||||
|
||||
buffer.Insert (ref insertIter, "and an animation");
|
||||
insertIter = buffer.GetIterAtMark(buffer.InsertMark);
|
||||
buffer.Insert (ref insertIter, " and an animation: ");
|
||||
animationAnchor = buffer.CreateChildAnchor (ref insertIter);
|
||||
|
||||
buffer.Insert (ref insertIter, " finally a text entry: ");
|
||||
insertIter = buffer.GetIterAtMark(buffer.InsertMark);
|
||||
entryAnchor = buffer.CreateChildAnchor (ref insertIter);
|
||||
|
||||
buffer.Insert (ref insertIter, "\n");
|
||||
buffer.Insert (ref insertIter, ".\n");
|
||||
|
||||
buffer.Insert (ref insertIter, "\n\nThis demo doesn't demonstrate all the GtkTextBuffer features; it leaves out, for example: invisible/hidden text (doesn't work in GTK 2, but planned), tab stops, application-drawn areas on the sides of the widget for displaying breakpoints and such...");
|
||||
|
||||
buffer.ApplyTag ("word_wrap", buffer.StartIter, buffer.EndIter);
|
||||
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void RecursiveAttach (int depth, TextView view, TextChildAnchor anchor)
|
||||
|
@ -384,10 +386,12 @@ namespace GtkDemo
|
|||
return;
|
||||
|
||||
TextView childView = new TextView (view.Buffer);
|
||||
/* Event box is to add a black border around each child view */
|
||||
|
||||
// Event box is to add a black border around each child view
|
||||
EventBox eventBox = new EventBox ();
|
||||
Gdk.Color blackColor = new Gdk.Color (0x0, 0x0, 0x0);
|
||||
eventBox.ModifyBg (StateType.Normal,blackColor);
|
||||
Gdk.Color color = new Gdk.Color ();
|
||||
Gdk.Color.Parse ("black", ref color);
|
||||
eventBox.ModifyBg (StateType.Normal, color);
|
||||
|
||||
Alignment align = new Alignment (0.5f, 0.5f, 1.0f, 1.0f);
|
||||
align.BorderWidth = 1;
|
||||
|
@ -404,21 +408,21 @@ namespace GtkDemo
|
|||
{
|
||||
TextIter insertIter;
|
||||
|
||||
TextBuffer bufferCB = new TextBuffer (null);
|
||||
insertIter = bufferCB.GetIterAtOffset (0);
|
||||
bufferCB.Insert (ref insertIter, "This buffer is shared by a set of nested text views.\n Nested view:\n");
|
||||
TextChildAnchor anchor = bufferCB.CreateChildAnchor (ref insertIter);
|
||||
bufferCB.Insert (ref insertIter, "\nDon't do this in real applications, please.\n");
|
||||
TextView viewCB = new TextView (bufferCB);
|
||||
TextBuffer buffer = new TextBuffer (null);
|
||||
insertIter = buffer.StartIter;
|
||||
buffer.Insert (ref insertIter, "This buffer is shared by a set of nested text views.\n Nested view:\n");
|
||||
TextChildAnchor anchor = buffer.CreateChildAnchor (ref insertIter);
|
||||
buffer.Insert (ref insertIter, "\nDon't do this in real applications, please.\n");
|
||||
TextView view = new TextView (buffer);
|
||||
|
||||
RecursiveAttach (0, viewCB, anchor);
|
||||
RecursiveAttach (0, view, anchor);
|
||||
|
||||
Gtk.Window window = new Gtk.Window (null);
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow (null, null);
|
||||
scrolledWindow.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
Gtk.Window window = new Gtk.Window (Gtk.WindowType.Toplevel);
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
|
||||
window.Add (scrolledWindow);
|
||||
scrolledWindow.Add (viewCB);
|
||||
window.Add (sw);
|
||||
sw.Add (view);
|
||||
|
||||
window.SetDefaultSize (300, 400);
|
||||
window.ShowAll ();
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
//
|
||||
// DemoTreeItem.cs, port of tree_store.c from gtk-demo
|
||||
//
|
||||
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
|
||||
//
|
||||
// Copyright (C) 2003, Ximian Inc.
|
||||
|
||||
/* Tree View/Tree Store
|
||||
*
|
||||
* The Gtk.TreeStore is used to store data in tree form, to be
|
||||
|
@ -27,20 +20,19 @@ namespace GtkDemo
|
|||
{
|
||||
private TreeStore store;
|
||||
|
||||
public DemoTreeStore () : base ("TreeStore Demo")
|
||||
public DemoTreeStore () : base ("Card planning sheet")
|
||||
{
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
|
||||
VBox vbox = new VBox (false, 8);
|
||||
vbox.BorderWidth = 8;
|
||||
this.Add (vbox);
|
||||
Add (vbox);
|
||||
|
||||
vbox.PackStart (new Label ("Jonathan's Holiday Card Planning Sheet"), false, false, 0);
|
||||
vbox.PackStart (new Label ("Jonathan's Holiday Card Planning Sheet"),
|
||||
false, false, 0);
|
||||
|
||||
ScrolledWindow scrolledWindow = new ScrolledWindow ();
|
||||
scrolledWindow.ShadowType = ShadowType.EtchedIn;
|
||||
scrolledWindow.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vbox.PackStart (scrolledWindow, true, true, 0);
|
||||
ScrolledWindow sw = new ScrolledWindow ();
|
||||
sw.ShadowType = ShadowType.EtchedIn;
|
||||
sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
|
||||
vbox.PackStart (sw, true, true, 0);
|
||||
|
||||
// create model
|
||||
CreateModel ();
|
||||
|
@ -48,128 +40,129 @@ namespace GtkDemo
|
|||
// create tree view
|
||||
TreeView treeView = new TreeView (store);
|
||||
treeView.RulesHint = true;
|
||||
TreeSelection treeSelection = treeView.Selection;
|
||||
treeSelection.Mode = SelectionMode.Multiple;
|
||||
treeView.Selection.Mode = SelectionMode.Multiple;
|
||||
AddColumns (treeView);
|
||||
scrolledWindow.Add (treeView);
|
||||
|
||||
sw.Add (treeView);
|
||||
|
||||
// expand all rows after the treeview widget has been realized
|
||||
for (int i = 0; i < 12; i++)
|
||||
{
|
||||
treeView.ExpandRow (new TreePath (i.ToString ()), false);
|
||||
treeView.Realized += ExpandRows;
|
||||
|
||||
SetDefaultSize (650, 400);
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
this.SetDefaultSize (650, 400);
|
||||
this.ShowAll ();
|
||||
private void ExpandRows (object obj, EventArgs args)
|
||||
{
|
||||
TreeView treeView = obj as TreeView;
|
||||
|
||||
treeView.ExpandAll ();
|
||||
}
|
||||
|
||||
ArrayList columns = new ArrayList ();
|
||||
|
||||
private void ItemToggled (object sender, ToggledArgs args)
|
||||
{
|
||||
CellRendererToggle cellRendererToggle = sender as CellRendererToggle;
|
||||
int column = (int) cellRendererToggle.PersistentData["column"];
|
||||
int column = columns.IndexOf (sender);
|
||||
|
||||
Gtk.TreeIter iter;
|
||||
if (store.GetIterFromString (out iter, args.Path))
|
||||
{
|
||||
if (store.GetIterFromString (out iter, args.Path)) {
|
||||
bool val = (bool) store.GetValue (iter, column);
|
||||
Console.WriteLine ("toggled {0} with value {1}", args.Path, !val);
|
||||
store.SetValue (iter, column, !val);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddColumns (TreeView treeView)
|
||||
{
|
||||
CellRendererText text;
|
||||
CellRendererToggle toggle;
|
||||
|
||||
// column for holiday names
|
||||
CellRendererText rendererText = new CellRendererText ();
|
||||
rendererText.Xalign = 0.0f;
|
||||
rendererText.PersistentData ["column"] = Column.HolidayName;
|
||||
TreeViewColumn column = new TreeViewColumn ("Holiday", rendererText,
|
||||
text = new CellRendererText ();
|
||||
text.Xalign = 0.0f;
|
||||
columns.Add (text);
|
||||
TreeViewColumn column = new TreeViewColumn ("Holiday", text,
|
||||
"text", Column.HolidayName);
|
||||
treeView.InsertColumn (column, (int) Column.HolidayName);
|
||||
|
||||
// alex column
|
||||
CellRendererToggle rendererToggle = new CellRendererToggle ();
|
||||
rendererToggle.Xalign = 0.0f;
|
||||
rendererToggle.PersistentData ["column"] = Column.Alex;
|
||||
rendererToggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
rendererToggle.Visible = true;
|
||||
rendererToggle.Activatable = true;
|
||||
rendererToggle.Active = true;
|
||||
column = new TreeViewColumn ("Alex", rendererToggle, "active", (int) Column.Alex);
|
||||
toggle = new CellRendererToggle ();
|
||||
toggle.Xalign = 0.0f;
|
||||
columns.Add (toggle);
|
||||
toggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Alex", toggle,
|
||||
"active", (int) Column.Alex,
|
||||
"visible", (int) Column.Visible,
|
||||
"activatable", (int) Column.World);
|
||||
column.Sizing = TreeViewColumnSizing.Fixed;
|
||||
column.FixedWidth = 50;
|
||||
column.Clickable = true;
|
||||
treeView.InsertColumn (column, (int) Column.Alex);
|
||||
|
||||
// havoc column
|
||||
rendererToggle = new CellRendererToggle ();
|
||||
rendererToggle.Xalign = 0.0f;
|
||||
rendererToggle.PersistentData ["column"] = Column.Havoc;
|
||||
rendererToggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Havoc", rendererToggle, "active", (int) Column.Havoc);
|
||||
column.Visible = true;
|
||||
rendererToggle.Activatable = true;
|
||||
rendererToggle.Active = true;
|
||||
toggle = new CellRendererToggle ();
|
||||
toggle.Xalign = 0.0f;
|
||||
columns.Add (toggle);
|
||||
toggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Havoc", toggle,
|
||||
"active", (int) Column.Havoc,
|
||||
"visible", (int) Column.Visible);
|
||||
treeView.InsertColumn (column, (int) Column.Havoc);
|
||||
column.Sizing = TreeViewColumnSizing.Fixed;
|
||||
column.FixedWidth = 50;
|
||||
column.Clickable = true;
|
||||
|
||||
// tim column
|
||||
rendererToggle = new CellRendererToggle ();
|
||||
rendererToggle.Xalign = 0.0f;
|
||||
rendererToggle.PersistentData ["column"] = Column.Tim;
|
||||
rendererToggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Tim", rendererToggle, "active", (int) Column.Tim);
|
||||
column.Visible = true;
|
||||
rendererToggle.Activatable = true;
|
||||
rendererToggle.Active = true;
|
||||
toggle = new CellRendererToggle ();
|
||||
toggle.Xalign = 0.0f;
|
||||
columns.Add (toggle);
|
||||
toggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Tim", toggle,
|
||||
"active", (int) Column.Tim,
|
||||
"visible", (int) Column.Visible,
|
||||
"activatable", (int) Column.World);
|
||||
treeView.InsertColumn (column, (int) Column.Tim);
|
||||
column.Sizing = TreeViewColumnSizing.Fixed;
|
||||
column.FixedWidth = 50;
|
||||
column.Clickable = true;
|
||||
|
||||
// owen column
|
||||
rendererToggle = new CellRendererToggle ();
|
||||
rendererToggle.Xalign = 0.0f;
|
||||
rendererToggle.PersistentData ["column"] = Column.Owen;
|
||||
rendererToggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Owen", rendererToggle, "active", (int) Column.Owen);
|
||||
column.Visible = true;
|
||||
rendererToggle.Activatable = true;
|
||||
rendererToggle.Active = true;
|
||||
toggle = new CellRendererToggle ();
|
||||
toggle.Xalign = 0.0f;
|
||||
columns.Add (toggle);
|
||||
toggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Owen", toggle,
|
||||
"active", (int) Column.Owen,
|
||||
"visible", (int) Column.Visible);
|
||||
treeView.InsertColumn (column, (int) Column.Owen);
|
||||
column.Sizing = TreeViewColumnSizing.Fixed;
|
||||
column.FixedWidth = 50;
|
||||
column.Clickable = true;
|
||||
|
||||
// dave column
|
||||
rendererToggle = new CellRendererToggle ();
|
||||
rendererToggle.Xalign = 0.0f;
|
||||
rendererToggle.PersistentData ["column"] = Column.Dave;
|
||||
rendererToggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Dave", rendererToggle, "active", (int) Column.Dave);
|
||||
column.Visible = true;
|
||||
rendererToggle.Activatable = true;
|
||||
rendererToggle.Active = true;
|
||||
toggle = new CellRendererToggle ();
|
||||
toggle.Xalign = 0.0f;
|
||||
columns.Add (toggle);
|
||||
toggle.Toggled += new ToggledHandler (ItemToggled);
|
||||
column = new TreeViewColumn ("Dave", toggle,
|
||||
"active", (int) Column.Dave,
|
||||
"visible", (int) Column.Visible);
|
||||
treeView.InsertColumn (column, (int) Column.Dave);
|
||||
column.Sizing = TreeViewColumnSizing.Fixed;
|
||||
column.FixedWidth = 50;
|
||||
column.Clickable = true;
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CreateModel ()
|
||||
{
|
||||
// create tree store
|
||||
store = new TreeStore (
|
||||
typeof(string),
|
||||
store = new TreeStore (typeof (string),
|
||||
typeof (bool),
|
||||
typeof (bool),
|
||||
typeof (bool),
|
||||
|
@ -179,9 +172,7 @@ namespace GtkDemo
|
|||
typeof (bool));
|
||||
|
||||
// add data to the tree store
|
||||
|
||||
foreach (MyTreeItem month in toplevel)
|
||||
{
|
||||
foreach (MyTreeItem month in toplevel) {
|
||||
TreeIter iter = store.AppendValues (month.Label,
|
||||
false,
|
||||
false,
|
||||
|
@ -191,16 +182,16 @@ namespace GtkDemo
|
|||
false,
|
||||
false);
|
||||
|
||||
foreach (MyTreeItem hollyday in month.Children)
|
||||
{
|
||||
foreach (MyTreeItem holiday in month.Children) {
|
||||
store.AppendValues (iter,
|
||||
hollyday.Label,
|
||||
hollyday.Alex,
|
||||
hollyday.Havoc,
|
||||
hollyday.Tim,
|
||||
hollyday.Owen,
|
||||
hollyday.Dave,
|
||||
true);
|
||||
holiday.Label,
|
||||
holiday.Alex,
|
||||
holiday.Havoc,
|
||||
holiday.Tim,
|
||||
holiday.Owen,
|
||||
holiday.Dave,
|
||||
true,
|
||||
holiday.WorldHoliday);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -316,22 +307,12 @@ namespace GtkDemo
|
|||
public class MyTreeItem
|
||||
{
|
||||
public string Label;
|
||||
public bool Alex;
|
||||
public bool Havoc;
|
||||
public bool Tim;
|
||||
public bool Owen;
|
||||
public bool Dave;
|
||||
public bool World_holiday; /* shared by the European hackers */
|
||||
public bool Alex, Havoc, Tim, Owen, Dave;
|
||||
public bool WorldHoliday; // shared by the European hackers
|
||||
public MyTreeItem[] Children;
|
||||
|
||||
public MyTreeItem (
|
||||
string label,
|
||||
bool alex,
|
||||
bool havoc,
|
||||
bool tim,
|
||||
bool owen,
|
||||
bool dave,
|
||||
bool world_holiday,
|
||||
public MyTreeItem (string label, bool alex, bool havoc, bool tim,
|
||||
bool owen, bool dave, bool worldHoliday,
|
||||
MyTreeItem[] children)
|
||||
{
|
||||
Label = label;
|
||||
|
@ -340,11 +321,11 @@ namespace GtkDemo
|
|||
Tim = tim;
|
||||
Owen = owen;
|
||||
Dave = dave;
|
||||
World_holiday = world_holiday;
|
||||
WorldHoliday = worldHoliday;
|
||||
Children = children;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// columns
|
||||
public enum Column
|
||||
{
|
||||
|
@ -354,9 +335,9 @@ namespace GtkDemo
|
|||
Tim,
|
||||
Owen,
|
||||
Dave,
|
||||
|
||||
Visible,
|
||||
World,
|
||||
Num,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,17 @@ namespace GtkDemo
|
|||
[Demo ("UIManager", "DemoUIManager.cs")]
|
||||
public class DemoUIManager : Window
|
||||
{
|
||||
VBox vbox;
|
||||
enum Color {
|
||||
Red,
|
||||
Green,
|
||||
Blue
|
||||
};
|
||||
|
||||
enum Shape {
|
||||
Square,
|
||||
Rectangle,
|
||||
Oval
|
||||
};
|
||||
|
||||
const string uiInfo =
|
||||
"<ui>" +
|
||||
|
@ -49,98 +59,97 @@ namespace GtkDemo
|
|||
" </toolbar>" +
|
||||
"</ui>";
|
||||
|
||||
public DemoUIManager () : base ("Demo UIManager")
|
||||
{
|
||||
this.SetDefaultSize (400, 300);
|
||||
this.DeleteEvent += new DeleteEventHandler (WindowDelete);
|
||||
|
||||
vbox = new VBox (false, 0);
|
||||
this.Add (vbox);
|
||||
|
||||
AddActions ();
|
||||
|
||||
Button close = new Button (Stock.Close);
|
||||
close.Clicked += new EventHandler (OnCloseClicked);
|
||||
vbox.PackEnd (close, false, true, 0);
|
||||
|
||||
vbox.PackEnd (new Label ("test"), true, true, 0);
|
||||
|
||||
this.ShowAll ();
|
||||
}
|
||||
|
||||
void AddActions ()
|
||||
{
|
||||
ActionEntry[] actions = new ActionEntry[]
|
||||
public DemoUIManager () : base ("UI Manager")
|
||||
{
|
||||
ActionEntry[] entries = new ActionEntry[] {
|
||||
new ActionEntry ("FileMenu", null, "_File", null, null, null),
|
||||
new ActionEntry ("PreferencesMenu", null, "_Preferences", null, null, null),
|
||||
new ActionEntry ("ColorMenu", null, "_Color", null, null, null),
|
||||
new ActionEntry ("ShapeMenu", null, "_Shape", null, null, null),
|
||||
new ActionEntry ("HelpMenu", null, "_Help", null, null, null),
|
||||
new ActionEntry ("New", Stock.New, "_New", "<control>N", "Create a new file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Open", Stock.Open, "_Open", "<control>O", "Open a file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Save", Stock.Save, "_Save", "<control>S", "Save current file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("SaveAs", Stock.SaveAs, "Save _As", null, "Save to a file", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Quit", Stock.Quit, "_Quit", "<control>Q", "Quit", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("About", null, "_About", "<control>A", "About", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Logo", "demo-gtk-logo", "Gtk#", null, "Gtk#", new EventHandler (OnActionActivated))
|
||||
new ActionEntry ("New", Stock.New, "_New", "<control>N", "Create a new file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Open", Stock.Open, "_Open", "<control>O", "Open a file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Save", Stock.Save, "_Save", "<control>S", "Save current file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("SaveAs", Stock.SaveAs, "Save _As", null, "Save to a file", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Quit", Stock.Quit, "_Quit", "<control>Q", "Quit", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("About", null, "_About", "<control>A", "About", new EventHandler (ActionActivated)),
|
||||
new ActionEntry ("Logo", "demo-gtk-logo", null, null, "Gtk#", new EventHandler (ActionActivated))
|
||||
};
|
||||
|
||||
ToggleActionEntry[] toggleActions = new ToggleActionEntry[]
|
||||
{
|
||||
new ToggleActionEntry ("Bold", Stock.Bold, "_Bold", "<control>B", "Bold", new EventHandler (OnActionActivated), false)
|
||||
ToggleActionEntry[] toggleEntries = new ToggleActionEntry[] {
|
||||
new ToggleActionEntry ("Bold", Stock.Bold, "_Bold", "<control>B", "Bold", new EventHandler (ActionActivated), true)
|
||||
};
|
||||
|
||||
ActionEntry[] colorActions = new ActionEntry[]
|
||||
{
|
||||
new ActionEntry ("Red", null, "_Red", "<control>R", "Blood", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Green", null, "_Green", "<control>G", "Grass", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Blue", null, "_Blue", "<control>B", "Sky", new EventHandler (OnActionActivated))
|
||||
|
||||
RadioActionEntry[] colorEntries = new RadioActionEntry[] {
|
||||
new RadioActionEntry ("Red", null, "_Red", "<control>R", "Blood", (int)Color.Red),
|
||||
new RadioActionEntry ("Green", null, "_Green", "<control>G", "Grass", (int)Color.Green),
|
||||
new RadioActionEntry ("Blue", null, "_Blue", "<control>B", "Sky", (int)Color.Blue)
|
||||
};
|
||||
|
||||
ActionEntry[] shapeActions = new ActionEntry[]
|
||||
{
|
||||
new ActionEntry ("Square", null, "_Square", "<control>S", "Square", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Rectangle", null, "_Rectangle", "<control>R", "Rectangle", new EventHandler (OnActionActivated)),
|
||||
new ActionEntry ("Oval", null, "_Oval", "<control>O", "Oval", new EventHandler (OnActionActivated))
|
||||
RadioActionEntry[] shapeEntries = new RadioActionEntry[] {
|
||||
new RadioActionEntry ("Square", null, "_Square", "<control>S", "Square", (int)Shape.Square),
|
||||
new RadioActionEntry ("Rectangle", null, "_Rectangle", "<control>R", "Rectangle", (int)Shape.Rectangle),
|
||||
new RadioActionEntry ("Oval", null, "_Oval", "<control>O", "Egg", (int)Shape.Oval)
|
||||
};
|
||||
|
||||
ActionGroup group = new ActionGroup ("group");
|
||||
group.Add (actions);
|
||||
group.Add (toggleActions);
|
||||
group.Add (colorActions);
|
||||
group.Add (shapeActions);
|
||||
ActionGroup actions = new ActionGroup ("group");
|
||||
actions.Add (entries);
|
||||
actions.Add (toggleEntries);
|
||||
actions.Add (colorEntries, (int)Color.Red, new ChangedHandler (RadioActionActivated));
|
||||
actions.Add (shapeEntries, (int)Shape.Oval, new ChangedHandler (RadioActionActivated));
|
||||
|
||||
UIManager uim = new UIManager ();
|
||||
uim.InsertActionGroup (group, (int) uim.NewMergeId ());
|
||||
uim.AddWidget += new AddWidgetHandler (OnAddWidget);
|
||||
uim.InsertActionGroup (actions, 0);
|
||||
AddAccelGroup (uim.AccelGroup);
|
||||
uim.AddUiFromString (uiInfo);
|
||||
|
||||
VBox box1 = new VBox (false, 0);
|
||||
Add (box1);
|
||||
|
||||
box1.PackStart (uim.GetWidget ("/MenuBar"), false, false, 0);
|
||||
|
||||
Label label = new Label ("Type\n<alt>\nto start");
|
||||
label.SetSizeRequest (200, 200);
|
||||
label.SetAlignment (0.5f, 0.5f);
|
||||
box1.PackStart (label, true, true, 0);
|
||||
|
||||
HSeparator separator = new HSeparator ();
|
||||
box1.PackStart (separator, false, true, 0);
|
||||
|
||||
VBox box2 = new VBox (false, 10);
|
||||
box2.BorderWidth = 10;
|
||||
box1.PackStart (box2, false, true, 0);
|
||||
|
||||
Button button = new Button ("close");
|
||||
button.Clicked += new EventHandler (CloseClicked);
|
||||
box2.PackStart (button, true, true, 0);
|
||||
button.CanDefault = true;
|
||||
button.GrabDefault ();
|
||||
|
||||
ShowAll ();
|
||||
}
|
||||
|
||||
private void OnActionActivated (object sender, EventArgs a)
|
||||
private void ActionActivated (object sender, EventArgs a)
|
||||
{
|
||||
Action action = sender as Action;
|
||||
Console.WriteLine ("** Message: Action \"{0}\" activated", action.Name);
|
||||
Console.WriteLine ("Action \"{0}\" activated", action.Name);
|
||||
}
|
||||
|
||||
private void WindowDelete (object o, DeleteEventArgs args)
|
||||
private void RadioActionActivated (object sender, ChangedArgs args)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
args.RetVal = true;
|
||||
Console.WriteLine ("Radio action \"{0}\" selected", args.Current.Name);
|
||||
}
|
||||
|
||||
void OnCloseClicked (object sender, EventArgs a)
|
||||
protected override bool OnDeleteEvent (Gdk.Event evt)
|
||||
{
|
||||
this.Hide ();
|
||||
this.Destroy ();
|
||||
Destroy ();
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnAddWidget (object sender, AddWidgetArgs a)
|
||||
void CloseClicked (object sender, EventArgs a)
|
||||
{
|
||||
a.Widget.Show ();
|
||||
vbox.PackStart (a.Widget, false, true, 0);
|
||||
Destroy ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
This port of gtk-demo.c is still INCOMPLETE. If you can contribute to it
|
||||
don't hesitate to mail your patches to gtk-sharp-list@lists.ximian.com
|
||||
This is a mostly complete port of gtk-demo to Gtk#; for notes on
|
||||
what's missing, see the TODO file.
|
||||
|
||||
The original port was done by Daniel Kornhauser (dkor@alum.mit.edu),
|
||||
with additions/changes/fixes by various other people, as seen in the
|
||||
main gtk-sharp ChangeLog.
|
||||
|
||||
To compile it just type Make
|
||||
|
||||
Daniel Kornhauser.
|
||||
For the most part, the various demos should stay as close as possible
|
||||
to the C version, so that GtkDemo.exe can be compared against gtk-demo
|
||||
to make sure Gtk# is working correctly.
|
||||
|
|
|
@ -1,20 +1,14 @@
|
|||
General
|
||||
- general C#-ification
|
||||
- gtk-demo passes a widget to each demo that is used to set the
|
||||
Screen and sometimes Parent of each demo window
|
||||
- Demo window management is not the same as in gtk-demo
|
||||
|
||||
DemoMain
|
||||
- syntax highlighting
|
||||
|
||||
DemoStockBrowser
|
||||
- underline _label properly
|
||||
- use StudlyCaps instead of current horrible hack
|
||||
- missing stockitems for some reason
|
||||
- remove duplication in ListStore, and use DataFunc's
|
||||
|
||||
DemoHyperText
|
||||
- link tags are recreated too much and never removed
|
||||
"Change Display" is missing
|
||||
|
||||
Future
|
||||
------
|
||||
IconView - gtk 2.6
|
||||
RotatedText - pango 1.6
|
||||
|
||||
|
|
Loading…
Reference in a new issue