1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #ifdef SW_DLLIMPLEMENTATION
28*b1cdbd2cSJim Jagielski #undef SW_DLLIMPLEMENTATION
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski #include <sfx2/request.hxx>
33*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski #include "view.hxx"
38*b1cdbd2cSJim Jagielski #include "basesh.hxx"
39*b1cdbd2cSJim Jagielski #include "wrtsh.hxx" //
40*b1cdbd2cSJim Jagielski #include "cmdid.h"
41*b1cdbd2cSJim Jagielski #include "bookmark.hxx" // SwInsertBookmarkDlg
42*b1cdbd2cSJim Jagielski #include "IMark.hxx"
43*b1cdbd2cSJim Jagielski #include "bookmark.hrc"
44*b1cdbd2cSJim Jagielski #include "misc.hrc"
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski const String BookmarkCombo::aForbiddenChars = String::CreateFromAscii("/\\@:*?\";,.#");
48*b1cdbd2cSJim Jagielski
49*b1cdbd2cSJim Jagielski
IMPL_LINK(SwInsertBookmarkDlg,ModifyHdl,BookmarkCombo *,pBox)50*b1cdbd2cSJim Jagielski IMPL_LINK( SwInsertBookmarkDlg, ModifyHdl, BookmarkCombo *, pBox )
51*b1cdbd2cSJim Jagielski {
52*b1cdbd2cSJim Jagielski sal_Bool bSelEntries = pBox->GetSelectEntryCount() != 0;
53*b1cdbd2cSJim Jagielski // if a string has been pasted from the clipboard then
54*b1cdbd2cSJim Jagielski // there may be illegal characters in the box
55*b1cdbd2cSJim Jagielski if(!bSelEntries)
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski String sTmp = pBox->GetText();
58*b1cdbd2cSJim Jagielski sal_uInt16 nLen = sTmp.Len();
59*b1cdbd2cSJim Jagielski String sMsg;
60*b1cdbd2cSJim Jagielski for(sal_uInt16 i = 0; i < BookmarkCombo::aForbiddenChars.Len(); i++)
61*b1cdbd2cSJim Jagielski {
62*b1cdbd2cSJim Jagielski sal_uInt16 nTmpLen = sTmp.Len();
63*b1cdbd2cSJim Jagielski sTmp.EraseAllChars(BookmarkCombo::aForbiddenChars.GetChar(i));
64*b1cdbd2cSJim Jagielski if(sTmp.Len() != nTmpLen)
65*b1cdbd2cSJim Jagielski sMsg += BookmarkCombo::aForbiddenChars.GetChar(i);
66*b1cdbd2cSJim Jagielski }
67*b1cdbd2cSJim Jagielski if(sTmp.Len() != nLen)
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski pBox->SetText(sTmp);
70*b1cdbd2cSJim Jagielski String sWarning(sRemoveWarning);
71*b1cdbd2cSJim Jagielski sWarning += sMsg;
72*b1cdbd2cSJim Jagielski InfoBox(this, sWarning).Execute();
73*b1cdbd2cSJim Jagielski }
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim Jagielski aOkBtn.Enable(!bSelEntries); // neue Textmarke
79*b1cdbd2cSJim Jagielski aDeleteBtn.Enable(bSelEntries); // loeschbar?
80*b1cdbd2cSJim Jagielski
81*b1cdbd2cSJim Jagielski return 0;
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski
84*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
85*b1cdbd2cSJim Jagielski Beschreibung: Callback zum Loeschen einer Textmarke
86*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
87*b1cdbd2cSJim Jagielski
IMPL_LINK(SwInsertBookmarkDlg,DeleteHdl,Button *,EMPTYARG)88*b1cdbd2cSJim Jagielski IMPL_LINK( SwInsertBookmarkDlg, DeleteHdl, Button *, EMPTYARG )
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski // Textmarken aus der ComboBox entfernen
91*b1cdbd2cSJim Jagielski
92*b1cdbd2cSJim Jagielski for (sal_uInt16 i = aBookmarkBox.GetSelectEntryCount(); i; i-- )
93*b1cdbd2cSJim Jagielski aBookmarkBox.RemoveEntry(aBookmarkBox.GetSelectEntryPos(i - 1));
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski aBookmarkBox.SetText(aEmptyStr);
96*b1cdbd2cSJim Jagielski aDeleteBtn.Enable(sal_False); // keine weiteren Eintraege vorhanden
97*b1cdbd2cSJim Jagielski // aBookmarkBox.SetText(aEmptyStr);
98*b1cdbd2cSJim Jagielski
99*b1cdbd2cSJim Jagielski aOkBtn.Enable(); // Im OK Handler wird geloescht
100*b1cdbd2cSJim Jagielski return 0;
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
104*b1cdbd2cSJim Jagielski Beschreibung: Callback fuer OKButton. Fuegt eine neue Textmarke
105*b1cdbd2cSJim Jagielski an die akt. Position ein. Geloeschte Textmarken werden auch am Modell
106*b1cdbd2cSJim Jagielski entfernt.
107*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
108*b1cdbd2cSJim Jagielski
109*b1cdbd2cSJim Jagielski
Apply()110*b1cdbd2cSJim Jagielski void SwInsertBookmarkDlg::Apply()
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski //at first remove deleted bookmarks to prevent multiple bookmarks with the same
113*b1cdbd2cSJim Jagielski //name
114*b1cdbd2cSJim Jagielski for (sal_uInt16 nCount = aBookmarkBox.GetRemovedCount(); nCount > 0; nCount--)
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski String sRemoved = aBookmarkBox.GetRemovedEntry( nCount -1 ).GetName();
117*b1cdbd2cSJim Jagielski IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess();
118*b1cdbd2cSJim Jagielski pMarkAccess->deleteMark( pMarkAccess->findMark(sRemoved) );
119*b1cdbd2cSJim Jagielski SfxRequest aReq( rSh.GetView().GetViewFrame(), FN_DELETE_BOOKMARK );
120*b1cdbd2cSJim Jagielski aReq.AppendItem( SfxStringItem( FN_DELETE_BOOKMARK, sRemoved ) );
121*b1cdbd2cSJim Jagielski aReq.Done();
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski // Textmarke einfuegen
125*b1cdbd2cSJim Jagielski sal_uInt16 nLen = aBookmarkBox.GetText().Len();
126*b1cdbd2cSJim Jagielski SwBoxEntry aTmpEntry(aBookmarkBox.GetText(), 0 );
127*b1cdbd2cSJim Jagielski
128*b1cdbd2cSJim Jagielski if ( nLen && (aBookmarkBox.GetEntryPos(aTmpEntry) == COMBOBOX_ENTRY_NOTFOUND) )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski String sEntry(aBookmarkBox.GetText());
131*b1cdbd2cSJim Jagielski sEntry.EraseAllChars(aBookmarkBox.GetMultiSelectionSeparator());
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski rSh.SetBookmark( KeyCode(), sEntry, aEmptyStr );
134*b1cdbd2cSJim Jagielski rReq.AppendItem( SfxStringItem( FN_INSERT_BOOKMARK, sEntry ) );
135*b1cdbd2cSJim Jagielski rReq.Done();
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski
138*b1cdbd2cSJim Jagielski if ( !rReq.IsDone() )
139*b1cdbd2cSJim Jagielski rReq.Ignore();
140*b1cdbd2cSJim Jagielski
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
144*b1cdbd2cSJim Jagielski Beschreibung: CTOR
145*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
146*b1cdbd2cSJim Jagielski
147*b1cdbd2cSJim Jagielski
SwInsertBookmarkDlg(Window * pParent,SwWrtShell & rS,SfxRequest & rRequest)148*b1cdbd2cSJim Jagielski SwInsertBookmarkDlg::SwInsertBookmarkDlg( Window *pParent, SwWrtShell &rS, SfxRequest& rRequest ) :
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski SvxStandardDialog(pParent,SW_RES(DLG_INSERT_BOOKMARK)),
151*b1cdbd2cSJim Jagielski aBookmarkFl(this,SW_RES(FL_BOOKMARK)),
152*b1cdbd2cSJim Jagielski aBookmarkBox(this,SW_RES(CB_BOOKMARK)),
153*b1cdbd2cSJim Jagielski aOkBtn(this,SW_RES(BT_OK)),
154*b1cdbd2cSJim Jagielski aCancelBtn(this,SW_RES(BT_CANCEL)),
155*b1cdbd2cSJim Jagielski aDeleteBtn(this,SW_RES(BT_DELETE)),
156*b1cdbd2cSJim Jagielski rSh( rS ),
157*b1cdbd2cSJim Jagielski rReq( rRequest )
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski aBookmarkBox.SetModifyHdl(LINK(this, SwInsertBookmarkDlg, ModifyHdl));
160*b1cdbd2cSJim Jagielski aBookmarkBox.EnableMultiSelection(sal_True);
161*b1cdbd2cSJim Jagielski aBookmarkBox.EnableAutocomplete( sal_True, sal_True );
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski aDeleteBtn.SetClickHdl(LINK(this, SwInsertBookmarkDlg, DeleteHdl));
164*b1cdbd2cSJim Jagielski
165*b1cdbd2cSJim Jagielski // Combobox mit vorhandenen Bookmarks fuellen
166*b1cdbd2cSJim Jagielski IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess();
167*b1cdbd2cSJim Jagielski sal_uInt16 nId = 0;
168*b1cdbd2cSJim Jagielski for( IDocumentMarkAccess::const_iterator_t ppBookmark = pMarkAccess->getBookmarksBegin();
169*b1cdbd2cSJim Jagielski ppBookmark != pMarkAccess->getBookmarksEnd();
170*b1cdbd2cSJim Jagielski ppBookmark++)
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski if(IDocumentMarkAccess::BOOKMARK == IDocumentMarkAccess::GetType(**ppBookmark))
173*b1cdbd2cSJim Jagielski aBookmarkBox.InsertEntry( SwBoxEntry( ppBookmark->get()->GetName(), nId++ ) );
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski FreeResource();
176*b1cdbd2cSJim Jagielski sRemoveWarning = String(SW_RES(STR_REMOVE_WARNING));
177*b1cdbd2cSJim Jagielski }
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
180*b1cdbd2cSJim Jagielski Beschreibung:
181*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
182*b1cdbd2cSJim Jagielski
~SwInsertBookmarkDlg()183*b1cdbd2cSJim Jagielski SwInsertBookmarkDlg::~SwInsertBookmarkDlg()
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski }
186*b1cdbd2cSJim Jagielski
187*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
188*b1cdbd2cSJim Jagielski Beschreibung:
189*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
190*b1cdbd2cSJim Jagielski
BookmarkCombo(Window * pWin,const ResId & rResId)191*b1cdbd2cSJim Jagielski BookmarkCombo::BookmarkCombo( Window* pWin, const ResId& rResId ) :
192*b1cdbd2cSJim Jagielski SwComboBox(pWin, rResId)
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski
196*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
197*b1cdbd2cSJim Jagielski Beschreibung:
198*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
199*b1cdbd2cSJim Jagielski
GetFirstSelEntryPos() const200*b1cdbd2cSJim Jagielski sal_uInt16 BookmarkCombo::GetFirstSelEntryPos() const
201*b1cdbd2cSJim Jagielski {
202*b1cdbd2cSJim Jagielski return GetSelEntryPos(0);
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
206*b1cdbd2cSJim Jagielski Beschreibung:
207*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
208*b1cdbd2cSJim Jagielski
GetNextSelEntryPos(sal_uInt16 nPos) const209*b1cdbd2cSJim Jagielski sal_uInt16 BookmarkCombo::GetNextSelEntryPos(sal_uInt16 nPos) const
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski return GetSelEntryPos(nPos + 1);
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski
214*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
215*b1cdbd2cSJim Jagielski Beschreibung:
216*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
217*b1cdbd2cSJim Jagielski
GetSelEntryPos(sal_uInt16 nPos) const218*b1cdbd2cSJim Jagielski sal_uInt16 BookmarkCombo::GetSelEntryPos(sal_uInt16 nPos) const
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski sal_Unicode cSep = GetMultiSelectionSeparator();
221*b1cdbd2cSJim Jagielski
222*b1cdbd2cSJim Jagielski sal_uInt16 nCnt = GetText().GetTokenCount(cSep);
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski for (; nPos < nCnt; nPos++)
225*b1cdbd2cSJim Jagielski {
226*b1cdbd2cSJim Jagielski String sEntry(GetText().GetToken(nPos, cSep));
227*b1cdbd2cSJim Jagielski sEntry.EraseLeadingChars();
228*b1cdbd2cSJim Jagielski sEntry.EraseTrailingChars();
229*b1cdbd2cSJim Jagielski if (GetEntryPos(sEntry) != COMBOBOX_ENTRY_NOTFOUND)
230*b1cdbd2cSJim Jagielski return nPos;
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski
233*b1cdbd2cSJim Jagielski return COMBOBOX_ENTRY_NOTFOUND;
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski
236*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
237*b1cdbd2cSJim Jagielski Beschreibung:
238*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
239*b1cdbd2cSJim Jagielski
GetSelectEntryCount() const240*b1cdbd2cSJim Jagielski sal_uInt16 BookmarkCombo::GetSelectEntryCount() const
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski sal_uInt16 nCnt = 0;
243*b1cdbd2cSJim Jagielski
244*b1cdbd2cSJim Jagielski sal_uInt16 nPos = GetFirstSelEntryPos();
245*b1cdbd2cSJim Jagielski while (nPos != COMBOBOX_ENTRY_NOTFOUND)
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski nPos = GetNextSelEntryPos(nPos);
248*b1cdbd2cSJim Jagielski nCnt++;
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski
251*b1cdbd2cSJim Jagielski return nCnt;
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski /*------------------------------------------------------------------------
255*b1cdbd2cSJim Jagielski Beschreibung: Position in der Listbox (der ComboBox)
256*b1cdbd2cSJim Jagielski -----------------------------------------------------------------------*/
257*b1cdbd2cSJim Jagielski
GetSelectEntryPos(sal_uInt16 nSelIndex) const258*b1cdbd2cSJim Jagielski sal_uInt16 BookmarkCombo::GetSelectEntryPos( sal_uInt16 nSelIndex ) const
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski sal_uInt16 nCnt = 0;
261*b1cdbd2cSJim Jagielski sal_uInt16 nPos = GetFirstSelEntryPos();
262*b1cdbd2cSJim Jagielski
263*b1cdbd2cSJim Jagielski while (nPos != COMBOBOX_ENTRY_NOTFOUND)
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski if (nSelIndex == nCnt)
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski sal_Unicode cSep = GetMultiSelectionSeparator();
268*b1cdbd2cSJim Jagielski String sEntry(GetText().GetToken(nPos, cSep));
269*b1cdbd2cSJim Jagielski sEntry.EraseLeadingChars();
270*b1cdbd2cSJim Jagielski sEntry.EraseTrailingChars();
271*b1cdbd2cSJim Jagielski
272*b1cdbd2cSJim Jagielski return GetEntryPos(sEntry);
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski nPos = GetNextSelEntryPos(nPos);
275*b1cdbd2cSJim Jagielski nCnt++;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski
278*b1cdbd2cSJim Jagielski return COMBOBOX_ENTRY_NOTFOUND;
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski /* -----------------05.02.99 08:39-------------------
281*b1cdbd2cSJim Jagielski *
282*b1cdbd2cSJim Jagielski * --------------------------------------------------*/
PreNotify(NotifyEvent & rNEvt)283*b1cdbd2cSJim Jagielski long BookmarkCombo::PreNotify( NotifyEvent& rNEvt )
284*b1cdbd2cSJim Jagielski {
285*b1cdbd2cSJim Jagielski long nHandled = 0;
286*b1cdbd2cSJim Jagielski if( EVENT_KEYINPUT == rNEvt.GetType() &&
287*b1cdbd2cSJim Jagielski rNEvt.GetKeyEvent()->GetCharCode() )
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski String sKey( rNEvt.GetKeyEvent()->GetCharCode() );
290*b1cdbd2cSJim Jagielski if(STRING_NOTFOUND != aForbiddenChars.Search(sKey))
291*b1cdbd2cSJim Jagielski nHandled = 1;
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski if(!nHandled)
294*b1cdbd2cSJim Jagielski nHandled = SwComboBox::PreNotify( rNEvt );
295*b1cdbd2cSJim Jagielski return nHandled;
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski
298*b1cdbd2cSJim Jagielski
299*b1cdbd2cSJim Jagielski
300