From 1950aff01a9fa585af7810022016324ce1e9ed51 Mon Sep 17 00:00:00 2001 From: Max Schenkelberg Date: Tue, 16 Apr 2013 11:28:05 -0500 Subject: [PATCH] Issue #1638 Added viz base feature as well as personalities cave project extracting out non-awips specific things in personalities awips project Amend: Removed eclipse feature all together, added os and arch to fragments. Ensured unpack flag stayed same when changing features. Change-Id: I78a2c5262ebdbe3ace3c180254b5f036011c0a65 Former-commit-id: 6ccef4d3c7b08519733591636afa54b71fe29632 [formerly bd52681be3aefbea68df775068bd0dbc38d482c7] [formerly 7513e5982ba6d54c469a5b40550c88a515560add [formerly dd4ddb8aacf82f7c69860b470c3f754a59f0c124]] Former-commit-id: 7513e5982ba6d54c469a5b40550c88a515560add Former-commit-id: 57f34e908037d26ccd1f9de09198903f4455ac4b --- cave/build/p2-build.xml | 24 +- .../.project | 2 +- .../build.properties | 0 .../feature.xml | 250 +++++++ .../feature.xml | 8 +- .../feature.xml | 47 +- .../feature.xml | 118 +--- .../feature.xml | 1 - .../feature.xml | 80 +-- .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../com.raytheon.uf.viz.eclipse.feature.ecl | 0 .../feature.xml | 613 ------------------ .../feature.xml | 1 - .../feature.xml | 155 ++++- .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../.classpath | 7 + .../.project | 28 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../META-INF/MANIFEST.MF | 24 + .../build.properties | 6 + .../plugin.xml | 483 ++++++++++++++ .../splash.bmp | Bin 0 -> 315054 bytes .../uf/viz/personalities/cave/Activator.java | 50 ++ .../cave/component/CAVEApplication.java | 294 +++++++++ .../menu}/CloseAllPerspectivesHandler.java | 2 +- .../cave/menu}/ClosePerspectiveHandler.java | 4 +- .../cave/menu}/OpenPerspectiveMenu.java | 2 +- .../personalities/cave/menu/SystemIdItem.java | 133 ++++ .../cave/menu}/VizEditorSystemMenu.java | 3 +- .../presentation}/VizPresentationFactory.java | 4 +- .../cave/presentation}/VizTabFolder.java | 2 +- ...oseNonRestorableDetachedViewsListener.java | 4 +- .../workbench/HiddenWorkbenchAdvisor.java | 98 +++ .../HiddenWorkbenchWindowAdvisor.java | 60 ++ .../cave/workbench}/OpenPerspectiveList.java | 2 +- .../cave/workbench}/VizWorkbenchAdvisor.java | 148 ++--- .../workbench}/VizWorkbenchWindowAdvisor.java | 14 +- .../alertviz.product | 2 +- .../cave/ThinClientWorkbenchAdvisor.java | 4 +- .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 24 +- .../feature.xml | 218 ++++++- cave/com.raytheon.viz.gfe.feature/feature.xml | 1 - .../com.raytheon.viz.grib.feature/feature.xml | 1 - .../feature.xml | 1 - .../developer.product | 3 +- .../com.raytheon.viz.product.awips/plugin.xml | 29 - .../feature.xml | 1 - .../feature.xml | 1 - .../com.raytheon.viz.text.feature/feature.xml | 1 - .../META-INF/MANIFEST.MF | 3 +- .../plugin.xml | 462 +------------ .../awips/AWIPSWorkbenchAdvisor.java | 107 +++ .../awips/AWIPSWorkbenchWindowAdvisor.java | 65 ++ .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - .../feature.xml | 1 - 67 files changed, 2160 insertions(+), 1454 deletions(-) rename cave/{com.raytheon.uf.viz.eclipse.feature => com.raytheon.uf.viz.base.feature}/.project (87%) rename cave/{com.raytheon.uf.viz.eclipse.feature => com.raytheon.uf.viz.base.feature}/build.properties (100%) create mode 100644 cave/com.raytheon.uf.viz.base.feature/feature.xml delete mode 100644 cave/com.raytheon.uf.viz.eclipse.feature/com.raytheon.uf.viz.eclipse.feature.ecl delete mode 100644 cave/com.raytheon.uf.viz.eclipse.feature/feature.xml create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/.classpath create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/.project create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/.settings/org.eclipse.jdt.core.prefs create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/META-INF/MANIFEST.MF create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/build.properties create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/plugin.xml create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/splash.bmp create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/Activator.java create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/component/CAVEApplication.java rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu}/CloseAllPerspectivesHandler.java (97%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu}/ClosePerspectiveHandler.java (95%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu}/OpenPerspectiveMenu.java (97%) create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/SystemIdItem.java rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu}/VizEditorSystemMenu.java (99%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation}/VizPresentationFactory.java (97%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation}/VizTabFolder.java (97%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench}/CloseNonRestorableDetachedViewsListener.java (97%) create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchAdvisor.java create mode 100644 cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchWindowAdvisor.java rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench}/OpenPerspectiveList.java (98%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench}/VizWorkbenchAdvisor.java (66%) rename cave/{com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips => com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench}/VizWorkbenchWindowAdvisor.java (89%) create mode 100644 cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchWindowAdvisor.java diff --git a/cave/build/p2-build.xml b/cave/build/p2-build.xml index 943f86f751..998d4a334d 100644 --- a/cave/build/p2-build.xml +++ b/cave/build/p2-build.xml @@ -120,12 +120,6 @@ includes="it.*/**" /> - - - - - @@ -162,6 +156,10 @@ + + + @@ -422,20 +420,6 @@ - - - - - - - - - - - com.raytheon.uf.viz.eclipse.feature + com.raytheon.uf.viz.base.feature diff --git a/cave/com.raytheon.uf.viz.eclipse.feature/build.properties b/cave/com.raytheon.uf.viz.base.feature/build.properties similarity index 100% rename from cave/com.raytheon.uf.viz.eclipse.feature/build.properties rename to cave/com.raytheon.uf.viz.base.feature/build.properties diff --git a/cave/com.raytheon.uf.viz.base.feature/feature.xml b/cave/com.raytheon.uf.viz.base.feature/feature.xml new file mode 100644 index 0000000000..5aa3cbdc9d --- /dev/null +++ b/cave/com.raytheon.uf.viz.base.feature/feature.xml @@ -0,0 +1,250 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.uf.viz.collaboration.feature/feature.xml b/cave/com.raytheon.uf.viz.collaboration.feature/feature.xml index 122bb60914..36e33b2ec2 100644 --- a/cave/com.raytheon.uf.viz.collaboration.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.collaboration.feature/feature.xml @@ -21,7 +21,6 @@ - @@ -144,4 +143,11 @@ version="0.0.0" unpack="false"/> + + diff --git a/cave/com.raytheon.uf.viz.common.core.feature/feature.xml b/cave/com.raytheon.uf.viz.common.core.feature/feature.xml index 2f9468f542..53313fd60a 100644 --- a/cave/com.raytheon.uf.viz.common.core.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.common.core.feature/feature.xml @@ -28,13 +28,6 @@ version="0.0.0" unpack="false"/> - - + + + + + + + + + + diff --git a/cave/com.raytheon.uf.viz.core.feature/feature.xml b/cave/com.raytheon.uf.viz.core.feature/feature.xml index 4525e24ec8..d6be8c7440 100644 --- a/cave/com.raytheon.uf.viz.core.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.core.feature/feature.xml @@ -19,48 +19,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/cave/com.raytheon.uf.viz.core.maps.feature/feature.xml b/cave/com.raytheon.uf.viz.core.maps.feature/feature.xml index 807f63b31b..b9d6ed6647 100644 --- a/cave/com.raytheon.uf.viz.core.maps.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.core.maps.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.uf.viz.cots.feature/feature.xml b/cave/com.raytheon.uf.viz.cots.feature/feature.xml index 2a9dc8502f..93c524c534 100644 --- a/cave/com.raytheon.uf.viz.cots.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.cots.feature/feature.xml @@ -16,95 +16,17 @@ [Enter License Description here.] - + - - - - - - - - - - - - - - - - - - - - - - diff --git a/cave/com.raytheon.uf.viz.d2d.skewt.feature/feature.xml b/cave/com.raytheon.uf.viz.d2d.skewt.feature/feature.xml index 396988d69e..0173b1030c 100644 --- a/cave/com.raytheon.uf.viz.d2d.skewt.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.d2d.skewt.feature/feature.xml @@ -26,7 +26,6 @@ - diff --git a/cave/com.raytheon.uf.viz.d2d.xy.feature/feature.xml b/cave/com.raytheon.uf.viz.d2d.xy.feature/feature.xml index 4e2c0af16b..44d0d43efb 100644 --- a/cave/com.raytheon.uf.viz.d2d.xy.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.d2d.xy.feature/feature.xml @@ -28,7 +28,6 @@ - - diff --git a/cave/com.raytheon.uf.viz.displays.feature/feature.xml b/cave/com.raytheon.uf.viz.displays.feature/feature.xml index 23b89fcbe1..06faad812e 100644 --- a/cave/com.raytheon.uf.viz.displays.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.displays.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.uf.viz.eclipse.feature/com.raytheon.uf.viz.eclipse.feature.ecl b/cave/com.raytheon.uf.viz.eclipse.feature/com.raytheon.uf.viz.eclipse.feature.ecl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cave/com.raytheon.uf.viz.eclipse.feature/feature.xml b/cave/com.raytheon.uf.viz.eclipse.feature/feature.xml deleted file mode 100644 index 0a9acf2813..0000000000 --- a/cave/com.raytheon.uf.viz.eclipse.feature/feature.xml +++ /dev/null @@ -1,613 +0,0 @@ - - - - - [Enter Feature Description here.] - - - - [Enter Copyright Description here.] - - - - [Enter License Description here.] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cave/com.raytheon.uf.viz.gisdatastore.feature/feature.xml b/cave/com.raytheon.uf.viz.gisdatastore.feature/feature.xml index 12b476b470..2e6d6d16eb 100644 --- a/cave/com.raytheon.uf.viz.gisdatastore.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.gisdatastore.feature/feature.xml @@ -20,7 +20,6 @@ - diff --git a/cave/com.raytheon.uf.viz.localization.perspective.feature/feature.xml b/cave/com.raytheon.uf.viz.localization.perspective.feature/feature.xml index 90cae5af42..b59da369c9 100644 --- a/cave/com.raytheon.uf.viz.localization.perspective.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.localization.perspective.feature/feature.xml @@ -18,7 +18,6 @@ - @@ -209,4 +208,158 @@ install-size="0" version="0.0.0"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml b/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml index e454f6a4b0..b33de0a608 100644 --- a/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml @@ -29,7 +29,6 @@ - - diff --git a/cave/com.raytheon.uf.viz.nwsauth.feature/feature.xml b/cave/com.raytheon.uf.viz.nwsauth.feature/feature.xml index 02cb3f4570..528e4fd55b 100644 --- a/cave/com.raytheon.uf.viz.nwsauth.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.nwsauth.feature/feature.xml @@ -18,7 +18,6 @@ - diff --git a/cave/com.raytheon.uf.viz.personalities.cave/.classpath b/cave/com.raytheon.uf.viz.personalities.cave/.classpath new file mode 100644 index 0000000000..1fa3e6803d --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/cave/com.raytheon.uf.viz.personalities.cave/.project b/cave/com.raytheon.uf.viz.personalities.cave/.project new file mode 100644 index 0000000000..19c60e57b6 --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/.project @@ -0,0 +1,28 @@ + + + com.raytheon.uf.viz.personalities.cave + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/cave/com.raytheon.uf.viz.personalities.cave/.settings/org.eclipse.jdt.core.prefs b/cave/com.raytheon.uf.viz.personalities.cave/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..f6f04f6fa4 --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Tue Mar 19 16:21:24 CDT 2013 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/cave/com.raytheon.uf.viz.personalities.cave/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.personalities.cave/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..0176ac108a --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/META-INF/MANIFEST.MF @@ -0,0 +1,24 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: CAVE UI Personalities +Bundle-SymbolicName: com.raytheon.uf.viz.personalities.cave;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: com.raytheon.uf.viz.personalities.cave.Activator +Bundle-Vendor: RAYTHEON +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + com.raytheon.uf.viz.application;bundle-version="1.0.0", + com.raytheon.uf.viz.core;bundle-version="1.12.1174", + com.raytheon.viz.core;bundle-version="1.12.1174", + com.raytheon.viz.ui;bundle-version="1.12.1174", + com.raytheon.uf.viz.ui.menus;bundle-version="1.12.1174", + javax.measure;bundle-version="1.0.0", + com.raytheon.viz.alerts;bundle-version="1.12.1174", + com.raytheon.uf.common.pypies;bundle-version="1.12.1174" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-ActivationPolicy: lazy +Export-Package: com.raytheon.uf.viz.personalities.cave, + com.raytheon.uf.viz.personalities.cave.component, + com.raytheon.uf.viz.personalities.cave.menu, + com.raytheon.uf.viz.personalities.cave.presentation, + com.raytheon.uf.viz.personalities.cave.workbench diff --git a/cave/com.raytheon.uf.viz.personalities.cave/build.properties b/cave/com.raytheon.uf.viz.personalities.cave/build.properties new file mode 100644 index 0000000000..e1d2deade8 --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/build.properties @@ -0,0 +1,6 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + splash.bmp diff --git a/cave/com.raytheon.uf.viz.personalities.cave/plugin.xml b/cave/com.raytheon.uf.viz.personalities.cave/plugin.xml new file mode 100644 index 0000000000..935d9c4d4d --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/plugin.xml @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.uf.viz.personalities.cave/splash.bmp b/cave/com.raytheon.uf.viz.personalities.cave/splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..01f7516d38693f296e07b26a10022b0266140e1a GIT binary patch literal 315054 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

MATnll-*IyxvdY|b7su$h4t#3XXYfpLr$I)| zK_)EgyZw@)Rpch~h-o*B`)s=WD2;$ zgIFYiIb?Wy#wCDD;KLI5=&XZb^V-_lGICL7VqAci_fxG`>vx^{ZNie?Q+5qKs5bhs z(>Oi|IFz1uKrJEjX&W!7*%+L*QaF*P}j>Yfj(lh4hCP|FH6%yP>hSyyJE{ zM&0z!yQb>C?u6#F={u$jU$AxT;+;#@s;pV3ePEC3?Q^P^PwYE?@bJZBx7F{zG}G6& zFw!+L)HgCVF*7$YwS1{-=I-nl7nVqfNzYBm&r2f{?35Eh*nmqtu0pygA`3(843CHdK8I;nzGRGv+y=28G`)M663sDwhK z(K6^|s2*5UoJXY+D=LYUvecsDP;zlzX;oSxF+I1&F_WR6M0ZT72_On=3)wGYGvqez z`nLDLvENKoH;o(Rk%Sz*`aLrEm)-+apPDNwYa(+Lr`$1GV-!43-D&c5qhTAbBU85i zG-LC!?PrwlJ$-3lX>0Ee4lqFDQc5|fcHq$i%k+HsSH{oc62K+!w^`Tv2IljFj~D7= zA~i?Agmm%iRxYEyB9D?y$RT(Igg(-;Ub^EtGG3{d+>u^;w7+`nh3I(9G!N^&{|fTk z_){9%1BQ+6HGKLH8~0xFPMBvKwAU_fhJo*(|FHKRU{Pf0+GQZ;oI#?Z0*Xk^8JgVW zCTE%^=bUp65(FgYj3O!uh>9pl$vG>SChbnxo%Da$`*Zzwnd^jqXYbshp7Rvdr|X1OXvMO(ivjP%&MORw?4XV7F2M>n^ z`|sVpbz}0$#MA@?k<72IY%DCU-s&4@XzjS!*MH~!!@?Xk%i|2(-XaulilOb!I9CouwF2`ib^j> zh|ePD3@&E0oG=MMnB*ce>VZN^)XL4QvR1sX>|%bMbP5 z#ySYz2O7G4t2iF(zW?rTUw-!KyY2b4$+71nefI|wbBfh0z3C;)kqhRGdXc2wW!%}f zNs4>S$u>6X@?15o8UW;OFZR z9O~ljXX}QuaB%U7ip;O5xc%V4%*yie#`>d?;lcX@AcyU&ZSU>8T9{cJ9C$D=`0&xl z803JsKm25PUwNGdpnEpEk8)6^=a%LdRshz3EFE6}9|1WR*Vmvd{Zv_5onKj=T3#4k zoF1Bces}8G&B^KOe(GgPu8E4%ifRS+p*_pwux+LjoEDW)3w9TD$X?ybaK9jt(Ay-flrY zMy@v6Zq_Ouw)z2B9Zwex8w(Q`M~}cj7f&BEYX@z#nP+%ddP#9pPtU{2aR8`iv(w;F z-FvmWxx4{DH}dew-M)dL2atPqc4lz}Y;Morm#O(B$khlyH#5IHx462vv=3|h$hNV* zyt%QmwFzZ)dke}6d_1hIZEOMz&aW*$U!5OantL!ib8l+q*2GNL%v#OJT+i0mwaZ^Q zwmy|EynZ^Nh6$H}Xxj34M4J^0W&C$Wp4Ezaa;8$ba z`xw^uK@R(DYCnGUmoN8T>`pyqBiN|s~22?*)FM_W;$ca za@vlT!;X~JlA6(&mdRR17K^d4bFsJdbi#N!>p7UJ+MyL3jMd$34ZK}!0)4_$lk>{T zQnK>^?sSaI+yaBMO3SYg3_Khgo1C2i7R;rU70_hw_1^92x_Rej-|(X+6O+>r$N}Jn z$GXY6MG)$sfJ6tTxrOER<&}*ClmmQ&thcfev5s=db z`gfk7Y*fW9^(&nsLAm5=wj`IdIV5$^&Os5$*(H@to!xgJ(f0b%$|tX0|K;<~-mjzh z6F$X9w|q1MAD@BWfOY$w<7Ebjd4RmmkR0aWgRwhZ{lVdxLTc7PHjZexa)cCdCe@IJ z<|`&w1If9hmeaoWDxnQ-2*oRPQqhI7g|}5IhGZ)4OBMF2SKKi#Y&Q(ekTY}?6O
Q*)&nJZqX!;5ntV%_G;7l)P?JMVy77+`R9 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 F+{s#MO1q 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 z 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 N5+DH*Ac1!$@B`mdF-iac literal 0 HcmV?d00001 diff --git a/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/Activator.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/Activator.java new file mode 100644 index 0000000000..1f3537ea86 --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/Activator.java @@ -0,0 +1,50 @@ +package com.raytheon.uf.viz.personalities.cave; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "com.raytheon.uf.viz.personalities.cave"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/component/CAVEApplication.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/component/CAVEApplication.java new file mode 100644 index 0000000000..3f4067ff9b --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/component/CAVEApplication.java @@ -0,0 +1,294 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.personalities.cave.component; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import javax.xml.bind.JAXBException; + +import org.eclipse.core.internal.runtime.InternalPlatform; +import org.eclipse.core.runtime.ILogListener; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.equinox.app.IApplication; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.internal.WorkbenchPlugin; + +import com.raytheon.uf.common.datastorage.DataStoreFactory; +import com.raytheon.uf.common.pypies.PyPiesDataStoreFactory; +import com.raytheon.uf.common.pypies.PypiesProperties; +import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.common.time.SimulatedTime; +import com.raytheon.uf.viz.application.ProgramArguments; +import com.raytheon.uf.viz.application.component.IStandaloneComponent; +import com.raytheon.uf.viz.core.RecordFactory; +import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.localization.CAVELocalizationNotificationObserver; +import com.raytheon.uf.viz.core.localization.LocalizationInitializer; +import com.raytheon.uf.viz.personalities.cave.workbench.VizWorkbenchAdvisor; +import com.raytheon.viz.alerts.jobs.AutoUpdater; +import com.raytheon.viz.alerts.jobs.MenuUpdater; +import com.raytheon.viz.alerts.observers.ProductAlertObserver; +import com.raytheon.viz.core.CorePlugin; +import com.raytheon.viz.core.mode.CAVEMode; +import com.raytheon.viz.core.preferences.PreferenceConstants; +import com.raytheon.viz.core.units.UnitRegistrar; + +/** + * {@link IStandaloneComponent} that starts and initializes the CAVE Workbench + * + *

+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Mar 20, 2013            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class CAVEApplication implements IStandaloneComponent { + + protected static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(CAVEApplication.class, "CAVE"); + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.application.component.IStandaloneComponent#startComponent + * (java.lang.String) + */ + @Override + @SuppressWarnings("restriction") + public Object startComponent(String componentName) throws Exception { + InternalPlatform.getDefault() + .getLog(WorkbenchPlugin.getDefault().getBundle()) + .addLogListener(new ILogListener() { + + @Override + public void logging(IStatus status, String plugin) { + if (status.getMessage() != null) { + System.out.println(status.getMessage()); + } + if (status.getException() != null) { + status.getException().printStackTrace(); + } + } + + }); + + UnitRegistrar.registerUnits(); + CAVEMode.performStartupDuties(); + + Display display = PlatformUI.createDisplay(); + + try { + initializeLocalization(); + } catch (Exception e) { + e.printStackTrace(); + statusHandler.handle( + Priority.CRITICAL, + "Could not connect to localization server: " + + e.getLocalizedMessage(), e); + // we return EXIT_OK here so eclipse doesn't try to pop up an error + // dialog which would break gfeClient-based cron jobs. + return IApplication.EXIT_OK; + } + initializeSerialization(); + initializeDataStoreFactory(); + initializeObservers(); + initializeSimulatedTime(); + + int returnCode = IApplication.EXIT_OK; + + try { + returnCode = PlatformUI.createAndRunWorkbench(display, + getWorkbenchAdvisor()); + } catch (Throwable t) { + t.printStackTrace(); + MessageDialog + .openError( + null, + "Error!", "Error instantiating workbench: " + t.getMessage()); //$NON-NLS-1$" + + } finally { + try { + if (CAVEMode.getMode() == CAVEMode.PRACTICE) { + saveUserTime(); + } + } catch (RuntimeException e) { + // catch any exceptions to ensure rest of finally block + // executes + } + } + + if (returnCode == PlatformUI.RETURN_RESTART) { + return IApplication.EXIT_RESTART; + } + return returnCode; + } + + protected void initializeLocalization() throws Exception { + new LocalizationInitializer(true, false).run(); + } + + /** + * Initializes the DataStoreFactory for the component. + */ + protected void initializeDataStoreFactory() { + PypiesProperties pypiesProps = new PypiesProperties(); + pypiesProps.setAddress(VizApp.getPypiesServer()); + DataStoreFactory.getInstance().setUnderlyingFactory( + new PyPiesDataStoreFactory(pypiesProps)); + } + + protected void initializeSerialization() { + new Job("Loading Serialization") { + + @Override + protected IStatus run(IProgressMonitor monitor) { + try { + SerializationUtil.getJaxbContext(); + } catch (JAXBException e) { + statusHandler.handle(Priority.CRITICAL, + "An error occured initializing Serialization", e); + } + return Status.OK_STATUS; + } + + }.schedule(); + } + + /** + * Initialize any observers needed by the application + */ + protected void initializeObservers() { + // Setup cave notification observer + CAVELocalizationNotificationObserver.register(); + registerProductAlerts(); + } + + protected void registerProductAlerts() { + // Register product observers + ProductAlertObserver.addObserver(null, new MenuUpdater()); + for (String plugin : RecordFactory.getInstance().getSupportedPlugins()) { + // Create separate AutoUpdater per plugin + ProductAlertObserver.addObserver(plugin, new AutoUpdater()); + } + } + + /** + * Save the current state of SimulatedTime + * + * @throws IOException + */ + protected void saveUserTime() throws IOException { + /* + * Save the current workstation time + */ + long timeValue = 0; + if (!SimulatedTime.getSystemTime().isRealTime()) { + timeValue = SimulatedTime.getSystemTime().getTime().getTime(); + } + CorePlugin.getDefault().getPreferenceStore() + .setValue(PreferenceConstants.P_LAST_USER_TIME, timeValue); + CorePlugin + .getDefault() + .getPreferenceStore() + .setValue(PreferenceConstants.P_LAST_USER_TIME_FROZEN, + SimulatedTime.getSystemTime().isFrozen()); + CorePlugin.getDefault().getPreferenceStore().save(); + } + + /** + * Restore the prior state of SimulatedTime + */ + protected void initializeSimulatedTime() { + long timeValue = 0; + boolean isFrozen = false; + + // If CorePlugin.getDefault() == null, assume running from a unit test + if (CorePlugin.getDefault() != null) { + String dateString = ProgramArguments.getInstance().getString( + "-time"); + if (dateString != null && !dateString.isEmpty()) { + try { + DateFormat dateParser = new SimpleDateFormat( + "yyyyMMdd_HHmm"); + dateParser.setTimeZone(TimeZone.getTimeZone("GMT")); + Date newSimTime = dateParser.parse(dateString); + timeValue = newSimTime.getTime(); + } catch (ParseException e) { + statusHandler + .handle(Priority.WARN, + "Invalid argument specified for command-line parameter '-time'.", + e); + } + } + } + + // if we're in practice mode and the user did not specify a DRT value on + // the CLI, restore their previous time setting + if ((CAVEMode.getMode() == CAVEMode.PRACTICE) && (timeValue == 0)) { + // Get the last saved time from the localization settings + timeValue = CorePlugin.getDefault().getPreferenceStore() + .getLong(PreferenceConstants.P_LAST_USER_TIME); + + // Get if the last saved time was a frozen modified time + isFrozen = CorePlugin.getDefault().getPreferenceStore() + .getBoolean(PreferenceConstants.P_LAST_USER_TIME_FROZEN); + } + + SimulatedTime systemTime = SimulatedTime.getSystemTime(); + systemTime.notifyListeners(false); + systemTime.setRealTime(); + systemTime.setFrozen(isFrozen); + if (timeValue != 0) { + systemTime.setTime(new Date(timeValue)); + } + systemTime.notifyListeners(true); + } + + /** + * Get the workbench advisor for the application + * + * @return + */ + protected WorkbenchAdvisor getWorkbenchAdvisor() { + return new VizWorkbenchAdvisor(); + } +} diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CloseAllPerspectivesHandler.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/CloseAllPerspectivesHandler.java similarity index 97% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CloseAllPerspectivesHandler.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/CloseAllPerspectivesHandler.java index 8f3f6492a0..be1251324b 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CloseAllPerspectivesHandler.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/CloseAllPerspectivesHandler.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.menu; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/ClosePerspectiveHandler.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/ClosePerspectiveHandler.java similarity index 95% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/ClosePerspectiveHandler.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/ClosePerspectiveHandler.java index ec41d9b264..0abfc8ef1e 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/ClosePerspectiveHandler.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/ClosePerspectiveHandler.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.menu; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; @@ -28,6 +28,8 @@ import org.eclipse.ui.IWorkbenchCommandConstants; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; +import com.raytheon.uf.viz.personalities.cave.workbench.OpenPerspectiveList; + /** * Close perspective handler, only runs if not last perspective * diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/OpenPerspectiveMenu.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/OpenPerspectiveMenu.java similarity index 97% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/OpenPerspectiveMenu.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/OpenPerspectiveMenu.java index c9b2cac458..f8350789c4 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/OpenPerspectiveMenu.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/OpenPerspectiveMenu.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.menu; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.PlatformUI; diff --git a/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/SystemIdItem.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/SystemIdItem.java new file mode 100644 index 0000000000..a937d346f6 --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/SystemIdItem.java @@ -0,0 +1,133 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.personalities.cave.menu; + +import java.lang.management.ManagementFactory; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.ui.actions.CompoundContributionItem; + +import sun.management.Agent; + +/** + * Command that displays the system id + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Aug 10, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class SystemIdItem extends CompoundContributionItem { + + /** + * Boolean to mark if we can use the file names as a connection checking + * method for determining orphaned locks + */ + private static boolean canCheckConnection = false; + + static { + try { + String val = System + .getProperty("com.sun.management.jmxremote.port"); + // If the port is set, then the Agent is already started and we + // would shutdown if we couldn't connect + if (val == null) { + // Get starting jmx remote port, default to 20000 + boolean connectionFailed = true; + int startPort = 20000; + int i = 0; + System.setProperty("com.sun.management.jmxremote.port", "" + + startPort); + do { + // Stop at 50 since at that point, may be underlying issue + // (firewall) blocking it and less likely there are 50 + // instances + try { + ++i; + Agent.startAgent(); + // jmx manager successfully started + connectionFailed = false; + canCheckConnection = true; + } catch (Exception e) { + System.setProperty("com.sun.management.jmxremote.port", + "" + (startPort + i)); + Agent.getManagementProperties() + .setProperty( + "com.sun.management.jmxremote.port", + System.getProperty("com.sun.management.jmxremote.port")); + + } + } while (connectionFailed && i < 50); + } else { + canCheckConnection = true; + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + + private static final String jmxPort = System + .getProperty("com.sun.management.jmxremote.port"); + + private static final String NAME = ManagementFactory.getRuntimeMXBean() + .getName(); + + private static final String HOST = NAME.split("[@]")[1]; + + private static final String PID = NAME.split("[@]")[0]; + + // name is in form processid@host, ID = host:port if we can check + // connections or we will just use processid@host + private static final String ID = HOST + ":" + + (canCheckConnection ? jmxPort : PID); + + static { + System.out.println(ID); + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.actions.CompoundContributionItem#getContributionItems() + */ + @Override + protected IContributionItem[] getContributionItems() { + return new IContributionItem[] { new ActionContributionItem(new Action( + HOST + ":" + PID) { + @Override + public boolean isEnabled() { + return false; + } + }) }; + } + +} diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizEditorSystemMenu.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/VizEditorSystemMenu.java similarity index 99% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizEditorSystemMenu.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/VizEditorSystemMenu.java index c5ff639969..b43d60ffd5 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizEditorSystemMenu.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/menu/VizEditorSystemMenu.java @@ -1,4 +1,4 @@ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.menu; import java.util.ArrayList; import java.util.List; @@ -43,6 +43,7 @@ import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.actions.ContributedEditorMenuAction; import com.raytheon.viz.ui.editor.AbstractEditor; +@SuppressWarnings("restriction") public class VizEditorSystemMenu implements ISystemMenu { private static final String EDITOR_MENU_EXTENSION_POINT = "com.raytheon.viz.ui.editorMenuAddition"; diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizPresentationFactory.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation/VizPresentationFactory.java similarity index 97% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizPresentationFactory.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation/VizPresentationFactory.java index 92d331b045..144d70aa75 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizPresentationFactory.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation/VizPresentationFactory.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.presentation; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; @@ -34,6 +34,8 @@ import org.eclipse.ui.presentations.IStackPresentationSite; import org.eclipse.ui.presentations.StackPresentation; import org.eclipse.ui.presentations.WorkbenchPresentationFactory; +import com.raytheon.uf.viz.personalities.cave.menu.VizEditorSystemMenu; + /** * Presentation Factory for the system * diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizTabFolder.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation/VizTabFolder.java similarity index 97% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizTabFolder.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation/VizTabFolder.java index 26c4b269e2..d3eef5f699 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizTabFolder.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/presentation/VizTabFolder.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.presentation; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CloseNonRestorableDetachedViewsListener.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/CloseNonRestorableDetachedViewsListener.java similarity index 97% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CloseNonRestorableDetachedViewsListener.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/CloseNonRestorableDetachedViewsListener.java index 6c1e3eeee5..cfb9d564a3 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CloseNonRestorableDetachedViewsListener.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/CloseNonRestorableDetachedViewsListener.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.workbench; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; @@ -50,6 +50,7 @@ import org.eclipse.ui.views.IViewRegistry; * @version 1.0 */ +@SuppressWarnings("restriction") public class CloseNonRestorableDetachedViewsListener implements Listener { /** @@ -59,7 +60,6 @@ public class CloseNonRestorableDetachedViewsListener implements Listener { } @Override - @SuppressWarnings("restriction") public void handleEvent(Event event) { IViewRegistry reg = PlatformUI.getWorkbench().getViewRegistry(); for (IWorkbenchWindow win : PlatformUI.getWorkbench() diff --git a/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchAdvisor.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchAdvisor.java new file mode 100644 index 0000000000..350c81144f --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchAdvisor.java @@ -0,0 +1,98 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.personalities.cave.workbench; + +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.viz.application.component.IStandaloneComponent; +import com.raytheon.uf.viz.core.VizApp; + +/** + * {@link WorkbenchAdvisor} to use which allows for the workbench to be started + * but not visible. This is usedby {@link IStandaloneComponent}s that need the + * workbench to start but do not utilize it + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Nov 11, 2009            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class HiddenWorkbenchAdvisor extends WorkbenchAdvisor { + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(HiddenWorkbenchAdvisor.class); + + private IStandaloneComponent component; + + private String componentName; + + public HiddenWorkbenchAdvisor(String componentName, + IStandaloneComponent component) { + this.component = component; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.application.WorkbenchAdvisor#getInitialWindowPerspectiveId + * () + */ + @Override + public String getInitialWindowPerspectiveId() { + return null; + } + + @Override + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( + IWorkbenchWindowConfigurer configurer) { + return new HiddenWorkbenchWindowAdvisor(configurer); + } + + @Override + public boolean openWindows() { + boolean rval = super.openWindows(); + VizApp.runAsync(new Runnable() { + public void run() { + try { + component.startComponent(componentName); + PlatformUI.getWorkbench().close(); + } catch (Exception e) { + statusHandler.handle(Priority.CRITICAL, + "error running component", e); + } + } + }); + return rval; + } +} diff --git a/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchWindowAdvisor.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchWindowAdvisor.java new file mode 100644 index 0000000000..cefc2a29f2 --- /dev/null +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/HiddenWorkbenchWindowAdvisor.java @@ -0,0 +1,60 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.personalities.cave.workbench; + +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +import com.raytheon.uf.viz.application.component.IStandaloneComponent; + +/** + * Workbench window advisor to use which allows for the workbench to be started + * but not visible. This is used by {@link HiddenWorkbenchAdvisor} for + * {@link IStandaloneComponent}s that need the workbench to start but do not + * utilize it + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Aug 9, 2010            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class HiddenWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { + + /** + * @param configurer + */ + public HiddenWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { + super(configurer); + } + + @Override + public void postWindowOpen() { + getWindowConfigurer().getWindow().getShell().setVisible(false); + } + +} diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/OpenPerspectiveList.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/OpenPerspectiveList.java similarity index 98% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/OpenPerspectiveList.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/OpenPerspectiveList.java index 0f85ec48b1..bdb4f7ccaf 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/OpenPerspectiveList.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/OpenPerspectiveList.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.workbench; import java.util.ArrayList; import java.util.HashMap; diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizWorkbenchAdvisor.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/VizWorkbenchAdvisor.java similarity index 66% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizWorkbenchAdvisor.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/VizWorkbenchAdvisor.java index 0135edd37c..77ec972082 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizWorkbenchAdvisor.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/VizWorkbenchAdvisor.java @@ -18,23 +18,14 @@ * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; - -//import gov.noaa.nws.ost.awips.viz.CaveCommandExecutionListener; -//import gov.noaa.nws.ost.awips.viz.CaveJobChangeListener; +package com.raytheon.uf.viz.personalities.cave.workbench; import java.util.HashSet; import java.util.Set; -import org.eclipse.core.commands.IExecutionListener; import org.eclipse.core.runtime.IExtension; -import org.eclipse.core.runtime.jobs.IJobChangeListener; -import org.eclipse.core.runtime.jobs.IJobManager; -import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferenceManager; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.IPerspectiveRegistry; import org.eclipse.ui.PlatformUI; @@ -42,14 +33,12 @@ import org.eclipse.ui.application.IWorkbenchConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; -import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.contexts.IContextService; import com.raytheon.uf.viz.application.ProgramArguments; -import com.raytheon.uf.viz.core.Activator; -import com.raytheon.uf.viz.core.preferences.PreferenceConstants; import com.raytheon.uf.viz.ui.menus.DiscoverMenuContributions; import com.raytheon.viz.ui.VizWorkbenchManager; +import com.raytheon.viz.ui.perspectives.AbstractVizPerspectiveManager; import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; /** @@ -60,8 +49,7 @@ import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/1/06 chammack Initial Creation. - * Mar 5, 2013 1753 njensen Added shutdown printout - * Mar 20, 2013 1638 mschenke Added overrideable method for dynamic menu creation + * Mar 5, 2013 1753 njensen Added shutdown printout * * * @@ -70,38 +58,12 @@ import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; */ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { - protected boolean logPeformance = false; - - protected IExecutionListener performanceListener; - - protected IJobChangeListener jobChangeListener; - protected CloseNonRestorableDetachedViewsListener detachedViewsListener; - protected boolean singlePerspective; - private boolean createdMenus = false; public VizWorkbenchAdvisor() { - performanceListener = CaveCommandExecutionListener.getInstance(); - jobChangeListener = CaveJobChangeListener.getInstance(); detachedViewsListener = new CloseNonRestorableDetachedViewsListener(); - - Activator.getDefault().getPreferenceStore() - .addPropertyChangeListener(new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - if (PreferenceConstants.P_LOG_PERF.equals(event - .getProperty())) { - Boolean log = (Boolean) event.getNewValue(); - if (log != logPeformance) { - toggleLogging(); - } - } - } - }); - singlePerspective = ProgramArguments.getInstance().getString( - "-perspective") != null; } /* @@ -176,7 +138,8 @@ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { } /** - * Removes perspectives from the rcp perspectives menu + * Removes perspectives from the rcp perspectives menu that are not managed + * by an {@link AbstractVizPerspectiveManager} */ @SuppressWarnings("restriction") private void removeExtraPerspectives() { @@ -187,10 +150,14 @@ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { for (IPerspectiveDescriptor perspective : reg.getPerspectives()) { if (managed.contains(perspective.getId()) == false) { org.eclipse.ui.internal.registry.PerspectiveDescriptor sync = (org.eclipse.ui.internal.registry.PerspectiveDescriptor) perspective; - IExtension ext = sync.getConfigElement() - .getDeclaringExtension(); - ((org.eclipse.ui.internal.registry.PerspectiveRegistry) reg) - .removeExtension(ext, new Object[] { perspective }); + if (sync.getConfigElement() != null) { + IExtension ext = sync.getConfigElement() + .getDeclaringExtension(); + ((org.eclipse.ui.internal.registry.PerspectiveRegistry) reg) + .removeExtension(ext, new Object[] { perspective }); + } else { + sync.deleteCustomDefinition(); + } } } } @@ -218,28 +185,48 @@ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { */ @Override public String getInitialWindowPerspectiveId() { - if (singlePerspective) { - String perspective = ProgramArguments.getInstance().getString( - "-perspective"); + String perspective = ProgramArguments.getInstance().getString( + "-perspective"); + IPerspectiveDescriptor desc = getSpecifiedPerspective(perspective); + if (desc != null) { + return desc.getId(); + } + IPerspectiveRegistry registry = PlatformUI.getWorkbench() + .getPerspectiveRegistry(); + perspective = registry.getDefaultPerspective(); + desc = getSpecifiedPerspective(perspective); + if (desc != null) { + return desc.getId(); + } + + // No default perspective specified in preference, look for managed + for (String pid : VizPerspectiveListener.getManagedPerspectives()) { + perspective = pid; + break; + } + return null; + } + + protected IPerspectiveDescriptor getSpecifiedPerspective(String perspective) { + IPerspectiveRegistry registry = PlatformUI.getWorkbench() + .getPerspectiveRegistry(); + + if (perspective != null) { // Check Id first - for (IPerspectiveDescriptor desc : PlatformUI.getWorkbench() - .getPerspectiveRegistry().getPerspectives()) { + for (IPerspectiveDescriptor desc : registry.getPerspectives()) { if (perspective.equals(desc.getId())) { - return perspective; + return desc; } } // Check label second - for (IPerspectiveDescriptor desc : PlatformUI.getWorkbench() - .getPerspectiveRegistry().getPerspectives()) { + for (IPerspectiveDescriptor desc : registry.getPerspectives()) { if (perspective.equalsIgnoreCase(desc.getLabel())) { - return desc.getId(); + return desc; } } } - - // Fall back to a reasonable default if not available - return "com.raytheon.uf.viz.d2d.ui.perspectives.D2D5Pane"; + return null; } /* @@ -256,7 +243,7 @@ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { createdMenus = true; createDynamicMenus(); } - return new VizWorkbenchWindowAdvisor(configurer, singlePerspective); + return new VizWorkbenchWindowAdvisor(configurer); } /* @@ -284,24 +271,13 @@ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { return bResult; } - /** - * Added by Wufeng Zhou to hook up command execution listener and job - * listener - * - */ @Override public void postStartup() { super.postStartup(); - Boolean log = Activator.getDefault().getPreferenceStore() - .getBoolean(PreferenceConstants.P_LOG_PERF); - - if (log != logPeformance) { - toggleLogging(); - } IContextService service = (IContextService) PlatformUI.getWorkbench() .getService(IContextService.class); - service.activateContext("com.raytheon.uf.viz.application.awips"); + service.activateContext("com.raytheon.uf.viz.application.cave"); } /** @@ -312,34 +288,4 @@ public class VizWorkbenchAdvisor extends WorkbenchAdvisor { DiscoverMenuContributions.discoverContributions(); } - /** - * Toggle whether we are logging or not - */ - private void toggleLogging() { - logPeformance = !logPeformance; - - // add command execution listener - ICommandService service = (ICommandService) PlatformUI.getWorkbench() - .getService(ICommandService.class); - if (logPeformance) { - service.addExecutionListener(performanceListener); - } else { - service.removeExecutionListener(performanceListener); - } - - // add job change listener - IJobManager jobManager = Job.getJobManager(); - if (logPeformance) { - jobManager.addJobChangeListener(jobChangeListener); - } else { - jobManager.removeJobChangeListener(jobChangeListener); - } - } - - @Override - public void preStartup() { - // only restore state if no perspective passed in - getWorkbenchConfigurer().setSaveAndRestore(!singlePerspective); - } - } diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizWorkbenchWindowAdvisor.java b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/VizWorkbenchWindowAdvisor.java similarity index 89% rename from cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizWorkbenchWindowAdvisor.java rename to cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/VizWorkbenchWindowAdvisor.java index 379c265c96..87b6e0e01b 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/VizWorkbenchWindowAdvisor.java +++ b/cave/com.raytheon.uf.viz.personalities.cave/src/com/raytheon/uf/viz/personalities/cave/workbench/VizWorkbenchWindowAdvisor.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.viz.ui.personalities.awips; +package com.raytheon.uf.viz.personalities.cave.workbench; import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.graphics.Point; @@ -32,7 +32,6 @@ import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; -import com.raytheon.uf.viz.ui.menus.widgets.tearoff.TearOffMenuListener; import com.raytheon.viz.ui.dialogs.ModeListener; import com.raytheon.viz.ui.perspectives.AbstractVizPerspectiveManager; import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; @@ -47,7 +46,6 @@ import com.raytheon.viz.ui.statusline.VizActionBarAdvisor; * ------------ ---------- ----------- -------------------------- * 7/1/06 chammack Initial Creation. * Oct 21, 2008 #1450 randerso Fixed to support multipane editors - * Mar 20, 2013 1638 mschenke Removed call to DiscoverMenuContributions as now handled in VizWorkbenchAdvisor * * * @@ -56,8 +54,6 @@ import com.raytheon.viz.ui.statusline.VizActionBarAdvisor; */ public class VizWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { - private boolean singlePerspective; - private VizPerspectiveListener listener; private boolean firstTime = true; @@ -67,10 +63,8 @@ public class VizWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { * * @param configurer */ - public VizWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer, - boolean singlePerspective) { + public VizWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { super(configurer); - this.singlePerspective = singlePerspective; } /* @@ -85,7 +79,6 @@ public class VizWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { configurer.setShowProgressIndicator(true); configurer.setInitialSize(new Point(1024, 768)); // Don't show perspective bar if running a specific perspective? - configurer.setShowPerspectiveBar(!singlePerspective); configurer.setShowCoolBar(true); configurer.setShowStatusLine(true); @@ -135,9 +128,6 @@ public class VizWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { if (perspective != null) { listener.perspectiveActivated(page, perspective); } - - new TearOffMenuListener(VizActionBarAdvisor.getInstance(window) - .getMenuManager()); } /* diff --git a/cave/com.raytheon.uf.viz.product.alertviz/alertviz.product b/cave/com.raytheon.uf.viz.product.alertviz/alertviz.product index aeb66f6041..22fe0dfd63 100644 --- a/cave/com.raytheon.uf.viz.product.alertviz/alertviz.product +++ b/cave/com.raytheon.uf.viz.product.alertviz/alertviz.product @@ -20,7 +20,7 @@ Developed on the Raytheon Visualization Environment (viz) -data @user.home/caveData -user @user.home/caveData -clean -consoleLog - -Xincgc -Xmx256M -Xss2024k -Dosgi.instance.area.readOnly=true -Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook,org.eclipse.core.runtime.internal.adaptor.EclipseErrorHandler -Dorg.eclipse.update.reconcile=false -Dqpid.dest_syntax=BURL -Dorg.eclipse.update.reconcile=false -XX:MaxPermSize=128m -Dorg.eclipse.ui/KEY_CONFIGURATION_ID=com.raytheon.viz.ui.awips.scheme -Dawips.mode=pypies -Dqpid.dest_syntax=BURL -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dlog4j.configuration=log4j-alertviz.xml + -Xincgc -Xms16M -Xmx256M -Xss2024k -Dosgi.instance.area.readOnly=true -Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook,org.eclipse.core.runtime.internal.adaptor.EclipseErrorHandler -Dorg.eclipse.update.reconcile=false -Dqpid.dest_syntax=BURL -Dorg.eclipse.update.reconcile=false -XX:MaxPermSize=128m -Dorg.eclipse.ui/KEY_CONFIGURATION_ID=com.raytheon.viz.ui.awips.scheme -Dawips.mode=pypies -Dqpid.dest_syntax=BURL -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dlog4j.configuration=log4j-alertviz.xml diff --git a/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientWorkbenchAdvisor.java b/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientWorkbenchAdvisor.java index ae0add4bdd..bdf53dec80 100644 --- a/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientWorkbenchAdvisor.java +++ b/cave/com.raytheon.uf.viz.thinclient.cave/src/com/raytheon/uf/viz/thinclient/cave/ThinClientWorkbenchAdvisor.java @@ -29,7 +29,7 @@ import com.raytheon.uf.viz.thinclient.cave.preferences.ThinClientCachePreference import com.raytheon.uf.viz.thinclient.cave.preferences.ThinClientConnectionPreferences; import com.raytheon.uf.viz.thinclient.cave.preferences.ThinClientPreferencePage; import com.raytheon.uf.viz.thinclient.cave.preferences.ThinClientServerPreferences; -import com.raytheon.viz.ui.personalities.awips.VizWorkbenchAdvisor; +import com.raytheon.viz.ui.personalities.awips.AWIPSWorkbenchAdvisor; /** * Thin Client workbench advisor, adds the thin client preference page @@ -49,7 +49,7 @@ import com.raytheon.viz.ui.personalities.awips.VizWorkbenchAdvisor; * @version 1.0 */ -public class ThinClientWorkbenchAdvisor extends VizWorkbenchAdvisor { +public class ThinClientWorkbenchAdvisor extends AWIPSWorkbenchAdvisor { /* * (non-Javadoc) diff --git a/cave/com.raytheon.uf.viz.useradmin.feature/feature.xml b/cave/com.raytheon.uf.viz.useradmin.feature/feature.xml index d0370bc4ab..eda3578435 100644 --- a/cave/com.raytheon.uf.viz.useradmin.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.useradmin.feature/feature.xml @@ -18,7 +18,6 @@ - diff --git a/cave/com.raytheon.viz.avnfps.feature/feature.xml b/cave/com.raytheon.viz.avnfps.feature/feature.xml index e80430dce0..c62664aebc 100644 --- a/cave/com.raytheon.viz.avnfps.feature/feature.xml +++ b/cave/com.raytheon.viz.avnfps.feature/feature.xml @@ -26,7 +26,6 @@ - - - - @@ -175,21 +171,7 @@ version="0.0.0"/> - + - - - - diff --git a/cave/com.raytheon.viz.feature.awips/feature.xml b/cave/com.raytheon.viz.feature.awips/feature.xml index 2cfa1e53a7..21adf22e07 100644 --- a/cave/com.raytheon.viz.feature.awips/feature.xml +++ b/cave/com.raytheon.viz.feature.awips/feature.xml @@ -34,7 +34,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.gfe.feature/feature.xml b/cave/com.raytheon.viz.gfe.feature/feature.xml index 773f55e76b..aaa39de8bb 100644 --- a/cave/com.raytheon.viz.gfe.feature/feature.xml +++ b/cave/com.raytheon.viz.gfe.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.viz.grib.feature/feature.xml b/cave/com.raytheon.viz.grib.feature/feature.xml index a2d20aaebc..26e3d1ac94 100644 --- a/cave/com.raytheon.viz.grib.feature/feature.xml +++ b/cave/com.raytheon.viz.grib.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.viz.hydro.feature/feature.xml b/cave/com.raytheon.viz.hydro.feature/feature.xml index c016d90e58..9b7a71b961 100644 --- a/cave/com.raytheon.viz.hydro.feature/feature.xml +++ b/cave/com.raytheon.viz.hydro.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.viz.product.awips/developer.product b/cave/com.raytheon.viz.product.awips/developer.product index 5374b87bfb..5af9bf8c5d 100644 --- a/cave/com.raytheon.viz.product.awips/developer.product +++ b/cave/com.raytheon.viz.product.awips/developer.product @@ -42,16 +42,15 @@ - jdk1.6.0 - + diff --git a/cave/com.raytheon.viz.product.awips/plugin.xml b/cave/com.raytheon.viz.product.awips/plugin.xml index 3652b63b7e..82db54a5e1 100644 --- a/cave/com.raytheon.viz.product.awips/plugin.xml +++ b/cave/com.raytheon.viz.product.awips/plugin.xml @@ -56,33 +56,4 @@ - - - - - - - - - - - - - - - diff --git a/cave/com.raytheon.viz.radar.feature/feature.xml b/cave/com.raytheon.viz.radar.feature/feature.xml index c8e6b30b0d..ca2662192f 100644 --- a/cave/com.raytheon.viz.radar.feature/feature.xml +++ b/cave/com.raytheon.viz.radar.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.viz.satellite.feature/feature.xml b/cave/com.raytheon.viz.satellite.feature/feature.xml index 3baf8c0d14..5e0f7b4981 100644 --- a/cave/com.raytheon.viz.satellite.feature/feature.xml +++ b/cave/com.raytheon.viz.satellite.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.viz.text.feature/feature.xml b/cave/com.raytheon.viz.text.feature/feature.xml index ded083c729..a455507f1a 100644 --- a/cave/com.raytheon.viz.text.feature/feature.xml +++ b/cave/com.raytheon.viz.text.feature/feature.xml @@ -18,7 +18,6 @@ - diff --git a/cave/com.raytheon.viz.ui.personalities.awips/META-INF/MANIFEST.MF b/cave/com.raytheon.viz.ui.personalities.awips/META-INF/MANIFEST.MF index df286feb86..f545b76526 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.viz.ui.personalities.awips/META-INF/MANIFEST.MF @@ -20,7 +20,8 @@ Require-Bundle: org.eclipse.ui, com.raytheon.uf.common.menus;bundle-version="1.12.1174", com.raytheon.uf.viz.application;bundle-version="1.0.0", com.raytheon.viz.alerts;bundle-version="1.12.1174", - com.raytheon.uf.common.comm;bundle-version="1.12.1174" + com.raytheon.uf.common.comm;bundle-version="1.12.1174", + com.raytheon.uf.viz.personalities.cave;bundle-version="1.0.0";visibility:=reexport Bundle-ActivationPolicy: lazy Bundle-ClassPath: . Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/cave/com.raytheon.viz.ui.personalities.awips/plugin.xml b/cave/com.raytheon.viz.ui.personalities.awips/plugin.xml index 663383e8f3..d6de51394d 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/plugin.xml +++ b/cave/com.raytheon.viz.ui.personalities.awips/plugin.xml @@ -23,158 +23,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + locationURI="menu:file.new"> + - - - - - - - - - - - - - - - - - + + @@ -184,91 +40,8 @@ id="com.raytheon.viz.ui.personalities.awips" name="AWIPS" description="Command category for AWIPS"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -499,7 +61,17 @@ point="org.eclipse.ui.contexts"> + + + + diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchAdvisor.java b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchAdvisor.java index 54832355df..7657ccaf8c 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchAdvisor.java +++ b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchAdvisor.java @@ -19,12 +19,27 @@ **/ package com.raytheon.viz.ui.personalities.awips; +import org.eclipse.core.commands.IExecutionListener; +import org.eclipse.core.runtime.jobs.IJobChangeListener; +import org.eclipse.core.runtime.jobs.IJobManager; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.ui.IPerspectiveDescriptor; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.ui.contexts.IContextService; + import com.raytheon.uf.common.menus.MenuCreationRequest; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.viz.application.ProgramArguments; +import com.raytheon.uf.viz.core.Activator; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.localization.LocalizationManager; +import com.raytheon.uf.viz.core.preferences.PreferenceConstants; import com.raytheon.uf.viz.core.requests.ThriftClient; +import com.raytheon.uf.viz.personalities.cave.workbench.VizWorkbenchAdvisor; /** * AWIPS {@link VizWorkbenchAdvisor} that reqeusts menu creation service to run @@ -46,6 +61,93 @@ import com.raytheon.uf.viz.core.requests.ThriftClient; public class AWIPSWorkbenchAdvisor extends VizWorkbenchAdvisor { + protected boolean logPeformance = false; + + protected IExecutionListener performanceListener; + + protected IJobChangeListener jobChangeListener; + + protected boolean singlePerspective; + + public AWIPSWorkbenchAdvisor() { + performanceListener = CaveCommandExecutionListener.getInstance(); + jobChangeListener = CaveJobChangeListener.getInstance(); + + Activator.getDefault().getPreferenceStore() + .addPropertyChangeListener(new IPropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent event) { + if (PreferenceConstants.P_LOG_PERF.equals(event + .getProperty())) { + Boolean log = (Boolean) event.getNewValue(); + if (log != logPeformance) { + toggleLogging(); + } + } + } + }); + + singlePerspective = ProgramArguments.getInstance().getString( + "-perspective") != null; + } + + @Override + public String getInitialWindowPerspectiveId() { + if (singlePerspective) { + IPerspectiveDescriptor desc = getSpecifiedPerspective(ProgramArguments + .getInstance().getString("-perspective")); + if (desc != null) { + return desc.getId(); + } + } + // Fall back to a reasonable default if not available + return "com.raytheon.uf.viz.d2d.ui.perspectives.D2D5Pane"; + } + + /** + * Toggle whether we are logging or not + */ + private void toggleLogging() { + logPeformance = !logPeformance; + + // add command execution listener + ICommandService service = (ICommandService) PlatformUI.getWorkbench() + .getService(ICommandService.class); + if (logPeformance) { + service.addExecutionListener(performanceListener); + } else { + service.removeExecutionListener(performanceListener); + } + + // add job change listener + IJobManager jobManager = Job.getJobManager(); + if (logPeformance) { + jobManager.addJobChangeListener(jobChangeListener); + } else { + jobManager.removeJobChangeListener(jobChangeListener); + } + } + + /** + * Added by Wufeng Zhou to hook up command execution listener and job + * listener + * + */ + @Override + public void postStartup() { + super.postStartup(); + + Boolean log = Activator.getDefault().getPreferenceStore() + .getBoolean(PreferenceConstants.P_LOG_PERF); + + if (log != logPeformance) { + toggleLogging(); + } + IContextService service = (IContextService) PlatformUI.getWorkbench() + .getService(IContextService.class); + service.activateContext("com.raytheon.uf.viz.application.awips"); + } + @Override protected void createDynamicMenus() { // create the request to send to EDEX to generate the menus @@ -60,4 +162,9 @@ public class AWIPSWorkbenchAdvisor extends VizWorkbenchAdvisor { super.createDynamicMenus(); } + @Override + public void preStartup() { + // only restore state if no perspective passed in + getWorkbenchConfigurer().setSaveAndRestore(!singlePerspective); + } } diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchWindowAdvisor.java b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchWindowAdvisor.java new file mode 100644 index 0000000000..5e3f4cd347 --- /dev/null +++ b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/AWIPSWorkbenchWindowAdvisor.java @@ -0,0 +1,65 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.ui.personalities.awips; + +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; + +import com.raytheon.uf.viz.personalities.cave.workbench.VizWorkbenchWindowAdvisor; + +/** + * AWIPS window advisor, doesn't show perspective bar when -perspective argument + * is used to launch the application + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 15, 2013            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class AWIPSWorkbenchWindowAdvisor extends VizWorkbenchWindowAdvisor { + + private boolean singlePerspective; + + /** + * @param configurer + * @param singlePerspective + */ + public AWIPSWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer, + boolean singlePerspective) { + super(configurer); + this.singlePerspective = singlePerspective; + } + + @Override + public void preWindowOpen() { + super.preWindowOpen(); + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); + configurer.setShowPerspectiveBar(!singlePerspective); + } + +} diff --git a/cave/com.raytheon.viz.volumebrowser.feature/feature.xml b/cave/com.raytheon.viz.volumebrowser.feature/feature.xml index 9338cfa946..59af733309 100644 --- a/cave/com.raytheon.viz.volumebrowser.feature/feature.xml +++ b/cave/com.raytheon.viz.volumebrowser.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/cave/com.raytheon.viz.warngen.feature/feature.xml b/cave/com.raytheon.viz.warngen.feature/feature.xml index f62e6e9d73..8f9efa7233 100644 --- a/cave/com.raytheon.viz.warngen.feature/feature.xml +++ b/cave/com.raytheon.viz.warngen.feature/feature.xml @@ -20,7 +20,6 @@ - diff --git a/ncep/com.raytheon.uf.viz.ncep.core.feature/feature.xml b/ncep/com.raytheon.uf.viz.ncep.core.feature/feature.xml index 5ed79db3d9..32a52106fc 100644 --- a/ncep/com.raytheon.uf.viz.ncep.core.feature/feature.xml +++ b/ncep/com.raytheon.uf.viz.ncep.core.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/ncep/com.raytheon.uf.viz.ncep.nsharp.feature/feature.xml b/ncep/com.raytheon.uf.viz.ncep.nsharp.feature/feature.xml index 5d71e4bd2f..64254aa144 100644 --- a/ncep/com.raytheon.uf.viz.ncep.nsharp.feature/feature.xml +++ b/ncep/com.raytheon.uf.viz.ncep.nsharp.feature/feature.xml @@ -19,7 +19,6 @@ - diff --git a/ncep/com.raytheon.uf.viz.ncep.perspective.feature/feature.xml b/ncep/com.raytheon.uf.viz.ncep.perspective.feature/feature.xml index 18765f021c..4b208f4d11 100644 --- a/ncep/com.raytheon.uf.viz.ncep.perspective.feature/feature.xml +++ b/ncep/com.raytheon.uf.viz.ncep.perspective.feature/feature.xml @@ -19,7 +19,6 @@ -