2011年7月3日日曜日

wxErlang wxNotebook Sample サンプル

wxNotebookについては、wxWidgetsではこんな感じに記述されている。
「このクラスは、関連するタブで複数のウィンドウを管理するノートブックのコントロールを表します。」



ソース:
-module(notebookTest).
-include_lib("wx.hrl").

-export([start/0]).

-define(pi, wxAuiPaneInfo).

start()->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->    
    %% Create Frame
    Frame = wxFrame:new(Wx,
 -1,
 "NoteBook Example",
 %%[{size,{300,200}}]),
 [{size,{-1,-1}}]),

    %% Create Panel
    %%Panel1 = wxPanel:new(Frame),
     Panel = wxPanel:new(Frame, []),

%% Create AuiManager
    Manager = wxAuiManager:new([{managed_wnd, Panel}
]),

%% Create wxAuiPaneInfo
    Pane = ?pi:new(),
    ?pi:closeButton(Pane),
    %?pi:right(Pane),
    ?pi:dockable(Pane, [{b, true}]),
    ?pi:floatingSize(Pane, 300,200),
    ?pi:minSize(Pane, {50,50}),
    ?pi:paneBorder(Pane),
    ?pi:floatable(Pane, [{b, true}]),

    ?pi:centrePane(Pane),

    %Pane2 = wxAuiPaneInfo:new(Pane),
    %?pi:centrePane(Pane2),
    
    %% Create Pane2 Clone?
    create_notebook(Panel, Manager, Pane),

    wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
    wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
    wxAuiManager:update(Manager),

    %% Set Connect Close
    wxFrame:connect(Frame, close_window),

    Frame.

loop(Frame) ->
    receive
% Window Close Event
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   wxWindow:destroy(Frame),
   ok
    end.

create_notebook(Parent, Manager, Pane) ->
    Style = (0
    bor ?wxAUI_NB_DEFAULT_STYLE
    bor ?wxAUI_NB_TOP
    bor ?wxAUI_NB_WINDOWLIST_BUTTON
    bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB
    bor ?wxAUI_NB_TAB_MOVE
    bor ?wxAUI_NB_SCROLL_BUTTONS
   ),
    
    Notebook = wxAuiNotebook:new(Parent, [{style, Style}]),

    Tab1 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab1, ?wxBLACK),
    wxButton:new(Tab1, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab1, "You can", []),

    Tab2 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab2, ?wxRED),
    wxButton:new(Tab2, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab2, "rearrange", []),

    Tab3 = wxPanel:new(Notebook, []),
    wxPanel:setBackgroundColour(Tab3, ?wxGREEN),
    wxButton:new(Tab3, ?wxID_ANY, [{label,"New tab"}]),
    wxAuiNotebook:addPage(Notebook, Tab3, "these tabs", []),

    wxAuiManager:addPane(Manager, Notebook, Pane),

    wxAuiNotebook:connect(Notebook, command_button_clicked),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_close, [{skip, false}]),
    wxAuiNotebook:connect(Notebook, command_auinotebook_page_changed),
    Notebook.
    
    
wx.hrlはErlangのインストールディレクトリ配下を検索すると、みつかる。
本ソースと同一ディレクトリに配置する。
本サンプルはErlangインストールディレクトリ配下にあるdemoディレクトリのex_aui.erlを参考にしている。いや、ほぼ同じである。

「New Tab」ボタンを押下しても何も起きないので注意。