/* -*- 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/. * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include // class ScScenarioWindow ------------------------------------------------ void ScScenarioWindow::UpdateEntries( const std::vector &rNewEntryList ) { m_xLbScenario->clear(); m_aEntries.clear(); switch( rNewEntryList.size() ) { case 0: // no scenarios in current sheet SetComment( OUString() ); break; case 1: // sheet is a scenario container, comment only SetComment( rNewEntryList[0] ); break; default: { // sheet contains scenarios assert(rNewEntryList.size() % 3 == 0 && "ScScenarioListBox::UpdateEntries - wrong list size"); m_xLbScenario->freeze(); std::vector::const_iterator iter; for (iter = rNewEntryList.begin(); iter != rNewEntryList.end(); ++iter) { ScenarioEntry aEntry; // first entry of a triple is the scenario name aEntry.maName = *iter; // second entry of a triple is the scenario comment ++iter; aEntry.maComment = *iter; // third entry of a triple is the protection ("0" = not protected, "1" = protected) ++iter; aEntry.mbProtected = !(*iter).isEmpty() && (*iter)[0] != '0'; m_aEntries.push_back( aEntry ); m_xLbScenario->append_text(aEntry.maName); } m_xLbScenario->thaw(); m_xLbScenario->unselect_all(); SetComment(OUString()); } } } IMPL_LINK_NOARG(ScScenarioWindow, SelectHdl, weld::TreeView&, void) { if (const ScenarioEntry* pEntry = GetSelectedScenarioEntry()) SetComment(pEntry->maComment); } IMPL_LINK_NOARG(ScScenarioWindow, DoubleClickHdl, weld::TreeView&, bool) { SelectScenario(); return true; } IMPL_LINK(ScScenarioWindow, KeyInputHdl, const KeyEvent&, rKEvt, bool) { bool bHandled = false; vcl::KeyCode aCode = rKEvt.GetKeyCode(); switch( aCode.GetCode() ) { case KEY_RETURN: SelectScenario(); bHandled = true; break; case KEY_DELETE: DeleteScenario(); bHandled = true; break; } return bHandled; } IMPL_LINK(ScScenarioWindow, ContextMenuHdl, const CommandEvent&, rCEvt, bool) { bool bHandled = false; if (rCEvt.GetCommand() == CommandEventId::ContextMenu) { if (const ScenarioEntry* pEntry = GetSelectedScenarioEntry()) { if (!pEntry->mbProtected) { std::unique_ptr xBuilder(Application::CreateBuilder(m_xLbScenario.get(), "modules/scalc/ui/scenariomenu.ui")); std::unique_ptr xPopup(xBuilder->weld_menu("menu")); OString sIdent(xPopup->popup_at_rect(m_xLbScenario.get(), tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1)))); if (sIdent == "delete") DeleteScenario(); else if (sIdent == "edit") EditScenario(); } } bHandled = true; } return bHandled; } const ScScenarioWindow::ScenarioEntry* ScScenarioWindow::GetSelectedScenarioEntry() const { size_t nPos = m_xLbScenario->get_selected_index(); return (nPos < m_aEntries.size()) ? &m_aEntries[ nPos ] : nullptr; } void ScScenarioWindow::ExecuteScenarioSlot(sal_uInt16 nSlotId) { if( SfxViewFrame* pViewFrm = SfxViewFrame::Current() ) { SfxStringItem aStringItem(nSlotId, m_xLbScenario->get_selected_text()); pViewFrm->GetDispatcher()->ExecuteList(nSlotId, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aStringItem } ); } } void ScScenarioWindow::SelectScenario() { if (m_xLbScenario->get_selected_index() != -1) ExecuteScenarioSlot(SID_SELECT_SCENARIO); } void ScScenarioWindow::EditScenario() { if (m_xLbScenario->get_selected_index() != -1) ExecuteScenarioSlot(SID_EDIT_SCENARIO); } void ScScenarioWindow::DeleteScenario() { if (m_xLbScenario->get_selected_index() != -1) { std::unique_ptr xQueryBox(Application::CreateMessageDialog(m_xLbScenario.get(), VclMessageType::Question, VclButtonsType::YesNo, ScResId(STR_QUERY_DELSCENARIO))); xQueryBox->set_default_response(RET_YES); if (xQueryBox->run() == RET_YES) ExecuteScenarioSlot(SID_DELETE_SCENARIO); } } // class ScScenarioWindow ------------------------------------------------ ScScenarioWindow::ScScenarioWindow(weld::Builder& rBuilder, const OUString& aQH_List, const OUString& aQH_Comment) : m_xLbScenario(rBuilder.weld_tree_view("scenariolist")) , m_xEdComment(rBuilder.weld_text_view("scenariotext")) { m_xLbScenario->set_help_id(HID_SC_SCENWIN_TOP); m_xEdComment->set_help_id(HID_SC_SCENWIN_BOTTOM); m_xLbScenario->set_tooltip_text(aQH_List); m_xEdComment->set_tooltip_text(aQH_Comment); m_xLbScenario->connect_changed(LINK(this, ScScenarioWindow, SelectHdl)); m_xLbScenario->connect_row_activated(LINK(this, ScScenarioWindow, DoubleClickHdl)); m_xLbScenario->connect_key_press(LINK(this, ScScenarioWindow, KeyInputHdl)); m_xLbScenario->connect_popup_menu(LINK(this, ScScenarioWindow, ContextMenuHdl)); SfxViewFrame* pViewFrm = SfxViewFrame::Current(); if (pViewFrm) { SfxBindings& rBindings = pViewFrm->GetBindings(); rBindings.Invalidate( SID_SELECT_SCENARIO ); rBindings.Update( SID_SELECT_SCENARIO ); } } ScScenarioWindow::~ScScenarioWindow() { } void ScScenarioWindow::NotifyState( const SfxPoolItem* pState ) { if( pState ) { m_xLbScenario->set_sensitive(true); if ( auto pStringItem = dynamic_cast( pState) ) { const OUString& aNewEntry( pStringItem->GetValue() ); if (!aNewEntry.isEmpty()) m_xLbScenario->select_text(aNewEntry); else m_xLbScenario->unselect_all(); } else if ( auto pStringListItem = dynamic_cast( pState) ) { UpdateEntries(pStringListItem->GetList()); } } else { m_xLbScenario->set_sensitive(false); m_xLbScenario->unselect_all(); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */