Salome HOME
PAL10190 - clone of plot2d
[modules/gui.git] / src / Plot2d / Plot2d_FitDataDlg.cxx
1 //  Copyright (C) 2003  CEA/DEN, EDF R&D
2 //
3 //
4 //
5 //  File   : Plot2d_FitDataDlg.cxx
6 //  Author : Vadim SANDLER
7 //  Module : SALOME
8 //  $Header$
9
10 #include "Plot2d_FitDataDlg.h"
11 #include <qlabel.h>
12 #include <qlayout.h>
13 #include <qvalidator.h>
14 #include <qpushbutton.h>
15 #include <qradiobutton.h>
16 #include <qbuttongroup.h>
17 #include <qlineedit.h>
18
19 #define SPACING_SIZE      6
20 #define MARGIN_SIZE       11
21 #define MIN_EDIT_SIZE     100
22
23 /*!
24   Constructor 
25 */
26 Plot2d_FitDataDlg::Plot2d_FitDataDlg( QWidget* parent, bool secondAxisY )
27      : QDialog( parent ? parent : 0,
28          "Plot2d_FitDataDlg", 
29          true, 
30          WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
31          myY2MinEdit( 0 ), myY2MaxEdit( 0 ), mySecondAxisY( secondAxisY )
32
33 {
34   setCaption( tr( "FIT_DATA_TLT" ) );
35   setSizeGripEnabled( TRUE );
36   QGridLayout* topLayout = new QGridLayout( this ); 
37   topLayout->setSpacing( SPACING_SIZE );
38   topLayout->setMargin( MARGIN_SIZE );
39
40   // 'Range' group
41   myRangeGrp = new QButtonGroup( this );
42   myRangeGrp->setColumnLayout( 0, Qt::Vertical );
43   myRangeGrp->layout()->setSpacing( 0 );
44   myRangeGrp->layout()->setMargin( 0 );
45   QGridLayout* aGridLayout = new QGridLayout( myRangeGrp->layout() );
46   aGridLayout->setAlignment( Qt::AlignTop );
47   aGridLayout->setMargin( MARGIN_SIZE );
48   aGridLayout->setSpacing( SPACING_SIZE );
49
50   myModeAllRB  = new QRadioButton( tr( "FIT_ALL" ),        myRangeGrp );
51   myModeHorRB  = new QRadioButton( tr( "FIT_HORIZONTAL" ), myRangeGrp );
52   myModeVerRB  = new QRadioButton( tr( "FIT_VERTICAL" ),   myRangeGrp );
53
54   QDoubleValidator* aValidator = new QDoubleValidator( this );
55   myXMinEdit = new QLineEdit( myRangeGrp );
56   myXMinEdit->setValidator( aValidator );
57   myXMinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
58   myXMinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
59   myXMinEdit->setText( "0.0" );
60
61   myYMinEdit = new QLineEdit( myRangeGrp );
62   myYMinEdit->setValidator( aValidator );
63   myYMinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
64   myYMinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
65   myYMinEdit->setText( "0.0" );
66
67   myXMaxEdit = new QLineEdit( myRangeGrp );
68   myXMaxEdit->setValidator( aValidator );
69   myXMaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
70   myXMaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
71   myXMaxEdit->setText( "0.0" );
72
73   myYMaxEdit = new QLineEdit( myRangeGrp );
74   myYMaxEdit->setValidator( aValidator );
75   myYMaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
76   myYMaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
77   myYMaxEdit->setText( "0.0" );
78
79   if (mySecondAxisY) {
80     myY2MinEdit = new QLineEdit( myRangeGrp );
81     myY2MinEdit->setValidator( aValidator );
82     myY2MinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
83     myY2MinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
84     myY2MinEdit->setText( "0.0" );
85
86     myY2MaxEdit = new QLineEdit( myRangeGrp );
87     myY2MaxEdit->setValidator( aValidator );
88     myY2MaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
89     myY2MaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
90     myY2MaxEdit->setText( "0.0" );
91   }
92
93   QFrame* aHLine = new QFrame( myRangeGrp );
94   aHLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
95
96   QHBoxLayout* aModeLayout = new QHBoxLayout;
97   aModeLayout->setMargin( 0 );
98   aModeLayout->setSpacing( SPACING_SIZE );
99   aModeLayout->addWidget( myModeAllRB );
100   aModeLayout->addWidget( myModeHorRB );
101   aModeLayout->addWidget( myModeVerRB );
102
103   QLabel* horLab = new QLabel( tr( "HORIZONTAL_AXIS" ), myRangeGrp );
104   QLabel* verLab = new QLabel( tr( "VERTICAL_AXIS" ), myRangeGrp );
105   if (mySecondAxisY)
106     verLab->setText( tr( "VERTICAL_LEFT_AXIS" ) );
107
108   QFont font = horLab->font(); font.setBold( true );
109   horLab->setFont( font ); verLab->setFont( font );
110
111   aGridLayout->addMultiCellLayout( aModeLayout,    0, 0, 0, 4 );
112   aGridLayout->addMultiCellWidget( aHLine,         1, 1, 0, 4 );
113   aGridLayout->addWidget         ( horLab,         2,    0 );
114   aGridLayout->addWidget         ( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
115                                                    2,    1 );
116   aGridLayout->addWidget         ( myXMinEdit,     2,    2 );
117   aGridLayout->addWidget         ( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
118                                                    2,    3 );
119   aGridLayout->addWidget         ( myXMaxEdit,     2,    4 );
120   aGridLayout->addWidget         ( verLab,         3,    0 );
121   aGridLayout->addWidget         ( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
122                                                    3,    1 );
123   aGridLayout->addWidget         ( myYMinEdit,     3,    2 );
124   aGridLayout->addWidget         ( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
125                                                    3,    3 );
126   aGridLayout->addWidget         ( myYMaxEdit,     3,    4 );
127
128   if (mySecondAxisY) {
129     QLabel* ver2Lab = new QLabel(tr( "VERTICAL_RIGHT_AXIS" ), myRangeGrp );
130     ver2Lab->setFont( font );
131     aGridLayout->addWidget       ( ver2Lab,        4,    0 );
132     aGridLayout->addWidget       ( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
133                                                    4,    1 );
134     aGridLayout->addWidget       ( myY2MinEdit,    4,    2 );
135     aGridLayout->addWidget       ( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
136                                                    4,    3 );
137     aGridLayout->addWidget       ( myY2MaxEdit,    4,    4 );
138   }
139
140   // OK/Cancel buttons
141   myOkBtn = new QPushButton( tr( "BUT_OK" ), this, "buttonOk" );
142   myOkBtn->setAutoDefault( TRUE );
143   myOkBtn->setDefault( TRUE );
144   myCancelBtn = new QPushButton(  tr( "BUT_CANCEL" ), this, "buttonCancel" );
145   myCancelBtn->setAutoDefault( TRUE );
146
147   topLayout->addMultiCellWidget( myRangeGrp, 0, 0, 0, 2 );
148   topLayout->addWidget( myOkBtn, 1, 0 );
149   topLayout->setColStretch( 1, 5 );
150   topLayout->addWidget( myCancelBtn, 1, 2 );
151
152   // connect signals
153   connect( myOkBtn,      SIGNAL( clicked() ),      this, SLOT( accept() ) );
154   connect( myCancelBtn,  SIGNAL( clicked() ),      this, SLOT( reject() ) );
155   connect( myRangeGrp,   SIGNAL( clicked( int ) ), this, SLOT( onModeChanged( int ) ) );
156
157   // initial state
158   myModeAllRB->setChecked( true );
159   onModeChanged( 0 );
160 }
161
162 /*!
163   Sets range
164 */
165 void Plot2d_FitDataDlg::setRange( const double xMin, 
166                                   const double xMax,
167                                   const double yMin,
168                                   const double yMax,
169                                   const double y2Min,
170                                   const double y2Max) 
171 {
172   myXMinEdit->setText( QString::number( xMin ) );
173   myXMaxEdit->setText( QString::number( xMax ) );
174   myYMinEdit->setText( QString::number( yMin ) );
175   myYMaxEdit->setText( QString::number( yMax ) );
176   if (mySecondAxisY) {
177     myY2MinEdit->setText( QString::number( y2Min ) );
178     myY2MaxEdit->setText( QString::number( y2Max ) );
179   }
180 }
181
182 /*!
183   Gets range, returns mode (see getMode())
184 */
185 int Plot2d_FitDataDlg::getRange( double& xMin, 
186                                  double& xMax,
187                                  double& yMin,
188                                  double& yMax,
189                                  double& y2Min,
190                                  double& y2Max) 
191 {
192   xMin = myXMinEdit->text().toDouble();
193   xMax = myXMaxEdit->text().toDouble();
194   yMin = myYMinEdit->text().toDouble();
195   yMax = myYMaxEdit->text().toDouble();
196   if (mySecondAxisY) {
197     y2Min = myY2MinEdit->text().toDouble();
198     y2Max = myY2MaxEdit->text().toDouble();
199   }
200   else {
201     y2Min = 0;
202     y2Max = 0;
203   }
204   int myMode = 0;
205   if ( myModeAllRB->isChecked() )
206     myMode = 0;
207   if ( myModeHorRB->isChecked() )
208     myMode = 1;
209   if ( myModeVerRB->isChecked() )
210     myMode = 2;
211   return myMode;
212 }
213
214 /*!
215   Gets mode : 0 - Fit all; 1 - Fit horizontal, 2 - Fit vertical
216 */
217 int Plot2d_FitDataDlg::getMode() 
218 {
219   int myMode = 0;
220   if ( myModeAllRB->isChecked() )
221     myMode = 0;
222   if ( myModeHorRB->isChecked() )
223     myMode = 1;
224   if ( myModeVerRB->isChecked() )
225     myMode = 2;
226   return myMode;
227 }
228
229 /*!
230   Called when range mode changed
231 */
232 void Plot2d_FitDataDlg::onModeChanged(int mode) 
233 {
234   bool badFocus;
235   switch( mode ) {
236   case 0: // fit all mode
237     myXMinEdit->setEnabled(true);
238     myXMaxEdit->setEnabled(true);
239     myYMinEdit->setEnabled(true);
240     myYMaxEdit->setEnabled(true);
241     if (mySecondAxisY) {
242       myY2MinEdit->setEnabled(true);
243       myY2MaxEdit->setEnabled(true);
244     }
245     break;
246   case 1: // fit horizontal mode
247     badFocus = myYMinEdit->hasFocus() || myYMaxEdit->hasFocus();
248     myXMinEdit->setEnabled(true);
249     myXMaxEdit->setEnabled(true);
250     myYMinEdit->setEnabled(false);
251     myYMaxEdit->setEnabled(false);
252     if (mySecondAxisY) {
253       myY2MinEdit->setEnabled(false);
254       myY2MaxEdit->setEnabled(false);
255     }
256     if (badFocus)
257       myXMinEdit->setFocus();
258     break;
259   case 2: // fit vertical mode
260     badFocus = myXMinEdit->hasFocus() || myXMaxEdit->hasFocus();
261     myXMinEdit->setEnabled(false);
262     myXMaxEdit->setEnabled(false);
263     myYMinEdit->setEnabled(true);
264     myYMaxEdit->setEnabled(true);
265     if (mySecondAxisY) {
266       myY2MinEdit->setEnabled(true);
267       myY2MaxEdit->setEnabled(true);
268     }
269     if (badFocus)
270       myYMinEdit->setFocus();
271     break;
272   }
273 }
274