~ubuntu-branches/ubuntu/wily/ginkgocadx/wily-proposed

« back to all changes in this revision

Viewing changes to src/cadxcore/wx/iconoimagenctrl/iconoimagenctrl.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Tille
  • Date: 2011-05-02 08:09:26 UTC
  • Revision ID: james.westby@ubuntu.com-20110502080926-bql5wep49c7hg91t
Tags: upstream-2.4.1.1
Import upstream version 2.4.1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  
 
3
 *  $Id: iconoimagenctrl.cpp 3066 2010-12-21 10:10:14Z carlos $
 
4
 *  Ginkgo CADx Project
 
5
 *
 
6
 *  Copyright 2008-10 MetaEmotion S.L. All rights reserved.
 
7
 *  http://ginkgo-cadx.com
 
8
 *
 
9
 *  This file is licensed under LGPL v3 license.
 
10
 *  See License.txt for details
 
11
 *
 
12
 *
 
13
 */
 
14
//#define _GINKGO_TRACE
 
15
#include "iconoimagenctrl.h"
 
16
 
 
17
#include <wx/gdicmn.h>
 
18
#include <wx/panel.h>
 
19
#include <wx/font.h>
 
20
#include <wx/colour.h>
 
21
#include <wx/settings.h>
 
22
#include <wx/string.h>
 
23
 
 
24
#include <wx/dc.h>
 
25
#include <wx/dcclient.h>
 
26
#include <wx/dcscreen.h>
 
27
#include <wx/brush.h>
 
28
#include <wx/dc.h>
 
29
#include <wx/image.h>
 
30
 
 
31
#include <sstream>
 
32
 
 
33
#define DIMENSION_NORMAL 32
 
34
#define DIMENSION_AJUSTADO 24
 
35
#define DIMENSION_IMAGEN 16
 
36
 
 
37
IconoImagenCtrl::IconoImagenCtrl(wxWindow* pPadre, const wxImage& icono, const wxString toolTip,bool hasMenu,bool ajustado) : wxPanel(pPadre)
 
38
{
 
39
        Inicializar(icono,toolTip,hasMenu,ajustado);
 
40
};
 
41
 
 
42
IconoImagenCtrl::IconoImagenCtrl(wxWindow* pPadre, const wxBitmap& icono, const wxString toolTip, bool hasMenu,bool ajustado) : wxPanel(pPadre)
 
43
{
 
44
        Inicializar(icono.ConvertToImage(),toolTip,hasMenu,ajustado);
 
45
}
 
46
 
 
47
void IconoImagenCtrl::Inicializar(const wxImage& icono, const wxString toolTip, bool hasMenu,bool ajustado)
 
48
{
 
49
        m_texto = wxEmptyString;
 
50
        m_enabled = true;
 
51
        m_check = false;
 
52
        m_hasMenu = hasMenu;
 
53
        m_dimension=DIMENSION_NORMAL;
 
54
        if(ajustado)
 
55
                m_dimension = DIMENSION_AJUSTADO;
 
56
 
 
57
        m_ColorFondo = GetParent()->GetBackgroundColour();
 
58
        m_ColorLineaSeleccion = wxColour(255, 255, 255, 255);
 
59
        m_ColorLineaNormal = wxColour(128, 128, 128, 255);
 
60
        m_ColorFondoSeleccionado = wxColour(128, 128, 128, 255);
 
61
        this->SetToolTip(toolTip);
 
62
        
 
63
        this->SetSize(m_dimension,m_dimension);
 
64
        this->SetMinSize(wxSize(m_dimension,m_dimension));
 
65
 
 
66
        SetIcono(icono);        
 
67
 
 
68
        m_MouseDown = false;
 
69
        m_MouseDownMenu = false;
 
70
        m_activado = true;
 
71
 
 
72
        // Connect Events
 
73
        this->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
74
        this->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
75
        this->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
76
        this->Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
77
        this->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
78
        this->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
79
        this->Connect( wxEVT_MOTION, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
80
        this->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
81
        this->Connect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
82
        this->Connect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
83
        this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
84
        this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
85
        this->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
86
        this->Connect( wxEVT_PAINT, wxPaintEventHandler( IconoImagenCtrl::OnPaint ) );
 
87
}
 
88
 
 
89
IconoImagenCtrl::~IconoImagenCtrl(){
 
90
        // Connect Events
 
91
        this->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
92
        this->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
93
        this->Disconnect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
94
        this->Disconnect( wxEVT_MIDDLE_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
95
        this->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
96
        this->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
97
        this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
98
        this->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
99
        this->Disconnect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
100
        this->Disconnect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
101
        this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
102
        this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
103
        this->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
 
104
        this->Disconnect( wxEVT_PAINT, wxPaintEventHandler( IconoImagenCtrl::OnPaint ) );
 
105
}
 
106
 
 
107
void IconoImagenCtrl::SetIcono(const wxImage &icono)
 
108
{
 
109
        
 
110
        if (icono.Ok())
 
111
        {
 
112
                double scaleX = ((double) DIMENSION_IMAGEN)/((double) icono.GetWidth());
 
113
                double scaleY = ((double) DIMENSION_IMAGEN)/((double) icono.GetHeight());
 
114
 
 
115
                if (scaleX != 1.0 || scaleY != 1.0)
 
116
                {
 
117
                        double scale = wxMin(scaleX, scaleY);
 
118
                        int newWidth = (int) (scale * icono.GetWidth());
 
119
                        int newHeight = (int) (scale * icono.GetHeight());
 
120
                        wxImage iconoReescalado = icono.Scale(newWidth, newHeight,wxIMAGE_QUALITY_HIGH);
 
121
                        m_bitmap = wxBitmap(iconoReescalado);
 
122
                        iconoReescalado = icono.ConvertToGreyscale();
 
123
                        m_disabled_bitmap = wxBitmap(iconoReescalado);
 
124
 
 
125
                } else {
 
126
                        m_bitmap = wxBitmap(icono);
 
127
                        wxImage iconoGris = icono.ConvertToGreyscale();
 
128
                        m_disabled_bitmap = wxBitmap(iconoGris);
 
129
                }
 
130
                Update();
 
131
        }
 
132
}
 
133
 
 
134
void IconoImagenCtrl::SetCheck(bool check)
 
135
{
 
136
        if(check!=m_check) {
 
137
                m_check = check;
 
138
                Update();
 
139
        }
 
140
}
 
141
 
 
142
bool IconoImagenCtrl::IsChecked()
 
143
{
 
144
        return m_check;
 
145
}
 
146
 
 
147
void IconoImagenCtrl::SetNumero(int numero)
 
148
{
 
149
        if(numero<100 && numero>=0){
 
150
                std::ostringstream ostr;
 
151
                ostr << numero;
 
152
                m_texto = wxString::FromUTF8(ostr.str().c_str());
 
153
        } else {
 
154
                m_texto =wxEmptyString;
 
155
        }
 
156
}
 
157
 
 
158
//esto sirve para que se comporte como el disabled pero sigue pillando eventos
 
159
void IconoImagenCtrl::SetIcoActivado(bool activar)
 
160
{
 
161
        if(m_activado!=activar) {
 
162
                m_activado = activar;
 
163
                wxRect rect = GetRect();
 
164
                this->GetParent()->Refresh(false,&rect);
 
165
        }
 
166
}
 
167
 
 
168
bool IconoImagenCtrl::EstaActivado()
 
169
{
 
170
        return m_activado;
 
171
}
 
172
 
 
173
bool IconoImagenCtrl::Enable(bool enable)
 
174
{
 
175
        bool vuelta = wxPanel::Enable(enable);
 
176
        wxRect rect = GetRect();
 
177
        this->GetParent()->Refresh(false,&rect);
 
178
        return vuelta;
 
179
}
 
180
 
 
181
// Dibuja manualmente el fondo seleccionado
 
182
void IconoImagenCtrl::OnPaint(wxPaintEvent& evt)
 
183
{
 
184
        wxPaintDC dc(this);
 
185
        const int coordImagen = (m_dimension - DIMENSION_IMAGEN) / 2;
 
186
        if (m_MouseDown && m_isEnabled && m_enabled) {
 
187
                dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
 
188
                dc.SetPen(wxPen(m_ColorFondoSeleccionado, 1, wxSOLID));
 
189
                dc.DrawBitmap(m_bitmap,coordImagen,coordImagen);
 
190
        } else if (!m_isEnabled || !m_activado) {
 
191
                dc.DrawBitmap(m_disabled_bitmap,coordImagen,coordImagen);
 
192
        } else {
 
193
                dc.DrawBitmap(m_bitmap,coordImagen,coordImagen);
 
194
        }
 
195
 
 
196
        if(m_texto!=wxEmptyString) 
 
197
        {
 
198
                wxColour colorTexto;
 
199
                colorTexto.Set(255,255,255);
 
200
                wxColour colorFondo;
 
201
                colorFondo.Set(209,215,255);
 
202
                wxColour colorLinea;
 
203
                colorLinea.Set(209,209,209);
 
204
                
 
205
                dc.SetPen(wxPen(colorLinea, 1, wxSOLID));       
 
206
 
 
207
                // Circulo interior
 
208
                dc.SetBrush(wxBrush(colorFondo,wxSOLID));
 
209
                dc.DrawCircle(dc.GetSize().x-12, 8, 7);         
 
210
 
 
211
                if(m_texto.size()==1) {
 
212
                        dc.SetFont(wxFont(8,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_LIGHT));
 
213
                        dc.SetPen(wxPen(colorTexto, 1, wxSOLID));
 
214
                        dc.DrawText(m_texto,dc.GetSize().x - 15,1);
 
215
                } else {
 
216
                        dc.SetFont(wxFont(7,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_LIGHT));                       
 
217
                        dc.SetPen(wxPen(colorTexto, 1, wxSOLID));
 
218
                        dc.DrawText(m_texto,dc.GetSize().x - 17,2);
 
219
                }
 
220
        }
 
221
        
 
222
        //no se permite menu para las ajustadas
 
223
        if(!m_hasMenu || m_dimension == DIMENSION_AJUSTADO) {
 
224
                if (m_check || m_MouseDown || m_MouseDownMenu) {
 
225
                        dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
 
226
                        dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
 
227
                } else {
 
228
                        dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
 
229
                        dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));
 
230
                }
 
231
                dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
 
232
        } else {                
 
233
                dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
 
234
 
 
235
                if(m_check) {
 
236
                        dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
 
237
                        dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
 
238
 
 
239
                } else if (m_MouseDown) {
 
240
                        dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
 
241
                        dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
 
242
                        dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));                       
 
243
 
 
244
                } else if (m_MouseDownMenu) {
 
245
                        dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));
 
246
                        dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
 
247
                        dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));                    
 
248
 
 
249
                } else {
 
250
                        dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));                       
 
251
                        dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
 
252
                }
 
253
 
 
254
 
 
255
 
 
256
 
 
257
                dc.DrawLine(wxPoint(20, 20),wxPoint(20, dc.GetSize().y - 1));
 
258
                dc.DrawLine(wxPoint(20, 20),wxPoint(dc.GetSize().x - 1, 20));
 
259
 
 
260
                dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxSOLID));
 
261
                wxPoint lista[3];
 
262
                lista[0] = wxPoint(22, 23);
 
263
                lista[1] = wxPoint(26, 30);
 
264
                lista[2] = wxPoint(29, 23);
 
265
 
 
266
                dc.DrawPolygon(3, lista);
 
267
 
 
268
                
 
269
        }
 
270
 
 
271
        evt.Skip(false);
 
272
};
 
273
 
 
274
// Manejador de eventos de ratón
 
275
void IconoImagenCtrl::OnMouseEvents(wxMouseEvent& evt) {
 
276
        if (evt.LeftDown()) {
 
277
                if(m_hasMenu) {
 
278
                        if(evt.GetPosition().x >20 && evt.GetPosition().y >20) {
 
279
                                m_MouseDownMenu = true;
 
280
                        } else {
 
281
                                m_MouseDown = true;
 
282
                        }
 
283
                } else {
 
284
                        m_MouseDown = true;
 
285
                }
 
286
                Refresh();
 
287
        }
 
288
        else if (evt.LeftUp()) {
 
289
                wxCommandEvent e;
 
290
                if(m_MouseDown || m_MouseDownMenu) {
 
291
                        if(m_hasMenu) {
 
292
                                //menu o normal....
 
293
                                if(m_MouseDown) {
 
294
                                        m_MouseDown = false;
 
295
                                        e.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED);   
 
296
                                } else if(m_MouseDownMenu){
 
297
                                        m_MouseDownMenu = false;
 
298
                                        e.SetEventType(wxEVT_CONTEXT_MENU);   
 
299
                                }                                                               
 
300
                        } else {
 
301
                                e.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED);   
 
302
                                m_MouseDown = false;
 
303
                        }
 
304
                        Refresh();
 
305
                        this->ProcessEvent(e);          
 
306
                }
 
307
        }
 
308
        else  if (evt.Leaving() && (m_MouseDown || m_MouseDownMenu)) {
 
309
                m_MouseDown = false;
 
310
                m_MouseDownMenu = false;
 
311
                Refresh();
 
312
        }
 
313
};