office-gobmx/sd/source/ui/view/Outliner.cxx
Ivo Hinkelmann 921bf4ca35 CWS-TOOLING: integrate CWS layoutdialogs2
2009-04-09 10:11:14 +0200 mba  r270680 : defective merge sets seem to have brought config_office back
2009-04-02 18:00:52 +0200 mba  r270429 : #i100503#: make tralay work without LD_LIBRARY_PATH
2009-04-01 13:27:58 +0200 mba  r270320 : warning on Solaris fixed
2009-03-31 22:15:03 +0200 mba  r270293 : CWS-TOOLING: rebase CWS layoutdialogs2 to trunk@270033 (milestone: DEV300:m45)
2009-03-16 13:05:08 +0100 mba  r269526 : fixed some compiler warnings of the Sun compiler
2009-03-11 15:32:42 +0100 mba  r269337 : some problems for ENABLE_LAYOUT fixed
2009-03-09 16:05:32 +0100 mba  r269197 : merge conflict solved
2009-03-09 15:09:55 +0100 mba  r269194 : merge conflict solved
2009-03-09 15:09:35 +0100 mba  r269193 : merge conflict solved
2009-03-06 22:12:47 +0100 mba  r269052 : compilation error fixed
2009-03-06 17:36:37 +0100 mba  r269033 : integer warning fixed
2009-03-06 10:31:19 +0100 mba  r268983 : CWS-TOOLING: rebase CWS layoutdialogs2 to trunk@268395 (milestone: DEV300:m42)
2009-03-03 20:03:59 +0100 jcn  r268777 : Add Notes checkbox to find-and-replace dialog in anticipation of m40 resync.
2009-03-03 15:56:20 +0100 jcn  r268737 : Apply layout-find-dialog-crash-fix.diff -- fixes crasher.
From http://svn.gnome.org/viewvc/ooo-build?view=revision&revision=15378
2009-02-06 17:41:24 +0100 mba  r267479 : arrrrgh - svx headers must be included behind the magic define
2009-02-05 19:44:42 +0100 mba  r267439 : seems that msvc preprocessor is thick as a brick
2009-02-05 15:15:16 +0100 mba  r267425 : pch added
2009-02-05 08:14:01 +0100 mba  r267409 : double defined symbols fixed
2009-02-05 08:13:14 +0100 mba  r267408 : compile Languagebox and FontListbox with ENABLE_LAYOUT
2009-02-05 08:07:35 +0100 mba  r267406 : warning fixed
2009-02-05 08:06:42 +0100 mba  r267405 : warnings and errors fixed
2009-01-30 15:51:52 +0100 mba  r267206 : export Container class to compile code in sfx2
2009-01-30 15:51:14 +0100 mba  r267205 : remove LAYOUT_EXPERIMENTAL from sfx2, everything now compiles with ENABLE_LAYOUT
2009-01-28 17:01:27 +0100 mba  r267069 : fixed namespace problems in sfx2
2009-01-28 16:59:48 +0100 mba  r267068 : fixed namespace problems
2009-01-24 13:57:06 +0100 mba  r266877 : move svx stuff to experimental
2009-01-24 13:56:11 +0100 mba  r266876 : move svx stuff to experimental
2009-01-24 13:52:09 +0100 mba  r266875 : put sfx stuff into experimental
2009-01-24 13:28:08 +0100 mba  r266874 : put sfx stuff into experimental
2009-01-24 13:26:38 +0100 mba  r266873 : help msvc++ compiler a bit
2009-01-24 13:24:43 +0100 mba  r266872 : warning removed
2009-01-24 13:23:21 +0100 mba  r266871 : moved svx stuff to svx; put sfx stuff into experimental
2009-01-24 13:22:04 +0100 mba  r266870 : moved svx stuff to svx
2009-01-05 16:35:34 +0100 jcn  r265879 : config_office/configure: Regenerate.  Fixes naive builds.
2008-12-17 16:06:25 +0100 jcn  r265638 : Wordcount: minor HIG tweaks.
2008-12-17 16:06:21 +0100 jcn  r265637 : Zoom: minor HIG spacing tweaks.
2008-12-17 16:06:16 +0100 jcn  r265636 : Zoom: fix align-test and update zoom.xml.
2008-12-17 16:06:12 +0100 jcn  r265635 : Zoom: add align-test.xml to illustrate zoom alignment bug.
2008-12-17 16:06:07 +0100 jcn  r265634 : Find-and-Replace: request font-style-name="Bold", does not seem to work.
2008-12-17 16:06:03 +0100 jcn  r265633 : Find-and-Replace: Add alignment for combobox labels.
2008-12-17 16:05:59 +0100 jcn  r265632 : Find-and-Replace: Replace pairs of <flow> with <align>. Fixes ugly non-emptiness of more-<hbox>.
2008-12-17 16:05:56 +0100 jcn  r265631 : Find-and-Replace: add nice 12pt border.
2008-12-17 16:05:51 +0100 jcn  r265630 : Find-and-Replace: also add rowsep at lower fixedline.
2008-12-17 16:05:47 +0100 jcn  r265629 : Find-and-Replace: Add poor man's colsep and rowsep substitute spaces.
2008-12-17 16:05:43 +0100 jcn  r265628 : Find-and-Replace: use <vbox cnt:x-expand="false"> for buttons.
2008-12-17 16:05:40 +0100 jcn  r265627 : Find-and-Replace: add <vbox>s and use cnt:expand="false" to stop vertical button expansion.
2008-12-17 16:05:36 +0100 jcn  r265626 : Find-and-Replace: use sc icon. Fixes FIND button height.
2008-12-17 16:05:31 +0100 jcn  r265625 : Bugfix have empty/invisible containers not take up space.
2008-12-17 16:05:27 +0100 jcn  r265624 : Find-and-replace: Fix/remove most property errors.
2008-12-17 16:05:23 +0100 jcn  r265623 : Table: make x, y expand default.
2008-12-17 16:05:18 +0100 jcn  r265622 : Use OSL_TRACE rather than printf. Fixes warning visibility.
2008-12-17 16:05:14 +0100 jcn  r265621 : Boxtest: add <vbox><table x-expand="true"> pair to trigger property errors.
2008-12-17 16:05:10 +0100 jcn  r265620 : Junk extra <table> from boxtest. Fixes visual output.
2008-12-17 16:05:05 +0100 jcn  r265619 : Eradicate PROPHELPER_SET_INFO: junk static caching.
2008-12-17 16:05:01 +0100 jcn  r265618 : Update awk+sed localize generation rules. Fixes multiple (wrong) titles in Find & Replace.
2008-12-17 16:04:56 +0100 jcn  r265617 : Use dash (-) instead of underscore (_) to separate language modifiers. Fixes en_GB etc.
2008-12-17 16:04:51 +0100 jcn  r265616 : Add "defbutton=true" to dialogs. Fixes ENTER doing default action: n#439222.
2008-12-17 16:04:45 +0100 jcn  r265615 : Michael's new table-based find and replace.
2008-12-17 16:04:40 +0100 jcn  r265614 : Apply Michael's boxtest patch.
2008-12-17 16:04:36 +0100 jcn  r265613 : Make sort-options experimental. Part II. Fixes crasher n-44.patch. Fixes crasher: n#442036.
2008-12-17 16:04:31 +0100 jcn  r265612 : Make sort-options experimental. Part I.
2008-12-17 16:04:26 +0100 jcn  r265611 : Add --enable-layout-experimental configure switch. Part II. Typo in configure.in, add set_soenv entry.
2008-12-17 16:04:21 +0100 jcn  r265610 : Add --enable-layout-experimental configure switch. Default off.
2008-11-26 16:25:18 +0100 mba  r264417 : fixed compiler warnings
2008-11-26 15:52:02 +0100 mba  r264407 : fixed compiler warnings
2008-11-26 15:40:44 +0100 mba  r264402 : fixed compiler warnings
2008-11-26 14:50:47 +0100 mba  r264395 : fixed compiler warnings
2008-11-26 14:39:12 +0100 mba  r264393 : fixed compiler warnings
2008-11-26 14:38:49 +0100 mba  r264392 : fixed compiler warnings
2008-11-26 14:38:31 +0100 mba  r264391 : fixed compiler warnings
2008-11-26 14:38:13 +0100 mba  r264390 : fixed compiler warnings
2008-11-26 14:37:38 +0100 mba  r264389 : fixed compiler warnings
2008-11-26 10:11:17 +0100 mba  r264352 : fixed compiler warnings
2008-11-26 10:06:12 +0100 mba  r264351 : fixed compiler warnings
2008-11-26 09:58:28 +0100 mba  r264347 : fixed compiler warnings
2008-11-26 09:50:41 +0100 mba  r264345 : fixed compiler warnings
2008-11-26 09:46:10 +0100 mba  r264343 : fixed compiler warnings
2008-10-22 10:57:09 +0200 mba  r262584 : fixed small error resulting from resolved merged conflicts
2008-10-22 10:56:21 +0200 mba  r262583 : fixed some small errors resulting from resolved merged conflicts
2008-10-20 19:29:27 +0200 jcn  r262557 : layoutdialogs2: Remove stray patches.
2008-10-20 19:29:22 +0200 jcn  r262556 : layoutdialogs2: Force resize also on second show after hiding.
2008-10-20 19:29:17 +0200 jcn  r262555 : layoutdialogs2: Do not trigger handlers for api calls.
2008-10-20 19:29:13 +0200 jcn  r262554 : layoutdialogs2: Use disable/enable instead of hide/show for currency box. Fixes monster lisbox.
2008-10-20 19:29:09 +0200 jcn  r262553 : layoutdialogs2: Use line-count instead of linecount. Fixes sizing of listboxes.
2008-10-20 19:29:04 +0200 jcn  r262552 : layoutdialogs2: vcl: respect line-count also for non-dropdown listbox.
2008-10-20 19:28:59 +0200 jcn  r262551 : layoutdialogs2: Update to svn:r14142 patched.
2008-10-20 19:28:51 +0200 jcn  r262550 : layoutdialogs2: Manual tweaks in number-format.xml.
2008-10-20 19:28:45 +0200 jcn  r262549 : layoutdialogs2: Integrate Number Format tabpage into Format Cell dialog.
2008-10-20 19:28:36 +0200 jcn  r262548 : layoutdialogs2: Windows build fixes. Thanks Noel.
2008-10-20 19:28:31 +0200 jcn  r262547 : layoutdialogs2: Layout Format Cells/Number Format tabpage.
2008-10-20 19:28:24 +0200 jcn  r262546 : layoutdialogs2: Remove sc/uiconfig/layout/localize.sdf.
2008-10-20 19:28:20 +0200 jcn  r262545 : layoutdialogs2: --enable-debug link fix
2008-10-20 19:28:16 +0200 jcn  r262544 : layoutdialogs2: Add missing localize.sdf dependency. Thanks, Petr.
2008-10-20 19:28:12 +0200 jcn  r262543 : layoutdialogs2: svx linx fixlet.
2008-10-20 19:28:06 +0200 jcn  r262542 : layoutdialogs2: Move layout/* to layout/core, vclcompat to layout/vcl. Distribute layout headers. Fixes sfx2 layout core includes.
2008-10-20 19:27:58 +0200 jcn  r262541 : layoutdialogs2: Build fix for --enable-layout.
2008-10-20 19:27:54 +0200 jcn  r262540 : layoutdialogs2: Generate localize.sdf files in uiconfig.
2008-10-20 19:27:47 +0200 jcn  r262539 : layoutdialogs2: Minimalize deprecated String use further by using OUString.
2008-10-20 19:27:42 +0200 jcn  r262538 : layoutdialogs2: Implement LocalizedString.GetToken and use it for aCalcBtn. Fixes empty label.
2008-10-20 19:27:36 +0200 jcn  r262537 : layoutdialogs2: Add layout::Sfx*Dialog wrapper.
2008-10-20 19:27:29 +0200 jcn  r262536 : layoutdialogs2: Introduce Closing*Dialog wrappers fixing closing with ESC.
2008-10-20 19:27:24 +0200 jcn  r262535 : layoutdialogs2: Support <sfxmodelessdialog> from sfx2.
2008-10-20 19:27:17 +0200 jcn  r262534 : layoutdialogs2: Rename find-&-replace.xml to find-and-replace.xml. Fixes split build with failing solenv patch.
2008-10-20 19:27:12 +0200 jcn  r262533 : layoutdialogs2: Do not build sfx2 when --disable-layout.
2008-10-20 19:27:08 +0200 jcn  r262532 : layoutdialogs2: Ignore ja/ too.
2008-10-20 19:27:04 +0200 jcn  r262531 : layoutdialogs2: Add destructors for VCLXButton, VCLXComboBox.
2008-10-20 19:26:58 +0200 jcn  r262530 : layoutdialogs2: Make dialogs closable with ESC: wordcount, zoom, message-box, move-copy-sheet, insert-sheet.
2008-10-20 19:26:52 +0200 jcn  r262529 : layoutdialogs2: Move some implementations to .cxx.
2008-10-20 19:26:47 +0200 jcn  r262528 : layoutdialogs2: Fix simple editor crasher.
2008-10-20 19:26:43 +0200 jcn  r262527 : layoutdialogs2: Further cleanup: remove clean & delete from wrapperGone.
2008-10-20 19:26:38 +0200 jcn  r262526 : layoutdialogs2: Add reset logic to ~WindowImpl, plugs ComboBox and Dialog leaks.
2008-10-20 19:26:34 +0200 jcn  r262525 : layoutdialogs2: Interesting hack: only leaks ::ComboBox and ::Dialog.
2008-10-20 19:26:29 +0200 jcn  r262524 : layoutdialogs2: Build fix.
2008-10-20 19:26:24 +0200 jcn  r262523 : layoutdialogs2: Find&Replace duplicate disposal workaround inside layout.
2008-10-20 19:26:19 +0200 jcn  r262522 : layoutdialogs2: Revert "Terrible crasher-fix hack. Do not dispose Dialog or any FocusHandler owners."
This reverts commit 5222b5b123a2e6c88494983bd875de574f365bae.
2008-10-20 19:26:14 +0200 jcn  r262521 : layoutdialogs2: Terrible crasher-fix hack. Do not dispose Dialog or any FocusHandler owners.
2008-10-20 19:26:08 +0200 jcn  r262520 : layoutdialogs2: Revert "ComboBox: crash down to (Dialog's) VCLXWindowImpl::DestroyOutputDevice();"
This reverts commit b423129aca295e84ef5986149b6ee71eb7ba0aa3.
2008-10-20 19:26:03 +0200 jcn  r262519 : layoutdialogs2: ComboBox: crash down to (Dialog's) VCLXWindowImpl::DestroyOutputDevice();
2008-10-20 19:25:57 +0200 jcn  r262518 : layoutdialogs2: Handler and debug cleanup.
2008-10-20 19:25:52 +0200 jcn  r262517 : layoutdialogs2: Minimally remove FixedText workaround.
2008-10-20 19:25:47 +0200 jcn  r262516 : layoutdialogs2: Preparations for FocusHdl fix.
2008-10-20 19:25:42 +0200 jcn  r262515 : layoutdialogs2: Remove vclxwindows patch by using handler hackery.
2008-10-20 19:25:38 +0200 jcn  r262514 : layoutdialogs2: Don't call deleted dialog. Hdler reset tweaks. Fixes Find&Replace.
2008-10-20 19:25:34 +0200 jcn  r262513 : layoutdialogs2: Hdler and disposing cleanups.
2008-10-20 19:25:29 +0200 jcn  r262512 : layoutdialogs2: Prevent Find&Replace window from being deleted twice.
2008-10-20 19:25:24 +0200 jcn  r262511 : layoutdialogs2: Add destructor to SvxSearchDialogWrapper. Fixes second invocation crasher.
2008-10-20 19:25:19 +0200 jcn  r262510 : layoutdialogs2: Make Find&Replace work (once) with minimal client code changes.
2008-10-20 19:25:13 +0200 jcn  r262509 : layoutdialogs2: Add ComboBox/FixedText debug switching.
2008-10-20 19:25:08 +0200 jcn  r262508 : layoutdialogs2: Add destructors resetting handlers.
2008-10-20 19:25:03 +0200 jcn  r262507 : layoutdialogs2: Static cast fixes.
2008-10-20 19:24:59 +0200 jcn  r262506 : layoutdialogs2: Always set button handler. Fixes pushbuttons.
2008-10-20 19:24:55 +0200 jcn  r262505 : layoutdialogs2: Revert "Move FocusHandlers from Control down to ListBox, ComboBox, FixedText."
This reverts commit 8bc4b991539a74373bfb1ef8792276ada8c958e4.
2008-10-20 19:24:50 +0200 jcn  r262504 : layoutdialogs2: Disable Timer for ENABLE_LAYOUT.
2008-10-20 19:24:45 +0200 jcn  r262503 : layoutdialogs2: Move FocusHandlers from Control down to ListBox, ComboBox, FixedText.
2008-10-20 19:24:40 +0200 jcn  r262502 : layoutdialogs2: Wider small symbol.
2008-10-20 19:24:36 +0200 jcn  r262501 : layoutdialogs2: Listener and SetHandler cleanup.
2008-10-20 19:24:31 +0200 jcn  r262500 : layoutdialogs2: Clear mxWindow upon deletion. Fixes Find&Replace crasher.
2008-10-20 19:24:27 +0200 jcn  r262499 : layoutdialogs2: Typo, fixes build.
2008-10-20 19:24:22 +0200 jcn  r262498 : layoutdialogs2: Ignore .log files too.
2008-10-20 19:24:19 +0200 jcn  r262497 : layoutdialogs2: By default, work around #define protected public Resource hack.
2008-10-20 19:24:15 +0200 jcn  r262496 : layoutdialogs2: Sw:Find&Replace: Remove wrong static cast. Fixes crasher.
2008-10-20 19:24:10 +0200 jcn  r262495 : layoutdialogs2: Find&Replace: do not vertically expand buttons, add title.
2008-10-20 19:24:06 +0200 jcn  r262494 : layoutdialogs2: Find&Replace: Remove need for ResId, set help id.
2008-10-20 19:24:01 +0200 jcn  r262493 : layoutdialogs2: MoreButton: redraw upon resize, fix labels, use small symbol.
2008-10-20 19:23:57 +0200 jcn  r262492 : layoutdialogs2: Support setting and querying small symbol on vcl:button.
2008-10-20 19:23:52 +0200 jcn  r262491 : layoutdialogs2: Support redrawing of only this, make parent optional.
2008-10-20 19:23:48 +0200 jcn  r262490 : layoutdialogs2: Add Kohei's wfield patch https://bugzilla.novell.com/attachment.cgi?id=235398. Fixes n#417840.
2008-10-20 19:23:44 +0200 jcn  r262489 : layoutdialogs2: Redraw [parent] upon first time visibility.
Fixes weird listbox dropdown sizing in Find & Replace.
2008-10-20 19:23:39 +0200 jcn  r262488 : layoutdialogs2: Add manual layouting for Find & Replace.
2008-10-20 19:23:35 +0200 jcn  r262487 : layoutdialogs2: src2xml: use label instead of text for buttons.
Run on Find & Replace; fixes button texts.
2008-10-20 19:23:31 +0200 jcn  r262486 : layoutdialogs2: Add initial auto-translated find-&-replace-.xml.
2008-10-20 19:23:26 +0200 jcn  r262485 : layoutdialogs2: layout importer: handle ModelessDialog.
Fixes Find & Replace parsing error.
2008-10-20 19:23:22 +0200 jcn  r262484 : layoutdialogs2: src2xml: Handle multiple widgets at same x,y.
Fixes silent removal of widgets in Find & Replace dialog.
2008-10-20 19:23:18 +0200 jcn  r262483 : layoutdialogs2: src2xml: Handle hide= attribute, translate to show=.
2008-10-20 19:23:14 +0200 jcn  r262482 : layoutdialogs2: Only use __PRETTY_FUNCTION__ on gcc. Fixes Windows build. Thanks Tor!
2008-10-20 19:23:10 +0200 jcn  r262481 : layoutdialogs2: Add two missing SAL_CALL decorations. Fixes Windows build. Thanks Tor!
2008-10-20 19:23:05 +0200 jcn  r262480 : layoutdialogs2: Build fixes for layout'ed Find & Replace dialog.
2008-10-20 19:22:54 +0200 jcn  r262479 : layoutdialogs2: Do not use layout::SfxTabDialog for now.
2008-10-20 19:22:47 +0200 jcn  r262478 : layoutdialogs2: Crufty sizing tweaks.
2008-10-20 19:22:42 +0200 jcn  r262477 : layoutdialogs2: More debugging cleanups.
2008-10-20 19:22:37 +0200 jcn  r262476 : layoutdialogs2: More cleanups that result in constant manual resizing...
2008-10-20 19:22:33 +0200 jcn  r262475 : layoutdialogs2: Tabdlg cleanups.
2008-10-20 19:22:28 +0200 jcn  r262474 : layoutdialogs2: Add GetOptimalSize () to InPlug. Fixes auto-sizing of tabcontrol.
2008-10-20 19:22:21 +0200 jcn  r262473 : layoutdialogs2: Get VCLXTabControl to resize automatically (too tall), not mousable.
2008-10-20 19:22:13 +0200 jcn  r262472 : layoutdialogs2: Respect show=false property; do not show everything.
2008-10-20 19:22:09 +0200 jcn  r262471 : layoutdialogs2: Add show=false on buttons. Fixes displaying everything.
2008-10-20 19:22:05 +0200 jcn  r262470 : layoutdialogs2: Move some code to reduce namespace and #if hacking.
2008-10-20 19:22:00 +0200 jcn  r262469 : layoutdialogs2: Cleanup, remove unneeded #defines.
2008-10-20 19:21:56 +0200 jcn  r262468 : layoutdialogs2: Replace static casts with dynamic_cast, fixes layout::SfxTabDialog.
Explicitly add 2 tabpages while adding tabpages, instead of relying on ResId.
2008-10-20 19:21:51 +0200 jcn  r262467 : layoutdialogs2: Use cpp hacking to remove layout-tabdialog.hxx duplication.
2008-10-20 19:21:45 +0200 jcn  r262466 : layoutdialogs2: Minimize diff between layout-tabdialog.hxx and tabdlg.hxx.
2008-10-20 19:21:41 +0200 jcn  r262465 : layoutdialogs2: Remove copy of SfxTabDialog; use cpp logic to create both flavours.
2008-10-20 19:21:36 +0200 jcn  r262464 : layoutdialogs2: Minimize diff between layout/sfxtabdialog.cxx and source/tabdlg.cxx.
This enables the next step: use cpp logic instead of code duplication.
2008-10-20 19:21:31 +0200 jcn  r262463 : layoutdialogs2: Hello world on layout::SfxTabDialog.
2008-10-20 19:21:24 +0200 jcn  r262462 : layoutdialogs2: Nice `Compiling:' message that shows the file being compiled.
2008-10-20 19:21:20 +0200 jcn  r262461 : layoutdialogs2: Use layout::SfxTabDialog for sort options.
2008-10-20 19:21:15 +0200 jcn  r262460 : layoutdialogs2: Update sort options tab.
2008-10-20 19:21:10 +0200 jcn  r262459 : layoutdialogs2: Add layout::SfxTabDialog.
2008-10-20 19:21:04 +0200 jcn  r262458 : layoutdialogs2: Cleanup previous attempt using layout::SfxTabPage == layout::TabPage.
2008-10-20 19:20:57 +0200 jcn  r262457 : layoutdialogs2: Windows 2003 compile fixes, i#92397.
2008-10-20 19:20:52 +0200 jcn  r262456 : layoutdialogs2: Set default radiogroup when none provided.
2008-10-20 19:20:48 +0200 jcn  r262455 : layoutdialogs2: Add radiogroup to sort-options. Fixes crasher.
2008-10-20 19:20:43 +0200 jcn  r262454 : layoutdialogs2: Cleanup ParentSet fix.
2008-10-20 19:20:36 +0200 jcn  r262453 : layoutdialogs2: Add debugging in ParentSet. Works standalone, not integrated.
2008-10-20 19:20:31 +0200 jcn  r262452 : layoutdialogs2: Revert "Have InPlug not derive from Window, but have as member."
This reverts commit 50ea26eec3fe14943f24900081ad923e72550345.
2008-10-20 19:20:25 +0200 jcn  r262451 : layoutdialogs2: Have InPlug not derive from Window, but have as member.
2008-10-20 19:20:20 +0200 jcn  r262450 : layoutdialogs2: Move layout plugin implementation from layout::SfxTabPage to InPlug.
2008-10-20 19:20:14 +0200 jcn  r262449 : layoutdialogs2: Get all widgets to display in sfxtabpage plugin with Window::SetParent hack.
2008-10-20 19:20:09 +0200 jcn  r262448 : layoutdialogs2: Two-button manual hello world with sfxtabpage plugin.
2008-10-20 19:20:03 +0200 jcn  r262447 : layoutdialogs2: WIP: layout::SfxTabPage derived from SfxTabPage.
2008-10-20 19:19:55 +0200 jcn  r262446 : layoutdialogs2: Always set parent after construction, fixes listbox dropdown.
2008-10-20 19:19:51 +0200 jcn  r262445 : layoutdialogs2: Fix radio button crasher.
2008-10-20 19:19:47 +0200 jcn  r262444 : layoutdialogs2: Implement ListBox method wrappers. Fixes filling of listbox.
2008-10-20 19:19:42 +0200 jcn  r262443 : layoutdialogs2: Convert Move/Copy sheet to layout engine.
2008-10-20 19:19:35 +0200 jcn  r262442 : layoutdialogs2: Also hide yes/no buttons if not used.
2008-10-20 19:19:31 +0200 jcn  r262441 : layoutdialogs2: Elaborate on changing client code.
2008-10-20 19:19:26 +0200 jcn  r262440 : layoutdialogs2: Implement winbits client-code compatibility for Message Boxes.
2008-10-20 19:19:21 +0200 jcn  r262439 : layoutdialogs2: Add localize.sdf to toolkit uiconfig. Fixes build.
2008-10-20 19:19:17 +0200 jcn  r262438 : layoutdialogs2: Do not use ti_layout twice in toolkit build.lst. Fixes build.
2008-10-20 19:19:13 +0200 jcn  r262437 : layoutdialogs2: Oops, also dist toolkit-layout.zip.
2008-10-20 19:19:09 +0200 jcn  r262436 : layoutdialogs2: Move layout.mk to solenv.
2008-10-20 19:19:03 +0200 jcn  r262435 : layoutdialogs2: Add handy TEST file.
2008-10-20 19:18:58 +0200 jcn  r262434 : layoutdialogs2: Implement MessageBox and wrappers ErrorBox, InfoBox, QueryBox, WarningBox.
2008-10-20 19:18:52 +0200 jcn  r262433 : layoutdialogs2: QueryBox without image used for Delete Sheet dialog.
2008-10-20 19:18:46 +0200 jcn  r262432 : layoutdialogs2: WIP QueryBox.
2008-10-20 19:18:39 +0200 jcn  r262431 : layoutdialogs2: Add insert-sheet localization.
2008-10-20 19:18:34 +0200 jcn  r262430 : layoutdialogs2: Run indent-region on zoom.xml, distribute it.
2008-10-20 19:18:30 +0200 jcn  r262429 : layoutdialogs2: Dist xml files too.
2008-10-20 19:18:26 +0200 jcn  r262428 : layoutdialogs2: Add insert-sheet.xml to workben.
2008-10-20 19:18:22 +0200 jcn  r262427 : layoutdialogs2: Update layout TODO.
2008-10-20 19:18:18 +0200 jcn  r262426 : layoutdialogs2: Cleanups and add comments.
2008-10-20 19:18:13 +0200 jcn  r262425 : layoutdialogs2: Keep RadioButtons::RadioButton callback at HEAD of list.
Fixes radiobutton grouping.
2008-10-20 19:18:07 +0200 jcn  r262424 : layoutdialogs2: Remove IMPORT_RADIOGROUP cruft.
2008-10-20 19:18:02 +0200 jcn  r262423 : layoutdialogs2: Have code check fire event for radio button.
Fixes radio button grouping.
2008-10-20 19:17:58 +0200 jcn  r262422 : layoutdialogs2: Enable IMPORT_RADIOGROUP flag.
2008-10-20 19:17:54 +0200 jcn  r262421 : layoutdialogs2: Add radio groups to zoom.xml.
2008-10-20 19:17:50 +0200 jcn  r262420 : layoutdialogs2: Move RadioGroup implementation to cxx file.
2008-10-20 19:17:45 +0200 jcn  r262419 : layoutdialogs2: Manually set help id for insert table.
2008-10-20 19:17:41 +0200 jcn  r262418 : layoutdialogs2: Cosmetic fixes for insert-sheet.
2008-10-20 19:17:37 +0200 jcn  r262417 : layoutdialogs2: FindAndRemove now also skips translation prefix.
Fixes setting of title etc. from nontranslated xml.
2008-10-20 19:17:32 +0200 jcn  r262416 : layoutdialogs2: Manually set help id for zoom and wordcount dialogs.
2008-10-20 19:17:27 +0200 jcn  r262415 : layoutdialogs2: Set help-id from xml.
2008-10-20 19:17:21 +0200 jcn  r262414 : layoutdialogs2: Move -DENABLE_LAYOUT from stray makefiles to settings.mk.
2008-10-20 19:17:13 +0200 jcn  r262413 : layoutdialogs2: Initial conversion of insert-sheet dialog.
2008-10-20 19:17:08 +0200 jcn  r262412 : layoutdialogs2: Add wrappers for {Get,Set}{Pointer,Text}.
2008-10-20 19:17:04 +0200 jcn  r262411 : layoutdialogs2: Toolkit layout dialog copy updates.
2008-10-20 19:16:59 +0200 jcn  r262410 : layoutdialogs2: Cleanup #include <layout*> disaster.
Fixes multiple inclusions of layout-pre, layout-post.
2008-10-20 19:16:53 +0200 jcn  r262409 : layoutdialogs2: Implement Get,Set{,Smart}HelpId ().
2008-10-20 19:16:49 +0200 jcn  r262408 : layoutdialogs2: Make some getters const.
2008-10-20 19:16:45 +0200 jcn  r262407 : layoutdialogs2: Manual tweaks for string-input.xml.
2008-10-20 19:16:40 +0200 jcn  r262406 : layoutdialogs2: Add string-input.xml.
2008-10-20 19:16:36 +0200 jcn  r262405 : layoutdialogs2: Add dummy implementation for SetHelpId etc.
2008-10-20 19:16:32 +0200 jcn  r262404 : layoutdialogs2: Actually say *what* file cannot be copied *where*. Sigh.
2008-10-20 19:16:27 +0200 jcn  r262403 : layoutdialogs2: Thinko in macro name. Fixes compilation of strindlg.cxx.
2008-10-20 19:16:22 +0200 jcn  r262402 : layoutdialogs2: Add layout includes to stringdlg and makefile.
2008-10-20 19:16:17 +0200 jcn  r262401 : layoutdialogs2: Add sc/uiconfig/layout/localize.sdf
2008-10-20 19:16:13 +0200 jcn  r262400 : layoutdialogs2: Oops, build sc/uiconfig/layout.
2008-10-20 19:16:09 +0200 jcn  r262399 : layoutdialogs2: Have virtual destructor on Context, delete TabPage when deleting TabDialog.
2008-10-20 19:16:04 +0200 jcn  r262398 : layoutdialogs2: Actually delete layout::TabPage objects when deleting SfxTabdialog.
2008-10-20 19:16:00 +0200 jcn  r262397 : layoutdialogs2: Workaround for second invocation crash of sort dialog options tab.
2008-10-20 19:15:56 +0200 jcn  r262396 : layoutdialogs2: Handle Reset button.
2008-10-20 19:15:51 +0200 jcn  r262395 : layoutdialogs2: Also install sc xml zip file.
2008-10-20 19:15:46 +0200 jcn  r262394 : layoutdialogs2: Integrate sort-options into sc.
2008-10-20 19:15:41 +0200 jcn  r262393 : layoutdialogs2: Revert "Fix sfx2 compile warnings."
This reverts commit 8b55d402af7bd217db35f67b02dc92f93f3ada5d.
2008-10-20 19:15:34 +0200 jcn  r262392 : layoutdialogs2: Remove debuging.
2008-10-20 19:15:30 +0200 jcn  r262391 : layoutdialogs2: Pass set argument to layout::TabPage. Fixes OO.o integration crasher.
2008-10-20 19:15:24 +0200 jcn  r262390 : layoutdialogs2: Ignore more.
2008-10-20 19:15:20 +0200 jcn  r262389 : layoutdialogs2: Oops, make just one (1) sort-options tab.
2008-10-20 19:15:15 +0200 jcn  r262388 : layoutdialogs2: Revert macroconf compile warnings.
2008-10-20 19:15:09 +0200 jcn  r262387 : layoutdialogs2: Fix sfx2 compile warnings.
2008-10-20 19:15:01 +0200 jcn  r262386 : layoutdialogs2: Collapsed tabpage and sort-options development.
2008-10-20 19:14:51 +0200 jcn  r262385 : layoutdialogs2: Make dev300/src680 install layout switchable at compile time.
2008-10-20 19:14:47 +0200 jcn  r262384 : layoutdialogs2: Update README, add README.
2008-10-20 19:14:43 +0200 jcn  r262383 : layoutdialogs2: Repainting, hiding stuff.
2008-10-20 19:14:38 +0200 jcn  r262382 : layoutdialogs2: Add allocateArea to VCLXTabPage.
2008-10-20 19:14:34 +0200 jcn  r262381 : layoutdialogs2: Revert "Use VCLXContainer as base for VCLXTabPage."
This reverts commit 06a984434d0d2c356fd0cdaf96d6d613d5147b7c.
2008-10-20 19:14:30 +0200 jcn  r262380 : layoutdialogs2: Use VCLXContainer as base for VCLXTabPage.
2008-10-20 19:14:26 +0200 jcn  r262379 : layoutdialogs2: Revert "Derive VCLXTabPage from VBox."
This reverts commit 8ab66364bdc08151ce2c982c1aa03f7881d86b84.
2008-10-20 19:14:22 +0200 jcn  r262378 : layoutdialogs2: Derive VCLXTabPage from VBox.
2008-10-20 19:14:17 +0200 jcn  r262377 : layoutdialogs2: More cleanups and testing.
2008-10-20 19:14:12 +0200 jcn  r262376 : layoutdialogs2: Get layout tabpage to nicely select. No content visible, though.
2008-10-20 19:14:07 +0200 jcn  r262375 : layoutdialogs2: Support ScTabPageSortOptions in standalone test.
2008-10-20 19:14:02 +0200 jcn  r262374 : layoutdialogs2: Support tabpage creation from xml.
2008-10-20 19:13:56 +0200 jcn  r262373 : layoutdialogs2: Remove most TEST_LAYOUT conditionals.
2008-10-20 19:13:52 +0200 jcn  r262372 : layoutdialogs2: Remove Args effort.
2008-10-20 19:13:48 +0200 jcn  r262371 : layoutdialogs2: Attempt to create ArgSet.
2008-10-20 19:13:44 +0200 jcn  r262370 : layoutdialogs2: Compile more.
2008-10-20 19:13:39 +0200 jcn  r262369 : layoutdialogs2: Add sortdlg.
2008-10-20 19:13:35 +0200 jcn  r262368 : layoutdialogs2: Oops, ID fix.
2008-10-20 19:13:30 +0200 jcn  r262367 : layoutdialogs2: Build fix.
2008-10-20 19:13:26 +0200 jcn  r262366 : layoutdialogs2: Revert "Use ::Window for plugin base iso ::Control."
This reverts commit 919ddaf2f52ad5e4df877a094cd1e336888d6210.
2008-10-20 19:13:21 +0200 jcn  r262365 : layoutdialogs2: Plugin dialog cleanups.
2008-10-20 19:13:17 +0200 jcn  r262364 : layoutdialogs2: Use ::Window for plugin base iso ::Control.
2008-10-20 19:13:12 +0200 jcn  r262363 : layoutdialogs2: Use cstdio, remove cruft.
2008-10-20 19:13:07 +0200 jcn  r262362 : layoutdialogs2: Remove cruft.
2008-10-20 19:13:02 +0200 jcn  r262361 : layoutdialogs2: Remove sizing mess.
2008-10-20 19:12:57 +0200 jcn  r262360 : layoutdialogs2: Trigger [re]draw of DialControl.
2008-10-20 19:12:53 +0200 jcn  r262359 : layoutdialogs2: DialControl window behaves nicely and invisible.
2008-10-20 19:12:48 +0200 jcn  r262358 : layoutdialogs2: Revert adding of setparent.
2008-10-20 19:12:43 +0200 jcn  r262357 : layoutdialogs2: Add dialog::setparent to plugin.
2008-10-20 19:12:39 +0200 jcn  r262356 : layoutdialogs2: Add a setProperty for VCLXPlugin.
2008-10-20 19:12:34 +0200 jcn  r262355 : layoutdialogs2: Unhide plugin.
2008-10-20 19:12:30 +0200 jcn  r262354 : layoutdialogs2: Revert.
2008-10-20 19:12:25 +0200 jcn  r262353 : layoutdialogs2: Use window instead of control.
2008-10-20 19:12:20 +0200 jcn  r262352 : layoutdialogs2: Lots of plugin settings.
2008-10-20 19:12:16 +0200 jcn  r262351 : layoutdialogs2: More hacks.
2008-10-20 19:12:11 +0200 jcn  r262350 : layoutdialogs2: Compile fixes.
2008-10-20 19:12:05 +0200 jcn  r262349 : layoutdialogs2: Use c++ includes.
2008-10-20 19:12:00 +0200 jcn  r262348 : layoutdialogs2: Junk UnoTunnel nonsense.
2008-10-20 19:11:55 +0200 jcn  r262347 : layoutdialogs2: Remove more cruft.
2008-10-20 19:11:50 +0200 jcn  r262346 : layoutdialogs2: Remove cruft.
2008-10-20 19:11:44 +0200 jcn  r262345 : layoutdialogs2: Rename wrap to plugin.
2008-10-20 19:11:39 +0200 jcn  r262344 : layoutdialogs2: All sorry tries.
2008-10-20 19:11:33 +0200 jcn  r262343 : layoutdialogs2: Rename plugin to wrap.
2008-10-20 19:11:28 +0200 jcn  r262342 : layoutdialogs2: Add ifdefs, no UNOTUNNEL, no crash on exit.
2008-10-20 19:11:23 +0200 jcn  r262341 : layoutdialogs2: Redo all kind of Uno and XIface weirdness.
2008-10-20 19:11:17 +0200 jcn  r262340 : layoutdialogs2: Remove extra UnoTunnel.
2008-10-20 19:11:12 +0200 jcn  r262339 : layoutdialogs2: Plugin hello world. TODO: parenting/owning/sizing, ... etc.
2008-10-20 19:11:06 +0200 jcn  r262338 : layoutdialogs2: Zoom updates.
2008-10-20 19:11:01 +0200 jcn  r262337 : layoutdialogs2: Add missing controls.
2008-10-20 19:10:56 +0200 jcn  r262336 : layoutdialogs2: Add .gitignore.
2009-04-21 16:06:18 +00:00

1878 lines
56 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: Outliner.cxx,v $
* $Revision: 1.37.24.1 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"
#include "Outliner.hxx"
#include <vcl/wrkwin.hxx>
#include <sfx2/srchitem.hxx>
#include <svx/colritem.hxx>
#include <svx/eeitem.hxx>
#include <svx/editstat.hxx>
#include <vcl/outdev.hxx>
#ifndef _DLGUTIL_HXX
#include <svx/dlgutil.hxx>
#endif
#include <svx/xtable.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/printer.hxx>
#include <svx/svxerr.hxx>
#include <svx/svdotext.hxx>
#include <svx/unolingu.hxx>
#include <svx/svditer.hxx>
#include <comphelper/extract.hxx>
#include <com/sun/star/linguistic2/XSpellChecker1.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <comphelper/processfactory.hxx>
#include <svx/eeitem.hxx>
#include <svx/forbiddencharacterstable.hxx>
#include <svx/srchdlg.hxx>
#include <svtools/linguprops.hxx>
#include <svtools/lingucfg.hxx>
#include <svx/editeng.hxx>
#include <vcl/metric.hxx>
#include <sfx2/viewfrm.hxx>
#include "strings.hrc"
#include "sdstring.hrc"
#include "eetext.hxx"
#include "sdpage.hxx"
#include "app.hxx"
#include "Window.hxx"
#include "sdresid.hxx"
#include "DrawViewShell.hxx"
#include "OutlineViewShell.hxx"
#include "drawdoc.hxx"
#include "DrawDocShell.hxx"
#include "FrameView.hxx"
#include "optsitem.hxx"
#include "drawview.hxx"
#include "ViewShellBase.hxx"
#include "SpellDialogChildWindow.hxx"
#include "ToolBarManager.hxx"
#include "framework/FrameworkHelper.hxx"
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::linguistic2;
class SfxStyleSheetPool;
namespace sd {
class Outliner::Implementation
{
public:
/** The original edit mode directly after switching to a different view
mode. Used for restoring the edit mode when leaving that view mode
again.
*/
EditMode meOriginalEditMode;
Implementation (void);
~Implementation (void);
/** Return the OutlinerView that was provided by the last call to
ProvideOutlinerView() (or NULL when there was no such call.)
*/
OutlinerView* GetOutlinerView (void);
/** Provide in the member mpOutlineView an instance of OutlinerView that
is either taken from the ViewShell, when it is an OutlineViewShell,
or is created. When an OutlinerView already exists it is initialied.
*/
void ProvideOutlinerView (
Outliner& rOutliner,
const ::boost::shared_ptr<ViewShell>& rpViewShell,
::Window* pWindow);
/** This method is called when the OutlinerView is no longer used.
*/
void ReleaseOutlinerView (void);
private:
/** Flag that specifies whether we own the outline view pointed to by
<member>mpOutlineView</member> and thus have to
delete it in <member>EndSpelling()</member>.
*/
bool mbOwnOutlineView;
/** The outline view used for searching and spelling. If searching or
spell checking an outline view this data member points to that view.
For all other views an instance is created. The
<member>mbOwnOutlineView</member> distinguishes between both cases.
*/
OutlinerView* mpOutlineView;
};
/*************************************************************************
|*
|* Ctor
|*
\************************************************************************/
Outliner::Outliner( SdDrawDocument* pDoc, USHORT nMode )
: SdrOutliner( &pDoc->GetItemPool(), nMode ),
mpImpl(new Implementation()),
meMode(SEARCH),
mpView(NULL),
mpViewShell(),
mpWindow(NULL),
mpDrawDocument(pDoc),
mnConversionLanguage(LANGUAGE_NONE),
mnIgnoreCurrentPageChangesLevel(0),
mbStringFound(FALSE),
mbMatchMayExist(false),
mnPageCount(0),
mnObjectCount(0),
mbEndOfSearch(FALSE),
mbFoundObject(FALSE),
mbError(FALSE),
mbDirectionIsForward(true),
mbRestrictSearchToSelection(false),
maMarkListCopy(),
mbProcessCurrentViewOnly(false),
mpObj(NULL),
mpFirstObj(NULL),
mpTextObj(NULL),
mnText(0),
mpParaObj(NULL),
meStartViewMode(PK_STANDARD),
meStartEditMode(EM_PAGE),
mnStartPageIndex((USHORT)-1),
mpStartEditedObject(NULL),
maStartSelection(),
mpSearchItem(NULL),
maObjectIterator(),
maCurrentPosition(),
maSearchStartPosition(),
maLastValidPosition(),
mbSelectionHasChanged(false),
mbExpectingSelectionChangeEvent(false),
mbWholeDocumentProcessed(false),
mbPrepareSpellingPending(true),
mbViewShellValid(true)
{
SetStyleSheetPool((SfxStyleSheetPool*) mpDrawDocument->GetStyleSheetPool());
SetEditTextObjectPool( &pDoc->GetItemPool() );
SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
SetForbiddenCharsTable( pDoc->GetForbiddenCharsTable() );
ULONG nCntrl = GetControlWord();
nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
nCntrl |= EE_CNTRL_URLSFXEXECUTE;
nCntrl |= EE_CNTRL_MARKFIELDS;
nCntrl |= EE_CNTRL_AUTOCORRECT;
BOOL bOnlineSpell = false;
DrawDocShell* pDocSh = mpDrawDocument->GetDocSh();
if (pDocSh)
{
bOnlineSpell = mpDrawDocument->GetOnlineSpell();
}
else
{
bOnlineSpell = false;
try
{
const SvtLinguConfig aLinguConfig;
Any aAny;
aAny = aLinguConfig.GetProperty(
rtl::OUString::createFromAscii( UPN_IS_SPELL_AUTO ) );
aAny >>= bOnlineSpell;
}
catch( ... )
{
DBG_ERROR( "Ill. type in linguistic property" );
}
}
if (bOnlineSpell)
nCntrl |= EE_CNTRL_ONLINESPELLING;
else
nCntrl &= ~EE_CNTRL_ONLINESPELLING;
SetControlWord(nCntrl);
Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
if ( xSpellChecker.is() )
SetSpeller( xSpellChecker );
Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
if( xHyphenator.is() )
SetHyphenator( xHyphenator );
SetDefaultLanguage( Application::GetSettings().GetLanguage() );
}
/// Nothing spectecular in the destructor.
Outliner::~Outliner (void)
{
mpImpl.reset();
}
/** Prepare find&replace or spellchecking. This distinguishes between three
cases:
<ol>
<li>The current shell is a <type>DrawViewShell</type>: Create a
<type>OutlinerView</type> object and search all objects of (i) the
current mark list, (ii) of the current view, or (iii) of all the view
combinations:
<ol>
<li>Draw view, slide view</li>
<li>Draw view, background view</li>
<li>Notes view, slide view</li>
<li>Notes view, background view</li>
<li>Handout view, slide view</li>
<li>Handout view, background view</li>
</ol>
<li>When the current shell is a <type>SdOutlineViewShell</type> then
directly operate on it. No switching into other views takes place.</li>
<li>For a <type>SlideViewShell</type> no action is performed.</li>
</ol>
*/
void Outliner::PrepareSpelling (void)
{
if (mbViewShellValid)
{
mbPrepareSpellingPending = false;
ViewShellBase* pBase = PTR_CAST(ViewShellBase,SfxViewShell::Current());
if (pBase != NULL)
SetViewShell (pBase->GetMainViewShell());
SetRefDevice( SD_MOD()->GetRefDevice( *mpDrawDocument->GetDocSh() ) );
if (mpViewShell.get() != NULL)
{
mbStringFound = FALSE;
mbWholeDocumentProcessed = false;
// Supposed that we are not located at the very beginning/end of
// the document then there may be a match in the document
// prior/after the current position.
mbMatchMayExist = TRUE;
maObjectIterator = ::sd::outliner::Iterator();
maSearchStartPosition = ::sd::outliner::Iterator();
RememberStartPosition();
mpImpl->ProvideOutlinerView(*this, mpViewShell, mpWindow);
HandleChangedSelection ();
}
ClearModifyFlag();
}
}
void Outliner::StartSpelling (void)
{
meMode = SPELL;
mbDirectionIsForward = true;
mpSearchItem = NULL;
}
/** Proxy for method from base class to avoid compiler warning */
void Outliner::StartSpelling(EditView& rView, unsigned char c)
{
SdrOutliner::StartSpelling( rView, c );
}
/** Free all resources acquired during the search/spell check. After a
spell check the start position is restored here.
*/
void Outliner::EndSpelling (void)
{
if (mbViewShellValid)
{
ViewShellBase* pBase = PTR_CAST(ViewShellBase,SfxViewShell::Current());
if (pBase != NULL)
mpViewShell = pBase->GetMainViewShell();
else
mpViewShell.reset();
// When in <member>PrepareSpelling()</member> a new outline view has
// been created then delete it here.
sal_Bool bViewIsDrawViewShell(mpViewShell.get()!=NULL
&& mpViewShell->ISA(DrawViewShell));
if (bViewIsDrawViewShell)
{
SetStatusEventHdl(Link());
mpView = mpViewShell->GetView();
mpView->UnmarkAllObj (mpView->GetSdrPageView());
mpView->SdrEndTextEdit();
// Make FuSelection the current function.
mpViewShell->GetDispatcher()->Execute(
SID_OBJECT_SELECT,
SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD);
// Remove and, if previously created by us, delete the outline
// view.
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
{
RemoveView(pOutlinerView);
mpImpl->ReleaseOutlinerView();
}
SetUpdateMode(TRUE);
}
// #95811# Before clearing the modify flag use it as a hint that
// changes were done at SpellCheck
if(IsModified())
{
if(mpView && mpView->ISA(OutlineView))
static_cast<OutlineView*>(mpView)->PrepareClose(FALSE);
if(mpDrawDocument && !mpDrawDocument->IsChanged())
mpDrawDocument->SetChanged(TRUE);
}
// #95811# now clear the modify flag to have a specified state of
// Outliner
ClearModifyFlag();
// When spell checking then restore the start position.
if (meMode==SPELL || meMode==TEXT_CONVERSION)
RestoreStartPosition ();
}
mpViewShell.reset();
mpView = NULL;
mpWindow = NULL;
}
BOOL Outliner::SpellNextDocument (void)
{
if (mpViewShell->ISA(OutlineViewShell))
{
// When doing a spell check in the outline view then there is
// only one document.
mbEndOfSearch = true;
EndOfSearch ();
}
else
{
if (mpView->ISA(OutlineView))
((OutlineView*)mpView)->PrepareClose(FALSE);
mpDrawDocument->GetDocSh()->SetWaitCursor( TRUE );
Initialize (true);
mpWindow = mpViewShell->GetActiveWindow();
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
pOutlinerView->SetWindow(mpWindow);
ProvideNextTextObject ();
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
ClearModifyFlag();
}
return mbEndOfSearch ? FALSE : TRUE;
}
void Outliner::HandleOutsideChange (ChangeHint eHint)
{
switch (eHint)
{
case CH_VIEW_SHELL_INVALID:
EndSpelling();
mbPrepareSpellingPending = true;
mbViewShellValid = false;
break;
case CH_VIEW_SHELL_VALID:
mbViewShellValid = true;
break;
}
}
/*************************************************************************
|*
|* Spelling: naechstes TextObjekt pruefen
|*
\************************************************************************/
::svx::SpellPortions Outliner::GetNextSpellSentence (void)
{
::svx::SpellPortions aResult;
DetectChange();
// Iterate over sentences and text shapes until a sentence with a
// spelling error has been found. If no such sentence can be
// found the loop is left through a break.
// It is the responsibility of the sd outliner object to correctly
// iterate over all text shapes, i.e. switch between views, wrap
// arround at the end of the document, stop when all text shapes
// have been examined exactly once.
bool bFoundNextSentence = false;
while ( ! bFoundNextSentence)
{
OutlinerView* pOutlinerView = GetView(0);
if (pOutlinerView != NULL)
{
ESelection aCurrentSelection (pOutlinerView->GetSelection());
if ( ! mbMatchMayExist
&& maStartSelection.IsLess(aCurrentSelection))
EndOfSearch();
// Advance to the next sentence.
bFoundNextSentence = SpellSentence (
pOutlinerView->GetEditView(),
aResult, false);
}
// When no sentence with spelling errors has been found in the
// currently selected text shape or there is no selected text
// shape then advance to the next text shape.
if ( ! bFoundNextSentence)
if ( ! SpellNextDocument())
// All text objects have been processed so exit the
// loop and return an empty portions list.
break;
}
return aResult;
}
/** Go to next match.
*/
bool Outliner::StartSearchAndReplace (const SvxSearchItem* pSearchItem)
{
BOOL bEndOfSearch = TRUE;
if (mbViewShellValid)
{
mpDrawDocument->GetDocSh()->SetWaitCursor( TRUE );
if (mbPrepareSpellingPending)
PrepareSpelling();
ViewShellBase* pBase = PTR_CAST(ViewShellBase,SfxViewShell::Current());
// Determine whether we have to abort the search. This is necessary
// when the main view shell does not support searching.
bool bAbort = false;
if (pBase != NULL)
{
::boost::shared_ptr<ViewShell> pShell (pBase->GetMainViewShell());
SetViewShell(pShell);
if (pShell.get() == NULL)
bAbort = true;
else
switch (pShell->GetShellType())
{
case ViewShell::ST_DRAW:
case ViewShell::ST_IMPRESS:
case ViewShell::ST_NOTES:
case ViewShell::ST_HANDOUT:
case ViewShell::ST_OUTLINE:
bAbort = false;
break;
default:
bAbort = true;
break;
}
}
if ( ! bAbort)
{
meMode = SEARCH;
mpSearchItem = pSearchItem;
mbFoundObject = FALSE;
Initialize ( ! mpSearchItem->GetBackward());
USHORT nCommand = mpSearchItem->GetCommand();
if (nCommand == SVX_SEARCHCMD_REPLACE_ALL)
bEndOfSearch = SearchAndReplaceAll ();
else
{
RememberStartPosition ();
bEndOfSearch = SearchAndReplaceOnce ();
//#107233# restore start position if nothing was found
if(!mbStringFound)
RestoreStartPosition ();
else
mnStartPageIndex = (USHORT)-1;
}
}
else
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
}
return bEndOfSearch;
}
void Outliner::Initialize (bool bDirectionIsForward)
{
bool bOldDirectionIsForward = mbDirectionIsForward;
mbDirectionIsForward = bDirectionIsForward;
if (maObjectIterator == ::sd::outliner::Iterator())
{
// Initialize a new search.
maObjectIterator = ::sd::outliner::OutlinerContainer(this).current();
maCurrentPosition = *maObjectIterator;
// In case we are searching in an outline view then first remove the
// current selection and place cursor at its start or end.
if (mpViewShell->ISA(OutlineViewShell))
{
ESelection aSelection = mpImpl->GetOutlinerView()->GetSelection ();
if (mbDirectionIsForward)
{
aSelection.nEndPara = aSelection.nStartPara;
aSelection.nEndPos = aSelection.nStartPos;
}
else
{
aSelection.nStartPara = aSelection.nEndPara;
aSelection.nStartPos = aSelection.nEndPos;
}
mpImpl->GetOutlinerView()->SetSelection (aSelection);
}
// When not beginning the search at the beginning of the search area
// then there may be matches before the current position.
mbMatchMayExist = (maObjectIterator!=::sd::outliner::OutlinerContainer(this).begin());
}
else if (bOldDirectionIsForward != mbDirectionIsForward)
{
// Requested iteration direction has changed. Turn arround the iterator.
maObjectIterator.Reverse();
// The iterator has pointed to the object one ahead/before the current
// one. Now move it to the one before/ahead the current one.
++maObjectIterator;
++maObjectIterator;
mbMatchMayExist = true;
}
// Initialize the last valid position with where the search starts so
// that it always points to a valid position.
maLastValidPosition = *::sd::outliner::OutlinerContainer(this).current();
}
bool Outliner::SearchAndReplaceAll (void)
{
// Save the current position to be restored after having replaced all
// matches.
RememberStartPosition ();
if (mpViewShell->ISA(OutlineViewShell))
{
// Put the cursor to the beginning/end of the outliner.
mpImpl->GetOutlinerView()->SetSelection (GetSearchStartPosition ());
// The outliner does all the work for us when we are in this mode.
SearchAndReplaceOnce();
}
else if (mpViewShell->ISA(DrawViewShell))
{
// Go to beginning/end of document.
maObjectIterator = ::sd::outliner::OutlinerContainer(this).begin();
// Switch to the current object only if it is a valid text object.
::sd::outliner::IteratorPosition aNewPosition (*maObjectIterator);
if (IsValidTextObject (aNewPosition))
{
maCurrentPosition = aNewPosition;
SetObject (maCurrentPosition);
}
// Search/replace until the end of the document is reached.
bool bFoundMatch;
do
{
bFoundMatch = ! SearchAndReplaceOnce();
}
while (bFoundMatch);
}
RestoreStartPosition ();
return true;
}
bool Outliner::SearchAndReplaceOnce (void)
{
DetectChange ();
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
DBG_ASSERT(pOutlinerView!=NULL && GetEditEngine().HasView( &pOutlinerView->GetEditView() ),
"SearchAndReplace without valid view!" );
if( NULL == pOutlinerView || !GetEditEngine().HasView( &pOutlinerView->GetEditView() ) )
return true;
if (mpViewShell != NULL)
{
mpView = mpViewShell->GetView();
mpWindow = mpViewShell->GetActiveWindow();
pOutlinerView->SetWindow(mpWindow);
if (mpViewShell->ISA(DrawViewShell) )
{
// When replacing we first check if there is a selection
// indicating a match. If there is then replace it. The
// following call to StartSearchAndReplace will then search for
// the next match.
if (meMode == SEARCH
&& mpSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE)
if (pOutlinerView->GetSelection().HasRange())
pOutlinerView->StartSearchAndReplace(*mpSearchItem);
// Search for the next match.
ULONG nMatchCount = 0;
if (mpSearchItem->GetCommand() != SVX_SEARCHCMD_REPLACE_ALL)
nMatchCount = pOutlinerView->StartSearchAndReplace(*mpSearchItem);
// Go to the next text object when there have been no matches in
// the current object or the whole object has already been
// processed.
if (nMatchCount==0 || mpSearchItem->GetCommand()==SVX_SEARCHCMD_REPLACE_ALL)
{
ProvideNextTextObject ();
if ( ! mbEndOfSearch)
{
// Remember the current position as the last one with a
// text object.
maLastValidPosition = maCurrentPosition;
// Now that the mbEndOfSearch flag guards this block the
// following assertion and return should not be
// necessary anymore.
DBG_ASSERT(GetEditEngine().HasView(&pOutlinerView->GetEditView() ),
"SearchAndReplace without valid view!" );
if ( ! GetEditEngine().HasView( &pOutlinerView->GetEditView() ) )
{
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
return true;
}
if (meMode == SEARCH)
nMatchCount = pOutlinerView->StartSearchAndReplace(*mpSearchItem);
}
}
}
else if (mpViewShell->ISA(OutlineViewShell))
{
mpDrawDocument->GetDocSh()->SetWaitCursor (FALSE);
// The following loop is executed more then once only when a
// wrap arround search is done.
while (true)
{
int nResult = pOutlinerView->StartSearchAndReplace(*mpSearchItem);
if (nResult == 0)
{
if (HandleFailedSearch ())
{
pOutlinerView->SetSelection (GetSearchStartPosition ());
continue;
}
}
else
mbStringFound = true;
break;
}
}
}
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
return mbEndOfSearch;
}
/** Try to detect whether the document or the view (shell) has changed since
the last time <member>StartSearchAndReplace()</member> has been called.
*/
void Outliner::DetectChange (void)
{
::sd::outliner::IteratorPosition aPosition (maCurrentPosition);
::boost::shared_ptr<DrawViewShell> pDrawViewShell (
::boost::dynamic_pointer_cast<DrawViewShell>(mpViewShell));
// Detect whether the view has been switched from the outside.
if (pDrawViewShell.get() != NULL
&& (aPosition.meEditMode != pDrawViewShell->GetEditMode()
|| aPosition.mePageKind != pDrawViewShell->GetPageKind()))
{
// Either the edit mode or the page kind has changed.
SetStatusEventHdl(Link());
SdrPageView* pPageView = mpView->GetSdrPageView();
if (pPageView != NULL)
mpView->UnmarkAllObj (pPageView);
mpView->SdrEndTextEdit();
SetUpdateMode(FALSE);
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
pOutlinerView->SetOutputArea( Rectangle( Point(), Size(1, 1) ) );
if (meMode == SPELL)
SetPaperSize( Size(1, 1) );
SetText( String(), GetParagraph( 0 ) );
RememberStartPosition ();
mnPageCount = mpDrawDocument->GetSdPageCount(pDrawViewShell->GetPageKind());
maObjectIterator = ::sd::outliner::OutlinerContainer(this).current();
}
// Detect change of the set of selected objects. If their number has
// changed start again with the first selected object.
else if (DetectSelectionChange())
{
HandleChangedSelection ();
maObjectIterator = ::sd::outliner::OutlinerContainer(this).current();
}
// Detect change of page count. Restart search at first/last page in
// that case.
else if (aPosition.meEditMode == EM_PAGE
&& mpDrawDocument->GetSdPageCount(aPosition.mePageKind) != mnPageCount)
{
// The number of pages has changed.
mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind);
maObjectIterator = ::sd::outliner::OutlinerContainer(this).current();
}
else if (aPosition.meEditMode == EM_MASTERPAGE
&& mpDrawDocument->GetSdPageCount(aPosition.mePageKind) != mnPageCount)
{
// The number of master pages has changed.
mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind);
maObjectIterator = ::sd::outliner::OutlinerContainer(this).current();
}
}
bool Outliner::DetectSelectionChange (void)
{
bool bSelectionHasChanged = false;
ULONG nMarkCount = mpView->GetMarkedObjectList().GetMarkCount();
// If mpObj is NULL then we have not yet found our first match.
// Detecting a change makes no sense.
if (mpObj != NULL)
switch (nMarkCount)
{
case 0:
// The selection has changed when previously there have been
// selected objects.
bSelectionHasChanged = mbRestrictSearchToSelection;
break;
case 1:
// Check if the only selected object is not the one that we
// had selected.
if (mpView != NULL)
{
SdrMark* pMark = mpView->GetMarkedObjectList().GetMark(0);
if (pMark != NULL)
bSelectionHasChanged = (mpObj != pMark->GetMarkedSdrObj ());
}
break;
default:
// We had selected exactly one object.
bSelectionHasChanged = true;
break;
}
return bSelectionHasChanged;
}
void Outliner::RememberStartPosition (void)
{
if (mpViewShell->ISA(DrawViewShell))
{
::boost::shared_ptr<DrawViewShell> pDrawViewShell (
::boost::dynamic_pointer_cast<DrawViewShell>(mpViewShell));
if (pDrawViewShell.get() != NULL)
{
meStartViewMode = pDrawViewShell->GetPageKind();
meStartEditMode = pDrawViewShell->GetEditMode();
mnStartPageIndex = pDrawViewShell->GetCurPageId() - 1;
}
if (mpView != NULL)
{
mpStartEditedObject = mpView->GetTextEditObject();
if (mpStartEditedObject != NULL)
{
// Try to retrieve current caret position only when there is an
// edited object.
::Outliner* pOutliner =
static_cast<DrawView*>(mpView)->GetTextEditOutliner();
if (pOutliner!=NULL && pOutliner->GetViewCount()>0)
{
OutlinerView* pOutlinerView = pOutliner->GetView(0);
maStartSelection = pOutlinerView->GetSelection();
}
}
}
}
else if (mpViewShell->ISA(OutlineViewShell))
{
// Remember the current cursor position.
OutlinerView* pView = GetView(0);
if (pView != NULL)
pView->GetSelection();
}
else
{
mnStartPageIndex = (USHORT)-1;
}
}
void Outliner::RestoreStartPosition (void)
{
bool bRestore = true;
// Take a negative start page index as inidicator that restoring the
// start position is not requested.
if (mnStartPageIndex == (USHORT)-1 )
bRestore = false;
// Dont't resore when the view shell is not valid.
if (mpViewShell == NULL)
bRestore = false;
if ( ! mbViewShellValid)
bRestore = false;
if (bRestore)
{
if (mpViewShell->ISA(DrawViewShell))
{
::boost::shared_ptr<DrawViewShell> pDrawViewShell (
::boost::dynamic_pointer_cast<DrawViewShell>(mpViewShell));
SetViewMode (meStartViewMode);
if (pDrawViewShell.get() != NULL)
SetPage (meStartEditMode, mnStartPageIndex);
if (mpStartEditedObject != NULL)
{
// Turn on the text toolbar as it is done in FuText so that
// undo manager setting/restoring in
// sd::View::{Beg,End}TextEdit() works on the same view shell.
mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBarShell(
ToolBarManager::TBG_FUNCTION,
RID_DRAW_TEXT_TOOLBOX);
mpView->SdrBeginTextEdit(mpStartEditedObject);
::Outliner* pOutliner =
static_cast<DrawView*>(mpView)->GetTextEditOutliner();
if (pOutliner!=NULL && pOutliner->GetViewCount()>0)
{
OutlinerView* pOutlinerView = pOutliner->GetView(0);
pOutlinerView->SetSelection(maStartSelection);
}
}
}
else if (mpViewShell->ISA(OutlineViewShell))
{
// Set cursor to its old position.
GetView(0)->SetSelection (maStartSelection);
}
}
}
/** The main purpose of this method is to iterate over all shape objects of
the search area (current selection, current view, or whole document)
until a text object has been found that contains at least one match or
until no such object can be found anymore. These two conditions are
expressed by setting one of the flags <member>mbFoundObject</member> or
<member>mbEndOfSearch</member> to <TRUE/>.
*/
void Outliner::ProvideNextTextObject (void)
{
mbEndOfSearch = false;
mbFoundObject = false;
mpView->UnmarkAllObj (mpView->GetSdrPageView());
try
{
mpView->SdrEndTextEdit();
}
catch (::com::sun::star::uno::Exception e)
{
OSL_TRACE ("Outliner %p: caught exception while ending text edit mode", this);
}
SetUpdateMode(FALSE);
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
pOutlinerView->SetOutputArea( Rectangle( Point(), Size(1, 1) ) );
if (meMode == SPELL)
SetPaperSize( Size(1, 1) );
SetText( String(), GetParagraph( 0 ) );
mpTextObj = NULL;
// Iterate until a valid text object has been found or the search ends.
do
{
mpObj = NULL;
mpParaObj = NULL;
if (maObjectIterator != ::sd::outliner::OutlinerContainer(this).end())
{
maCurrentPosition = *maObjectIterator;
// Switch to the current object only if it is a valid text object.
if (IsValidTextObject (maCurrentPosition))
{
mpObj = SetObject (maCurrentPosition);
}
++maObjectIterator;
if (mpObj != NULL)
{
PutTextIntoOutliner ();
if (mpViewShell != NULL)
switch (meMode)
{
case SEARCH:
PrepareSearchAndReplace ();
break;
case SPELL:
PrepareSpellCheck ();
break;
case TEXT_CONVERSION:
PrepareConversion();
break;
}
}
}
else
{
mbEndOfSearch = true;
EndOfSearch ();
}
}
while ( ! (mbFoundObject || mbEndOfSearch));
}
void Outliner::EndOfSearch (void)
{
// Before we display a dialog we first jump to where the last valid text
// object was found. All page and view mode switching since then was
// temporary and should not be visible to the user.
if ( ! mpViewShell->ISA(OutlineViewShell))
SetObject (maLastValidPosition);
if (mbRestrictSearchToSelection)
ShowEndOfSearchDialog ();
else
{
// When no match has been found so far then terminate the search.
if ( ! mbMatchMayExist)
{
ShowEndOfSearchDialog ();
mbEndOfSearch = TRUE;
}
// Ask the user whether to wrap arround and continue the search or
// to terminate.
else if (meMode==TEXT_CONVERSION || ShowWrapArroundDialog ())
{
mbMatchMayExist = false;
// Everything back to beginning (or end?) of the document.
maObjectIterator = ::sd::outliner::OutlinerContainer(this).begin();
if (mpViewShell->ISA(OutlineViewShell))
{
// Set cursor to first character of the document.
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
pOutlinerView->SetSelection (GetSearchStartPosition ());
}
mbEndOfSearch = false;
}
else
{
// No wrap arround.
mbEndOfSearch = true;
}
}
}
void Outliner::InitPage (USHORT nPageIndex)
{
(void)nPageIndex;
::sd::outliner::IteratorPosition aPosition (*maObjectIterator);
if (aPosition.meEditMode == EM_PAGE)
mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind);
else
mnPageCount = mpDrawDocument->GetMasterSdPageCount(aPosition.mePageKind);
}
void Outliner::ShowEndOfSearchDialog (void)
{
String aString;
if (meMode == SEARCH)
{
if (mbStringFound)
aString = String( SdResId(STR_END_SEARCHING) );
else
aString = String( SdResId(STR_STRING_NOTFOUND) );
}
else
{
if (mpView->AreObjectsMarked())
aString = String(SdResId(STR_END_SPELLING_OBJ));
else
aString = String(SdResId(STR_END_SPELLING));
}
// Show the message in an info box that is modal with respect to the
// whole application.
InfoBox aInfoBox (NULL, aString);
ShowModalMessageBox (aInfoBox);
mbWholeDocumentProcessed = true;
}
bool Outliner::ShowWrapArroundDialog (void)
{
bool bDoWrapArround = false;
// Determine whether to show the dialog.
bool bShowDialog = false;
if (mpSearchItem != NULL)
{
// When searching display the dialog only for single find&replace.
USHORT nCommand = mpSearchItem->GetCommand();
bShowDialog = (nCommand==SVX_SEARCHCMD_REPLACE)
|| (nCommand==SVX_SEARCHCMD_FIND);
}
else
// Spell checking needs the dialog, too.
bShowDialog = (meMode == SPELL);
if (bShowDialog)
{
// The question text depends on the search direction.
BOOL bImpress = mpDrawDocument!=NULL
&& mpDrawDocument->GetDocumentType() == DOCUMENT_TYPE_IMPRESS;
USHORT nStringId;
if (mbDirectionIsForward)
nStringId = bImpress
? STR_SAR_WRAP_FORWARD
: STR_SAR_WRAP_FORWARD_DRAW;
else
nStringId = bImpress
? STR_SAR_WRAP_BACKWARD
: STR_SAR_WRAP_BACKWARD_DRAW;
// Pop up question box that asks the user whether to wrap arround.
// The dialog is made modal with respect to the whole application.
QueryBox aQuestionBox (
NULL,
WB_YES_NO | WB_DEF_YES,
String(SdResId(nStringId)));
aQuestionBox.SetImage (QueryBox::GetStandardImage());
USHORT nBoxResult = ShowModalMessageBox(aQuestionBox);
bDoWrapArround = (nBoxResult == BUTTONID_YES);
}
return bDoWrapArround;
}
bool Outliner::IsValidTextObject (const ::sd::outliner::IteratorPosition& rPosition)
{
SdrTextObj* pObject = dynamic_cast< SdrTextObj* >( rPosition.mxObject.get() );
return (pObject != NULL) && pObject->HasText() && ! pObject->IsEmptyPresObj();
}
void Outliner::PutTextIntoOutliner()
{
mpTextObj = dynamic_cast<SdrTextObj*>( mpObj );
if ( mpTextObj && mpTextObj->HasText() && !mpTextObj->IsEmptyPresObj() )
{
SdrText* pText = mpTextObj->getText( mnText );
mpParaObj = pText ? pText->GetOutlinerParaObject() : NULL;
if (mpParaObj != NULL)
{
SetText(*mpParaObj);
ClearModifyFlag();
}
}
else
{
mpTextObj = NULL;
}
}
void Outliner::PrepareSpellCheck (void)
{
EESpellState eState = HasSpellErrors();
DBG_ASSERT(eState != EE_SPELL_NOSPELLER, "No SpellChecker");
if (eState == EE_SPELL_NOLANGUAGE)
{
mbError = TRUE;
mbEndOfSearch = TRUE;
ErrorBox aErrorBox (NULL,
WB_OK,
String(SdResId(STR_NOLANGUAGE)));
ShowModalMessageBox (aErrorBox);
}
else if (eState != EE_SPELL_OK)
{
// When spell checking we have to test whether we have processed the
// whole document and have reached the start page again.
if (meMode == SPELL)
{
if (maSearchStartPosition == ::sd::outliner::Iterator())
// Remember the position of the first text object so that we
// know when we have processed the whole document.
maSearchStartPosition = maObjectIterator;
else if (maSearchStartPosition == maObjectIterator)
{
mbEndOfSearch = true;
}
}
EnterEditMode( FALSE );
}
}
void Outliner::PrepareSearchAndReplace (void)
{
if (HasText( *mpSearchItem ))
{
mbStringFound = true;
mbMatchMayExist = true;
EnterEditMode ();
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
// Start seach at the right end of the current object's text
// depending on the search direction.
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
pOutlinerView->SetSelection (GetSearchStartPosition ());
}
}
void Outliner::SetViewMode (PageKind ePageKind)
{
::boost::shared_ptr<DrawViewShell> pDrawViewShell(
::boost::dynamic_pointer_cast<DrawViewShell>(mpViewShell));
if (pDrawViewShell.get()!=NULL && ePageKind != pDrawViewShell->GetPageKind())
{
// Restore old edit mode.
pDrawViewShell->ChangeEditMode(mpImpl->meOriginalEditMode, FALSE);
SetStatusEventHdl(Link());
::rtl::OUString sViewURL;
switch (ePageKind)
{
case PK_STANDARD:
default:
sViewURL = framework::FrameworkHelper::msImpressViewURL;
break;
case PK_NOTES:
sViewURL = framework::FrameworkHelper::msNotesViewURL;
break;
case PK_HANDOUT:
sViewURL = framework::FrameworkHelper::msHandoutViewURL;
break;
}
// The text object iterator is destroyed when the shells are
// switched but we need it so save it and restore it afterwards.
::sd::outliner::Iterator aIterator (maObjectIterator);
bool bMatchMayExist = mbMatchMayExist;
ViewShellBase& rBase = mpViewShell->GetViewShellBase();
SetViewShell(::boost::shared_ptr<ViewShell>());
framework::FrameworkHelper::Instance(rBase)->RequestView(
sViewURL,
framework::FrameworkHelper::msCenterPaneURL);
// Force (well, request) a synchronous update of the configuration.
// In a better world we would handle the asynchronous view update
// instead. But that would involve major restucturing of the
// Outliner code.
framework::FrameworkHelper::Instance(rBase)->RequestSynchronousUpdate();
SetViewShell(rBase.GetMainViewShell());
// Switching to another view shell has intermediatly called
// EndSpelling(). A PrepareSpelling() is pending, so call that now.
PrepareSpelling();
// Update the number of pages so that
// <member>DetectChange()</member> has the correct value to compare
// to.
mnPageCount = mpDrawDocument->GetSdPageCount(ePageKind);
maObjectIterator = aIterator;
mbMatchMayExist = bMatchMayExist;
// Save edit mode so that it can be restored when switching the view
// shell again.
pDrawViewShell = ::boost::dynamic_pointer_cast<DrawViewShell>(mpViewShell);
OSL_ASSERT(pDrawViewShell.get()!=NULL);
if (pDrawViewShell.get() != NULL)
mpImpl->meOriginalEditMode = pDrawViewShell->GetEditMode();
}
}
void Outliner::SetPage (EditMode eEditMode, USHORT nPageIndex)
{
if ( ! mbRestrictSearchToSelection)
{
::boost::shared_ptr<DrawViewShell> pDrawViewShell(
::boost::dynamic_pointer_cast<DrawViewShell>(mpViewShell));
OSL_ASSERT(pDrawViewShell.get()!=NULL);
if (pDrawViewShell.get() != NULL)
{
pDrawViewShell->ChangeEditMode(eEditMode, FALSE);
pDrawViewShell->SwitchPage(nPageIndex);
}
}
}
void Outliner::EnterEditMode (BOOL bGrabFocus)
{
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (mbViewShellValid && pOutlinerView != NULL)
{
pOutlinerView->SetOutputArea( Rectangle( Point(), Size(1, 1)));
SetPaperSize( mpTextObj->GetLogicRect().GetSize() );
SdrPageView* pPV = mpView->GetSdrPageView();
// Make FuText the current function.
SfxUInt16Item aItem (SID_TEXTEDIT, 1);
mpViewShell->GetDispatcher()->
Execute(SID_TEXTEDIT, SFX_CALLMODE_SYNCHRON |
SFX_CALLMODE_RECORD, &aItem, 0L);
// To be consistent with the usual behaviour in the Office the text
// object that is put into edit mode would have also to be selected.
// Starting the text edit mode is not enough so we do it here by
// hand.
mbExpectingSelectionChangeEvent = true;
mpView->UnmarkAllObj (pPV);
mpView->MarkObj (mpTextObj, pPV);
if( mpTextObj )
mpTextObj->setActiveText( mnText );
// Turn on the edit mode for the text object.
mpView->SdrBeginTextEdit(mpTextObj, pPV, mpWindow, sal_True, this, pOutlinerView, sal_True, sal_True, bGrabFocus);
SetUpdateMode(TRUE);
mbFoundObject = TRUE;
}
}
/*************************************************************************
|*
|* SpellChecker: Error-LinkHdl
|*
\************************************************************************/
IMPL_LINK_INLINE_START( Outliner, SpellError, void *, nLang )
{
mbError = true;
String aError( ::GetLanguageString( (LanguageType)(ULONG)nLang ) );
ErrorHandler::HandleError(* new StringErrorInfo(
ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aError) );
return 0;
}
IMPL_LINK_INLINE_END( Outliner, SpellError, void *, nLang )
ESelection Outliner::GetSearchStartPosition (void)
{
ESelection aPosition;
if (mbDirectionIsForward)
{
// The default constructor uses the beginning of the text as default.
aPosition = ESelection ();
}
else
{
// Retrieve the position after the last character in the last
// paragraph.
USHORT nParagraphCount = static_cast<USHORT>(GetParagraphCount());
if (nParagraphCount == 0)
aPosition = ESelection();
else
{
xub_StrLen nLastParagraphLength = GetEditEngine().GetTextLen (
nParagraphCount-1);
aPosition = ESelection (nParagraphCount-1, nLastParagraphLength);
}
}
return aPosition;
}
bool Outliner::HasNoPreviousMatch (void)
{
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
DBG_ASSERT (pOutlinerView!=NULL, "outline view in Outliner::HasNoPreviousMatch is NULL");
// Detect whether the cursor stands at the beginning
// resp. at the end of the text.
return pOutlinerView->GetSelection().IsEqual(GetSearchStartPosition ()) == TRUE;
}
bool Outliner::HandleFailedSearch (void)
{
bool bContinueSearch = false;
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL && mpSearchItem != NULL)
{
// Detect whether there is/may be a prior match. If there is then
// ask the user whether to wrap arround. Otherwise tell the user
// that there is no match.
if (HasNoPreviousMatch ())
{
// No match found in the whole presentation. Tell the user.
InfoBox aInfoBox (NULL,
String(SdResId(STR_SAR_NOT_FOUND)));
ShowModalMessageBox (aInfoBox);
}
else
{
// No further matches found. Ask the user whether to wrap
// arround and start again.
bContinueSearch = ShowWrapArroundDialog ();
}
}
return bContinueSearch;
}
#if ENABLE_LAYOUT
#define SvxSearchDialog Window
#endif
/** See task #95227# for discussion about correct parent for dialogs/info boxes.
*/
::Window* Outliner::GetParentForDialog (void)
{
::Window* pParent = NULL;
if (meMode == SEARCH)
pParent = static_cast<SvxSearchDialog*>(
SfxViewFrame::Current()->GetChildWindow(
SvxSearchDialogWrapper::GetChildWindowId())->GetWindow());
if (pParent == NULL)
pParent = mpViewShell->GetActiveWindow();
if (pParent == NULL)
pParent = Application::GetDefDialogParent();
//1.30->1.31 of sdoutl.cxx pParent = Application::GetDefModalDialogParent();
return pParent;
}
#if ENABLE_LAYOUT
#undef SvxSearchDialog
#endif
SdrObject* Outliner::SetObject (
const ::sd::outliner::IteratorPosition& rPosition)
{
SetViewMode (rPosition.mePageKind);
SetPage (rPosition.meEditMode, (USHORT)rPosition.mnPageIndex);
mnText = rPosition.mnText;
return rPosition.mxObject.get();
}
void Outliner::SetViewShell (const ::boost::shared_ptr<ViewShell>& rpViewShell)
{
if (mpViewShell != rpViewShell)
{
// Set the new view shell.
mpViewShell = rpViewShell;
// When the outline view is not owned by us then we have to clear
// that pointer so that the current one for the new view shell will
// be used (in ProvideOutlinerView).
// if ( ! mbOwnOutlineView)
// mpOutlineView = NULL;
if (mpViewShell.get() != NULL)
{
mpView = mpViewShell->GetView();
mpWindow = mpViewShell->GetActiveWindow();
mpImpl->ProvideOutlinerView(*this, mpViewShell, mpWindow);
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
pOutlinerView->SetWindow(mpWindow);
}
else
{
mpView = NULL;
mpWindow = NULL;
}
}
}
void Outliner::HandleChangedSelection (void)
{
maMarkListCopy.clear();
mbRestrictSearchToSelection = (mpView->AreObjectsMarked()==TRUE);
if (mbRestrictSearchToSelection)
{
// Make a copy of the current mark list.
const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
ULONG nCount = rMarkList.GetMarkCount();
if (nCount > 0)
{
maMarkListCopy.clear();
maMarkListCopy.reserve (nCount);
for (ULONG i=0; i<nCount; i++)
maMarkListCopy.push_back (rMarkList.GetMark(i)->GetMarkedSdrObj ());
}
else
// No marked object. Is this case possible?
mbRestrictSearchToSelection = false;
}
}
void Outliner::StartConversion( INT16 nSourceLanguage, INT16 nTargetLanguage,
const Font *pTargetFont, INT32 nOptions, BOOL bIsInteractive )
{
BOOL bMultiDoc = mpViewShell->ISA(DrawViewShell);
meMode = TEXT_CONVERSION;
mbDirectionIsForward = true;
mpSearchItem = NULL;
mnConversionLanguage = nSourceLanguage;
BeginConversion();
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
{
pOutlinerView->StartTextConversion(
nSourceLanguage,
nTargetLanguage,
pTargetFont,
nOptions,
bIsInteractive,
bMultiDoc);
}
EndConversion();
}
/** Prepare to do a text conversion on the current text object. This
includes putting it into edit mode.
*/
void Outliner::PrepareConversion (void)
{
SetUpdateMode(sal_True);
if( HasConvertibleTextPortion( mnConversionLanguage ) )
{
SetUpdateMode(sal_False);
mbStringFound = TRUE;
mbMatchMayExist = TRUE;
EnterEditMode ();
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
// Start seach at the right end of the current object's text
// depending on the search direction.
// mpOutlineView->SetSelection (GetSearchStartPosition ());
}
else
{
SetUpdateMode(sal_False);
}
}
void Outliner::BeginConversion (void)
{
SetRefDevice( SD_MOD()->GetRefDevice( *mpDrawDocument->GetDocSh() ) );
ViewShellBase* pBase = PTR_CAST(ViewShellBase, SfxViewShell::Current());
if (pBase != NULL)
SetViewShell (pBase->GetMainViewShell());
if (mpViewShell != NULL)
{
mbStringFound = FALSE;
// Supposed that we are not located at the very beginning/end of the
// document then there may be a match in the document prior/after
// the current position.
mbMatchMayExist = TRUE;
maObjectIterator = ::sd::outliner::Iterator();
maSearchStartPosition = ::sd::outliner::Iterator();
RememberStartPosition();
mpImpl->ProvideOutlinerView(*this, mpViewShell, mpWindow);
HandleChangedSelection ();
}
ClearModifyFlag();
}
void Outliner::EndConversion()
{
EndSpelling();
}
sal_Bool Outliner::ConvertNextDocument()
{
if( mpViewShell && mpViewShell->ISA(OutlineViewShell) )
return false;
mpDrawDocument->GetDocSh()->SetWaitCursor( TRUE );
Initialize ( true );
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
if (pOutlinerView != NULL)
{
mpWindow = mpViewShell->GetActiveWindow();
pOutlinerView->SetWindow(mpWindow);
}
ProvideNextTextObject ();
mpDrawDocument->GetDocSh()->SetWaitCursor( FALSE );
ClearModifyFlag();
// for text conversion we automaticly wrap around one
// time and stop at the start shape
if( mpFirstObj )
{
if( (mnText == 0) && (mpFirstObj == mpObj) )
return false;
}
else
{
mpFirstObj = mpObj;
}
return !mbEndOfSearch;
}
USHORT Outliner::ShowModalMessageBox (Dialog& rMessageBox)
{
// We assume that the parent of the given messge box is NULL, i.e. it is
// modal with respect to the top application window. However, this
// does not affect the search dialog. Therefore we have to lock it here
// while the message box is being shown. We also have to take into
// account that we are called during a spell check and the search dialog
// is not available.
::Window* pSearchDialog = NULL;
SfxChildWindow* pChildWindow = NULL;
switch (meMode)
{
case SEARCH:
pChildWindow = SfxViewFrame::Current()->GetChildWindow(
SvxSearchDialogWrapper::GetChildWindowId());
break;
case SPELL:
pChildWindow = SfxViewFrame::Current()->GetChildWindow(
SpellDialogChildWindow::GetChildWindowId());
break;
case TEXT_CONVERSION:
// There should no messages boxes be displayed while doing the
// hangul hanja conversion.
break;
}
if (pChildWindow != NULL)
pSearchDialog = pChildWindow->GetWindow();
if (pSearchDialog != NULL)
pSearchDialog->EnableInput(FALSE,TRUE);
USHORT nResult = rMessageBox.Execute();
// Unlock the search dialog.
if (pSearchDialog != NULL)
pSearchDialog->EnableInput(TRUE,TRUE);
return nResult;
}
//===== Outliner::Implementation ==============================================
Outliner::Implementation::Implementation (void)
: meOriginalEditMode(EM_PAGE),
mbOwnOutlineView(false),
mpOutlineView(NULL)
{
}
Outliner::Implementation::~Implementation (void)
{
if (mbOwnOutlineView && mpOutlineView!=NULL)
{
mpOutlineView->SetWindow(NULL);
delete mpOutlineView;
mpOutlineView = NULL;
}
}
OutlinerView* Outliner::Implementation::GetOutlinerView ()
{
return mpOutlineView;
}
/** We try to create a new OutlinerView only when there is none available,
either from an OutlinerViewShell or a previous call to
ProvideOutlinerView(). This is necessary to support the spell checker
which can not cope with exchanging the OutlinerView.
*/
void Outliner::Implementation::ProvideOutlinerView (
Outliner& rOutliner,
const ::boost::shared_ptr<ViewShell>& rpViewShell,
::Window* pWindow)
{
if (rpViewShell.get() != NULL)
{
switch (rpViewShell->GetShellType())
{
case ViewShell::ST_DRAW:
case ViewShell::ST_IMPRESS:
case ViewShell::ST_NOTES:
case ViewShell::ST_HANDOUT:
{
// Create a new outline view to do the search on.
bool bInsert = false;
if (mpOutlineView!=NULL && !mbOwnOutlineView)
mpOutlineView = NULL;
if (mpOutlineView == NULL)
{
mpOutlineView = new OutlinerView(&rOutliner, pWindow);
mbOwnOutlineView = true;
bInsert = true;
}
else
mpOutlineView->SetWindow(pWindow);
ULONG nStat = mpOutlineView->GetControlWord();
nStat &= ~EV_CNTRL_AUTOSCROLL;
mpOutlineView->SetControlWord(nStat);
if (bInsert)
rOutliner.InsertView( mpOutlineView );
rOutliner.SetUpdateMode(FALSE);
mpOutlineView->SetOutputArea (Rectangle (Point(), Size(1, 1)));
rOutliner.SetPaperSize( Size(1, 1) );
rOutliner.SetText( String(), rOutliner.GetParagraph( 0 ) );
meOriginalEditMode =
::boost::static_pointer_cast<DrawViewShell>(rpViewShell)->GetEditMode();
}
break;
case ViewShell::ST_OUTLINE:
{
if (mpOutlineView!=NULL && mbOwnOutlineView)
delete mpOutlineView;
mpOutlineView = rOutliner.GetView(0);
mbOwnOutlineView = false;
}
break;
default:
case ViewShell::ST_NONE:
case ViewShell::ST_PRESENTATION:
// Ignored
break;
}
}
}
void Outliner::Implementation::ReleaseOutlinerView (void)
{
if (mbOwnOutlineView)
{
OutlinerView* pView = mpOutlineView;
mpOutlineView = NULL;
mbOwnOutlineView = false;
if (pView != NULL)
{
pView->SetWindow(NULL);
delete pView;
}
}
else
{
mpOutlineView = NULL;
}
}
} // end of namespace sd