|
Blender
V2.59
|
00001 /* 00002 * $Id: space_text.c 35883 2011-03-29 16:52:26Z campbellbarton $ 00003 * 00004 * ***** BEGIN GPL LICENSE BLOCK ***** 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU General Public License 00008 * as published by the Free Software Foundation; either version 2 00009 * of the License, or (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software Foundation, 00018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00019 * 00020 * The Original Code is Copyright (C) 2008 Blender Foundation. 00021 * All rights reserved. 00022 * 00023 * 00024 * Contributor(s): Blender Foundation 00025 * 00026 * ***** END GPL LICENSE BLOCK ***** 00027 */ 00028 00034 #include <string.h> 00035 #include <stdio.h> 00036 00037 #include "DNA_text_types.h" 00038 #include "DNA_object_types.h" 00039 00040 #include "MEM_guardedalloc.h" 00041 00042 #include "BLI_blenlib.h" 00043 #include "BLI_math.h" 00044 #include "BLI_rand.h" 00045 #include "BLI_utildefines.h" 00046 00047 #include "BKE_context.h" 00048 #include "BKE_screen.h" 00049 00050 #include "ED_space_api.h" 00051 #include "ED_screen.h" 00052 00053 #include "BIF_gl.h" 00054 00055 #include "WM_api.h" 00056 #include "WM_types.h" 00057 00058 #include "UI_interface.h" 00059 #include "UI_resources.h" 00060 #include "UI_view2d.h" 00061 00062 #include "RNA_access.h" 00063 00064 00065 #include "text_intern.h" // own include 00066 00067 /* ******************** default callbacks for text space ***************** */ 00068 00069 static SpaceLink *text_new(const bContext *UNUSED(C)) 00070 { 00071 ARegion *ar; 00072 SpaceText *stext; 00073 00074 stext= MEM_callocN(sizeof(SpaceText), "inittext"); 00075 stext->spacetype= SPACE_TEXT; 00076 00077 stext->lheight= 12; 00078 stext->tabnumber= 4; 00079 stext->margin_column= 80; 00080 00081 /* header */ 00082 ar= MEM_callocN(sizeof(ARegion), "header for text"); 00083 00084 BLI_addtail(&stext->regionbase, ar); 00085 ar->regiontype= RGN_TYPE_HEADER; 00086 ar->alignment= RGN_ALIGN_BOTTOM; 00087 00088 /* main area */ 00089 ar= MEM_callocN(sizeof(ARegion), "main area for text"); 00090 00091 BLI_addtail(&stext->regionbase, ar); 00092 ar->regiontype= RGN_TYPE_WINDOW; 00093 00094 return (SpaceLink *)stext; 00095 } 00096 00097 /* not spacelink itself */ 00098 static void text_free(SpaceLink *sl) 00099 { 00100 SpaceText *stext= (SpaceText*) sl; 00101 00102 stext->text= NULL; 00103 text_free_caches(stext); 00104 } 00105 00106 00107 /* spacetype; init callback */ 00108 static void text_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa)) 00109 { 00110 00111 } 00112 00113 static SpaceLink *text_duplicate(SpaceLink *sl) 00114 { 00115 SpaceText *stextn= MEM_dupallocN(sl); 00116 00117 /* clear or remove stuff from old */ 00118 00119 stextn->drawcache= NULL; /* space need it's own cache */ 00120 00121 return (SpaceLink *)stextn; 00122 } 00123 00124 static void text_listener(ScrArea *sa, wmNotifier *wmn) 00125 { 00126 SpaceText *st= sa->spacedata.first; 00127 00128 /* context changes */ 00129 switch(wmn->category) { 00130 case NC_TEXT: 00131 /* check if active text was changed, no need to redraw if text isn't active 00132 reference==NULL means text was unlinked, should update anyway for this 00133 case -- no way to know was text active before unlinking or not */ 00134 if(wmn->reference && wmn->reference != st->text) 00135 break; 00136 00137 switch(wmn->data) { 00138 case ND_DISPLAY: 00139 case ND_CURSOR: 00140 ED_area_tag_redraw(sa); 00141 break; 00142 } 00143 00144 switch(wmn->action) { 00145 case NA_EDITED: 00146 if(st->text) { 00147 text_drawcache_tag_update(st, 1); 00148 text_update_edited(st->text); 00149 } 00150 00151 ED_area_tag_redraw(sa); 00152 /* no break -- fall down to tag redraw */ 00153 case NA_ADDED: 00154 case NA_REMOVED: 00155 ED_area_tag_redraw(sa); 00156 break; 00157 } 00158 00159 break; 00160 case NC_SPACE: 00161 if(wmn->data == ND_SPACE_TEXT) 00162 ED_area_tag_redraw(sa); 00163 break; 00164 } 00165 } 00166 00167 static void text_operatortypes(void) 00168 { 00169 WM_operatortype_append(TEXT_OT_new); 00170 WM_operatortype_append(TEXT_OT_open); 00171 WM_operatortype_append(TEXT_OT_reload); 00172 WM_operatortype_append(TEXT_OT_unlink); 00173 WM_operatortype_append(TEXT_OT_save); 00174 WM_operatortype_append(TEXT_OT_save_as); 00175 WM_operatortype_append(TEXT_OT_make_internal); 00176 WM_operatortype_append(TEXT_OT_run_script); 00177 WM_operatortype_append(TEXT_OT_refresh_pyconstraints); 00178 00179 WM_operatortype_append(TEXT_OT_paste); 00180 WM_operatortype_append(TEXT_OT_copy); 00181 WM_operatortype_append(TEXT_OT_cut); 00182 00183 WM_operatortype_append(TEXT_OT_convert_whitespace); 00184 WM_operatortype_append(TEXT_OT_uncomment); 00185 WM_operatortype_append(TEXT_OT_comment); 00186 WM_operatortype_append(TEXT_OT_unindent); 00187 WM_operatortype_append(TEXT_OT_indent); 00188 00189 WM_operatortype_append(TEXT_OT_markers_clear); 00190 WM_operatortype_append(TEXT_OT_next_marker); 00191 WM_operatortype_append(TEXT_OT_previous_marker); 00192 00193 WM_operatortype_append(TEXT_OT_select_line); 00194 WM_operatortype_append(TEXT_OT_select_all); 00195 WM_operatortype_append(TEXT_OT_select_word); 00196 00197 WM_operatortype_append(TEXT_OT_jump); 00198 WM_operatortype_append(TEXT_OT_move); 00199 WM_operatortype_append(TEXT_OT_move_select); 00200 WM_operatortype_append(TEXT_OT_delete); 00201 WM_operatortype_append(TEXT_OT_overwrite_toggle); 00202 00203 WM_operatortype_append(TEXT_OT_selection_set); 00204 WM_operatortype_append(TEXT_OT_cursor_set); 00205 WM_operatortype_append(TEXT_OT_scroll); 00206 WM_operatortype_append(TEXT_OT_scroll_bar); 00207 WM_operatortype_append(TEXT_OT_line_number); 00208 00209 WM_operatortype_append(TEXT_OT_line_break); 00210 WM_operatortype_append(TEXT_OT_insert); 00211 00212 WM_operatortype_append(TEXT_OT_properties); 00213 00214 WM_operatortype_append(TEXT_OT_find); 00215 WM_operatortype_append(TEXT_OT_find_set_selected); 00216 WM_operatortype_append(TEXT_OT_replace); 00217 WM_operatortype_append(TEXT_OT_replace_set_selected); 00218 WM_operatortype_append(TEXT_OT_mark_all); 00219 00220 WM_operatortype_append(TEXT_OT_to_3d_object); 00221 00222 WM_operatortype_append(TEXT_OT_resolve_conflict); 00223 } 00224 00225 static void text_keymap(struct wmKeyConfig *keyconf) 00226 { 00227 wmKeyMap *keymap; 00228 wmKeyMapItem *kmi; 00229 00230 keymap= WM_keymap_find(keyconf, "Text", SPACE_TEXT, 0); 00231 00232 #ifdef __APPLE__ 00233 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN); 00234 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_END); 00235 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", PREV_WORD); 00236 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", NEXT_WORD); 00237 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", UPARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_TOP); 00238 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM); 00239 00240 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_BEGIN); 00241 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_END); 00242 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", PREV_WORD); 00243 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", NEXT_WORD); 00244 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", FILE_TOP); 00245 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM); 00246 00247 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", DEL_PREV_WORD); 00248 00249 WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT|KM_OSKEY, 0); 00250 WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_OSKEY, 0); 00251 WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_OSKEY, 0); 00252 WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0); 00253 WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0); 00254 WM_keymap_add_item(keymap, "TEXT_OT_properties", FKEY, KM_PRESS, KM_OSKEY, 0); 00255 WM_keymap_add_item(keymap, "TEXT_OT_find_set_selected", EKEY, KM_PRESS, KM_OSKEY, 0); 00256 WM_keymap_add_item(keymap, "TEXT_OT_find", GKEY, KM_PRESS, KM_OSKEY, 0); 00257 WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_OSKEY, 0); 00258 WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0); 00259 #endif 00260 00261 kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0); 00262 RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); 00263 RNA_boolean_set(kmi->ptr, "reverse", 0); 00264 00265 kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0); 00266 RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); 00267 RNA_boolean_set(kmi->ptr, "reverse", 1); 00268 00269 kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); 00270 RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); 00271 RNA_boolean_set(kmi->ptr, "reverse", 0); 00272 00273 kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADMINUS, KM_PRESS, KM_CTRL, 0); 00274 RNA_string_set(kmi->ptr, "data_path", "space_data.font_size"); 00275 RNA_boolean_set(kmi->ptr, "reverse", 1); 00276 00277 WM_keymap_add_item(keymap, "TEXT_OT_new", NKEY, KM_PRESS, KM_ALT, 0); 00278 WM_keymap_add_item(keymap, "TEXT_OT_open", OKEY, KM_PRESS, KM_ALT, 0); 00279 WM_keymap_add_item(keymap, "TEXT_OT_reload", RKEY, KM_PRESS, KM_ALT, 0); 00280 WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT, 0); 00281 WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_CTRL, 0); 00282 00283 WM_keymap_add_item(keymap, "TEXT_OT_run_script", PKEY, KM_PRESS, KM_ALT, 0); 00284 00285 WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_CTRL, 0); 00286 WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0); 00287 WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0); 00288 00289 WM_keymap_add_item(keymap, "TEXT_OT_cut", DELKEY, KM_PRESS, KM_SHIFT, 0); 00290 WM_keymap_add_item(keymap, "TEXT_OT_copy", INSERTKEY, KM_PRESS, KM_CTRL, 0); 00291 WM_keymap_add_item(keymap, "TEXT_OT_paste", INSERTKEY, KM_PRESS, KM_SHIFT, 0); 00292 00293 if(U.uiflag & USER_MMB_PASTE) // XXX not dynamic 00294 RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0)->ptr, "selection", 1); 00295 00296 WM_keymap_add_item(keymap, "TEXT_OT_jump", JKEY, KM_PRESS, KM_CTRL, 0); 00297 WM_keymap_add_item(keymap, "TEXT_OT_find", GKEY, KM_PRESS, KM_CTRL, 0); 00298 00299 WM_keymap_add_item(keymap, "TEXT_OT_properties", FKEY, KM_PRESS, KM_CTRL, 0); 00300 WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_CTRL, 0); 00301 00302 WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0); 00303 RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_CTRL, 0)->ptr, "split_lines", 1); 00304 00305 WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0); 00306 WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); 00307 WM_keymap_add_item(keymap, "TEXT_OT_select_word", LEFTMOUSE, KM_DBL_CLICK, 0, 0); 00308 00309 00310 WM_keymap_add_item(keymap, "TEXT_OT_indent", TABKEY, KM_PRESS, 0, 0); 00311 WM_keymap_add_item(keymap, "TEXT_OT_unindent", TABKEY, KM_PRESS, KM_SHIFT, 0); 00312 WM_keymap_add_item(keymap, "TEXT_OT_uncomment", DKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); 00313 00314 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN); 00315 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END); 00316 00317 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", EKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", LINE_END); 00318 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", EKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "type", LINE_END); 00319 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR); 00320 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_CHAR); 00321 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD); 00322 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD); 00323 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_LINE); 00324 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE); 00325 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE); 00326 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE); 00327 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", HOMEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", FILE_TOP); 00328 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", FILE_BOTTOM); 00329 00330 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_BEGIN); 00331 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_END); 00332 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_CHAR); 00333 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_CHAR); 00334 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", PREV_WORD); 00335 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", NEXT_WORD); 00336 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_LINE); 00337 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_LINE); 00338 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_PAGE); 00339 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_PAGE); 00340 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", FILE_TOP); 00341 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", FILE_BOTTOM); 00342 00343 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR); 00344 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_CHAR); 00345 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR); 00346 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_CHAR); /* same as above [#26623] */ 00347 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD); 00348 RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD); 00349 00350 WM_keymap_add_item(keymap, "TEXT_OT_overwrite_toggle", INSERTKEY, KM_PRESS, 0, 0); 00351 00352 WM_keymap_add_item(keymap, "TEXT_OT_scroll", MIDDLEMOUSE, KM_PRESS, 0, 0); 00353 WM_keymap_add_item(keymap, "TEXT_OT_scroll", MOUSEPAN, 0, 0, 0); 00354 WM_keymap_add_item(keymap, "TEXT_OT_scroll_bar", LEFTMOUSE, KM_PRESS, 0, 0); 00355 WM_keymap_add_item(keymap, "TEXT_OT_selection_set", EVT_TWEAK_L, KM_ANY, 0, 0); 00356 WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, 0, 0); 00357 RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_selection_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1); 00358 RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELUPMOUSE, KM_PRESS, 0, 0)->ptr, "lines", -1); 00359 RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELDOWNMOUSE, KM_PRESS, 0, 0)->ptr, "lines", 1); 00360 00361 WM_keymap_add_item(keymap, "TEXT_OT_line_break", RETKEY, KM_PRESS, 0, 0); 00362 WM_keymap_add_item(keymap, "TEXT_OT_line_break", PADENTER, KM_PRESS, 0, 0); 00363 00364 WM_keymap_add_menu(keymap, "TEXT_MT_toolbox", RIGHTMOUSE, KM_PRESS, KM_ANY, 0); 00365 00366 WM_keymap_add_item(keymap, "TEXT_OT_line_number", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); 00367 WM_keymap_add_item(keymap, "TEXT_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last! 00368 } 00369 00370 const char *text_context_dir[] = {"edit_text", NULL}; 00371 00372 static int text_context(const bContext *C, const char *member, bContextDataResult *result) 00373 { 00374 SpaceText *st= CTX_wm_space_text(C); 00375 00376 if(CTX_data_dir(member)) { 00377 CTX_data_dir_set(result, text_context_dir); 00378 return 1; 00379 } 00380 else if(CTX_data_equals(member, "edit_text")) { 00381 CTX_data_id_pointer_set(result, &st->text->id); 00382 return 1; 00383 } 00384 00385 return 0; 00386 } 00387 00388 /********************* main region ********************/ 00389 00390 /* add handlers, stuff you only do once or on area/region changes */ 00391 static void text_main_area_init(wmWindowManager *wm, ARegion *ar) 00392 { 00393 wmKeyMap *keymap; 00394 ListBase *lb; 00395 00396 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy); 00397 00398 /* own keymap */ 00399 keymap= WM_keymap_find(wm->defaultconf, "Text", SPACE_TEXT, 0); 00400 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); 00401 00402 /* add drop boxes */ 00403 lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); 00404 00405 WM_event_add_dropbox_handler(&ar->handlers, lb); 00406 } 00407 00408 static void text_main_area_draw(const bContext *C, ARegion *ar) 00409 { 00410 /* draw entirely, view changes should be handled here */ 00411 SpaceText *st= CTX_wm_space_text(C); 00412 //View2D *v2d= &ar->v2d; 00413 00414 /* clear and setup matrix */ 00415 UI_ThemeClearColor(TH_BACK); 00416 glClear(GL_COLOR_BUFFER_BIT); 00417 00418 // UI_view2d_view_ortho(v2d); 00419 00420 /* data... */ 00421 draw_text_main(st, ar); 00422 00423 /* reset view matrix */ 00424 // UI_view2d_view_restore(C); 00425 00426 /* scrollers? */ 00427 } 00428 00429 static void text_cursor(wmWindow *win, ScrArea *UNUSED(sa), ARegion *UNUSED(ar)) 00430 { 00431 WM_cursor_set(win, BC_TEXTEDITCURSOR); 00432 } 00433 00434 00435 00436 /* ************* dropboxes ************* */ 00437 00438 static int text_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event)) 00439 { 00440 if(drag->type==WM_DRAG_PATH) 00441 if(ELEM(drag->icon, ICON_FILE_SCRIPT, ICON_FILE_BLANK)) /* rule might not work? */ 00442 return 1; 00443 return 0; 00444 } 00445 00446 static void text_drop_copy(wmDrag *drag, wmDropBox *drop) 00447 { 00448 /* copy drag path to properties */ 00449 RNA_string_set(drop->ptr, "filepath", drag->path); 00450 } 00451 00452 /* this region dropbox definition */ 00453 static void text_dropboxes(void) 00454 { 00455 ListBase *lb= WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW); 00456 00457 WM_dropbox_add(lb, "TEXT_OT_open", text_drop_poll, text_drop_copy); 00458 00459 } 00460 00461 /* ************* end drop *********** */ 00462 00463 00464 /****************** header region ******************/ 00465 00466 /* add handlers, stuff you only do once or on area/region changes */ 00467 static void text_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar) 00468 { 00469 ED_region_header_init(ar); 00470 } 00471 00472 static void text_header_area_draw(const bContext *C, ARegion *ar) 00473 { 00474 ED_region_header(C, ar); 00475 } 00476 00477 /****************** properties region ******************/ 00478 00479 /* add handlers, stuff you only do once or on area/region changes */ 00480 static void text_properties_area_init(wmWindowManager *wm, ARegion *ar) 00481 { 00482 ED_region_panels_init(wm, ar); 00483 } 00484 00485 static void text_properties_area_draw(const bContext *C, ARegion *ar) 00486 { 00487 ED_region_panels(C, ar, 1, NULL, -1); 00488 } 00489 00490 /********************* registration ********************/ 00491 00492 /* only called once, from space/spacetypes.c */ 00493 void ED_spacetype_text(void) 00494 { 00495 SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype text"); 00496 ARegionType *art; 00497 00498 st->spaceid= SPACE_TEXT; 00499 strncpy(st->name, "Text", BKE_ST_MAXNAME); 00500 00501 st->new= text_new; 00502 st->free= text_free; 00503 st->init= text_init; 00504 st->duplicate= text_duplicate; 00505 st->operatortypes= text_operatortypes; 00506 st->keymap= text_keymap; 00507 st->listener= text_listener; 00508 st->context= text_context; 00509 st->dropboxes = text_dropboxes; 00510 00511 /* regions: main window */ 00512 art= MEM_callocN(sizeof(ARegionType), "spacetype text region"); 00513 art->regionid = RGN_TYPE_WINDOW; 00514 art->init= text_main_area_init; 00515 art->draw= text_main_area_draw; 00516 art->cursor= text_cursor; 00517 00518 BLI_addhead(&st->regiontypes, art); 00519 00520 /* regions: properties */ 00521 art= MEM_callocN(sizeof(ARegionType), "spacetype text region"); 00522 art->regionid = RGN_TYPE_UI; 00523 art->prefsizex= UI_COMPACT_PANEL_WIDTH; 00524 art->keymapflag= ED_KEYMAP_UI; 00525 00526 art->init= text_properties_area_init; 00527 art->draw= text_properties_area_draw; 00528 BLI_addhead(&st->regiontypes, art); 00529 00530 /* regions: header */ 00531 art= MEM_callocN(sizeof(ARegionType), "spacetype text region"); 00532 art->regionid = RGN_TYPE_HEADER; 00533 art->prefsizey= HEADERY; 00534 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_HEADER; 00535 00536 art->init= text_header_area_init; 00537 art->draw= text_header_area_draw; 00538 00539 BLI_addhead(&st->regiontypes, art); 00540 00541 BKE_spacetype_register(st); 00542 } 00543