Salome HOME
Implementation of the Point 2 of the 20948: EDF 1468 SMESH: Histogram of the quality...
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_Preferences_ScalarBarDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 // SMESH SMESHGUI : GUI for SMESH component
24 // File   : SMESHGUI_Preferences_ScalarBarDlg.cxx
25 // Author : Nicolas REJNERI, Open CASCADE S.A.S.
26 // SMESH includes
27 //
28 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
29
30 #include "SMESHGUI.h"
31 #include "SMESHGUI_SpinBox.h"
32 #include "SMESHGUI_VTKUtils.h"
33 #include "SMESHGUI_Utils.h"
34
35 #include <SMESH_Actor.h>
36 #include <SMESH_ScalarBarActor.h>
37 #include <SMESH_ControlsDef.hxx>
38
39 // SALOME GUI includes
40 #include <SUIT_Desktop.h>
41 #include <SUIT_ResourceMgr.h>
42 #include <SUIT_Session.h>
43 #include <SUIT_MessageBox.h>
44
45 #include <LightApp_Application.h>
46 #include <LightApp_SelectionMgr.h>
47 #include <SALOME_ListIO.hxx>
48 #include <SalomeApp_IntSpinBox.h>
49
50 #include <QtxColorButton.h>
51
52 // Qt includes
53 #include <QButtonGroup>
54 #include <QCheckBox>
55 #include <QComboBox>
56 #include <QGroupBox>
57 #include <QLabel>
58 #include <QLineEdit>
59 #include <QPushButton>
60 #include <QRadioButton>
61 #include <QHBoxLayout>
62 #include <QVBoxLayout>
63 #include <QGridLayout>
64 #include <QDoubleValidator>
65
66 // VTK includes
67 #include <vtkTextProperty.h>
68 #include <vtkLookupTable.h>
69
70 #define MINIMUM_WIDTH 70
71 #define MARGIN_SIZE   11
72 #define SPACING_SIZE   6
73
74 // Only one instance is allowed
75 SMESHGUI_Preferences_ScalarBarDlg* SMESHGUI_Preferences_ScalarBarDlg::myDlg = 0;
76
77 //=================================================================================================
78 /*!
79  *  SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties
80  *
81  *  Gets the only instance of "Scalar Bar Properties" dialog box
82  */
83 //=================================================================================================
84 void SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( SMESHGUI* theModule )
85 {
86   if (!myDlg) {
87     myDlg = new SMESHGUI_Preferences_ScalarBarDlg( theModule );
88     myDlg->show();
89   } else {
90     myDlg->show();
91     myDlg->raise();
92     myDlg->activateWindow();
93   }
94 }
95
96 //=================================================================================================
97 /*!
98  *  SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg
99  *
100  *  Constructor
101  */
102 //=================================================================================================
103 SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* theModule )
104   : QDialog( SMESH::GetDesktop( theModule ) ),
105     mySMESHGUI( theModule ),
106     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
107 {
108   DEF_VER_X = 0.01;
109   DEF_VER_Y = 0.10;
110   DEF_VER_H = 0.80;
111   DEF_VER_W = 0.10;
112   DEF_HOR_X = 0.20;
113   DEF_HOR_Y = 0.01;
114   DEF_HOR_H = 0.12;
115   DEF_HOR_W = 0.60;
116
117   setModal( false );
118   setAttribute( Qt::WA_DeleteOnClose, true );
119   setWindowTitle( tr("SMESH_PROPERTIES_SCALARBAR") );
120   setSizeGripEnabled(true);
121
122   myActor = 0;
123
124   /******************************************************************************/
125   // Top layout
126   QVBoxLayout* aTopLayout = new QVBoxLayout( this );
127   aTopLayout->setSpacing( SPACING_SIZE ); aTopLayout->setMargin( MARGIN_SIZE );
128
129   /******************************************************************************/
130   // Scalar range
131   myRangeGrp = new QGroupBox ( tr( "SMESH_RANGE_SCALARBAR" ), this );
132   QHBoxLayout* myRangeGrpLayout = new QHBoxLayout( myRangeGrp );
133   myRangeGrpLayout->setSpacing( SPACING_SIZE ); myRangeGrpLayout->setMargin( MARGIN_SIZE );
134   
135   myMinEdit = new QLineEdit( myRangeGrp );
136   myMinEdit->setMinimumWidth( MINIMUM_WIDTH );
137   myMinEdit->setValidator( new QDoubleValidator( this ) );
138   
139   myMaxEdit = new QLineEdit( myRangeGrp );
140   myMaxEdit->setMinimumWidth( MINIMUM_WIDTH );
141   myMaxEdit->setValidator( new QDoubleValidator( this ) );
142   
143   myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MIN" ), myRangeGrp ) );
144   myRangeGrpLayout->addWidget( myMinEdit );
145   myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MAX" ), myRangeGrp ) );
146   myRangeGrpLayout->addWidget( myMaxEdit );
147   
148   aTopLayout->addWidget( myRangeGrp );
149
150   /******************************************************************************/
151   // Text properties
152   myFontGrp = new QGroupBox ( tr( "SMESH_FONT_SCALARBAR" ), this  );
153   QGridLayout* myFontGrpLayout = new QGridLayout( myFontGrp );
154   myFontGrpLayout->setSpacing( SPACING_SIZE ); myFontGrpLayout->setMargin( MARGIN_SIZE );
155
156   myTitleColorBtn = new QtxColorButton( myFontGrp  );
157
158   myTitleFontCombo = new QComboBox( myFontGrp );
159   myTitleFontCombo->setMinimumWidth( MINIMUM_WIDTH );
160   myTitleFontCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
161   myTitleFontCombo->addItem( tr( "SMESH_FONT_ARIAL" ) );
162   myTitleFontCombo->addItem( tr( "SMESH_FONT_COURIER" ) );
163   myTitleFontCombo->addItem( tr( "SMESH_FONT_TIMES" ) );
164
165   myTitleBoldCheck   = new QCheckBox( tr( "SMESH_FONT_BOLD" ),   myFontGrp );
166   myTitleItalicCheck = new QCheckBox( tr( "SMESH_FONT_ITALIC" ), myFontGrp );
167   myTitleShadowCheck = new QCheckBox( tr( "SMESH_FONT_SHADOW" ), myFontGrp );
168
169   myLabelsColorBtn = new QtxColorButton( myFontGrp );
170
171   myLabelsFontCombo = new QComboBox( myFontGrp );
172   myLabelsFontCombo->setMinimumWidth( MINIMUM_WIDTH );
173   myLabelsFontCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
174   myLabelsFontCombo->addItem( tr( "SMESH_FONT_ARIAL" ) );
175   myLabelsFontCombo->addItem( tr( "SMESH_FONT_COURIER" ) );
176   myLabelsFontCombo->addItem( tr( "SMESH_FONT_TIMES" ) );
177
178   myLabelsBoldCheck   = new QCheckBox( tr( "SMESH_FONT_BOLD" ),   myFontGrp );
179   myLabelsItalicCheck = new QCheckBox( tr( "SMESH_FONT_ITALIC" ), myFontGrp );
180   myLabelsShadowCheck = new QCheckBox( tr( "SMESH_FONT_SHADOW" ), myFontGrp );
181
182   myFontGrpLayout->addWidget( new QLabel( tr( "SMESH_TITLE" ), myFontGrp ), 0, 0 );
183   myFontGrpLayout->addWidget( myTitleColorBtn,    0, 1 );
184   myFontGrpLayout->addWidget( myTitleFontCombo,   0, 2 );
185   myFontGrpLayout->addWidget( myTitleBoldCheck,   0, 3 );
186   myFontGrpLayout->addWidget( myTitleItalicCheck, 0, 4 );
187   myFontGrpLayout->addWidget( myTitleShadowCheck, 0, 5 );
188
189   myFontGrpLayout->addWidget( new QLabel( tr( "SMESH_LABELS" ), myFontGrp ), 1, 0 );
190   myFontGrpLayout->addWidget( myLabelsColorBtn,    1, 1 );
191   myFontGrpLayout->addWidget( myLabelsFontCombo,   1, 2 );
192   myFontGrpLayout->addWidget( myLabelsBoldCheck,   1, 3 );
193   myFontGrpLayout->addWidget( myLabelsItalicCheck, 1, 4 );
194   myFontGrpLayout->addWidget( myLabelsShadowCheck, 1, 5 );
195
196   aTopLayout->addWidget( myFontGrp );
197
198   /******************************************************************************/
199   // Labels & Colors
200   myLabColorGrp = new QGroupBox ( tr( "SMESH_LABELS_COLORS_SCALARBAR" ), this );
201   QHBoxLayout* myLabColorGrpLayout = new QHBoxLayout( myLabColorGrp );
202   myLabColorGrpLayout->setSpacing( SPACING_SIZE ); myLabColorGrpLayout->setMargin( MARGIN_SIZE );
203
204   myColorsSpin = new SalomeApp_IntSpinBox( myLabColorGrp );
205   myColorsSpin->setAcceptNames( false ); // No Notebook variables allowed
206   myColorsSpin->setRange( 2, 256 );
207   myColorsSpin->setSingleStep( 1 );
208   myColorsSpin->setMinimumWidth( MINIMUM_WIDTH );
209   myColorsSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
210
211   myLabelsSpin = new SalomeApp_IntSpinBox( myLabColorGrp );
212   myLabelsSpin->setAcceptNames( false ); // No Notebook variables allowed
213   myLabelsSpin->setRange( 2, 65 );
214   myLabelsSpin->setSingleStep( 1 );
215   myLabelsSpin->setMinimumWidth( MINIMUM_WIDTH );
216   myLabelsSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
217
218   myLabColorGrpLayout->addWidget( new QLabel( tr( "SMESH_NUMBEROFCOLORS" ), myLabColorGrp ) );
219   myLabColorGrpLayout->addWidget( myColorsSpin );
220   myLabColorGrpLayout->addWidget( new QLabel( tr( "SMESH_NUMBEROFLABELS" ), myLabColorGrp ) );
221   myLabColorGrpLayout->addWidget( myLabelsSpin );
222
223   aTopLayout->addWidget( myLabColorGrp );
224
225   /******************************************************************************/
226   // Orientation
227   myOrientationGrp = new QGroupBox ( tr( "SMESH_ORIENTATION" ), this );
228   QButtonGroup* aOrientationGrp = new QButtonGroup( this );
229   QHBoxLayout* myOrientationGrpLayout = new QHBoxLayout( myOrientationGrp );
230   myOrientationGrpLayout->setSpacing( SPACING_SIZE ); myOrientationGrpLayout->setMargin( MARGIN_SIZE );
231
232   myVertRadioBtn  = new QRadioButton( tr( "SMESH_VERTICAL" ),   myOrientationGrp );
233   myHorizRadioBtn = new QRadioButton( tr( "SMESH_HORIZONTAL" ), myOrientationGrp );
234   myVertRadioBtn->setChecked( true );
235
236   myOrientationGrpLayout->addWidget( myVertRadioBtn );
237   myOrientationGrpLayout->addWidget( myHorizRadioBtn );
238   aOrientationGrp->addButton(myVertRadioBtn);
239   aOrientationGrp->addButton(myHorizRadioBtn);
240
241   aTopLayout->addWidget( myOrientationGrp );
242
243   /******************************************************************************/
244   // Position & Size
245   myOriginDimGrp = new QGroupBox ( tr("SMESH_POSITION_SIZE_SCALARBAR"), this );
246   QGridLayout* myOriginDimGrpLayout = new QGridLayout( myOriginDimGrp );
247   myOriginDimGrpLayout->setSpacing( SPACING_SIZE ); myOriginDimGrpLayout->setMargin( MARGIN_SIZE );
248
249   myXSpin = new SMESHGUI_SpinBox(myOriginDimGrp);
250   myXSpin->setAcceptNames( false );
251   myXSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" );
252   myXSpin->setMinimumWidth( MINIMUM_WIDTH );
253   myXSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
254
255   myYSpin = new SMESHGUI_SpinBox(myOriginDimGrp);
256   myYSpin->setAcceptNames( false );
257   myYSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" );  
258   myYSpin->setMinimumWidth( MINIMUM_WIDTH );
259   myYSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
260
261   myWidthSpin = new SMESHGUI_SpinBox(myOriginDimGrp);
262   myWidthSpin->setAcceptNames( false );
263   myWidthSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" );    
264   myWidthSpin->setMinimumWidth( MINIMUM_WIDTH );
265   myWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
266
267   myHeightSpin = new SMESHGUI_SpinBox(myOriginDimGrp);
268   myHeightSpin->setAcceptNames( false );
269   myHeightSpin->RangeStepAndValidator( 0.0, 1.0, 0.1, "parametric_precision" );    
270   myHeightSpin->setMinimumWidth( MINIMUM_WIDTH );
271   myHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
272
273   myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_X_SCALARBAR" ), myOriginDimGrp ), 0, 0 );
274   myOriginDimGrpLayout->addWidget( myXSpin, 0, 1 );
275   myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_Y_SCALARBAR" ), myOriginDimGrp ), 0, 2 );
276   myOriginDimGrpLayout->addWidget( myYSpin, 0, 3 );
277   myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_WIDTH" ),  myOriginDimGrp ),  1, 0 );
278   myOriginDimGrpLayout->addWidget( myWidthSpin, 1, 1 );
279   myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_HEIGHT" ), myOriginDimGrp ), 1, 2 );
280   myOriginDimGrpLayout->addWidget( myHeightSpin, 1, 3 );
281
282   aTopLayout->addWidget( myOriginDimGrp );
283   /******************************************************************************/
284
285   // Destribution
286   myDistributionGrp = new QGroupBox ( tr( "SMESH_DISTRIBUTION_SCALARBAR" ), this );
287   myDistributionGrp->setCheckable(true);
288   QHBoxLayout* aDistributionGrpLayout = new QHBoxLayout( myDistributionGrp );
289   aDistributionGrpLayout->setSpacing( SPACING_SIZE ); aDistributionGrpLayout->setMargin( MARGIN_SIZE );
290
291   myDistribColorGrp = new QButtonGroup( this );
292
293   myDMonoColor  = new QRadioButton( tr( "SMESH_MONOCOLOR" ) ,  myDistributionGrp );
294   myDMultiColor = new QRadioButton( tr( "SMESH_MULTICOLOR" ),  myDistributionGrp );
295   myDMonoColor->setChecked( true );
296
297   myDistribColorGrp->addButton(myDMonoColor);myDistribColorGrp->setId(myDMonoColor,1);
298   myDistribColorGrp->addButton(myDMultiColor);myDistribColorGrp->setId(myDMultiColor,2);
299   
300   aDistributionGrpLayout->addWidget( myDMultiColor );
301   aDistributionGrpLayout->addWidget( myDMonoColor );
302   
303   //Color of the Distribution in monocolor case:
304   myDistributionColorLbl = new QLabel( tr( "SMESH_DISTRIBUTION_COLOR" ), myDistributionGrp );
305   aDistributionGrpLayout->addWidget( myDistributionColorLbl );
306   myMonoColorBtn = new QtxColorButton( myDistributionGrp  );
307   aDistributionGrpLayout->addWidget(myMonoColorBtn);
308   
309   aTopLayout->addWidget(myDistributionGrp);
310   
311   /******************************************************************************/
312   // Common buttons
313   myButtonGrp = new QGroupBox( this );
314   QHBoxLayout* myButtonGrpLayout = new QHBoxLayout( myButtonGrp );
315   myButtonGrpLayout->setSpacing( SPACING_SIZE ); myButtonGrpLayout->setMargin( MARGIN_SIZE );
316
317   myOkBtn = new QPushButton( tr( "SMESH_BUT_APPLY_AND_CLOSE" ), myButtonGrp );
318   myOkBtn->setAutoDefault( true ); myOkBtn->setDefault( true );
319   myApplyBtn = new QPushButton( tr( "SMESH_BUT_APPLY" ), myButtonGrp );
320   myApplyBtn->setAutoDefault( true );
321   myCancelBtn = new QPushButton( tr( "SMESH_BUT_CLOSE" ), myButtonGrp );
322   myCancelBtn->setAutoDefault( true );
323   myHelpBtn = new QPushButton( tr("SMESH_BUT_HELP"), myButtonGrp );
324   myHelpBtn->setAutoDefault(true);
325
326   myButtonGrpLayout->addWidget( myOkBtn );
327   myButtonGrpLayout->addSpacing( 10 );
328   myButtonGrpLayout->addWidget( myApplyBtn );
329   myButtonGrpLayout->addSpacing( 10 );
330   myButtonGrpLayout->addStretch();
331   myButtonGrpLayout->addWidget( myCancelBtn );
332   myButtonGrpLayout->addWidget( myHelpBtn );
333
334   aTopLayout->addWidget( myButtonGrp );
335
336   /***************************************************************/
337   // Init
338   // --> first init from preferences
339   SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
340
341   QColor titleColor = mgr->colorValue("SMESH", "scalar_bar_title_color",
342                                       QColor(255, 255, 255));
343   myTitleColorBtn->setColor(titleColor);
344   myTitleFontCombo->setCurrentIndex(0);
345   if (mgr->hasValue("SMESH", "scalar_bar_title_font")) {
346     QFont f = mgr->fontValue( "SMESH", "scalar_bar_title_font" );
347     if( f.family()=="Arial" )
348       myTitleFontCombo->setCurrentIndex(0);
349     if( f.family()=="Courier" )
350       myTitleFontCombo->setCurrentIndex(1);
351     if( f.family()=="Times")
352       myTitleFontCombo->setCurrentIndex(2);
353     
354     myTitleBoldCheck->setChecked  ( f.bold() );
355     myTitleItalicCheck->setChecked( f.italic() );
356     myTitleShadowCheck->setChecked( f.overline() );
357   }
358                                       
359   QColor labelColor = mgr->colorValue("SMESH", "scalar_bar_label_color", 
360                                       QColor(255, 255, 255));
361   myLabelsColorBtn->setColor(labelColor);
362   myLabelsFontCombo->setCurrentIndex(0);
363   if (mgr->hasValue("SMESH", "scalar_bar_label_font")) {
364     QFont f = mgr->fontValue( "SMESH", "scalar_bar_label_font" );
365     if (f.family() == "Arial")
366       myLabelsFontCombo->setCurrentIndex(0);
367     if (f.family() == "Courier")
368       myLabelsFontCombo->setCurrentIndex(1);
369     if (f.family() == "Times")
370       myLabelsFontCombo->setCurrentIndex(2);
371       
372     myLabelsBoldCheck  ->setChecked( f.bold() );
373     myLabelsItalicCheck->setChecked( f.italic() );
374     myLabelsShadowCheck->setChecked( f.overline() );
375   }
376
377   int aNbColors = mgr->integerValue("SMESH", "scalar_bar_num_colors", 64);
378   myColorsSpin->setValue(aNbColors);
379
380   int aNbLabels = mgr->integerValue("SMESH", "scalar_bar_num_labels", 5);
381   myLabelsSpin->setValue(aNbLabels);
382
383   int aOrientation = mgr->integerValue( "SMESH", "scalar_bar_orientation", 1 );
384   bool isHoriz = aOrientation == 1;
385   if (isHoriz)
386     myHorizRadioBtn->setChecked(true);
387   else
388     myVertRadioBtn->setChecked(true);
389   myIniOrientation = myVertRadioBtn->isChecked();
390
391   QString name = isHoriz ? "scalar_bar_horizontal_%1" : "scalar_bar_vertical_%1";
392
393   myIniX = mgr->doubleValue("SMESH", name.arg( "x" ), 
394                             myHorizRadioBtn->isChecked() ? DEF_HOR_X : DEF_VER_X);
395
396   myIniY = mgr->doubleValue("SMESH", name.arg( "y" ),
397                             myHorizRadioBtn->isChecked() ? DEF_HOR_Y : DEF_VER_Y);
398
399   myIniW = mgr->doubleValue("SMESH", name.arg( "width" ),
400                             myHorizRadioBtn->isChecked() ? DEF_HOR_W : DEF_VER_W);
401
402   myIniH = mgr->doubleValue("SMESH", name.arg( "height" ),
403                             myHorizRadioBtn->isChecked() ? DEF_HOR_H : DEF_VER_H);
404
405   setOriginAndSize(myIniX, myIniY, myIniW, myIniH);
406
407
408   bool distributionVisibility = mgr->booleanValue("SMESH","distribution_visibility");
409   myDistributionGrp->setChecked(distributionVisibility);
410
411   int coloringType = mgr->integerValue("SMESH", "distribution_coloring_type", 0);
412   if( coloringType == SMESH_MONOCOLOR_TYPE ) {
413     myDMonoColor->setChecked(true);
414     onDistributionChanged(myDistribColorGrp->id(myDMonoColor));    
415   } else {
416     myDMultiColor->setChecked(true);
417     onDistributionChanged(myDistribColorGrp->id(myDMultiColor));
418
419   }
420   
421   QColor distributionColor = mgr->colorValue("SMESH", "distribution_color",
422                                              QColor(255, 255, 255));
423   myMonoColorBtn->setColor(distributionColor);
424   
425   
426
427   // --> then init from selection if necessary
428   onSelectionChanged();
429
430   /***************************************************************/
431   // Connect section
432   connect( myOkBtn,             SIGNAL( clicked() ), this, SLOT( onOk() ) );
433   connect( myApplyBtn,          SIGNAL( clicked() ), this, SLOT( onApply() ) );
434   connect( myCancelBtn,         SIGNAL( clicked() ), this, SLOT( onCancel() ) );
435   connect( myHelpBtn,           SIGNAL(clicked()),   this, SLOT( onHelp() ) );
436   connect( myXSpin,             SIGNAL( valueChanged( double ) ), this, SLOT( onXYChanged() ) );
437   connect( myYSpin,             SIGNAL( valueChanged( double ) ), this, SLOT( onXYChanged() ) );
438   connect( aOrientationGrp,     SIGNAL( buttonClicked( int ) ),   this, SLOT( onOrientationChanged() ) );
439   connect( myDistributionGrp,   SIGNAL( toggled(bool) ), this, SLOT(onDistributionActivated(bool)) );
440   connect( myDistribColorGrp,   SIGNAL( buttonClicked( int ) ),   this, SLOT( onDistributionChanged( int ) ) );
441   connect( mySelectionMgr,      SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionChanged() ) );
442   connect( mySMESHGUI,          SIGNAL( SignalCloseAllDialogs() ),   this, SLOT( onCancel() ) );
443
444   myHelpFileName = "quality_page.html";
445 }
446
447 //=================================================================================================
448 /*!
449  *  SMESHGUI_Preferences_ScalarBarDlg::~SMESHGUI_Preferences_ScalarBarDlg
450  *
451  *  Destructor
452  */
453 //=================================================================================================
454 SMESHGUI_Preferences_ScalarBarDlg::~SMESHGUI_Preferences_ScalarBarDlg()
455 {
456 }
457
458 //=================================================================================================
459 /*!
460  *  SMESHGUI_Preferences_ScalarBarDlg::onOk
461  *
462  *  OK button slot
463  */
464 //=================================================================================================
465 void SMESHGUI_Preferences_ScalarBarDlg::onOk()
466 {
467   if ( onApply() )
468     onCancel();
469 }
470
471 //=================================================================================================
472 /*!
473  *  SMESHGUI_Preferences_ScalarBarDlg::onApply
474  *
475  *  Apply button slot
476  */
477 //=================================================================================================
478 bool SMESHGUI_Preferences_ScalarBarDlg::onApply()
479 {
480   // Scalar Bar properties
481   if (!myActor)
482     return false;
483   SMESH_ScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor();
484
485   vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty();
486   QColor aTColor = myTitleColorBtn->color();
487   aTitleTextPrp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. );
488   if ( myTitleFontCombo->currentIndex() == 0 )
489     aTitleTextPrp->SetFontFamilyToArial();
490   else if ( myTitleFontCombo->currentIndex() == 1 )
491     aTitleTextPrp->SetFontFamilyToCourier();
492   else
493     aTitleTextPrp->SetFontFamilyToTimes();
494   aTitleTextPrp->SetBold( myTitleBoldCheck->isChecked() );
495   aTitleTextPrp->SetItalic( myTitleItalicCheck->isChecked() );
496   aTitleTextPrp->SetShadow( myTitleShadowCheck->isChecked() );
497   myScalarBarActor->SetTitleTextProperty( aTitleTextPrp );
498
499   vtkTextProperty* aLabelsTextPrp = myScalarBarActor->GetLabelTextProperty();
500   QColor aLColor = myLabelsColorBtn->color();
501   aLabelsTextPrp->SetColor( aLColor.red()/255., aLColor.green()/255., aLColor.blue()/255. );
502   if ( myLabelsFontCombo->currentIndex() == 0 )
503     aLabelsTextPrp->SetFontFamilyToArial();
504   else if ( myLabelsFontCombo->currentIndex() == 1 )
505     aLabelsTextPrp->SetFontFamilyToCourier();
506   else
507     aLabelsTextPrp->SetFontFamilyToTimes();
508   aLabelsTextPrp->SetBold( myLabelsBoldCheck->isChecked() );
509   aLabelsTextPrp->SetItalic( myLabelsItalicCheck->isChecked() );
510   aLabelsTextPrp->SetShadow( myLabelsShadowCheck->isChecked() );
511   myScalarBarActor->SetLabelTextProperty( aLabelsTextPrp );
512
513   myScalarBarActor->SetNumberOfLabels( myLabelsSpin->value() );
514
515   if ( myHorizRadioBtn->isChecked() )
516     myScalarBarActor->SetOrientationToHorizontal();
517   else
518     myScalarBarActor->SetOrientationToVertical();
519
520   myScalarBarActor->SetPosition( myXSpin->value(), myYSpin->value() );
521   myScalarBarActor->SetWidth( myWidthSpin->value() );
522   myScalarBarActor->SetHeight( myHeightSpin->value() );
523
524   // Distribution
525   bool distributionTypeChanged = false, colorChanged=false;
526   myScalarBarActor->SetDistributionVisibility((int)myDistributionGrp->isChecked());
527   if( myDistributionGrp->isChecked() ) {
528     int ColoringType = myDMultiColor->isChecked() ? SMESH_MULTICOLOR_TYPE : SMESH_MONOCOLOR_TYPE;
529     distributionTypeChanged = (ColoringType != myScalarBarActor->GetDistributionColoringType());
530     if(distributionTypeChanged)      
531       myScalarBarActor->SetDistributionColoringType(ColoringType);
532     
533     if( !myDMultiColor->isChecked() ) {
534       QColor aTColor = myMonoColorBtn->color();
535       double rgb[3], oldRgb[3];;
536       rgb [0] = aTColor.red()/255.;
537       rgb [1] = aTColor.green()/255.;
538       rgb [2] = aTColor.blue()/255.;
539       myScalarBarActor->GetDistributionColor(oldRgb);
540       colorChanged = (rgb[0] != oldRgb[0] || rgb[1] != oldRgb[1] || rgb[2] != oldRgb[2]);
541       if(colorChanged)
542         myScalarBarActor->SetDistributionColor(rgb);
543     }
544   }
545
546   double aMin = myMinEdit->text().toDouble();
547   double aMax = myMaxEdit->text().toDouble();
548   vtkLookupTable* myLookupTable =
549     static_cast<vtkLookupTable*>(myScalarBarActor->GetLookupTable());
550   double oldMinMax[2] = { myLookupTable->GetRange()[0], myLookupTable->GetRange()[1] };
551   bool rangeChanges = ( fabs( oldMinMax[0] - aMin ) + fabs( oldMinMax[1] - aMax ) >
552                         0.001 * ( aMax-aMin + oldMinMax[1]-oldMinMax[0] ));
553   
554   bool nbColorsChanged = (myColorsSpin->value() != myScalarBarActor->GetMaximumNumberOfColors());
555   if(nbColorsChanged)
556     myScalarBarActor->SetMaximumNumberOfColors(myColorsSpin->value());
557   
558
559   myLookupTable->SetRange( aMin, aMax );
560   myLookupTable->SetNumberOfTableValues(myColorsSpin->value());
561   myLookupTable->Build();
562
563   if( nbColorsChanged || rangeChanges)
564     myActor->UpdateDistribution();
565   
566 #ifndef DISABLE_PLOT2DVIEWER
567   if( myActor->GetPlot2Histogram() && 
568       (nbColorsChanged || 
569        rangeChanges ||
570        distributionTypeChanged || 
571        colorChanged ))
572     SMESH::ProcessIn2DViewers(myActor);
573 #endif
574     
575     
576
577   SMESH::RepaintCurrentView();
578   return true;
579 }
580
581 //=================================================================================================
582 /*!
583  *  SMESHGUI_Preferences_ScalarBarDlg::onCancel
584  *
585  *  Cancel button slot
586  */
587 //=================================================================================================
588 void SMESHGUI_Preferences_ScalarBarDlg::onCancel()
589 {
590   close();
591 }
592
593 //=================================================================================================
594 /*!
595  *  SMESHGUI_Preferences_ScalarBarDlg::onHelp
596  *
597  *  Help button slot
598  */
599 //=================================================================================================
600 void SMESHGUI_Preferences_ScalarBarDlg::onHelp()
601 {
602   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
603   if (app) 
604     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
605   else {
606     QString platform;
607 #ifdef WIN32
608     platform = "winapplication";
609 #else
610     platform = "application";
611 #endif
612     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
613                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
614                              arg(app->resourceMgr()->stringValue("ExternalBrowser", 
615                                                                  platform)).
616                              arg(myHelpFileName));
617   }
618 }
619
620 //=================================================================================================
621 /*!
622  *  SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged
623  *
624  *  Called when selection changed
625  */
626 //=================================================================================================
627 void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged()
628 {
629   SALOME_ListIO aList;
630   mySelectionMgr->selectedObjects(aList);
631
632   if (aList.Extent() == 1) {
633     Handle(SALOME_InteractiveObject) anIO = aList.First();
634     if( anIO->hasEntry() ) {
635       SMESH_Actor* anActor = SMESH::FindActorByEntry(anIO->getEntry());
636       if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
637         myActor = anActor;
638         SMESH_ScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor();
639
640         if ( myScalarBarActor->GetLookupTable() ) {
641           vtkFloatingPointType *range = myScalarBarActor->GetLookupTable()->GetRange();
642           myMinEdit->setText( QString::number( range[0],'g',12 ) );
643           myMaxEdit->setText( QString::number( range[1],'g',12 ) );
644         }
645
646         vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty();
647         vtkFloatingPointType aTColor[3];
648         aTitleTextPrp->GetColor( aTColor );
649         myTitleColorBtn->setColor( QColor( (int)( aTColor[0]*255 ), (int)( aTColor[1]*255 ), (int)( aTColor[2]*255 ) ) );
650         myTitleFontCombo->setCurrentIndex( aTitleTextPrp->GetFontFamily() );
651         myTitleBoldCheck->setChecked( aTitleTextPrp->GetBold() );
652         myTitleItalicCheck->setChecked( aTitleTextPrp->GetItalic() );
653         myTitleShadowCheck->setChecked( aTitleTextPrp->GetShadow() );
654
655         vtkTextProperty* aLabelsTextPrp = myScalarBarActor->GetLabelTextProperty();
656         vtkFloatingPointType aLColor[3];
657         aLabelsTextPrp->GetColor( aLColor );
658         myLabelsColorBtn->setColor( QColor( (int)( aLColor[0]*255 ), (int)( aLColor[1]*255 ), (int)( aLColor[2]*255 ) ) );
659         myLabelsFontCombo->setCurrentIndex( aLabelsTextPrp->GetFontFamily() );
660         myLabelsBoldCheck->setChecked( aLabelsTextPrp->GetBold() );
661         myLabelsItalicCheck->setChecked( aLabelsTextPrp->GetItalic() );
662         myLabelsShadowCheck->setChecked( aLabelsTextPrp->GetShadow() );
663
664         myLabelsSpin->setValue( myScalarBarActor->GetNumberOfLabels() );
665         myColorsSpin->setValue( myScalarBarActor->GetMaximumNumberOfColors() );
666
667         if ( myScalarBarActor->GetOrientation() == VTK_ORIENT_VERTICAL )
668           myVertRadioBtn->setChecked( true );
669         else
670           myHorizRadioBtn->setChecked( true );
671         myIniOrientation = myVertRadioBtn->isChecked();
672
673         myIniX = myScalarBarActor->GetPosition()[0];
674         myIniY = myScalarBarActor->GetPosition()[1];
675         myIniW = myScalarBarActor->GetWidth();
676         myIniH = myScalarBarActor->GetHeight();
677         setOriginAndSize( myIniX, myIniY, myIniW, myIniH );
678
679         int coloringType = myScalarBarActor->GetDistributionColoringType();
680         myScalarBarActor->GetDistributionColor( aTColor );
681         myMonoColorBtn->setColor( QColor( (int)( aTColor[0]*255 ), (int)( aTColor[1]*255 ), (int)( aTColor[2]*255 ) ) );
682         if ( coloringType == SMESH_MONOCOLOR_TYPE ) {
683           myDMonoColor->setChecked(true);
684           onDistributionChanged(myDistribColorGrp->id(myDMonoColor));    
685         } else {
686           myDMultiColor->setChecked(true);
687           onDistributionChanged(myDistribColorGrp->id(myDMultiColor));
688         }
689         myDistributionGrp->setChecked((bool)myScalarBarActor->GetDistributionVisibility());
690         onDistributionActivated(myScalarBarActor->GetDistributionVisibility());
691         
692         
693         myRangeGrp->setEnabled( true );
694         myFontGrp->setEnabled( true );
695         myLabColorGrp->setEnabled( true );
696         myOrientationGrp->setEnabled( true );
697         myOriginDimGrp->setEnabled( true );
698         myOkBtn->setEnabled( true );
699         myApplyBtn->setEnabled( true );
700         myDistributionGrp->setEnabled( true );
701         return;
702       }
703     }
704   }
705   myActor = 0;
706   myRangeGrp->setEnabled( false );
707   myFontGrp->setEnabled( false );
708   myLabColorGrp->setEnabled( false );
709   myOrientationGrp->setEnabled( false );
710   myOriginDimGrp->setEnabled( false );
711   myOkBtn->setEnabled( false );
712   myApplyBtn->setEnabled( false );
713   myDistributionGrp->setEnabled( false );
714 }
715
716 //=================================================================================================
717 /*!
718  *  SMESHGUI_Preferences_ScalarBarDlg::closeEvent
719  *
720  *  Close event handler
721  */
722 //=================================================================================================
723 void SMESHGUI_Preferences_ScalarBarDlg::closeEvent( QCloseEvent* e )
724 {
725   myDlg = 0;
726   QDialog::closeEvent( e );
727 }
728
729 //=================================================================================================
730 /*!
731  *  SMESHGUI_Preferences_ScalarBarDlg::onXYChanged
732  *
733  *  Called when X, Y values are changed
734  */
735 //=================================================================================================
736 void SMESHGUI_Preferences_ScalarBarDlg::onXYChanged()
737 {
738   myWidthSpin->setMaximum( 1.0 - myXSpin->value() );
739   myHeightSpin->setMaximum( 1.0 - myYSpin->value() );
740 }
741
742 //=================================================================================================
743 /*!
744  *  SMESHGUI_Preferences_ScalarBarDlg::setOriginAndSize
745  *
746  *  Called when X, Y values are changed
747  */
748 //=================================================================================================
749 void SMESHGUI_Preferences_ScalarBarDlg::setOriginAndSize( const double x,
750                                                           const double y,
751                                                           const double w,
752                                                           const double h )
753 {
754   blockSignals( true );
755   myXSpin->setValue( x );
756   myYSpin->setValue( y );
757   myWidthSpin->setMaximum( 1.0 );
758   myWidthSpin->setValue( w );
759   myHeightSpin->setMaximum( 1.0 );
760   myHeightSpin->setValue( h );
761   blockSignals( false );
762   onXYChanged();
763 }
764
765
766 //=================================================================================================
767 /*!
768  *  SMESHGUI_Preferences_ScalarBarDlg::onDistributionChanged
769  *
770  *  Called when coloring type of the distribution is changed
771  */
772 //=================================================================================================
773 void SMESHGUI_Preferences_ScalarBarDlg::onDistributionChanged( int id ) {
774
775   bool isActive = myDistribColorGrp->id(myDMonoColor) == id;
776
777   myMonoColorBtn->setEnabled(isActive);
778   myDistributionColorLbl->setEnabled(isActive);
779 }
780 //=================================================================================================
781 /*!
782  *  SMESHGUI_Preferences_ScalarBarDlg::onDistributionActivated
783  *
784  *  Called when distribution group check box is changed
785  */
786 //=================================================================================================
787 void SMESHGUI_Preferences_ScalarBarDlg::onDistributionActivated(bool on) {
788   if(on) {
789     if(myDMonoColor->isChecked())
790       onDistributionChanged(myDistribColorGrp->id(myDMonoColor)  );
791     else if(myDMultiColor->isChecked())
792       onDistributionChanged(myDistribColorGrp->id(myDMultiColor) );
793   }
794   else {
795     myMonoColorBtn->setEnabled(false);
796     myDistributionColorLbl->setEnabled(false);
797   }
798 }
799
800
801 //=================================================================================================
802 /*!
803  *  SMESHGUI_Preferences_ScalarBarDlg::onOrientationChanged
804  *
805  *  Called when orientation is changed
806  */
807 //=================================================================================================
808 void SMESHGUI_Preferences_ScalarBarDlg::onOrientationChanged()
809 {
810   initScalarBarFromResources();
811
812   int aOrientation = myVertRadioBtn->isChecked();
813   if ( aOrientation == myIniOrientation )
814     setOriginAndSize( myIniX, myIniY, myIniW, myIniH );
815   else
816     setOriginAndSize( aOrientation ? DEF_VER_X : DEF_HOR_X,
817                       aOrientation ? DEF_VER_Y : DEF_HOR_Y,
818                       aOrientation ? DEF_VER_W : DEF_HOR_W,
819                       aOrientation ? DEF_VER_H : DEF_HOR_H );
820 }
821
822 //=================================================================================================
823 /*!
824  *  SMESHGUI_Preferences_ScalarBarDlg::initScalarBarFromResources()
825  *
826  *  Rereading vertical and horizontal default positions from resources.
827  */
828 //=================================================================================================
829 void SMESHGUI_Preferences_ScalarBarDlg::initScalarBarFromResources()
830 {
831   SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
832   QString name;
833   if (mgr){
834     // initialize from resoources
835     
836     // horizontal
837     name = QString("scalar_bar_horizontal_%1");
838     if (mgr->hasValue("SMESH", name.arg( "x" )))
839       DEF_HOR_X = mgr->doubleValue("SMESH", name.arg( "x" ));
840     if (mgr->hasValue("SMESH", name.arg( "y" )))
841       DEF_HOR_Y = mgr->doubleValue("SMESH", name.arg( "y" ));
842     if (mgr->hasValue("SMESH", name.arg( "width" )))
843       DEF_HOR_W = mgr->doubleValue("SMESH", name.arg( "width" ));
844     if (mgr->hasValue("SMESH", name.arg( "height" )))
845       DEF_HOR_H = mgr->doubleValue("SMESH", name.arg( "height" ));
846
847     // vertical
848     name = QString("scalar_bar_vertical_%1");
849     if (mgr->hasValue("SMESH", name.arg( "x" )))
850       DEF_VER_X = mgr->doubleValue("SMESH", name.arg( "x" ));
851     if (mgr->hasValue("SMESH", name.arg( "y" )))
852       DEF_VER_Y = mgr->doubleValue("SMESH", name.arg( "y" ));
853     if (mgr->hasValue("SMESH", name.arg( "width" )))
854       DEF_VER_W = mgr->doubleValue("SMESH", name.arg( "width" ));
855     if (mgr->hasValue("SMESH", name.arg( "height" )))
856       DEF_VER_H = mgr->doubleValue("SMESH", name.arg( "height" ));
857   }
858 }