/////////////////////////////////////////////////////////////////////////////// // // IMPORTANT NOTICE // // The following open source license statement does not apply to any // entity in the Exception List published by FMSoft. // // For more information, please visit: // // https://www.fmsoft.cn/exception-list // ////////////////////////////////////////////////////////////////////////////// /* * This file is part of MiniGUI, a mature cross-platform windowing * and Graphics User Interface (GUI) support system for embedded systems * and smart IoT devices. * * Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd. * Copyright (C) 1998~2002, WEI Yongming * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Or, * * As this program is a library, any link to this program must follow * GNU General Public License version 3 (GPLv3). If you cannot accept * GPLv3, you need to be licensed from FMSoft. * * If you have got a commercial license of this program, please use it * under the terms and conditions of the commercial license. * * For more information about the commercial license, please refer to * . */ /* ** gridview.c: an grid control ** ** Created by Peng Ke at 2004/11/29 */ /* ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _GRIDVIEW_IMPL_H_ #define _GRIDVIEW_IMPL_H_ #include #include #include #include #include "common.h" #ifdef _MGCTRL_GRIDVIEW #include "minigui.h" #include "gdi.h" #include "window.h" #include "control.h" #include "scrolled.h" #define psvscr (&view->scrdata) //#define GV_LEFTMARGIN 5 #define GV_RIGHTMARGIN 5 //#define GV_TOPMARGIN 5 #define GV_BOTTOMMARGIN 5 typedef enum _gvGridCellType { GVCT_TABLEHEADER = 1, GVCT_IMPL_H_EADER, GVCT_TEXT, GVCT_NUMBER, GVCT_CHECKBOX, GVCT_SELECTION, GVCT_CUSTOM = 255 } gvGridCellType; typedef struct _gvGridViewData gvGridViewData; typedef struct _gvGridCellData gvGridCellData; typedef struct _gvGridCellDataTableHeader { int width; int height; char* text; BOOL col_first; gal_pixel color_fg; gal_pixel color_bg; PLOGFONT font; PBITMAP image; gvGridCellData* def_cell; } gvGridCellDataTableHeader; typedef struct _gvGridCellDataHeader { int size; int end_xy; char* text; gal_pixel color_fg; gal_pixel color_bg; PLOGFONT font; PBITMAP image; gvGridCellData* def_cell; } gvGridCellDataHeader; typedef struct _gvGridCellDataText { char* text; gal_pixel color_fg; gal_pixel color_bg; PLOGFONT font; PBITMAP image; } gvGridCellDataText; typedef struct _gvGridCellDataNumber { double num; char* format; gal_pixel color_fg; gal_pixel color_bg; PLOGFONT font; PBITMAP image; } gvGridCellDataNumber; typedef struct _gvGridCellDataCheckBox { HWND handle; BOOL dirty; BOOL checked; char* text; gal_pixel color_fg; gal_pixel color_bg; PLOGFONT font; PBITMAP image; } gvGridCellDataCheckBox; typedef struct _gvGridCellDataSelection { HWND handle; BOOL dirty; int cur_index; char* text; gal_pixel color_fg; gal_pixel color_bg; PLOGFONT font; PBITMAP image; } gvGridCellDataSelection; #if 0 typedef struct _gvGridCellDataCustom { DWORD dwAddData; FUNC* on_paint; FUNC* on_edit; FUNC* end_edit; FUNC* on_destroy; } gvGridCellDataCustom; #endif typedef struct _GridCellFormat { DWORD mask; DWORD text_format; gal_pixel color_fg; gal_pixel color_bg; gal_pixel color_border; gal_pixel hl_color_fg; gal_pixel hl_color_bg; gal_pixel hl_color_border; PLOGFONT font; } GridCellFormat; typedef int (*gvGridCellCallback_init)(gvGridCellData* cell); typedef int (*gvGridCellCallback_merge)(gvGridCellData* cell, gvGridCellData* data); typedef int (*gvGridCellCallback_copy)(gvGridCellData* to, gvGridCellData* from); typedef void (*gvGridCellCallback_get_format)(gvGridCellData* cell, HWND hWnd, HDC hdc, GridCellFormat* format); typedef int (*gvGridCellCallback_draw)(gvGridCellData* cell, gvGridViewData* view, HDC hdc, int row, int col, RECT* rect); typedef int (*gvGridCellCallback_draw_content)(gvGridCellData* cell, gvGridViewData* view, HDC hdc, int row, int col, RECT* rect, GridCellFormat* format); typedef HWND (*gvGridCellCallback_get_control)(gvGridCellData* cell, gvGridViewData* view, int row, int col); typedef int (*gvGridCellCallback_begin_edit)(gvGridCellData* cell, gvGridViewData* view, int row, int col, RECT* rect); typedef int (*gvGridCellCallback_end_edit)(gvGridCellData* cell, gvGridViewData* view, int row, int col); typedef int (*gvGridCellCallback_on_destroy)(gvGridCellData* cell); typedef int (*gvGridCellCallback_get_text_value)(gvGridCellData* cell, int row, int col, char* buf, int buf_len); typedef void (*gvGridCellCallback_set_text_value)(gvGridCellData* cell, int row, int col, char* text); typedef double (*gvGridCellCallback_get_double_value)(gvGridCellData* cell, int row, int col); struct _GridCellFunc { gvGridCellCallback_init init; gvGridCellCallback_merge merge; gvGridCellCallback_copy copy; gvGridCellCallback_get_text_value get_text_value; gvGridCellCallback_set_text_value set_text_value; gvGridCellCallback_get_double_value get_double_value; gvGridCellCallback_get_control get_control; gvGridCellCallback_get_format get_format; gvGridCellCallback_draw draw; gvGridCellCallback_draw_content draw_content; gvGridCellCallback_draw invisible_draw; gvGridCellCallback_begin_edit begin_edit; gvGridCellCallback_end_edit end_edit; gvGridCellCallback_on_destroy on_destroy; }; typedef struct _GridCellFunc GridCellFunc; extern GridCellFunc* gvGridCellTypeNull; extern GridCellFunc* gvGridCellTypeTableHeader; extern GridCellFunc* gvGridCellTypeHeader; extern GridCellFunc* gvGridCellTypeText; extern GridCellFunc* gvGridCellTypeNumber; extern GridCellFunc* gvGridCellTypeCheckBox; extern GridCellFunc* gvGridCellTypeSelection; struct _gvGridCellData { GridCellFunc* func; DWORD mask; DWORD style; int celltype; union { gvGridCellDataTableHeader table; gvGridCellDataHeader header; gvGridCellDataText text; gvGridCellDataNumber number; gvGridCellDataCheckBox checkbox; gvGridCellDataSelection selection; // gvGridCellDataCustom custom; } data; }; struct _gvGridDataModal { int (*get_col_count)(gvGridViewData* view); int (*get_row_count)(gvGridViewData* view); gvGridCellData* (*get_value_at)(gvGridViewData* view, int row, int col); int (*set_value_at)(gvGridViewData* view, int row, int col, gvGridCellData* data); gvGridCellData* (*get_value_or_default_at)(gvGridViewData* view, int row, int col); int (*add_new_row)(gvGridViewData* view, int index); int (*delete_row)(gvGridViewData* view, int index); int (*add_new_col)(gvGridViewData* view, int index); int (*delete_col)(gvGridViewData* view, int index); void* data; }; typedef struct _gvGridDataModal gvGridDataModal; typedef struct _gvGridCellDepedence gvGridCellDepedence; struct _gvGridCellDepedence { int id; GRIDCELLS source; GRIDCELLS target; GRIDCELLEVALCALLBACK callback; DWORD dwAddData; gvGridCellDepedence* next; }; struct _gvGridViewData { /* scrollview object */ SCRDATA scrdata; int ctrl_id; HWND hCtrl; HWND hEdit; GRIDCELLS highlight_cells; //GRIDCELLS selected_cells; int index_drag; int drag_x; int drag_y; int ContX; int ContY; int cur_cursor_id; int mouse_status; gvGridDataModal* modal; int depend_cur_id; gvGridCellDepedence* depend_list; // will delete, use selected_cells int current_row; // base 1? int current_col; // base 1? //will delete, use mouse_status //int is_mouse_down; //int is_drag; RECT cells_rect; }; // mouse status mask enum { MOUSE_DEFAULT, MOUSE_CELL_SELECT, MOUSE_ROW_SELECT, MOUSE_COLUMN_SELECT, MOUSE_ROW_RESIZE, MOUSE_COLUMN_RESIZE }; typedef struct _GridCellEditData { gvGridViewData* view; gvGridCellData* cell; int row; int col; int is_default; int commit; WNDPROC old_proc; }GridCellEditData; int gvGridCells_is_in_cells(GRIDCELLS* cells, int row, int col); int gvGridCells_intersect(GRIDCELLS* first, GRIDCELLS* second); BOOL RegisterGridViewControl (void); #endif /* _MGCTRL_GRIDVIEW */ #endif /* _GRIDVIEW_IMPL_H_ */