source: dev/trunk/ab5.0/abdev/abdev/SubOperation.cpp @ 655

Last change on this file since 655 was 655, checked in by dai_9181, 15 years ago

FileManager周りをリファクタリング

File size: 42.9 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5using namespace ActiveBasic::IDE;
6
7void ScreenToClient(HWND hwnd,RECT *pRect){
8    ScreenToClient(hwnd,(POINT *)pRect);
9    ScreenToClient(hwnd,(POINT *)(((long)(void *)pRect)+sizeof(POINT)));
10}
11void ClientToScreen(HWND hwnd,RECT *pRect){
12    ClientToScreen(hwnd,(POINT *)pRect);
13    ClientToScreen(hwnd,(POINT *)(((long)(void *)pRect)+sizeof(POINT)));
14}
15
16
17typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess,PBOOL Wow64Process);
18BOOL IsWow64(void){
19    ///////////////////////////////////////////////////////////
20    // ProjectEditor.exeがWOW64技術で動作しているのかどうか
21    ///////////////////////////////////////////////////////////
22    BOOL bIsWow64 = FALSE;
23    LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
24
25    if (NULL != fnIsWow64Process)
26    {
27        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
28        {
29            // handle error
30            bIsWow64 = FALSE;
31        }
32    }
33    return bIsWow64;
34}
35
36void URLEncode(LPSTR pszSrc){
37    char *temp;
38    temp=(char *)malloc(65535);
39
40    int i,i2;
41    for (i = 0,i2=0; ; i++,i2++)
42    {
43        if(pszSrc[i]=='\0'){
44            temp[i2] = 0;
45            break;
46        }
47
48        // 英数字 _ . - は変換しないでそのまま
49        if (isalnum((BYTE)pszSrc[i]) || pszSrc[i] == '_' || pszSrc[i] == '.' || pszSrc[i] == '-'){
50            temp[i2] = pszSrc[i];
51        }
52        // それ以外は %3B のような形式に変換
53        else{
54            sprintf(temp+i2,"%%%02X", (BYTE)pszSrc[i]);
55            i2+=lstrlen(temp+i2);
56            i2--;
57        }
58    }
59
60    lstrcpy(pszSrc,temp);
61    free(temp);
62}
63
64void Digit(int num,char *buffer){
65    char temporary[255];
66    int i,iPos;
67
68    sprintf(temporary,"%d",abs(num));
69
70    //カンマが不要の場合は抜ける
71    if(lstrlen(temporary)<=3){
72        wsprintf(buffer,"%d",num);
73        return;
74    }
75
76    //合計の文字数からバッファを確保
77    if(num<0){
78        buffer[0]='-';
79        iPos=1;
80    }
81    else{
82        buffer[0]=0;
83        iPos=0;
84    }
85
86    //3桁毎にカンマを加えながら文字列をコピーする
87    int iFirst;
88    iFirst=lstrlen(temporary)%3;
89    if(iFirst==0) iFirst=3;
90    memcpy(buffer+iPos,temporary,iFirst);
91    iPos+=iFirst;
92
93    int i2;
94    i2=(lstrlen(temporary)-4)/3;
95
96    for(i=0;i<=i2;i++){
97        buffer[iPos]=',';
98        iPos++;
99        memcpy(buffer+iPos,temporary+i*3+iFirst,3);
100        iPos+=3;
101        buffer[iPos]=0;
102    }
103}
104
105void RectNaturalFormat(RECT *ReadRect,RECT *CopyRect){
106    if(ReadRect->left > ReadRect->right){
107        CopyRect->left=ReadRect->right;
108        CopyRect->right=ReadRect->left;
109    }
110    else{
111        CopyRect->left=ReadRect->left;
112        CopyRect->right=ReadRect->right;
113    }
114    if(ReadRect->top > ReadRect->bottom){
115        CopyRect->top=ReadRect->bottom;
116        CopyRect->bottom=ReadRect->top;
117    }
118    else{
119        CopyRect->top=ReadRect->top;
120        CopyRect->bottom=ReadRect->bottom;
121    }
122}
123void RectNaturalFormat(int *x1,int *y1,int *x2,int *y2){
124    int temp;
125    if(*x1>*x2){
126        temp=*x1;
127        *x1=*x2;
128        *x2=temp;
129    }
130    if(*y1>*y2){
131        temp=*y1;
132        *y1=*y2;
133        *y2=temp;
134    }
135}
136void KillSpaces(char *str1,char *str2){
137    int i,i2,IsStr;
138    for(i=0,i2=0,IsStr=0;;i++,i2++){
139        while((str1[i]==' '||str1[i]=='\t')&&IsStr==0&&str1[i]!='\0') i++;
140        if(str1[i]=='\"') IsStr^=1;
141        str2[i2]=str1[i];
142        if(str1[i]=='\0') break;
143    }
144}
145void RemoveStringQuotes(char *str){
146    int i;
147    if(str[0]!='\"') return;
148    for(i=0;;i++){
149        str[i]=str[i+1];
150        if(str[i]=='\"') break;
151    }
152    str[i]=0;
153}
154void SlideString(char *buffer, int slide){
155    char *temp;
156    temp=(char *)malloc(lstrlen(buffer)+1);
157    lstrcpy(temp,buffer);
158    lstrcpy(buffer+slide,temp);
159    free(temp);
160}
161void SlideBuffer(char *buffer,int length,int slide){
162    void *temp;
163    temp=malloc(length+1);
164    memcpy(temp,buffer,length);
165    memcpy(buffer+slide,temp,length);
166    free(temp);
167}
168BOOL IsVariableTopChar(char c){
169    if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1;
170    return 0;
171}
172bool IsNumberChar( char c ){
173    if(c>='0'&&c<='9'){
174        return true;
175    }
176    return false;
177}
178BOOL IsVariableChar(char c){
179    if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
180        c=='_'||c=='.'||c=='$') return 1;
181    return 0;
182}
183
184BOOL IsCommandBackDelimitation(char *buffer,int pos){
185    if(buffer[pos]=='\n'||buffer[pos]==':') return 1;
186    return 0;
187}
188BOOL IsCommandDelimitation(char *buffer,int p){
189    if(buffer[p]=='\r'&&buffer[p+1]=='\n') return 2;
190    if(buffer[p]=='\n'||buffer[p]==':'||buffer[p]=='\0') return 1;
191    return 0;
192}
193
194char *ComparisonString( char *str1, char *str2, bool isBigSmall, bool isWordUnit ){
195    char *temp1 = (char *)malloc( lstrlen( str1 ) +1 );
196    char *temp2 = (char *)malloc( lstrlen( str2 ) +1 );
197
198    lstrcpy( temp1, str1 );
199    lstrcpy( temp2, str2 );
200
201    if( isBigSmall == false ){
202        // 大文字小文字を区別しない場合
203        // すべて大文字にしておく
204        CharUpper( temp1 );
205        CharUpper( temp2 );
206    }
207
208    int len2 = lstrlen( temp2 );
209
210    const char *temp3 = strstr( temp1, temp2 );
211    while( temp3 ){
212        if( isWordUnit ){
213            int pos = (int)temp3 - (int)temp1;
214            if( pos == 0 ){
215                if( !( IsVariableTopChar( temp1[len2] ) || IsNumberChar( temp1[len2] ) ) ){
216                        break;
217                }
218            }
219            else{
220                if( !( IsVariableTopChar( temp1[pos-1] ) || IsNumberChar( temp1[pos-1] ) )
221                    && !( IsVariableTopChar( temp1[pos+len2] ) || IsNumberChar( temp1[pos+len2] ) )
222                    ){
223                        break;
224                }
225            }
226        }
227        else{
228            break;
229        }
230
231        temp3 = strstr( temp3 + 1, temp2 );
232    }
233
234    char *result = NULL;
235    if( temp3 ){
236        int pos = (int)temp3 - (int)temp1;
237        result = str1 + pos;
238    }
239
240    free( temp1 );
241    free( temp2 );
242
243    return result;
244}
245int GetOneParameter(char *Parameter,int pos,char *retAns){
246    int i,i2,IsStr,PareNum;
247    for(i=pos,i2=0,IsStr=0,PareNum=0;;i++,i2++){
248        if(IsDBCSLeadByte(Parameter[i])){
249            retAns[i2]=Parameter[i];
250            retAns[++i2]=Parameter[++i];
251            continue;
252        }
253        if(Parameter[i]=='\"') IsStr^=1;
254        if(Parameter[i]=='('&&IsStr==0) PareNum++;
255        if(Parameter[i]==')'&&IsStr==0) PareNum--;
256        if(Parameter[i]==','&&IsStr==0&&PareNum==0){
257            retAns[i2]=0;
258            break;
259        }
260        retAns[i2]=Parameter[i];
261        if(Parameter[i]=='\0'||Parameter[i]=='\r'&&Parameter[i+1]=='\n'){
262            retAns[i2]=0;
263            break;
264        }
265    }
266    if(Parameter[i]==',') i++;
267    return i;
268}
269int GetStringInPare(char *buffer,char *ReadBuffer){
270    int i,IsStr,PareNum;
271    for(i=0,IsStr=0,PareNum=0;;i++){
272        buffer[i]=ReadBuffer[i];
273        if(ReadBuffer[i]=='\"') IsStr^=1;
274        else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
275        else if(ReadBuffer[i]==')'&&IsStr==0){
276            PareNum--;
277            if(PareNum==0){
278                i++;
279                buffer[i]=0;
280                break;
281            }
282        }
283        else if(ReadBuffer[i]=='\0') return 0;
284    }
285    return i;
286}
287int GetStringInBracket(char *buffer,char *ReadBuffer){
288    int i,IsStr,PareNum;
289    for(i=0,IsStr=0,PareNum=0;;i++){
290        buffer[i]=ReadBuffer[i];
291        if(IsDBCSLeadByte(ReadBuffer[i])){
292            i++;
293            buffer[i]=ReadBuffer[i];
294            continue;
295        }
296        if(ReadBuffer[i]=='\"') IsStr^=1;
297        else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
298        else if(ReadBuffer[i]==']'&&IsStr==0){
299            PareNum--;
300            if(PareNum==0){
301                i++;
302                buffer[i]=0;
303                break;
304            }
305        }
306        else if(ReadBuffer[i]=='\0') return 0;
307    }
308    return i;
309}
310void JumpBlank(char *pBuf,int *piPos){
311    int i;
312    i=*piPos;
313
314    while(1){
315        while(pBuf[i]==' '||pBuf[i]=='\t') i++;
316        if(pBuf[i]=='\0') break;
317        if(pBuf[i]=='\''){
318            //注釈文(一行)
319            for(i++;;i++){
320                if(pBuf[i]=='\0') break;
321                if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
322                    i+=2;
323                    break;
324                }
325            }
326            while(pBuf[i]==' '||pBuf[i]=='\t') i++;
327        }
328        if(pBuf[i]=='/'&&pBuf[i+1]=='*'){
329            //注釈文(複数行)
330            i+=2;
331            while(!(pBuf[i]=='*'&&pBuf[i+1]=='/')){
332                i++;
333                if(pBuf[i]=='\0') break;
334            }
335            if(pBuf[i]){
336                i+=2;
337            }
338        }
339        while(pBuf[i]=='\r'&&pBuf[i+1]=='\n') i+=2;
340
341        if(!(
342            pBuf[i]==' '||
343            pBuf[i]=='\t'||
344            pBuf[i]=='\''||
345            (pBuf[i]=='/'&&pBuf[i+1]=='*')
346            )) break;
347    }
348
349    *piPos=i;
350}
351
352BOOL CheckParenthesis(char *buffer){
353    int i,IsStr,PareNum,sw;
354    _int8 bracket[1024];
355
356    for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
357        if(buffer[i]=='\"'){
358            IsStr^=1;
359            continue;
360        }
361
362        else if(buffer[i]=='('&&IsStr==0){
363            bracket[PareNum]=0;
364            PareNum++;
365        }
366        else if(buffer[i]=='['&&IsStr==0){
367            bracket[PareNum]=1;
368            PareNum++;
369        }
370
371        else if(buffer[i]==')'&&IsStr==0){
372            PareNum--;
373            if(bracket[PareNum]!=0||PareNum<0){
374                //"カッコ \'( )\'"
375                return 0;
376            }
377        }
378        else if(buffer[i]==']'&&IsStr==0){
379            PareNum--;
380            if(bracket[PareNum]!=1||PareNum<0){
381                //"カッコ \'( )\'"
382                return 0;
383            }
384        }
385
386        else if(buffer[i]=='\n'||buffer[i]=='\0'){
387
388            //"カッコ \'( )\'"
389            if(buffer[i]=='\0'){
390                if(PareNum!=0){
391                    return 0;
392                }
393
394                if(IsStr!=0){
395                    return 0;
396                }
397            }
398            if(buffer[i]=='\0') break;
399
400            sw=0;
401        }
402    }
403    return 1;
404}
405
406DWORD GetValue(char *value){
407    unsigned long ans;
408    if(value[0]=='&'){
409        if(value[1]=='o'||value[1]=='O') sscanf(value+2,"%o",&ans);
410        if(value[1]=='h'||value[1]=='H') sscanf(value+2,"%x",&ans);
411    }
412    else ans=atol(value);
413    return ans;
414}
415BOOL IsManagementCommand(int ComNum){
416    switch(ComNum){
417        case -1:
418        case COM_ABSTRACT:
419        case COM_CLASS:
420        case COM_CONST:
421        case COM_DEBUG:
422        case COM_DECLARE:
423        case COM_DEF:
424        case COM_DIM:
425        case COM_DO:
426        case COM_END:
427        case COM_ENUM:
428        case COM_FOR:
429        case COM_FUNCTION:
430        case COM_GOSUB:
431        case COM_GOTO:
432        case COM_IF:
433        case COM_INHERITS:
434        case COM_INTERFACE:
435        case COM_LOOP:
436        case COM_NAMESPACE:
437        case COM_NEXT:
438        case COM_PRIVATE:
439        case COM_PROTECTED:
440        case COM_PUBLIC:
441        case COM_RETURN:
442        case COM_SELECT:
443        case COM_SUB:
444        case COM_TRY:
445        case COM_TYPE:
446        case COM_TYPEDEF:
447        case COM_VIRTUAL:
448        case COM_OVERRIDE:
449        case COM_WEND:
450        case COM_WHILE:
451        case COM_WITH:
452            return 1;
453        default:
454            break;
455    }
456    return 0;
457}
458int IsBasicReservedWord(char *str){
459    if(str[0]=='a'||str[0]=='A'){
460        if(lstrcmpi(str,"Abstract")==0) return COM_ABSTRACT;
461        if(lstrcmpi(str,"As")==0) return -1;
462    }
463    else if(str[0]=='b'||str[0]=='B'){
464        if(lstrcmpi(str,"Beep")==0) return COM_BEEP;
465        if(lstrcmp(str,"Boolean")==0) return -1;
466        if(lstrcmpi(str,"ByRef")==0) return -1;
467        if(lstrcmpi(str,"ByVal")==0) return -1;
468        if(lstrcmp(str,"Byte")==0) return -1;
469    }
470    else if(str[0]=='c'||str[0]=='C'){
471        if(lstrcmpi(str,"Catch")==0) return -1;
472        if(lstrcmpi(str,"Case")==0) return -1;
473        if(lstrcmp(str,"Char")==0) return -1;
474        if(lstrcmpi(str,"ChDir")==0) return COM_CHDIR;
475        if(lstrcmpi(str,"Circle")==0) return COM_CIRCLE;
476        if(lstrcmpi(str,"Class")==0) return COM_CLASS;
477        if(lstrcmpi(str,"Close")==0) return COM_CLOSE;
478        if(lstrcmpi(str,"Cls")==0) return COM_CLS;
479        if(lstrcmpi(str,"Color")==0) return COM_COLOR;
480        if(lstrcmpi(str,"Const")==0) return COM_CONST;
481        if(lstrcmpi(str,"Continue")==0) return -1;
482    }
483    else if(str[0]=='d'||str[0]=='D'){
484        if(lstrcmpi(str,"Debug")==0) return COM_DEBUG;
485        if(lstrcmpi(str,"Declare")==0) return COM_DECLARE;
486        if(lstrcmpi(str,"Def")==0) return COM_DEF;
487        if(lstrcmpi(str,"Delegate")==0) return -1;
488        if(lstrcmpi(str,"Delete")==0) return -1;
489        if(lstrcmpi(str,"DelWnd")==0) return COM_DELWND;
490        if(lstrcmpi(str,"Dim")==0) return COM_DIM;
491        if(lstrcmpi(str,"Do")==0) return COM_DO;
492        if(lstrcmp(str,"Double")==0) return -1;
493        if(lstrcmp(str,"DWord")==0) return -1;
494    }
495    else if(str[0]=='e'||str[0]=='E'){
496        if(lstrcmpi(str,"Else")==0) return -1;
497        if(lstrcmpi(str,"ElseIf")==0) return -1;
498        if(lstrcmpi(str,"End")==0) return COM_END;
499        if(lstrcmpi(str,"EndIf")==0) return -1;
500        if(lstrcmpi(str,"EndFunction")==0) return -1;
501        if(lstrcmpi(str,"EndSub")==0) return -1;
502        if(lstrcmpi(str,"EndType")==0) return -1;
503        if(lstrcmpi(str,"EndSelect")==0) return -1;
504        if(lstrcmpi(str,"EndWith")==0) return -1;
505        if(lstrcmpi(str,"Enum")==0) return COM_ENUM;
506        if(lstrcmpi(str,"Exit")==0) return -1;
507        if(lstrcmpi(str,"ExitDo")==0) return -1;
508        if(lstrcmpi(str,"ExitFor")==0) return -1;
509        if(lstrcmpi(str,"ExitFunction")==0) return -1;
510        if(lstrcmpi(str,"ExitSub")==0) return -1;
511        if(lstrcmpi(str,"ExitWhile")==0) return -1;
512    }
513    else if(str[0]=='f'||str[0]=='F'){
514        if(lstrcmp(str,"False")==0) return -1;
515        if(lstrcmpi(str,"Field")==0) return COM_FIELD;
516        if(lstrcmpi(str,"Finally")==0) return -1;
517        if(lstrcmpi(str,"For")==0) return COM_FOR;
518        if(lstrcmpi(str,"Foreach")==0) return -1;
519        if(lstrcmpi(str,"Function")==0) return COM_FUNCTION;
520    }
521    else if(str[0]=='g'||str[0]=='G'){
522        if(lstrcmpi(str,"Get")==0) return COM_GET;
523        if(lstrcmpi(str,"GoSub")==0) return COM_GOSUB;
524        if(lstrcmpi(str,"Goto")==0) return COM_GOTO;
525    }
526    else if(str[0]=='i'||str[0]=='I'){
527        if(lstrcmpi(str,"If")==0) return COM_IF;
528        if(lstrcmpi(str,"Imports")==0) return -1;
529        if(lstrcmpi(str,"Implements")==0) return -1;
530        if(lstrcmpi(str,"In")==0) return -1;
531        if(lstrcmpi(str,"Inherits")==0) return COM_INHERITS;
532        if(lstrcmpi(str,"Input")==0) return COM_INPUT;
533        if(lstrcmp(str,"Int64")==0) return -1;
534        if(lstrcmp(str,"Integer")==0) return -1;
535        if(lstrcmpi(str,"Interface")==0) return COM_INTERFACE;
536    }
537    else if(str[0]=='k'||str[0]=='K'){
538        if(lstrcmpi(str,"Kill")==0) return COM_KILL;
539    }
540    else if(str[0]=='l'||str[0]=='L'){
541        if(lstrcmpi(str,"Let")==0) return COM_LET;
542        if(lstrcmpi(str,"Line")==0) return COM_LINE;
543        if(lstrcmpi(str,"Locate")==0) return COM_LOCATE;
544        if(lstrcmp(str,"Long")==0) return -1;
545        if(lstrcmpi(str,"Loop")==0) return COM_LOOP;
546    }
547    else if(str[0]=='m'||str[0]=='M'){
548        if(lstrcmpi(str,"MkDir")==0) return COM_MKDIR;
549        if(lstrcmpi(str,"MsgBox")==0) return COM_MSGBOX;
550    }
551    else if(str[0]=='n'||str[0]=='N'){
552        if(lstrcmpi(str,"Namespace")==0) return COM_NAMESPACE;
553        if(lstrcmpi(str,"Next")==0) return COM_NEXT;
554        if(lstrcmpi(str,"New")==0) return -1;
555        if(lstrcmpi(str,"Nothing")==0) return -1;
556    }
557    else if(str[0]=='o'||str[0]=='O'){
558        if(lstrcmp(str,"Object")==0) return -1;
559        if(lstrcmpi(str,"Open")==0) return COM_OPEN;
560        if(lstrcmpi(str,"Operator")==0) return -1;
561        if(lstrcmpi(str,"Override")==0) return COM_OVERRIDE;
562    }
563    else if(str[0]=='p'||str[0]=='P'){
564        if(lstrcmpi(str,"Paint")==0) return COM_PAINT;
565        if(lstrcmpi(str,"Print")==0) return COM_PRINT;
566        if(lstrcmpi(str,"Private")==0) return COM_PRIVATE;
567        if(lstrcmpi(str,"Protected")==0) return COM_PROTECTED;
568        if(lstrcmpi(str,"PSet")==0) return COM_PSET;
569        if(lstrcmpi(str,"Put")==0) return COM_PUT;
570        if(lstrcmpi(str,"Public")==0) return COM_PUBLIC;
571    }
572    else if(str[0]=='q'||str[0]=='Q'){
573        if(lstrcmp(str,"QWord")==0) return -1;
574    }
575    else if(str[0]=='r'||str[0]=='R'){
576        if(lstrcmpi(str,"Randomize")==0) return COM_RANDOMIZE;
577        if(lstrcmpi(str,"Rem")==0) return COM_REM;
578        if(lstrcmpi(str,"Return")==0) return COM_RETURN;
579    }
580    else if(str[0]=='s'||str[0]=='S'){
581        if(lstrcmp(str,"SByte")==0) return -1;
582        if(lstrcmpi(str,"Select")==0) return COM_SELECT;
583        if(lstrcmpi(str,"SelectCase")==0) return COM_SELECT;
584        if(lstrcmp(str,"Single")==0) return -1;
585        if(lstrcmpi(str,"Sleep")==0) return COM_SLEEP;
586        if(lstrcmp(str,"Static")==0) return -1;
587        if(lstrcmpi(str,"Step")==0) return -1;
588        if(lstrcmp(str,"String")==0) return -1;
589        if(lstrcmpi(str,"Sub")==0) return COM_SUB;
590        if(lstrcmpi(str,"Super")==0) return -1;
591    }
592    else if(str[0]=='t'||str[0]=='T'){
593        if(lstrcmpi(str,"Then")==0) return -1;
594        if(lstrcmpi(str,"This")==0) return -1;
595        if(lstrcmpi(str,"Throw")==0) return -1;
596        if(lstrcmpi(str,"To")==0) return -1;
597        if(lstrcmp(str,"True")==0) return -1;
598        if(lstrcmp(str,"Try")==0) return COM_TRY;
599        if(lstrcmpi(str,"Type")==0) return COM_TYPE;
600        if(lstrcmpi(str,"TypeDef")==0) return COM_TYPEDEF;
601    }
602    else if(str[0]=='u'||str[0]=='U'){
603        if(lstrcmpi(str,"Until")==0) return -1;
604    }
605    else if(str[0]=='v'||str[0]=='V'){
606        if(lstrcmpi(str,"Virtual")==0) return COM_VIRTUAL;
607    }
608    else if(str[0]=='w'||str[0]=='W'){
609        if(lstrcmpi(str,"Wend")==0) return COM_WEND;
610        if(lstrcmpi(str,"While")==0) return COM_WHILE;
611        if(lstrcmpi(str,"Window")==0) return COM_WINDOW;
612        if(lstrcmpi(str,"With")==0) return COM_WITH;
613        if(lstrcmp(str,"Word")==0) return -1;
614        if(lstrcmpi(str,"Write")==0) return COM_WRITE;
615    }
616    else if(str[0]=='#'){
617        if(lstrcmpi(str,"#include")==0) return -1;
618        if(lstrcmpi(str,"#strict")==0) return -1;
619        if(lstrcmpi(str,"#console")==0) return -1;
620        if(lstrcmpi(str,"#prompt")==0) return -1;
621        if(lstrcmpi(str,"#N88BASIC")==0) return -1;
622        if(lstrcmpi(str,"#define")==0) return -1;
623        if(lstrcmpi(str,"#ifdef")==0) return -1;
624        if(lstrcmpi(str,"#ifndef")==0) return -1;
625        if(lstrcmpi(str,"#else")==0) return -1;
626        if(lstrcmpi(str,"#endif")==0) return -1;
627    }
628    return 0;
629}
630
631HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
632    //グラデーションビットマップを生成
633
634    BITMAPINFO BitmapInfo;
635    memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
636    BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
637    BitmapInfo.bmiHeader.biWidth=pSize->cx;
638    BitmapInfo.bmiHeader.biHeight=pSize->cy;
639    BitmapInfo.bmiHeader.biPlanes=1;
640    BitmapInfo.bmiHeader.biBitCount=24;
641
642    HDC hdc;
643    hdc=GetDC(GetDesktopWindow());
644
645    HBITMAP hBitmap;
646    BYTE *pByte;
647    hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
648
649    int i,i2,x,y;
650    COLORREF rgb;
651    i=BitmapInfo.bmiHeader.biWidth*3;
652    if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
653    for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
654        if(y<BitmapInfo.bmiHeader.biHeight/2-2) rgb=color2;
655        else if(y>BitmapInfo.bmiHeader.biHeight/2+2) rgb=color1;
656        else{
657            double ratio;
658            ratio=((double)y-((double)BitmapInfo.bmiHeader.biHeight/(double)2-(double)2))/(double)4;
659            //ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight;
660            rgb=RGB(
661                LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio),    //赤要素
662                HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio),    //緑要素
663                LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio)     //青要素
664                );
665        }
666        for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
667            i2=y*i+x*3;
668            pByte[i2+2]=LOBYTE(LOWORD(rgb));
669            pByte[i2+1]=HIBYTE(LOWORD(rgb));
670            pByte[i2]=LOBYTE(HIWORD(rgb));
671        }
672    }
673
674    ReleaseDC(GetDesktopWindow(),hdc);
675
676    return hBitmap;
677}
678HBITMAP CreateVertGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
679    //グラデーションビットマップを生成
680
681    BITMAPINFO BitmapInfo;
682    memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
683    BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
684    BitmapInfo.bmiHeader.biWidth=pSize->cx;
685    BitmapInfo.bmiHeader.biHeight=pSize->cy;
686    BitmapInfo.bmiHeader.biPlanes=1;
687    BitmapInfo.bmiHeader.biBitCount=24;
688
689    HDC hdc;
690    hdc=GetDC(GetDesktopWindow());
691
692    HBITMAP hBitmap;
693    BYTE *pByte;
694    hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
695
696    int i,i2,x,y;
697    COLORREF rgb;
698    i=BitmapInfo.bmiHeader.biWidth*3;
699    if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
700    for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
701        if(y<BitmapInfo.bmiHeader.biHeight/2-2) rgb=color2;
702        else if(y>BitmapInfo.bmiHeader.biHeight/2+2) rgb=color1;
703        else{
704            double ratio;
705            ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight;
706            rgb=RGB(
707                LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio),    //赤要素
708                HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio),    //緑要素
709                LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio)     //青要素
710                );
711        }
712        for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
713            i2=y*i+x*3;
714            pByte[i2+2]=LOBYTE(LOWORD(rgb));
715            pByte[i2+1]=HIBYTE(LOWORD(rgb));
716            pByte[i2]=LOBYTE(HIWORD(rgb));
717        }
718    }
719
720    ReleaseDC(GetDesktopWindow(),hdc);
721
722    return hBitmap;
723}
724HBITMAP CreateHorzGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
725    //グラデーションビットマップを生成
726
727    BITMAPINFO BitmapInfo;
728    memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
729    BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
730    BitmapInfo.bmiHeader.biWidth=pSize->cx;
731    BitmapInfo.bmiHeader.biHeight=pSize->cy;
732    BitmapInfo.bmiHeader.biPlanes=1;
733    BitmapInfo.bmiHeader.biBitCount=24;
734
735    HDC hdc;
736    hdc=GetDC(GetDesktopWindow());
737
738    HBITMAP hBitmap;
739    BYTE *pByte;
740    hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
741
742    int i,i2,x,y;
743    COLORREF rgb;
744    i=BitmapInfo.bmiHeader.biWidth*3;
745    if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
746    for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
747        double ratio;
748        ratio=(double)x/(double)BitmapInfo.bmiHeader.biWidth;
749        rgb=RGB(
750            LOBYTE(LOWORD(color1))+(int)(double)(LOBYTE(LOWORD(color2))-LOBYTE(LOWORD(color1)))*(ratio),    //赤要素
751            HIBYTE(LOWORD(color1))+(int)(double)(HIBYTE(LOWORD(color2))-HIBYTE(LOWORD(color1)))*(ratio),    //緑要素
752            LOBYTE(HIWORD(color1))+(int)(double)(LOBYTE(HIWORD(color2))-LOBYTE(HIWORD(color1)))*(ratio)     //青要素
753            );
754        for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
755            i2=y*i+x*3;
756            pByte[i2+2]=LOBYTE(LOWORD(rgb));
757            pByte[i2+1]=HIBYTE(LOWORD(rgb));
758            pByte[i2]=LOBYTE(HIWORD(rgb));
759        }
760    }
761
762    ReleaseDC(GetDesktopWindow(),hdc);
763
764    return hBitmap;
765}
766HICON CreateGrayIcon(HICON hBaseIcon){
767    ////////////////////////
768    // 淡色アイコンを生成
769    ////////////////////////
770
771    HICON hGrayIcon;
772
773    ICONINFO IconInfo;
774    GetIconInfo(hBaseIcon,&IconInfo);
775
776
777    //ビットマップを加工
778    BITMAP Bitmap;
779    GetObject(IconInfo.hbmColor,sizeof(Bitmap),&Bitmap);
780
781    BITMAPINFO BitmapInfo;
782    memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
783    BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
784    BitmapInfo.bmiHeader.biWidth=Bitmap.bmWidth;
785    BitmapInfo.bmiHeader.biHeight=Bitmap.bmHeight;
786    BitmapInfo.bmiHeader.biPlanes=1;
787    BitmapInfo.bmiHeader.biBitCount=24;
788    BitmapInfo.bmiHeader.biCompression=BI_RGB;
789
790    HDC hdc;
791    hdc=GetDC(GetDesktopWindow());
792
793    BYTE *pByte;
794    pByte=(BYTE *)HeapAlloc(hHeap,0,Bitmap.bmWidth*Bitmap.bmHeight*sizeof(COLORREF));
795    GetDIBits(hdc,
796        IconInfo.hbmColor,
797        0,
798        Bitmap.bmHeight,
799        (void *)pByte,
800        &BitmapInfo,
801        DIB_RGB_COLORS);
802
803    int i,i2,x,y;
804    i=BitmapInfo.bmiHeader.biWidth*3;
805    if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
806    for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
807        for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
808            i2=y*i+x*3;
809            if(pByte[i2+2]==0&&pByte[i2+1]==0&&pByte[i2]==0){
810                //透明色
811                //何もしない
812            }
813            else{
814                double ratio=0.5;   //明るさ
815
816                pByte[i2+2]+=(BYTE)((double)(255-pByte[i2+2])*ratio);
817                pByte[i2+1]+=(BYTE)((double)(255-pByte[i2+1])*ratio);
818                pByte[i2]+=(BYTE)((double)(255-pByte[i2])*ratio);
819
820                pByte[i2+2]=(BYTE)(((int)pByte[i2+2]+(int)pByte[i2+1]+(int)pByte[i2])/3);
821                pByte[i2+1]=pByte[i2+2];
822                pByte[i2]=pByte[i2+2];
823            }
824        }
825    }
826
827    SetDIBits(hdc,
828        IconInfo.hbmColor,
829        0,
830        Bitmap.bmHeight,
831        (void *)pByte,
832        &BitmapInfo,
833        DIB_RGB_COLORS);
834
835    HeapDefaultFree(pByte);
836
837    ReleaseDC(GetDesktopWindow(),hdc);
838
839
840    hGrayIcon=CreateIconIndirect(&IconInfo);
841
842    //不要なビットマップを破棄
843    DeleteObject(IconInfo.hbmMask);
844    DeleteObject(IconInfo.hbmColor);
845
846    return hGrayIcon;
847}
848void GetSize(SIZE *pSize,RECT *pRect){
849    pSize->cx=pRect->right-pRect->left;
850    pSize->cy=pRect->bottom-pRect->top;
851}
852BOOL HitTest(RECT *pRect,POINT *pPos){
853    if(pRect->left<=pPos->x&&pPos->x<pRect->right&&
854        pRect->top<=pPos->y&&pPos->y<pRect->bottom) return 1;
855    return 0;
856}
857BOOL Rectangle(HDC hdc,RECT *pRect){
858    return Rectangle(hdc,pRect->left,pRect->top,pRect->right,pRect->bottom);
859}
860
861void ComboBox_SetSelText(HWND hCombo,char *lpszText){
862    SendMessage(hCombo,CB_SETCURSEL,
863        SendMessage(hCombo,CB_FINDSTRINGEXACT,0,(LPARAM)lpszText),
864        0);
865}
866
867void SetCursorByState(int state){
868    if(state==FRAME_UPPER_LEFT||state==FRAME_LOWER_RIGHT) SetCursor(LoadCursor(0,IDC_SIZENWSE));
869    else if(state==FRAME_UPPER_RIGHT||state==FRAME_LOWER_LEFT) SetCursor(LoadCursor(0,IDC_SIZENESW));
870    else if(state==FRAME_LEFT||state==FRAME_RIGHT) SetCursor(LoadCursor(0,IDC_SIZEWE));
871    else if(state==FRAME_UPPER||state==FRAME_LOWER) SetCursor(LoadCursor(0,IDC_SIZENS));
872    else if(state==FRAME_INSIDE) SetCursor(LoadCursor(0,IDC_SIZEALL));
873    else SetCursor(LoadCursor(0,IDC_ARROW));
874}
875
876void SetTextEditColorDesign(TEXTEDIT_COLOR_INFO *pColorInfo,CTheme *pobj_Theme,BOOL bRedraw){
877    pColorInfo->rgbDefault=pobj_Theme->TextColorInfo.rgbDefault;
878    pColorInfo->rgbComment=pobj_Theme->TextColorInfo.rgbComment;
879    pColorInfo->rgbStatement=pobj_Theme->TextColorInfo.rgbStatement;
880    pColorInfo->rgbString=pobj_Theme->TextColorInfo.rgbString;
881    pColorInfo->rgbCursorBack=pobj_Theme->TextColorInfo.rgbCursorBack;
882    pColorInfo->rgbBackground=pobj_Theme->TextColorInfo.rgbBackground;
883
884    //アクティブテーマにセット
885    lstrcpy(pobj_nv->szActiveTheme,pobj_Theme->m_name);
886
887    //テーマ依存の描画リソースを取得
888    pobj_DBTheme->unlock();
889    pobj_DBTheme->lock();
890
891    if(bRedraw){
892        //再描画
893        int i;
894        for(i=0;i<MdiInfo.size();i++){
895            if(MdiInfo[i]->hwnd){
896                if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
897                    SetTextEditWordColor(i);
898                    InvalidateRect(MdiInfo[i]->pMdiTextEdit->hEdit,NULL,0);
899                }
900            }
901        }
902    }
903}
904
905BOOL SetupProjectEditor(void){
906    extern HINSTANCE hInst;
907    int i;
908    char str[MAX_PATH],temporary[MAX_PATH];
909
910
911    //リソース用DLLをマッピング
912    const std::string resDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\res.dll";
913    hResInst = LoadLibrary( resDllPath.c_str() );
914
915    //アイコンリソースDLLをマッピング
916    const std::string iconResDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\icon_res.dll";
917    hIconResInst = LoadLibrary( iconResDllPath.c_str() );
918
919    //LuxCtrl.dllをマッピング
920    const std::string luxCtrlDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\LuxCtrl.dll";
921    hLib_LuxCtrl = LoadLibrary( luxCtrlDllPath.c_str() );
922    if(!hLib_LuxCtrl){
923        MessageBox(0,"LuxCtrl.dllの読み込みに失敗しました。",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
924        return 0;
925    }
926    LuxToolbar_CreateInstance=
927        (PROC_LuxToolbar_CreateInstance)GetProcAddress(hLib_LuxCtrl,"LuxToolbar_CreateInstance");
928
929
930    //モジュールディレクトリを取得
931    GetModuleFileName(hInst,temporary,MAX_PATH);
932    _splitpath(temporary,pj_editor_Dir,str,NULL,NULL);
933    lstrcat(pj_editor_Dir,str);
934
935    //ヒープオブジェクトを作成
936    extern HANDLE hHeap;
937    hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0);
938
939
940    //自動バックアップ用のディレクトリを生成
941    CreateBackupDir();
942
943
944    //COMを初期化
945    CoInitialize(0);
946
947    //スクリーンサイズを取得
948    ScreenX=GetSystemMetrics(SM_CXSCREEN);
949    ScreenY=GetSystemMetrics(SM_CYSCREEN);
950
951    //不揮発性のデータを取得
952    pobj_nv=new CNonVolatile;
953    pobj_nv->load();
954
955
956    //アルファブレンド用のAPIを取得
957    extern FWINLAYER pSetLayeredWindowAttributes;
958    extern HINSTANCE hUser32Lib;
959    hUser32Lib=LoadLibrary("user32.dll");
960    pSetLayeredWindowAttributes=(FWINLAYER)GetProcAddress(hUser32Lib,"pSetLayeredWindowAttributes");
961
962
963
964
965    /////////////////////
966    // フォントを定義
967    /////////////////////
968
969    //パラメータ ヒント フォント
970    extern METHODCHECKINFO MethodCheckInfo;
971    MethodCheckInfo.hFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
972    i=MethodCheckInfo.LogFont.lfWeight;
973    MethodCheckInfo.LogFont.lfWeight=FW_BOLD;
974    MethodCheckInfo.hBoldFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
975    MethodCheckInfo.LogFont.lfWeight=i;
976
977    //ステータスバー フォント
978    LOGFONT LogFont;
979    extern HFONT hStatusFont;
980    LogFont.lfHeight=-12;
981    LogFont.lfWidth=0;
982    LogFont.lfEscapement=0;
983    LogFont.lfOrientation=0;
984    LogFont.lfWeight=FW_REGULAR;
985    LogFont.lfItalic=NULL;
986    LogFont.lfUnderline=NULL;
987    LogFont.lfStrikeOut=NULL;
988    LogFont.lfCharSet=SHIFTJIS_CHARSET;
989    LogFont.lfOutPrecision=OUT_STRING_PRECIS;
990    LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
991    LogFont.lfQuality=DRAFT_QUALITY;
992    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
993    sprintf(LogFont.lfFaceName,"MS Pゴシック");
994    hStatusFont=CreateFontIndirect(&LogFont);
995
996    //ハイパーリンク フォント
997    extern HFONT hHyperLinkFont;
998    LogFont.lfHeight=-12;
999    LogFont.lfWidth=0;
1000    LogFont.lfEscapement=0;
1001    LogFont.lfOrientation=0;
1002    LogFont.lfWeight=FW_REGULAR;
1003    LogFont.lfItalic=NULL;
1004    LogFont.lfUnderline=TRUE;
1005    LogFont.lfStrikeOut=NULL;
1006    LogFont.lfCharSet=SHIFTJIS_CHARSET;
1007    LogFont.lfOutPrecision=OUT_STRING_PRECIS;
1008    LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
1009    LogFont.lfQuality=DRAFT_QUALITY;
1010    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
1011    sprintf(LogFont.lfFaceName,"MS Pゴシック");
1012    hHyperLinkFont=CreateFontIndirect(&LogFont);
1013
1014    //ルーラー フォント
1015    extern HFONT hRulerFont;
1016    LogFont.lfHeight=-10;
1017    LogFont.lfWidth=0;
1018    LogFont.lfEscapement=0;
1019    LogFont.lfOrientation=0;
1020    LogFont.lfWeight=FW_REGULAR;
1021    LogFont.lfItalic=NULL;
1022    LogFont.lfUnderline=0;
1023    LogFont.lfStrikeOut=NULL;
1024    LogFont.lfCharSet=SHIFTJIS_CHARSET;
1025    LogFont.lfOutPrecision=OUT_STRING_PRECIS;
1026    LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
1027    LogFont.lfQuality=DRAFT_QUALITY;
1028    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
1029    sprintf(LogFont.lfFaceName,"MS ゴシック");
1030    hRulerFont=CreateFontIndirect(&LogFont);
1031
1032    //行番号の描画用
1033    extern HFONT hFont_LineNumber;
1034    LogFont.lfHeight=-11;
1035    LogFont.lfWidth=0;
1036    LogFont.lfEscapement=0;
1037    LogFont.lfOrientation=0;
1038    LogFont.lfWeight=FW_BOLD;
1039    LogFont.lfItalic=NULL;
1040    LogFont.lfUnderline=NULL;
1041    LogFont.lfStrikeOut=NULL;
1042    LogFont.lfCharSet=ANSI_CHARSET;
1043    LogFont.lfOutPrecision=OUT_STRING_PRECIS;
1044    LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
1045    LogFont.lfQuality=DRAFT_QUALITY;
1046    LogFont.lfPitchAndFamily=VARIABLE_PITCH;
1047    sprintf(LogFont.lfFaceName,"Courier New");
1048    hFont_LineNumber=CreateFontIndirect(&LogFont);
1049
1050    //メニューフォント
1051    NONCLIENTMETRICS NCMetrics;
1052    int sizeof_NONCLIENTMETRICS = sizeof( NONCLIENTMETRICS );
1053#if WINVER >= 0x0600
1054    sizeof_NONCLIENTMETRICS -= sizeof(int);
1055#endif
1056    NCMetrics.cbSize = sizeof_NONCLIENTMETRICS;
1057    SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof_NONCLIENTMETRICS, &NCMetrics, 0 );
1058    hMenuFont=CreateFontIndirect(&NCMetrics.lfMenuFont);
1059
1060
1061
1062    //背景ブラシ
1063    extern HBRUSH h3DFaceBackBrush;
1064    h3DFaceBackBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
1065
1066    //アイコン
1067    extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
1068    hOwnerIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_MAIN),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
1069    hBasicProgramIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_BASICPROGRAM),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
1070    hTextDocumentIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
1071    hWindowDocumentIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_WINDOW),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
1072
1073
1074
1075
1076    //メインメニュー
1077    pobj_MainMenu=new CMenuEx(LoadMenu(hResInst,MAKEINTRESOURCE(IDR_MAINMENU)));
1078
1079    pobj_MainMenu->InitOwnerDraw(1);            //オーナー描画の初期化
1080
1081    CSubMenuEx *pobj_FileMenu;
1082    pobj_FileMenu=pobj_MainMenu->ppobj_MenuItemData[0]->pobj_SubMenu;
1083
1084    //未完成
1085    extern HMENU hFirstMainMenu;
1086    hFirstMainMenu=0;
1087
1088    //「最近使ったファイル」サブメニューを取得(と同時にも正規のメニュー文字列を指定)
1089    for(i=0;i<pobj_FileMenu->iMenuItemNum;i++){
1090        if(pobj_FileMenu->ppobj_MenuItemData[i]->str){
1091            if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"FileHistory")==0){
1092                pobj_FileMenu->RenameMenuItem(i,"最近使ったファイル(&F)");
1093
1094                extern CSubMenuEx *pobj_FileHistoryMenu;
1095                pobj_FileHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu;
1096            }
1097
1098#ifndef THETEXT
1099            //「最近使ったプロジェクト」サブメニューを取得(と同時にも正規のメニュー文字列を指定)
1100            //※ProjectEditorのみ
1101            if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"ProjectHistory")==0){
1102                pobj_FileMenu->RenameMenuItem(i,"最近使ったプロジェクト(&J)");
1103
1104                extern CSubMenuEx *pobj_ProjectHistoryMenu;
1105                pobj_ProjectHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu;
1106            }
1107#endif
1108        }
1109    }
1110
1111#define ICONSET(itemID,iconID) pobj_MainMenu->SetIcon(itemID,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0));
1112    //メニューアイコンをセット
1113
1114    //ファイル
1115    ICONSET(IDM_NEW,IDI_NEW);
1116    ICONSET(IDM_OPEN,IDI_OPEN);
1117    ICONSET(IDM_SAVE,IDI_SAVE);
1118    ICONSET(IDM_ALLSAVE,IDI_ALLSAVE);
1119    ICONSET(IDM_PREVIEW,IDI_PREVIEW);
1120    ICONSET(IDM_PRINTOUT,IDI_PRINT);
1121
1122    //編集
1123    ICONSET(IDM_CUT,IDI_CUT);
1124    ICONSET(IDM_COPY,IDI_COPY);
1125    ICONSET(IDM_PASTE,IDI_PASTE);
1126    ICONSET(IDM_UNDO,IDI_UNDO);
1127    ICONSET(IDM_REDO,IDI_REDO);
1128    ICONSET(IDM_FIND,IDI_FIND);
1129
1130    //表示
1131    ICONSET(IDM_SET,IDI_OPTION);
1132
1133    //変換
1134    ICONSET(IDM_CONV_ALPHA_SMALL,IDI_CONV_ALPHA_SMALL);
1135    ICONSET(IDM_CONV_ALPHA_BIG,IDI_CONV_ALPHA_BIG);
1136    ICONSET(IDM_CONV_HALF,IDI_CONV_HALF);
1137    ICONSET(IDM_CONV_MULTI,IDI_CONV_MULTI);
1138    ICONSET(IDM_CONV_KATAKANA,IDI_CONV_KATAKANA);
1139    ICONSET(IDM_CONV_HIRAGANA,IDI_CONV_HIRAGANA);
1140
1141    //ヘルプ
1142    ICONSET(IDM_TOPIC,IDI_HELP);
1143
1144#ifdef THETEXT
1145    //TheTextのみの機能
1146    ICONSET(IDM_STRING_COUNT,IDI_STRINGCOUNT);
1147#else
1148    //ProjectEditorのみの機能
1149
1150    //リリース
1151    ICONSET(IDM_RELEASECOMPILE,IDI_RELEASECOMPILE);
1152    ICONSET(IDM_RELEASERUN,IDI_RELEASERUN);
1153
1154    //デバッグ
1155    ICONSET(IDM_ATTACH,IDI_ATTACH);
1156    ICONSET(IDM_DEBUGCOMPILE,IDI_DEBUGCOMPILE);
1157    ICONSET(IDM_DEBUG,IDI_DEBUGRUN);
1158    ICONSET(IDM_BREAKPOINT,IDI_BREAKPOINT);
1159    ICONSET(IDM_STEP_IN,IDI_STEPIN);
1160    ICONSET(IDM_STEP_OVER,IDI_STEPOVER);
1161    ICONSET(IDM_STEP_CURSOR,IDI_STEPTOCURSOR);
1162    ICONSET(IDM_DEBUG_PAUSE,IDI_DEBUGPAUSE);
1163    ICONSET(IDM_DEBUG_STOP,IDI_DEBUGSTOP);
1164
1165    //コミュニティ
1166    ICONSET(IDM_COMMUNITY,IDI_COMMUNITY_MAIN);
1167    ICONSET(IDM_COMMU_SEARCH,IDI_COMMUNITY_FIND);
1168    ICONSET(IDM_COMMU_PM,IDI_COMMUNITY_PRIVATEMSG);
1169    ICONSET(ID_COMMU_FORUM1,IDI_COMMUNITY_FORUM);
1170    ICONSET(ID_COMMU_FORUM2,IDI_COMMUNITY_FORUM);
1171    ICONSET(ID_COMMU_FORUM3,IDI_COMMUNITY_FORUM);
1172    ICONSET(ID_COMMU_FORUM4,IDI_COMMUNITY_FORUM);
1173    ICONSET(ID_COMMU_FORUM5,IDI_COMMUNITY_FORUM);
1174    ICONSET(ID_COMMU_FORUM6,IDI_COMMUNITY_FORUM_SECRET);
1175    ICONSET(ID_COMMU_FORUM7,IDI_COMMUNITY_FORUM);
1176    ICONSET(ID_COMMU_FORUM8,IDI_COMMUNITY_FORUM);
1177#endif
1178
1179#undef ICONSET
1180
1181
1182
1183
1184    extern HMENU hEditMenuBase,hEditMenu;
1185    hEditMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_EDITMENU));
1186    hEditMenu=GetSubMenu(hEditMenuBase,0);
1187
1188    extern HMENU hRebarMenuBase,hRebarMenu;
1189    hRebarMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_REBARMENU));
1190    hRebarMenu=GetSubMenu(hRebarMenuBase,0);
1191
1192    extern HMENU hTabMenuBase,hTabMenu,hTabColorMenu;
1193    hTabMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_TABMENU));
1194    hTabMenu=GetSubMenu(hTabMenuBase,0);
1195    hTabColorMenu=GetSubMenu(hTabMenu,0);
1196
1197    extern HMENU hFileTreeMenuBase;
1198    hFileTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_FILETREEMENU));
1199
1200    extern HMENU hProcedureTreeMenuBase;
1201    hProcedureTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_PROCEDURETREEMENU));
1202
1203    extern HMENU hMaterialTreeMenuBase;
1204    hMaterialTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_MATERIALTREEMENU));
1205
1206    extern HMENU hRadMenuBase;
1207    hRadMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_RADCONTEXTMENU));
1208
1209    //クリップボードのデータ形式(RAD用)を新規登録
1210    extern DWORD dwRadClipboardID;
1211    dwRadClipboardID=RegisterClipboardFormat("ProjectEditor-RAD");
1212
1213    //256色の標準パレットを読み込む
1214    extern RGBQUAD DefaultColorTable256[256];
1215    HANDLE hFile;
1216    DWORD dw;
1217    const std::string pltPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\8bit.plt";
1218    hFile=CreateFile(pltPath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1219    if(hFile==INVALID_HANDLE_VALUE){
1220        //"\"%s\" ファイルの読み込みに失敗しました。"
1221        sprintf(str,STRING_ERROR_CANT_FILEOPEN,temporary);
1222        MessageBox(NULL,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1223        return 0;
1224    }
1225    ReadFile(hFile,DefaultColorTable256,sizeof(RGBQUAD)*256,&dw,NULL);
1226    CloseHandle(hFile);
1227
1228
1229
1230    //デザインテーマオブジェクトを生成
1231    pobj_DBTheme=new CDBTheme();
1232
1233
1234    /////////////////////////
1235    // カラーデザインを設定
1236    CTheme *pobj_Theme;
1237    pobj_Theme=pobj_DBTheme->GetActiveTheme();
1238    if(!pobj_Theme) pobj_Theme=pobj_DBTheme->ppobj_Theme[0];
1239
1240    SetTextEditColorDesign(&tci,pobj_Theme,0);
1241
1242
1243#ifndef THETEXT
1244    /////////////////////////////////////////////////////
1245    // ProjectEditorのみ
1246    /////////////////////////////////////////////////////
1247
1248
1249    //クラスビュー管理オブジェクトを生成
1250    pobj_ClassTreeView=new CClassTreeView();
1251
1252
1253    /////////////////////////
1254    // basic.sbpの内容を取得
1255    /////////////////////////
1256
1257    extern char *pHeaderBuf;
1258    sprintf(temporary,"%sbasic.sbp",pobj_nv->szIncludeDir);
1259    GetFullPath( temporary, pj_editor_Dir );
1260    pHeaderBuf = ReadBuffer_NonErrMsg( temporary );
1261
1262    if( !pHeaderBuf ){
1263        pHeaderBuf=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1264    }
1265
1266    //ファイルをインクルード
1267    pHeaderBuf=IncludeFiles(pHeaderBuf);
1268
1269
1270    //デバッガ管理オブジェクトを生成
1271    pobj_Debugger=new CDebugger();
1272#endif
1273
1274
1275    //ブレークポイント管理オブジェクトを生成
1276    extern CDBBreakPoint *pobj_DBBreakPoint;
1277    pobj_DBBreakPoint=new CDBBreakPoint();
1278
1279
1280    return 1;
1281}
1282void EndProjectEditor(void){
1283
1284#ifndef THETEXT
1285    /////////////////////////////////////////////////////
1286    // ProjectEditorのみ
1287    /////////////////////////////////////////////////////
1288
1289
1290    //クラスビュー管理オブジェクトを破棄
1291    delete pobj_ClassTreeView;
1292    pobj_ClassTreeView=0;
1293
1294    //basic.sbpのソースコードバッファを解放
1295    extern char *pHeaderBuf;
1296    HeapDefaultFree(pHeaderBuf);
1297
1298    //デバッガ管理オブジェクトを破棄
1299    delete pobj_Debugger;
1300#endif
1301
1302    //ブレークポイント管理オブジェクトを破棄
1303    extern CDBBreakPoint *pobj_DBBreakPoint;
1304    delete pobj_DBBreakPoint;
1305
1306    //デザインテーマオブジェクトを破棄
1307    delete pobj_DBTheme;
1308
1309    //不揮発性のデータを保存
1310    pobj_nv->save();
1311    delete pobj_nv;
1312    pobj_nv=0;
1313
1314    //メインメニューオブジェクトを破棄
1315    delete pobj_MainMenu;
1316    pobj_MainMenu=0;
1317
1318    extern HFONT hStatusFont;
1319    DeleteObject(hStatusFont);
1320    extern HFONT hHyperLinkFont;
1321    DeleteObject(hHyperLinkFont);
1322    extern HFONT hRulerFont;
1323    DeleteObject(hRulerFont);
1324    extern HFONT hFont_LineNumber;
1325    DeleteObject(hFont_LineNumber);
1326    extern METHODCHECKINFO MethodCheckInfo;
1327    DeleteObject(MethodCheckInfo.hFont);
1328    DeleteObject(MethodCheckInfo.hBoldFont);
1329    extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
1330    DestroyIcon(hOwnerIcon);
1331    DestroyIcon(hBasicProgramIcon);
1332    DestroyIcon(hTextDocumentIcon);
1333    DestroyIcon(hWindowDocumentIcon);
1334    extern HMENU hEditMenuBase,hRebarMenuBase,hTabMenuBase;
1335    DestroyMenu(hEditMenuBase);
1336    DestroyMenu(hRebarMenuBase);
1337    DestroyMenu(hTabMenuBase);
1338    extern HMENU hFileTreeMenuBase;
1339    DestroyMenu(hFileTreeMenuBase);
1340    extern HMENU hProcedureTreeMenuBase;
1341    DestroyMenu(hProcedureTreeMenuBase);
1342    extern HMENU hMaterialTreeMenuBase;
1343    DestroyMenu(hMaterialTreeMenuBase);
1344    extern HMENU hRadMenuBase;
1345    DestroyMenu(hRadMenuBase);
1346
1347    //背景ブラシ
1348    extern HBRUSH h3DFaceBackBrush;
1349    DeleteObject(h3DFaceBackBrush);
1350
1351    //スタンダードツールバーを破棄
1352    if(pobj_StandardToolbar){
1353        pobj_StandardToolbar->Release();
1354        pobj_StandardToolbar=0;
1355    }
1356
1357    //ビルドツールバーを破棄
1358    if(pobj_ReleaseToolbar){
1359        pobj_ReleaseToolbar->Release();
1360        pobj_ReleaseToolbar=0;
1361    }
1362
1363    //デバッガ用ツールバーを破棄
1364    if(pobj_DebuggerToolbar){
1365        pobj_DebuggerToolbar->Release();
1366        pobj_DebuggerToolbar=0;
1367    }
1368
1369    //ヒープオブジェクトを解放
1370    extern HANDLE hHeap;
1371    HeapDestroy(hHeap);
1372
1373    //////////////////////////////////////
1374    // バックアップ用ファイルを削除
1375    //////////////////////////////////////
1376    extern char szBackupDirPath[MAX_PATH];
1377    RemoveDirectoryStrong(szBackupDirPath);
1378
1379    //DLLを解放
1380    FreeLibrary(hResInst);
1381    FreeLibrary(hIconResInst);
1382    FreeLibrary(hLib_LuxCtrl);
1383
1384    //アルファブレンド用のAPIを解放
1385    extern HINSTANCE hUser32Lib;
1386    FreeLibrary(hUser32Lib);
1387}
1388
1389//各ウィンドウ生成
1390void SetupWindow(HWND hwnd)
1391{
1392    extern HINSTANCE hInst;
1393    extern HMENU hFirstMainMenu;
1394
1395    INITCOMMONCONTROLSEX InitCommCtrl;
1396    InitCommCtrl.dwSize=sizeof(INITCOMMONCONTROLSEX);
1397    InitCommCtrl.dwICC=ICC_COOL_CLASSES|ICC_PAGESCROLLER_CLASS|ICC_WIN95_CLASSES|ICC_TAB_CLASSES;
1398    InitCommonControlsEx(&InitCommCtrl);
1399
1400    //タブウィンドウ
1401    pobj_MainTab=new CMainTab(hwnd);
1402
1403    //レバーオブジェクトを生成
1404    pobj_Rebar=new CMainRebar(hwnd);
1405
1406    //ステータスバー
1407    extern HWND hStatusBar;
1408    extern HFONT hStatusFont;
1409    hStatusBar=CreateStatusWindow(
1410        WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBARS_SIZEGRIP|CCS_BOTTOM,
1411        NULL,hwnd,NULL);
1412    SendMessage(hStatusBar,WM_SETFONT,(long)hStatusFont,0);
1413
1414    //プロジェクト ビュー
1415    extern HWND hProjectView;
1416    extern HWND hProjectView_ToolWindow;
1417    RECT *prc;
1418    prc=&pobj_nv->rectProjectView;
1419    hProjectView_ToolWindow=CreateWindowEx(WS_EX_TOOLWINDOW,"ProjectView_ToolWindow","ProjectView",
1420        WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_CLIPCHILDREN,
1421        prc->left,prc->top,prc->right-prc->left,prc->bottom-prc->top,
1422        hwnd,0,hInst,0);
1423    hProjectView=CreateWindowEx(WS_EX_STATICEDGE,"ProjectView","ProjectView",
1424        WS_CHILD|WS_CLIPCHILDREN,
1425        0,0,0,0,
1426        hwnd,0,hInst,0);
1427    if(pobj_nv->bClipProjectView==0){
1428        SetWindowLongPtr(hProjectView,GWL_EXSTYLE,0);
1429        SetParent(hProjectView,hProjectView_ToolWindow);
1430        ResizeProjectView_ToolWindow();
1431    }
1432
1433    //メニュー状態を設定
1434    ResetState_DocMenu();
1435
1436
1437    //SideWebを生成
1438    //pobj_SideWeb=new CSideWeb(hwnd);
1439}
1440
1441//実行コマンド
1442BOOL SetRunning(HWND hChild){
1443    extern LPSTR DefFileFilter;
1444    int WndNum;
1445    char temp2[MAX_PATH];
1446    HANDLE hFind;
1447    WIN32_FIND_DATA wfd;
1448
1449    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1450    hFind=FindFirstFile(ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(),&wfd);
1451    if(hFind==INVALID_HANDLE_VALUE){
1452        //"BasicCompiler.exe が見つかりません"
1453        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1454        return FALSE;
1455    }
1456    FindClose(hFind);
1457
1458    WndNum=GetWndNum(hChild);
1459    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1460        if(MdiInfo[WndNum]->path.empty()){
1461            //"保存先のファイルを指定してください"
1462            if(!GetFilePathDialog(hOwner,temp2,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,0)) return FALSE;
1463
1464            if(!SaveDocument(hChild,temp2)) return 0;
1465        }
1466        else{
1467            if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
1468                if(!SaveDocument(hChild,NULL)) return 0;
1469            }
1470            else{
1471                if(hFind=FindFirstFile(MdiInfo[WndNum]->path.c_str(),&wfd)){
1472                    if(hFind==INVALID_HANDLE_VALUE){
1473                        if(!SaveDocument(hChild,NULL)) return 0;
1474                    }
1475                    else FindClose(hFind);
1476                }
1477            }
1478        }
1479    }
1480    return 1;
1481}
1482
1483BOOL IsNeedCompile( const std::string &filepath, BOOL bDebug )
1484{
1485    char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH];
1486    HANDLE hFind,hFile;
1487    WIN32_FIND_DATA wfd;
1488    FILETIME SourceTime,ExeTime;
1489
1490    _splitpath(filepath.c_str(),temporary,temp2,temp3,NULL);
1491    lstrcat(temporary,temp2);
1492    lstrcat(temporary,temp3);
1493    if(bDebug) lstrcat(temporary,"_debug.exe");
1494    else lstrcat(temporary,".exe");
1495
1496    hFind=FindFirstFile(temporary,&wfd);
1497    if(hFind==INVALID_HANDLE_VALUE) return 1;
1498    FindClose(hFind);
1499
1500    hFile=CreateFile(filepath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1501    GetFileTime(hFile,NULL,NULL,&SourceTime);
1502    CloseHandle(hFile);
1503
1504    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1505    GetFileTime(hFile,NULL,NULL,&ExeTime);
1506    CloseHandle(hFile);
1507
1508    if(SourceTime.dwHighDateTime<ExeTime.dwHighDateTime) return 0;
1509    else if(SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1510        SourceTime.dwLowDateTime<=ExeTime.dwLowDateTime) return 0;
1511    return 1;
1512}
1513
1514std::string GetLastErrorString(){
1515    char *lpMsgBuf;
1516
1517    FormatMessage( 
1518        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
1519        FORMAT_MESSAGE_FROM_SYSTEM | 
1520        FORMAT_MESSAGE_IGNORE_INSERTS,
1521        NULL,
1522        GetLastError(),
1523        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // デフォルト言語
1524        (LPTSTR) &lpMsgBuf,
1525        0,
1526        NULL 
1527    );
1528
1529    std::string result = lpMsgBuf;
1530
1531    LocalFree( lpMsgBuf );
1532
1533    return result;
1534}
Note: See TracBrowser for help on using the repository browser.