Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/gtk/tabs/tab_gtk.h" | 5 #include "chrome/browser/ui/gtk/tabs/tab_gtk.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 | 8 |
| 9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 return font->GetStringWidth(title); | 29 return font->GetStringWidth(title); |
| 30 } | 30 } |
| 31 | 31 |
| 32 } // namespace | 32 } // namespace |
| 33 | 33 |
| 34 class TabGtk::ContextMenuController : public ui::SimpleMenuModel::Delegate, | 34 class TabGtk::ContextMenuController : public ui::SimpleMenuModel::Delegate, |
| 35 public MenuGtk::Delegate { | 35 public MenuGtk::Delegate { |
| 36 public: | 36 public: |
| 37 explicit ContextMenuController(TabGtk* tab) | 37 explicit ContextMenuController(TabGtk* tab) |
| 38 : tab_(tab), | 38 : tab_(tab), |
| 39 model_(this, tab->delegate()->IsTabPinned(tab)) { | 39 model_(this, tab->delegate()->model(), |
| 40 tab->delegate()->GetIndexOfTab(const_cast<const TabGtk*>(tab))) { | |
|
dpapad
2011/05/10 16:28:14
This is the hacky part. In order to invoke the des
| |
| 40 menu_.reset(new MenuGtk(this, &model_)); | 41 menu_.reset(new MenuGtk(this, &model_)); |
| 41 } | 42 } |
| 42 | 43 |
| 43 virtual ~ContextMenuController() {} | 44 virtual ~ContextMenuController() {} |
| 44 | 45 |
| 45 void RunMenu(const gfx::Point& point, guint32 event_time) { | 46 void RunMenu(const gfx::Point& point, guint32 event_time) { |
| 46 menu_->PopupAsContext(point, event_time); | 47 menu_->PopupAsContext(point, event_time); |
| 47 } | 48 } |
| 48 | 49 |
| 49 void Cancel() { | 50 void Cancel() { |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 169 } | 170 } |
| 170 } | 171 } |
| 171 | 172 |
| 172 gboolean TabGtk::OnButtonPressEvent(GtkWidget* widget, GdkEventButton* event) { | 173 gboolean TabGtk::OnButtonPressEvent(GtkWidget* widget, GdkEventButton* event) { |
| 173 // Every button press ensures either a button-release-event or a drag-fail | 174 // Every button press ensures either a button-release-event or a drag-fail |
| 174 // signal for |widget|. | 175 // signal for |widget|. |
| 175 if (event->button == 1 && event->type == GDK_BUTTON_PRESS) { | 176 if (event->button == 1 && event->type == GDK_BUTTON_PRESS) { |
| 176 // Store whether or not we were selected just now... we only want to be | 177 // Store whether or not we were selected just now... we only want to be |
| 177 // able to drag foreground tabs, so we don't start dragging the tab if | 178 // able to drag foreground tabs, so we don't start dragging the tab if |
| 178 // it was in the background. | 179 // it was in the background. |
| 179 bool just_selected = !IsSelected(); | 180 if (!IsActive() && (event->state & 5) == 0) { |
| 180 if (just_selected) { | 181 delegate_->ActivateTab(this); |
| 181 delegate_->SelectTab(this); | 182 } else if (!IsActive() && (event->state & 4) == 4) { |
| 183 // TODO(dpapad) | |
| 184 NOTIMPLEMENTED() << " Multi tab selection ctrl click under construction"; | |
| 185 delegate_->ToggleTabSelection(this); | |
| 186 } else if (!IsActive() && (event->state & 1) == 1) { | |
| 187 NOTIMPLEMENTED() << " Multi tab selection shift click under construction"; | |
| 188 delegate_->ExtendTabSelection(this); | |
| 182 } | 189 } |
| 183 | |
| 184 // Hook into the message loop to handle dragging. | 190 // Hook into the message loop to handle dragging. |
| 185 observer_.reset(new TabGtkObserverHelper(this)); | 191 observer_.reset(new TabGtkObserverHelper(this)); |
| 186 | 192 |
| 187 // Store the button press event, used to initiate a drag. | 193 // Store the button press event, used to initiate a drag. |
| 188 last_mouse_down_ = gdk_event_copy(reinterpret_cast<GdkEvent*>(event)); | 194 last_mouse_down_ = gdk_event_copy(reinterpret_cast<GdkEvent*>(event)); |
| 189 } else if (event->button == 3) { | 195 } else if (event->button == 3) { |
| 190 // Only show the context menu if the left mouse button isn't down (i.e., | 196 // Only show the context menu if the left mouse button isn't down (i.e., |
| 191 // the user might want to drag instead). | 197 // the user might want to drag instead). |
| 192 if (!last_mouse_down_) { | 198 if (!last_mouse_down_) { |
| 193 menu_controller_.reset(new ContextMenuController(this)); | 199 menu_controller_.reset(new ContextMenuController(this)); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 static_cast<gint>(new_x), static_cast<gint>(new_y))) { | 292 static_cast<gint>(new_x), static_cast<gint>(new_y))) { |
| 287 StartDragging(gfx::Point( | 293 StartDragging(gfx::Point( |
| 288 static_cast<int>(last_mouse_down_->button.x), | 294 static_cast<int>(last_mouse_down_->button.x), |
| 289 static_cast<int>(last_mouse_down_->button.y))); | 295 static_cast<int>(last_mouse_down_->button.y))); |
| 290 } | 296 } |
| 291 } | 297 } |
| 292 | 298 |
| 293 /////////////////////////////////////////////////////////////////////////////// | 299 /////////////////////////////////////////////////////////////////////////////// |
| 294 // TabGtk, TabRendererGtk overrides: | 300 // TabGtk, TabRendererGtk overrides: |
| 295 | 301 |
| 302 bool TabGtk::IsActive() const { | |
| 303 return delegate_->IsTabActive(this); | |
| 304 } | |
| 305 | |
| 296 bool TabGtk::IsSelected() const { | 306 bool TabGtk::IsSelected() const { |
| 297 return delegate_->IsTabSelected(this); | 307 return delegate_->IsTabSelected(this); |
| 298 } | 308 } |
| 299 | 309 |
| 300 bool TabGtk::IsVisible() const { | 310 bool TabGtk::IsVisible() const { |
| 301 return GTK_WIDGET_FLAGS(event_box_) & GTK_VISIBLE; | 311 return GTK_WIDGET_FLAGS(event_box_) & GTK_VISIBLE; |
| 302 } | 312 } |
| 303 | 313 |
| 304 void TabGtk::SetVisible(bool visible) const { | 314 void TabGtk::SetVisible(bool visible) const { |
| 305 if (visible) { | 315 if (visible) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 gdk_event_free(last_mouse_down_); | 397 gdk_event_free(last_mouse_down_); |
| 388 last_mouse_down_ = NULL; | 398 last_mouse_down_ = NULL; |
| 389 } | 399 } |
| 390 | 400 |
| 391 // Notify the drag helper that we're done with any potential drag operations. | 401 // Notify the drag helper that we're done with any potential drag operations. |
| 392 // Clean up the drag helper, which is re-created on the next mouse press. | 402 // Clean up the drag helper, which is re-created on the next mouse press. |
| 393 delegate_->EndDrag(canceled); | 403 delegate_->EndDrag(canceled); |
| 394 | 404 |
| 395 observer_.reset(); | 405 observer_.reset(); |
| 396 } | 406 } |
| OLD | NEW |