📄 tabprop.c
字号:
#include <ansi_c.h>#include <userint.h>#include "toolbox.h"#include "easytab.h"#include "tabprpui.h"#include "tabprop.h"#define TAB_EDIT_TYPE "EditTabDlg"#define TAB_RCLICK_EDIT_TYPE "EasyTabRightClickEdit"#define TAB_EDIT_METAFONT_NAME "Tab Edit Meta Font"static int gMetaFontSuffix = 1;typedef struct { int panel; int tabCtrl; int editDlg; int tabsPanel; int fontPanel; int tabAttrsPanel; int boundsPanel; } TabEditDlg;typedef struct { int enabled; } RightClickEditInfo; static int TabEdit_LoadDialog(TabEditDlg *info);static void TabEdit_UpdateBoundsDisplay(TabEditDlg *info);static void TabEdit_UpdateValues(TabEditDlg *info);static int TabEdit_ChainDlgCallbackData(TabEditDlg *info, int panel);static ListType TabEdit_GetActiveDlgList(void);static int TabEdit_PositionInActiveDlgList(int panel, int tabCtrl);static int TabEdit_Create(int panel, int easyTabCtrl, TabEditDlg **newInfo);static void TabEdit_Discard(TabEditDlg *info);static int TabEdit_Apply(TabEditDlg *info);static void TabEdit_InitValues(TabEditDlg *info);static void TabEdit_UpdateUserSpecifiedBounds(TabEditDlg *info);static void TabEdit_UpdateAttrValues(TabEditDlg *info);int CVICALLBACK RightClickEditCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2);/***************************************************************/static int TabEdit_LoadDialog(TabEditDlg *info){ int error = 0; int editDlg; errChk( info->editDlg = LoadPanel(0, "tabprpui.uir", EDIT)); errChk( EasyTab_ConvertFromCanvas(info->editDlg, EDIT_CANVAS)); errChk( EasyTab_LoadPanels (info->editDlg, EDIT_CANVAS, 1, "tabprpui.uir", __CVIUserHInst, TABS, &info->tabsPanel, BOUNDS, &info->boundsPanel, FONT, &info->fontPanel, TAB_ATTRS, &info->tabAttrsPanel, ABOUT, 0, 0)); errChk(TabEdit_ChainDlgCallbackData(info, info->editDlg)); Error: return error;}/***************************************************************/ /* Recursively chain the callback data of the panel, its controls, and all child panels, etc. to be the TabEditDlg structure so dialog callback events can know which dialog and which easyTab control they are dealing with. */static int TabEdit_ChainDlgCallbackData(TabEditDlg *info, int panel){ int error = 0; int ctrl; int child; errChk( ChainPanelCallback(panel, NULL, info, TAB_EDIT_TYPE)); GetPanelAttribute(panel, ATTR_PANEL_FIRST_CTRL, &ctrl); while (ctrl > 0) { errChk( ChainCtrlCallback (panel, ctrl, NULL, info, TAB_EDIT_TYPE)); GetCtrlAttribute(panel, ctrl, ATTR_NEXT_CTRL, &ctrl); } GetPanelAttribute(panel, ATTR_FIRST_CHILD, &child); while (child > 0) { errChk( TabEdit_ChainDlgCallbackData(info, child)); GetPanelAttribute(child, ATTR_NEXT_PANEL, &child); } Error: return error;}/***************************************************************/ /* keep a list of the active tab property editing dialogs */static ListType TabEdit_GetActiveDlgList(void){ static ListType activeList = 0; if (!activeList) activeList = ListCreate(sizeof(TabEditDlg *)); return activeList;}/***************************************************************/int CVICALLBACK RightClickEditCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){ RightClickEditInfo *info = 0; if (event == EVENT_RIGHT_CLICK) { if (GetChainedCallbackData (panel, control, TAB_RCLICK_EDIT_TYPE, (void **)&info) >= 0) { if (info->enabled) EditTabProperties(panel, control); } } return 0;}/***************************************************************/int EasyTab_EnableRClickEditing(int panel, int tabCtrl, int enabled){ int error = 0; RightClickEditInfo *newInfo = 0; RightClickEditInfo *info = 0; int dummyColor; errChk( EasyTab_GetAttribute (panel, tabCtrl, ATTR_EASY_TAB_LABEL_COLOR, &dummyColor)); /* call an easytab function to force an error if the control is not an easytab control */ if ( GetChainedCallbackData (panel, tabCtrl, TAB_RCLICK_EDIT_TYPE, (void **)&info) >= 0) info->enabled = enabled; else { nullChk( newInfo = (RightClickEditInfo *)calloc(sizeof(*newInfo), 1)); newInfo->enabled = enabled; errChk( ChainCtrlCallback (panel, tabCtrl, RightClickEditCallback, newInfo, TAB_RCLICK_EDIT_TYPE)); } Error: if (error < 0) { free(newInfo); return error; } else return 0;}/***************************************************************/int EditTabProperties(int panel, int easyTabCtrl){ int error = 0; TabEditDlg *info = NULL; int position; position = TabEdit_PositionInActiveDlgList(panel, easyTabCtrl); if (position > 0) ListGetItem(TabEdit_GetActiveDlgList(), &info, position); else /* if there isn't a property editing dialog active for this easy tab control, make one */ errChk( TabEdit_Create(panel, easyTabCtrl, &info)); DisplayPanel(info->editDlg); Error: return error;}/***************************************************************/static int TabEdit_Create(int panel, int easyTabCtrl, TabEditDlg **newInfo){ int error = 0; TabEditDlg *info = 0; ListType dlgList; *newInfo = NULL; nullChk( dlgList = TabEdit_GetActiveDlgList()); info = calloc(sizeof(*info), 1); info->panel = panel; info->tabCtrl = easyTabCtrl; errChk( TabEdit_LoadDialog(info)); TabEdit_InitValues(info); nullChk( ListInsertItem(dlgList, &info, END_OF_LIST)); Error: if (error < 0) TabEdit_Discard(info); else *newInfo = info; return error;}/***************************************************************/ /* returns list index, or 0 if not in the list */static int TabEdit_PositionInActiveDlgList(int panel, int tabCtrl){ int index; int numItems; ListType dlgList; TabEditDlg *currInfo; if (dlgList = TabEdit_GetActiveDlgList()) { numItems = ListNumItems(dlgList); for (index = 1; index <= numItems; index++) { ListGetItem(dlgList, &currInfo, index); if (currInfo->panel == panel && currInfo->tabCtrl == tabCtrl) return index; } } return 0;}/***************************************************************/static void TabEdit_Discard(TabEditDlg *info){ if (info) { int position; position = TabEdit_PositionInActiveDlgList(info->panel, info->tabCtrl); if (position > 0) ListRemoveItem(TabEdit_GetActiveDlgList(), 0, position); if (info->editDlg > 0) DiscardPanel(info->editDlg); free(info); }}/***************************************************************/static void TabEdit_InitValues(TabEditDlg *info){ ListType panelList = NULL; int numItems = 0; int index; int panel; char title[256]; EasyTab_GetPanelList(info->panel, info->tabCtrl, &panelList); if (panelList) { ClearListCtrl(info->tabsPanel, TABS_ACTIVE); numItems = ListNumItems(panelList); for (index = 1; index <= numItems; index++) { ListGetItem(panelList, &panel, index); GetPanelAttribute(panel, ATTR_TITLE, title); RemoveAcceleratorEscapeCode(title); InsertListItem (info->tabsPanel, TABS_ACTIVE, -1, title, panel); InsertListItem (info->tabAttrsPanel, TAB_ATTRS_WHICHTAB, -1, title, panel); } } SetCtrlAttribute(info->tabsPanel, TABS_ACTIVE, ATTR_DIMMED, numItems <= 0); TabEdit_UpdateValues(info); TabEdit_UpdateUserSpecifiedBounds(info); ListDispose(panelList);}/***************************************************************/static void TabEdit_UpdateTabAttrValues(TabEditDlg *info){ int numPanels; int whichPanel; int textLength; char *text = 0; int visible; int bgColor; int dimmed; GetNumListItems (info->tabAttrsPanel, TAB_ATTRS_WHICHTAB, &numPanels); if (numPanels > 0) { GetCtrlVal(info->tabAttrsPanel, TAB_ATTRS_WHICHTAB, &whichPanel); EasyTab_GetTabAttribute(info->panel, info->tabCtrl, whichPanel, ATTR_EASY_TAB_LABEL_TEXT_LENGTH, &textLength); text = (char *)malloc(textLength+1); EasyTab_GetTabAttribute(info->panel, info->tabCtrl, whichPanel, ATTR_EASY_TAB_LABEL_TEXT, text); EasyTab_GetTabAttribute(info->panel, info->tabCtrl, whichPanel, ATTR_EASY_TAB_VISIBLE, &visible); EasyTab_GetTabAttribute(info->panel, info->tabCtrl, whichPanel, ATTR_EASY_TAB_LABEL_BG_COLOR, &bgColor); EasyTab_GetTabAttribute(info->panel, info->tabCtrl, whichPanel, ATTR_EASY_TAB_DIMMED, &dimmed); SetCtrlVal (info->tabAttrsPanel, TAB_ATTRS_LABELTEXT, text); SetCtrlVal (info->tabAttrsPanel, TAB_ATTRS_VISIBLE, visible); SetCtrlVal (info->tabAttrsPanel, TAB_ATTRS_LABELBGCOLOR, bgColor);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -