-module(ex_grid).
-behaviour(wx_object).
%% Client API
-export([start/1, new/0]).
%% wx_object callbacks
-export([init/1, terminate/2, code_change/3,
handle_info/2, handle_call/3, handle_cast/2, handle_event/2]).
-include_lib("wx/include/wx.hrl").
-record(state,
{
parent,
config,
grid
}).
start(Config) ->
wx_object:start_link(?MODULE, Config, []).
init(Config) ->
wx:batch(fun() -> do_init(Config) end).
handle_event(#wx{event = #wxKey{type = key_up, keyCode = KeyCode}}, State) ->
#state{grid = Grid} = State,
case KeyCode of
$a ->
wxGrid:insertRows(Grid),
io:format("a");
_ ->
ok
end,
{noreply, State#state{}};
handle_event(#wx{event = #wxGrid{type = grid_cell_change,
row = Row, col = Col}},
State = #state{grid = Grid}) ->
Val = wxGrid:getCellValue(State#state.grid, Row, Col),
io:format("Cell {~p,~p} changed to ~p.\n",[Row,Col,Val]),
draw(Grid),
{noreply, State};
handle_event(#wx{id=Id, event=#wxCommand{type=command_button_clicked}},
#state{parent=Panel, config=Config} = State) ->
case Id of
1100 ->
Parent = proplists:get_value(parent, Config),
ToolBar = wxFrame:getToolBar(Parent),
io:format("get toolbar = ~p~n", [ToolBar]),
wxWindow:show(ToolBar, [{show, false}]),
io:format("Panel command_button_clicked~n ");
1000 ->
io:format("Frame command_button_clicked~n ");
1001 ->
io:format("Reparent command_button_clicked~n ");
_ ->
Parent = proplists:get_value(parent, Config),
ToolBar = wxFrame:getToolBar(Parent),
wxWindow:show(ToolBar, [{show, true}]),
io:format("Id = ~p~n", [Id])
end,
{noreply,State};
handle_event(#wx{event = #wxFontPicker{type = command_fontpicker_changed, font = Font}},
#state{} = State) ->
io:format("Font changed to ~p~n", [Font]),
{noreply, State};
handle_event(Event, State) ->
io:format("Event = ~p~n", [Event]),
{noreply, State}.
%% Callbacks handled as normal gen_server callbacks
handle_info(_Msg, State) ->
{noreply, State}.
handle_call(shutdown, _From, State=#state{parent=Panel}) ->
wxPanel:destroy(Panel),
{stop, normal, ok, State};
handle_call(_Msg, _From, State) ->
{reply,{error, nyi}, State}.
handle_cast(Msg, State) ->
io:format("Got cast ~p~n",[Msg]),
{noreply,State}.
code_change(_, _, State) ->
{stop, ignore, State}.
terminate(_Reason, _State) ->
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Local functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create_grid(Panel) ->
%% Create the grid with 100 * 5 cells
Grid = wxGrid:new(Panel, 2, []),
wxGrid:createGrid(Grid, 8, 7),
% wxGrid:setCellBackgroundColour(Grid, ?wxBLACK),
wxGrid:setCellTextColour(Grid, ?wxRED),
wxGrid:setBackgroundColour(Grid, ?wxRED),
Font = wxFont:new(12, ?wxFONTFAMILY_ROMAN ,?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
%% Fun to set the values and flags of the cells
Fun =
fun(Row) ->
wxGrid:setCellValue(Grid, Row, 0, "IF1502"),
wxGrid:setCellValue(Grid, Row, 1, "Editable"),
wxGrid:setCellValue(Grid, Row, 2, "Editable"),
wxGrid:setCellValue(Grid, Row, 3, "IF1502"),
wxGrid:setCellTextColour(Grid, Row, 3, ?wxWHITE),
wxGrid:setReadOnly(Grid, Row, 3, [{isReadOnly,true}]),
wxGrid:setCellValue(Grid, Row, 4, "Editable"),
wxGrid:setRowSize(Grid, Row, 30),
case Row rem 4 of
0 ->
Font0 = wxFont:new(12, ?wxFONTFAMILY_DEFAULT ,?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
wxGrid:setCellFont(Grid, Row, 0, Font0),
Font00 = wxFont:new(12, ?wxFONTFAMILY_ROMAN ,?wxFONTSTYLE_ITALIC,
?wxFONTWEIGHT_NORMAL, []),
wxGrid:setCellFont(Grid, Row, 3, Font00),
wxGrid:setCellBackgroundColour(Grid, Row, 3, ?wxRED);
1 ->
Font1 = wxFont:new(12, ?wxFONTFAMILY_DECORATIVE ,?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
wxGrid:setCellFont(Grid, Row, 0, Font1),
wxGrid:setCellBackgroundColour(Grid, Row, 3, ?wxGREEN),
wxGrid:setCellTextColour(Grid, Row, 2, {255,215,0,255});
2 ->
Font2 = wxFont:new(11, ?wxFONTFAMILY_ROMAN ,?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
wxFont:setWeight(Font2, ?wxFONTWEIGHT_BOLD),
wxFont:setDefaultEncoding(?wxFONTENCODING_MACROMAN),
Font22 = wxFont:new(11, ?wxFONTFAMILY_ROMAN ,?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
wxFont:setWeight(Font22, ?wxFONTWEIGHT_LIGHT),
wxGrid:setCellFont(Grid, Row, 0, Font2),
wxGrid:setCellFont(Grid, Row, 3, Font22),
wxGrid:setCellBackgroundColour(Grid, Row, 3, ?wxBLUE);
_ ->
wxGrid:setCellBackgroundColour(Grid, Row, 1, ?wxCYAN),
wxGrid:setCellValue(Grid, Row, 1,
"Centered"),
wxGrid:setCellAlignment(Grid, Row, 4,
0,?wxALIGN_CENTER),
wxGrid:setCellValue(Grid, Row, 4,
"Centered"),
wxGrid:setCellAlignment(Grid, Row, 1,
?wxALIGN_RIGHT,0),
wxGrid:setCellTextColour(Grid, Row, 3, ?wxBLACK),
wxGrid:setCellAlignment(Grid, Row, 2,
?wxALIGN_CENTER,
?wxALIGN_CENTER),
wxGrid:setCellFont(Grid, Row, 0, Font),
wxGrid:setCellValue(Grid, Row, 2,
"Centered")
end
end,
%% Apply the fun to each row
wx:foreach(Fun, lists:seq(0, 16)),
lists:foreach(
fun(Seq) ->
wxGrid:setColSize(Grid, Seq, 100)
end, lists:seq(0, 4)),
% wxGrid:setRowLabelSize(Grid, 0),
wxGrid:setColLabelSize(Grid, 0),
%%
Attr = wxGrid:getOrCreateCellAttr(Grid, 1, 1),
% wxGridCellAttr:setTextColour(Attr, ?wxRED),
% wxGrid:setSelectionForeground(Grid, ?wxGREEN),
% wxGrid:setSelectionBackground(Grid, ?wxBLUE),
wxGrid:selectRow(Grid, 3),
io:format("selected row ~n"),
%%
Editor = wxGrid:getCellEditor(Grid, 2, 2),
wxGrid:setRowSize(Grid, 0, 30),
wxGrid:setRowLabelSize(Grid, 30),
wxGrid:setColLabelSize(Grid, 0),
wxGrid:setSelectionBackground(Grid, {170, 175, 180}),
wxGrid:setCellBackgroundColour(Grid, 1, 1, ?wxBLUE),
wxGrid:connect(Grid, grid_cell_change),
wxGrid:connect(Grid, key_up),
Grid.
new() ->
_WX = wx:new(),
Size = {size, {600, 600}},
Pos = {pos, {200, 300}},
Style = {style, ?wxDEFAULT_FRAME_STYLE},
NOptions = [Pos, Size, Style],
Frame = makeFrame("wxGrid", NOptions),
start([{parent, Frame}]).
do_init(Config) ->
Parent = proplists:get_value(parent, Config),
Panel = wxPanel:new(Parent, []),
%% Setup sizers
MainSizer = wxBoxSizer:new(?wxVERTICAL),
Sizer = wxBoxSizer:new(?wxVERTICAL),
Button = wxButton:new(Panel, 1100, [{label, "testP"},
{style, ?wxNO_BORDER bor ?wxBU_EXACTFIT}]),
wxButton:setBackgroundColour(Button, ?wxBLACK),
Grid = create_grid(Panel),
L1 = label_to_bitmap("日", ?wxGREEN_BRUSH, {255, 248, 80}, {24, 24}),
StaticBitmap = wxStaticBitmap:new(Panel, 1, L1, [{style, ?wxBORDER_SUNKEN}]),
BBT1 = wxBitmapButton:new(Panel, 14, L1),
wxButton:connect(Button, command_button_clicked),
%% Add to sizers
Options = [{flag, ?wxEXPAND}, {proportion, 1}],
Frame = wxFrame:new(Panel, ?wxID_ANY, ""),
ToolBar = wxFrame:createToolBar(Frame, [{style, ?wxTB_DOCKABLE bor ?wxTB_HORIZONTAL}]),
KLabels = ["日","周","月","季","X", "1", "3", "5", "15", "30", "60", "Y"],
Font = wxFont:new(12, ?wxFONTFAMILY_TELETYPE,
?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
wxFont:setPointSize(Font, 9),
lists:foreach(
fun(KLabel) ->
ButtonK = wxButton:new(ToolBar, ?wxID_ANY, [{label, KLabel}, {size, {30, 26}}]),
wxButton:connect(ButtonK, command_button_clicked),
wxWindow:setFont(ButtonK, Font),
wxToolBar:addControl(ToolBar, ButtonK)
end, KLabels),
wxToolBar:addSeparator(ToolBar),
wxToolBar:addTool(ToolBar, ?wxID_NEW, "New", wxArtProvider:getBitmap("wxART_NEW"),
[{shortHelp, "New"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_NEW, "This is long help for 'New'"),
wxToolBar:addTool(ToolBar, ?wxID_OPEN, "Open", wxArtProvider:getBitmap("wxART_FILE_OPEN"),
[{shortHelp, "Open"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_OPEN, "This is long help for 'Open'"),
wxToolBar:addSeparator(ToolBar),
wxToolBar:addTool(ToolBar, ?wxID_COPY, "Copy", wxArtProvider:getBitmap("wxART_COPY"),
[{shortHelp, "Copy"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_COPY, "This is long help for 'Copy'"),
wxToolBar:addTool(ToolBar, ?wxID_PASTE, "Paste", wxArtProvider:getBitmap("wxART_PASTE"),
[{shortHelp, "Paste"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_PASTE, "This is long help for 'Paste'"),
wxToolBar:addControl(ToolBar,wxStaticText:new(ToolBar, 5, "This is a tool bar",
[{style, ?wxBORDER_SUNKEN}])),
ButtonR = wxButton:new(ToolBar, 1001, [{label, "Reparent"},
{style, ?wxNO_BORDER bor ?wxBU_EXACTFIT}]),
wxButton:connect(ButtonR, command_button_clicked),
wxToolBar:addControl(ToolBar, ButtonR) ,
wxToolBar:realize(ToolBar),
wxWindow:reparent(ToolBar, Panel),
% wxFrame:show(Frame, [{show, false}]),
% wxWindow:destroy(Frame),
L2 = test_bmp(),
TestBitmap = wxStaticBitmap:new(Panel, 11, L2, [{size, {500, 200}}]),
wxSizer:add(Sizer, ToolBar),
wxSizer:add(Sizer, Button),
wxSizer:add(Sizer, BBT1),
wxSizer:add(Sizer, StaticBitmap),
wxSizer:add(Sizer, TestBitmap),
wxSizer:add(Sizer, Grid, Options),
wxSizer:add(MainSizer, Sizer, Options),
wxPanel:setSizer(Panel, MainSizer),
wxGrid:setBackgroundColour(Grid, ?wxBLACK),
wxFrame:show(Parent),
{Panel, #state{parent=Panel, config=Config, grid = Grid}}.
test_bmp() ->
Bmp = wxBitmap:new(500, 200),
DC = wxMemoryDC:new(),
wxMemoryDC:selectObject(DC, Bmp),
wxDC:setBackground(DC, ?wxGREEN_BRUSH),
wxDC:clear(DC),
wxDC:setPen(DC, wxPen:new(?wxRED, [{width, 3}])),
wxDC:drawArc(DC, {5, 5}, {90, 90}, {45, 45}),
wxDC:drawCheckMark(DC, {20, 20, 20, 20}),
Image = wxImage:new("360.jpg"),
Image2 = wxImage:scale(Image, 50, 50),
Bmp1 = wxBitmap:new(Image2),
wxDC:drawBitmap(DC, Bmp1, {100 ,100}),
wxDC:drawCircle(DC, {20, 160}, 20),
wxDC:setBrush(DC, ?wxNullBrush),
wxDC:drawEllipse(DC, {40, 160, 100, 30}),
wxDC:drawLabel(DC, "ShankYan", {100, 0, 50, 30}),
% wxDC:drawLines(DC, [{2,2}, {12, 12}, {22,22}, {33,33}, {44, 44}, {55,55}],
% [{xoffset, 10}, {yoffset, 10}]) ,
% wxDC:drawRotatedText(DC, "ShankYan", {150, 0}, 180),
wxDC:drawRoundedRectangle(DC, {150, 0, 50, 30}, 50),
wxMemoryDC:destroy(DC),
Bmp.
makeFrame(Title, Options) ->
Frame = wxFrame:new(wx:null(), ?wxID_ANY, Title, Options),
MenuSet = wxMenu:new(),
MenuHelp = wxMenu:new(),
wxMenu:append(MenuHelp, 1, "About..."),
MenuBar = wxMenuBar:new(),
wxMenuBar:append(MenuBar, MenuSet, "Setting"),
wxMenuBar:append(MenuBar, MenuHelp, "Help"),
wxFrame:setMenuBar(Frame, MenuBar),
wxFrame:createStatusBar(Frame),
wxFrame:setStatusText(Frame,"deal wxGrid"),
ToolBar = wxFrame:createToolBar(Frame, [{style, ?wxTB_DOCKABLE bor ?wxTB_HORIZONTAL}]),
KLabels = ["日","周","月","季","X", "1", "3", "5", "15", "30", "60", "Y"],
Font = wxFont:new(12, ?wxFONTFAMILY_TELETYPE,
?wxFONTSTYLE_NORMAL,
?wxFONTWEIGHT_NORMAL, []),
wxFont:setPointSize(Font, 9),
lists:foreach(
fun(KLabel) ->
ButtonK = wxButton:new(ToolBar, ?wxID_ANY, [{label, KLabel}, {size, {30, 26}}]),
wxButton:connect(ButtonK, command_button_clicked),
wxWindow:setFont(ButtonK, Font),
wxWindow:setBackgroundColour(ButtonK, {16#FF, 16#C1, 16#25}),
wxWindow:setForegroundColour(ButtonK, ?wxWHITE),
wxToolBar:addControl(ToolBar, ButtonK)
% ButtonK = wxStaticText:new(ToolBar, 1, KLabel, []),
% % wxWindow:setForegroundColour(ButtonK, ?wxGREEN),
% wxToolBar:addControl(ToolBar, ButtonK)
end, KLabels),
wxToolBar:addSeparator(ToolBar),
wxToolBar:addTool(ToolBar, ?wxID_NEW, "New", wxArtProvider:getBitmap("wxART_NEW"),
[{shortHelp, "New"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_NEW, "This is long help for 'New'"),
wxToolBar:addTool(ToolBar, ?wxID_OPEN, "Open", wxArtProvider:getBitmap("wxART_FILE_OPEN"),
[{shortHelp, "Open"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_OPEN, "This is long help for 'Open'"),
wxToolBar:addSeparator(ToolBar),
wxToolBar:addTool(ToolBar, ?wxID_COPY, "Copy", wxArtProvider:getBitmap("wxART_COPY"),
[{shortHelp, "Copy"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_COPY, "This is long help for 'Copy'"),
wxToolBar:addTool(ToolBar, ?wxID_PASTE, "Paste", wxArtProvider:getBitmap("wxART_PASTE"),
[{shortHelp, "Paste"}]),
wxToolBar:setToolLongHelp(ToolBar, ?wxID_PASTE, "This is long help for 'Paste'"),
wxToolBar:addControl(ToolBar,wxStaticText:new(ToolBar, 5, "This is a tool bar")),
Button = wxButton:new(ToolBar, 1000, [{label, "test"},
{style, ?wxNO_BORDER bor ?wxBU_EXACTFIT}]),
wxToolBar:addControl(ToolBar, Button) ,
FontPicker = wxFontPickerCtrl:new(ToolBar, 3, [{size, {120, 30}}]),
wxToolBar:addControl(ToolBar, FontPicker) ,
wxToolBar:realize(ToolBar),
wxFrame:setToolBar(Frame,ToolBar),
io:format("ToolBar = ~p~n", [ToolBar]),
wxFrame:connect(Frame, command_menu_selected),
wxFontPickerCtrl:connect(FontPicker, command_fontpicker_changed, []),
wxButton:connect(Button, command_button_clicked),
Frame.
draw(Grid) ->
Num = wxGrid:getNumberRows(Grid),
wxGrid:insertRows(Grid, [{pos, Num}, {numRows, 1}]).
label_to_bitmap(Label, BkColor, LColor, {W, H}) ->
Bmp = wxBitmap:new(W, H),
DC = wxMemoryDC:new(),
wxMemoryDC:selectObject(DC, Bmp),
wxDC:setBackground(DC, BkColor),
wxDC:clear(DC),
Font = wxDC:getFont(DC),
CommonFont = Font,
wxFont:setWeight(CommonFont, 90),
wxFont:setPointSize(CommonFont, 10),
wxDC:setTextForeground(DC, LColor),
wxDC:drawText(DC, Label, {5, 5}),
wxMemoryDC:destroy(DC),
Bmp.