Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <svx/rubydialog.hxx>
21 : #include <tools/shl.hxx>
22 : #include <svx/dialmgr.hxx>
23 : #include <svx/dialogs.hrc>
24 : #include <rubydialog.hrc>
25 : #include <sfx2/app.hxx>
26 : #include <sfx2/dispatch.hxx>
27 : #include <sfx2/viewfrm.hxx>
28 : #include <svl/eitem.hxx>
29 : #include <com/sun/star/frame/XController.hpp>
30 : #include <com/sun/star/style/XStyle.hpp>
31 : #include <com/sun/star/text/XRubySelection.hpp>
32 : #include <com/sun/star/beans/PropertyValues.hpp>
33 : #include <com/sun/star/beans/XPropertySet.hpp>
34 : #include <com/sun/star/beans/XPropertySetInfo.hpp>
35 : #include <com/sun/star/container/XNameContainer.hpp>
36 : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
37 : #include <com/sun/star/text/RubyAdjust.hpp>
38 : #include <com/sun/star/view/XSelectionChangeListener.hpp>
39 : #include <com/sun/star/view/XSelectionSupplier.hpp>
40 : #include <cppuhelper/implbase1.hxx>
41 : #include <svtools/colorcfg.hxx>
42 :
43 : using namespace com::sun::star::uno;
44 : using namespace com::sun::star::frame;
45 : using namespace com::sun::star::text;
46 : using namespace com::sun::star::beans;
47 : using namespace com::sun::star::style;
48 : using namespace com::sun::star::text;
49 : using namespace com::sun::star::view;
50 : using namespace com::sun::star::lang;
51 : using namespace com::sun::star::container;
52 : using rtl::OUString;
53 :
54 : #define C2U(cChar) rtl::OUString::createFromAscii(cChar)
55 :
56 10 : SFX_IMPL_CHILDWINDOW( SvxRubyChildWindow, SID_RUBY_DIALOG );
57 :
58 : static const sal_Char cRubyBaseText[] = "RubyBaseText";
59 : static const sal_Char cRubyText[] = "RubyText";
60 : static const sal_Char cCharacterStyles[] = "CharacterStyles";
61 : static const sal_Char cRubyAdjust[] = "RubyAdjust";
62 : static const sal_Char cRubyIsAbove[] = "RubyIsAbove";
63 : static const sal_Char cDisplayName[] = "DisplayName";
64 : static const sal_Char cRubyCharStyleName[] = "RubyCharStyleName";
65 : static const sal_Char cRubies[] = "Rubies";
66 :
67 0 : SvxRubyChildWindow::SvxRubyChildWindow( Window* _pParent, sal_uInt16 nId,
68 : SfxBindings* pBindings, SfxChildWinInfo* pInfo) :
69 0 : SfxChildWindow(_pParent, nId)
70 : {
71 0 : pWindow = new SvxRubyDialog( pBindings, this, _pParent, SVX_RES( RID_SVXDLG_RUBY ) );
72 0 : SvxRubyDialog* pDlg = (SvxRubyDialog*) pWindow;
73 :
74 0 : if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
75 0 : pDlg->RollUp();
76 :
77 0 : eChildAlignment = SFX_ALIGN_NOALIGNMENT;
78 :
79 0 : pDlg->Initialize( pInfo );
80 0 : }
81 :
82 0 : SfxChildWinInfo SvxRubyChildWindow::GetInfo() const
83 : {
84 0 : return SfxChildWindow::GetInfo();
85 : }
86 :
87 : class SvxRubyData_Impl : public cppu::WeakImplHelper1
88 : < ::com::sun::star::view::XSelectionChangeListener >
89 : {
90 : Reference<XModel> xModel;
91 : Reference<XRubySelection> xSelection;
92 : Sequence<PropertyValues> aRubyValues;
93 : Reference<XController> xController;
94 : sal_Bool bHasSelectionChanged;
95 : public:
96 : SvxRubyData_Impl();
97 : ~SvxRubyData_Impl();
98 :
99 : void SetController(Reference<XController> xCtrl);
100 0 : Reference<XModel> GetModel()
101 : {
102 0 : if(!xController.is())
103 0 : xModel = 0;
104 : else
105 0 : xModel = xController->getModel();
106 0 : return xModel;
107 : }
108 0 : sal_Bool HasSelectionChanged() const{return bHasSelectionChanged;}
109 0 : Reference<XRubySelection> GetRubySelection()
110 : {
111 0 : xSelection = Reference<XRubySelection>(xController, UNO_QUERY);
112 0 : return xSelection;
113 : }
114 0 : void UpdateRubyValues(sal_Bool bAutoUpdate)
115 : {
116 0 : if(!xSelection.is())
117 0 : aRubyValues.realloc(0);
118 : else
119 0 : aRubyValues = xSelection->getRubyList(bAutoUpdate);
120 0 : bHasSelectionChanged = sal_False;
121 0 : }
122 0 : Sequence<PropertyValues>& GetRubyValues() {return aRubyValues;}
123 : void AssertOneEntry();
124 :
125 : virtual void SAL_CALL selectionChanged( const ::com::sun::star::lang::EventObject& aEvent ) throw (RuntimeException);
126 : virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (RuntimeException);
127 :
128 : };
129 : //-----------------------------------------------------------------------------
130 0 : SvxRubyData_Impl::SvxRubyData_Impl() :
131 0 : bHasSelectionChanged(sal_False)
132 : {
133 0 : }
134 : //-----------------------------------------------------------------------------
135 0 : SvxRubyData_Impl::~SvxRubyData_Impl()
136 : {
137 0 : }
138 : //-----------------------------------------------------------------------------
139 0 : void SvxRubyData_Impl::SetController(Reference<XController> xCtrl)
140 : {
141 0 : if(xCtrl.get() != xController.get())
142 : {
143 : try
144 : {
145 0 : Reference<XSelectionSupplier> xSelSupp(xController, UNO_QUERY);
146 0 : if(xSelSupp.is())
147 0 : xSelSupp->removeSelectionChangeListener(this);
148 :
149 0 : bHasSelectionChanged = sal_True;
150 0 : xController = xCtrl;
151 0 : xSelSupp = Reference<XSelectionSupplier>(xController, UNO_QUERY);
152 0 : if(xSelSupp.is())
153 0 : xSelSupp->addSelectionChangeListener(this);
154 : }
155 0 : catch(Exception&)
156 : {}
157 : }
158 0 : }
159 : //-----------------------------------------------------------------------------
160 0 : void SvxRubyData_Impl::selectionChanged( const EventObject& ) throw (RuntimeException)
161 : {
162 0 : bHasSelectionChanged = sal_True;
163 0 : }
164 : //-----------------------------------------------------------------------------
165 0 : void SvxRubyData_Impl::disposing( const EventObject&) throw (RuntimeException)
166 : {
167 : try
168 : {
169 0 : Reference<XSelectionSupplier> xSelSupp(xController, UNO_QUERY);
170 0 : if(xSelSupp.is())
171 0 : xSelSupp->removeSelectionChangeListener(this);
172 : }
173 0 : catch(Exception&)
174 : {}
175 0 : xController = 0;
176 0 : }
177 : //-----------------------------------------------------------------------------
178 0 : void SvxRubyData_Impl::AssertOneEntry()
179 : {
180 : //create one entry
181 0 : if(!aRubyValues.getLength())
182 : {
183 0 : aRubyValues.realloc(1);
184 0 : Sequence<PropertyValue>& rValues = aRubyValues.getArray()[0];
185 0 : rValues.realloc(5);
186 0 : PropertyValue* pValues = rValues.getArray();
187 0 : pValues[0].Name = C2U(cRubyBaseText);
188 0 : pValues[1].Name = C2U(cRubyText);
189 0 : pValues[2].Name = C2U(cRubyAdjust);
190 0 : pValues[3].Name = C2U(cRubyIsAbove);
191 0 : pValues[4].Name = C2U(cRubyCharStyleName);
192 : }
193 0 : }
194 :
195 0 : SvxRubyDialog::SvxRubyDialog( SfxBindings *pBind, SfxChildWindow *pCW,
196 : Window* _pParent, const ResId& rResId ) :
197 : SfxModelessDialog( pBind, pCW, _pParent, rResId ),
198 0 : aLeftFT(this, ResId(FT_LEFT,*rResId.GetResMgr() )),
199 0 : aLeft1ED(this, ResId(ED_LEFT_1,*rResId.GetResMgr() )),
200 0 : aRightFT(this, ResId(FT_RIGHT,*rResId.GetResMgr() )),
201 0 : aRight1ED(this, ResId(ED_RIGHT_1,*rResId.GetResMgr() )),
202 0 : aLeft2ED(this, ResId(ED_LEFT_2,*rResId.GetResMgr() )),
203 0 : aRight2ED(this, ResId(ED_RIGHT_2,*rResId.GetResMgr() )),
204 0 : aLeft3ED(this, ResId(ED_LEFT_3,*rResId.GetResMgr() )),
205 0 : aRight3ED(this, ResId(ED_RIGHT_3,*rResId.GetResMgr() )),
206 0 : aLeft4ED(this, ResId(ED_LEFT_4,*rResId.GetResMgr() )),
207 0 : aRight4ED(this, ResId(ED_RIGHT_4,*rResId.GetResMgr() )),
208 0 : aScrollSB(this, ResId(SB_SCROLL,*rResId.GetResMgr() )),
209 0 : aAutoDetectionCB(this, ResId(CB_AUTO_DETECT,*rResId.GetResMgr() )),
210 0 : aAdjustFT(this, ResId(FT_ADJUST,*rResId.GetResMgr() )),
211 0 : aAdjustLB(this, ResId(LB_ADJUST,*rResId.GetResMgr() )),
212 0 : aPositionFT(this, ResId(FT_POSITION,*rResId.GetResMgr() )),
213 0 : aPositionLB(this, ResId(LB_POSITION,*rResId.GetResMgr() )),
214 0 : aCharStyleFT(this, ResId(FT_CHAR_STYLE,*rResId.GetResMgr() )),
215 0 : aCharStyleLB(this, ResId(LB_CHAR_STYLE,*rResId.GetResMgr() )),
216 0 : aStylistPB(this, ResId(PB_STYLIST,*rResId.GetResMgr() )),
217 0 : aPreviewFT(this, ResId(FT_PREVIEW,*rResId.GetResMgr() )),
218 0 : aPreviewWin(*this, ResId(WIN_PREVIEW,*rResId.GetResMgr() )),
219 0 : aApplyPB(this, ResId(PB_APPLY,*rResId.GetResMgr() )),
220 0 : aClosePB(this, ResId(PB_CLOSE,*rResId.GetResMgr() )),
221 0 : aHelpPB(this, ResId(PB_HELP,*rResId.GetResMgr() )),
222 : nLastPos(0),
223 : nCurrentEdit(0),
224 : bModified(sal_False),
225 0 : pBindings(pBind)
226 : {
227 0 : xImpl = pImpl = new SvxRubyData_Impl;
228 0 : FreeResource();
229 : // automatic detection not yet available
230 0 : aAutoDetectionCB.Hide();
231 0 : aEditArr[0] = &aLeft1ED; aEditArr[1] = &aRight1ED;
232 0 : aEditArr[2] = &aLeft2ED; aEditArr[3] = &aRight2ED;
233 0 : aEditArr[4] = &aLeft3ED; aEditArr[5] = &aRight3ED;
234 0 : aEditArr[6] = &aLeft4ED; aEditArr[7] = &aRight4ED;
235 :
236 0 : aApplyPB.SetClickHdl(LINK(this, SvxRubyDialog, ApplyHdl_Impl));
237 0 : aClosePB.SetClickHdl(LINK(this, SvxRubyDialog, CloseHdl_Impl));
238 0 : aStylistPB.SetClickHdl(LINK(this, SvxRubyDialog, StylistHdl_Impl));
239 0 : aAutoDetectionCB.SetClickHdl(LINK(this, SvxRubyDialog, AutomaticHdl_Impl));
240 0 : aAdjustLB.SetSelectHdl(LINK(this, SvxRubyDialog, AdjustHdl_Impl));
241 0 : aPositionLB.SetSelectHdl(LINK(this, SvxRubyDialog, PositionHdl_Impl));
242 0 : aCharStyleLB.SetSelectHdl(LINK(this, SvxRubyDialog, CharStyleHdl_Impl));
243 :
244 0 : Link aScrLk(LINK(this, SvxRubyDialog, ScrollHdl_Impl));
245 0 : aScrollSB.SetScrollHdl( aScrLk );
246 0 : aScrollSB.SetEndScrollHdl( aScrLk );
247 :
248 0 : Link aEditLk(LINK(this, SvxRubyDialog, EditModifyHdl_Impl));
249 0 : Link aScrollLk(LINK(this, SvxRubyDialog, EditScrollHdl_Impl));
250 0 : Link aJumpLk(LINK(this, SvxRubyDialog, EditJumpHdl_Impl));
251 0 : for(sal_uInt16 i = 0; i < 8; i++)
252 : {
253 0 : aEditArr[i]->SetModifyHdl(aEditLk);
254 0 : aEditArr[i]->SetJumpHdl(aJumpLk);
255 0 : if(!i || 7 == i)
256 0 : aEditArr[i]->SetScrollHdl(aScrollLk);
257 : }
258 :
259 0 : UpdateColors();
260 :
261 0 : String leftLabelName = aLeftFT.GetText(), rightLabelName = aRightFT.GetText();
262 0 : aLeft2ED.SetAccessibleName(leftLabelName);
263 0 : aLeft3ED.SetAccessibleName(leftLabelName);
264 0 : aLeft4ED.SetAccessibleName(leftLabelName);
265 0 : aRight2ED.SetAccessibleName(rightLabelName);
266 0 : aRight3ED.SetAccessibleName(rightLabelName);
267 0 : aRight4ED.SetAccessibleName(rightLabelName);
268 0 : }
269 :
270 0 : SvxRubyDialog::~SvxRubyDialog()
271 : {
272 0 : ClearCharStyleList();
273 0 : EventObject aEvent;
274 0 : xImpl->disposing(aEvent);
275 0 : }
276 :
277 0 : void SvxRubyDialog::ClearCharStyleList()
278 : {
279 0 : for(sal_uInt16 i = 0; i < aCharStyleLB.GetEntryCount(); i++)
280 : {
281 0 : void* pData = aCharStyleLB.GetEntryData(i);
282 0 : delete (OUString*)pData;
283 : }
284 0 : aCharStyleLB.Clear();
285 0 : }
286 :
287 0 : sal_Bool SvxRubyDialog::Close()
288 : {
289 : pBindings->GetDispatcher()->Execute( SID_RUBY_DIALOG,
290 : SFX_CALLMODE_ASYNCHRON |
291 0 : SFX_CALLMODE_RECORD);
292 0 : return sal_True;
293 : }
294 :
295 0 : void SvxRubyDialog::Activate()
296 : {
297 0 : SfxModelessDialog::Activate();
298 0 : SfxPoolItem* pState = 0;
299 0 : SfxItemState eState = pBindings->QueryState( SID_STYLE_DESIGNER, pState );
300 0 : sal_Bool bEnable = (eState < SFX_ITEM_AVAILABLE) || !pState || !((SfxBoolItem*)pState)->GetValue();
301 0 : aStylistPB.Enable(bEnable);
302 : //get selection from current view frame
303 0 : SfxViewFrame* pCurFrm = SfxViewFrame::Current();
304 0 : Reference< XController > xCtrl = pCurFrm->GetFrame().GetController();
305 0 : pImpl->SetController(xCtrl);
306 0 : if(pImpl->HasSelectionChanged())
307 : {
308 :
309 0 : Reference< XRubySelection > xRubySel = pImpl->GetRubySelection();
310 0 : pImpl->UpdateRubyValues(aAutoDetectionCB.IsChecked());
311 0 : EnableControls(xRubySel.is());
312 0 : if(xRubySel.is())
313 : {
314 0 : Reference< XModel > xModel = pImpl->GetModel();
315 0 : const String sCharStyleSelect = aCharStyleLB.GetSelectEntry();
316 0 : ClearCharStyleList();
317 0 : Reference<XStyleFamiliesSupplier> xSupplier(xModel, UNO_QUERY);
318 0 : if(xSupplier.is())
319 : {
320 : try
321 : {
322 0 : Reference<XNameAccess> xFam = xSupplier->getStyleFamilies();
323 0 : Any aChar = xFam->getByName(C2U(cCharacterStyles));
324 0 : Reference<XNameContainer> xChar;
325 0 : aChar >>= xChar;
326 0 : Reference<XIndexAccess> xCharIdx(xChar, UNO_QUERY);
327 0 : if(xCharIdx.is())
328 : {
329 0 : OUString sUIName(C2U(cDisplayName));
330 0 : for(sal_Int32 nStyle = 0; nStyle < xCharIdx->getCount(); nStyle++)
331 : {
332 0 : Any aStyle = xCharIdx->getByIndex(nStyle);
333 0 : Reference<XStyle> xStyle;
334 0 : aStyle >>= xStyle;
335 0 : Reference<XPropertySet> xPrSet(xStyle, UNO_QUERY);
336 0 : OUString sName, sCoreName;
337 0 : if(xPrSet.is())
338 : {
339 0 : Reference<XPropertySetInfo> xInfo = xPrSet->getPropertySetInfo();
340 0 : if(xInfo->hasPropertyByName(sUIName))
341 : {
342 0 : Any aName = xPrSet->getPropertyValue(sUIName);
343 0 : aName >>= sName;
344 0 : }
345 : }
346 0 : Reference<XNamed> xNamed(xStyle, UNO_QUERY);
347 0 : if(xNamed.is())
348 : {
349 0 : sCoreName = xNamed->getName();
350 0 : if(sName.isEmpty())
351 0 : sName = sCoreName;
352 : }
353 0 : if(!sName.isEmpty())
354 : {
355 0 : sal_uInt16 nPos = aCharStyleLB.InsertEntry(sName);
356 0 : aCharStyleLB.SetEntryData( nPos, new OUString(sCoreName) );
357 :
358 : }
359 0 : }
360 0 : }
361 : }
362 0 : catch(Exception&)
363 : {
364 : OSL_FAIL("exception in style access");
365 : }
366 0 : if(sCharStyleSelect.Len())
367 0 : aCharStyleLB.SelectEntry(sCharStyleSelect);
368 : }
369 0 : aCharStyleLB.Enable(xSupplier.is());
370 0 : aCharStyleFT.Enable(xSupplier.is());
371 : }
372 0 : Update();
373 0 : aPreviewWin.Invalidate();
374 0 : }
375 0 : }
376 :
377 0 : void SvxRubyDialog::Deactivate()
378 : {
379 0 : SfxModelessDialog::Deactivate();
380 0 : }
381 :
382 0 : void SvxRubyDialog::SetText(sal_Int32 nPos, Edit& rLeft, Edit& rRight)
383 : {
384 0 : OUString sLeft, sRight;
385 0 : const Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
386 0 : sal_Bool bEnable = aRubyValues.getLength() > nPos;
387 0 : if(bEnable)
388 : {
389 0 : const Sequence<PropertyValue> aProps = aRubyValues.getConstArray()[nPos];
390 0 : const PropertyValue* pProps = aProps.getConstArray();
391 0 : for(sal_Int32 nProp = 0; nProp < aProps.getLength(); nProp++)
392 : {
393 0 : if ( pProps[nProp].Name == cRubyBaseText )
394 0 : pProps[nProp].Value >>= sLeft;
395 0 : else if ( pProps[nProp].Name == cRubyText )
396 0 : pProps[nProp].Value >>= sRight;
397 0 : }
398 : }
399 0 : else if(!nPos)
400 0 : bEnable = sal_True;
401 0 : rLeft.Enable(bEnable);
402 0 : rRight.Enable(bEnable);
403 0 : rLeft.SetText(sLeft);
404 0 : rRight.SetText(sRight);
405 0 : rLeft.SaveValue();
406 0 : rRight.SaveValue();
407 0 : }
408 : //-----------------------------------------------------------------------------
409 0 : void SvxRubyDialog::GetText()
410 : {
411 0 : long nTempLastPos = GetLastPos();
412 0 : for(int i = 0; i < 8; i+=2)
413 : {
414 0 : if(aEditArr[i]->IsEnabled() &&
415 0 : (aEditArr[i]->GetText() != aEditArr[i]->GetSavedValue() ||
416 0 : aEditArr[i + 1]->GetText() != aEditArr[i + 1]->GetSavedValue()))
417 : {
418 0 : Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
419 : DBG_ASSERT(aRubyValues.getLength() > (i / 2 + nTempLastPos), "wrong index" );
420 0 : SetModified(sal_True);
421 0 : Sequence<PropertyValue> &rProps = aRubyValues.getArray()[i / 2 + nTempLastPos];
422 0 : PropertyValue* pProps = rProps.getArray();
423 0 : for(sal_Int32 nProp = 0; nProp < rProps.getLength(); nProp++)
424 : {
425 0 : if ( pProps[nProp].Name == cRubyBaseText )
426 0 : pProps[nProp].Value <<= OUString(aEditArr[i]->GetText());
427 0 : else if ( pProps[nProp].Name == cRubyText )
428 0 : pProps[nProp].Value <<= OUString(aEditArr[i + 1]->GetText());
429 : }
430 : }
431 : }
432 0 : }
433 : //-----------------------------------------------------------------------------
434 0 : void SvxRubyDialog::Update()
435 : {
436 0 : const Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
437 0 : sal_Int32 nLen = aRubyValues.getLength();
438 0 : aScrollSB.Enable(nLen > 4);
439 0 : aScrollSB.SetRange( Range(0, nLen > 4 ? nLen - 4 : 0));
440 0 : aScrollSB.SetThumbPos(0);
441 0 : SetLastPos(0);
442 0 : SetModified(sal_False);
443 :
444 0 : sal_Int16 nAdjust = -1;
445 0 : sal_Int16 nPosition = -1;
446 0 : OUString sCharStyleName, sTmp;
447 0 : sal_Bool bCharStyleEqual = sal_True;
448 0 : for(sal_Int32 nRuby = 0; nRuby < nLen; nRuby++)
449 : {
450 0 : const Sequence<PropertyValue> &rProps = aRubyValues.getConstArray()[nRuby];
451 0 : const PropertyValue* pProps = rProps.getConstArray();
452 0 : for(sal_Int32 nProp = 0; nProp < rProps.getLength(); nProp++)
453 : {
454 0 : if(nAdjust > -2 && pProps[nProp].Name == cRubyAdjust )
455 : {
456 0 : sal_Int16 nTmp = sal_Int16();
457 0 : pProps[nProp].Value >>= nTmp;
458 0 : if(!nRuby)
459 0 : nAdjust = nTmp;
460 0 : else if(nAdjust != nTmp)
461 0 : nAdjust = -2;
462 : }
463 0 : if(nPosition > -2 && pProps[nProp].Name == cRubyIsAbove )
464 : {
465 0 : sal_Bool bTmp = *(sal_Bool*)pProps[nProp].Value.getValue();
466 0 : if(!nRuby)
467 0 : nPosition = bTmp ? 0 : 1;
468 0 : else if( (!nPosition && !bTmp) || (nPosition == 1 && bTmp) )
469 0 : nPosition = -2;
470 : }
471 0 : if(bCharStyleEqual && pProps[nProp].Name == cRubyCharStyleName )
472 : {
473 0 : pProps[nProp].Value >>= sTmp;
474 0 : if(!nRuby)
475 0 : sCharStyleName = sTmp;
476 0 : else if(sCharStyleName != sTmp)
477 0 : bCharStyleEqual = sal_False;
478 : }
479 : }
480 : }
481 0 : if(!nLen)
482 : {
483 : //enable selection if the ruby list is empty
484 0 : nAdjust = 0;
485 0 : nPosition = 0;
486 : }
487 0 : if(nAdjust > -1)
488 0 : aAdjustLB.SelectEntryPos(nAdjust);
489 : else
490 0 : aAdjustLB.SetNoSelection();
491 0 : if(nPosition > -1)
492 0 : aPositionLB.SelectEntryPos(nPosition ? 1 : 0);
493 0 : if(!nLen || (bCharStyleEqual && sCharStyleName.isEmpty()))
494 0 : sCharStyleName = C2U(cRubies);
495 0 : if(!sCharStyleName.isEmpty())
496 : {
497 0 : for(sal_uInt16 i = 0; i < aCharStyleLB.GetEntryCount(); i++)
498 : {
499 0 : const OUString* pCoreName = (const OUString*)aCharStyleLB.GetEntryData(i);
500 0 : if(pCoreName && sCharStyleName == *pCoreName)
501 : {
502 0 : aCharStyleLB.SelectEntryPos(i);
503 0 : break;
504 : }
505 : }
506 : }
507 : else
508 0 : aCharStyleLB.SetNoSelection();
509 :
510 0 : ScrollHdl_Impl(&aScrollSB);
511 0 : }
512 :
513 0 : void SvxRubyDialog::GetCurrentText(String& rBase, String& rRuby)
514 : {
515 0 : rBase = aEditArr[nCurrentEdit * 2]->GetText();
516 0 : rRuby = aEditArr[nCurrentEdit * 2 + 1]->GetText();
517 0 : }
518 :
519 0 : IMPL_LINK(SvxRubyDialog, ScrollHdl_Impl, ScrollBar*, pScroll)
520 : {
521 0 : long nPos = pScroll->GetThumbPos();
522 0 : if(GetLastPos() != nPos)
523 : {
524 0 : GetText();
525 : }
526 0 : SetText(nPos++, aLeft1ED, aRight1ED);
527 0 : SetText(nPos++, aLeft2ED, aRight2ED);
528 0 : SetText(nPos++, aLeft3ED, aRight3ED);
529 0 : SetText(nPos, aLeft4ED, aRight4ED);
530 0 : SetLastPos(nPos - 3);
531 0 : aPreviewWin.Invalidate();
532 0 : return 0;
533 : }
534 :
535 0 : IMPL_LINK_NOARG(SvxRubyDialog, ApplyHdl_Impl)
536 : {
537 0 : const Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
538 0 : if(!aRubyValues.getLength())
539 : {
540 0 : AssertOneEntry();
541 0 : PositionHdl_Impl(&aPositionLB);
542 0 : AdjustHdl_Impl(&aAdjustLB);
543 0 : CharStyleHdl_Impl(&aCharStyleLB);
544 : }
545 0 : GetText();
546 : //reset all edit fields - SaveValue is called
547 0 : ScrollHdl_Impl(&aScrollSB);
548 :
549 0 : Reference<XRubySelection> xSelection = pImpl->GetRubySelection();
550 0 : if(IsModified() && xSelection.is())
551 : {
552 : try
553 : {
554 0 : xSelection->setRubyList(aRubyValues, aAutoDetectionCB.IsChecked());
555 : }
556 0 : catch(Exception& )
557 : {
558 : OSL_FAIL("Exception caught");
559 : }
560 : }
561 0 : return 0;
562 : }
563 :
564 0 : IMPL_LINK_NOARG(SvxRubyDialog, CloseHdl_Impl)
565 : {
566 0 : Close();
567 0 : return 0;
568 : }
569 :
570 0 : IMPL_LINK_NOARG(SvxRubyDialog, StylistHdl_Impl)
571 : {
572 0 : SfxPoolItem* pState = 0;
573 0 : SfxItemState eState = pBindings->QueryState( SID_STYLE_DESIGNER, pState );
574 0 : if(eState <= SFX_ITEM_SET || !pState || !((SfxBoolItem*)pState)->GetValue())
575 : {
576 : pBindings->GetDispatcher()->Execute( SID_STYLE_DESIGNER,
577 : SFX_CALLMODE_ASYNCHRON |
578 0 : SFX_CALLMODE_RECORD);
579 : }
580 0 : return 0;
581 : }
582 :
583 0 : IMPL_LINK(SvxRubyDialog, AutomaticHdl_Impl, CheckBox*, pBox)
584 : {
585 0 : pImpl->UpdateRubyValues(pBox->IsChecked());
586 0 : Update();
587 0 : return 0;
588 : }
589 :
590 0 : IMPL_LINK(SvxRubyDialog, AdjustHdl_Impl, ListBox*, pBox)
591 : {
592 0 : AssertOneEntry();
593 0 : sal_Int16 nAdjust = pBox->GetSelectEntryPos();
594 0 : Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
595 0 : for(sal_Int32 nRuby = 0; nRuby < aRubyValues.getLength(); nRuby++)
596 : {
597 0 : Sequence<PropertyValue> &rProps = aRubyValues.getArray()[nRuby];
598 0 : PropertyValue* pProps = rProps.getArray();
599 0 : for(sal_Int32 nProp = 0; nProp < rProps.getLength(); nProp++)
600 : {
601 0 : if ( pProps[nProp].Name == cRubyAdjust )
602 0 : pProps[nProp].Value <<= nAdjust;
603 : }
604 0 : SetModified(sal_True);
605 : }
606 0 : aPreviewWin.Invalidate();
607 0 : return 0;
608 : }
609 :
610 0 : IMPL_LINK(SvxRubyDialog, PositionHdl_Impl, ListBox*, pBox)
611 : {
612 0 : AssertOneEntry();
613 0 : sal_Bool bAbove = !pBox->GetSelectEntryPos();
614 0 : const Type& rType = ::getBooleanCppuType();
615 0 : Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
616 0 : for(sal_Int32 nRuby = 0; nRuby < aRubyValues.getLength(); nRuby++)
617 : {
618 0 : Sequence<PropertyValue> &rProps = aRubyValues.getArray()[nRuby];
619 0 : PropertyValue* pProps = rProps.getArray();
620 0 : for(sal_Int32 nProp = 0; nProp < rProps.getLength(); nProp++)
621 : {
622 0 : if ( pProps[nProp].Name == cRubyIsAbove )
623 0 : pProps[nProp].Value.setValue(&bAbove, rType);
624 : }
625 0 : SetModified(sal_True);
626 : }
627 0 : aPreviewWin.Invalidate();
628 0 : return 0;
629 : }
630 :
631 0 : IMPL_LINK_NOARG(SvxRubyDialog, CharStyleHdl_Impl)
632 : {
633 0 : AssertOneEntry();
634 0 : OUString sStyleName;
635 0 : if(LISTBOX_ENTRY_NOTFOUND != aCharStyleLB.GetSelectEntryPos())
636 0 : sStyleName = *(OUString*) aCharStyleLB.GetEntryData(aCharStyleLB.GetSelectEntryPos());
637 0 : Sequence<PropertyValues>& aRubyValues = pImpl->GetRubyValues();
638 0 : for(sal_Int32 nRuby = 0; nRuby < aRubyValues.getLength(); nRuby++)
639 : {
640 0 : Sequence<PropertyValue> &rProps = aRubyValues.getArray()[nRuby];
641 0 : PropertyValue* pProps = rProps.getArray();
642 0 : for(sal_Int32 nProp = 0; nProp < rProps.getLength(); nProp++)
643 : {
644 0 : if ( pProps[nProp].Name == cRubyCharStyleName )
645 : {
646 0 : pProps[nProp].Value <<= sStyleName;
647 : }
648 : }
649 0 : SetModified(sal_True);
650 : }
651 0 : return 0;
652 : }
653 :
654 0 : IMPL_LINK(SvxRubyDialog, EditModifyHdl_Impl, Edit*, pEdit)
655 : {
656 0 : for(sal_uInt16 i = 0; i < 8; i++)
657 : {
658 0 : if(pEdit == aEditArr[i])
659 : {
660 0 : nCurrentEdit = i / 2;
661 0 : break;
662 : }
663 : }
664 0 : aPreviewWin.Invalidate();
665 0 : return 0;
666 : }
667 :
668 0 : IMPL_LINK(SvxRubyDialog, EditScrollHdl_Impl, sal_Int32*, pParam)
669 : {
670 0 : long nRet = 0;
671 0 : if(aScrollSB.IsEnabled())
672 : {
673 : //scroll forward
674 0 : if(*pParam > 0 && (aEditArr[7]->HasFocus() || aEditArr[6]->HasFocus() ))
675 : {
676 0 : if(aScrollSB.GetRangeMax() > aScrollSB.GetThumbPos())
677 : {
678 0 : aScrollSB.SetThumbPos(aScrollSB.GetThumbPos() + 1);
679 0 : aEditArr[6]->GrabFocus();
680 0 : nRet = 1;
681 : }
682 : }
683 : //scroll backward
684 0 : else if(aScrollSB.GetThumbPos() && (aEditArr[0]->HasFocus()||aEditArr[1]->HasFocus()) )
685 : {
686 0 : aScrollSB.SetThumbPos(aScrollSB.GetThumbPos() - 1);
687 0 : aEditArr[1]->GrabFocus();
688 0 : nRet = 1;
689 : }
690 0 : if(nRet)
691 0 : ScrollHdl_Impl(&aScrollSB);
692 : }
693 0 : return nRet;
694 : }
695 :
696 0 : IMPL_LINK(SvxRubyDialog, EditJumpHdl_Impl, sal_Int32*, pParam)
697 : {
698 0 : sal_uInt16 nIndex = USHRT_MAX;
699 0 : for(sal_uInt16 i = 0; i < 8; i++)
700 : {
701 0 : if(aEditArr[i]->HasFocus())
702 0 : nIndex = i;
703 : }
704 0 : if(nIndex < 8)
705 : {
706 0 : if(*pParam > 0)
707 : {
708 0 : if(nIndex < 6)
709 0 : aEditArr[nIndex + 2]->GrabFocus();
710 0 : else if( EditScrollHdl_Impl(pParam))
711 0 : aEditArr[nIndex]->GrabFocus();
712 : }
713 : else
714 : {
715 0 : if(nIndex > 1)
716 0 : aEditArr[nIndex - 2]->GrabFocus();
717 0 : else if( EditScrollHdl_Impl(pParam))
718 0 : aEditArr[nIndex]->GrabFocus();
719 : }
720 : }
721 0 : return 0;
722 : };
723 :
724 0 : void SvxRubyDialog::AssertOneEntry()
725 : {
726 0 : pImpl->AssertOneEntry();
727 0 : }
728 :
729 : // ----------------------------------------------------------------------------
730 :
731 0 : void SvxRubyDialog::UpdateColors( void )
732 : {
733 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
734 0 : svtools::ColorConfig aColorConfig;
735 :
736 0 : Font aFnt( aPreviewWin.GetFont() );
737 :
738 0 : Color aNewTextCol( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
739 0 : Color aNewFillCol( rStyleSettings.GetWindowColor() );
740 :
741 0 : if( aNewFillCol != aFnt.GetFillColor() || aNewTextCol != aFnt.GetColor() )
742 : {
743 0 : aFnt.SetFillColor( aNewFillCol );
744 0 : aFnt.SetColor( aNewTextCol );
745 0 : aPreviewWin.SetFont( aFnt );
746 :
747 0 : aPreviewWin.Invalidate();
748 0 : }
749 0 : }
750 :
751 : // ----------------------------------------------------------------------------
752 :
753 0 : void SvxRubyDialog::DataChanged( const DataChangedEvent& rDCEvt )
754 : {
755 0 : SfxModelessDialog::DataChanged( rDCEvt );
756 :
757 0 : if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
758 0 : UpdateColors();
759 0 : }
760 :
761 0 : RubyPreview::RubyPreview(SvxRubyDialog& rParent, const ResId& rResId) :
762 : Window(&rParent, rResId),
763 0 : rParentDlg(rParent)
764 : {
765 0 : SetMapMode(MAP_TWIP);
766 0 : Size aWinSize = GetOutputSize();
767 :
768 0 : Font aFont = GetFont();
769 0 : aFont.SetHeight(aWinSize.Height() / 4);
770 0 : SetFont(aFont);
771 :
772 0 : SetBorderStyle( WINDOW_BORDER_MONO );
773 0 : }
774 :
775 0 : void RubyPreview::Paint( const Rectangle& /* rRect */ )
776 : {
777 0 : Font aRubyFont = GetFont();
778 0 : Font aSaveFont(aRubyFont);
779 0 : aRubyFont.SetHeight(aRubyFont.GetHeight() * 70 / 100);
780 :
781 0 : Size aWinSize = GetOutputSize();
782 0 : Rectangle aRect(Point(0, 0), aWinSize);
783 0 : SetLineColor();
784 0 : SetFillColor( aSaveFont.GetFillColor() );
785 0 : DrawRect(aRect);
786 :
787 0 : String sBaseText, sRubyText;
788 0 : rParentDlg.GetCurrentText(sBaseText, sRubyText);
789 :
790 0 : long nTextHeight = GetTextHeight();
791 0 : long nBaseWidth = GetTextWidth(sBaseText);
792 0 : SetFont(aRubyFont);
793 0 : long nRubyWidth = GetTextWidth(sRubyText);
794 0 : SetFont(aSaveFont);
795 :
796 0 : sal_uInt16 nAdjust = rParentDlg.aAdjustLB.GetSelectEntryPos();
797 : //use center if no adjustment is available
798 0 : if(nAdjust > 4)
799 0 : nAdjust = 1;
800 :
801 : //which part is stretched ?
802 0 : sal_Bool bRubyStretch = nBaseWidth >= nRubyWidth;
803 :
804 0 : long nCenter = aWinSize.Width() / 2;
805 0 : long nLeftStart = nCenter - (bRubyStretch ? (nBaseWidth / 2) : (nRubyWidth / 2));
806 0 : long nRightEnd = nCenter + (bRubyStretch ? (nBaseWidth / 2) : (nRubyWidth / 2));
807 :
808 0 : long nYRuby = aWinSize.Height() / 4 - nTextHeight / 2;
809 0 : long nYBase = aWinSize.Height() * 3 / 4 - nTextHeight / 2;
810 :
811 : //use above also if no selection is set
812 0 : sal_Bool bAbove = rParentDlg.aPositionLB.GetSelectEntryPos() != 1;
813 0 : if(!bAbove)
814 : {
815 0 : long nTmp = nYRuby;
816 0 : nYRuby = nYBase;
817 0 : nYBase = nTmp;
818 : }
819 : long nYOutput, nOutTextWidth;
820 0 : String sOutputText;
821 :
822 :
823 0 : if(bRubyStretch)
824 : {
825 0 : DrawText( Point( nLeftStart , nYBase), sBaseText );
826 0 : nYOutput = nYRuby;
827 0 : sOutputText = sRubyText;
828 0 : nOutTextWidth = nRubyWidth;
829 0 : SetFont(aRubyFont);
830 : }
831 : else
832 : {
833 0 : SetFont(aRubyFont);
834 0 : DrawText( Point( nLeftStart , nYRuby), sRubyText );
835 0 : nYOutput = nYBase;
836 0 : sOutputText = sBaseText;
837 0 : nOutTextWidth = nBaseWidth;
838 0 : SetFont(aSaveFont);
839 : }
840 :
841 0 : switch(nAdjust)
842 : {
843 : case RubyAdjust_LEFT:
844 0 : DrawText( Point( nLeftStart , nYOutput), sOutputText );
845 0 : break;
846 : case RubyAdjust_RIGHT:
847 0 : DrawText( Point( nRightEnd - nOutTextWidth, nYOutput), sOutputText );
848 0 : break;
849 : case RubyAdjust_INDENT_BLOCK:
850 : {
851 0 : long nCharWidth = GetTextWidth(rtl::OUString("X"));
852 0 : if(nOutTextWidth < (nRightEnd - nLeftStart - nCharWidth))
853 : {
854 0 : nCharWidth /= 2;
855 0 : nLeftStart += nCharWidth;
856 0 : nRightEnd -= nCharWidth;
857 : }
858 : }
859 : // no break!
860 : case RubyAdjust_BLOCK:
861 0 : if(sOutputText.Len() > 1)
862 : {
863 0 : xub_StrLen nCount = sOutputText.Len();
864 0 : long nSpace = ((nRightEnd - nLeftStart) - GetTextWidth(sOutputText)) / (nCount - 1);
865 0 : for(xub_StrLen i = 0; i < nCount; i++)
866 : {
867 0 : rtl::OUString sChar(sOutputText.GetChar(i));
868 0 : DrawText( Point( nLeftStart , nYOutput), sChar);
869 0 : long nCharWidth = GetTextWidth(sChar);
870 0 : nLeftStart += nCharWidth + nSpace;
871 0 : }
872 0 : break;
873 : }
874 : //no break;
875 : case RubyAdjust_CENTER:
876 0 : DrawText( Point( nCenter - nOutTextWidth / 2 , nYOutput), sOutputText );
877 0 : break;
878 : }
879 0 : SetFont(aSaveFont);
880 0 : }
881 :
882 0 : void RubyEdit::GetFocus()
883 : {
884 0 : GetModifyHdl().Call(this);
885 0 : Edit::GetFocus();
886 0 : }
887 :
888 0 : long RubyEdit::PreNotify( NotifyEvent& rNEvt )
889 : {
890 0 : long nHandled = 0;
891 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
892 : {
893 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
894 0 : const KeyCode& rKeyCode = pKEvt->GetKeyCode();
895 0 : sal_uInt16 nMod = rKeyCode.GetModifier();
896 0 : sal_uInt16 nCode = rKeyCode.GetCode();
897 0 : if( nCode == KEY_TAB && (!nMod || KEY_SHIFT == nMod))
898 : {
899 0 : sal_Int32 nParam = KEY_SHIFT == nMod ? -1 : 1;
900 0 : if(aScrollHdl.IsSet() && aScrollHdl.Call(&nParam))
901 0 : nHandled = 1;
902 : }
903 0 : else if(KEY_UP == nCode || KEY_DOWN == nCode)
904 : {
905 0 : sal_Int32 nParam = KEY_UP == nCode ? -1 : 1;
906 0 : aJumpHdl.Call(&nParam);
907 : }
908 : }
909 0 : if(!nHandled)
910 0 : nHandled = Edit::PreNotify(rNEvt);
911 0 : return nHandled;
912 : }
913 :
914 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|