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