diff options
author | Ivo Hinkelmann <ihi@openoffice.org> | 2009-04-21 16:06:18 +0000 |
---|---|---|
committer | Ivo Hinkelmann <ihi@openoffice.org> | 2009-04-21 16:06:18 +0000 |
commit | 0b291919ca3fadb1434a2c0fbf81c9ae64eb38cc (patch) | |
tree | ec8562376d5f802694b555f84f4f4dcfca32ce52 /toolkit/source/layout | |
parent | e16c311aba5e4c9f2ce52b05a113745ac09f9fd6 (diff) |
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.
Diffstat (limited to 'toolkit/source/layout')
-rw-r--r-- | toolkit/source/layout/core/bin.cxx (renamed from toolkit/source/layout/bin.cxx) | 16 | ||||
-rw-r--r-- | toolkit/source/layout/core/bin.hxx (renamed from toolkit/source/layout/bin.hxx) | 21 | ||||
-rw-r--r-- | toolkit/source/layout/core/box-base.cxx (renamed from toolkit/source/layout/box-base.cxx) | 28 | ||||
-rw-r--r-- | toolkit/source/layout/core/box-base.hxx (renamed from toolkit/source/layout/box-base.hxx) | 17 | ||||
-rw-r--r-- | toolkit/source/layout/core/box.cxx (renamed from toolkit/source/layout/box.cxx) | 8 | ||||
-rw-r--r-- | toolkit/source/layout/core/box.hxx (renamed from toolkit/source/layout/box.hxx) | 14 | ||||
-rw-r--r-- | toolkit/source/layout/core/byteseq.cxx (renamed from toolkit/source/layout/byteseq.cxx) | 4 | ||||
-rw-r--r-- | toolkit/source/layout/core/container.cxx (renamed from toolkit/source/layout/container.cxx) | 10 | ||||
-rw-r--r-- | toolkit/source/layout/core/container.hxx (renamed from toolkit/source/layout/container.hxx) | 18 | ||||
-rw-r--r-- | toolkit/source/layout/core/dialogbuttonhbox.cxx (renamed from toolkit/source/layout/dialogbuttonhbox.cxx) | 11 | ||||
-rw-r--r-- | toolkit/source/layout/core/dialogbuttonhbox.hxx (renamed from toolkit/source/layout/dialogbuttonhbox.hxx) | 14 | ||||
-rw-r--r-- | toolkit/source/layout/core/factory.cxx (renamed from toolkit/source/layout/factory.cxx) | 74 | ||||
-rw-r--r-- | toolkit/source/layout/core/factory.hxx (renamed from toolkit/source/layout/factory.hxx) | 10 | ||||
-rw-r--r-- | toolkit/source/layout/core/flow.cxx (renamed from toolkit/source/layout/flow.cxx) | 12 | ||||
-rw-r--r-- | toolkit/source/layout/core/flow.hxx (renamed from toolkit/source/layout/flow.hxx) | 16 | ||||
-rw-r--r-- | toolkit/source/layout/core/helper.cxx | 676 | ||||
-rw-r--r-- | toolkit/source/layout/core/helper.hxx (renamed from toolkit/source/layout/helper.hxx) | 62 | ||||
-rw-r--r-- | toolkit/source/layout/core/import.cxx (renamed from toolkit/source/layout/import.cxx) | 143 | ||||
-rw-r--r-- | toolkit/source/layout/core/import.hxx (renamed from toolkit/source/layout/import.hxx) | 100 | ||||
-rw-r--r-- | toolkit/source/layout/core/localized-string.cxx | 87 | ||||
-rw-r--r-- | toolkit/source/layout/core/localized-string.hxx | 84 | ||||
-rw-r--r-- | toolkit/source/layout/core/makefile.mk (renamed from toolkit/source/layout/makefile.mk) | 13 | ||||
-rw-r--r-- | toolkit/source/layout/core/precompiled_xmlscript.hxx (renamed from toolkit/source/layout/precompiled_xmlscript.hxx) | 4 | ||||
-rw-r--r-- | toolkit/source/layout/core/proplist.cxx (renamed from toolkit/source/layout/proplist.cxx) | 43 | ||||
-rw-r--r-- | toolkit/source/layout/core/proplist.hxx (renamed from toolkit/source/layout/proplist.hxx) | 50 | ||||
-rw-r--r-- | toolkit/source/layout/core/root.cxx (renamed from toolkit/source/layout/root.cxx) | 27 | ||||
-rw-r--r-- | toolkit/source/layout/core/root.hxx (renamed from toolkit/source/layout/root.hxx) | 13 | ||||
-rw-r--r-- | toolkit/source/layout/core/table.cxx (renamed from toolkit/source/layout/table.cxx) | 10 | ||||
-rw-r--r-- | toolkit/source/layout/core/table.hxx (renamed from toolkit/source/layout/table.hxx) | 14 | ||||
-rw-r--r-- | toolkit/source/layout/core/timer.cxx (renamed from toolkit/source/layout/timer.cxx) | 10 | ||||
-rw-r--r-- | toolkit/source/layout/core/timer.hxx (renamed from toolkit/source/layout/timer.hxx) | 10 | ||||
-rw-r--r-- | toolkit/source/layout/core/translate.cxx (renamed from toolkit/source/layout/translate.cxx) | 18 | ||||
-rw-r--r-- | toolkit/source/layout/core/translate.hxx (renamed from toolkit/source/layout/translate.hxx) | 10 | ||||
-rw-r--r-- | toolkit/source/layout/core/vcl.cxx | 70 | ||||
-rw-r--r-- | toolkit/source/layout/core/vcl.hxx | 52 | ||||
-rw-r--r-- | toolkit/source/layout/helper.cxx | 520 | ||||
-rw-r--r-- | toolkit/source/layout/vcl/makefile.mk | 56 | ||||
-rw-r--r-- | toolkit/source/layout/vcl/wbutton.cxx | 685 | ||||
-rw-r--r-- | toolkit/source/layout/vcl/wcontainer.cxx | 270 | ||||
-rw-r--r-- | toolkit/source/layout/vcl/wfield.cxx | 796 | ||||
-rw-r--r-- | toolkit/source/layout/vcl/wrapper.cxx | 1630 | ||||
-rw-r--r-- | toolkit/source/layout/vcl/wrapper.hxx | 153 |
42 files changed, 5002 insertions, 877 deletions
diff --git a/toolkit/source/layout/bin.cxx b/toolkit/source/layout/core/bin.cxx index fa521ca91ca3..390c574c46c6 100644 --- a/toolkit/source/layout/bin.cxx +++ b/toolkit/source/layout/core/bin.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: bin.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -165,6 +165,12 @@ Align::allocateArea( const awt::Rectangle &rArea ) allocateChildAt( mxChild, aChildArea ); } +bool +Align::emptyVisible () +{ + return true; +} + /* MinSize */ MinSize::MinSize() : Bin() @@ -178,6 +184,12 @@ MinSize::MinSize() : Bin() &mnMinHeight ); } +bool +MinSize::emptyVisible () +{ + return true; +} + awt::Size SAL_CALL MinSize::getMinimumSize() throw(uno::RuntimeException) { diff --git a/toolkit/source/layout/bin.hxx b/toolkit/source/layout/core/bin.hxx index fb3991869a6c..23d082076359 100644 --- a/toolkit/source/layout/bin.hxx +++ b/toolkit/source/layout/core/bin.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: bin.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -31,10 +31,10 @@ /* A few simple binary containers */ -#ifndef CORE_BIN_HXX -#define CORE_BIN_HXX +#ifndef LAYOUT_CORE_BIN_HXX +#define LAYOUT_CORE_BIN_HXX -#include "container.hxx" +#include <layout/core/container.hxx> namespace layoutimpl { @@ -75,8 +75,6 @@ public: // css::awt::XLayoutConstrains virtual css::awt::Size SAL_CALL getMinimumSize() throw(css::uno::RuntimeException); - - PROPHELPER_SET_INFO }; // Align gives control over child position on the allocated space. @@ -91,11 +89,11 @@ protected: public: Align(); + bool emptyVisible (); + // css::awt::XLayoutContainer virtual void SAL_CALL allocateArea( const css::awt::Rectangle &rArea ) throw (css::uno::RuntimeException); - - PROPHELPER_SET_INFO }; // Makes child request its or a specified size, whatever is larger. @@ -108,13 +106,12 @@ protected: public: MinSize(); + bool emptyVisible (); // css::awt::XLayoutContainer virtual css::awt::Size SAL_CALL getMinimumSize() throw(css::uno::RuntimeException); - - PROPHELPER_SET_INFO }; } // namespace layoutimpl -#endif /*CORE_BIN_HXX*/ +#endif /* LAYOUT_CORE_BIN_HXX */ diff --git a/toolkit/source/layout/box-base.cxx b/toolkit/source/layout/core/box-base.cxx index 7addc617a511..63cb49901ec4 100644 --- a/toolkit/source/layout/box-base.cxx +++ b/toolkit/source/layout/core/box-base.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: box-base.cxx,v $ + * $RCSfile$ * - * $Revision: 1.2 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -69,9 +69,9 @@ static bool isVisible( uno::Reference< awt::XLayoutConstrains > xWidget ) uno::Sequence< uno::Reference< awt::XLayoutConstrains > > aChildren = xContainer->getChildren(); - // FIXME: <flow> workaround: empty visible containers always visible: - if ( !aChildren.getLength() ) - return true; + if (!aChildren.getLength ()) + if (Container *c = dynamic_cast <Container*> (xWidget.get ())) + return c->emptyVisible (); for ( int i = 0; i < aChildren.getLength(); i++ ) if ( isVisible( aChildren[i] ) ) @@ -88,16 +88,22 @@ bool Box_Base::ChildData::isVisible() return layoutimpl::isVisible( mxChild ); } +void +Box_Base::AddChild (uno::Reference <awt::XLayoutConstrains> const& xChild) +{ + ChildData *pData = createChild (xChild); + maChildren.push_back (pData); + queueResize (); +} + void SAL_CALL -Box_Base::addChild( const uno::Reference< awt::XLayoutConstrains >& xChild ) +Box_Base::addChild (uno::Reference <awt::XLayoutConstrains> const& xChild) throw (uno::RuntimeException, awt::MaxChildrenException) { - if ( xChild.is() ) + if (xChild.is ()) { - ChildData *pData = createChild( xChild ); - maChildren.push_back( pData ); - setChildParent( xChild ); - queueResize(); + AddChild (xChild); + setChildParent (xChild); } } diff --git a/toolkit/source/layout/box-base.hxx b/toolkit/source/layout/core/box-base.hxx index 208b8dd6a537..c4958a303540 100644 --- a/toolkit/source/layout/box-base.hxx +++ b/toolkit/source/layout/core/box-base.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: box-base.hxx,v $ + * $RCSfile$ * - * $Revision: 1.2 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,10 +29,10 @@ * ************************************************************************/ -#ifndef CORE_BOX_BASE_HXX -#define CORE_BOX_BASE_HXX +#ifndef LAYOUT_CORE_BOX_BASE_HXX +#define LAYOUT_CORE_BOX_BASE_HXX -#include "container.hxx" +#include <layout/core/container.hxx> #include <list> @@ -57,7 +57,6 @@ public: struct ChildProps: public PropHelper { //ChildProps( ChildProps* ); - PROPHELPER_SET_INFO }; protected: @@ -70,8 +69,10 @@ protected: ChildData *removeChildData( std::list< ChildData *>, css::uno::Reference< css::awt::XLayoutConstrains > const& Child ); public: + void AddChild( const css::uno::Reference< css::awt::XLayoutConstrains >& Child); + // css::awt::XLayoutContainer - virtual void SAL_CALL addChild( const css::uno::Reference< css::awt::XLayoutConstrains >& Child ) + virtual void SAL_CALL addChild( const css::uno::Reference< css::awt::XLayoutConstrains >& Child) throw (css::uno::RuntimeException, css::awt::MaxChildrenException); virtual void SAL_CALL removeChild( const css::uno::Reference< css::awt::XLayoutConstrains >& Child ) throw (css::uno::RuntimeException); @@ -87,4 +88,4 @@ public: } // namespace layoutimpl -#endif /* CORE_BOX__BASE HXX */ +#endif /* LAYOUT_CORE_BOX_BASE HXX */ diff --git a/toolkit/source/layout/box.cxx b/toolkit/source/layout/core/box.cxx index 6466ab9cd07d..254099d96411 100644 --- a/toolkit/source/layout/box.cxx +++ b/toolkit/source/layout/core/box.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: box.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -65,9 +65,9 @@ Box::ChildData::ChildData( uno::Reference< awt::XLayoutConstrains > const& xChil Box::ChildData* Box::createChild( uno::Reference< awt::XLayoutConstrains > const& xChild ) -{ + { return new ChildData( xChild ); -} + } Box::ChildProps* Box::createChildProps( Box_Base::ChildData *pData ) diff --git a/toolkit/source/layout/box.hxx b/toolkit/source/layout/core/box.hxx index 2b09ede7f357..0c36ce335213 100644 --- a/toolkit/source/layout/box.hxx +++ b/toolkit/source/layout/core/box.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: box.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,10 +29,10 @@ * ************************************************************************/ -#ifndef CORE_BOX_HXX -#define CORE_BOX_HXX +#ifndef LAYOUT_CORE_BOX_HXX +#define LAYOUT_CORE_BOX_HXX -#include "box-base.hxx" +#include <layout/core/box-base.hxx> #include <com/sun/star/awt/Point.hpp> @@ -83,8 +83,6 @@ public: // helper: mix of getMinimumSize() and getHeightForWidth() css::awt::Size calculateSize( long nWidth = 0 ); - PROPHELPER_SET_INFO - private: /* Helpers to deal with the joint Box directions. */ inline int primDim (const css::awt::Size &size) @@ -105,4 +103,4 @@ struct HBox : public Box } // namespace layoutimpl -#endif /* CORE_BOX_HXX */ +#endif /* LAYOUT_CORE_BOX_HXX */ diff --git a/toolkit/source/layout/byteseq.cxx b/toolkit/source/layout/core/byteseq.cxx index a40807100c3b..ffa9852bd303 100644 --- a/toolkit/source/layout/byteseq.cxx +++ b/toolkit/source/layout/core/byteseq.cxx @@ -6,8 +6,8 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: byteseq.cxx,v $ - * $Revision: 1.4 $ + * $RCSfile$ + * $Revision$ * * This file is part of OpenOffice.org. * diff --git a/toolkit/source/layout/container.cxx b/toolkit/source/layout/core/container.cxx index af40af05e36d..5978ae7f04a4 100644 --- a/toolkit/source/layout/container.cxx +++ b/toolkit/source/layout/core/container.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: container.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -50,6 +50,12 @@ Container::Container() setChangeListener( this ); } +bool +Container::emptyVisible () +{ + return false; +} + uno::Any Container::queryInterface( const uno::Type & rType ) throw (uno::RuntimeException) { diff --git a/toolkit/source/layout/container.hxx b/toolkit/source/layout/core/container.hxx index 70ec10c678d2..4dbd61cd398c 100644 --- a/toolkit/source/layout/container.hxx +++ b/toolkit/source/layout/core/container.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: container.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,10 +29,10 @@ * ************************************************************************/ -#ifndef CORE_CONTAINER_HXX -#define CORE_CONTAINER_HXX +#ifndef LAYOUT_CORE_CONTAINER_HXX +#define LAYOUT_CORE_CONTAINER_HXX -#include "helper.hxx" +#include <layout/core/helper.hxx> #include <cppuhelper/implbase2.hxx> #include <com/sun/star/awt/MaxChildrenException.hpp> @@ -44,7 +44,7 @@ namespace css = ::com::sun::star; typedef ::cppu::WeakImplHelper2< css::awt::XLayoutContainer, css::awt::XLayoutConstrains > Container_Base; -class Container : public Container_Base, public PropHelper, public PropHelper::Listener +class TOOLKIT_DLLPUBLIC Container : public Container_Base, public PropHelper, public PropHelper::Listener { friend class ChildProps; protected: @@ -73,6 +73,8 @@ public: Container(); virtual ~Container() {} + virtual bool emptyVisible (); + // XInterface virtual void SAL_CALL acquire() throw() { PropHelper::acquire(); } virtual void SAL_CALL release() throw() { PropHelper::release(); } @@ -129,12 +131,10 @@ public: css::awt::Size SAL_CALL calcAdjustedSize( const css::awt::Size& rNewSize ) throw(css::uno::RuntimeException) { return rNewSize; } -PROPHELPER_SET_INFO - protected: void propertiesChanged(); }; } // namespace layoutimpl -#endif /*CORE_CONTAINER_HXX*/ +#endif /* LAYOUT_CORE_CONTAINER_HXX */ diff --git a/toolkit/source/layout/dialogbuttonhbox.cxx b/toolkit/source/layout/core/dialogbuttonhbox.cxx index 1337b79cce8c..9334ef688135 100644 --- a/toolkit/source/layout/dialogbuttonhbox.cxx +++ b/toolkit/source/layout/core/dialogbuttonhbox.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: dialogbuttonhbox.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -39,13 +39,12 @@ #include "proplist.hxx" #if TEST_LAYOUT && !defined( DBG_UTIL ) -#include <stdio.h> #undef DBG_ERROR -#define DBG_ERROR printf +#define DBG_ERROR OSL_TRACE #undef DBG_ERROR1 -#define DBG_ERROR1 printf +#define DBG_ERROR1 OSL_TRACE #undef DBG_ERROR2 -#define DBG_ERROR2 printf +#define DBG_ERROR2 OSL_TRACE #endif /* TEST_LAYOUT && !DBG_UTIL */ namespace layoutimpl diff --git a/toolkit/source/layout/dialogbuttonhbox.hxx b/toolkit/source/layout/core/dialogbuttonhbox.hxx index 23ea3b2c9c00..26bab6d0602c 100644 --- a/toolkit/source/layout/dialogbuttonhbox.hxx +++ b/toolkit/source/layout/core/dialogbuttonhbox.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: dialogbuttonhbox.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,11 +29,11 @@ * ************************************************************************/ -#ifndef CORE_DIALOGBUTTONHBOX_HXX -#define CORE_DIALOGBUTTONHBOX_HXX +#ifndef LAYOUT_CORE_DIALOGBUTTONHBOX_HXX +#define LAYOUT_CORE_DIALOGBUTTONHBOX_HXX -#include "box.hxx" -#include "flow.hxx" +#include <layout/core/box.hxx> +#include <layout/core/flow.hxx> namespace layoutimpl { @@ -74,4 +74,4 @@ private: } // namespace layoutimpl -#endif /* CORE_DIALOGBUTTONHBOX_HXX */ +#endif /* LAYOUT_CORE_DIALOGBUTTONHBOX_HXX */ diff --git a/toolkit/source/layout/factory.cxx b/toolkit/source/layout/core/factory.cxx index 0e5ce93756f4..3462ba51648d 100644 --- a/toolkit/source/layout/factory.cxx +++ b/toolkit/source/layout/core/factory.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: factory.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -41,52 +41,52 @@ using namespace ::com::sun::star; using namespace layoutimpl; void * SAL_CALL comp_Layout_component_getFactory( const char * pImplName, void * pServiceManager, void * /*registryKey*/ ) -{ - void * pRet = 0; + { + void * pRet = 0; - ::rtl::OUString aImplName( ::rtl::OUString::createFromAscii( pImplName ) ); - uno::Reference< lang::XSingleServiceFactory > xFactory; + ::rtl::OUString aImplName( ::rtl::OUString::createFromAscii( pImplName ) ); + uno::Reference< lang::XSingleServiceFactory > xFactory; - if ( pServiceManager && aImplName.equals( LayoutFactory::impl_staticGetImplementationName() ) ) - xFactory = ::cppu::createOneInstanceFactory( reinterpret_cast< lang::XMultiServiceFactory*>( pServiceManager ), - LayoutFactory::impl_staticGetImplementationName(), - LayoutFactory::impl_staticCreateSelfInstance, - LayoutFactory::impl_staticGetSupportedServiceNames() ); - if ( xFactory.is() ) - { - xFactory->acquire(); - pRet = xFactory.get(); - } + if ( pServiceManager && aImplName.equals( LayoutFactory::impl_staticGetImplementationName() ) ) + xFactory = ::cppu::createOneInstanceFactory( reinterpret_cast< lang::XMultiServiceFactory*>( pServiceManager ), + LayoutFactory::impl_staticGetImplementationName(), + LayoutFactory::impl_staticCreateSelfInstance, + LayoutFactory::impl_staticGetSupportedServiceNames() ); + if ( xFactory.is() ) + { + xFactory->acquire(); + pRet = xFactory.get(); + } - return pRet; -} + return pRet; + } sal_Bool SAL_CALL comp_Layout_component_writeInfo( void * /*serviceManager*/, void * pRegistryKey ) -{ - if ( pRegistryKey ) { - try + if ( pRegistryKey ) { - uno::Reference< registry::XRegistryKey > xKey( reinterpret_cast< registry::XRegistryKey* >( pRegistryKey ) ); - uno::Reference< registry::XRegistryKey > xNewKey; - - xNewKey = xKey->createKey( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/") ) + - LayoutFactory::impl_staticGetImplementationName() + - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "/UNO/SERVICES") ) ); - - const uno::Sequence< ::rtl::OUString > aServices = LayoutFactory::impl_staticGetSupportedServiceNames(); - for ( sal_Int32 i = 0; i < aServices.getLength(); i++ ) - xNewKey->createKey( aServices.getConstArray()[i] ); - - return sal_True; - } - catch (registry::InvalidRegistryException &) + try + { + uno::Reference< registry::XRegistryKey > xKey( reinterpret_cast< registry::XRegistryKey* >( pRegistryKey ) ); + uno::Reference< registry::XRegistryKey > xNewKey; + + xNewKey = xKey->createKey( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/") ) + + LayoutFactory::impl_staticGetImplementationName() + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "/UNO/SERVICES") ) ); + + const uno::Sequence< ::rtl::OUString > aServices = LayoutFactory::impl_staticGetSupportedServiceNames(); + for ( sal_Int32 i = 0; i < aServices.getLength(); i++ ) + xNewKey->createKey( aServices.getConstArray()[i] ); + + return sal_True; + } + catch (registry::InvalidRegistryException &) { OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); } + } + return sal_False; } - return sal_False; -} // Component registration ::rtl::OUString SAL_CALL LayoutFactory::impl_staticGetImplementationName() diff --git a/toolkit/source/layout/factory.hxx b/toolkit/source/layout/core/factory.hxx index 6c7162475e6d..3715b1f7efcb 100644 --- a/toolkit/source/layout/factory.hxx +++ b/toolkit/source/layout/core/factory.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: factory.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,8 +29,8 @@ * ************************************************************************/ -#ifndef FACTORY_HXX_ -#define FACTORY_HXX_ +#ifndef LAYOUT_CORE_FACTORY_HXX +#define LAYOUT_CORE_FACTORY_HXX #include <com/sun/star/lang/XSingleServiceFactory.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -75,4 +75,4 @@ public: }; -#endif /* FACTORY_HXX */ +#endif /* LAYOUT_CORE_FACTORY_HXX */ diff --git a/toolkit/source/layout/flow.cxx b/toolkit/source/layout/core/flow.cxx index 5d53a17ccd4f..7d856de1f714 100644 --- a/toolkit/source/layout/flow.cxx +++ b/toolkit/source/layout/core/flow.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: flow.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -56,6 +56,12 @@ Flow::Flow() &mnSpacing ); } +bool +Flow::emptyVisible () +{ + return true; +} + void SAL_CALL Flow::addChild( const uno::Reference< awt::XLayoutConstrains >& xChild ) throw (uno::RuntimeException, css::awt::MaxChildrenException) @@ -97,7 +103,7 @@ Flow::getChildren() uno::Sequence< uno::Reference< awt::XLayoutConstrains > > children( maChildren.size() ); unsigned int i = 0; for ( std::list< ChildData * >::iterator it = maChildren.begin(); - it != maChildren.end(); it++, i++ ) + it != maChildren.end(); it++, i++ ) children[i] = (*it)->xChild; return children; diff --git a/toolkit/source/layout/flow.hxx b/toolkit/source/layout/core/flow.hxx index de217720315e..d650d61f4e40 100644 --- a/toolkit/source/layout/flow.hxx +++ b/toolkit/source/layout/core/flow.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: flow.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,10 +29,10 @@ * ************************************************************************/ -#ifndef CORE_FLOW_HXX -#define CORE_FLOW_HXX +#ifndef LAYOUT_CORE_FLOW_HXX +#define LAYOUT_CORE_FLOW_HXX -#include "container.hxx" +#include <layout/core/container.hxx> #include <list> @@ -63,6 +63,8 @@ protected: public: Flow(); + bool emptyVisible (); + // css::awt::XLayoutContainer virtual void SAL_CALL addChild( const css::uno::Reference< css::awt::XLayoutConstrains >& Child ) throw (css::uno::RuntimeException, css::awt::MaxChildrenException); @@ -87,8 +89,6 @@ public: virtual sal_Int32 SAL_CALL getHeightForWidth( sal_Int32 nWidth ) throw(css::uno::RuntimeException); -PROPHELPER_SET_INFO - private: // shared between getMinimumSize() and getHeightForWidth() css::awt::Size calculateSize( long nMaxWidth ); @@ -96,4 +96,4 @@ private: } // namespace layoutimpl -#endif /*FLOW_CORE_HXX*/ +#endif /* LAYOUT_FLOW_CORE_HXX */ diff --git a/toolkit/source/layout/core/helper.cxx b/toolkit/source/layout/core/helper.cxx new file mode 100644 index 000000000000..02c10ed9dc2b --- /dev/null +++ b/toolkit/source/layout/core/helper.cxx @@ -0,0 +1,676 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#include "helper.hxx" + +#include <assert.h> +#include <list> +#include <com/sun/star/awt/WindowAttribute.hpp> +#include <com/sun/star/awt/XWindow.hpp> +#include <com/sun/star/awt/VclWindowPeerAttribute.hpp> +#include <toolkit/awt/vclxwindow.hxx> +#include <tools/debug.hxx> + +#include "proplist.hxx" + +#if TEST_LAYOUT && !defined( DBG_UTIL ) +#undef DBG_ERROR +#define DBG_ERROR OSL_TRACE +#undef DBG_ERROR1 +#define DBG_ERROR1 OSL_TRACE +#undef DBG_ERROR2 +#define DBG_ERROR2 OSL_TRACE +#endif /* TEST_LAYOUT && !DBG_UTIL */ + +namespace layoutimpl +{ +using namespace com::sun::star; +using rtl::OUString; + +uno::Reference< awt::XWindowPeer > +getParent( uno::Reference< uno::XInterface > xRef ) +{ + do + { + uno::Reference< awt::XWindowPeer > xPeer( xRef, uno::UNO_QUERY ); + if ( xPeer.is() ) + return xPeer; + + uno::Reference< awt::XLayoutContainer > xCont( xRef, uno::UNO_QUERY ); + if ( xCont.is() ) + xRef = xCont->getParent(); + } + while ( xRef.is() ); + + return uno::Reference< awt::XWindowPeer >(); +} + +#if 0 +static uno::Reference< awt::XWindowPeer > +getToplevel( uno::Reference< uno::XInterface > xRef ) +{ + uno::Reference< awt::XWindowPeer > xTop, i; + while ( ( i = uno::Reference< awt::XWindowPeer >( xRef, uno::UNO_QUERY ) ).is() ) + { + xTop = i; + + uno::Reference< awt::XLayoutContainer > xCont( xRef, uno::UNO_QUERY ); + if ( xCont.is() ) + xRef = xCont->getParent(); + else + xRef = uno::Reference< awt::XWindowPeer >(); + } + + return xTop; +} +#endif + +} + +#include "bin.hxx" +#include "box.hxx" +#include "dialogbuttonhbox.hxx" +#include "flow.hxx" +#include "localized-string.hxx" +#include "table.hxx" + +namespace layoutimpl +{ + +oslModule WidgetFactory::mSfx2Library = 0; +WindowCreator WidgetFactory::mSfx2CreateWidget = 0; + +uno::Reference <awt::XLayoutContainer> WidgetFactory::createContainer (OUString const& name) +{ + uno::Reference< awt::XLayoutContainer > xPeer; + + if ( name.equalsAscii( "hbox" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new HBox() ); + else if ( name.equalsAscii( "vbox" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new VBox() ); + else if ( name.equalsAscii( "table" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new Table() ); + else if ( name.equalsAscii( "flow" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new Flow() ); + else if ( name.equalsAscii( "bin" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new Bin() ); + else if ( name.equalsAscii( "min-size" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new MinSize() ); + else if ( name.equalsAscii( "align" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new Align() ); + else if ( name.equalsAscii( "dialogbuttonhbox" ) ) + xPeer = uno::Reference< awt::XLayoutContainer >( new DialogButtonHBox() ); + + return xPeer; +} + +uno::Reference <awt::XLayoutConstrains> WidgetFactory::toolkitCreateWidget (uno::Reference <awt::XToolkit> xToolkit, uno::Reference <uno::XInterface> xParent, OUString const& name, long properties) +{ + uno::Reference< awt::XLayoutConstrains > xPeer; + bool bToplevel = !xParent.is(); + + // UNO Control Widget + awt::WindowDescriptor desc; + if ( bToplevel ) + desc.Type = awt::WindowClass_TOP; + else + { + desc.Type = awt::WindowClass_SIMPLE; + +#if 0 + // top container -- a wrapper for framewindow -- is de-coupled + // from awt::XWindowPeer. So, getParent() fails at it. + uno::Reference< awt::XWindowPeer > xWinParent = getParent( xParent ); +#else + uno::Reference< awt::XWindowPeer > xWinParent( xParent, uno::UNO_QUERY ); +#endif + assert( xParent.is() ); + assert( xWinParent.is() ); + /* + With the new three layer instarr/rpath feature, when + prepending toolkit/unxlngx6.pro/lib or $SOLARVER/lib to + LD_LIBRARY_PATH, VCLXWindow::GetImplementation returns 0x0 + vclxtoolkit::ImplCreateWindow failing to create any widget; + although it succeeds here. + + While developing, one now must copy libtlx.so to + $OOO_INSTALL_PREFIX/openoffice.org/basis3.0/program/libtklx.so + each time. + */ + VCLXWindow* parentComponent = VCLXWindow::GetImplementation( xWinParent ); + if ( !parentComponent ) + throw uno::RuntimeException( + OUString::createFromAscii( "parent has no implementation" ), + uno::Reference< uno::XInterface >() ); + desc.Parent = xWinParent; + } + + desc.ParentIndex = 0; + // debugging help ... + desc.Bounds.X = 0; + desc.Bounds.Y = 0; + desc.Bounds.Width = 300; + desc.Bounds.Height = 200; + + desc.WindowAttributes = properties; + desc.WindowServiceName = name; + + uno::Reference< awt::XWindowPeer > xWinPeer; + try + { + OSL_TRACE("Asking toolkit: %s", OUSTRING_CSTR( desc.WindowServiceName ) ); + xWinPeer = xToolkit->createWindow( desc ); + if ( !xWinPeer.is() ) + throw uno::RuntimeException( + OUString( RTL_CONSTASCII_USTRINGPARAM( "Cannot create peer" ) ), + uno::Reference< uno::XInterface >() ); + xPeer = uno::Reference< awt::XLayoutConstrains >( xWinPeer, uno::UNO_QUERY ); + } + catch( uno::Exception & ) + { + DBG_ERROR1( "Warning: %s is not a recognized type\n", OUSTRING_CSTR( name ) ); + return uno::Reference< awt::XLayoutConstrains >(); + } + +#if 0 // This shadows the show="false" property and seems otherwise + // unnecessary + + // default to visible, let then people change it on properties + if ( ! bToplevel ) + { + uno::Reference< awt::XWindow> xWindow( xPeer, uno::UNO_QUERY ); + if ( xWindow.is() ) + xWindow->setVisible( true ); + } +#endif + + return xPeer; +} + +uno::Reference< awt::XLayoutConstrains > +WidgetFactory::createWidget (uno::Reference< awt::XToolkit > xToolkit, uno::Reference< uno::XInterface > xParent, OUString const& name, long properties) +{ + uno::Reference< awt::XLayoutConstrains > xPeer; + + xPeer = uno::Reference <awt::XLayoutConstrains> (createContainer (name), uno::UNO_QUERY); + if ( xPeer.is() ) + return xPeer; + + xPeer = implCreateWidget (xParent, name, properties); + if (xPeer.is ()) + return xPeer; + +#define FIXED_INFO 1 +#if FIXED_INFO + OUString tName = name; + // FIXME + if ( name.equalsAscii( "fixedinfo" ) ) + tName = OUString::createFromAscii( "fixedtext" ); + xPeer = toolkitCreateWidget (xToolkit, xParent, tName, properties); +#else + xPeer = toolkitCreateWidget (xToolkit, xParent, name, properties); +#endif + + return xPeer; +} + +PropHelper::PropHelper() : LockHelper() + , cppu::OPropertySetHelper( maBrdcstHelper ) + , pHelper( NULL ) +{ +} + +void +PropHelper::addProp (const char *pName, sal_Int32 nNameLen, rtl_TextEncoding e, + uno::Type aType, void *pPtr) +{ + // this sucks rocks for effiency ... + PropDetails aDetails; + aDetails.aName = rtl::OUString::intern( pName, nNameLen, e ); + aDetails.aType = aType; + aDetails.pValue = pPtr; + maDetails.push_back( aDetails ); +} + +cppu::IPropertyArrayHelper & SAL_CALL +PropHelper::getInfoHelper() +{ + if ( ! pHelper ) + { + uno::Sequence< beans::Property > aProps( maDetails.size() ); + for ( unsigned int i = 0; i < maDetails.size(); i++) + { + aProps[i].Name = maDetails[i].aName; + aProps[i].Type = maDetails[i].aType; + aProps[i].Handle = i; + aProps[i].Attributes = 0; + } + pHelper = new cppu::OPropertyArrayHelper( aProps, false /* fixme: faster ? */ ); + + } + return *pHelper; +} + +sal_Bool SAL_CALL +PropHelper::convertFastPropertyValue( + uno::Any & rConvertedValue, + uno::Any & rOldValue, + sal_Int32 nHandle, + const uno::Any& rValue ) + throw (lang::IllegalArgumentException) +{ + OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); + + // FIXME: no Any::getValue ... + getFastPropertyValue( rOldValue, nHandle ); + if ( rOldValue != rValue ) + { + rConvertedValue = rValue; + return sal_True; // changed + } + else + { + rConvertedValue.clear(); + rOldValue.clear(); + } + return sal_False; +} + + +void SAL_CALL +PropHelper::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, + const uno::Any& rValue ) + throw (uno::Exception) +{ + OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); + + const PropDetails &rInfo = maDetails[ nHandle ]; + + uno_type_assignData( rInfo.pValue, rInfo.aType.getTypeLibType(), + rValue.pData, rValue.pType, + 0, 0, 0 ); + + if ( mpListener ) + mpListener->propertiesChanged(); +} + +void SAL_CALL +PropHelper::getFastPropertyValue( uno::Any& rValue, + sal_Int32 nHandle ) const +{ + OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); + const PropDetails &rInfo = maDetails[ nHandle ]; +#if 0 + switch ( rInfo.aType.getTypeClass() ) + { +#define MAP(classtype,ctype) \ + case uno::TypeClass_##classtype: \ + rValue <<= *(ctype *)(rInfo.pValue); \ + break + MAP( DOUBLE, double ); + MAP( SHORT, sal_Int16 ); + MAP( LONG, sal_Int32 ); + MAP( UNSIGNED_SHORT, sal_uInt16 ); + MAP( UNSIGNED_LONG, sal_uInt32 ); + MAP( STRING, ::rtl::OUString ); + default: + DBG_ERROR( "ERROR: unknown type to map!" ); + break; + } +#undef MAP +#endif + rValue.setValue( rInfo.pValue, rInfo.aType ); +} + +::com::sun::star::uno::Any +PropHelper::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) +{ + return OPropertySetHelper::queryInterface( rType ); +} + +uno::Reference <beans::XPropertySetInfo> SAL_CALL PropHelper::getPropertySetInfo () throw (uno::RuntimeException) +{ + return css::uno::Reference <css::beans::XPropertySetInfo> (createPropertySetInfo (getInfoHelper ())); +} + +} // namespace layoutimpl + +#include <awt/vclxbutton.hxx> +#include <awt/vclxdialog.hxx> +#include <awt/vclxfixedline.hxx> +#include <awt/vclxplugin.hxx> +#include <awt/vclxscroller.hxx> +#include <awt/vclxsplitter.hxx> +#include <awt/vclxtabcontrol.hxx> +#include <awt/vclxtabpage.hxx> +#include <toolkit/awt/vclxtoolkit.hxx> +#include <toolkit/awt/vclxwindow.hxx> +#include <vcl/button.hxx> +#include <vcl/dialog.hxx> +#include <vcl/fixed.hxx> +#include <vcl/tabctrl.hxx> +#include <vcl/tabpage.hxx> +#include <vcl/unohelp.hxx> + +#include <layout/layout.hxx> +#include <toolkit/awt/vclxwindows.hxx> +#include <vcl/lstbox.hxx> +#include <vcl.hxx> + +#include <typeinfo> + +namespace layoutimpl +{ + +uno::Reference <awt::XLayoutConstrains> WidgetFactory::implCreateWidget (uno::Reference <uno::XInterface> xParent, OUString name, long attributes) +{ + Window* parent = 0; + + if (VCLXWindow* parentComponent = VCLXWindow::GetImplementation (xParent)) + parent = parentComponent->GetWindow (); + + VCLXWindow* component = 0; + Window* window = 0; //sfx2CreateWindow (&component, parent, name, attributes); + if (!window) + window = layoutCreateWindow (&component, parent, name, attributes); + + uno::Reference <awt::XLayoutConstrains> reference; + if (window) + { + window->SetCreatedWithToolkit( sal_True ); + if ( component ) + component->SetCreatedWithToolkit( true ); + reference = component; + window->SetComponentInterface( component ); + if ( attributes & awt::WindowAttribute::SHOW ) + window->Show(); + } + + return reference; +} + +extern "C" { static void SAL_CALL thisModule() {} } + +Window* WidgetFactory::sfx2CreateWindow (VCLXWindow** component, Window* parent, OUString const& name, long& attributes) +{ + OSL_TRACE("Asking sfx2: %s", OUSTRING_CSTR (name)); + + if (!mSfx2Library) + { + OUString libraryName = ::vcl::unohelper::CreateLibraryName ("sfx", TRUE); + mSfx2Library = osl_loadModuleRelative (&thisModule, libraryName.pData, SAL_LOADMODULE_DEFAULT); + if (mSfx2Library) + { + OUString functionName (RTL_CONSTASCII_USTRINGPARAM ("CreateWindow")); + mSfx2CreateWidget = (WindowCreator) osl_getFunctionSymbol (mSfx2Library, functionName.pData); + } + } + + if (mSfx2CreateWidget) + return mSfx2CreateWidget (component, name, parent, attributes); + + return 0; +} + +Window* WidgetFactory::layoutCreateWindow (VCLXWindow** component, Window *parent, OUString const& name, long& attributes) +{ + Window* window = 0; + + if (0) + { + ; + } + if ( name.equalsAscii( "dialog" ) ) + { + if ( parent == NULL ) + parent = DIALOG_NO_PARENT; + window = new Dialog( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXDialog(); + + attributes ^= awt::WindowAttribute::SHOW; + } + else if ( name.equalsAscii( "modaldialog" ) ) + { + if ( parent == NULL ) + parent = DIALOG_NO_PARENT; + window = new ModalDialog( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXDialog(); + + attributes ^= awt::WindowAttribute::SHOW; + } + else if ( name.equalsAscii( "modelessdialog" ) ) + { + if ( parent == NULL ) + parent = DIALOG_NO_PARENT; + window = new ModelessDialog (parent, ImplGetWinBits (attributes, 0)); + *component = new layoutimpl::VCLXDialog(); + + attributes ^= awt::WindowAttribute::SHOW; + } + else if ( name.equalsAscii( "sfxdialog" ) ) + { + if ( parent == NULL ) + parent = DIALOG_NO_PARENT; + window = new ClosingDialog (parent, ImplGetWinBits (attributes, 0)); + *component = new layoutimpl::VCLXDialog(); + + attributes ^= awt::WindowAttribute::SHOW; + } + else if ( name.equalsAscii( "sfxmodaldialog" ) ) + { + if ( parent == NULL ) + parent = DIALOG_NO_PARENT; + window = new ClosingModalDialog( parent, + ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXDialog(); + + attributes ^= awt::WindowAttribute::SHOW; + } + else if ( name.equalsAscii( "sfxmodelessdialog" ) ) + { + if ( parent == NULL ) + parent = DIALOG_NO_PARENT; + window = new ClosingModelessDialog (parent, ImplGetWinBits (attributes, 0)); + *component = new layoutimpl::VCLXDialog(); + + attributes ^= awt::WindowAttribute::SHOW; + } + else if ( name.equalsAscii( "tabcontrol" ) ) + { + window = new TabControl( parent, ImplGetWinBits( attributes, WINDOW_TABCONTROL ) ); + *component = new layoutimpl::VCLXTabControl(); + } + else if ( name.equalsAscii( "scroller" ) ) + { + // used FixedImage because I just want some empty non-intrusive widget + window = new FixedImage( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXScroller(); + } + else if ( name.equalsAscii( "hsplitter" ) || name.equalsAscii( "vsplitter" ) ) + { + window = new FixedImage( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXSplitter( name.equalsAscii( "hsplitter" ) ); + } + else if ( name.equalsAscii( "hfixedline" ) || name.equalsAscii( "vfixedline" ) ) + { + WinBits nStyle = ImplGetWinBits( attributes, 0 ); + nStyle ^= WB_HORZ; + if ( name.equalsAscii( "hfixedline" ) ) + nStyle |= WB_HORZ; + else + nStyle |= WB_VERT; + window = new FixedLine( parent, nStyle ); + *component = new layoutimpl::VCLXFixedLine(); + } + else if ( name.equalsAscii( "okbutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXOKButton( window ); + window->SetType (WINDOW_OKBUTTON); + } + else if ( name.equalsAscii( "cancelbutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXCancelButton( window ); + window->SetType (WINDOW_CANCELBUTTON); + } + else if ( name.equalsAscii( "yesbutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXYesButton( window ); + window->SetType (WINDOW_OKBUTTON); + } + else if ( name.equalsAscii( "nobutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + window->SetType (WINDOW_CANCELBUTTON); + *component = new layoutimpl::VCLXNoButton( window ); + } + else if ( name.equalsAscii( "retrybutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXRetryButton( window ); + } + else if ( name.equalsAscii( "ignorebutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXIgnoreButton( window ); + } + else if ( name.equalsAscii( "resetbutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXResetButton( window ); + } + else if ( name.equalsAscii( "applybutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXApplyButton( window ); + } + else if ( name.equalsAscii( "helpbutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXHelpButton( window ); + window->SetType (WINDOW_HELPBUTTON); + } + else if ( name.equalsAscii( "morebutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXMoreButton( window ); + window->SetType (WINDOW_MOREBUTTON); + } + else if ( name.equalsAscii( "advancedbutton" ) ) + { + window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::VCLXAdvancedButton( window ); + } + else if ( name.equalsAscii( "plugin" ) ) + { + window = new Control( parent, ImplGetWinBits( attributes, 0 ) ); +#ifndef __SUNPRO_CC + OSL_TRACE( "%s: parent=%p (%s)\n", __FUNCTION__, parent, typeid( *parent ).name() ); +#endif + *component = new layoutimpl::VCLXPlugin( window, ImplGetWinBits( attributes, 0 ) ); + } + else if ( name.equalsAscii( "tabpage" ) ) + { +#if 0 + if ( !parent ) + parent = layout::TabPage::global_parent; +#else + if (layout::TabPage::global_parent) + parent = layout::TabPage::global_parent; + layout::TabPage::global_parent = 0; +#endif + //window = new TabPage( parent, ImplGetWinBits( attributes, 0 ) ); + attributes ^= awt::WindowAttribute::SHOW; + WinBits nStyle = ImplGetWinBits( attributes, 0 ); + nStyle |= WB_HIDE; + + if (!parent) + { + window = new Dialog( parent, nStyle ); + *component = new VCLXDialog(); + } + else + { + window = new TabPage( parent, nStyle ); + *component = new VCLXTabPage( window ); + } + } + else if ( name.equalsAscii( "string" ) ) + { + // FIXME: move <string>s.text to simple map<string> in root? + attributes &= ~awt::WindowAttribute::SHOW; + window = new Window( parent, ImplGetWinBits( attributes, 0 ) ); + *component = new layoutimpl::LocalizedString(); + } +#if 0 // parent paranoia + else if ( name.equalsAscii( "listbox" ) ) + { + window = new ListBox (parent, ImplGetWinBits (attributes, 0)); + *component = new VCLXListBox (); + } +#endif + else if (name.equalsAscii ("svxfontlistbox") + || name.equalsAscii ("svxlanguagebox")) + { + window = new ListBox (parent, ImplGetWinBits (attributes, 0)); + *component = new VCLXListBox (); + } + return window; +} + +} // namespace layoutimpl + +// Avoid polluting the rest of the code with vcl linkage pieces ... + +#include <vcl/imagerepository.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/graph.hxx> + +namespace layoutimpl +{ + +uno::Reference< graphic::XGraphic > loadGraphic( const char *pName ) +{ + BitmapEx aBmp; + + OUString aStr( pName, strlen( pName ), RTL_TEXTENCODING_ASCII_US ); + if ( aStr.compareToAscii( ".uno:" ) == 0 ) + aStr = aStr.copy( 5 ).toAsciiLowerCase(); + + if ( !vcl::ImageRepository::loadImage( OUString::createFromAscii( pName ), aBmp, true ) ) + return uno::Reference< graphic::XGraphic >(); + + return Graphic( aBmp ).GetXGraphic(); +} + +} // namespace layoutimpl diff --git a/toolkit/source/layout/helper.hxx b/toolkit/source/layout/core/helper.hxx index b4dc7e0d0858..787e4f4132b4 100644 --- a/toolkit/source/layout/helper.hxx +++ b/toolkit/source/layout/core/helper.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: helper.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,8 +29,8 @@ * ************************************************************************/ -#ifndef HELPER_HXX -#define HELPER_HXX +#ifndef LAYOUT_CORE_HELPER_HXX +#define LAYOUT_CORE_HELPER_HXX #include <toolkit/dllapi.h> #include <vector> @@ -39,10 +39,19 @@ #include <com/sun/star/awt/XLayoutContainer.hpp> #include <com/sun/star/awt/XVclWindowPeer.hpp> #include <com/sun/star/xml/input/XRoot.hpp> +#include <com/sun/star/graphic/XGraphic.hpp> #include <cppuhelper/implbase1.hxx> #include <cppuhelper/propshlp.hxx> +#include <osl/module.h> #include <rtl/ustring.hxx> +class Window; +class VCLXWindow; +extern "C" +{ + typedef Window* (SAL_CALL *WindowCreator) (VCLXWindow** component, rtl::OUString const& name, Window* parent, long& attributes); +} + namespace layoutimpl { @@ -97,23 +106,13 @@ public: virtual void SAL_CALL getFastPropertyValue( css::uno::Any& rValue, sal_Int32 nHandle ) const; - // you -must- use this macro in sub-classes that define new properties. - // NB. 'static' ... - // com::sun::star::beans::XMultiPropertySet -#define PROPHELPER_SET_INFO \ - css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL \ - getPropertySetInfo() throw(css::uno::RuntimeException) \ - { \ - static css::uno::Reference< css::beans::XPropertySetInfo > xInfo( \ - createPropertySetInfo( getInfoHelper() ) ); \ - return xInfo; \ - } - PROPHELPER_SET_INFO + virtual css::uno::Reference <css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo () throw (css::uno::RuntimeException); struct Listener { virtual void propertiesChanged() = 0; }; + void setChangeListener( Listener *pListener ) { mpListener = pListener; @@ -131,25 +130,24 @@ css::uno::Any anyFromString (const rtl::OUString &value, const css::uno::Type &t css::uno::Reference< css::awt::XWindowPeer > getParent( css::uno::Reference< css::uno::XInterface > xPeer ); - -struct WidgetFactory +class TOOLKIT_DLLPUBLIC WidgetFactory { - virtual css::uno::Reference< css::awt::XLayoutConstrains > - createWidget( css::uno::Reference< css::awt::XToolkit > xToolkit, - css::uno::Reference< css::uno::XInterface > xParent, - const rtl::OUString &rName, long nProps ); +public: + static oslModule mSfx2Library; + static WindowCreator mSfx2CreateWidget; + + // Should use UNO services in due course + static css::uno::Reference <css::awt::XLayoutConstrains> toolkitCreateWidget (css::uno::Reference <css::awt::XToolkit> xToolkit, css::uno::Reference <css::uno::XInterface> xParent, rtl::OUString const& name, long properties); + static css::uno::Reference< css::awt::XLayoutConstrains > createWidget( css::uno::Reference <css::awt::XToolkit > xToolkit, css::uno::Reference< css::uno::XInterface > xParent, rtl::OUString const &name, long properties); + static css::uno::Reference <css::awt::XLayoutContainer> createContainer (rtl::OUString const& name); + static css::uno::Reference <css::awt::XLayoutConstrains> implCreateWidget (css::uno::Reference <css::uno::XInterface> xParent, rtl::OUString name, long attributes); + static Window* sfx2CreateWindow (VCLXWindow** component, Window* parent, rtl::OUString const& name, long& attributes); + static Window* layoutCreateWindow (VCLXWindow** component, Window *parent, rtl::OUString const& name, long& attributes); }; -// A local factory method - should use UNO services in due course -css::uno::Reference< css::awt::XLayoutConstrains > TOOLKIT_DLLPUBLIC -createWidget( css::uno::Reference< css::awt::XToolkit > xToolkit, - css::uno::Reference< css::uno::XInterface > xParent, - const rtl::OUString &rName, long nProps ); -// Factory for containers (not visible ones) -css::uno::Reference< css::awt::XLayoutContainer > -createContainer( const rtl::OUString &rName ); +css::uno::Reference< css::graphic::XGraphic > loadGraphic( const char *pName ); -} // namespace layoutimpl +} // end namespace layoutimpl -#endif /* HELPER_HXX */ +#endif /* LAYOUT_CORE_HELPER_HXX */ diff --git a/toolkit/source/layout/import.cxx b/toolkit/source/layout/core/import.cxx index 75d4656f2971..dede47ad3ceb 100644 --- a/toolkit/source/layout/import.cxx +++ b/toolkit/source/layout/core/import.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: import.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -35,14 +35,12 @@ #include <com/sun/star/awt/XDialog2.hpp> #include <vcl/image.hxx> #include <tools/debug.hxx> +#include <layout/layout.hxx> #include "root.hxx" #include "helper.hxx" #include "dialogbuttonhbox.hxx" -// Hmm... -#include "layout/layout.hxx" -#include "layout/layoutcore.hxx" #define XMLNS_LAYOUT_URI "http://openoffice.org/2007/layout" #define XMLNS_CONTAINER_URI "http://openoffice.org/2007/layout/container" @@ -99,7 +97,16 @@ SAL_THROW (()) { OUString aTitle; if ( findAndRemove( "title", aProps, aTitle ) ) + { + OSL_TRACE("Setting title: %s", OUSTRING_CSTR( aTitle ) ); xDialog->setTitle( aTitle ); + } + OUString aHelpId; + if ( findAndRemove( "help-id", aProps, aHelpId ) ) + { + OSL_TRACE("Setting help-id: %s", OUSTRING_CSTR( aHelpId ) ); + xDialog->setHelpId( aHelpId.toInt32 () ); + } } // DEBUG: else if ( pParent == NULL ) { @@ -122,32 +129,23 @@ SAL_THROW (()) if ( DialogButtonHBox *b = dynamic_cast<DialogButtonHBox *> ( mpWidget->getPeer().get() ) ) b->setOrdering ( aOrdering ); -#ifdef IMPORT_RADIOGROUP - bool bSetRadioGroup, bSetTitle; - OUString aRadioGroup, aTitle; + bool bSetRadioGroup; + OUString aRadioGroup; bSetRadioGroup = findAndRemove( "radiogroup", aProps, aRadioGroup ); - bSetTitle = findAndRemove( "title", aProps, aTitle ); - setProperties( mxPeer, aProps ); + mpWidget->setProperties( aProps ); // we need to add radio buttons to the group after their properties are // set, so we can check if they should be the one selected by default or not. // And the state changed event isn't fired when changing properties. - if ( bSetRadioGroup ) - { - static int i = 0; - i++; - uno::Reference< awt::XRadioButton > xRadio( mxPeer, uno::UNO_QUERY ); - if ( xRadio.is() ) - pImport->mxRadioGroups.addItem( aRadioGroup, xRadio ); - } - if ( bSetTitle ) + + uno::Reference< awt::XRadioButton > xRadio( mpWidget->getPeer(), uno::UNO_QUERY ); + if ( xRadio.is() ) { - uno::Reference< awt::XDialog2 > xDialog( mxPeer, uno::UNO_QUERY ); - if ( xDialog.is() ) - xDialog->setTitle( aTitle ); + if (!bSetRadioGroup) + aRadioGroup = OUString::createFromAscii ("default"); + pImport->mxRadioGroups.addItem( aRadioGroup, xRadio ); } -#endif } WidgetElement::~WidgetElement() @@ -181,7 +179,7 @@ WidgetElement::startChildElement ( sal_Int32 nUid, OUString const &name, // transex3 hack. void SAL_CALL WidgetElement::characters( OUString const& rChars ) - throw (css::xml::sax::SAXException, css::uno::RuntimeException) + throw (xml::sax::SAXException, uno::RuntimeException) { if ( mpWidget && rChars.trim().getLength() ) { @@ -239,11 +237,104 @@ uno::Reference< xml::input::XElement > ImportContext::startRootElement( uno::Reference< xml::input::XAttributes > const & xAttributes ) throw (xml::sax::SAXException, uno::RuntimeException) { - if (XMLNS_LAYOUT_UID != nUid) + if ( XMLNS_LAYOUT_UID != nUid ) throw xml::sax::SAXException( OUString( RTL_CONSTASCII_USTRINGPARAM( "invalid namespace!" ) ), uno::Reference< uno::XInterface >(), uno::Any() ); - return new ToplevelElement( rLocalName, xAttributes, this ); + return new ToplevelElement( rLocalName, xAttributes, this ); +} + +RadioGroups::RadioGroups() +{ +} + +void RadioGroups::addItem( rtl::OUString id, uno::Reference< awt::XRadioButton > xRadio ) + throw (uno::RuntimeException) +{ + if ( ! xRadio.is() ) + throw uno::RuntimeException(); + + uno::Reference< RadioGroup > group; + RadioGroupsMap::iterator it = mxRadioGroups.find( id ); + if ( it == mxRadioGroups.end() ) + { + group = uno::Reference< RadioGroup > ( new RadioGroup() ); + mxRadioGroups [id] = group; + } + else + group = it->second; + group->addItem( xRadio ); +} + +RadioGroups::RadioGroup::RadioGroup() +{ +} + +void RadioGroups::RadioGroup::addItem( uno::Reference< awt::XRadioButton > xRadio ) +{ + if ( ! mxSelectedRadio.is() ) + { + xRadio->setState( true ); + mxSelectedRadio = xRadio; + } + else if ( xRadio->getState() ) + { +#if 1 + xRadio->setState( false ); +#else // huh, why select last added? + mxSelectedRadio->setState( false ); + mxSelectedRadio = xRadio; +#endif + } + + // TOO late: actionPerformed is called before itemStateChanged. + // If client code (wrongly?) uses actionPerformed, it will see + // the previous RadioButtons' state. + xRadio->addItemListener( this ); + + uno::Reference< awt::XButton > xButton = uno::Reference< awt::XButton > ( xRadio, uno::UNO_QUERY ); + xButton->addActionListener( this ); + + mxRadios.push_back (xRadio); +} + +void RadioGroups::RadioGroup::handleSelected () + throw (uno::RuntimeException) +{ + for ( RadioButtonsList::iterator it = mxRadios.begin(); + it != mxRadios.end(); it++ ) + if ( *it != mxSelectedRadio && (*it)->getState() ) + { + mxSelectedRadio->setState( false ); + mxSelectedRadio = *it; + break; + } +} + +// awt::XItemListener +void RadioGroups::RadioGroup::itemStateChanged( const awt::ItemEvent& e ) + throw (uno::RuntimeException) +{ + // TOO late: actionPerformed is called before itemStateChanged. + // If client code (wrongly?) uses actionPerformed, it will see + // the previous RadioButtons' state. + + // Need this for initialization, though. + if ( e.Selected ) + handleSelected (); +} + +// awt::XActionListener +void RadioGroups::RadioGroup::actionPerformed( const awt::ActionEvent& ) + throw (uno::RuntimeException) +{ + handleSelected (); +} + +// lang::XEventListener +void SAL_CALL RadioGroups::RadioGroup::disposing( const lang::EventObject& ) + throw (uno::RuntimeException) +{ } } // namespace layoutimpl diff --git a/toolkit/source/layout/import.hxx b/toolkit/source/layout/core/import.hxx index 9f32d2263ccf..d72e8a337f56 100644 --- a/toolkit/source/layout/import.hxx +++ b/toolkit/source/layout/core/import.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: import.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,15 +29,19 @@ * ************************************************************************/ -#ifndef IMPORT_HXX -#define IMPORT_HXX +#ifndef LAYOUT_CORE_IMPORT_HXX +#define LAYOUT_CORE_IMPORT_HXX #include <map> #include <list> +#define _BACKWARD_BACKWARD_WARNING_H 1 #include <hash_map> + #include <com/sun/star/xml/input/XRoot.hpp> #include <cppuhelper/implbase1.hxx> +#include <com/sun/star/awt/XButton.hpp> +#include <com/sun/star/awt/XRadioButton.hpp> namespace layoutimpl { @@ -45,94 +49,41 @@ class LayoutRoot; class LayoutWidget; namespace css = ::com::sun::star; -/* blocks under IMPORT_RADIOGROUP are marked for deletion. - The use of it is to synchronize radio buttons into groups. - But toolkit doesn't fire toggle events when toggled from the code. - Another approach is to implement our own XRadioButton from our - internal toolkit. We could have some singleton where they would - register... We would need to add another attribute... -*/ - -#ifdef IMPORT_RADIOGROUP -#include <com/sun/star/awt/XRadioButton.hpp> class RadioGroups { public: - RadioGroups() - { - } + RadioGroups(); void addItem( rtl::OUString id, css::uno::Reference< css::awt::XRadioButton > xRadio ) - throw (css::uno::RuntimeException) - { - if ( ! xRadio.is() ) - throw css::uno::RuntimeException(); - - css::uno::Reference< RadioGroup > group; - RadioGroupsMap::iterator it = mxRadioGroups.find( id ); - if ( it == mxRadioGroups.end() ) - { - group = css::uno::Reference< RadioGroup > ( new RadioGroup() ); - mxRadioGroups [id] = group; - } - else - group = it->second; - group->addItem( xRadio ); - } + throw (css::uno::RuntimeException); private: class RadioGroup : public ::cppu::WeakImplHelper1< css::awt::XItemListener > + , public ::cppu::WeakImplHelper1< css::awt::XActionListener > { public: - RadioGroup() - { - } - - void addItem( css::uno::Reference< css::awt::XRadioButton > xRadio ) - { - if ( ! mxSelectedRadio.is() ) - { - xRadio->setState( true ); - mxSelectedRadio = xRadio; - } - else if ( xRadio->getState() ) - { - mxSelectedRadio->setState( false ); - mxSelectedRadio = xRadio; - } - - xRadio->addItemListener( this ); - mxRadios.push_back (xRadio); - } + RadioGroup(); + void addItem( css::uno::Reference< css::awt::XRadioButton > xRadio ); private: typedef std::list< css::uno::Reference< css::awt::XRadioButton > > RadioButtonsList; RadioButtonsList mxRadios; css::uno::Reference< css::awt::XRadioButton > mxSelectedRadio; + void handleSelected () + throw (css::uno::RuntimeException); + // awt::XItemListener - void itemStateChanged( const com::sun::star::awt::ItemEvent& e) - throw (css::uno::RuntimeException) - { - if ( e.Selected ) - { - mxSelectedRadio->setState( false ); - // the only radio button selected would be the one that fired the event - for ( RadioButtonsList::iterator it = mxRadios.begin(); - it != mxRadios.end(); it++ ) - if ( (*it)->getState() ) - { - mxSelectedRadio = *it; - break; - } - } - } + void SAL_CALL itemStateChanged( const css::awt::ItemEvent& e ) + throw (css::uno::RuntimeException); + + // awt::XActionListener + void SAL_CALL actionPerformed( const css::awt::ActionEvent& e ) + throw (css::uno::RuntimeException); // lang::XEventListener void SAL_CALL disposing( const css::lang::EventObject& ) - throw (css::uno::RuntimeException) - { - } + throw (css::uno::RuntimeException); }; // each RadioGroup will stay alive after RadioGroups die with the ImportContext @@ -140,7 +91,6 @@ private: typedef std::map< rtl::OUString, css::uno::Reference< RadioGroup > > RadioGroupsMap; RadioGroupsMap mxRadioGroups; }; -#endif #if 0 // generator @@ -196,9 +146,7 @@ class ImportContext : public ::cppu::WeakImplHelper1< css::xml::input::XRoot > public: sal_Int32 XMLNS_LAYOUT_UID, XMLNS_CONTAINER_UID; LayoutRoot &mrRoot; // switch to XNameContainer ref ? -#ifdef IMPORT_RADIOGROUP RadioGroups mxRadioGroups; -#endif inline ImportContext( LayoutRoot &rRoot ) SAL_THROW( () ) : mrRoot( rRoot ) {} @@ -312,4 +260,4 @@ public: } // namespace layoutimpl -#endif /* IMPORT_HXX */ +#endif /* LAYOUT_CORE_IMPORT_HXX */ diff --git a/toolkit/source/layout/core/localized-string.cxx b/toolkit/source/layout/core/localized-string.cxx new file mode 100644 index 000000000000..9bc9df372832 --- /dev/null +++ b/toolkit/source/layout/core/localized-string.cxx @@ -0,0 +1,87 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, + * MA 02110-1301 USA + * + ************************************************************************/ + +#include "localized-string.hxx" + +#include <toolkit/helper/property.hxx> +#include <vcl/window.hxx> + +namespace layoutimpl +{ + +namespace css = ::com::sun::star; +using namespace css; +using rtl::OUString; + +LocalizedString::LocalizedString() + : VCLXWindow() +{ +} + +void LocalizedString::ImplGetPropertyIds( std::list< sal_uInt16 > &ids ) +{ + PushPropertyIds( ids, BASEPROPERTY_TEXT, 0); + VCLXWindow::ImplGetPropertyIds( ids ); +} + +// XInterface +uno::Any LocalizedString::queryInterface( uno::Type const& rType ) + throw(uno::RuntimeException) +{ + uno::Any aRet = ::cppu::queryInterface( rType, + SAL_STATIC_CAST( awt::XFixedText*, this ) ); + return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType )); +} + +void LocalizedString::setText( OUString const& s ) + throw(uno::RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + + if ( Window *w = GetWindow() ) + return w->SetText( s ); +} + +OUString LocalizedString::getText() + throw(uno::RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + + if ( Window *w = GetWindow() ) + return w->GetText(); + return OUString(); +} + +} // namespace layoutimpl diff --git a/toolkit/source/layout/core/localized-string.hxx b/toolkit/source/layout/core/localized-string.hxx new file mode 100644 index 000000000000..7c897f2c713d --- /dev/null +++ b/toolkit/source/layout/core/localized-string.hxx @@ -0,0 +1,84 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, + * MA 02110-1301 USA + * + ************************************************************************/ + +#ifndef LAYOUT_CORE_LOCALIZED_STRING_HXX +#define LAYOUT_CORE_LOCALIZED_STRING_HXX + +#include <com/sun/star/awt/XFixedText.hpp> +#include <toolkit/awt/vclxwindow.hxx> + +namespace layoutimpl +{ +namespace css = ::com::sun::star; + +// FIXME: misuse XFixedText interface for simple string +class LocalizedString : public css::awt::XFixedText + , public VCLXWindow +{ +public: + LocalizedString(); + + // css::uno::XInterface + css::uno::Any SAL_CALL queryInterface( css::uno::Type const& rType ) + throw(css::uno::RuntimeException); + void SAL_CALL acquire() throw() { OWeakObject::acquire(); } + void SAL_CALL release() throw() { OWeakObject::release(); } + + // css::awt::XFixedText + void SAL_CALL setText( ::rtl::OUString const& s ) + throw(css::uno::RuntimeException); + ::rtl::OUString SAL_CALL getText() + throw(css::uno::RuntimeException); + void SAL_CALL setAlignment( sal_Int16 ) + throw(css::uno::RuntimeException) { } + sal_Int16 SAL_CALL getAlignment() + throw(css::uno::RuntimeException) { return 0; } + + // css::awt::XLayoutConstrains + virtual css::awt::Size SAL_CALL getMinimumSize() + throw(css::uno::RuntimeException) { return css::awt::Size( 0, 0 ); } + css::awt::Size SAL_CALL getPreferredSize() + throw(css::uno::RuntimeException) { return getMinimumSize(); } + css::awt::Size SAL_CALL calcAdjustedSize( css::awt::Size const& size ) + throw(css::uno::RuntimeException) { return size; } + + static void ImplGetPropertyIds( std::list< sal_uInt16 > &ids ); + virtual void GetPropertyIds( std::list< sal_uInt16 > &ids ) + { return ImplGetPropertyIds( ids ); } +}; + +} // namespace layoutimpl + +#endif /* LAYOUT_CORE_LOCALIZED_STRING_HXX */ diff --git a/toolkit/source/layout/makefile.mk b/toolkit/source/layout/core/makefile.mk index a9b743742117..131be7eb237c 100644 --- a/toolkit/source/layout/makefile.mk +++ b/toolkit/source/layout/core/makefile.mk @@ -6,9 +6,9 @@ # # OpenOffice.org - a multi-platform office productivity suite # -# $RCSfile: makefile.mk,v $ +# $RCSfile$ # -# $Revision: 1.3 $ +# $Revision$ # # This file is part of OpenOffice.org. # @@ -29,9 +29,9 @@ # #************************************************************************* -PRJ=..$/.. +PRJ=../../.. PRJNAME=toolkit -TARGET=layoutcore +TARGET=layout-core ENABLE_EXCEPTIONS=true # --- Settings ----------------------------------------------------- @@ -55,11 +55,14 @@ SLOFILES= \ $(SLO)$/flow.obj \ $(SLO)$/helper.obj \ $(SLO)$/import.obj \ + $(SLO)$/localized-string.obj \ $(SLO)$/proplist.obj \ $(SLO)$/root.obj \ $(SLO)$/table.obj \ $(SLO)$/timer.obj \ - $(SLO)$/translate.obj + $(SLO)$/translate.obj\ + $(SLO)$/vcl.obj\ +# # --- Targets ------------------------------------------------------ diff --git a/toolkit/source/layout/precompiled_xmlscript.hxx b/toolkit/source/layout/core/precompiled_xmlscript.hxx index 0c554b41402a..f8ad22b56678 100644 --- a/toolkit/source/layout/precompiled_xmlscript.hxx +++ b/toolkit/source/layout/core/precompiled_xmlscript.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: precompiled_xmlscript.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * diff --git a/toolkit/source/layout/proplist.cxx b/toolkit/source/layout/core/proplist.cxx index 2d3d1265c0fc..9b154077eaa8 100644 --- a/toolkit/source/layout/proplist.cxx +++ b/toolkit/source/layout/core/proplist.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: proplist.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -39,16 +39,15 @@ #include <com/sun/star/awt/VclWindowPeerAttribute.hpp> #include <tools/debug.hxx> -#include "layout/layoutcore.hxx" +#include "helper.hxx" #if TEST_LAYOUT && !defined( DBG_UTIL ) -#include <stdio.h> #undef DBG_ERROR -#define DBG_ERROR printf +#define DBG_ERROR OSL_TRACE #undef DBG_ERROR1 -#define DBG_ERROR1 printf +#define DBG_ERROR1 OSL_TRACE #undef DBG_ERROR2 -#define DBG_ERROR2 printf +#define DBG_ERROR2 OSL_TRACE #endif /* TEST_LAYOUT && !DBG_UTIL */ namespace layoutimpl @@ -251,18 +250,17 @@ setProperties( uno::Reference< uno::XInterface > const& xPeer, if ( !prophlp::canHandleProps( xPeer ) ) { DBG_ERROR( "Error: setProperties - bad handle ignoring props:\n" ); - PropList::const_iterator cur; - for ( cur = rProps.begin(); cur != rProps.end(); cur++ ) + for ( PropList::const_iterator it = rProps.begin(); it != rProps.end(); + it++ ) { - OString attr = OUStringToOString( cur->first, RTL_TEXTENCODING_UTF8 ); - OString value = OUStringToOString( cur->second, RTL_TEXTENCODING_UTF8 ); + DBG_ERROR2( "%s=%s\n", OUSTRING_CSTR( it->first ), OUSTRING_CSTR( it->second ) ); } return; } - PropList::const_iterator cur; - for ( cur = rProps.begin(); cur != rProps.end(); cur++ ) - setProperty( xPeer, cur->first, cur->second ); + for ( PropList::const_iterator it = rProps.begin(); it != rProps.end(); + it++ ) + setProperty( xPeer, it->first, it->second ); } void @@ -271,7 +269,7 @@ setProperty( uno::Reference< uno::XInterface > const& xPeer, { OUString unoAttr = toUnoNaming( attr ); - OSL_TRACE( "setting %s=%s\n", OUSTRING_CSTR( attr ), OUSTRING_CSTR( value ) ); + OSL_TRACE( "setting %s=%s", OUSTRING_CSTR( attr ), OUSTRING_CSTR( value ) ); // get a Property object beans::Property prop; try @@ -350,7 +348,7 @@ static const AttributesMap attribsMap[] = { "spin", awt::VclWindowPeerAttribute::SPIN, false }, { "vscroll", awt::VclWindowPeerAttribute::VSCROLL, false }, - // cutting on OK, YES_NO_CANCEL and related obscure attributes... + // cutting on OK, YES_NO_CANCEL and related obsite attributes... }; static const int attribsMapLen = sizeof( attribsMap ) / sizeof( AttributesMap ); @@ -382,8 +380,6 @@ long getAttribute( const OUString &rName, bool bTopWindow ) void propsFromAttributes( const uno::Reference<xml::input::XAttributes> & xAttributes, PropList &rProps, sal_Int32 nNamespace ) { - - sal_Int32 nAttrs = xAttributes->getLength(); for ( sal_Int32 i = 0; i < nAttrs; i++ ) { @@ -402,15 +398,16 @@ void propsFromAttributes( const uno::Reference<xml::input::XAttributes> & xAttri bool findAndRemove( const char *pAttr, PropList &rProps, OUString &rValue ) { - PropList::iterator cur; + PropList::iterator it; OUString aName = OUString::createFromAscii( pAttr ); - for ( cur = rProps.begin(); cur != rProps.end(); cur++ ) + for ( it = rProps.begin(); it != rProps.end(); it++ ) { - if ( cur->first.equalsIgnoreAsciiCase( aName ) ) + if ( it->first.equalsIgnoreAsciiCase( aName ) + || it->first.equalsIgnoreAsciiCase( OUString::createFromAscii ("_") + aName ) ) { - rValue = cur->second; - rProps.erase( cur ); + rValue = it->second; + rProps.erase( it ); return true; } } diff --git a/toolkit/source/layout/proplist.hxx b/toolkit/source/layout/core/proplist.hxx index 1e962cdf63c7..27682faf8902 100644 --- a/toolkit/source/layout/proplist.hxx +++ b/toolkit/source/layout/core/proplist.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: proplist.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,14 +29,15 @@ * ************************************************************************/ -#ifndef CORE_PROPLIST_HXX -#define CORE_PROPLIST_HXX +#ifndef LAYOUT_CORE_PROPLIST_HXX +#define LAYOUT_CORE_PROPLIST_HXX -#include <list> +#include <com/sun/star/beans/XPropertySetInfo.hpp> #include <com/sun/star/xml/input/XAttributes.hpp> - +#include <list> #include <rtl/ustring.hxx> - +#include <toolkit/dllapi.h> +\ namespace layoutimpl { @@ -56,10 +57,39 @@ void setProperty( css::uno::Reference< css::uno::XInterface > const& xPeer, long getAttributeProps( PropList &rProps ); bool findAndRemove( const char *pAttr, PropList &rProps, rtl::OUString &rValue); -} +// Helpers - unfortunately VCLXWindows don't implement XPropertySet +// but containers do - these helpers help us to hide this +namespace prophlp +{ + +// can we set properties on this handle ? +bool TOOLKIT_DLLPUBLIC canHandleProps( const css::uno::Reference< css::uno::XInterface > &xRef ); +// if so which properties ? +css::uno::Reference< css::beans::XPropertySetInfo > TOOLKIT_DLLPUBLIC queryPropertyInfo( + const css::uno::Reference< css::uno::XInterface > &xRef ); +// set / get ... +void TOOLKIT_DLLPUBLIC setProperty( const css::uno::Reference< css::uno::XInterface > &xRef, + const rtl::OUString &rName, + css::uno::Any aValue ); +css::uno::Any TOOLKIT_DLLPUBLIC getProperty( const css::uno::Reference< css::uno::XInterface > &xRef, + const rtl::OUString &rName ); +} // namespace prophlp -// Convert a rtl::OUString to a byte string. +} // namespace layoutimpl + + +#if !OUSTRING_CSTR_PARANOIA #define OUSTRING_CSTR( str ) \ rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US ).getStr() +#else + +inline char const* OUSTRING_CSTR( rtl::OUString const& str ) +{ + rtl::OString *leak + = new rtl::OString (rtl::OUStringToOString (str, RTL_TEXTENCODING_ASCII_US)); + return leak->getStr(); +} + +#endif -#endif // CORE_PROPLIST_HXX +#endif /* LAYOUT_CORE_PROPLIST_HXX */ diff --git a/toolkit/source/layout/root.cxx b/toolkit/source/layout/core/root.cxx index 6934c997f1e8..b316fdfc8e9e 100644 --- a/toolkit/source/layout/root.cxx +++ b/toolkit/source/layout/core/root.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: root.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -31,8 +31,7 @@ #include "root.hxx" -#include <assert.h> -#include <stdio.h> +#include <cassert> #include <com/sun/star/awt/WindowAttribute.hpp> #include <com/sun/star/awt/XMessageBox.hpp> @@ -47,7 +46,6 @@ #include "timer.hxx" #include "translate.hxx" - namespace layoutimpl { @@ -102,11 +100,12 @@ void ShowMessageBox( uno::Reference< lang::XMultiServiceFactory > const& xFactor xMessageBox->execute(); //FIXME: exceptions not caught and printed at top level?? //else - printf( "%s\n", OUSTRING_CSTR( aMessage ) ); + //printf( "%s\n", OUSTRING_CSTR( aMessage ) ); } void LayoutRoot::error( OUString const& message ) { + OSL_TRACE( "%s\n", OUSTRING_CSTR( message ) ); ShowMessageBox( mxFactory, mxToolkit, OUString::createFromAscii( "Fatal error" ), message ); @@ -140,7 +139,7 @@ void SAL_CALL LayoutRoot::initialize( const uno::Sequence< uno::Any >& aArgument OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ) ), uno::UNO_QUERY ); OSL_ASSERT( xParser.is() ); - if (! xParser.is() ) + if (! xParser.is()) { throw uno::RuntimeException( OUString::createFromAscii( "cannot create sax-parser component" ), @@ -249,9 +248,9 @@ uno::Sequence< OUString > SAL_CALL LayoutRoot::getElementNames() uno::Sequence< OUString > aNames( maItems.size() ); sal_Int32 nPos = 0; - for ( ItemHash::const_iterator i = maItems.begin(); - i != maItems.end(); i++ ) - aNames[ nPos++ ] = i->first; + for ( ItemHash::const_iterator it = maItems.begin(); + it != maItems.end(); it++ ) + aNames[ nPos++ ] = it->first; return aNames; } @@ -345,9 +344,9 @@ uno::Reference< awt::XLayoutConstrains > LayoutRoot::getToplevel() uno::Reference< awt::XLayoutConstrains > LayoutRoot::getById( OUString id ) { uno::Reference< awt::XLayoutConstrains > rRef = 0; - ItemHash::iterator i = maItems.find( id ); - if ( i != maItems.end() ) - rRef = i->second; + ItemHash::iterator it = maItems.find( id ); + if ( it != maItems.end() ) + rRef = it->second; return rRef; } #endif @@ -363,7 +362,7 @@ LayoutWidget::LayoutWidget( uno::Reference< awt::XToolkit > xToolkit, xParent = uno::Reference< awt::XLayoutContainer >( xContainer->getParent(), uno::UNO_QUERY ); } - mxWidget = createWidget( xToolkit, xParent, unoName, attrbs ); + mxWidget = WidgetFactory::createWidget( xToolkit, xParent, unoName, attrbs ); assert( mxWidget.is() ); mxContainer = uno::Reference< awt::XLayoutContainer >( mxWidget, uno::UNO_QUERY ); } diff --git a/toolkit/source/layout/root.hxx b/toolkit/source/layout/core/root.hxx index 73421dfe4bd2..92824f0d8ada 100644 --- a/toolkit/source/layout/root.hxx +++ b/toolkit/source/layout/core/root.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: root.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,9 +29,10 @@ * ************************************************************************/ -#ifndef CORE_ROOT_HXX -#define CORE_ROOT_HXX +#ifndef LAYOUT_CORE_ROOT_HXX +#define LAYOUT_CORE_ROOT_HXX +#define _BACKWARD_BACKWARD_WARNING_H 1 #include <hash_map> #include <com/sun/star/awt/XLayoutRoot.hpp> @@ -44,7 +45,7 @@ #include <cppuhelper/interfacecontainer.h> #include <toolkit/dllapi.h> -#include "proplist.hxx" +#include <layout/core/proplist.hxx> namespace layoutimpl { @@ -156,4 +157,4 @@ protected: } // namespace layoutimpl -#endif // CORE_ROOT_HXX +#endif /* LAYOUT_CORE_ROOT_HXX */ diff --git a/toolkit/source/layout/table.cxx b/toolkit/source/layout/core/table.cxx index c172f71d5ff1..f8b2639c2258 100644 --- a/toolkit/source/layout/table.cxx +++ b/toolkit/source/layout/core/table.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: table.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -79,7 +79,7 @@ Table::Table() Table::ChildData::ChildData( uno::Reference< awt::XLayoutConstrains > const& xChild ) : Box_Base::ChildData( xChild ) -// , mbExpand( { 0, 1 } ) +// , mbExpand( { 1, 1 } ) , mnColSpan( 1 ) , mnRowSpan( 1 ) , mnLeftCol( 0 ) @@ -87,7 +87,7 @@ Table::ChildData::ChildData( uno::Reference< awt::XLayoutConstrains > const& xCh , mnTopRow( 0 ) , mnBottomRow( 0 ) { - mbExpand[ 0 ] = 0; + mbExpand[ 0 ] = 1; mbExpand[ 1 ] = 1; } @@ -139,7 +139,7 @@ Table::getMinimumSize() throw( uno::RuntimeException ) col = 0; row++; - unsigned int i = col + ( row*mnColsLen ); + unsigned int i = col +( row*mnColsLen ); while ( aTable.size() > i && !aTable[ i ] ) i++; diff --git a/toolkit/source/layout/table.hxx b/toolkit/source/layout/core/table.hxx index eb0d81e9a81b..f4fd70d0a1f9 100644 --- a/toolkit/source/layout/table.hxx +++ b/toolkit/source/layout/core/table.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: table.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,10 +29,10 @@ * ************************************************************************/ -#ifndef TABLE_HXX -#define TABLE_HXX +#ifndef LAYOUT_CORE_TABLE_HXX +#define LAYOUT_CORE_TABLE_HXX -#include "box-base.hxx" +#include <layout/core/box-base.hxx> namespace layoutimpl { @@ -99,10 +99,8 @@ public: virtual sal_Int32 SAL_CALL getHeightForWidth( sal_Int32 /*nWidth*/ ) throw(css::uno::RuntimeException) { return maRequisition.Height; } - - PROPHELPER_SET_INFO }; } // namespace layoutimpl -#endif /*TABLE_HXX*/ +#endif /* LAYOUT_CORE_TABLE_HXX */ diff --git a/toolkit/source/layout/timer.cxx b/toolkit/source/layout/core/timer.cxx index 8104bf79e470..0da0f2c2abee 100644 --- a/toolkit/source/layout/timer.cxx +++ b/toolkit/source/layout/core/timer.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: timer.cxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -101,12 +101,12 @@ public: // 1. remove duplications and children for ( ContainerList::iterator it = mxContainers.begin(); - it != mxContainers.end(); it++ ) + it != mxContainers.end(); it++ ) eraseChildren( it, mxContainers ); // 2. check damage extent for ( ContainerList::iterator it = mxContainers.begin(); - it != mxContainers.end(); it++ ) + it != mxContainers.end(); it++ ) { uno::Reference< awt::XLayoutContainer > xContainer = *it; while ( xContainer->getParent().is() && isContainerDamaged( xContainer ) ) @@ -126,7 +126,7 @@ public: } // 3. force re-calculations - for( ContainerList::iterator it = mxContainers.begin(); + for ( ContainerList::iterator it = mxContainers.begin(); it != mxContainers.end(); it++ ) (*it)->allocateArea( (*it)->getAllocatedArea() ); } diff --git a/toolkit/source/layout/timer.hxx b/toolkit/source/layout/core/timer.hxx index 3cecd48359ab..b1d7c7597b2e 100644 --- a/toolkit/source/layout/timer.hxx +++ b/toolkit/source/layout/core/timer.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: timer.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,8 +29,8 @@ * ************************************************************************/ -#ifndef CORE_TIMER_HXX -#define CORE_TIMER_HXX +#ifndef LAYOUT_CORE_TIMER_HXX +#define LAYOUT_CORE_TIMER_HXX #include <com/sun/star/awt/XLayoutUnit.hpp> #include <cppuhelper/implbase1.hxx> @@ -50,4 +50,4 @@ public: } -#endif /*CORE_TIMER_HXX*/ +#endif /* LAYOUT_CORE_TIMER_HXX */ diff --git a/toolkit/source/layout/translate.cxx b/toolkit/source/layout/core/translate.cxx index 2a39f93c35a9..cca51632557b 100644 --- a/toolkit/source/layout/translate.cxx +++ b/toolkit/source/layout/core/translate.cxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: translate.cxx,v $ + * $RCSfile$ * - * $Revision: 1.4 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -33,7 +33,7 @@ #include <list> #if TEST_LAYOUT -#include <stdio.h> +#include <cstdio> #include "tools/getprocessworkingdir.hxx" #endif @@ -58,13 +58,13 @@ getLocaleSubdirList( lang::Locale const& rLocale ) { std::list<OUString> aSubdirs; aSubdirs.push_front( OUString::createFromAscii( "." ) ); - aSubdirs.push_front( OUString::createFromAscii( "en_US" ) ); + aSubdirs.push_front( OUString::createFromAscii( "en-US" ) ); if ( rLocale.Language.getLength() ) aSubdirs.push_front( rLocale.Language ); if ( rLocale.Country.getLength() ) { OUString aLocaleCountry = rLocale.Language - + OUString::createFromAscii( "_" ) + + OUString::createFromAscii( "-" ) + rLocale.Country; aSubdirs.push_front( aLocaleCountry ); if ( rLocale.Variant.getLength() ) @@ -93,9 +93,7 @@ getFirstExisting( OUString const& aDir, std::list<OUString> const& aSubDirs, i != aSubDirs.end(); i++ ) { String aFile = aDir + aSlash + *i + aSlash + aXMLName; -#if TEST_LAYOUT - printf( "testing: %s\n", OUSTRING_CSTR( aFile ) ); -#endif + OSL_TRACE( "testing: %s", OUSTRING_CSTR( aFile ) ); if ( fileExists( aFile ) ) return aFile; } @@ -129,9 +127,7 @@ readRightTranslation( OUString const& aXMLName ) aXMLFile = getFirstExisting( aXMLDir, aSubdirs, aXMLName ); } -#if TEST_LAYOUT - printf( "FOUND:%s\n", OUSTRING_CSTR ( OUString (aXMLFile) ) ); -#endif /* TEST_LAYOUT */ + OSL_TRACE( "FOUND:%s", OUSTRING_CSTR ( OUString (aXMLFile) ) ); return aXMLFile; } diff --git a/toolkit/source/layout/translate.hxx b/toolkit/source/layout/core/translate.hxx index ca59f5046d29..05043baa4fb6 100644 --- a/toolkit/source/layout/translate.hxx +++ b/toolkit/source/layout/core/translate.hxx @@ -6,9 +6,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: translate.hxx,v $ + * $RCSfile$ * - * $Revision: 1.3 $ + * $Revision$ * * This file is part of OpenOffice.org. * @@ -29,8 +29,8 @@ * ************************************************************************/ -#ifndef CORE_TRANSLATE_HXX -#define CORE_TRANSLATE_HXX +#ifndef LAYOUT_CORE_TRANSLATE_HXX +#define LAYOUT_CORE_TRANSLATE_HXX namespace rtl { class OUString; @@ -41,4 +41,4 @@ namespace layoutimpl ::rtl::OUString readRightTranslation( ::rtl::OUString const& aXMLName ); } // namespace layoutimpl -#endif /* CORE_TRANSLATE_HXX */ +#endif /* LAYOUT_CORE_TRANSLATE_HXX */ diff --git a/toolkit/source/layout/core/vcl.cxx b/toolkit/source/layout/core/vcl.cxx new file mode 100644 index 000000000000..418229351084 --- /dev/null +++ b/toolkit/source/layout/core/vcl.cxx @@ -0,0 +1,70 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#include <vcl.hxx> + +#include <sal/types.h> +#include <vcl/button.hxx> + +static PushButton* get_button (Dialog const* dialog, sal_uInt32 type) +{ + Window* child = dialog->GetWindow (WINDOW_FIRSTCHILD); + while (child) + { + if (child->GetType () == type) + return static_cast <PushButton*> (child); + child = child->GetWindow (WINDOW_NEXT); + } + + return 0; +} + +#define IMPLEMENT_CLOSING_DIALOG(cls)\ + Closing##cls::Closing##cls (Window* parent, WinBits bits)\ + : cls (parent, bits)\ + , mClosing (false)\ + {\ + }\ + BOOL Closing##cls::Close ()\ + {\ + if (mClosing)\ + EndDialog (false);\ + else if (PushButton *cancel = get_button (this, WINDOW_CANCELBUTTON))\ + cancel->Click ();\ + else if (PushButton *ok = get_button (this, WINDOW_OKBUTTON))\ + ok->Click ();\ + mClosing = true;\ + return false;\ + } + +IMPLEMENT_CLOSING_DIALOG (Dialog); +IMPLEMENT_CLOSING_DIALOG (ModelessDialog); +IMPLEMENT_CLOSING_DIALOG (ModalDialog); diff --git a/toolkit/source/layout/core/vcl.hxx b/toolkit/source/layout/core/vcl.hxx new file mode 100644 index 000000000000..d072fa4bf25e --- /dev/null +++ b/toolkit/source/layout/core/vcl.hxx @@ -0,0 +1,52 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#ifndef LAYOUT_CORE_VCL_HXX +#define LAYOUT_CORE_VCL_HXX + +#include <vcl/dialog.hxx> + +#define DECLARE_CLOSING_DIALOG(cls)\ + class Closing##cls : public cls\ + {\ + public:\ + bool mClosing;\ + Closing##cls (Window* parent, WinBits bits);\ + virtual BOOL Close ();\ + } + +DECLARE_CLOSING_DIALOG (Dialog); +DECLARE_CLOSING_DIALOG (ModalDialog); +DECLARE_CLOSING_DIALOG (ModelessDialog); + +#undef DECLARE_CLOSING_DIALOG + +#endif /* LAYOUT_CORE_VCL_HXX */ diff --git a/toolkit/source/layout/helper.cxx b/toolkit/source/layout/helper.cxx deleted file mode 100644 index b03de8394fee..000000000000 --- a/toolkit/source/layout/helper.cxx +++ /dev/null @@ -1,520 +0,0 @@ -/************************************************************************* - * - * 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: helper.cxx,v $ - * - * $Revision: 1.3 $ - * - * 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. - * - ************************************************************************/ - -#include "helper.hxx" - -#include <assert.h> -#include <list> -#include <com/sun/star/awt/WindowAttribute.hpp> -#include <com/sun/star/awt/XWindow.hpp> -#include <com/sun/star/awt/VclWindowPeerAttribute.hpp> -#include <tools/debug.hxx> - -#include "proplist.hxx" -#include "layout/layoutcore.hxx" - -#if TEST_LAYOUT && !defined( DBG_UTIL ) -#include <stdio.h> -#undef DBG_ERROR -#define DBG_ERROR printf -#undef DBG_ERROR1 -#define DBG_ERROR1 printf -#undef DBG_ERROR2 -#define DBG_ERROR2 printf -#endif /* TEST_LAYOUT && !DBG_UTIL */ - -namespace layoutimpl -{ -using namespace com::sun::star; -using rtl::OUString; - -uno::Reference< awt::XWindowPeer > -getParent( uno::Reference< uno::XInterface > xRef ) -{ - do - { - uno::Reference< awt::XWindowPeer > xPeer( xRef, uno::UNO_QUERY ); - if ( xPeer.is() ) - return xPeer; - - uno::Reference< awt::XLayoutContainer > xCont( xRef, uno::UNO_QUERY ); - if ( xCont.is() ) - xRef = xCont->getParent(); - } - while ( xRef.is() ); - - return uno::Reference< awt::XWindowPeer >(); -} - -#if 0 -static uno::Reference< awt::XWindowPeer > -getToplevel( uno::Reference< uno::XInterface > xRef ) -{ - uno::Reference< awt::XWindowPeer > xTop, i; - while ( ( i = uno::Reference< awt::XWindowPeer >( xRef, uno::UNO_QUERY ) ).is() ) - { - xTop = i; - - uno::Reference< awt::XLayoutContainer > xCont( xRef, uno::UNO_QUERY ); - if ( xCont.is() ) - xRef = xCont->getParent(); - else - xRef = uno::Reference< awt::XWindowPeer >(); - } - - return xTop; -} -#endif - -} - -#include "dialogbuttonhbox.hxx" -#include "bin.hxx" -#include "box.hxx" -#include "table.hxx" -#include "flow.hxx" - -namespace layoutimpl -{ - -static uno::Reference< awt::XLayoutConstrains > ImplCreateWindow( - uno::Reference< uno::XInterface > xParent, - OUString aName, long WindowAttributes ); - -uno::Reference< awt::XLayoutContainer > -createContainer( const OUString &rName ) -{ - uno::Reference< awt::XLayoutContainer > xPeer; - - if ( rName.equalsAscii( "hbox" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new HBox() ); - else if ( rName.equalsAscii( "vbox" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new VBox() ); - else if ( rName.equalsAscii( "table" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new Table() ); - else if ( rName.equalsAscii( "flow" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new Flow() ); - else if ( rName.equalsAscii( "bin" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new Bin() ); - else if ( rName.equalsAscii( "min-size" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new MinSize() ); - else if ( rName.equalsAscii( "align" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new Align() ); - else if ( rName.equalsAscii( "dialogbuttonhbox" ) ) - xPeer = uno::Reference< awt::XLayoutContainer >( new DialogButtonHBox() ); - - return xPeer; -} - -static uno::Reference< awt::XLayoutConstrains > -createToolkitWidget( uno::Reference< awt::XToolkit > xToolkit, - uno::Reference< uno::XInterface > xParent, - const OUString &rName, long nProps ) -{ - uno::Reference< awt::XLayoutConstrains > xPeer; - bool bToplevel = !xParent.is(); - - // UNO Control Widget - awt::WindowDescriptor desc; - if ( bToplevel ) - desc.Type = awt::WindowClass_TOP; - else - { - desc.Type = awt::WindowClass_SIMPLE; - - // top container -- a wrapper for framewindow -- is de-coupled - // from awt::XWindowPeer. So, getParent() fails at it. -// uno::Reference< awt::XWindowPeer > xWinParent = getParent( xParent ); - - uno::Reference< awt::XWindowPeer > xWinParent( xParent, uno::UNO_QUERY ); - - assert( xParent.is() ); - assert( xWinParent.is() ); - desc.Parent = xWinParent; - } - - desc.ParentIndex = 0; - // debugging help ... - desc.Bounds.X = 0; - desc.Bounds.Y = 0; - desc.Bounds.Width = 300; - desc.Bounds.Height = 200; - - desc.WindowAttributes = nProps; - desc.WindowServiceName = rName; - - uno::Reference< awt::XWindowPeer > xWinPeer; - try - { -// DBG_ERROR1("Asking toolkit: %s\n", OUSTRING_CSTR( desc.WindowServiceName ) ); - xWinPeer = xToolkit->createWindow( desc ); - if ( !xWinPeer.is() ) - throw uno::RuntimeException( - OUString( RTL_CONSTASCII_USTRINGPARAM( "Cannot create peer" ) ), - uno::Reference< uno::XInterface >() ); - xPeer = uno::Reference< awt::XLayoutConstrains >( xWinPeer, uno::UNO_QUERY ); - } - catch( uno::Exception & ) - { - DBG_ERROR1( "Warning: %s is not a recognized type\n", OUSTRING_CSTR( rName ) ); - return uno::Reference< awt::XLayoutConstrains >(); - } - - // default to visible, let then people change it on properties - if ( ! bToplevel ) - { - uno::Reference< awt::XWindow> xWindow( xPeer, uno::UNO_QUERY ); - if ( xWindow.is() ) - xWindow->setVisible( true ); - } - return xPeer; -} - -uno::Reference< awt::XLayoutConstrains > -createWidget( uno::Reference< awt::XToolkit > xToolkit, - uno::Reference< uno::XInterface > xParent, - const OUString &rName, long nProps ) -{ - uno::Reference< awt::XLayoutConstrains > xPeer; - - xPeer = uno::Reference< awt::XLayoutConstrains >( - createContainer( rName ), uno::UNO_QUERY ); - if ( xPeer.is() ) - return xPeer; - - xPeer = ImplCreateWindow( xParent, rName, nProps ); - if ( xPeer.is() ) - return xPeer; - -#if FIXED_INFO - OUString tName = rName; - // FIXME - if ( rName.equalsAscii( "fixedinfo" ) ) - tName = OUString::createFromAscii( "fixedtext" ); - xPeer = createToolkitWidget( xToolkit, xParent, tName, nProps ); -#else - xPeer = createToolkitWidget( xToolkit, xParent, rName, nProps ); -#endif - return xPeer; -} - -PropHelper::PropHelper() : LockHelper() - , cppu::OPropertySetHelper( maBrdcstHelper ) - , pHelper( NULL ) -{ -} - -void -PropHelper::addProp (const char *pName, sal_Int32 nNameLen, rtl_TextEncoding e, - uno::Type aType, void *pPtr) -{ - // this sucks rocks for effiency ... - PropDetails aDetails; - aDetails.aName = rtl::OUString::intern( pName, nNameLen, e ); - aDetails.aType = aType; - aDetails.pValue = pPtr; - maDetails.push_back( aDetails ); -} - -cppu::IPropertyArrayHelper & SAL_CALL -PropHelper::getInfoHelper() -{ - if ( ! pHelper ) - { - uno::Sequence< beans::Property > aProps( maDetails.size() ); - for ( unsigned int i = 0; i < maDetails.size(); i++) - { - aProps[i].Name = maDetails[i].aName; - aProps[i].Type = maDetails[i].aType; - aProps[i].Handle = i; - aProps[i].Attributes = 0; - } - pHelper = new cppu::OPropertyArrayHelper( aProps, false /* fixme: faster ? */ ); - - } - return *pHelper; -} - -sal_Bool SAL_CALL -PropHelper::convertFastPropertyValue( - uno::Any & rConvertedValue, - uno::Any & rOldValue, - sal_Int32 nHandle, - const uno::Any& rValue ) - throw (lang::IllegalArgumentException) -{ - OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); - - // FIXME: no Any::getValue ... - getFastPropertyValue( rOldValue, nHandle ); - if ( rOldValue != rValue ) - { - rConvertedValue = rValue; - return sal_True; // changed - } - else - { - rConvertedValue.clear(); - rOldValue.clear(); - } - return sal_False; -} - - -void SAL_CALL -PropHelper::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, - const uno::Any& rValue ) - throw (uno::Exception) -{ - OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); - - const PropDetails &rInfo = maDetails[ nHandle ]; - - uno_type_assignData( rInfo.pValue, rInfo.aType.getTypeLibType(), - rValue.pData, rValue.pType, - 0, 0, 0 ); - - if ( mpListener ) - mpListener->propertiesChanged(); -} - -void SAL_CALL -PropHelper::getFastPropertyValue( uno::Any& rValue, - sal_Int32 nHandle ) const -{ - OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); - const PropDetails &rInfo = maDetails[ nHandle ]; -#if 0 - switch ( rInfo.aType.getTypeClass() ) - { -#define MAP(classtype,ctype) \ - case uno::TypeClass_##classtype: \ - rValue <<= *(ctype *)(rInfo.pValue); \ - break - MAP( DOUBLE, double ); - MAP( SHORT, sal_Int16 ); - MAP( LONG, sal_Int32 ); - MAP( UNSIGNED_SHORT, sal_uInt16 ); - MAP( UNSIGNED_LONG, sal_uInt32 ); - MAP( STRING, ::rtl::OUString ); - default: - DBG_ERROR( "ERROR: unknown type to map!" ); - break; - } -#undef MAP -#endif - rValue.setValue( rInfo.pValue, rInfo.aType ); -} - -::com::sun::star::uno::Any -PropHelper::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) -{ - return OPropertySetHelper::queryInterface( rType ); -} - -} // namespace layoutimpl - -#include <awt/vclxbutton.hxx> -#include <awt/vclxdialog.hxx> -#include <awt/vclxfixedline.hxx> -#include <awt/vclxscroller.hxx> -#include <awt/vclxsplitter.hxx> -#include <awt/vclxtabcontrol.hxx> -#include <toolkit/awt/vclxtoolkit.hxx> -#include <toolkit/awt/vclxwindow.hxx> -#include <vcl/button.hxx> -#include <vcl/dialog.hxx> -#include <vcl/fixed.hxx> -#include <vcl/tabctrl.hxx> -#include <vcl/tabpage.hxx> - - -///#include <svtools/prgsbar.hxx> - -namespace layoutimpl -{ - -uno::Reference< awt::XLayoutConstrains > ImplCreateWindow( - uno::Reference< uno::XInterface > xParent, - OUString aName, long WindowAttributes ) -{ - VCLXWindow *pNewComp = NULL; - Window *pNewWindow = NULL; - Window *pParent = NULL; - uno::Reference< awt::XLayoutConstrains > xRef; - - VCLXWindow* pParentComponent = VCLXWindow::GetImplementation( xParent ); - if ( pParentComponent ) - pParent = pParentComponent->GetWindow(); - - if ( aName.equalsAscii( "dialog" ) ) - { - if ( pParent == NULL ) - pParent = DIALOG_NO_PARENT; - pNewWindow = new Dialog( pParent, - ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXDialog(); - - WindowAttributes ^= awt::WindowAttribute::SHOW; - } - else if ( aName.equalsAscii( "modaldialog" ) ) - { - if ( pParent == NULL ) - pParent = DIALOG_NO_PARENT; - pNewWindow = new ModalDialog( pParent, - ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXDialog(); - - WindowAttributes ^= awt::WindowAttribute::SHOW; - } - else if ( aName.equalsAscii( "tabcontrol" ) ) - { - pNewWindow = new TabControl( pParent, - ImplGetWinBits( WindowAttributes, WINDOW_TABCONTROL ) ); - pNewComp = new layoutimpl::VCLXTabControl(); - } - else if ( aName.equalsAscii( "scroller" ) ) - { - // used FixedImage because I just want some empty non-intrusive widget - pNewWindow = new FixedImage( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXScroller(); - } - else if ( aName.equalsAscii( "hsplitter" ) || aName.equalsAscii( "vsplitter" ) ) - { - pNewWindow = new FixedImage( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXSplitter( aName.equalsAscii( "hsplitter" ) ); - } - else if ( aName.equalsAscii( "hfixedline" ) || aName.equalsAscii( "vfixedline" ) ) - { - WinBits nStyle = ImplGetWinBits( WindowAttributes, 0 ); - nStyle ^= WB_HORZ; - if ( aName.equalsAscii( "hfixedline" ) ) - nStyle |= WB_HORZ; - else - nStyle |= WB_VERT; - pNewWindow = new FixedLine( pParent, nStyle ); - pNewComp = new layoutimpl::VCLXFixedLine(); - } - else if ( aName.equalsAscii( "okbutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXOKButton( pNewWindow ); - } - else if ( aName.equalsAscii( "cancelbutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXCancelButton( pNewWindow ); - } - else if ( aName.equalsAscii( "yesbutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXYesButton( pNewWindow ); - } - else if ( aName.equalsAscii( "nobutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXNoButton( pNewWindow ); - } - else if ( aName.equalsAscii( "retrybutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXRetryButton( pNewWindow ); - } - else if ( aName.equalsAscii( "ignorebutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXIgnoreButton( pNewWindow ); - } - else if ( aName.equalsAscii( "resetbutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXResetButton( pNewWindow ); - } - else if ( aName.equalsAscii( "applybutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXApplyButton( pNewWindow ); - } - else if ( aName.equalsAscii( "helpbutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXHelpButton( pNewWindow ); - } - else if ( aName.equalsAscii( "morebutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXMoreButton( pNewWindow ); - } - else if ( aName.equalsAscii( "advancedbutton" ) ) - { - pNewWindow = new PushButton( pParent, ImplGetWinBits( WindowAttributes, 0 ) ); - pNewComp = new layoutimpl::VCLXAdvancedButton( pNewWindow ); - } - - if ( !pNewWindow ) - return xRef; - - pNewWindow->SetCreatedWithToolkit( sal_True ); - pNewComp->SetCreatedWithToolkit( TRUE ); - xRef = pNewComp; - pNewWindow->SetComponentInterface( pNewComp ); - if ( WindowAttributes & awt::WindowAttribute::SHOW ) - pNewWindow->Show(); - - return xRef; -} - -} // namespace layoutimpl - -// Avoid polluting the rest of the code with vcl linkage pieces ... - -#include <vcl/imagerepository.hxx> -#include <vcl/bitmapex.hxx> -#include <vcl/graph.hxx> - -namespace layoutimpl -{ - -uno::Reference< graphic::XGraphic > loadGraphic( const char *pName ) -{ - BitmapEx aBmp; - - OUString aStr( pName, strlen( pName ), RTL_TEXTENCODING_ASCII_US ); - if ( aStr.compareToAscii( ".uno:" ) == 0 ) - aStr = aStr.copy( 5 ).toAsciiLowerCase(); - - if ( !vcl::ImageRepository::loadImage( OUString::createFromAscii( pName ), aBmp, true ) ) - return uno::Reference< graphic::XGraphic >(); - - return Graphic( aBmp ).GetXGraphic(); -} - -} // namespace layoutimpl diff --git a/toolkit/source/layout/vcl/makefile.mk b/toolkit/source/layout/vcl/makefile.mk new file mode 100644 index 000000000000..a6cc754efa1b --- /dev/null +++ b/toolkit/source/layout/vcl/makefile.mk @@ -0,0 +1,56 @@ +#************************************************************************* +# +# 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$ +# +# $Revision$ +# +# 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. +# +#************************************************************************* + +PRJ=../../.. +PRJNAME=toolkit +TARGET=layout-vcl +ENABLE_EXCEPTIONS=true + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/makefile.pmk + +.IF "$(COMNAME)" == "gcc3" +CFLAGS+=-Wall -fno-default-inline +.ENDIF + +# --- Files -------------------------------------------------------- + +SLOFILES= \ + $(SLO)$/wrapper.obj \ + $(SLO)$/wbutton.obj \ + $(SLO)$/wcontainer.obj \ + $(SLO)$/wfield.obj + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/toolkit/source/layout/vcl/wbutton.cxx b/toolkit/source/layout/vcl/wbutton.cxx new file mode 100644 index 000000000000..0b8b41299315 --- /dev/null +++ b/toolkit/source/layout/vcl/wbutton.cxx @@ -0,0 +1,685 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#include "wrapper.hxx" + +#include <com/sun/star/awt/PosSize.hpp> +#include <com/sun/star/awt/XActionListener.hpp> +#include <com/sun/star/awt/XButton.hpp> +#include <com/sun/star/awt/XCheckBox.hpp> +#include <com/sun/star/awt/XRadioButton.hpp> +#include <com/sun/star/graphic/XGraphic.hpp> +#include <cppuhelper/implbase1.hxx> +#include <toolkit/awt/vclxwindow.hxx> +#include <toolkit/awt/vclxwindows.hxx> +#include <toolkit/helper/convert.hxx> +#include <vcl/button.hxx> +#include <vcl/event.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/svapp.hxx> +#include <vcl/window.hxx> + +#include <list> + +#include <layout/core/helper.hxx> + +using namespace ::com::sun::star; + +using rtl::OUString; + +namespace layout +{ + +class ImageImpl +{ + public: + uno::Reference< graphic::XGraphic > mxGraphic; + ImageImpl( const char *pName ) + : mxGraphic( layoutimpl::loadGraphic( pName ) ) + { + if ( !mxGraphic.is() ) + { + DBG_ERROR1( "ERROR: failed to load image: `%s'\n", pName ); + } + } +}; + +Image::Image( const char *pName ) + : pImpl( new ImageImpl( pName ) ) +{ +} + +Image::~Image() +{ + delete pImpl; +} + +class ButtonImpl : public ControlImpl + , public ::cppu::WeakImplHelper1< awt::XActionListener > +{ + Link maClickHdl; + +public: + uno::Reference< awt::XButton > mxButton; + ButtonImpl( Context *context, const PeerHandle &peer, Window *window ) + : ControlImpl( context, peer, window ) + , mxButton( peer, uno::UNO_QUERY ) + { + /* We have default action when clicked, always listen. */ + mxButton->addActionListener( this ); + } + + ~ButtonImpl() + { + } + + virtual void Click() { /* make me pure virtual? */ }; + + Link& GetClickHdl () + { + return maClickHdl; + } + + virtual void SetClickHdl( Link const& link ) + { + maClickHdl = link; + } + + void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) + { + mxButton->removeActionListener( this ); + ControlImpl::disposing (e); + mxButton.clear (); + } + + virtual void SAL_CALL actionPerformed( const awt::ActionEvent& ) + throw (uno::RuntimeException) + { + if ( !maClickHdl ) + Click(); + else + maClickHdl.Call( static_cast<Window *>( mpWindow ) ); + } + + bool SetModeImage( uno::Reference< graphic::XGraphic > xGraph ) + { + setProperty( "Graphic", uno::Any( xGraph ) ); + return true; + } +}; + +Button::~Button () +{ +} + +String Button::GetStandardText (sal_uInt16 button_type) +{ + return ::Button::GetStandardText (button_type); +} + +void Button::SetText( OUString const& rStr ) +{ + if ( !getImpl().mxButton.is() ) + return; + getImpl().mxButton->setLabel( rStr ); +} + +void Button::SetClickHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxButton.is ()) + getImpl().SetClickHdl( link ); +} + +Link& Button::GetClickHdl () +{ + return getImpl().GetClickHdl (); +} + +bool Button::SetModeImage (Image const& image) +{ + return getImpl().SetModeImage (image.getImpl().mxGraphic); +} + +bool Button::SetModeImage (::Image const& image, BmpColorMode mode) +{ + return GetButton ()->SetModeImage (image, mode); +} + +void Button::SetImageAlign( ImageAlign eAlign ) +{ + getImpl().setProperty( "ImageAlign", uno::Any( (sal_Int16) eAlign ) ); +} + +void Button::Click() +{ +} + +IMPL_GET_IMPL( Button ); +IMPL_CONSTRUCTORS( Button, Control, "button" ); +IMPL_GET_WINDOW (Button); + +class PushButtonImpl : public ButtonImpl + , public ::cppu::WeakImplHelper1< awt::XItemListener > +{ + Link maToggleHdl; +public: + PushButtonImpl( Context *context, const PeerHandle &peer, Window *window ) + : ButtonImpl( context, peer, window ) + { + } + + void SetToggleHdl( const Link& link ) + { + // XButton doesn't have an explicit event for Toggle. Anyway, it is a + // superset of the clicks: all clicks, and explicit toggles + if (!link && !!maToggleHdl) + mxButton->removeActionListener( this ); + else if (!!link && !maToggleHdl) + mxButton->addActionListener( this ); + maToggleHdl = link; + } + void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) + { + ButtonImpl::disposing (e); + } + virtual void SAL_CALL actionPerformed( awt::ActionEvent const& e ) + throw (uno::RuntimeException) + { + ButtonImpl::actionPerformed( e ); + fireToggle(); + } + virtual void SAL_CALL itemStateChanged( const awt::ItemEvent& ) + throw (uno::RuntimeException) + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } + void fireToggle() + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } + +}; + +PushButton::~PushButton () +{ + SetToggleHdl (Link ()); +} + +void PushButton::Check( bool bCheck ) +{ + getImpl().setProperty( "State", uno::Any( (sal_Int16) !!bCheck ) ); + // XButton doesn't have explicit toggle event + getImpl().fireToggle(); +} + +bool PushButton::IsChecked() const +{ + return !!( getImpl().getProperty( "State" ).get< sal_Int16 >() ); +} + +void PushButton::Toggle() +{ + Check( true ); +} + +void PushButton::SetToggleHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxButton.is ()) + getImpl().SetToggleHdl( link ); +} + +IMPL_GET_IMPL( PushButton ); +IMPL_CONSTRUCTORS( PushButton, Button, "pushbutton" ); +IMPL_GET_WINDOW (PushButton); + +class RadioButtonImpl : public ButtonImpl + , public ::cppu::WeakImplHelper1< awt::XItemListener > +{ + Link maToggleHdl; +public: + uno::Reference< awt::XRadioButton > mxRadioButton; + RadioButtonImpl( Context *context, const PeerHandle &peer, Window *window ) + : ButtonImpl( context, peer, window ) + , mxRadioButton( peer, uno::UNO_QUERY ) + { + } + + void Check( bool bCheck ) + { + if ( !mxRadioButton.is() ) + return; + +#if 1 + // Have setState fire item event for + // RadioGroups::RadioGroup::itemStateChanged () + ::RadioButton *r = static_cast<RadioButton*>(mpWindow)->GetRadioButton (); + bool state = r->IsRadioCheckEnabled (); + r->EnableRadioCheck(); + mxRadioButton->setState( !!bCheck ); + r->EnableRadioCheck (state); +#else + mxRadioButton->setState( !!bCheck ); +#endif + fireToggle(); + } + + bool IsChecked() + { + if ( !mxRadioButton.is() ) + return false; + return mxRadioButton->getState(); + } + + void SetToggleHdl( const Link& link ) + { + if (!link && !!maToggleHdl) + mxRadioButton->removeItemListener( this ); + else if (!!link && !maToggleHdl) + mxRadioButton->addItemListener( this ); + maToggleHdl = link; + } + + inline void fireToggle() + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } + + virtual void SetClickHdl( const Link& link ) + { + // Keep RadioGroups::RadioGroup's actionListener at HEAD + // of list. This way, it can handle RadioGroup's button + // states before all other callbacks and make sure the + // client code has the right state. + + // IWBN to add an XRadioButton2 and layout::VCLXRadioButton + // with {get,set}RadioGroup() (and a "radiogroup" property + // even) and handle the grouping here in RadioButtonImpl. + uno::Reference< uno::XInterface > x = static_cast<VCLXRadioButton*> (mpWindow->GetVCLXWindow ())->getFirstActionListener (); + uno::Reference< awt::XActionListener > a = uno::Reference< awt::XActionListener> (x ,uno::UNO_QUERY ); + mxButton->removeActionListener (a); + ButtonImpl::SetClickHdl (link); + mxButton->addActionListener (a); + } + + void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) + { + ButtonImpl::disposing (e); + } + + virtual void SAL_CALL itemStateChanged( const awt::ItemEvent& ) + throw (uno::RuntimeException) + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } +}; + +RadioButton::~RadioButton () +{ + SetToggleHdl (Link ()); +} + +void RadioButton::Check( bool bCheck ) +{ + getImpl().Check( bCheck ); +} + +bool RadioButton::IsChecked() const +{ + return getImpl().IsChecked(); +} + +void RadioButton::SetToggleHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxRadioButton.is ()) + getImpl().SetToggleHdl( link ); +} + +IMPL_GET_IMPL( RadioButton ); +IMPL_GET_WINDOW( RadioButton ); +IMPL_GET_VCLXWINDOW( RadioButton ); +IMPL_CONSTRUCTORS( RadioButton, Button, "radiobutton" ); + +class CheckBoxImpl : public ButtonImpl + , public ::cppu::WeakImplHelper1< awt::XItemListener > +{ + Link maToggleHdl; + public: + uno::Reference< awt::XCheckBox > mxCheckBox; + CheckBoxImpl( Context *context, const PeerHandle &peer, Window *window ) + : ButtonImpl( context, peer, window ) + , mxCheckBox( peer, uno::UNO_QUERY ) + { + } + + void SetToggleHdl( const Link& link ) + { + if (!link && !!maToggleHdl) + mxCheckBox->removeItemListener( this ); + else if (!!link && !maToggleHdl) + mxCheckBox->addItemListener( this ); + maToggleHdl = link; + } + void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) + { + ButtonImpl::disposing (e); + } + virtual void SAL_CALL itemStateChanged( const awt::ItemEvent& ) + throw (uno::RuntimeException) + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } +}; + +CheckBox::~CheckBox () +{ + SetToggleHdl (Link ()); +} + +void CheckBox::Check( bool bCheck ) +{ + if ( !getImpl().mxCheckBox.is() ) + return; + getImpl().mxCheckBox->setState( !!bCheck ); +} + +bool CheckBox::IsChecked() const +{ + if ( !getImpl().mxCheckBox.is() ) + return false; + return getImpl().mxCheckBox->getState() != 0; +} + +void CheckBox::SetToggleHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxCheckBox.is ()) + getImpl().SetToggleHdl( link ); +} + +IMPL_GET_IMPL( CheckBox ); +IMPL_CONSTRUCTORS( CheckBox, Button, "checkbox" ); + +#define BUTTON_IMPL(t, parent, response) \ + class t##Impl : public parent##Impl \ + { \ + public: \ + t##Impl( Context *context, PeerHandle const& peer, Window *window ) \ + : parent##Impl( context, peer, window ) \ + { \ + } \ + void Click() \ + { \ + if (Dialog *d = static_cast<Dialog *> (mpCtx)) \ + d->EndDialog( response ); \ + } \ + } + +/* Common button types currently unavailable in OOo: */ +/* mpReset */ +/* mpApply */ +/* mpAction */ +#define RET_RESET 6 +#define RET_APPLY 7 +#define BUTTONID_RESET RET_RESET +#define BUTTONID_APPLY RET_APPLY + +BUTTON_IMPL( OKButton, PushButton, BUTTONID_OK ); +BUTTON_IMPL( CancelButton, PushButton, BUTTONID_CANCEL ); +BUTTON_IMPL( YesButton, PushButton, BUTTONID_YES ); +BUTTON_IMPL( NoButton, PushButton, BUTTONID_NO ); +BUTTON_IMPL( RetryButton, PushButton, BUTTONID_RETRY ); +BUTTON_IMPL( IgnoreButton, PushButton, BUTTONID_IGNORE ); +BUTTON_IMPL( ResetButton, PushButton, BUTTONID_RESET ); +BUTTON_IMPL( ApplyButton, PushButton, BUTTONID_APPLY ); /* Deprecated? */ +BUTTON_IMPL( HelpButton, PushButton, BUTTONID_HELP ); + +IMPL_CONSTRUCTORS( OKButton, PushButton, "okbutton" ); +IMPL_CONSTRUCTORS( CancelButton, PushButton, "cancelbutton" ); +IMPL_CONSTRUCTORS( YesButton, PushButton, "yesbutton" ); +IMPL_CONSTRUCTORS( NoButton, PushButton, "nobutton" ); +IMPL_CONSTRUCTORS( RetryButton, PushButton, "retrybutton" ); +IMPL_CONSTRUCTORS( IgnoreButton, PushButton, "ignorebutton" ); +IMPL_CONSTRUCTORS( ResetButton, PushButton, "resetbutton" ); +IMPL_CONSTRUCTORS( ApplyButton, PushButton, "applybutton" ); /* Deprecated? */ +IMPL_CONSTRUCTORS( HelpButton, PushButton, "helpbutton" ); + +IMPL_IMPL (ImageButton, PushButton) + + +IMPL_CONSTRUCTORS( ImageButton, PushButton, "imagebutton" ); + +class AdvancedButtonImpl : public PushButtonImpl +{ +protected: + bool bAdvancedMode; + std::list< Window*> maAdvanced; + std::list< Window*> maSimple; + +public: + rtl::OUString mAdvancedLabel; + rtl::OUString mSimpleLabel; + +protected: + Window* Remove( std::list< Window*> lst, Window* w ) + { + for ( std::list< Window*>::iterator it = maAdvanced.begin(); + it != maAdvanced.end(); it++ ) + if ( *it == w ) + { + lst.erase( it ); + return *it; + } + return 0; + } + +public: + AdvancedButtonImpl( Context *context, PeerHandle const& peer, Window *window ) + : PushButtonImpl( context, peer, window ) + , bAdvancedMode( false ) + // TODO: i18n + // Button::GetStandardText( BUTTON_ADVANCED ); + // Button::GetStandardText( BUTTON_SIMPLE ); + , mAdvancedLabel( rtl::OUString::createFromAscii( "Advanced..." ) ) + , mSimpleLabel( rtl::OUString::createFromAscii( "Simple..." ) ) + { + } + void Click() + { + bAdvancedMode = !bAdvancedMode; + if ( bAdvancedMode ) + advancedMode(); + else + simpleMode(); + } + void setAlign () + { + ::PushButton *b = static_cast<PushButton*> (mpWindow)->GetPushButton (); + b->SetSymbolAlign (SYMBOLALIGN_RIGHT); + b->SetSmallSymbol (); + //mpWindow->SetStyle (mpWindow->GetStyle() | WB_CENTER); + } + void advancedMode() + { + ::PushButton *b = static_cast<PushButton*> (mpWindow)->GetPushButton (); + b->SetSymbol (SYMBOL_PAGEUP); + setAlign (); + if (mSimpleLabel.getLength ()) + b->SetText (mSimpleLabel); + for ( std::list< Window*>::iterator it = maAdvanced.begin(); + it != maAdvanced.end(); it++ ) + ( *it )->Show(); + for ( std::list< Window*>::iterator it = maSimple.begin(); + it != maSimple.end(); it++ ) + ( *it )->Hide(); + + redraw (); + } + void simpleMode() + { + //mxButton->setLabel( mSimpleLabel ); + ::PushButton *b = static_cast<PushButton*> (mpWindow)->GetPushButton (); + b->SetSymbol (SYMBOL_PAGEDOWN); + if (mAdvancedLabel.getLength ()) + b->SetText (mAdvancedLabel); + setAlign (); + for ( std::list< Window*>::iterator it = maAdvanced.begin(); + it != maAdvanced.end(); it++ ) + ( *it )->Hide(); + for ( std::list< Window*>::iterator it = maSimple.begin(); + it != maSimple.end(); it++ ) + ( *it )->Show(); + + redraw (true); + } + void AddAdvanced( Window* w ) + { + maAdvanced.push_back( w ); + if ( !bAdvancedMode ) + w->Hide(); + } + void AddSimple( Window* w ) + { + maSimple.push_back( w ); + if ( bAdvancedMode ) + w->Hide(); + } + void RemoveAdvanced( Window* w ) + { + Remove( maAdvanced, w ); + } + void RemoveSimple( Window* w ) + { + Remove( maSimple, w ); + } +}; + +void AdvancedButton::AddAdvanced( Window* w ) +{ + getImpl().AddAdvanced( w ); +} + +void AdvancedButton::AddSimple( Window* w ) +{ + getImpl().AddSimple( w ); +} + +void AdvancedButton::RemoveAdvanced( Window* w ) +{ + getImpl().RemoveAdvanced( w ); +} + +void AdvancedButton::RemoveSimple( Window* w ) +{ + getImpl().RemoveSimple( w ); +} + +void AdvancedButton::SetAdvancedText (rtl::OUString const& text) +{ + if (text.getLength ()) + getImpl ().mAdvancedLabel = text; +} + +void AdvancedButton::SetSimpleText (rtl::OUString const& text) +{ + if (text.getLength ()) + getImpl ().mSimpleLabel = text; +} + +rtl::OUString AdvancedButton::GetAdvancedText () const +{ + return getImpl ().mAdvancedLabel; +} + +rtl::OUString AdvancedButton::GetSimpleText () const +{ + return getImpl ().mSimpleLabel; +} + +void AdvancedButton::SetDelta (int) +{ +} + +IMPL_CONSTRUCTORS_BODY( AdvancedButton, PushButton, "advancedbutton", getImpl().simpleMode () ); +IMPL_GET_IMPL( AdvancedButton ); + + +class MoreButtonImpl : public AdvancedButtonImpl +{ +public: + MoreButtonImpl( Context *context, PeerHandle const& peer, Window *window ) + : AdvancedButtonImpl( context, peer, window) + { + mSimpleLabel = Button::GetStandardText( BUTTON_MORE ); + mAdvancedLabel = Button::GetStandardText( BUTTON_LESS ); + } + void AddWindow( Window* w ) { AddAdvanced( w ); } + void RemoveWindow( Window* w ) { RemoveAdvanced( w ); } +}; + +// TODO +//BUTTON_IMPL( MoreButton, PushButton, 0 ); +IMPL_CONSTRUCTORS_BODY( MoreButton, AdvancedButton, "morebutton", getImpl().simpleMode () ); +IMPL_GET_IMPL( MoreButton ); + +void MoreButton::AddWindow( Window* w ) +{ + getImpl().AddWindow( w ); +} + +void MoreButton::RemoveWindow( Window* w ) +{ + getImpl().RemoveWindow( w ); +} + +void MoreButton::SetMoreText (rtl::OUString const& text) +{ + SetAdvancedText (text); +} + +void MoreButton::SetLessText (rtl::OUString const& text) +{ + SetSimpleText (text); +} + +rtl::OUString MoreButton::GetMoreText () const +{ + return GetAdvancedText (); +} + +rtl::OUString MoreButton::GetLessText () const +{ + return GetSimpleText (); +} + +} // namespace layout diff --git a/toolkit/source/layout/vcl/wcontainer.cxx b/toolkit/source/layout/vcl/wcontainer.cxx new file mode 100644 index 000000000000..e4f5a92f69e0 --- /dev/null +++ b/toolkit/source/layout/vcl/wcontainer.cxx @@ -0,0 +1,270 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#include "wrapper.hxx" + +#include <com/sun/star/awt/XLayoutRoot.hpp> +#include <com/sun/star/awt/XLayoutContainer.hpp> +#include <comphelper/processfactory.hxx> +#include <layout/core/helper.hxx> +#include <tools/debug.hxx> + +using namespace ::com::sun::star; + +namespace layout +{ + +Container::Container( Context const* context, char const* pId ) + : mxContainer( context->GetPeerHandle( pId ), uno::UNO_QUERY ) +{ + if ( !mxContainer.is() ) + { + DBG_ERROR1( "Error: failed to associate container with '%s'", pId ); + } +} + +Container::Container( rtl::OUString const& rName, sal_Int32 nBorder ) +{ + mxContainer = layoutimpl::WidgetFactory::createContainer( rName ); + + uno::Reference< beans::XPropertySet > xProps( mxContainer, uno::UNO_QUERY_THROW ); + xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Border" ) ), + uno::Any( nBorder ) ); +} + +void Container::Add( Window *pChild ) +{ + if ( pChild ) + { + uno::Reference< awt::XLayoutConstrains > xChild( pChild->GetPeer(), uno::UNO_QUERY ); + mxContainer->addChild( xChild ); + } +} + +void Container::Add( Container *pChild ) +{ + if ( pChild ) + { + uno::Reference< awt::XLayoutConstrains > xChild( pChild->getImpl(), uno::UNO_QUERY ); + mxContainer->addChild( xChild ); + } +} + +void Container::Remove( Window *pChild ) +{ + if ( pChild ) + { + uno::Reference< awt::XLayoutConstrains > xChild( pChild->GetPeer(), uno::UNO_QUERY ); + mxContainer->removeChild( xChild ); + } +} + +void Container::Remove( Container *pChild ) +{ + if ( pChild ) + { + uno::Reference< awt::XLayoutConstrains > xChild( pChild->getImpl(), uno::UNO_QUERY ); + mxContainer->removeChild( xChild ); + } +} + +void Container::Clear() +{ + css::uno::Sequence< css::uno::Reference < css::awt::XLayoutConstrains > > children; + children = mxContainer->getChildren(); + for (int i = 0; i < children.getLength(); i++) + mxContainer->removeChild( children[i] ); +} + +void Container::ShowAll( bool bShow ) +{ + struct inner + { + static void setChildrenVisible( uno::Reference < awt::XLayoutContainer > xCont, + bool bVisible ) /* auxiliary */ + { + if ( xCont.is() ) + { + uno::Sequence< uno::Reference < awt::XLayoutConstrains > > aChildren; + aChildren = xCont->getChildren(); + for (int i = 0; i < aChildren.getLength(); i++) + { + uno::Reference < awt::XLayoutConstrains > xChild( aChildren[ i ] ); + + uno::Reference< awt::XWindow > xWin( xChild, uno::UNO_QUERY); + if ( xWin.is() ) + xWin->setVisible( bVisible ); + + uno::Reference < awt::XLayoutContainer > xChildCont( + xChild, uno::UNO_QUERY ); + setChildrenVisible( xChildCont, bVisible ); + } + } + } + }; + + inner::setChildrenVisible( mxContainer, bShow ); +} + +void Container::Show() +{ + ShowAll( true ); +} + +void Container::Hide() +{ + ShowAll( false ); +} + +Table::Table( sal_Int32 nBorder, sal_Int32 nColumns ) + : Container( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "table" ) ), nBorder ) +{ + uno::Reference< beans::XPropertySet > xProps( mxContainer, uno::UNO_QUERY_THROW ); + xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Columns" ) ), + uno::Any( nColumns ) ); +} + +void Table::Add( Window *window, bool bXExpand, bool bYExpand, + sal_Int32 nXSpan, sal_Int32 nYSpan ) +{ + if ( !window ) + return; + WindowImpl &rImpl = window->getImpl(); + uno::Reference< awt::XLayoutConstrains > xChild( rImpl.mxWindow, + uno::UNO_QUERY ); + mxContainer->addChild( xChild ); + setProps( xChild, bXExpand, bYExpand, nXSpan, nYSpan ); +} + +void Table::Add( Container *pContainer, bool bXExpand, bool bYExpand, + sal_Int32 nXSpan, sal_Int32 nYSpan ) +{ + if ( !pContainer ) + return; + uno::Reference< awt::XLayoutConstrains > xChild( pContainer->getImpl(), + uno::UNO_QUERY ); + mxContainer->addChild( xChild ); + setProps( xChild, bXExpand, bYExpand, nXSpan, nYSpan ); +} + +void Table::setProps( uno::Reference< awt::XLayoutConstrains > xChild, + bool bXExpand, bool bYExpand, sal_Int32 nXSpan, sal_Int32 nYSpan ) +{ + uno::Reference< beans::XPropertySet > xProps + ( mxContainer->getChildProperties( xChild ), uno::UNO_QUERY_THROW ); + xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "XExpand" ) ), + uno::Any( bXExpand ) ); + xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "YExpand" ) ), + uno::Any( bYExpand ) ); + xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "ColSpan" ) ), + uno::Any( nXSpan ) ); + xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "RowSpan" ) ), + uno::Any( nYSpan ) ); +} + +Box::Box( rtl::OUString const& rName, sal_Int32 nBorder, bool bHomogeneous ) + : Container( rName, nBorder ) +{ + uno::Reference< beans::XPropertySet > xProps( mxContainer, uno::UNO_QUERY_THROW ); + xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "Homogeneous" ) ), + uno::Any( bHomogeneous ) ); +} + +void Box::Add( Window *window, bool bExpand, bool bFill, sal_Int32 nPadding) +{ + if ( !window ) + return; + WindowImpl &rImpl = window->getImpl(); + uno::Reference< awt::XLayoutConstrains > xChild( rImpl.mxWindow, + uno::UNO_QUERY ); + + mxContainer->addChild( xChild ); + setProps( xChild, bExpand, bFill, nPadding ); +} + +void Box::Add( Container *pContainer, bool bExpand, bool bFill, sal_Int32 nPadding) +{ + if ( !pContainer ) + return; + + uno::Reference< awt::XLayoutConstrains > xChild( pContainer->getImpl(), + uno::UNO_QUERY ); + mxContainer->addChild( xChild ); + setProps( xChild, bExpand, bFill, nPadding ); +} + +void Box::setProps( uno::Reference< awt::XLayoutConstrains > xChild, + bool bExpand, bool bFill, sal_Int32 nPadding ) +{ + uno::Reference< beans::XPropertySet > xProps + ( mxContainer->getChildProperties( xChild ), uno::UNO_QUERY_THROW ); + + xProps->setPropertyValue( rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "Expand" ) ), + uno::Any( bExpand ) ); + xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Fill" ) ), + uno::Any( bFill ) ); + xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Padding" ) ), + uno::Any( nPadding ) ); +} + +Table::Table( Context const* context, char const* pId ) + : Container( context, pId ) +{ +} + +Box::Box( Context const* context, char const* pId ) + : Container( context, pId ) +{ +} + +HBox::HBox( sal_Int32 nBorder, bool bHomogeneous ) + : Box( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "hbox" ) ), + nBorder, bHomogeneous ) +{ +} + +HBox::HBox( Context const* context, char const* pId ) + : Box( context, pId ) +{ +} + +VBox::VBox( sal_Int32 nBorder, bool bHomogeneous ) + : Box( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "vbox" ) ), + nBorder, bHomogeneous ) +{ +} + +VBox::VBox( Context const* context, char const* pId ) + : Box( context, pId ) +{ +} + +} // namespace layout diff --git a/toolkit/source/layout/vcl/wfield.cxx b/toolkit/source/layout/vcl/wfield.cxx new file mode 100644 index 000000000000..281d909530b0 --- /dev/null +++ b/toolkit/source/layout/vcl/wfield.cxx @@ -0,0 +1,796 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#include "wrapper.hxx" + +#include <comphelper/processfactory.hxx> +#include <com/sun/star/awt/XMetricField.hpp> +#include <com/sun/star/awt/XNumericField.hpp> +#include <com/sun/star/awt/XTextComponent.hpp> +#include <com/sun/star/awt/XListBox.hpp> +#include <com/sun/star/awt/XComboBox.hpp> +#include <cppuhelper/implbase1.hxx> +#include <com/sun/star/awt/XActionListener.hpp> +#include <com/sun/star/awt/XItemListener.hpp> +#include <com/sun/star/awt/XMouseListener.hpp> +#include <vcl/combobox.hxx> +#include <vcl/lstbox.hxx> + +#include <toolkit/awt/vclxwindows.hxx> + +using namespace ::com::sun::star; +using rtl::OUString; + +#define LAYOUT_API_CALLS_HANDLER 0 + +namespace layout +{ + +class EditImpl : public ControlImpl + , public ::cppu::WeakImplHelper1< awt::XTextListener > +{ +public: + Link maModifyHdl; + + uno::Reference< awt::XTextComponent > mxEdit; + EditImpl( Context *context, const PeerHandle &peer, Window *window ) + : ControlImpl( context, peer, window ) + , mxEdit( peer, uno::UNO_QUERY ) + { + } + + ~EditImpl (); + + virtual void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException); + + virtual void SetModifyHdl( Link const& link ); + + void SAL_CALL textChanged( const awt::TextEvent& /* rEvent */ ) + throw (uno::RuntimeException) + { + maModifyHdl.Call( mpWindow ); + } +}; + +EditImpl::~EditImpl () +{ +} + +void SAL_CALL EditImpl::disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) +{ + ControlImpl::disposing (e); + mxEdit.clear (); +} + +void EditImpl::SetModifyHdl( Link const& link ) +{ + if (!link && !!maModifyHdl) + mxEdit->removeTextListener( this ); + else if (!!link && !maModifyHdl) + mxEdit->addTextListener( this ); + maModifyHdl = link; +} + +Edit::~Edit () +{ + SetModifyHdl (Link ()); +} + +void Edit::SetSelection( Selection const& rSelection ) +{ +#if LAYOUT_API_CALLS_HANDLER + if ( !getImpl().mxEdit.is() ) + getImpl().mxEdit->setSelection( awt::Selection( rSelection.Min(), rSelection.Max() ) ); +#else /* !LAYOUT_API_CALLS_HANDLER */ + GetEdit ()->SetSelection (rSelection); +#endif /* !LAYOUT_API_CALLS_HANDLER */ +} + +void Edit::SetText( OUString const& rStr ) +{ +#if LAYOUT_API_CALLS_HANDLER + if ( getImpl().mxEdit.is() ) + /// this calls handlers; endless loop in numfmt.cxx + getImpl().mxEdit->setText( rStr ); +#else /* !LAYOUT_API_CALLS_HANDLER */ + GetEdit ()->SetText (rStr); +#endif /* !LAYOUT_API_CALLS_HANDLER */ +} + +String Edit::GetText() const +{ + if ( !getImpl().mxEdit.is() ) + return getImpl().mxEdit->getText(); + return OUString(); +} + +void Edit::SetModifyHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxEdit.is ()) + getImpl().SetModifyHdl( link ); +} + +IMPL_CONSTRUCTORS( Edit, Control, "edit" ); +IMPL_GET_IMPL( Edit ); +IMPL_GET_WINDOW (Edit); + +class MultiLineEditImpl : public EditImpl +{ +public: + MultiLineEditImpl( Context *context, const PeerHandle &peer, Window *window ) + : EditImpl( context, peer, window ) + { + } +}; + +IMPL_CONSTRUCTORS( MultiLineEdit, Edit, "multilineedit" ); +IMPL_GET_IMPL( MultiLineEdit ); + +class SpinFieldImpl : public EditImpl +{ + public: + SpinFieldImpl( Context *context, const PeerHandle &peer, Window *window ) + : EditImpl( context, peer, window ) + { + } +}; + +IMPL_CONSTRUCTORS( SpinField, Edit, "spinfield" ); + +class NumericFieldImpl : public SpinFieldImpl +{ + public: + NumericFieldImpl( Context *context, const PeerHandle &peer, Window *window ) + : SpinFieldImpl( context, peer, window ) + { + } +}; + +class MetricFieldImpl : public SpinFieldImpl +{ + public: + MetricFieldImpl( Context *context, const PeerHandle &peer, Window *window ) + : SpinFieldImpl( context, peer, window ) + { + } +}; + +IMPL_GET_IMPL( SpinField ); +IMPL_GET_IMPL( NumericField ); +IMPL_GET_IMPL( MetricField ); + +class FormatterBaseImpl +{ + protected: + PeerHandle mpeer; + public: + explicit FormatterBaseImpl( const PeerHandle &peer ) + : mpeer( peer ) + { + }; +}; + +FormatterBase::FormatterBase( FormatterBaseImpl *pFormatImpl ) + : mpFormatImpl( pFormatImpl ) +{ +} + +class NumericFormatterImpl : public FormatterBaseImpl +{ + public: + uno::Reference< awt::XNumericField > mxField; + explicit NumericFormatterImpl( const PeerHandle &peer ) + : FormatterBaseImpl( peer ) + , mxField( peer, uno::UNO_QUERY ) + { + } + + // FIXME: burn that CPU ! cut/paste from vclxwindows.cxx + double valueToDouble( sal_Int64 nValue ) + { + sal_Int16 nDigits = mxField->getDecimalDigits(); + double n = (double)nValue; + for ( sal_uInt16 d = 0; d < nDigits; d++ ) + n /= 10; + return n; + } // FIXME: burn that CPU ! cut/paste from vclxwindows.cxx + sal_Int64 doubleToValue( double nValue ) + { + sal_Int16 nDigits = mxField->getDecimalDigits(); + double n = nValue; + for ( sal_uInt16 d = 0; d < nDigits; d++ ) + n *= 10; + return (sal_Int64) n; + } +}; + +class MetricFormatterImpl : public FormatterBaseImpl +{ + public: + uno::Reference< awt::XMetricField > mxField; + explicit MetricFormatterImpl( const PeerHandle &peer ) + : FormatterBaseImpl( peer ) + , mxField( peer, uno::UNO_QUERY ) + { + } +}; + +NumericFormatter::NumericFormatter( FormatterBaseImpl *pImpl ) + : FormatterBase( pImpl ) +{ +} + +NumericFormatterImpl& NumericFormatter::getFormatImpl() const +{ + return *( static_cast<NumericFormatterImpl *>( mpFormatImpl ) ); +} + +#define SET_IMPL(vclmethod, idlmethod) \ + void NumericFormatter::vclmethod( sal_Int64 nValue ) \ + { \ + if ( !getFormatImpl().mxField.is() ) \ + return; \ + getFormatImpl().mxField->idlmethod( getFormatImpl().valueToDouble( nValue ) ); \ + } + +SET_IMPL( SetMin, setMin ) +SET_IMPL( SetMax, setMax ) +SET_IMPL( SetLast, setLast ) +SET_IMPL( SetFirst, setFirst ) +SET_IMPL( SetValue, setValue ) +SET_IMPL( SetSpinSize, setSpinSize ) + +sal_Int64 NumericFormatter::GetValue() const +{ + if ( !getFormatImpl().mxField.is() ) + return 0; + return getFormatImpl().doubleToValue( getFormatImpl().mxField->getValue() ); +} + +#undef SET_IMPL + +IMPL_CONSTRUCTORS_2( NumericField, SpinField, NumericFormatter, "numericfield" ); + +MetricFormatter::MetricFormatter( FormatterBaseImpl *pImpl ) + : FormatterBase( pImpl ) +{ +} +MetricFormatterImpl& MetricFormatter::getFormatImpl() const +{ return *( static_cast<MetricFormatterImpl *>( mpFormatImpl ) ); } + +#define MetricUnitVclToUno(a) ((sal_uInt16)(a)) + +#define SET_IMPL(vclmethod, idlmethod) \ + void MetricFormatter::vclmethod( sal_Int64 nValue, FieldUnit nUnit ) \ + { \ + if ( !getFormatImpl().mxField.is() ) \ + return; \ + getFormatImpl().mxField->idlmethod( nValue, MetricUnitVclToUno( nUnit ) ); \ + } + +SET_IMPL( SetMin, setMin ) +SET_IMPL( SetMax, setMax ) +SET_IMPL( SetLast, setLast ) +SET_IMPL( SetFirst, setFirst ) +SET_IMPL( SetValue, setValue ) + +#undef SET_IMPL + +void MetricFormatter::SetSpinSize( sal_Int64 nValue ) +{ + if ( !getFormatImpl().mxField.is() ) + return; + getFormatImpl().mxField->setSpinSize( nValue ); +} + +sal_Int64 MetricFormatter::GetValue( FieldUnit nUnit ) const +{ + if ( !getFormatImpl().mxField.is() ) + return 0; + return getFormatImpl().mxField->getValue( MetricUnitVclToUno( nUnit ) ); +} + +IMPL_CONSTRUCTORS_2( MetricField, SpinField, MetricFormatter, "metricfield" ); + +class ComboBoxImpl : public EditImpl + , public ::cppu::WeakImplHelper1< awt::XActionListener > + , public ::cppu::WeakImplHelper1< awt::XItemListener > +{ +public: + uno::Reference< awt::XComboBox > mxComboBox; + + Link maClickHdl; + Link maSelectHdl; + + Window *parent; + + ComboBoxImpl( Context *context, const PeerHandle &peer, Window *window ) + : EditImpl( context, peer, window ) + , mxComboBox( peer, uno::UNO_QUERY ) + { + } + + ~ComboBoxImpl (); + + sal_uInt16 InsertEntry( OUString const& rStr, sal_uInt16 nPos ) + { + if ( nPos == COMBOBOX_APPEND ) + nPos = GetEntryCount(); + mxComboBox->addItem( rtl::OUString( rStr ), nPos ); + return nPos; + } + + void RemoveEntry( sal_uInt16 nPos ) + { + mxComboBox->removeItems( nPos, 1 ); + } + + sal_uInt16 GetEntryPos( String const& rStr ) const + { + uno::Sequence< rtl::OUString> aItems( mxComboBox->getItems() ); + rtl::OUString rKey( rStr ); + sal_uInt16 n = sal::static_int_cast< sal_uInt16 >(aItems.getLength()); + for (sal_uInt16 i = 0; i < n; i++) + { + if ( aItems[ i ] == rKey ) + return i; + } + return COMBOBOX_ENTRY_NOTFOUND; + } + + OUString GetEntry( sal_uInt16 nPos ) const + { + return OUString( mxComboBox->getItem( nPos ) ); + } + + sal_uInt16 GetEntryCount() const + { + return mxComboBox->getItemCount(); + } + + void SetClickHdl( Link const& link ) + { + if (!link && !!maClickHdl) + mxComboBox->removeActionListener( this ); + else if (!!link && !maClickHdl) + mxComboBox->addActionListener( this ); + maClickHdl = link; + } + + void SetSelectHdl( Link const& link ) + { + if (!link && !!maSelectHdl) + mxComboBox->removeItemListener( this ); + else if (!!link && !maSelectHdl) + mxComboBox->addItemListener( this ); + maSelectHdl = link; + } + + void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException); + + void SAL_CALL actionPerformed (const awt::ActionEvent&) + throw (uno::RuntimeException) + { + ComboBox* pComboBox = static_cast<ComboBox*>( mpWindow ); + if ( !pComboBox ) + return; + maClickHdl.Call( pComboBox ); + } + + void SAL_CALL itemStateChanged( awt::ItemEvent const&) + throw (uno::RuntimeException) + { + ComboBox* pComboBox = static_cast<ComboBox*>( mpWindow ); + if ( !pComboBox ) + return; + maSelectHdl.Call( pComboBox ); + } +}; + +ComboBox::~ComboBox () +{ +#ifndef __SUNPRO_CC + OSL_TRACE ("%s: deleting ComboBox for window: %p", __FUNCTION__, GetWindow ()); +#endif +} + +ComboBoxImpl::~ComboBoxImpl () +{ +#ifndef __SUNPRO_CC + OSL_TRACE ("%s: deleting ComboBoxImpl for window: %p", __FUNCTION__, mpWindow ? mpWindow->GetWindow () : 0); + OSL_TRACE ("%s: deleting ComboBoxImpl for listener: %p", __FUNCTION__, static_cast<XFocusListener*> (this)); +#endif +} + +void ComboBoxImpl::disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) +{ + EditImpl::disposing (e); + mxComboBox.clear (); +} + +sal_uInt16 ComboBox::InsertEntry( String const& rStr, sal_uInt16 nPos ) +{ + return getImpl().InsertEntry( rStr, nPos ); +} + +void ComboBox::RemoveEntry( String const& rStr ) +{ + getImpl().RemoveEntry( GetEntryPos( rStr ) ); +} + +void ComboBox::RemoveEntry( sal_uInt16 nPos ) +{ + getImpl().RemoveEntry( nPos ); +} + +void ComboBox::Clear() +{ + uno::Sequence< rtl::OUString> aNoItems; + getImpl().setProperty( "StringItemList", uno::Any( aNoItems ) ); +} + +sal_uInt16 ComboBox::GetEntryPos( String const& rStr ) const +{ + return getImpl().GetEntryPos( rStr ); +} + +String ComboBox::GetEntry( sal_uInt16 nPos ) const +{ + rtl::OUString rItem = getImpl().mxComboBox->getItem( nPos ); + return OUString( rItem ); +} + +sal_uInt16 ComboBox::GetEntryCount() const +{ + return getImpl().GetEntryCount(); +} + +void ComboBox::SetClickHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxComboBox.is ()) + getImpl().SetClickHdl( link ); +} + +void ComboBox::SetSelectHdl( const Link& link ) +{ + if (&getImpl () && getImpl().mxComboBox.is ()) + getImpl().SetSelectHdl( link ); +} + +void ComboBox::EnableAutocomplete (bool enable, bool matchCase) +{ + GetComboBox ()->EnableAutocomplete (enable, matchCase); +} + +IMPL_CONSTRUCTORS_BODY( ComboBox, Edit, "combobox", getImpl().parent = parent; ); +IMPL_GET_WINDOW (ComboBox); +/// IMPL_GET_IMPL( ComboBox ); + +static ComboBoxImpl* null_combobox_impl = 0; + +ComboBoxImpl &ComboBox::getImpl () const +{ + if (ComboBoxImpl* c = static_cast<ComboBoxImpl *>(mpImpl)) + return *c; + return *null_combobox_impl; +} + +class ListBoxImpl : public ControlImpl + , public ::cppu::WeakImplHelper1< awt::XActionListener > + , public ::cppu::WeakImplHelper1< awt::XItemListener > + , public ::cppu::WeakImplHelper1< awt::XMouseListener > +{ + Link maClickHdl; + Link maSelectHdl; + Link maDoubleClickHdl; + +public: + uno::Reference< awt::XListBox > mxListBox; + ListBoxImpl( Context *context, const PeerHandle &peer, Window *window ) + : ControlImpl( context, peer, window ) + , mxListBox( peer, uno::UNO_QUERY ) + { + SelectEntryPos (0, true); + } + + sal_uInt16 InsertEntry (String const& rStr, sal_uInt16 nPos) + { + if ( nPos == LISTBOX_APPEND ) + nPos = mxListBox->getItemCount(); + mxListBox->addItem( rtl::OUString( rStr ), nPos ); + return nPos; + } + + void RemoveEntry( sal_uInt16 nPos ) + { + mxListBox->removeItems( nPos, 1 ); + } + + sal_uInt16 RemoveEntry( String const& rStr, sal_uInt16 nPos) + { + if ( nPos == LISTBOX_APPEND ) + nPos = mxListBox->getItemCount(); + mxListBox->addItem( rtl::OUString( rStr ), nPos ); + return nPos; + } + + sal_uInt16 GetEntryPos( String const& rStr ) const + { + uno::Sequence< rtl::OUString> aItems( mxListBox->getItems() ); + rtl::OUString rKey( rStr ); + sal_uInt16 n = sal::static_int_cast< sal_uInt16 >(aItems.getLength()); + for (sal_uInt16 i = 0; i < n; i++) + { + if ( aItems[ i ] == rKey ) + return i; + } + return LISTBOX_ENTRY_NOTFOUND; + } + + OUString GetEntry( sal_uInt16 nPos ) const + { + return mxListBox->getItem( nPos ); + } + + sal_uInt16 GetEntryCount() const + { + return mxListBox->getItemCount(); + } + + void SelectEntryPos( sal_uInt16 nPos, bool bSelect ) + { + mxListBox->selectItemPos( nPos, bSelect ); + } + + sal_uInt16 GetSelectEntryCount() const + { + return sal::static_int_cast< sal_uInt16 >( mxListBox->getSelectedItems().getLength() ); + } + + sal_uInt16 GetSelectEntryPos( sal_uInt16 nSelIndex ) const + { + sal_uInt16 nSelected = 0; + if ( mxListBox->isMutipleMode() ) + { + uno::Sequence< short > aItems( mxListBox->getSelectedItemsPos() ); + if ( nSelIndex < aItems.getLength() ) + nSelected = aItems[ nSelIndex ]; + } + else + nSelected = mxListBox->getSelectedItemPos(); + return nSelected; + } + + virtual void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) + { + ControlImpl::disposing (e); + mxListBox.clear (); + } + + Link& GetClickHdl () + { + return maClickHdl; + } + + void SetClickHdl( Link const& link ) + { + if (!link && !!maClickHdl) + mxListBox->removeActionListener( this ); + else if (!!link && !maClickHdl) + mxListBox->addActionListener( this ); + maClickHdl = link; + } + + void SAL_CALL actionPerformed( const awt::ActionEvent& /* rEvent */ ) + throw (uno::RuntimeException) + { + maClickHdl.Call( mpWindow ); + } + + Link& GetSelectHdl () + { + return maSelectHdl; + } + + void SetSelectHdl( Link const& link ) + { + if (!link && !!maSelectHdl) + mxListBox->removeItemListener( this ); + else if (!!link && !maSelectHdl) + mxListBox->addItemListener( this ); + maSelectHdl = link; + } + + void SAL_CALL itemStateChanged (awt::ItemEvent const&) + throw (uno::RuntimeException) + { + maSelectHdl.Call (static_cast <ListBox*> (mpWindow)); + } + + Link& GetDoubleClickHdl () + { + return maDoubleClickHdl; + } + + void SetDoubleClickHdl (Link const& link) + { + if (!link && !!maDoubleClickHdl) + mxWindow->removeMouseListener (this); + else if (!!link && !maSelectHdl) + mxWindow->addMouseListener (this); + maDoubleClickHdl = link; + } + + void SAL_CALL mousePressed (awt::MouseEvent const&) throw (uno::RuntimeException) + { + } + void SAL_CALL mouseReleased (awt::MouseEvent const& e) throw (uno::RuntimeException) + { + if (e.ClickCount == 2) + maDoubleClickHdl.Call (mpWindow); + } + void SAL_CALL mouseEntered (awt::MouseEvent const&) throw (uno::RuntimeException) + { + } + void SAL_CALL mouseExited (awt::MouseEvent const&) throw (uno::RuntimeException) + { + } +}; + +ListBox::~ListBox () +{ +} + +sal_uInt16 ListBox::InsertEntry (String const& rStr, sal_uInt16 nPos) +{ + return getImpl().InsertEntry(rStr, nPos); +} + +void ListBox::RemoveEntry( sal_uInt16 nPos ) +{ + return getImpl().RemoveEntry( nPos ); +} + +void ListBox::RemoveEntry( String const& rStr ) +{ + return getImpl().RemoveEntry( GetEntryPos( rStr ) ); +} + +void ListBox::Clear() +{ + uno::Sequence< rtl::OUString> aNoItems; + getImpl().setProperty( "StringItemList", uno::Any( aNoItems ) ); +} + +sal_uInt16 ListBox::GetEntryPos( String const& rStr ) const +{ + return getImpl().GetEntryPos( rStr ); +} + +String ListBox::GetEntry( sal_uInt16 nPos ) const +{ + return getImpl().GetEntry( nPos ); +} + +sal_uInt16 ListBox::GetEntryCount() const +{ + return getImpl().GetEntryCount(); +} + +void ListBox::SelectEntryPos( sal_uInt16 nPos, bool bSelect ) +{ +#if LAYOUT_API_CALLS_HANDLER + getImpl().SelectEntryPos( nPos, bSelect ); +#else /* !LAYOUT_API_CALLS_HANDLER */ + GetListBox ()->SelectEntryPos (nPos, bSelect); +#endif /* !LAYOUT_API_CALLS_HANDLER */ +} + +void ListBox::SelectEntry( String const& rStr, bool bSelect ) +{ + SelectEntryPos( GetEntryPos( rStr ), bSelect ); +} + +sal_uInt16 ListBox::GetSelectEntryCount() const +{ + return getImpl().GetSelectEntryCount(); +} + +sal_uInt16 ListBox::GetSelectEntryPos( sal_uInt16 nSelIndex ) const +{ + return getImpl().GetSelectEntryPos( nSelIndex ); +} + +String ListBox::GetSelectEntry( sal_uInt16 nSelIndex ) const +{ + return GetEntry( GetSelectEntryPos( nSelIndex ) ); +} + +Link& ListBox::GetSelectHdl () +{ + return getImpl ().GetSelectHdl (); +} + +void ListBox::SetSelectHdl( Link const& link ) +{ + getImpl().SetSelectHdl( link ); +} + +Link& ListBox::GetClickHdl () +{ + return getImpl ().GetSelectHdl (); +} + +void ListBox::SetClickHdl( Link const& link ) +{ + if (&getImpl () && getImpl().mxListBox.is ()) + getImpl().SetClickHdl( link ); +} + +Link& ListBox::GetDoubleClickHdl () +{ + return getImpl ().GetSelectHdl (); +} + +void ListBox::SetDoubleClickHdl( Link const& link ) +{ + getImpl().SetDoubleClickHdl( link ); +} + +void ListBox::SetEntryData( sal_uInt16 pos, void* data) +{ + GetListBox ()->SetEntryData (pos, data); +} + +void* ListBox::GetEntryData( sal_uInt16 pos) const +{ + return GetListBox ()->GetEntryData (pos); +} + +void ListBox::SetNoSelection () +{ + GetListBox ()->SetNoSelection (); +} + +IMPL_CONSTRUCTORS (ListBox, Control, "listbox"); +IMPL_GET_IMPL (ListBox); +IMPL_GET_WINDOW (ListBox); + +IMPL_IMPL (MultiListBox, ListBox) +IMPL_CONSTRUCTORS_BODY( MultiListBox, ListBox, "multilistbox", GetMultiListBox()->EnableMultiSelection( true ); ); +IMPL_GET_IMPL( MultiListBox ); +IMPL_GET_WINDOW( MultiListBox ); +} // namespace layout diff --git a/toolkit/source/layout/vcl/wrapper.cxx b/toolkit/source/layout/vcl/wrapper.cxx new file mode 100644 index 000000000000..0e2eec91773e --- /dev/null +++ b/toolkit/source/layout/vcl/wrapper.cxx @@ -0,0 +1,1630 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#include <tools/rc.h> +//#define RESOURCE_PUBLISH_PROTECTED 1 +#if RESOURCE_PUBLISH_PROTECTED +// ugh, override non-helpful proctection +#define protected public +#endif /* RESOURCE_PUBLISH_PROTECTED */ +#include <tools/rc.hxx> +#undef protected + + +#include "wrapper.hxx" + +#include <awt/vclxplugin.hxx> +#include <awt/vclxtabcontrol.hxx> +#include <com/sun/star/awt/PosSize.hpp> +#include <com/sun/star/awt/VclWindowPeerAttribute.hpp> +#include <com/sun/star/awt/WindowAttribute.hpp> +#include <com/sun/star/awt/XDialog2.hpp> +#include <com/sun/star/awt/XProgressBar.hpp> +#include <com/sun/star/awt/XSimpleTabController.hpp> +#include <com/sun/star/awt/XTabListener.hpp> +#include <com/sun/star/graphic/XGraphic.hpp> +#include <comphelper/processfactory.hxx> +#include <layout/core/factory.hxx> +#include <layout/core/localized-string.hxx> +#include <layout/core/root.hxx> +#include <toolkit/awt/vclxwindow.hxx> +#include <vcl/ctrl.hxx> +#include <vcl/dialog.hxx> +#include <vcl/image.hxx> +#include <vcl/tabctrl.hxx> +#include <vcl/tabpage.hxx> +#include <vcl/window.hxx> + +using namespace ::com::sun::star; +using rtl::OUString; + +namespace layout +{ + +// Context bits ... +class ContextImpl +{ + uno::Reference< awt::XLayoutRoot > mxRoot; + uno::Reference< container::XNameAccess > mxNameAccess; + PeerHandle mxTopLevel; + +public: + ContextImpl( char const *pPath ) + { + uno::Sequence< uno::Any > aParams( 1 ); + aParams[0] <<= OUString( pPath, strlen( pPath ), RTL_TEXTENCODING_UTF8 ); + + uno::Reference< lang::XSingleServiceFactory > xFactory( + comphelper::createProcessComponent( + OUString::createFromAscii( "com.sun.star.awt.Layout" ) ), + uno::UNO_QUERY ); + if ( !xFactory.is() ) + { + throw uno::RuntimeException( + OUString( RTL_CONSTASCII_USTRINGPARAM( "Layout engine not installed" ) ), + uno::Reference< uno::XInterface >() ); + } + mxRoot = uno::Reference< awt::XLayoutRoot >( + xFactory->createInstanceWithArguments( aParams ), + uno::UNO_QUERY ); + + mxNameAccess = uno::Reference< container::XNameAccess >( mxRoot, uno::UNO_QUERY ); + } + + ~ContextImpl() + { + } + + PeerHandle getByName( const OUString &rName ) + { + uno::Any val = mxNameAccess->getByName( rName ); + PeerHandle xRet; + val >>= xRet; + return xRet; + } + PeerHandle getTopLevel() + { + return mxTopLevel; + } + void setTopLevel( PeerHandle xToplevel ) + { + mxTopLevel = xToplevel; + } + PeerHandle getRoot() + { + return mxRoot; + } +}; + +Context::Context( const char *pPath ) + : pImpl( new ContextImpl( pPath ) ) +{ +} +Context::~Context() +{ + delete pImpl; + pImpl = NULL; +} + +void Context::setToplevel( PeerHandle xToplevel ) +{ + pImpl->setTopLevel( xToplevel ); +} + +PeerHandle Context::getToplevel() +{ + return pImpl->getTopLevel(); +} +PeerHandle Context::getRoot() +{ + return pImpl->getRoot(); +} + +PeerHandle Context::GetPeerHandle( const char *id, sal_uInt32 nId ) const +{ + PeerHandle xHandle; + xHandle = pImpl->getByName( OUString( id, strlen( id ), RTL_TEXTENCODING_UTF8 ) ); + if ( !xHandle.is() ) + { + DBG_ERROR1( "Failed to fetch widget '%s'", id ); + } + + if ( nId != 0 ) + { + rtl::OString aStr = rtl::OString::valueOf( (sal_Int32) nId ); + xHandle = GetPeerHandle( aStr, 0 ); + } + return xHandle; +} + +WindowImpl::WindowImpl (Context *context, const PeerHandle &peer, Window *window) + : mpWindow (window) + , mpCtx (context) + , mxWindow (peer, uno::UNO_QUERY) + , mxVclPeer (peer, uno::UNO_QUERY) + , mvclWindow (0) + , bFirstTimeVisible (true) +{ +} + +WindowImpl::~WindowImpl () +{ + if (mpWindow) + mpWindow->mpImpl = 0; + if (mvclWindow) + { + VCLXWindow *v = mvclWindow->GetWindowPeer (); + v->SetWindow (0); + mvclWindow->SetComponentInterface (uno::Reference <awt::XWindowPeer> ()); + mvclWindow->SetWindowPeer (uno::Reference <awt::XWindowPeer> (), 0); + delete mvclWindow; + mvclWindow = 0; + } +} + +void WindowImpl::wrapperGone () +{ + mvclWindow = 0; + mpWindow->mpImpl = 0; + mpWindow = 0; + mpCtx = 0; + if ( mxWindow.is() ) + { + uno::Reference< lang::XComponent > xComp( mxWindow, uno::UNO_QUERY ); + mxWindow.clear (); + if ( xComp.is() ) + xComp->dispose(); + } +} + +void SAL_CALL WindowImpl::disposing (lang::EventObject const&) + throw (uno::RuntimeException) +{ + if (mxWindow.is ()) + mxWindow.clear (); +} + +uno::Any WindowImpl::getProperty (char const* name) +{ + if ( !this || !mxVclPeer.is() ) + return css::uno::Any(); + return mxVclPeer->getProperty + ( rtl::OUString( name, strlen( name ), RTL_TEXTENCODING_ASCII_US ) ); +} + +void WindowImpl::setProperty (char const *name, uno::Any any) +{ + if ( !this || !mxVclPeer.is() ) + return; + mxVclPeer->setProperty + ( rtl::OUString( name, strlen( name ), RTL_TEXTENCODING_ASCII_US ), any ); +} + +void WindowImpl::redraw (bool resize) +{ + uno::Reference <awt::XWindow> ref (mxWindow, uno::UNO_QUERY); + ::Window* window = VCLXWindow::GetImplementation (ref)->GetWindow (); + ::Window* parent = window->GetParent(); + ::Rectangle r = Rectangle (parent->GetPosPixel (), + parent->GetSizePixel ()); + parent->Invalidate (r, INVALIDATE_CHILDREN | INVALIDATE_NOCHILDREN ); + if (resize) + parent->SetPosSizePixel (0, 0, 1, 1, awt::PosSize::SIZE); + else + parent->SetPosSizePixel (0, 0, r.nRight - r.nLeft, r.nBottom - r.nTop, + awt::PosSize::SIZE); +} + +Window::Window( WindowImpl *pImpl ) + : mpImpl( pImpl ) +{ + mpImpl->mvclWindow = GetVCLXWindow () ? GetWindow () : 0; +} + +Window::~Window() +{ + /* likely to be an UNO object - with floating references */ + if (mpImpl) + mpImpl->wrapperGone (); + mpImpl = 0; +} + +///IMPL_GET_IMPL( Control ); + +static ControlImpl* null_control_impl = 0; + +ControlImpl &Control::getImpl () const +{ + if (ControlImpl* c = static_cast<ControlImpl *>(mpImpl)) + return *c; + return *null_control_impl; +} + +Control::~Control () +{ + SetGetFocusHdl (Link ()); + SetLoseFocusHdl (Link ()); +} + +void Window::setRes (ResId const& res) +{ +#if RESOURCE_PUBLISH_PROTECTED + // Resources are shut-off from use. Is that really necessary? + Resource &r = *GetWindow (); + r.GetRes (res); +#else /* !RESOURCE_PUBLISH_PROTECTED */ + //We *must* derive. Is this also really necessary? + //Resource r (res); + + // ugh, I wonder which solution is cleaner... + class Resource_open_up : public Resource + { + public: + Resource_open_up (ResId const& r) + : Resource (r) + { + } + static sal_Int32 GetLongRes (void *p) + { + return Resource::GetLongRes (p); + } + void* GetClassRes () + { + return Resource::GetClassRes (); + } + sal_Int32 ReadLongRes () + { + return Resource::ReadLongRes (); + } + UniString ReadStringRes () + { + return Resource::ReadStringRes (); + } + }; + + Resource_open_up r (res); +#endif /* !RESOURCE_PUBLISH_PROTECTED */ + if (sal_uInt32 help_id = (sal_uInt32)r.GetLongRes (static_cast<char *> (r.GetClassRes ()) + 12)) + SetHelpId (help_id); + sal_uInt32 mask = r.ReadLongRes (); + if ( mask & WINDOW_TEXT ) + SetText( r.ReadStringRes ()); +} + +void Window::SetParent( ::Window *parent ) +{ + uno::Reference <awt::XWindow> ref( GetPeer(), uno::UNO_QUERY ); + if (VCLXWindow *vcl = VCLXWindow::GetImplementation( ref )) + if (::Window *window = vcl->GetWindow()) + window->SetParent( parent ); +} + +void Window::SetParent( Window *parent ) +{ + /* Let's hear it for C++: poor man's dynamic binding. */ + parent->ParentSet (this); +} + +void Window::ParentSet (Window *window) +{ + window->SetParent (GetWindow ()); +} + +Context *Window::getContext() +{ + return this && mpImpl ? mpImpl->mpCtx : NULL; +} + +PeerHandle Window::GetPeer() const +{ + if ( !mpImpl ) + return PeerHandle(); + return mpImpl->mxWindow; +} + +uno::Reference<awt::XWindow> Window::GetRef() const +{ + return uno::Reference <awt::XWindow> ( GetPeer(), uno::UNO_QUERY ); +} + +VCLXWindow* Window::GetVCLXWindow() const +{ + return VCLXWindow::GetImplementation( GetRef() ); +} + +::Window* Window::GetWindow() const +{ + return GetVCLXWindow()->GetWindow(); +} + +::Window* Window::GetParent() const +{ + return GetWindow()->GetParent(); +} + +void Window::SetHelpId( sal_uIntPtr id ) +{ + GetWindow()->SetHelpId( id ); +} + +sal_uIntPtr Window::GetHelpId() const +{ + return GetWindow()->GetHelpId(); +} + +void Window::SetSmartHelpId( SmartId const& id, SmartIdUpdateMode mode ) +{ + GetWindow()->SetSmartHelpId( id, mode ); +} + +SmartId Window::GetSmartHelpId() const +{ + return GetWindow()->GetSmartHelpId(); +} + +void Window::EnterWait () +{ + GetWindow()->EnterWait (); +} +void Window::LeaveWait () +{ + GetWindow()->LeaveWait (); +} +bool Window::IsWait () const +{ + return GetWindow()->IsWait (); +} + +bool Window::IsVisible () const +{ + if (GetWindow ()) + return GetWindow()->IsVisible (); + return false; +} + +bool Window::HasChildPathFocus (bool systemWindow) const +{ + return GetWindow()->HasChildPathFocus (systemWindow); +} + +void Window::SetPosPixel (Point const&) +{ +} + +Point Window::GetPosPixel () const +{ + return Point (); +} + +void Window::SetSizePixel (Size const&) +{ +} + +void Window::SetPosSizePixel (Point const&, Size const&) +{ +} + +Size Window::GetSizePixel () const +{ + return Size (); +} + +// void Window::Enable (bool enable, bool child); +// { +// GetWindow ()->Enable (enable, child); +// } + +// void Window::Disable (bool child) +// { +// GetWindow ()->Disable (child); +// } + +bool Window::IsEnabled () const +{ + return GetWindow ()->IsEnabled (); +// if (getImpl().mxWindow.is ()) +// return getImpl ().mxWindow->isEnabled (); +// return false; +} + +void Window::EnableInput (bool enable, bool child) +{ + GetWindow ()->EnableInput (enable, child); +} + +bool Window::IsInputEnabled () const +{ + return GetWindow ()->IsInputEnabled (); +} + +bool Window::HasFocus () const +{ + return GetWindow ()->HasFocus (); +} + +Font& Window::GetFont () const +{ + return const_cast <Font&> (GetWindow ()->GetFont ()); +} + +void Window::SetFont (Font const& font) +{ + GetWindow ()->SetFont (font); +} + +void Window::Invalidate (sal_uInt8 flags) +{ + GetWindow ()->Invalidate (flags); +} + +struct ToolkitVclPropsMap +{ + WinBits vclStyle; + long initAttr; + const char *propName; + + // the value to give the prop to enable/disable it -- not the most brilliant + // type declaration and storage, but does the work... properties are + // either a boolean or a short since they are either a directly wrappers for + // a WinBit, or aggregates related (like Align for WB_LEFT, _RIGHT and _CENTER). + bool isBoolean; + short enableProp, disableProp; +}; + +#define TYPE_BOOL true +#define TYPE_SHORT false +#define NOTYPE 0 +static const ToolkitVclPropsMap toolkitVclPropsMap[] = +{ + { WB_BORDER, awt::WindowAttribute::BORDER, "Border", TYPE_SHORT, 1, 0 }, + { WB_NOBORDER, awt::VclWindowPeerAttribute::NOBORDER, "Border", TYPE_SHORT, 0, 1 }, + { WB_SIZEABLE, awt::WindowAttribute::SIZEABLE, NULL, NOTYPE, 0, 0 }, + { WB_MOVEABLE, awt::WindowAttribute::MOVEABLE, NULL, NOTYPE, 0, 0 }, + { WB_CLOSEABLE, awt::WindowAttribute::CLOSEABLE, NULL, NOTYPE, 0, 0 }, + + { WB_HSCROLL, awt::VclWindowPeerAttribute::HSCROLL, NULL, NOTYPE, 0, 0 }, + { WB_VSCROLL, awt::VclWindowPeerAttribute::VSCROLL, NULL, NOTYPE, 0, 0 }, + { WB_LEFT, awt::VclWindowPeerAttribute::LEFT, "Align", TYPE_SHORT, 0, 0 }, + { WB_CENTER, awt::VclWindowPeerAttribute::CENTER, "Align", TYPE_SHORT, 1, 0 }, + { WB_RIGHT, awt::VclWindowPeerAttribute::RIGHT, "Align", TYPE_SHORT, 2, 0 }, + { WB_SPIN, awt::VclWindowPeerAttribute::SPIN, NULL, NOTYPE, 0, 0 }, + { WB_SORT, awt::VclWindowPeerAttribute::SORT, NULL, NOTYPE, 0, 0 }, + { WB_DROPDOWN, awt::VclWindowPeerAttribute::DROPDOWN, "Dropdown", TYPE_BOOL, 1, 0 }, + { WB_DEFBUTTON, awt::VclWindowPeerAttribute::DEFBUTTON, "DefaultButton", TYPE_BOOL, 1, 0 }, + { WB_READONLY, awt::VclWindowPeerAttribute::READONLY, NULL, NOTYPE, 0, 0 }, + { WB_CLIPCHILDREN, awt::VclWindowPeerAttribute::CLIPCHILDREN, NULL, NOTYPE, 0, 0 }, + { WB_GROUP, awt::VclWindowPeerAttribute::GROUP, NULL, NOTYPE, 0, 0 }, + + { WB_OK, awt::VclWindowPeerAttribute::OK, NULL, NOTYPE, 0, 0 }, + { WB_OK_CANCEL, awt::VclWindowPeerAttribute::OK_CANCEL, NULL, NOTYPE, 0, 0 }, + { WB_YES_NO, awt::VclWindowPeerAttribute::YES_NO, NULL, NOTYPE, 0, 0 }, + { WB_YES_NO_CANCEL, awt::VclWindowPeerAttribute::YES_NO_CANCEL, NULL, NOTYPE, 1, 0 }, + { WB_RETRY_CANCEL, awt::VclWindowPeerAttribute::RETRY_CANCEL, NULL, NOTYPE, 1, 0 }, + { WB_DEF_OK, awt::VclWindowPeerAttribute::DEF_OK, NULL, NOTYPE, 0, 0 }, + { WB_DEF_CANCEL, awt::VclWindowPeerAttribute::DEF_CANCEL, NULL, NOTYPE, 1, 0 }, + { WB_DEF_RETRY, awt::VclWindowPeerAttribute::DEF_RETRY, NULL, NOTYPE, 0, 0 }, + { WB_DEF_YES, awt::VclWindowPeerAttribute::DEF_YES, NULL, NOTYPE, 0, 0 }, + { WB_DEF_NO, awt::VclWindowPeerAttribute::DEF_NO, NULL, NOTYPE, 0, 0 }, + + { WB_AUTOHSCROLL, awt::VclWindowPeerAttribute::AUTOHSCROLL, "AutoHScroll", TYPE_BOOL, 1, 0 }, + { WB_AUTOVSCROLL, awt::VclWindowPeerAttribute::AUTOVSCROLL, "AutoVScroll", TYPE_BOOL, 1, 0 }, + + { WB_WORDBREAK, 0, "MultiLine", TYPE_BOOL, 1, 0 }, + { WB_NOPOINTERFOCUS, 0, "FocusOnClick", TYPE_BOOL, 1, 0 }, + { WB_TOGGLE, 0, "Toggle", TYPE_BOOL, 1, 0 }, + { WB_REPEAT, 0, "Repeat", TYPE_BOOL, 1, 0 }, + { WB_NOHIDESELECTION, 0, "HideInactiveSelection", TYPE_BOOL, 1, 0 }, +}; +#undef TYPE_BOOL +#undef TYPE_SHORT +#undef NOTYPE + +static const int toolkitVclPropsMapLen = + sizeof( toolkitVclPropsMap ) / sizeof( ToolkitVclPropsMap ); + +void Window::SetStyle( WinBits nStyle ) +{ + uno::Reference< awt::XVclWindowPeer > xPeer = mpImpl->mxVclPeer; + for (int i = 0; i < toolkitVclPropsMapLen; i++) + { + if ( toolkitVclPropsMap[ i ].propName ) + { + short nValue; + if ( nStyle & toolkitVclPropsMap[ i ].vclStyle ) + nValue = toolkitVclPropsMap[ i ].enableProp; + else + nValue = toolkitVclPropsMap[ i ].disableProp; + uno::Any aValue; + if ( toolkitVclPropsMap[ i ].isBoolean ) + aValue = uno::makeAny( (bool) nValue ); + else + aValue = uno::makeAny( (short) nValue ); + mpImpl->setProperty( toolkitVclPropsMap[ i ].propName, aValue ); + } + } +} + +WinBits Window::GetStyle() +{ + uno::Reference< awt::XVclWindowPeer > xPeer = mpImpl->mxVclPeer; + WinBits ret = 0; + for (int i = 0; i < toolkitVclPropsMapLen; i++) + { + if ( toolkitVclPropsMap[ i ].propName ) + { + short nValue = 0; + if ( toolkitVclPropsMap[ i ].isBoolean ) + { + bool bValue = false; + mpImpl->getProperty( toolkitVclPropsMap[ i ].propName ) >>= bValue; + nValue = bValue ? 1 : 0; + } + else + mpImpl->getProperty( toolkitVclPropsMap[ i ].propName ) >>= nValue; + if ( nValue == toolkitVclPropsMap[ i ].enableProp ) + ret |= toolkitVclPropsMap[i].vclStyle; + } + } + return ret; +} + +/* Unpleasant way to get an xToolkit pointer ... */ +uno::Reference< awt::XToolkit > getToolkit() +{ + static uno::Reference< awt::XToolkit > xToolkit; + if (!xToolkit.is()) + { + // Urgh ... + xToolkit = uno::Reference< awt::XToolkit >( + ::comphelper::getProcessServiceFactory()->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.Toolkit" ) ) ), + uno::UNO_QUERY ); + if ( !xToolkit.is() ) + throw uno::RuntimeException( + OUString( RTL_CONSTASCII_USTRINGPARAM( "failed to create toolkit!") ), + uno::Reference< uno::XInterface >() ); + } + return xToolkit; +} + +PeerHandle Window::CreatePeer( Window *parent, WinBits nStyle, const char *pName) +{ + long nWinAttrbs = 0; + for (int i = 0; i < toolkitVclPropsMapLen; i++) + if ( nStyle & toolkitVclPropsMap[ i ].vclStyle ) + nWinAttrbs |= toolkitVclPropsMap[ i ].initAttr; + + return layoutimpl::WidgetFactory::createWidget (getToolkit(), parent->GetPeer(), OUString::createFromAscii( pName ), nWinAttrbs); +} + +void Window::Enable( bool bEnable ) +{ + if ( !getImpl().mxWindow.is() ) + return; + getImpl().mxWindow->setEnable( bEnable ); +} + +void Window::Show( bool bVisible ) +{ + if ( !getImpl().mxWindow.is() ) + return; + getImpl().mxWindow->setVisible( bVisible ); + if (!bVisible) + getImpl ().bFirstTimeVisible = true; + else if (GetParent() && getImpl().bFirstTimeVisible) + { + getImpl().redraw (); + getImpl().bFirstTimeVisible = false; + } +} + +void Window::GrabFocus() +{ + if ( !getImpl().mxWindow.is() ) + return; + getImpl().mxWindow->setFocus(); +} + +void Window::SetUpdateMode(bool mode) +{ + GetWindow()->SetUpdateMode( mode ); +} + +void Window::SetPointer( Pointer const& pointer ) +{ + GetWindow()->SetPointer( pointer ); +} + +Pointer const& Window::GetPointer() const +{ + return GetWindow()->GetPointer(); +} + +void Window::SetText( OUString const& str ) +{ + GetWindow()->SetText( str ); +} + +String Window::GetText() const +{ + return GetWindow()->GetText(); +} + +sal_Int32 Window::GetCtrlTextWidth (OUString const&) const +{ + return 0; +} + +sal_Int32 Window::GetTextHeight () const +{ + return 0; +} + +Size Window::LogicToPixel( Size const& size, MapMode const&) const +{ + return size; +} + +ControlImpl::ControlImpl (Context *context, const PeerHandle &peer, Window *window) + : WindowImpl( context, peer, window ) +{ +} + +ControlImpl::~ControlImpl () +{ + if ((!!mGetFocusHdl || !!mLoseFocusHdl) && mxWindow.is ()) + /* Disposing will be done @ VCLXWindow::dispose () maFocusListeners.disposeAndClear() + don't do it twice */ + mxWindow.clear (); +} + +void ControlImpl::SetGetFocusHdl (Link const& link) +{ + if (!mLoseFocusHdl || !link) + UpdateListening (link); + mGetFocusHdl = link; +} + +Link& ControlImpl::GetGetFocusHdl () +{ + return mGetFocusHdl; +} + +void ControlImpl::SetLoseFocusHdl (Link const& link) +{ + if (!mGetFocusHdl || !link) + UpdateListening (link); + mLoseFocusHdl = link; +} + +Link& ControlImpl::GetLoseFocusHdl () +{ + return mGetFocusHdl; +} + +void ControlImpl::UpdateListening (Link const& link) +{ + if (!link && (!!mGetFocusHdl || !!mLoseFocusHdl) + && (!mGetFocusHdl || !mLoseFocusHdl)) + mxWindow->removeFocusListener (this); + else if (!!link && !mGetFocusHdl && !mLoseFocusHdl) + mxWindow->addFocusListener (this); +} + +void SAL_CALL ControlImpl::disposing (lang::EventObject const&) + throw (uno::RuntimeException) +{ +/// mxWindow.clear (); +} + +void SAL_CALL ControlImpl::focusGained (awt::FocusEvent const&) + throw (uno::RuntimeException) +{ + mGetFocusHdl.Call (mpWindow); +} + +void SAL_CALL ControlImpl::focusLost (awt::FocusEvent const&) + throw (uno::RuntimeException) +{ + mLoseFocusHdl.Call (mpWindow); +} + +Link& Control::GetGetFocusHdl () +{ + return getImpl ().GetGetFocusHdl (); +} + +void Control::SetGetFocusHdl (Link const& link) +{ + if (&getImpl () && getImpl().mxWindow.is ()) + getImpl ().SetGetFocusHdl (link); +} + +Link& Control::GetLoseFocusHdl () +{ + return getImpl ().GetLoseFocusHdl (); +} + +void Control::SetLoseFocusHdl (Link const& link) +{ + if (&getImpl () && getImpl().mxWindow.is ()) + getImpl ().SetLoseFocusHdl (link); +} + +class DialogImpl : public WindowImpl +{ +public: + uno::Reference< awt::XDialog2 > mxDialog; + DialogImpl( Context *context, PeerHandle const &peer, Window *window ); +}; + +DialogImpl::DialogImpl( Context *context, const PeerHandle &peer, Window *window ) + : WindowImpl( context, peer, window ) + , mxDialog( peer, uno::UNO_QUERY ) +{ +} + +Dialog::Dialog( Window *parent, const char *xml_file, const char *id, sal_uInt32 nId ) + : Context( xml_file ) + , Window( new DialogImpl( this, Context::GetPeerHandle( id, nId ), this ) ) + , bConstruct (true) +{ + if ( parent ) + SetParent( parent ); +} + +Dialog::Dialog( ::Window *parent, const char *xml_file, const char *id, sal_uInt32 nId ) + : Context( xml_file ) + , Window( new DialogImpl( this, Context::GetPeerHandle( id, nId ), this ) ) +{ + if ( parent ) + SetParent( parent ); +} + +Dialog::~Dialog () +{ +} + +IMPL_GET_WINDOW (Dialog); +IMPL_GET_IMPL (Dialog); + +#define MX_DIALOG if (getImpl ().mxDialog.is ()) getImpl ().mxDialog +#define RETURN_MX_DIALOG if (getImpl ().mxDialog.is ()) return getImpl ().mxDialog + +short Dialog::Execute() +{ + RETURN_MX_DIALOG->execute (); + return -1; +} + +void Dialog::EndDialog( long result ) +{ + MX_DIALOG->endDialog (result); +} + +void Dialog::SetText( OUString const& str ) +{ + SetTitle (str); +} + +void Dialog::SetTitle( OUString const& str ) +{ + MX_DIALOG->setTitle (str); +} + +bool Dialog::Close () +{ + EndDialog (false); + return true; +} + +long Dialog::Notify (NotifyEvent& event) +{ + return GetDialog ()->Notify (event); +} + +void Dialog::Initialize (SfxChildWinInfo*) +{ +} + +#define MESSAGE_BOX_MEMBER_INIT\ + Dialog (parent, xml_file, id)\ + , imageError (this, "FI_ERROR")\ + , imageInfo (this, "FI_INFO")\ + , imageQuery (this, "FI_QUERY")\ + , imageWarning (this, "FI_WARNING")\ + , messageText (this, "FT_MESSAGE")\ + , cancelButton (this, "BTN_CANCEL")\ + , helpButton (this, "BTN_HELP")\ + , ignoreButton (this, "BTN_IGNORE")\ + , noButton (this, "BTN_NO")\ + , retryButton (this, "BTN_RETRY")\ + , yesButton (this, "BTN_YES") + +MessageBox::MessageBox (::Window *parent, char const* message, + char const* yes, char const* no, sal_uIntPtr help_id, + char const* xml_file, char const* id) + : MESSAGE_BOX_MEMBER_INIT +{ + ignoreButton.Hide (); + retryButton.Hide (); + init (message, yes, no, help_id); +} + +MessageBox::MessageBox (::Window *parent, OUString const& message, + OUString yes, OUString no, sal_uIntPtr help_id, + char const* xml_file, char const* id) + : MESSAGE_BOX_MEMBER_INIT +{ + ignoreButton.Hide (); + retryButton.Hide (); + init (message, yes, no, help_id); +} + +#if !defined (__GNUC__) +#define __PRETTY_FUNCTION__ __FUNCTION__ +#endif /* !__GNUC__ */ + +MessageBox::MessageBox (::Window *parent, WinBits bits, char const* message, + char const* yes, char const* no, sal_uIntPtr help_id, + char const* xml_file, char const* id) + : MESSAGE_BOX_MEMBER_INIT +{ + // HIG suggests using verbs instead of yes/no/retry etc. + // This constructor provides client-code compatibility: Client code should be fixed. +#ifndef __SUNPRO_CC + OSL_TRACE ("%s: warning, deprecated vcl/Messbox compatibility", __PRETTY_FUNCTION__); +#endif + bits_init (bits, OUString::createFromAscii (message), OUString::createFromAscii (yes), OUString::createFromAscii (no), help_id); +} + +MessageBox::MessageBox (::Window *parent, WinBits bits, OUString const& message, + OUString yes, OUString no, sal_uIntPtr help_id, + char const* xml_file, char const* id) + : MESSAGE_BOX_MEMBER_INIT +{ + // HIG suggests using verbs instead of yes/no/retry etc. + // This constructor provides client-code compatibility: Client code should be fixed. +#ifndef __SUNPRO_CC + OSL_TRACE ("%s: warning, deprecated vcl/Messbox compatibility", __PRETTY_FUNCTION__); +#endif + bits_init (bits, message, yes, no, help_id); +} + +void MessageBox::bits_init (WinBits bits, OUString const& message, + OUString yes, OUString no, sal_uIntPtr help_id) +{ + if ( bits & ( WB_OK_CANCEL | WB_OK )) + yes = Button::GetStandardText ( BUTTON_OK ); + if ( bits & (WB_YES_NO | WB_YES_NO_CANCEL )) + { + yes = Button::GetStandardText ( BUTTON_YES ); + no = Button::GetStandardText ( BUTTON_NO ); + } + if (! (bits & (WB_RETRY_CANCEL | WB_YES_NO_CANCEL | WB_ABORT_RETRY_IGNORE ))) + cancelButton.Hide (); + if (! (bits & (WB_RETRY_CANCEL | WB_ABORT_RETRY_IGNORE))) + retryButton.Hide (); + if ( bits & WB_ABORT_RETRY_IGNORE ) + cancelButton.SetText ( Button::GetStandardText (BUTTON_ABORT)); + else + ignoreButton.Hide (); + if ( !(bits & ( WB_OK | WB_OK_CANCEL | WB_YES_NO | WB_YES_NO_CANCEL))) + yesButton.Hide (); + if ( !(bits & ( WB_YES_NO | WB_YES_NO_CANCEL))) + noButton.Hide (); + + init (message, yes, no, help_id); +} + +void MessageBox::init (char const* message, char const* yes, char const* no, sal_uIntPtr help_id) +{ + init ( OUString::createFromAscii (message), OUString::createFromAscii (yes), OUString::createFromAscii (no), help_id); +} + +void MessageBox::init (OUString const& message, OUString const& yes, OUString const& no, sal_uIntPtr help_id) +{ + imageError.Hide (); + imageInfo.Hide (); + imageQuery.Hide (); + imageWarning.Hide (); + if (message.getLength ()) + messageText.SetText (message); + if (yes.getLength ()) + { + yesButton.SetText (yes); + if (yes != OUString (Button::GetStandardText (BUTTON_OK)) + && yes != OUString (Button::GetStandardText (BUTTON_YES))) + SetTitle (yes); + if (no.getLength ()) + noButton.SetText (no); + else + noButton.Hide (); + } + if (help_id) + SetHelpId (help_id); + else + helpButton.Hide (); +} + +#undef MESSAGE_BOX_IMPL +#define MESSAGE_BOX_IMPL(Name)\ + Name##Box::Name##Box (::Window *parent, char const* message,\ + char const* yes, char const* no, sal_uIntPtr help_id,\ + char const* xml_file, char const* id)\ + : MessageBox (parent, message, yes, no, help_id, xml_file, id)\ + {\ + image##Name.Show ();\ + }\ + Name##Box::Name##Box (::Window *parent, OUString const& message,\ + OUString yes, OUString no, sal_uIntPtr help_id,\ + char const* xml_file, char const* id)\ + : MessageBox (parent, message, yes, no, help_id, xml_file, id)\ + {\ + image##Name.Show ();\ + }\ + Name##Box::Name##Box (::Window *parent, WinBits bits, char const* message,\ + char const* yes, char const* no, sal_uIntPtr help_id,\ + char const* xml_file, char const* id)\ + : MessageBox (parent, bits, message, yes, no, help_id, xml_file, id)\ + {\ + image##Name.Show ();\ + }\ + Name##Box::Name##Box (::Window *parent, WinBits bits, OUString const& message,\ + OUString yes, OUString no, sal_uIntPtr help_id,\ + char const* xml_file, char const* id)\ + : MessageBox (parent, bits, message, yes, no, help_id, xml_file, id)\ + {\ + image##Name.Show ();\ + } + +MESSAGE_BOX_IMPL (Error); +MESSAGE_BOX_IMPL (Info); +MESSAGE_BOX_IMPL (Query); +MESSAGE_BOX_IMPL (Warning); + +class TabControlImpl + : public ControlImpl + , public ::cppu::WeakImplHelper1 <awt::XTabListener> +{ + Link mActivatePageHdl; + Link mDeactivatePageHdl; + +public: + uno::Reference <awt::XSimpleTabController> mxTabControl; + TabControlImpl (Context *context, const PeerHandle &peer, Window *window) + : ControlImpl (context, peer, window) + , mxTabControl (peer, uno::UNO_QUERY) + { + } + + virtual void SAL_CALL disposing (lang::EventObject const& e) + throw (uno::RuntimeException) + { + ControlImpl::disposing (e); + mxTabControl.clear (); + } + + Link& GetActivatePageHdl () + { + return mActivatePageHdl; + } + + void SetActivatePageHdl (Link const& link) + { + if (!mDeactivatePageHdl || !link) + UpdateListening (link); + mActivatePageHdl = link; + } + + Link& GetDeactivatePageHdl () + { + return mDeactivatePageHdl; + } + + void SetDeactivatePageHdl (Link const& link) + { + if (!mActivatePageHdl || !link) + UpdateListening (link); + mDeactivatePageHdl = link; + } + + void UpdateListening (Link const& link) + { + if (!link && (!!mActivatePageHdl || !!mDeactivatePageHdl)) + mxTabControl->removeTabListener (this); + else if (!!link && !mActivatePageHdl && !mDeactivatePageHdl) + mxTabControl->addTabListener (this); + } + + void SAL_CALL activated (sal_Int32) + throw (uno::RuntimeException) + { + mActivatePageHdl.Call (mpWindow); + } + + void SAL_CALL deactivated (sal_Int32) + throw (uno::RuntimeException) + { + mDeactivatePageHdl.Call (mpWindow); + } + + void SAL_CALL inserted (sal_Int32) + throw (uno::RuntimeException) + { + } + + void SAL_CALL removed (sal_Int32) + throw (uno::RuntimeException) + { + } + + void SAL_CALL changed (sal_Int32, uno::Sequence <beans::NamedValue> const&) + throw (uno::RuntimeException) + { + } +}; + +IMPL_GET_WINDOW (TabControl); +IMPL_GET_LAYOUT_VCLXWINDOW (TabControl); + +#define MX_TABCONTROL if (getImpl ().mxTabControl.is ()) getImpl ().mxTabControl +#define RETURN_MX_TABCONTROL if (getImpl ().mxTabControl.is ()) return getImpl ().mxTabControl + +TabControl::~TabControl () +{ + SetActivatePageHdl (Link ()); + SetDeactivatePageHdl (Link ()); +} + +void TabControl::InsertPage (sal_uInt16 id, OUString const& title, sal_uInt16 pos) +{ + (void) pos; +// GetTabControl ()->InsertPage (id, title, pos); +// GetTabControl ()->SetTabPage (id, new ::TabPage (GetTabControl ())); + + MX_TABCONTROL->insertTab (); + SetCurPageId (id); + +#if 1 // colour me loc productive -- NOT +#define ADD_PROP( seq, i, name, val )\ + { \ + beans::NamedValue value; \ + value.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( name ) ); \ + value.Value = uno::makeAny( val ); \ + seq[i] = value; \ + } + + uno::Sequence< beans::NamedValue > seq (1); + ADD_PROP ( seq, 0, "Title", OUString (title) ); + MX_TABCONTROL->setTabProps (id, seq); +#else + GetTabPage (id)->SetText (title); +#endif + +#if 0 + /// This so seems the right solution, but it makes the buttons of the + /// tabdialog move up + + ::TabPage *page = GetTabPage (id); + if (Window *w = dynamic_cast <Window*> (page)) + { + w->SetParent (this); + //GetVCLXTabControl ()->Box_Base::addChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->Box_Base::AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->AddChild (w); + //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY)); + //uno::Reference <uno::XInterface> x (page->GetWindowPeer()); + //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->::Window::GetWindowPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->GetComponentInterface (), uno::UNO_QUERY)); + } + getImpl ().redraw (); +#endif +} +void TabControl::RemovePage (sal_uInt16 id) +{ + GetTabControl ()->RemovePage (id); +} +sal_uInt16 TabControl::GetPageCount () const +{ + return GetTabControl ()->GetPageCount (); +} +sal_uInt16 TabControl::GetPageId (sal_uInt16 pos) const +{ + return GetTabControl ()->GetPageId (pos); +} +sal_uInt16 TabControl::GetPagePos (sal_uInt16 id) const +{ + getImpl ().redraw (); + return GetTabControl ()->GetPagePos (id); +} +void TabControl::SetCurPageId (sal_uInt16 id) +{ + getImpl ().redraw (); + GetTabControl ()->SetCurPageId (id); +} +sal_uInt16 TabControl::GetCurPageId () const +{ + return GetTabControl ()->GetCurPageId (); +} +void TabControl::SetTabPage (sal_uInt16 id, ::TabPage* page) +{ + GetTabControl ()->SetTabPage (id, page); + +#if 0 + /// This so seems the right solution, but it makes the buttons of the + /// tabdialog move up + if (Window *w = dynamic_cast <Window*> (page)) + { + w->SetParent (this); + //GetVCLXTabControl ()->Box_Base::addChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->Box_Base::AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->AddChild (w); + //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (w->GetPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->GetWindowPeer (), uno::UNO_QUERY)); + //GetVCLXTabControl ()->AddChild (uno::Reference <awt::XLayoutConstrains> (page->GetComponentInterface (), uno::UNO_QUERY)); + } +#endif + getImpl ().redraw (); +} +::TabPage* TabControl::GetTabPage (sal_uInt16 id) const +{ + return GetTabControl ()->GetTabPage (id); +} +void TabControl::SetActivatePageHdl (Link const& link) +{ + if (&getImpl () && getImpl().mxTabControl.is ()) + getImpl ().SetActivatePageHdl (link); +} +Link& TabControl::GetActivatePageHdl () const +{ + return getImpl ().GetActivatePageHdl (); +} +void TabControl::SetDeactivatePageHdl (Link const& link) +{ + if (&getImpl () && getImpl().mxTabControl.is ()) + getImpl ().SetDeactivatePageHdl (link); +} +Link& TabControl::GetDeactivatePageHdl () const +{ + return getImpl ().GetDeactivatePageHdl (); +} +void TabControl::SetTabPageSizePixel (Size const& size) +{ + GetTabControl ()->SetTabPageSizePixel (size); +// GetParent()->SetSizePixel (size); +// GetWindow()->SetSizePixel (size); + //GetVCLXTabControl->SetTabSize (size); +} +Size TabControl::GetTabPageSizePixel () const +{ +#if 0 + //return GetTabControl ()->GetTabPageSizePixel (); + static size_t const tab_page_first_index = 1; + for (size_t i = 0; i < GetPageCount (); i++) + { + ::TabPage *p = GetTabPage (i + tab_page_first_index); + //if (dynamic_cast<Windowt*> (p)) + if (i) // URG + return p->GetOptimalSize (WINDOWSIZE_MINIMUM); + } +#endif + return GetTabControl ()->GetTabPageSizePixel (); +} + +IMPL_CONSTRUCTORS (TabControl, Control, "tabcontrol"); +IMPL_GET_IMPL (TabControl); + +class TabPageImpl : public WindowImpl +{ +public: + uno::Reference< awt::XWindow > mxTabPage; + TabPageImpl( Context *context, const PeerHandle &peer, Window *window ) + : WindowImpl( context, peer, window ) + , mxTabPage( peer, uno::UNO_QUERY ) + { + } +}; + +::Window* TabPage::global_parent = 0; +TabControl* TabPage::global_tabcontrol = 0; + +IMPL_GET_IMPL( TabPage ); + +TabPage::TabPage( Window *parent, const char *xml_file, const char *id, sal_uInt32 nId) + : Context( xml_file ) + , Window( new TabPageImpl( this, Context::GetPeerHandle( id, nId ), this ) ) +{ + if ( parent ) + SetParent( parent ); +} + +TabPage::TabPage( ::Window *parent, const char *xml_file, const char *id, sal_uInt32 nId) + : Context( xml_file ) + , Window( new TabPageImpl( this, Context::GetPeerHandle( id, nId ), this ) ) +{ + if ( parent ) + SetParent( parent ); +} + +TabPage::~TabPage() +{ + delete GetTabPage(); +} + +IMPL_GET_WINDOW( TabPage ); + +void TabPage::ActivatePage() +{ +} + +void TabPage::DeactivatePage() +{ +} + +class FixedLineImpl : public ControlImpl +{ +public: + FixedLineImpl( Context *context, const PeerHandle &peer, Window *window ) + : ControlImpl( context, peer, window ) + { + } +}; + +IMPL_CONSTRUCTORS( FixedLine, Control, "hfixedline" ); +IMPL_GET_IMPL( FixedLine ); + +bool FixedLine::IsEnabled() const +{ + //FIXME + return true; +} + +class FixedTextImpl : public ControlImpl +{ +public: + uno::Reference< awt::XFixedText > mxFixedText; + FixedTextImpl( Context *context, const PeerHandle &peer, Window *window ) + : ControlImpl( context, peer, window ) + , mxFixedText( peer, uno::UNO_QUERY ) + { + } + + ~FixedTextImpl (); + + virtual void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException); +}; + +FixedTextImpl::~FixedTextImpl () +{ +} + +void SAL_CALL FixedTextImpl::disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) +{ + ControlImpl::disposing (e); + mxFixedText.clear (); +} + +FixedText::~FixedText () +{ +} + +IMPL_CONSTRUCTORS( FixedText, Control, "fixedtext" ); +IMPL_GET_IMPL( FixedText ); + +void FixedText::SetText( OUString const& rStr ) +{ + if ( !getImpl().mxFixedText.is() ) + return; + getImpl().mxFixedText->setText( rStr ); +} + +class FixedInfoImpl : public FixedTextImpl +{ +public: + FixedInfoImpl( Context *context, const PeerHandle &peer, Window *window ) + : FixedTextImpl( context, peer, window ) + { + } +}; + +IMPL_CONSTRUCTORS( FixedInfo, FixedText, "fixedinfo" ); +IMPL_GET_IMPL( FixedInfo ); + +class ProgressBarImpl : public ControlImpl +{ +public: + uno::Reference< awt::XProgressBar > mxProgressBar; + ProgressBarImpl( Context *context, const PeerHandle &peer, Window *window ) + : ControlImpl( context, peer, window ) + , mxProgressBar( peer, uno::UNO_QUERY ) + { + } + + virtual void SAL_CALL disposing( lang::EventObject const& e ) + throw (uno::RuntimeException) + { + ControlImpl::disposing (e); + mxProgressBar.clear (); + } +}; + + +class FixedImageImpl: public ControlImpl +{ +public: + uno::Reference< graphic::XGraphic > mxGraphic; + FixedImageImpl( Context *context, const PeerHandle &peer, Window *window) +// const char *pName ) + : ControlImpl( context, peer, window ) + //, mxGraphic( layoutimpl::loadGraphic( pName ) ) + , mxGraphic( peer, uno::UNO_QUERY ) + { + if ( !mxGraphic.is() ) + { + DBG_ERROR( "ERROR: failed to load image: `%s'" /*, pName*/ ); + } +#if 0 + else + getImpl().mxGraphic->...(); +#endif + } +}; + +IMPL_CONSTRUCTORS( FixedImage, Control, "fixedimage" ); +IMPL_GET_IMPL( FixedImage ) + +void FixedImage::setImage( ::Image const& i ) +{ + (void) i; + if ( !getImpl().mxGraphic.is() ) + return; + //FIXME: hack moved to proplist + //getImpl().mxGraphic = +} + +#if 0 + +FixedImage::FixedImage( const char *pName ) + : pImpl( new FixedImageImpl( pName ) ) +{ +} + +FixedImage::~FixedImage() +{ + delete pImpl; +} + +#endif + + +IMPL_CONSTRUCTORS( ProgressBar, Control, "ProgressBar" ); +IMPL_GET_IMPL( ProgressBar ); + +void ProgressBar::SetForegroundColor( util::Color color ) +{ + if ( !getImpl().mxProgressBar.is() ) + return; + getImpl().mxProgressBar->setForegroundColor( color ); +} + +void ProgressBar::SetBackgroundColor( util::Color color ) +{ + if ( !getImpl().mxProgressBar.is() ) + return; + getImpl().mxProgressBar->setBackgroundColor( color ); +} + +void ProgressBar::SetValue( sal_Int32 i ) +{ + if ( !getImpl().mxProgressBar.is() ) + return; + getImpl().mxProgressBar->setValue( i ); +} + +void ProgressBar::SetRange( sal_Int32 min, sal_Int32 max ) +{ + if ( !getImpl().mxProgressBar.is() ) + return; + getImpl().mxProgressBar->setRange( min, max ); +} + +sal_Int32 ProgressBar::GetValue() +{ + if ( !getImpl().mxProgressBar.is() ) + return 0; + return getImpl().mxProgressBar->getValue(); +} + +class PluginImpl: public ControlImpl +{ +public: + ::Control *mpPlugin; + + PluginImpl( Context *context, const PeerHandle &peer, Window *window, :: Control *plugin ) + : ControlImpl( context, peer, window ) + , mpPlugin( plugin ) + { + uno::Reference <awt::XWindow> ref( mxWindow, uno::UNO_QUERY ); + layoutimpl::VCLXPlugin *vcl + = static_cast<layoutimpl::VCLXPlugin*>( VCLXWindow::GetImplementation( ref ) ); + ::Window *parent = vcl->mpWindow->GetParent(); + vcl->SetWindow( plugin ); + vcl->SetPlugin( mpPlugin ); + plugin->SetParent( parent ); + plugin->SetStyle( vcl->mStyle ); + plugin->SetCreatedWithToolkit( true ); + plugin->SetComponentInterface( vcl ); + plugin->Show(); + } +}; + +Plugin::Plugin( Context *context, char const *id, ::Control *plugin ) + : Control( new PluginImpl( context, context->GetPeerHandle( id, 0 ), this, plugin ) ) + , mpPlugin( plugin ) +{ +} + +IMPL_GET_IMPL( Plugin ); + +class LocalizedStringImpl : public WindowImpl +{ +public: + layoutimpl::LocalizedString *mpString; + OUString maString; + LocalizedStringImpl( Context *context, const PeerHandle &peer, Window *window ) + : WindowImpl( context, peer, window ) + , mpString( static_cast<layoutimpl::LocalizedString*>( VCLXWindow::GetImplementation( uno::Reference <awt::XWindow> ( mxWindow, uno::UNO_QUERY ) ) ) ) + , maString () + { + } + OUString getText() + { + if (mpString) + maString = mpString->getText (); + return maString; + } + void setText( OUString const& s ) + { + if (mpString) + mpString->setText( s ); + } +}; + +IMPL_GET_IMPL( LocalizedString ); + +LocalizedString::LocalizedString( Context *context, char const* id ) + : Window( new LocalizedStringImpl( context, context->GetPeerHandle( id, 0 ), this ) ) +{ +} + +String LocalizedString::getString () +{ + return getImpl ().getText (); +} + +OUString LocalizedString::getOUString () +{ + return getImpl ().getText (); +} + +LocalizedString::operator OUString () +{ + return getOUString (); +} + +LocalizedString::operator OUString const& () +{ + getOUString (); + return getImpl ().maString; +} + +LocalizedString::operator String() +{ + getOUString (); + return getImpl ().maString; +} + +String LocalizedString::GetToken (USHORT i, sal_Char c) +{ + return getString ().GetToken (i, c); +} + +OUString LocalizedString::operator= (OUString const& s) +{ + getImpl().setText( s ); + return getImpl().getText(); +} + +OUString LocalizedString::operator+= (OUString const& b) +{ + OUString a = getImpl ().getText (); + a += b; + getImpl ().setText (a); + return getImpl ().getText (); +} + +OUString LocalizedString::operator+= (sal_Unicode const b) +{ + String a = getImpl ().getText (); + a += b; + getImpl ().setText (a); + return getImpl ().getText (); +} + +class InPlugImpl : public WindowImpl +{ +public: + InPlugImpl (Context *context, const PeerHandle &peer, Window *window) + : WindowImpl (context, peer, window) + { + } +}; + +IMPL_GET_IMPL (InPlug); + +static char const *FIXME_set_parent (::Window *parent, char const *xml_file) +{ + layout::TabPage::global_parent = parent; + return xml_file; +} + +InPlug::InPlug (Window *parent, char const* xml_file, char const* id, sal_uInt32 nId) + : Context (FIXME_set_parent (parent ? parent->GetWindow () : 0, xml_file)) + , layout::Window (new InPlugImpl (this, Context::GetPeerHandle (id, nId), this)) +{ + if (parent) + SetParent (parent); + if (::Window *w = dynamic_cast< ::Window* > (this)) + w->SetComponentInterface (GetVCLXWindow ()); +} + +InPlug::InPlug (::Window *parent, char const* xml_file, char const* id, sal_uInt32 nId) + : Context (FIXME_set_parent (parent, xml_file)) + , layout::Window (new InPlugImpl (this, Context::GetPeerHandle (id, nId), this)) +{ + if (parent) + layout::Window::SetParent (parent); + if (::Window *w = dynamic_cast< ::Window* > (this)) + w->SetComponentInterface (GetVCLXWindow ()); +} + +void InPlug::ParentSet (Window *window) +{ + window->SetParent (dynamic_cast< ::Window* > (this)); + + /// FIXME: for standalone run of layout::SfxTabDialog + SetParent (window->GetParent ()); +} + +} // namespace layout diff --git a/toolkit/source/layout/vcl/wrapper.hxx b/toolkit/source/layout/vcl/wrapper.hxx new file mode 100644 index 000000000000..a9d5a6490c31 --- /dev/null +++ b/toolkit/source/layout/vcl/wrapper.hxx @@ -0,0 +1,153 @@ +/************************************************************************* + * + * 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$ + * + * $Revision$ + * + * 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. + * + ************************************************************************/ + +#ifndef LAYOUT_VCL_WRAPPER_HXX +#define LAYOUT_VCL_WRAPPER_HXX + +#include <layout/layout.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/awt/XDialog2.hpp> +#include <com/sun/star/awt/XFocusListener.hpp> +#include <com/sun/star/awt/XWindow.hpp> +#include <com/sun/star/awt/XVclWindowPeer.hpp> +#include <cppuhelper/implbase1.hxx> + +#include <cstring> + +namespace layout +{ + +namespace css = com::sun::star; + +class WindowImpl +{ +public: + Window *mpWindow; + Context *mpCtx; + css::uno::Reference< css::awt::XWindow > mxWindow; + css::uno::Reference< css::awt::XVclWindowPeer > mxVclPeer; + ::Window *mvclWindow; + bool bFirstTimeVisible; + + WindowImpl (Context *context, PeerHandle const &peer, Window *window); + virtual ~WindowImpl (); + + void wrapperGone(); + css::uno::Any getProperty (char const *name); + void setProperty (char const *name, css::uno::Any any); + void redraw (bool resize=false); + + // XFocusListener + virtual void SAL_CALL disposing (css::lang::EventObject const&) throw (css::uno::RuntimeException); +}; + +class ControlImpl : public WindowImpl + , public ::cppu::WeakImplHelper1 <css::awt::XFocusListener> +{ +public: + Link mGetFocusHdl; + Link mLoseFocusHdl; + + ControlImpl( Context *context, PeerHandle const& peer, Window *window ); + ~ControlImpl (); + + virtual void SetGetFocusHdl (Link const& link); + Link& GetGetFocusHdl (); + virtual void SetLoseFocusHdl (Link const& link); + Link& GetLoseFocusHdl (); + virtual void UpdateListening (Link const& link); + + // XFocusListener + virtual void SAL_CALL disposing (css::lang::EventObject const&) throw (css::uno::RuntimeException); + void SAL_CALL focusGained (css::awt::FocusEvent const& e) throw (css::uno::RuntimeException); + void SAL_CALL focusLost (css::awt::FocusEvent const& e) throw (css::uno::RuntimeException); +}; + +inline WindowImpl &Window::getImpl() const{ return *(static_cast< WindowImpl * >( mpImpl )); } + +// Helpers for defining boiler-plate constructors ... +// Could in-line in top-level but not with safe static_casts. +#define IMPL_GET_IMPL(t) \ + inline t##Impl &t::getImpl() const \ + { \ + return *(static_cast<t##Impl *>(mpImpl)); \ + } +#define IMPL_CONSTRUCTORS_BODY(t,par,unoName,body) \ + t::t( Context *context, const char *pId, sal_uInt32 nId ) \ + : par( new t##Impl( context, context->GetPeerHandle( pId, nId ), this ) ) \ + { \ + Window *parent = dynamic_cast<Window*> (context);\ + body;\ + if (parent)\ + SetParent (parent);\ + } \ + t::t( Window *parent, WinBits bits) \ + : par( new t##Impl( parent->getContext(), Window::CreatePeer( parent, bits, unoName ), this ) ) \ + { \ + body;\ + if ( parent )\ + SetParent (parent);\ + } \ + t::t( Window *parent, ResId const& res) \ + : par( new t##Impl( parent->getContext(), Window::CreatePeer( parent, 0, unoName ), this ) ) \ + { \ + body;\ + setRes (res);\ + if (parent)\ + SetParent (parent);\ + } +#define IMPL_CONSTRUCTORS(t,par,unoName) IMPL_CONSTRUCTORS_BODY(t, par, unoName, ) +#define IMPL_CONSTRUCTORS_2(t,win_par,other_par,unoName) \ + t::t( Context *context, const char *pId, sal_uInt32 nId ) \ + : win_par( new t##Impl( context, context->GetPeerHandle( pId, nId ), this ) ) \ + , other_par( new other_par##Impl( Window::GetPeer() ) ) \ + { \ + } \ + t::t( Window *parent, WinBits bits) \ + : win_par( new t##Impl( parent->getContext(), Window::CreatePeer( parent, bits, unoName ), this ) ) \ + , other_par( new other_par##Impl( Window::GetPeer() ) ) \ + { \ + } + +#define IMPL_IMPL(t, parent) \ + class t##Impl : public parent##Impl \ + { \ + public: \ + t##Impl( Context *context, PeerHandle const& peer, Window *window ) \ + : parent##Impl( context, peer, window ) \ + { \ + } \ + }; + + +} // namespace layout + +#endif /* LAYOUT_VCL_WRAPPER_HXX */ |