diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/AWIPSHeaderBlockDlg.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/AWIPSHeaderBlockDlg.java index c577058570..dfdad3b7fd 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/AWIPSHeaderBlockDlg.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/AWIPSHeaderBlockDlg.java @@ -23,6 +23,7 @@ package com.raytheon.viz.texteditor.dialogs; import java.util.ArrayList; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusEvent; @@ -46,7 +47,6 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; import com.raytheon.uf.common.dataplugin.text.AfosWmoIdDataContainer; import com.raytheon.uf.common.dataplugin.text.db.AfosToAwips; @@ -64,6 +64,7 @@ import com.raytheon.viz.texteditor.msgs.IAfosIdSelectionCallback; import com.raytheon.viz.texteditor.msgs.IWmoIdSelectionCallback; import com.raytheon.viz.texteditor.util.TextEditorUtil; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; +import com.raytheon.viz.ui.dialogs.ICloseCallback; /** * Dialog that allows the user to edit the AWIPS header block. @@ -72,8 +73,8 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; * * SOFTWARE HISTORY * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- * 9/13/07 368 lvenable Initial creation. * 10/11/2007 482 grichard Reformatted file. * 10/18/2007 482 grichard Implemented build 9 features. @@ -91,7 +92,8 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; * 05/30/2012 15046 D.Friedman Always set addressee field to ALL. * 06/19/2012 14975 D.Friedman Run callback when dialog is dismissed. * 07/26/2012 15171 rferrel Disable editor's send and clear AFOS PIL fields when - * invalid product Id and user want to edit it anyway, + * invalid product Id and user want to edit it anyway. + * 09/20/2012 1196 rferrel Changing dialogs being called to not block. * * * @author lvenable @@ -104,12 +106,12 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements /** * WMO data type and area indicator text field. */ - private Text wmoTtaaiiTF; + private StyledText wmoTtaaiiTF; /** * International location indicator text field. */ - private Text ccccTF; + private StyledText ccccTF; /** * Combo box Type of message/indicator group. @@ -124,23 +126,23 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements /** * AFOS site ID text field. */ - private Text wsfoIdTF; + private StyledText wsfoIdTF; /** * Product category text field. */ - private Text prodCatTF; + private StyledText prodCatTF; /** * Product designator text field. */ - private Text prodDesignatorTF; + private StyledText prodDesignatorTF; /** * Address text field. Defines the site where a text product or message is * sent. */ - private Text addresseeTF; + private StyledText addresseeTF; /** * Zeros button. Puts "000" into the addressee text field. Zeros indicates @@ -247,7 +249,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements // Create the WMO ID text field. GridData gd = new GridData(55, SWT.DEFAULT); - wmoTtaaiiTF = new Text(wmoIdComp, SWT.BORDER); + wmoTtaaiiTF = new StyledText(wmoIdComp, SWT.BORDER); wmoTtaaiiTF.setTextLimit(6); wmoTtaaiiTF.setLayoutData(gd); @@ -264,7 +266,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements // Create the international location indicator text field. gd = new GridData(45, SWT.DEFAULT); - ccccTF = new Text(wmoIdComp, SWT.BORDER); + ccccTF = new StyledText(wmoIdComp, SWT.BORDER); ccccTF.setTextLimit(4); ccccTF.setLayoutData(gd); if (textProd != null && textProd.getSite() != null) { @@ -377,7 +379,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements // Create the WSFO ID text field. GridData gd = new GridData(45, SWT.DEFAULT); - wsfoIdTF = new Text(afosIdComp, SWT.BORDER); + wsfoIdTF = new StyledText(afosIdComp, SWT.BORDER); wsfoIdTF.setTextLimit(3); wsfoIdTF.setLayoutData(gd); @@ -386,7 +388,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements // Create the Product category text field. gd = new GridData(45, SWT.DEFAULT); - prodCatTF = new Text(afosIdComp, SWT.BORDER); + prodCatTF = new StyledText(afosIdComp, SWT.BORDER); prodCatTF.setTextLimit(3); prodCatTF.setLayoutData(gd); @@ -395,7 +397,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements // Create the product designator text field. gd = new GridData(45, SWT.DEFAULT); - prodDesignatorTF = new Text(afosIdComp, SWT.BORDER); + prodDesignatorTF = new StyledText(afosIdComp, SWT.BORDER); prodDesignatorTF.setTextLimit(3); prodDesignatorTF.setLayoutData(gd); prodDesignatorTF.addFocusListener(new FocusListener() { @@ -409,7 +411,13 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements while (sb.length() < 3) { sb.append(' '); } - prodDesignatorTF.setText(sb.toString()); + + // Only trigger the modification listener when there is a + // real change. + String value = sb.toString(); + if (!value.equals(prodDesignatorTF.getText())) { + prodDesignatorTF.setText(value); + } } } @@ -460,7 +468,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements addresseeComp.setLayout(rowLayout); RowData rd = new RowData(45, SWT.DEFAULT); - addresseeTF = new Text(addresseeComp, SWT.BORDER); + addresseeTF = new StyledText(addresseeComp, SWT.BORDER); addresseeTF.setTextLimit(4); addresseeTF.setLayoutData(rd); // Set the "default" addressee to "ALL". @@ -471,8 +479,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements // text field. addresseeTF.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { - if (addresseeTF.getCaretPosition() == addresseeTF - .getTextLimit()) { + if (addresseeTF.getCaretOffset() == addresseeTF.getTextLimit()) { wmoTtaaiiTF.setFocus(); } @@ -564,13 +571,17 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements } else { lookupWmoIDs(); - if (prodDesignatorTF.getCaretPosition() == prodDesignatorTF - .getTextLimit()) { - addresseeTF.setFocus(); + if (!isDisposed()) { + if (prodDesignatorTF.getCaretOffset() == prodDesignatorTF + .getTextLimit()) { + addresseeTF.setFocus(); + } } } - checkEnableEnter(); + if (!isDisposed()) { + checkEnableEnter(); + } } }); } @@ -757,6 +768,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements shell, this, afosIds); dlg.setBlockOnOpen(true); dlg.open(); + return; } else if (list.size() == 1) { setAfosId(list.get(0).getAfosid()); } else { @@ -820,8 +832,16 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements WmoIdSelectionDialog dlg = new WmoIdSelectionDialog( shell, this, ttaaiiIds, ccccIds); - dlg.setBlockOnOpen(true); + dlg.setBlockOnOpen(false); + dlg.setCloseCallback(new ICloseCallback() { + + @Override + public void dialogClosed(Object returnValue) { + lookupAllowed = true; + } + }); dlg.open(); + return; } else if (list.size() == 1) { AfosToAwips id = list.get(0); setWmoId(id.getWmottaaii(), id.getWmocccc()); @@ -839,7 +859,6 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements statusHandler.handle(Priority.PROBLEM, "Error occurred looking up WMO IDs", e); } - lookupAllowed = true; } } @@ -889,8 +908,8 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements enterBtn.setEnabled(enable); } - private void textFieldKeyListener(final Text tf, final Text previousTF, - final Text nextTF) { + private void textFieldKeyListener(final StyledText tf, + final StyledText previousTF, final StyledText nextTF) { tf.addKeyListener(new KeyAdapter() { @Override @@ -898,7 +917,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements char c = e.character; if (Character.isLetterOrDigit(c) || Character.isSpaceChar(c)) { - int pos = tf.getCaretPosition(); + int pos = tf.getCaretOffset(); String text = tf.getText(); if (text.length() > pos) { @@ -909,16 +928,16 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements } } else if (e.keyCode == SWT.ARROW_UP) { previousTF.setFocus(); - previousTF.setSelection(0); + previousTF.selectAll(); } else if (e.keyCode == SWT.ARROW_DOWN) { nextTF.setFocus(); - nextTF.setSelection(0); + nextTF.selectAll(); } } }); } - private void textFieldVerifyListener(final Text tf) { + private void textFieldVerifyListener(final StyledText tf) { tf.addVerifyListener(new VerifyListener() { @Override public void verifyText(VerifyEvent e) { @@ -944,8 +963,8 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements }); } - private void textFieldModifyListener(final Text tf, final Text nextTF, - final boolean callAfosLookup) { + private void textFieldModifyListener(final StyledText tf, + final StyledText nextTF, final boolean callAfosLookup) { tf.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { if (tf.getCharCount() == tf.getTextLimit()) { @@ -956,12 +975,14 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements } } - if (tf.getCaretPosition() == tf.getTextLimit()) { - nextTF.setFocus(); - nextTF.setSelection(0); - } + if (!isDisposed()) { + if (tf.getCaretOffset() == tf.getTextLimit()) { + nextTF.setFocus(); + nextTF.selectAll(); + } - checkEnableEnter(); + checkEnableEnter(); + } } }); } diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/RemoteSiteRequestDlg.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/RemoteSiteRequestDlg.java index 369fcb8cfe..0e5f24b74c 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/RemoteSiteRequestDlg.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/RemoteSiteRequestDlg.java @@ -27,12 +27,15 @@ import java.util.List; import java.util.TimeZone; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -40,7 +43,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; import com.raytheon.uf.common.dataplugin.text.AfosWmoIdDataContainer; import com.raytheon.uf.common.dataplugin.text.db.AfosToAwips; @@ -58,6 +60,7 @@ import com.raytheon.viz.texteditor.command.CommandFailedException; import com.raytheon.viz.texteditor.msgs.IWmoIdSelectionCallback; import com.raytheon.viz.texteditor.util.TextEditorUtil; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; +import com.raytheon.viz.ui.dialogs.ICloseCallback; /** * The Remote Site Request dialog. @@ -70,39 +73,50 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; * ------------ ---------- ----------- -------------------------- * 9/13/07 368 lvenable Initial creation. * 10/11/2007 482 grichard Reformatted file. + * 09/20/2012 1196 rferrel Changing dialogs being called to not block. * * * * @author lvenable */ -public class RemoteSiteRequestDlg extends CaveSWTDialog { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(RemoteSiteRequestDlg.class); +public class RemoteSiteRequestDlg extends CaveSWTDialog implements + IWmoIdSelectionCallback { + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(RemoteSiteRequestDlg.class); + + private StyledText ttaaiiTF; + + private StyledText ccccTF; /** * AFOS site ID text field. */ - private Text wsfoIdTF; + private StyledText wsfoIdTF; /** * Product category text field. */ - private Text productCatTF; + private StyledText productCatTF; /** * Product designator text field. */ - private Text prodDesignatorTF; + private StyledText prodDesignatorTF; /** * Address text field. Defines the site where a text product or message is * sent. */ - private Text addresseeTF; - + private StyledText addresseeTF; + private Button enterBtn; - + private String initialAfosID; + private WmoIdSelectionDialog wmoIdSelectionDialog; + + boolean lookupAllowed = true; + /** * Constructor. * @@ -128,7 +142,7 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { protected void initializeComponents(Shell shell) { createInputFields(); createBottomButtons(); - validate(); + checkEnableEnter(); } /** @@ -141,137 +155,84 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { gridLayout.marginTop = 1; gridLayout.horizontalSpacing = 20; topComp.setLayout(gridLayout); + GridData gd = null; + Label sepLbl = null; + + gd = new GridData(70, SWT.DEFAULT); + ttaaiiTF = new StyledText(topComp, SWT.BORDER | SWT.READ_ONLY); + ttaaiiTF.setTextLimit(6); + ttaaiiTF.setLayoutData(gd); + ttaaiiTF.setEnabled(false); + ttaaiiTF.setEditable(false); + ttaaiiTF.setBackground(shell.getBackground()); + + Label ttaaiiLbl = new Label(topComp, SWT.NONE); + ttaaiiLbl.setText("TTAAii"); + + gd = new GridData(45, SWT.DEFAULT); + ccccTF = new StyledText(topComp, SWT.BORDER | SWT.READ_ONLY); + ccccTF.setEnabled(false); + ccccTF.setEditable(false); + ccccTF.setLayoutData(gd); + ccccTF.setBackground(shell.getBackground()); + Label ccccLbl = new Label(topComp, SWT.NONE); + ccccLbl.setText("CCCC"); + + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 2; + sepLbl = new Label(topComp, SWT.SEPARATOR | SWT.HORIZONTAL); + sepLbl.setLayoutData(gd); - ModifyListener validator = new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validate(); - } - }; - // Create the WSFO ID text field. - GridData gd = new GridData(45, SWT.DEFAULT); - wsfoIdTF = new Text(topComp, SWT.BORDER); + gd = new GridData(45, SWT.DEFAULT); + wsfoIdTF = new StyledText(topComp, SWT.BORDER); wsfoIdTF.setTextLimit(3); wsfoIdTF.setLayoutData(gd); - wsfoIdTF.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent event) { - wsfoIdTF.setText(wsfoIdTF.getText().toUpperCase()); - } - }); - - // When the number of characters enter reaches the max limit and - // the caret position is at the end then switch focus to another - // text field. - wsfoIdTF.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent event) { - if (wsfoIdTF.getCaretPosition() == wsfoIdTF.getTextLimit()) { - productCatTF.setFocus(); - } - } - }); - - wsfoIdTF.addModifyListener(validator); Label wsfoIdLbl = new Label(topComp, SWT.NONE); wsfoIdLbl.setText("WSFO Identification"); // Create the product category text field. gd = new GridData(45, SWT.DEFAULT); - productCatTF = new Text(topComp, SWT.BORDER); + productCatTF = new StyledText(topComp, SWT.BORDER); productCatTF.setTextLimit(3); productCatTF.setLayoutData(gd); - productCatTF.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent event) { - productCatTF.setText(productCatTF.getText().toUpperCase()); - } - }); - // When the number of characters enter reaches the max limit and - // the caret position is at the end then switch focus to another - // text field. - productCatTF.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent event) { - if (productCatTF.getCaretPosition() == productCatTF - .getTextLimit()) { - prodDesignatorTF.setFocus(); - } - } - }); - - productCatTF.addModifyListener(validator); - Label productCatLbl = new Label(topComp, SWT.NONE); productCatLbl.setText("Product Category"); // Create the product designator text field. gd = new GridData(45, SWT.DEFAULT); - prodDesignatorTF = new Text(topComp, SWT.BORDER); + prodDesignatorTF = new StyledText(topComp, SWT.BORDER); prodDesignatorTF.setTextLimit(3); prodDesignatorTF.setLayoutData(gd); - prodDesignatorTF.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent event) { - prodDesignatorTF.setText(prodDesignatorTF.getText() - .toUpperCase()); - } - }); - - // When the number of characters enter reaches the max limit and - // the caret position is at the end then switch focus to another - // text field. - prodDesignatorTF.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent event) { - if (prodDesignatorTF.getCaretPosition() == prodDesignatorTF - .getTextLimit()) { - addresseeTF.setFocus(); - } - } - }); - - prodDesignatorTF.addModifyListener(validator); Label prodDesignatorLbl = new Label(topComp, SWT.NONE); prodDesignatorLbl.setText("Product Designator"); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; - Label sepLbl = new Label(topComp, SWT.SEPARATOR | SWT.HORIZONTAL); + sepLbl = new Label(topComp, SWT.SEPARATOR | SWT.HORIZONTAL); sepLbl.setLayoutData(gd); // Create the addressee text field. gd = new GridData(45, SWT.DEFAULT); - addresseeTF = new Text(topComp, SWT.BORDER); + addresseeTF = new StyledText(topComp, SWT.BORDER); addresseeTF.setTextLimit(4); addresseeTF.setText("DEF"); addresseeTF.setLayoutData(gd); - addresseeTF.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent event) { - addresseeTF.setText(addresseeTF.getText().toUpperCase()); - } - }); - - // When the number of characters enter reaches the max limit and - // the caret position is at the end then switch focus to another - // text field. - addresseeTF.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent event) { - if (addresseeTF.getCaretPosition() == addresseeTF - .getTextLimit()) { - wsfoIdTF.setFocus(); - } - } - }); - - addresseeTF.addModifyListener(validator); Label addresseeLbl = new Label(topComp, SWT.NONE); addresseeLbl.setText("Addressee"); + setupTextFieldListeners(); + gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; sepLbl = new Label(topComp, SWT.SEPARATOR | SWT.HORIZONTAL); sepLbl.setLayoutData(gd); - + + // TODO set fields should be moved to preOpen() String ccc = ""; String nnn = ""; String xxx = ""; @@ -287,6 +248,24 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { prodDesignatorTF.setText(xxx); } + private void setupTextFieldListeners() { + // forces all fields to uppercase and only allows numbers/digits + textFieldVerifyListener(wsfoIdTF); + textFieldVerifyListener(productCatTF); + textFieldVerifyListener(prodDesignatorTF); + textFieldVerifyListener(addresseeTF); + + // forces overwrite and arrow key traversal + textFieldKeyListener(wsfoIdTF, addresseeTF, productCatTF); + textFieldKeyListener(productCatTF, wsfoIdTF, prodDesignatorTF); + textFieldKeyListener(prodDesignatorTF, productCatTF, addresseeTF); + textFieldKeyListener(addresseeTF, prodDesignatorTF, wsfoIdTF); + + textFieldModifyListener(wsfoIdTF, productCatTF, true); + textFieldModifyListener(productCatTF, prodDesignatorTF, true); + textFieldModifyListener(prodDesignatorTF, addresseeTF, false); + } + /** * Create the bottom Enter and Cancel buttons. */ @@ -323,79 +302,9 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { } }); } - - private void validate() { - if (enterBtn != null) - enterBtn.setEnabled(createReturnValue(true)); - } - // Copied from AWIPSHeaderBlockDlg.lookupWmoIDs() - private boolean lookupWmoId(final RemoteRetrievalRequest rrRequest) { - GetWmoIdRequest request = new GetWmoIdRequest(); - request.setAfosId(rrRequest.getAfosID()); - - try { - Object response = ThriftClient.sendRequest(request); - if (response != null) { - if (response instanceof AfosWmoIdDataContainer) { - AfosWmoIdDataContainer container = (AfosWmoIdDataContainer) response; - if (container.getErrorMessage() != null) { - statusHandler.handle( - Priority.PROBLEM, - "Error occurred looking up WMO IDs\nMessage from server[" - + container - .getErrorMessage() - + "]"); - } - - List list = container.getIdList(); - - if (list.size() > 1) { - ArrayList ttaaiiIds = new ArrayList( - list.size()); - ArrayList ccccIds = new ArrayList( - list.size()); - for (AfosToAwips id : list) { - ttaaiiIds.add(id.getWmottaaii()); - ccccIds.add(id.getWmocccc()); - } - - - IWmoIdSelectionCallback cb = new IWmoIdSelectionCallback() { - @Override - public void setWmoId(String ttaaii, String cccc) { - rrRequest.setWmoHeader(ttaaii + ' ' + cccc); - } - }; - WmoIdSelectionDialog dlg = new WmoIdSelectionDialog( - shell, cb, ttaaiiIds, ccccIds); - dlg.setBlockOnOpen(true); - dlg.open(); - return rrRequest.getWmoHeader() != null && - rrRequest.getWmoHeader().length() > 0; - } else if (list.size() == 1) { - AfosToAwips id = list.get(0); - rrRequest.setWmoHeader(id.getWmottaaii() + ' ' + id.getWmocccc()); - } else { - rrRequest.setWmoHeader(""); - } - - return true; - } else { - statusHandler.handle(Priority.PROBLEM, - "Received unhandled WMO Id lookup response from server. Received obj of type [" - + response.getClass() + "], contents[" - + response + "]"); - } - } - } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, - "Error occurred looking up WMO IDs", e); - } - return false; - } - - private Calendar createCalRelativeTo(Calendar relative, WMOHeader wmoHeader, int monthAdjustment) { + private Calendar createCalRelativeTo(Calendar relative, + WMOHeader wmoHeader, int monthAdjustment) { Calendar c = new GregorianCalendar(relative.getTimeZone()); c.setTimeInMillis(relative.getTimeInMillis()); c.add(GregorianCalendar.MONTH, monthAdjustment); @@ -406,11 +315,11 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { c.set(GregorianCalendar.MILLISECOND, 0); return c; } - - private Calendar getCloserCalendar(Calendar reference, Calendar a, Calendar b) { - return Math.abs(a.getTimeInMillis() - reference.getTimeInMillis()) < - Math.abs(b.getTimeInMillis() - reference.getTimeInMillis()) ? - a : b; + + private Calendar getCloserCalendar(Calendar reference, Calendar a, + Calendar b) { + return Math.abs(a.getTimeInMillis() - reference.getTimeInMillis()) < Math + .abs(b.getTimeInMillis() - reference.getTimeInMillis()) ? a : b; } private boolean createReturnValue(boolean validateOnly) { @@ -418,41 +327,41 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { String nnn = productCatTF.getText(); String xxx = prodDesignatorTF.getText(); String addr = addresseeTF.getText(); - if (ccc.length() != 3 || nnn.length() != 3 || - xxx.length() < 1 || xxx.length() > 3 || - addr.length() < 1) + if (ccc.length() != 3 || nnn.length() != 3 || xxx.length() < 1 + || xxx.length() > 3 || addr.length() < 1) return false; - + if (validateOnly) return true; - + String afosID = ccc + nnn + xxx; GetWmoIdRequest request = new GetWmoIdRequest(); request.setAfosId(afosID); - + RemoteRetrievalRequest req = new RemoteRetrievalRequest(); // TODO: Translate addr via awipsSites.txt or siteDistLists.txt req.setAddressee(addr); req.setAfosID(afosID); - + List latest = null; try { - latest = CommandFactory.getAfosCommand(req.getAfosID()).executeCommand(TextEditorUtil - .getTextDbsrvTransport()); + latest = CommandFactory.getAfosCommand(req.getAfosID()) + .executeCommand(TextEditorUtil.getTextDbsrvTransport()); } catch (CommandFailedException e) { statusHandler.handle(Priority.PROBLEM, "Error retrieving metatdata", e); // but keep going... } - + if (latest != null && latest.size() > 0) { - Calendar c = new GregorianCalendar(TimeZone - .getTimeZone("GMT")); + Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT")); c.setTimeInMillis(latest.get(0).getRefTime()); req.setMostRecentTime(c.getTimeInMillis()); // default try { - WMOHeader wmo = new WMOHeader(latest.get(0).getProduct().getBytes()); - Calendar t = getCloserCalendar(c, createCalRelativeTo(c, wmo, 0), + WMOHeader wmo = new WMOHeader(latest.get(0).getProduct() + .getBytes()); + Calendar t = getCloserCalendar(c, + createCalRelativeTo(c, wmo, 0), createCalRelativeTo(c, wmo, 1)); t = getCloserCalendar(c, t, createCalRelativeTo(c, wmo, -1)); req.setMostRecentTime(t.getTimeInMillis()); @@ -463,18 +372,205 @@ public class RemoteSiteRequestDlg extends CaveSWTDialog { } else req.setMostRecentTime(0); - if (! lookupWmoId(req)) - return false; - - req.setValidTime(System.currentTimeMillis() + 600 * 1000); // Current time plus 10 minutes - + String ttaaii = ttaaiiTF.getText(); + String cccc = ccccTF.getText(); + if (ttaaii.length() > 0 && cccc.length() > 0) { + req.setWmoHeader(ttaaii + " " + cccc); + } else { + req.setWmoHeader(""); + } + + req.setValidTime(System.currentTimeMillis() + 600 * 1000); // Current + // time plus + // 10 minutes + setReturnValue(req); return true; } + private void textFieldKeyListener(final StyledText tf, + final StyledText previousTF, final StyledText nextTF) { + tf.addKeyListener(new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + char c = e.character; + + if (Character.isLetterOrDigit(c) || Character.isSpaceChar(c)) { + int pos = tf.getCaretOffset(); + String text = tf.getText(); + + if (text.length() > pos) { + StringBuilder b = new StringBuilder(text); + b.deleteCharAt(pos); + tf.setText(b.toString()); + tf.setSelection(pos); + } + } else if (e.keyCode == SWT.ARROW_UP) { + previousTF.setFocus(); + previousTF.selectAll(); + } else if (e.keyCode == SWT.ARROW_DOWN) { + nextTF.setFocus(); + nextTF.selectAll(); + } + } + }); + } + + private void textFieldVerifyListener(final StyledText tf) { + tf.addVerifyListener(new VerifyListener() { + @Override + public void verifyText(VerifyEvent e) { + e.text = e.text.toUpperCase(); + StringBuilder b = null; + int posMod = 0; + char[] chars = e.text.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + if (!Character.isLetterOrDigit(c) + && !Character.isSpaceChar(c)) { + if (b == null) { + b = new StringBuilder(e.text); + } + b.deleteCharAt(i - posMod++); + } + } + + if (b != null) { + e.text = b.toString(); + } + } + }); + } + + private void textFieldModifyListener(final StyledText tf, + final StyledText nextTF, final boolean limitCheck) { + tf.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent event) { + if (!limitCheck || tf.getCharCount() == tf.getTextLimit()) { + if (wmoIdSelectionDialog == null) { + lookupWmoIDs(); + } else { + wmoIdSelectionDialog.close(); + wmoIdSelectionDialog = null; + lookupWmoIDs(); + } + } else { + if (wmoIdSelectionDialog != null) { + wmoIdSelectionDialog.close(); + wmoIdSelectionDialog = null; + } + setWmoId("", ""); + checkEnableEnter(); + } + + if (!isDisposed()) { + if (tf.getCaretOffset() == tf.getTextLimit()) { + nextTF.setFocus(); + nextTF.selectAll(); + } + + checkEnableEnter(); + } + } + }); + } + + private void lookupWmoIDs() { + if (lookupAllowed && wsfoIdTF.getCharCount() == wsfoIdTF.getTextLimit() + && productCatTF.getCharCount() == productCatTF.getTextLimit() + && prodDesignatorTF.getText().length() > 0) { + GetWmoIdRequest request = new GetWmoIdRequest(); + request.setAfosId(wsfoIdTF.getText() + productCatTF.getText() + + prodDesignatorTF.getText()); + lookupAllowed = false; + + try { + Object response = ThriftClient.sendRequest(request); + if (response != null) { + if (response instanceof AfosWmoIdDataContainer) { + AfosWmoIdDataContainer container = (AfosWmoIdDataContainer) response; + if (container.getErrorMessage() != null) { + statusHandler + .handle(Priority.PROBLEM, + "Error occurred looking up WMO IDs\nMessage from server[" + + container + .getErrorMessage() + + "]"); + } + + java.util.List list = container + .getIdList(); + + if (list.size() > 1) { + ArrayList ttaaiiIds = new ArrayList( + list.size()); + ArrayList ccccIds = new ArrayList( + list.size()); + for (AfosToAwips id : list) { + ttaaiiIds.add(id.getWmottaaii()); + ccccIds.add(id.getWmocccc()); + } + + wmoIdSelectionDialog = new WmoIdSelectionDialog( + shell, this, ttaaiiIds, ccccIds); + wmoIdSelectionDialog + .setCloseCallback(new ICloseCallback() { + + @Override + public void dialogClosed( + Object returnValue) { + lookupAllowed = true; + wmoIdSelectionDialog = null; + } + }); + wmoIdSelectionDialog.setBlockOnOpen(false); + wmoIdSelectionDialog.open(); + return; + } else if (list.size() == 1) { + AfosToAwips id = list.get(0); + setWmoId(id.getWmottaaii(), id.getWmocccc()); + } else { + setWmoId("", ""); + } + checkEnableEnter(); + } else { + statusHandler.handle(Priority.PROBLEM, + "Received unhandled WMO Id lookup response from server. Received obj of type [" + + response.getClass() + "], contents[" + + response + "]"); + } + } + } catch (VizException e) { + statusHandler.handle(Priority.PROBLEM, + "Error occurred looking up WMO IDs", e); + } + + lookupAllowed = true; + } + } + public void setRequest(RemoteRetrievalRequest lastRemoteRetrievalRequest) { initialAfosID = null; if (lastRemoteRetrievalRequest != null) initialAfosID = lastRemoteRetrievalRequest.getAfosID(); } + + private void checkEnableEnter() { + boolean enabled = false; + if (enterBtn != null && !isDisposed()) { + if (ttaaiiTF.getCharCount() > 0 && ccccTF.getCharCount() > 0 + && addresseeTF.getCharCount() > 0) { + enabled = true; + } + enterBtn.setEnabled(enabled); + } + } + + @Override + public void setWmoId(String ttaaii, String cccc) { + ttaaiiTF.setText(ttaaii); + ccccTF.setText(cccc); + checkEnableEnter(); + } } diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/WmoIdSelectionDialog.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/WmoIdSelectionDialog.java index 0f53a42f45..c9e05dc28e 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/WmoIdSelectionDialog.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/WmoIdSelectionDialog.java @@ -23,6 +23,7 @@ import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -43,6 +44,8 @@ import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Aug 28, 2009 2924 rjpeter Initial creation. + * Sep 19, 2012 1196 rferrel Scroll bar now displays and limit placed + * on the height of the dialog. * * * @author rjpeter @@ -124,7 +127,7 @@ public class WmoIdSelectionDialog extends CaveJFACEDialog { label.setLayoutData(data); wmoIdList = new List(top, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL); - data = new GridData(SWT.BEGINNING, SWT.DEFAULT, true, false); + data = new GridData(SWT.CENTER, SWT.FILL, false, true); wmoIdList.setLayoutData(data); for (int i = 0; i < ttaaiiIds.size(); i++) { @@ -160,4 +163,13 @@ public class WmoIdSelectionDialog extends CaveJFACEDialog { top.layout(); return top; } + + @Override + protected Point getInitialSize() { + Point point = super.getInitialSize(); + if (point.y > 500) { + point.y = 500; + } + return point; + } } diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/CaveJFACEDialog.java b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/CaveJFACEDialog.java index 594cfb53f9..24ce2b3d00 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/CaveJFACEDialog.java +++ b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/CaveJFACEDialog.java @@ -51,6 +51,7 @@ import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; * 04/22/08 1088 chammack Added dialog event propagation fix * 09/13/12 1165 lvenable Update for the initial process * of removing the dialog blocking capability. + * 09/20/12 1196 rferrel Changes to setBlockOnOpen. * * * @@ -93,6 +94,9 @@ public class CaveJFACEDialog extends Dialog implements mgr.addPerspectiveDialog(this); } } + // Eventually this will be the default but for now do not know what this + // will break. + // setBlockOnOpen(false); } /* @@ -234,17 +238,21 @@ public class CaveJFACEDialog extends Dialog implements * @param blockOnOpen * Flag indicating if the dialog should block when opened. */ + @Override public void setBlockOnOpen(boolean blockOnOpen) { - /* - * If the dialog is already opened then just return because setting the - * block won't work. In JFACE the setBlockOnOpen needs to be set before - * the open() call, otherwise it is ignored. - */ - if (isOpen()) { - return; - } + // TODO investigate eventually should never allow blocking? + // /* + // * If the dialog is already opened then just return because setting + // the + // * block won't work. In JFACE the setBlockOnOpen needs to be set + // before + // * the open() call, otherwise it is ignored. + // */ + // if (isOpen()) { + // return; + // } super.setBlockOnOpen(blockOnOpen); - blockedOnOpen = blockOnOpen; + // blockedOnOpen = blockOnOpen; } }