5
// Lluis Sanchez <lluis@xamarin.com>
7
// Copyright (c) 2011 Xamarin Inc
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
31
using System.Collections.Generic;
34
namespace Xwt.GtkBackend
36
public static class Util
38
static uint targetIdCounter = 0;
39
static Dictionary<TransferDataType, Gtk.TargetEntry[]> dragTargets = new Dictionary<TransferDataType, Gtk.TargetEntry[]> ();
40
static Dictionary<string, TransferDataType> atomToType = new Dictionary<string, TransferDataType> ();
42
public static void SetDragData (TransferDataSource data, Gtk.DragDataGetArgs args)
44
foreach (var t in data.DataTypes) {
45
object val = data.GetValue (t);
46
SetSelectionData (args.SelectionData, t.Id, val);
50
public static void SetSelectionData (Gtk.SelectionData data, string atomType, object val)
55
data.Text = (string)val;
56
else if (val is Xwt.Drawing.Image)
57
data.SetPixbuf ((Gdk.Pixbuf) WidgetRegistry.GetBackend (val));
59
var at = Gdk.Atom.Intern (atomType, false);
60
data.Set (at, 0, TransferDataSource.SerializeValue (val));
64
public static bool GetSelectionData (Gtk.SelectionData data, TransferDataStore target)
66
TransferDataType type = Util.AtomToType (data.Target.Name);
67
if (type == null || data.Length <= 0)
70
if (type == TransferDataType.Text)
71
target.AddText (data.Text);
72
else if (data.TargetsIncludeImage (false))
73
target.AddImage (WidgetRegistry.CreateFrontend<Xwt.Drawing.Image> (data.Pixbuf));
74
else if (type == TransferDataType.Uri) {
75
var uris = System.Text.Encoding.UTF8.GetString (data.Data).Split ('\n').Where (u => !string.IsNullOrEmpty(u)).Select (u => new Uri (u)).ToArray ();
76
target.AddUris (uris);
79
target.AddValue (type, data.Data);
83
internal static TransferDataType AtomToType (string targetName)
85
TransferDataType type;
86
atomToType.TryGetValue (targetName, out type);
90
internal static TransferDataType[] GetDragTypes (Gdk.Atom[] dropTypes)
92
List<TransferDataType> types = new List<TransferDataType> ();
93
foreach (var dt in dropTypes) {
94
TransferDataType type;
95
if (atomToType.TryGetValue (dt.Name, out type))
98
return types.ToArray ();
101
public static Gtk.TargetList BuildTargetTable (TransferDataType[] types)
103
var tl = new Gtk.TargetList ();
104
foreach (var tt in types)
105
tl.AddTable (CreateTargetEntries (tt));
109
static Gtk.TargetEntry[] CreateTargetEntries (TransferDataType type)
112
Gtk.TargetEntry[] entries;
113
if (dragTargets.TryGetValue (type, out entries))
116
uint id = targetIdCounter++;
118
if (type == TransferDataType.Uri) {
119
Gtk.TargetList list = new Gtk.TargetList ();
120
list.AddUriTargets (id);
121
entries = (Gtk.TargetEntry[])list;
123
else if (type == TransferDataType.Text) {
124
Gtk.TargetList list = new Gtk.TargetList ();
125
list.AddTextTargets (id);
126
//HACK: work around gtk_selection_data_set_text causing crashes on Mac w/ QuickSilver, Clipbard History etc.
127
if (Platform.IsMac) {
128
list.Remove ("COMPOUND_TEXT");
129
list.Remove ("TEXT");
130
list.Remove ("STRING");
132
entries = (Gtk.TargetEntry[])list;
134
else if (type == TransferDataType.Rtf) {
137
atom = Gdk.Atom.Intern ("NSRTFPboardType", false); //TODO: use public.rtf when dep on MacOS 10.6
139
atom = Gdk.Atom.Intern ("text/rtf", false);
140
entries = new Gtk.TargetEntry[] { new Gtk.TargetEntry (atom, 0, id) };
143
entries = new Gtk.TargetEntry[] { new Gtk.TargetEntry (Gdk.Atom.Intern ("application/" + type.Id, false), 0, id) };
146
foreach (var a in entries.Select (e => e.Target))
147
atomToType [a] = type;
148
return dragTargets [type] = entries;
152
static Dictionary<string,string> icons;
154
public static string ToGtkStock (string id)
157
icons = new Dictionary<string, string> ();
158
icons [StockIcons.ZoomIn] = Gtk.Stock.ZoomIn;
159
icons [StockIcons.ZoomOut] = Gtk.Stock.ZoomOut;
160
icons [StockIcons.Zoom100] = Gtk.Stock.Zoom100;
161
icons [StockIcons.ZoomFit] = Gtk.Stock.ZoomFit;
162
icons [StockIcons.OrientationPortrait] = Gtk.Stock.OrientationPortrait;
163
icons [StockIcons.OrientationLandscape] = Gtk.Stock.OrientationLandscape;
164
icons [StockIcons.Add] = Gtk.Stock.Add;
165
icons [StockIcons.Remove] = Gtk.Stock.Remove;
166
icons [StockIcons.Warning] = Gtk.Stock.DialogWarning;
167
icons [StockIcons.Error] = Gtk.Stock.DialogError;
168
icons [StockIcons.Information] = Gtk.Stock.DialogInfo;
171
icons.TryGetValue (id, out res);
175
public static Gtk.IconSize ToGtkSize (Xwt.IconSize size)
179
return Gtk.IconSize.Menu;
180
case IconSize.Medium:
181
return Gtk.IconSize.Button;
183
return Gtk.IconSize.Dialog;
185
return Gtk.IconSize.Dialog;
188
public static Gdk.Color ToGdkColor (this Xwt.Drawing.Color color)
190
return new Gdk.Color ((byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255));
193
public static Color ToXwtColor (this Gdk.Color color)
195
return new Color ((double)color.Red / (double)ushort.MaxValue, (double)color.Green / (double)ushort.MaxValue, (double)color.Blue / (double)ushort.MaxValue);
198
public static ScrollPolicy ConvertScrollPolicy (Gtk.PolicyType p)
201
case Gtk.PolicyType.Always:
202
return ScrollPolicy.Always;
203
case Gtk.PolicyType.Automatic:
204
return ScrollPolicy.Automatic;
205
case Gtk.PolicyType.Never:
206
return ScrollPolicy.Never;
208
throw new InvalidOperationException ("Invalid policy value:" + p);
211
public static Gtk.PolicyType ConvertScrollPolicy (ScrollPolicy p)
214
case ScrollPolicy.Always:
215
return Gtk.PolicyType.Always;
216
case ScrollPolicy.Automatic:
217
return Gtk.PolicyType.Automatic;
218
case ScrollPolicy.Never:
219
return Gtk.PolicyType.Never;
221
throw new InvalidOperationException ("Invalid policy value:" + p);
224
public static ScrollDirection ConvertScrollDirection(Gdk.ScrollDirection d)
227
case Gdk.ScrollDirection.Up:
228
return Xwt.ScrollDirection.Up;
229
case Gdk.ScrollDirection.Down:
230
return Xwt.ScrollDirection.Down;
231
case Gdk.ScrollDirection.Left:
232
return Xwt.ScrollDirection.Left;
233
case Gdk.ScrollDirection.Right:
234
return Xwt.ScrollDirection.Right;
236
throw new InvalidOperationException("Invalid mouse scroll direction value: " + d);
239
public static Gdk.ScrollDirection ConvertScrollDirection(ScrollDirection d)
242
case ScrollDirection.Up:
243
return Gdk.ScrollDirection.Up;
244
case ScrollDirection.Down:
245
return Gdk.ScrollDirection.Down;
246
case ScrollDirection.Left:
247
return Gdk.ScrollDirection.Left;
248
case ScrollDirection.Right:
249
return Gdk.ScrollDirection.Right;
251
throw new InvalidOperationException("Invalid mouse scroll direction value: " + d);