]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/motif/window.h
Cured last focus bug (I hope); some wxMotif mods
[wxWidgets.git] / include / wx / motif / window.h
index cbe336c021b45030b11ca235959297b95859c727..81c51482c08728dc69b11399abf6177fb0651fba 100644 (file)
@@ -27,6 +27,7 @@
 #include "wx/list.h"
 #include "wx/region.h"
 #include "wx/accel.h"
+#include "wx/intl.h"
 
 #define wxKEY_SHIFT     1
 #define wxKEY_CTRL      2
@@ -53,7 +54,7 @@ class WXDLLEXPORT wxCursor;
 class WXDLLEXPORT wxColourMap;
 class WXDLLEXPORT wxFont;
 class WXDLLEXPORT wxMenu;
-class WXDLLEXPORT wxRectangle;
+class WXDLLEXPORT wxRect;
 class WXDLLEXPORT wxBitmap;
 class WXDLLEXPORT wxSizer;
 class WXDLLEXPORT wxList;
@@ -67,11 +68,11 @@ class WXDLLEXPORT wxIcon;
 class WXDLLEXPORT wxDC;
 class WXDLLEXPORT wxValidator;
 
-#if USE_DRAG_AND_DROP
+#if wxUSE_DRAG_AND_DROP
 class WXDLLEXPORT wxDropTarget;
 #endif
 
-#if USE_WX_RESOURCES
+#if wxUSE_WX_RESOURCES
 class WXDLLEXPORT wxResourceTable;
 class WXDLLEXPORT wxItemResource;
 #endif
@@ -81,12 +82,39 @@ WXDLLEXPORT_DATA(extern const char*) wxPanelNameStr;
 WXDLLEXPORT_DATA(extern const wxSize) wxDefaultSize;
 WXDLLEXPORT_DATA(extern const wxPoint) wxDefaultPosition;
 
+//-----------------------------------------------------------------------------
+// wxClientData
+//-----------------------------------------------------------------------------
+
+class wxClientData
+{
+public:
+    wxClientData() { }
+    virtual ~wxClientData() { }
+};
+
+//-----------------------------------------------------------------------------
+// wxStringClientData
+//-----------------------------------------------------------------------------
+
+class wxStringClientData: public wxClientData
+{
+public:
+    wxStringClientData() { }
+    wxStringClientData( wxString &data ) { m_data = data; }
+    void SetData( wxString &data ) { m_data = data; }
+    wxString GetData() const { return m_data; }
+    
+private:
+    wxString  m_data;
+};
+
 class WXDLLEXPORT wxWindow: public wxEvtHandler
 {
   DECLARE_ABSTRACT_CLASS(wxWindow)
 
-  friend class wxDC;
-  friend class wxPaintDC;
+  friend class WXDLLEXPORT wxDC;
+  friend class WXDLLEXPORT wxWindowDC;
 
 public:
   wxWindow();
@@ -162,26 +190,40 @@ public:
 
   // Get overall window size
   virtual void GetSize(int *width, int *height) const;
+  virtual wxSize GetSize() const { int w, h; GetSize(& w, & h); return wxSize(w, h); }
+  virtual wxRect GetRect() const { int w, h; int x, y; GetPosition(& x, & y); GetSize(& w, & h); return wxRect(x, y, w, h); }
 
   // Get window position, relative to parent (or screen if no parent)
   virtual void GetPosition(int *x, int *y) const;
+  virtual wxPoint GetPosition() const { int x, y; GetPosition(&x, &y); return wxPoint(x, y); }
 
   // Get client (application-useable) size
   virtual void GetClientSize(int *width, int *height) const;
+  virtual wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); }
 
   // Set overall size and position
   virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  inline virtual void SetSize(int width, int height) { SetSize(-1, -1, width, height, wxSIZE_USE_EXISTING); }
-  inline virtual void Move(int x, int y) { SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING); }
+  virtual void SetSize(int width, int height) { SetSize(-1, -1, width, height, wxSIZE_USE_EXISTING); }
+  virtual void SetSize(const wxRect& rect, int sizeFlags = wxSIZE_AUTO)
+    { SetSize(rect.x, rect.y, rect.width, rect.height, sizeFlags); }
+  virtual void SetSize(const wxSize& size) { SetSize(-1, -1, size.x, size.y, wxSIZE_USE_EXISTING); }
+
+  virtual void Move(int x, int y) { SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING); }
+  virtual void Move(const wxPoint& pt) { SetSize(pt.x, pt.y, -1, -1, wxSIZE_USE_EXISTING); }
 
   // Set client size
   virtual void SetClientSize(int width, int size);
+  virtual void SetClientSize(const wxSize& sz) { SetClientSize(sz.x, sz.y); }
 
   // Convert client to screen coordinates
   virtual void ClientToScreen(int *x, int *y) const;
+  virtual wxPoint ClientToScreen(const wxPoint& pt) const
+    { int x = pt.x; int y = pt.y; ClientToScreen(& x, & y); return wxPoint(x, y); }
 
   // Convert screen to client coordinates
   virtual void ScreenToClient(int *x, int *y) const;
+  virtual wxPoint ScreenToClient(const wxPoint& pt) const
+    { int x = pt.x; int y = pt.y; ScreenToClient(& x, & y); return wxPoint(x, y); }
 
   // Set the focus to this window
   virtual void SetFocus();
@@ -193,7 +235,7 @@ public:
   // Enable or disable the window
   virtual void Enable(bool enable);
 
-#if USE_DRAG_AND_DROP
+#if wxUSE_DRAG_AND_DROP
   // Associate a drop target with this window (if the window already had a drop
   // target, it's deleted!) and return the current drop target (may be NULL).
   void          SetDropTarget(wxDropTarget *pDropTarget);
@@ -203,8 +245,20 @@ public:
   // Accept files for dragging
   virtual void DragAcceptFiles(bool accept);
 
+  // tooltips
+    // create a tooltip with this text
+  void SetToolTip(const wxString& tip);
+
+  // TODO
+#if wxUSE_TOOLTIPS
+    // pointer may be NULL to remove the tooltip
+  void SetToolTip(wxToolTip *tooltip);
+    // get the current tooltip (may return NULL if none)
+  wxToolTip* GetToolTip() const { return m_tooltip; }
+#endif
+
   // Update region access
-  virtual wxRegion GetUpdateRegion() const;
+  virtual wxRegion& GetUpdateRegion() const;
   virtual bool IsExposed(int x, int y, int w, int h) const;
   virtual bool IsExposed(const wxPoint& pt) const;
   virtual bool IsExposed(const wxRect& rect) const;
@@ -228,18 +282,22 @@ public:
   virtual bool PopupMenu(wxMenu *menu, int x, int y);
 
   // Send the window a refresh event
-  virtual void Refresh(bool eraseBack = TRUE, const wxRectangle *rect = NULL);
+  virtual void Refresh(bool eraseBack = TRUE, const wxRect *rect = NULL);
 
   // New functions that will replace the above.
   virtual void SetScrollbar(int orient, int pos, int thumbVisible,
     int range, bool refresh = TRUE);
 
+  // Helper functions for Motif
+  void CreateScrollbar(int orientation);
+  void DestroyScrollbar(int orientation);
+
   virtual void SetScrollPos(int orient, int pos, bool refresh = TRUE);
   virtual int GetScrollPos(int orient) const;
   virtual int GetScrollRange(int orient) const;
   virtual int GetScrollThumb(int orient) const;
 
-  virtual void ScrollWindow(int dx, int dy, const wxRectangle *rect = NULL);
+  virtual void ScrollWindow(int dx, int dy, const wxRect *rect = NULL);
 
   // Caret manipulation
   virtual void CreateCaret(int w, int h);
@@ -269,20 +327,31 @@ public:
   inline wxWindow *GetParent() const;
   inline void SetParent(wxWindow *p) ;
   inline wxWindow *GetGrandParent() const;
-  inline wxList *GetChildren() const;
+  inline wxList& GetChildren() const;
+  // Reparents this window to have the new parent.
+  virtual bool Reparent(wxWindow* parent);
 
   // Set/get the window's font
   virtual void SetFont(const wxFont& f);
-  inline virtual wxFont *GetFont() const;
+  inline virtual wxFontGetFont() const;
 
   // Set/get the window's validator
   void SetValidator(const wxValidator& validator);
   inline wxValidator *GetValidator() const;
 
+  virtual void SetClientObject( wxClientData *data );
+  virtual wxClientData *GetClientObject();
+    
+  virtual void SetClientData( void *data );
+  virtual void *GetClientData();
+  
   // Set/get the window's style
   inline void SetWindowStyleFlag(long flag);
   inline long GetWindowStyleFlag() const;
 
+  // Handle a control command
+  virtual void OnCommand(wxWindow& win, wxCommandEvent& event);
+
   // Set/get event handler
   inline void SetEventHandler(wxEvtHandler *handler);
   inline wxEvtHandler *GetEventHandler() const;
@@ -308,22 +377,13 @@ public:
   void SetConstraints(wxLayoutConstraints *c);
 
   // Set/get window background colour
-  inline virtual void SetBackgroundColour(const wxColour& col);
+  virtual void SetBackgroundColour(const wxColour& col);
   inline virtual wxColour GetBackgroundColour() const;
 
   // Set/get window foreground colour
-  inline virtual void SetForegroundColour(const wxColour& col);
+  virtual void SetForegroundColour(const wxColour& col);
   inline virtual wxColour GetForegroundColour() const;
 
-  // Set/get window default background colour (for children to inherit).
-  // NOTE: these may be removed in later revisions.
-  inline virtual void SetDefaultBackgroundColour(const wxColour& col);
-  inline virtual wxColour GetDefaultBackgroundColour(void) const;
-
-  // Set/get window default foreground colour (for children to inherit)
-  inline virtual void SetDefaultForegroundColour(const wxColour& col);
-  inline virtual wxColour GetDefaultForegroundColour(void) const;
-
   // Get the default button, if there is one
   inline virtual wxButton *GetDefaultItem() const;
   inline virtual void SetDefaultItem(wxButton *but);
@@ -333,9 +393,10 @@ public:
   virtual void OnDefaultAction(wxControl *initiatingItem);
 
   // Resource loading
-#if USE_WX_RESOURCES
+#if wxUSE_WX_RESOURCES
   virtual bool LoadFromResource(wxWindow *parent, const wxString& resourceName, const wxResourceTable *table = NULL);
-  virtual wxControl *CreateItem(const wxItemResource *childResource, const wxResourceTable *table = NULL);
+  virtual wxControl *CreateItem(const wxItemResource* childResource, const wxItemResource* parentResource,
+                                 const wxResourceTable *table = (const wxResourceTable *) NULL);
 #endif
 
   virtual void GetTextExtent(const wxString& string, int *x, int *y,
@@ -368,13 +429,15 @@ public:
 
   void OnEraseBackground(wxEraseEvent& event);
   void OnChar(wxKeyEvent& event);
+  void OnKeyDown(wxKeyEvent& event);
+  void OnKeyUp(wxKeyEvent& event);
   void OnPaint(wxPaintEvent& event);
   void OnIdle(wxIdleEvent& event);
 
   // Does this window want to accept keyboard focus?
   virtual bool AcceptsFocus() const;
 
-  virtual void PrepareDC( wxDC &dc ) {};
+  virtual void PrepareDC( wxDC & WXUNUSED(dc) ) {};
 
 
 public:
@@ -433,6 +496,14 @@ public:
   virtual void GetClientSizeConstraint(int *w, int *h) const ;
   virtual void GetPositionConstraint(int *x, int *y) const ;
 
+  // Dialog units translations. Implemented in wincmn.cpp.
+  wxPoint ConvertPixelsToDialog(const wxPoint& pt) ;
+  wxPoint ConvertDialogToPixels(const wxPoint& pt) ;
+  inline wxSize ConvertPixelsToDialog(const wxSize& sz)
+  { wxPoint pt(ConvertPixelsToDialog(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); }
+  inline wxSize ConvertDialogToPixels(const wxSize& sz)
+  { wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); }
+
   wxObject *GetChild(int number) const ;
 
   // Generates a new id for controls
@@ -450,6 +521,7 @@ public:
 
   /// Motif-specific
 
+  void ClearUpdateRects();
   void CanvasGetSize(int* width, int* height) const; // If have drawing area
   void CanvasGetClientSize(int *width, int *height) const;
   void CanvasGetPosition(int *x, int *y) const; // If have drawing area
@@ -460,20 +532,62 @@ public:
   // message, e.g. arrange status bar, toolbar etc.
   virtual bool PreResize() { return TRUE; }
 
-  // Get main widget for this window
+  // Get main widget for this window, e.g. a text widget
   virtual WXWidget GetMainWidget() const;
+  // Get the widget that corresponds to the label (for font setting, label setting etc.)
+  virtual WXWidget GetLabelWidget() const { return GetMainWidget(); }
   // Get the client widget for this window (something we can
   // create other windows on)
   virtual WXWidget GetClientWidget() const;
+  // Get the top widget for this window, e.g. the scrolled widget parent
+  // of a multi-line text widget. Top means, top in the window hierarchy
+  // that implements this window.
+  virtual WXWidget GetTopWidget() const;
   virtual void SetMainWidget(WXWidget w) { m_mainWidget = w; }
+  bool CanAddEventHandler() const { return m_canAddEventHandler; }
+  void SetCanAddEventHandler(bool flag) { m_canAddEventHandler = flag; }
 
   // Get the underlying X window and display
   virtual WXWindow GetXWindow() const;
   virtual WXDisplay *GetXDisplay() const;
 
+  virtual WXPixmap GetBackingPixmap() const { return m_backingPixmap; }
+  inline int GetPixmapWidth() const { return m_pixmapWidth; }
+  inline int GetPixmapHeight() const { return m_pixmapHeight; }
+
+  // Change properties
+  virtual void ChangeFont(bool keepOriginalSize = TRUE);             // Change to the current font (often overridden)
+  virtual void DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour);
+  virtual void DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour = FALSE);
+  // These to be overridden as needed (may change several widgets)
+  virtual void ChangeBackgroundColour(); // Change background and foreground colour using current
+                                         // background colour setting (Motif generates
+                                         // foreground based on background)
+  virtual void ChangeForegroundColour(); // Change foreground colour using current
+                                         // foreground colour setting
+
+  // Adds the widget to the hash table and adds event handlers.
+  bool AttachWidget (wxWindow* parent, WXWidget mainWidget,
+             WXWidget formWidget, int x, int y, int width, int height);
+  bool DetachWidget(WXWidget widget);
+
   // Generates a paint event
   virtual void DoPaint();
 
+  // How to implement accelerators. If we find a key event,
+  // translate to wxWindows wxKeyEvent form. Find a widget for the window.
+  // Now find a wxWindow for the widget. If there isn't one, go up the widget hierarchy
+  // trying to find one. Once one is found, call ProcessAccelerator for the
+  // window. If it returns TRUE (processed the event), skip the X event,
+  // otherwise carry on up the wxWindows window hierarchy calling ProcessAccelerator.
+  // If all return FALSE, process the X event as normal.
+  // Eventually we can implement OnCharHook the same way, but concentrate on accelerators
+  // for now.
+  // ProcessAccelerator must look at the current accelerator table, and try to find
+  // what menu id or window (beneath it) has this ID. Then construct an appropriate command
+  // event and send it.
+  virtual bool ProcessAccelerator(wxKeyEvent& event);
+
   ////////////////////////////////////////////////////////////////////////
   //// PROTECTED DATA
 protected:
@@ -505,11 +619,11 @@ protected:
 
   wxColour              m_backgroundColour ;
   wxColour              m_foregroundColour ;
-  wxColour              m_defaultBackgroundColour;
-  wxColour              m_defaultForegroundColour;
   wxAcceleratorTable    m_acceleratorTable;
+  wxClientData*         m_clientObject;
+  void*                 m_clientData;
 
-#if USE_DRAG_AND_DROP
+#if wxUSE_DRAG_AND_DROP
   wxDropTarget         *m_pDropTarget;    // the current drop target or NULL
 #endif  //USE_DRAG_AND_DROP
 
@@ -520,13 +634,16 @@ public:
 
 public:
   /// Motif-specific
+  bool                  m_needsRefresh; // Do we need to repaint the backing store?
+  bool                  m_canAddEventHandler;
   bool                  m_button1Pressed;
   bool                  m_button2Pressed;
   bool                  m_button3Pressed;
   // For double-click detection
   long                  m_lastTS;      // last timestamp
   int                   m_lastButton;  // last pressed button
-  wxList                m_updateRects;     // List of wxRectangles representing damaged region
+  wxList                m_updateRects;     // List of wxRects representing damaged region
+  bool                  m_isShown;
 protected:
   WXWidget              m_mainWidget;
   WXWidget              m_hScrollBar;
@@ -535,16 +652,16 @@ protected:
   WXWidget              m_scrolledWindow;
   WXWidget              m_drawingArea;
   bool                  m_winCaptured;
-  bool                  m_isShown;
   bool                  m_hScroll;
   bool                  m_vScroll;
-  bool                  m_hScrollingEnabled;
-  bool                  m_vScrollingEnabled;
   WXPixmap              m_backingPixmap;
   int                   m_pixmapWidth;
   int                   m_pixmapHeight;
   int                   m_pixmapOffsetX;
   int                   m_pixmapOffsetY;
+  int                   m_scrollPosX; // Store the last scroll pos,
+  int                   m_scrollPosY; // since in wxWin the pos isn't
+                                      // set automatically by system
 
 DECLARE_EVENT_TABLE()
 };
@@ -558,8 +675,8 @@ inline void wxWindow::SetId(int id) { m_windowId = id; }
 inline wxWindow *wxWindow::GetParent() const { return m_windowParent; }
 inline void wxWindow::SetParent(wxWindow *p) { m_windowParent = p; }
 inline wxWindow *wxWindow::GetGrandParent() const { return (m_windowParent ? m_windowParent->m_windowParent : (wxWindow*) NULL); }
-inline wxList *wxWindow::GetChildren() const { return m_children; }
-inline wxFont *wxWindow::GetFont() const { return (wxFont *) & m_windowFont; }
+inline wxList& wxWindow::GetChildren() const { return (wxList&) * m_children; }
+inline wxFont& wxWindow::GetFont() const { return (wxFont&) m_windowFont; }
 inline wxString wxWindow::GetName() const { return m_windowName; }
 inline void wxWindow::SetName(const wxString& name) { m_windowName = name; }
 inline long wxWindow::GetWindowStyleFlag() const { return m_windowStyle; }
@@ -569,14 +686,8 @@ inline wxEvtHandler *wxWindow::GetEventHandler() const { return m_windowEventHan
 inline void wxWindow::SetAutoLayout(bool a) { m_autoLayout = a; }
 inline bool wxWindow::GetAutoLayout() const { return m_autoLayout; }
 inline wxLayoutConstraints *wxWindow::GetConstraints() const { return m_constraints; }
-inline void wxWindow::SetBackgroundColour(const wxColour& col) { m_backgroundColour = col; };
 inline wxColour wxWindow::GetBackgroundColour() const { return m_backgroundColour; };
-inline void wxWindow::SetForegroundColour(const wxColour& col) { m_foregroundColour = col; };
 inline wxColour wxWindow::GetForegroundColour() const { return m_foregroundColour; };
-inline void wxWindow::SetDefaultForegroundColour(const wxColour& col) { m_defaultForegroundColour = col; };
-inline wxColour wxWindow::GetDefaultForegroundColour(void) const { return m_defaultForegroundColour; };
-inline void wxWindow::SetDefaultBackgroundColour(const wxColour& col) { m_defaultBackgroundColour = col; };
-inline wxColour wxWindow::GetDefaultBackgroundColour(void) const { return m_defaultBackgroundColour; };
 
 inline wxButton *wxWindow::GetDefaultItem() const { return m_defaultItem; }
 inline void wxWindow::SetDefaultItem(wxButton *but) { m_defaultItem = but; }
@@ -595,5 +706,19 @@ wxWindow* WXDLLEXPORT wxGetActiveWindow();
 
 WXDLLEXPORT_DATA(extern wxList) wxTopLevelWindows;
 
+// A little class to switch off size optimization while an instance of the object
+// exists
+class WXDLLEXPORT wxNoOptimize: public wxObject
+{
+public:
+  wxNoOptimize();
+  ~wxNoOptimize();
+
+  static bool CanOptimize();
+
+protected:
+  static int m_count;
+};
+
 #endif
     // _WX_WINDOW_H_