24 #include <osl/diagnose.h>
33 #include <rtl/textenc.h>
34 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
35 #include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
37 #include <strings.hrc>
45 struct SwAddressFragment
47 std::unique_ptr<weld::Builder> m_xBuilder;
48 std::unique_ptr<weld::Label>
m_xLabel;
49 std::unique_ptr<weld::Entry> m_xEntry;
53 : m_xBuilder(
Application::CreateBuilder(pGrid,
"modules/swriter/ui/addressfragment.ui"))
54 , m_xLabel(m_xBuilder->weld_label(
"label"))
55 , m_xEntry(m_xBuilder->weld_entry(
"entry"))
59 m_xLabel->set_grid_top_attach(nLine);
61 m_xEntry->set_grid_left_attach(1);
62 m_xEntry->set_grid_top_attach(nLine);
67 m_pGrid->
move(m_xEntry.get(),
nullptr);
68 m_pGrid->
move(m_xLabel.get(),
nullptr);
85 std::vector<std::unique_ptr<SwAddressFragment>>
m_aLines;
105 , m_nCurrentDataSet(0)
107 , m_xScrollBar(rBuilder.weld_scrolled_window(
"scrollwin"))
108 , m_xWindow(rBuilder.weld_container(
"CONTAINER"))
124 sal_Int32 nLines = 0;
133 auto nLineHeight =
m_xWindow->get_preferred_size().Height();
165 "number of columns doesn't match number of Edits");
174 int x,
y, width, height;
184 auto nMinVisiblePos =
m_xScrollBar->vadjustment_get_value();
185 auto nMaxVisiblePos = nMinVisiblePos +
m_xScrollBar->vadjustment_get_page_size();
186 if (rRect.
Top() < nMinVisiblePos || rRect.
Bottom() > nMaxVisiblePos)
196 OSL_ENSURE(
m_pData->aDBData.size() > m_nCurrentDataSet,
"wrong data set index" );
197 if (
m_pData->aDBData.size() > m_nCurrentDataSet)
209 GotFocusHdl_Impl(*pEdit);
216 :
SfxDialogController(pParent,
"modules/swriter/ui/createaddresslist.ui",
"CreateAddressList")
217 , m_sAddressListFilterName(
SwResId(ST_FILTERNAME))
221 , m_xNewPB(m_xBuilder->weld_button(
"NEW"))
222 , m_xDeletePB(m_xBuilder->weld_button(
"DELETE"))
223 , m_xFindPB(m_xBuilder->weld_button(
"FIND"))
224 , m_xCustomizePB(m_xBuilder->weld_button(
"CUSTOMIZE"))
225 , m_xStartPB(m_xBuilder->weld_button(
"START"))
226 , m_xPrevPB(m_xBuilder->weld_button(
"PREV"))
227 , m_xSetNoED(m_xBuilder->weld_entry(
"SETNOED"))
228 , m_xSetNoNF(m_xBuilder->weld_spin_button(
"SETNOSB"))
229 , m_xNextPB(m_xBuilder->weld_button(
"NEXT"))
230 , m_xEndPB(m_xBuilder->weld_button(
"END"))
231 , m_xOK(m_xBuilder->weld_button(
"ok"))
262 if(bRead && !sLine.isEmpty())
267 const OUString sHeader = sLine.getToken( 0,
'\t', nIndex );
268 OSL_ENSURE(sHeader.getLength() > 2 &&
269 sHeader.startsWith(
"\"") && sHeader.endsWith(
"\""),
270 "Wrong format of header");
271 if(sHeader.getLength() > 2)
273 m_pCSVData->aDBColumnHeaders.push_back( sHeader.copy(1, sHeader.getLength() -2));
280 std::vector<OUString> aNewData;
282 sal_Int32
nIndex = { sLine.isEmpty() ? -1 : 0 };
285 const OUString sData = sLine.getToken( 0,
'\t', nIndex );
286 OSL_ENSURE( sData.startsWith(
"\"") && sData.endsWith(
"\""),
287 "Wrong format of line");
288 if(sData.getLength() >= 2)
289 aNewData.push_back(sData.copy(1, sData.getLength() - 2));
291 aNewData.push_back(sData);
301 const sal_uInt32
nCount = rAddressHeader.size();
302 for(sal_uInt32 nHeader = 0; nHeader < nCount; ++nHeader)
303 m_pCSVData->aDBColumnHeaders.push_back(rAddressHeader[nHeader].first);
304 std::vector<OUString> aNewData;
305 aNewData.insert(aNewData.begin(), nCount, OUString());
325 sal_uInt32 nCurrent = m_xAddressControl->GetCurrentDataSet();
326 std::vector<OUString> aNewData;
327 aNewData.insert(aNewData.begin(), m_pCSVData->aDBColumnHeaders.size(), OUString());
328 m_pCSVData->aDBData.insert(m_pCSVData->aDBData.begin() + ++nCurrent, aNewData);
329 m_xSetNoNF->set_max(m_pCSVData->aDBData.size());
331 m_xSetNoNF->set_value(nCurrent + 1);
332 RefreshNum_Impl(*m_xSetNoED);
334 m_xAddressControl->SetCurrentDataSet(nCurrent);
340 sal_uInt32 nCurrent = m_xAddressControl->GetCurrentDataSet();
341 if (m_pCSVData->aDBData.size() > 1)
343 m_pCSVData->aDBData.erase(m_pCSVData->aDBData.begin() + nCurrent);
350 m_pCSVData->aDBData[0].assign(m_pCSVData->aDBData[0].size(), OUString());
351 m_xDeletePB->set_sensitive(
false);
353 m_xAddressControl->CurrentDataSetInvalidated();
354 m_xAddressControl->SetCurrentDataSet(nCurrent);
355 m_xSetNoNF->set_max(m_pCSVData->aDBData.size());
365 for(
const auto& rHeader : m_pCSVData->aDBColumnHeaders)
371 m_xFindDlg->set_visible(!m_xFindDlg->get_visible());
380 m_xAddressControl->SetData(*m_pCSVData);
381 m_xAddressControl->SetCurrentDataSet(m_xAddressControl->GetCurrentDataSet());
389 for(
const auto& rHeader : m_pCSVData->aDBColumnHeaders)
397 void lcl_WriteValues(
const std::vector<OUString> *pFields,
SvStream* pStream)
399 OUStringBuffer sLine;
400 const std::vector< OUString >::const_iterator aBegin = pFields->begin();
401 const std::vector< OUString >::const_iterator aEnd = pFields->end();
402 for(std::vector< OUString >::const_iterator aIter = aBegin; aIter != aEnd; ++aIter)
406 sLine.append(
"\"").append(*aIter).append(
"\"");
410 sLine.append(
"\t\"").append(*aIter).append(
"\"");
424 uno::Reference < XFilePicker3 > xFP = aDlgHelper.
GetFilePicker();
426 const OUString sPath(
SvtPathOptions().SubstituteVariable(
"$(userurl)/database") );
427 aDlgHelper.SetDisplayDirectory( sPath );
428 xFP->appendFilter( m_sAddressListFilterName,
"*.csv" );
429 xFP->setCurrentFilter( m_sAddressListFilterName ) ;
433 m_sURL = xFP->getSelectedFiles().getConstArray()[0];
447 lcl_WriteValues(&(m_pCSVData->aDBColumnHeaders), pStream);
449 for(
const auto&
rData : m_pCSVData->aDBData)
451 lcl_WriteValues(&
rData, pStream);
459 int nValue = m_xSetNoNF->get_value();
461 if (&rButton == m_xStartPB.get())
463 else if (&rButton == m_xPrevPB.get())
468 else if (&rButton == m_xNextPB.get())
470 if (nValue < m_xSetNoNF->get_max())
474 nValue = m_xSetNoNF->get_max();
475 if (nValue != m_xSetNoNF->get_value())
477 m_xSetNoNF->set_value(nValue);
478 RefreshNum_Impl(*m_xSetNoED);
485 m_xSetNoNF->set_text(m_xSetNoED->get_text());
491 m_xSetNoED->set_text(OUString::number(m_xSetNoNF->get_value()));
502 sal_uInt32 nCurrent =
static_cast< sal_uInt32
>(
m_xSetNoNF->get_value() );
503 sal_uInt32 nSize =
static_cast<sal_uInt32
>(
m_pCSVData->aDBData.size());
506 m_xNextPB->set_sensitive(nCurrent != nSize);
507 m_xEndPB->set_sensitive(nCurrent != nSize);
513 const OUString sSearch = rSearch.toAsciiLowerCase();
517 sal_uInt32 nStart = nCurrent + 1;
519 std::size_t nElement = 0;
521 for(
short nTemp = 0; nTemp < 2 && !bFound; nTemp++)
523 for(nPos = nStart; nPos < nEnd; ++nPos)
527 bFound = -1 != aData[
static_cast<sal_uInt32
>(nColumn)].toAsciiLowerCase().indexOf(sSearch);
530 for( nElement = 0; nElement < aData.size(); ++nElement)
532 bFound = -1 != aData[nElement].toAsciiLowerCase().indexOf(sSearch);
557 : GenericDialogController(pParent->getDialog(),
"modules/swriter/ui/findentrydialog.ui",
"FindEntryDialog")
559 , m_xFindED(m_xBuilder->weld_entry(
"entry"))
560 , m_xFindOnlyCB(m_xBuilder->weld_check_button(
"findin"))
561 , m_xFindOnlyLB(m_xBuilder->weld_combo_box(
"area"))
562 , m_xFindPB(m_xBuilder->weld_button(
"find"))
563 , m_xCancel(m_xBuilder->weld_button(
"cancel"))
576 sal_Int32 nColumn = -1;
577 if (m_xFindOnlyCB->get_active())
578 nColumn = m_xFindOnlyLB->get_active();
579 m_pParent->Find(m_xFindED->get_text(), nColumn);
584 m_xFindPB->set_sensitive(!m_xFindED->get_text().isEmpty());
#define LINK(Instance, Class, Member)
std::unique_ptr< weld::Button > m_xStartPB
virtual void connect_changed(const Link< Entry &, void > &rLink)
std::unique_ptr< SwCSVData > ReleaseNewData()
virtual ~SwCreateAddressListDialog() override
void SetData(SwCSVData &rDBData)
sal_uInt32 GetCurrentDataSet() const
std::unique_ptr< weld::Button > m_xPrevPB
std::vector< OUString > aDBColumnHeaders
IMPL_LINK_NOARG(SwCreateAddressListDialog, NewHdl_Impl, weld::Button &, void)
const ContentProperties & rData
std::unique_ptr< weld::Button > m_xFindPB
DECL_LINK(GotFocusHdl_Impl, weld::Widget &, void)
std::unique_ptr< weld::Label > m_xLabel
bool setExtension(OUString const &rTheExtension, sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
bool ReadByteStringLine(OUString &rStr, rtl_TextEncoding eSrcCharSet, sal_Int32 nMaxBytesToRead=0xFFFE)
SvStream * GetOutStream()
std::vector< std::unique_ptr< SwAddressFragment > > m_aLines
std::unique_ptr< weld::Container > m_xWindow
std::unique_ptr< weld::ScrolledWindow > m_xScrollBar
std::unique_ptr< weld::Entry > m_xFindED
constexpr OUStringLiteral aData
virtual ~SwFindEntryDialog() override
IMPL_LINK(SwAddressControl_Impl, GotFocusHdl_Impl, weld::Widget &, rEdit, void)
sal_uInt32 m_nCurrentDataSet
std::unique_ptr< weld::Button > m_xNextPB
const std::vector< std::pair< OUString, int > > & GetDefaultAddressHeaders() const
std::unique_ptr< SwCSVData > m_pCSVData
std::unique_ptr< weld::Button > m_xNewPB
void MakeVisible(const tools::Rectangle &aRect)
void SetCursorTo(std::size_t nElement)
virtual void move(weld::Widget *pWidget, weld::Container *pNewParent)=0
bool WriteByteStringLine(std::u16string_view rStr, rtl_TextEncoding eDestCharSet)
virtual void set_active(int pos)=0
OUString SwResId(const char *pId)
virtual OUString get_text() const =0
virtual void set_label(const OUString &rText)=0
std::unique_ptr< weld::SpinButton > m_xSetNoNF
std::unique_ptr< weld::Entry > m_xSetNoED
std::unique_ptr< weld::Button > m_xFindPB
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
std::unique_ptr< SwAddressControl_Impl > m_xAddressControl
SwCreateAddressListDialog(weld::Window *pParent, const OUString &rURL, SwMailMergeConfigItem const &rConfig)
SwFindEntryDialog(SwCreateAddressListDialog *pParent)
void SetCurrentDataSet(sal_uInt32 nSet)
std::unique_ptr< weld::Button > m_xCustomizePB
void SetStreamCharSet(rtl_TextEncoding eCharSet)
std::unique_ptr< weld::Button > m_xEndPB
Reference< XExecutableDialog > m_xDialog
std::map< weld::Entry *, sal_Int32 > m_aEditLines
std::unique_ptr< weld::Button > m_xDeletePB
void append_text(const OUString &rStr)
std::unique_ptr< weld::Button > m_xOK
const css::uno::Reference< css::ui::dialogs::XFilePicker3 > & GetFilePicker() const
std::vector< std::vector< OUString > > aDBData
std::unique_ptr< weld::Button > m_xCancel
SwAddressControl_Impl(weld::Builder &rBuilder)
void CurrentDataSetInvalidated()
void SetLineDelimiter(LineEnd eLineEnd)
void Find(const OUString &rSearch, sal_Int32 nColumn)