From 6c00d75738bb182b5c02848b1720e6623baed4b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= Date: Fri, 1 Jul 2022 22:00:38 +0200 Subject: [PATCH] chart2: InsertDataTableDialog for inserting/removing the data table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ie3c033c587b150723e7aa39cd5ddf5774104db9a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138257 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- chart2/Library_chartcontroller.mk | 2 + chart2/UIConfig_chart2.mk | 3 +- .../dialogs/dlg_InsertDataTable.cxx | 61 +++++ .../dialogs/res_DataTableProperties.cxx | 111 +++++++++ .../controller/dialogs/tp_DataTable.cxx | 78 +------ .../controller/dialogs/tp_DataTable.hxx | 11 +- .../controller/inc/dlg_InsertDataTable.hxx | 47 ++++ .../inc/res_DataTableProperties.hxx | 47 ++++ .../main/ChartController_Insert.cxx | 66 +++++- chart2/uiconfig/ui/dlg_InsertDataTable.ui | 215 ++++++++++++++++++ 10 files changed, 549 insertions(+), 92 deletions(-) create mode 100644 chart2/source/controller/dialogs/dlg_InsertDataTable.cxx create mode 100644 chart2/source/controller/dialogs/res_DataTableProperties.cxx create mode 100644 chart2/source/controller/inc/dlg_InsertDataTable.hxx create mode 100644 chart2/source/controller/inc/res_DataTableProperties.hxx create mode 100644 chart2/uiconfig/ui/dlg_InsertDataTable.ui diff --git a/chart2/Library_chartcontroller.mk b/chart2/Library_chartcontroller.mk index 4bc8c7497915..cc25cdd907ae 100644 --- a/chart2/Library_chartcontroller.mk +++ b/chart2/Library_chartcontroller.mk @@ -109,6 +109,7 @@ $(eval $(call gb_Library_add_exception_objects,chartcontroller,\ chart2/source/controller/dialogs/dlg_DataSource \ chart2/source/controller/dialogs/dlg_InsertAxis_Grid \ chart2/source/controller/dialogs/dlg_InsertDataLabel \ + chart2/source/controller/dialogs/dlg_InsertDataTable \ chart2/source/controller/dialogs/dlg_InsertErrorBars \ chart2/source/controller/dialogs/dlg_InsertLegend \ chart2/source/controller/dialogs/dlg_InsertTitle \ @@ -122,6 +123,7 @@ $(eval $(call gb_Library_add_exception_objects,chartcontroller,\ chart2/source/controller/dialogs/RangeSelectionListener \ chart2/source/controller/dialogs/res_BarGeometry \ chart2/source/controller/dialogs/res_DataLabel \ + chart2/source/controller/dialogs/res_DataTableProperties \ chart2/source/controller/dialogs/res_ErrorBar \ chart2/source/controller/dialogs/res_LegendPosition \ chart2/source/controller/dialogs/res_Titles \ diff --git a/chart2/UIConfig_chart2.mk b/chart2/UIConfig_chart2.mk index 59af510c5845..274efd02638f 100644 --- a/chart2/UIConfig_chart2.mk +++ b/chart2/UIConfig_chart2.mk @@ -44,7 +44,9 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/schart,\ chart2/uiconfig/ui/combobox \ chart2/uiconfig/ui/datarangedialog \ chart2/uiconfig/ui/dlg_DataLabel \ + chart2/uiconfig/ui/dlg_InsertDataTable \ chart2/uiconfig/ui/dlg_InsertErrorBars \ + chart2/uiconfig/ui/dlg_InsertLegend \ chart2/uiconfig/ui/imagefragment \ chart2/uiconfig/ui/insertaxisdlg \ chart2/uiconfig/ui/insertgriddlg \ @@ -58,7 +60,6 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/schart,\ chart2/uiconfig/ui/smoothlinesdlg \ chart2/uiconfig/ui/steppedlinesdlg \ chart2/uiconfig/ui/titlerotationtabpage \ - chart2/uiconfig/ui/dlg_InsertLegend \ chart2/uiconfig/ui/tp_3D_SceneAppearance \ chart2/uiconfig/ui/tp_3D_SceneGeometry \ chart2/uiconfig/ui/tp_3D_SceneIllumination \ diff --git a/chart2/source/controller/dialogs/dlg_InsertDataTable.cxx b/chart2/source/controller/dialogs/dlg_InsertDataTable.cxx new file mode 100644 index 000000000000..4b5e928db057 --- /dev/null +++ b/chart2/source/controller/dialogs/dlg_InsertDataTable.cxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +namespace chart +{ +InsertDataTableDialog::InsertDataTableDialog(weld::Window* pWindow) + : GenericDialogController(pWindow, "modules/schart/ui/dlg_InsertDataTable.ui", + "InsertDataTableDialog") + , m_aDataTablePropertiesResources(*m_xBuilder) + , m_xCbShowDataTable(m_xBuilder->weld_check_button("showDataTable")) +{ + m_xCbShowDataTable->connect_toggled(LINK(this, InsertDataTableDialog, ShowDataTableToggle)); + init(m_aData); +} + +IMPL_LINK_NOARG(InsertDataTableDialog, ShowDataTableToggle, weld::Toggleable&, void) +{ + changeEnabled(); +} + +void InsertDataTableDialog::changeEnabled() +{ + bool bEnable = m_xCbShowDataTable->get_active(); + m_aDataTablePropertiesResources.setChecksSensitive(bEnable); + m_aData.mbShow = bEnable; +} + +void InsertDataTableDialog::init(DataTableDialogData const& rData) +{ + m_aData = rData; + m_aDataTablePropertiesResources.setHorizontalBorder(m_aData.mbHorizontalBorders); + m_aDataTablePropertiesResources.setVerticalBorder(m_aData.mbVerticalBorders); + m_aDataTablePropertiesResources.setOutline(m_aData.mbOutline); + m_aDataTablePropertiesResources.setKeys(m_aData.mbKeys); + m_xCbShowDataTable->set_active(m_aData.mbShow); + changeEnabled(); +} + +DataTableDialogData& InsertDataTableDialog::getDataTableDialogData() +{ + m_aData.mbShow = m_xCbShowDataTable->get_active(); + + m_aData.mbHorizontalBorders = m_aDataTablePropertiesResources.getHorizontalBorder(); + m_aData.mbVerticalBorders = m_aDataTablePropertiesResources.getVerticalBorder(); + m_aData.mbOutline = m_aDataTablePropertiesResources.getOutline(); + m_aData.mbKeys = m_aDataTablePropertiesResources.getKeys(); + + return m_aData; +} + +} //namespace chart + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/dialogs/res_DataTableProperties.cxx b/chart2/source/controller/dialogs/res_DataTableProperties.cxx new file mode 100644 index 000000000000..bf87b3e6b9e3 --- /dev/null +++ b/chart2/source/controller/dialogs/res_DataTableProperties.cxx @@ -0,0 +1,111 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include + +using namespace css; + +namespace chart +{ +DataTablePropertiesResources::DataTablePropertiesResources(weld::Builder& rBuilder) + : m_xCbHorizontalBorder(rBuilder.weld_check_button("horizontalBorderCB")) + , m_xCbVerticalBorder(rBuilder.weld_check_button("verticalBorderCB")) + , m_xCbOutilne(rBuilder.weld_check_button("outlineCB")) + , m_xCbKeys(rBuilder.weld_check_button("keysCB")) +{ +} + +void DataTablePropertiesResources::setChecksSensitive(bool bSensitive) +{ + m_xCbHorizontalBorder->set_sensitive(bSensitive); + m_xCbVerticalBorder->set_sensitive(bSensitive); + m_xCbOutilne->set_sensitive(bSensitive); + m_xCbKeys->set_sensitive(bSensitive); +} + +void DataTablePropertiesResources::initFromItemSet(const SfxItemSet& rInAttrs) +{ + const SfxPoolItem* pPoolItem = nullptr; + SfxItemState aState; + + aState = rInAttrs.GetItemState(SCHATTR_DATA_TABLE_HORIZONTAL_BORDER, false, &pPoolItem); + if (aState == SfxItemState::DONTCARE) + { + m_xCbHorizontalBorder->set_state(TRISTATE_INDET); + } + else + { + if (aState == SfxItemState::SET) + m_xCbHorizontalBorder->set_active( + static_cast(pPoolItem)->GetValue()); + } + + aState = rInAttrs.GetItemState(SCHATTR_DATA_TABLE_VERTICAL_BORDER, false, &pPoolItem); + if (aState == SfxItemState::DONTCARE) + { + m_xCbVerticalBorder->set_state(TRISTATE_INDET); + } + else + { + if (aState == SfxItemState::SET) + m_xCbVerticalBorder->set_active(static_cast(pPoolItem)->GetValue()); + } + + aState = rInAttrs.GetItemState(SCHATTR_DATA_TABLE_OUTLINE, false, &pPoolItem); + if (aState == SfxItemState::DONTCARE) + { + m_xCbOutilne->set_state(TRISTATE_INDET); + } + else + { + if (aState == SfxItemState::SET) + m_xCbOutilne->set_active(static_cast(pPoolItem)->GetValue()); + } + + aState = rInAttrs.GetItemState(SCHATTR_DATA_TABLE_KEYS, false, &pPoolItem); + if (aState == SfxItemState::DONTCARE) + { + m_xCbKeys->set_state(TRISTATE_INDET); + } + else + { + if (aState == SfxItemState::SET) + m_xCbKeys->set_active(static_cast(pPoolItem)->GetValue()); + } +} + +bool DataTablePropertiesResources::writeToItemSet(SfxItemSet& rOutAttrs) const +{ + if (m_xCbHorizontalBorder->get_state() != TRISTATE_INDET) + { + rOutAttrs.Put( + SfxBoolItem(SCHATTR_DATA_TABLE_HORIZONTAL_BORDER, m_xCbHorizontalBorder->get_active())); + } + if (m_xCbVerticalBorder->get_state() != TRISTATE_INDET) + { + rOutAttrs.Put( + SfxBoolItem(SCHATTR_DATA_TABLE_VERTICAL_BORDER, m_xCbVerticalBorder->get_active())); + } + if (m_xCbOutilne->get_state() != TRISTATE_INDET) + { + rOutAttrs.Put(SfxBoolItem(SCHATTR_DATA_TABLE_OUTLINE, m_xCbOutilne->get_active())); + } + if (m_xCbKeys->get_state() != TRISTATE_INDET) + { + rOutAttrs.Put(SfxBoolItem(SCHATTR_DATA_TABLE_KEYS, m_xCbKeys->get_active())); + } + return true; +} + +} //namespace chart + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/dialogs/tp_DataTable.cxx b/chart2/source/controller/dialogs/tp_DataTable.cxx index d7bed5a53900..e6982b4a5067 100644 --- a/chart2/source/controller/dialogs/tp_DataTable.cxx +++ b/chart2/source/controller/dialogs/tp_DataTable.cxx @@ -9,19 +9,13 @@ #include "tp_DataTable.hxx" -#include -#include - namespace chart { DataTableTabPage::DataTableTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs) : SfxTabPage(pPage, pController, "modules/schart/ui/tp_DataTable.ui", "DataTableTabPage", &rInAttrs) - , m_xCbHorizontalBorder(m_xBuilder->weld_check_button("horizontalBorderCB")) - , m_xCbVerticalBorder(m_xBuilder->weld_check_button("verticalBorderCB")) - , m_xCbOutilne(m_xBuilder->weld_check_button("outlineCB")) - , m_xCbKeys(m_xBuilder->weld_check_button("keysCB")) + , m_aDataTablePropertiesResources(*m_xBuilder) { } @@ -34,78 +28,14 @@ std::unique_ptr DataTableTabPage::Create(weld::Container* pPage, return std::make_unique(pPage, pController, *rAttrs); } -bool DataTableTabPage::FillItemSet(SfxItemSet* rOutAttrs) +bool DataTableTabPage::FillItemSet(SfxItemSet* pOutAttrs) { - if (m_xCbHorizontalBorder->get_state() != TRISTATE_INDET) - { - rOutAttrs->Put( - SfxBoolItem(SCHATTR_DATA_TABLE_HORIZONTAL_BORDER, m_xCbHorizontalBorder->get_active())); - } - if (m_xCbVerticalBorder->get_state() != TRISTATE_INDET) - { - rOutAttrs->Put( - SfxBoolItem(SCHATTR_DATA_TABLE_VERTICAL_BORDER, m_xCbVerticalBorder->get_active())); - } - if (m_xCbOutilne->get_state() != TRISTATE_INDET) - { - rOutAttrs->Put(SfxBoolItem(SCHATTR_DATA_TABLE_OUTLINE, m_xCbOutilne->get_active())); - } - if (m_xCbKeys->get_state() != TRISTATE_INDET) - { - rOutAttrs->Put(SfxBoolItem(SCHATTR_DATA_TABLE_KEYS, m_xCbKeys->get_active())); - } - return true; + return m_aDataTablePropertiesResources.writeToItemSet(*pOutAttrs); } void DataTableTabPage::Reset(const SfxItemSet* pInAttrs) { - const SfxPoolItem* pPoolItem = nullptr; - SfxItemState aState; - - aState = pInAttrs->GetItemState(SCHATTR_DATA_TABLE_HORIZONTAL_BORDER, false, &pPoolItem); - if (aState == SfxItemState::DONTCARE) - { - m_xCbHorizontalBorder->set_state(TRISTATE_INDET); - } - else - { - if (aState == SfxItemState::SET) - m_xCbHorizontalBorder->set_active( - static_cast(pPoolItem)->GetValue()); - } - - aState = pInAttrs->GetItemState(SCHATTR_DATA_TABLE_VERTICAL_BORDER, false, &pPoolItem); - if (aState == SfxItemState::DONTCARE) - { - m_xCbVerticalBorder->set_state(TRISTATE_INDET); - } - else - { - if (aState == SfxItemState::SET) - m_xCbVerticalBorder->set_active(static_cast(pPoolItem)->GetValue()); - } - - aState = pInAttrs->GetItemState(SCHATTR_DATA_TABLE_OUTLINE, false, &pPoolItem); - if (aState == SfxItemState::DONTCARE) - { - m_xCbOutilne->set_state(TRISTATE_INDET); - } - else - { - if (aState == SfxItemState::SET) - m_xCbOutilne->set_active(static_cast(pPoolItem)->GetValue()); - } - - aState = pInAttrs->GetItemState(SCHATTR_DATA_TABLE_KEYS, false, &pPoolItem); - if (aState == SfxItemState::DONTCARE) - { - m_xCbKeys->set_state(TRISTATE_INDET); - } - else - { - if (aState == SfxItemState::SET) - m_xCbKeys->set_active(static_cast(pPoolItem)->GetValue()); - } + m_aDataTablePropertiesResources.initFromItemSet(*pInAttrs); } } //namespace chart diff --git a/chart2/source/controller/dialogs/tp_DataTable.hxx b/chart2/source/controller/dialogs/tp_DataTable.hxx index 11bcfb9203e1..a4ef6d6cf436 100644 --- a/chart2/source/controller/dialogs/tp_DataTable.hxx +++ b/chart2/source/controller/dialogs/tp_DataTable.hxx @@ -10,21 +10,14 @@ #pragma once #include - -namespace weld -{ -class CheckButton; -} +#include namespace chart { class DataTableTabPage : public SfxTabPage { private: - std::unique_ptr m_xCbHorizontalBorder; - std::unique_ptr m_xCbVerticalBorder; - std::unique_ptr m_xCbOutilne; - std::unique_ptr m_xCbKeys; + DataTablePropertiesResources m_aDataTablePropertiesResources; public: DataTableTabPage(weld::Container* pPage, weld::DialogController* pController, diff --git a/chart2/source/controller/inc/dlg_InsertDataTable.hxx b/chart2/source/controller/inc/dlg_InsertDataTable.hxx new file mode 100644 index 000000000000..346f7b651c24 --- /dev/null +++ b/chart2/source/controller/inc/dlg_InsertDataTable.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include "res_DataTableProperties.hxx" + +namespace chart +{ +struct DataTableDialogData +{ + bool mbShow = true; + bool mbHorizontalBorders = false; + bool mbVerticalBorders = false; + bool mbOutline = false; + bool mbKeys = false; +}; + +class InsertDataTableDialog final : public weld::GenericDialogController +{ +private: + DataTablePropertiesResources m_aDataTablePropertiesResources; + std::unique_ptr m_xCbShowDataTable; + + DataTableDialogData m_aData; + + DECL_LINK(ShowDataTableToggle, weld::Toggleable&, void); + + void changeEnabled(); + +public: + InsertDataTableDialog(weld::Window* pParent); + + void init(DataTableDialogData const& rData); + DataTableDialogData& getDataTableDialogData(); +}; + +} //namespace chart + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/inc/res_DataTableProperties.hxx b/chart2/source/controller/inc/res_DataTableProperties.hxx new file mode 100644 index 000000000000..299934cb0211 --- /dev/null +++ b/chart2/source/controller/inc/res_DataTableProperties.hxx @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include +#include + +namespace chart +{ +class DataTablePropertiesResources final +{ +private: + std::unique_ptr m_xCbHorizontalBorder; + std::unique_ptr m_xCbVerticalBorder; + std::unique_ptr m_xCbOutilne; + std::unique_ptr m_xCbKeys; + +public: + DataTablePropertiesResources(weld::Builder& rBuilder); + + void initFromItemSet(SfxItemSet const& rInAttrs); + bool writeToItemSet(SfxItemSet& rOutAttrs) const; + void setChecksSensitive(bool bSensitive); + + bool getHorizontalBorder() { return m_xCbHorizontalBorder->get_active(); } + void setHorizontalBorder(bool bActive) { m_xCbHorizontalBorder->set_active(bActive); } + + bool getVerticalBorder() { return m_xCbVerticalBorder->get_active(); } + void setVerticalBorder(bool bActive) { m_xCbVerticalBorder->set_active(bActive); } + + bool getOutline() { return m_xCbOutilne->get_active(); } + void setOutline(bool bActive) { m_xCbOutilne->set_active(bActive); } + + bool getKeys() { return m_xCbKeys->get_active(); } + void setKeys(bool bActive) { m_xCbKeys->set_active(bActive); } +}; + +} //namespace chart + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/main/ChartController_Insert.cxx b/chart2/source/controller/main/ChartController_Insert.cxx index 46d00eedb89c..b1b0598d5070 100644 --- a/chart2/source/controller/main/ChartController_Insert.cxx +++ b/chart2/source/controller/main/ChartController_Insert.cxx @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,7 @@ #include #include +#include #include #include @@ -158,18 +160,66 @@ void ChartController::executeDispatch_InsertGrid() void ChartController::executeDispatch_OpenInsertDataTableDialog() { - rtl::Reference xDiagram = getFirstDiagram(); SolarMutexGuard aGuard; - if (xDiagram->getDataTable().is()) + rtl::Reference xDiagram = getFirstDiagram(); + + InsertDataTableDialog aDialog(GetChartFrame()); { - xDiagram->setDataTable(uno::Reference()); - } - else - { - uno::Reference xDataTable(new DataTable); + // init values + DataTableDialogData aData; + auto xDataTable = xDiagram->getDataTable(); + aData.mbShow = xDataTable.is(); if (xDataTable.is()) { - xDiagram->setDataTable(xDataTable); + uno::Reference xProperties(xDataTable, uno::UNO_QUERY); + + uno::Any aAny = xProperties->getPropertyValue("HBorder"); + if (aAny.has()) + aData.mbHorizontalBorders = aAny.get(); + + aAny = xProperties->getPropertyValue("VBorder"); + if (aAny.has()) + aData.mbVerticalBorders = aAny.get(); + + aAny = xProperties->getPropertyValue("Outline"); + if (aAny.has()) + aData.mbOutline = aAny.get(); + + aAny = xProperties->getPropertyValue("Keys"); + if (aAny.has()) + aData.mbKeys = aAny.get(); + } + aDialog.init(aData); + } + + // show the dialog + if (aDialog.run() == RET_OK) + { + auto& rDialogData = aDialog.getDataTableDialogData(); + + auto xDataTable = xDiagram->getDataTable(); + if (!rDialogData.mbShow && xDataTable.is()) + { + xDiagram->setDataTable(uno::Reference()); + } + else if (rDialogData.mbShow && !xDataTable.is()) + { + uno::Reference xNewDataTable(new DataTable); + if (xNewDataTable.is()) + { + xDiagram->setDataTable(xNewDataTable); + } + } + + // Set the properties + xDataTable = xDiagram->getDataTable(); + if (rDialogData.mbShow && xDataTable.is()) + { + uno::Reference xProperties(xDataTable, uno::UNO_QUERY); + xProperties->setPropertyValue("HBorder" , uno::Any(rDialogData.mbHorizontalBorders)); + xProperties->setPropertyValue("VBorder" , uno::Any(rDialogData.mbVerticalBorders)); + xProperties->setPropertyValue("Outline" , uno::Any(rDialogData.mbOutline)); + xProperties->setPropertyValue("Keys" , uno::Any(rDialogData.mbKeys)); } } } diff --git a/chart2/uiconfig/ui/dlg_InsertDataTable.ui b/chart2/uiconfig/ui/dlg_InsertDataTable.ui new file mode 100644 index 000000000000..a46d489e1817 --- /dev/null +++ b/chart2/uiconfig/ui/dlg_InsertDataTable.ui @@ -0,0 +1,215 @@ + + + + + + False + 6 + Data Table + True + 0 + 0 + dialog + + + False + vertical + 12 + + + False + end + + + _OK + True + True + True + True + True + True + + + False + True + 0 + + + + + _Cancel + True + True + True + True + + + False + True + 1 + + + + + _Help + True + True + True + 6 + True + + + False + True + 2 + True + + + + + False + True + end + 0 + + + + + True + False + 6 + vertical + 12 + + + Show Data Table + True + True + False + start + True + True + + + False + True + 0 + + + + + True + False + True + True + 0 + none + + + True + False + 12 + 6 + True + True + vertical + 6 + + + Show Horizontal Border + True + True + False + start + True + True + + + False + True + 0 + + + + + Show Vertical Border + True + True + False + start + True + True + + + False + True + 1 + + + + + Show Outline + True + True + False + start + True + True + + + False + True + 2 + + + + + Show Keys + True + True + False + start + True + True + + + False + True + 3 + + + + + + + True + False + Data Table Properties + + + + + + + + False + True + 1 + + + + + False + True + 1 + + + + + + ok + cancel + help + + +