Управление панелью инструментов: традиционный подход

//=========================================================
// Модуль управления панелью инструментов
// Версия, выполненная с применением традиционного подхода

//======
// Обработчик события нажатия кнопки мыши на панели
//
int toolbar_btn_press(PtWidget_t *widget, ApInfo_t *apinfo,
                      PtCallbackInfo_t *cbinfo)
{
  toolbar_t         *tb = tb_data(widget) ;
                              // Указатель на данные панели
  PhRect_t          *rect ;   // Координаты курсора мыши
  PhEvent_t         *event = cbinfo->event ;
                              // Произошедшее событие
  PhPointerEvent_t  *edata = PhGetData( event ) ;
                     // Дополнительная информация о событии

  if( edata->buttons&Ph_BUTTON_MENU )
  {
    // Была нажата правая кнопка мыши
    rect = PhGetRects( event ) ;
    tb->drag_pos = rect->ul ;
        // Запомнить координаты курсора мыши
    PtWindowToFront( tb->wgt ) ;
        // Поместить окно панели поверх всех остальных окон
    tb->menu = 1 ;
        // Запомнить, что была нажата правая кнопка мыши
  } ;
  return( Pt_CONTINUE ) ;
} ;

//======
// Обработчик события отпускания кнопки мыши на панели
//
int toolbar_btn_release(PtWidget_t *widget, ApInfo_t *apinfo,
                        PtCallbackInfo_t *cbinfo)
{
  toolbar_t         *tb = tb_data(widget) ;
                             // Указатель на данные панели
  PhEvent_t         *event = cbinfo->event ;
                             // Произошедшее событие
  PhPointerEvent_t  *edata = PhGetData( event ) ;
                     // Дополнительная информация о событии

  if(    event->subtype==Ph_EV_RELEASE_REAL
      && edata->buttons&Ph_BUTTON_MENU )
  // Была отпущена правая кнопка мыши
    if( tb->menu == 1 )                  
    // Перед этим была нажата правая кнопка мыши
      ApCreateModule( ABM_toolbar_menu, NULL, NULL ) ;
      // Отобразить меню
 
  tb->menu = 0 ;
  
  return( Pt_CONTINUE ) ;
} ;

//======
// Обработчик события перемещения мыши с нажатой кнопкой
//
int toolbar_btn_move(PtWidget_t *widget, ApInfo_t *apinfo,
                     PtCallbackInfo_t *cbinfo)
{
  toolbar_t         *tb = tb_data(widget) ;
                              // Указатель на данные панели
  PhRect_t          *rect ;   // Координаты события
  PhEvent_t         *event = cbinfo->event ;
                              // Произошедшее событие
  PhPointerEvent_t  *edata = PhGetData( event ) ;
                     // Дополнительная информация о событии

  // Если не нажата правая кнопка мыши, ничего не делать
  if( !edata->buttons&Ph_BUTTON_MENU ) return Pt_CONTINUE ;

  // Переместить тулбар вслед за курсором мыши.
  rect = PhGetRects( event ) ;
  tb->menu = 0 ;
  toolbar_move( tb, rect->ul.x - tb->drag_pos.x, 
                    rect->ul.y - tb->drag_pos.y ) ;
  
  return( Pt_CONTINUE ) ;
} ;

//======
// Обработчик события пересечения курсором мыши
// границы панели
int toolbar_boundary(PtWidget_t *widget, ApInfo_t *apinfo,
                     PtCallbackInfo_t *cbinfo)
{
  toolbar_t    *tb = tb_data(widget) ;
                              // Указатель на данные панели
  
  tb->menu = 0 ;
 
  return( Pt_CONTINUE ) ;
} ;