/*========================================================================= Program: Visualization Toolkit Module: vtkWidgetCallbackMapper.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkWidgetCallbackMapper.h" #include "vtkAbstractWidget.h" #include "vtkCommand.h" #include "vtkEventData.h" #include "vtkObjectFactory.h" #include "vtkWidgetEventTranslator.h" #include vtkStandardNewMacro(vtkWidgetCallbackMapper); // Callbacks are stored as a pair of (Object,Method) in the map. struct vtkCallbackPair { vtkCallbackPair() : Widget(nullptr) , Callback(nullptr) { } // map requires empty constructor vtkCallbackPair(vtkAbstractWidget* w, vtkWidgetCallbackMapper::CallbackType f) : Widget(w) , Callback(f) { } vtkAbstractWidget* Widget; vtkWidgetCallbackMapper::CallbackType Callback; }; // The map tracks the correspondence between widget events and callbacks class vtkCallbackMap : public std::map { public: typedef vtkCallbackMap CallbackMapType; typedef std::map::iterator CallbackMapIterator; }; //------------------------------------------------------------------------------ vtkWidgetCallbackMapper::vtkWidgetCallbackMapper() { this->CallbackMap = new vtkCallbackMap; this->EventTranslator = nullptr; } //------------------------------------------------------------------------------ vtkWidgetCallbackMapper::~vtkWidgetCallbackMapper() { delete this->CallbackMap; if (this->EventTranslator) { this->EventTranslator->Delete(); } } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::SetEventTranslator(vtkWidgetEventTranslator* t) { if (this->EventTranslator != t) { if (this->EventTranslator) { this->EventTranslator->Delete(); } this->EventTranslator = t; if (this->EventTranslator) { this->EventTranslator->Register(this); } this->Modified(); } } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::SetCallbackMethod( unsigned long VTKEvent, unsigned long widgetEvent, vtkAbstractWidget* w, CallbackType f) { this->EventTranslator->SetTranslation(VTKEvent, widgetEvent); this->SetCallbackMethod(widgetEvent, w, f); } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::SetCallbackMethod(unsigned long VTKEvent, int modifier, char keyCode, int repeatCount, const char* keySym, unsigned long widgetEvent, vtkAbstractWidget* w, CallbackType f) { this->EventTranslator->SetTranslation( VTKEvent, modifier, keyCode, repeatCount, keySym, widgetEvent); this->SetCallbackMethod(widgetEvent, w, f); } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::SetCallbackMethod(unsigned long VTKEvent, vtkEventData* edata, unsigned long widgetEvent, vtkAbstractWidget* w, CallbackType f) { // make sure the type is set edata->SetType(VTKEvent); this->EventTranslator->SetTranslation(VTKEvent, edata, widgetEvent); this->SetCallbackMethod(widgetEvent, w, f); } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::SetCallbackMethod( unsigned long widgetEvent, vtkAbstractWidget* w, CallbackType f) { (*this->CallbackMap)[widgetEvent] = vtkCallbackPair(w, f); } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::InvokeCallback(unsigned long widgetEvent) { vtkCallbackMap::CallbackMapIterator iter = this->CallbackMap->find(widgetEvent); if (iter != this->CallbackMap->end()) { vtkAbstractWidget* w = (*iter).second.Widget; CallbackType f = (*iter).second.Callback; (*f)(w); } } //------------------------------------------------------------------------------ void vtkWidgetCallbackMapper::PrintSelf(ostream& os, vtkIndent indent) { // Superclass typedef defined in vtkTypeMacro() found in vtkSetGet.h this->Superclass::PrintSelf(os, indent); os << indent << "Event Translator: "; if (this->EventTranslator) { os << this->EventTranslator << "\n"; } else { os << "(none)\n"; } }