1
0
Fork 0
libreoffice/sd/source/ui/dlg/dlgsnap.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

185 lines
6.6 KiB
C++

/* -*- 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 <svx/svxids.hrc>
#include <svx/svdpagv.hxx>
#include <svl/intitem.hxx>
#include <svl/itempool.hxx>
#include <svtools/unitconv.hxx>
#include <tools/debug.hxx>
#include <sdattr.hrc>
#include <View.hxx>
#include <drawdoc.hxx>
#include <dlgsnap.hxx>
#include <sdenumdef.hxx>
/**
* dialog to adjust grid (scarcely ESO!)
*/
SdSnapLineDlg::SdSnapLineDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View const * pView)
: GenericDialogController(pWindow, u"modules/sdraw/ui/dlgsnap.ui"_ustr, u"SnapObjectDialog"_ustr)
, aUIScale(pView->GetDoc().GetUIScale())
, m_xFtX(m_xBuilder->weld_label(u"xlabel"_ustr))
, m_xMtrFldX(m_xBuilder->weld_metric_spin_button(u"x"_ustr, FieldUnit::CM))
, m_xFtY(m_xBuilder->weld_label(u"ylabel"_ustr))
, m_xMtrFldY(m_xBuilder->weld_metric_spin_button(u"y"_ustr, FieldUnit::CM))
, m_xRadioGroup(m_xBuilder->weld_widget(u"radiogroup"_ustr))
, m_xRbPoint(m_xBuilder->weld_radio_button(u"point"_ustr))
, m_xRbVert(m_xBuilder->weld_radio_button(u"vert"_ustr))
, m_xRbHorz(m_xBuilder->weld_radio_button(u"horz"_ustr))
, m_xBtnDelete(m_xBuilder->weld_button(u"delete"_ustr))
{
m_xRbHorz->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl));
m_xRbVert->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl));
m_xRbPoint->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl));
m_xBtnDelete->connect_clicked(LINK(this, SdSnapLineDlg, ClickHdl));
FieldUnit eUIUnit = pView->GetDoc().GetUIUnit();
SetFieldUnit(*m_xMtrFldX, eUIUnit, true);
SetFieldUnit(*m_xMtrFldY, eUIUnit, true);
// get WorkArea
::tools::Rectangle aWorkArea = pView->GetWorkArea();
// determine PoolUnit
SfxItemPool* pPool = rInAttrs.GetPool();
assert(pPool && "Where's the Pool?");
MapUnit ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH );
// #i48497# Consider page origin
SdrPageView* pPV = pView->GetSdrPageView();
Point aLeftTop(aWorkArea.Left()+1, aWorkArea.Top()+1);
pPV->LogicToPagePos(aLeftTop);
Point aRightBottom(aWorkArea.Right()-2, aWorkArea.Bottom()-2);
pPV->LogicToPagePos(aRightBottom);
// determine max and min values depending on
// WorkArea, PoolUnit and FieldUnit:
auto const map = [ePoolUnit](std::unique_ptr<weld::MetricSpinButton> const & msb, tools::Long value) {
auto const n1 = OutputDevice::LogicToLogic(value, ePoolUnit, MapUnit::Map100thMM);
auto const n2 = msb->normalize(n1);
auto const n3 = msb->convert_value_from(n2, FieldUnit::MM_100TH);
auto const n4 = msb->convert_value_to(n3, FieldUnit::NONE);
return n4;
};
m_xMtrFldX->set_range(map(m_xMtrFldX, sal_Int32(aLeftTop.X() / aUIScale)),
map(m_xMtrFldX, sal_Int32(aRightBottom.X() / aUIScale)),
FieldUnit::NONE);
m_xMtrFldY->set_range(map(m_xMtrFldY, sal_Int32(aLeftTop.Y() / aUIScale)),
map(m_xMtrFldY, sal_Int32(aRightBottom.Y() / aUIScale)),
FieldUnit::NONE);
// set values
nXValue = rInAttrs.Get(ATTR_SNAPLINE_X).GetValue();
nYValue = rInAttrs.Get(ATTR_SNAPLINE_Y).GetValue();
nXValue = sal_Int32(nXValue / aUIScale);
nYValue = sal_Int32(nYValue / aUIScale);
SetMetricValue(*m_xMtrFldX, nXValue, MapUnit::Map100thMM);
SetMetricValue(*m_xMtrFldY, nYValue, MapUnit::Map100thMM);
m_xRbPoint->set_active(true);
}
SdSnapLineDlg::~SdSnapLineDlg()
{
}
/**
* fills provided item sets with dialog box attributes
*/
IMPL_LINK(SdSnapLineDlg, ToggleHdl, weld::Toggleable&, rBtn, void)
{
if (!rBtn.get_active())
return;
if (m_xRbPoint->get_active())
SetInputFields(true, true);
else if (m_xRbHorz->get_active())
SetInputFields(false, true);
else if (m_xRbVert->get_active())
SetInputFields(true, false);
}
IMPL_LINK( SdSnapLineDlg, ClickHdl, weld::Button&, rBtn, void )
{
if (&rBtn == m_xBtnDelete.get())
m_xDialog->response(RET_SNAP_DELETE);
}
/**
* fills provided item sets with dialog box attributes
*/
void SdSnapLineDlg::GetAttr(SfxItemSet& rOutAttrs)
{
SnapKind eKind;
if (m_xRbHorz->get_active()) eKind = SnapKind::Horizontal;
else if (m_xRbVert->get_active()) eKind = SnapKind::Vertical;
else eKind = SnapKind::Point;
nXValue = sal_Int32(GetCoreValue(*m_xMtrFldX, MapUnit::Map100thMM) * aUIScale);
nYValue = sal_Int32(GetCoreValue(*m_xMtrFldY, MapUnit::Map100thMM) * aUIScale);
rOutAttrs.Put(SfxUInt16Item(ATTR_SNAPLINE_KIND, static_cast<sal_uInt16>(eKind)));
rOutAttrs.Put(SfxInt32Item(ATTR_SNAPLINE_X, nXValue));
rOutAttrs.Put(SfxInt32Item(ATTR_SNAPLINE_Y, nYValue));
}
void SdSnapLineDlg::HideRadioGroup()
{
m_xRadioGroup->hide();
}
/**
* disable X or Y input fields
*/
void SdSnapLineDlg::SetInputFields(bool bEnableX, bool bEnableY)
{
if ( bEnableX )
{
if (!m_xMtrFldX->get_sensitive())
m_xMtrFldX->set_value(nXValue, FieldUnit::NONE);
m_xMtrFldX->set_sensitive(true);
m_xFtX->set_sensitive(true);
}
else if (m_xMtrFldX->get_sensitive())
{
nXValue = m_xMtrFldX->get_value(FieldUnit::NONE);
m_xMtrFldX->set_text(OUString());
m_xMtrFldX->set_sensitive(false);
m_xFtX->set_sensitive(false);
}
if ( bEnableY )
{
if (!m_xMtrFldY->get_sensitive())
m_xMtrFldY->set_value(nYValue, FieldUnit::NONE);
m_xMtrFldY->set_sensitive(true);
m_xFtY->set_sensitive(true);
}
else if (m_xMtrFldY->get_sensitive())
{
nYValue = m_xMtrFldY->get_value(FieldUnit::NONE);
m_xMtrFldY->set_text(OUString());
m_xMtrFldY->set_sensitive(false);
m_xFtY->set_sensitive(false);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */