18 #ifndef __otbHistogramActionHandler_h
19 #define __otbHistogramActionHandler_h
23 #include "itkNumericTraits.h"
35 template <
class TModel,
class TView,
class TRenderingFunction>
60 typedef typename ViewType::ImageWidgetType::PointType
PointType;
79 virtual bool HandleWidgetEvent(
const std::string& widgetId,
int event)
86 spacePoint[0] = m_LeftAsymptote->GetAbcisse();
87 double abcisseL = m_Curve->TransformPoint(spacePoint)[0];
90 spacePoint[0] = m_RightAsymptote->GetAbcisse();
91 double abcisseR = m_Curve->TransformPoint(spacePoint)[0];
93 spacePoint[0] = m_MinimumAbcisse;
94 double minScreenAbs = m_Curve->TransformPoint(spacePoint)[0];
96 spacePoint[0] = m_MaximumAbcisse;
97 double maxScreenAbs = m_Curve->TransformPoint(spacePoint)[0];
100 if (widgetId == m_Curve->GetIdentifier() && this->GetIsActive())
107 double x = Fl::event_x();
109 if ((vcl_abs(x - abcisseL) < 50) || (vcl_abs(x - abcisseR) < 50))
111 if (vcl_abs(x - abcisseL) < vcl_abs(x - abcisseR))
117 m_ModifyRight =
true;
124 if (m_ModifyLeft || m_ModifyRight)
129 m_ModifyLeft =
false;
130 m_ModifyRight =
false;
135 double x = Fl::event_x();
139 double newLeftAbcisse = m_MinimumAbcisse
140 + (m_MaximumAbcisse - m_MinimumAbcisse) / (maxScreenAbs - minScreenAbs) * (x - minScreenAbs);
141 if ( newLeftAbcisse < m_RightAsymptote->GetAbcisse()
142 && newLeftAbcisse >= m_MinimumAbcisse)
144 m_LeftAsymptote->SetAbcisse(newLeftAbcisse);
149 param.SetElement(2 * m_Channel, newLeftAbcisse);
150 param.SetElement(2 * m_Channel + 1, m_RightAsymptote->GetAbcisse());
151 m_RenderingFunction->SetParameters(param);
157 double newRightAbcisse = m_MinimumAbcisse
158 + (m_MaximumAbcisse - m_MinimumAbcisse) / (maxScreenAbs - minScreenAbs) * (x - minScreenAbs);
159 if (newRightAbcisse > m_LeftAsymptote->GetAbcisse()
160 && newRightAbcisse < m_MaximumAbcisse)
162 m_RightAsymptote->SetAbcisse(newRightAbcisse);
167 param.SetElement(2 * m_Channel, m_LeftAsymptote->GetAbcisse());
168 param.SetElement(2 * m_Channel + 1, newRightAbcisse);
169 m_RenderingFunction->SetParameters(param);
180 itkSetObjectMacro(View, ViewType);
181 itkGetObjectMacro(View, ViewType);
184 itkSetObjectMacro(Model, ModelType);
185 itkGetObjectMacro(Model, ModelType);
188 itkSetObjectMacro(Curve, CurveWidgetType);
191 itkSetObjectMacro(LeftAsymptote, VerticalAsymptoteType);
192 itkSetObjectMacro(RightAsymptote, VerticalAsymptoteType);
195 itkSetObjectMacro(RenderingFunction, RenderingFunctionType);
200 itkSetMacro(MaximumAbcisse,
double);
201 itkSetMacro(MinimumAbcisse,
double);
204 itkSetMacro(Channel,
unsigned int);
211 m_ModifyLeft =
false;
212 m_ModifyRight =
false;
213 m_MaximumAbcisse = itk::NumericTraits<double>::max();
214 m_MinimumAbcisse = itk::NumericTraits<double>::NonpositiveMin();
222 Superclass::PrintSelf(os, indent);
227 void operator =(
const Self&);