30 #include <svx/strings.hrc>
33 #include <svx/svxids.hrc>
34 #include <bitmaps.hlst>
36 #include <com/sun/star/form/XConfirmDeleteListener.hpp>
37 #include <com/sun/star/form/XFormComponent.hpp>
38 #include <com/sun/star/form/XGridColumnFactory.hpp>
39 #include <com/sun/star/io/XPersistObject.hpp>
40 #include <com/sun/star/sdb/CommandType.hpp>
41 #include <com/sun/star/sdb/RowChangeAction.hpp>
42 #include <com/sun/star/sdb/XQueriesSupplier.hpp>
43 #include <com/sun/star/sdbc/DataType.hpp>
44 #include <com/sun/star/sdbc/SQLException.hpp>
45 #include <com/sun/star/sdbc/XPreparedStatement.hpp>
46 #include <com/sun/star/sdbc/XResultSetUpdate.hpp>
47 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
48 #include <com/sun/star/sdbcx/XDeleteRows.hpp>
49 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
50 #include <com/sun/star/util/XNumberFormats.hpp>
51 #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
52 #include <com/sun/star/util/URLTransformer.hpp>
53 #include <com/sun/star/util/XURLTransformer.hpp>
54 #include <com/sun/star/view/XSelectionSupplier.hpp>
74 #include <string_view>
86 using namespace ::
cppu;
88 using namespace ::
svx;
102 rMenu.
insert(nMenuPos, OUString::fromUtf8(
id), rText, &rImgId,
nullptr,
nullptr,
TRISTATE_INDET);
106 :EditBrowserHeader(pParent, nWinBits)
132 Reference< XIndexAccess > xColumns =
static_cast<FmGridControl*
>(GetParent())->GetPeer()->getColumns();
133 if ( nPos < xColumns->getCount() )
135 Reference< XSelectionSupplier > xSelSupplier(xColumns, UNO_QUERY);
136 if ( xSelSupplier.is() )
139 xColumns->getByIndex(nPos) >>=
xColumn;
140 xSelSupplier->select(
makeAny(xColumn));
147 EditBrowserHeader::Select();
153 sal_uInt16 nItemId = GetItemId( ScreenToOutputPixel( rHEvt.
GetMousePosPixel() ) );
156 if ( rHEvt.
GetMode() & (HelpEventMode::QUICK | HelpEventMode::BALLOON) )
161 aItemRect.
SetTop( aPt.Y() );
162 aPt = OutputToScreenPixel( aItemRect.
BottomRight() );
167 Reference< css::container::XIndexContainer > xColumns(static_cast<FmGridControl*>(GetParent())->GetPeer()->getColumns());
170 Reference< css::beans::XPropertySet >
xColumn(xColumns->getByIndex(nPos),UNO_QUERY);
173 if ( aHelpText.isEmpty() )
175 if ( !aHelpText.isEmpty() )
177 if ( rHEvt.
GetMode() & HelpEventMode::BALLOON )
190 EditBrowserHeader::RequestHelp( rHEvt );
196 if (!static_cast<FmGridControl*>(GetParent())->IsDesignMode())
209 if (!static_cast<FmGridControl*>(GetParent())->IsDesignMode())
217 if (!bColumnDescriptor && !bFieldDescriptor)
219 OSL_FAIL(
"FmGridHeader::ExecuteDrop: should never have reached this (no extractable format)!");
224 OUString sDatasource, sCommand, sFieldName,sDatabaseLocation;
225 sal_Int32 nCommandType = CommandType::COMMAND;
226 Reference< XPreparedStatement > xStatement;
227 Reference< XResultSet > xResultSet;
231 ODataAccessDescriptor aColumn = OColumnTransferable::extractColumnDescriptor(aDroppedData);
232 if (aColumn.has(DataAccessDescriptorProperty::DataSource)) aColumn[DataAccessDescriptorProperty::DataSource] >>= sDatasource;
233 if (aColumn.has(DataAccessDescriptorProperty::DatabaseLocation)) aColumn[DataAccessDescriptorProperty::DatabaseLocation] >>= sDatabaseLocation;
234 if (aColumn.has(DataAccessDescriptorProperty::Command)) aColumn[DataAccessDescriptorProperty::Command] >>= sCommand;
235 if (aColumn.has(DataAccessDescriptorProperty::CommandType)) aColumn[DataAccessDescriptorProperty::CommandType] >>= nCommandType;
236 if (aColumn.has(DataAccessDescriptorProperty::ColumnName)) aColumn[DataAccessDescriptorProperty::ColumnName] >>= sFieldName;
237 if (aColumn.has(DataAccessDescriptorProperty::ColumnObject))aColumn[DataAccessDescriptorProperty::ColumnObject] >>= xField;
238 if (aColumn.has(DataAccessDescriptorProperty::Connection)) aColumn[DataAccessDescriptorProperty::Connection] >>= xConnection;
240 if ( sFieldName.isEmpty()
241 || sCommand.isEmpty()
242 || ( sDatasource.isEmpty()
243 && sDatabaseLocation.isEmpty()
248 OSL_FAIL(
"FmGridHeader::ExecuteDrop: somebody started a nonsense drag operation!!" );
255 if (!xConnection.is())
259 OUString sSignificantSource( sDatasource.isEmpty() ? sDatabaseLocation : sDatasource );
261 static_cast<FmGridControl*>(GetParent())->getContext(),
nullptr );
263 catch(NoSuchElementException&)
268 OSL_FAIL(
"FmGridHeader::ExecuteDrop: could not retrieve the database access object !");
271 if (!xConnection.is())
273 OSL_FAIL(
"FmGridHeader::ExecuteDrop: could not retrieve the database access object !");
282 Reference< XServiceInfo > xServiceInfo(xConnection, UNO_QUERY);
283 DBG_ASSERT(xServiceInfo.is() && xServiceInfo->supportsService(
SRV_SDB_CONNECTION),
"FmGridHeader::ExecuteDrop: invalid connection (no database access connection !)");
287 switch (nCommandType)
289 case CommandType::TABLE:
291 Reference< XTablesSupplier > xSupplyTables(xConnection, UNO_QUERY);
292 Reference< XColumnsSupplier > xSupplyColumns;
293 xSupplyTables->getTables()->getByName(sCommand) >>= xSupplyColumns;
294 xFields = xSupplyColumns->getColumns();
297 case CommandType::QUERY:
299 Reference< XQueriesSupplier > xSupplyQueries(xConnection, UNO_QUERY);
300 Reference< XColumnsSupplier > xSupplyColumns;
301 xSupplyQueries->getQueries()->getByName(sCommand) >>= xSupplyColumns;
302 xFields = xSupplyColumns->getColumns();
307 xStatement = xConnection->prepareStatement(sCommand);
311 xStatProps->setPropertyValue(
"MaxRows",
makeAny(sal_Int32(0)));
313 xResultSet = xStatement->executeQuery();
314 Reference< XColumnsSupplier > xSupplyCols(xResultSet, UNO_QUERY);
315 if (xSupplyCols.is())
316 xFields = xSupplyCols->getColumns();
320 if (xFields.is() && xFields->hasByName(sFieldName))
321 xFields->getByName(sFieldName) >>= xField;
325 ::comphelper::disposeComponent(xStatement);
333 m_pImpl->aDropData[DataAccessDescriptorProperty::Connection] <<= xConnection;
334 m_pImpl->aDropData[DataAccessDescriptorProperty::ColumnObject] <<= xField;
338 m_pImpl->xDroppedStatement = xStatement;
339 m_pImpl->xDroppedResultSet = xResultSet;
346 ::comphelper::disposeComponent(xStatement);
355 OUString sCommand, sFieldName,sURL;
356 sal_Int32 nCommandType = CommandType::COMMAND;
360 OUString sDatasource =
m_pImpl->aDropData.getDataSource();
361 if ( sDatasource.isEmpty() &&
m_pImpl->aDropData.has(DataAccessDescriptorProperty::ConnectionResource) )
362 m_pImpl->aDropData[DataAccessDescriptorProperty::ConnectionResource] >>= sURL;
363 m_pImpl->aDropData[DataAccessDescriptorProperty::Command] >>= sCommand;
364 m_pImpl->aDropData[DataAccessDescriptorProperty::CommandType] >>= nCommandType;
365 m_pImpl->aDropData[DataAccessDescriptorProperty::ColumnName] >>= sFieldName;
366 m_pImpl->aDropData[DataAccessDescriptorProperty::Connection] >>= xConnection;
367 m_pImpl->aDropData[DataAccessDescriptorProperty::ColumnObject] >>= xField;
372 Reference< XNumberFormatsSupplier > xSupplier =
getNumberFormats(xConnection,
true);
373 Reference< XNumberFormats > xNumberFormats;
375 xNumberFormats = xSupplier->getNumberFormats();
376 if (!xNumberFormats.is())
378 ::comphelper::disposeComponent(
m_pImpl->xDroppedResultSet);
379 ::comphelper::disposeComponent(
m_pImpl->xDroppedStatement);
392 case DataType::LONGVARBINARY:
393 case DataType::BINARY:
394 case DataType::VARBINARY:
395 case DataType::OTHER:
396 ::comphelper::disposeComponent(
m_pImpl->xDroppedResultSet);
397 ::comphelper::disposeComponent(
m_pImpl->xDroppedStatement);
402 Reference< XIndexContainer > xCols(static_cast<FmGridControl*>(GetParent())->GetPeer()->getColumns());
403 Reference< XGridColumnFactory >
xFactory(xCols, UNO_QUERY);
405 sal_uInt16 nColId = GetItemId(
m_pImpl->aDropPosPixel);
407 sal_uInt16
nPos = GetModelColumnPos(nColId);
411 std::vector<OString> aPossibleTypes;
412 std::vector<OUString> aImgResId;
413 std::vector<const char*> aStrResId;
418 case DataType::BOOLEAN:
420 aImgResId.emplace_back(RID_SVXBMP_CHECKBOX);
421 aStrResId.emplace_back(RID_STR_PROPTITLE_CHECKBOX);
423 case DataType::TINYINT:
424 case DataType::SMALLINT:
425 case DataType::INTEGER:
427 aImgResId.emplace_back(RID_SVXBMP_NUMERICFIELD);
428 aStrResId.emplace_back(RID_STR_PROPTITLE_NUMERICFIELD);
430 aImgResId.emplace_back(RID_SVXBMP_FORMATTEDFIELD);
431 aStrResId.emplace_back(RID_STR_PROPTITLE_FORMATTED);
434 case DataType::DOUBLE:
435 case DataType::NUMERIC:
436 case DataType::DECIMAL:
438 aImgResId.emplace_back(RID_SVXBMP_FORMATTEDFIELD);
439 aStrResId.emplace_back(RID_STR_PROPTITLE_FORMATTED);
441 aImgResId.emplace_back(RID_SVXBMP_NUMERICFIELD);
442 aStrResId.emplace_back(RID_STR_PROPTITLE_NUMERICFIELD);
444 case DataType::TIMESTAMP:
445 aPossibleTypes.emplace_back(
"dateandtimefield");
446 aImgResId.emplace_back(RID_SVXBMP_DATE_N_TIME_FIELDS);
447 aStrResId.emplace_back(RID_STR_DATE_AND_TIME);
449 aImgResId.emplace_back(RID_SVXBMP_DATEFIELD);
450 aStrResId.emplace_back(RID_STR_PROPTITLE_DATEFIELD);
452 aImgResId.emplace_back(RID_SVXBMP_TIMEFIELD);
453 aStrResId.emplace_back(RID_STR_PROPTITLE_TIMEFIELD);
455 aImgResId.emplace_back(RID_SVXBMP_FORMATTEDFIELD);
456 aStrResId.emplace_back(RID_STR_PROPTITLE_FORMATTED);
460 aImgResId.emplace_back(RID_SVXBMP_DATEFIELD);
461 aStrResId.emplace_back(RID_STR_PROPTITLE_DATEFIELD);
463 aImgResId.emplace_back(RID_SVXBMP_FORMATTEDFIELD);
464 aStrResId.emplace_back(RID_STR_PROPTITLE_FORMATTED);
468 aImgResId.emplace_back(RID_SVXBMP_TIMEFIELD);
469 aStrResId.emplace_back(RID_STR_PROPTITLE_TIMEFIELD);
471 aImgResId.emplace_back(RID_SVXBMP_FORMATTEDFIELD);
472 aStrResId.emplace_back(RID_STR_PROPTITLE_FORMATTED);
475 case DataType::VARCHAR:
476 case DataType::LONGVARCHAR:
479 aImgResId.emplace_back(RID_SVXBMP_EDITBOX);
480 aStrResId.emplace_back(RID_STR_PROPTITLE_EDIT);
482 aImgResId.emplace_back(RID_SVXBMP_FORMATTEDFIELD);
483 aStrResId.emplace_back(RID_STR_PROPTITLE_FORMATTED);
493 aImgResId.insert(aImgResId.begin(), RID_SVXBMP_CURRENCYFIELD);
494 aStrResId.insert(aStrResId.begin(), RID_STR_PROPTITLE_CURRENCYFIELD);
502 assert(aPossibleTypes.size() == aImgResId.size());
504 bool bDateNTimeCol =
false;
505 if (!aPossibleTypes.empty())
507 OString sPreferredType = aPossibleTypes[0];
511 std::unique_ptr<weld::Menu> xTypeMenu(xBuilder->weld_menu(
"insertmenu"));
514 std::vector<OString>::const_iterator iter;
515 std::vector<const char*>::const_iterator striter;
516 std::vector<OUString>::const_iterator imgiter;
517 for (iter = aPossibleTypes.begin(), imgiter = aImgResId.begin(), striter = aStrResId.begin();
518 iter != aPossibleTypes.end(); ++iter, ++striter, ++imgiter)
525 OString sResult = xTypeMenu->popup_at_rect(pParent, aRect);
526 if (!sResult.isEmpty())
527 sPreferredType = sResult;
530 bDateNTimeCol = sPreferredType ==
"dateandtimefield";
531 sal_uInt16 nColCount = bDateNTimeCol ? 2 : 1;
532 OUString sFieldService;
538 sFieldService = OUString::fromUtf8(sPreferredType);
540 if ( !sFieldService.isEmpty() )
541 xThisRoundCol = xFactory->createColumn(sFieldService);
543 xSecondCol = xThisRoundCol;
545 xCol = xThisRoundCol;
549 if (!xCol.is() || (bDateNTimeCol && !xSecondCol.is()))
551 ::comphelper::disposeComponent(xCol);
552 ::comphelper::disposeComponent(
m_pImpl->xDroppedResultSet);
553 ::comphelper::disposeComponent(
m_pImpl->xDroppedStatement);
559 OUString sTimePostfix(
SvxResId(RID_STR_POSTFIX_TIME));
562 OUString sDatePostfix(
SvxResId( RID_STR_POSTFIX_DATE));
572 xCols->insertByIndex(nPos, aElement);
574 FormControlFactory aControlFactory;
575 aControlFactory.initializeControlModel( DocumentClassification::classifyHostDocument( xCols ), xCol );
576 FormControlFactory::initializeFieldDependentProperties( xField, xCol, xNumberFormats );
579 if ( xSecondCol.is() )
584 OUString aPostfix[] = {
589 for (
size_t i=0;
i<2; ++
i )
594 OUString sRealName = sFieldName +
"_" + sPurePostfix;
606 aElement <<= xSecondCol;
607 xCols->insertByIndex(nPos == sal_uInt16(-1) ? nPos : ++nPos, aElement);
611 Reference< XFormComponent > xFormCp(xCols, UNO_QUERY);
617 if ( !sDatasource.isEmpty() )
627 switch (nCommandType)
629 case CommandType::TABLE:
630 aCommandType <<= sal_Int32(CommandType::TABLE);
632 case CommandType::QUERY:
633 aCommandType <<= sal_Int32(CommandType::QUERY);
636 aCommandType <<= sal_Int32(CommandType::COMMAND);
647 ::comphelper::disposeComponent(
m_pImpl->xDroppedResultSet);
648 ::comphelper::disposeComponent(
m_pImpl->xDroppedStatement);
652 ::comphelper::disposeComponent(
m_pImpl->xDroppedResultSet);
653 ::comphelper::disposeComponent(
m_pImpl->xDroppedStatement);
660 bool bDesignMode =
static_cast<FmGridControl*
>(GetParent())->IsDesignMode();
662 Reference< css::container::XIndexContainer > xCols(static_cast<FmGridControl*>(GetParent())->GetPeer()->getColumns());
669 Reference< css::container::XIndexContainer > xColumns(static_cast<FmGridControl*>(GetParent())->GetPeer()->getColumns());
670 Reference< css::beans::XPropertySet>
xColumn( xColumns->getByIndex(nPos2), css::uno::UNO_QUERY);
671 Reference< css::view::XSelectionSupplier > xSelSupplier(xColumns, UNO_QUERY);
672 if (xSelSupplier.is())
678 bool bMarked = nColId &&
static_cast<FmGridControl*
>(GetParent())->isColumnMarked(nColId);
695 if (xCols.is() && nColId)
697 Reference< css::beans::XPropertySet > xPropSet( xCols->getByIndex(nPos), css::uno::UNO_QUERY);
699 Reference< css::io::XPersistObject > xServiceQuestion(xPropSet, UNO_QUERY);
707 Reference< css::beans::XPropertySetInfo > xPropsInfo = xPropSet->getPropertySetInfo();
739 rMenu.
set_visible(
"change", bDesignMode && bMarked && xCols.is());
740 rMenu.
set_sensitive(
"change", bDesignMode && bMarked && xCols.is());
748 rMenu.
set_visible(
"insert", bDesignMode && xCols.is());
750 rMenu.
set_visible(
"delete", bDesignMode && bMarked && xCols.is());
751 rMenu.
set_sensitive(
"delete", bDesignMode && bMarked && xCols.is());
752 rMenu.
set_visible(
"column", bDesignMode && bMarked && xCols.is());
753 rMenu.
set_sensitive(
"column", bDesignMode && bMarked && xCols.is());
755 sal_uInt16 nHiddenCols = 0;
759 Reference< css::beans::XPropertySet > xCurCol;
761 for (sal_Int32
i=0;
i<xCols->getCount(); ++
i)
763 xCurCol.set(xCols->getByIndex(
i), css::uno::UNO_QUERY);
764 DBG_ASSERT(xCurCol.is(),
"FmGridHeader::PreExecuteColumnContextMenu : the Peer has invalid columns !");
766 DBG_ASSERT(aHidden.getValueType().getTypeClass() == TypeClass_BOOLEAN,
767 "FmGridHeader::PreExecuteColumnContextMenu : the property 'hidden' should be boolean !");
771 if (nHiddenCols < 16)
783 rShowMenu.
set_visible(
"more", xCols.is() && (nHiddenCols > 16));
784 rMenu.
set_visible(
"show", xCols.is() && (nHiddenCols > 0));
785 rMenu.
set_sensitive(
"show", xCols.is() && (nHiddenCols > 0));
788 bool bAllowHide = bMarked;
789 bAllowHide = bAllowHide || (!bDesignMode && (nPos != sal_uInt16(-1)));
790 bAllowHide = bAllowHide && xCols.is();
791 bAllowHide = bAllowHide && (xCols->getCount()-nHiddenCols > 1);
802 std::unique_ptr<SfxPoolItem> pItem;
805 if (eState >= SfxItemState::DEFAULT && pItem !=
nullptr)
807 bool bChecked =
dynamic_cast<const SfxBoolItem*
>( pItem.get()) !=
nullptr && static_cast<SfxBoolItem*>(pItem.get())->
GetValue();
821 Reference< css::container::XIndexContainer > xCols(static_cast<FmGridControl*>(GetParent())->GetPeer()->getColumns());
825 bool bReplace =
false;
828 if (rExecutionResult ==
"delete")
830 Reference< XInterface > xCol(
831 xCols->getByIndex(nPos), css::uno::UNO_QUERY);
832 xCols->removeByIndex(nPos);
833 ::comphelper::disposeComponent(xCol);
835 else if (rExecutionResult ==
"hide")
837 Reference< css::beans::XPropertySet > xCurCol( xCols->getByIndex(nPos), css::uno::UNO_QUERY);
840 else if (rExecutionResult ==
"column")
842 eInspectorAction = rMenu.
get_active(
"column") ? eOpenInspector : eCloseInspector;
904 else if (rExecutionResult ==
"more")
908 pDlg->SetColumns(xCols);
911 else if (rExecutionResult ==
"all")
914 Reference< css::beans::XPropertySet > xCurCol;
915 for (sal_Int32
i=0;
i<xCols->getCount(); ++
i)
917 xCurCol.
set(xCols->getByIndex(
i), css::uno::UNO_QUERY);
923 else if (!rExecutionResult.isEmpty())
925 sal_Int32 nExecutionResult = rExecutionResult.toInt32();
926 if (nExecutionResult>0 && nExecutionResult<=16)
930 Reference< css::beans::XPropertySet > xCurCol;
931 for (sal_Int32
i=0;
i<xCols->getCount() && nExecutionResult; ++
i)
933 xCurCol.set(xCols->getByIndex(
i), css::uno::UNO_QUERY);
936 if (!--nExecutionResult)
945 if ( !aFieldType.isEmpty() )
949 Reference< XGridColumnFactory >
xFactory( xCols, UNO_QUERY_THROW );
960 xCols->replaceByIndex( nPos,
makeAny( xNewCol ) );
961 ::comphelper::disposeComponent( xReplaced );
963 eInspectorAction = eUpdateInspector;
967 FormControlFactory factory;
969 OUString sLabel = FormControlFactory::getDefaultUniqueName_ByComponentType(
974 factory.initializeControlModel( DocumentClassification::classifyHostDocument( xCols ), xNewCol );
976 xCols->insertByIndex( nPos,
makeAny( xNewCol ) );
986 OSL_ENSURE( pCurrentFrame,
"FmGridHeader::PostExecuteColumnContextMenu: no view frame -> no bindings -> no property browser!" );
987 if ( !pCurrentFrame )
990 if ( eInspectorAction == eUpdateInspector )
993 eInspectorAction = eNone;
996 if ( eInspectorAction != eNone )
998 SfxBoolItem aShowItem( SID_FM_SHOW_PROPERTIES, eInspectorAction != eCloseInspector );
1001 SID_FM_SHOW_PROPERTY_BROWSER, SfxCallMode::ASYNCHRON,
1009 sal_uInt16 nColId = GetItemId( _rPreferredPos );
1013 std::unique_ptr<weld::Menu> xContextMenu(xBuilder->weld_menu(
"menu"));
1014 std::unique_ptr<weld::Menu> xInsertMenu(xBuilder->weld_menu(
"insertmenu"));
1015 std::unique_ptr<weld::Menu> xChangeMenu(xBuilder->weld_menu(
"changemenu"));
1016 std::unique_ptr<weld::Menu> xShowMenu(xBuilder->weld_menu(
"showmenu"));
1024 bEmpty = !xContextMenu->get_sensitive(xContextMenu->get_id(
i));
1034 OString sResult = xContextMenu->popup_at_rect(pParent, aRect);
1044 case CommandEventId::ContextMenu:
1053 EditBrowserHeader::Command(rEvt);
1058 const Reference< css::uno::XComponentContext >& _rxContext,
1064 ,m_nCurrentSelectedColumn(-1)
1066 ,m_bSelecting(false)
1067 ,m_bInColumnMove(false)
1074 if ( CommandEventId::ContextMenu == _rEvt.
GetCommand() )
1085 Point aRelativePos( pMyHeader->ScreenToOutputPixel( OutputToScreenPixel( aColRect.
TopCenter() ) ) );
1130 if (bOldMode == bMode)
1140 Reference< css::container::XIndexContainer > xColumns(
GetPeer()->getColumns());
1141 Reference< css::view::XSelectionSupplier > xSelSupplier(xColumns, UNO_QUERY);
1142 if (xSelSupplier.is())
1144 Any aSelection = xSelSupplier->getSelection();
1145 Reference< css::beans::XPropertySet >
xColumn;
1146 if (aSelection.getValueType().getTypeClass() == TypeClass_INTERFACE)
1147 xColumn.set(aSelection, css::uno::UNO_QUERY);
1148 Reference< XInterface > xCurrent;
1149 for (sal_Int32
i=0;
i<xColumns->getCount(); ++
i)
1151 xCurrent.set(xColumns->getByIndex(
i), css::uno::UNO_QUERY);
1152 if (xCurrent == xColumn)
1178 if (nSelectedRows <= 0)
1182 Reference< css::frame::XDispatchProvider > xDispatcher =
static_cast<css::frame::XDispatchProvider*
>(
GetPeer());
1183 if (xDispatcher.is())
1185 css::util::URL aUrl;
1187 Reference< css::util::XURLTransformer > xTransformer(
1189 xTransformer->parseStrict( aUrl );
1191 Reference< css::frame::XDispatch >
xDispatch = xDispatcher->queryDispatch(aUrl, OUString(), 0);
1192 Reference< css::form::XConfirmDeleteListener > xConfirm(xDispatch, UNO_QUERY);
1195 css::sdb::RowChangeEvent
aEvent;
1197 aEvent.Rows = nSelectedRows;
1198 aEvent.Action = css::sdb::RowChangeAction::DELETE;
1199 if (!xConfirm->confirmDelete(aEvent))
1209 Reference< XResultSetUpdate > xUpdateCursor(Reference< XInterface >(*pCursor), UNO_QUERY);
1213 while( pCursor->
next() )
1214 xUpdateCursor->deleteRow();
1219 xUpdateCursor->moveToInsertRow();
1232 Reference< css::sdbcx::XDeleteRows > xDeleteThem(Reference< XInterface >(*
getDataSource()), UNO_QUERY);
1239 bool bNewPos =
false;
1241 OSL_ENSURE(
GetCurrentRow().is(),
"FmGridControl::DeleteSelectedRows: no current row here?" );
1287 Sequence<sal_Int32> aDeletedRows;
1291 aDeletedRows = xDeleteThem->deleteRows(aBookmarks);
1293 catch(SQLException&)
1299 sal_Int32 nDeletedRows =
static_cast<sal_Int32
>(std::count_if(aDeletedRows.begin(), aDeletedRows.end(),
1300 [](
const sal_Int32 nRow) {
return nRow != 0; }));
1310 if (nDeletedRows == aDeletedRows.getLength())
1315 if (aBookmark.hasValue())
1320 Reference< XResultSetUpdate > xUpdateCursor(Reference< XInterface >(*
m_pDataCursor), UNO_QUERY);
1321 xUpdateCursor->moveToInsertRow();
1326 Reference< css::beans::XPropertySet > xSet(Reference< XInterface >(*
m_pDataCursor), UNO_QUERY);
1328 sal_Int32 nRecordCount(0);
1336 Reference< XResultSetUpdate > xUpdateCursor(Reference< XInterface >(*
m_pDataCursor), UNO_QUERY);
1337 xUpdateCursor->moveToInsertRow();
1339 else if (nRecordCount)
1347 auto pRow = std::find(aDeletedRows.begin(), aDeletedRows.end(), 0);
1348 if (pRow != aDeletedRows.end())
1350 auto i =
static_cast<sal_Int32
>(std::distance(aDeletedRows.begin(), pRow));
1372 if (nDeletedRows < nSelectedRows)
1384 for (
const sal_Int32 nSuccess : aDeletedRows)
1430 SAL_INFO(
"svx.fmcomp",
"FmGridControl::positioned");
1464 DBG_ASSERT( pParent ==
this,
"FmGridControl::imp_CreateHeaderBar: parent?" );
1497 tools::Long nMinimalPixelHeight = LogicToPixel(
Point(0, nMinimalLogicHeight),
MapMode(MapUnit::Map10thMM)).Y();
1498 return CalcZoom( nMinimalPixelHeight );
1506 DBG_ASSERT( xModel.is(),
"FmGridControl::RowHeightChanged: no model!" );
1513 Any aProperty =
makeAny( static_cast<sal_Int32>(PixelToLogic(
Point(0, nUnzoomedPixelHeight),
MapMode(MapUnit::Map10thMM)).
Y()) );
1528 const Reference< css::beans::XPropertySet >& xColModel(pCol->
getModel());
1535 aWidth <<= static_cast<sal_Int32>(PixelToLogic(
Point(nColumnWidth, 0),
MapMode(MapUnit::Map10thMM)).X());
1563 Reference< css::container::XIndexContainer > xColumns(
GetPeer()->getColumns());
1570 Reference< css::beans::XPropertySet > xCol;
1574 Reference< XInterface > xCurrent;
1575 for (i = 0; !xCol.is() && i < xColumns->getCount(); i++)
1577 xCurrent.set(xColumns->getByIndex(i), css::uno::UNO_QUERY);
1585 DBG_ASSERT(i < xColumns->getCount(),
"Wrong css::sdbcx::Index");
1586 xColumns->removeByIndex(i);
1617 for (i = 0; i < xColumns->getCount(); ++i)
1619 Reference< css::beans::XPropertySet > xCol(
1620 xColumns->getByIndex(i), css::uno::UNO_QUERY);
1626 sal_Int32 nWidth = 0;
1627 if (aWidth >>= nWidth)
1628 nWidth = LogicToPixel(
Point(nWidth, 0),
MapMode(MapUnit::Map10thMM)).X();
1640 for (i = 0; i < xColumns->getCount(); ++i)
1642 Reference< css::beans::XPropertySet > xCol( xColumns->getByIndex(i), css::uno::UNO_QUERY);
1655 DBG_ASSERT( _rxFieldsByNames == _rxFieldsByIndex,
"FmGridControl::InitColumnByField: invalid container interfaces!" );
1658 OUString sFieldName;
1664 if ( !xField.is() && _rxFieldsByNames->hasByName( sFieldName ) )
1665 _rxFieldsByNames->getByName( sFieldName ) >>= xField;
1668 sal_Int32 nFieldPos = -1;
1672 sal_Int32 nFieldCount = _rxFieldsByIndex->getCount();
1673 for ( sal_Int32
i = 0;
i < nFieldCount; ++
i)
1675 _rxFieldsByIndex->getByIndex(
i ) >>= xCheck;
1676 if ( xField.get() == xCheck.get() )
1684 if ( xField.is() && ( nFieldPos >= 0 ) )
1690 bool bIllegalType =
false;
1691 switch ( nDataType )
1693 case DataType::BLOB:
1694 case DataType::LONGVARBINARY:
1695 case DataType::BINARY:
1696 case DataType::VARBINARY:
1697 case DataType::OTHER:
1698 bIllegalType =
true;
1704 _pColumn->
SetObject( static_cast<sal_Int16>(nFieldPos) );
1710 static constexpr OUStringLiteral s_sPropColumnServiceName =
u"ColumnServiceName";
1714 _pColumn->
setModel( _rxColumnModel );
1716 OUString sColumnServiceName;
1717 _rxColumnModel->getPropertyValue( s_sPropColumnServiceName ) >>= sColumnServiceName;
1725 if ( !_rxFields.is() )
1729 Reference< XIndexContainer > xColumns(
GetPeer()->getColumns() );
1733 for (sal_Int32
i = 0;
i < xColumns->getCount();
i++)
1736 OSL_ENSURE(pCol,
"No grid column!");
1740 xColumns->getByIndex(
i ), css::uno::UNO_QUERY);
1752 if (nPos == sal_uInt16(-1))
1765 OSL_ENSURE(_pColumn,
"Column can not be null!");
1766 bool bSelected =
false;
1768 Reference< css::view::XSelectionSupplier > xSelSupplier(
GetPeer()->getColumns(), UNO_QUERY);
1769 if ( xSelSupplier.is() )
1771 Reference< css::beans::XPropertySet >
xColumn;
1772 xSelSupplier->getSelection() >>=
xColumn;
1773 bSelected = (xColumn.get() == _pColumn->
getModel().get());
1783 if (nPos == sal_uInt16(-1))
1802 OSL_FAIL(
"FmGridControl::selectBookmarks: no seek cursor!" );
1808 bool bAllSuccessfull =
true;
1811 for (
const Any& rBookmark : _rBookmarks)
1817 bAllSuccessfull =
false;
1822 OSL_FAIL(
"FmGridControl::selectBookmarks: could not move to one of the bookmarks!");
1826 return bAllSuccessfull;
1835 Sequence< Any> aBookmarks(nSelectedRows);
1836 if ( nSelectedRows )
1838 Any* pBookmarks = aBookmarks.getArray();
1859 pBookmarks[
i++] <<=
static_cast<sal_Int32
>(nIdx);
1862 DBG_ASSERT(
i == nSelectedRows,
"FmGridControl::DeleteSelectedRows : could not collect the row indices !");
1864 for (
i=0;
i<nSelectedRows; ++
i)
1866 nIdx = ::comphelper::getINT32(pBookmarks[
i]);
1870 aBookmarks.realloc(--nSelectedRows);
1884 OSL_FAIL(
"FmGridControl::DeleteSelectedRows : a bookmark could not be determined !");
1891 aBookmarks.realloc(
i);
1901 OUString getColumnPropertyFromPeer(
FmXGridPeer* _pPeer,sal_Int32 _nPosition,
const OUString& _sPropName)
1904 if ( _pPeer && _nPosition != -1)
1906 Reference<XIndexContainer> xIndex = _pPeer->
getColumns();
1907 if ( xIndex.is() && xIndex->getCount() > _nPosition )
1910 xIndex->getByIndex( _nPosition ) >>= xProp;
1914 xProp->getPropertyValue( _sPropName ) >>= sRetText;
1915 }
catch (UnknownPropertyException
const&) {
1931 case ::vcl::BBTYPE_BROWSEBOX:
1939 case ::vcl::BBTYPE_COLUMNHEADERCELL:
1940 sRetText = getColumnPropertyFromPeer(
1943 sal::static_int_cast< sal_uInt16 >(_nPosition)),
1957 case ::vcl::BBTYPE_BROWSEBOX:
1964 if ( sRetText.isEmpty() )
1969 case ::vcl::BBTYPE_COLUMNHEADERCELL:
1970 sRetText = getColumnPropertyFromPeer(
1973 sal::static_int_cast< sal_uInt16 >(_nPosition)),
1975 if ( sRetText.isEmpty() )
1976 sRetText = getColumnPropertyFromPeer(
1979 sal::static_int_cast< sal_uInt16 >(_nPosition)),
1995 sal_uInt16 nSelectedColumn =
1997 ? sal::static_int_cast< sal_uInt16 >(
2001 switch (nSelectedColumn)
2026 Reference< XSelectionSupplier > xSelSupplier(xColumns, UNO_QUERY);
2027 if (xSelSupplier.is())
2032 xColumns->getByIndex(nSelectedColumn),
2033 css::uno::UNO_QUERY);
2038 xSelSupplier->select(
Any());
2064 GetParent()->GrabFocus();
2070 Reference< css::container::XIndexContainer > xCols(
GetPeer()->getColumns());
2075 if ( m_nCurrentSelectedColumn < xCols->getCount() )
2077 Reference< XInterface > xCol;
2080 ::comphelper::disposeComponent(xCol);
OString stripEnd(const OString &rIn, char c)
#define LINK(Instance, Class, Member)
const css::uno::Reference< css::beans::XPropertySet > & getModel() const
virtual bool SaveModified() override
const SfxPoolItem * ExecuteList(sal_uInt16 nSlot, SfxCallMode nCall, std::initializer_list< SfxPoolItem const * > args, std::initializer_list< SfxPoolItem const * > internalargs=std::initializer_list< SfxPoolItem const * >())
virtual void HideColumn(sal_uInt16 nId) override
hide a column
const css::datatransfer::dnd::DropTargetDropEvent maDropEvent
sal_Int32 NextSelectedRow()
const std::vector< std::unique_ptr< DbGridColumn > > & GetColumns() const
GridRowStatus GetStatus() const
#define FM_PROP_FORMATSSUPPLIER
void columnVisible(DbGridColumn const *pColumn)
virtual sal_uInt16 AppendColumn(const OUString &rName, sal_uInt16 nWidth, sal_uInt16 nPos=HEADERBAR_APPEND, sal_uInt16 nId=sal_uInt16(-1)) override
#define FM_PROP_FIELDTYPE
const DbGridRowRef & GetEmptyRow() const
virtual OUString GetAccessibleObjectName(::vcl::AccessibleBrowseBoxObjType eObjType, sal_Int32 _nPosition=-1) const override
return the name of the specified object.
virtual void ShowColumn(sal_uInt16 nId) override
show a column
const css::uno::Any & GetBookmark() const
#define FM_PROP_ISCURRENCY
static SvxAbstractDialogFactory * Create()
::std::vector< DataFlavorEx > DataFlavorExVector
#define FM_PROP_ISMODIFIED
tools::Long CalcReverseZoom(tools::Long nVal)
virtual void SelectRow(sal_Int32 nRow, bool _bSelect=true, bool bExpand=true) override
static const AllSettings & GetSettings()
#define FM_COL_NUMERICFIELD
bool getBOOL(const Any &_rAny)
sal_Int32 m_nCurrentSelectedColumn
void CreateControl(sal_Int32 _nFieldPos, const css::uno::Reference< css::beans::XPropertySet > &xField, sal_Int32 nTypeId)
sal_Int32 GetSelectRowCount() const
bool IsAllSelected() const
static weld::Builder * CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false)
FmXGridPeer * GetPeer() const
void SetUpdateMode(bool bUpdate)
sal_uInt16 GetCode() const
tools::Rectangle GetFieldRectPixel(sal_Int32 nRow, sal_uInt16 nColId, bool bRelToBrowser=true) const
#define FM_PROP_DATASOURCE
constexpr sal_Int32 BROWSER_ENDOFSELECTION
virtual void Select() override
virtual void KeyInput(const KeyEvent &rKEvt) override
virtual void ColumnMoved(sal_uInt16 nId) override
HelpEventMode GetMode() const
sal_uInt16 GetModelColumnPos(sal_uInt16 nId) const
sal_uInt16 GetModelColCount() const
bool IsDesignMode() const
sal_uInt16 GetSelectColumnCount() const
virtual void Command(const CommandEvent &rEvt) override
#define TYPE_PATTERNFIELD
sal_Int32 getColumnTypeByModelName(const OUString &aModelName)
virtual void BeginCursorAction() override
virtual void BeginCursorAction()
virtual void ColumnMoved(sal_uInt16 nId) override
OUString SvxResId(const char *pId)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
CursorWrapper * getDataSource() const
bool IsMouseEvent() const
bool IsCurrentAppending() const
const DataFlavorExVector & GetDataFlavorExVector() const
#define FM_PROP_BOUNDFIELD
#define TYPE_NUMERICFIELD
#define FMURL_CONFIRM_DELETION
virtual void SetDesignMode(bool bMode)
virtual void SetNoSelection() override
uno::Reference< sdbc::XRow > xRow
virtual sal_Int32 GetRowCount() const override
#define FM_COL_FORMATTEDFIELD
#define TYPE_CURRENCYFIELD
bool moveToBookmark(const css::uno::Any &bookmark)
sal_uInt16 GetColumnIdFromViewPos(sal_uInt16 nPos) const
#define FM_PROP_ROWHEIGHT
virtual OUString GetAccessibleObjectName(::vcl::AccessibleBrowseBoxObjType eObjType, sal_Int32 _nPosition=-1) const override
const Point & GetMousePosPixel() const
virtual void Select() override
bool IsInsertionRow(sal_Int32 nRow) const
virtual tools::Long QueryMinimumRowHeight() override
virtual void CellModified() override
void startCursorListening()
#define DBG_UNHANDLED_EXCEPTION(...)
const MultiSelection * GetColumnSelection() const
#define FM_COL_PATTERNFIELD
#define TOOLS_WARN_EXCEPTION(area, stream)
sal_Int32 GetCurrentPos() const
#define DBG_ASSERT(sCon, aError)
bool selectBookmarks(const css::uno::Sequence< css::uno::Any > &_rBookmarks)
bool CompareBookmark(const Any &aLeft, const Any &aRight)
void InitColumnsByModels(const css::uno::Reference< css::container::XIndexContainer > &xColumns)
void markColumn(sal_uInt16 nId)
sal_Int32 FirstSelectedColumn() const
void propertyChange(const css::beans::PropertyChangeEvent &evt)
weld::Window * GetPopupParent(vcl::Window &rOutWin, tools::Rectangle &rRect)
#define FM_PROP_ESCAPE_PROCESSING
css::uno::Sequence< css::uno::Any > getSelectionBookmarks()
SfxBindings & GetBindings()
virtual void DeleteSelectedRows() override
void AdjustDataSource(bool bFull=false)
static void InsertMenuItem(weld::Menu &rMenu, int nMenuPos, std::string_view id, const OUString &rText, const OUString &rImgId)
bool isColumnSelected(DbGridColumn const *_pColumn)
returns if a column is selected
virtual void ShowColumn(sal_uInt16 nId)
show a column
std::unique_ptr< CursorWrapper > m_pSeekCursor
virtual void RowHeightChanged() override
CommandEventId GetCommand() const
virtual void CellModified() override
virtual css::uno::Reference< css::container::XIndexContainer > SAL_CALL getColumns() override
virtual void SetDesignMode(bool bMode) override
virtual void EndCursorAction()
sal_uInt16 m_nMarkedColumnId
const DbGridRowRef & GetCurrentRow() const
void columnHidden(DbGridColumn const *pColumn)
SfxItemState QueryState(sal_uInt16 nSID, std::unique_ptr< SfxPoolItem > &rpState)
sal_uInt16 GetColumnIdFromModelPos(sal_uInt16 nPos) const
static void ShowQuickHelp(vcl::Window *pParent, const tools::Rectangle &rScreenRect, const OUString &rHelpText, QuickHelpFlags nStyle=QuickHelpFlags::NONE)
sal_uInt16 GetColumnId(sal_uInt16 nPos) const
FmGridControl(const css::uno::Reference< css::uno::XComponentContext > &, vcl::Window *pParent, FmXGridPeer *_pPeer, WinBits nBits)
virtual OUString GetAccessibleObjectDescription(::vcl::AccessibleBrowseBoxObjType eObjType, sal_Int32 _nPosition=-1) const override
return the description of the specified object.
const Point & GetMousePosPixel() const
void implAdjustInSolarThread(bool _bRows)
const LanguageTag & getLocale()
void SetSeekPos(sal_Int32 nPos, GrantControlAccess)
static void InitColumnByField(DbGridColumn *_pColumn, const css::uno::Reference< css::beans::XPropertySet > &_rxColumnModel, const css::uno::Reference< css::container::XNameAccess > &_rxFieldsByNames, const css::uno::Reference< css::container::XIndexAccess > &_rxFieldsByIndex)
void setModel(const css::uno::Reference< css::beans::XPropertySet > &_xModel)
virtual void Command(const CommandEvent &rEvt) override
const vcl::KeyCode & GetKeyCode() const
bool HasChildWindow(sal_uInt16)
static SfxViewFrame * Current()
Reference< XDispatch > xDispatch
virtual void EndCursorAction() override
virtual void ColumnResized(sal_uInt16 nColId) override
void SetState(CursorWrapper *pCur, bool bPaintCursor)
bool SeekCursor(sal_Int32 nRow, bool bAbsolute=false)
#define FM_COL_CURRENCYFIELD
#define FM_PROP_DESCRIPTION
constexpr sal_uInt16 KEY_ESCAPE
const o3tl::enumarray< SvxAdjust, unsigned short > aSvxToUnoAdjust USHRT_MAX
sal_Int32 GetTotalCount() const
const CellControllerRef & Controller() const
#define SAL_INFO(area, stream)
void InsertHandleColumn()
AccessibleBrowseBoxObjType
static VclPtr< reference_type > Create(Arg &&...arg)
sal_Int32 FirstSelectedRow()
virtual VclPtr< BrowserHeader > imp_CreateHeaderBar(BrowseBox *pParent) override
virtual OUString GetAccessibleObjectDescription(::vcl::AccessibleBrowseBoxObjType eObjType, sal_Int32 _nPosition=-1) const override
std::unique_ptr< CursorWrapper > m_pDataCursor
Reference< XComponentContext > getProcessComponentContext()
OString stripStart(const OString &rIn, char c)
#define FM_PROP_COMMANDTYPE
void SetStatus(GridRowStatus _eStat)
void set(reference_type *pBody)
void stopCursorListening()
#define SRV_SDB_CONNECTION
sal_Int32 GetSeekPos() const
virtual void HideColumn(sal_uInt16 nId)
hide a column
bool hasProperty(const OUString &_rName, const Reference< XPropertySet > &_rxSet)
SfxDispatcher * GetDispatcher() const
tools::Long GetDataRowHeight() const
virtual void KeyInput(const KeyEvent &rEvt) override
const DbGridRowRef & GetSeekRow() const
Reference< XSingleServiceFactory > xFactory
Reference< XModel > xModel
bool isColumnMarked(sal_uInt16 nId) const
#define FM_PROP_CONTROLSOURCE
void RowModified(sal_Int32 nRow)
constexpr sal_uInt16 KEY_DELETE
virtual VclPtr< AbstractFmShowColsDialog > CreateFmShowColsDialog(weld::Window *pParent)=0
sal_Int32 LastSelectedRow()
virtual void ColumnResized(sal_uInt16 nId) override
void SetObject(sal_Int16 nPos)
virtual void SelectAll() override
OUString getString(const Any &_rAny)
virtual bool IsRowSelected(sal_Int32 nRow) const override
virtual void RowHeightChanged() override
css::uno::Any getBookmark()
virtual void InitColumnsByFields(const css::uno::Reference< css::container::XIndexAccess > &xFields) override
#define BROWSER_INVALIDID
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
sal_uLong GetColumnWidth(sal_uInt16 nColumnId) const
BrowserHeader * GetHeaderBar() const
sal_Int32 GetSelectCount() const
const MultiSelection * GetSelection() const
#define TYPE_FORMATTEDFIELD
void EnableInteractiveRowHeight()
static void ShowBalloon(vcl::Window *pParent, const Point &rScreenPos, const tools::Rectangle &, const OUString &rHelpText)
IMPL_LINK_NOARG(FmGridHeader, OnAsyncExecuteDrop, void *, void)
const DataFlavorExVector & GetDataFlavorExVector() const
css::uno::Any SAL_CALL makeAny(const SharedUNOComponent< INTERFACE, COMPONENT > &value)