1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/base/cursor/cursor_loader_win.h" 6 7 #include "base/lazy_instance.h" 8 #include "base/strings/string16.h" 9 #include "ui/base/cursor/cursor.h" 10 #include "ui/resources/grit/ui_unscaled_resources.h" 11 12 namespace ui { 13 14 namespace { 15 16 base::LazyInstance<base::string16> g_cursor_resource_module_name; 17 18 const wchar_t* GetCursorId(gfx::NativeCursor native_cursor) { 19 switch (native_cursor.native_type()) { 20 case kCursorNull: 21 return IDC_ARROW; 22 case kCursorPointer: 23 return IDC_ARROW; 24 case kCursorCross: 25 return IDC_CROSS; 26 case kCursorHand: 27 return IDC_HAND; 28 case kCursorIBeam: 29 return IDC_IBEAM; 30 case kCursorWait: 31 return IDC_WAIT; 32 case kCursorHelp: 33 return IDC_HELP; 34 case kCursorEastResize: 35 return IDC_SIZEWE; 36 case kCursorNorthResize: 37 return IDC_SIZENS; 38 case kCursorNorthEastResize: 39 return IDC_SIZENESW; 40 case kCursorNorthWestResize: 41 return IDC_SIZENWSE; 42 case kCursorSouthResize: 43 return IDC_SIZENS; 44 case kCursorSouthEastResize: 45 return IDC_SIZENWSE; 46 case kCursorSouthWestResize: 47 return IDC_SIZENESW; 48 case kCursorWestResize: 49 return IDC_SIZEWE; 50 case kCursorNorthSouthResize: 51 return IDC_SIZENS; 52 case kCursorEastWestResize: 53 return IDC_SIZEWE; 54 case kCursorNorthEastSouthWestResize: 55 return IDC_SIZENESW; 56 case kCursorNorthWestSouthEastResize: 57 return IDC_SIZENWSE; 58 case kCursorMove: 59 return IDC_SIZEALL; 60 case kCursorProgress: 61 return IDC_APPSTARTING; 62 case kCursorNoDrop: 63 return IDC_NO; 64 case kCursorNotAllowed: 65 return IDC_NO; 66 case kCursorColumnResize: 67 return MAKEINTRESOURCE(IDC_COLRESIZE); 68 case kCursorRowResize: 69 return MAKEINTRESOURCE(IDC_ROWRESIZE); 70 case kCursorMiddlePanning: 71 return MAKEINTRESOURCE(IDC_PAN_MIDDLE); 72 case kCursorEastPanning: 73 return MAKEINTRESOURCE(IDC_PAN_EAST); 74 case kCursorNorthPanning: 75 return MAKEINTRESOURCE(IDC_PAN_NORTH); 76 case kCursorNorthEastPanning: 77 return MAKEINTRESOURCE(IDC_PAN_NORTH_EAST); 78 case kCursorNorthWestPanning: 79 return MAKEINTRESOURCE(IDC_PAN_NORTH_WEST); 80 case kCursorSouthPanning: 81 return MAKEINTRESOURCE(IDC_PAN_SOUTH); 82 case kCursorSouthEastPanning: 83 return MAKEINTRESOURCE(IDC_PAN_SOUTH_EAST); 84 case kCursorSouthWestPanning: 85 return MAKEINTRESOURCE(IDC_PAN_SOUTH_WEST); 86 case kCursorWestPanning: 87 return MAKEINTRESOURCE(IDC_PAN_WEST); 88 case kCursorVerticalText: 89 return MAKEINTRESOURCE(IDC_VERTICALTEXT); 90 case kCursorCell: 91 return MAKEINTRESOURCE(IDC_CELL); 92 case kCursorZoomIn: 93 return MAKEINTRESOURCE(IDC_ZOOMIN); 94 case kCursorZoomOut: 95 return MAKEINTRESOURCE(IDC_ZOOMOUT); 96 case kCursorGrab: 97 return MAKEINTRESOURCE(IDC_HAND_GRAB); 98 case kCursorGrabbing: 99 return MAKEINTRESOURCE(IDC_HAND_GRABBING); 100 case kCursorCopy: 101 return MAKEINTRESOURCE(IDC_COPYCUR); 102 case kCursorAlias: 103 return MAKEINTRESOURCE(IDC_ALIAS); 104 case kCursorNone: 105 return MAKEINTRESOURCE(IDC_CURSOR_NONE); 106 case kCursorContextMenu: 107 case kCursorCustom: 108 NOTIMPLEMENTED(); 109 return IDC_ARROW; 110 default: 111 NOTREACHED(); 112 return IDC_ARROW; 113 } 114 } 115 116 } // namespace 117 118 CursorLoader* CursorLoader::Create() { 119 return new CursorLoaderWin; 120 } 121 122 CursorLoaderWin::CursorLoaderWin() { 123 } 124 125 CursorLoaderWin::~CursorLoaderWin() { 126 } 127 128 void CursorLoaderWin::LoadImageCursor(int id, 129 int resource_id, 130 const gfx::Point& hot) { 131 // NOTIMPLEMENTED(); 132 } 133 134 void CursorLoaderWin::LoadAnimatedCursor(int id, 135 int resource_id, 136 const gfx::Point& hot, 137 int frame_delay_ms) { 138 // NOTIMPLEMENTED(); 139 } 140 141 void CursorLoaderWin::UnloadAll() { 142 // NOTIMPLEMENTED(); 143 } 144 145 void CursorLoaderWin::SetPlatformCursor(gfx::NativeCursor* cursor) { 146 if (cursor->native_type() != kCursorCustom) { 147 if (cursor->platform()) { 148 cursor->SetPlatformCursor(cursor->platform()); 149 } else { 150 const wchar_t* cursor_id = GetCursorId(*cursor); 151 PlatformCursor platform_cursor = LoadCursor(NULL, cursor_id); 152 if (!platform_cursor && !g_cursor_resource_module_name.Get().empty()) { 153 platform_cursor = LoadCursor( 154 GetModuleHandle(g_cursor_resource_module_name.Get().c_str()), 155 cursor_id); 156 } 157 cursor->SetPlatformCursor(platform_cursor); 158 } 159 } 160 } 161 162 // static 163 void CursorLoaderWin::SetCursorResourceModule( 164 const base::string16& module_name) { 165 g_cursor_resource_module_name.Get() = module_name; 166 } 167 168 } // namespace ui 169