Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDejan Gloszic2006-02-22 22:35:52 +0000
committerDejan Gloszic2006-02-22 22:35:52 +0000
commit415a4c917e55a1049ff811bde99b615ed864addc (patch)
tree59319622905f5c1b7c60cd0cc55dd8ec73f3181a
parent41d602cdd78df7e60a202ff2334717a5b3ecc986 (diff)
downloadeclipse.platform.ua-415a4c917e55a1049ff811bde99b615ed864addc.tar.gz
eclipse.platform.ua-415a4c917e55a1049ff811bde99b615ed864addc.tar.xz
eclipse.platform.ua-415a4c917e55a1049ff811bde99b615ed864addc.zip
Releasing baseline content for Universal Welcomev20060222
-rw-r--r--org.eclipse.ui.intro.universal/.classpath7
-rw-r--r--org.eclipse.ui.intro.universal/.cvsignore1
-rw-r--r--org.eclipse.ui.intro.universal/.options24
-rw-r--r--org.eclipse.ui.intro.universal/.project28
-rw-r--r--org.eclipse.ui.intro.universal/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.ui.intro.universal/about.html22
-rw-r--r--org.eclipse.ui.intro.universal/build.properties14
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/elcl16/configure.gifbin0 -> 547 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/extension_obj.gifbin0 -> 186 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/firststeps16.pngbin0 -> 814 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/icallout_obj.gifbin0 -> 358 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/ihigh_obj.gifbin0 -> 202 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/ilow_obj.gifbin0 -> 307 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/image_obj.gifbin0 -> 1051 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/inew_obj.gifbin0 -> 209 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/migrate16.pngbin0 -> 687 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/overview16.pngbin0 -> 757 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/samples16.pngbin0 -> 736 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/tutorials16.pngbin0 -> 607 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/webresources16.pngbin0 -> 635 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/full/obj16/whatsnew16.pngbin0 -> 607 bytes
-rw-r--r--org.eclipse.ui.intro.universal/icons/welcome_item.gifbin0 -> 124 bytes
-rw-r--r--org.eclipse.ui.intro.universal/introContent.xml253
-rw-r--r--org.eclipse.ui.intro.universal/plugin.properties20
-rw-r--r--org.eclipse.ui.intro.universal/plugin.xml65
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java74
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionData.java125
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionDataTransfer.java113
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java166
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java101
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java189
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java86
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties82
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java180
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java436
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java148
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java1083
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java232
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java187
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java142
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/StringUtil.java49
-rw-r--r--org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java81
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/banner_left_lines.pngbin0 -> 7700 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/fs_banner.jpgbin0 -> 12542 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav.pngbin0 -> 2166 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_hover.pngbin0 -> 6350 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_lg.pngbin0 -> 9387 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/mi_banner.jpgbin0 -> 10006 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav.pngbin0 -> 1579 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_hover.pngbin0 -> 5755 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_lg.pngbin0 -> 5978 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/nav_midhov.pngbin0 -> 189 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/nav_rightedgehov.pngbin0 -> 2940 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/new_obj.gifbin0 -> 1814 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/newhov_obj.gifbin0 -> 2045 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/ov_banner.jpgbin0 -> 12283 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav.pngbin0 -> 2046 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_hover.pngbin0 -> 5911 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_lg.pngbin0 -> 6156 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_midhov.pngbin0 -> 221 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_rightedgehov.pngbin0 -> 273 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/overview48sel.gifbin0 -> 2573 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/circles.pngbin0 -> 123672 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps.pngbin0 -> 10857 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps48.pngbin0 -> 6388 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps_tophov.pngbin0 -> 16468 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate.pngbin0 -> 6439 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate48.pngbin0 -> 5646 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate_tophov.pngbin0 -> 13606 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview.pngbin0 -> 11440 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview48.pngbin0 -> 5371 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview_tophov.pngbin0 -> 15145 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_bottomhov.pngbin0 -> 3530 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_midhov.pngbin0 -> 177 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples.pngbin0 -> 8010 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples48.pngbin0 -> 6014 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples_tophover.pngbin0 -> 13589 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials.pngbin0 -> 6908 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials48.pngbin0 -> 5816 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials_tophov.pngbin0 -> 12735 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources.pngbin0 -> 8350 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources48.pngbin0 -> 6097 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources_tophov.pngbin0 -> 14410 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/welcomebckgrd.jpgbin0 -> 65219 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew.pngbin0 -> 6936 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew48.pngbin0 -> 5627 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew_tophov.pngbin0 -> 13550 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench.pngbin0 -> 5580 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench48.pngbin0 -> 5421 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench_tophov.pngbin0 -> 11699 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/sa_banner.jpgbin0 -> 11606 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav.pngbin0 -> 2046 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_hover.pngbin0 -> 6090 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_lg.pngbin0 -> 6634 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/samples48.gifbin0 -> 2749 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/samples48sel.gifbin0 -> 2954 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/tu_banner.jpgbin0 -> 11188 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav.pngbin0 -> 1733 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_hover.pngbin0 -> 5994 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_lg.pngbin0 -> 5519 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/tutorials48sel.gifbin0 -> 2525 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav.pngbin0 -> 1205 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav_hover.pngbin0 -> 5376 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/whatsnew48sel.gifbin0 -> 2359 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wn_banner.jpgbin0 -> 12124 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav.pngbin0 -> 1534 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_hover.pngbin0 -> 5840 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_lg.pngbin0 -> 6588 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wr_banner.jpgbin0 -> 9798 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav.pngbin0 -> 1805 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_hover.pngbin0 -> 5926 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_lg.pngbin0 -> 7413 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/firststeps.css91
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/migrate.css132
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/overview.css78
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/root.css207
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/samples.css74
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/shared.css268
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/standby.css119
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/tutorials.css77
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/webresources.css132
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/html/whatsnew.css146
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/firststeps.properties3
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/migrate.properties3
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/overview.properties6
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/root.properties30
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/samples.properties8
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/standby.properties15
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/tutorials.properties7
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/webresources.properties6
-rw-r--r--org.eclipse.ui.intro.universal/themes/circles/swt/whatsnew.properties9
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/background.jpgbin0 -> 132168 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/backgroundcurve.gifbin0 -> 8450 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/overview_wtr.jpgbin0 -> 34130 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/samples_wtr.jpgbin0 -> 37704 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section1.gifbin0 -> 80 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section2.gifbin0 -> 79 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section3.gifbin0 -> 79 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section4.gifbin0 -> 79 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/tutorials_wtr.jpgbin0 -> 32752 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/whatsnew_wtr.jpgbin0 -> 32446 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48.gifbin0 -> 2397 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48sel.gifbin0 -> 2573 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview72.gifbin0 -> 3675 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48.gifbin0 -> 2749 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48sel.gifbin0 -> 2954 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples72.gifbin0 -> 4569 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48.gifbin0 -> 2413 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48sel.gifbin0 -> 2525 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials72.gifbin0 -> 3684 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/wb48.gifbin0 -> 1754 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48.gifbin0 -> 2145 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48sel.gifbin0 -> 2359 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew72.gifbin0 -> 3322 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/back.gifbin0 -> 827 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/forward.gifbin0 -> 822 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/overview.gifbin0 -> 577 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/restore_welcome.gifbin0 -> 329 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/samples.gifbin0 -> 588 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/tutorials.gifbin0 -> 349 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/whatsnew.gifbin0 -> 350 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/back.gifbin0 -> 1264 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/forward.gifbin0 -> 1261 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview.gifbin0 -> 599 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48.gifbin0 -> 2212 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48sel.gifbin0 -> 2764 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview72.gifbin0 -> 3490 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/restore_welcome.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples.gifbin0 -> 617 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48.gifbin0 -> 2636 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48sel.gifbin0 -> 3099 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples72.gifbin0 -> 4455 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials.gifbin0 -> 349 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48.gifbin0 -> 2219 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48sel.gifbin0 -> 2654 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials72.gifbin0 -> 3449 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/wb48.gifbin0 -> 1511 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew.gifbin0 -> 552 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48.gifbin0 -> 1925 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48sel.gifbin0 -> 2580 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew72.gifbin0 -> 2940 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/new_obj.gifbin0 -> 1814 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/newhov_obj.gifbin0 -> 2045 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/background.jpgbin0 -> 235002 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/brandmark.gifbin0 -> 4256 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/dots.gifbin0 -> 435 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/swt/form_banner.gifbin0 -> 5600 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/overview.css90
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/root.css211
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/samples.css8
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/shared.css385
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/standby.css132
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/tutorials.css92
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/html/whatsnew.css123
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/preview.pngbin0 -> 13700 bytes
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/firststeps.properties3
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/migrate.properties3
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/overview.properties6
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/root.properties29
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/samples.properties8
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/standby.properties17
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/tutorials.properties7
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/webresources.properties6
-rw-r--r--org.eclipse.ui.intro.universal/themes/purpleMesh/swt/whatsnew.properties9
204 files changed, 6462 insertions, 0 deletions
diff --git a/org.eclipse.ui.intro.universal/.classpath b/org.eclipse.ui.intro.universal/.classpath
new file mode 100644
index 000000000..065ac06e1
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.ui.intro.universal/.cvsignore b/org.eclipse.ui.intro.universal/.cvsignore
new file mode 100644
index 000000000..ba077a403
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.ui.intro.universal/.options b/org.eclipse.ui.intro.universal/.options
new file mode 100644
index 000000000..8de8a489c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/.options
@@ -0,0 +1,24 @@
+# Debugging options for the org.eclipse.ui.intro.universal.
+
+# Master flag for all org.eclipse.ui.intro.universal plugin debug options.
+org.eclipse.ui.intro.universal/debug = true
+
+# Enable logging of information messages in the plugin. By default, info
+# messages are not logged. Setting this option to true will enable logging
+# trace information messages.
+org.eclipse.ui.intro.universal/trace/logInfo = true
+
+# Enable logging of performance messages in the plugin. By default, performance
+# messages are not logged. Setting this option to true will enable logging
+# trace information messages. (note: enabling info logging does not enable
+# this flag.)
+org.eclipse.ui.intro.universal/trace/logPerformance = false
+
+# Performance flags used by the Performance framework to report failures
+# of specific thresholds.
+
+# Time to create and display the full Intro view.
+# org.eclipse.ui.intro/perf/createView = 1000
+
+# Time needed to switch between Intro standby states.
+# org.eclipse.ui.intro/perf/setStandbyState = 300 \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/.project b/org.eclipse.ui.intro.universal/.project
new file mode 100644
index 000000000..28c971b43
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.ui.intro.universal</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.ui.intro.universal/META-INF/MANIFEST.MF b/org.eclipse.ui.intro.universal/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..a5b84f498
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %plugin_name
+Bundle-SymbolicName: org.eclipse.ui.intro.universal;singleton:=true
+Bundle-Version: 3.2.0.qualifier
+Bundle-Vendor: %provider_name
+Bundle-Localization: plugin
+Export-Package: org.eclipse.ui.internal.intro.universal;x-internal:=true,
+ org.eclipse.ui.intro.universal
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.1.0,4.0.0)",
+ org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.ui.intro;bundle-version="[3.2.0,4.0.0)"
+Eclipse-LazyStart: true
+Bundle-Activator: org.eclipse.ui.internal.intro.universal.UniversalIntroPlugin
diff --git a/org.eclipse.ui.intro.universal/about.html b/org.eclipse.ui.intro.universal/about.html
new file mode 100644
index 000000000..83e993035
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/about.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>March 23, 2005</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/build.properties b/org.eclipse.ui.intro.universal/build.properties
new file mode 100644
index 000000000..b04d830a9
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/build.properties
@@ -0,0 +1,14 @@
+bin.includes = plugin.xml,\
+ .,\
+ themes/,\
+ plugin.properties,\
+ introContent.xml,\
+ icons/,\
+ META-INF/,\
+ .options,\
+ about.html
+src.includes = about.html,\
+ .options
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.ui.intro.universal/icons/full/elcl16/configure.gif b/org.eclipse.ui.intro.universal/icons/full/elcl16/configure.gif
new file mode 100644
index 000000000..8304a2b71
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/elcl16/configure.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/extension_obj.gif b/org.eclipse.ui.intro.universal/icons/full/obj16/extension_obj.gif
new file mode 100644
index 000000000..7f3f595bc
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/extension_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/firststeps16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/firststeps16.png
new file mode 100644
index 000000000..4c15c823b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/firststeps16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/icallout_obj.gif b/org.eclipse.ui.intro.universal/icons/full/obj16/icallout_obj.gif
new file mode 100644
index 000000000..f52d86a67
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/icallout_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/ihigh_obj.gif b/org.eclipse.ui.intro.universal/icons/full/obj16/ihigh_obj.gif
new file mode 100644
index 000000000..f99bdc358
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/ihigh_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/ilow_obj.gif b/org.eclipse.ui.intro.universal/icons/full/obj16/ilow_obj.gif
new file mode 100644
index 000000000..a6815bcc0
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/ilow_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/image_obj.gif b/org.eclipse.ui.intro.universal/icons/full/obj16/image_obj.gif
new file mode 100644
index 000000000..830be0ea0
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/image_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/inew_obj.gif b/org.eclipse.ui.intro.universal/icons/full/obj16/inew_obj.gif
new file mode 100644
index 000000000..b1526e931
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/inew_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/migrate16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/migrate16.png
new file mode 100644
index 000000000..3fc84145d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/migrate16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/overview16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/overview16.png
new file mode 100644
index 000000000..b2e977f8d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/overview16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/samples16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/samples16.png
new file mode 100644
index 000000000..fdff5dd5b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/samples16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/tutorials16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/tutorials16.png
new file mode 100644
index 000000000..f2d688f21
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/tutorials16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/webresources16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/webresources16.png
new file mode 100644
index 000000000..b847caad5
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/webresources16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/full/obj16/whatsnew16.png b/org.eclipse.ui.intro.universal/icons/full/obj16/whatsnew16.png
new file mode 100644
index 000000000..5294b1741
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/full/obj16/whatsnew16.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/icons/welcome_item.gif b/org.eclipse.ui.intro.universal/icons/welcome_item.gif
new file mode 100644
index 000000000..311f57fe9
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/icons/welcome_item.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/introContent.xml b/org.eclipse.ui.intro.universal/introContent.xml
new file mode 100644
index 000000000..81360325a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/introContent.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ A content file for the Universal Welcome
+-->
+<introContent>
+ <!-- Root page -->
+ <page id="root" alt-style="$theme$/swt/root.properties" style="$theme$/html/root.css" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="links-background">
+ <group id="page-links" computed="true"/>
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <img id="workbench_img" style-id="content-img" alt="Go to the workbench">
+ </img>
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ <group id="branding" style-id="branding" bgImage="$introBrandingImage$">
+ </group>
+ <!-- General purpose groups for adding additional content -->
+ <group id="extra-group1" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group5" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- Standby page -->
+ <page id="standby" alt-style="$theme$/swt/standby.properties" style="$theme$/html/standby.css" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="links-background">
+ <group id="page-links" computed="true">
+ </group>
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <img id="workbench_img" style-id="content-img" alt="Go to the workbench">
+ </img>
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ <group id="branding" style-id="branding" bgImage="$introBrandingImage$">
+ </group>
+ <!-- General-purpose groups for additional content -->
+ <group id="extra-group1" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- Overview page -->
+ <page id="overview" style="$theme$/html/overview.css" alt-style="$theme$/swt/overview.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="extra-group1" filteredFrom="swt"/>
+ <!-- navigation -->
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <!-- content -->
+ <group id="page-content">
+ <group id="content-header" label="OVERVIEW" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">OVERVIEW</text>
+ <text style-id="page-description" id="page-description">Eclipse is a kind of universal tool platform - an open extensible IDE for anything and nothing in particular. It provides a feature-rich development environment that allows the developer to efficiently create tools that integrate seamlessly into the Eclipse Platform.</text>
+ <!-- panes -->
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <!-- extra groups for additional effects -->
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- Tutorials page -->
+ <page id="tutorials" style="$theme$/html/tutorials.css" alt-style="$theme$/swt/tutorials.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="extra-group1" filteredFrom="swt"/>
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <group id="page-content">
+ <group id="content-header" label="TUTORIALS" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">TUTORIALS</text>
+ <text style-id="page-description" id="page-description">Learn how to be productive using Eclipse by completing end-to-end tutorials that will guide you along the way.</text>
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- Samples page -->
+ <page id="samples" style="$theme$/html/samples/samples.css" alt-style="$theme$/swt/samples.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="extra-group1" filteredFrom="swt"/>
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <group id="page-content">
+ <group id="content-header" label="SAMPLES" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">SAMPLES</text>
+ <text style-id="page-description" id="page-description">Explore Eclipse by installing prefabricated samples (may require Internet connection).</text>
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- What's New page -->
+ <page id="whatsnew" style="$theme$/html/whatsnew.css" alt-style="$theme$/swt/whatsnew.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="extra-group1" filteredFrom="swt"/>
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <group id="page-content">
+ <group id="content-header" label="WHAT'S NEW" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">WHAT'S NEW</text>
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- First Steps page -->
+ <page id="firststeps" style="$theme$/html/firststeps.css" alt-style="$theme$/swt/firststeps.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="extra-group1" filteredFrom="swt"/>
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <group id="page-content">
+ <group id="content-header" label="FIRST STEPS" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">FIRST STEPS</text>
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+ <!-- Web resources page -->
+ <page id="webresources" style="$theme$/html/webresources.css" alt-style="$theme$/swt/webresources.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <group id="page-content">
+ <group id="content-header" label="WEB RESOURCES" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">WEB RESOURCE</text>
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+
+
+ <!-- Migrate page -->
+ <page id="migrate" style="$theme$/html/migrate.css" alt-style="$theme$/swt/migrate.properties" style-id="page">
+ <title style-id="intro-header">$introTitle$</title>
+ <group id="extra-group1" filteredFrom="swt"/>
+ <group id="navigation-links" filteredFrom="swt">
+ <group id="page-links" computed="true">
+ </group>
+ <group id="action-links">
+ <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
+ <text>Go to the workbench</text>
+ </link>
+ </group>
+ </group>
+ <group id="page-content">
+ <group id="content-header" label="MIGRATE" filteredFrom="swt">
+ </group>
+ <text style-id="page-title" id="page-title" filteredFrom="html">MIGRATE</text>
+ <group id="top-left" computed="true"/>
+ <group id="top-right" computed="true"/>
+ <group id="content-divider"/>
+ <group id="bottom-left" computed="true"/>
+ <group id="bottom-right" computed="true"/>
+ </group>
+ <group id="extra-group2" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group3" filteredFrom="swt"><anchor id="anchor"/></group>
+ <group id="extra-group4" filteredFrom="swt"><anchor id="anchor"/></group>
+ </page>
+</introContent>
diff --git a/org.eclipse.ui.intro.universal/plugin.properties b/org.eclipse.ui.intro.universal/plugin.properties
new file mode 100644
index 000000000..80a220bbd
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/plugin.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2000, 2006 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# IBM Corporation - initial API and implementation
+###############################################################################
+
+# ==============================================
+# Universal Welcome plugin.xml properties file
+# ==============================================
+
+plugin_name = Universal Welcome
+provider_name = Eclipse.org
+
+theme.name.circles = Circles
+theme.name.purpleMesh = Purple Mesh \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/plugin.xml b/org.eclipse.ui.intro.universal/plugin.xml
new file mode 100644
index 000000000..ecbb1a29d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/plugin.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+
+<!-- ========== Extension Points ================= -->
+<!-- =============================================================================== -->
+<!-- Extension point: org.eclipse.ui.intro.config -->
+<!-- Extension-point for contributing a configuration to a Customizable Intro Part. -->
+<!-- -->
+<!-- =============================================================================== -->
+<!-- ================================================================================= -->
+<!-- Extension point: org.eclipse.ui.intro.configExtension -->
+<!-- Extension-point for contributing an extension to an existing intro configuration -->
+<!-- -->
+<!-- ================================================================================= -->
+
+ <extension
+ point="org.eclipse.ui.intro">
+ <intro
+ class="org.eclipse.ui.intro.config.CustomizableIntroPart"
+ icon="$nl$/icons/welcome_item.gif"
+ id="org.eclipse.ui.intro.universal"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.intro.config">
+ <config
+ configurer="org.eclipse.ui.internal.intro.universal.UniversalIntroConfigurer"
+ content="$nl$/introContent.xml"
+ id="org.eclipse.ui.intro.universalConfig"
+ introId="org.eclipse.ui.intro.universal">
+ <presentation
+ home-page-id="root" standby-page-id="standby">
+ <!-- -->
+ <implementation
+ style="$theme$/html/shared.css"
+ kind="html"
+ os="win32,linux,macosx">
+ </implementation>
+ <!-- -->
+ <implementation
+ kind="swt">
+ </implementation>
+ <launchBar
+ location="fastview"
+ bg="#c6c3e8"
+ computed="true">
+ </launchBar>
+ </presentation>
+ </config>
+ </extension>
+ <extension
+ point="org.eclipse.ui.intro.configExtension">
+ <theme
+ default="true"
+ id="org.eclipse.ui.intro.universal.circles"
+ name="%theme.name.circles"
+ path="$nl$/themes/circles"/>
+ <theme
+ id="org.eclipse.ui.intro.universal.purpleMesh"
+ name="%theme.name.purpleMesh"
+ path="$nl$/themes/purpleMesh"
+ previewImage="themes/purpleMesh/preview.png"/>
+ </extension>
+</plugin>
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java
new file mode 100644
index 000000000..811b7fe6f
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java
@@ -0,0 +1,74 @@
+package org.eclipse.ui.internal.intro.universal;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.internal.intro.impl.IntroPlugin;
+import org.eclipse.ui.intro.IIntroSite;
+
+
+public class CustomizeAction extends Action {
+
+ public static final String P_PAGE_ID = "pageId"; //$NON-NLS-1$
+ private IIntroSite site;
+ private IConfigurationElement element;
+
+ public CustomizeAction(IIntroSite site, IConfigurationElement element) {
+ this.site = site;
+ this.element = element;
+ }
+
+ public void run() {
+ String pageId = IntroPlugin.getDefault().getIntroModelRoot().getCurrentPageId();
+ run(pageId);
+ }
+
+ public static IConfigurationElement getPageElement() {
+ IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(
+ "org.eclipse.ui.preferencePages"); //$NON-NLS-1$
+ for (int i = 0; i < elements.length; i++) {
+ IConfigurationElement element = elements[i];
+ if (element.getName().equals("page")) { //$NON-NLS-1$
+ String att = element.getAttribute("class"); //$NON-NLS-1$
+ if (att != null
+ && att.equals("org.eclipse.ui.intro.universal.ExtensionFactory:welcomeCustomization")) { //$NON-NLS-1$
+ return element;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void run(String pageId) {
+ PreferenceManager pm = new PreferenceManager();
+ IPreferenceNode node = createPreferenceNode(pageId);
+ pm.addToRoot(node);
+ IWorkbenchWindow window = site.getWorkbenchWindow();
+ PreferenceDialog dialog = new PreferenceDialog(window.getShell(), pm);
+ dialog.open();
+ }
+
+ private IPreferenceNode createPreferenceNode(final String pageId) {
+ if (element == null)
+ return null;
+ String id = element.getAttribute("id"); //$NON-NLS-1$
+ String label = element.getAttribute("name"); //$NON-NLS-1$
+ String className = "org.eclipse.ui.internal.intro.shared.WelcomeCustomizationPreferencePage"; //$NON-NLS-1$
+ if (id == null || label == null || className == null)
+ return null;
+ return new PreferenceNode(id, label, null, className) {
+
+ public void createPage() {
+ WelcomeCustomizationPreferencePage page = new WelcomeCustomizationPreferencePage();
+ page.setTitle(getLabelText());
+ page.setCurrentPage(pageId);
+ setPage(page);
+ }
+ };
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionData.java
new file mode 100644
index 000000000..0487692de
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionData.java
@@ -0,0 +1,125 @@
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.PrintWriter;
+
+public class ExtensionData {
+
+ public static final int HIDDEN = -1;
+ public static final int CALLOUT = 0;
+ public static final int LOW = 1;
+ public static final int MEDIUM = 2;
+ public static final int HIGH = 3;
+ public static final int NEW = 4;
+
+ private String id;
+ private String name;
+ private int fImportance = LOW;
+ private boolean implicit = false;
+ private GroupData parent;
+
+ public static final String[] IMPORTANCE_TABLE = { IUniversalIntroConstants.CALLOUT,
+ IUniversalIntroConstants.LOW, IUniversalIntroConstants.MEDIUM, IUniversalIntroConstants.HIGH,
+ IUniversalIntroConstants.NEW };
+
+ public static final String[] IMPORTANCE_STYLE_TABLE = { IUniversalIntroConstants.STYLE_CALLOUT,
+ IUniversalIntroConstants.STYLE_LOW, IUniversalIntroConstants.STYLE_MEDIUM, IUniversalIntroConstants.STYLE_HIGH,
+ IUniversalIntroConstants.STYLE_NEW };
+
+ public static final String [] IMPORTANCE_NAME_TABLE = { org.eclipse.ui.internal.intro.universal.Messages.ExtensionData_callout,
+ Messages.ExtensionData_low, Messages.ExtensionData_medium, Messages.ExtensionData_high, Messages.ExtensionData_new };
+
+ public ExtensionData(String id, String name) {
+ this(id, name, IUniversalIntroConstants.LOW, false);
+ }
+
+ public ExtensionData(String id, String name, int importance) {
+ this.id = id;
+ this.name = name;
+ this.fImportance = importance;
+ this.implicit = false;
+ }
+
+ void setParent(GroupData gd) {
+ this.parent = gd;
+ }
+
+ public GroupData getParent() {
+ return parent;
+ }
+
+ public boolean isImplicit() {
+ return implicit;
+ }
+
+ public ExtensionData(String id, String name, String importance, boolean implicit) {
+ this.id = id;
+ this.name = name;
+ this.implicit = implicit;
+ if (importance != null) {
+ if (importance.equals(IUniversalIntroConstants.HIGH))
+ fImportance = HIGH;
+ else if (importance.equals(IUniversalIntroConstants.MEDIUM))
+ fImportance = MEDIUM;
+ else if (importance.equals(IUniversalIntroConstants.LOW))
+ fImportance = LOW;
+ else if (importance.equals(IUniversalIntroConstants.CALLOUT))
+ fImportance = CALLOUT;
+ else if (importance.equals(IUniversalIntroConstants.NEW))
+ fImportance = NEW;
+ else if (importance.equals(IUniversalIntroConstants.HIDDEN))
+ fImportance = HIDDEN;
+ }
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getImportance() {
+ return fImportance;
+ }
+
+ public void setImportance(int newValue) {
+ fImportance = newValue;
+ }
+
+ public boolean isHidden() {
+ return fImportance == HIDDEN;
+ }
+
+ public void write(PrintWriter writer, String indent) {
+ writer.print(indent);
+ writer.print("<extension id=\"" + id + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ if (!isHidden())
+ writer.println(" importance=\"" + getImportanceAttributeValue() + "\"/>"); //$NON-NLS-1$ //$NON-NLS-2$
+ else
+ writer.println("/>"); //$NON-NLS-1$
+ }
+
+ private String getImportanceAttributeValue() {
+ return IMPORTANCE_TABLE[fImportance];
+ }
+
+ public String toString() {
+ return name!=null?name:id;
+ }
+/*
+ public boolean equals(Object obj) {
+ if (obj == null) return false;
+ if (obj == this) return true;
+ if (obj instanceof ExtensionData) {
+ ExtensionData src = (ExtensionData)obj;
+ return (id.equals(src.id) && name.equals(src.name) && fImportance==src.fImportance);
+ }
+ return false;
+ }
+ */
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionDataTransfer.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionDataTransfer.java
new file mode 100644
index 000000000..f37d88375
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/ExtensionDataTransfer.java
@@ -0,0 +1,113 @@
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.swt.dnd.ByteArrayTransfer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.TransferData;
+
+
+public class ExtensionDataTransfer extends ByteArrayTransfer {
+
+ private static final String MYTYPENAME = "ExtensionData"; //$NON-NLS-1$
+ private static final int MYTYPEID = registerType(MYTYPENAME);
+ private static ExtensionDataTransfer _instance = new ExtensionDataTransfer();
+
+ public static ExtensionDataTransfer getInstance() {
+ return _instance;
+ }
+
+ protected String[] getTypeNames() {
+ return new String[] { MYTYPENAME };
+ }
+
+ protected int[] getTypeIds() {
+ return new int[] { MYTYPEID };
+ }
+
+ public void javaToNative(Object object, TransferData transferData) {
+ if (!checkMyType(object) || !isSupportedType(transferData)) {
+ DND.error(DND.ERROR_INVALID_DATA);
+ }
+ ExtensionData[] myTypes = (ExtensionData[]) object;
+ try {
+ // write data to a byte array and then ask super to convert to pMedium
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ DataOutputStream writeOut = new DataOutputStream(out);
+ for (int i = 0, length = myTypes.length; i < length; i++) {
+ ExtensionData ed = myTypes[i];
+ byte[] buffer = ed.getId().getBytes();
+ writeOut.writeInt(ed.getId().length());
+ writeOut.write(buffer);
+ writeOut.writeInt(ed.getName().length());
+ buffer = ed.getName().getBytes();
+ writeOut.write(buffer);
+ writeOut.writeInt(myTypes[i].getImportance());
+ }
+ byte[] buffer = out.toByteArray();
+ writeOut.close();
+ super.javaToNative(buffer, transferData);
+ } catch (IOException e) {
+ }
+ }
+
+ public Object nativeToJava(TransferData transferData) {
+ if (isSupportedType(transferData)) {
+ byte[] buffer = (byte[]) super.nativeToJava(transferData);
+ if (buffer == null)
+ return null;
+
+ ExtensionData[] myData = new ExtensionData[0];
+ try {
+ ByteArrayInputStream in = new ByteArrayInputStream(buffer);
+ DataInputStream readIn = new DataInputStream(in);
+ while (readIn.available() > 12) {
+ int importance;
+ String id;
+ String name;
+ int size = readIn.readInt();
+ byte[] buff = new byte[size];
+ readIn.read(buff);
+ id = new String(buff);
+ size = readIn.readInt();
+ buff = new byte[size];
+ readIn.read(buff);
+ name = new String(buff);
+ importance = readIn.readInt();
+
+ ExtensionData[] newMyData = new ExtensionData[myData.length + 1];
+ System.arraycopy(myData, 0, newMyData, 0, myData.length);
+ newMyData[myData.length] = new ExtensionData(id, name, importance);
+ myData = newMyData;
+ }
+ readIn.close();
+ } catch (IOException ex) {
+ return null;
+ }
+ return myData;
+ }
+
+ return null;
+ }
+
+
+ boolean checkMyType(Object object) {
+ if (object == null || !(object instanceof ExtensionData[]) || ((ExtensionData[]) object).length == 0) {
+ return false;
+ }
+ ExtensionData[] myTypes = (ExtensionData[]) object;
+ for (int i = 0; i < myTypes.length; i++) {
+ if (myTypes[i] == null || myTypes[i].getId() == null || myTypes[i].getName() == null)
+ return false;
+ }
+ return true;
+ }
+
+ protected boolean validate(Object object) {
+ return checkMyType(object);
+ }
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java
new file mode 100644
index 000000000..7940c9d9c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/GroupData.java
@@ -0,0 +1,166 @@
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+import org.eclipse.ui.intro.config.IntroElement;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class GroupData {
+ boolean fDefault=false;
+ private String path;
+ private ArrayList extensions = new ArrayList();
+
+ public GroupData(String path, boolean defaultGroup) {
+ fDefault = defaultGroup;
+ this.path = path;
+ }
+
+ public GroupData(Element element) {
+ if (element.getNodeName().equals("hidden")) //$NON-NLS-1$
+ path = IUniversalIntroConstants.HIDDEN;
+ else
+ path = element.getAttribute("path"); //$NON-NLS-1$
+ NodeList children = element.getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child.getNodeType() == Node.ELEMENT_NODE && child.getNodeName().equals("extension")) { //$NON-NLS-1$
+ loadExtension((Element) child);
+ }
+ }
+ String df = element.getAttribute("default"); //$NON-NLS-1$
+ if (df!=null && df.equalsIgnoreCase("true")) //$NON-NLS-1$
+ fDefault = true;
+ }
+
+ public boolean isHidden() {
+ return (path.equals(IUniversalIntroConstants.HIDDEN));
+ }
+
+ public boolean isDefault() {
+ return fDefault;
+ }
+
+ public void addAnchors(ArrayList result) {
+ for (int i = 0; i < extensions.size(); i++) {
+ ExtensionData edata = (ExtensionData) extensions.get(i);
+ String id = edata.getId();
+ IntroElement anchor = new IntroElement("anchor"); //$NON-NLS-1$
+ anchor.setAttribute("id", id); //$NON-NLS-1$
+ result.add(anchor);
+ }
+ }
+
+ public void add(ExtensionData ed) {
+ extensions.add(ed);
+ ed.setParent(this);
+ }
+ public void add(int index, ExtensionData ed) {
+ extensions.add(index, ed);
+ ed.setParent(this);
+ }
+ public void remove(ExtensionData ed) {
+ extensions.remove(ed);
+ ed.setParent(null);
+ }
+
+ public void addImplicitExtension(String id, String name) {
+ ExtensionData ed = new ExtensionData(id, name, IUniversalIntroConstants.LOW, true);
+ add(ed);
+ }
+
+ private void loadExtension(Element element) {
+ String id = element.getAttribute("id"); //$NON-NLS-1$
+ String name = element.getAttribute("name"); //$NON-NLS-1$
+ String importance = element.getAttribute("importance"); //$NON-NLS-1$
+ ExtensionData ed = new ExtensionData(id, name, importance, false);
+ add(ed);
+ }
+
+ public int getExtensionCount() {
+ return extensions.size();
+ }
+
+ public ExtensionData[] getExtensions() {
+ return (ExtensionData[]) extensions.toArray(new ExtensionData[extensions.size()]);
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public boolean contains(String extensionId) {
+ return find(extensionId)!=null;
+ }
+
+ ExtensionData find(String extensionId) {
+ for (int i = 0; i < extensions.size(); i++) {
+ ExtensionData ed = (ExtensionData) extensions.get(i);
+ if (ed.getId().equals(extensionId))
+ return ed;
+ }
+ return null;
+ }
+
+ public int getIndexOf(ExtensionData ed) {
+ return extensions.indexOf(ed);
+ }
+
+ public int getIndexOf(String extensionId) {
+ for (int i = 0; i < extensions.size(); i++) {
+ ExtensionData ed = (ExtensionData) extensions.get(i);
+ if (ed.getId().equals(extensionId))
+ return i;
+ }
+ return -1;
+ }
+
+ public boolean canMoveUp(ExtensionData ed) {
+ int index = extensions.indexOf(ed);
+ return (index>0);
+ }
+
+ public boolean canMoveDown(ExtensionData ed) {
+ int index = extensions.indexOf(ed);
+ return (index!= -1 && index < extensions.size()-1);
+ }
+
+ public void moveUp(ExtensionData ed) {
+ int index = extensions.indexOf(ed);
+ ExtensionData swapped = (ExtensionData)extensions.get(index-1);
+ extensions.set(index, swapped);
+ extensions.set(index-1, ed);
+ }
+
+ public void moveDown(ExtensionData ed) {
+ int index = extensions.indexOf(ed);
+ ExtensionData swapped = (ExtensionData)extensions.get(index+1);
+ extensions.set(index, swapped);
+ extensions.set(index+1, ed);
+ }
+
+ public void write(PrintWriter writer, String indent) {
+ writer.print(indent);
+ if (isHidden())
+ writer.print("<hidden>"); //$NON-NLS-1$
+ else {
+ writer.print("<group path=\""+path+"\""); //$NON-NLS-1$ //$NON-NLS-2$
+ if (fDefault)
+ writer.println(" default=\"true\">"); //$NON-NLS-1$
+ else
+ writer.println(">"); //$NON-NLS-1$
+ }
+ for (int i=0; i<extensions.size(); i++) {
+ ExtensionData ed = (ExtensionData)extensions.get(i);
+ ed.write(writer, indent+" "); //$NON-NLS-1$
+ }
+ writer.print(indent);
+ if (isHidden())
+ writer.println("</hidden>"); //$NON-NLS-1$
+ else
+ writer.println("</group>"); //$NON-NLS-1$
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java
new file mode 100644
index 000000000..4de49e6e1
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IUniversalIntroConstants.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.intro.universal;
+
+
+public interface IUniversalIntroConstants {
+
+ // all attributes here are by default public static final.
+
+ // General consts.
+ // ---------------
+ String PLUGIN_ID = "org.eclipse.ui.intro.universal"; //$NON-NLS-1$
+ String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$
+
+ // Empty Standby Content part. This is registered in this plugin,
+ // through markup.
+ String EMPTY_STANDBY_CONTENT_PART = "org.eclipse.ui.intro.config.emptyStandby"; //$NON-NLS-1$
+
+ // Memento constants
+ // ------------------
+ String MEMENTO_PRESENTATION_TAG = "presentation"; //$NON-NLS-1$
+ String MEMENTO_CURRENT_PAGE_ATT = "currentPage"; //$NON-NLS-1$
+ String MEMENTO_STANDBY_PART_TAG = "standbyPart"; //$NON-NLS-1$
+ String MEMENTO_STANDBY_CONTENT_PART_ID_ATT = "contentPartID"; //$NON-NLS-1$
+ String MEMENTO_STANDBY_CONTENT_PART_TAG = "standbyContentPart"; //$NON-NLS-1$
+ String MEMENTO_RESTORE_ATT = "restore"; //$NON-NLS-1$
+
+ // CustomizableIntroPart consts:
+ // -----------------------------
+ // key to retrieve if a standby part is needed.
+ String SHOW_STANDBY_PART = "showStandbyPart"; //$NON-NLS-1$
+
+ // Form implementation consts:
+ // ---------------------------
+ // key to retrieve the into link model object from imageHyperlink widget.
+ // convention: actual string value is class name.
+ String INTRO_LINK = "IntroLink"; //$NON-NLS-1$
+
+ // key to retrive page sub-title from PageContentForm
+ String PAGE_SUBTITLE = "PageSubtitle"; //$NON-NLS-1$
+
+
+ // Performance keys
+ // -----------------------
+ String INTRO = "intro"; //$NON-NLS-1$
+ String PERF_VIEW_CREATION_TIME = PLUGIN_ID + "/perf/createView"; //$NON-NLS-1$
+ String PERF_SET_STANDBY_STATE = PLUGIN_ID + "/perf/setStandbyState"; //$NON-NLS-1$
+ // not exposed in .option. Used because framework is convenient.
+ String PERF_UI_ZOOM = PLUGIN_ID + "/perf/uiZoom"; //$NON-NLS-1$
+
+ // Universal Welcome
+
+ String LOW = "low"; //$NON-NLS-1$
+ String MEDIUM = "medium"; //$NON-NLS-1$
+ String HIGH = "high"; //$NON-NLS-1$
+ String CALLOUT = "callout"; //$NON-NLS-1$
+ String HIDDEN = "hidden"; //$NON-NLS-1$
+ String NEW = "new"; //$NON-NLS-1$
+
+ String STYLE_LOW = "importance-low"; //$NON-NLS-1$
+ String STYLE_MEDIUM = "importance-medium"; //$NON-NLS-1$
+ String STYLE_HIGH = "importance-high"; //$NON-NLS-1$
+ String STYLE_CALLOUT = "importance-callout"; //$NON-NLS-1$
+ String STYLE_NEW = "importance-new"; //$NON-NLS-1$
+ String DEFAULT_ANCHOR = "defaultAnchor"; //$NON-NLS-1$
+ String DEFAULT_CONTENT_PATH = "/page-content/bottom-left/"+DEFAULT_ANCHOR; //$NON-NLS-1$
+ // Page ids
+ String ID_ROOT = "root"; //$NON-NLS-1$
+ String ID_STANDBY = "standby"; //$NON-NLS-1$
+ String ID_OVERVIEW = "overview";//$NON-NLS-1$
+ String ID_TUTORIALS = "tutorials";//$NON-NLS-1$
+ String ID_SAMPLES = "samples";//$NON-NLS-1$
+ String ID_FIRSTSTEPS = "firststeps";//$NON-NLS-1$
+ String ID_WHATSNEW = "whatsnew";//$NON-NLS-1$
+ String ID_MIGRATE = "migrate";//$NON-NLS-1$
+ String ID_WEBRESOURCES = "webresources";//$NON-NLS-1$
+
+ // Page DIV ids
+ String DIV_PAGE_LINKS = "page-links"; //$NON-NLS-1$
+ String DIV_LAYOUT_TOP_LEFT = "top-left"; //$NON-NLS-1$
+ String DIV_LAYOUT_TOP_RIGHT = "top-right"; //$NON-NLS-1$
+ String DIV_LAYOUT_BOTTOM_LEFT = "bottom-left"; //$NON-NLS-1$
+ String DIV_LAYOUT_BOTTOM_RIGHT = "bottom-right"; //$NON-NLS-1$
+
+ // Product intro variables
+ String VAR_INTRO_BACKGROUND_IMAGE = "INTRO_BACKGROUND_IMAGE"; //$NON-NLS-1$
+ String VAR_INTRO_ROOT_PAGES = "INTRO_ROOT_PAGES"; //$NON-NLS-1$
+ String VAR_INTRO_DATA = "INTRO_DATA"; //$NON-NLS-1$
+
+ //Page table properties
+ String P_IMPORTANCE = "importance"; //$NON-NLS-1$
+ String P_NAME = "name"; //$NON-NLS-1$
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java
new file mode 100644
index 000000000..154dd73c9
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/IntroData.java
@@ -0,0 +1,189 @@
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.ui.internal.intro.impl.model.loader.IntroContentParser;
+import org.eclipse.ui.internal.intro.universal.util.BundleUtil;
+import org.eclipse.ui.internal.intro.universal.util.Log;
+import org.osgi.framework.Bundle;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+public class IntroData {
+ private String productId;
+ private Hashtable pages=new Hashtable();
+ private boolean active;
+
+ public IntroData(String productId, String fileNameOrData, boolean active) {
+ this.productId = productId;
+ this.active = active;
+ if (fileNameOrData!=null)
+ initialize(fileNameOrData);
+ }
+
+ public String getProductId() {
+ return productId;
+ }
+
+ public PageData getPage(String pageId) {
+ return (PageData)pages.get(pageId);
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ private void initialize(String fileNameOrData) {
+ Document doc = parse(fileNameOrData);
+ if (doc == null)
+ return;
+ Element root = doc.getDocumentElement();
+ NodeList pages = root.getChildNodes();
+ for (int i = 0; i < pages.getLength(); i++) {
+ Node node = pages.item(i);
+ if (node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equals("page")) { //$NON-NLS-1$
+ loadPage((Element) node);
+ }
+ }
+ }
+
+ private void loadPage(Element page) {
+ PageData pd = new PageData(page);
+ pages.put(pd.getId(), pd);
+ }
+
+ public void addImplicitContent() {
+ IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$
+ for (int i=0; i<elements.length; i++) {
+ IConfigurationElement element = elements[i];
+ if (element.getName().equals("configExtension")) { //$NON-NLS-1$
+ String cid = element.getAttribute("configId"); //$NON-NLS-1$
+ if (cid!=null && cid.equals("org.eclipse.ui.intro.universalConfig")) { //$NON-NLS-1$
+ addCandidate(element);
+ }
+ }
+ }
+ }
+
+ private void addCandidate(IConfigurationElement element) {
+ String fileName = element.getAttribute("content"); //$NON-NLS-1$
+ if (fileName==null)
+ return;
+ String bundleId = element.getDeclaringExtension().getNamespaceIdentifier();
+ Bundle bundle = Platform.getBundle(bundleId);
+ if (bundle==null)
+ return;
+ String content = BundleUtil.getResolvedResourceLocation("", fileName, //$NON-NLS-1$
+ bundle);
+ IntroContentParser parser = new IntroContentParser(content);
+ Document dom = parser.getDocument();
+ Element root = dom.getDocumentElement();
+ Element extension = null;
+ NodeList children = root.getChildNodes();
+ for (int i=0; i<children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child.getNodeType()==Node.ELEMENT_NODE) {
+ Element el = (Element)child;
+ if (el.getNodeName().equalsIgnoreCase("extensionContent")) { //$NON-NLS-1$
+ extension = el;
+ break;
+ }
+ }
+ }
+ if (extension==null)
+ return;
+ String id = extension.getAttribute("id"); //$NON-NLS-1$
+ String name = extension.getAttribute("name"); //$NON-NLS-1$
+ String path = extension.getAttribute("path"); //$NON-NLS-1$
+ if (id==null || path==null)
+ return;
+ int at = path.lastIndexOf("/@"); //$NON-NLS-1$
+ if (at == -1)
+ return;
+ if (path.charAt(path.length()-1)!='@')
+ return;
+ String pageId = path.substring(0, at);
+ PageData pd = (PageData)pages.get(pageId);
+ if (pd==null) {
+ pd = new PageData(pageId);
+ pages.put(pageId, pd);
+ }
+ pd.addImplicitExtension(id, name);
+ }
+
+ private Document parse(String fileNameOrData) {
+ Document document = null;
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ docFactory.setValidating(false);
+ // if this is not set, Document.getElementsByTagNameNS() will fail.
+ docFactory.setNamespaceAware(true);
+ docFactory.setExpandEntityReferences(false);
+ DocumentBuilder parser = docFactory.newDocumentBuilder();
+
+ if (fileNameOrData.charAt(0)=='<') {
+ //This is actual content, not the file name
+ StringReader reader = new StringReader(fileNameOrData);
+ document = parser.parse(new InputSource(reader));
+ }
+ else
+ document = parser.parse(fileNameOrData);
+ return document;
+
+ } catch (SAXParseException spe) {
+ StringBuffer buffer = new StringBuffer("IntroData error in line "); //$NON-NLS-1$
+ buffer.append(spe.getLineNumber());
+ buffer.append(", uri "); //$NON-NLS-1$
+ buffer.append(spe.getSystemId());
+ buffer.append("\n"); //$NON-NLS-1$
+ buffer.append(spe.getMessage());
+
+ // Use the contained exception.
+ Exception x = spe;
+ if (spe.getException() != null)
+ x = spe.getException();
+ Log.error(buffer.toString(), x);
+
+ } catch (SAXException sxe) {
+ Exception x = sxe;
+ if (sxe.getException() != null)
+ x = sxe.getException();
+ Log.error(x.getMessage(), x);
+
+ } catch (ParserConfigurationException pce) {
+ // Parser with specified options can't be built
+ Log.error(pce.getMessage(), pce);
+
+ } catch (IOException ioe) {
+ Log.error(ioe.getMessage(), ioe);
+ }
+ return null;
+ }
+
+ public void write(PrintWriter writer) {
+ writer.println("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); //$NON-NLS-1$
+ writer.println("<extensions>"); //$NON-NLS-1$
+ for (Enumeration keys = pages.keys(); keys.hasMoreElements();) {
+ String id = (String)keys.nextElement();
+ PageData pd = (PageData)pages.get(id);
+ pd.write(writer, " "); //$NON-NLS-1$
+ }
+ writer.println("</extensions>"); //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java
new file mode 100644
index 000000000..29df5b3ab
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.intro.universal;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String INTRO_RESOURCE_BUNDLE = "org.eclipse.ui.internal.intro.universal.Messages"; //$NON-NLS-1$
+
+ static {
+ initializeMessages(INTRO_RESOURCE_BUNDLE, Messages.class);
+ }
+
+ // Misc
+ // -------
+ public static String SharedIntroConfigurer_overview_name;
+ public static String SharedIntroConfigurer_overview_alt;
+ public static String SharedIntroConfigurer_overview_tooltip;
+ public static String SharedIntroConfigurer_firststeps_name;
+ public static String SharedIntroConfigurer_firststeps_alt;
+ public static String SharedIntroConfigurer_firststeps_tooltip;
+ public static String SharedIntroConfigurer_tutorials_name;
+ public static String SharedIntroConfigurer_tutorials_alt;
+ public static String SharedIntroConfigurer_tutorials_tooltip;
+ public static String SharedIntroConfigurer_samples_name;
+ public static String SharedIntroConfigurer_samples_alt;
+ public static String SharedIntroConfigurer_samples_tooltip;
+ public static String SharedIntroConfigurer_whatsnew_name;
+ public static String SharedIntroConfigurer_whatsnew_alt;
+ public static String SharedIntroConfigurer_whatsnew_tooltip;
+ public static String SharedIntroConfigurer_migrate_name;
+ public static String SharedIntroConfigurer_migrate_alt;
+ public static String SharedIntroConfigurer_migrate_tooltip;
+ public static String SharedIntroConfigurer_webresources_name;
+ public static String SharedIntroConfigurer_webresources_alt;
+ public static String SharedIntroConfigurer_webresources_tooltip;
+ public static String SharedIntroConfigurer_overview_nav;
+ public static String SharedIntroConfigurer_firststeps_nav;
+ public static String SharedIntroConfigurer_tutorials_nav;
+ public static String SharedIntroConfigurer_samples_nav;
+ public static String SharedIntroConfigurer_whatsnew_nav;
+ public static String SharedIntroConfigurer_migrate_nav;
+ public static String SharedIntroConfigurer_webresources_nav;
+ public static String WelcomeCustomizationPreferencePage_available;
+ public static String WelcomeCustomizationPreferencePage_left;
+ public static String WelcomeCustomizationPreferencePage_right;
+ public static String WelcomeCustomizationPreferencePage_background;
+ public static String WelcomeCustomizationPreferencePage_preview;
+ public static String WelcomeCustomizationPreferencePage_rootpages;
+ public static String WelcomeCustomizationPreferencePage_overview;
+ public static String WelcomeCustomizationPreferencePage_firststeps;
+ public static String WelcomeCustomizationPreferencePage_tutorials;
+ public static String WelcomeCustomizationPreferencePage_samples;
+ public static String WelcomeCustomizationPreferencePage_whatsnew;
+ public static String WelcomeCustomizationPreferencePage_webresources;
+ public static String WelcomeCustomizationPreferencePage_migrate;
+ public static String WelcomeCustomizationPreferencePage_applyToAll;
+ public static String ExtensionData_callout;
+ public static String ExtensionData_low;
+ public static String ExtensionData_medium;
+ public static String ExtensionData_high;
+ public static String ExtensionData_new;
+ public static String WelcomeCustomizationPreferencePage_serialize;
+ public static String WelcomeCustomizationPreferencePage_serializeTitle;
+ public static String WelcomeCustomizationPreferencePage_up;
+ public static String WelcomeCustomizationPreferencePage_down;
+ public static String WelcomeCustomizationPreferencePage_moveTo;
+ public static String WelcomeCustomizationPreferencePage_menu_available;
+ public static String WelcomeCustomizationPreferencePage_menu_top_left;
+ public static String WelcomeCustomizationPreferencePage_menu_top_right;
+ public static String WelcomeCustomizationPreferencePage_menu_bottom_left;
+ public static String WelcomeCustomizationPreferencePage_menu_bottom_right;
+ public static String WelcomeCustomizationPreferencePage_browse;
+ public static String WelcomeCustomizationPreferencePage_browseTitle;
+ public static String SharedIntroConfigurer_customize_label;
+ public static String SharedIntroConfigurer_customize_text;
+ public static String WelcomeCustomizationPreferencePage_pageDesc;
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties
new file mode 100644
index 000000000..0a14e16a6
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties
@@ -0,0 +1,82 @@
+###############################################################################
+# Copyright (c) 2000, 2005 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# IBM Corporation - initial API and implementation
+###############################################################################
+
+# ==============================================
+# Universal Welcome plugin properties file
+# ==============================================
+
+# Configurer
+SharedIntroConfigurer_overview_name=Overview
+SharedIntroConfigurer_overview_alt=Overview
+SharedIntroConfigurer_overview_tooltip=Find out what Eclipse is all about
+SharedIntroConfigurer_firststeps_name=First Steps
+SharedIntroConfigurer_firststeps_alt=First Steps
+SharedIntroConfigurer_firststeps_tooltip=Make first steps
+SharedIntroConfigurer_tutorials_name=Tutorials
+SharedIntroConfigurer_tutorials_alt=Tutorials
+SharedIntroConfigurer_tutorials_tooltip=Go through tutorials
+SharedIntroConfigurer_samples_name=Samples
+SharedIntroConfigurer_samples_alt=Samples
+SharedIntroConfigurer_samples_tooltip=Try out the samples
+SharedIntroConfigurer_whatsnew_name=What's New
+SharedIntroConfigurer_whatsnew_alt=What's New
+SharedIntroConfigurer_whatsnew_tooltip=Find out what is new
+SharedIntroConfigurer_migrate_name=Migrate
+SharedIntroConfigurer_migrate_alt=Migrate
+SharedIntroConfigurer_migrate_tooltip=Migrate to the new release
+SharedIntroConfigurer_customize_label=Customize
+SharedIntroConfigurer_webresources_name=Web Resources
+SharedIntroConfigurer_webresources_alt=Web Resources
+SharedIntroConfigurer_webresources_tooltip=Read more on the Web
+SharedIntroConfigurer_overview_nav=Overview
+SharedIntroConfigurer_firststeps_nav=First Steps
+SharedIntroConfigurer_customize_text=Customize page
+SharedIntroConfigurer_tutorials_nav=Tutorials
+SharedIntroConfigurer_samples_nav=Samples
+SharedIntroConfigurer_whatsnew_nav=What's New
+SharedIntroConfigurer_migrate_nav=Migrate
+SharedIntroConfigurer_webresources_nav=Web Resources
+
+# Preference page
+WelcomeCustomizationPreferencePage_left= Left Column:
+WelcomeCustomizationPreferencePage_up= Move Up
+WelcomeCustomizationPreferencePage_down=Move Down
+WelcomeCustomizationPreferencePage_right= Right Column:
+WelcomeCustomizationPreferencePage_browse=Browse...
+WelcomeCustomizationPreferencePage_browseTitle=Select the background image file
+WelcomeCustomizationPreferencePage_preview= Preview:
+WelcomeCustomizationPreferencePage_samples= Samples
+WelcomeCustomizationPreferencePage_migrate= Migrate
+WelcomeCustomizationPreferencePage_moveTo=Move To
+WelcomeCustomizationPreferencePage_available= Available Extensions:
+WelcomeCustomizationPreferencePage_background= Home Page Theme:
+WelcomeCustomizationPreferencePage_firststeps= First Steps
+WelcomeCustomizationPreferencePage_applyToAll=Apply settings to all the products sharing this workbench
+WelcomeCustomizationPreferencePage_menu_top_right= Top Right
+WelcomeCustomizationPreferencePage_webresources= Web Resources
+WelcomeCustomizationPreferencePage_menu_bottom_left=Bottom Left
+WelcomeCustomizationPreferencePage_menu_bottom_right=Bottom Right
+WelcomeCustomizationPreferencePage_rootpages= Root Pages:
+WelcomeCustomizationPreferencePage_overview= Overview
+WelcomeCustomizationPreferencePage_tutorials= Tutorials
+WelcomeCustomizationPreferencePage_whatsnew= What's New
+WelcomeCustomizationPreferencePage_pageDesc=Use drag and drop to position extensions on the page.
+WelcomeCustomizationPreferencePage_serialize = Save As...
+WelcomeCustomizationPreferencePage_menu_top_left=Top Left
+WelcomeCustomizationPreferencePage_serializeTitle=Save the page layout data as a file
+WelcomeCustomizationPreferencePage_menu_available=Available
+
+#Importance levels
+ExtensionData_callout=Callout
+ExtensionData_low=Low
+ExtensionData_medium=Medium
+ExtensionData_high=High
+ExtensionData_new=New
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java
new file mode 100644
index 000000000..1aca1a5bd
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/PageData.java
@@ -0,0 +1,180 @@
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class PageData {
+ public static final String P_TOP_LEFT = "page-content/top-left"; //$NON-NLS-1$
+ public static final String P_TOP_RIGHT = "page-content/top-right"; //$NON-NLS-1$
+ public static final String P_BOTTOM_LEFT = "page-content/bottom-left"; //$NON-NLS-1$
+ public static final String P_BOTTOM_RIGHT = "page-content/bottom-right"; //$NON-NLS-1$
+
+ private String id;
+ private ArrayList groups = new ArrayList();
+ private GroupData hidden=null;
+
+ public PageData(String id) {
+ this.id = id;
+ }
+
+ public PageData(Element page) {
+ this.id = page.getAttribute("id"); //$NON-NLS-1$
+ NodeList children = page.getChildNodes();
+ for (int i=0; i<children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child.getNodeType()==Node.ELEMENT_NODE) {
+ Element element = (Element)child;
+ if (element.getNodeName().equals("group")) { //$NON-NLS-1$
+ addGroup(element, false);
+ }
+ else if (element.getNodeName().equals(IUniversalIntroConstants.HIDDEN)) {
+ addGroup(element, true);
+ }
+ }
+ }
+ }
+
+ public void add(GroupData gd) {
+ if (gd.isHidden())
+ hidden = gd;
+ else
+ groups.add(gd);
+ }
+
+ public void addAnchors(ArrayList result, String groupId) {
+ GroupData group = findGroup(groupId);
+ if (group==null) return;
+ group.addAnchors(result);
+ }
+
+ public String resolvePath(String extensionId) {
+ if (isHidden(extensionId))
+ return null;
+ GroupData ddata = null;
+ for (int i=0; i<groups.size(); i++) {
+ GroupData gdata = (GroupData)groups.get(i);
+ if (gdata.isDefault())
+ ddata=gdata;
+ if (gdata.contains(extensionId)) {
+ IPath resolvedPath = new Path(id);
+ resolvedPath = resolvedPath.append(gdata.getPath());
+ resolvedPath = resolvedPath.append(extensionId);
+ return resolvedPath.toString();
+ }
+ }
+ // resolve as default
+ IPath resolvedPath = new Path(id).append(ddata.getPath());
+ resolvedPath = resolvedPath.append(IUniversalIntroConstants.DEFAULT_ANCHOR);
+ return resolvedPath.toString();
+ }
+
+ public boolean isHidden(String extensionId) {
+ return hidden!=null && hidden.contains(extensionId);
+ }
+
+ public GroupData findGroup(String groupId) {
+ if (groupId.equals(IUniversalIntroConstants.HIDDEN))
+ return hidden;
+ for (int i=0; i<groups.size(); i++) {
+ GroupData gdata = (GroupData)groups.get(i);
+ IPath path = new Path(gdata.getPath());
+ if (path.lastSegment().equals(groupId))
+ return gdata;
+ }
+ return null;
+ }
+
+ private void addGroup(Element element, boolean hide) {
+ GroupData gd = new GroupData(element);
+ if (hide) hidden = gd;
+ else
+ groups.add(gd);
+ }
+
+ public void addImplicitExtension(String extensionId, String name) {
+ ExtensionData ed = findExtension(extensionId, true);
+ if (ed!=null) {
+ // see if name needs to be supplied
+ if (ed.getName()==null || ed.getName().length()==0)
+ ed.setName(name);
+ return;
+ }
+ GroupData gd = findDefaultGroup();
+ if (gd==null && groups.size()==0) {
+ // add bottoms as the default group
+ gd = new GroupData(P_BOTTOM_LEFT, true);
+ groups.add(gd);
+ groups.add(new GroupData(P_BOTTOM_RIGHT, true));
+ }
+ gd.addImplicitExtension(extensionId, name);
+ }
+
+ private GroupData findDefaultGroup() {
+ GroupData defaultGroup = null;
+ for (int i=0; i<groups.size(); i++) {
+ GroupData gd = (GroupData)groups.get(i);
+ if (gd.isDefault()) {
+ if (defaultGroup==null)
+ defaultGroup = gd;
+ else
+ if (defaultGroup.getExtensionCount()>gd.getExtensionCount())
+ defaultGroup = gd;
+ }
+ }
+ return defaultGroup;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public ExtensionData findExtension(String extensionId, boolean checkHidden) {
+ for (int i=0; i<groups.size(); i++) {
+ GroupData gdata = (GroupData)groups.get(i);
+ ExtensionData ed = gdata.find(extensionId);
+ if (ed!=null)
+ return ed;
+ }
+ // check the hidden
+ if (checkHidden && hidden!=null)
+ return hidden.find(extensionId);
+ return null;
+ }
+
+ public String resolveExtension(String extensionId) {
+ // check the explicit groups
+ for (int i=0; i<groups.size(); i++) {
+ GroupData gdata = (GroupData)groups.get(i);
+ if (gdata.contains(extensionId)) {
+ return id+"/"+gdata.getPath()+"/"+extensionId; //$NON-NLS-1$//$NON-NLS-2$
+ }
+ }
+ // check the hidden
+ if (hidden!=null && hidden.contains(extensionId))
+ return null;
+ // create the default: pick the last group
+ if (groups.size()==0) return null;
+ GroupData last = (GroupData)groups.get(groups.size()-1);
+ return id + "/" + last.getPath() + "/" + IUniversalIntroConstants.DEFAULT_ANCHOR; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ public void write(PrintWriter writer, String indent) {
+ writer.print(indent);
+ String indent2 = indent+" "; //$NON-NLS-1$
+ writer.println("<page id=\""+id+"\">"); //$NON-NLS-1$//$NON-NLS-2$
+ for (int i=0; i<groups.size(); i++) {
+ GroupData gd = (GroupData)groups.get(i);
+ gd.write(writer, indent2);
+ }
+ if (hidden!=null)
+ hidden.write(writer, indent2);
+ writer.print(indent);
+ writer.println("</page>"); //$NON-NLS-1$
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java
new file mode 100644
index 000000000..cca7e2370
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroConfigurer.java
@@ -0,0 +1,436 @@
+/***************************************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProduct;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.internal.intro.universal.util.ImageUtil;
+import org.eclipse.ui.intro.IIntroSite;
+import org.eclipse.ui.intro.config.IntroConfigurer;
+import org.eclipse.ui.intro.config.IntroElement;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class provides for dynamic configuration of the shared intro implementation based on the
+ * data file associated with the product.
+ *
+ * @since 3.2
+ */
+
+public class UniversalIntroConfigurer extends IntroConfigurer implements IUniversalIntroConstants {
+ private ArrayList introData = new ArrayList();
+
+ public UniversalIntroConfigurer() {
+ loadData();
+ }
+
+ public String getVariable(String variableName) {
+ IProduct product = Platform.getProduct();
+ if (product != null) {
+ // try product property first
+ String value = getProductProperty(product, variableName);
+ if (value != null) {
+ value = resolveVariable(product.getDefiningBundle(), value);
+ return value;
+ }
+ // nothing - try preferences
+ Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences();
+ // try to prefix with a preduct id first
+ String key = product.getId() + "_" + variableName; //$NON-NLS-1$
+ value = prefs.getString(key);
+ if (value.length() == 0) {
+ // try direct variable name
+ key = variableName;
+ value = prefs.getString(key);
+ }
+ if (value.length() > 0)
+ value = resolveVariable(product.getDefiningBundle(), value);
+ else
+ value = null;
+ return value;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.intro.config.IntroConfigurer#getMixinStyle(java.lang.String)
+ */
+ public String getMixinStyle(String pageId, String extensionId) {
+ if (introData.size()>0) {
+ // TODO getting the active product one only
+ // Eventually we should consult the data from all the products
+ IntroData idata = (IntroData) introData.get(0);
+ PageData pdata = idata.getPage(pageId);
+ if (pdata != null) {
+ ExtensionData ed = pdata.findExtension(extensionId, false);
+ int importance = ed.getImportance();
+ if (importance!=ExtensionData.HIDDEN)
+ return ExtensionData.IMPORTANCE_STYLE_TABLE[importance];
+ }
+ }
+ return null;
+ }
+
+ private String resolveVariable(Bundle bundle, String value) {
+ if (value != null) {
+ String path = null;
+ if (value.startsWith("intro:")) { //$NON-NLS-1$
+ bundle = UniversalIntroPlugin.getDefault().getBundle();
+ path = value.substring(6);
+ } else if (value.startsWith("product:")) { //$NON-NLS-1$
+ path = value.substring(8);
+ } else
+ return value;
+ try {
+ URL url = bundle.getEntry(path);
+ if (url != null) {
+ URL localURL = FileLocator.toFileURL(url);
+ return localURL.toString();
+ }
+ } catch (IOException e) {
+ // just use the value as-is
+ return value;
+ }
+ }
+ return null;
+ }
+
+ private String getProductProperty(IProduct product, String variableName) {
+ String value = product.getProperty(variableName);
+ if (value == null) {
+ // return default values
+ if (variableName.equals(VAR_INTRO_BACKGROUND_IMAGE))
+ return "css/graphics/root/welcomebckgrd.jpg"; //$NON-NLS-1$
+ }
+ return value;
+ }
+
+ public IntroElement[] getGroupChildren(String pageId, String groupId) {
+ if (pageId.equals(ID_ROOT)) {
+ if (groupId.equals(DIV_PAGE_LINKS))
+ return getRootPageLinks(false);
+ } else if (pageId.equals(ID_STANDBY)) {
+ if (groupId.equals(DIV_PAGE_LINKS))
+ return getRootPageLinks(true);
+ } else {
+ // other pages
+ if (groupId.equals(DIV_PAGE_LINKS))
+ return getNavLinks(pageId);
+ if (groupId.equals(DIV_LAYOUT_TOP_LEFT) || groupId.equals(DIV_LAYOUT_TOP_RIGHT)
+ || groupId.equals(DIV_LAYOUT_BOTTOM_LEFT) || groupId.equals(DIV_LAYOUT_BOTTOM_RIGHT))
+ return getContent(pageId, groupId);
+ }
+ return new IntroElement[0];
+ }
+
+ public IntroElement[] getLaunchBarShortcuts() {
+ ArrayList links = new ArrayList();
+ String ids = getVariable(VAR_INTRO_ROOT_PAGES);
+ if (ids != null) {
+ StringTokenizer stok = new StringTokenizer(ids, ","); //$NON-NLS-1$
+ while (stok.hasMoreTokens()) {
+ String id = stok.nextToken().trim();
+ IntroElement page = createLaunchBarShortcut(id);
+ if (page != null)
+ links.add(page);
+ }
+ }
+ return (IntroElement[]) links.toArray(new IntroElement[links.size()]);
+ }
+
+ private IntroElement[] getRootPageLinks(boolean standby) {
+ ArrayList links = new ArrayList();
+ String ids = getVariable(VAR_INTRO_ROOT_PAGES);
+ if (ids != null) {
+ StringTokenizer stok = new StringTokenizer(ids, ","); //$NON-NLS-1$
+ while (stok.hasMoreTokens()) {
+ String id = stok.nextToken().trim();
+ IntroElement page = createRootPageLink(id, standby);
+ if (page != null)
+ links.add(page);
+ }
+ }
+ return (IntroElement[]) links.toArray(new IntroElement[links.size()]);
+ }
+
+ private IntroElement[] getNavLinks(String pageId) {
+ ArrayList links = new ArrayList();
+ String ids = getVariable(VAR_INTRO_ROOT_PAGES);
+ if (ids != null) {
+ StringTokenizer stok = new StringTokenizer(ids, ","); //$NON-NLS-1$
+ while (stok.hasMoreTokens()) {
+ String id = stok.nextToken().trim();
+ IntroElement page = createNavLink(id, pageId);
+ if (page != null)
+ links.add(page);
+ }
+ }
+ return (IntroElement[]) links.toArray(new IntroElement[links.size()]);
+ }
+
+ private IntroElement createRootPageLink(String id, boolean standby) {
+
+ if (id.equals(ID_OVERVIEW))
+ return createRootLink(
+ Messages.SharedIntroConfigurer_overview_name,
+ createPageURL(id, standby),
+ id,
+ "overview_img", "$theme$/graphics/root/overview.gif", Messages.SharedIntroConfigurer_overview_alt, //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.SharedIntroConfigurer_overview_tooltip, "left"); //$NON-NLS-1$
+ if (id.equals(ID_FIRSTSTEPS))
+ return createRootLink(
+ Messages.SharedIntroConfigurer_firststeps_name,
+ createPageURL(id, standby),
+ id,
+ "firststeps_img", "$theme$/graphics/root/firststeps.gif", Messages.SharedIntroConfigurer_firststeps_alt, //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.SharedIntroConfigurer_firststeps_tooltip, "left"); //$NON-NLS-1$
+ if (id.equals(ID_TUTORIALS))
+ return createRootLink(
+ Messages.SharedIntroConfigurer_tutorials_name,
+ createPageURL(id, standby),
+ id,
+ "tutorials_img", "$theme$/graphics/root/tutorials.gif", Messages.SharedIntroConfigurer_tutorials_alt, //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.SharedIntroConfigurer_tutorials_tooltip, "left"); //$NON-NLS-1$
+ if (id.equals(ID_SAMPLES))
+ return createRootLink(
+ Messages.SharedIntroConfigurer_samples_name,
+ createPageURL(id, standby),
+ id,
+ "samples_img", "$theme$/graphics/root/samples.gif", Messages.SharedIntroConfigurer_samples_alt, Messages.SharedIntroConfigurer_samples_tooltip, "right"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if (id.equals(ID_WHATSNEW))
+ return createRootLink(
+ Messages.SharedIntroConfigurer_whatsnew_name,
+ createPageURL(id, standby),
+ id,
+ "whatsnew_img", "$theme$/graphics/root/whatsnew.gif", Messages.SharedIntroConfigurer_whatsnew_alt, //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.SharedIntroConfigurer_whatsnew_tooltip, "right"); //$NON-NLS-1$
+ if (id.equals(ID_MIGRATE))
+ return createRootLink(
+ Messages.SharedIntroConfigurer_migrate_name,
+ createPageURL(id, standby),
+ id,
+ "migrate_img", "$theme$/graphics/root/migrate.gif", Messages.SharedIntroConfigurer_migrate_alt, Messages.SharedIntroConfigurer_migrate_tooltip, "right"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if (id.equals(ID_WEBRESOURCES))
+ return createRootLink(Messages.SharedIntroConfigurer_webresources_name,
+ createPageURL(id, standby), id, "webresources_img", "css/graphics/root/webresources.gif", //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.SharedIntroConfigurer_webresources_alt,
+ Messages.SharedIntroConfigurer_webresources_tooltip, "right"); //$NON-NLS-1$
+ return null;
+ }
+
+ private IntroElement createNavLink(String id, String pageId) {
+ if (id.equals(ID_OVERVIEW))
+ return createNavLink(Messages.SharedIntroConfigurer_overview_nav, createPageURL(id, false), id,
+ "left"); //$NON-NLS-1$
+ if (id.equals(ID_FIRSTSTEPS))
+ return createNavLink(Messages.SharedIntroConfigurer_firststeps_nav, createPageURL(id, false), id,
+ "left"); //$NON-NLS-1$
+ if (id.equals(ID_TUTORIALS))
+ return createNavLink(Messages.SharedIntroConfigurer_tutorials_nav, createPageURL(id, false), id,
+ "left"); //$NON-NLS-1$
+ if (id.equals(ID_SAMPLES))
+ return createNavLink(Messages.SharedIntroConfigurer_samples_nav, createPageURL(id, false), id,
+ "right"); //$NON-NLS-1$
+ if (id.equals(ID_WHATSNEW))
+ return createNavLink(Messages.SharedIntroConfigurer_whatsnew_nav, createPageURL(id, false), id,
+ "right"); //$NON-NLS-1$
+ if (id.equals(ID_MIGRATE))
+ return createNavLink(Messages.SharedIntroConfigurer_migrate_nav, createPageURL(id, false), id,
+ "right"); //$NON-NLS-1$
+ if (id.equals(ID_WEBRESOURCES))
+ return createNavLink(Messages.SharedIntroConfigurer_webresources_nav, createPageURL(id, false),
+ id, "right"); //$NON-NLS-1$
+ return null;
+ }
+
+ private String createPageURL(String id, boolean standby) {
+ String url = "http://org.eclipse.ui.intro/showPage?id=" + id; //$NON-NLS-1$
+ if (standby)
+ url += "&standby=false"; //$NON-NLS-1$
+ return url;
+ }
+
+ private IntroElement createLaunchBarShortcut(String id) {
+ if (id.equals(ID_OVERVIEW))
+ return createShortcutLink(
+ "icons/full/obj16/overview16.png", Messages.SharedIntroConfigurer_overview_nav, //$NON-NLS-1$
+ id);
+ if (id.equals(ID_FIRSTSTEPS))
+ return createShortcutLink(
+ "icons/full/obj16/firststeps16.png", Messages.SharedIntroConfigurer_firststeps_nav, //$NON-NLS-1$
+ id);
+ if (id.equals(ID_TUTORIALS))
+ return createShortcutLink(
+ "icons/full/obj16/tutorials16.png", Messages.SharedIntroConfigurer_tutorials_nav, //$NON-NLS-1$
+ id);
+ if (id.equals(ID_SAMPLES))
+ return createShortcutLink(
+ "icons/full/obj16/samples16.png", Messages.SharedIntroConfigurer_samples_nav, //$NON-NLS-1$
+ id);
+ if (id.equals(ID_WHATSNEW))
+ return createShortcutLink(
+ "icons/full/obj16/whatsnew16.png", Messages.SharedIntroConfigurer_whatsnew_nav, //$NON-NLS-1$
+ id);
+ if (id.equals(ID_MIGRATE))
+ return createShortcutLink(
+ "icons/full/obj16/migrate16.png", Messages.SharedIntroConfigurer_migrate_nav, //$NON-NLS-1$
+ id);
+ if (id.equals(ID_WEBRESOURCES))
+ return createShortcutLink(
+ "icons/full/obj16/webresources16.png", Messages.SharedIntroConfigurer_webresources_nav, //$NON-NLS-1$
+ id);
+ return null;
+ }
+
+ private IntroElement createRootLink(String name, String url, String id, String imgId, String imgSrc,
+ String imgAlt, String imgText, String styleId) {
+ IntroElement element = new IntroElement("link"); //$NON-NLS-1$
+ element.setAttribute("label", name); //$NON-NLS-1$
+ element.setAttribute("url", url); //$NON-NLS-1$
+ element.setAttribute("id", id); //$NON-NLS-1$
+ element.setAttribute("style-id", styleId);//$NON-NLS-1$
+ IntroElement img = new IntroElement("img"); //$NON-NLS-1$
+ img.setAttribute("id", imgId); //$NON-NLS-1$
+ img.setAttribute("style-id", "content-img"); //$NON-NLS-1$ //$NON-NLS-2$
+ // img.setAttribute("src", imgSrc); //$NON-NLS-1$
+ img.setAttribute("alt", imgAlt); //$NON-NLS-1$
+ IntroElement text = new IntroElement("text"); //$NON-NLS-1$
+ text.setValue(imgText);
+ element.addChild(img);
+ element.addChild(text);
+ return element;
+ }
+
+ private IntroElement createNavLink(String label, String url, String id, String styleId) {
+ IntroElement element = new IntroElement("link"); //$NON-NLS-1$
+ element.setAttribute("label", label); //$NON-NLS-1$
+ element.setAttribute("url", url); //$NON-NLS-1$
+ element.setAttribute("id", id); //$NON-NLS-1$
+ element.setAttribute("style-id", styleId); //$NON-NLS-1$
+ return element;
+ }
+
+ private IntroElement createShortcutLink(String icon, String tooltip, String id) {
+ IntroElement element = new IntroElement("shortcut"); //$NON-NLS-1$
+ element.setAttribute("icon", icon); //$NON-NLS-1$
+ element.setAttribute("tooltip", tooltip); //$NON-NLS-1$
+ element.setAttribute("url", createPageURL(id, false)); //$NON-NLS-1$
+ return element;
+ }
+
+ private void loadData() {
+ // add intro data for this product first
+ String dataFile = getVariable(VAR_INTRO_DATA);
+ String pid = Platform.getProduct().getId();
+ if (dataFile != null)
+ introData.add(new IntroData(pid, dataFile, true));
+ IConfigurationElement[] products = Platform.getExtensionRegistry().getConfigurationElementsFor(
+ "org.eclipse.core.runtime.products"); //$NON-NLS-1$
+ for (int i = 0; i < products.length; i++) {
+ IConfigurationElement product = products[i];
+ IExtension extension = product.getDeclaringExtension();
+ String uid = extension.getUniqueIdentifier();
+ // skip this product
+ if (pid.equals(uid))
+ continue;
+ addIntroDataFor(uid, product);
+ }
+ }
+
+ private void addIntroDataFor(String pid, IConfigurationElement product) {
+ IConfigurationElement[] children = product.getChildren("property"); //$NON-NLS-1$
+ for (int i = 0; i < children.length; i++) {
+ IConfigurationElement child = children[i];
+ String name = child.getAttribute("name"); //$NON-NLS-1$
+ if (name != null && name.equals(VAR_INTRO_DATA)) {
+ String value = child.getAttribute("value"); //$NON-NLS-1$
+ String bid = child.getDeclaringExtension().getNamespaceIdentifier();
+ Bundle bundle = Platform.getBundle(bid);
+ if (bundle != null) {
+ String dataFile = resolveVariable(bundle, value);
+ introData.add(new IntroData(pid, dataFile, false));
+ }
+ }
+ }
+ }
+
+ private IntroElement[] getContent(String pageId, String groupId) {
+ ArrayList result = new ArrayList();
+ if (introData.size() > 0) {
+ // TODO getting the active product one only
+ // Eventually we should consult the data from all the products
+ IntroData idata = (IntroData) introData.get(0);
+ PageData pdata = idata.getPage(pageId);
+ if (pdata != null) {
+ pdata.addAnchors(result, groupId);
+ }
+ }
+ // Add the fallback anchor
+ IntroElement fallback = new IntroElement("anchor"); //$NON-NLS-1$
+ fallback.setAttribute("id", DEFAULT_ANCHOR); //$NON-NLS-1$
+ result.add(fallback);
+ return (IntroElement[]) result.toArray(new IntroElement[result.size()]);
+ }
+
+ public String resolvePath(String extensionId, String path) {
+ boolean extensionRelativePath = false;
+ IPath ipath = new Path(path);
+ String pageId = ipath.segment(0);
+ String s2 = ipath.segment(1);
+ if (!s2.equals("@")) //$NON-NLS-1$
+ extensionRelativePath = true;
+ if (introData.size() > 0) {
+ // TODO getting the active product one only
+ // Eventually we should consult the data from all the products
+ IntroData idata = (IntroData) introData.get(0);
+ PageData pdata = idata.getPage(pageId);
+ if (pdata != null) {
+ String resolvedPath = pdata.resolvePath(extensionId);
+ if (extensionRelativePath) {
+ // not done - use the resolved extension path
+ // to complete the source path
+ IPath p2 = new Path(resolvedPath);
+ IPath p1 = ipath.removeFirstSegments(2);
+ // remove the last anchor and append the
+ // relative path from the extension
+ resolvedPath = p2.removeLastSegments(1).append(p1).toString();
+ }
+ return resolvedPath;
+ }
+ } else {
+ // use fallback anchor
+ return pageId + DEFAULT_CONTENT_PATH;
+ }
+ return null;
+ }
+
+ public void init(IIntroSite site) {
+ IConfigurationElement element = CustomizeAction.getPageElement();
+ if (element==null)
+ return;
+ Action customizeAction = new CustomizeAction(site, element);
+ customizeAction.setText(Messages.SharedIntroConfigurer_customize_label);
+ customizeAction.setToolTipText(Messages.SharedIntroConfigurer_customize_text);
+ customizeAction.setImageDescriptor(ImageUtil.createImageDescriptor("full/elcl16/configure.gif")); //$NON-NLS-1$
+ site.getActionBars().getToolBarManager().appendToGroup(TB_ADDITIONS, customizeAction);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java
new file mode 100644
index 000000000..17db0df1d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/UniversalIntroPlugin.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.intro.universal;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.intro.universal.util.Log;
+import org.eclipse.ui.intro.IIntroPart;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Intro main plugin.
+ */
+public class UniversalIntroPlugin extends AbstractUIPlugin {
+ public static final String PLUGIN_ID = "org.eclipse.ui.intro.universal"; //$NON-NLS-1$
+
+ // The static shared instance.
+ private static UniversalIntroPlugin inst;
+
+ // used for performance logging. Time when the constructor of
+ // CustomizableIntroPart is called.
+ private long uiCreationStartTime;
+
+ // image registry that can be disposed while the
+ // plug-in is still active. This is important for
+ // switching themes after the plug-in has been loaded.
+ private ImageRegistry volatileImageRegistry;
+
+ /**
+ * The constructor.
+ */
+ public UniversalIntroPlugin() {
+ super();
+ }
+
+ /**
+ * Returns the shared plugin instance.
+ */
+ public static UniversalIntroPlugin getDefault() {
+ return inst;
+ }
+
+ /**
+ * Returns the Intro Part.
+ */
+ public static IIntroPart getIntro() {
+ IIntroPart introPart = PlatformUI.getWorkbench().getIntroManager()
+ .getIntro();
+ return introPart;
+ }
+
+ /**
+ * Returns the Intro Part after forcing an open on it.
+ */
+ public static IIntroPart showIntro(boolean standby) {
+ IIntroPart introPart = PlatformUI.getWorkbench().getIntroManager()
+ .showIntro(PlatformUI.getWorkbench().getActiveWorkbenchWindow(),
+ standby);
+ return introPart;
+ }
+
+ /**
+ * Returns the standby state of the Intro Part. If the intro is closed,
+ * retruns false.
+ */
+ public static boolean isIntroStandby() {
+ return PlatformUI.getWorkbench().getIntroManager().isIntroStandby(
+ getIntro());
+ }
+
+ /**
+ * Sets the standby state of the Intro Part. If the intro is closed, retruns
+ * false.
+ */
+ public static void setIntroStandby(boolean standby) {
+ PlatformUI.getWorkbench().getIntroManager().setIntroStandby(getIntro(),
+ standby);
+ }
+
+
+ /**
+ * Returns the standby state of the Intro Part. If the intro is closed,
+ * retruns false.
+ */
+ public static boolean closeIntro() {
+ // Relies on Workbench.
+ return PlatformUI.getWorkbench().getIntroManager().closeIntro(
+ getIntro());
+ }
+
+ public ImageRegistry getVolatileImageRegistry() {
+ if (volatileImageRegistry==null) {
+ volatileImageRegistry = createImageRegistry();
+ initializeImageRegistry(volatileImageRegistry);
+ }
+ return volatileImageRegistry;
+ }
+
+ public void resetVolatileImageRegistry() {
+ if (volatileImageRegistry!=null) {
+ volatileImageRegistry.dispose();
+ volatileImageRegistry = null;
+ }
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ inst = this;
+ if (Log.logInfo)
+ Log.info("IntroPlugin - calling start on Intro bundle"); //$NON-NLS-1$
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ resetVolatileImageRegistry();
+ super.stop(context);
+ }
+
+ public long gettUICreationStartTime() {
+ return uiCreationStartTime;
+ }
+
+ public void setUICreationStartTime(long uiCreationStartTime) {
+ this.uiCreationStartTime = uiCreationStartTime;
+ }
+
+
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java
new file mode 100644
index 000000000..9b3aeddad
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java
@@ -0,0 +1,1083 @@
+/***************************************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.ui.internal.intro.universal;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProduct;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.intro.impl.IntroPlugin;
+import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot;
+import org.eclipse.ui.internal.intro.universal.util.BundleUtil;
+import org.eclipse.ui.internal.intro.universal.util.ImageUtil;
+import org.eclipse.ui.internal.intro.universal.util.Log;
+import org.eclipse.ui.intro.IIntroManager;
+import org.eclipse.ui.intro.IIntroPart;
+import org.eclipse.ui.intro.config.CustomizableIntroPart;
+import org.eclipse.ui.intro.config.IIntroURL;
+import org.eclipse.ui.intro.config.IntroURLFactory;
+import org.osgi.framework.Bundle;
+
+
+public class WelcomeCustomizationPreferencePage extends PreferencePage implements IWorkbenchPreferencePage,
+ IExecutableExtension {
+
+ private static final String INTRO_ROOT_PAGES = "INTRO_ROOT_PAGES"; //$NON-NLS-1$
+ private static final String INTRO_DATA = "INTRO_DATA"; //$NON-NLS-1$
+ private static final String INTRO_THEME = "INTRO_THEME"; //$NON-NLS-1$
+ private TabFolder tabFolder;
+ private String firstPageId;
+ private Composite pageContainer;
+ private TableViewer themes;
+ private TableViewer available;
+ private TableViewer topLeft;
+ private TableViewer topRight;
+ private TableViewer bottomLeft;
+ private TableViewer bottomRight;
+ private CheckboxTableViewer rootPages;
+ private ArrayList introRootPages = new ArrayList();
+ private ArrayList themeList = new ArrayList();
+ private IntroTheme introTheme;
+ private String introThemeId;
+ private IntroData introData;
+ private Canvas themePreview;
+ private TableContentProvider contentProvider;
+ private TableLabelProvider labelProvider;
+ private Button applyToAll;
+ private Image extensionImage;
+ private Image themeImage;
+ private Image ihighImage;
+ private Image ilowImage;
+ private Image inewImage;
+ private Image icalloutImage;
+ private static final Transfer[] TRANSFER_TYPES = new Transfer[] { ExtensionDataTransfer.getInstance() };
+
+
+ private static final RootPage ROOT_PAGE_TABLE[] = new RootPage[] {
+ new RootPage(IUniversalIntroConstants.ID_OVERVIEW,
+ Messages.WelcomeCustomizationPreferencePage_overview),
+ new RootPage(IUniversalIntroConstants.ID_FIRSTSTEPS,
+ Messages.WelcomeCustomizationPreferencePage_firststeps),
+ new RootPage(IUniversalIntroConstants.ID_TUTORIALS,
+ Messages.WelcomeCustomizationPreferencePage_tutorials),
+ new RootPage(IUniversalIntroConstants.ID_SAMPLES,
+ Messages.WelcomeCustomizationPreferencePage_samples),
+ new RootPage(IUniversalIntroConstants.ID_WHATSNEW,
+ Messages.WelcomeCustomizationPreferencePage_whatsnew),
+ new RootPage(IUniversalIntroConstants.ID_WEBRESOURCES,
+ Messages.WelcomeCustomizationPreferencePage_webresources),
+ new RootPage(IUniversalIntroConstants.ID_MIGRATE,
+ Messages.WelcomeCustomizationPreferencePage_migrate) };
+
+ static class RootPage {
+
+ public String id;
+ public String name;
+
+ public RootPage(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public boolean equals(Object obj) {
+ if (obj == this)
+ return true;
+ if (obj == null)
+ return false;
+ if (obj instanceof RootPage) {
+ RootPage page = (RootPage) obj;
+ return page.id.equals(id) && page.name.equals(name);
+ }
+ return false;
+ }
+
+ public String toString() {
+ return name;
+ }
+ }
+
+ class TableContentProvider implements IStructuredContentProvider {
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement == ROOT_PAGE_TABLE)
+ return ROOT_PAGE_TABLE;
+ if (inputElement instanceof GroupData) {
+ return ((GroupData) inputElement).getExtensions();
+ }
+ if (inputElement == themes) {
+ return themeList.toArray();
+ }
+ return new Object[0];
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ class TableDragSourceListener implements DragSourceListener {
+
+ TableViewer viewer;
+ ExtensionData[] sel;
+
+ public TableDragSourceListener(TableViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection();
+ if (ssel.size() > 0) {
+ event.doit = true;
+ } else {
+ event.doit = false;
+ }
+ };
+
+ public void dragSetData(DragSourceEvent event) {
+ IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection();
+ ExtensionData[] array = new ExtensionData[ssel.size()];
+ int i = 0;
+ for (Iterator iter = ssel.iterator(); iter.hasNext();) {
+ array[i++] = (ExtensionData) iter.next();
+ }
+ event.data = array;
+ sel = array;
+ }
+
+ public void dragFinished(DragSourceEvent event) {
+ if (event.detail == DND.DROP_MOVE) {
+ GroupData gd = (GroupData) viewer.getInput();
+ for (int i = 0; i < sel.length; i++) {
+ ExtensionData ed = sel[i];
+ gd.remove(ed);
+ }
+ viewer.refresh();
+ updateColumnSizes(viewer);
+ }
+ sel = null;
+ }
+ }
+
+ class TableDropTargetListener extends ViewerDropAdapter {
+
+ public TableDropTargetListener(TableViewer viewer) {
+ super(viewer);
+ }
+
+ public boolean performDrop(Object data) {
+ ExtensionData target = (ExtensionData) getCurrentTarget();
+ int loc = getCurrentLocation();
+ GroupData gd = (GroupData) getViewer().getInput();
+ if (gd == null)
+ gd = createTargetGd(getViewer());
+ ExtensionData[] sel = (ExtensionData[]) data;
+
+ int index = target != null ? gd.getIndexOf(target) : -1;
+ int startingIndex = getStartIndex(gd, sel);
+ if (target != null) {
+ if (loc == LOCATION_AFTER
+ || (loc == LOCATION_ON && startingIndex != -1 && startingIndex < index))
+ index++;
+ else if (index > 0 && loc == LOCATION_BEFORE)
+ index--;
+ }
+
+ for (int i = 0; i < sel.length; i++) {
+ ExtensionData ed = sel[i];
+ if (index == -1)
+ gd.add(ed);
+ else
+ gd.add(index++, ed);
+ }
+ if (getViewer().getInput() != null)
+ getViewer().refresh();
+ else
+ getViewer().setInput(gd);
+ updateColumnSizes((TableViewer) getViewer());
+ return true;
+ }
+
+ private int getStartIndex(GroupData gd, ExtensionData[] sel) {
+ for (int i = 0; i < sel.length; i++) {
+ ExtensionData ed = sel[i];
+ int index = gd.getIndexOf(ed.getId());
+ if (index != -1)
+ return index;
+ }
+ return -1;
+ }
+
+ public boolean validateDrop(Object target, int operation, TransferData transferType) {
+ return ExtensionDataTransfer.getInstance().isSupportedType(transferType);
+ }
+ }
+
+ class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+ public String getText(Object obj) {
+ if (obj instanceof RootPage) {
+ return ((RootPage) obj).name;
+ }
+ if (obj instanceof ExtensionData) {
+ ExtensionData ed = (ExtensionData) obj;
+ String name = ed.getName();
+ if (name != null && name.length() > 0)
+ return name;
+ return ed.getId();
+ }
+ if (obj instanceof IntroTheme) {
+ IntroTheme bg = (IntroTheme) obj;
+ return bg.getName();
+ }
+ return super.getText(obj);
+ }
+
+ public Image getImage(Object obj) {
+ if (obj instanceof ExtensionData) {
+ ExtensionData ed = (ExtensionData) obj;
+ switch (ed.getImportance()) {
+ case ExtensionData.HIGH:
+ return ihighImage;
+ case ExtensionData.LOW:
+ return ilowImage;
+ case ExtensionData.NEW:
+ return inewImage;
+ case ExtensionData.CALLOUT:
+ return icalloutImage;
+ }
+ return extensionImage;
+ }
+ if (obj instanceof IntroTheme)
+ return themeImage;
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0)
+ return getImage(element);
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (columnIndex == 1 || element instanceof IntroTheme || element instanceof RootPage)
+ return getText(element);
+ return null;
+ }
+ }
+
+ class IntroTheme {
+ IConfigurationElement element;
+ Image previewImage;
+
+ public String getName() {
+ return element.getAttribute("name"); //$NON-NLS-1$
+ }
+
+ public String getId() {
+ return element.getAttribute("id"); //$NON-NLS-1$
+ }
+
+ public IntroTheme(IConfigurationElement element) {
+ this.element = element;
+ }
+
+ public Image getPreviewImage() {
+ if (previewImage==null) {
+ String path = element.getAttribute("previewImage"); //$NON-NLS-1$
+ if (path!=null) {
+ String bid = element.getDeclaringExtension().getNamespaceIdentifier();
+ Bundle bundle = Platform.getBundle(bid);
+ if (bundle!=null) {
+ ImageDescriptor desc = ImageUtil.createImageDescriptor(bundle, path);
+ previewImage = desc.createImage();
+ }
+ }
+ }
+ return previewImage;
+ }
+
+ public void dispose() {
+ if (previewImage!=null) {
+ previewImage.dispose();
+ previewImage=null;
+ }
+ }
+ }
+
+ public WelcomeCustomizationPreferencePage() {
+ }
+
+ public WelcomeCustomizationPreferencePage(String title) {
+ super(title);
+ }
+
+ public WelcomeCustomizationPreferencePage(String title, ImageDescriptor image) {
+ super(title, image);
+ }
+
+ protected Control createContents(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridData data = new GridData();
+ data.verticalAlignment = GridData.FILL;
+ data.horizontalAlignment = GridData.FILL;
+ container.setLayoutData(data);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ container.setLayout(layout);
+ tabFolder = new TabFolder(container, SWT.TOP);
+ tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
+ tabFolder.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ TabItem[] selection = tabFolder.getSelection();
+ onTabChange(selection[0]);
+ }
+ });
+ applyToAll = new Button(container, SWT.CHECK);
+ applyToAll.setText(Messages.WelcomeCustomizationPreferencePage_applyToAll);
+ contentProvider = new TableContentProvider();
+ labelProvider = new TableLabelProvider();
+ if (isCustomizationMode()) {
+ Button serialize = new Button(container, SWT.PUSH);
+ serialize.setText(Messages.WelcomeCustomizationPreferencePage_serialize);
+ serialize.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ doSerializeState();
+ }
+ });
+ }
+ extensionImage = ImageUtil.createImage("full/obj16/extension_obj.gif"); //$NON-NLS-1$
+ ihighImage = ImageUtil.createImage("full/obj16/ihigh_obj.gif"); //$NON-NLS-1$
+ ilowImage = ImageUtil.createImage("full/obj16/ilow_obj.gif"); //$NON-NLS-1$
+ inewImage = ImageUtil.createImage("full/obj16/inew_obj.gif"); //$NON-NLS-1$
+ icalloutImage = ImageUtil.createImage("full/obj16/icallout_obj.gif"); //$NON-NLS-1$
+ themeImage = ImageUtil.createImage("full/obj16/image_obj.gif"); //$NON-NLS-1$
+ addPages();
+ org.eclipse.jface.dialogs.Dialog.applyDialogFont(container);
+ return container;
+ }
+
+ private void doSerializeState() {
+ FileDialog fd = new FileDialog(getShell(), SWT.SAVE);
+ fd.setText(Messages.WelcomeCustomizationPreferencePage_serializeTitle);
+ String fileName = fd.open();
+ if (fileName != null) {
+ try {
+ FileWriter writer = new FileWriter(fileName);
+ PrintWriter pwriter = new PrintWriter(writer);
+ introData.write(pwriter);
+ pwriter.close();
+ } catch (IOException e) {
+ // show an error dialog in addition
+ Log.error("Error while saving the intro data file", e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private boolean isCustomizationMode() {
+ /*
+ * String[] args = Platform.getApplicationArgs(); for (int i = 0; i < args.length; i++) { if
+ * (args[i].equalsIgnoreCase("-welcomeCustomization")) //$NON-NLS-1$ return true; } return
+ * false;
+ */
+ return true;
+ }
+
+ public void init(IWorkbench workbench) {
+ }
+
+ private void addPages() {
+ loadData(false);
+ addHomePage();
+ createPageContainer();
+ addRootPages();
+ updateWidgetsFromData();
+ selectFirstPage();
+ }
+
+ private void addRootPages() {
+ addPage(IUniversalIntroConstants.ID_OVERVIEW);
+ addPage(IUniversalIntroConstants.ID_FIRSTSTEPS);
+ addPage(IUniversalIntroConstants.ID_TUTORIALS);
+ addPage(IUniversalIntroConstants.ID_SAMPLES);
+ addPage(IUniversalIntroConstants.ID_WHATSNEW);
+ addPage(IUniversalIntroConstants.ID_WEBRESOURCES);
+ addPage(IUniversalIntroConstants.ID_MIGRATE);
+ }
+
+ private void createPageContainer() {
+ pageContainer = new Composite(tabFolder, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.horizontalSpacing = 10;
+ pageContainer.setLayout(layout);
+ layout.numColumns = 4;
+ //layout.makeColumnsEqualWidth = true;
+ Label label;
+ label = new Label(pageContainer, SWT.WRAP);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_pageDesc);
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan = 4;
+ label.setLayoutData(gd);
+ label = new Label(pageContainer, SWT.SEPARATOR | SWT.HORIZONTAL);
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan = 4;
+ label.setLayoutData(gd);
+ label = new Label(pageContainer, SWT.NULL);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_available);
+ gd = new GridData();
+ label.setLayoutData(gd);
+ label = new Label(pageContainer, SWT.SEPARATOR | SWT.VERTICAL);
+ gd = new GridData(GridData.VERTICAL_ALIGN_FILL);
+ gd.verticalSpan = 3;
+ label.setLayoutData(gd);
+
+ label = new Label(pageContainer, SWT.NULL);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_left);
+ label = new Label(pageContainer, SWT.NULL);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_right);
+ available = createTableViewer(pageContainer, "hidden"); //$NON-NLS-1$
+ available.setSorter(new ViewerSorter());
+ gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
+ gd.verticalSpan = 2;
+ gd.widthHint = 100;
+ //gd.horizontalSpan = 2;
+ available.getControl().setLayoutData(gd);
+
+ topLeft = createTableViewer(pageContainer, "top-left"); //$NON-NLS-1$
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.widthHint = 100;
+ topLeft.getControl().setLayoutData(gd);
+
+ topRight = createTableViewer(pageContainer, "top-right"); //$NON-NLS-1$
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.widthHint = 100;
+ topRight.getControl().setLayoutData(gd);
+
+ //label = new Label(pageContainer, SWT.NULL);
+ //label.setText(Messages.WelcomeCustomizationPreferencePage_bottom);
+ bottomLeft = createTableViewer(pageContainer, "bottom-left"); //$NON-NLS-1$
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.widthHint = 100;
+ bottomLeft.getControl().setLayoutData(gd);
+
+ bottomRight = createTableViewer(pageContainer, "bottom-right"); //$NON-NLS-1$
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.widthHint = 100;
+ bottomRight.getControl().setLayoutData(gd);
+ }
+
+ private void updatePageContainer(String pageId, PageData pd) {
+ if (pageId == null || pd == null)
+ return;
+ topLeft.setInput(pd.findGroup(IUniversalIntroConstants.DIV_LAYOUT_TOP_LEFT));
+ topRight.setInput(pd.findGroup(IUniversalIntroConstants.DIV_LAYOUT_TOP_RIGHT));
+ bottomLeft.setInput(pd.findGroup(IUniversalIntroConstants.DIV_LAYOUT_BOTTOM_LEFT));
+ bottomRight.setInput(pd.findGroup(IUniversalIntroConstants.DIV_LAYOUT_BOTTOM_RIGHT));
+ available.setInput(pd.findGroup(IUniversalIntroConstants.HIDDEN));
+ updateColumnSizes(topLeft);
+ updateColumnSizes(topRight);
+ updateColumnSizes(bottomLeft);
+ updateColumnSizes(bottomRight);
+ updateColumnSizes(available);
+ }
+
+ private void onTabChange(TabItem item) {
+ String id = (String) item.getData();
+ if (item.getControl() == pageContainer)
+ updatePageContainer(id, (PageData) item.getData("pageData")); //$NON-NLS-1$
+ }
+
+ private void loadData(boolean fromDefault) {
+ IProduct product = Platform.getProduct();
+ if (product == null)
+ return;
+ String pid = product.getId();
+ introRootPages.clear();
+ Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences();
+ Preferences iprefs = IntroPlugin.getDefault().getPluginPreferences();
+ // 1. Root pages
+ // try product-qualified value first
+ String key = pid + "_" + INTRO_ROOT_PAGES; //$NON-NLS-1$
+ String rootPages = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key);
+ if (rootPages.length() == 0) {
+ rootPages = fromDefault ? prefs.getDefaultString(INTRO_ROOT_PAGES) : prefs
+ .getString(INTRO_ROOT_PAGES);
+ }
+ if (rootPages.length() > 0) {
+ StringTokenizer stok = new StringTokenizer(rootPages, ","); //$NON-NLS-1$
+ while (stok.hasMoreTokens()) {
+ String tok = stok.nextToken().trim();
+ introRootPages.add(tok);
+ }
+ }
+ // 3. Active theme
+ key = pid + "_" + INTRO_THEME; //$NON-NLS-1$
+ String value = fromDefault ? iprefs.getDefaultString(key) : iprefs.getString(key);
+ if (value.length() == 0) {
+ key = INTRO_THEME;
+ value = fromDefault ? iprefs.getDefaultString(key) : iprefs.getString(key);
+ }
+ if (value.length() > 0)
+ introThemeId = value;
+ // 4. Intro data
+ key = pid + "_" + INTRO_DATA; //$NON-NLS-1$
+ value = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key);
+ if (value.length() == 0) {
+ key = INTRO_DATA;
+ value = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key);
+ }
+ if (value.length() == 0)
+ value = null;
+ if (value != null && value.startsWith("product:")) //$NON-NLS-1$
+ value = value.substring(8);
+ value = BundleUtil.getResolvedResourceLocation(value, product.getDefiningBundle());
+ introData = new IntroData(pid, value, true);
+ introData.addImplicitContent();
+ }
+
+ public void dispose() {
+ themeList.clear();
+ extensionImage.dispose();
+ ihighImage.dispose();
+ ilowImage.dispose();
+ inewImage.dispose();
+ icalloutImage.dispose();
+ themeImage.dispose();
+ super.dispose();
+ }
+
+ private void updateIntroThemeFromData() {
+ if (introThemeId != null) {
+ for (int i = 0; i < themeList.size(); i++) {
+ IntroTheme theme = (IntroTheme) themeList.get(i);
+ if (theme.getId().equals(introThemeId)) {
+ introTheme = theme;
+ break;
+ }
+ }
+ }
+ updateThemePreview();
+ }
+
+ private void updateWidgetsFromData() {
+ // sync up intro background part
+ updateIntroThemeFromData();
+ // sync up the root page checklist
+ rootPages.setInput(ROOT_PAGE_TABLE);
+ ArrayList selected = new ArrayList();
+ for (int i = 0; i < ROOT_PAGE_TABLE.length; i++) {
+ String id = ROOT_PAGE_TABLE[i].id;
+ if (introRootPages.contains(id))
+ selected.add(ROOT_PAGE_TABLE[i]);
+ }
+ rootPages.setCheckedElements(selected.toArray());
+ }
+
+ private void updateThemePreview() {
+ themes.setInput(themes);
+ if (introTheme != null)
+ themes.setSelection(new StructuredSelection(introTheme), true);
+ themePreview.redraw();
+ }
+
+ public boolean performOk() {
+ saveData();
+ BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
+
+ public void run() {
+ restartIntro();
+ }
+ });
+ return true;
+ }
+
+ /**
+ * Remember the current page, close intro, reopen it and show the saved page.
+ *
+ */
+ private void restartIntro() {
+ IIntroManager manager = PlatformUI.getWorkbench().getIntroManager();
+ IIntroPart part = manager.getIntro();
+ if (part != null && part instanceof CustomizableIntroPart) {
+ IntroModelRoot modelRoot = IntroPlugin.getDefault().getIntroModelRoot();
+ String currentPageId = modelRoot.getCurrentPageId();
+ IWorkbenchWindow window = part.getIntroSite().getWorkbenchWindow();
+ boolean standby = manager.isIntroStandby(part);
+ PlatformUI.getWorkbench().getIntroManager().closeIntro(part);
+ UniversalIntroPlugin.getDefault().resetVolatileImageRegistry();
+ part = PlatformUI.getWorkbench().getIntroManager().showIntro(window, standby);
+ if (part != null) {
+ StringBuffer url = new StringBuffer();
+ url.append("http://org.eclipse.ui.intro/showPage?id="); //$NON-NLS-1$
+ url.append(currentPageId);
+ IIntroURL introURL = IntroURLFactory.createIntroURL(url.toString());
+ if (introURL != null)
+ introURL.execute();
+ }
+ }
+ }
+
+ protected void performDefaults() {
+ loadData(true);
+ // Dispose all the root page tabs
+ TabItem[] items = tabFolder.getItems();
+ for (int i = 0; i < items.length; i++) {
+ if (items[i].getData("pageData") != null) //$NON-NLS-1$
+ items[i].dispose();
+ }
+ // Add them back in based on the checked state
+ addRootPages();
+ updateWidgetsFromData();
+ // Get the items again
+ items = tabFolder.getItems();
+ // Select root
+ onTabChange(items[0]);
+ super.performDefaults();
+ }
+
+ private void saveData() {
+ Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences();
+ Preferences iprefs = IntroPlugin.getDefault().getPluginPreferences();
+ boolean toAll = applyToAll.getSelection();
+ IProduct product = Platform.getProduct();
+ if (product == null)
+ return;
+ String pid = product.getId();
+ StringBuffer sbuf = new StringBuffer();
+ for (int i = 0; i < introRootPages.size(); i++) {
+ if (i > 0)
+ sbuf.append(","); //$NON-NLS-1$
+ sbuf.append((String) introRootPages.get(i));
+ }
+ String key = pid + "_" + INTRO_ROOT_PAGES; //$NON-NLS-1$
+ prefs.setValue(key, sbuf.toString());
+ if (toAll) {
+ key = INTRO_ROOT_PAGES;
+ prefs.setValue(key, sbuf.toString());
+ }
+ // store page layouts
+ StringWriter writer = new StringWriter();
+ PrintWriter pwriter = new PrintWriter(writer);
+ introData.write(pwriter);
+ pwriter.close();
+ String value = writer.toString();
+ key = pid + "_" + INTRO_DATA; //$NON-NLS-1$
+ prefs.setValue(key, value);
+ if (toAll) {
+ key = INTRO_DATA;
+ prefs.setValue(key, value);
+ }
+ if (introTheme != null) {
+ key = pid + "_" + INTRO_THEME; //$NON-NLS-1$
+ value = introTheme.getId();
+ iprefs.setValue(key, value);
+ }
+ if (toAll) {
+ key = INTRO_THEME;
+ iprefs.setValue(key, value);
+ }
+ UniversalIntroPlugin.getDefault().savePluginPreferences();
+ IntroPlugin.getDefault().savePluginPreferences();
+ }
+
+ private void addHomePage() {
+ TabItem item = new TabItem(tabFolder, SWT.NULL);
+ item.setText("Home"); //$NON-NLS-1$
+ Composite container = new Composite(tabFolder, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+ Label label = new Label(container, SWT.NULL);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_background);
+ GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+ //gd.horizontalSpan = 2;
+ label.setLayoutData(gd);
+ label = new Label(container, SWT.NULL);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_preview);
+ themes = new TableViewer(container, SWT.BORDER);
+ themes.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+ themes.setContentProvider(contentProvider);
+ themes.setLabelProvider(labelProvider);
+ themes.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent e) {
+ Object sel = ((StructuredSelection) e.getSelection()).getFirstElement();
+ introTheme = (IntroTheme) sel;
+ themePreview.redraw();
+ }
+ });
+ loadThemes();
+ /*
+ Button browse = new Button(container, SWT.PUSH);
+ gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+ browse.setLayoutData(gd);
+ browse.setText(Messages.WelcomeCustomizationPreferencePage_browse);
+ browse.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ doBrowseBackground();
+ }
+ });
+ */
+ themePreview = new Canvas(container, SWT.NULL);
+ gd = new GridData();
+ gd.widthHint = 160+20;
+ gd.heightHint = 120+20;
+ themePreview.setLayoutData(gd);
+ themePreview.addPaintListener(new PaintListener() {
+
+ public void paintControl(PaintEvent e) {
+ if (introTheme == null)
+ return;
+ Image bgImage = introTheme.getPreviewImage();
+ if (bgImage == null)
+ return;
+ //Rectangle carea = themePreview.getClientArea();
+ Rectangle ibounds = bgImage.getBounds();
+ e.gc.drawImage(bgImage, 0, 0, ibounds.width, ibounds.height, 10, 10, 160, 120);
+ }
+ });
+ label = new Label(container, SWT.NULL);
+ label.setText(Messages.WelcomeCustomizationPreferencePage_rootpages);
+ gd = new GridData();
+ gd.horizontalSpan = 2;
+ label.setLayoutData(gd);
+ rootPages = CheckboxTableViewer.newCheckList(container, SWT.BORDER);
+ rootPages.setContentProvider(contentProvider);
+ rootPages.setLabelProvider(labelProvider);
+ gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+ gd.horizontalSpan = 2;
+ rootPages.getControl().setLayoutData(gd);
+ rootPages.addCheckStateListener(new ICheckStateListener() {
+
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ RootPage page = (RootPage) event.getElement();
+ boolean checked = event.getChecked();
+ onPageChecked(page.id, checked);
+ }
+ });
+ item.setControl(container);
+ }
+
+ private void loadThemes() {
+ IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$
+ for (int i=0; i<elements.length; i++) {
+ if (elements[i].getName().equals("theme")) { //$NON-NLS-1$
+ themeList.add(new IntroTheme(elements[i]));
+ }
+ }
+ }
+
+ private void addPage(String id) {
+ if (!getRootPageSelected(id))
+ return;
+ TabItem item = new TabItem(tabFolder, SWT.NULL);
+ item.setText(getRootPageName(id));
+ item.setControl(pageContainer);
+ item.setData(id);
+ PageData pd = introData.getPage(id);
+ item.setData("pageData", pd); //$NON-NLS-1$
+ }
+
+ private void onPageChecked(String id, boolean checked) {
+ TabItem[] items = tabFolder.getItems();
+ if (checked) {
+ for (int i = 0; i < items.length; i++) {
+ TabItem item = items[i];
+ if (item.getData() != null)
+ item.dispose();
+ }
+ introRootPages.add(id);
+ addRootPages();
+ } else {
+ for (int i = 0; i < items.length; i++) {
+ TabItem item = items[i];
+ String itemId = (String) item.getData();
+ if (itemId != null && itemId.equals(id)) {
+ item.dispose();
+ introRootPages.remove(id);
+ return;
+ }
+ }
+ }
+ }
+
+ private String getRootPageName(String id) {
+ for (int i = 0; i < ROOT_PAGE_TABLE.length; i++) {
+ if (ROOT_PAGE_TABLE[i].id.equals(id))
+ return ROOT_PAGE_TABLE[i].name;
+ }
+ return "?"; //$NON-NLS-1$
+ }
+
+ private boolean getRootPageSelected(String id) {
+ for (int i = 0; i < introRootPages.size(); i++) {
+ String cid = (String) introRootPages.get(i);
+ if (cid.equals(id))
+ return true;
+ }
+ return false;
+ }
+
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+ throws CoreException {
+ }
+
+ private void createPopupMenu(final TableViewer viewer) {
+ MenuManager manager = new MenuManager();
+ manager.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(manager.getMenu());
+ manager.setRemoveAllWhenShown(true);
+ manager.addMenuListener(new IMenuListener() {
+
+ public void menuAboutToShow(IMenuManager manager) {
+ fillPopupMenu(manager, viewer);
+ }
+ });
+ }
+
+ private void addDNDSupport(TableViewer viewer) {
+ viewer.addDragSupport(DND.DROP_MOVE, TRANSFER_TYPES, new TableDragSourceListener(viewer));
+ viewer.addDropSupport(DND.DROP_MOVE, TRANSFER_TYPES, new TableDropTargetListener(viewer));
+ }
+
+ private TableViewer createTableViewer(Composite parent, String id) {
+ final Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION);
+ final TableColumn column1 = new TableColumn(table, SWT.NULL);
+ column1.setMoveable(false);
+ column1.setWidth(20);
+ column1.setResizable(false);
+ final TableColumn column2 = new TableColumn(table, SWT.NULL);
+ column2.setResizable(true);
+ final TableViewer viewer = new TableViewer(table);
+ CellEditor[] editors = new CellEditor[2];
+ editors[0] = new ComboBoxCellEditor(table, ExtensionData.IMPORTANCE_NAME_TABLE, SWT.READ_ONLY);
+ viewer.setCellEditors(editors);
+ viewer.setColumnProperties(new String[] { IUniversalIntroConstants.P_IMPORTANCE,
+ IUniversalIntroConstants.P_NAME });
+ viewer.setCellModifier(new ICellModifier() {
+
+ public boolean canModify(Object element, String property) {
+ return property.equals(IUniversalIntroConstants.P_IMPORTANCE);
+ }
+
+ public Object getValue(Object element, String property) {
+ ExtensionData ed = (ExtensionData) element;
+ if (property.equals(IUniversalIntroConstants.P_IMPORTANCE))
+ return new Integer(ed.getImportance());
+ return null;
+ }
+
+ public void modify(Object element, String property, Object value) {
+ Integer ivalue = (Integer) value;
+ TableItem item = (TableItem) element;
+ ExtensionData ed = (ExtensionData) item.getData();
+ ed.setImportance(ivalue.intValue());
+ viewer.update(ed, new String [] {IUniversalIntroConstants.P_IMPORTANCE});
+ }
+ });
+ viewer.setContentProvider(contentProvider);
+ viewer.setLabelProvider(labelProvider);
+ viewer.setData("id", id); //$NON-NLS-1$
+ createPopupMenu(viewer);
+ addDNDSupport(viewer);
+ return viewer;
+ }
+
+ private void fillPopupMenu(IMenuManager manager, final TableViewer viewer) {
+ StructuredSelection ssel = (StructuredSelection) viewer.getSelection();
+
+ if (ssel.size() == 1 && viewer != available) {
+ Action upAction = new Action(Messages.WelcomeCustomizationPreferencePage_up) {
+
+ public void run() {
+ doMove(viewer, true);
+ }
+ };
+ Action downAction = new Action(Messages.WelcomeCustomizationPreferencePage_down) {
+
+ public void run() {
+ doMove(viewer, false);
+ }
+ };
+ ExtensionData ed = (ExtensionData) ssel.getFirstElement();
+ GroupData gd = (GroupData) viewer.getInput();
+ upAction.setEnabled(gd.canMoveUp(ed));
+ downAction.setEnabled(gd.canMoveDown(ed));
+ manager.add(upAction);
+ manager.add(downAction);
+ }
+ if (ssel.size() > 0) {
+ manager.add(new Separator());
+ MenuManager menu = new MenuManager(Messages.WelcomeCustomizationPreferencePage_moveTo);
+ addMoveToAction(menu, available, viewer,
+ Messages.WelcomeCustomizationPreferencePage_menu_available);
+ addMoveToAction(menu, topLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_top_left);
+ addMoveToAction(menu, topRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_top_right);
+ addMoveToAction(menu, bottomLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_left);
+ addMoveToAction(menu, bottomRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_right);
+ manager.add(menu);
+ }
+ }
+
+ private void addMoveToAction(MenuManager menu, final TableViewer target, final TableViewer source,
+ String name) {
+ if (source == target)
+ return;
+ Action action = new Action(name) {
+
+ public void run() {
+ doMoveTo(source, target);
+ }
+ };
+ menu.add(action);
+ }
+
+ private void doMove(Viewer viewer, boolean up) {
+ Object obj = ((StructuredSelection) viewer.getSelection()).getFirstElement();
+ GroupData gd = (GroupData) viewer.getInput();
+ if (up)
+ gd.moveUp((ExtensionData) obj);
+ else
+ gd.moveDown((ExtensionData) obj);
+ viewer.refresh();
+ }
+
+ private void doMoveTo(TableViewer source, TableViewer target) {
+ Object[] selObjs = ((StructuredSelection) source.getSelection()).toArray();
+ GroupData sourceGd = (GroupData) source.getInput();
+ GroupData targetGd = (GroupData) target.getInput();
+ if (targetGd == null) {
+ targetGd = createTargetGd(target);
+ }
+ for (int i = 0; i < selObjs.length; i++) {
+ ExtensionData ed = (ExtensionData) selObjs[i];
+ sourceGd.remove(ed);
+ targetGd.add(ed);
+ }
+ source.refresh();
+ updateColumnSizes(source);
+ if (target.getInput() != null)
+ target.refresh();
+ else
+ target.setInput(targetGd);
+ updateColumnSizes(target);
+ }
+
+ private void updateColumnSizes(TableViewer viewer) {
+ TableColumn sc = viewer.getTable().getColumn(1);
+ sc.pack();
+ }
+
+ private GroupData createTargetGd(Viewer target) {
+ GroupData targetGd = null;
+ if (target == topLeft)
+ targetGd = new GroupData(PageData.P_TOP_LEFT, false);
+ else if (target == topRight)
+ targetGd = new GroupData(PageData.P_TOP_RIGHT, false);
+ else if (target == bottomLeft)
+ targetGd = new GroupData(PageData.P_BOTTOM_LEFT, false);
+ else if (target == bottomRight)
+ targetGd = new GroupData(PageData.P_BOTTOM_RIGHT, false);
+ else if (target == available)
+ targetGd = new GroupData(IUniversalIntroConstants.HIDDEN, false);
+ else
+ return null;
+ TabItem[] items = tabFolder.getSelection();
+ PageData pd = (PageData) items[0].getData("pageData"); //$NON-NLS-1$
+ pd.add(targetGd);
+ return targetGd;
+ }
+
+ public void setCurrentPage(String pageId) {
+ firstPageId = pageId;
+ }
+
+ private void selectFirstPage() {
+ if (firstPageId == null)
+ return;
+ TabItem[] items = tabFolder.getItems();
+ for (int i = 0; i < items.length; i++) {
+ TabItem item = items[i];
+ PageData pd = (PageData) item.getData("pageData"); //$NON-NLS-1$
+ if (pd != null && pd.getId().equals(firstPageId)) {
+ tabFolder.setSelection(i);
+ onTabChange(item);
+ return;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java
new file mode 100644
index 000000000..c3bbc9fca
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/BundleUtil.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ui.internal.intro.universal.util;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+/**
+ * Bundle convenience methods.
+ */
+public class BundleUtil {
+
+ private static String NL_TAG = "$nl$/"; //$NON-NLS-1$
+
+
+ /**
+ * Utility method to validate the state of a bundle. Log invalid bundles to
+ * log file.
+ */
+ public static boolean bundleHasValidState(Bundle bundle) {
+ if (bundle == null || bundle.getState() == Bundle.UNINSTALLED
+ || bundle.getState() == Bundle.INSTALLED) {
+
+ if (bundle == null)
+ Log.error("Universal Welcome tried accessing a NULL bundle.", null); //$NON-NLS-1$
+ else {
+ String msg = StringUtil
+ .concat("Universal Welcome tried accessing Bundle: ", getBundleHeader( //$NON-NLS-1$
+ bundle, Constants.BUNDLE_NAME), " vendor: ", //$NON-NLS-1$
+ getBundleHeader(bundle, Constants.BUNDLE_VENDOR),
+ " bundle state: ", String.valueOf(bundle.getState())).toString(); //$NON-NLS-1$
+ Log.error(msg, null);
+ }
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Retrieves the given key from the bundle header.
+ *
+ * @param bundle
+ * @param key
+ * @return
+ */
+ public static String getBundleHeader(Bundle bundle, String key) {
+ return (String) bundle.getHeaders().get(key);
+ }
+
+
+ public static Bundle getBundleFromConfigurationElement(
+ IConfigurationElement cfg) {
+ return Platform.getBundle(cfg.getNamespaceIdentifier());
+ }
+
+
+ /**
+ * Get the resourcelocation, but do not force an $nl$ on it.
+ *
+ * @param resource
+ * @param element
+ * @return
+ */
+ public static String getResourceLocation(String resource,
+ IConfigurationElement element) {
+ Bundle bundle = getBundleFromConfigurationElement(element);
+ return getResolvedResourceLocation(resource, bundle, false);
+ }
+
+
+ /**
+ * Returns the fully qualified location of the passed resource string from
+ * the passed plugin id. If the file could not be loaded from the plugin,
+ * the resource is returned as is.
+ *
+ * @param resource
+ * @return
+ */
+ public static String getResolvedResourceLocation(String resource,
+ String pluginId) {
+ Bundle bundle = Platform.getBundle(pluginId);
+ return getResolvedResourceLocation(resource, bundle, true);
+ }
+
+
+ /**
+ * Shorthand util method.
+ *
+ * @param resource
+ * @return
+ */
+ public static String getResolvedResourceLocation(String resource,
+ Bundle bundle) {
+ return getResolvedResourceLocation(resource, bundle, true);
+ }
+
+
+ public static String getResolvedResourceLocation(String base,
+ String resource, Bundle bundle) {
+ // quick exits.
+ if (resource == null)
+ return null;
+
+ String fullResource = new Path(base).append(resource).toString();
+ String resolvedResource = getResolvedResourceLocation(fullResource,
+ bundle, true);
+
+ if (resolvedResource.equals(fullResource))
+ // return resource as is when the resource does not exist.
+ return resource;
+ return resolvedResource;
+ }
+
+
+ public static String getResolvedResourceLocation(String resource,
+ Bundle bundle, boolean forceNLResolve) {
+ // quick exits.
+ if (resource == null)
+ return null;
+
+ if (bundle == null || !bundleHasValidState(bundle))
+ return resource;
+
+ URL localLocation = null;
+ try {
+ // we need to resolve this URL.
+ String copyResource = resource;
+ if (forceNLResolve && !copyResource.startsWith(NL_TAG)) {
+ if (copyResource.startsWith("/") //$NON-NLS-1$
+ || copyResource.startsWith("\\")) //$NON-NLS-1$
+ copyResource = resource.substring(1);
+ copyResource = NL_TAG + copyResource;
+ }
+ IPath resourcePath = new Path(copyResource);
+ localLocation = FileLocator.find(bundle, resourcePath, null);
+ if (localLocation == null) {
+ // localLocation can be null if the passed resource could not
+ // be found relative to the plugin. log fact, return resource,
+ // as is.
+ String msg = StringUtil.concat("Could not find resource: ", //$NON-NLS-1$
+ resource, " in ", getBundleHeader( //$NON-NLS-1$
+ bundle, Constants.BUNDLE_NAME)).toString();
+ Log.warning(msg);
+ return resource;
+ }
+ localLocation = FileLocator.toFileURL(localLocation);
+ return localLocation.toExternalForm();
+ } catch (Exception e) {
+ String msg = StringUtil.concat("Failed to load resource: ", //$NON-NLS-1$
+ resource, " from ", getBundleHeader(bundle, //$NON-NLS-1$
+ Constants.BUNDLE_NAME)).toString();
+ Log.error(msg, e);
+ return resource;
+ }
+ }
+
+
+
+
+ /** *** used by Intro parser ***** */
+ /*
+ * Util method to return an URL to a plugin relative resource.
+ */
+ public static URL getResourceAsURL(String resource, String pluginId) {
+ Bundle bundle = Platform.getBundle(pluginId);
+ URL localLocation = localLocation = FileLocator.find(bundle, new Path(
+ resource), null);
+ return localLocation;
+ }
+
+
+
+
+ /** ********************* Used by HTML generator ****************** */
+ /**
+ * Get the absolute path of the given bundle, in the form
+ * file:/path_to_plugin
+ *
+ * @param bundle
+ * @return
+ */
+ public static String getResolvedBundleLocation(Bundle bundle) {
+ try {
+ URL bundleLocation = bundle.getEntry(""); //$NON-NLS-1$
+ if (bundleLocation == null)
+ return null;
+ bundleLocation = FileLocator.toFileURL(bundleLocation);
+ return bundleLocation.toExternalForm();
+ } catch (IllegalStateException e) {
+ Log.error("Failed to access bundle: " //$NON-NLS-1$
+ + bundle.getSymbolicName(), e);
+ return null;
+ } catch (IOException e) {
+ Log.error("Failed to resolve URL path for bundle: " //$NON-NLS-1$
+ + bundle.getSymbolicName(), e);
+ return null;
+ }
+ }
+
+ /**
+ * Get the absolute path of the bundle with id <code>bundleId</code>. If
+ * no such bundle is found, return null.
+ *
+ * @param bundleId
+ * @return
+ */
+ public static String getResolvedBundleLocation(String bundleId) {
+ Bundle bundle = Platform.getBundle(bundleId);
+ if (bundle == null)
+ return null;
+ return getResolvedBundleLocation(bundle);
+ }
+
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java
new file mode 100644
index 000000000..e4f9b4f80
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/ImageUtil.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.intro.universal.util;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.internal.intro.universal.IUniversalIntroConstants;
+import org.eclipse.ui.internal.intro.universal.UniversalIntroPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * Convenience class for Images.
+ */
+public final class ImageUtil {
+
+ /**
+ * Image keys, to be used by plugin (intro) registry.
+ */
+ // Default images
+ public static final String DEFAULT_ROOT_LINK = "rootLink"; //$NON-NLS-1$
+
+ public static final String DEFAULT_SMALL_ROOT_LINK = "rootLinkSmall"; //$NON-NLS-1$
+
+ public static final String DEFAULT_FORM_BG = "formBg"; //$NON-NLS-1$
+
+ public static final String DEFAULT_LINK = "link"; //$NON-NLS-1$
+
+ // Standby images
+ public static final String BACK = "back"; //$NON-NLS-1$
+
+ public static final String HELP_TOPIC = "helpTopic"; //$NON-NLS-1$
+
+ // Launch bar image
+ public static final String RESTORE_WELCOME = "restoreWelcome"; //$NON-NLS-1$
+
+ // Viewer images
+ public static final String INTRO_MODEL_LEAF = "leaf"; //$NON-NLS-1$
+
+ public static final String INTRO_MODEL_CONTAINER = "container"; //$NON-NLS-1$
+
+ public static final String OPEN_ITNRO_VIEW = "introView"; //$NON-NLS-1$
+
+ public static final String CONFIG_EXTENSION = "configExtension";//$NON-NLS-1$
+
+ // Image location
+ public static final String ICONS_PATH = "$nl$/icons/"; //$NON-NLS-1$
+
+ /**
+ * Convenience method to create an image descriptor from the Intro plugin.
+ *
+ * Method assumes that images are under the "icons" directory, so don't
+ * append that directory name for "imageName".
+ */
+ public static ImageDescriptor createImageDescriptor(String imageName) {
+ return createImageDescriptor(Platform
+ .getBundle(IUniversalIntroConstants.PLUGIN_ID), ICONS_PATH + imageName);
+ }
+
+ /**
+ * Convenience method to create an image descriptor.
+ *
+ */
+ public static ImageDescriptor createImageDescriptor(Bundle bundle,
+ String imageName) {
+ try {
+ URL imageUrl = FileLocator.find(bundle, new Path(imageName), null);
+ if (imageUrl != null) {
+ ImageDescriptor desc = ImageDescriptor.createFromURL(imageUrl);
+ return desc;
+ }
+ } catch (Exception e) {
+ // Should never be here.
+ Log.error("could not create Image Descriptor", e); //$NON-NLS-1$
+ }
+ Log.warning("could not create Image Descriptor for: " + imageName //$NON-NLS-1$
+ + " in bundle: " + bundle.getSymbolicName()); //$NON-NLS-1$
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+
+ /**
+ * Convenience method to create an image descriptor.
+ *
+ */
+ public static ImageDescriptor createImageDescriptor(IPath base,
+ String imageName) {
+ try {
+ URL imageUrl = new URL(base.append(imageName).toOSString());
+ if (imageUrl != null) {
+ ImageDescriptor desc = ImageDescriptor.createFromURL(imageUrl);
+ return desc;
+ }
+ } catch (Exception e) {
+ // Should never be here.
+ Log.error("could not create Image Descriptor", e); //$NON-NLS-1$
+ }
+ Log.warning("could not create Image Descriptor for: " + imageName); //$NON-NLS-1$
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+
+ /**
+ * Convenience method to create an image from the Intro plugin.
+ *
+ * Method assumes that images are under the "icons" directory, so don't
+ * append that directory name for "imageName".
+ */
+ public static Image createImage(String imageName) {
+ try {
+ ImageDescriptor imageDsc = createImageDescriptor(imageName);
+ return imageDsc.createImage();
+ } catch (Exception e) {
+ // Should never be here.
+ Log.error("could not create Image", e); //$NON-NLS-1$
+ return ImageDescriptor.getMissingImageDescriptor().createImage();
+ }
+ }
+
+ /**
+ * Util method for image re-use in Intro Plugin.
+ *
+ * @param key
+ * @return
+ */
+ public static Image getImage(String key) {
+ // INTRO: Image registry should not have the same life span
+ // as the intro plug-in. It should be disposed when
+ // presentation is disposed, otherwise images will
+ // stay around once Inro has been loaded.
+ return UniversalIntroPlugin.getDefault().getVolatileImageRegistry()
+ .get(key);
+ }
+
+ public static boolean hasImage(String key) {
+ ImageRegistry registry = UniversalIntroPlugin.getDefault()
+ .getVolatileImageRegistry();
+ return (registry.getDescriptor(key) != null);
+ }
+
+ /**
+ * Register an image descriptor in the Intro Plugin image registry. Has no
+ * effect if the key has already been registered.
+ *
+ * @param key
+ * @param imageName
+ */
+ public static void registerImage(String key, String imageName) {
+ ImageRegistry registry = UniversalIntroPlugin.getDefault()
+ .getVolatileImageRegistry();
+ if (registry.getDescriptor(key) != null)
+ // key has already been registered. do nothing.
+ return;
+ registry.put(key, createImageDescriptor(imageName));
+ }
+
+ public static void registerImage(String key, Bundle bundle, String imageName) {
+
+ ImageRegistry registry = UniversalIntroPlugin.getDefault()
+ .getVolatileImageRegistry();
+ if (registry.getDescriptor(key) != null)
+ // key has already been registered. do nothing.
+ return;
+ registry.put(key, createImageDescriptor(bundle, imageName));
+ }
+
+ public static void registerImage(String key, IPath base, String imageName) {
+ ImageRegistry registry = UniversalIntroPlugin.getDefault()
+ .getVolatileImageRegistry();
+ if (registry.getDescriptor(key) != null)
+ // key has already been registered. do nothing.
+ return;
+ registry.put(key, createImageDescriptor(base, imageName));
+ }
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java
new file mode 100644
index 000000000..6b5f64608
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/Log.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.intro.universal.util;
+
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.internal.intro.universal.IUniversalIntroConstants;
+import org.eclipse.ui.internal.intro.universal.UniversalIntroPlugin;
+
+/**
+ * Utility class for logging, based on Platform logging classes. The log
+ * listerner used is the base one supplied by the platform. Error messages are
+ * always logged. Warning messages are only logged when the plugin is in debug
+ * mode. Info messages are only logged when the /trace/logInfo debug option is
+ * set to true. Performance reports are only logged when /trace/performance is
+ * set to true.
+ *
+ */
+public class Log implements IUniversalIntroConstants {
+
+ /**
+ * This MUST be set to <b>false </b> in production. <br>
+ * Used to compile out developement debug messages. <br>
+ * Compiler compiles out code warpped wit this flag as an optimization.
+ */
+ public static final boolean DEBUG = false;
+
+
+ // Use these flags to filter out code that may be a performance hit.
+ // Flag that controls logging of warning message
+ public static boolean logWarning = false;
+ // Flag that controls logging of information messages
+ public static boolean logInfo = false;
+ // Flag that controls logging of performance messages
+ public static boolean logPerformance = false;
+
+ private final static ILog pluginLog = UniversalIntroPlugin.getDefault().getLog();
+
+ static {
+ // init debug options based on settings defined in ".options" file. If
+ // the plugin is not in debug mode, no point setting debug options.
+ if (UniversalIntroPlugin.getDefault().isDebugging()) {
+ logWarning = true;
+ logInfo = getDebugOption("/trace/logInfo"); //$NON-NLS-1$
+ logPerformance = getDebugOption("/trace/logPerformance"); //$NON-NLS-1$
+ }
+
+ }
+
+ private static boolean getDebugOption(String option) {
+ return "true".equalsIgnoreCase(//$NON-NLS-1$
+ Platform.getDebugOption(PLUGIN_ID + option));
+ }
+
+ /**
+ * Log an Error message with an exception. Note that the message should
+ * already be localized to proper local. Errors are always logged.
+ */
+ public static synchronized void error(String message, Throwable ex) {
+ if (message == null)
+ message = ""; //$NON-NLS-1$
+ Status errorStatus = new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK,
+ message, ex);
+ pluginLog.log(errorStatus);
+ }
+
+ /**
+ * Log an Information message. Note that the message should already be
+ * localized to proper local. Info messages are only logged when the
+ * /trace/logInfo debug option is true.
+ */
+ public static synchronized void info(String message) {
+ if (!logInfo)
+ // logging of info messages is not enabled.
+ return;
+
+ if (message == null)
+ message = ""; //$NON-NLS-1$
+ Status infoStatus = new Status(IStatus.INFO, PLUGIN_ID, IStatus.OK,
+ message, null);
+ pluginLog.log(infoStatus);
+ }
+
+ /**
+ * Log an Information message. Note that the message should already be
+ * localized to proper local. These messages are always logged. They are not
+ * controlled by any debug flags. Logging of these messages can be
+ * controlled by the public flags in this class.
+ */
+ public static synchronized void forcedInfo(String message) {
+ if (message == null)
+ message = ""; //$NON-NLS-1$
+ Status infoStatus = new Status(IStatus.INFO, PLUGIN_ID, IStatus.OK,
+ message, null);
+ pluginLog.log(infoStatus);
+ }
+
+
+ /**
+ * Log a Warning message. Note that the message should already be localized
+ * to proper local. Warning messages are only logged when the plugin is in
+ * debug mode.
+ */
+ public static synchronized void warning(String message) {
+ if (!logWarning)
+ // no warning messages (ie: plugin is not in debug mode). Default is
+ // to not log warning messages.
+ return;
+
+ if (message == null)
+ message = ""; //$NON-NLS-1$
+ Status warningStatus = new Status(IStatus.WARNING, PLUGIN_ID,
+ IStatus.OK, message, null);
+ pluginLog.log(warningStatus);
+ }
+
+ /**
+ * Log a development debug message. Debug messages are compiled out.
+ */
+ public static synchronized void debugMessage(String className,
+ String message) {
+ if (DEBUG) {
+ MultiStatus debugStatus = new MultiStatus(PLUGIN_ID, IStatus.OK,
+ className, null);
+ Status infoStatus = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK,
+ message, null);
+ debugStatus.add(infoStatus);
+ pluginLog.log(debugStatus);
+ }
+ }
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/StringUtil.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/StringUtil.java
new file mode 100644
index 000000000..eee931e09
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/util/StringUtil.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.internal.intro.universal.util;
+
+
+
+public class StringUtil {
+
+ public static StringBuffer concat(String string1, String string2,
+ String string3) {
+ StringBuffer buffer = new StringBuffer(string1);
+ buffer.append(string2);
+ buffer.append(string3);
+ return buffer;
+ }
+
+ public static StringBuffer concat(String string1, String string2,
+ String string3, String string4) {
+ StringBuffer buffer = concat(string1, string2, string3);
+ buffer.append(string4);
+ return buffer;
+ }
+
+ public static StringBuffer concat(String string1, String string2,
+ String string3, String string4, String string5) {
+ StringBuffer buffer = concat(string1, string2, string3, string4);
+ buffer.append(string5);
+ return buffer;
+ }
+
+ public static StringBuffer concat(String string1, String string2,
+ String string3, String string4, String string5, String string6) {
+ StringBuffer buffer = concat(string1, string2, string3, string4,
+ string5);
+ buffer.append(string6);
+ return buffer;
+ }
+
+
+
+}
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java
new file mode 100644
index 000000000..65e8a25dc
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/intro/universal/ExtensionFactory.java
@@ -0,0 +1,81 @@
+/***************************************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.ui.intro.universal;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IExecutableExtensionFactory;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.internal.intro.universal.UniversalIntroPlugin;
+import org.eclipse.ui.internal.intro.universal.WelcomeCustomizationPreferencePage;
+
+/**
+ * Factory for the intro's public extensions.
+ * <p>
+ * This allows the extensions to be made available for use by RCP applications without exposing
+ * their concrete implementation classes.
+ * </p>
+ * <p>
+ * Currently supported plug-in extensions:
+ * <ul>
+ * <li>welcomeCustomization - a preference page that allows user customization of the shared
+ * Welcome.</li>
+ * </ul>
+ * <p>This class should be referenced in extensions but not subclassed
+ * or instantiated programmatically.
+ *
+ * @since 3.2
+ */
+
+public class ExtensionFactory implements IExecutableExtensionFactory, IExecutableExtension {
+
+ private String id;
+ private IConfigurationElement config;
+ private String propertyName;
+ private static final String WELCOME_CUSTOMIZATION_PREFERENCE_PAGE = "welcomeCustomization"; //$NON-NLS-1$
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IExecutableExtensionFactory#create()
+ */
+ public Object create() throws CoreException {
+ if (WELCOME_CUSTOMIZATION_PREFERENCE_PAGE.equals(id))
+ return configure(new WelcomeCustomizationPreferencePage());
+
+ throw new CoreException(new Status(IStatus.ERROR, UniversalIntroPlugin.PLUGIN_ID, 0,
+ "Unknown id in data argument for " + getClass(), null)); //$NON-NLS-1$
+ }
+
+ private Object configure(Object obj) throws CoreException {
+ if (obj instanceof IExecutableExtension) {
+ ((IExecutableExtension) obj).setInitializationData(config, propertyName, null);
+ }
+ return obj;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
+ * java.lang.String, java.lang.Object)
+ */
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+ throws CoreException {
+ if (data instanceof String)
+ id = (String) data;
+ else
+ throw new CoreException(new Status(IStatus.ERROR, UniversalIntroPlugin.PLUGIN_ID, 0,
+ "Data argument must be a String for " + getClass(), null)); //$NON-NLS-1$
+ this.config = config;
+ this.propertyName = propertyName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/banner_left_lines.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/banner_left_lines.png
new file mode 100644
index 000000000..e96fc867a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/banner_left_lines.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_banner.jpg
new file mode 100644
index 000000000..8524e946b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav.png
new file mode 100644
index 000000000..99eb592de
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_hover.png
new file mode 100644
index 000000000..c80a66e85
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_lg.png
new file mode 100644
index 000000000..324de6e43
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/fs_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_banner.jpg
new file mode 100644
index 000000000..89cb6401c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav.png
new file mode 100644
index 000000000..5434708e5
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_hover.png
new file mode 100644
index 000000000..a6551a860
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_lg.png
new file mode 100644
index 000000000..df8e2ffa7
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/mi_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/nav_midhov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/nav_midhov.png
new file mode 100644
index 000000000..58a220d42
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/nav_midhov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/nav_rightedgehov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/nav_rightedgehov.png
new file mode 100644
index 000000000..403775eb4
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/nav_rightedgehov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/new_obj.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/new_obj.gif
new file mode 100644
index 000000000..f46b81bdd
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/new_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/newhov_obj.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/newhov_obj.gif
new file mode 100644
index 000000000..593e63bc6
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/newhov_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_banner.jpg
new file mode 100644
index 000000000..004686582
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav.png
new file mode 100644
index 000000000..709f69a68
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_hover.png
new file mode 100644
index 000000000..b01a1aa4b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_lg.png
new file mode 100644
index 000000000..c2513e951
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_midhov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_midhov.png
new file mode 100644
index 000000000..44bb0e5f4
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_midhov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_rightedgehov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_rightedgehov.png
new file mode 100644
index 000000000..7b3b1d9f5
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/ov_nav_rightedgehov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/overview48sel.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/overview48sel.gif
new file mode 100644
index 000000000..3d1c45bf7
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/overview48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/circles.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/circles.png
new file mode 100644
index 000000000..5537eac58
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/circles.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps.png
new file mode 100644
index 000000000..eccc75735
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps48.png
new file mode 100644
index 000000000..5b0270e1f
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps_tophov.png
new file mode 100644
index 000000000..1f6061733
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/firststeps_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate.png
new file mode 100644
index 000000000..07fea1d0e
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate48.png
new file mode 100644
index 000000000..c1379ac75
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate_tophov.png
new file mode 100644
index 000000000..b9177b213
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/migrate_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview.png
new file mode 100644
index 000000000..64735d630
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview48.png
new file mode 100644
index 000000000..f14e3b887
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview_tophov.png
new file mode 100644
index 000000000..bae1dcf32
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/overview_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_bottomhov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_bottomhov.png
new file mode 100644
index 000000000..d0cb41621
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_bottomhov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_midhov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_midhov.png
new file mode 100644
index 000000000..5ee69dc0c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/root_midhov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples.png
new file mode 100644
index 000000000..cb3db1db8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples48.png
new file mode 100644
index 000000000..5e9bcfc48
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples_tophover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples_tophover.png
new file mode 100644
index 000000000..6729f5ee6
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/samples_tophover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials.png
new file mode 100644
index 000000000..e40a8239b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials48.png
new file mode 100644
index 000000000..fd97ecb3a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials_tophov.png
new file mode 100644
index 000000000..8bbf9243f
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/tutorials_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources.png
new file mode 100644
index 000000000..1a876dc58
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources48.png
new file mode 100644
index 000000000..095009825
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources_tophov.png
new file mode 100644
index 000000000..944668b1f
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/webresources_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/welcomebckgrd.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/welcomebckgrd.jpg
new file mode 100644
index 000000000..34eb1a78e
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/welcomebckgrd.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew.png
new file mode 100644
index 000000000..a10dd3de0
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew48.png
new file mode 100644
index 000000000..37e19e056
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew_tophov.png
new file mode 100644
index 000000000..d8c1490af
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/whatsnew_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench.png
new file mode 100644
index 000000000..868f3abbd
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench48.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench48.png
new file mode 100644
index 000000000..d778dfa56
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench48.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench_tophov.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench_tophov.png
new file mode 100644
index 000000000..57adab786
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/root/workbench_tophov.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_banner.jpg
new file mode 100644
index 000000000..5a2eaf5d8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav.png
new file mode 100644
index 000000000..9871b72bb
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_hover.png
new file mode 100644
index 000000000..be6ed3310
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_lg.png
new file mode 100644
index 000000000..d2cabf1e5
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/sa_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/samples48.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/samples48.gif
new file mode 100644
index 000000000..3213de674
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/samples48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/samples48sel.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/samples48sel.gif
new file mode 100644
index 000000000..f9c0469ab
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/samples48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_banner.jpg
new file mode 100644
index 000000000..2e450b7d4
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav.png
new file mode 100644
index 000000000..ce589ab7d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_hover.png
new file mode 100644
index 000000000..39a5931e1
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_lg.png
new file mode 100644
index 000000000..4c6664402
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/tu_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/tutorials48sel.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/tutorials48sel.gif
new file mode 100644
index 000000000..3d687bd56
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/tutorials48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav.png
new file mode 100644
index 000000000..0621c3c47
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav_hover.png
new file mode 100644
index 000000000..791318934
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wb_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/whatsnew48sel.gif b/org.eclipse.ui.intro.universal/themes/circles/graphics/whatsnew48sel.gif
new file mode 100644
index 000000000..0da843fe3
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/whatsnew48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_banner.jpg
new file mode 100644
index 000000000..0f9e8f335
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav.png
new file mode 100644
index 000000000..47ecb7c96
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_hover.png
new file mode 100644
index 000000000..585c663e0
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_lg.png
new file mode 100644
index 000000000..cb686d2a5
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wn_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_banner.jpg b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_banner.jpg
new file mode 100644
index 000000000..44c008ab1
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_banner.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav.png
new file mode 100644
index 000000000..00d3056a8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_hover.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_hover.png
new file mode 100644
index 000000000..71244ddb2
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_hover.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_lg.png b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_lg.png
new file mode 100644
index 000000000..a95839aec
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/graphics/wr_nav_lg.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/firststeps.css b/org.eclipse.ui.intro.universal/themes/circles/html/firststeps.css
new file mode 100644
index 000000000..738a36a7e
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/firststeps.css
@@ -0,0 +1,91 @@
+body {
+ background-image : url(../graphics/contentpage/overview_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#overview img, #navigation-links a#overview:hover img {
+ background-image : url(../graphics/icons/ctool/overview48sel.gif);
+ }
+
+
+iframe {
+ position:relative;
+ top:16px;
+ width:100%;
+ height:100%;
+ padding-left:10px;
+ }
+
+/* mozilla scrollbar appearing off page fix */
+#page-content > iframe {
+ width: 98%;
+ padding-left: 2%;
+}
+
+
+/*
+ * Set up the Overview links to be displayed in two columns
+ * that are centered in the middle of the page.
+ */
+
+#overview-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin : 0px auto;
+
+}
+
+#overview-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#overview-links > a { vertical-align : middle; }
+
+#overview-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+
+}
+
+#overview-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#overview-links a > .link-label { left: 65px; }
+
+#overview-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#overview-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#overview-links > a { width : 700px; }
+#overview-links a > .link-label { width : 700px; }
+#overview-links a p > .text { width : 700px; }
+
+#overview-links a:hover { border-right : 5px; }
+
+a#basics img { background-image : url(../graphics/icons/obj48/wbbasics_obj.gif); }
+a#basics:hover img { background-image : url(../graphics/icons/obj48/wbbasicshov_obj.gif); }
+
+a#team img { background-image : url(../graphics/icons/obj48/teamsup_obj.gif); }
+a#team:hover img { background-image : url(../graphics/icons/obj48/teamsuphov_obj.gif); }
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/migrate.css b/org.eclipse.ui.intro.universal/themes/circles/html/migrate.css
new file mode 100644
index 000000000..1f1c21417
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/migrate.css
@@ -0,0 +1,132 @@
+body {
+ background-image : url(../graphics/contentpage/whatsnew_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#news img, #navigation-links a#news:hover img { background-image : url(../graphics/icons/ctool/whatsnew48sel.gif); }
+
+/*
+ * Set up the content of the Whats New page to be displayed in
+ * two columns that are centered in the middle of the page.
+ */
+
+#noteworthy-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#noteworthy-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#noteworthy-links > a { vertical-align : middle; }
+
+#noteworthy-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#noteworthy-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#noteworthy-links a > .link-label { left: 65px; }
+
+#noteworthy-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#noteworthy-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#noteworthy-links > a { width : 700px; }
+#noteworthy-links a > .link-label { width : 700px; }
+#noteworthy-links a p > .text { width : 700px; }
+
+#noteworthy-links a:hover { border-right : 5px; }
+
+#noteworthy-links a img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+#noteworthy-links a:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+
+#news-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#news-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#news-links > a { vertical-align : middle; }
+
+#news-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#news-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#news-links a > .link-label { left: 65px; }
+
+#news-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#news-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#news-links > a { width : 700px; }
+#news-links a > .link-label { width : 700px; }
+#news-links a p > .text { width : 700px; }
+
+#news-links a:hover { border-right : 5px; }
+
+a#new-and-noteworthy img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+a#new-and-noteworthy:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+a#updates img { background-image : url(../graphics/icons/obj48/updates_obj.gif); }
+a#updates:hover img { background-image : url(../graphics/icons/obj48/updateshov_obj.gif); }
+
+a#eclipse img { background-image : url(../graphics/icons/obj48/community_obj.gif); }
+a#eclipse:hover img { background-image : url(../graphics/icons/obj48/communityhov_obj.gif); }
+
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/overview.css b/org.eclipse.ui.intro.universal/themes/circles/html/overview.css
new file mode 100644
index 000000000..a3678934e
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/overview.css
@@ -0,0 +1,78 @@
+/* show the "selected" image for this page */
+#navigation-links a#overview img, #navigation-links a#overview:hover img {
+ background-image : url(../graphics/overview48sel.gif);
+ }
+
+iframe {
+ position:relative;
+ top:16px;
+ width:100%;
+ height:100%;
+ padding-left:10px;
+ }
+
+/* mozilla scrollbar appearing off page fix */
+#page-content > iframe {
+ width: 98%;
+ padding-left: 2%;
+}
+
+
+/*
+ * Set up the Overview links to be displayed in two columns
+ * that are centered in the middle of the page.
+ */
+
+#overview-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin : 0px auto;
+
+}
+
+#overview-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#overview-links > a { vertical-align : middle; }
+
+#overview-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#overview-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#overview-links a > .link-label { left: 65px; }
+
+#overview-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#overview-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#overview-links > a { width : 700px; }
+#overview-links a > .link-label { width : 700px; }
+#overview-links a p > .text { width : 700px; }
+
+#overview-links a:hover { border-right : 5px; } \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/root.css b/org.eclipse.ui.intro.universal/themes/circles/html/root.css
new file mode 100644
index 000000000..57163ba53
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/root.css
@@ -0,0 +1,207 @@
+/*
+ * Set up general font colours, sizes, etc. Some of these will override
+ * settings from the shared CSS
+ */
+.intro-header H1 {
+ font-size : 18pt;
+}
+#page-links a .link-label, #action-links a .link-label {
+ font-size : 13pt; font-weight : 600; color : #E5E5E5;
+}
+#page-links a p .text, #action-links a p .text {
+ font-size : 13pt; font-weight : 500; color : #E5E5E5;
+}
+/*
+ * Set up the content for the root page.
+ */
+body {
+ min-width : 770px; /* since IE doesn't support min-width, use expression */
+ width:expression(document.body.clientWidth < 770? "770px": "auto" );
+ background-repeat : no-repeat; background-position : top left; background-color : #345365;
+ background-image: url('../graphics/root/welcomebckgrd.jpg');
+}
+#root {
+ min-height : 450px; height : 100%; height : expression(document.body.clientHeight < 450? "450px": "100%" );
+ overflow: hidden;
+}
+
+#branding {
+ position : relative;
+ background-repeat : no-repeat;
+ background-position: bottom left;
+ min-height: 450px;
+ width: 100px;
+ height: 100%;
+ height : expression(document.body.clientHeight < 450? "450px": "100%" );
+ bottom: -20px;
+ top: auto;
+ left: 20px;
+}
+
+/*
+ * Set up the navigation bar. It should be centered in the middle
+ * of the page
+ */
+#links-background {
+ position: relative;
+ height: 272px;
+ width: 100%;
+ /*
+ margin-top : 18%;
+ margin-bottom : auto;
+ */
+ top: 250px;
+ text-align : center;
+ background-position: center;
+}
+/* specify a width for Moz so we can center.
+ * **Important** If additional links are added, we will have to increase this width
+ * to accomodate them, otherwise they will wrap to a new line
+ */
+
+#links-background > #page-links {
+ width : 33em; margin : 0 auto;
+}
+#page-links {
+ height : 177px;
+ position : relative; top : 50px;
+}
+#page-links a {
+ position : relative; width : 86px; margin-left : 1em; margin-right : 1em; text-align : center; vertical-align : top;
+}
+/* float left for Moz so the items all appear inline */
+#page-links > a {
+ float : left; position : relative;
+}
+#page-links a img {
+ height : 82px; width : 82px; vertical-align : middle;
+}
+/* remove the hover image from the flow of the document,
+ so it doesn't take up space and change the position
+ of the link label and descriptions */
+#page-links a .background-image {
+ position : absolute;
+}
+/* properly align the link label and text based on class (left vs. right) */
+#page-links a:hover {
+ /* This is needed for IE to force the hover pseudo selectors below to work.*/ padding : 0 em;
+}
+/* Hide both the label and the description of the link and remove them from static HTML flow, until user hovers over link */
+/* First, set the width of both the label and the description to a max of 15 em. */
+/* This can be changed when translated to different country locals. */
+#page-links a span {
+ width : 16em; }
+/* Set up left links orientation first. */
+#page-links a.left:link .link-label,
+#page-links a.left:visited .link-label {
+ display: none;
+}
+#page-links a.left:hover .link-label,
+#page-links a.left:focus .link-label,
+#page-links a.left:active .link-label {
+ text-align: left; display: block; position: absolute; top : 120 %; left : 0;
+}
+/* hide description and remove it from static HTML flow, until user hovers over link */
+#page-links a.left:link .text,
+#page-links a.left:visited .text {
+ display: none;
+}
+#page-links a.left:hover .text,
+#page-links a.left:focus .text,
+#page-links a.left:active .text {
+ text-align: left; display: block; position: absolute; left : 0; top: 145%;
+}
+/* Set up right links orientation now. */
+#page-links a.right:link .link-label,
+#page-links a.right:visited .link-label {
+ display: none;
+}
+#page-links a.right:hover .link-label,
+#page-links a.right:focus .link-label,
+#page-links a.right:active .link-label {
+ text-align: right; display: block; position: absolute; top : 120 %; right : 0;
+}
+/* hide description and remove it from static HTML flow, until user hovers over link */
+#page-links a.right:link .text,
+#page-links a.right:visited .text {
+ display: none;
+}
+#page-links a.right:hover .text,
+#page-links a.right:focus .text,
+#page-links a.right:active .text {
+ text-align: right; display: block; position: absolute; right : 0; top: 145%;
+}
+/* properties for each of the page-links */
+a#overview .background-image {
+ background-image : url(../graphics/icons/ctool/overview72.gif); visibility : hidden;
+}
+a#tutorials .background-image {
+ background-image : url(../graphics/icons/ctool/tutorials72.gif); visibility : hidden;
+}
+a#samples .background-image {
+ background-image : url(../graphics/icons/ctool/samples72.gif); visibility : hidden;
+}
+a#news .background-image {
+ background-image : url(../graphics/icons/ctool/whatsnew72.gif); visibility : hidden;
+}
+/* show the hover image on hover, focus, and active */
+#page-links a:hover .background-image,
+#page-links a:focus .background-image,
+#page-links a:active .background-image {
+ visibility : visible;
+}
+/*
+ * Set up the action links
+ */
+#action-links {
+ width : 98%; position : absolute; left : 0px; top : 20px;
+}
+#action-links a#workbench {
+ position : absolute; top : -16px; right : -8px; text-align : right;
+}
+#action-links a .background-image,
+#action-links a #workbench_img {
+ height : 53px; width : 53px; text-align : center; vertical-align : top;
+}
+/* special case for mozilla */
+#action-links a > .background-image,
+#action-links a > #workbench_img {
+ vertical-align : middle;
+}
+/* remove the hover image from the flow of the document,
+ so it doesn't take up space and change the position
+ of the main image */
+#action-links a .background-image {
+ position : absolute;
+}
+#action-links a#workbench .background-image {
+ background-image : url(../graphics/icons/ctool/wb48.gif); visibility : hidden;
+}
+#action-links a#workbench:hover .background-image,
+#action-links a#workbench:focus .background-image,
+#action-links a#workbench:active .background-image {
+ visibility : visible;
+ position: absolute;
+ top: 0px;
+ right: 0px;
+}
+/* hide the link and description until users hover over the link */
+#action-links a p .text, #action-links a .link-label {
+ display : none;
+}
+#action-links a:hover .link-label,
+#action-links a:focus .link-label,
+#action-links a:active .link-label {
+ display : block; width : 16em;
+ margin-left : 10px;
+}
+#action-links a:hover p .text,
+#action-links a:focus p .text,
+#action-links a:active p .text {
+ display : block; width : 16em;
+}
+#action-links a:hover,
+#action-links a:focus,
+#action-links a:active {
+ border : 0px;
+}
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/samples.css b/org.eclipse.ui.intro.universal/themes/circles/html/samples.css
new file mode 100644
index 000000000..5ecba1101
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/samples.css
@@ -0,0 +1,74 @@
+body {
+ background-image : url(../graphics/contentpage/samples_wtr.jpg);
+}
+
+/* Lay out the real content of the samples page. */
+
+.samples-group {
+ width : 750px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin : 0px auto;
+ margin-bottom : 10px;
+ text-align : left;
+ float : none;
+ clear : both;
+}
+
+.samples-group H4 { margin-top : 10px; }
+
+.sample-link {
+ width : 360px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 10px;
+ margin-bottom : -30px;
+ vertical-align : top;
+}
+
+/* specialize the swt samples group to be spread over only 1 column */
+#swt .sample-link {
+ width : 720px;
+}
+
+.samples-group > .sample-link {
+ float : left;
+ height : 150px;
+ vertical-align : middle;
+}
+.sample-link .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#swt .sample-link .link-label {
+ width : 600px;
+}
+
+.sample-link p .text {
+ display : block;
+ width : 310px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#swt .sample-link .text {
+ width : 620px;
+}
+
+.sample-link img {
+ height : 56px;
+ width : 56px;
+ vertical-align : middle;
+}
+
+.sample-link:hover { border-right : 0px; }
+
+/* show the "selected" image for this page */
+#navigation-links a#samples img, #navigation-links a#samples:hover img { background-image : url(../graphics/samples48sel.gif); }
+
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/shared.css b/org.eclipse.ui.intro.universal/themes/circles/html/shared.css
new file mode 100644
index 000000000..b1a2289e8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/shared.css
@@ -0,0 +1,268 @@
+/*
+ * Set up general fonts, sizes and colors
+ */
+body { font-family : Arial, sans-serif; }
+
+H1, H2, H3, H4, p, a { color : #4D4D4D; }
+
+.intro-header H1 {
+ font-size : 16pt;
+ font-weight : normal;
+ color : #E5E5E5;
+}
+
+h2 {
+ font-size : 13pt;
+ font-weight : normal;
+ color : #7B8694;
+}
+/* For regular div labels */
+H4 .div-label {
+ font-size : 10pt;
+ font-weight : bold;
+}
+
+/* For the main page content's title */
+#content-header H4 .div-label {
+ font-size : 14pt;
+ font-weight : normal;
+ color : #8C96A2;
+ float : none;
+ clear : both;
+}
+
+.page-description {
+ font-size : 10pt;
+ float : none;
+ clear : both;
+}
+
+a {
+ font-weight : bold;
+ text-decoration : none;
+ color : #4D4D4D;
+}
+
+a .link-label {
+ font-size : 10pt;
+ font-weight : normal;
+}
+
+#navigation-links a .link-label {
+ font-size : 9pt;
+ font-weight : normal;
+ color : #E5E5E5;
+}
+
+a .text {
+ font-size : 8pt;
+ font-weight : normal;
+}
+
+p .group-description {
+ font-size : 10pt;
+ font-weight : normal;
+}
+
+
+/*
+ * Set up other general properties like padding/margins
+ */
+html, body { width : 100%; height : 100%; }
+
+html, body, div, h1, h4, p, a { margin : 0px; padding : 0px; }
+
+.intro-header H1 { padding-top : 10px; margin-left : 10px; }
+
+/* For regular div labels */
+#page-content div H4 {
+ padding : 10px;
+ padding-bottom : 0px;
+}
+
+/* For the main page content's div label */
+#page-content #content-header H4 {
+ padding-bottom : 10px;
+ padding-top : 0px;
+}
+
+/* special case for Mozilla's main content-header label.
+ Mozilla 1.4 needs more room at the top */
+#page-content > #content-header H4 { padding-top : 10px; }
+
+/* Needed in IE to get shift+tab to show the active image properly */
+a:active {
+ border : solid 0px;
+}
+
+a img {
+ border-width : 0;
+ background-repeat : no-repeat;
+}
+
+/*
+ * to get scrollbars working in both IE and Mozilla
+ */
+html,body { overflow: auto; }
+html>body { overflow: visible; }
+
+/*
+ * Set up the body, decorative background, and navigation for the content
+ * pages.
+ * Note: the root page handles its own background and navigation; these
+ * settings primarily apply to the content pages
+ */
+body {
+ background-color : #FFFFFF;
+ background-repeat : no-repeat;
+ background-position : bottom right;
+}
+
+#curve-image {
+ width : 100%;
+ height : 164px;
+ position : absolute;
+ top : 0px;
+ background-image : url(../graphics/contentpage/backgroundcurve.gif);
+ background-repeat : no-repeat;
+ background-position : top center;
+ margin : 0;
+ padding : 0;
+}
+
+.intro-header { background-color : transparent; z-index : 100;}
+
+body, .page{
+ min-width : 770px;
+ /* since IE doesn't support min-width, try expression */
+ width:expression(document.body.clientWidth < 770? "770px": "auto" );
+ min-height : 425px;
+ height : 100%;
+ height : expression(document.body.clientHeight < 425? "425px": "100%" );
+}
+
+.page {
+ min-height : 475px;
+ background-image : url(../graphics/contentpage/background.jpg);
+ background-repeat : repeat-x;
+ background-position : top left;
+}
+
+#page-content {
+ background-repeat : no-repeat;
+ background-position : bottom right;
+ height : 80%;
+}
+
+#page-content #left {
+ display: inline;
+ width: 50%;
+/* background-color: #ffa0a0; */
+}
+
+#page-content #right {
+ display: inline;
+ width: 50%;
+/* background-color: #a0ffa0; */
+}
+
+#page-content #bottom {
+ display: inline;
+ width: 100%;
+/* background-color: #a0a0ff; */
+}
+
+/*
+ * Lay out the navigation links
+ * (Root page does something similar for its navigation)
+ */
+#navigation-links {
+ position : relative;
+ left : 0px;
+ top : 0px;
+ height : 118px;
+ width : 100%;
+}
+
+#navigation-links a {
+ padding-left : 5px;
+ padding-right : 5px;
+ float : left;
+ text-align : center;
+}
+
+#navigation-links a img {
+ height : 52px;
+ width : 52px;
+ vertical-align : middle;
+}
+
+#navigation-links a .link-label { display : block; margin-top : 5px;}
+
+#navigation-links a .text { display : none; }
+
+#navigation-links a:hover,
+#navigation-links a:focus
+#navigation-links a:active { border-right : 0px;}
+
+/* properties for each of the navigation-links */
+#navigation-links a#overview img { background-image : url(../graphics/ov_nav.png); }
+#navigation-links a#overview:hover img,
+#navigation-links a#overview:focus img,
+#navigation-links a#overview:active img { background-image : url(../graphics/ov_nav_hover.png); }
+
+#navigation-links a#tutorials img { background-image : url(../graphics/tu_nav.png); }
+#navigation-links a#tutorials:hover img,
+#navigation-links a#tutorials:active img,
+#navigation-links a#tutorials:focus img { background-image : url(../graphics/tu_nav_hover.png); }
+/*#navigation-links a#tutorials:active img { background-image : url(../graphics/icons/ctool/tutorials48sel.gif); }*/
+
+#navigation-links a#samples img { background-image : url(../graphics/sa_nav.png); }
+#navigation-links a#samples:hover img,
+#navigation-links a#samples:active img,
+#navigation-links a#samples:focus img { background-image : url(../graphics/sa_nav_hover.png); }
+/*#navigation-links a#samples:active img { background-image : url(../graphics/icons/ctool/samples48sel.gif); }*/
+
+#navigation-links a#whatsnew img { background-image : url(../graphics/wn_nav.png); }
+#navigation-links a#whatsnew:hover img,
+#navigation-links a#whatsnew:focus img,
+#navigation-links a#whatsnew:active img { background-image : url(../graphics/wn_nav_hover.png); }
+
+#navigation-links a#workbench { position : absolute; right : 0px; top : -35px; text-align : right;}
+#navigation-links a#workbench .text { display : none; }
+#navigation-links a#workbench img { background-image : url(../graphics/wb_nav.png); width : 53px; height : 53px;}
+#navigation-links a#workbench:hover img,
+#navigation-links a#workbench:focus img,
+#navigation-links a#workbench:active img { background-image : url(../graphics/wb_nav_hover.png); }
+
+/*
+ * Lay out the page title and description
+ */
+h1, p { margin-left : 10px; } /* required in mozilla so the page description is properly indented */
+
+/* position the page content so that the page title overlays the bottom
+ * of the background image, but make sure the content is always on top
+ * (using z-index) */
+#page-content {
+ float : none;
+ clear : both;
+ text-align : center;
+ margin-top : 35px;
+}
+
+.page > #page-content { margin-top : 50px; }
+
+#page-content p {
+ padding-bottom : 15px;
+ text-align : left;
+ float : none;
+ clear : both;
+}
+
+#page-content #content-header H4, .page-description {
+ text-align : left;
+ margin-right : 10px;
+ float : none;
+ clear : both;
+}
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/standby.css b/org.eclipse.ui.intro.universal/themes/circles/html/standby.css
new file mode 100644
index 000000000..e8862ad60
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/standby.css
@@ -0,0 +1,119 @@
+/*
+ * Set up general font colours, sizes, etc. Some of these will override
+ * settings from the shared CSS
+ */
+.intro-header H1 {
+ font-size : 15pt;
+}
+
+#page-links a .link-label, #action-links a .link-label {
+ font-size : 10pt;
+ font-weight : 600;
+ color : #E5E5E5;
+}
+
+#page-links a p .text, #action-links a p .text {
+ font-size : 10pt;
+ font-weight : 500;
+ color : #E5E5E5;
+}
+
+/*
+ * Set up the content for the standby page.
+ */
+body {
+ min-width : 230px;
+ /* since IE doesn't support min-width, use expression */
+ width:expression(document.body.clientWidth < 230? "230px": "auto" );
+ background-repeat : no-repeat;
+ background-position : top left;
+ background-color : #345365;
+}
+
+.page {
+ background-repeat : no-repeat;
+ background-position : bottom left;
+ min-width : 230px;
+ /* since IE doesn't support min-width, use expression */
+ width:expression(document.body.clientWidth < 230? "230px": "auto" );
+ min-height : 610px;
+ height : 100%;
+ height : expression(document.body.clientHeight < 450? "450px": "100%" );
+}
+
+/*
+ * Set up the navigation bar. It should be centered in the middle
+ * of the page
+ */
+
+#links-background {
+ width : 100%;
+ margin-top : 10%;
+ margin-bottom : auto;
+ text-align : center;
+}
+
+#page-links a {
+ display : block;
+ width : 220px;
+ text-align : left;
+ margin-left : auto;
+ margin-right : auto;
+ margin-top : 0px;
+ vertical-align : top;
+}
+#page-links a span, #page-links a p {
+ display : block;
+ width : 160px;
+ margin : 0px;
+ padding : 0px;
+}
+
+#page-links a .link-label {
+ position : relative;
+ left : 60px;
+ top : -50px;
+}
+
+#page-links a p .text {
+ position : relative;
+ left : 60px;
+ top : -50px;
+
+}
+
+#page-links a img {
+ height : 52px;
+ width : 52px;
+ vertical-align : middle;
+}
+
+#page-links a:hover,
+#page-links a:focus,
+#page-links a:active { border : 0px; }
+
+#page-links a:hover p,
+#page-links a:focus p,
+#page-links a:active p { margin : 0px; padding : 0px; }
+
+/* properties for each of the page-links */
+a#overview img { background-image : url(../graphics/icons/etool/overview48.gif); }
+a#overview:hover img,
+a#overview:focus img,
+a#overview:active img { background-image : url(../graphics/icons/ctool/overview48.gif); }
+
+a#tutorials img { background-image : url(../graphics/icons/etool/tutorials48.gif); }
+a#tutorials:hover img,
+a#tutorials:focus img,
+a#tutorials:active img { background-image : url(../graphics/icons/ctool/tutorials48.gif); }
+
+a#samples img { background-image : url(../graphics/icons/etool/samples48.gif); }
+a#samples:hover img,
+a#samples:focus img,
+a#samples:active img { background-image : url(../graphics/icons/ctool/samples48.gif); }
+
+a#news img { background-image : url(../graphics/icons/etool/whatsnew48.gif); }
+a#news:hover img,
+a#news:focus img,
+a#news:active img { background-image : url(../graphics/icons/ctool/whatsnew48.gif); }
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/tutorials.css b/org.eclipse.ui.intro.universal/themes/circles/html/tutorials.css
new file mode 100644
index 000000000..fa06e8b7c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/tutorials.css
@@ -0,0 +1,77 @@
+body {
+ background-image : url(../graphics/contentpage/tutorials_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#tutorials img, #navigation-links a#tutorials:hover img { background-image : url(../graphics/tutorials48sel.gif); }
+
+/*
+ * Set up the content of the tutorials page into two
+ * columns that are centered in the page
+ */
+
+
+/* a group of tutorial links */
+.tutorials-group {
+ /* To center in Moz (have to use text-align for IE) */
+ margin-left : auto;
+ margin-right : auto;
+ width : 750px;
+ margin-bottom : 30px;
+ float : none;
+ clear : both;
+ text-align : left;
+}
+
+.tutorials-link {
+ width : 360px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 10px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+.tutorials-group > .tutorials-link {
+ float : left;
+ height : 150px;
+ vertical-align : middle;
+}
+
+
+.tutorials-link img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+.tutorials-group h4 {
+ float : none;
+ clear : both;
+}
+
+p #group-description {
+ padding-bottom : 10px;
+ float : none;
+ clear : both;
+}
+
+.tutorials-link .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+
+.tutorials-link p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+.tutorials-link:hover { border-right : 0px; }
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/webresources.css b/org.eclipse.ui.intro.universal/themes/circles/html/webresources.css
new file mode 100644
index 000000000..1f1c21417
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/webresources.css
@@ -0,0 +1,132 @@
+body {
+ background-image : url(../graphics/contentpage/whatsnew_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#news img, #navigation-links a#news:hover img { background-image : url(../graphics/icons/ctool/whatsnew48sel.gif); }
+
+/*
+ * Set up the content of the Whats New page to be displayed in
+ * two columns that are centered in the middle of the page.
+ */
+
+#noteworthy-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#noteworthy-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#noteworthy-links > a { vertical-align : middle; }
+
+#noteworthy-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#noteworthy-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#noteworthy-links a > .link-label { left: 65px; }
+
+#noteworthy-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#noteworthy-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#noteworthy-links > a { width : 700px; }
+#noteworthy-links a > .link-label { width : 700px; }
+#noteworthy-links a p > .text { width : 700px; }
+
+#noteworthy-links a:hover { border-right : 5px; }
+
+#noteworthy-links a img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+#noteworthy-links a:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+
+#news-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#news-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#news-links > a { vertical-align : middle; }
+
+#news-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#news-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#news-links a > .link-label { left: 65px; }
+
+#news-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#news-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#news-links > a { width : 700px; }
+#news-links a > .link-label { width : 700px; }
+#news-links a p > .text { width : 700px; }
+
+#news-links a:hover { border-right : 5px; }
+
+a#new-and-noteworthy img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+a#new-and-noteworthy:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+a#updates img { background-image : url(../graphics/icons/obj48/updates_obj.gif); }
+a#updates:hover img { background-image : url(../graphics/icons/obj48/updateshov_obj.gif); }
+
+a#eclipse img { background-image : url(../graphics/icons/obj48/community_obj.gif); }
+a#eclipse:hover img { background-image : url(../graphics/icons/obj48/communityhov_obj.gif); }
+
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/html/whatsnew.css b/org.eclipse.ui.intro.universal/themes/circles/html/whatsnew.css
new file mode 100644
index 000000000..a99e7967a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/html/whatsnew.css
@@ -0,0 +1,146 @@
+body {
+ background-image : url(../graphics/contentpage/whatsnew_wtr.jpg);
+}
+
+iframe {
+ position:relative;
+ top:16px;
+ width:100%;
+ height:100%;
+ padding-left:10px;
+ }
+
+/* mozilla scrollbar appearing off page fix */
+#page-content > iframe {
+ width: 98%;
+ padding-left: 2%;
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#news img, #navigation-links a#news:hover img { background-image : url(../graphics/icons/ctool/whatsnew48sel.gif); }
+
+/*
+ * Set up the content of the Whats New page to be displayed in
+ * two columns that are centered in the middle of the page.
+ */
+
+#noteworthy-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#noteworthy-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#noteworthy-links > a { vertical-align : middle; }
+
+#noteworthy-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#noteworthy-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#noteworthy-links a > .link-label { left: 65px; }
+
+#noteworthy-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#noteworthy-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#noteworthy-links > a { width : 700px; }
+#noteworthy-links a > .link-label { width : 700px; }
+#noteworthy-links a p > .text { width : 700px; }
+
+#noteworthy-links a:hover { border-right : 5px; }
+
+#noteworthy-links a img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+#noteworthy-links a:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+
+#news-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#news-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#news-links > a { vertical-align : middle; }
+
+#news-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#news-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#news-links a > .link-label { left: 65px; }
+
+#news-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#news-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#news-links > a { width : 700px; }
+#news-links a > .link-label { width : 700px; }
+#news-links a p > .text { width : 700px; }
+
+#news-links a:hover { border-right : 5px; }
+
+a#new-and-noteworthy img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+a#new-and-noteworthy:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+a#updates img { background-image : url(../graphics/icons/obj48/updates_obj.gif); }
+a#updates:hover img { background-image : url(../graphics/icons/obj48/updateshov_obj.gif); }
+
+a#eclipse img { background-image : url(../graphics/icons/obj48/community_obj.gif); }
+a#eclipse:hover img { background-image : url(../graphics/icons/obj48/communityhov_obj.gif); }
+
+
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/firststeps.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/firststeps.properties
new file mode 100644
index 000000000..cc62a3453
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/firststeps.properties
@@ -0,0 +1,3 @@
+firststeps.page-content.layout.ncolumns = 2
+firststeps.page-content.bottom.layout.colspan = 2
+firstseps.subtitle-id = firststeps/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/migrate.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/migrate.properties
new file mode 100644
index 000000000..a45e8d993
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/migrate.properties
@@ -0,0 +1,3 @@
+migrate.page-content.layout.ncolumns = 2
+migrate.page-content.bottom.layout.colspan = 2
+migrate.subtitle-id = migrate/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/overview.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/overview.properties
new file mode 100644
index 000000000..89a574dc8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/overview.properties
@@ -0,0 +1,6 @@
+
+overview.page-content.layout.ncolumns = 2
+overview.page-content.bottom.layout.colspan = 2
+
+overview.subtitle-id = overview/page-content/page-title
+overview.description-id = overview/page-content/page-description \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/root.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/root.properties
new file mode 100644
index 000000000..a44653333
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/root.properties
@@ -0,0 +1,30 @@
+theme = true
+root.links-background.page-links.overview.link-icon = ../graphics/root/overview.png
+root.links-background.page-links.firststeps.link-icon = ../graphics/root/firststeps.png
+root.links-background.page-links.tutorials.link-icon = ../graphics/root/tutorials.png
+root.links-background.page-links.samples.link-icon= ../graphics/root/samples.png
+root.links-background.page-links.whatsnew.link-icon = ../graphics/root/whatsnew.png
+root.links-background.page-links.migrate.link-icon = ../graphics/root/migrate.png
+root.links-background.page-links.webresources.link-icon = ../graphics/root/webresources.png
+root.action-links.workbench.link-icon = ../graphics/root/workbench.png
+
+#root.links-background.page-links.overview.hover-icon = intro/css/../graphics/icons/ctool/overview72.gif
+#root.links-background.page-links.tutorials.hover-icon = intro/css/../graphics/icons/ctool/tutorials72.gif
+#root.links-background.page-links.samples.hover-icon = intro/css/../graphics/icons/ctool/samples72.gif
+#root.links-background.page-links.news.hover-icon = intro/css/../graphics/icons/ctool/whatsnew72.gif
+#root.action-links.workbench.hover-icon = intro/css/../graphics/icons/ctool/wb48.gif
+
+
+root.links-background.page-links.overview.small-link-icon = ../graphics/root/overview48.png
+root.links-background.page-links.firststeps.small-link-icon = ../graphics/root/firststeps48.png
+root.links-background.page-links.tutorials.small-link-icon = ../graphics/root/tutorials48.png
+root.links-background.page-links.samples.small-link-icon = ../graphics/root/samples48.png
+root.links-background.page-links.whatsnew.small-link-icon = ../graphics/root/whatsnew48.png
+root.links-background.page-links.migrate.small-link-icon = ../graphics/root/migrate48.png
+root.links-background.page-links.webresources.small-link-icon = ../graphics/root/webresources48.png
+
+root.action-links.workbench.small-link-icon = ../graphics/root/workbench48.png
+
+root.layout.ncolumns = 1
+root.links-background.page-links.layout.hspacing = 40
+root.layout.vspacing = 35
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/samples.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/samples.properties
new file mode 100644
index 000000000..fbbe9c49b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/samples.properties
@@ -0,0 +1,8 @@
+
+samples.page-content.layout.vspacing = 40
+samples.page-content.layout.ncolumns = 2
+samples.page-content.bottom.layout.colspan = 2
+
+description-style-id = group-description
+samples.subtitle-id = samples/page-content/page-title
+samples.description-id = samples/page-content/page-description \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/standby.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/standby.properties
new file mode 100644
index 000000000..6a8a229fe
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/standby.properties
@@ -0,0 +1,15 @@
+theme = true
+standby.links-background.page-links.overview.link-icon = ../graphics/root/overview48.png
+standby.links-background.page-links.firststeps.link-icon = ../graphics/root/firststeps48.png
+standby.links-background.page-links.tutorials.link-icon = ../graphics/root/tutorials48.png
+standby.links-background.page-links.samples.link-icon = ../graphics/root/samples48.png
+standby.links-background.page-links.whatsnew.link-icon = ../graphics/root/whatsnew48.png
+standby.links-background.page-links.migrate.link-icon = ../graphics/root/migrate48.png
+standby.links-background.page-links.webresources.link-icon = ../graphics/root/webresources48.png
+
+standby.action-links.workbench.link-icon = ../graphics/root/workbench48.png
+
+standby.links-background.page-links.layout.vspacing = 30
+standby.layout.vspacing = 35
+standby.show-link-description = false
+standby.show-home-page-navigation = false \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/tutorials.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/tutorials.properties
new file mode 100644
index 000000000..de1d07215
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/tutorials.properties
@@ -0,0 +1,7 @@
+
+tutorials.page-content.layout.vspacing = 40
+tutorials.page-content.layout.ncolumns = 2
+tutorials.page-content.bottom.layout.colspan = 2
+
+tutorials.subtitle-id = tutorials/page-content/page-title
+tutorials.description-id = tutorials/page-content/page-description \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/webresources.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/webresources.properties
new file mode 100644
index 000000000..2d8589fec
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/webresources.properties
@@ -0,0 +1,6 @@
+
+webresources.page-content.layout.vspacing = 40
+webresources.page-content.layout.ncolumns = 2
+webresources.page-content.bottom.layout.colspan = 2
+
+webresources.subtitle-id = news/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/circles/swt/whatsnew.properties b/org.eclipse.ui.intro.universal/themes/circles/swt/whatsnew.properties
new file mode 100644
index 000000000..72ab45cfa
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/circles/swt/whatsnew.properties
@@ -0,0 +1,9 @@
+theme = true
+whatsnew.page-content.layout.vspacing = 40
+whatsnew.page-content.layout.ncolumns = 2
+whatsnew.page-content.bottom.layout.colspan = 2
+
+whatsnew.link-icon = ../graphics/new_obj.gif
+whatsnew.hover-icon = ../graphics/newhov_obj.gif
+
+whatsnew.subtitle-id = whatsnew/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/background.jpg b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/background.jpg
new file mode 100644
index 000000000..ce1cada20
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/background.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/backgroundcurve.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/backgroundcurve.gif
new file mode 100644
index 000000000..8c5ec1df2
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/backgroundcurve.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/overview_wtr.jpg b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/overview_wtr.jpg
new file mode 100644
index 000000000..733e48c50
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/overview_wtr.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/samples_wtr.jpg b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/samples_wtr.jpg
new file mode 100644
index 000000000..78e703afd
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/samples_wtr.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section1.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section1.gif
new file mode 100644
index 000000000..61475136d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section1.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section2.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section2.gif
new file mode 100644
index 000000000..0ee148b5a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section2.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section3.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section3.gif
new file mode 100644
index 000000000..b5d24e695
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section3.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section4.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section4.gif
new file mode 100644
index 000000000..258d4a838
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/section4.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/tutorials_wtr.jpg b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/tutorials_wtr.jpg
new file mode 100644
index 000000000..e74c7c091
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/tutorials_wtr.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/whatsnew_wtr.jpg b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/whatsnew_wtr.jpg
new file mode 100644
index 000000000..c2a42da66
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/contentpage/whatsnew_wtr.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48.gif
new file mode 100644
index 000000000..7da24bd9a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48sel.gif
new file mode 100644
index 000000000..3d1c45bf7
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview72.gif
new file mode 100644
index 000000000..d34b4b3d1
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/overview72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48.gif
new file mode 100644
index 000000000..3213de674
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48sel.gif
new file mode 100644
index 000000000..f9c0469ab
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples72.gif
new file mode 100644
index 000000000..4c63a9a2a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/samples72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48.gif
new file mode 100644
index 000000000..1a3f06a91
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48sel.gif
new file mode 100644
index 000000000..3d687bd56
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials72.gif
new file mode 100644
index 000000000..a2aa343af
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/tutorials72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/wb48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/wb48.gif
new file mode 100644
index 000000000..c2fd06a61
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/wb48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48.gif
new file mode 100644
index 000000000..2bfb9be62
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48sel.gif
new file mode 100644
index 000000000..0da843fe3
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew72.gif
new file mode 100644
index 000000000..74bf6ff39
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/ctool/whatsnew72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/back.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/back.gif
new file mode 100644
index 000000000..f0d0929b6
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/back.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/forward.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/forward.gif
new file mode 100644
index 000000000..dbe58b200
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/forward.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/overview.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/overview.gif
new file mode 100644
index 000000000..2bc7b0d58
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/overview.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/restore_welcome.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/restore_welcome.gif
new file mode 100644
index 000000000..4997b20ce
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/restore_welcome.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/samples.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/samples.gif
new file mode 100644
index 000000000..5cf3caed2
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/samples.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/tutorials.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/tutorials.gif
new file mode 100644
index 000000000..63826a5d8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/tutorials.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/whatsnew.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/whatsnew.gif
new file mode 100644
index 000000000..8056c99ff
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/dtool/whatsnew.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/back.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/back.gif
new file mode 100644
index 000000000..1c81cb69f
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/back.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/forward.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/forward.gif
new file mode 100644
index 000000000..3e4a4f40b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/forward.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview.gif
new file mode 100644
index 000000000..3fe629a83
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48.gif
new file mode 100644
index 000000000..8e2f8c16d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48sel.gif
new file mode 100644
index 000000000..1275a4a90
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview72.gif
new file mode 100644
index 000000000..e3f764808
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/overview72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/restore_welcome.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/restore_welcome.gif
new file mode 100644
index 000000000..7736bcec6
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/restore_welcome.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples.gif
new file mode 100644
index 000000000..c69588429
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48.gif
new file mode 100644
index 000000000..63d405bf3
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48sel.gif
new file mode 100644
index 000000000..4c3135d0a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples72.gif
new file mode 100644
index 000000000..921642619
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/samples72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials.gif
new file mode 100644
index 000000000..a18d7ddf8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48.gif
new file mode 100644
index 000000000..718ca6c61
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48sel.gif
new file mode 100644
index 000000000..10680e5cc
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials72.gif
new file mode 100644
index 000000000..bab3498f8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/tutorials72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/wb48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/wb48.gif
new file mode 100644
index 000000000..50ca2871a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/wb48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew.gif
new file mode 100644
index 000000000..f02232444
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48.gif
new file mode 100644
index 000000000..6e00d7a2a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48sel.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48sel.gif
new file mode 100644
index 000000000..be9fa0c3d
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew48sel.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew72.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew72.gif
new file mode 100644
index 000000000..410093bdf
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/etool/whatsnew72.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/new_obj.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/new_obj.gif
new file mode 100644
index 000000000..f46b81bdd
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/new_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/newhov_obj.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/newhov_obj.gif
new file mode 100644
index 000000000..593e63bc6
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/icons/obj48/newhov_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/background.jpg b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/background.jpg
new file mode 100644
index 000000000..969fcf336
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/background.jpg
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/brandmark.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/brandmark.gif
new file mode 100644
index 000000000..93f25f787
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/brandmark.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/dots.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/dots.gif
new file mode 100644
index 000000000..6621b7c8a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/root/dots.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/swt/form_banner.gif b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/swt/form_banner.gif
new file mode 100644
index 000000000..aebc0b2a3
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/graphics/swt/form_banner.gif
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/overview.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/overview.css
new file mode 100644
index 000000000..ec750b6fe
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/overview.css
@@ -0,0 +1,90 @@
+body {
+ background-image : url(../graphics/contentpage/overview_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#overview img, #navigation-links a#overview:hover img {
+ background-image : url(../graphics/icons/ctool/overview48sel.gif);
+ }
+
+
+iframe {
+ position:relative;
+ top:16px;
+ width:100%;
+ height:100%;
+ padding-left:10px;
+ }
+
+/* mozilla scrollbar appearing off page fix */
+#page-content > iframe {
+ width: 98%;
+ padding-left: 2%;
+}
+
+
+/*
+ * Set up the Overview links to be displayed in two columns
+ * that are centered in the middle of the page.
+ */
+
+ /*
+
+#overview-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin : 0px auto;
+}
+
+#overview-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#overview-links > a { vertical-align : middle; }
+
+#overview-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+
+}
+
+#overview-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#overview-links a > .link-label { left: 65px; }
+
+#overview-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#overview-links a p > .text { left: 58px; }
+
+*/
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+ /*
+#overview-links > a { width : 700px; }
+#overview-links a > .link-label { width : 700px; }
+#overview-links a p > .text { width : 700px; }
+
+#overview-links a:hover { border-right : 5px; }
+*/
+
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/root.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/root.css
new file mode 100644
index 000000000..c08ab36c5
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/root.css
@@ -0,0 +1,211 @@
+/*
+ * Set up general font colours, sizes, etc. Some of these will override
+ * settings from the shared CSS
+ */
+.intro-header H1 {
+ font-size : 18pt;
+}
+#page-links a .link-label, #action-links a .link-label {
+ font-size : 13pt; font-weight : 600; color : #E5E5E5;
+}
+#page-links a p .text, #action-links a p .text {
+ font-size : 13pt; font-weight : 500; color : #E5E5E5;
+}
+/*
+ * Set up the content for the root page.
+ */
+body {
+ min-width : 770px; /* since IE doesn't support min-width, use expression */
+ width:expression(document.body.clientWidth < 770? "770px": "auto" ); background-image : url(../graphics/root/background.jpg); background-repeat : no-repeat; background-position : top left; background-color : #7169D1;
+}
+#root {
+ background-image : url(../graphics/root/brandmark.gif); background-repeat : no-repeat; background-position : bottom left; min-height : 450px; height : 100%; height : expression(document.body.clientHeight < 450? "450px": "100%" );
+}
+
+/*
+ * We will not use the general-purpose group1 used in
+ * other pages for a curve image.
+ */
+
+#extra-group1 {
+ display : none;
+}
+/*
+ * Set up the navigation bar. It should be centered in the middle
+ * of the page
+ */
+#links-background {
+ background-image : url(../graphics/root/dots.gif); background-repeat : repeat-x; width : 100%; height : 177px; margin-top : 18%; margin-bottom : auto; text-align : center;
+}
+/* specify a width for Moz so we can center.
+ * **Important** If additional links are added, we will have to increase this width
+ * to accomodate them, otherwise they will wrap to a new line
+ */
+#links-background > #page-links {
+ width : 33em; margin : 0 auto;
+}
+#page-links {
+ position : relative; top : 50px;
+}
+#page-links a {
+ position : relative; width : 86px; margin-left : 1em; margin-right : 1em; text-align : center; vertical-align : top;
+}
+/* float left for Moz so the items all appear inline */
+#page-links > a {
+ float : left; position : relative;
+}
+#page-links a img {
+ height : 82px; width : 82px; vertical-align : middle;
+}
+/* remove the hover image from the flow of the document,
+ so it doesn't take up space and change the position
+ of the link label and descriptions */
+#page-links a .background-image {
+ position : absolute;
+}
+/* properly align the link label and text based on class (left vs. right) */
+#page-links a:hover {
+ /* This is needed for IE to force the hover pseudo selectors below to work.*/ padding : 0 em;
+}
+/* Hide both the label and the description of the link and remove them from static HTML flow, until user hovers over link */
+/* First, set the width of both the label and the description to a max of 15 em. */
+/* This can be changed when translated to different country locals. */
+#page-links a span {
+ width : 16em; }
+/* Set up left links orientation first. */
+#page-links a.left:link .link-label,
+#page-links a.left:visited .link-label {
+ display: none;
+}
+#page-links a.left:hover .link-label,
+#page-links a.left:focus .link-label,
+#page-links a.left:active .link-label {
+ text-align: left; display: block; position: absolute; top : 120 %; left : 0;
+}
+/* hide description and remove it from static HTML flow, until user hovers over link */
+#page-links a.left:link .text,
+#page-links a.left:visited .text {
+ display: none;
+}
+#page-links a.left:hover .text,
+#page-links a.left:focus .text,
+#page-links a.left:active .text {
+ text-align: left; display: block; position: absolute; left : 0; top: 145%;
+}
+/* Set up right links orientation now. */
+#page-links a.right:link .link-label,
+#page-links a.right:visited .link-label {
+ display: none;
+}
+#page-links a.right:hover .link-label,
+#page-links a.right:focus .link-label,
+#page-links a.right:active .link-label {
+ text-align: right; display: block; position: absolute; top : 120 %; right : 0;
+}
+/* hide description and remove it from static HTML flow, until user hovers over link */
+#page-links a.right:link .text,
+#page-links a.right:visited .text {
+ display: none;
+}
+#page-links a.right:hover .text,
+#page-links a.right:focus .text,
+#page-links a.right:active .text {
+ text-align: right; display: block; position: absolute; right : 0; top: 145%;
+}
+/* properties for each of the page-links */
+#page-links a#overview img { background-image : url(../graphics/icons/etool/overview72.gif); }
+#page-links a:hover#overview img { background-image : url(../graphics/icons/ctool/overview72.gif); }
+
+#page-links a#tutorials img { background-image : url(../graphics/icons/etool/tutorials72.gif); }
+#page-links a:hover#tutorials img { background-image : url(../graphics/icons/ctool/tutorials72.gif); }
+
+#page-links a#samples img { background-image : url(../graphics/icons/etool/samples72.gif); }
+#page-links a:hover#samples img { background-image : url(../graphics/icons/ctool/samples72.gif); }
+
+#page-links a#whatsnew img { background-image : url(../graphics/icons/etool/whatsnew72.gif); }
+#page-links a:hover#whatsnew img { background-image : url(../graphics/icons/ctool/whatsnew72.gif); }
+
+/*
+a#overview .background-image {
+ background-image : url(../graphics/icons/ctool/overview72.gif); visibility : hidden;
+}
+a#tutorials .background-image {
+ background-image : url(../graphics/icons/ctool/tutorials72.gif); visibility : hidden;
+}
+a#samples .background-image {
+ background-image : url(../graphics/icons/ctool/samples72.gif); visibility : hidden;
+}
+a#whatsnew .background-image {
+ background-image : url(../graphics/icons/ctool/whatsnew72.gif); visibility : hidden;
+}
+
+*/
+/* show the hover image on hover, focus, and active */
+/*
+#page-links a:hover .background-image,
+#page-links a:focus .background-image,
+#page-links a:active .background-image {
+ visibility : visible;
+}
+*/
+/*
+ * Set up the action links
+ */
+#action-links {
+ width : 98%; position : absolute; left : 0px; top : 20px;
+}
+#action-links a#workbench {
+ position : absolute; top : -16px; right : -8px; text-align : right;
+}
+#action-links a .background-image,
+#action-links a #workbench_img {
+ height : 53px; width : 53px; text-align : center; vertical-align : top;
+}
+/* special case for mozilla */
+#action-links a > .background-image,
+#action-links a > #workbench_img {
+ vertical-align : middle;
+}
+/* remove the hover image from the flow of the document,
+ so it doesn't take up space and change the position
+ of the main image */
+#action-links a .background-image {
+ position : absolute;
+}
+/*
+#action-links a#workbench .background-image {
+ background-image : url(../graphics/icons/ctool/wb48.gif); visibility : hidden;
+}
+*/
+#action-links a#workbench .background-image {
+ background-image : url(../graphics/icons/etool/wb48.gif);
+}
+#action-links a#workbench:hover .background-image,
+#action-links a#workbench:focus .background-image,
+#action-links a#workbench:active .background-image {
+ background-image : url(../graphics/icons/ctool/wb48.gif);
+ visibility : visible;
+ position: absolute;
+ top: 0px;
+ right: 0px;
+}
+/* hide the link and description until users hover over the link */
+#action-links a p .text, #action-links a .link-label {
+ display : none;
+}
+#action-links a:hover .link-label,
+#action-links a:focus .link-label,
+#action-links a:active .link-label {
+ display : block; width : 16em;
+ margin-left : 10px;
+}
+#action-links a:hover p .text,
+#action-links a:focus p .text,
+#action-links a:active p .text {
+ display : block; width : 16em;
+}
+#action-links a:hover,
+#action-links a:focus,
+#action-links a:active {
+ border : 0px;
+}
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/samples.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/samples.css
new file mode 100644
index 000000000..321ec618c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/samples.css
@@ -0,0 +1,8 @@
+body {
+ background-image : url(../graphics/contentpage/samples_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#samples img, #navigation-links a#samples:hover img { background-image : url(../graphics/icons/ctool/samples48sel.gif); }
+
+
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/shared.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/shared.css
new file mode 100644
index 000000000..10f5f14b4
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/shared.css
@@ -0,0 +1,385 @@
+/*
+ * Set up general fonts, sizes and colors
+ */
+body { font-family : Arial, sans-serif; }
+
+H1, H2, H3, H4, p, a { color : #4D4D4D; }
+
+.intro-header H1 {
+ font-size : 16pt;
+ font-weight : normal;
+ color : #E5E5E5;
+}
+
+h2 {
+ font-size : 13pt;
+ font-weight : normal;
+ color : #7B8694;
+}
+/* For regular div labels */
+H4 .div-label {
+ font-size : 10pt;
+ font-weight : bold;
+}
+
+/* For the main page content's title */
+#content-header H4 .div-label {
+ font-size : 14pt;
+ font-weight : normal;
+ color : #8C96A2;
+ float : none;
+ clear : both;
+}
+
+.page-description {
+ font-size : 10pt;
+ float : none;
+ clear : both;
+}
+
+a {
+ font-weight : bold;
+ text-decoration : none;
+ color : #4D4D4D;
+}
+
+a .link-label {
+ font-size : 10pt;
+ font-weight : normal;
+}
+
+#navigation-links a .link-label {
+ font-size : 9pt;
+ font-weight : normal;
+ color : #E5E5E5;
+}
+
+a .text {
+ font-size : 8pt;
+ font-weight : normal;
+}
+
+p .group-description {
+ font-size : 10pt;
+ font-weight : normal;
+}
+
+
+/*
+ * Set up other general properties like padding/margins
+ */
+html, body { width : 100%; height : 100%; }
+
+html, body, div, h1, h4, p, a { margin : 0px; padding : 0px; }
+
+.intro-header H1 { padding-top : 10px; margin-left : 10px; }
+
+.section { }
+.section-body { display: none; padding : 0px; }
+
+/* For regular div labels */
+#page-content div H4 {
+ padding : 10px;
+ padding-bottom : 0px;
+}
+
+/* For the main page content's div label */
+#page-content #content-header H4 {
+ padding-bottom : 10px;
+ padding-top : 0px;
+}
+
+/* special case for Mozilla's main content-header label.
+ Mozilla 1.4 needs more room at the top */
+#page-content > #content-header H4 { padding-top : 10px; }
+
+/* Needed in IE to get shift+tab to show the active image properly */
+a:active {
+ border : solid 0px;
+}
+
+a img {
+ border-width : 0;
+ background-repeat : no-repeat;
+}
+
+/*
+ * to get scrollbars working in both IE and Mozilla
+ */
+html,body { overflow: auto; }
+html>body { overflow: visible; }
+
+/*
+ * Set up the body, decorative background, and navigation for the content
+ * pages.
+ * Note: the root page handles its own background and navigation; these
+ * settings primarily apply to the content pages
+ */
+body {
+ background-color : #FFFFFF;
+ background-repeat : no-repeat;
+ background-position : bottom right;
+}
+
+/*
+ * We will use one of the general purpose groups to show
+ * the curve image
+ */
+#extra-group1 {
+ width : 100%;
+ height : 164px;
+ position : absolute;
+ top : 0px;
+ background-image : url(../graphics/contentpage/backgroundcurve.gif);
+ background-repeat : no-repeat;
+ background-position : top center;
+ margin : 0;
+ padding : 0;
+}
+
+/*
+ * Hide the other general-purpose groups
+ */
+
+#extra-group2,
+#extra-group3,
+#extra-group4,
+#extra-group5 {
+ display : none;
+}
+
+.intro-header { background-color : transparent; z-index : 100;}
+
+body, .page{
+ min-width : 770px;
+ /* since IE doesn't support min-width, try expression */
+ width:expression(document.body.clientWidth < 770? "770px": "auto" );
+ min-height : 425px;
+ height : 100%;
+ height : expression(document.body.clientHeight < 425? "425px": "100%" );
+}
+
+.page {
+ min-height : 475px;
+ background-image : url(../graphics/contentpage/background.jpg);
+ background-repeat : repeat-x;
+ background-position : top left;
+}
+
+#page-content {
+ background-repeat : no-repeat;
+ background-position : bottom right;
+ height : 70%;
+}
+
+/*
+ * Lay out the navigation links
+ * (Root page does something similar for its navigation)
+ */
+#navigation-links {
+ position : relative;
+ left : 10px;
+ top : 5px;
+ height : 60px;
+ width : 98%;
+}
+
+#navigation-links a {
+ padding-left : 5px;
+ padding-right : 5px;
+ float : left;
+ text-align : center;
+}
+
+#navigation-links #customize {
+ padding-left : 5px;
+ padding-right : 5px;
+ float : left;
+ text-align : center;
+}
+
+#navigation-links a img {
+ height : 52px;
+ width : 52px;
+ vertical-align : middle;
+}
+
+#navigation-links a .link-label { display : block; margin-top : 5px;}
+
+#navigation-links a .text { display : none; }
+
+#navigation-links a:hover,
+#navigation-links a:focus
+#navigation-links a:active { border-right : 0px;}
+
+/* properties for each of the navigation-links */
+#navigation-links a#overview img { background-image : url(../graphics/icons/etool/overview48.gif); }
+#navigation-links a#overview:hover img,
+#navigation-links a#overview:focus img,
+#navigation-links a#overview:active img { background-image : url(../graphics/icons/ctool/overview48.gif); }
+
+#navigation-links a#tutorials img { background-image : url(../graphics/icons/etool/tutorials48.gif); }
+#navigation-links a#tutorials:hover img,
+#navigation-links a#tutorials:active img,
+#navigation-links a#tutorials:focus img { background-image : url(../graphics/icons/ctool/tutorials48.gif); }
+
+#navigation-links a#samples img { background-image : url(../graphics/icons/etool/samples48.gif); }
+#navigation-links a#samples:hover img,
+#navigation-links a#samples:active img,
+#navigation-links a#samples:focus img { background-image : url(../graphics/icons/ctool/samples48.gif); }
+
+#navigation-links a#whatsnew img { background-image : url(../graphics/icons/etool/whatsnew48.gif); }
+#navigation-links a#whatsnew:hover img,
+#navigation-links a#whatsnew:focus img,
+#navigation-links a#whatsnew:active img { background-image : url(../graphics/icons/ctool/whatsnew48.gif); }
+
+#navigation-links a#workbench { position : absolute; right : 0px; top : -35px; text-align : right;}
+#navigation-links a#workbench .text { display : none; }
+#navigation-links a#workbench img { background-image : url(../graphics/icons/etool/wb48.gif); width : 53px; height : 53px;}
+#navigation-links a#workbench:hover img,
+#navigation-links a#workbench:focus img,
+#navigation-links a#workbench:active img { background-image : url(../graphics/icons/ctool/wb48.gif); }
+
+/*
+ * Lay out the page title and description
+ */
+h1, p { margin-left : 10px; } /* required in mozilla so the page description is properly indented */
+
+/* position the page content so that the page title overlays the bottom
+ * of the background image, but make sure the content is always on top
+ * (using z-index) */
+#page-content {
+ float : none;
+ clear : both;
+ text-align : center;
+ margin-top : 35px;
+}
+
+.page > #page-content { margin-top : 50px; }
+
+#page-content p {
+ padding-bottom : 15px;
+ text-align : left;
+ float : none;
+ clear : both;
+}
+
+/* Page content bins */
+
+#page-content #top-left {
+ border: none; float: left; margin: 0; padding: 0; width: 50%;
+ /*
+ background-color: #ffc0c0;
+ */
+ clear: left;
+}
+#page-content #top-right {
+ border: none; float: right; margin: 0; padding: 0; width: 50%;
+ /*
+ background-color: #c0ffc0;
+ */
+ clear: right;
+}
+
+/* top-bottom divider - runs the entire width to ensure
+ * bottom boxes start at the same y
+ */
+#page-content #content-divider {
+ border: none; float: none; margin: 0; padding: 0; width: 100%;
+ /*
+ background-color: #c0c0c0;
+ */
+ clear: both;
+}
+
+#page-content #bottom-left {
+ border: none; float: left; margin: 0; padding: 0; width: 50%;
+ /*
+ background-color: #ffffc0;
+ */
+ clear: left;
+}
+#page-content #bottom-right {
+ border: none; float: right; margin: 0; padding: 0; width: 50%;
+ /*
+ background-color: #c0ffff;
+ */
+ clear: right;
+}
+
+/*
+ * Extension importance styles
+ */
+.importance-low {
+}
+
+.importance-medium {
+ background-color: #ffdddd;
+}
+
+.importance-high {
+ background-color: #ffffdd;
+}
+
+.importance-new {
+}
+
+.importance-callout {
+ background-color: #cccccc;
+}
+
+#page-content #content-header H4, .page-description {
+ text-align : left;
+ margin-right : 10px;
+ float : none;
+ clear : both;
+}
+
+#page-content #top-left > *,
+#page-content #top-right > *,
+#page-content #bottom-left > *,
+#page-content #bottom-right > * {
+ display: block;
+}
+
+#page-content * > a {
+ vertical-align : middle;
+}
+
+#page-content * a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#page-content * a .link-label {
+ display : block;
+ /*
+ width : 300px;
+ */
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#page-content * a > .link-label { left: 65px; }
+
+#page-content * a p .text {
+ display : block;
+ /*
+ width : 300px;
+ */
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#page-content * a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#page-content * > a { width : 700px; }
+#page-content * a > .link-label { width : 700px; }
+#page-content * a p > .text { width : 700px; }
+
+#page-content * a:hover { border-right : 5px; } \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/standby.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/standby.css
new file mode 100644
index 000000000..5aa519b2a
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/standby.css
@@ -0,0 +1,132 @@
+/*
+ * Set up general font colours, sizes, etc. Some of these will override
+ * settings from the shared CSS
+ */
+.intro-header H1 {
+ font-size : 15pt;
+}
+
+#page-links a .link-label, #action-links a .link-label {
+ font-size : 10pt;
+ font-weight : 600;
+ color : #E5E5E5;
+}
+
+#page-links a p .text, #action-links a p .text {
+ font-size : 10pt;
+ font-weight : 500;
+ color : #E5E5E5;
+}
+
+/*
+ * Set up the content for the standby page.
+ */
+body {
+ min-width : 230px;
+ /* since IE doesn't support min-width, use expression */
+ width:expression(document.body.clientWidth < 230? "230px": "auto" );
+ background-image : url(../graphics/root/background.jpg);
+ background-repeat : no-repeat;
+ background-position : top left;
+ background-color : #7169D1;
+}
+
+.page {
+ background-image : url(../graphics/root/brandmark.gif);
+ background-repeat : no-repeat;
+ background-position : bottom left;
+ min-width : 230px;
+ /* since IE doesn't support min-width, use expression */
+ width:expression(document.body.clientWidth < 230? "230px": "auto" );
+ min-height : 610px;
+ height : 100%;
+ height : expression(document.body.clientHeight < 450? "450px": "100%" );
+}
+
+/*
+ * Set up the navigation bar. It should be centered in the middle
+ * of the page
+ */
+
+#links-background {
+ width : 100%;
+ margin-top : 10%;
+ margin-bottom : auto;
+ text-align : center;
+}
+
+#page-links a {
+ display : block;
+ width : 220px;
+ text-align : left;
+ margin-left : auto;
+ margin-right : auto;
+ margin-top : 0px;
+ vertical-align : top;
+}
+#page-links a span, #page-links a p {
+ display : block;
+ width : 160px;
+ margin : 0px;
+ padding : 0px;
+}
+
+#page-links a .link-label {
+ position : relative;
+ left : 60px;
+ top : -50px;
+}
+
+#page-links a p .text {
+ position : relative;
+ left : 60px;
+ top : -50px;
+
+}
+
+#page-links a .content-img {
+ visibility: hidden;
+}
+
+#page-links a img {
+ height : 52px;
+ width : 52px;
+ vertical-align : middle;
+}
+
+#page-links a:hover,
+#page-links a:focus,
+#page-links a:active { border : 0px; }
+
+#page-links a:hover p,
+#page-links a:focus p,
+#page-links a:active p { margin : 0px; padding : 0px; }
+
+#action-links a { visibility: hidden; }
+
+/* properties for each of the page-links */
+a#overview img { background-image : url(../graphics/icons/etool/overview48.gif); }
+a#overview:hover img,
+a#overview:focus img,
+a#overview:active img { background-image : url(../graphics/icons/ctool/overview48.gif); }
+
+a#tutorials img { background-image : url(../graphics/icons/etool/tutorials48.gif); }
+a#tutorials:hover img,
+a#tutorials:focus img,
+a#tutorials:active img { background-image : url(../graphics/icons/ctool/tutorials48.gif); }
+
+a#samples img { background-image : url(../graphics/icons/etool/samples48.gif); }
+a#samples:hover img,
+a#samples:focus img,
+a#samples:active img { background-image : url(../graphics/icons/ctool/samples48.gif); }
+
+a#whatsnew img { background-image : url(../graphics/icons/etool/whatsnew48.gif); }
+a#whatsnew:hover img,
+a#whatsnew:focus img,
+a#whatsnew:active img { background-image : url(../graphics/icons/ctool/whatsnew48.gif); }
+
+a#workbench img { background-image : url(../graphics/icons/etool/wb48.gif); }
+a#workbench:hover img,
+a#workbench:focus img,
+a#workbench:active img { background-image : url(../graphics/icons/ctool/wb48.gif); }
+
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/tutorials.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/tutorials.css
new file mode 100644
index 000000000..cdef051d1
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/tutorials.css
@@ -0,0 +1,92 @@
+body {
+ background-image : url(../graphics/contentpage/tutorials_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#tutorials img, #navigation-links a#tutorials:hover img { background-image : url(../graphics/icons/ctool/tutorials48sel.gif); }
+
+/*
+ * Set up the content of the tutorials page into two
+ * columns that are centered in the page
+ */
+
+
+/* a group of tutorial links */
+.tutorials-group {
+ /* To center in Moz (have to use text-align for IE) */
+ margin-left : auto;
+ margin-right : auto;
+ /*
+ width : 750px;
+ */
+ margin-bottom : 30px;
+ float : none;
+ clear : both;
+ text-align : left;
+}
+
+#top-left > .tutorials-group *,
+#top-right > .tutorials-group *,
+#bottom-left > .tutorials-group *,
+#bottom-right > .tutorials-group * {
+ display: block;
+}
+
+.tutorials-link {
+/*
+ width : 360px;
+ */
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 10px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+.tutorials-group > .tutorials-link {
+ float : left;
+ height : 150px;
+ vertical-align : middle;
+}
+
+
+.tutorials-link img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+.tutorials-group h4 {
+ float : none;
+ clear : both;
+}
+
+p #group-description {
+ padding-bottom : 10px;
+ float : none;
+ clear : both;
+}
+
+.tutorials-link .link-label {
+ display : block;
+ /*
+ width : 300px;
+ */
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+
+.tutorials-link p .text {
+ display : block;
+ /*
+ width : 300px;
+ */
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+.tutorials-link:hover { border-right : 0px; }
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/html/whatsnew.css b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/whatsnew.css
new file mode 100644
index 000000000..ffec63c4c
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/html/whatsnew.css
@@ -0,0 +1,123 @@
+body {
+ background-image : url(../graphics/contentpage/whatsnew_wtr.jpg);
+}
+
+/* show the "selected" image for this page */
+#navigation-links a#news img, #navigation-links a#news:hover img { background-image : url(../graphics/icons/ctool/whatsnew48sel.gif); }
+
+/*
+ * Set up the content of the Whats New page to be displayed in
+ * two columns that are centered in the middle of the page.
+ */
+
+#noteworthy-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#noteworthy-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#noteworthy-links > a { vertical-align : middle; }
+
+#noteworthy-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#noteworthy-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#noteworthy-links a > .link-label { left: 65px; }
+
+#noteworthy-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#noteworthy-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#noteworthy-links > a { width : 700px; }
+#noteworthy-links a > .link-label { width : 700px; }
+#noteworthy-links a p > .text { width : 700px; }
+
+#noteworthy-links a:hover { border-right : 5px; }
+
+#noteworthy-links a img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
+#noteworthy-links a:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
+
+
+#news-links {
+ text-align : left;
+ width : 760px;
+ /* To center in Moz (have to use text-align for IE) */
+ margin: 0px auto;
+}
+
+#news-links a {
+ width : 370px;
+ text-align : left;
+ margin-left : 5px;
+ margin-right : 5px;
+ margin-top : 5px;
+ margin-bottom : -20px;
+ vertical-align : top;
+}
+
+#news-links > a { vertical-align : middle; }
+
+#news-links a img {
+ height : 57px;
+ width : 57px;
+ vertical-align : middle;
+}
+
+#news-links a .link-label {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -50px;
+ left : 60px;
+}
+
+#news-links a > .link-label { left: 65px; }
+
+#news-links a p .text {
+ display : block;
+ width : 300px;
+ position : relative;
+ top : -45px;
+ left : 53px;
+}
+
+#news-links a p > .text { left: 58px; }
+
+/* Special case for Mozilla, because the links are displayed
+ in 1 vertical column instead of 2 centered columns */
+#news-links > a { width : 700px; }
+#news-links a > .link-label { width : 700px; }
+#news-links a p > .text { width : 700px; }
+
+#news-links a:hover { border-right : 5px; }
+
+
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/preview.png b/org.eclipse.ui.intro.universal/themes/purpleMesh/preview.png
new file mode 100644
index 000000000..8316502a4
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/preview.png
Binary files differ
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/firststeps.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/firststeps.properties
new file mode 100644
index 000000000..cc62a3453
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/firststeps.properties
@@ -0,0 +1,3 @@
+firststeps.page-content.layout.ncolumns = 2
+firststeps.page-content.bottom.layout.colspan = 2
+firstseps.subtitle-id = firststeps/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/migrate.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/migrate.properties
new file mode 100644
index 000000000..a45e8d993
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/migrate.properties
@@ -0,0 +1,3 @@
+migrate.page-content.layout.ncolumns = 2
+migrate.page-content.bottom.layout.colspan = 2
+migrate.subtitle-id = migrate/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/overview.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/overview.properties
new file mode 100644
index 000000000..89a574dc8
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/overview.properties
@@ -0,0 +1,6 @@
+
+overview.page-content.layout.ncolumns = 2
+overview.page-content.bottom.layout.colspan = 2
+
+overview.subtitle-id = overview/page-content/page-title
+overview.description-id = overview/page-content/page-description \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/root.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/root.properties
new file mode 100644
index 000000000..49243e5d7
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/root.properties
@@ -0,0 +1,29 @@
+theme=true
+root.links-background.page-links.overview.link-icon = ../graphics/icons/etool/overview72.gif
+root.links-background.page-links.tutorials.link-icon = ../graphics/icons/etool/tutorials72.gif
+root.links-background.page-links.samples.link-icon= ../graphics/icons/etool/samples72.gif
+root.links-background.page-links.whatsnew.link-icon = ../graphics/icons/etool/whatsnew72.gif
+root.action-links.workbench.link-icon = ../graphics/icons/etool/wb48.gif
+
+root.links-background.page-links.overview.hover-icon = ../graphics/icons/ctool/overview72.gif
+root.links-background.page-links.tutorials.hover-icon = ../graphics/icons/ctool/tutorials72.gif
+root.links-background.page-links.samples.hover-icon = ../graphics/icons/ctool/samples72.gif
+root.links-background.page-links.whatsnew.hover-icon = ../graphics/icons/ctool/whatsnew72.gif
+root.action-links.workbench.hover-icon = ../graphics/icons/ctool/wb48.gif
+
+
+root.links-background.page-links.overview.small-link-icon = ../graphics/icons/etool/overview48.gif
+root.links-background.page-links.tutorials.small-link-icon = ../graphics/icons/etool/tutorials48.gif
+root.links-background.page-links.samples.small-link-icon = ../graphics/icons/etool/samples48.gif
+root.links-background.page-links.whatsnew.small-link-icon = ../graphics/icons/etool/whatsnew48.gif
+root.action-links.workbench.small-link-icon = ../graphics/icons/etool/wb48.gif
+
+root.links-background.page-links.overview.small-hover-icon = ../graphics/icons/ctool/overview48.gif
+root.links-background.page-links.tutorials.small-hover-icon = ../graphics/icons/ctool/tutorials48.gif
+root.links-background.page-links.samples.small-hover-icon = ../graphics/icons/ctool/samples48.gif
+root.links-background.page-links.whatsnew.small-hover-icon = ../graphics/icons/ctool/whatsnew48.gif
+root.action-links.workbench.small-hover-icon = ../graphics/icons/ctool/wb48.gif
+
+root.layout.ncolumns = 1
+root.links-background.page-links.layout.hspacing = 40
+root.layout.vspacing = 35
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/samples.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/samples.properties
new file mode 100644
index 000000000..fbbe9c49b
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/samples.properties
@@ -0,0 +1,8 @@
+
+samples.page-content.layout.vspacing = 40
+samples.page-content.layout.ncolumns = 2
+samples.page-content.bottom.layout.colspan = 2
+
+description-style-id = group-description
+samples.subtitle-id = samples/page-content/page-title
+samples.description-id = samples/page-content/page-description \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/standby.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/standby.properties
new file mode 100644
index 000000000..940b189fa
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/standby.properties
@@ -0,0 +1,17 @@
+theme=true
+standby.links-background.page-links.overview.link-icon = ../graphics/icons/etool/overview72.gif
+standby.links-background.page-links.tutorials.link-icon = ../graphics/icons/etool/tutorials72.gif
+standby.links-background.page-links.samples.link-icon= ../graphics/icons/etool/samples72.gif
+standby.links-background.page-links.news.link-icon = ../graphics/icons/etool/whatsnew72.gif
+
+
+standby.links-background.page-links.overview.hover-icon = ../graphics/icons/ctool/overview72.gif
+standby.links-background.page-links.tutorials.hover-icon = ../graphics/icons/ctool/tutorials72.gif
+standby.links-background.page-links.samples.hover-icon = ../graphics/icons/ctool/samples72.gif
+standby.links-background.page-links.news.hover-icon = ../graphics/icons/ctool/whatsnew72.gif
+
+
+standby.links-background.page-links.layout.vspacing = 30
+standby.layout.vspacing = 35
+standby.show-link-description = false
+standby.show-home-page-navigation = false \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/tutorials.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/tutorials.properties
new file mode 100644
index 000000000..de1d07215
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/tutorials.properties
@@ -0,0 +1,7 @@
+
+tutorials.page-content.layout.vspacing = 40
+tutorials.page-content.layout.ncolumns = 2
+tutorials.page-content.bottom.layout.colspan = 2
+
+tutorials.subtitle-id = tutorials/page-content/page-title
+tutorials.description-id = tutorials/page-content/page-description \ No newline at end of file
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/webresources.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/webresources.properties
new file mode 100644
index 000000000..2d8589fec
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/webresources.properties
@@ -0,0 +1,6 @@
+
+webresources.page-content.layout.vspacing = 40
+webresources.page-content.layout.ncolumns = 2
+webresources.page-content.bottom.layout.colspan = 2
+
+webresources.subtitle-id = news/page-content/page-title
diff --git a/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/whatsnew.properties b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/whatsnew.properties
new file mode 100644
index 000000000..2a732e2f9
--- /dev/null
+++ b/org.eclipse.ui.intro.universal/themes/purpleMesh/swt/whatsnew.properties
@@ -0,0 +1,9 @@
+theme = true
+whatsnew.page-content.layout.vspacing = 40
+whatsnew.page-content.layout.ncolumns = 2
+whatsnew.page-content.bottom.layout.colspan = 2
+
+whatsnew.link-icon = ../graphics/icons/obj48/new_obj.gif
+whatsnew.hover-icon = ../graphics/icons/obj48/newhov_obj.gif
+
+whatsnew.subtitle-id = whatsnew/page-content/page-title

Back to the top