921bf4ca35
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.
1878 lines
56 KiB
C++
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
|