⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wderes.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    got_name = FALSE;

    if ( fn ) {
        if ( WdeFileExists ( fn ) ) {
            name = WdeStrDup ( fn );
            gf.fn_offset  = WRFindFnOffset  ( name );
        } else {
            return ( FALSE );
        }
    } else {
        gf.file_name = NULL;
        gf.title     = WdeResOpenTitle;
        gf.filter    = WdeResOpenFilter;
        ok = ( ( name = WdeGetOpenFileName ( &gf ) ) != NULL );
    }

    if ( ok ) {
        got_name = TRUE;
        ok = ( ( res_info = WdeLoadResource ( name ) ) != NULL );
    }

    if( ok ) {
        res_info->hash_table = WRInitHashTable();
        ok = ( res_info->hash_table != NULL );
    }

    if ( ok ) {
        if( res_info->info->internal_type != WR_DONT_KNOW ) {
            res_info->is32bit = WRIs32Bit( res_info->info->internal_type );
        } else {
            res_info->is32bit = WRIs32Bit( res_info->info->file_type );
        }
        ok = WdeAddDlgItems( res_info );
    }

    if ( ok ) {
        WdeFindAndLoadSymbols( res_info );
        ok = WdeCreateResourceWindow( res_info, gf.fn_offset, NULL );
    }

    if( ok ) {
        if( WdeResInfoHasDialogs( res_info ) ) {
            WdeSelectDialog( res_info );
        } else {
            WdeDisplayErrorMsg( WDE_PRJHASNODIALOGS );
        }
        ListAddElt( &WdeResList, (void *) res_info );
        WdeSetResModified( res_info, FALSE );
        WdeCheckBaseScrollbars( FALSE );
    }

    if( !ok ) {
        if( res_info ) {
            WdeFreeResInfo( res_info );
            res_info = NULL;
        }
        if( got_name ) {
            WdeDisplayErrorMsg( WDE_RESOURCESNOTLOADED );
        }
    }

    if( name ) {
        WdeMemFree( name );
    }

    WdeSetWaitCursor ( FALSE );

    return ( ok );
}

WdeResInfo *WdeResInfoFromWin ( HWND win )
{
    WdeResInfo *info;
    LIST       *rlist;

    if ( win != NULL ) {
        info = NULL;
        for ( rlist = WdeResList; rlist; rlist = ListNext(rlist) ) {
            info = (WdeResInfo *) ListElement(rlist);
            if ( info->res_win == win ) {
                return ( info );
            }
        }
    }

    return ( NULL );
}

void WdeActivateResourceWindow ( WdeResInfo *res_info,
                                 WPARAM wParam, LPARAM lParam )
{
    WdeResInfo *info;
    OBJPTR     *current_obj;
    Bool        fActivate;
    HWND        hwndDeact;
    WORD        id;

    _wde_touch(wParam);

    if ( !res_info ) {
        return;
    }

    fActivate =
        GET_WM_MDIACTIVATE_FACTIVATE (res_info->res_win, wParam, lParam);

    hwndDeact = GET_WM_MDIACTIVATE_HWNDDEACTIVATE(wParam, lParam);

    res_info->active = fActivate;

    if( fActivate ) {
        WdeSetCurrentRes( res_info );
        info = WdeResInfoFromWin( hwndDeact );
        if ( info ) {
            info->active = FALSE;
        }
    }

    if( res_info->editting ) {
        InitState( res_info->forms_win );
        id = WdeGetCToolID();
        WdeSetBaseObject( id );
        if( fActivate ) {
            current_obj = GetCurrObject();
            if ( current_obj ) {
                Notify( current_obj, PRIMARY_OBJECT, NULL );
            }
        }
    }

    return;
}

static void WdeCheckIfActiveWindow( void )
{
    HWND        main;
    HWND        active;

    main = WdeGetMainWindowHandle();
    active = GetActiveWindow();
    if( active != main ) {
        if( IsIconic( main ) ) {
            ShowWindow( main, SW_RESTORE );
        }
#ifdef __NT__
        SetWindowPos( main, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetWindowPos( main, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetWindowPos( main, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetForegroundWindow( main );
#else
        SetActiveWindow( main );
        SetWindowPos( main, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
#endif
    }
}

char *WdeGetQueryName ( WdeResInfo *res_info )
{
    char *name;

    if ( res_info->info->save_name ) {
        name = res_info->info->save_name;
    } else if ( res_info->info->file_name ) {
        name = res_info->info->file_name;
    } else {
        name = WdeResUntitled;
    }

    return ( name );
}

Bool WdeQuerySaveResOnDeleteRes ( WdeResInfo *res_info, Bool fatal_exit )
{
    int         ret;
    UINT        style;
    char        *file;
    char        *text;
    HWND        frame;

    if( res_info && res_info->dlg_item_list && WdeIsResModified(res_info) ) {
        WdeCheckIfActiveWindow();
        if( fatal_exit ) {
            style = MB_YESNO | MB_APPLMODAL | MB_ICONEXCLAMATION;
        } else {
            style = MB_YESNOCANCEL | MB_APPLMODAL | MB_ICONEXCLAMATION;
        }
        frame = WdeGetMDIWindowHandle();
        if( IsIconic( frame ) ) {
            SendMessage( frame, WM_MDIRESTORE, (WPARAM)res_info->res_win, 0 );
        }
        SendMessage( frame, WM_MDIACTIVATE, (WPARAM) res_info->res_win, 0 );
        file = WdeGetQueryName ( res_info );
        if( WdeIsDDE() ) {
            text = WdeAllocRCString( WDE_UPDATEMODIFIEDPRJ );
        } else {
            text = WdeAllocRCString( WDE_SAVEMODIFIEDPRJ );
        }
        ret = MessageBox( res_info->res_win, text, file, style );
        if( text ) {
            WdeFreeRCString( text );
        }
        if( ret == IDYES ) {
            if( WdeIsDDE() ) {
                return( WdeUpdateDDEEditSession() );
            } else {
                return( WdeSaveResource ( res_info, FALSE ) );
            }
        } else if( ret == IDCANCEL ) {
            return( FALSE );
        }
    }

    return( TRUE );
}

Bool WdeQuerySaveSymOnDeleteRes( WdeResInfo *res_info, Bool fatal_exit )
{
    int         ret;
    UINT        style;
    char        *file;
    char        *text;
    HWND        frame;

    if( fatal_exit ) {
        style = MB_YESNO | MB_APPLMODAL | MB_ICONEXCLAMATION;
    } else {
        style = MB_YESNOCANCEL | MB_APPLMODAL | MB_ICONEXCLAMATION;
    }

    if( res_info && res_info->hash_table &&
        WdeIsHashTableDirty( res_info->hash_table ) ) {
        WdeCheckIfActiveWindow();
        file = WdeGetQueryName( res_info );
        frame = WdeGetMDIWindowHandle();
        if( IsIconic( frame ) ) {
            SendMessage( frame, WM_MDIRESTORE, (WPARAM)res_info->res_win, 0 );
        }
        SendMessage( frame, WM_MDIACTIVATE, (WPARAM) res_info->res_win, 0 );
        text = WdeAllocRCString( WDE_SAVEMODIFIEDSYM );
        ret = MessageBox( res_info->res_win, text, file, style );
        if( text ) {
            WdeFreeRCString( text );
        }
        if( ret == IDYES ) {
            if( res_info->sym_name == NULL ) {
                res_info->sym_name = WdeCreateSymName( file );
            }
            if( !WdeWriteSymbols( res_info->hash_table, &res_info->sym_name, FALSE ) ) {
                return( FALSE );
            }
        } else if( ret == IDCANCEL ) {
            return( FALSE );
        } else if( ret == IDNO ) {
            WdeHashSaveRejected( res_info->hash_table );
        }
    }

    return( TRUE );
}

Bool WdeDestroyResourceWindow( WdeResInfo *res_info )
{
    Bool        ret;

    ret = ( res_info &&
            WdeQuerySaveResOnDeleteRes( res_info, FALSE ) &&
            WdeQuerySaveSymOnDeleteRes( res_info, FALSE ) );

    WdeHashClearSaveRejected( res_info->hash_table );

    if( ret ) {
        if( !WdeRemoveResource( res_info ) ) {
            WdeWriteTrail("WdeDestroyResourceWindow: RemoveResource failed!");
        }
    }

    return( ret );
}

Bool WdeCreateResourceWindow( WdeResInfo *res_info, int fn_offset,
                              char *title )
{
    MDICREATESTRUCT     mdics;
    LRESULT             ret;
    HWND                win;
    Bool                ok;
    Bool                old;
    DWORD               style;
    RECT                r;
    HMENU               sys_menu;
    char                *win_title;
    int                 win_title_len;

    _wde_touch(fn_offset);

    WdeIncNumRes();

    style = 0;

    if( WdeGetNumRes() == 1 ) {
        WdeSetAppMenuToRes( TRUE );
        old = WdeSetStickyMode( WdeOldStickyMode );
        style = WS_MAXIMIZE;
    } else {
        if( WdeIsCurrentMDIWindowZoomed() ) {
            style = WS_MAXIMIZE;
        }
    }

    mdics.szClass = "WdeResClass";

    if( title == NULL ) {
        if( res_info->info->file_name ) {
            // perhaps make this an option
            //title = &( res_info->info->file_name[fn_offset] );
            title = res_info->info->file_name;
        } else {
            title = WdeResUntitled;
        }
    }

    WdeResCounter++;
    res_info->window_num = WdeResCounter;
    win_title_len = strlen( title ) + 1;
    win_title_len += 15;
    win_title = (char *)WdeMemAlloc( win_title_len );
    if( win_title != NULL ) {
        sprintf( win_title,"%s (%d)", title, 0xffff & WdeResCounter );
        mdics.szTitle = win_title;
    } else {
        mdics.szTitle = title;
    }

    win = WdeGetMDIWindowHandle();
    GetClientRect( win, &r );

    mdics.hOwner  = WdeGetAppInstance();
    mdics.x       = CW_USEDEFAULT;
    mdics.y       = CW_USEDEFAULT;
    mdics.cx      = CW_USEDEFAULT;
    mdics.cy      = CW_USEDEFAULT;
    //mdics.cx      = r.right - r.left;
    //mdics.cy      = r.bottom - r.top;
    mdics.style   = style;
    mdics.lParam  = (LPARAM) res_info;

    ret = SendMessage( win, WM_MDICREATE, 0, (LPARAM) &mdics );

    if( win_title != NULL ) {
        WdeMemFree( win_title );
    }

#ifdef __NT__
    win = (HWND) ret;
#else
    win = (HWND) LOWORD( ret );
#endif

    ok = ( res_info->res_win && ( res_info->res_win == win ) );
    if ( !ok ) {
        WdeWriteTrail("WdeCreateResourceWindow: Bad window handle!");
    }

    if( WdeIsDDE() ) {
        sys_menu = GetSystemMenu( win, FALSE );
        if( sys_menu != (HMENU)NULL ) {
            EnableMenuItem( sys_menu, SC_CLOSE, MF_GRAYED );
        }
    }

    if ( ok ) {
        ok = WdeCreateEditWindows ( res_info );
        if ( !ok ) {
            WdeWriteTrail("WdeCreateResourceWindow: "
                          "Could not create edit windows!");
        }
    }

    if ( ok ) {
        OpenFormEdit ( res_info->forms_win, WdeGetCreateTable(),
                       MENU_NONE, SCROLL_NONE );
        WdeSetEditMode ( res_info, TRUE );
        SetHorizontalInc( 1 );
        SetVerticalInc( 1 );
        InitState ( res_info->forms_win );
        SetMouseRtn ( res_info->forms_win, WdeMouseRtn );
        //MakeObjectCurrent( GetMainObject() );
    } else {
        if ( WdeGetNumRes() == 1 ) {
            WdeSetAppMenuToRes ( FALSE );
            WdeSetStickyMode ( old );
        }
        WdeDecNumRes ();
    }

    return ( ok );
}

char *WdeSelectSaveFilter( WRFileType ftype )
{
    char        *filter;

    switch( ftype ) {
        case WR_WIN16_EXE:
        case WR_WINNT_EXE:
            filter = WdeResSaveFilterEXE;
            break;
        case WR_WIN16_DLL:
        case WR_WINNT_DLL:
            filter = WdeResSaveFilterDLL;
            break;
        default:
            filter = WdeResSaveFilter;
    }

    return( filter );
}

Bool WdeSaveResource( WdeResInfo *res_info, Bool get_name )
{
    WdeGetFileStruct    gf;
    char                *filter;
    char                *fn;
    char                *win_title;
    int                 win_title_len;
    int                 fn_offset;
    Bool                got_name;
    Bool                ok;
    OBJPTR              main_obj;

    fn_offset = 0;
    got_name = FALSE;

    ok = ( res_info && res_info->info );

    if( ok ) {
        if( res_info->info->save_name ) {
            fn = res_info->info->save_name;
        } else {
            res_info->info->save_type = res_info->info->file_type;
            fn = WdeStrDup( res_info->info->file_name );
            got_name = TRUE;
        }

        if( get_name || !fn || !*fn ) {
            filter = WdeSelectSaveFilter( res_info->info->file_type );
            gf.file_name = fn;
            gf.title = WdeResSaveTitle;
            gf.filter = filter;
            fn = WdeGetSaveFileName( &gf );
            got_name = TRUE;
            res_info->info->save_type = WR_DONT_KNOW;
        }

        ok = ( fn && *fn );
    }

    if( ok ) {
        if( got_name && res_info->info->save_name ) {
            WdeMemFree( res_info->info->save_name );
        }
        res_info->info->save_name = fn;
        if( res_info->info->save_type == WR_DONT_KNOW ) {
            res_info->info->save_type =
                WdeSelectFileType( fn, res_info->is32bit );
        }
        ok = ( res_info->info->save_type != WR_DONT_KNOW );
    }

    if( ok ) {
        if( WdeIsHashTableDirty( res_info->hash_table ) &&
            !WdeIsHashSaveRejectedSet( res_info->hash_table ) ) {
            if( res_info->sym_name == NULL ) {
                res_info->sym_name = WdeCreateSymName( fn );
            }
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -