void ViewTree::removing_view(View *view) { if (impl->focus_view) { if (impl->focus_view == view || view->has_child(impl->focus_view)) set_focus_view(nullptr); } }
NativeTabbedPaneWin::NativeTabbedPaneWin(TabbedPane* tabbed_pane) : NativeControlWin(), tabbed_pane_(tabbed_pane), tab_layout_manager_(NULL), content_window_(NULL), selected_index_(-1) { // Associates the actual HWND with the tabbed-pane so the tabbed-pane is // the one considered as having the focus (not the wrapper) when the HWND is // focused directly (with a click for example). set_focus_view(tabbed_pane); }
static int dview_on_mouse(DView *dv, int mx, int my, int button) { int clicked = (button && !dview_is_state(dv, VIEW_STATE_BUTTON)); int handled = TRUE; int x,y; if (button && dview_is_state_all(dv, VIEW_STATE_BUTTON | VIEW_STATE_MOVING)) { int dx = mx - dv->last_x; int dy = my - dv->last_y; dv->ofs_x += dx; dv->ofs_y += dy; dv->last_x = mx; dv->last_y = my; dview_set_state(dv, VIEW_STATE_NEEDS_UPDATE, TRUE); return TRUE; } else if (button && dview_is_state_all(dv, VIEW_STATE_BUTTON | VIEW_STATE_SIZING)) { int dx = mx - dv->last_x; int dy = my - dv->last_y; dv->bounds.max_x += dx; dv->bounds.max_y += dy; dv->last_x = mx; dv->last_y = my; dview_set_state(dv, VIEW_STATE_NEEDS_UPDATE, TRUE); return TRUE; } else dview_set_state(dv, VIEW_STATE_MOVING | VIEW_STATE_SIZING, FALSE); if (!map_point(dv, mx, my, &x, &y)) return FALSE; if (dview_xy_in_rect(dv, RECT_DVIEW_TITLE, x, y)) { /* on title, do nothing */ if (clicked) { dv->last_x = mx; dv->last_y = my; set_focus_view(dv); dview_set_state(dv, VIEW_STATE_MOVING, TRUE); } } else if (dview_xy_in_rect(dv, RECT_DVIEW_HSB, x, y)) { /* on horizontal scrollbar */ debug_view_xy pos; adjustment *sb = &dv->hsb; if (clicked) { rectangle r; int xt; dview_get_rect(dv, RECT_DVIEW_HSB, &r); x -= r.min_x; xt = (x - VSB_WIDTH) * (sb->upper - sb->lower) / (rect_get_width(&r) - 2 * dv->vsb.visible * VSB_WIDTH) + sb->lower; if (x < VSB_WIDTH) sb->value -= sb->step_increment; else if (x > rect_get_width(&r) - VSB_WIDTH) sb->value += sb->step_increment; else if (xt < sb->value) sb->value -= sb->page_increment; else if (xt > sb->value) sb->value += sb->page_increment; if (sb->value < sb->lower) sb->value = sb->lower; if (sb->value > sb->upper) sb->value = sb->upper; } pos = dv->view->visible_position(); if (sb->value != pos.x) { pos.x = sb->value; dv->view->set_visible_position(pos); dview_set_state(dv, VIEW_STATE_NEEDS_UPDATE, TRUE); } } else if (dview_xy_in_rect(dv, RECT_DVIEW_VSB, x, y) ) { /* on vertical scrollbar */ debug_view_xy pos; adjustment *sb = &dv->vsb; if (clicked) { rectangle r; int yt; dview_get_rect(dv, RECT_DVIEW_VSB, &r); y -= r.min_y; yt = (y - HSB_HEIGHT) * (sb->upper - sb->lower) / (rect_get_height(&r) - 2 * HSB_HEIGHT) + sb->lower; if (y < HSB_HEIGHT) sb->value -= sb->step_increment; else if (y > rect_get_height(&r) - HSB_HEIGHT) sb->value += sb->step_increment; else if (yt < sb->value) sb->value -= sb->page_increment; else if (yt > sb->value) sb->value += sb->page_increment; if (sb->value < sb->lower) sb->value = sb->lower; if (sb->value > sb->upper) sb->value = sb->upper; } pos = dv->view->visible_position(); if (sb->value != pos.y) { pos.y = sb->value; dv->view->set_visible_position(pos); dview_set_state(dv, VIEW_STATE_NEEDS_UPDATE, TRUE); } } else if (dview_xy_in_rect(dv, RECT_DVIEW_SIZE, x, y)) { /* on sizing area */ if (clicked) { dv->last_x = mx; dv->last_y = my; set_focus_view(dv); dview_set_state(dv, VIEW_STATE_SIZING, TRUE); } } else if (dview_xy_in_rect(dv, RECT_DVIEW_CLIENT, x, y)) { y -= TITLE_HEIGHT; if (dv->view->cursor_supported() && clicked && y >= 0) { debug_view_xy topleft = dv->view->visible_position(); debug_view_xy newpos; newpos.x = topleft.x + x / debug_font_width; newpos.y = topleft.y + y / debug_font_height; dv->view->set_cursor_position(newpos); dv->view->set_cursor_visible(true); } if (clicked) set_focus_view(dv); } else { handled = FALSE; } dview_set_state(dv, VIEW_STATE_BUTTON, button); return handled; }
NativeScrollBarWin::NativeScrollBarWin(NativeScrollBar* scroll_bar) : native_scroll_bar_(scroll_bar), sb_container_(NULL) { set_focus_view(scroll_bar); memset(&scroll_info_, 0, sizeof(scroll_info_)); }