dbgwmac.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 640 行 · 第 1/2 页

C
640
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/


#include "dbgdefn.h"
#include "dbgwind.h"
#include "dbginfo.h"
#include "dbgadget.h"
#include "guidlg.h"
#include "sortlist.h"
#include "dbgerr.h"
#include "dbgtoggl.h"
#include <string.h>
#include <stddef.h>
#include <ctype.h>

extern char             *GetCmdEntry(char *,int ,char *);
extern char             *KeyName( unsigned key );
extern wnd_macro        *MacAddDel( unsigned key, wnd_class class, cmd_list *cmds );
extern char             *StrCopy( char *src, char *dest );
extern void             LockCmdList( cmd_list *cmds );
extern char             *Format( char *buff, char *fmt, ... );
extern char             *GetCmdName( int index );
extern char             *GetMenuLabel( unsigned size, gui_menu_struct *menu, unsigned id, char *buff, bool strip_amp );
extern cmd_list         *AllocCmdList( char *start, unsigned len );
extern void             FreeCmdList(cmd_list *);
extern void             FiniMacros( void );
extern void             Invoke(char *,int ,char_ring *);
extern char             *ReScan( char * );
extern void             SetUnderLine( a_window *, wnd_line_piece * );

extern char             MainTab[];
extern char             *TxtBuff;
extern wnd_info         *WndInfoTab[];
extern gui_menu_struct  WndMainMenu[];
extern int              WndNumMenus;

static char **WndDisplayNames[] = {
    #define pick( a,b,c,d,e,f ) LITREF( f ),
    #include "wndnames.h"
};

static char **WhatList[] = {
    LITREF( mac_popup_menu ),
    LITREF( mac_main_menu ),
    LITREF( mac_command_string ),
};

#define TITLE_SIZE      2
static char **Titles[] = { LITREF( Key_Name ), LITREF( Mac_Window ),
                         LITREF( Macro_Type ), LITREF( Definition ) };

enum {
    PIECE_KEY,
    PIECE_WHERE,
    PIECE_WHAT,
    PIECE_TEXT,
    PIECE_LAST
};

#define MIN_KEY_SIZE( wnd ) (8*WndAvgCharX(wnd)) // something big enough to click on

static gui_ord  Indents[PIECE_LAST];

typedef struct {
    unsigned            last_id;
    wnd_row             change_row;
    unsigned            size;
    gui_menu_struct     *menu;
    wnd_macro           *mac;
    unsigned            press_key : 1;
    unsigned            creating : 1;
    unsigned            changing : 1;
} mac_window;
#define WndMac( wnd ) ( (mac_window *)WndExtra( wnd ) )

#include "menudef.h"
static gui_menu_struct MacMenu[] = {
    #include "menumac.h"
};


static DLGPICKTEXT WndGetName;
static char *WndGetName( void *from, int i )
{
    return( *((char ***)from)[i] );
}

#ifdef DEADCODE
wnd_macro *MacFindMac( unsigned key, wnd_class class )
{
    wnd_macro   *mac;

    for( mac = WndMacroList; mac != NULL; mac = mac->link ) {
        if( mac->key == key && mac->class == class ) return( mac );
    }
    return( NULL );
}
#endif

static wnd_macro *MacGetMacro( int row )
{
    wnd_macro   *mac;
    int         count;

    count = 0;
    mac = WndMacroList;
    if( row < 0 ) return( NULL );
    for( ;; ) {
        if( mac == NULL ) break;
        if( count == row ) break;
        ++count;
        mac = mac->link;
    }
    return( mac );
}


static void MacChangeMac( a_window *wnd, wnd_macro *mac, unsigned key,
                          wnd_class class, wnd_row row )
{
    cmd_list    *cmds;
    wnd_macro   **owner,*curr;
    wnd_row     i;

    cmds = mac->cmd;
    LockCmdList( cmds );
    MacAddDel( mac->key, mac->class, NULL );
    curr = MacAddDel( key, class, cmds );
    for( owner = &WndMacroList; *owner; owner = &(*owner)->link ) {
        if( *owner == curr ) break;
    }
    *owner = curr->link;
    i = 0;
    for( owner = &WndMacroList; *owner; owner = &(*owner)->link ) {
        if( i == row ) break;
        ++i;
    }
    curr->link = *owner;
    *owner = curr;
    WndNewCurrent( wnd, i, PIECE_KEY );
}

static void     MacModify( a_window *wnd, int row, int piece );

static bool MacModWhat( a_window *wnd, wnd_row row )
{
    int         new;
    int         old;
    wnd_macro           *mac = MacGetMacro( row );

    wnd=wnd;
    old = mac->type;
    if( mac->class == WND_ALL ) {
        new = DlgPickWithRtn( LIT( Macro_Type ), WhatList+1,
                       mac->type == MACRO_COMMAND, WndGetName, ArraySize( WhatList )-1 );
        if( new != -1 ) ++new;
    } else {
        new = DlgPickWithRtn( LIT( Macro_Type ), WhatList,
                       mac->type, WndGetName, ArraySize( WhatList ) );
    }
    if( new != -1 ) {
        mac->type = new;
        if( new != old ) {
            MacModify( wnd, row, PIECE_TEXT );
        }
        return( TRUE );
    } else {
        return( FALSE );
    }
}


bool MacKeyHit( a_window *wnd, unsigned key )
{
    mac_window  *wndmac = WndMac( wnd );
    wnd_macro   *mac,*curr;
    wnd_row     row;
    int         new;

    if( wndmac->press_key ) {
        if( KeyName( key ) == NULL ) {
            Ring();
            return( TRUE );
        }
        wndmac->press_key = FALSE;
        WndZapped( wnd );
        if ( key == GUI_KEY_ESCAPE ) return( TRUE );
        if( wndmac->changing ) {
            wndmac->changing = FALSE;
            mac = MacGetMacro( wndmac->change_row );
            MacChangeMac( wnd, mac, key, mac->class, wndmac->change_row );
        } else if( wndmac->creating ) {
            wndmac->creating = FALSE;
            new = DlgPickWithRtn( LIT( Enter_Window ), WndDisplayNames, WND_ALL, WndGetName, WND_CURRENT );
            if( new == -1 ) return( TRUE );
            curr = MacAddDel( key, new, AllocCmdList( LIT( Quest_Marks ),
                             strlen( LIT( Quest_Marks ) ) ) );
            row = 0;
            for( mac = WndMacroList; mac != curr; mac = mac->link ) {
                ++row;
            }
            curr->type = -1;
            if( !MacModWhat( wnd, row ) ) {
                mac->type = MACRO_COMMAND;
            }
            WndScrollAbs( wnd, row );
            WndNewCurrent( wnd, row, PIECE_WHAT );
        }
        return( TRUE );
    } else {
        return( FALSE );
    }
}

static WNDCLICKHOOK MacPopupClicked;
static bool MacPopupClicked( a_window *wnd, unsigned id )
{
    char                *p;
    int                 main_id;
    mac_window          *wndmac;
    cmd_list            *cmds;

    WndInstallClickHook( NULL );
    if( wnd == NULL || WndClass( wnd ) != WND_MACRO ) return( FALSE );
    wndmac = WndMac( wnd );
    if( wndmac->mac == NULL ) return( FALSE );
    p = StrCopy( GetCmdName( CMD_ACCEL ), TxtBuff );
    *p++ = ' ';
    if( wndmac->mac->type == MACRO_MAIN_MENU ) {
        p = GetCmdEntry( MainTab, 1, p );
        *p++ = ' ';
        main_id = id - id % MAIN_MENU_MULT;
        *p++ = '{';
        p = GetMenuLabel( wndmac->size, wndmac->menu, main_id, p, FALSE );
        *p++ = '}';
        *p++ = ' ';
        *p++ = '{';
        p = GetMenuLabel( wndmac->size, wndmac->menu, id, p, FALSE );
    } else {
        *p++ = '{';
        p = GetMenuLabel( wndmac->size, wndmac->menu, id, p, FALSE );
    }
    if( p != NULL ) {
        *p++ = '}';
        *p++ = '\0';
        cmds = AllocCmdList( TxtBuff, p-TxtBuff );
        MacAddDel( wndmac->mac->key, wndmac->mac->class, cmds );
    }
    return( TRUE );
}


static void MacModMenu( a_window *wnd, wnd_row row )
{
    wnd_info            *info;
    gui_point           point;
    int                 dummy;
    mac_window          *wndmac= WndMac( wnd );
    wnd_macro           *mac = MacGetMacro( row );

    info = WndInfoTab[ mac->class ];
    WndCurrToGUIPoint( wnd, &point );
    WndInstallClickHook( MacPopupClicked );
    if( mac->type == MACRO_MAIN_MENU ) {
        wndmac->last_id = 0;
        wndmac->menu = WndMainMenu;
        wndmac->size = WndNumMenus-2;
        wndmac->mac = mac;
        WndCreateFloatingPopup( wnd, &point, wndmac->size, wndmac->menu, &dummy );
    } else {
        wndmac->last_id = 0;
        wndmac->menu = info->popupmenu;
        wndmac->size = info->num_popups;
        wndmac->mac = mac;
        WndChangeMenuAll( info->popupmenu, info->num_popups, FALSE, GUI_GRAYED );
        WndCreateFloatingPopup( wnd, &point, wndmac->size, wndmac->menu, &dummy );
    }
}

static void MacModWhere( a_window *wnd, wnd_row row )
{
    int                 new;
    wnd_macro           *mac = MacGetMacro( row );
    wnd_class           def;

    wnd=wnd;
    def = mac->class == WND_NO_CLASS ? WND_ALL : mac->class;
    new = DlgPickWithRtn( LIT( Enter_Window ), WndDisplayNames, def, WndGetName, WND_CURRENT );
    if( new == -1 ) return;
//    WndRepaint( wnd );
    MacChangeMac( wnd, mac, mac->key, new, row );

⌨️ 快捷键说明

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