1///////////////////////////////////////////////////////////////////////////// 2// Name: wx/motif/window.h 3// Purpose: wxWindow class 4// Author: Julian Smart 5// Modified by: 6// Created: 17/09/98 7// RCS-ID: $Id: window.h 36079 2005-11-03 20:58:02Z ABX $ 8// Copyright: (c) Julian Smart 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12#ifndef _WX_WINDOW_H_ 13#define _WX_WINDOW_H_ 14 15#include "wx/region.h" 16 17// ---------------------------------------------------------------------------- 18// wxWindow class for Motif - see also wxWindowBase 19// ---------------------------------------------------------------------------- 20 21class WXDLLIMPEXP_CORE wxWindow : public wxWindowBase 22{ 23 friend class WXDLLEXPORT wxDC; 24 friend class WXDLLEXPORT wxWindowDC; 25 26public: 27 wxWindow() { Init(); } 28 29 wxWindow(wxWindow *parent, 30 wxWindowID id, 31 const wxPoint& pos = wxDefaultPosition, 32 const wxSize& size = wxDefaultSize, 33 long style = 0, 34 const wxString& name = wxPanelNameStr) 35 { 36 Init(); 37 Create(parent, id, pos, size, style, name); 38 } 39 40 virtual ~wxWindow(); 41 42 bool Create(wxWindow *parent, 43 wxWindowID id, 44 const wxPoint& pos = wxDefaultPosition, 45 const wxSize& size = wxDefaultSize, 46 long style = 0, 47 const wxString& name = wxPanelNameStr); 48 49 // implement base class pure virtuals 50 virtual void SetLabel(const wxString& label); 51 virtual wxString GetLabel() const; 52 53 virtual void Raise(); 54 virtual void Lower(); 55 56 virtual bool Show( bool show = true ); 57 virtual bool Enable( bool enable = true ); 58 59 virtual void SetFocus(); 60 61 virtual void WarpPointer(int x, int y); 62 63 virtual void Refresh( bool eraseBackground = true, 64 const wxRect *rect = (const wxRect *) NULL ); 65 66 virtual bool SetBackgroundColour( const wxColour &colour ); 67 virtual bool SetForegroundColour( const wxColour &colour ); 68 69 virtual bool SetCursor( const wxCursor &cursor ); 70 virtual bool SetFont( const wxFont &font ); 71 72 virtual int GetCharHeight() const; 73 virtual int GetCharWidth() const; 74 virtual void GetTextExtent(const wxString& string, 75 int *x, int *y, 76 int *descent = (int *) NULL, 77 int *externalLeading = (int *) NULL, 78 const wxFont *theFont = (const wxFont *) NULL) 79 const; 80 81 virtual void SetScrollbar( int orient, int pos, int thumbVisible, 82 int range, bool refresh = true ); 83 virtual void SetScrollPos( int orient, int pos, bool refresh = true ); 84 virtual int GetScrollPos( int orient ) const; 85 virtual int GetScrollThumb( int orient ) const; 86 virtual int GetScrollRange( int orient ) const; 87 virtual void ScrollWindow( int dx, int dy, 88 const wxRect* rect = (wxRect *) NULL ); 89 90#if wxUSE_DRAG_AND_DROP 91 virtual void SetDropTarget( wxDropTarget *dropTarget ); 92#endif // wxUSE_DRAG_AND_DROP 93 94 // Accept files for dragging 95 virtual void DragAcceptFiles(bool accept); 96 97 // Get the unique identifier of a window 98 virtual WXWidget GetHandle() const { return GetMainWidget(); } 99 100 // implementation from now on 101 // -------------------------- 102 103 // accessors 104 // --------- 105 106 // Get main widget for this window, e.g. a text widget 107 virtual WXWidget GetMainWidget() const; 108 // Get the widget that corresponds to the label (for font setting, 109 // label setting etc.) 110 virtual WXWidget GetLabelWidget() const; 111 // Get the client widget for this window (something we can create other 112 // windows on) 113 virtual WXWidget GetClientWidget() const; 114 // Get the top widget for this window, e.g. the scrolled widget parent of a 115 // multi-line text widget. Top means, top in the window hierarchy that 116 // implements this window. 117 virtual WXWidget GetTopWidget() const; 118 119 // Get the underlying X window and display 120 WXWindow GetClientXWindow() const; 121 WXWindow GetXWindow() const; 122 WXDisplay *GetXDisplay() const; 123 124 void SetLastClick(int button, long timestamp) 125 { m_lastButton = button; m_lastTS = timestamp; } 126 127 int GetLastClickedButton() const { return m_lastButton; } 128 long GetLastClickTime() const { return m_lastTS; } 129 130 // Gives window a chance to do something in response to a size message, 131 // e.g. arrange status bar, toolbar etc. 132 virtual bool PreResize(); 133 134 // Generates a paint event 135 virtual void DoPaint(); 136 137 // update rectangle/region manipulation 138 // (for wxWindowDC and Motif callbacks only) 139 // ----------------------------------------- 140 141 // Adds a recangle to the updates list 142 void AddUpdateRect(int x, int y, int w, int h); 143 144 void ClearUpdateRegion() { m_updateRegion.Clear(); } 145 void SetUpdateRegion(const wxRegion& region) { m_updateRegion = region; } 146 147 // Process idle (send update events) 148 void OnInternalIdle(); 149 150protected: 151 // Responds to colour changes: passes event on to children. 152 void OnSysColourChanged(wxSysColourChangedEvent& event); 153 154 // Motif-specific 155 156 void SetMainWidget(WXWidget w) { m_mainWidget = w; } 157 158 // See src/motif/window.cpp, near the top, for an explanation 159 // why this is necessary 160 void CanvasSetSizeIntr(int x, int y, int width, int height, 161 int sizeFlags, bool fromCtor); 162 void DoSetSizeIntr(int x, int y, 163 int width, int height, 164 int sizeFlags, bool fromCtor); 165 166 // for DoMoveWindowIntr flags 167 enum 168 { 169 wxMOVE_X = 1, 170 wxMOVE_Y = 2, 171 wxMOVE_WIDTH = 4, 172 wxMOVE_HEIGHT = 8 173 }; 174 175 void DoMoveWindowIntr(int x, int y, int width, int height, 176 int flags); 177 178 // helper function, to remove duplicate code, used in wxScrollBar 179 WXWidget DoCreateScrollBar(WXWidget parent, wxOrientation orientation, 180 void (*callback)()); 181public: 182 WXPixmap GetBackingPixmap() const { return m_backingPixmap; } 183 void SetBackingPixmap(WXPixmap pixmap) { m_backingPixmap = pixmap; } 184 int GetPixmapWidth() const { return m_pixmapWidth; } 185 int GetPixmapHeight() const { return m_pixmapHeight; } 186 void SetPixmapWidth(int w) { m_pixmapWidth = w; } 187 void SetPixmapHeight(int h) { m_pixmapHeight = h; } 188 189 // Change properties 190 // Change to the current font (often overridden) 191 virtual void ChangeFont(bool keepOriginalSize = true); 192 193 // Change background and foreground colour using current background colour 194 // setting (Motif generates foreground based on background) 195 virtual void ChangeBackgroundColour(); 196 // Change foreground colour using current foreground colour setting 197 virtual void ChangeForegroundColour(); 198 199protected: 200 // Adds the widget to the hash table and adds event handlers. 201 bool AttachWidget(wxWindow* parent, WXWidget mainWidget, 202 WXWidget formWidget, int x, int y, int width, int height); 203 bool DetachWidget(WXWidget widget); 204 205 // How to implement accelerators. If we find a key event, translate to 206 // wxWidgets wxKeyEvent form. Find a widget for the window. Now find a 207 // wxWindow for the widget. If there isn't one, go up the widget hierarchy 208 // trying to find one. Once one is found, call ProcessAccelerator for the 209 // window. If it returns true (processed the event), skip the X event, 210 // otherwise carry on up the wxWidgets window hierarchy calling 211 // ProcessAccelerator. If all return false, process the X event as normal. 212 // Eventually we can implement OnCharHook the same way, but concentrate on 213 // accelerators for now. ProcessAccelerator must look at the current 214 // accelerator table, and try to find what menu id or window (beneath it) 215 // has this ID. Then construct an appropriate command 216 // event and send it. 217public: 218 virtual bool ProcessAccelerator(wxKeyEvent& event); 219 220protected: 221 // unmanage and destroy an X widget f it's !NULL (passing NULL is ok) 222 void UnmanageAndDestroy(WXWidget widget); 223 224 // map or unmap an X widget (passing NULL is ok), 225 // returns true if widget was mapped/unmapped 226 bool MapOrUnmap(WXWidget widget, bool map); 227 228 // scrolling stuff 229 // --------------- 230 231 // create/destroy window scrollbars 232 void CreateScrollbar(wxOrientation orientation); 233 void DestroyScrollbar(wxOrientation orientation); 234 235 // get either hor or vert scrollbar widget 236 WXWidget GetScrollbar(wxOrientation orient) const 237 { return orient == wxHORIZONTAL ? m_hScrollBar : m_vScrollBar; } 238 239 // set the scroll pos 240 void SetInternalScrollPos(wxOrientation orient, int pos) 241 { 242 if ( orient == wxHORIZONTAL ) 243 m_scrollPosX = pos; 244 else 245 m_scrollPosY = pos; 246 } 247 248 // Motif-specific flags 249 // -------------------- 250 251 bool m_needsRefresh:1; // repaint backing store? 252 253 // For double-click detection 254 long m_lastTS; // last timestamp 255 unsigned m_lastButton:2; // last pressed button 256 257protected: 258 WXWidget m_mainWidget; 259 WXWidget m_hScrollBar; 260 WXWidget m_vScrollBar; 261 WXWidget m_borderWidget; 262 WXWidget m_scrolledWindow; 263 WXWidget m_drawingArea; 264 bool m_winCaptured:1; 265 WXPixmap m_backingPixmap; 266 int m_pixmapWidth; 267 int m_pixmapHeight; 268 int m_pixmapOffsetX; 269 int m_pixmapOffsetY; 270 271 // Store the last scroll pos, since in wxWin the pos isn't set 272 // automatically by system 273 int m_scrollPosX; 274 int m_scrollPosY; 275 276 // implement the base class pure virtuals 277 virtual void DoClientToScreen( int *x, int *y ) const; 278 virtual void DoScreenToClient( int *x, int *y ) const; 279 virtual void DoGetPosition( int *x, int *y ) const; 280 virtual void DoGetSize( int *width, int *height ) const; 281 virtual void DoGetClientSize( int *width, int *height ) const; 282 virtual void DoSetSize(int x, int y, 283 int width, int height, 284 int sizeFlags = wxSIZE_AUTO); 285 virtual void DoSetClientSize(int width, int height); 286 virtual void DoMoveWindow(int x, int y, int width, int height); 287 virtual bool DoPopupMenu(wxMenu *menu, int x, int y); 288 virtual void DoCaptureMouse(); 289 virtual void DoReleaseMouse(); 290 291#if wxUSE_TOOLTIPS 292 virtual void DoSetToolTip( wxToolTip *tip ); 293#endif // wxUSE_TOOLTIPS 294 295private: 296 // common part of all ctors 297 void Init(); 298 299 DECLARE_DYNAMIC_CLASS(wxWindow) 300 DECLARE_NO_COPY_CLASS(wxWindow) 301 DECLARE_EVENT_TABLE() 302}; 303 304// ---------------------------------------------------------------------------- 305// A little class to switch off `size optimization' while an instance of the 306// object exists: this may be useful to temporarily disable the optimisation 307// which consists to do nothing when the new size is equal to the old size - 308// although quite useful usually to avoid flicker, sometimes it leads to 309// undesired effects. 310// 311// Usage: create an instance of this class on the stack to disable the size 312// optimisation, it will be reenabled as soon as the object goes out 313// from scope. 314// ---------------------------------------------------------------------------- 315 316class WXDLLEXPORT wxNoOptimize 317{ 318public: 319 wxNoOptimize() { ms_count++; } 320 ~wxNoOptimize() { ms_count--; } 321 322 static bool CanOptimize() { return ms_count == 0; } 323 324protected: 325 static int ms_count; 326}; 327 328#endif // _WX_WINDOW_H_ 329