]> git.saurik.com Git - wxWidgets.git/blob - src/gtk1/minifram.cpp
thread fixes (compiles, but doesn't work yet)
[wxWidgets.git] / src / gtk1 / minifram.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: minifram.cpp
3 // Purpose:
4 // Author: Robert Roebling
5 // Id: $Id$
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 #ifdef __GNUG__
11 #pragma implementation "minifram.h"
12 #endif
13
14 #include "wx/minifram.h"
15 #include "wx/dcscreen.h"
16
17 #include "gtk/gtk.h"
18 #include "wx/gtk/win_gtk.h"
19
20 //-----------------------------------------------------------------------------
21 // "clicked"
22 //-----------------------------------------------------------------------------
23
24 static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxMiniFrame *mf )
25 {
26 mf->Close();
27 }
28
29 //-----------------------------------------------------------------------------
30 // wxMiniFrame
31 //-----------------------------------------------------------------------------
32
33 BEGIN_EVENT_TABLE(wxMiniFrame,wxFrame)
34 EVT_PAINT(wxMiniFrame::OnPaint)
35 EVT_MOUSE_EVENTS(wxMiniFrame::OnMouse)
36 END_EVENT_TABLE()
37
38 IMPLEMENT_DYNAMIC_CLASS(wxMiniFrame,wxFrame)
39
40 bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
41 const wxPoint &pos, const wxSize &size,
42 long style, const wxString &name )
43 {
44 style = style | wxSIMPLE_BORDER;
45
46 m_miniEdge = 3;
47 m_miniTitle = 13;
48 m_isDragging = FALSE;
49 m_oldX = -1;
50 m_oldY = -1;
51 m_diffX = 0;
52 m_diffY = 0;
53
54 wxFrame::Create( parent, id, title, pos, size, style, name );
55
56 GtkWidget *close_button = gtk_button_new_with_label( "x" );
57
58 gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), close_button, 4, 4 );
59 gtk_widget_set_usize( close_button, 12, 11 );
60
61 gtk_widget_show( close_button );
62
63 gtk_signal_connect( GTK_OBJECT(close_button), "clicked",
64 GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this );
65
66 return TRUE;
67 }
68
69 void wxMiniFrame::OnPaint( wxPaintEvent &WXUNUSED(event) )
70 {
71 if (m_miniTitle == 0) return;
72 if (m_title.IsEmpty()) return;
73
74 wxPaintDC dc(this);
75
76 dc.SetBrush( *wxTRANSPARENT_BRUSH );
77 dc.DrawRectangle( 0, 0, m_width, m_height );
78
79 dc.SetPen( *wxWHITE_PEN );
80 dc.DrawLine( 1, 1, m_width-2, 1 );
81 dc.DrawLine( 1, 1, 1, m_height-2 );
82
83 dc.SetPen( *wxMEDIUM_GREY_PEN );
84 dc.DrawLine( 1, m_height-1, m_width-2, m_height-1 );
85 dc.DrawLine( m_width-1, 1, m_width-1, m_height-2 );
86
87 dc.SetBrush( *wxBLUE_BRUSH );
88 dc.SetPen( *wxTRANSPARENT_PEN );
89 dc.DrawRectangle( m_miniEdge, m_miniEdge, m_width - 2*m_miniEdge, m_miniTitle );
90
91 dc.SetTextForeground( *wxWHITE );
92 dc.SetFont( *wxSMALL_FONT );
93 dc.DrawText( m_title, 14 + m_miniEdge, 1 + m_miniEdge );
94 }
95
96 void wxMiniFrame::DrawFrame( int x, int y )
97 {
98 int org_x = 0;
99 int org_y = 0;
100 gdk_window_get_origin( m_wxwindow->window, &org_x, &org_y );
101 x += org_x;
102 y += org_y;
103
104 wxScreenDC dc;
105 dc.SetLogicalFunction( wxXOR );
106
107 dc.DrawRectangle( x, y, m_width, m_height );
108 }
109
110 void wxMiniFrame::OnMouse( wxMouseEvent &event )
111 {
112 int x = event.GetX();
113 int y = event.GetY();
114
115 if (event.LeftDown())
116 {
117 CaptureMouse();
118 m_diffX = x;
119 m_diffY = y;
120 DrawFrame( 0, 0 );
121 m_oldX = 0;
122 m_oldY = 0;
123 m_isDragging = TRUE;
124 return;
125 }
126
127 if (event.Dragging() && m_isDragging)
128 {
129 DrawFrame( m_oldX, m_oldY );
130 m_oldX = x - m_diffX;
131 m_oldY = y - m_diffY;
132 DrawFrame( m_oldX, m_oldY );
133 return;
134 }
135
136 if (event.LeftUp() && m_isDragging)
137 {
138 m_isDragging = FALSE;
139 DrawFrame( m_oldX, m_oldY );
140 ReleaseMouse();
141
142 int org_x = 0;
143 int org_y = 0;
144 gdk_window_get_origin( m_wxwindow->window, &org_x, &org_y );
145 x += org_x - m_diffX;
146 y += org_y - m_diffY;
147 m_x = x;
148 m_y = y;
149 gtk_widget_set_uposition( m_widget, x, y );
150
151 return;
152 }
153
154 event.Skip();
155 }
156