summaryrefslogtreecommitdiff
path: root/starmath/source/SmElementsPanel.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'starmath/source/SmElementsPanel.cxx')
-rw-r--r--starmath/source/SmElementsPanel.cxx105
1 files changed, 105 insertions, 0 deletions
diff --git a/starmath/source/SmElementsPanel.cxx b/starmath/source/SmElementsPanel.cxx
new file mode 100644
index 000000000000..a4c8d7c6d883
--- /dev/null
+++ b/starmath/source/SmElementsPanel.cxx
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sal/config.h>
+
+#include <sfx2/dispatch.hxx>
+#include <svl/stritem.hxx>
+
+#include "SmElementsPanel.hxx"
+#include <starmath.hrc>
+#include <smmod.hxx>
+#include <strings.hrc>
+#include <view.hxx>
+
+namespace sm::sidebar
+{
+// static
+std::unique_ptr<PanelLayout> SmElementsPanel::Create(weld::Widget& rParent,
+ const SfxBindings& rBindings)
+{
+ return std::make_unique<SmElementsPanel>(rParent, rBindings);
+}
+
+SmElementsPanel::SmElementsPanel(weld::Widget& rParent, const SfxBindings& rBindings)
+ : PanelLayout(&rParent, "MathElementsPanel", "modules/smath/ui/sidebarelements_math.ui")
+ , mrBindings(rBindings)
+ , mxCategoryList(m_xBuilder->weld_tree_view("categorylist"))
+ , mxElementsControl(std::make_unique<SmElementsControl>(
+ m_xBuilder->weld_scrolled_window("scrolledwindow", true)))
+ , mxElementsControlWin(
+ std::make_unique<weld::CustomWeld>(*m_xBuilder, "element_selector", *mxElementsControl))
+{
+ for (size_t i = 0; i < SmElementsControl::categoriesSize(); ++i)
+ mxCategoryList->append_text(SmResId(std::get<0>(SmElementsControl::categories()[i])));
+
+ mxCategoryList->set_size_request(-1, mxCategoryList->get_height_rows(6));
+
+ mxCategoryList->connect_changed(LINK(this, SmElementsPanel, CategorySelectedHandle));
+ mxCategoryList->select_text(SmResId(RID_CATEGORY_UNARY_BINARY_OPERATORS));
+
+ mxElementsControl->setVerticalMode(false); // Sidebar currently can only dock to a side
+ mxElementsControl->setElementSetId(RID_CATEGORY_UNARY_BINARY_OPERATORS);
+ mxElementsControl->SetSelectHdl(LINK(this, SmElementsPanel, ElementClickHandler));
+}
+
+SmElementsPanel::~SmElementsPanel()
+{
+ mxElementsControlWin.reset();
+ mxElementsControl.reset();
+ mxCategoryList.reset();
+}
+
+IMPL_LINK(SmElementsPanel, CategorySelectedHandle, weld::TreeView&, rList, void)
+{
+ const OUString sSelected = rList.get_selected_text();
+ for (size_t i = 0; i < SmElementsControl::categoriesSize(); ++i)
+ {
+ const TranslateId& rCategoryId = std::get<0>(SmElementsControl::categories()[i]);
+ OUString aCurrentCategoryString = SmResId(rCategoryId);
+ if (aCurrentCategoryString == sSelected)
+ {
+ mxElementsControl->setElementSetId(rCategoryId);
+ if (SmViewShell* pViewSh = GetView())
+ mxElementsControl->setSmSyntaxVersion(pViewSh->GetDoc()->GetSmSyntaxVersion());
+ return;
+ }
+ }
+}
+
+IMPL_LINK(SmElementsPanel, ElementClickHandler, SmElement&, rElement, void)
+{
+ if (SmViewShell* pViewSh = GetView())
+ {
+ std::unique_ptr<SfxStringItem> pInsertCommand
+ = std::make_unique<SfxStringItem>(SID_INSERTCOMMANDTEXT, rElement.getText());
+ pViewSh->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_INSERTCOMMANDTEXT, SfxCallMode::RECORD, { pInsertCommand.get() });
+ }
+}
+
+SmViewShell* SmElementsPanel::GetView() const
+{
+ SfxViewShell* pView = mrBindings.GetDispatcher()->GetFrame()->GetViewShell();
+ return dynamic_cast<SmViewShell*>(pView);
+}
+
+} // end of namespace sm::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */