From 6f44eb584564fdc58aada34f83af90ce8981c7e2 Mon Sep 17 00:00:00 2001
From: Vadim Lopatin <coolreader.org@gmail.com>
Date: Fri, 16 Jan 2015 15:08:55 +0300
Subject: [PATCH] toolbars; fix focus problems in dock host

---
 res/mdpi/toolbar_background.9.png     | Bin 251 -> 247 bytes
 res/mdpi/toolbar_button_hover.9.png   | Bin 0 -> 246 bytes
 res/mdpi/toolbar_button_pressed.9.png | Bin 0 -> 245 bytes
 res/theme_default.xml                 |   8 +-
 res/toolbar_button_background.xml     |  23 ++++++
 src/dlangui/widgets/docks.d           |   2 +
 src/dlangui/widgets/toolbars.d        | 104 ++++++++++++++++++++++++++
 src/dlangui/widgets/widget.d          |   4 +-
 8 files changed, 137 insertions(+), 4 deletions(-)
 create mode 100644 res/mdpi/toolbar_button_hover.9.png
 create mode 100644 res/mdpi/toolbar_button_pressed.9.png
 create mode 100644 res/toolbar_button_background.xml
 create mode 100644 src/dlangui/widgets/toolbars.d

diff --git a/res/mdpi/toolbar_background.9.png b/res/mdpi/toolbar_background.9.png
index c9fe6f76818ed83f58e7e5e0e58d3f746a62891f..8b65deb3067ec07c7ba7cb281565f9511a70884a 100644
GIT binary patch
delta 147
zcmV;E0BryJ0rvrrR0|6pE=C8Zga7~lgppqxeKMc%!-o$HAHV(o&p>5x>GE|3TXQW&
z7MQ@h58oJQ0hkzQ449C^{K?~o4C11Kc-f=?0Re&kwD$p_R5AGDVAO(93q~y%CKfOb
zX&=C=OlsF?PaZ#Hur=3Wq`41RU==h?gNT;R765!iG|wRX`Bne`002ovPDHLkV1noE
BJkkIF

delta 152
zcmV;J0B8UA0s8@vR0|3s82gMN)c^nhh>>3#f4Ts}e;R<zJCFVU@Zkdk3(TSm*Pk)a
z0x&Vq7%(A+`IE;F8N@{e@v=z)0s;d6Y3~C<sbcWQ!KekJ7K~ajOe|m=(mr7P@Zkdk
zKR^F}YS(B_9zSHTHP>RKxer(v7#J9~>^e@{Afjcn1pxZSgYB~INRj{m002ovPDHLk
G0$_qE)jyj6

diff --git a/res/mdpi/toolbar_button_hover.9.png b/res/mdpi/toolbar_button_hover.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..97bdd49e58fbaf194475d621edc5e366dd2dfc9f
GIT binary patch
literal 246
zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DYhhUcNd2LAh=-f^2tCE&H|6f
zVg?3oVGw3ym^DWND9B#o>FdgVpHYCD+wxQ5k#L|;v!{z=h{fsTKOY`4gFtgb0|T?j
zpL7L&10w?ig9B&4GKa69Uiw6;?Xr*?8yj2O^7i2W-V$zsM~{d<pKj<O;bv%Lc!9$p
zP+*w_qjCS^`dPawt~>~AcITA~V>1rAePMt6x6A8pq%>Yr;L$&)zj)oj4Xaqfnhic%
g{8PXF`$P?ctgXs%*{iGO0iDC(>FVdQ&MBb@0GQEJ#sB~S

literal 0
HcmV?d00001

diff --git a/res/mdpi/toolbar_button_pressed.9.png b/res/mdpi/toolbar_button_pressed.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e4bd8b73bd8389d300bbdb181f8bf0cfafe83b8
GIT binary patch
literal 245
zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DYhhUcNd2LAh=-f^2tCE&H|6f
zVg?3oVGw3ym^DWND9B#o>FdgVpHYCDPjX9zz%8Iqlc$Sgh{fsTKOY`4gFtgb0|T?j
zpL7L&10w?ig9B&4GKa69Uiw6;?Xr*?8yj2O^7i2W-Y+5ojvf&Y_cQR2a5FSAyue`)
zD6q_e(YXI{{j6OTR~`g5yYtG0u^9*5zOX<3+vRmPQW~!*@aV6bvtZr94Xa!Z8F0l-
foAkOi#g0LHx5_)u+u!_vu3_+W^>bP0l+XkK0xeSC

literal 0
HcmV?d00001

diff --git a/res/theme_default.xml b/res/theme_default.xml
index 5f31a2a6..1ace59f3 100644
--- a/res/theme_default.xml
+++ b/res/theme_default.xml
@@ -101,6 +101,7 @@
         <state state_pressed="true" backgroundColor="#C0404080"/>
         <state state_hovered="true" backgroundColor="#F0404080"/>
     </style>
+
     <style id="TAB_UP"
         backgroundImageId="tab_up_background"
         layoutWidth="FILL_PARENT"
@@ -125,9 +126,9 @@
         backgroundColor="#F0F0F0"
         />
     <style id="TAB_WIDGET"
-        padding="3,3,3,3"
         backgroundColor="#EEEEEE"
         />
+
     <style id="MAIN_MENU"
         layoutWidth="FILL_PARENT"
         backgroundColor="#EFEFF2"
@@ -275,9 +276,10 @@
         margins="2,2,2,2"
         />
     <style id="TOOLBAR_BUTTON"
-        backgroundImageId="btn_background_transparent"
+        backgroundImageId="toolbar_button_background"
         align="Center"
-        margins="2,2,2,2"
+        margins="1,1,1,1"
+        padding="4,4,4,4"
         />
     <style id="TOOLBAR_SEPARATOR"
         align="Center"
diff --git a/res/toolbar_button_background.xml b/res/toolbar_button_background.xml
new file mode 100644
index 00000000..f48d7a4d
--- /dev/null
+++ b/res/toolbar_button_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+  <item
+    android:drawable="toolbar_button_hover"
+    android:state_enabled="false"
+    android:state_focused="true" />
+  <item
+    android:drawable="toolbar_button_hover"
+    android:state_hovered="true"
+    android:state_focused="true" />
+  <item
+    android:drawable="toolbar_button_hover"
+    android:state_focused="true" 
+  />
+  <item
+    android:drawable="toolbar_button_pressed"
+    android:state_pressed="true" />
+  <item
+    android:drawable="toolbar_button_hover"
+    android:state_hovered="true" />
+  <item
+    android:drawable="@null" />
+</selector>
diff --git a/src/dlangui/widgets/docks.d b/src/dlangui/widgets/docks.d
index cf1b8055..bbea8b20 100644
--- a/src/dlangui/widgets/docks.d
+++ b/src/dlangui/widgets/docks.d
@@ -37,6 +37,7 @@ class DockHost : WidgetGroupDefaultDrawing {
         _children.replace(widget, _bodyWidget);
         _bodyWidget = widget;
         _bodyWidget.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT);
+        _bodyWidget.parent = this;
     }
 
     void addDockedWindow(DockWindow dockWin) {
@@ -158,6 +159,7 @@ class DockWindow : VerticalLayout {
         _children.replace(widget, _bodyWidget);
         _bodyWidget = widget;
         _bodyWidget.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT);
+        _bodyWidget.parent = this;
         requestLayout();
     }
 
diff --git a/src/dlangui/widgets/toolbars.d b/src/dlangui/widgets/toolbars.d
new file mode 100644
index 00000000..bb943bdf
--- /dev/null
+++ b/src/dlangui/widgets/toolbars.d
@@ -0,0 +1,104 @@
+// Written in the D programming language.
+
+/**
+
+This module implements support of tool bars.
+
+ToolBarHost is layout to hold one or more toolbars.
+
+ToolBar is bar with tool buttons and other controls arranged horizontally.
+
+Synopsis:
+
+----
+import dlangui.widgets.toolbars;
+----
+
+
+Copyright: Vadim Lopatin, 2015
+License:   Boost License 1.0
+Authors:   Vadim Lopatin, coolreader.org@gmail.com
+*/
+module dlangui.widgets.toolbars;
+
+import dlangui.widgets.widget;
+import dlangui.widgets.layouts;
+import dlangui.widgets.controls;
+
+/// Layout with several toolbars
+class ToolBarHost : HorizontalLayout {
+    this(string ID) {
+        super(ID);
+    }
+    this() {
+        this("TOOLBAR_HOST");
+        styleId = STYLE_TOOLBAR_HOST;
+    }
+    /// create and add new toolbar (returns existing one if already exists)
+    ToolBar getOrAddToolbar(string ID) {
+        ToolBar res = getToolbar(ID);
+        if (!res) {
+            res = new ToolBar(ID);
+            addChild(res);
+        }
+        return res;
+    }
+    /// get toolbar by id; null if not found
+    ToolBar getToolbar(string ID) {
+        Widget res = childById(ID);
+        if (res) {
+            ToolBar tb = cast(ToolBar)res;
+            return tb;
+        }
+        return null;
+    }
+}
+
+/// image button for toolbar
+class ToolBarImageButton : ImageButton {
+    this(Action a) {
+        super(a);
+        styleId = STYLE_TOOLBAR_BUTTON;
+        focusable = false;
+    }
+}
+
+/// separator for toolbars
+class ToolBarSeparator : ImageWidget {
+    this() {
+        super("separator", "toolbar_separator");
+        styleId = STYLE_TOOLBAR_SEPARATOR;
+    }
+}
+
+/// Layout with buttons
+class ToolBar : HorizontalLayout {
+    this(string ID) {
+        super(ID);
+        styleId = STYLE_TOOLBAR;
+    }
+    this() {
+        this("TOOLBAR");
+    }
+    void addCustomControl(Widget widget) {
+        addChild(widget);
+    }
+    /// adds image button to toolbar
+    void addButtons(Action[] actions...) {
+        foreach(a; actions) {
+            if (a.isSeparator) {
+                addChild(new ToolBarSeparator());
+            } else {
+                Widget btn;
+                if (a.iconId) {
+                    btn = new ToolBarImageButton(a);
+                } else {
+                    btn = new Button(a);
+                    btn.styleId = STYLE_TOOLBAR_BUTTON;
+                }
+                addChild(btn);
+            }
+        }
+    }
+
+}
diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d
index 9b9db26d..e8d3f78b 100644
--- a/src/dlangui/widgets/widget.d
+++ b/src/dlangui/widgets/widget.d
@@ -1283,7 +1283,9 @@ class Widget {
         return null;
     }
     /// sets window (to be used for top level widget from Window implementation). TODO: hide it from API?
-    @property void window(Window window) { _window = window; }
+    @property void window(Window window) { 
+        _window = window; 
+    }
 
     void removeAllChildren() {
         // override