#include "wx/menuitem.h"
#include "wx/log.h"
-#include "wx/listimpl.cpp"
-
#if wxUSE_DRAG_AND_DROP
#include "wx/dnd.h"
#endif
+#ifdef __VMS__
+#pragma message disable nosimpint
+#endif
#include <Xm/Xm.h>
#include <Xm/DrawingA.h>
#include <Xm/Frame.h>
#include <Xm/Label.h>
#include <Xm/RowColumn.h> // for XmMenuPosition
+#ifdef __VMS__
+#pragma message enable nosimpint
+#endif
#include "wx/motif/private.h"
static void wxCanvasMotionEvent(Widget, XButtonEvent * event);
static void wxCanvasEnterLeave(Widget drawingArea, XtPointer clientData, XCrossingEvent * event);
static void wxScrollBarCallback(Widget widget, XtPointer clientData,
- XmScaleCallbackStruct *cbs);
+ XmScrollBarCallbackStruct *cbs);
static void wxPanelItemEventHandler(Widget wid,
XtPointer client_data,
XEvent* event,
// event tables
// ----------------------------------------------------------------------------
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
EVT_IDLE(wxWindow::OnIdle)
END_EVENT_TABLE()
-#endif // USE_SHARED_LIBRARY
// ============================================================================
// implementation
// ============================================================================
-// ----------------------------------------------------------------------------
-// list types
-// ----------------------------------------------------------------------------
-
-WX_DEFINE_LIST(wxRectList);
-
// ----------------------------------------------------------------------------
// helper functions
// ----------------------------------------------------------------------------
XtAppAddActions ((XtAppContext) wxTheApp->GetAppContext(), actions, 1);
Widget parentWidget = (Widget) parent->GetClientWidget();
- if (style & wxBORDER)
+
+ if (style & wxSIMPLE_BORDER)
{
m_borderWidget = (WXWidget)XtVaCreateManagedWidget
(
"canvasBorder",
xmFrameWidgetClass, parentWidget,
XmNshadowType, XmSHADOW_IN,
+ XmNshadowThickness, 1,
+ NULL
+ );
+ } else if (style & wxSUNKEN_BORDER)
+ {
+ m_borderWidget = (WXWidget)XtVaCreateManagedWidget
+ (
+ "canvasBorder",
+ xmFrameWidgetClass, parentWidget,
+ XmNshadowType, XmSHADOW_IN,
+ NULL
+ );
+ } else if (style & wxRAISED_BORDER)
+ {
+ m_borderWidget = (WXWidget)XtVaCreateManagedWidget
+ (
+ "canvasBorder",
+ xmFrameWidgetClass, parentWidget,
+ XmNshadowType, XmSHADOW_OUT,
NULL
);
}
if (w)
{
XtDestroyWidget(w);
+ m_drawingArea = (WXWidget) 0;
}
- m_mainWidget = (WXWidget) 0;
-
// Only if we're _really_ a canvas (not a dialog box/panel)
if (m_scrolledWindow)
{
wxDeleteWindowFromTable((Widget) m_scrolledWindow);
}
- UnmanageAndDestroy(m_hScrollBar);
- UnmanageAndDestroy(m_vScrollBar);
+ if (m_hScrollBar)
+ {
+ wxDeleteWindowFromTable((Widget) m_hScrollBar);
+ XtUnmanageChild((Widget) m_hScrollBar);
+ }
+ if (m_vScrollBar)
+ {
+ wxDeleteWindowFromTable((Widget) m_vScrollBar);
+ XtUnmanageChild((Widget) m_vScrollBar);
+ }
+
+ if (m_hScrollBar)
+ XtDestroyWidget((Widget) m_hScrollBar);
+ if (m_vScrollBar)
+ XtDestroyWidget((Widget) m_vScrollBar);
+
UnmanageAndDestroy(m_scrolledWindow);
if (m_borderWidget)
// or dialog is destroyed, but before that you may get some memory
// leaks and potential layout problems if you delete and then add
// child windows.
+
+ // GRG, Feb/2000: commented this out when adding support for
+ // wxSCROLL[WIN]_THUMBRELEASE events. Also it was reported
+ // that this call crashed wxMotif under OS/2, so it seems
+ // that leaving it out is the right thing to do.
+ // SN, Feb/2000: newgrid/griddemo shows why it is needed :-(
XtDestroyWidget((Widget) GetMainWidget());
SetMainWidget((WXWidget) NULL);
}
xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
XmNorientation, XmHORIZONTAL,
NULL);
- // XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
+ XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
NULL);
m_hScroll = TRUE;
+
+ wxAddWindowToTable( hScrollBar, this );
}
if (orientation == wxVERTICAL)
xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
XmNorientation, XmVERTICAL,
NULL);
- // XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
+ XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
NULL);
m_vScroll = TRUE;
+
+ wxAddWindowToTable( vScrollBar, this );
}
XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
{
if (m_hScrollBar)
{
+ wxDeleteWindowFromTable((Widget)m_hScrollBar);
XtDestroyWidget((Widget) m_hScrollBar);
}
m_hScrollBar = (WXWidget) 0;
{
if (m_vScrollBar)
{
+ wxDeleteWindowFromTable((Widget)m_vScrollBar);
XtDestroyWidget((Widget) m_vScrollBar);
}
m_vScrollBar = (WXWidget) 0;
- m_vScroll = TRUE;
+ m_vScroll = FALSE;
XtVaSetValues((Widget) m_scrolledWindow,
XmNverticalScrollBar, (Widget) 0,
}
wxASSERT_MSG( m_cursor.Ok(),
- _T("cursor must be valid after call to the base version"));
+ wxT("cursor must be valid after call to the base version"));
WXDisplay *dpy = GetXDisplay();
WXCursor x_cursor = m_cursor.GetXCursor(dpy);
GetClientSize(& w, & h);
}
+ wxNode *cnode = m_children.First();
+ while (cnode)
+ {
+ wxWindow *child = (wxWindow*) cnode->Data();
+ int sx = 0;
+ int sy = 0;
+ child->GetSize( &sx, &sy );
+ wxPoint pos( child->GetPosition() );
+ child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE );
+ cnode = cnode->Next();
+ }
+
int x1 = (dx >= 0) ? x : x - dx;
int y1 = (dy >= 0) ? y : y - dy;
int w1 = w - abs(dx);
GetSize(& oldW, & oldH);
GetPosition(& oldX, & oldY);
- bool useOldPos = FALSE;
- bool useOldSize = FALSE;
+ if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
+ {
+ if ( x == -1 )
+ x = oldX;
+ if ( y == -1 )
+ y = oldY;
+ }
- if ((x == -1) && (x == -1) && ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0))
- useOldPos = TRUE;
- else if (x == oldX && y == oldY)
- useOldPos = TRUE;
+ if ( width == -1 )
+ width = oldW;
+ if ( height == -1 )
+ height = oldH;
- if ((width == -1) && (height == -1))
- useOldSize = TRUE;
- else if (width == oldW && height == oldH)
- useOldSize = TRUE;
+ bool nothingChanged = (x == oldX) && (y == oldY) &&
+ (width == oldW) && (height == oldH);
if (!wxNoOptimize::CanOptimize())
{
- useOldSize = FALSE; useOldPos = FALSE;
+ nothingChanged = FALSE;
}
- if (useOldPos && useOldSize)
- return;
-
- if (m_drawingArea)
+ if ( !nothingChanged )
{
- CanvasSetSize(x, y, width, height, sizeFlags);
- return;
- }
- Widget widget = (Widget) GetTopWidget();
- if (!widget)
- return;
+ if (m_drawingArea)
+ {
+ CanvasSetSize(x, y, width, height, sizeFlags);
+ return;
+ }
- bool managed = XtIsManaged( widget );
- if (managed)
- XtUnmanageChild(widget);
+ Widget widget = (Widget) GetTopWidget();
+ if (!widget)
+ return;
- int xx = x; int yy = y;
- AdjustForParentClientOrigin(xx, yy, sizeFlags);
+ bool managed = XtIsManaged( widget );
+ if (managed)
+ XtUnmanageChild(widget);
- if (!useOldPos)
- {
- if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
- XtVaSetValues(widget, XmNx, xx, NULL);
- if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
- XtVaSetValues(widget, XmNy, yy, NULL);
- }
- if (!useOldSize)
- {
- if (width > -1)
- XtVaSetValues(widget, XmNwidth, width, NULL);
- if (height > -1)
- XtVaSetValues(widget, XmNheight, height, NULL);
- }
+ int xx = x;
+ int yy = y;
+ AdjustForParentClientOrigin(xx, yy, sizeFlags);
- if (managed)
- XtManageChild(widget);
+ DoMoveWindow(xx, yy, width, height);
- // How about this bit. Maybe we don't need to generate size events
- // all the time -- they'll be generated when the window is sized anyway.
+ if (managed)
+ XtManageChild(widget);
+
+ // How about this bit. Maybe we don't need to generate size events
+ // all the time -- they'll be generated when the window is sized anyway.
#if 0
- wxSizeEvent sizeEvent(wxSize(width, height), GetId());
- sizeEvent.SetEventObject(this);
+ wxSizeEvent sizeEvent(wxSize(width, height), GetId());
+ sizeEvent.SetEventObject(this);
- GetEventHandler()->ProcessEvent(sizeEvent);
+ GetEventHandler()->ProcessEvent(sizeEvent);
#endif // 0
+ }
}
void wxWindow::DoSetClientSize(int width, int height)
XtVaSetValues(widget, XmNheightInc, incH, NULL);
}
+void wxWindow::DoMoveWindow(int x, int y, int width, int height)
+{
+ XtVaSetValues((Widget)GetTopWidget(),
+ XmNx, x,
+ XmNy, y,
+ XmNwidth, width,
+ XmNheight, height,
+ NULL);
+}
+
// ---------------------------------------------------------------------------
// text metrics
// ---------------------------------------------------------------------------
}
}
-void wxWindow::OnIdle(wxIdleEvent& event)
+void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
{
// This calls the UI-update mechanism (querying windows for
// menu/toolbar/control state information)
// Try for a menu command
if (frame->GetMenuBar())
{
- wxMenuItem* item = frame->GetMenuBar()->FindItemForId(entry->GetCommand());
+ wxMenuItem* item = frame->GetMenuBar()->FindItem(entry->GetCommand());
if (item)
{
wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, entry->GetCommand());
wxWidgetHashTable->Put((long) w, win);
- wxLogDebug("Widget 0x%08x <-> window %p (%s)",
+ wxLogTrace("widget", "Widget 0x%08x <-> window %p (%s)",
w, win, win->GetClassInfo()->GetClassName());
return TRUE;
// ----------------------------------------------------------------------------
// Add to hash table, add event handler
-bool wxWindow::AttachWidget (wxWindow* parent, WXWidget mainWidget,
+bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget,
WXWidget formWidget, int x, int y, int width, int height)
{
wxAddWindowToTable((Widget) mainWidget, this);
// All widgets should have this as their resize proc.
// OnSize sent to wxWindow via client data.
-void wxWidgetResizeProc(Widget w, XConfigureEvent *event, String args[], int *num_args)
+void wxWidgetResizeProc(Widget w, XConfigureEvent *WXUNUSED(event), String WXUNUSED(args)[], int *WXUNUSED(num_args))
{
wxWindow *win = wxGetWindowFromTable(w);
if (!win)
// Unable to deal with Enter/Leave without a separate EventHandler (Motif 1.1.4)
static void wxCanvasEnterLeave(Widget drawingArea,
- XtPointer clientData,
+ XtPointer WXUNUSED(clientData),
XCrossingEvent * event)
{
XmDrawingAreaCallbackStruct cbs;
}
// Fix to make it work under Motif 1.0 (!)
-static void wxCanvasMotionEvent (Widget drawingArea, XButtonEvent * event)
+static void wxCanvasMotionEvent (Widget WXUNUSED(drawingArea), XButtonEvent * WXUNUSED(event))
{
#if XmVersion <= 1000
XmDrawingAreaCallbackStruct cbs;
}
static void wxCanvasInputEvent(Widget drawingArea,
- XtPointer data,
+ XtPointer WXUNUSED(data),
XmDrawingAreaCallbackStruct * cbs)
{
wxWindow *canvas = wxGetWindowFromTable(drawingArea);
case ButtonRelease:
case MotionNotify:
{
+ // FIXME: most of this mouse event code is more or less
+ // duplicated in wxTranslateMouseEvent
+ //
wxEventType eventType = wxEVT_NULL;
if (local_event.xany.type == EnterNotify)
}
else if (local_event.xany.type == LeaveNotify)
{
- //if (local_event.xcrossing.mode!=NotifyNormal)
+ //if (local_event.xcrossingr.mode!=NotifyNormal)
// return ; // Ignore grab events
eventType = wxEVT_LEAVE_WINDOW;
// canvas->GetEventHandler()->OnKillFocus();
else if (local_event.xany.type == MotionNotify)
{
eventType = wxEVT_MOTION;
- if (local_event.xmotion.is_hint == NotifyHint)
- {
- Window root, child;
- Display *dpy = XtDisplay (drawingArea);
-
- XQueryPointer (dpy, XtWindow (drawingArea),
- &root, &child,
- &local_event.xmotion.x_root,
- &local_event.xmotion.y_root,
- &local_event.xmotion.x,
- &local_event.xmotion.y,
- &local_event.xmotion.state);
- }
- else
- {
- }
}
else if (local_event.xany.type == ButtonPress)
wxevent.m_metaDown = local_event.xbutton.state & Mod1Mask;
wxevent.SetTimestamp(local_event.xbutton.time);
+ if ( eventType == wxEVT_MOTION )
+ {
+ if (local_event.xmotion.is_hint == NotifyHint)
+ {
+ Window root, child;
+ Display *dpy = XtDisplay (drawingArea);
+
+ XQueryPointer (dpy, XtWindow (drawingArea),
+ &root, &child,
+ &local_event.xmotion.x_root,
+ &local_event.xmotion.y_root,
+ &local_event.xmotion.x,
+ &local_event.xmotion.y,
+ &local_event.xmotion.state);
+ }
+ else
+ {
+ }
+ }
+
// Now check if we need to translate this event into a double click
if (TRUE) // canvas->doubleClickAllowed)
{
}
static void wxPanelItemEventHandler(Widget wid,
- XtPointer client_data,
+ XtPointer WXUNUSED(client_data),
XEvent* event,
Boolean *continueToDispatch)
{
static void wxScrollBarCallback(Widget scrollbar,
XtPointer clientData,
- XmScaleCallbackStruct *cbs)
+ XmScrollBarCallbackStruct *cbs)
{
wxWindow *win = wxGetWindowFromTable(scrollbar);
int orientation = (int) clientData;
{
case XmCR_INCREMENT:
{
- eventType = wxEVT_SCROLL_LINEDOWN;
+ eventType = wxEVT_SCROLLWIN_LINEDOWN;
break;
}
case XmCR_DECREMENT:
{
- eventType = wxEVT_SCROLL_LINEUP;
+ eventType = wxEVT_SCROLLWIN_LINEUP;
break;
}
case XmCR_DRAG:
{
- eventType = wxEVT_SCROLL_THUMBTRACK;
+ eventType = wxEVT_SCROLLWIN_THUMBTRACK;
break;
}
case XmCR_VALUE_CHANGED:
{
- // TODO: Should this be intercepted too, or will it cause
- // duplicate events?
- eventType = wxEVT_SCROLL_THUMBTRACK;
+ eventType = wxEVT_SCROLLWIN_THUMBRELEASE;
break;
}
case XmCR_PAGE_INCREMENT:
{
- eventType = wxEVT_SCROLL_PAGEDOWN;
+ eventType = wxEVT_SCROLLWIN_PAGEDOWN;
break;
}
case XmCR_PAGE_DECREMENT:
{
- eventType = wxEVT_SCROLL_PAGEUP;
+ eventType = wxEVT_SCROLLWIN_PAGEUP;
break;
}
case XmCR_TO_TOP:
{
- eventType = wxEVT_SCROLL_TOP;
+ eventType = wxEVT_SCROLLWIN_TOP;
break;
}
case XmCR_TO_BOTTOM:
{
- eventType = wxEVT_SCROLL_BOTTOM;
+ eventType = wxEVT_SCROLLWIN_BOTTOM;
break;
}
default:
}
}
- wxScrollEvent event(eventType, win->GetId());
- event.SetEventObject(win);
- event.SetPosition(cbs->value);
- event.SetOrientation( (orientation == XmHORIZONTAL) ? wxHORIZONTAL : wxVERTICAL );
-
+ wxScrollWinEvent event(eventType,
+ cbs->value,
+ ((orientation == XmHORIZONTAL) ?
+ wxHORIZONTAL : wxVERTICAL));
+ event.SetEventObject( win );
win->GetEventHandler()->ProcessEvent(event);
}
{
switch (xevent->xany.type)
{
- case EnterNotify:
- case LeaveNotify:
- case ButtonPress:
- case ButtonRelease:
- case MotionNotify:
+ case EnterNotify: // never received here - yes ? MB
+ case LeaveNotify: // never received here - yes ? MB
+ case ButtonPress:
+ case ButtonRelease:
+ case MotionNotify:
{
wxEventType eventType = wxEVT_NULL;
+ // FIXME: this is never true I think - MB
+ //
if (xevent->xany.type == LeaveNotify)
{
win->SetButton1(FALSE);
}
else if (xevent->xany.type == ButtonPress)
{
+ wxevent.SetTimestamp(xevent->xbutton.time);
+ int button = 0;
if (xevent->xbutton.button == Button1)
{
eventType = wxEVT_LEFT_DOWN;
win->SetButton1(TRUE);
+ button = 1;
}
else if (xevent->xbutton.button == Button2)
{
eventType = wxEVT_MIDDLE_DOWN;
win->SetButton2(TRUE);
+ button = 2;
}
else if (xevent->xbutton.button == Button3)
{
eventType = wxEVT_RIGHT_DOWN;
win->SetButton3(TRUE);
+ button = 3;
+ }
+
+ // check for a double click
+ //
+ long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay());
+ long ts = wxevent.GetTimestamp();
+
+ int buttonLast = win->GetLastClickedButton();
+ long lastTS = win->GetLastClickTime();
+ if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime )
+ {
+ // I have a dclick
+ win->SetLastClick(0, ts);
+ switch ( eventType )
+ {
+ case wxEVT_LEFT_DOWN:
+ eventType = wxEVT_LEFT_DCLICK;
+ break;
+ case wxEVT_MIDDLE_DOWN:
+ eventType = wxEVT_MIDDLE_DCLICK;
+ break;
+ case wxEVT_RIGHT_DOWN:
+ eventType = wxEVT_RIGHT_DCLICK;
+ break;
+
+ default :
+ break;
+ }
+
+ }
+ else
+ {
+ // not fast enough or different button
+ win->SetLastClick(button, ts);
}
}
else if (xevent->xany.type == ButtonRelease)
wxevent.m_shiftDown = xevent->xbutton.state & ShiftMask;
wxevent.m_controlDown = xevent->xbutton.state & ControlMask;
+ wxevent.m_altDown = xevent->xbutton.state & Mod3Mask;
+ wxevent.m_metaDown = xevent->xbutton.state & Mod1Mask;
+
+ wxevent.SetId(win->GetId());
+ wxevent.SetEventObject(win);
+
return TRUE;
}
}
return FALSE;
}
-bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent)
+bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(widget), XEvent *xevent)
{
switch (xevent->xany.type)
{
// ----------------------------------------------------------------------------
int wxNoOptimize::ms_count = 0;
+
+
+
+