Mercurial > projects > dynamin
diff dynamin/gui/notebook.d @ 0:aa4efef0f0b1
Initial commit of code.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Mon, 15 Jun 2009 22:10:48 -0500 |
parents | |
children | 4029d5af7542 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dynamin/gui/notebook.d Mon Jun 15 22:10:48 2009 -0500 @@ -0,0 +1,192 @@ +// Written in the D programming language +// www.digitalmars.com/d/ + +/* + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Dynamin library. + * + * The Initial Developer of the Original Code is Jordan Miner. + * Portions created by the Initial Developer are Copyright (C) 2007-2009 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Jordan Miner <jminer7@gmail.com> + * + */ + +module dynamin.gui.notebook; + +import dynamin.core.event; +import dynamin.core.list; +import dynamin.all_gui; +import dynamin.all_painting; +import dynamin.core.string; +import tango.core.Exception; + +/// +class TabPage { +protected: + string _text; + Control _content; + Point _tabLocation; + Size _tabSize; +public: + /** + * Gets or sets the text displayed on the tab of this tab page. + */ + string text() { return _text; } + /// ditto + void text(string str) { _text = str; } + /** + * Gets or sets the control that is shown in this tab page. + */ + Control content() { return _content; } + /// ditto + void content(Control c) { _content = c; } + Point tabLocation() { return _tabLocation; } + void tabLocation(Point pt) { _tabLocation = pt; } + Size tabSize() { return _tabSize; } + void tabSize(Size sz) { _tabSize = sz; } +} + +/** + * A notebook is a control that has tabs and changes what it displays + * depending upon which tab is selected. + * + * The appearance of a notebook with Windows Classic: + * + * $(IMAGE ../web/example_notebook.png) + */ +class Notebook : Container { +protected: + List!(TabPage) _tabPages; + int _selectedIndex = -1; + bool _multipleLines = true; + Control _content; + package int _tabAreaSize; + override void whenMouseDown(MouseEventArgs e) { + if(e.button != MouseButton.Left) + return; + foreach(i, page; _tabPages) { + if((page.tabLocation+page.tabSize).contains(e.location)) + selectedIndex = i; + } + } + override void whenPainting(PaintingEventArgs e) { + Theme.current.Notebook_paint(this, e.graphics); + foreach(page; _tabPages) { + if(page is selectedTabPage) + continue; + + Theme.current.Tab_paint(page, this, e.graphics); + } + Theme.current.Tab_paint(selectedTabPage, this, e.graphics); + } + void whenTabPagesChanged() { + if(_tabPages.count == 0) + selectedIndex = -1; + else if(selectedIndex == -1) + selectedIndex = 0; + layout(); + } +public: + /// This event occurs after a different tab is selected. + Event!() selectionChanged; + /// Override this method in a subclass to handle the SelectionChanged event. + protected void whenSelectionChanged(EventArgs e) { + if(_content !is null) + _children.remove(_content); + _content = null; + if(_selectedIndex >= 0) { + _content = selectedTabPage.content; + add(_content); + } + layout(); + } + + this() { + selectionChanged = new Event!()(&whenSelectionChanged); + + _tabPages = new List!(TabPage)(&whenTabPagesChanged); + _focusable = true; + } + override void layout() { + _tabAreaSize = 20; + int x = 2; + foreach(page; _tabPages) { + page.tabLocation = Point(x, 2); + page.tabSize = Size(70, 18); + x += 70; + } + if(_content) { + auto border = Theme.current.Notebook_borderSize(this); + _content.location = [border.left, _tabAreaSize+border.top]; + _content.size = [width-border.left-border.right, height-border.top-border.bottom-_tabAreaSize]; + } + } + /** + * Gets the tab pages displayed in this notebook. + * Examples: + * ----- + * TabPage advancedPage = new TabPage; + * advancedPage.text = "Advanced"; + * advancedPage.content = advancedPanel; // a previously created Panel + * tabbedView.TabPages.Add(advancedPage); + * ----- + */ + List!(TabPage) tabPages() { return _tabPages; } + /** + * Gets or sets the selected tab using its index. An index of -1 means + * there is no selected tab. + */ + int selectedIndex() { return _selectedIndex; } + /// ditto + void selectedIndex(int index) { + if(index < -1) + throw new IllegalArgumentException("index cannot be less than -1"); + _selectedIndex = index; + selectionChanged(new EventArgs); + } + + /** + * Gets or sets the selected tab using its tab page. + * A value of null means there is no selected tab. + * A specified tab page must be in the TabPages list. + */ + TabPage selectedTabPage() { + if(_selectedIndex == -1) + return null; + else + return _tabPages[_selectedIndex]; + } + /// ditto + void selectedTabPage(TabPage p) { + if(p is null) { + selectedIndex = -1; + return; + } + foreach(i, page; _tabPages) { + if(p is page) { + selectedIndex = i; + break; + } + } + // if here, do nothing + } + bool multipleLines() { return _multipleLines; } + void multipleLines(bool b) { + if(b == false) + throw new Exception("sorry, MultipleLines = false not implemented"); + _multipleLines = b; + } +} +