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