lok: MSForms: Add callback for form field button.
Show and hide the button and send the button area, where it should be displayed. Change-Id: I5922eb9f5e544483dd4efd12e4218d2e51270632 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93657 Tested-by: Jenkins Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
This commit is contained in:
@@ -726,6 +726,27 @@ typedef enum
|
||||
* Sends the tab stop list for the current of the current cursor position.
|
||||
*/
|
||||
LOK_CALLBACK_TAB_STOP_LIST = 48,
|
||||
|
||||
/**
|
||||
* Sends all informations for displaying form field button for a text based field.
|
||||
*
|
||||
* It contains the position where the frame with the button should be displayed and
|
||||
* also contains all information that the popup window needs.
|
||||
*
|
||||
* The payload example:
|
||||
* {
|
||||
* "action": "show",
|
||||
* "type": "drop-down",
|
||||
* "textArea": "1418, 3906, 3111, 919"
|
||||
* }
|
||||
*
|
||||
* or
|
||||
* {
|
||||
* "action": "hide",
|
||||
* "type": "drop-down"
|
||||
* }
|
||||
*/
|
||||
LOK_CALLBACK_FORM_FIELD_BUTTON = 49,
|
||||
}
|
||||
LibreOfficeKitCallbackType;
|
||||
|
||||
@@ -852,6 +873,8 @@ static inline const char* lokCallbackTypeToString(int nType)
|
||||
return "LOK_CALLBACK_CALC_FUNCTION_LIST";
|
||||
case LOK_CALLBACK_TAB_STOP_LIST:
|
||||
return "LOK_CALLBACK_TAB_STOP_LIST";
|
||||
case LOK_CALLBACK_FORM_FIELD_BUTTON:
|
||||
return "LOK_CALLBACK_FORM_FIELD_BUTTON";
|
||||
}
|
||||
|
||||
assert(!"Unknown LibreOfficeKitCallbackType type.");
|
||||
|
||||
@@ -1399,6 +1399,7 @@ callback (gpointer pData)
|
||||
case LOK_CALLBACK_JSDIALOG:
|
||||
case LOK_CALLBACK_CALC_FUNCTION_LIST:
|
||||
case LOK_CALLBACK_TAB_STOP_LIST:
|
||||
case LOK_CALLBACK_FORM_FIELD_BUTTON:
|
||||
{
|
||||
// TODO: Implement me
|
||||
break;
|
||||
|
||||
@@ -1457,7 +1457,10 @@ void SfxViewShell::registerLibreOfficeKitViewCallback(LibreOfficeKitCallback pCa
|
||||
|
||||
void SfxViewShell::libreOfficeKitViewCallback(int nType, const char* pPayload) const
|
||||
{
|
||||
if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledPainting())
|
||||
if (!comphelper::LibreOfficeKit::isActive())
|
||||
return;
|
||||
|
||||
if (comphelper::LibreOfficeKit::isTiledPainting() && nType != LOK_CALLBACK_FORM_FIELD_BUTTON)
|
||||
return;
|
||||
|
||||
if (pImpl->m_bTiledSearching)
|
||||
|
||||
Binary file not shown.
@@ -128,6 +128,7 @@ public:
|
||||
void testRedlineNotificationDuringSave();
|
||||
void testHyperlink();
|
||||
void testFieldmark();
|
||||
void testDropDownFormFieldButton();
|
||||
|
||||
CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
|
||||
CPPUNIT_TEST(testRegisterCallback);
|
||||
@@ -194,6 +195,7 @@ public:
|
||||
CPPUNIT_TEST(testRedlineNotificationDuringSave);
|
||||
CPPUNIT_TEST(testHyperlink);
|
||||
CPPUNIT_TEST(testFieldmark);
|
||||
CPPUNIT_TEST(testDropDownFormFieldButton);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
private:
|
||||
@@ -214,6 +216,7 @@ private:
|
||||
int m_nTrackedChangeIndex;
|
||||
OString m_sHyperlinkText;
|
||||
OString m_sHyperlinkLink;
|
||||
OString m_aFormFieldButton;
|
||||
};
|
||||
|
||||
SwTiledRenderingTest::SwTiledRenderingTest()
|
||||
@@ -365,6 +368,11 @@ void SwTiledRenderingTest::callbackImpl(int nType, const char* pPayload)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LOK_CALLBACK_FORM_FIELD_BUTTON:
|
||||
{
|
||||
m_aFormFieldButton = OString(pPayload);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2537,6 +2545,79 @@ void SwTiledRenderingTest::testFieldmark()
|
||||
createDoc("fieldmark.docx");
|
||||
}
|
||||
|
||||
void SwTiledRenderingTest::testDropDownFormFieldButton()
|
||||
{
|
||||
SwXTextDocument* pXTextDocument = createDoc("drop_down_form_field.odt");
|
||||
pXTextDocument->setClientVisibleArea(tools::Rectangle(0, 0, 10000, 4000));
|
||||
|
||||
SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell();
|
||||
pWrtShell->GetSfxViewShell()->registerLibreOfficeKitViewCallback(&SwTiledRenderingTest::callback, this);
|
||||
|
||||
// Move the cursor to trigger displaying of the field button.
|
||||
pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false);
|
||||
|
||||
CPPUNIT_ASSERT(!m_aFormFieldButton.isEmpty());
|
||||
|
||||
// First we have a button with an empty text area.
|
||||
{
|
||||
std::stringstream aStream(m_aFormFieldButton.getStr());
|
||||
boost::property_tree::ptree aTree;
|
||||
boost::property_tree::read_json(aStream, aTree);
|
||||
|
||||
OString sAction = aTree.get_child("action").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("show"), sAction);
|
||||
|
||||
OString sType = aTree.get_child("type").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("drop-down"), sType);
|
||||
|
||||
OString sTextArea = aTree.get_child("textArea").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("0, 0, -1, -1"), sTextArea);
|
||||
}
|
||||
|
||||
// Do a tile rendering to trigger the button message with a valide text area
|
||||
size_t nCanvasWidth = 1024;
|
||||
size_t nCanvasHeight = 512;
|
||||
std::vector<unsigned char> aPixmap(nCanvasWidth * nCanvasHeight * 4, 0);
|
||||
ScopedVclPtrInstance<VirtualDevice> pDevice(DeviceFormat::DEFAULT);
|
||||
pDevice->SetBackground(Wallpaper(COL_TRANSPARENT));
|
||||
pDevice->SetOutputSizePixelScaleOffsetAndBuffer(Size(nCanvasWidth, nCanvasHeight),
|
||||
Fraction(1.0), Point(), aPixmap.data());
|
||||
pXTextDocument->paintTile(*pDevice, nCanvasWidth, nCanvasHeight, /*nTilePosX=*/0,
|
||||
/*nTilePosY=*/0, /*nTileWidth=*/10000, /*nTileHeight=*/4000);
|
||||
|
||||
CPPUNIT_ASSERT(!m_aFormFieldButton.isEmpty());
|
||||
{
|
||||
std::stringstream aStream(m_aFormFieldButton.getStr());
|
||||
boost::property_tree::ptree aTree;
|
||||
boost::property_tree::read_json(aStream, aTree);
|
||||
|
||||
OString sAction = aTree.get_child("action").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("show"), sAction);
|
||||
|
||||
OString sType = aTree.get_child("type").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("drop-down"), sType);
|
||||
|
||||
OString sTextArea = aTree.get_child("textArea").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("1538, 1418, 1026, 275"), sTextArea);
|
||||
}
|
||||
|
||||
// Move the cursor back so the button becomes hidden.
|
||||
pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false);
|
||||
|
||||
CPPUNIT_ASSERT(!m_aFormFieldButton.isEmpty());
|
||||
{
|
||||
std::stringstream aStream(m_aFormFieldButton.getStr());
|
||||
boost::property_tree::ptree aTree;
|
||||
boost::property_tree::read_json(aStream, aTree);
|
||||
|
||||
OString sAction = aTree.get_child("action").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("hide"), sAction);
|
||||
|
||||
OString sType = aTree.get_child("type").get_value<std::string>().c_str();
|
||||
CPPUNIT_ASSERT_EQUAL(OString("drop-down"), sType);
|
||||
}
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
|
||||
|
||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
#include <DateFormFieldButton.hxx>
|
||||
#include <DropDownFormFieldButton.hxx>
|
||||
#include <DocumentContentOperationsManager.hxx>
|
||||
#include <comphelper/lok.hxx>
|
||||
#include <view.hxx>
|
||||
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
|
||||
#include <wrtsh.hxx>
|
||||
|
||||
using namespace ::sw::mark;
|
||||
using namespace ::com::sun::star;
|
||||
@@ -664,6 +668,7 @@ namespace sw::mark
|
||||
|
||||
DropDownFieldmark::~DropDownFieldmark()
|
||||
{
|
||||
SendLOKMessage("hide");
|
||||
}
|
||||
|
||||
void DropDownFieldmark::ShowButton(SwEditWin* pEditWin)
|
||||
@@ -674,9 +679,22 @@ namespace sw::mark
|
||||
m_pButton = VclPtr<DropDownFormFieldButton>::Create(pEditWin, *this);
|
||||
m_pButton->CalcPosAndSize(m_aPortionPaintArea);
|
||||
m_pButton->Show();
|
||||
SendLOKMessage("show");
|
||||
}
|
||||
}
|
||||
|
||||
void DropDownFieldmark::HideButton()
|
||||
{
|
||||
SendLOKMessage("hide");
|
||||
FieldmarkWithDropDownButton::HideButton();
|
||||
}
|
||||
|
||||
void DropDownFieldmark::RemoveButton()
|
||||
{
|
||||
SendLOKMessage("hide");
|
||||
FieldmarkWithDropDownButton::RemoveButton();
|
||||
}
|
||||
|
||||
void DropDownFieldmark::SetPortionPaintArea(const SwRect& rPortionPaintArea)
|
||||
{
|
||||
if(m_aPortionPaintArea == rPortionPaintArea &&
|
||||
@@ -689,6 +707,33 @@ namespace sw::mark
|
||||
m_pButton->Show();
|
||||
m_pButton->CalcPosAndSize(m_aPortionPaintArea);
|
||||
m_pButton->Invalidate();
|
||||
SendLOKMessage("show");
|
||||
}
|
||||
}
|
||||
|
||||
void DropDownFieldmark::SendLOKMessage(const OString& sAction)
|
||||
{
|
||||
if (comphelper::LibreOfficeKit::isActive())
|
||||
{
|
||||
if (!m_pButton)
|
||||
return;
|
||||
|
||||
SwEditWin* pEditWin = dynamic_cast<SwEditWin*>(m_pButton->GetParent());
|
||||
if (!pEditWin)
|
||||
return;
|
||||
|
||||
OString sPayload;
|
||||
if (sAction == "show")
|
||||
{
|
||||
sPayload = OStringLiteral("{\"action\": \"show\","
|
||||
" \"type\": \"drop-down\", \"textArea\": \"") +
|
||||
m_aPortionPaintArea.SVRect().toString() + "\"}";
|
||||
}
|
||||
else
|
||||
{
|
||||
sPayload = "{\"action\": \"hide\", \"type\": \"drop-down\"}";
|
||||
}
|
||||
pEditWin->GetView().GetWrtShell().GetSfxViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_FORM_FIELD_BUTTON, sPayload.getStr());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -280,8 +280,8 @@ namespace sw {
|
||||
virtual ~FieldmarkWithDropDownButton() override;
|
||||
|
||||
virtual void ShowButton(SwEditWin* pEditWin) = 0;
|
||||
void HideButton();
|
||||
void RemoveButton();
|
||||
virtual void HideButton();
|
||||
virtual void RemoveButton();
|
||||
|
||||
protected:
|
||||
VclPtr<FormFieldButton> m_pButton;
|
||||
@@ -296,10 +296,14 @@ namespace sw {
|
||||
virtual ~DropDownFieldmark() override;
|
||||
|
||||
virtual void ShowButton(SwEditWin* pEditWin) override;
|
||||
virtual void HideButton() override;
|
||||
virtual void RemoveButton() override;
|
||||
|
||||
// This method should be called only by the portion so we can now the portion's painting area
|
||||
void SetPortionPaintArea(const SwRect& rPortionPaintArea);
|
||||
|
||||
void SendLOKMessage(const OString& sAction);
|
||||
|
||||
private:
|
||||
SwRect m_aPortionPaintArea;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user