Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/src/editfont.c')
-rw-r--r--source/blender/src/editfont.c537
1 files changed, 537 insertions, 0 deletions
diff --git a/source/blender/src/editfont.c b/source/blender/src/editfont.c
new file mode 100644
index 00000000000..fb39c33976f
--- /dev/null
+++ b/source/blender/src/editfont.c
@@ -0,0 +1,537 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+
+#include <fcntl.h>
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_vfont_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_displist.h"
+#include "BKE_font.h"
+#include "BKE_object.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+
+#include "BIF_editfont.h"
+#include "BIF_toolbox.h"
+#include "BIF_space.h"
+#include "BIF_mywindow.h"
+
+#include "BDR_editobject.h"
+
+#include "mydevice.h"
+
+#include "blendef.h"
+
+#define MAXTEXT 1000
+
+int textediting=0;
+
+static char findaccent(char char1, char code)
+{
+ char new= 0;
+
+ if(char1=='a') {
+ if(code=='`') new= 224;
+ else if(code==39) new= 225;
+ else if(code=='^') new= 226;
+ else if(code=='~') new= 227;
+ else if(code=='"') new= 228;
+ else if(code=='o') new= 229;
+ else if(code=='e') new= 230;
+ else if(code=='-') new= 170;
+ }
+ else if(char1=='c') {
+ if(code==',') new= 231;
+ if(code=='|') new= 162;
+ }
+ else if(char1=='e') {
+ if(code=='`') new= 232;
+ else if(code==39) new= 233;
+ else if(code=='^') new= 234;
+ else if(code=='"') new= 235;
+ }
+ else if(char1=='i') {
+ if(code=='`') new= 236;
+ else if(code==39) new= 237;
+ else if(code=='^') new= 238;
+ else if(code=='"') new= 239;
+ }
+ else if(char1=='n') {
+ if(code=='~') new= 241;
+ }
+ else if(char1=='o') {
+ if(code=='`') new= 242;
+ else if(code==39) new= 243;
+ else if(code=='^') new= 244;
+ else if(code=='~') new= 245;
+ else if(code=='"') new= 246;
+ else if(code=='/') new= 248;
+ else if(code=='-') new= 186;
+ else if(code=='e') new= 143;
+ }
+ else if(char1=='s') {
+ if(code=='s') new= 167;
+ }
+ else if(char1=='u') {
+ if(code=='`') new= 249;
+ else if(code==39) new= 250;
+ else if(code=='^') new= 251;
+ else if(code=='"') new= 252;
+ }
+ else if(char1=='y') {
+ if(code==39) new= 253;
+ else if(code=='"') new= 255;
+ }
+ else if(char1=='A') {
+ if(code=='`') new= 192;
+ else if(code==39) new= 193;
+ else if(code=='^') new= 194;
+ else if(code=='~') new= 195;
+ else if(code=='"') new= 196;
+ else if(code=='o') new= 197;
+ else if(code=='e') new= 198;
+ }
+ else if(char1=='C') {
+ if(code==',') new= 199;
+ }
+ else if(char1=='E') {
+ if(code=='`') new= 200;
+ else if(code==39) new= 201;
+ else if(code=='^') new= 202;
+ else if(code=='"') new= 203;
+ }
+ else if(char1=='I') {
+ if(code=='`') new= 204;
+ else if(code==39) new= 205;
+ else if(code=='^') new= 206;
+ else if(code=='"') new= 207;
+ }
+ else if(char1=='N') {
+ if(code=='~') new= 209;
+ }
+ else if(char1=='O') {
+ if(code=='`') new= 210;
+ else if(code==39) new= 211;
+ else if(code=='^') new= 212;
+ else if(code=='~') new= 213;
+ else if(code=='"') new= 214;
+ else if(code=='/') new= 216;
+ else if(code=='e') new= 141;
+ }
+ else if(char1=='U') {
+ if(code=='`') new= 217;
+ else if(code==39) new= 218;
+ else if(code=='^') new= 219;
+ else if(code=='"') new= 220;
+ }
+ else if(char1=='Y') {
+ if(code==39) new= 221;
+ }
+ else if(char1=='1') {
+ if(code=='4') new= 188;
+ if(code=='2') new= 189;
+ }
+ else if(char1=='3') {
+ if(code=='4') new= 190;
+ }
+ else if(char1==':') {
+ if(code=='-') new= 247;
+ }
+ else if(char1=='-') {
+ if(code==':') new= 247;
+ if(code=='|') new= 135;
+ if(code=='+') new= 177;
+ }
+ else if(char1=='|') {
+ if(code=='-') new= 135;
+ if(code=='=') new= 136;
+ }
+ else if(char1=='=') {
+ if(code=='|') new= 136;
+ }
+ else if(char1=='+') {
+ if(code=='-') new= 177;
+ }
+
+ if(new) return new;
+ else return char1;
+}
+
+static char *textbuf=0;
+static char *oldstr;
+
+static int insert_into_textbuf(Curve *cu, char c)
+{
+ if (cu->len<MAXTEXT-1) {
+ int x;
+
+ for(x= cu->len; x>cu->pos; x--) textbuf[x]= textbuf[x-1];
+ textbuf[cu->pos]= c;
+
+ cu->pos++;
+ cu->len++;
+ textbuf[cu->len]='\0';
+
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void do_textedit(unsigned short event, short val, char ascii)
+{
+ Curve *cu;
+ static int accentcode= 0;
+ int x, doit=0, cursmove=0;
+
+ cu= G.obedit->data;
+
+ if(ascii) {
+
+ /* o.a. afvangen van TAB (TAB==9) */
+ if( (ascii > 31 && ascii < 200 && ascii != 127) || (ascii==13) || (ascii==10) || (ascii==8)) {
+
+ if(accentcode) {
+ if(cu->pos>0) textbuf[cu->pos-1]= findaccent(textbuf[cu->pos-1], ascii);
+ accentcode= 0;
+ }
+ else if(cu->len<MAXTEXT-1) {
+ if(G.qual & LR_ALTKEY ) {
+ if(ascii=='t') ascii= 137;
+ else if(ascii=='c') ascii= 169;
+ else if(ascii=='f') ascii= 164;
+ else if(ascii=='g') ascii= 176;
+ else if(ascii=='l') ascii= 163;
+ else if(ascii=='r') ascii= 174;
+ else if(ascii=='s') ascii= 223;
+ else if(ascii=='v') ascii= 1001;
+ else if(ascii=='y') ascii= 165;
+ else if(ascii=='.') ascii= 138;
+ else if(ascii=='1') ascii= 185;
+ else if(ascii=='2') ascii= 178;
+ else if(ascii=='3') ascii= 179;
+ else if(ascii=='%') ascii= 139;
+ else if(ascii=='?') ascii= 191;
+ else if(ascii=='!') ascii= 161;
+ else if(ascii=='x') ascii= 215;
+ else if(ascii=='>') ascii= 187;
+ else if(ascii=='<') ascii= 171;
+ }
+
+ if(ascii==1001) {
+ int file, filelen;
+ char *strp;
+
+/* this should be solved by clipboard support */
+#ifdef __WIN32_DISABLED
+ file= open("C:\\windows\\temp\\cutbuf", O_BINARY|O_RDONLY);
+#else
+ file= open("/tmp/.cutbuffer", O_BINARY|O_RDONLY);
+#endif
+ if(file>0) {
+
+ filelen = BLI_filesize(file);
+
+ strp= MEM_mallocN(filelen+1, "tempstr");
+ read(file, strp, filelen);
+ close(file);
+ strp[filelen]= 0;
+ if(cu->len+filelen<MAXTEXT) {
+ strcat( textbuf, strp);
+ cu->len= strlen(textbuf);
+ cu->pos= cu->len;
+ }
+ MEM_freeN(strp);
+ }
+ }
+ else {
+ insert_into_textbuf(cu, ascii);
+ }
+ }
+
+ doit= 1;
+ }
+ }
+ else if(val) {
+ cursmove= 0;
+
+ switch(event) {
+ case RETKEY:
+ insert_into_textbuf(cu, '\n');
+ doit= 1;
+ break;
+
+ case RIGHTARROWKEY:
+ if(G.qual & LR_SHIFTKEY) {
+ while(cu->pos<cu->len) {
+ if( textbuf[cu->pos]==0) break;
+ if( textbuf[cu->pos]=='\n') break;
+ cu->pos++;
+ }
+ }
+ else {
+ cu->pos++;
+ }
+ cursmove= FO_CURS;
+ break;
+
+ case LEFTARROWKEY:
+
+ if(G.qual & LR_SHIFTKEY) {
+ while(cu->pos>0) {
+ if( textbuf[cu->pos-1]=='\n') break;
+ cu->pos--;
+ }
+ }
+ else {
+ cu->pos--;
+ }
+ cursmove=FO_CURS;
+ break;
+
+ case UPARROWKEY:
+ if(G.qual & LR_SHIFTKEY) {
+ cu->pos= 0;
+ cursmove= FO_CURS;
+ }
+ else if(G.qual & LR_ALTKEY) {
+ if (cu->pos && textbuf[cu->pos - 1] < 255) {
+ textbuf[cu->pos - 1]++;
+ doit= 1;
+ }
+ }
+ else cursmove=FO_CURSUP;
+ break;
+
+ case DOWNARROWKEY:
+ if(G.qual & LR_SHIFTKEY) {
+ cu->pos= cu->len;
+ cursmove= FO_CURS;
+ }
+ else if(G.qual & LR_ALTKEY) {
+ if (cu->pos && textbuf[cu->pos - 1] > 1) {
+ textbuf[cu->pos - 1]--;
+ doit= 1;
+ }
+ }
+ else cursmove= FO_CURSDOWN;
+ break;
+
+ case BACKSPACEKEY:
+ if(cu->len!=0) {
+ if(G.qual & LR_ALTKEY) {
+ if(cu->pos>0) accentcode= 1;
+ }
+ else if(G.qual & LR_SHIFTKEY) {
+ cu->pos= 0;
+ textbuf[0]= 0;
+ cu->len= 0;
+ }
+ else if(cu->pos>0) {
+ for(x=cu->pos;x<=cu->len;x++) textbuf[x-1]= textbuf[x];
+ cu->pos--;
+ textbuf[--cu->len]='\0';
+ }
+ }
+ doit= 1;
+ break;
+ }
+
+ if(cursmove) {
+ if(cu->pos>cu->len) cu->pos= cu->len;
+ else if(cu->pos>=MAXTEXT) cu->pos= MAXTEXT;
+ else if(cu->pos<0) cu->pos= 0;
+ }
+ }
+ if(doit || cursmove) {
+ text_to_curve(G.obedit, cursmove);
+ if(cursmove==0) makeDispList(G.obedit);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+}
+
+void make_editText(void)
+{
+ Curve *cu;
+
+ cu= G.obedit->data;
+ if(textbuf==0) textbuf= MEM_mallocN(MAXTEXT, "texteditbuf");
+ BLI_strncpy(textbuf, cu->str, MAXTEXT);
+ oldstr= cu->str;
+ cu->str= textbuf;
+
+ cu->len= strlen(textbuf);
+ if(cu->pos>cu->len) cu->pos= cu->len;
+
+ text_to_curve(G.obedit, 0);
+ makeDispList(G.obedit);
+
+ textediting= 1;
+}
+
+void load_editText(void)
+{
+ Curve *cu;
+
+ cu= G.obedit->data;
+
+ MEM_freeN(oldstr);
+ oldstr= 0;
+
+ cu->str= MEM_mallocN(cu->len+1, "tekstedit");
+ strcpy(cu->str, textbuf);
+
+ /* this memory system is weak... */
+ MEM_freeN(textbuf);
+ textbuf= 0;
+
+ cu->len= strlen(cu->str);
+ textediting= 0;
+}
+
+void remake_editText(void)
+{
+ Curve *cu;
+
+ if(okee("Reload Original text")==0) return;
+
+ BLI_strncpy(textbuf, oldstr, MAXTEXT);
+ cu= G.obedit->data;
+ cu->len= strlen(textbuf);
+ if(cu->pos>cu->len) cu->pos= cu->len;
+
+ text_to_curve(G.obedit, 0);
+ makeDispList(G.obedit);
+
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+void free_editText(void)
+{
+ if(oldstr) MEM_freeN(oldstr);
+ textbuf= oldstr= 0;
+ textediting= 0;
+}
+
+static VFont *get_builtin_font(void)
+{
+ VFont *vf;
+
+ for (vf= G.main->vfont.first; vf; vf= vf->id.next)
+ if (BLI_streq(vf->name, "<builtin>"))
+ return vf;
+
+ return load_vfont("<builtin>");
+}
+
+void add_primitiveFont(int dummy_argument)
+{
+ Curve *cu;
+
+ if (G.obedit && G.obedit->type==OB_FONT) return;
+ check_editmode(OB_FONT);
+
+ add_object(OB_FONT);
+ base_init_from_view3d(BASACT, G.vd);
+ G.obedit= BASACT->object;
+ where_is_object(G.obedit);
+
+ cu= G.obedit->data;
+
+ cu->vfont= get_builtin_font();
+ cu->vfont->id.us++;
+ cu->str= MEM_mallocN(12, "str");
+ strcpy(cu->str, "Text");
+ cu->pos= 4;
+
+ make_editText();
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+void to_upper(void)
+{
+ Curve *cu;
+ int len, ok;
+ char *str;
+
+ if(G.obedit==0) {
+ return;
+ }
+
+ ok= 0;
+ cu= G.obedit->data;
+
+ len= strlen(cu->str);
+ str= cu->str;
+ while(len) {
+ if( *str>=97 && *str<=122) {
+ ok= 1;
+ *str-= 32;
+ }
+ len--;
+ str++;
+ }
+
+ if(ok==0) {
+ len= strlen(cu->str);
+ str= cu->str;
+ while(len) {
+ if( *str>=65 && *str<=90) {
+ *str+= 32;
+ }
+ len--;
+ str++;
+ }
+ }
+ text_to_curve(G.obedit, 0);
+ makeDispList(G.obedit);
+
+ allqueue(REDRAWVIEW3D, 0);
+
+}
+
+