2
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Sun designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Sun in the LICENSE file that accompanied this code.
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22
* CA 95054 USA or visit www.sun.com if you need additional information or
27
Copyright (C) 2002, 2004-2009 Jeroen Frijters
28
Copyright (C) 2006 Active Endpoints, Inc.
29
Copyright (C) 2006-2011 Volker Berlin (i-net software)
30
Copyright (C) 2010-2011 Karsten Heinrich (i-net software)
32
This software is provided 'as-is', without any express or implied
33
warranty. In no event will the authors be held liable for any damages
34
arising from the use of this software.
36
Permission is granted to anyone to use this software for any purpose,
37
including commercial applications, and to alter it and redistribute it
38
freely, subject to the following restrictions:
40
1. The origin of this software must not be misrepresented; you must not
41
claim that you wrote the original software. If you use this software
42
in a product, an acknowledgment in the product documentation would be
43
appreciated but is not required.
44
2. Altered source versions must be plainly marked as such, and must not be
45
misrepresented as being the original software.
46
3. This notice may not be removed or altered from any source distribution.
55
using System.Drawing.Imaging;
56
using System.Diagnostics;
58
using System.Threading;
59
using System.Windows.Forms;
60
using System.ComponentModel;
61
using System.Reflection;
64
using ikvm.awt.printing;
67
using System.Runtime.InteropServices;
68
using System.Drawing.Drawing2D;
72
internal delegate TResult Func<TResult>();
73
internal delegate void Action<T>(T t);
75
class UndecoratedForm : Form
77
private bool focusableWindow = true;
78
private bool alwaysOnTop;
80
public UndecoratedForm()
83
SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true);
86
protected virtual void setBorderStyle()
88
this.FormBorderStyle = FormBorderStyle.None;
89
this.ShowInTaskbar = false;
92
internal void SetWindowState(bool focusableWindow, bool alwaysOnTop)
94
this.focusableWindow = focusableWindow;
95
this.alwaysOnTop = alwaysOnTop;
98
protected override bool ShowWithoutActivation {
99
// This work not like in Java. In Java it is not possible to click on a not focusable Window
100
// But now the windows is not stealing the focus on showing
103
return !focusableWindow;
107
private const int WS_EX_TOPMOST = 0x00000008;
108
private const int WS_EX_NOACTIVATE = 0x08000000;
109
private const int WS_DISABLED = 0x08000000;
111
protected override CreateParams CreateParams {
113
CreateParams baseParams = base.CreateParams;
114
int exStyle = baseParams.ExStyle;
116
// This work not like in Java. In Java it is not possible to click on a not focusable Window
117
// But now the windows is not stealing the focus on showing
118
exStyle = focusableWindow ? exStyle & ~WS_EX_NOACTIVATE : exStyle | WS_EX_NOACTIVATE;
120
// we need to set TOPMOST here because the property TopMost does not work with ShowWithoutActivation
121
baseParams.ExStyle = alwaysOnTop ? exStyle | WS_EX_TOPMOST : exStyle & ~WS_EX_TOPMOST;
123
// the Enabled on Forms has no effect. In Java a window beep if ot is disabled
124
// the same effect have we with this flag
125
baseParams.Style = Enabled ? baseParams.Style & ~WS_DISABLED : baseParams.Style | WS_DISABLED;
130
protected override void OnPaintBackground(PaintEventArgs e)
132
NetComponentPeer peer = NetComponentPeer.FromControl(this);
133
if (peer.eraseBackground)
135
base.OnPaintBackground(e);
140
class MyForm : UndecoratedForm
143
/// Original MaximizedBounds
145
private Rectangle maxBounds;
146
private bool maxBoundsSet;
147
public java.awt.Insets peerInsets;
150
/// Creates the native form
152
/// <param name="peerInsets">the insets instance of the peer instance</param>
153
public MyForm( java.awt.Insets peerInsets )
155
this.peerInsets = peerInsets;
158
protected override void setBorderStyle()
160
//nothing, default behaviour
163
public void setMaximizedBounds(java.awt.Rectangle rect)
167
// null means reset to the original system setting
170
SetMaximizedBoundsImpl(maxBounds);
177
maxBounds = MaximizedBounds;
180
SetMaximizedBoundsImpl(J2C.ConvertRect(rect));
184
private void SetMaximizedBoundsImpl(Rectangle rect)
186
NetToolkit.Invoke(delegate { MaximizedBounds = rect; });
190
sealed class EventQueueSynchronizationContext : SynchronizationContext
192
public override SynchronizationContext CreateCopy()
194
return new EventQueueSynchronizationContext();
197
public override void Post(SendOrPostCallback d, object state)
199
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate { d(state); }));
202
public override void Send(SendOrPostCallback d, object state)
204
java.awt.EventQueue.invokeAndWait(Delegates.toRunnable(delegate { d(state); }));
207
[System.Security.SecuritySafeCritical]
208
internal static void Install()
210
SynchronizationContext.SetSynchronizationContext(new EventQueueSynchronizationContext());
214
static class WinFormsMessageLoop
216
private static readonly object mylock = new object();
217
private static Form theForm;
219
private static Form GetForm()
225
Thread thread = new Thread(MessageLoop);
226
thread.SetApartmentState(ApartmentState.STA);
227
thread.Name = "IKVM AWT WinForms Message Loop";
228
thread.IsBackground = true;
230
while (theForm == null && thread.IsAlive)
239
private static void MessageLoop()
241
using (Form form = new Form())
243
NetToolkit.CreateNative(form);
249
internal static bool InvokeRequired
251
get { return GetForm().InvokeRequired; }
254
internal static object Invoke(Delegate method)
256
return GetForm().Invoke(method);
259
internal static object Invoke(Delegate method, params object[] args)
261
return GetForm().Invoke(method, args);
264
internal static IAsyncResult BeginInvoke(Delegate method)
266
return GetForm().BeginInvoke(method);
269
internal static IAsyncResult BeginInvoke(Delegate method, params object[] args)
271
return GetForm().BeginInvoke(method, args);
275
public sealed class NetToolkit : sun.awt.SunToolkit, ikvm.awt.IkvmToolkit, sun.awt.KeyboardFocusManagerPeerProvider
277
public static readonly String DATA_TRANSFERER_CLASS_NAME = typeof(NetDataTransferer).AssemblyQualifiedName;
279
private int resolution;
280
private NetClipboard clipboard;
281
private bool eventQueueSynchronizationContext;
283
protected override java.awt.EventQueue getSystemEventQueueImpl()
285
java.awt.EventQueue eq = base.getSystemEventQueueImpl();
286
if (!eventQueueSynchronizationContext)
288
InstallEventQueueSynchronizationContext(eq);
293
private void InstallEventQueueSynchronizationContext(java.awt.EventQueue eq)
298
install = !eventQueueSynchronizationContext;
299
eventQueueSynchronizationContext = true;
303
eq.postEvent(new java.awt.@event.InvocationEvent(this, Delegates.toRunnable(EventQueueSynchronizationContext.Install), null, true));
307
internal static void CreateNative(Control control)
309
control.CreateControl();
310
// HACK I have no idea why this line is necessary...
311
IntPtr p = control.Handle;
312
if (p == IntPtr.Zero)
314
// shut up compiler warning
320
setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
324
/// Run on a win 32 system
326
/// <returns></returns>
327
internal static bool isWin32()
329
return Environment.OSVersion.Platform == PlatformID.Win32NT || Environment.OSVersion.Platform == PlatformID.Win32Windows;
332
protected override void loadSystemColors(int[] systemColors)
334
// initialize all colors to purple to make the ones we might have missed stand out
335
for (int i = 0; i < systemColors.Length; i++)
337
systemColors[i] = Color.Purple.ToArgb();
339
systemColors[java.awt.SystemColor.DESKTOP] = SystemColors.Desktop.ToArgb();
340
systemColors[java.awt.SystemColor.ACTIVE_CAPTION] = SystemColors.ActiveCaption.ToArgb();
341
systemColors[java.awt.SystemColor.ACTIVE_CAPTION_TEXT] = SystemColors.ActiveCaptionText.ToArgb();
342
systemColors[java.awt.SystemColor.ACTIVE_CAPTION_BORDER] = SystemColors.ActiveBorder.ToArgb();
343
systemColors[java.awt.SystemColor.INACTIVE_CAPTION] = SystemColors.InactiveCaption.ToArgb();
344
systemColors[java.awt.SystemColor.INACTIVE_CAPTION_TEXT] = SystemColors.InactiveCaptionText.ToArgb();
345
systemColors[java.awt.SystemColor.INACTIVE_CAPTION_BORDER] = SystemColors.InactiveBorder.ToArgb();
346
systemColors[java.awt.SystemColor.WINDOW] = SystemColors.Window.ToArgb();
347
systemColors[java.awt.SystemColor.WINDOW_BORDER] = SystemColors.WindowFrame.ToArgb();
348
systemColors[java.awt.SystemColor.WINDOW_TEXT] = SystemColors.WindowText.ToArgb();
349
systemColors[java.awt.SystemColor.MENU] = SystemColors.Menu.ToArgb();
350
systemColors[java.awt.SystemColor.MENU_TEXT] = SystemColors.MenuText.ToArgb();
351
systemColors[java.awt.SystemColor.TEXT] = SystemColors.Window.ToArgb();
352
systemColors[java.awt.SystemColor.TEXT_TEXT] = SystemColors.WindowText.ToArgb();
353
systemColors[java.awt.SystemColor.TEXT_HIGHLIGHT] = SystemColors.Highlight.ToArgb();
354
systemColors[java.awt.SystemColor.TEXT_HIGHLIGHT_TEXT] = SystemColors.HighlightText.ToArgb();
355
systemColors[java.awt.SystemColor.TEXT_INACTIVE_TEXT] = SystemColors.GrayText.ToArgb();
356
systemColors[java.awt.SystemColor.CONTROL] = SystemColors.Control.ToArgb();
357
systemColors[java.awt.SystemColor.CONTROL_TEXT] = SystemColors.ControlText.ToArgb();
358
systemColors[java.awt.SystemColor.CONTROL_HIGHLIGHT] = SystemColors.ControlLight.ToArgb();
359
systemColors[java.awt.SystemColor.CONTROL_LT_HIGHLIGHT] = SystemColors.ControlLightLight.ToArgb();
360
systemColors[java.awt.SystemColor.CONTROL_SHADOW] = SystemColors.ControlDark.ToArgb();
361
systemColors[java.awt.SystemColor.CONTROL_DK_SHADOW] = SystemColors.ControlDarkDark.ToArgb();
362
systemColors[java.awt.SystemColor.SCROLLBAR] = SystemColors.ScrollBar.ToArgb();
363
systemColors[java.awt.SystemColor.INFO] = SystemColors.Info.ToArgb();
364
systemColors[java.awt.SystemColor.INFO_TEXT] = SystemColors.InfoText.ToArgb();
367
public override java.awt.peer.ButtonPeer createButton(java.awt.Button target)
369
java.awt.peer.ButtonPeer peer = Invoke<NetButtonPeer>(delegate { return new NetButtonPeer(target); });
370
targetCreatedPeer(target, peer);
374
// MONOBUG mcs refuses to override these two methods, so we disable them when building with mcs
375
// (since AWT isn't supported anyway)
377
public override java.awt.peer.CanvasPeer createCanvas(java.awt.Canvas target)
379
java.awt.peer.CanvasPeer peer = Invoke<NetCanvasPeer>(delegate { return new NetCanvasPeer(target); });
380
targetCreatedPeer(target, peer);
384
public override java.awt.peer.PanelPeer createPanel(java.awt.Panel target)
386
java.awt.peer.PanelPeer peer = Invoke<NetPanelPeer>(delegate { return new NetPanelPeer(target); });
387
targetCreatedPeer(target, peer);
392
public override java.awt.peer.TextFieldPeer createTextField(java.awt.TextField target)
394
java.awt.peer.TextFieldPeer peer = Invoke<NetTextFieldPeer>(delegate { return new NetTextFieldPeer(target); });
395
targetCreatedPeer(target, peer);
399
public override java.awt.peer.LabelPeer createLabel(java.awt.Label target)
401
java.awt.peer.LabelPeer peer = Invoke<NetLabelPeer>(delegate { return new NetLabelPeer(target); });
402
targetCreatedPeer(target, peer);
406
public override java.awt.peer.ListPeer createList(java.awt.List target)
408
java.awt.peer.ListPeer peer = Invoke<NetListPeer>(delegate { return new NetListPeer(target); });
409
targetCreatedPeer(target, peer);
413
public override java.awt.peer.CheckboxPeer createCheckbox(java.awt.Checkbox target)
415
java.awt.peer.CheckboxPeer peer = Invoke<NetCheckboxPeer>(delegate { return new NetCheckboxPeer(target); });
416
targetCreatedPeer(target, peer);
420
public override java.awt.peer.ScrollbarPeer createScrollbar(java.awt.Scrollbar target)
422
java.awt.peer.ScrollbarPeer peer = Invoke<NetScrollbarPeer>(delegate { return new NetScrollbarPeer(target); });
423
targetCreatedPeer(target, peer);
427
public override java.awt.peer.ScrollPanePeer createScrollPane(java.awt.ScrollPane target)
429
java.awt.peer.ScrollPanePeer peer = Invoke<NetScrollPanePeer>(delegate { return new NetScrollPanePeer(target); });
430
targetCreatedPeer(target, peer);
434
public override java.awt.peer.TextAreaPeer createTextArea(java.awt.TextArea target)
436
java.awt.peer.TextAreaPeer peer = Invoke<NetTextAreaPeer>(delegate { return new NetTextAreaPeer(target); });
437
targetCreatedPeer(target, peer);
441
public override java.awt.peer.ChoicePeer createChoice(java.awt.Choice target)
443
java.awt.peer.ChoicePeer peer = Invoke<NetChoicePeer>(delegate { return new NetChoicePeer(target); });
444
targetCreatedPeer(target, peer);
448
public override java.awt.peer.FramePeer createFrame(java.awt.Frame target)
450
bool isFocusableWindow = target.isFocusableWindow();
451
bool isAlwaysOnTop = target.isAlwaysOnTop();
452
java.awt.peer.FramePeer peer = Invoke<NetFramePeer>(delegate { return new NetFramePeer(target, isFocusableWindow, isAlwaysOnTop); });
453
targetCreatedPeer(target, peer);
457
public override java.awt.peer.WindowPeer createWindow(java.awt.Window target)
459
bool isFocusableWindow = target.isFocusableWindow();
460
bool isAlwaysOnTop = target.isAlwaysOnTop();
461
java.awt.peer.WindowPeer peer = Invoke<NetWindowPeer>(delegate { return new NetWindowPeer(target, isFocusableWindow, isAlwaysOnTop); });
462
targetCreatedPeer(target, peer);
466
public override java.awt.peer.DialogPeer createDialog(java.awt.Dialog target)
468
bool isFocusableWindow = target.isFocusableWindow();
469
bool isAlwaysOnTop = target.isAlwaysOnTop();
470
java.awt.peer.DialogPeer peer = Invoke<NetDialogPeer>(delegate { return new NetDialogPeer(target, isFocusableWindow, isAlwaysOnTop); });
471
targetCreatedPeer(target, peer);
475
public override java.awt.peer.MenuBarPeer createMenuBar(java.awt.MenuBar target)
477
// we need to force peer creation of the sub menus here, because we're
478
// transitioning to the UI thread to do the rest of the work and there
479
// we cannot acquire the AWT tree lock (because it is owned by the current thread)
480
for (int i = 0; i < target.getMenuCount(); i++)
482
target.getMenu(i).addNotify();
484
java.awt.Menu help = target.getHelpMenu();
489
java.awt.peer.MenuBarPeer peer = Invoke<NetMenuBarPeer>(delegate { return new NetMenuBarPeer(target); });
490
targetCreatedPeer(target, peer);
494
public override java.awt.peer.MenuPeer createMenu(java.awt.Menu target)
496
for (int i = 0; i < target.getItemCount(); i++)
498
target.getItem(i).addNotify();
500
java.awt.peer.MenuPeer peer = Invoke<NetMenuPeer>(delegate { return new NetMenuPeer(target); });
501
targetCreatedPeer(target, peer);
505
public override java.awt.peer.PopupMenuPeer createPopupMenu(java.awt.PopupMenu target)
507
for (int i = 0; i < target.getItemCount(); i++)
509
target.getItem(i).addNotify();
511
java.awt.peer.PopupMenuPeer peer = Invoke<NetPopupMenuPeer>(delegate { return new NetPopupMenuPeer(target); });
512
targetCreatedPeer(target, peer);
516
public override java.awt.peer.MenuItemPeer createMenuItem(java.awt.MenuItem target)
518
java.awt.peer.MenuItemPeer peer = Invoke<NetMenuItemPeer>(delegate { return new NetMenuItemPeer(target); });
519
targetCreatedPeer(target, peer);
523
public override java.awt.peer.FileDialogPeer createFileDialog(java.awt.FileDialog target)
525
bool isFocusableWindow = target.isFocusableWindow();
526
bool isAlwaysOnTop = target.isAlwaysOnTop();
527
java.awt.peer.FileDialogPeer peer = Invoke<NetFileDialogPeer>(delegate { return new NetFileDialogPeer(target, isFocusableWindow, isAlwaysOnTop); });
528
targetCreatedPeer(target, peer);
532
public override java.awt.peer.CheckboxMenuItemPeer createCheckboxMenuItem(java.awt.CheckboxMenuItem target)
534
return new NetCheckboxMenuItemPeer(target);
537
public override java.awt.peer.FontPeer getFontPeer(string name, int style)
539
throw new NotImplementedException();
542
public override java.awt.peer.KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(java.awt.KeyboardFocusManager manager)
544
return new NetKeyboardFocusManagerPeer(manager);
547
public override java.awt.Dimension getScreenSize()
549
return new java.awt.Dimension(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
552
public override int getScreenResolution()
556
using (Form form = new Form())
557
using (Graphics g = form.CreateGraphics())
559
resolution = (int)Math.Round(g.DpiY);
565
public override java.awt.image.ColorModel getColorModel()
567
//we return the default ColorModel because this produce the fewest problems with convertions
568
return java.awt.image.ColorModel.getRGBdefault();
572
public override string[] getFontList()
574
// This method is deprecated and Sun's JDK only returns these fonts as well
575
return new string[] { "Dialog", "SansSerif", "Serif", "Monospaced", "DialogInput" };
579
public override java.awt.FontMetrics getFontMetrics(java.awt.Font font)
581
return sun.font.FontDesignMetrics.getMetrics(font);
584
public override void sync()
588
public override java.awt.Image getImage(string filename)
592
filename = new java.io.File(filename).getPath(); //convert a Java file name to .NET filename (slahes, backslasches, etc)
593
using (System.IO.FileStream stream = new System.IO.FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
595
return new java.awt.image.BufferedImage(new Bitmap(Image.FromStream(stream)));
600
return new NoImage();
604
public override java.awt.Image getImage(URL url)
606
// TODO extremely lame...
607
System.IO.MemoryStream mem = new System.IO.MemoryStream();
608
java.io.InputStream inS = url.openStream();
610
while ((b = inS.read()) >= 0)
612
mem.WriteByte((byte)b);
617
return new java.awt.image.BufferedImage(new Bitmap(Image.FromStream(mem)));
621
return new NoImage();
625
public override java.awt.Image createImage(string filename)
627
return getImage(filename);
630
public override java.awt.Image createImage(URL url)
632
return getImage(url);
635
public override java.awt.Image createImage(byte[] imagedata, int imageoffset, int imagelength)
639
return new java.awt.image.BufferedImage(new Bitmap(new MemoryStream(imagedata, imageoffset, imagelength, false)));
643
return new NoImage();//TODO should throw the exception unstead of NoImage()
647
public override java.awt.PrintJob getPrintJob(java.awt.Frame frame, string jobtitle, java.util.Properties props)
649
throw new NotImplementedException();
652
public override void beep()
657
public override java.awt.datatransfer.Clipboard getSystemClipboard()
663
clipboard = new NetClipboard();
669
public override java.awt.dnd.DragGestureRecognizer createDragGestureRecognizer(java.lang.Class abstractRecognizerClass, java.awt.dnd.DragSource ds, java.awt.Component c, int srcActions, java.awt.dnd.DragGestureListener dgl)
671
java.lang.Class clazz = typeof(java.awt.dnd.MouseDragGestureRecognizer);
672
if (abstractRecognizerClass == clazz)
673
return new NetMouseDragGestureRecognizer(ds, c, srcActions, dgl);
678
public override java.awt.dnd.peer.DragSourceContextPeer createDragSourceContextPeer(java.awt.dnd.DragGestureEvent dge)
680
return NetDragSourceContextPeer.createDragSourceContextPeer(dge);
683
public override Map mapInputMethodHighlight(java.awt.im.InputMethodHighlight highlight)
685
throw new NotImplementedException();
689
protected override java.awt.peer.LightweightPeer createComponent(java.awt.Component target)
691
if(target is java.awt.Container)
693
return new NetLightweightContainerPeer((java.awt.Container)target);
695
return new NetLightweightComponentPeer(target);
699
/* public override java.awt.Font createFont(int format, java.io.InputStream stream)
701
throw new NotImplementedException();
704
public override gnu.java.awt.peer.ClasspathFontPeer getClasspathFontPeer(string name, java.util.Map attrs)
706
return new NetFontPeer(name, attrs);
709
public override java.awt.GraphicsEnvironment getLocalGraphicsEnvironment()
711
return new NetGraphicsEnvironment();
714
public override RobotPeer createRobot(java.awt.GraphicsDevice screen)
716
if (Environment.OSVersion.Platform == PlatformID.Win32NT || Environment.OSVersion.Platform == PlatformID.Win32Windows)
718
return new WindowsRobot(screen);
720
throw new java.awt.AWTException("Robot not supported for this OS");
723
public override gnu.java.awt.peer.EmbeddedWindowPeer createEmbeddedWindow(gnu.java.awt.EmbeddedWindow ew)
725
throw new NotImplementedException();
728
protected override java.awt.peer.DesktopPeer createDesktopPeer(java.awt.Desktop target)
730
return new NetDesktopPeer();
733
public override java.awt.Dimension getBestCursorSize(int preferredWidth, int preferredHeight)
736
return new java.awt.Dimension(preferredWidth, preferredHeight);
739
public override java.awt.Cursor createCustomCursor(java.awt.Image cursor, java.awt.Point hotSpot, string name)
741
return new NetCustomCursor(cursor, hotSpot, name);
744
private object getRegistry(string subKey, string valueName)
746
using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(subKey, false))
748
return key == null ? null : key.GetValue(valueName);
752
protected override void initializeDesktopProperties()
754
//copied from WToolkit.java
755
desktopProperties.put("DnD.Autoscroll.initialDelay", java.lang.Integer.valueOf(50));
756
desktopProperties.put("DnD.Autoscroll.interval", java.lang.Integer.valueOf(50));
762
desktopProperties.put("Shell.shellFolderManager", "sun.awt.shell.Win32ShellFolderManager2" );
763
object themeActive = getRegistry("Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager", "ThemeActive");
764
// string dllName = (string)getRegistry("Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager", "DllName");
765
// string sizeName = (string)getRegistry("Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager", "SizeName");
766
// string colorName = (string)getRegistry("Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager", "ColorName");
767
desktopProperties.put("win.xpstyle.themeActive", java.lang.Boolean.valueOf("1".Equals(themeActive)));
768
// desktopProperties.put("win.xpstyle.dllName", dllName);
769
// desktopProperties.put("win.xpstyle.sizeName", sizeName);
770
// desktopProperties.put("win.xpstyle.colorName", colorName);
773
catch (java.lang.ClassNotFoundException)
778
protected override Object lazilyLoadDesktopProperty(String name)
780
if ("win.defaultGUI.font".Equals(name))
782
Font font = Control.DefaultFont;
783
return C2J.ConvertFont(font);
788
protected override java.awt.peer.MouseInfoPeer getMouseInfoPeer() {
789
return new NetMouseInfoPeer();
792
/*===============================
793
* Implementations of interface IkvmToolkit
796
public java.awt.Graphics2D createGraphics(System.Drawing.Bitmap bitmap)
798
return new BitmapGraphics(bitmap);
802
/// Get a helper class for implementing the print API
804
/// <returns></returns>
805
public sun.print.PrintPeer getPrintPeer()
809
return new Win32PrintPeer();
813
return new LinuxPrintPeer();
818
/// Create a outline from the given text and font parameter
820
/// <param name="javaFont">the font</param>
821
/// <param name="frc">font render context</param>
822
/// <param name="text">the text</param>
823
/// <param name="x">x - position</param>
824
/// <param name="y">y - position</param>
825
/// <returns></returns>
826
public java.awt.Shape outline(java.awt.Font javaFont, java.awt.font.FontRenderContext frc, string text, float x, float y) {
827
GraphicsPath path = new GraphicsPath(FillMode.Winding);
828
Font netFont = javaFont.getNetFont();
829
FontFamily family = netFont.FontFamily;
830
FontStyle style = netFont.Style;
831
float factor = netFont.Size / family.GetEmHeight(style);
832
float ascent = family.GetCellAscent(style) * factor;
835
StringFormat format = new StringFormat(StringFormat.GenericTypographic);
836
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox;
837
format.Trimming = StringTrimming.None;
839
path.AddString(text, family, (int)style, netFont.Size, new PointF(x, y), format);
840
return C2J.ConvertShape(path);
843
/*===============================
844
* Implementations of interface SunToolkit
847
public override bool isModalExclusionTypeSupported(java.awt.Dialog.ModalExclusionType dmet)
852
public override bool isModalityTypeSupported(java.awt.Dialog.ModalityType type)
854
return type.ordinal() == java.awt.Dialog.ModalityType.MODELESS.ordinal() ||
855
type.ordinal() == java.awt.Dialog.ModalityType.APPLICATION_MODAL.ordinal();
858
public override java.awt.Window createInputMethodWindow(string __p1, sun.awt.im.InputContext __p2)
860
throw new NotImplementedException();
863
public override java.awt.peer.RobotPeer createRobot(java.awt.Robot r, java.awt.GraphicsDevice screen)
867
return new WindowsRobot(screen);
869
throw new java.awt.AWTException("Robot not supported for this OS");
872
public override java.awt.peer.SystemTrayPeer createSystemTray(java.awt.SystemTray target)
874
NetSystemTrayPeer peer = new NetSystemTrayPeer(target);
875
targetCreatedPeer(target, peer);
879
public override java.awt.peer.TrayIconPeer createTrayIcon(java.awt.TrayIcon target)
881
NetTrayIconPeer peer = new NetTrayIconPeer(target);
882
targetCreatedPeer(target, peer);
886
public override java.awt.im.spi.InputMethodDescriptor getInputMethodAdapterDescriptor()
891
protected override int getScreenHeight()
893
return Screen.PrimaryScreen.Bounds.Height;
896
protected override int getScreenWidth()
898
return Screen.PrimaryScreen.Bounds.Width;
901
public override java.awt.Insets getScreenInsets(java.awt.GraphicsConfiguration gc)
903
NetGraphicsConfiguration ngc = gc as NetGraphicsConfiguration;
906
Rectangle rectWorkingArea = ngc.screen.WorkingArea;
907
Rectangle rectBounds = ngc.screen.Bounds;
908
return new java.awt.Insets(
909
rectWorkingArea.Top - rectBounds.Top,
910
rectWorkingArea.Left - rectBounds.Left,
911
rectBounds.Bottom - rectWorkingArea.Bottom,
912
rectBounds.Right - rectWorkingArea.Right);
916
return base.getScreenInsets(gc);
920
public override void grab(java.awt.Window window)
922
NetWindowPeer peer = (NetWindowPeer)window.getPeer();
929
public override bool isDesktopSupported()
934
public override bool isTraySupported()
939
public override bool isFrameStateSupported(int state)
943
case java.awt.Frame.NORMAL:
944
case java.awt.Frame.ICONIFIED:
945
case java.awt.Frame.MAXIMIZED_BOTH:
952
protected override bool syncNativeQueue(long l)
954
throw new NotImplementedException();
957
public override void ungrab(java.awt.Window window)
959
NetWindowPeer peer = (NetWindowPeer)window.getPeer();
966
internal new static object targetToPeer(object target)
968
return SunToolkit.targetToPeer(target);
971
internal new static void targetDisposedPeer(object target, object peer)
973
SunToolkit.targetDisposedPeer(target, peer);
976
internal static void BeginInvoke(MethodInvoker del)
978
if (WinFormsMessageLoop.InvokeRequired)
980
WinFormsMessageLoop.BeginInvoke(del);
988
internal static void BeginInvoke<T>(Action<T> del, T t)
990
if (WinFormsMessageLoop.InvokeRequired)
992
WinFormsMessageLoop.BeginInvoke(del, t);
999
internal static void Invoke<T>(Action<T> del, T t)
1001
if (WinFormsMessageLoop.InvokeRequired)
1003
WinFormsMessageLoop.Invoke(del, t);
1011
internal static TResult Invoke<TResult>(Func<TResult> del)
1013
if (WinFormsMessageLoop.InvokeRequired)
1015
return (TResult)WinFormsMessageLoop.Invoke(del);
1023
internal static void Invoke(MethodInvoker del)
1025
if (WinFormsMessageLoop.InvokeRequired)
1027
WinFormsMessageLoop.Invoke(del);
1035
public override bool areExtraMouseButtonsEnabled()
1041
sealed class NetMenuBarPeer : java.awt.peer.MenuBarPeer
1043
internal readonly MainMenu menu = new MainMenu();
1045
internal NetMenuBarPeer(java.awt.MenuBar target)
1048
for (int i = 0; i < target.getMenuCount(); i++)
1050
addMenu(target.getMenu(i));
1054
public void addHelpMenu(java.awt.Menu m)
1059
public void addMenu(java.awt.Menu m)
1061
if (m.getPeer() == null)
1065
NetToolkit.Invoke(delegate { menu.MenuItems.Add(((NetMenuPeer)m.getPeer()).menu); });
1068
public void delMenu(int i)
1070
NetToolkit.Invoke(delegate { menu.MenuItems.RemoveAt(i); });
1073
public void dispose()
1075
NetToolkit.Invoke(delegate { menu.Dispose(); });
1078
public void setFont(java.awt.Font f)
1080
throw new NotImplementedException();
1084
sealed class NetMenuPeer : java.awt.peer.MenuPeer
1086
internal readonly MenuItem menu = new MenuItem();
1088
internal NetMenuPeer(java.awt.Menu target)
1091
menu.Text = target.getLabel();
1092
for (int i = 0; i < target.getItemCount(); i++)
1094
addItem(target.getItem(i));
1098
public void addItem(java.awt.MenuItem item)
1100
if (item.getPeer() == null)
1104
if (item.getPeer() is NetMenuItemPeer)
1106
NetToolkit.Invoke(delegate { menu.MenuItems.Add(((NetMenuItemPeer)item.getPeer()).menuitem); });
1110
NetToolkit.Invoke(delegate { menu.MenuItems.Add(((NetMenuPeer)item.getPeer()).menu); });
1114
public void addSeparator()
1116
NetToolkit.Invoke(delegate { menu.MenuItems.Add(new MenuItem("-")); });
1119
public void delItem(int i)
1121
NetToolkit.Invoke(delegate { menu.MenuItems.RemoveAt(i); });
1124
public void dispose()
1126
NetToolkit.Invoke(delegate { menu.Dispose(); });
1129
public void setFont(java.awt.Font f)
1131
throw new NotImplementedException();
1134
public void disable()
1139
public void enable()
1144
public void setEnabled(bool b)
1146
NetToolkit.Invoke(delegate { menu.Enabled = b; });
1149
public void setLabel(string str)
1151
NetToolkit.Invoke(delegate { menu.Text = str; });
1155
class NetMenuItemPeer : java.awt.peer.MenuItemPeer
1157
protected readonly java.awt.MenuItem target;
1158
internal readonly MenuItem menuitem = new MenuItem();
1160
internal NetMenuItemPeer(java.awt.MenuItem target)
1162
this.target = target;
1163
setEnabled(target.isEnabled());
1164
setLabel(target.getLabel());
1165
menuitem.Click += OnClick;
1168
protected virtual void OnClick(object sender, EventArgs e)
1170
long when = java.lang.System.currentTimeMillis();
1171
int modifiers = NetComponentPeer.GetModifiers(Control.ModifierKeys);
1172
NetToolkit.executeOnEventHandlerThread(target, Delegates.toRunnable(delegate
1174
NetToolkit.postEvent(NetToolkit.targetToAppContext(target), new java.awt.@event.ActionEvent(target, java.awt.@event.ActionEvent.ACTION_PERFORMED,
1175
target.getActionCommand(), when, modifiers));
1179
public void disable()
1184
public void enable()
1189
public void setEnabled(bool b)
1191
NetToolkit.Invoke(delegate { menuitem.Enabled = b; });
1194
public void setLabel(string str)
1196
NetToolkit.Invoke(delegate { menuitem.Text = str; });
1199
public void dispose()
1201
NetToolkit.Invoke(delegate { menuitem.Dispose(); });
1204
public void setFont(java.awt.Font f)
1209
sealed class NetCheckboxMenuItemPeer : NetMenuItemPeer, java.awt.peer.CheckboxMenuItemPeer
1211
internal NetCheckboxMenuItemPeer(java.awt.CheckboxMenuItem target)
1214
setState(target.getState());
1217
protected override void OnClick(object sender, EventArgs e)
1219
java.awt.CheckboxMenuItem target = (java.awt.CheckboxMenuItem)this.target;
1220
NetToolkit.executeOnEventHandlerThread(target, Delegates.toRunnable(delegate
1222
bool state = !menuitem.Checked;
1223
target.setState(state);
1224
NetToolkit.postEvent(NetToolkit.targetToAppContext(target), new java.awt.@event.ItemEvent(target, java.awt.@event.ItemEvent.ITEM_STATE_CHANGED,
1225
target.getLabel(), (state)
1226
? java.awt.@event.ItemEvent.SELECTED
1227
: java.awt.@event.ItemEvent.DESELECTED));
1231
public void setState(bool b)
1233
NetToolkit.Invoke(delegate { menuitem.Checked = b; });
1237
internal class NetDragSourceContextPeer : sun.awt.dnd.SunDragSourceContextPeer
1239
private static readonly NetDragSourceContextPeer theInstance = new NetDragSourceContextPeer(null);
1240
private bool dragStart = false;
1242
private NetDragSourceContextPeer(java.awt.dnd.DragGestureEvent dge) : base(dge)
1246
public static NetDragSourceContextPeer createDragSourceContextPeer(java.awt.dnd.DragGestureEvent dge)
1248
theInstance.setTrigger(dge);
1252
public override void startSecondaryEventLoop()
1254
//NetToolkit.startSecondaryEventLoop();
1257
public override void quitSecondaryEventLoop()
1259
//NetToolkit.quitSecondaryEventLoop();
1262
internal static new java.awt.dnd.DragSourceContext getDragSourceContext()
1264
return theInstance.getDragSourceContextCore();
1267
internal static NetDragSourceContextPeer getInstance()
1272
internal java.awt.dnd.DragSourceContext getDragSourceContextCore()
1274
return base.getDragSourceContext();
1277
internal new void dragDropFinished(bool success, int operations, int x, int y)
1281
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
1282
base.dragDropFinished(success, operations, x, y);
1288
protected override void startDrag(java.awt.datatransfer.Transferable trans, long[] formats, Map formatMap)
1292
createDragSource(getTrigger().getComponent(),
1294
getTrigger().getTriggerEvent(),
1295
getTrigger().getSourceAsDragGestureRecognizer().getSourceActions(),
1298
NetDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(trans);
1301
private long createDragSource(java.awt.Component component,
1302
java.awt.datatransfer.Transferable transferable,
1303
java.awt.@event.InputEvent nativeTrigger,
1308
java.awt.Component controlOwner = component;
1309
while (controlOwner!=null && (controlOwner.getPeer() == null || controlOwner.getPeer() is sun.awt.NullComponentPeer))
1311
controlOwner = controlOwner.getParent();
1313
if (controlOwner != null)
1315
NetComponentPeer peer = controlOwner.getPeer() as NetComponentPeer;
1318
peer.performedDragDropEffects = DragDropEffects.None;
1319
Control control = peer.Control;
1320
if (control != null)
1322
java.awt.dnd.DragSource dragSource = getTrigger().getDragSource();
1323
IDataObject data = NetDataTransferer.getInstanceImpl().getDataObject(transferable,
1324
NetDataTransferer.adaptFlavorMap(dragSource.getFlavorMap()));
1325
NetToolkit.BeginInvoke(delegate
1327
DragDropEffects effects = control.DoDragDrop(data, DragDropEffects.All);
1328
if (effects == DragDropEffects.None && peer.performedDragDropEffects!=DragDropEffects.None)
1330
effects = peer.performedDragDropEffects;
1332
peer.performedDragDropEffects = DragDropEffects.None;
1333
dragDropFinished(effects != DragDropEffects.None,
1334
NetComponentPeer.getAction(effects),
1335
Control.MousePosition.X, Control.MousePosition.Y);
1343
protected override void setNativeCursor(long nativeCtxt, java.awt.Cursor c, int cType)
1349
internal class NetDropTargetContextPeer : sun.awt.dnd.SunDropTargetContextPeer
1351
private IDataObject data;
1353
internal static NetDropTargetContextPeer getNetDropTargetContextPeer()
1355
return new NetDropTargetContextPeer();
1358
internal int handleEnterMessage(java.awt.Component component,
1365
return postDropTargetEvent(component, x, y, dropAction, actions,
1366
formats, nativeCtxt,
1367
sun.awt.dnd.SunDropTargetEvent.MOUSE_ENTERED,
1368
sun.awt.dnd.SunDropTargetContextPeer.DISPATCH_SYNC);
1371
internal void handleExitMessage(java.awt.Component component,
1374
postDropTargetEvent(component, 0, 0, java.awt.dnd.DnDConstants.ACTION_NONE,
1375
java.awt.dnd.DnDConstants.ACTION_NONE, null, nativeCtxt,
1376
sun.awt.dnd.SunDropTargetEvent.MOUSE_EXITED,
1377
sun.awt.dnd.SunDropTargetContextPeer.DISPATCH_SYNC);
1380
internal int handleMotionMessage(java.awt.Component component,
1383
int actions, long[] formats,
1386
return postDropTargetEvent(component, x, y, dropAction, actions,
1387
formats, nativeCtxt,
1388
sun.awt.dnd.SunDropTargetEvent.MOUSE_DRAGGED,
1389
sun.awt.dnd.SunDropTargetContextPeer.DISPATCH_SYNC);
1392
internal void handleDropMessage(java.awt.Component component,
1394
int dropAction, int actions,
1396
long nativeCtxt, IDataObject data)
1399
postDropTargetEvent(component, x, y, dropAction, actions,
1400
formats, nativeCtxt,
1401
sun.awt.dnd.SunDropTargetEvent.MOUSE_DROPPED,
1402
!sun.awt.dnd.SunDropTargetContextPeer.DISPATCH_SYNC);
1405
internal new int postDropTargetEvent(java.awt.Component component,
1414
return base.postDropTargetEvent(component, x, y,
1415
dropAction, actions, formats, nativeCtxt, eventID, dispatchType);
1418
protected override void doDropDone(bool success, int dropAction, bool isLocal)
1420
// Don't do anything as .NET framework already handle the message pump
1423
public override bool isDataFlavorSupported(java.awt.datatransfer.DataFlavor df)
1425
if (isTransferableJVMLocal())
1426
return base.isDataFlavorSupported(df);
1427
return base.isDataFlavorSupported(df);
1430
public override object getTransferData(java.awt.datatransfer.DataFlavor df)
1432
if (isTransferableJVMLocal())
1433
return base.getTransferData(df);
1434
return new NetClipboardTransferable(data).getTransferData(df);
1437
protected override object getNativeData(long l)
1439
throw new NotImplementedException();
1443
internal class NetMouseDragGestureRecognizer : java.awt.dnd.MouseDragGestureRecognizer
1445
protected static int motionThreshold;
1447
protected static readonly int ButtonMask = java.awt.@event.InputEvent.BUTTON1_DOWN_MASK |
1448
java.awt.@event.InputEvent.BUTTON2_DOWN_MASK |
1449
java.awt.@event.InputEvent.BUTTON3_DOWN_MASK;
1451
public NetMouseDragGestureRecognizer(java.awt.dnd.DragSource source, java.awt.Component component1, int actions,
1452
java.awt.dnd.DragGestureListener listener) :
1453
base(source, component1, actions, listener)
1457
protected int mapDragOperationFromModifiers(java.awt.@event.MouseEvent e)
1459
int mods = e.getModifiersEx();
1460
int btns = mods & ButtonMask;
1462
// Prohibit multi-button drags.
1463
if (!(btns == java.awt.@event.InputEvent.BUTTON1_DOWN_MASK ||
1464
btns == java.awt.@event.InputEvent.BUTTON2_DOWN_MASK ||
1465
btns == java.awt.@event.InputEvent.BUTTON3_DOWN_MASK))
1467
return java.awt.dnd.DnDConstants.ACTION_NONE;
1471
sun.awt.dnd.SunDragSourceContextPeer.convertModifiersToDropAction(mods,
1472
getSourceActions());
1475
public override void mouseClicked(java.awt.@event.MouseEvent e)
1480
public override void mousePressed(java.awt.@event.MouseEvent e)
1484
if (mapDragOperationFromModifiers(e) != java.awt.dnd.DnDConstants.ACTION_NONE)
1488
motionThreshold = java.awt.dnd.DragSource.getDragThreshold();
1492
motionThreshold = 5;
1498
public override void mouseReleased(java.awt.@event.MouseEvent e)
1503
public override void mouseEntered(java.awt.@event.MouseEvent e)
1508
public override void mouseExited(java.awt.@event.MouseEvent e)
1510
if (!events.isEmpty())
1511
{ // gesture pending
1512
int dragAction = mapDragOperationFromModifiers(e);
1514
if (dragAction == java.awt.dnd.DnDConstants.ACTION_NONE)
1521
public override void mouseDragged(java.awt.@event.MouseEvent e)
1523
if (!events.isEmpty())
1524
{ // gesture pending
1525
int dop = mapDragOperationFromModifiers(e);
1527
if (dop == java.awt.dnd.DnDConstants.ACTION_NONE)
1532
java.awt.@event.MouseEvent trigger = (java.awt.@event.MouseEvent)events.get(0);
1535
java.awt.Point origin = trigger.getPoint();
1536
java.awt.Point current = e.getPoint();
1538
int dx = java.lang.Math.abs(origin.x - current.x);
1539
int dy = java.lang.Math.abs(origin.y - current.y);
1541
if (dx > motionThreshold || dy > motionThreshold)
1543
fireDragGestureRecognized(dop, ((java.awt.@event.MouseEvent)getTriggerEvent()).getPoint());
1552
class NetInputMethodDescriptor : java.awt.im.spi.InputMethodDescriptor
1554
public java.awt.im.spi.InputMethod createInputMethod()
1556
throw new NotImplementedException();
1559
public Locale[] getAvailableLocales()
1561
// TODO Feature with .NET 3.0 available
1562
//IEnumerable languages = System.Windows.Input.InputLanguageManager.AvailableInputLanguages;
1563
// as a hack we return the default locale
1564
return new Locale[]{Locale.getDefault()};
1567
public string getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage)
1569
// copied from WInputMethodDescriptor
1571
// We ignore the input locale.
1572
// When displaying for the default locale, rely on the localized AWT properties;
1573
// for any other locale, fall back to English.
1574
String name = "System Input Methods";
1575
if (Locale.getDefault().equals(displayLanguage))
1577
name = java.awt.Toolkit.getProperty("AWT.HostInputMethodDisplayName", name);
1582
public java.awt.Image getInputMethodIcon(Locale l)
1584
//WInputMethodDescriptor return also ever null
1588
public bool hasDynamicLocaleList()
1590
// Java return also true
1595
class NetCustomCursor : java.awt.Cursor
1597
private Cursor cursor;
1598
public Cursor Cursor
1600
get { return cursor; }
1603
internal NetCustomCursor(java.awt.Image cursorIm, java.awt.Point hotSpot, String name) // throws IndexOutOfBoundsException
1606
java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
1608
// Make sure image is fully loaded.
1609
java.awt.Component c = new java.awt.Canvas(); // for its imageUpdate method
1610
java.awt.MediaTracker tracker = new java.awt.MediaTracker(c);
1611
tracker.addImage(cursorIm, 0);
1614
tracker.waitForAll();
1616
catch (java.lang.InterruptedException)
1619
int width = cursorIm.getWidth(c);
1620
int height = cursorIm.getHeight(c);
1622
// Fix for bug 4212593 The Toolkit.createCustomCursor does not
1623
// check absence of the image of cursor
1624
// If the image is invalid, the cursor will be hidden (made completely
1625
// transparent). In this case, getBestCursorSize() will adjust negative w and h,
1626
// but we need to set the hotspot inside the image here.
1627
if (tracker.isErrorAny() || width < 0 || height < 0)
1629
hotSpot.x = hotSpot.y = 0;
1632
// Scale image to nearest supported size.
1633
java.awt.Dimension nativeSize = toolkit.getBestCursorSize(width, height);
1634
if (nativeSize.width != width || nativeSize.height != height)
1636
cursorIm = cursorIm.getScaledInstance(nativeSize.width,
1638
java.awt.Image.SCALE_DEFAULT);
1639
width = nativeSize.width;
1640
height = nativeSize.height;
1643
// Verify that the hotspot is within cursor bounds.
1644
if (hotSpot.x >= width || hotSpot.y >= height || hotSpot.x < 0 || hotSpot.y < 0)
1646
throw new ArgumentException("invalid hotSpot");
1649
Bitmap bitmap = J2C.ConvertImage(cursorIm);
1650
IntPtr hIcon = bitmap.GetHicon();
1651
cursor = new Cursor(hIcon);
1655
sealed class NetLightweightComponentPeer : NetComponentPeer<java.awt.Component, Control>, java.awt.peer.LightweightPeer
1657
public NetLightweightComponentPeer(java.awt.Component target)
1662
protected override Control CreateControl()
1664
throw new NotImplementedException();
1668
sealed class NetLightweightContainerPeer : NetContainerPeer<java.awt.Container, ContainerControl>, java.awt.peer.LightweightPeer
1670
public NetLightweightContainerPeer(java.awt.Container target)
1676
abstract class NetComponentPeer : java.awt.peer.ComponentPeer
1678
internal bool eraseBackground = true;
1680
public abstract void applyShape(sun.java2d.pipe.Region r);
1681
public abstract bool canDetermineObscurity();
1682
public abstract int checkImage(java.awt.Image i1, int i2, int i3, java.awt.image.ImageObserver io);
1683
public abstract void coalescePaintEvent(java.awt.@event.PaintEvent pe);
1684
public abstract void createBuffers(int i, java.awt.BufferCapabilities bc);
1685
public abstract java.awt.Image createImage(int i1, int i2);
1686
public abstract java.awt.Image createImage(java.awt.image.ImageProducer ip);
1687
public abstract java.awt.image.VolatileImage createVolatileImage(int i1, int i2);
1688
public abstract void destroyBuffers();
1689
public abstract void disable();
1690
public abstract void dispose();
1691
public abstract void enable();
1692
public abstract void flip(java.awt.BufferCapabilities.FlipContents bcfc);
1693
public abstract java.awt.Image getBackBuffer();
1694
public abstract java.awt.Rectangle getBounds();
1695
public abstract java.awt.image.ColorModel getColorModel();
1696
public abstract java.awt.FontMetrics getFontMetrics(java.awt.Font f);
1697
public abstract java.awt.Graphics getGraphics();
1698
public abstract java.awt.GraphicsConfiguration getGraphicsConfiguration();
1699
public abstract java.awt.Point getLocationOnScreen();
1700
public abstract java.awt.Dimension getMinimumSize();
1701
public abstract java.awt.Dimension getPreferredSize();
1702
public abstract java.awt.Toolkit getToolkit();
1703
public abstract void handleEvent(java.awt.AWTEvent awte);
1704
public abstract bool handlesWheelScrolling();
1705
public abstract void hide();
1706
public abstract bool isFocusable();
1707
public abstract bool isObscured();
1708
public abstract bool isReparentSupported();
1709
public abstract void layout();
1710
public abstract java.awt.Dimension minimumSize();
1711
public abstract void paint(java.awt.Graphics g);
1712
public abstract java.awt.Dimension preferredSize();
1713
public abstract bool prepareImage(java.awt.Image i1, int i2, int i3, java.awt.image.ImageObserver io);
1714
public abstract void print(java.awt.Graphics g);
1715
public abstract void repaint(long l, int i1, int i2, int i3, int i4);
1716
public abstract void reparent(java.awt.peer.ContainerPeer cp);
1717
public abstract bool requestFocus(java.awt.Component c, bool b1, bool b2, long l, CausedFocusEvent.Cause cfec);
1718
public abstract void reshape(int i1, int i2, int i3, int i4);
1719
public abstract void setBackground(java.awt.Color c);
1720
public abstract void setBounds(int i1, int i2, int i3, int i4, int i5);
1721
public abstract void setEnabled(bool b);
1722
public abstract void setFont(java.awt.Font f);
1723
public abstract void setForeground(java.awt.Color c);
1724
public abstract void setVisible(bool b);
1725
public abstract void show();
1726
public abstract void updateCursorImmediately();
1727
public abstract void flip(int x1, int y1, int x2, int y2, java.awt.BufferCapabilities.FlipContents flipAction);
1728
public abstract void setZOrder(java.awt.peer.ComponentPeer above);
1729
public abstract bool updateGraphicsData(java.awt.GraphicsConfiguration gc);
1731
internal DragDropEffects performedDragDropEffects = DragDropEffects.None;
1733
internal abstract Control Control { get; }
1734
internal abstract java.awt.Component Target { get; }
1736
internal abstract int getInsetsLeft();
1737
internal abstract int getInsetsTop();
1739
internal static int getAction(DragDropEffects effects)
1741
int actions = java.awt.dnd.DnDConstants.ACTION_NONE;
1744
case DragDropEffects.None:
1745
actions = java.awt.dnd.DnDConstants.ACTION_NONE;
1747
case DragDropEffects.Copy:
1748
actions = java.awt.dnd.DnDConstants.ACTION_COPY;
1750
case DragDropEffects.Move:
1751
actions = java.awt.dnd.DnDConstants.ACTION_MOVE;
1753
case DragDropEffects.Move | DragDropEffects.Copy:
1754
actions = java.awt.dnd.DnDConstants.ACTION_COPY_OR_MOVE;
1756
case DragDropEffects.Link:
1757
actions = java.awt.dnd.DnDConstants.ACTION_LINK;
1763
internal static int GetMouseEventModifiers(MouseEventArgs ev)
1765
int modifiers = GetModifiers(Control.ModifierKeys);
1766
//Which button was pressed or released, because it can only one that it is a switch
1767
MouseButtons button = ev.Button;
1770
case MouseButtons.Left:
1771
modifiers |= java.awt.@event.InputEvent.BUTTON1_MASK;
1773
case MouseButtons.Middle:
1774
modifiers |= java.awt.@event.InputEvent.BUTTON2_MASK;
1776
case MouseButtons.Right:
1777
modifiers |= java.awt.@event.InputEvent.BUTTON3_MASK;
1783
internal static int GetModifiers(Keys keys)
1786
if ((keys & Keys.Shift) != 0)
1788
modifiers |= java.awt.@event.InputEvent.SHIFT_DOWN_MASK;
1790
switch (keys & (Keys.Control | Keys.Alt))
1793
modifiers |= java.awt.@event.InputEvent.CTRL_DOWN_MASK;
1796
modifiers |= java.awt.@event.InputEvent.ALT_DOWN_MASK;
1798
case Keys.Control | Keys.Alt:
1799
modifiers |= java.awt.@event.InputEvent.ALT_GRAPH_DOWN_MASK;
1802
if ((Control.MouseButtons & MouseButtons.Left) != 0)
1804
modifiers |= java.awt.@event.InputEvent.BUTTON1_DOWN_MASK;
1806
if ((Control.MouseButtons & MouseButtons.Middle) != 0)
1808
modifiers |= java.awt.@event.InputEvent.BUTTON2_DOWN_MASK;
1810
if ((Control.MouseButtons & MouseButtons.Right) != 0)
1812
modifiers |= java.awt.@event.InputEvent.BUTTON3_DOWN_MASK;
1817
internal static int GetButton(MouseEventArgs e)
1819
if ((e.Button & MouseButtons.Left) != 0)
1821
return java.awt.@event.MouseEvent.BUTTON1;
1823
else if ((e.Button & MouseButtons.Middle) != 0)
1825
return java.awt.@event.MouseEvent.BUTTON2;
1827
else if ((e.Button & MouseButtons.Right) != 0)
1829
return java.awt.@event.MouseEvent.BUTTON3;
1833
return java.awt.@event.MouseEvent.NOBUTTON;
1837
internal static NetComponentPeer FromControl(Control control)
1839
return (NetComponentPeer)control.Tag;
1843
abstract class NetComponentPeer<T, C> : NetComponentPeer
1844
where T : java.awt.Component
1847
protected static readonly java.awt.Font defaultFont = new java.awt.Font(java.awt.Font.DIALOG, java.awt.Font.PLAIN, 12);
1848
internal readonly T target;
1849
internal readonly C control;
1850
private bool isMouseClick;
1851
private bool isDoubleClick;
1852
private bool isPopupMenu;
1853
private int oldWidth = -1;
1854
private int oldHeight = -1;
1855
private bool sm_suppressFocusAndActivation;
1856
//private bool m_callbacksEnabled;
1857
//private int m_validationNestCount;
1858
private int serialNum = 0;
1859
private bool isLayouting = false;
1860
private bool paintPending = false;
1861
private RepaintArea paintArea;
1862
private java.awt.Font font;
1863
private java.awt.Color foreground;
1864
private java.awt.Color background;
1865
private volatile bool disposed;
1866
private NetDropTargetContextPeer dropTargetPeer;
1868
internal override Control Control
1870
get { return control; }
1873
internal override java.awt.Component Target
1875
get { return target; }
1878
public NetComponentPeer(T target)
1880
this.target = target;
1881
this.paintArea = new RepaintArea();
1882
java.awt.Container parent = SunToolkit.getNativeContainer(target);
1883
NetComponentPeer parentPeer = (NetComponentPeer)NetToolkit.targetToPeer(parent);
1884
control = Create(parentPeer);
1885
// fix for 5088782: check if window object is created successfully
1887
//this.winGraphicsConfig = (NetGraphicsConfiguration)getGraphicsConfiguration();
1890
winGraphicsConfig.createSurfaceData(this, numBackBuffers);
1893
start(); // Initialize enable/disable state, turn on callbacks
1896
protected virtual void initialize()
1898
if (target.isVisible())
1900
show(); // the wnd starts hidden
1902
java.awt.Color fg = target.getForeground();
1907
// Set background color in C++, to avoid inheriting a parent's color.
1908
java.awt.Font f = target.getFont();
1913
if (!target.isEnabled())
1917
java.awt.Rectangle r = target.getBounds();
1918
setBounds(r.x, r.y, r.width, r.height, java.awt.peer.ComponentPeer.__Fields.SET_BOUNDS);
1920
// this is from initialize() in WCanvasPeer.java
1921
eraseBackground = !SunToolkit.getSunAwtNoerasebackground();
1922
if (!PaintEventDispatcher.getPaintEventDispatcher().shouldDoNativeBackgroundErase(target))
1924
eraseBackground = false;
1930
NetToolkit.BeginInvoke(delegate
1933
// JDK native code also disables the window here, but since that is already done in initialize(),
1934
// I don't see the point
1935
EnableCallbacks(true);
1936
control.Invalidate();
1941
void EnableCallbacks(bool enabled)
1943
//m_callbacksEnabled = enabled;
1946
private C Create(NetComponentPeer parent)
1948
C control = CreateControl();
1952
Form form = control as Form;
1955
form.Owner = parent.Control.FindForm();
1959
control.Parent = parent.Control;
1962
NetToolkit.CreateNative(control);
1966
protected abstract C CreateControl();
1970
NetToolkit.BeginInvoke(delegate { control.Visible = true; });
1973
void Enable(bool enable)
1975
sm_suppressFocusAndActivation = true;
1976
control.Enabled = enable;
1977
sm_suppressFocusAndActivation = false;
1980
internal virtual void hookEvents()
1982
// TODO we really only should hook these events when they are needed...
1983
control.KeyDown += new KeyEventHandler(OnKeyDown);
1984
control.KeyUp += new KeyEventHandler(OnKeyUp);
1985
control.KeyPress += new KeyPressEventHandler(OnKeyPress);
1986
control.MouseMove += new MouseEventHandler(OnMouseMove);
1987
control.MouseDown += new MouseEventHandler(OnMouseDown);
1988
control.MouseWheel += new MouseEventHandler(OnMouseWheel);
1989
control.Click += new EventHandler(OnClick);
1990
control.DoubleClick += new EventHandler(OnDoubleClick);
1991
control.MouseUp += new MouseEventHandler(OnMouseUp);
1992
control.MouseEnter += new EventHandler(OnMouseEnter);
1993
control.MouseLeave += new EventHandler(OnMouseLeave);
1994
control.GotFocus += new EventHandler(OnGotFocus);
1995
control.LostFocus += new EventHandler(OnLostFocus);
1996
//control.Leave += new EventHandler(OnBoundsChanged);
1997
control.Paint += new PaintEventHandler(OnPaint);
1998
control.ContextMenu = new ContextMenu();
1999
control.ContextMenu.Popup += new EventHandler(OnPopupMenu);
2000
control.AllowDrop = true;
2001
control.DragDrop += new DragEventHandler(OnDragDrop);
2002
control.DragOver += new DragEventHandler(OnDragOver);
2003
control.DragLeave += new EventHandler(OnDragLeave);
2004
control.DragEnter += new DragEventHandler(OnDragEnter);
2005
control.QueryContinueDrag += new QueryContinueDragEventHandler(OnQueryContinueDrag);
2008
internal virtual void unhookEvents()
2010
control.KeyDown -= new KeyEventHandler(OnKeyDown);
2011
control.KeyUp -= new KeyEventHandler(OnKeyUp);
2012
control.KeyPress -= new KeyPressEventHandler(OnKeyPress);
2013
control.MouseMove -= new MouseEventHandler(OnMouseMove);
2014
control.MouseDown -= new MouseEventHandler(OnMouseDown);
2015
control.MouseWheel -= new MouseEventHandler(OnMouseWheel);
2016
control.Click -= new EventHandler(OnClick);
2017
control.DoubleClick -= new EventHandler(OnDoubleClick);
2018
control.MouseUp -= new MouseEventHandler(OnMouseUp);
2019
control.MouseEnter -= new EventHandler(OnMouseEnter);
2020
control.MouseLeave -= new EventHandler(OnMouseLeave);
2021
control.GotFocus -= new EventHandler(OnGotFocus);
2022
control.LostFocus -= new EventHandler(OnLostFocus);
2023
//control.Leave -= new EventHandler(OnBoundsChanged);
2024
control.Paint -= new PaintEventHandler(OnPaint);
2025
control.DragDrop -= new DragEventHandler(OnDragDrop);
2026
control.DragOver -= new DragEventHandler(OnDragOver);
2027
control.DragLeave -= new EventHandler(OnDragLeave);
2028
control.DragEnter -= new DragEventHandler(OnDragEnter);
2029
if (control.ContextMenu != null)
2030
control.ContextMenu.Popup -= new EventHandler(OnPopupMenu);
2033
protected void SendEvent(java.awt.AWTEvent evt)
2039
/// Get the left insets of the .NET Window.
2040
/// In .NET the coordinate of a window start on the most left, top point with 0,0
2041
/// In Java the most left, top point with 0,0 is in the detail area of the window.
2042
/// In all not Windows Component this return ever 0.
2044
/// <returns></returns>
2045
internal override int getInsetsLeft()
2051
/// Get the top insets of the .NET Window.
2052
/// In .NET the coordinate of a window start on the most left, top point with 0,0
2053
/// In Java the most left, top point with 0,0 is in the detail area of the window.
2054
/// In all not Windows Component this return ever 0.
2056
/// <returns></returns>
2057
internal override int getInsetsTop()
2064
/// .NET calculates the offset relative to the detail area.
2065
/// Java uses the top left point of a window.
2066
/// That means we must compensate the coordinate of a component
2067
/// if the parent is a window, frame or dialog.
2069
/// <returns>The offset of the details area in the parent</returns>
2070
private Point getParentOffset()
2072
if (!(target is java.awt.Window))
2074
java.awt.Container parent = target.getParent();
2077
NetComponentPeer peer = parent.getPeer() as NetComponentPeer;
2080
return new Point(peer.getInsetsLeft(), peer.getInsetsTop());
2087
private void OnPaint(object sender, PaintEventArgs e)
2089
//CheckFontSmoothingSettings(GetHWnd());
2090
/* Set draw state */
2091
//SetDrawState(GetDrawState() | JAWT_LOCK_CLIP_CHANGED);
2092
WmPaint(e.Graphics, e.ClipRectangle);
2095
private void WmPaint(Graphics g, Rectangle r)
2097
handlePaint(r.X + getInsetsLeft(), r.Y + getInsetsTop(), r.Width, r.Height);
2100
/* Invoke a paint() method call on the target, without clearing the
2101
* damaged area. This is normally called by a native control after
2102
* it has painted itself.
2104
* NOTE: This is called on the privileged toolkit thread. Do not
2105
* call directly into user code using this thread!
2107
private void handlePaint(int x, int y, int w, int h)
2109
postPaintIfNecessary(x, y, w, h);
2112
private void postPaintIfNecessary(int x, int y, int w, int h)
2114
if (!AWTAccessor.getComponentAccessor().getIgnoreRepaint(target))
2116
java.awt.@event.PaintEvent evt = PaintEventDispatcher.getPaintEventDispatcher().createPaintEvent(target, x, y, w, h);
2124
private static int MapKeyCode(Keys key)
2129
return java.awt.@event.KeyEvent.VK_DELETE;
2132
return java.awt.@event.KeyEvent.VK_ENTER;
2139
private void OnKeyDown(object sender, KeyEventArgs e)
2141
long when = java.lang.System.currentTimeMillis();
2142
int modifiers = GetModifiers(e.Modifiers);
2143
int keyCode = MapKeyCode(e.KeyCode);
2146
int keyLocation = java.awt.@event.KeyEvent.KEY_LOCATION_STANDARD;
2147
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2148
postEvent(new java.awt.@event.KeyEvent(target, java.awt.@event.KeyEvent.KEY_PRESSED, when, modifiers, keyCode, keyChar, keyLocation));
2152
private void OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
2156
private void OnDragEnter(object sender, DragEventArgs e)
2158
IDataObject obj = e.Data;
2159
long[] formats = NetDataTransferer.getInstanceImpl().getClipboardFormatCodes(obj.GetFormats());
2160
dropTargetPeer = NetDropTargetContextPeer.getNetDropTargetContextPeer();
2161
int actions = dropTargetPeer.handleEnterMessage(target, e.X, e.Y, getDropAction(e.AllowedEffect, e.KeyState), getAction(e.AllowedEffect),
2163
e.Effect = getDragDropEffects(actions);
2166
private void OnDragOver(object sender, DragEventArgs e)
2168
IDataObject obj = e.Data;
2169
long[] formats = NetDataTransferer.getInstanceImpl().getClipboardFormatCodes(obj.GetFormats());
2170
dropTargetPeer = NetDropTargetContextPeer.getNetDropTargetContextPeer();
2171
int actions = dropTargetPeer.handleMotionMessage(target, e.X, e.Y, getDropAction(e.AllowedEffect, e.KeyState), getAction(e.AllowedEffect),
2173
e.Effect = getDragDropEffects(actions);
2176
private void OnDragLeave(object sender, EventArgs e)
2178
if (dropTargetPeer!=null)
2179
dropTargetPeer.handleExitMessage(target, 0);
2180
dropTargetPeer = null;
2183
private void OnDragDrop(object sender, DragEventArgs e)
2185
IDataObject obj = e.Data;
2186
long[] formats = NetDataTransferer.getInstanceImpl().getClipboardFormatCodes(obj.GetFormats());
2187
int actions = getAction(e.Effect);
2188
if (dropTargetPeer != null)
2189
dropTargetPeer.handleDropMessage(target, e.X, e.Y, getAction(e.Effect), getAction(e.AllowedEffect),
2190
formats, 0, e.Data);
2191
NetDragSourceContextPeer.getInstance().dragDropFinished(true, actions, e.X, e.Y);
2192
performedDragDropEffects = e.Effect;
2193
dropTargetPeer = null;
2196
private static DragDropEffects getDragDropEffects(int actions)
2200
case java.awt.dnd.DnDConstants.ACTION_COPY:
2201
return DragDropEffects.Copy;
2202
case java.awt.dnd.DnDConstants.ACTION_MOVE:
2203
return DragDropEffects.Move;
2204
case java.awt.dnd.DnDConstants.ACTION_COPY_OR_MOVE:
2205
return DragDropEffects.Move | DragDropEffects.Copy;
2206
case java.awt.dnd.DnDConstants.ACTION_LINK:
2207
return DragDropEffects.Link;
2209
return DragDropEffects.None;
2213
private static int getDropAction(DragDropEffects effects, int keyState)
2215
int ret = java.awt.dnd.DnDConstants.ACTION_NONE;
2216
const int MK_CONTROL = 0x8;
2217
const int MK_SHIFT = 0x4;
2218
// const int WM_MOUSEWHEEL = 0x20A;
2219
// const int MK_LBUTTON = 0x1;
2220
// const int MK_MBUTTON = 0x10;
2221
// const int MK_RBUTTON = 0x2;
2222
// const int MK_XBUTTON1 = 0x20;
2223
// const int MK_XBUTTON2 = 0x40;
2224
switch (keyState & (MK_CONTROL | MK_SHIFT))
2227
if ((effects & DragDropEffects.Copy) == DragDropEffects.Copy)
2228
ret = java.awt.dnd.DnDConstants.ACTION_COPY;
2230
ret = java.awt.dnd.DnDConstants.ACTION_NONE;
2233
case MK_CONTROL | MK_SHIFT:
2234
if ((effects & DragDropEffects.Link) == DragDropEffects.Link)
2235
ret = java.awt.dnd.DnDConstants.ACTION_LINK;
2237
ret = java.awt.dnd.DnDConstants.ACTION_NONE;
2241
if ((effects & DragDropEffects.Move) == DragDropEffects.Move)
2242
ret = java.awt.dnd.DnDConstants.ACTION_MOVE;
2244
ret = java.awt.dnd.DnDConstants.ACTION_NONE;
2248
if ((effects & DragDropEffects.Move) == DragDropEffects.Move)
2250
ret = java.awt.dnd.DnDConstants.ACTION_MOVE;
2252
else if ((effects & DragDropEffects.Copy) == DragDropEffects.Copy)
2254
ret = java.awt.dnd.DnDConstants.ACTION_COPY;
2256
else if ((effects & DragDropEffects.Link) == DragDropEffects.Link)
2258
ret = java.awt.dnd.DnDConstants.ACTION_LINK;
2266
private void OnKeyUp(object sender, KeyEventArgs e)
2268
long when = java.lang.System.currentTimeMillis();
2269
int modifiers = GetModifiers(e.Modifiers);
2270
int keyCode = MapKeyCode(e.KeyCode);
2273
int keyLocation = java.awt.@event.KeyEvent.KEY_LOCATION_STANDARD;
2274
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2275
postEvent(new java.awt.@event.KeyEvent(target, java.awt.@event.KeyEvent.KEY_RELEASED, when, modifiers, keyCode, keyChar, keyLocation));
2279
protected virtual void OnKeyPress(object sender, KeyPressEventArgs e)
2281
long when = java.lang.System.currentTimeMillis();
2282
int modifiers = GetModifiers(Control.ModifierKeys);
2283
int keyCode = java.awt.@event.KeyEvent.VK_UNDEFINED;
2284
char keyChar = e.KeyChar;
2285
int keyLocation = java.awt.@event.KeyEvent.KEY_LOCATION_UNKNOWN;
2286
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2287
postEvent(new java.awt.@event.KeyEvent(target, java.awt.@event.KeyEvent.KEY_TYPED, when, modifiers, keyCode, keyChar, keyLocation));
2291
private void postMouseEvent(MouseEventArgs ev, int id, int clicks)
2293
long when = java.lang.System.currentTimeMillis();
2294
int modifiers = GetMouseEventModifiers(ev);
2295
int button = GetButton(ev);
2296
int clickCount = clicks;
2297
int x = ev.X + getInsetsLeft(); //The Inset correctur is needed for Window and extended classes
2298
int y = ev.Y + getInsetsTop();
2299
bool isPopup = isPopupMenu;
2300
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2301
postEvent(new java.awt.@event.MouseEvent(target, id, when, modifiers, x, y, clickCount, isPopup, button));
2303
isPopupMenu = false;
2306
private void postMouseEvent(EventArgs ev, int id)
2308
long when = java.lang.System.currentTimeMillis();
2309
int modifiers = GetModifiers(Control.ModifierKeys);
2312
int x = Control.MousePosition.X - control.Location.X;
2313
int y = Control.MousePosition.Y - control.Location.Y;
2314
bool isPopup = isPopupMenu;
2315
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2316
postEvent(new java.awt.@event.MouseEvent(target, id, when, modifiers, x, y, clickCount, isPopup, button));
2318
isPopupMenu = false;
2321
private void postMouseWheelEvent(EventArgs ev, int id, int delta)
2323
long when = java.lang.System.currentTimeMillis();
2324
int modifiers = GetModifiers(Control.ModifierKeys);
2325
int scrollAmount = -delta * SystemInformation.MouseWheelScrollLines / 120;
2327
int x = Control.MousePosition.X - control.Location.X;
2328
int y = Control.MousePosition.Y - control.Location.Y;
2329
bool isPopup = isPopupMenu;
2330
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate
2332
postEvent(new java.awt.@event.MouseWheelEvent(target, id, when, modifiers, x, y, clickCount, isPopup, java.awt.@event.MouseWheelEvent.WHEEL_UNIT_SCROLL, scrollAmount, scrollAmount));
2336
protected virtual void OnMouseMove(object sender, MouseEventArgs ev)
2338
if((ev.Button & (MouseButtons.Left | MouseButtons.Right)) != 0)
2340
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_DRAGGED, ev.Clicks);
2344
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_MOVED, ev.Clicks);
2348
protected virtual void OnMouseDown(object sender, MouseEventArgs ev)
2350
isMouseClick = false;
2351
isDoubleClick = false;
2352
isPopupMenu = false;
2353
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_PRESSED, ev.Clicks);
2356
private void OnMouseWheel(object sender, MouseEventArgs ev)
2358
postMouseWheelEvent(ev, java.awt.@event.MouseEvent.MOUSE_WHEEL, ev.Delta);
2361
private void OnClick(object sender, EventArgs ev)
2363
isMouseClick = true;
2366
private void OnDoubleClick(object sender, EventArgs ev)
2368
isDoubleClick = true;
2371
private void OnMouseUp(object sender, MouseEventArgs ev)
2373
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_RELEASED, ev.Clicks);
2374
if (isMouseClick || isDoubleClick) // there can only be an Click OR an DoubleClick event - both count as click here
2376
//We make our own mouse click event because the event order is different in .NET
2377
//in .NET the click occured before MouseUp
2378
int clicks = ev.Clicks;
2383
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_CLICKED, clicks);
2385
isMouseClick = false;
2388
private void OnMouseEnter(object sender, EventArgs ev)
2390
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_ENTERED);
2393
private void OnMouseLeave(object sender, EventArgs ev)
2395
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_EXITED);
2398
private void OnGotFocus(object sender, EventArgs e)
2400
if (sm_suppressFocusAndActivation)
2404
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2405
postEvent(new java.awt.@event.FocusEvent(target, java.awt.@event.FocusEvent.FOCUS_GAINED));
2409
private void OnLostFocus(object sender, EventArgs e)
2411
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate {
2412
postEvent(new java.awt.@event.FocusEvent(target, java.awt.@event.FocusEvent.FOCUS_LOST));
2417
* Called from native code (on Toolkit thread) in order to
2418
* dynamically layout the Container during resizing
2420
internal void dynamicallyLayoutContainer() {
2421
// If we got the WM_SIZING, this must be a Container, right?
2422
// In fact, it must be the top-level Container.
2423
//if (log.isLoggable(Level.FINE)) {
2424
// java.awt.Container parent = NetToolkit.getNativeContainer((java.awt.Component)target);
2425
// if (parent != null) {
2426
// log.log(Level.FINE, "Assertion (parent == null) failed");
2429
java.awt.Container cont = (java.awt.Container)(object)target;
2431
NetToolkit.executeOnEventHandlerThread(cont, Delegates.toRunnable(delegate {
2432
// Discarding old paint events doesn't seem to be necessary.
2436
//if (surfaceData instanceof OGLSurfaceData) {
2437
// // 6290245: When OGL is enabled, it is necessary to
2438
// // replace the SurfaceData for each dynamic layout
2439
// // request so that the OGL viewport stays in sync
2440
// // with the window bounds.
2442
// replaceSurfaceData();
2443
// } catch (InvalidPipeException e) {
2444
// // REMIND: this is unlikely to occur for OGL, but
2445
// // what do we do if surface creation fails?
2449
// Forcing a paint here doesn't seem to be necessary.
2450
// paintDamagedAreaImmediately();
2455
* Paints any portion of the component that needs updating
2456
* before the call returns (similar to the Win32 API UpdateWindow)
2458
internal void paintDamagedAreaImmediately()
2460
// force Windows to send any pending WM_PAINT events so
2461
// the damage area is updated on the Java side
2463
// make sure paint events are transferred to main event queue
2465
NetToolkit.flushPendingEvents();
2466
// paint the damaged area
2467
paintArea.paint(target, shouldClearRectBeforePaint());
2470
private void updateWindow()
2472
NetToolkit.BeginInvoke(delegate
2478
/* override and return false on components that DO NOT require
2479
a clearRect() before painting (i.e. native components) */
2480
public virtual bool shouldClearRectBeforePaint()
2485
private void OnPopupMenu(object sender, EventArgs ev)
2491
* Post an event. Queue it for execution by the callback thread.
2493
internal void postEvent(java.awt.AWTEvent evt)
2495
NetToolkit.postEvent(NetToolkit.targetToAppContext(target), evt);
2498
// Routines to support deferred window positioning.
2499
public void beginLayout()
2501
// Skip all painting till endLayout
2505
public void endLayout()
2507
if (!paintArea.isEmpty() && !paintPending &&
2508
!target.getIgnoreRepaint())
2510
// if not waiting for native painting repaint damaged area
2511
postEvent(new java.awt.@event.PaintEvent(target, java.awt.@event.PaintEvent.PAINT, new java.awt.Rectangle()));
2513
isLayouting = false;
2516
public void beginValidate()
2520
// if (m_validationNestCount == 0)
2522
// m_hdwp = BeginDeferWindowPos();
2524
// m_validationNestCount++;
2528
public void endValidate()
2532
// m_validationNestCount--;
2533
// if (m_validationNestCount == 0) {
2534
// // if this call to EndValidate is not nested inside another
2535
// // Begin/EndValidate pair, end deferred window positioning
2536
// ::EndDeferWindowPos(m_hdwp);
2542
// Returns true if we are inside begin/endLayout and
2543
// are waiting for native painting
2544
public bool isPaintPending()
2546
return paintPending && isLayouting;
2549
public override int checkImage(java.awt.Image img, int width, int height, java.awt.image.ImageObserver ob)
2551
return getToolkit().checkImage(img, width, height, ob);
2554
public override java.awt.Image createImage(java.awt.image.ImageProducer prod)
2556
return new sun.awt.image.ToolkitImage(prod);
2559
public override java.awt.Image createImage(int width, int height)
2561
return new java.awt.image.BufferedImage(width, height, java.awt.image.BufferedImage.TYPE_INT_ARGB);
2564
public override void disable()
2566
NetToolkit.BeginInvoke(delegate { Enable( false ); });
2569
public override void dispose()
2571
bool callDisposed = true;
2575
callDisposed = false;
2584
protected virtual void disposeImpl()
2586
NetToolkit.targetDisposedPeer(target, this);
2587
NetToolkit.Invoke(nativeDispose);
2590
protected virtual void nativeDispose()
2596
public override void enable()
2598
NetToolkit.BeginInvoke(delegate { Enable(true); });
2601
public override java.awt.image.ColorModel getColorModel()
2603
//we return the default ColorModel because this causes the least problems with conversions
2604
return java.awt.image.ColorModel.getRGBdefault();
2607
public override java.awt.FontMetrics getFontMetrics(java.awt.Font f)
2609
return sun.font.FontDesignMetrics.getMetrics(f);
2612
public override java.awt.Graphics getGraphics()
2614
if (!control.IsDisposed)
2616
/* Fix for bug 4746122. Color and Font shouldn't be null */
2617
java.awt.Color bgColor = background;
2618
if (bgColor == null)
2620
bgColor = java.awt.SystemColor.window;
2622
java.awt.Color fgColor = foreground;
2623
if (fgColor == null)
2625
fgColor = java.awt.SystemColor.windowText;
2627
java.awt.Font font = this.font;
2632
return new ComponentGraphics(this.control, fgColor, bgColor, font);
2637
public override java.awt.Point getLocationOnScreen()
2639
return NetToolkit.Invoke<java.awt.Point>(delegate
2641
Point p = new Point();
2642
p = control.PointToScreen(p);
2643
return new java.awt.Point(p.X, p.Y);
2647
public override java.awt.Dimension getMinimumSize()
2649
return target.getSize();
2652
public override java.awt.Dimension getPreferredSize()
2654
return getMinimumSize();
2657
public override java.awt.Toolkit getToolkit()
2659
return java.awt.Toolkit.getDefaultToolkit();
2662
// returns true if the event has been handled and shouldn't be propagated
2663
// though handleEvent method chain - e.g. WTextFieldPeer returns true
2664
// on handling '\n' to prevent it from being passed to native code
2665
public virtual bool handleJavaKeyEvent(java.awt.@event.KeyEvent e) { return false; }
2667
private void nativeHandleEvent(java.awt.AWTEvent e)
2669
// TODO arrghh!! code from void AwtComponent::_NativeHandleEvent(void *param) in awt_Component.cpp should be here
2672
public override void handleEvent(java.awt.AWTEvent e)
2676
if (((java.awt.Component)target).isEnabled() && (e is java.awt.@event.KeyEvent) && !((java.awt.@event.KeyEvent)e).isConsumed())
2678
if (handleJavaKeyEvent((java.awt.@event.KeyEvent)e))
2686
case java.awt.@event.PaintEvent.PAINT:
2687
// Got native painting
2688
paintPending = false;
2689
// Fallthrough to next statement
2690
goto case java.awt.@event.PaintEvent.UPDATE;
2691
case java.awt.@event.PaintEvent.UPDATE:
2692
// Skip all painting while layouting and all UPDATEs
2693
// while waiting for native paint
2694
if (!isLayouting && !paintPending)
2696
paintArea.paint(target, shouldClearRectBeforePaint());
2703
// Call the native code
2704
nativeHandleEvent(e);
2707
public override void hide()
2709
NetToolkit.BeginInvoke(delegate { control.Visible = false; });
2712
public bool isFocusTraversable()
2717
public override java.awt.Dimension minimumSize()
2719
return getMinimumSize();
2722
public override java.awt.Dimension preferredSize()
2724
return getPreferredSize();
2727
public override void paint(java.awt.Graphics graphics)
2729
target.paint(graphics);
2732
public override bool prepareImage(java.awt.Image img, int width, int height, java.awt.image.ImageObserver ob)
2734
return getToolkit().prepareImage(img, width, height, ob);
2737
public override void print(java.awt.Graphics graphics)
2739
throw new NotImplementedException();
2742
public override void repaint(long tm, int x, int y, int width, int height)
2746
public void requestFocus()
2748
NetToolkit.Invoke<bool>(control.Focus);
2754
/// <param name="request">the component for which the focus is requested</param>
2755
/// <param name="temporary">indicates if the focus change is temporary (true) or permanent (false)</param>
2756
/// <param name="allowWindowFocus">indicates if it's allowed to change window focus</param>
2757
/// <param name="time">the timestamp</param>
2758
/// <returns></returns>
2759
public bool requestFocus(java.awt.Component request, bool temporary, bool allowWindowFocus, long time)
2761
if (!getEnabled() || !getVisible())
2765
postEvent(new java.awt.@event.FocusEvent(request, java.awt.@event.FocusEvent.FOCUS_GAINED, temporary, target));
2769
public override void reshape(int x, int y, int width, int height)
2771
NetToolkit.BeginInvoke(delegate
2773
Form window = control.FindForm();
2774
java.awt.Insets insets;
2775
if (window is MyForm)
2777
insets = ((MyForm)window).peerInsets;
2781
insets = new java.awt.Insets(0, 0, 0, 0);
2783
control.SetBounds(x - insets.left, y - insets.top, width, height);
2784
//If the .NET control does not accept the new bounds (minimum size, maximum size)
2785
//then we need to reflect the real bounds on the .NET site to the Java site
2786
Rectangle bounds = control.Bounds;
2787
if (bounds.X + insets.left != x || bounds.Y + insets.top != y)
2789
AWTAccessor.getComponentAccessor().setLocation(target, bounds.X + insets.left, bounds.Y + insets.top);
2791
if (bounds.Width != width || bounds.Height != height)
2793
AWTAccessor.getComponentAccessor().setSize(target, bounds.Width, bounds.Height);
2798
public override void setBackground(java.awt.Color color)
2802
this.background = color;
2803
NetToolkit.BeginInvoke(delegate { control.BackColor = J2C.ConvertColor(color); });
2807
private void reshapeNoCheck(int x, int y, int width, int height)
2809
NetToolkit.BeginInvoke(delegate { control.SetBounds(x, y, width, height); });
2812
public override void setBounds(int x, int y, int width, int height, int op)
2814
// Should set paintPending before reahape to prevent
2815
// thread race between paint events
2816
// Native components do redraw after resize
2817
paintPending = (width != oldWidth) || (height != oldHeight);
2819
if ((op & java.awt.peer.ComponentPeer.__Fields.NO_EMBEDDED_CHECK) != 0)
2821
reshapeNoCheck(x, y, width, height);
2825
reshape(x, y, width, height);
2827
if ((width != oldWidth) || (height != oldHeight))
2829
// Only recreate surfaceData if this setBounds is called
2830
// for a resize; a simple move should not trigger a recreation
2833
//replaceSurfaceData();
2835
catch (sun.java2d.InvalidPipeException)
2837
// REMIND : what do we do if our surface creation failed?
2846
private void setCursorImpl(java.awt.Cursor cursor)
2848
if (cursor is NetCustomCursor)
2850
NetCustomCursor ncc = (NetCustomCursor)cursor;
2851
control.Cursor = ncc.Cursor;
2854
switch(cursor.getType())
2856
case java.awt.Cursor.WAIT_CURSOR:
2857
control.Cursor = Cursors.WaitCursor;
2859
case java.awt.Cursor.DEFAULT_CURSOR:
2860
control.Cursor = Cursors.Default;
2862
case java.awt.Cursor.HAND_CURSOR:
2863
control.Cursor = Cursors.Hand;
2865
case java.awt.Cursor.CROSSHAIR_CURSOR:
2866
control.Cursor = Cursors.Cross;
2868
case java.awt.Cursor.W_RESIZE_CURSOR:
2869
case java.awt.Cursor.E_RESIZE_CURSOR:
2870
control.Cursor = Cursors.SizeWE;
2872
case java.awt.Cursor.MOVE_CURSOR:
2873
control.Cursor = Cursors.SizeAll;
2875
case java.awt.Cursor.N_RESIZE_CURSOR:
2876
case java.awt.Cursor.S_RESIZE_CURSOR:
2877
control.Cursor = Cursors.SizeNS;
2879
case java.awt.Cursor.NE_RESIZE_CURSOR:
2880
case java.awt.Cursor.SW_RESIZE_CURSOR:
2881
control.Cursor = Cursors.SizeNESW;
2883
case java.awt.Cursor.NW_RESIZE_CURSOR:
2884
case java.awt.Cursor.SE_RESIZE_CURSOR:
2885
control.Cursor = Cursors.SizeNWSE;
2887
case java.awt.Cursor.TEXT_CURSOR:
2888
control.Cursor = Cursors.IBeam;
2891
Console.WriteLine("setCursor not implement for: " + cursor);
2896
public void setCursor(java.awt.Cursor cursor)
2898
NetToolkit.Invoke(setCursorImpl, cursor);
2901
public bool getEnabled()
2903
return NetToolkit.Invoke<bool>(delegate { return control.Enabled; });
2906
public bool getFocused()
2908
return NetToolkit.Invoke<bool>(delegate { return control.Focused; });
2911
public bool getVisible()
2913
return NetToolkit.Invoke<bool>(delegate { return control.Visible; });
2916
public override void setEnabled(bool enabled)
2928
public override void setFont(java.awt.Font font)
2933
NetToolkit.BeginInvoke(delegate { control.Font = font.getNetFont(); });
2937
public override void setForeground(java.awt.Color color)
2941
this.foreground = color;
2942
NetToolkit.BeginInvoke(delegate { control.ForeColor = J2C.ConvertColor(color); });
2946
public override void setVisible(bool visible)
2958
public override void show()
2960
java.awt.Dimension s = target.getSize();
2961
oldHeight = s.height;
2967
* Return the GraphicsConfiguration associated with this peer, either
2968
* the locally stored winGraphicsConfig, or that of the target Component.
2970
public override java.awt.GraphicsConfiguration getGraphicsConfiguration()
2972
// we don't need a treelock here, since
2973
// Component.getGraphicsConfiguration() gets it itself.
2974
return target.getGraphicsConfiguration();
2977
public void setEventMask (long mask)
2979
//Console.WriteLine("NOTE: NetComponentPeer.setEventMask not implemented");
2982
public override bool isObscured()
2984
// should never be called because we return false from canDetermineObscurity()
2988
public override bool canDetermineObscurity()
2990
// JDK returns true here and uses GetClipBox to determine if the window is partially obscured,
2991
// this is an optimization for scrolling in javax.swing.JViewport, since there appears to be
2992
// no managed equivalent of GetClipBox, we'll simply return false and forgo the optimization.
2996
public override void coalescePaintEvent(java.awt.@event.PaintEvent e)
2998
java.awt.Rectangle r = e.getUpdateRect();
2999
if (!(e is sun.awt.@event.IgnorePaintEvent))
3001
paintArea.add(r, e.getID());
3005
public override void updateCursorImmediately()
3009
public override java.awt.image.VolatileImage createVolatileImage(int width, int height)
3011
return new NetVolatileImage(target, width, height);
3014
public override bool handlesWheelScrolling()
3019
public override void createBuffers(int x, java.awt.BufferCapabilities capabilities)
3021
throw new NotImplementedException();
3024
public override java.awt.Image getBackBuffer()
3026
throw new NotImplementedException();
3029
public override void flip(java.awt.BufferCapabilities.FlipContents contents)
3031
throw new NotImplementedException();
3034
public override void destroyBuffers()
3036
throw new NotImplementedException();
3039
public override bool isFocusable()
3044
protected bool isDisposed()
3049
public override java.awt.Rectangle getBounds()
3051
return target.getBounds();
3054
public override void reparent(java.awt.peer.ContainerPeer parent)
3056
throw new NotImplementedException();
3059
public override bool isReparentSupported()
3064
// Do nothing for heavyweight implementation
3065
public override void layout()
3069
public override void applyShape(sun.java2d.pipe.Region shape)
3071
NetToolkit.BeginInvoke(ApplyShapeImpl, shape);
3074
private void ApplyShapeImpl(sun.java2d.pipe.Region shape)
3076
control.Region = J2C.ConvertRegion(shape);
3079
//copied form KeyboardFocusManager
3080
private const int SNFH_FAILURE = 0;
3081
private const int SNFH_SUCCESS_HANDLED = 1;
3082
private const int SNFH_SUCCESS_PROCEED = 2;
3084
private static java.lang.reflect.Method shouldNativelyFocusHeavyweight;
3085
private static java.lang.reflect.Method processSynchronousLightweightTransfer;
3086
private static java.lang.reflect.Method removeLastFocusRequest;
3088
public override bool requestFocus(java.awt.Component lightweightChild, bool temporary, bool focusedWindowChangeAllowed, long time, sun.awt.CausedFocusEvent.Cause cause)
3090
// this is a interpretation of the code in WComponentPeer.java and awt_component.cpp
3093
if (processSynchronousLightweightTransfer == null)
3095
java.security.AccessController.doPrivileged(Delegates.toPrivilegedAction(delegate
3097
java.lang.Class keyboardFocusManagerCls = typeof(java.awt.KeyboardFocusManager);
3098
java.lang.reflect.Method method = keyboardFocusManagerCls.getDeclaredMethod(
3099
"processSynchronousLightweightTransfer",
3100
typeof(java.awt.Component),
3101
typeof(java.awt.Component),
3102
java.lang.Boolean.TYPE,
3103
java.lang.Boolean.TYPE,
3104
java.lang.Long.TYPE);
3105
method.setAccessible(true);
3106
processSynchronousLightweightTransfer = method;
3110
processSynchronousLightweightTransfer.invoke(
3114
java.lang.Boolean.valueOf(temporary),
3115
java.lang.Boolean.valueOf(focusedWindowChangeAllowed),
3116
java.lang.Long.valueOf(time));
3122
if (shouldNativelyFocusHeavyweight == null)
3124
java.security.AccessController.doPrivileged(Delegates.toPrivilegedAction(delegate
3126
java.lang.Class keyboardFocusManagerCls = typeof(java.awt.KeyboardFocusManager);
3127
java.lang.reflect.Method method = keyboardFocusManagerCls.getDeclaredMethod(
3128
"shouldNativelyFocusHeavyweight",
3129
typeof(java.awt.Component),
3130
typeof(java.awt.Component),
3131
java.lang.Boolean.TYPE,
3132
java.lang.Boolean.TYPE,
3133
java.lang.Long.TYPE,
3134
typeof(sun.awt.CausedFocusEvent.Cause));
3135
method.setAccessible(true);
3136
shouldNativelyFocusHeavyweight = method;
3140
int retval = ((java.lang.Integer)shouldNativelyFocusHeavyweight.invoke(
3144
java.lang.Boolean.valueOf(temporary),
3145
java.lang.Boolean.valueOf(focusedWindowChangeAllowed),
3146
java.lang.Long.valueOf(time),
3148
if (retval == SNFH_SUCCESS_HANDLED)
3152
else if (retval == SNFH_SUCCESS_PROCEED)
3158
if (removeLastFocusRequest == null)
3160
java.security.AccessController.doPrivileged(Delegates.toPrivilegedAction(delegate
3162
java.lang.Class keyboardFocusManagerCls = typeof(java.awt.KeyboardFocusManager);
3163
java.lang.reflect.Method method = keyboardFocusManagerCls.getDeclaredMethod(
3164
"removeLastFocusRequest",
3165
typeof(java.awt.Component));
3166
method.setAccessible(true);
3167
removeLastFocusRequest = method;
3171
removeLastFocusRequest.invoke(null, target);
3178
* Move the back buffer to the front buffer.
3180
* @param x1 the area to be flipped, upper left X coordinate
3181
* @param y1 the area to be flipped, upper left Y coordinate
3182
* @param x2 the area to be flipped, lower right X coordinate
3183
* @param y2 the area to be flipped, lower right Y coordinate
3184
* @param flipAction the flip action to perform
3186
* @see Component.FlipBufferStrategy#flip
3188
public override void flip(int x1, int y1, int x2, int y2, java.awt.BufferCapabilities.FlipContents flipAction)
3190
throw new ikvm.@internal.NotYetImplementedError();
3194
* Lowers this component at the bottom of the above HW peer. If the above parameter
3195
* is null then the method places this component at the top of the Z-order.
3197
public override void setZOrder(java.awt.peer.ComponentPeer above)
3199
Control.ControlCollection controls = control.Controls;
3200
if (!controls.Contains(control))
3202
// Control was not added to any window. Occur if you call addNotify without
3207
controls.SetChildIndex(control, 0);
3211
NetComponentPeer<T, C> netPeer = (NetComponentPeer<T, C>)above;
3212
controls.SetChildIndex(control, controls.GetChildIndex(netPeer.control));
3217
* Updates internal data structures related to the component's GC.
3219
* @return if the peer needs to be recreated for the changes to take effect
3222
public override bool updateGraphicsData(java.awt.GraphicsConfiguration gc)
3224
throw new ikvm.@internal.NotYetImplementedError();
3229
sealed class NetScrollbarPeer : NetComponentPeer<java.awt.Scrollbar, ScrollBar>, java.awt.peer.ScrollbarPeer
3231
internal NetScrollbarPeer(java.awt.Scrollbar target)
3236
public void setLineIncrement(int i)
3240
public void setPageIncrement(int i)
3244
public void setValues(int i1, int i2, int i3, int i4)
3248
protected override ScrollBar CreateControl()
3250
switch (target.getOrientation())
3252
case java.awt.Scrollbar.VERTICAL:
3253
return new VScrollBar();
3255
return new HScrollBar();
3260
sealed class NetScrollPanePeer : NetComponentPeer<java.awt.ScrollPane, ScrollableControl>, java.awt.peer.ScrollPanePeer
3262
internal NetScrollPanePeer(java.awt.ScrollPane pane)
3267
public void childResized(int i1, int i2)
3271
public int getHScrollbarHeight()
3273
return NetToolkit.Invoke<int>(delegate { return 0; });
3276
public int getVScrollbarWidth()
3278
return NetToolkit.Invoke<int>(delegate { return 0; });
3281
public void setScrollPosition(int i1, int i2)
3285
public void setUnitIncrement(java.awt.Adjustable a, int i)
3289
public void setValue(java.awt.Adjustable a, int i)
3293
public java.awt.Insets getInsets()
3295
return NetToolkit.Invoke<java.awt.Insets>(delegate { return new java.awt.Insets(0, 0, 0, 0); });
3298
public java.awt.Insets insets()
3303
public bool isRestackSupported()
3308
public void restack()
3310
throw new NotImplementedException();
3313
protected override ScrollableControl CreateControl()
3315
return new ScrollableControl();
3319
sealed class NetButtonPeer : NetComponentPeer<java.awt.Button, Button>, java.awt.peer.ButtonPeer
3321
public NetButtonPeer(java.awt.Button awtbutton)
3324
if (!awtbutton.isBackgroundSet())
3326
awtbutton.setBackground(java.awt.SystemColor.control);
3328
control.BackColor = Color.FromArgb(awtbutton.getBackground().getRGB());
3329
control.Text = awtbutton.getLabel();
3330
control.Click += new EventHandler(OnClick);
3333
private void OnClick(object sender, EventArgs e)
3335
// TODO set all these properties correctly
3339
postEvent(new java.awt.@event.ActionEvent(target, java.awt.@event.ActionEvent.ACTION_PERFORMED, cmd, when, modifiers));
3342
public void setLabel(string label)
3344
NetToolkit.Invoke(delegate { control.Text = label; });
3347
public override java.awt.Dimension getMinimumSize()
3349
using(Graphics g = control.CreateGraphics())
3351
// TODO get these fudge factors from somewhere
3352
return new java.awt.Dimension((int)Math.Round(12 + g.MeasureString(control.Text, control.Font).Width) * 8 / 7, 6 + control.Font.Height * 8 / 7);
3356
public override bool shouldClearRectBeforePaint()
3361
protected override Button CreateControl()
3363
return new Button();
3367
abstract class NetTextComponentPeer<T> : NetComponentPeer<T, TextBox>, java.awt.peer.TextComponentPeer
3368
where T : java.awt.TextComponent
3370
public NetTextComponentPeer(java.awt.TextComponent textComponent)
3371
: base((T)textComponent)
3374
// MONOBUG mcs generates a ldflda on a readonly field, so we use a temp
3375
T target = this.target;
3377
if (!target.isBackgroundSet())
3379
target.setBackground(java.awt.SystemColor.window);
3381
setBackground(target.getBackground());
3382
control.AutoSize = false;
3383
control.Text = target.getText();
3386
public override bool isFocusable()
3391
protected override void OnKeyPress(object sender, KeyPressEventArgs e)
3393
base.OnKeyPress(sender, e);
3394
// TODO for TextAreas this probably isn't the right behaviour
3395
if(e.KeyChar == '\r')
3397
// TODO set all these properties correctly
3401
postEvent(new java.awt.@event.ActionEvent(target, java.awt.@event.ActionEvent.ACTION_PERFORMED, cmd, when, modifiers));
3405
public int getSelectionEnd()
3407
return NetToolkit.Invoke<int>(delegate { return control.SelectionStart + control.SelectionLength; });
3410
public int getSelectionStart()
3412
return NetToolkit.Invoke<int>(delegate { return control.SelectionStart; });
3415
public string getText()
3417
return NetToolkit.Invoke<string>(delegate { return control.Text; });
3420
public void setText(string text)
3422
NetToolkit.Invoke(delegate { control.Text = text; });
3425
public void select(int start_pos, int end_pos)
3427
throw new NotImplementedException();
3430
public void setEditable(bool editable)
3432
throw new NotImplementedException();
3435
public int getCaretPosition()
3437
return getSelectionStart();
3440
private void setCaretPositionImpl(int pos)
3442
control.SelectionStart = pos;
3443
control.SelectionLength = 0;
3446
public void setCaretPosition(int pos)
3448
NetToolkit.Invoke(setCaretPositionImpl, pos);
3451
public long filterEvents(long filter)
3453
throw new NotImplementedException();
3456
public int getIndexAtPoint(int x, int y)
3458
throw new NotImplementedException();
3461
public java.awt.Rectangle getCharacterBounds(int pos)
3463
throw new NotImplementedException();
3466
public java.awt.im.InputMethodRequests getInputMethodRequests()
3468
throw new NotImplementedException();
3471
protected sealed override TextBox CreateControl()
3473
return new TextBox();
3477
sealed class NetChoicePeer : NetComponentPeer<java.awt.Choice, RadioButton>, java.awt.peer.ChoicePeer
3479
public NetChoicePeer(java.awt.Choice target)
3484
public void add(string str, int i)
3486
// TODO: Add NetChoicePeer.add implementation
3489
public void addItem(string str, int i)
3491
// TODO: Add NetChoicePeer.addItem implementation
3494
public void select(int i)
3496
// TODO: Add NetChoicePeer.select implementation
3499
public void removeAll()
3501
// TODO: Add NetChoicePeer.removeAll implementation
3504
public void remove(int i)
3506
// TODO: Add NetChoicePeer.remove implementation
3509
protected override RadioButton CreateControl()
3511
return new RadioButton();
3515
sealed class NetCheckboxPeer : NetComponentPeer<java.awt.Checkbox, CheckBox>, java.awt.peer.CheckboxPeer
3517
public NetCheckboxPeer(java.awt.Checkbox target)
3522
public void setCheckboxGroup(java.awt.CheckboxGroup cg)
3524
// TODO: Add NetCheckboxPeer.setCheckboxGroup implementation
3527
public void setState(bool b)
3529
// TODO: Add NetCheckboxPeer.setState implementation
3532
public void setLabel(string str)
3534
// TODO: Add NetCheckboxPeer.setLabel implementation
3537
protected override CheckBox CreateControl()
3539
return new CheckBox();
3543
sealed class NetLabelPeer : NetComponentPeer<java.awt.Label, Label>, java.awt.peer.LabelPeer
3545
public NetLabelPeer(java.awt.Label jlabel)
3548
control.Text = jlabel.getText();
3549
setAlignment(jlabel.getAlignment());
3552
public void setAlignment(int align)
3554
ContentAlignment alignment;
3557
case java.awt.Label.LEFT:
3558
alignment = ContentAlignment.TopLeft;
3560
case java.awt.Label.CENTER:
3561
alignment = ContentAlignment.TopCenter;
3563
case java.awt.Label.RIGHT:
3564
alignment = ContentAlignment.TopRight;
3569
NetToolkit.Invoke(setAlignImpl, alignment);
3572
private void setAlignImpl(ContentAlignment alignment)
3574
control.TextAlign = (ContentAlignment)alignment;
3577
public void setText(string s)
3579
NetToolkit.Invoke(setTextImpl, s);
3582
private void setTextImpl(string s)
3587
public override java.awt.Dimension preferredSize()
3589
return NetToolkit.Invoke<java.awt.Dimension>(getPreferredSizeImpl);
3592
private java.awt.Dimension getPreferredSizeImpl()
3594
// HACK get these fudge factors from somewhere
3595
return new java.awt.Dimension(control.PreferredWidth, 2 + control.PreferredHeight);
3598
public override bool shouldClearRectBeforePaint()
3600
// is native control, don't clear
3604
protected override Label CreateControl()
3610
sealed class NetTextFieldPeer : NetTextComponentPeer<java.awt.TextField>, java.awt.peer.TextFieldPeer
3612
public NetTextFieldPeer(java.awt.TextField textField)
3615
setEchoCharacterImpl(textField.getEchoChar());
3618
public java.awt.Dimension minimumSize(int len)
3620
return getMinimumSize(len);
3623
public java.awt.Dimension preferredSize(int len)
3625
return getPreferredSize(len);
3628
public java.awt.Dimension getMinimumSize(int len)
3630
return getPreferredSize(len);
3633
public java.awt.Dimension getPreferredSize(int len)
3635
// TODO use control.Invoke
3636
using(Graphics g = control.CreateGraphics())
3638
return new java.awt.Dimension((int)Math.Round((g.MeasureString("abcdefghijklm", control.Font).Width * len) / 13), ((TextBox)control).PreferredHeight);
3642
public void setEchoChar(char echo_char)
3644
setEchoCharacter(echo_char);
3647
private void setEchoCharacterImpl(char echo_char)
3649
control.PasswordChar = echo_char;
3652
public void setEchoCharacter(char echo_char)
3654
control.Invoke(new Action<char>(setEchoCharacterImpl), echo_char);
3657
public override bool handleJavaKeyEvent(java.awt.@event.KeyEvent e)
3661
case java.awt.@event.KeyEvent.KEY_TYPED:
3662
if ((e.getKeyChar() == '\n') && !e.isAltDown() && !e.isControlDown())
3664
postEvent(new java.awt.@event.ActionEvent(target, java.awt.@event.ActionEvent.ACTION_PERFORMED,
3665
getText(), e.getWhen(), e.getModifiers()));
3674
sealed class NetTextAreaPeer : NetTextComponentPeer<java.awt.TextArea>, java.awt.peer.TextAreaPeer
3676
public NetTextAreaPeer(java.awt.TextArea textArea)
3679
control.ReadOnly = !((java.awt.TextArea)target).isEditable();
3680
control.WordWrap = false;
3681
control.ScrollBars = ScrollBars.Both;
3682
control.Multiline = true;
3685
public void insert(string text, int pos)
3687
NetToolkit.Invoke(delegate { control.Text = control.Text.Insert(pos, text); });
3690
public void insertText(string text, int pos)
3695
public override java.awt.Dimension getMinimumSize()
3697
return getMinimumSize(10, 60);
3700
public java.awt.Dimension minimumSize(int rows, int cols)
3702
return getMinimumSize(rows, cols);
3705
public java.awt.Dimension getMinimumSize(int rows, int cols)
3707
java.awt.FontMetrics fm = getFontMetrics(target.getFont());
3708
return new java.awt.Dimension(fm.charWidth('0') * cols + 20, fm.getHeight() * rows + 20);
3711
public java.awt.Dimension preferredSize(int rows, int cols)
3713
return getPreferredSize(rows, cols);
3716
public java.awt.Dimension getPreferredSize(int rows, int cols)
3718
return getMinimumSize(rows, cols);
3721
public void replaceRange(string text, int start_pos, int end_pos)
3723
throw new NotImplementedException();
3725
public void replaceText(string text, int start_pos, int end_pos)
3727
throw new NotImplementedException();
3731
class NetContainerPeer<T, C> : NetComponentPeer<T, C>, java.awt.peer.ContainerPeer
3732
where T : java.awt.Container
3736
/// The native insets of the .NET Window
3738
protected java.awt.Insets _insets = new java.awt.Insets(0, 0, 0, 0);
3740
public NetContainerPeer(java.awt.Container awtcontainer)
3741
: base((T)awtcontainer)
3745
internal override int getInsetsLeft()
3747
return _insets.left; ;
3750
internal override int getInsetsTop()
3755
public java.awt.Insets insets()
3760
public java.awt.Insets getInsets()
3765
public bool isRestackSupported()
3770
public void cancelPendingPaint(int x, int y, int width, int height)
3772
throw new NotImplementedException();
3775
public void restack()
3777
throw new NotImplementedException();
3780
protected override C CreateControl()
3782
throw new NotImplementedException();
3786
sealed class NetPanelPeer : NetContainerPeer<java.awt.Panel, ContainerControl>, java.awt.peer.PanelPeer
3788
public NetPanelPeer(java.awt.Panel panel)
3793
protected override ContainerControl CreateControl()
3795
return new ContainerControl();
3799
sealed class NetCanvasPeer : NetComponentPeer<java.awt.Canvas, Control>, java.awt.peer.CanvasPeer
3801
public NetCanvasPeer(java.awt.Canvas canvas)
3806
protected override Control CreateControl()
3808
return new Control();
3812
* Requests a GC that best suits this Canvas. The returned GC may differ
3813
* from the requested GC passed as the argument to this method. This method
3814
* must return a non-null value (given the argument is non-null as well).
3818
public java.awt.GraphicsConfiguration getAppropriateGraphicsConfiguration(java.awt.GraphicsConfiguration gc)
3824
class NetWindowPeer : NetContainerPeer<java.awt.Window, Form>, java.awt.peer.WindowPeer
3826
// we can't use NetDialogPeer as blocker may be an instance of NetPrintDialogPeer that
3827
// extends NetWindowPeer, not NetDialogPeer
3828
private NetWindowPeer modalBlocker;
3829
private bool modalSavedEnabled;
3831
private static NetWindowPeer grabbedWindow;
3833
public NetWindowPeer(java.awt.Window window, bool isFocusableWindow, bool isAlwaysOnTop)
3836
//form.Shown += new EventHandler(OnOpened); Will already post in java.awt.Window.show()
3837
control.Closing += new CancelEventHandler(OnClosing);
3838
control.Closed += new EventHandler(OnClosed);
3839
control.Activated += new EventHandler(OnActivated);
3840
control.Deactivate += new EventHandler(OnDeactivate);
3841
control.SizeChanged += new EventHandler(OnSizeChanged);
3842
control.Resize += new EventHandler(OnResize);
3843
control.Move += new EventHandler(OnMove);
3844
((UndecoratedForm)control).SetWindowState(isFocusableWindow, isAlwaysOnTop);
3847
protected override void initialize()
3851
if (target.getBackground() == null)
3853
AWTAccessor.getComponentAccessor().setBackground(target, target is java.awt.Dialog ? java.awt.SystemColor.control : java.awt.SystemColor.window);
3855
control.BackColor = J2C.ConvertColor(target.getBackground());
3856
if (target.getForeground() == null)
3858
target.setForeground(java.awt.SystemColor.windowText);
3860
if (target.getFont() == null)
3862
//target.setFont(defaultFont);
3863
//HACK: Sun is calling setFont(Font) here and this is calling firePropertyChange("font", oldFont, newFont)
3864
//but this produce a deadlock with getTreeLock() because the creating of the peer is already in this synchronized
3865
java.security.AccessController.doPrivileged(Delegates.toPrivilegedAction(delegate
3867
java.lang.Class component = typeof(java.awt.Component);
3868
java.lang.reflect.Field field = component.getDeclaredField("font");
3869
field.setAccessible(true);
3870
field.set(target, defaultFont);
3871
java.lang.reflect.Method method = component.getDeclaredMethod(
3872
"firePropertyChange",
3873
typeof(java.lang.String),
3874
typeof(java.lang.Object),
3875
typeof(java.lang.Object));
3876
method.setAccessible(true);
3877
method.invoke(target, "font", null, defaultFont);
3883
private void OnResize(object sender, EventArgs e)
3886
SendComponentEvent(java.awt.@event.ComponentEvent.COMPONENT_RESIZED);
3887
dynamicallyLayoutContainer();
3890
private void OnMove(object sender, EventArgs e)
3893
AWTAccessor.getComponentAccessor().setLocation(target, control.Left, control.Top);
3894
SendComponentEvent(java.awt.@event.ComponentEvent.COMPONENT_MOVED);
3898
* Although this function sends ComponentEvents, it needs to be defined
3899
* here because only top-level windows need to have move and resize
3900
* events fired from native code. All contained windows have these events
3901
* fired from common Java code.
3903
private void SendComponentEvent(int eventId)
3905
SendEvent(new java.awt.@event.ComponentEvent(target, eventId));
3908
private void OnSizeChanged(object sender, EventArgs e)
3911
typeof(java.awt.Component).GetField("width", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(target, control.Width);
3912
typeof(java.awt.Component).GetField("height", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(target, control.Height);
3913
SendComponentEvent(java.awt.@event.ComponentEvent.COMPONENT_RESIZED);
3916
private void OnOpened(object sender, EventArgs e)
3918
postEvent(new java.awt.@event.WindowEvent((java.awt.Window)target, java.awt.@event.WindowEvent.WINDOW_OPENED));
3921
private void OnClosing(object sender, CancelEventArgs e)
3924
postEvent(new java.awt.@event.WindowEvent((java.awt.Window)target, java.awt.@event.WindowEvent.WINDOW_CLOSING));
3927
private void OnClosed(object sender, EventArgs e)
3929
postEvent(new java.awt.@event.WindowEvent((java.awt.Window)target, java.awt.@event.WindowEvent.WINDOW_CLOSED));
3932
private const int WA_ACTIVE = 1;
3933
private const int WA_INACTIVE = 2;
3935
private void OnActivated(object sender, EventArgs e)
3937
WmActivate(WA_ACTIVE, control.WindowState == FormWindowState.Minimized, null);
3940
private void OnDeactivate(object sender, EventArgs e)
3942
WmActivate(WA_INACTIVE, control.WindowState == FormWindowState.Minimized, null);
3945
private void WmActivate(int nState, bool fMinimized, Control opposite)
3949
if (nState != WA_INACTIVE)
3951
type = java.awt.@event.WindowEvent.WINDOW_GAINED_FOCUS;
3955
if (grabbedWindow != null && !grabbedWindow.IsOneOfOwnersOf(this))
3957
grabbedWindow.Ungrab(true);
3959
type = java.awt.@event.WindowEvent.WINDOW_LOST_FOCUS;
3962
SendWindowEvent(type, opposite);
3965
private void SendWindowEvent(int id, Control opposite) { SendWindowEvent(id, opposite, 0, 0); }
3967
private void SendWindowEvent(int id, Control opposite, int oldState, int newState)
3969
java.awt.AWTEvent evt = new java.awt.@event.WindowEvent((java.awt.Window)target, id, null);
3971
if (id == java.awt.@event.WindowEvent.WINDOW_GAINED_FOCUS
3972
|| id == java.awt.@event.WindowEvent.WINDOW_LOST_FOCUS)
3974
Type type = typeof(java.awt.Component).Assembly.GetType("java.awt.SequencedEvent");
3975
ConstructorInfo cons = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, new Type[] { typeof(java.awt.AWTEvent) }, null);
3976
evt = (java.awt.AWTEvent)cons.Invoke(new object[] { evt });
3982
public override java.awt.Graphics getGraphics()
3984
java.awt.Graphics g = base.getGraphics();
3985
java.awt.Insets insets = getInsets();
3986
g.translate(-insets.left, -insets.top);
3987
g.setClip(insets.left, insets.top, control.ClientRectangle.Width, control.ClientRectangle.Height);
3991
public override bool shouldClearRectBeforePaint()
3993
// clearing the window before repainting causes the controls to "flicker" on screen
3998
/// Set the border style of the window and recalc the insets
4000
/// <param name="style">the new style</param>
4001
protected void setFormBorderStyle(FormBorderStyle style)
4003
NetToolkit.BeginInvoke(delegate
4005
control.FormBorderStyle = style;
4006
//Calculate the Insets one time
4007
//This is many faster because there no thread change is needed.
4012
protected void CalcInsetsImpl()
4014
Rectangle client = control.ClientRectangle;
4015
if (client.Height == 0)
4017
// HACK for .NET bug if form has the minimum size then ClientRectangle is not recalulate
4018
// if the FormBorderStyle is changed
4019
Size size = control.Size;
4021
control.Size = size;
4023
control.Size = size;
4024
client = control.ClientRectangle;
4026
Rectangle r = control.RectangleToScreen(client);
4027
int x = r.Location.X - control.Location.X;
4028
int y = r.Location.Y - control.Location.Y;
4029
// only modify this instance, since it's shared by the control-peers of this form
4032
_insets.bottom = control.Height - client.Height - y;
4033
if (control.Menu != null)
4035
_insets.bottom += SystemInformation.MenuHeight;
4037
_insets.right = control.Width - client.Width - x;
4040
public override void reshape(int x, int y, int width, int height)
4042
NetToolkit.BeginInvoke(delegate
4044
control.SetBounds(x, y, width, height);
4045
//If the .NET control does not accept the new bounds (minimum size, maximum size)
4046
//then we need to reflect the real bounds on the .NET site to the Java site
4047
Rectangle bounds = control.Bounds;
4048
if (bounds.X != x || bounds.Y != y)
4050
AWTAccessor.getComponentAccessor().setLocation(target, bounds.X, bounds.Y);
4052
if (bounds.Width != width || bounds.Height != height)
4054
AWTAccessor.getComponentAccessor().setSize(target, bounds.Width, bounds.Height);
4059
public void toBack()
4061
NetToolkit.BeginInvoke(control.SendToBack);
4064
public void toFront()
4066
NetToolkit.BeginInvoke(control.Activate);
4069
public bool requestWindowFocus()
4071
return NetToolkit.Invoke<bool>(control.Focus);
4074
public void setAlwaysOnTop(bool alwaysOnTop)
4076
// The .NET property TopMost does not work with a not focusable Window
4077
// that we need to set the window flags directly. To reduce double code
4078
// we call updateFocusableWindowState().
4079
updateFocusableWindowState();
4082
public bool isModalBlocked()
4084
return modalBlocker != null;
4087
public void setModalBlocked(java.awt.Dialog dialog, bool blocked)
4089
lock (target.getTreeLock()) // State lock should always be after awtLock
4091
// use NetWindowPeer instead of NetDialogPeer because of FileDialogs and PrintDialogs
4092
NetWindowPeer blockerPeer = (NetWindowPeer)dialog.getPeer();
4095
modalBlocker = blockerPeer;
4096
modalSavedEnabled = control.Enabled;
4101
modalBlocker = null;
4102
if(modalSavedEnabled){
4113
public void updateFocusableWindowState()
4115
((UndecoratedForm)control).SetWindowState(((java.awt.Window)target).isFocusableWindow(), ((java.awt.Window)target).isAlwaysOnTop());
4118
public void updateIconImages()
4120
java.util.List imageList = ((java.awt.Window)target).getIconImages();
4122
if (imageList == null || imageList.size() == 0)
4128
IconFactory factory = new IconFactory();
4129
icon = factory.CreateIcon(imageList, SystemInformation.IconSize);
4131
NetToolkit.BeginInvoke(delegate
4133
((Form)control).Icon = icon;
4137
public void updateMinimumSize()
4139
java.awt.Dimension dim = target.getMinimumSize();
4140
NetToolkit.BeginInvoke(delegate
4142
control.MinimumSize = new Size(dim.width, dim.height);
4147
* Sets the level of opacity for the window.
4149
* @see Window#setOpacity(float)
4151
public void setOpacity(float opacity)
4153
throw new ikvm.@internal.NotYetImplementedError();
4157
* Enables the per-pixel alpha support for the window.
4159
* @see Window#setBackground(Color)
4161
public void setOpaque(bool isOpaque)
4163
throw new ikvm.@internal.NotYetImplementedError();
4168
* Updates the native part of non-opaque window.
4170
* @see Window#setBackground(Color)
4172
public void updateWindow()
4174
throw new ikvm.@internal.NotYetImplementedError();
4179
* Instructs the peer to update the position of the security warning.
4181
public void repositionSecurityWarning()
4183
throw new ikvm.@internal.NotYetImplementedError();
4188
protected override Form CreateControl()
4190
return new UndecoratedForm();
4193
protected override void OnMouseDown(object sender, MouseEventArgs ev)
4195
if (grabbedWindow != null && !grabbedWindow.IsOneOfOwnersOf(this))
4197
grabbedWindow.Ungrab(true);
4199
base.OnMouseDown(sender, ev);
4202
internal void Grab()
4204
//copy from file awt_Windows.cpp
4205
if (grabbedWindow != null)
4207
grabbedWindow.Ungrab(true);
4209
grabbedWindow = this;
4210
if (Form.ActiveForm == null)
4214
else if (control != Form.ActiveForm)
4220
internal void Ungrab(bool doPost)
4222
//copy from file awt_Windows.cpp
4223
if (grabbedWindow == this)
4227
SendEvent(new sun.awt.UngrabEvent(this.target));
4229
grabbedWindow = null;
4233
private bool IsOneOfOwnersOf(NetWindowPeer window)
4235
while (window != null)
4241
java.awt.Container parent = window.target.getParent();
4242
window = parent == null ? null : (NetWindowPeer)parent.getPeer();
4248
sealed class NetFramePeer : NetWindowPeer, java.awt.peer.FramePeer
4250
public NetFramePeer(java.awt.Frame frame, bool isFocusableWindow, bool isAlwaysOnTop)
4251
: base(frame, isFocusableWindow, isAlwaysOnTop)
4255
protected override void initialize()
4258
java.awt.Frame target = (java.awt.Frame)this.target;
4260
if (target.getTitle() != null)
4262
setTitle(target.getTitle());
4264
setResizable(target.isResizable());
4265
setState(target.getExtendedState());
4268
public void setMenuBar(java.awt.MenuBar mb)
4272
NetToolkit.Invoke(delegate
4274
control.Menu = null;
4281
NetToolkit.Invoke(delegate
4283
control.Menu = ((NetMenuBarPeer)mb.getPeer()).menu;
4289
public void setResizable(bool resizable)
4291
if (((java.awt.Frame)target).isUndecorated())
4293
setFormBorderStyle(FormBorderStyle.None);
4299
setFormBorderStyle(FormBorderStyle.Sizable);
4303
setFormBorderStyle(FormBorderStyle.FixedSingle);
4308
public void setTitle(string title)
4310
NetToolkit.BeginInvoke(delegate { control.Text = title; });
4313
public int getState()
4315
Form f = (Form)control;
4316
FormWindowState state = f.WindowState;
4319
case FormWindowState.Normal:
4320
return java.awt.Frame.NORMAL;
4321
case FormWindowState.Maximized:
4322
return java.awt.Frame.MAXIMIZED_BOTH;
4323
case FormWindowState.Minimized:
4324
return java.awt.Frame.ICONIFIED;
4326
throw new InvalidEnumArgumentException();
4330
public void setState(int state)
4332
NetToolkit.BeginInvoke(delegate
4334
MyForm form = (MyForm) control;
4337
case java.awt.Frame.NORMAL:
4338
form.WindowState = FormWindowState.Normal;
4340
case java.awt.Frame.MAXIMIZED_BOTH:
4341
form.WindowState = FormWindowState.Maximized;
4343
case java.awt.Frame.ICONIFIED:
4344
form.WindowState = FormWindowState.Minimized;
4350
public void setMaximizedBounds(java.awt.Rectangle rect)
4352
((MyForm)control).setMaximizedBounds(rect);
4355
public void setBoundsPrivate(int x, int y, int width, int height)
4357
NetToolkit.Invoke(delegate { control.Bounds = new Rectangle(x, y, width, height); });
4360
public java.awt.Rectangle getBoundsPrivate()
4362
throw new NotImplementedException();
4365
protected override Form CreateControl()
4367
return new MyForm(_insets);
4371
sealed class NetDialogPeer : NetWindowPeer, java.awt.peer.DialogPeer
4373
public NetDialogPeer(java.awt.Dialog target, bool isFocusableWindow, bool isAlwaysOnTop)
4374
: base(target, isFocusableWindow, isAlwaysOnTop)
4376
control.MaximizeBox = false;
4377
control.MinimizeBox = false;
4378
control.ShowInTaskbar = false;
4379
setTitle(target.getTitle());
4380
setResizable(target.isResizable());
4383
public void setTitle(string title)
4385
NetToolkit.Invoke(delegate { control.Text = title; });
4388
public void setResizable(bool resizable)
4390
if (((java.awt.Dialog)target).isUndecorated())
4392
setFormBorderStyle(FormBorderStyle.None);
4398
setFormBorderStyle(FormBorderStyle.Sizable);
4402
setFormBorderStyle(FormBorderStyle.FixedSingle);
4407
public void blockWindows(List toBlock)
4409
// code copies from sun.awt.windows.WDialogPeer.java
4410
for (Iterator it = toBlock.iterator(); it.hasNext();) {
4411
java.awt.Window w = (java.awt.Window)it.next();
4412
java.awt.peer.WindowPeer wp = (java.awt.peer.WindowPeer)AWTAccessor.getComponentAccessor().getPeer(w);
4414
wp.setModalBlocked((java.awt.Dialog)target, true);
4419
protected override Form CreateControl()
4421
return new MyForm(_insets);
4425
sealed class NetKeyboardFocusManagerPeer : java.awt.peer.KeyboardFocusManagerPeer
4427
//private readonly java.awt.KeyboardFocusManager manager;
4428
private static java.lang.reflect.Method m_removeLastFocusRequest;
4430
public NetKeyboardFocusManagerPeer(java.awt.KeyboardFocusManager manager)
4432
//this.manager = manager;
4435
public void clearGlobalFocusOwner(java.awt.Window activeWindow)
4439
public java.awt.Component getCurrentFocusOwner()
4441
return getNativeFocusOwner();
4444
public void setCurrentFocusOwner(java.awt.Component component)
4448
public java.awt.Window getCurrentFocusedWindow()
4450
return getNativeFocusedWindow();
4453
private static java.awt.Component getNativeFocusOwner()
4455
return NetToolkit.Invoke<java.awt.Component>(delegate
4457
UndecoratedForm form = Form.ActiveForm as UndecoratedForm;
4460
Control control = form.ActiveControl;
4461
while (control is ContainerControl)
4463
control = ((ContainerControl)control).ActiveControl;
4465
NetComponentPeer peer;
4466
if (control == null)
4468
peer = NetComponentPeer.FromControl(form);
4472
while ((peer = NetComponentPeer.FromControl(form)) == null)
4474
control = control.Parent;
4483
private static java.awt.Window getNativeFocusedWindow()
4485
return NetToolkit.Invoke<java.awt.Window>(delegate
4487
Form form = Form.ActiveForm;
4490
NetComponentPeer peer = NetComponentPeer.FromControl(form);
4493
return (java.awt.Window)peer.Target;
4500
public static void removeLastFocusRequest(java.awt.Component heavyweight)
4504
if (m_removeLastFocusRequest == null)
4506
m_removeLastFocusRequest = SunToolkit.getMethod(typeof(java.awt.KeyboardFocusManager), "removeLastFocusRequest",
4507
new java.lang.Class[] { typeof(java.awt.Component) });
4509
m_removeLastFocusRequest.invoke(null, new Object[] { heavyweight });
4511
catch (java.lang.reflect.InvocationTargetException ite)
4513
ite.printStackTrace();
4515
catch (java.lang.IllegalAccessException ex)
4517
ex.printStackTrace();
4522
sealed class NetListPeer : NetComponentPeer<java.awt.List, ListBox>, java.awt.peer.ListPeer
4524
internal NetListPeer(java.awt.List target)
4527
control.IntegralHeight = false;
4528
setMultipleMode(target.isMultipleMode());
4529
for (int i = 0; i < target.getItemCount(); i++)
4531
add(target.getItem(i), i);
4532
if (target.isSelected(i))
4537
makeVisible(target.getVisibleIndex());
4540
public void add(string item, int index)
4542
NetToolkit.Invoke(delegate { control.Items.Insert(index, item); });
4545
public void addItem(string item, int index)
4552
NetToolkit.Invoke(delegate { control.Items.Clear(); });
4555
public void delItems(int start_index, int end_index)
4557
NetToolkit.Invoke(delegate
4559
for (int i = start_index; i < end_index; i++)
4561
control.Items.RemoveAt(start_index);
4566
public void deselect(int index)
4568
NetToolkit.Invoke(delegate { control.SelectedIndices.Remove(index); });
4571
public int[] getSelectedIndexes()
4573
return NetToolkit.Invoke<int[]>(delegate
4575
ListBox.SelectedIndexCollection sic = control.SelectedIndices;
4576
int[] indexes = new int[sic.Count];
4577
sic.CopyTo(indexes, 0);
4582
public void makeVisible(int index)
4584
NetToolkit.Invoke(delegate { control.TopIndex = index; });
4587
public java.awt.Dimension minimumSize(int s)
4589
return getMinimumSize(s);
4592
public java.awt.Dimension preferredSize(int s)
4594
return getPreferredSize(s);
4597
public void removeAll()
4602
public void select(int index)
4604
NetToolkit.Invoke(delegate { control.SelectedIndices.Add(index); });
4607
public void setMultipleMode(bool multi)
4609
NetToolkit.Invoke(delegate { control.SelectionMode = multi ? SelectionMode.MultiSimple : SelectionMode.One; });
4612
public void setMultipleSelections(bool multi)
4614
setMultipleMode(multi);
4617
public java.awt.Dimension getPreferredSize(int s)
4619
return getMinimumSize(s);
4622
public java.awt.Dimension getMinimumSize(int s)
4624
return new java.awt.Dimension(100, 100);
4627
protected override ListBox CreateControl()
4629
return new ListBox();
4633
sealed class NetDesktopPeer : java.awt.peer.DesktopPeer
4635
private static void ShellExecute(string file, string verb)
4639
ProcessStartInfo psi = new ProcessStartInfo(file);
4640
psi.UseShellExecute = true;
4642
Process p = Process.Start(psi);
4648
catch (System.ComponentModel.Win32Exception x)
4650
throw new java.io.IOException(x.Message);
4654
public void browse(URI uri)
4656
ShellExecute(uri.toString(), "open");
4659
public void edit(java.io.File f)
4661
ShellExecute(f.toString(), "edit");
4664
public bool isSupported(java.awt.Desktop.Action da)
4666
return da == java.awt.Desktop.Action.BROWSE
4667
|| da == java.awt.Desktop.Action.EDIT
4668
|| da == java.awt.Desktop.Action.MAIL
4669
|| da == java.awt.Desktop.Action.OPEN
4670
|| da == java.awt.Desktop.Action.PRINT;
4673
public void mail(URI uri)
4675
if (uri.getScheme().ToLower(System.Globalization.CultureInfo.InvariantCulture) != "mailto")
4677
throw new java.lang.IllegalArgumentException("URI scheme is not \"mailto\"");
4679
ShellExecute(uri.toString(), "open");
4684
ShellExecute("mailto:", "open");
4687
public void open(java.io.File f)
4689
ShellExecute(f.toString(), "open");
4692
public void print(java.io.File f)
4694
ShellExecute(f.toString(), "print");
4698
//also WFileDialogPeer extends from WWindowPeer
4699
class NetFileDialogPeer : NetWindowPeer, java.awt.peer.FileDialogPeer
4701
internal NetFileDialogPeer(java.awt.FileDialog dialog, bool isFocusableWindow, bool isAlwaysOnTop)
4702
: base(dialog, isFocusableWindow, isAlwaysOnTop)
4706
public void setDirectory(string str)
4710
public void setFile(string str)
4714
public void setFilenameFilter(java.io.FilenameFilter ff)
4718
public void setResizable(bool b)
4722
public void setTitle(string str)
4726
public override void show()
4728
java.awt.FileDialog dialog = (java.awt.FileDialog)target;
4729
if (dialog.getMode() != java.awt.FileDialog.LOAD)
4731
throw new NotImplementedException();
4733
Thread t = new Thread((ThreadStart)delegate
4735
using (OpenFileDialog dlg = new OpenFileDialog())
4737
if (dlg.ShowDialog() == DialogResult.OK)
4739
dialog.setFile(Path.GetFileName(dlg.FileName));
4740
dialog.setDirectory(Path.GetDirectoryName(dlg.FileName) + java.io.File.separator);
4745
dialog.setFile(null);
4750
t.SetApartmentState(ApartmentState.STA);
4754
public void blockWindows(List toBlock)
4756
// code copies from sun.awt.windows.WFileDialogPeer.java
4757
for (Iterator it = toBlock.iterator(); it.hasNext(); ) {
4758
java.awt.Window w = (java.awt.Window)it.next();
4759
java.awt.peer.WindowPeer wp = (java.awt.peer.WindowPeer)AWTAccessor.getComponentAccessor().getPeer(w);
4761
wp.setModalBlocked((java.awt.Dialog)target, true);
4767
class NetSystemTrayPeer : java.awt.peer.SystemTrayPeer
4769
//private java.awt.SystemTray target;
4771
internal NetSystemTrayPeer(java.awt.SystemTray target)
4773
//this.target = target;
4776
public java.awt.Dimension getTrayIconSize()
4778
return new java.awt.Dimension(NetTrayIconPeer.TRAY_ICON_WIDTH, NetTrayIconPeer.TRAY_ICON_HEIGHT);
4781
public bool isSupported()
4783
return ((NetToolkit) java.awt.Toolkit.getDefaultToolkit()).isTraySupported();
4787
sealed class NetPopupMenuPeer : java.awt.peer.PopupMenuPeer
4789
private readonly java.awt.PopupMenu target;
4790
private readonly ContextMenu menu = new ContextMenu();
4792
internal NetPopupMenuPeer(java.awt.PopupMenu target)
4794
this.target = target;
4795
for (int i = 0; i < target.getItemCount(); i++)
4797
addItem(target.getItem(i));
4801
public void show(java.awt.Event e)
4803
show((java.awt.Component)e.target, new java.awt.Point(e.x, e.y));
4806
public void show(java.awt.Component origin, java.awt.Point p)
4808
NetComponentPeer peer = (NetComponentPeer)origin.getPeer();
4809
Point pt = new Point(p.x, p.y);
4810
pt.Offset(- peer.getInsetsLeft(), - peer.getInsetsTop());
4811
NetToolkit.Invoke(delegate { menu.Show(peer.Control, pt); });
4814
public void dispose()
4816
NetToolkit.Invoke(delegate { menu.Dispose(); });
4819
public void setFont(java.awt.Font f)
4821
throw new NotImplementedException();
4824
public void disable()
4829
public void enable()
4834
public void setEnabled(bool b)
4836
NetToolkit.Invoke(delegate
4838
for (int i = 0; i < target.getItemCount(); i++)
4840
menu.MenuItems[i].Enabled = b && target.getItem(i).isEnabled();
4845
public void setLabel(string str)
4849
public void addItem(java.awt.MenuItem item)
4851
if (item.getPeer() == null)
4855
if (item.getPeer() is NetMenuItemPeer)
4857
NetToolkit.Invoke(delegate { menu.MenuItems.Add(((NetMenuItemPeer)item.getPeer()).menuitem); });
4861
NetToolkit.Invoke(delegate { menu.MenuItems.Add(((NetMenuPeer)item.getPeer()).menu); });
4865
public void addSeparator()
4867
NetToolkit.Invoke(delegate { menu.MenuItems.Add(new MenuItem("-")); });
4870
public void delItem(int i)
4872
NetToolkit.Invoke(delegate { menu.MenuItems.RemoveAt(i); });
4876
class NetTrayIconPeer : java.awt.peer.TrayIconPeer
4878
internal const int TRAY_ICON_WIDTH = 16;
4879
internal const int TRAY_ICON_HEIGHT = 16;
4880
internal const int TRAY_ICON_MASK_SIZE = TRAY_ICON_WIDTH*TRAY_ICON_HEIGHT/8;
4882
private java.awt.TrayIcon target;
4883
private NotifyIcon notifyIcon;
4884
private java.awt.Frame popupParent = new java.awt.Frame("PopupMessageWindow");
4885
private java.awt.PopupMenu popup;
4886
private bool disposed;
4887
private bool isPopupMenu;
4889
internal NetTrayIconPeer(java.awt.TrayIcon target)
4891
this.target = target;
4892
popupParent.addNotify();
4897
public void displayMessage(string caption, string text, string messageType)
4899
ToolTipIcon icon = ToolTipIcon.None;
4903
icon = ToolTipIcon.Error;
4906
icon = ToolTipIcon.Warning;
4909
icon = ToolTipIcon.Info;
4912
icon = ToolTipIcon.None;
4915
NetToolkit.BeginInvoke(delegate
4917
notifyIcon.ShowBalloonTip(10000, caption, text, icon);
4921
private void create()
4923
NetToolkit.Invoke(delegate
4925
notifyIcon = new NotifyIcon();
4927
notifyIcon.Visible = true;
4931
public void dispose()
4933
bool callDisposed = true;
4937
callDisposed = false;
4944
protected void disposeImpl()
4946
if (popupParent != null)
4948
popupParent.dispose();
4950
NetToolkit.targetDisposedPeer(target, this);
4951
NetToolkit.BeginInvoke(nativeDispose);
4954
private void hookEvents()
4956
notifyIcon.MouseClick += new MouseEventHandler(OnClick);
4957
notifyIcon.MouseDoubleClick += new MouseEventHandler(OnDoubleClick);
4958
notifyIcon.MouseDown += new MouseEventHandler(OnMouseDown);
4959
notifyIcon.MouseUp += new MouseEventHandler(OnMouseUp);
4960
notifyIcon.MouseMove += new MouseEventHandler(OnMouseMove);
4963
private void unhookEvents()
4965
notifyIcon.MouseClick -= new MouseEventHandler(OnClick);
4966
notifyIcon.MouseDoubleClick -= new MouseEventHandler(OnDoubleClick);
4967
notifyIcon.MouseDown -= new MouseEventHandler(OnMouseDown);
4968
notifyIcon.MouseUp -= new MouseEventHandler(OnMouseUp);
4969
notifyIcon.MouseMove -= new MouseEventHandler(OnMouseMove);
4972
internal void postEvent(java.awt.AWTEvent evt)
4974
NetToolkit.postEvent(NetToolkit.targetToAppContext(target), evt);
4977
private void postMouseEvent(MouseEventArgs ev, int id, int clicks)
4979
long when = java.lang.System.currentTimeMillis();
4980
int modifiers = NetComponentPeer.GetMouseEventModifiers(ev);
4981
int button = NetComponentPeer.GetButton(ev);
4982
int clickCount = clicks;
4983
int x = Control.MousePosition.X;
4984
int y = Control.MousePosition.Y;
4985
bool isPopup = isPopupMenu;
4986
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate
4988
java.awt.Component fake = new java.awt.TextField();
4989
java.awt.@event.MouseEvent mouseEvent = new java.awt.@event.MouseEvent(fake, id, when, modifiers, x, y, clickCount, isPopup, button);
4990
mouseEvent.setSource(target);
4991
postEvent(mouseEvent);
4993
isPopupMenu = false;
4996
private void postMouseEvent(EventArgs ev, int id)
4998
long when = java.lang.System.currentTimeMillis();
4999
int modifiers = NetComponentPeer.GetModifiers(Control.ModifierKeys);
5002
int x = Control.MousePosition.X;
5003
int y = Control.MousePosition.Y;
5004
bool isPopup = isPopupMenu;
5005
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate
5007
java.awt.Component fake = new java.awt.TextField();
5008
java.awt.@event.MouseEvent mouseEvent = new java.awt.@event.MouseEvent(fake, id, when, modifiers, x, y, clickCount, isPopup, button);
5009
mouseEvent.setSource(target);
5010
postEvent(mouseEvent);
5012
isPopupMenu = false;
5015
protected virtual void OnMouseDown(object sender, MouseEventArgs ev)
5017
isPopupMenu = false;
5018
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_PRESSED, ev.Clicks);
5021
private void OnClick(object sender, MouseEventArgs ev)
5023
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_CLICKED, ev.Clicks);
5026
private void OnDoubleClick(object sender, MouseEventArgs ev)
5028
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_CLICKED, ev.Clicks);
5029
long when = java.lang.System.currentTimeMillis();
5030
int modifiers = NetComponentPeer.GetModifiers(Control.ModifierKeys);
5031
postEvent(new java.awt.@event.ActionEvent(target, java.awt.@event.ActionEvent.ACTION_PERFORMED, target.getActionCommand(), when, modifiers));
5034
private void OnMouseUp(object sender, MouseEventArgs ev)
5036
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_RELEASED, ev.Clicks);
5039
private void OnMouseEnter(object sender, EventArgs ev)
5041
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_ENTERED);
5044
private void OnMouseLeave(object sender, EventArgs ev)
5046
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_EXITED);
5049
protected virtual void OnMouseMove(object sender, MouseEventArgs ev)
5051
if ((ev.Button & (MouseButtons.Left | MouseButtons.Right)) != 0)
5053
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_DRAGGED, ev.Clicks);
5057
postMouseEvent(ev, java.awt.@event.MouseEvent.MOUSE_MOVED, ev.Clicks);
5061
private void nativeDispose()
5063
if (notifyIcon!=null)
5066
notifyIcon.Dispose();
5070
public void setToolTip(string str)
5072
NetToolkit.BeginInvoke(delegate { notifyIcon.Text = str; });
5075
protected bool isDisposed()
5080
public void showPopupMenu(int x, int y)
5084
java.lang.Runnable runnable = Delegates.toRunnable(delegate
5086
java.awt.PopupMenu newPopup = ((java.awt.TrayIcon)target).getPopupMenu();
5087
if (popup != newPopup) {
5088
if (popup != null) {
5089
popupParent.remove(popup);
5091
if (newPopup != null) {
5092
popupParent.add(newPopup);
5096
if (popup != null) {
5097
((NetPopupMenuPeer)popup.getPeer()).show(popupParent, new java.awt.Point(x, y));
5100
SunToolkit.executeOnEventHandlerThread(target, runnable);
5103
public void updateImage()
5105
java.awt.Image image = ((java.awt.TrayIcon) target).getImage();
5108
updateNativeImage(image);
5112
private void updateNativeImage(java.awt.Image image)
5118
bool autosize = ((java.awt.TrayIcon) target).isImageAutoSize();
5120
using (Bitmap bitmap = getNativeImage(image, autosize))
5122
IntPtr hicon = bitmap.GetHicon();
5123
Icon icon = Icon.FromHandle(hicon);
5124
notifyIcon.Icon = icon;
5129
private Bitmap getNativeImage(java.awt.Image image, bool autosize)
5131
if (image is NoImage)
5132
return new Bitmap(TRAY_ICON_WIDTH, TRAY_ICON_HEIGHT);
5135
Image netImage = J2C.ConvertImage(image);
5137
return new Bitmap(netImage, TRAY_ICON_WIDTH, TRAY_ICON_HEIGHT);
5139
return new Bitmap(netImage);
5145
internal class NetMouseInfoPeer : java.awt.peer.MouseInfoPeer
5147
public int fillPointWithCoords(java.awt.Point p)
5149
p.x = Cursor.Position.X;
5150
p.y = Cursor.Position.Y;
5151
//TODO multi screen device
5152
return 0; //return the number of the screen device
5155
[DllImport("user32.dll")]
5156
private static extern IntPtr WindowFromPoint(POINT Point);
5158
[StructLayout(LayoutKind.Sequential)]
5159
private struct POINT
5164
internal POINT(Point pt)
5171
public bool isWindowUnderMouse(java.awt.Window window)
5173
if (NetToolkit.isWin32())
5175
NetWindowPeer peer = (NetWindowPeer)window.getPeer();
5178
IntPtr hWnd = WindowFromPoint(new POINT(Cursor.Position));
5179
return peer.control.Handle.Equals(hWnd);
5185
throw new NotImplementedException();
5190
public class NetClipboard : java.awt.datatransfer.Clipboard
5192
public static readonly java.awt.datatransfer.FlavorTable flavorMap =
5193
(java.awt.datatransfer.FlavorTable)java.awt.datatransfer.SystemFlavorMap.getDefaultFlavorMap();
5195
public NetClipboard() : base("System") { }
5197
public override void setContents(java.awt.datatransfer.Transferable contents, java.awt.datatransfer.ClipboardOwner owner)
5199
if (contents == null)
5201
throw new java.lang.NullPointerException("contents");
5204
java.awt.datatransfer.ClipboardOwner oldOwner = this.owner;
5205
java.awt.datatransfer.Transferable oldContents = this.contents;
5209
this.contents = new sun.awt.datatransfer.TransferableProxy(contents, true);
5211
setContentsNative(contents);
5215
if (oldOwner != null && oldOwner != owner)
5217
java.awt.EventQueue.invokeLater(Delegates.toRunnable(delegate()
5219
oldOwner.lostOwnership(this, oldContents);
5225
private void setContentsNative(java.awt.datatransfer.Transferable contents)
5227
IDataObject clipObj = NetDataTransferer.getInstanceImpl().getDataObject(contents, flavorMap);
5228
NetToolkit.BeginInvoke(delegate
5230
Clipboard.SetDataObject(clipObj, true);
5234
public override java.awt.datatransfer.Transferable getContents(object requestor)
5236
if (contents != null)
5240
return new NetClipboardTransferable(Clipboard.GetDataObject());
5244
public class NetClipboardTransferable : java.awt.datatransfer.Transferable
5246
private readonly Map flavorToData = new HashMap();
5247
private readonly java.awt.datatransfer.DataFlavor[] flavors;
5248
public NetClipboardTransferable(IDataObject data)
5250
flavorToData = NetDataTransferer.getInstanceImpl().translateFromClipboard(data);
5251
flavors = (java.awt.datatransfer.DataFlavor[])flavorToData.keySet().toArray(new java.awt.datatransfer.DataFlavor[0]);
5254
public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors()
5258
public object getTransferData(java.awt.datatransfer.DataFlavor df)
5260
return flavorToData.get(df);
5263
public bool isDataFlavorSupported(java.awt.datatransfer.DataFlavor df)
5265
return flavorToData.containsKey(df);
5269
public class NetDataTransferer : sun.awt.IkvmDataTransferer
5271
class NetToolkitThreadBlockedHandler : sun.awt.datatransfer.ToolkitThreadBlockedHandler
5273
private bool locked;
5274
private Thread owner;
5276
protected bool isOwned()
5278
return (locked && Thread.CurrentThread == owner);
5285
throw new java.lang.IllegalMonitorStateException();
5288
if (Application.MessageLoop)
5290
Application.DoEvents();
5299
throw new java.lang.IllegalMonitorStateException();
5303
public void @lock() {
5306
if (locked && Thread.CurrentThread == owner)
5308
throw new java.lang.IllegalMonitorStateException();
5315
owner = Thread.CurrentThread;
5323
catch (ThreadInterruptedException)
5328
} while (owner != Thread.CurrentThread);
5332
public void unlock()
5336
if (Thread.CurrentThread != owner)
5338
throw new java.lang.IllegalMonitorStateException();
5342
Monitor.Pulse(this);
5348
private static readonly NetDataTransferer instance = new NetDataTransferer();
5349
private static readonly NetToolkitThreadBlockedHandler handler = new NetToolkitThreadBlockedHandler();
5351
public static NetDataTransferer getInstanceImpl()
5356
internal long[] getClipboardFormatCodes(string[] formats)
5358
long[] longData = new long[formats.Length];
5359
for(int i=0; i<formats.Length; i++)
5361
DataFormats.Format dataFormat = DataFormats.GetFormat(formats[i]);
5362
longData[i] = dataFormat==null?0:dataFormat.Id;
5367
internal string getNativeClipboardFormatName(long format)
5369
DataFormats.Format dataFormat = DataFormats.GetFormat((int)format);
5370
if (dataFormat == null)
5373
return dataFormat.Name;
5376
internal Map translateFromClipboard(IDataObject data)
5378
java.awt.datatransfer.FlavorTable defaultFlavorMap = (java.awt.datatransfer.FlavorTable)java.awt.datatransfer.SystemFlavorMap.getDefaultFlavorMap();
5379
Map/*<DataFlavor,object>*/ map = new HashMap();
5384
string[] formats = data.GetFormats();
5385
if (formats != null && formats.Length > 0)
5387
long[] longFormats = getClipboardFormatCodes(formats);
5388
Map /*<DataFlavor,long>*/ flavorMap = getFlavorsForFormats(longFormats, defaultFlavorMap);
5389
java.awt.datatransfer.DataFlavor[] flavors =
5390
(java.awt.datatransfer.DataFlavor[])
5391
(flavorMap.keySet().toArray(new java.awt.datatransfer.DataFlavor[0]));
5392
for(int i=0; i<flavors.Length; i++)
5394
java.awt.datatransfer.DataFlavor df = flavors[i];
5395
long format = ((java.lang.Long) flavorMap.get(df)).longValue();
5396
string stringFormat = getNativeClipboardFormatName(format);
5397
if (stringFormat==null) continue; // clipboard format is not registered in Windows system
5398
object formatData = data.GetData(stringFormat);
5399
if (formatData == null) continue; // no data for that format
5400
object translatedData = null;
5401
if (df.isFlavorJavaFileListType())
5403
// translate string[] into java.util.List<java.io.File>
5404
string[] nativeFileList = (string[])formatData;
5405
List fileList = new ArrayList(nativeFileList.Length);
5406
for (int j = 0; j < nativeFileList.Length; j++)
5408
java.io.File file = new java.io.File(nativeFileList[i]);
5411
translatedData = fileList;
5413
else if (java.awt.datatransfer.DataFlavor.imageFlavor.equals(df) && formatData is Bitmap)
5415
// translate System.Drawing.Bitmap into java.awt.Image
5416
translatedData = new java.awt.image.BufferedImage((Bitmap) formatData);
5418
else if (formatData is string)
5420
if (df.isFlavorTextType())
5421
translatedData = formatData;
5422
else if (((java.lang.Class)typeof(java.io.Reader)).equals(df.getRepresentationClass()))
5423
translatedData = new java.io.StringReader((string) formatData);
5424
else if (((java.lang.Class)typeof(java.io.InputStream)).equals(df.getRepresentationClass()))
5425
translatedData = new java.io.StringBufferInputStream((string)formatData);
5427
throw new java.awt.datatransfer.UnsupportedFlavorException(df);
5429
if (translatedData!=null)
5430
map.put(df, translatedData);
5436
internal IDataObject getDataObject(java.awt.datatransfer.Transferable transferable, java.awt.datatransfer.FlavorTable flavorMap)
5438
DataObject obj = new DataObject();
5439
SortedMap/*<java.lang.Long,java.awt.datatransfer.DataFlavor>*/ formatMap = getFormatsForTransferable(transferable, flavorMap);
5440
for (Iterator iterator = formatMap.entrySet().iterator(); iterator.hasNext();)
5442
Map.Entry entry = (Map.Entry) iterator.next();
5443
java.lang.Long lFormat = (java.lang.Long) entry.getKey();
5444
long format = lFormat == null ? -1 : lFormat.longValue();
5445
java.awt.datatransfer.DataFlavor flavor = (java.awt.datatransfer.DataFlavor) entry.getValue();
5446
object contents = transferable.getTransferData(flavor);
5447
if (contents==null) continue;
5450
if (java.awt.datatransfer.DataFlavor.javaFileListFlavor.equals(flavor))
5452
List list = (List)contents;
5453
System.Collections.Specialized.StringCollection files =
5454
new System.Collections.Specialized.StringCollection();
5455
for (int i = 0; i < list.size(); i++)
5457
files.Add(((java.io.File) list.get(i)).getAbsolutePath());
5459
obj.SetFileDropList(files);
5461
else if (flavor.isFlavorTextType())
5463
if (contents is string)
5464
obj.SetText((string) transferable.getTransferData(flavor));
5466
else if (java.awt.datatransfer.DataFlavor.imageFlavor.equals(flavor))
5468
java.awt.Image image = contents as java.awt.Image;
5471
Image netImage = J2C.ConvertImage(image);
5472
if (netImage != null)
5474
obj.SetImage(netImage);
5478
else if (flavor.isRepresentationClassCharBuffer())
5480
if (!(isFlavorCharsetTextType(flavor) && isTextFormat(format)))
5482
throw new IOException("cannot transfer non-text data as CharBuffer");
5484
java.nio.CharBuffer buffer = (java.nio.CharBuffer)contents;
5485
int size = buffer.remaining();
5486
char[] chars = new char[size];
5487
buffer.get(chars, 0, size);
5488
obj.SetText(new string(chars));
5492
// don't know what to do with it...
5493
obj.SetData(transferable.getTransferData(flavor));
5496
catch (java.io.IOException e)
5498
if (!(flavor.isMimeTypeEqual(java.awt.datatransfer.DataFlavor.javaJVMLocalObjectMimeType) &&
5499
e is java.io.NotSerializableException))
5501
e.printStackTrace();
5508
protected override string getClipboardFormatName(long format)
5510
return getNativeClipboardFormatName(format);
5513
protected override byte[] imageToStandardBytes(java.awt.Image image, string mimeType)
5515
if (image is NoImage) return null;
5516
Image netImage = J2C.ConvertImage(image);
5522
format = ImageFormat.Jpeg;
5525
format = ImageFormat.Png;
5528
format = ImageFormat.Gif;
5530
case "image/x-win-metafile":
5533
format = ImageFormat.Wmf;
5538
using(MemoryStream stream = new MemoryStream())
5540
netImage.Save(stream, format);
5541
return stream.GetBuffer();
5545
public override sun.awt.datatransfer.ToolkitThreadBlockedHandler getToolkitThreadBlockedHandler()
5550
protected override java.io.ByteArrayOutputStream convertFileListToBytes(java.util.ArrayList fileList)
5552
throw new ikvm.@internal.NotYetImplementedError();