diff --git a/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTandTd.py b/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTandTd.py index faf5d3a8ed..97eea54aea 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTandTd.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTandTd.py @@ -261,8 +261,7 @@ class Procedure (SmartScript.SmartScript): if checkOnly: self.createGrid(MODEL, "MaxLessThanMin", "SCALAR", mask.astype('float32'), - maxTR, minAllowedValue=0.0, maxAllowedValue= 1.0, - units="", descriptiveName="") + maxTR, minAllowedValue=0.0, maxAllowedValue= 1.0) else: # force the change if maxTR in maxTLocks: msg = "Can't modify MaxT grid at " + str(maxTR) + \ diff --git a/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineStyleDialog.java b/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineStyleDialog.java index a8a78c2af3..a80f70a46e 100644 --- a/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineStyleDialog.java +++ b/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineStyleDialog.java @@ -21,6 +21,8 @@ package com.raytheon.uf.viz.gisdatastore.ui; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.GC; @@ -47,6 +49,7 @@ import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 27, 2012 randerso Initial creation + * Apr 9, 2013 #1860 randerso Fix image disposed issued on Windows * * * @@ -87,7 +90,7 @@ public class LineStyleDialog extends Dialog { continue; } TableItem item = new TableItem(table, SWT.NONE); - Image image = new Image(d, 128, 10); + final Image image = new Image(d, 128, 10); Rectangle bounds = image.getBounds(); int[] dashes = ls.getSWTLineStyle(); GC gc = new GC(image); @@ -98,7 +101,14 @@ public class LineStyleDialog extends Dialog { gc.dispose(); item.setImage(image); - image.dispose(); + item.addDisposeListener(new DisposeListener() { + + @Override + public void widgetDisposed(DisposeEvent e) { + image.dispose(); + } + }); + item.setData(ls); if (ls.equals(this.style)) { diff --git a/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineWidthDialog.java b/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineWidthDialog.java index 4324a567ef..4e5c21aca5 100644 --- a/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineWidthDialog.java +++ b/cave/com.raytheon.uf.viz.gisdatastore/src/com/raytheon/uf/viz/gisdatastore/ui/LineWidthDialog.java @@ -21,6 +21,8 @@ package com.raytheon.uf.viz.gisdatastore.ui; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.GC; @@ -45,6 +47,7 @@ import org.eclipse.swt.widgets.TableItem; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 27, 2012 randerso Initial creation + * Apr 9, 2013 #1860 randerso Fix image disposed issued on Windows * * * @@ -88,7 +91,7 @@ public class LineWidthDialog extends Dialog { for (int w = min; w <= max; w++) { TableItem item = new TableItem(table, SWT.NONE); - Image image = new Image(d, 128, 10); + final Image image = new Image(d, 128, 10); Rectangle bounds = image.getBounds(); GC gc = new GC(image); gc.fillRectangle(bounds); @@ -98,7 +101,13 @@ public class LineWidthDialog extends Dialog { gc.dispose(); item.setImage(image); - image.dispose(); + item.addDisposeListener(new DisposeListener() { + + @Override + public void widgetDisposed(DisposeEvent e) { + image.dispose(); + } + }); item.setData(w); if (w == this.width) { diff --git a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/MenuItemComposite.java b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/MenuItemComposite.java index 2cb401a303..c21d7f2262 100644 --- a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/MenuItemComposite.java +++ b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/MenuItemComposite.java @@ -24,8 +24,6 @@ import java.util.Collections; import java.util.List; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MenuEvent; -import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackAdapter; @@ -46,6 +44,8 @@ import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; +import com.raytheon.uf.viz.ui.menus.widgets.tearoff.TearOffMenuDialog.MenuPathElement; + /** * Holds the information for all the menu items in the dialog * @@ -56,6 +56,7 @@ import org.eclipse.swt.widgets.MenuItem; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 15, 2011 mnash Initial creation + * Apr 10, 2013 DR 15185 D. Friedman Preserve tear-offs over perspective switches. * * * @@ -63,7 +64,7 @@ import org.eclipse.swt.widgets.MenuItem; * @version 1.0 */ -public class MenuItemComposite extends Composite implements MenuListener { +public class MenuItemComposite extends Composite { private boolean separator = false; @@ -74,6 +75,8 @@ public class MenuItemComposite extends Composite implements MenuListener { // backing data for executing listeners private MenuItem item; + private MenuPathElement itemPath; + private Image arrow = null; private Image highlightedArrow = null; @@ -84,8 +87,6 @@ public class MenuItemComposite extends Composite implements MenuListener { private List myPath; - private Menu topMostParent; - /** * @param parent * @param style @@ -108,14 +109,13 @@ public class MenuItemComposite extends Composite implements MenuListener { do { myPath.add(toAdd.getText()); toAdd = parent.getParentItem(); - topMostParent = parent; parent = parent.getParentMenu(); } while (parent.getParentMenu() != null); Collections.reverse(myPath); - topMostParent.addMenuListener(this); item = it; + itemPath = new MenuPathElement(it); String[] labels = item.getText().split("\t"); // handle for a separator menu item @@ -189,6 +189,8 @@ public class MenuItemComposite extends Composite implements MenuListener { * */ private void addItemListeners() { + if (item == null) + return; if (updateListener != null) { item.addListener(SWT.Modify, updateListener); } @@ -209,11 +211,11 @@ public class MenuItemComposite extends Composite implements MenuListener { for (Control comp : firstItem.getParent().getParent() .getChildren()) { MenuItemComposite composite = (MenuItemComposite) comp; - if (composite.item.getText().equals( + if (composite.getItem().getText().equals( ((MenuItem) e.widget).getText())) { if (composite.firstItem instanceof Button) { ((Button) composite.firstItem) - .setSelection(composite.item + .setSelection(composite.getItem() .getSelection()); } } else { @@ -233,7 +235,7 @@ public class MenuItemComposite extends Composite implements MenuListener { @Override public void handleEvent(Event event) { if (secondItem != null && !secondItem.isDisposed()) { - if (item == event.data) { + if (getItem() == event.data) { if (((MenuItem) event.data).getText().split("\t").length > 1) { ((Label) secondItem) .setText(((MenuItem) event.data).getText() @@ -377,6 +379,8 @@ public class MenuItemComposite extends Composite implements MenuListener { MouseAdapter mouseAdapter = new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { + MenuItem item = getItem(); + if (item.getMenu() != null) { // This is item opens a submenu, get the y offset based on // the location of the click @@ -420,7 +424,7 @@ public class MenuItemComposite extends Composite implements MenuListener { for (int i = 0; i < siblings.length; i++) { final MenuItemComposite mic = (MenuItemComposite) siblings[i]; if (mic.separator == false - && mic.item.getStyle() == SWT.RADIO) { + && mic.getItem().getStyle() == SWT.RADIO) { try { MenuItemComposite parent = null; // check whether a Label is clicked or a @@ -434,16 +438,16 @@ public class MenuItemComposite extends Composite implements MenuListener { // check that the radio groups match if (mic.getData("radioGroup").equals( parent.getData("radioGroup"))) { - if (!parent.item + if (!parent.getItem() .getText() .replaceAll("&", "") - .equals(mic.item.getText().replaceAll( + .equals(mic.getItem().getText().replaceAll( "&", ""))) { - mic.item.setSelection(false); + mic.getItem().setSelection(false); ((Button) mic.firstItem) .setSelection(false); } else { - mic.item.setSelection(true); + mic.getItem().setSelection(true); ((Button) mic.firstItem).setSelection(true); } } @@ -476,10 +480,6 @@ public class MenuItemComposite extends Composite implements MenuListener { } } - if (topMostParent != null) { - topMostParent.removeMenuListener(this); - } - super.dispose(); } @@ -489,67 +489,40 @@ public class MenuItemComposite extends Composite implements MenuListener { } } - /* - * (non-Javadoc) - * - * @see - * org.eclipse.swt.events.MenuListener#menuHidden(org.eclipse.swt.events - * .MenuEvent) - */ - @Override - public void menuHidden(MenuEvent e) { - if (item.isDisposed() == false) { - return; - } + private MenuItem getItem() { + MenuItem item = getItemIfAvailable(); + if (item == null) + throw new IllegalStateException( + String.format("Could not find target of tear-off menu item \"%s\"", + itemPath.getName())); + return item; + } - // At some point we may need to check against the index as well but that - // is difficult because we don't know if the tear off menu item will/was - // in the menu when we were created/now so our index could be off by one - // very easily making it unreliable - Menu menu = topMostParent; - MenuItem myItem = null; - String last = myPath.get(myPath.size() - 1); - for (String path : myPath) { - if (menu != null) { - MenuItem[] items = menu.getItems(); - for (int i = 0; i < items.length; ++i) { - MenuItem item = items[i]; - if (path.equals(item.getText())) { - if (path == last) { - myItem = item; - } else { - menu = item.getMenu(); - - if (menu != null && menu.getItemCount() == 0) { - // Have to manually fill menu - for (Listener listener : menu - .getListeners(SWT.Show)) { - Event event = new Event(); - event.type = SWT.Show; - event.widget = menu; - listener.handleEvent(event); - } - } - } - break; - } - } - } - } - if (myItem != null && myItem.isDisposed() == false) { - item = myItem; + private MenuItem getItemIfAvailable() { + if (item == null || item.isDisposed()) { + item = findItem(); addItemListeners(); } + return item; } - /* - * (non-Javadoc) - * - * @see - * org.eclipse.swt.events.MenuListener#menuShown(org.eclipse.swt.events. - * MenuEvent) - */ - @Override - public void menuShown(MenuEvent e) { + private MenuItem findItem() { + Menu menu = getTargetMenu(); + if (menu != null) + return TearOffMenuDialog.findItem(menu, itemPath); + else + return null; } + + private Menu getTargetMenu() { + return getDialog().getTargetMenu(); + } + + private TearOffMenuDialog getDialog() { + return (TearOffMenuDialog) getShell().getData(); + } + + public void reconnect() { + getItemIfAvailable(); + } } \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/PopupMenu.java b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/PopupMenu.java index 6743112002..0a8ce369d7 100644 --- a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/PopupMenu.java +++ b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/PopupMenu.java @@ -27,6 +27,7 @@ import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorPart; import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.editor.AbstractEditor; @@ -41,6 +42,7 @@ import com.raytheon.viz.ui.editor.AbstractEditor; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 5, 2011 mnash Initial creation + * Apr 10, 2013 DR 15185 D. Friedman Do not assume there is an active editor. * * * @@ -88,7 +90,10 @@ public class PopupMenu { mItem.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { - ((AbstractEditor) EditorUtil.getActiveEditor()).refresh(); + IEditorPart editor = EditorUtil.getActiveEditor(); + if (editor instanceof AbstractEditor) { + ((AbstractEditor) editor).refresh(); + } } }); diff --git a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuDialog.java b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuDialog.java index 07dee9696b..ab03d8368d 100644 --- a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuDialog.java +++ b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuDialog.java @@ -19,6 +19,12 @@ **/ package com.raytheon.uf.viz.ui.menus.widgets.tearoff; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.jface.action.ContributionItem; +import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.graphics.Point; @@ -53,6 +59,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; * ------------ ---------- ----------- -------------------------- * Sep 14, 2011 mnash Initial creation * Jan 09, 2013 1442 rferrel Add Simulated Time Change Listener. + * Apr 10, 2013 DR 15185 D. Friedman Preserve tear-offs over perspective switches. * * * @@ -62,7 +69,9 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; public class TearOffMenuDialog extends CaveSWTDialog { - private MenuItem[] items; + private MenuPathElement[] menuPath; + + private Menu menu; private ScrolledComposite scrolledComp; @@ -80,8 +89,9 @@ public class TearOffMenuDialog extends CaveSWTDialog { public TearOffMenuDialog(Menu menu) { super(VizWorkbenchManager.getInstance().getCurrentWindow().getShell(), SWT.DIALOG_TRIM | SWT.RESIZE, CAVE.DO_NOT_BLOCK); + this.menuPath = getMenuPath(menu); + this.menu = menu; String text = menu.getParentItem().getText(); - this.items = menu.getItems(); // handle for the & that makes key bindings setText(text.replace("&", "")); @@ -89,6 +99,7 @@ public class TearOffMenuDialog extends CaveSWTDialog { @Override protected void initializeComponents(final Shell shell) { + shell.setData(this); // allow for scrolling if necessary scrolledComp = new ScrolledComposite(shell, SWT.V_SCROLL); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); @@ -106,6 +117,7 @@ public class TearOffMenuDialog extends CaveSWTDialog { // go through menu items and build MenuItemComposite for each item, // which handles all the selection and color of the "MenuItem" in the // dialog + MenuItem[] items = getTargetMenu().getItems(); int radioGroup = 0; for (int i = 1; i < items.length; i++) { MenuItem item = items[i]; @@ -140,11 +152,10 @@ public class TearOffMenuDialog extends CaveSWTDialog { int y = point.y; shell.setLocation(x, y); - // close the dialog on perspective change - shell.addListener(SWT.Hide, new Listener() { + shell.addListener(SWT.Show, new Listener() { @Override public void handleEvent(Event event) { - close(); + updateItems(); } }); } @@ -204,12 +215,156 @@ public class TearOffMenuDialog extends CaveSWTDialog { * Force update of item's display. */ private void updateItems() { - // items[0] is the tear off object and is not in the dialog's display. - for (int index = 1; index < items.length; ++index) { - MenuItem item = items[index]; + Menu menu = getMenuIfAvailable(); + if (menu == null) + return; + for (MenuItemComposite mic : getMenuItemComposites()) + mic.reconnect(); + for (MenuItem item : menu.getItems()) { if (item.getData() instanceof BundleContributionItem) { ((BundleContributionItem) item.getData()).refreshText(); } } } + + private List getMenuItemComposites() { + List result = new ArrayList(); + for (Control c : fullComp.getChildren()) { + if (c instanceof MenuItemComposite) + result.add((MenuItemComposite) c); + } + return result; + } + + /** + * Return the portion of a menu item's title that should not change over + * time + * + */ + private static String getCleanMenuItemText(String text) { + int pos = text.indexOf('\t'); + if (pos >= 0) + return text.substring(0, pos); + else + return text; + } + + private Menu getMenuIfAvailable() { + if (menu == null || menu.isDisposed()) { + menu = findMenu(); + } + return menu; + } + + /*package*/ Menu getTargetMenu() { + Menu menu = getMenuIfAvailable(); + if (menu == null) { + throw new IllegalStateException( + String.format("Tear-off menu %s is not available", shell.getText())); + } + if (menu.getItems().length == 0) + tryToFillMenu(menu); + return menu; + } + + private void tryToFillMenu(Menu menu) { + /* + * Menu may not have been created so call listeners. This still does + * not work if all of the menu items need the workbench window to be + * active in order to be enabled. + */ + + Shell shell = this.shell.getParent().getShell(); + shell.setActive(); + while (shell.getDisplay().readAndDispatch()) { + // nothing + } + + Event event = new Event(); + event.type = SWT.Show; + menu.notifyListeners(SWT.Show, event); + event = new Event(); + event.type = SWT.Hide; + menu.notifyListeners(SWT.Hide, event); + } + + private Menu findMenu() { + /* NOTE: Assuming shell.getParent().getShell() is the workbench window. */ + Menu container = shell.getParent().getShell().getMenuBar(); + MenuPathElement lastPathElement = null; + for (int i = 0; i < menuPath.length; ++i) { + MenuItem mi = findItem(container, menuPath[i]); + if (mi == null) + return null; + Menu mim = mi.getMenu(); + if (mim == null) + throw new IllegalStateException(String.format( + "Could not get target menu \"%s\" in %s", + menuPath[i].getName(), lastPathElement != null ? + '"' + lastPathElement.getName() + '"' : "menu bar")); + tryToFillMenu(mim); + container = mim; + lastPathElement = menuPath[i]; + } + return container; + } + + /** + * Identifies a specific item in an SWT menu. It has been observed that + * associated data of a menu item maintains the same identity during a CAVE + * session even if the MenuItem is recreated. However, the associated + * data is not always unique. Menu item text is used to differentiate. + */ + static class MenuPathElement { + Object data; + String cleanText; + public MenuPathElement(MenuItem item) { + data = item.getData(); + cleanText = getCleanMenuItemText(item.getText()); + } + public int getMatchLevel(MenuItem item) { + int level = 0; + if (item.getData() == data) + ++level; + if (cleanText.equals(item.getText())) + ++level; + return level; + } + public String getName() { + if (cleanText != null && cleanText.length() > 0) + return cleanText; + Object value = data; + if (value instanceof MenuManager) + value = ((MenuManager) value).getId(); + else if (value instanceof ContributionItem) + value = ((ContributionItem) value).getId(); + return String.valueOf(value); + } + } + + /*package*/ static MenuItem findItem(Menu menu, MenuPathElement pe) { + MenuItem best = null; + int bestLevel = 0; + for (MenuItem item : menu.getItems()) { + int matchLevel = pe.getMatchLevel(item); + if (matchLevel > bestLevel) { + bestLevel = matchLevel; + best = item; + } + } + return best; + } + + private static MenuPathElement[] getMenuPath(Menu menu) { + ArrayList data = new ArrayList(); + while (menu != null) { + MenuItem mi = menu.getParentItem(); + if (mi == null) + break; + data.add(new MenuPathElement(mi)); + menu = menu.getParentMenu(); + } + Collections.reverse(data); + return data.toArray(new MenuPathElement[data.size()]); + } } diff --git a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuListener.java b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuListener.java index 529d26777a..f486955279 100644 --- a/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuListener.java +++ b/cave/com.raytheon.uf.viz.ui.menus/src/com/raytheon/uf/viz/ui/menus/widgets/tearoff/TearOffMenuListener.java @@ -39,6 +39,11 @@ import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; +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.viz.ui.VizWorkbenchManager; + /** * Menu listener that adds item to menu which will open dialog which is the menu * @@ -49,6 +54,7 @@ import org.eclipse.swt.widgets.MenuItem; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 14, 2011 mschenke Initial creation + * Apr 10, 2013 DR 15185 D. Friedman Preserve tear-offs over perspective switches. * * * @@ -66,6 +72,9 @@ public class TearOffMenuListener implements IMenuListener2 { public static final String TEAROFF_PREFERENCE_ID = "tearoffmenus"; + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(TearOffMenuListener.class); + private static boolean enabled; static { final IPreferenceStore store = com.raytheon.uf.viz.core.Activator @@ -94,7 +103,7 @@ public class TearOffMenuListener implements IMenuListener2 { @Override public void menuAboutToShow(final IMenuManager manager) { register(manager.getItems(), this); - if (openDialogs.contains(getKey(manager)) == false) { + if (openDialogs.contains(getPerspectiveKey(manager)) == false) { // We need to add our item to be first so we need to remove others // then add ourself IContributionItem[] items = manager.getItems(); @@ -112,7 +121,7 @@ public class TearOffMenuListener implements IMenuListener2 { */ @Override public void menuAboutToHide(IMenuManager manager) { - if (openDialogs.contains(getKey(manager)) == false) { + if (openDialogs.contains(getPerspectiveKey(manager)) == false) { manager.remove(ID); manager.remove(ACTION_ID); unregister(manager.getItems(), this); @@ -137,6 +146,16 @@ public class TearOffMenuListener implements IMenuListener2 { } } + private Object getPerspectiveKey(IMenuManager manager) { + String perspectiveId = ""; + try { + perspectiveId = VizWorkbenchManager.getInstance().getCurrentWindow().getActivePage().getPerspective().getId(); + } catch (Exception e) { + statusHandler.handle(Priority.EVENTA, "Failed to get current perspective ID", e); + } + return perspectiveId + "::" + getKey(manager); + } + private static Object getKey(IMenuManager manager) { Object key = manager; if (manager.getId() != null) { @@ -215,17 +234,18 @@ public class TearOffMenuListener implements IMenuListener2 { */ @Override public void run() { + final Object key = getPerspectiveKey(manager); TearOffMenuDialog dialog = new TearOffMenuDialog(menu); dialog.addListener(SWT.Dispose, new Listener() { @Override public void handleEvent(Event event) { - openDialogs.remove(getKey(manager)); + openDialogs.remove(key); manager.remove(ID); manager.remove(ACTION_ID); unregister(manager.getItems(), TearOffMenuListener.this); } }); - openDialogs.add(getKey(manager)); + openDialogs.add(key); register(manager.getItems(), TearOffMenuListener.this); dialog.open(); } diff --git a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/action/TimeOfArrivalAction.java b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/action/TimeOfArrivalAction.java index d638221c72..210f5b5986 100644 --- a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/action/TimeOfArrivalAction.java +++ b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/action/TimeOfArrivalAction.java @@ -19,9 +19,12 @@ **/ package com.raytheon.viz.awipstools.ui.action; +import java.util.List; + +import com.raytheon.uf.viz.core.IDisplayPane; +import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource.ResourceStatus; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.tools.AwipsToolsResourceData; import com.raytheon.uf.viz.core.rsc.tools.action.AbstractMapToolAction; @@ -35,6 +38,7 @@ import com.raytheon.viz.awipstools.ui.layer.TimeOfArrivalLayer; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 07DEC2007 #496 Eric Babin Initial Creation. + * Apr 12 2013 DR 16032 D. Friedman Make it work in multiple panes. * * * @@ -45,10 +49,6 @@ import com.raytheon.viz.awipstools.ui.layer.TimeOfArrivalLayer; public class TimeOfArrivalAction extends AbstractMapToolAction { - private TimeOfArrivalLayer layer = null; - - private AwipsToolsResourceData data = null; - /* * (non-Javadoc) * @@ -57,22 +57,40 @@ public class TimeOfArrivalAction extends */ @Override protected AwipsToolsResourceData getResourceData() { - if (data == null) { - data = new AwipsToolsResourceData( + return new AwipsToolsResourceData( TimeOfArrivalLayer.NAME, TimeOfArrivalLayer.class); - } - return data; } @Override protected TimeOfArrivalLayer getResource(LoadProperties loadProperties, IDescriptor descriptor) throws VizException { - if (layer == null || layer.getStatus() == ResourceStatus.DISPOSED) { - layer = super.getResource(loadProperties, descriptor); - } else { - layer.reopenDialog(); - } + TimeOfArrivalLayer layer = getExistingResource(); + if (layer == null) + return super.getResource(loadProperties, descriptor); + + VizApp.runAsync( new Runnable() { + @Override + public void run() { + TimeOfArrivalLayer layer = getExistingResource(); + if (layer != null) { + layer.makeEditableAndReopenDialog(); + } + } + }); return layer; } + private TimeOfArrivalLayer getExistingResource() { + IDisplayPane[] panes = getSelectedPanes(); + if (panes != null && panes.length > 0) { + List layers = null; + layers = panes[0].getDescriptor().getResourceList() + .getResourcesByTypeAsType(TimeOfArrivalLayer.class); + if (layers.size() > 0) { + return layers.get(0); + } + } + return null; + } + } diff --git a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/TimeOfArrivalLayer.java b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/TimeOfArrivalLayer.java index 4e98e5378a..6f80d3f216 100644 --- a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/TimeOfArrivalLayer.java +++ b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/TimeOfArrivalLayer.java @@ -71,6 +71,7 @@ import com.raytheon.viz.awipstools.common.stormtrack.StormTrackUIManager; import com.raytheon.viz.awipstools.ui.dialog.TimeOfArrivalDialog; import com.raytheon.viz.core.rsc.jts.JTSCompiler; import com.raytheon.viz.ui.VizWorkbenchManager; +import com.raytheon.viz.ui.input.EditableManager; import com.raytheon.viz.ui.input.InputAdapter; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; @@ -98,6 +99,7 @@ import com.vividsolutions.jts.geom.GeometryFactory; * left-to-right if there is not enough room * for the text to the left of the point. * 15Mar2013 15693 mgamazaychikov Added magnification capability. + * Apr 12 2013 DR 16032 D. Friedman Make it work in multiple panes. * * * @author mschenke @@ -256,7 +258,6 @@ public class TimeOfArrivalLayer extends AbstractStormTrackResource { this.pdProps.setMaxDisplayWidth(TimeOfArrivalLayer.PD_MAX_WIDTH); timeFormat.setTimeZone(TimeZone.getTimeZone("GMT")); - reopenDialog(); leadState = new LeadTimeState(); shell = VizWorkbenchManager.getInstance().getCurrentWindow().getShell(); @@ -272,6 +273,7 @@ public class TimeOfArrivalLayer extends AbstractStormTrackResource { if (container != null) { container.registerMouseHandler(adapter); } + reopenDialog(); } @Override @@ -565,20 +567,20 @@ public class TimeOfArrivalLayer extends AbstractStormTrackResource { */ public void reopenDialog() { // Open the dialog - if (dialog == null || dialog.getShell() == null - || dialog.getShell().isDisposed()) { - VizApp.runAsync(new Runnable() { + VizApp.runAsync(new Runnable() { - @Override - public void run() { + @Override + public void run() { + if (dialog == null || dialog.getShell() == null + || dialog.getShell().isDisposed()) { dialog = new TimeOfArrivalDialog(VizWorkbenchManager .getInstance().getCurrentWindow().getShell(), TimeOfArrivalLayer.this); dialog.setBlockOnOpen(false); dialog.open(); } - }); - } + } + }); } private void updateLeadTimeState() { @@ -678,4 +680,9 @@ public class TimeOfArrivalLayer extends AbstractStormTrackResource { } leadState.changed = false; } + + public void makeEditableAndReopenDialog() { + EditableManager.makeEditable(this, true); + reopenDialog(); + } } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java index fd4eb09274..abaf9325c4 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/AbstractParmManager.java @@ -1,19 +1,19 @@ /** * 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. **/ @@ -80,13 +80,13 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModuleJobPool; /** * Implements common parm manager functionality shared between concrete and mock * implementations. - * + * *
  * SOFTWARE HISTORY
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * 03/26/2008              chammack    Split non-mock code from MockParmManager
- * 02/23/2012    #346      dgilling    Dispose of VCParms from this class's 
+ * 02/23/2012    #346      dgilling    Dispose of VCParms from this class's
  *                                     dispose method.
  * 02/23/2012    #346      dgilling    Ensure all Parms are disposed when calling
  *                                     dispose method.
@@ -101,9 +101,11 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModuleJobPool;
  * 01/22/2013    #1515     dgilling    Increase default size of VCModule thread pool
  *                                     to decrease UI hang-ups waiting for results.
  * 03/20/2013    #1774     randerso    Code cleanup
- * 
+ * 04/11/2013    16028     ryu         Fixed setParmsRemoveISCDeps() to not remove
+ *                                     modified parms.
+ *
  * 
- * + * * @author chammack * @version 1.0 */ @@ -419,7 +421,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#dispose() */ @Override @@ -491,14 +493,14 @@ public abstract class AbstractParmManager implements IParmManager { /** * Return the DataManager - * + * * @return the dataManager */ protected abstract DataManager getDataManager(); /* * (non-Javadoc) - * + * * @see java.lang.Object#finalize() */ @Override @@ -509,7 +511,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Recalculate the system time range using the total time span of all * displayed parms and their locks - * + * * @return the system time range */ protected TimeRange recalcSystemTimeRange() { @@ -571,7 +573,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.parm.IParmManager#getLockedParms() */ @Override @@ -593,7 +595,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.parm.IParmManager#getParm(com.raytheon.viz. * gfe.core.parm.ParmID) @@ -615,7 +617,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.parm.IParmManager#getUndisplayedParms() */ @Override @@ -630,7 +632,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getSelectedParms() */ @Override @@ -653,7 +655,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getModifiedParms() */ @Override @@ -676,7 +678,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Returns a matching parm * (creates if necessary) for the given expression * and database id. - * + * * @param dbid * the database * @param exprName @@ -810,7 +812,7 @@ public abstract class AbstractParmManager implements IParmManager { * Helper function for setParms. Takes the toBeLoaded and * removeParms lists, calculates non-visible ISC dependencies, and then * returns the updated lists through the calling arguments. - * + * * @param toBeLoaded * @param removeParms */ @@ -822,7 +824,8 @@ public abstract class AbstractParmManager implements IParmManager { List depParms = dependentParms(removeList.get(i), true); for (ParmID pid : depParms) { int index = pivdIndex(toBeLoaded, pid); - if ((index != -1) && (!toBeLoaded.get(index).isVisible())) { + if ((index != -1) && (!toBeLoaded.get(index).isVisible()) + && (!getParm(toBeLoaded.get(index).getParmID()).isModified())) { removeList.add(toBeLoaded.get(index).getParmID()); toBeLoaded.remove(index); } @@ -840,7 +843,7 @@ public abstract class AbstractParmManager implements IParmManager { * Helper function for setParms. Takes the toBeLoaded, * addedParms, removeParms, and modParms lists, calculates dependencies, and * then returns the updated lists through the calling arguments. - * + * * @param toBeLoaded * @param addParms * @param removeParms @@ -935,7 +938,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Actual parm creation mechanism - * + * * @param pid * parm id * @param mutableParm @@ -948,20 +951,20 @@ public abstract class AbstractParmManager implements IParmManager { boolean mutableParm, boolean displayable) throws GFEServerException; /** - * + * * Command to create/remove parms based on ParmID. For additions, the Map * contains the ParmID and visibility. - * + * * implementation --------------------------------------------------------- * Note: addParms, removeParms is modified within this routine, thus they * are not passed in as const references. - * + * * Routine converts the ParmIDs into Parms*. Special cases for VCParms, * since they need to load other parms possibly. Thus the input add and * remove may not result in the same parms being created and destroyed. * ------ * --------------------------------------------------------------------- - * + * * @param addParms * @param removeParms */ @@ -1084,7 +1087,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Command to create/remove parms based on ParmID. - * + * * @param addParms * the parms to add * @param removeParms @@ -1098,7 +1101,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#getParmInExpr(java.lang.String, * boolean, com.raytheon.viz.gfe.core.parm.Parm) @@ -1150,7 +1153,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.parm.IParmManager#getDisplayedParms() */ @Override @@ -1171,7 +1174,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#setDisplayedParms(com.raytheon * .edex.plugin.gfe.db.objects.ParmID[]) @@ -1275,7 +1278,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.msgs.IParmIDChangedListener#parmIDChanged(com * .raytheon.viz.gfe.core.parm.Parm, @@ -1291,7 +1294,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @seecom.raytheon.viz.gfe.core.msgs.IParmInventoryChangedListener# * parmInventoryChanged(com.raytheon.viz.gfe.core.parm.Parm, * com.raytheon.uf.common.time.TimeRange) @@ -1315,7 +1318,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.msgs.ILockTableChangedListener#lockTableChanged * (com.raytheon.viz.gfe.core.parm.Parm, @@ -1333,7 +1336,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addDisplayedParmListChangedListener * (com.raytheon.viz.gfe.core.msgs.IDisplayedParmListChangedListener) @@ -1346,7 +1349,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeDisplayedParmListChangedListener * (com.raytheon.viz.gfe.core.msgs.IDisplayedParmListChangedListener) @@ -1359,7 +1362,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addParmListChangedListener(com * .raytheon.viz.gfe.core.msgs.IParmListChangedListener) @@ -1372,7 +1375,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeParmListChangedListener( * com.raytheon.viz.gfe.core.msgs.IParmListChangedListener) @@ -1384,7 +1387,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addParmIDChangedListener(com.raytheon * .viz.gfe.core.msgs.IParmIDChangedListener) @@ -1396,7 +1399,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeParmIDChangedListener(com * .raytheon.viz.gfe.core.msgs.IParmIDChangedListener) @@ -1408,7 +1411,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addSystemTimeRangeChangedListener * (com.raytheon.viz.gfe.core.msgs.ISystemTimeRangeChangedListener) @@ -1421,7 +1424,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeSystemTimeRangeChangedListener * (com.raytheon.viz.gfe.core.msgs.ISystemTimeRangeChangedListener) @@ -1434,7 +1437,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addAvailableSourcesChangedListener * (com.raytheon.viz.gfe.core.msgs.IAvailableSourcesChangedListener) @@ -1447,7 +1450,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addNewModelAvailableListener(com * .raytheon.viz.gfe.core.msgs.INewModelAvailableListener) @@ -1459,7 +1462,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeAvailableSourcesChangedListener * (com.raytheon.viz.gfe.core.msgs.IAvailableSourcesChangedListener) @@ -1472,7 +1475,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeNewModelAvailableListener * (com.raytheon.viz.gfe.core.msgs.INewModelAvailableListener) @@ -1485,7 +1488,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the displayed parm list changed listener - * + * * @param parms * complete list of parms * @param adds @@ -1512,7 +1515,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the ParmID changed event. - * + * * @param parm * The parm which had its ParmID change * @param newParmId @@ -1535,7 +1538,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the parm list changed listener - * + * * @param parms * complete list of parms * @param adds @@ -1561,7 +1564,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the system time range changed listener - * + * * @param systemTimeRange * new system time range */ @@ -1583,7 +1586,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the available sources changed event. - * + * * @param inventory * The complete inventory * @param deletions @@ -1612,7 +1615,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the new model available event. - * + * * @param additions * The DatabaseID of the newly-available model */ @@ -1633,7 +1636,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Return a list of ParmIDs for a list of Parms - * + * * @param parms * @return */ @@ -1649,7 +1652,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#getParms(com.raytheon.uf.common * .dataplugin.gfe.db.objects.ParmID[]) @@ -1667,7 +1670,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Return a list of Parms for a list of ParmIDs with nulls in place of parms * that are not loaded. - * + * * @param parmIDs * @return */ @@ -1685,7 +1688,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getAllAvailableParms() */ @Override @@ -1701,7 +1704,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#setParmDisplayable(com.raytheon * .viz.gfe.core.parm.Parm, boolean) @@ -1727,7 +1730,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#deallocateUnusedGrids(int) */ @Override @@ -1794,7 +1797,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getProductDB() */ @Override @@ -1805,7 +1808,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Filters out a complete list of databaseIDs to those only allowed by the * dbCatagories in the gfeConfig. Sorts the final list. - * + * * @param dbIds * The list of DatabaseIDs to filter * @return A sorted list of DatabseIDs that are GRID types and match the @@ -1832,7 +1835,7 @@ public abstract class AbstractParmManager implements IParmManager { * mutable model, plus all other databases identified by the database * categories specified in the gfeConfig. The databases are filtered by * projection also, since the GFE can only handle one projection. - * + * * @return A filtered list of available databases. */ private List getDatabaseInventory() { @@ -1852,7 +1855,7 @@ public abstract class AbstractParmManager implements IParmManager { * This function is called when the list of available database has changed. * The list of available parms is updated based on the list of additions and * deletions. - * + * * @param deletions * The items being removed from the inventory * @param additions @@ -1886,7 +1889,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#updateModel(com.raytheon.uf.common * .dataplugin.gfe.db.objects.DatabaseID) @@ -1996,7 +1999,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#deleteTemporaryParms() */ @Override @@ -2069,7 +2072,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Returns the Virtual Parm index into vcModules for the given ParmID. - * + * * @param pid * ParmID to search for. * @return The index of the ParmID if it is in vcModules. Else, -1. diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java index b6854ff0be..bf2c07e451 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java @@ -1,19 +1,19 @@ /** * 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. **/ @@ -62,7 +62,7 @@ import com.raytheon.viz.gfe.smarttool.script.SmartToolController; /** * Ported from Tool.py - * + * *
  * SOFTWARE HISTORY
  * Date         Ticket#    Engineer    Description
@@ -71,9 +71,10 @@ import com.raytheon.viz.gfe.smarttool.script.SmartToolController;
  * Jan 08, 2013  1486      dgilling    Support changes to BaseGfePyController.
  * 02/14/2013              mnash       Change QueryScript to use new Python concurrency
  * 02/20/2013        #1597 randerso    Added logging to support GFE Performance metrics
- * 
+ * 04/10/2013    16028     ryu         Check for null seTime in execute()
+ *
  * 
- * + * * @author njensen * @version 1.0 */ @@ -109,7 +110,7 @@ public class Tool { /** * Constructor - * + * * @param aParmMgr * the parm manager * @param aToolName @@ -142,7 +143,7 @@ public class Tool { /** * Returns the objects that should be passed to the smart tool in python - * + * * @param args * the names of the arguments * @param gridTimeRange @@ -225,7 +226,7 @@ public class Tool { /** * Returns the attribute for a particular parm's name - * + * * @param arg * the name of the parm * @param attrStr @@ -260,7 +261,7 @@ public class Tool { /** * Returns the grid data for the specified parameters - * + * * @param arg * the name of the parm * @param mode @@ -309,7 +310,7 @@ public class Tool { /** * Returns the grid history corresponding to the parm name and time range - * + * * @param arg * the name of the parm * @param gridTimeRange @@ -349,7 +350,7 @@ public class Tool { /** * Returns the grid info corresponding to the parm name and time range - * + * * @param arg * the name of the parm * @param gridTimeRange @@ -383,7 +384,7 @@ public class Tool { /** * Executes a smart tool - * + * * @param toolName * the name of the tool * @param inputParm @@ -490,7 +491,8 @@ public class Tool { final Date timeInfluence; Date seTime = DataManagerUIFactory.getCurrentInstance() .getSpatialDisplayManager().getSpatialEditorTime(); - if (grids.length == 1 && grid.getGridTime().contains(seTime)) { + if (seTime != null && + grids.length == 1 && grid.getGridTime().contains(seTime)) { timeInfluence = seTime; } else { timeInfluence = grid.getGridTime().getStart(); @@ -579,7 +581,7 @@ public class Tool { /** * Executes the numeric smart tool - * + * * @param parmToEdit * the parm to edit * @param first @@ -651,7 +653,7 @@ public class Tool { /** * Cleans up a smart tool execution or failure and displays any missing data * message - * + * * @param parmToEdit * the parm to edit * @param save diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java index 990b6cc7df..231b98d211 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java @@ -78,6 +78,7 @@ import com.vividsolutions.jts.geom.Coordinate; * ------------ ---------- ----------- -------------------------- * Aug 03, 2010 mnash Initial creation * MAR 05, 2013 15313 kshresth Added sampling for DMD + * Apr 11, 2013 DR 16030 D. Friedman Fix NPE. * * * @@ -414,7 +415,7 @@ public class AbstractRadarResource extends displayedData.append("@" + dataMap.get("Azimuth")); } - if (!dataMap.get("Mnemonic").equalsIgnoreCase("DMD")) + if (!"DMD".equalsIgnoreCase(dataMap.get("Mnemonic"))) { if (labels.contains(InspectLabels.ICAO)) { displayedData.append(' ').append(dataMap.get("ICAO")); diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/widgets/DateTimeEntry.java b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/widgets/DateTimeEntry.java index e0cd1ddc0b..d68b7622d3 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/widgets/DateTimeEntry.java +++ b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/widgets/DateTimeEntry.java @@ -27,6 +27,8 @@ import java.util.TimeZone; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; @@ -50,7 +52,8 @@ import com.raytheon.viz.ui.dialogs.AwipsCalendar; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Dec 6, 2012 randerso Initial creation + * Dec 6, 2012 randerso Initial creation + * Apr 9, 2013 #1860 randerso Fix image disposed issued on Windows * * * @@ -110,9 +113,15 @@ public class DateTimeEntry extends Composite { Button button = new Button(this, SWT.PUSH); ImageDescriptor imageDesc = UiPlugin .getImageDescriptor("icons/calendar.gif"); - Image image = imageDesc.createImage(); + final Image image = imageDesc.createImage(); button.setImage(image); - image.dispose(); + button.addDisposeListener(new DisposeListener() { + + @Override + public void widgetDisposed(DisposeEvent e) { + image.dispose(); + } + }); button.addSelectionListener(new SelectionAdapter() { @Override diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java index 26fb99573a..efe7626d00 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java @@ -167,6 +167,7 @@ import com.vividsolutions.jts.io.WKTReader; * 04/03/2013 1858 jsanchez Handled creating follow up warnings when created before 0z but issued after 0z. * 03/13/2013 DR 15942 Qinglu Lin Added code to prevent small area from being toggled on that * does not meet inclusionPercent/inclusionArea criteria. + * 04/10/2013 DR 16044 D. Friedman Fix NPE in getAllFipsInArea. * * * @author mschenke @@ -2600,7 +2601,7 @@ public class WarngenLayer extends AbstractStormTrackResource { Set fipsIds = new HashSet(); for (int n = 0; n < warningArea.getNumGeometries(); ++n) { Geometry area = warningArea.getGeometryN(n); - fipsIds.add(getFips(((CountyUserData) area.getUserData()).entry)); + fipsIds.add(getFips(area)); } return fipsIds; }