Ignore:
Timestamp:
May 27, 2008, 9:17:34 PM (16 years ago)
Author:
dai_9181
Message:

・WindowInfoクラスをリファクタリング
・MdiInfoを単純配列からvectorに変更した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/abdev/WindowControl.cpp

    r624 r625  
    1313#endif
    1414
    15 int GetWndInfoNum(char *name){
     15int GetWndInfoNum( const std::string &name )
     16{
    1617    for( int i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
    17         if(lstrcmpi(name,projectInfo.windowInfos[i]->GetName().c_str())==0) return i;
     18        if(lstrcmpi(name.c_str(),projectInfo.windowInfos[i]->GetName().c_str())==0) return i;
    1819    }
    1920    return -1;
    2021}
    21 ActiveBasic::PM::WindowInfo *GetWndInfo( char *name )
     22ActiveBasic::PM::WindowInfo *GetWndInfo( const std::string &name )
    2223{
    2324    BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
    2425    {
    25         if(lstrcmpi(name,pWindowInfo->GetName().c_str())==0) return pWindowInfo;
     26        if(lstrcmpi(name.c_str(),pWindowInfo->GetName().c_str())==0) return pWindowInfo;
    2627    }
    2728    return NULL;
     
    6667HGLOBAL Rad_GetChildInfoClipboardData(int WndNum,int WndInfoNum){
    6768    //ChildWindowInfo構造体をクリップボード用データ(pByteが示すバッファ)に変換する
    68     extern MDIINFO MdiInfo[MAX_WNDNUM];
    6969    HGLOBAL hGlobal;
    7070    BYTE *pByte;
     
    141141void Rad_PasteChildInfoClipboardData(int WndNum,HGLOBAL hGlobal){
    142142    //hGlobalに格納されているクリップボードデータをRAD画面に挿入する
    143     extern MDIINFO MdiInfo[MAX_WNDNUM];
    144143    BYTE *pByte;
    145144    int i2,i3,WndInfoNum;
     
    307306
    308307    return pBuf;
     308}
     309const std::string PermutationWndPgmTemplate( const std::string &templateFilePath, const std::string &projectName, const std::string &windowName, const std::string &handleName, const std::string &procName )
     310{
     311    Jenga::Common::SourceTemplate sourceTemplate( templateFilePath );
     312    Jenga::Common::SourceTemplate::Values values;
     313
     314    values.Insert( "#name#", projectName );
     315    values.Insert( "#window#", windowName );
     316    values.Insert( "#handle#", handleName );
     317    values.Insert( "#procedure#", procName );
     318
     319    return sourceTemplate.GetResult( values );
    309320}
    310321
     
    535546    }
    536547    else if(lstrcmp(MessageName,"Create")==0){
    537         if(pWindowInfo->type==WNDTYPE_MODALDLG||pWindowInfo->type==WNDTYPE_MODELESSDLG)
     548        if( pWindowInfo->IsModalDlg() || pWindowInfo->IsModelessDlg() )
     549        {
    538550            sprintf(Command,"%sCase WM_INITDIALOG\r\n",spaces);
    539         else sprintf(Command,"%sCase WM_CREATE\r\n",spaces);
     551        }
     552        else
     553        {
     554            sprintf(Command,"%sCase WM_CREATE\r\n",spaces);
     555        }
    540556        i=lstrlen(Command);
    541557
     
    833849        sprintf(Command+i,"%s\tDim cancel=0 As Integer\r\n",spaces);
    834850        i+=lstrlen(Command+i);
    835         if(bProcedureCall){
     851        if(bProcedureCall)
     852        {
    836853            sprintf(Command+i,"%s\t%s_%s(cancel)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
    837854            i+=lstrlen(Command+i);
    838855        }
    839         if(pWindowInfo->type==WNDTYPE_MODALDLG)
     856
     857        if( pWindowInfo->IsModalDlg() )
     858        {
    840859            sprintf(Command+i,"%s\tIf cancel=0 Then EndDialog(hWnd,0)\r\n",spaces);
     860        }
    841861        else
     862        {
    842863            sprintf(Command+i,"%s\tIf cancel=0 Then DestroyWindow(hWnd)\r\n",spaces);
     864        }
    843865        return WM_CLOSE;
    844866    }
     
    13621384    BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
    13631385    {
    1364         if(pWindowInfo->type==WNDTYPE_MODALDLG){
     1386        if( pWindowInfo->IsModalDlg() )
     1387        {
    13651388            if(sw1==0){
    13661389                sprintf(buffer+i2,"\tIf lstrcmp(TemplateName,\"%s\")=0 Then\r\n",pWindowInfo->GetName().c_str());
     
    13881411                sprintf(buffer+i2,"\t\tSetWindowLongPtr(%s,GWLP_WNDPROC,AddressOf(%s) As LONG_PTR)\r\n",
    13891412                    pWindowInfo->GetHandleName().c_str(),
    1390                     pWindowInfo->CallBackName);
     1413                    pWindowInfo->GetCallbackName().c_str());
    13911414            }
    13921415            else{
     
    14611484    BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
    14621485    {
    1463         if(pWindowInfo->type==WNDTYPE_MODELESSDLG){
     1486        if( pWindowInfo->IsModelessDlg() )
     1487        {
    14641488            sprintf(buffer+i2,"\tIf lstrcmp(TemplateName,\"%s\")=0 Then\r\n",pWindowInfo->GetName().c_str());
    14651489            i2+=lstrlen(buffer+i2);
     
    14801504                sprintf(buffer+i2,"\t\tSetWindowLongPtr(%s,GWLP_WNDPROC,AddressOf(%s) As LONG_PTR)\r\n",
    14811505                    pWindowInfo->GetHandleName().c_str(),
    1482                     pWindowInfo->CallBackName);
     1506                    pWindowInfo->GetCallbackName().c_str());
    14831507            }
    14841508            else{
     
    15341558    BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
    15351559    {
    1536         if(pWindowInfo->type==WNDTYPE_DEFAULT){
     1560        if( pWindowInfo->IsDefaultWindow() )
     1561        {
    15371562            //////////////////////
    15381563            //通常ウィンドウ作成
     
    15581583            i2+=lstrlen(buffer+i2);
    15591584            if(bAvailUserProc[i])
    1560                 sprintf(buffer+i2,"_RadSys_wcl.lpfnWndProc=AddressOf(%s)\r\n",pWindowInfo->CallBackName);
     1585                sprintf(buffer+i2,"_RadSys_wcl.lpfnWndProc=AddressOf(%s)\r\n",pWindowInfo->GetCallbackName().c_str());
    15611586            else sprintf(buffer+i2,"_RadSys_wcl.lpfnWndProc=AddressOf(EventCall_%s)\r\n",pWindowInfo->GetName().c_str());
    15621587            i2+=lstrlen(buffer+i2);
     
    16311656{
    16321657    extern HANDLE hHeap;
    1633     extern MDIINFO MdiInfo[MAX_WNDNUM];
    16341658    int i,i2,size;
    16351659    char *buffer,*temporary;
     
    16381662    buffer=(char *)HeapAlloc(hHeap,0,GENERAL_SIZE*size);
    16391663    i2=0;
    1640     BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
     1664    BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, windowInfos )
    16411665    {
    16421666        sprintf(buffer+i2,"WINDOW:%s\r\n",pWindowInfo->GetName().c_str());
    1643         i2+=lstrlen(buffer+i2);
    1644         sprintf(buffer+i2,"    HANDLE    = %s\r\n",pWindowInfo->GetHandleName().c_str());
    16451667        i2+=lstrlen(buffer+i2);
    16461668        sprintf(buffer+i2,"    POINT     = %d,%d\r\n",pWindowInfo->pos.x,pWindowInfo->pos.y);
     
    16841706        sprintf(buffer+i2,"    CLASS     = \"%s\"\r\n",pWindowInfo->GetClassName().c_str());
    16851707        i2+=lstrlen(buffer+i2);
    1686         sprintf(buffer+i2,"    CALLBACK  = %s\r\n",pWindowInfo->CallBackName);
    1687         i2+=lstrlen(buffer+i2);
    1688         sprintf(buffer+i2,"    TYPE      = %d\r\n",pWindowInfo->type);
    1689         i2+=lstrlen(buffer+i2);
    1690         sprintf(buffer+i2,"    FILEPATH  = %s\r\n",pWindowInfo->filepath);
     1708        sprintf(buffer+i2,"    TYPE      = %d\r\n",(DWORD)pWindowInfo->GetType());
    16911709        i2+=lstrlen(buffer+i2);
    16921710        BOOST_FOREACH( const ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
     
    18871905            }
    18881906            else if(lstrcmpi(temporary,"HANDLE")==0&&i3==1){
    1889                 projectInfo.windowInfos.back()->SetHandleName( temp2 );
     1907                //無視
    18901908            }
    18911909            else if(lstrcmpi(temporary,"POINT")==0&&i3==1){
     
    19771995                }
    19781996            }
    1979             else if(lstrcmpi(temporary,"CALLBACK")==0&&i3==1){
    1980                 projectInfo.windowInfos.back()->CallBackName=(char *)HeapAlloc(hHeap,0,i2+1);
    1981                 lstrcpy(projectInfo.windowInfos.back()->CallBackName,temp2);
     1997            else if(lstrcmpi(temporary,"CALLBACK")==0&&i3==1)
     1998            {
     1999                // 無視
    19822000            }
    19832001
    19842002            //以前のバージョンとの互換用
    1985             else if(lstrcmpi(temporary,"DLGTMP")==0&&i3==1) projectInfo.windowInfos.back()->type=GetValue(temp2);
    1986 
    1987             else if(lstrcmpi(temporary,"TYPE")==0&&i3==1) projectInfo.windowInfos.back()->type=GetValue(temp2);
    1988             else if(lstrcmpi(temporary,"FILEPATH")==0&&i3==1){
    1989                 projectInfo.windowInfos.back()->filepath=(char *)HeapAlloc(hHeap,0,i2+1);
    1990                 lstrcpy(projectInfo.windowInfos.back()->filepath,temp2);
     2003            else if(lstrcmpi(temporary,"DLGTMP")==0&&i3==1) projectInfo.windowInfos.back()->SetType( (ActiveBasic::PM::WindowType::EnumType)GetValue(temp2) );
     2004
     2005            else if(lstrcmpi(temporary,"TYPE")==0&&i3==1) projectInfo.windowInfos.back()->SetType( (ActiveBasic::PM::WindowType::EnumType)GetValue(temp2) );
     2006            else if(lstrcmpi(temporary,"FILEPATH")==0&&i3==1)
     2007            {
     2008                // 無視
    19912009            }
    19922010            else if(lstrcmpi(temporary,"ITEM")==0&&i3==1){
     
    20822100struct NEW_WINDOW{
    20832101    char name[MAX_PATH];
    2084     char HandleName[MAX_PATH];
    2085     char CallBackName[MAX_PATH];
    2086     BOOL type;
     2102    ActiveBasic::PM::WindowType::EnumType type;
    20872103};
    20882104NEW_WINDOW NewWindow;
     
    20922108        case WM_INITDIALOG:
    20932109            SetPosCenter(hwnd);
    2094             SendDlgItemMessage(hwnd,IDC_AUTOSET,BM_SETCHECK,BST_CHECKED,0);
    2095             SendMessage(hwnd,WM_COMMAND,IDC_AUTOSET,0);
    20962110            SendDlgItemMessage(hwnd,IDC_MODALDLG,BM_SETCHECK,BST_CHECKED,0);
    20972111            break;
     
    21002114                case IDOK:
    21012115                    GetDlgItemText(hwnd,IDC_WINDOWNAME,NewWindow.name,MAX_PATH);
    2102                     GetDlgItemText(hwnd,IDC_WINDOWHANDLE,NewWindow.HandleName,MAX_PATH);
    2103                     GetDlgItemText(hwnd,IDC_WINDOWPROC,NewWindow.CallBackName,MAX_PATH);
    21042116                    if(SendDlgItemMessage(hwnd,IDC_DEFWINDOW,BM_GETCHECK,0,0))
    2105                         NewWindow.type=WNDTYPE_DEFAULT;
     2117                    {
     2118                        NewWindow.type = ActiveBasic::PM::WindowType::Default;
     2119                    }
    21062120                    else if(SendDlgItemMessage(hwnd,IDC_MODALDLG,BM_GETCHECK,0,0))
    2107                         NewWindow.type=WNDTYPE_MODALDLG;
     2121                    {
     2122                        NewWindow.type = ActiveBasic::PM::WindowType::ModalDlg;
     2123                    }
    21082124                    else if(SendDlgItemMessage(hwnd,IDC_MODELESSDLG,BM_GETCHECK,0,0))
    2109                         NewWindow.type=WNDTYPE_MODELESSDLG;
     2125                    {
     2126                        NewWindow.type = ActiveBasic::PM::WindowType::ModelessDlg;
     2127                    }
    21102128                    EndDialog(hwnd,1);
    21112129                    return 1;
     
    21142132                    return 1;
    21152133                case IDC_WINDOWNAME:
    2116                     if(HIWORD(wParam)==EN_CHANGE) SendMessage(hwnd,WM_COMMAND,IDC_AUTOSET,0);
    2117                     return 1;
    2118                 case IDC_AUTOSET:
    2119                     if(SendDlgItemMessage(hwnd,IDC_AUTOSET,BM_GETCHECK,0,0)){
    2120                         SendDlgItemMessage(hwnd,IDC_WINDOWHANDLE,EM_SETREADONLY,1,0);
    2121                         SendDlgItemMessage(hwnd,IDC_WINDOWPROC,EM_SETREADONLY,1,0);
     2134                    if(HIWORD(wParam)==EN_CHANGE)
     2135                    {
    21222136                        GetDlgItemText(hwnd,IDC_WINDOWNAME,temporary,MAX_PATH);
    21232137                        if(temporary[0]){
     
    21312145                            SetDlgItemText(hwnd,IDC_WINDOWPROC,"");
    21322146                        }
    2133                     }
    2134                     else{
    2135                         SendDlgItemMessage(hwnd,IDC_WINDOWHANDLE,EM_SETREADONLY,0,0);
    2136                         SendDlgItemMessage(hwnd,IDC_WINDOWPROC,EM_SETREADONLY,0,0);
    21372147                    }
    21382148                    return 1;
     
    21602170void Project_Window_Insert(void){
    21612171    extern HANDLE hHeap;
    2162     char temporary[MAX_PATH],temp2[1024],*pTemp;
     2172    char temporary[MAX_PATH],temp2[1024];
    21632173
    21642174    if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_PROJECT_NEWWINDOW),hOwner,(DLGPROC)DlgProject_NewWindow)) return;
     
    21792189            return;
    21802190        }
    2181         if(lstrcmpi(NewWindow.HandleName,pWindowInfo->GetHandleName().c_str())==0){
    2182             //"\"%s\" ハンドルは既にプロジェクト内に存在します。"
    2183             sprintf(temporary,STRING_DUPLICATIONERROR_HANDLE_IN_PROJECT,pWindowInfo->GetHandleName().c_str());
    2184             MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
    2185             return;
    2186         }
    2187         if(lstrcmpi(NewWindow.CallBackName,pWindowInfo->CallBackName)==0){
    2188             //"\"%s\" プロシージャは既にプロジェクト内に存在します。"
    2189             sprintf(temporary,STRING_DUPLICATIONERROR_PROC_IN_PROJECT,pWindowInfo->CallBackName);
    2190             MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
    2191             return;
    2192         }
    21932191    }
    21942192
     
    22022200    //ウィンドウ名
    22032201    projectInfo.windowInfos.back()->SetName( NewWindow.name );
    2204 
    2205     //ハンドル名
    2206     projectInfo.windowInfos.back()->SetHandleName( NewWindow.HandleName );
    22072202
    22082203    //位置情報
     
    22172212    //スタイル
    22182213    switch(NewWindow.type){
    2219         case WNDTYPE_DEFAULT:
     2214        case ActiveBasic::PM::WindowType::Default:
    22202215            //通常ウィンドウ
    22212216            projectInfo.windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX );
    22222217            break;
    2223         case WNDTYPE_MODALDLG:
    2224         case WNDTYPE_MODELESSDLG:
     2218        case ActiveBasic::PM::WindowType::ModalDlg:
     2219        case ActiveBasic::PM::WindowType::ModelessDlg:
    22252220            //ダイアログ テンプレート(最大化、最小化ボタンをなくして、細枠にする)
    22262221            projectInfo.windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU );
     
    22472242    projectInfo.windowInfos.back()->SetClassName( temporary );
    22482243
    2249     //コールバック関数名
    2250     projectInfo.windowInfos.back()->CallBackName=(char *)HeapAlloc(hHeap,0,lstrlen(NewWindow.CallBackName)+1);
    2251     lstrcpy(projectInfo.windowInfos.back()->CallBackName,NewWindow.CallBackName);
    2252 
    22532244    //タイプ識別
    2254     projectInfo.windowInfos.back()->type=NewWindow.type;
    2255 
    2256 
    2257     //メッセージ処理ファイル名
    2258     sprintf(temporary,"%s.ab",projectInfo.windowInfos.back()->GetName().c_str());
    2259     projectInfo.windowInfos.back()->filepath=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    2260     lstrcpy(projectInfo.windowInfos.back()->filepath,temporary);
     2245    projectInfo.windowInfos.back()->SetType( NewWindow.type );
     2246
    22612247
    22622248
     
    22652251    //////////////////////////
    22662252
    2267     //テンプレートを読み込む
    2268     const std::string newWindowTemplateSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\new_window_template.sbp";
    2269     pTemp = ReadBuffer( newWindowTemplateSbpPath );
    2270 
    2271     //#name#をプロジェクト名に置換
    2272     pTemp=PermutationWndPgmTemplate(pTemp,
    2273         projectInfo.GetName().c_str(),
    2274         NewWindow.name,
    2275         NewWindow.HandleName,
    2276         NewWindow.CallBackName);
     2253    // テンプレートを使ってMainWnd.abを生成する
     2254    const std::string resultStr = PermutationWndPgmTemplate(
     2255        ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\new_window_template.sbp",
     2256        projectInfo.GetName(),
     2257        (std::string)NewWindow.name,
     2258        (std::string)"h" + NewWindow.name,
     2259        (std::string)NewWindow.name + "Proc"
     2260    );
    22772261
    22782262    sprintf(temporary,"%s%s.ab",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.windowInfos.back()->GetName().c_str());
    22792263
    22802264    //書き込み
    2281     WriteBuffer(temporary,pTemp,lstrlen(pTemp));
     2265    WriteBuffer(temporary,resultStr.c_str(),resultStr.size());
    22822266    Project_File_Insert(temporary);
    22832267
    2284     HeapDefaultFree(pTemp);
    22852268
    22862269
     
    23092292void Project_Window_Delete(int WndInfoNum){
    23102293    extern HANDLE hHeap;
    2311     extern MDIINFO MdiInfo[MAX_WNDNUM];
    23122294    int i;
    23132295
     
    23152297
    23162298    //ウィンドウが開かれている場合は閉じる
    2317     for(i=0;i<MAX_WNDNUM;i++){
    2318         if(MdiInfo[i].hwnd&&lstrcmpi(pWindowInfo->GetName().c_str(),MdiInfo[i].path)==0){
     2299    for(i=0;i<MdiInfo.size();i++){
     2300        if(MdiInfo[i].hwnd&&lstrcmpi(pWindowInfo->GetName().c_str(),MdiInfo[i].path.c_str())==0){
    23192301            SendMessage(MdiInfo[i].hwnd,WM_CLOSE,0,0);
    23202302            break;
    23212303        }
    23222304    }
    2323 
    2324     //ウィンドウ情報のメモリを解放
    2325     HeapDefaultFree(pWindowInfo->filepath);
    2326     HeapDefaultFree(pWindowInfo->CallBackName);
    23272305
    23282306    //子ウィンドウのメモリを解放
Note: See TracChangeset for help on using the changeset viewer.