diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveCaseCreationDialogAction.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveCaseCreationDialogAction.java index a0f2da5ce9..a0c772fd40 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveCaseCreationDialogAction.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveCaseCreationDialogAction.java @@ -3,6 +3,10 @@ package com.raytheon.uf.viz.archive; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; + +import com.raytheon.uf.viz.archive.ui.CaseCreationDlg; /** * Action to bring up the Archive Case Creation dialog.. @@ -21,7 +25,7 @@ import org.eclipse.core.commands.ExecutionException; * @version 1.0 */ public class ArchiveCaseCreationDialogAction extends AbstractHandler { - // ArchiveCaseCreationDialog dialog; + private CaseCreationDlg dialog; /* * (non-Javadoc) @@ -32,16 +36,15 @@ public class ArchiveCaseCreationDialogAction extends AbstractHandler { */ @Override public Object execute(ExecutionEvent event) throws ExecutionException { - // if (dialog == null || dialog.isDiposed()) { - // Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() - // .getShell(); - // dialog = new ArchiveCaseCreationDialog(shell); - // dialog.open(); - // } else { - // dialog.bringToTop(); - // } - // dialog.open(); - System.out.println("ArchiveCaseCreationDialogAction NYI."); + if (dialog == null || dialog.isDisposed()) { + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getShell(); + dialog = new CaseCreationDlg(shell); + dialog.open(); + } else { + dialog.bringToTop(); + } + return null; } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveRetentionDialogAction.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveRetentionDialogAction.java index 1d4a9617c7..d9a6fa1d60 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveRetentionDialogAction.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ArchiveRetentionDialogAction.java @@ -3,6 +3,10 @@ package com.raytheon.uf.viz.archive; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; + +import com.raytheon.uf.viz.archive.ui.ArchiveRetentionDlg; /** * Action to display the Archive Retention dialog. @@ -21,7 +25,7 @@ import org.eclipse.core.commands.ExecutionException; * @version 1.0 */ public class ArchiveRetentionDialogAction extends AbstractHandler { - // ArchiveRetentionDialog dialog; + private ArchiveRetentionDlg dialog; /* * (non-Javadoc) @@ -32,17 +36,15 @@ public class ArchiveRetentionDialogAction extends AbstractHandler { */ @Override public Object execute(ExecutionEvent event) throws ExecutionException { - // if (dialog == null || dialog.isDiposed()) { - // Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() - // .getShell(); - // dialog = new ArchiveRetentionDialog(shell); - // dialog.open(); - // } else { - // dialog.bringToTop(); - // } - // dialog.open(); - System.out.println("ArchiveRetentionDialogAction NYI."); + if (dialog == null || dialog.isDisposed()) { + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getShell(); + dialog = new ArchiveRetentionDlg(shell); + dialog.open(); + } else { + dialog.bringToTop(); + } + return null; } - } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java new file mode 100644 index 0000000000..8d145ed743 --- /dev/null +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java @@ -0,0 +1,349 @@ +/** + * 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.archive.ui; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +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.Spinner; + +import com.raytheon.uf.viz.archive.ui.ArchiveTableComp.TableType; +import com.raytheon.viz.ui.dialogs.CaveSWTDialog; + +/** + * Archive retention dialog. + * + *
+ * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * May 23, 2013 #1964 lvenable Initial creation + * + *+ * + * @author lvenable + * @version 1.0 + */ +public class ArchiveRetentionDlg extends CaveSWTDialog { + + /** Table composite that holds the table controls. */ + private ArchiveTableComp tableComp; + + /** Archive config combo box. */ + private Combo archCfgCbo; + + /** Category combo box. */ + private Combo categoryCbo; + + /** + * Constructor. + * + * @param parentShell + * Parent shell. + */ + public ArchiveRetentionDlg(Shell parentShell) { + super(parentShell, SWT.DIALOG_TRIM | SWT.MIN, CAVE.DO_NOT_BLOCK + | CAVE.MODE_INDEPENDENT | CAVE.INDEPENDENT_SHELL); + } + + @Override + protected Layout constructShellLayout() { + // Create the main layout for the shell. + GridLayout mainLayout = new GridLayout(1, false); + mainLayout.marginHeight = 2; + mainLayout.marginWidth = 2; + + return mainLayout; + } + + @Override + protected void initializeComponents(Shell shell) { + setText("Archive Retention"); + Composite mainComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(1, false); + gl.marginHeight = 0; + gl.marginWidth = 0; + gl.horizontalSpacing = 0; + mainComp.setLayout(gl); + + init(); + } + + /** + * Initialize method to create all of the composite & controls. + */ + private void init() { + createRetentionControls(); + createTable(); + addSeparator(shell, SWT.HORIZONTAL); + createBottomActionButtons(); + + // TODO : Remove this when functionality is implemented + populateComboBoxes(); + } + + /** + * Create the retention controls. + */ + private void createRetentionControls() { + Composite retentionComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(5, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + retentionComp.setLayout(gl); + retentionComp.setLayoutData(gd); + + /* + * Top row of controls. + */ + Label archCfgLbl = new Label(retentionComp, SWT.NONE); + archCfgLbl.setText("Archive Config: "); + + gd = new GridData(200, SWT.DEFAULT); + archCfgCbo = new Combo(retentionComp, SWT.VERTICAL | SWT.DROP_DOWN + | SWT.BORDER | SWT.READ_ONLY); + archCfgCbo.setLayoutData(gd); + archCfgCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + /* + * TODO - add code to update the category combo box + */ + } + }); + + gd = new GridData(); + gd.horizontalIndent = 20; + Label minRetentionLbl = new Label(retentionComp, SWT.NONE); + minRetentionLbl.setText("Minimum Retention: "); + minRetentionLbl.setLayoutData(gd); + + gd = new GridData(60, SWT.DEFAULT); + final Spinner minRetentionSpnr = new Spinner(retentionComp, SWT.BORDER); + minRetentionSpnr.setIncrement(1); + minRetentionSpnr.setPageIncrement(5); + minRetentionSpnr.setMaximum(Integer.MAX_VALUE); + minRetentionSpnr.setMinimum(1); + minRetentionSpnr.setLayoutData(gd); + + final Combo minRetentionCbo = new Combo(retentionComp, SWT.VERTICAL + | SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); + minRetentionCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleRetentionSelection(minRetentionCbo, minRetentionSpnr); + } + }); + minRetentionCbo.add("Hours"); + minRetentionCbo.add("Days"); + minRetentionCbo.select(0); + minRetentionCbo.setData(minRetentionCbo.getItem(minRetentionCbo + .getSelectionIndex())); + + /* + * Bottom row of controls. + */ + Label catLbl = new Label(retentionComp, SWT.NONE); + catLbl.setText("Category: "); + + gd = new GridData(200, SWT.DEFAULT); + categoryCbo = new Combo(retentionComp, SWT.VERTICAL | SWT.DROP_DOWN + | SWT.BORDER | SWT.READ_ONLY); + categoryCbo.setLayoutData(gd); + categoryCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + /* + * TODO - add code to update the information in the table + */ + } + }); + + gd = new GridData(); + gd.horizontalIndent = 20; + Label extRetentionLbl = new Label(retentionComp, SWT.NONE); + extRetentionLbl.setText("Extended Retention: "); + extRetentionLbl.setLayoutData(gd); + + gd = new GridData(60, SWT.DEFAULT); + final Spinner extRetentionSpnr = new Spinner(retentionComp, SWT.BORDER); + extRetentionSpnr.setIncrement(1); + extRetentionSpnr.setPageIncrement(5); + extRetentionSpnr.setMaximum(Integer.MAX_VALUE); + extRetentionSpnr.setMinimum(1); + extRetentionSpnr.setLayoutData(gd); + + final Combo extRetentionCbo = new Combo(retentionComp, SWT.VERTICAL + | SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); + extRetentionCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleRetentionSelection(extRetentionCbo, extRetentionSpnr); + } + }); + extRetentionCbo.add("Hours"); + extRetentionCbo.add("Days"); + extRetentionCbo.select(0); + extRetentionCbo.setData(extRetentionCbo.getItem(extRetentionCbo + .getSelectionIndex())); + } + + /** + * Create the table control. + */ + private void createTable() { + tableComp = new ArchiveTableComp(shell, TableType.Case); + } + + /** + * Create the bottom action buttons. + */ + private void createBottomActionButtons() { + + Composite actionControlComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(3, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + actionControlComp.setLayout(gl); + actionControlComp.setLayoutData(gd); + + Button calcSizeBtn = new Button(actionControlComp, SWT.PUSH); + calcSizeBtn.setText(" Calculate Sizes "); + calcSizeBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + // TODO : add calculate size functionality + } + }); + + Button saveBtn = new Button(actionControlComp, SWT.PUSH); + saveBtn.setText(" Save... "); + saveBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + // TODO : add save functionality + } + }); + + gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false); + Button closeBtn = new Button(actionControlComp, SWT.PUSH); + closeBtn.setText(" Close "); + closeBtn.setLayoutData(gd); + closeBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + close(); + } + }); + } + + /** + * Handle the retention selection for both minimum and extended retention. + * + * @param comboBox + * Retention combo box. + * @param spinner + * Retention spinner. + */ + private void handleRetentionSelection(Combo comboBox, Spinner spinner) { + // If the selection didn't change then just return. + if (comboBox.getItem(comboBox.getSelectionIndex()).equals( + (String) comboBox.getData())) { + return; + } + + int time = 0; + + if (comboBox.getItem(comboBox.getSelectionIndex()).equals("Hours")) { + time = convertTime(true, spinner.getSelection()); + } else { + time = convertTime(false, spinner.getSelection()); + } + + spinner.setSelection(time); + comboBox.setData(comboBox.getItem(comboBox.getSelectionIndex())); + } + + /** + * Covert time from either hours to days or days to hours. + * + * @param daysToHours + * Flag indicating how to convert the time. + * @param time + * Time to be converted. + * @return The converted time. + */ + private int convertTime(boolean daysToHours, int time) { + int convertedTime = 0; + + if (daysToHours) { + convertedTime = time * 24; + } else { + convertedTime = time / 24; + } + + return convertedTime; + } + + /** + * Add a separator line to the provided container. + * + * @param container + * Composite. + * @param orientation + * Vertical or horizontal orientation. + */ + private void addSeparator(Composite container, int orientation) { + // Separator label + GridData gd; + + if (orientation == SWT.HORIZONTAL) { + gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + } else { + gd = new GridData(SWT.DEFAULT, SWT.FILL, false, true); + } + + Label sepLbl = new Label(container, SWT.SEPARATOR | orientation); + sepLbl.setLayoutData(gd); + } + + /******************************************************** + * TEST METHODS - to be removed when functionality is implemented. + * ****************************************************** + */ + private void populateComboBoxes() { + archCfgCbo.add("Raw"); + archCfgCbo.add("Processed"); + archCfgCbo.select(0); + + categoryCbo.add("Radar"); + categoryCbo.add("Point"); + categoryCbo.add("Satellite"); + categoryCbo.select(0); + } +} diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java new file mode 100644 index 0000000000..4e72f90b67 --- /dev/null +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java @@ -0,0 +1,303 @@ +/** + * 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.archive.ui; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; + +/** + * Archive table composite that contains the SWT table. + * + *
+ * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * May 23, 2013 #1964 lvenable Initial creation + * + *+ * + * @author lvenable + * @version 1.0 + */ +public class ArchiveTableComp extends Composite { + + /** Table control. */ + private Table table; + + /** Popup menu. */ + private Menu popupMenu; + + /** Number of selected items label. */ + private Label selectedLbl; + + /** Size label. */ + private Label sizeLbl; + + /** Table type enumeration. */ + public enum TableType { + Retention, Case + }; + + /** Current table type. */ + private TableType tableType = TableType.Retention; + + /** + * Constructor. + * + * @param parent + * Parent composite. + * @param type + * Table type. + */ + public ArchiveTableComp(Composite parent, TableType type) { + super(parent, 0); + + tableType = type; + init(); + } + + /** + * Initialize composites and controls. + */ + private void init() { + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); + GridLayout gl = new GridLayout(1, true); + gl.verticalSpacing = 2; + gl.marginHeight = 2; + gl.marginWidth = 2; + this.setLayout(gl); + this.setLayoutData(gd); + + createTable(); + createTableLabels(); + + updateSelectionLabel(); + } + + /** + * Create the table control. + */ + private void createTable() { + table = new Table(this, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL + | SWT.H_SCROLL | SWT.MULTI); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, true); + gd.widthHint = 730; + gd.heightHint = 270; + table.setLayoutData(gd); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + TableColumn pathColumn = new TableColumn(table, SWT.CENTER); + pathColumn.setText("Path"); + + TableColumn sizeColumn = new TableColumn(table, SWT.CENTER); + if (tableType == TableType.Retention) { + sizeColumn.setText("Current Size (MB)"); + } else if (tableType == TableType.Case) { + sizeColumn.setText("Size (MB)"); + } + + populateTable(); + + for (int i = 0; i < 2; i++) { + table.getColumn(i).setResizable(false); + table.getColumn(i).setMoveable(false); + table.getColumn(i).pack(); + } + + table.getColumn(1).setWidth(100); + + table.addMouseListener(new MouseAdapter() { + @Override + public void mouseDown(MouseEvent me) { + if (me.button == 3) { + createPopupMenu(table); + popupMenu.setVisible(true); + } + } + }); + + table.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + updateSelectionLabel(); + } + }); + } + + /** + * Create the table labels. + */ + private void createTableLabels() { + Composite lblComp = new Composite(this, SWT.NONE); + GridLayout gl = new GridLayout(2, true); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + lblComp.setLayout(gl); + lblComp.setLayoutData(gd); + + gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + selectedLbl = new Label(lblComp, SWT.NONE); + selectedLbl.setLayoutData(gd); + + /* + * TODO : keep for future use. This will be used to show the total size + * of the selected items in the table. + */ + // gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + // sizeLbl = new Label(lblComp, SWT.NONE); + // sizeLbl.setLayoutData(gd); + // sizeLbl.setText("Size of Selected items: 0" + sizeSuffix); + } + + /** + * Update the selection items label. + */ + private void updateSelectionLabel() { + TableItem[] itemArray = table.getItems(); + int count = 0; + + for (TableItem ti : itemArray) { + if (ti.getChecked()) { + count++; + } + } + + selectedLbl.setText("Selected Items: " + count); + } + + /** + * Create the table popup menu. + * + * @param parent + * Parent control. + */ + private void createPopupMenu(Control parent) { + if (popupMenu != null) { + popupMenu.dispose(); + } + + popupMenu = new Menu(parent); + + MenuItem checkSelectedItem = new MenuItem(popupMenu, SWT.NONE); + checkSelectedItem.setText("Check selected rows"); + checkSelectedItem.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleCheckSelectedRow(true); + } + }); + + MenuItem uncheckSelectedItem = new MenuItem(popupMenu, SWT.NONE); + uncheckSelectedItem.setText("Uncheck selected rows"); + uncheckSelectedItem.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleCheckSelectedRow(false); + } + }); + + new MenuItem(popupMenu, SWT.SEPARATOR); + + MenuItem checkAllItem = new MenuItem(popupMenu, SWT.NONE); + checkAllItem.setText("Check all rows"); + checkAllItem.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleCheckAll(true); + } + }); + + MenuItem uncheckAllItem = new MenuItem(popupMenu, SWT.NONE); + uncheckAllItem.setText("Uncheck all rows"); + uncheckAllItem.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleCheckAll(false); + } + }); + + // Set the pop-up menu as the pop-up for the shell + parent.setMenu(popupMenu); + } + + /** + * Action performed when the item in the table is checked/unchecked. + * + * @param check + * Checked flag. + */ + private void handleCheckSelectedRow(boolean check) { + TableItem[] itemArray = table.getSelection(); + + for (TableItem ti : itemArray) { + ti.setChecked(check); + } + + updateSelectionLabel(); + } + + /** + * Check or uncheck all of the table items. + * + * @param check + * Flag indicating check or uncheck all items. + */ + private void handleCheckAll(boolean check) { + TableItem[] itemArray = table.getItems(); + + for (TableItem ti : itemArray) { + ti.setChecked(check); + } + + updateSelectionLabel(); + } + + /* + * TODO : this is just for display purposes. This will go away when the + * functionality is implemented. + */ + private void populateTable() { + for (int i = 0; i < 150; i++) { + TableItem item = new TableItem(table, SWT.NONE); + item.setText(0, + "/home/lvenable/caveData/configuration/base/com.raytheon.uf.viz.gisdatastore/" + + i + " "); + if (i % 5 == 0) { + item.setChecked(true); + } + item.setText(1, "?????"); + } + } +} diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java new file mode 100644 index 0000000000..f0dc0c0cf8 --- /dev/null +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java @@ -0,0 +1,609 @@ +/** + * 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.archive.ui; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.DirectoryDialog; +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.Spinner; + +import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.viz.archive.ui.ArchiveTableComp.TableType; +import com.raytheon.viz.ui.dialogs.AwipsCalendar; +import com.raytheon.viz.ui.dialogs.CaveSWTDialog; + +/** + * + * Case creation dialog. + * + *
+ * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * May 23, 2013 #1964 lvenable Initial creation + * + *+ * + * @author lvenable + * @version 1.0 + */ +public class CaseCreationDlg extends CaveSWTDialog { + + /** Table control */ + private ArchiveTableComp tableComp; + + /** Start time label. */ + private Label startTimeLbl; + + /** End time label. */ + private Label endTimeLbl; + + /** Start date. */ + private Date startDate; + + /** End date. */ + private Date endDate; + + /** Archive configuration combo box. */ + private Combo archCfgCbo; + + /** Category combo box. */ + private Combo categoryCbo; + + /** Compression check box. */ + private Button compressChk; + + /** Break files check box. */ + private Button breakFilesChk; + + /** File size spinner control. */ + private Spinner fileSizeSpnr; + + /** File size combo box. */ + private Combo fileSizeCbo; + + /** Maximum file size label. */ + private Label maxFileSizeLbl; + + /** Directory location label. */ + private Label locationLbl; + + /** Uncompressed file size label. */ + private Label uncompressSizeLbl; + + /** Date format. */ + private SimpleDateFormat dateFmt = new SimpleDateFormat( + "E MMM dd yyyy HH:00 z"); + + /** + * Constructor. + * + * @param parentShell + * Parent shell. + */ + public CaseCreationDlg(Shell parentShell) { + super(parentShell, SWT.DIALOG_TRIM | SWT.MIN, CAVE.DO_NOT_BLOCK + | CAVE.MODE_INDEPENDENT | CAVE.INDEPENDENT_SHELL); + } + + @Override + protected Layout constructShellLayout() { + // Create the main layout for the shell. + GridLayout mainLayout = new GridLayout(1, false); + mainLayout.marginHeight = 2; + mainLayout.marginWidth = 2; + + return mainLayout; + } + + @Override + protected void initializeComponents(Shell shell) { + setText("Case Creation"); + Composite mainComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(1, false); + gl.marginHeight = 0; + gl.marginWidth = 0; + gl.horizontalSpacing = 0; + mainComp.setLayout(gl); + + init(); + } + + /** + * Initialize method to create all of the composite & controls. + */ + private void init() { + + createTimeControls(); + addSeparator(shell, SWT.HORIZONTAL); + createCaseCompressionControls(); + addSeparator(shell, SWT.HORIZONTAL); + createFileBrowserControls(); + createTable(); + addSeparator(shell, SWT.HORIZONTAL); + createBottomActionButtons(); + + populateComboBoxes(); + } + + /** + * Create the time controls. + */ + private void createTimeControls() { + Composite timeComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(4, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + timeComp.setLayout(gl); + timeComp.setLayoutData(gd); + + Button startBtn = new Button(timeComp, SWT.PUSH); + startBtn.setText(" Start Time... "); + startBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + displayDateTimeControls(true); + } + }); + + gd = new GridData(220, SWT.DEFAULT); + startTimeLbl = new Label(timeComp, SWT.BORDER); + startTimeLbl.setLayoutData(gd); + + gd = new GridData(); + gd.horizontalIndent = 20; + Button endBtn = new Button(timeComp, SWT.PUSH); + endBtn.setText(" End Time... "); + endBtn.setLayoutData(gd); + endBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + displayDateTimeControls(false); + } + }); + + gd = new GridData(220, SWT.DEFAULT); + endTimeLbl = new Label(timeComp, SWT.BORDER); + endTimeLbl.setLayoutData(gd); + + Date date = TimeUtil.newDate(); + startDate = date; + endDate = date; + startTimeLbl.setText(dateFmt.format(startDate)); + endTimeLbl.setText(dateFmt.format(endDate)); + } + + /** + * Create the case compression controls. + */ + private void createCaseCompressionControls() { + Composite caseCompressionComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(3, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + caseCompressionComp.setLayout(gl); + caseCompressionComp.setLayoutData(gd); + + createComboControls(caseCompressionComp); + addSeparator(caseCompressionComp, SWT.VERTICAL); + createCompressionControls(caseCompressionComp); + } + + /** + * Create the Archive and Category combo controls. + * + * @param comp + * Composite to put the controls in. + */ + private void createComboControls(Composite comp) { + Composite comboComp = new Composite(comp, SWT.NONE); + GridLayout gl = new GridLayout(2, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + comboComp.setLayout(gl); + comboComp.setLayoutData(gd); + + Label archCfgLbl = new Label(comboComp, SWT.NONE); + archCfgLbl.setText("Archive Config: "); + + gd = new GridData(200, SWT.DEFAULT); + archCfgCbo = new Combo(comboComp, SWT.VERTICAL | SWT.DROP_DOWN + | SWT.BORDER | SWT.READ_ONLY); + archCfgCbo.setLayoutData(gd); + archCfgCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + /* + * TODO - add code to update the category combo box + */ + } + }); + + Label catLbl = new Label(comboComp, SWT.NONE); + catLbl.setText("Category: "); + + gd = new GridData(200, SWT.DEFAULT); + categoryCbo = new Combo(comboComp, SWT.VERTICAL | SWT.DROP_DOWN + | SWT.BORDER | SWT.READ_ONLY); + categoryCbo.setLayoutData(gd); + categoryCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + /* + * TODO - add code to update the information in the table + */ + } + }); + } + + /** + * Create the compression controls. + * + * @param comp + * Composite to put the control in. + */ + private void createCompressionControls(Composite comp) { + Composite compressionComp = new Composite(comp, SWT.NONE); + GridLayout gl = new GridLayout(1, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + compressionComp.setLayout(gl); + compressionComp.setLayoutData(gd); + + /* + * Uncompressed file size label + */ + Composite compressionLblComp = new Composite(compressionComp, SWT.NONE); + gl = new GridLayout(3, false); + gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + compressionLblComp.setLayout(gl); + compressionLblComp.setLayoutData(gd); + + Label uncompressLbl = new Label(compressionLblComp, SWT.NONE); + uncompressLbl.setText("Uncompressed Case Size: "); + + gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + uncompressSizeLbl = new Label(compressionLblComp, SWT.NONE); + uncompressSizeLbl.setText("1024 MB"); + uncompressSizeLbl.setLayoutData(gd); + + /* + * Compression controls + */ + compressChk = new Button(compressionComp, SWT.CHECK); + compressChk.setText("Compress Files"); + compressChk.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleCompressSelection(); + } + }); + + gd = new GridData(); + gd.horizontalIndent = 20; + breakFilesChk = new Button(compressionComp, SWT.CHECK); + breakFilesChk.setText("Break into multiple files"); + breakFilesChk.setLayoutData(gd); + breakFilesChk.setEnabled(false); + breakFilesChk.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleBreakFilesSelection(breakFilesChk.getSelection()); + } + }); + + Composite maxFileSizeComp = new Composite(compressionComp, SWT.NONE); + gl = new GridLayout(3, false); + gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + gd.horizontalIndent = 20; + maxFileSizeComp.setLayout(gl); + maxFileSizeComp.setLayoutData(gd); + + maxFileSizeLbl = new Label(maxFileSizeComp, SWT.NONE); + maxFileSizeLbl.setText("Max File Size: "); + maxFileSizeLbl.setEnabled(false); + + gd = new GridData(60, SWT.DEFAULT); + fileSizeSpnr = new Spinner(maxFileSizeComp, SWT.BORDER); + fileSizeSpnr.setIncrement(1); + fileSizeSpnr.setPageIncrement(50); + fileSizeSpnr.setMaximum(2000); + fileSizeSpnr.setMinimum(500); + fileSizeSpnr.setLayoutData(gd); + fileSizeSpnr.setEnabled(false); + + fileSizeCbo = new Combo(maxFileSizeComp, SWT.VERTICAL | SWT.DROP_DOWN + | SWT.BORDER | SWT.READ_ONLY); + fileSizeCbo.setEnabled(false); + fileSizeCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleFileSizeChangeSelection(); + } + }); + } + + /** + * Create the file browser controls. + */ + private void createFileBrowserControls() { + Composite fileBrowserComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(4, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + fileBrowserComp.setLayout(gl); + fileBrowserComp.setLayoutData(gd); + + Label caseLbl = new Label(fileBrowserComp, SWT.NONE); + caseLbl.setText("Case Location: "); + + gd = new GridData(300, SWT.DEFAULT); + locationLbl = new Label(fileBrowserComp, SWT.BORDER); + locationLbl.setLayoutData(gd); + + Button browseBtn = new Button(fileBrowserComp, SWT.PUSH); + browseBtn.setText(" Browse... "); + browseBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleBrowserSelection(); + } + }); + } + + /** + * Create the table control. + */ + private void createTable() { + tableComp = new ArchiveTableComp(shell, TableType.Case); + } + + /** + * Create the bottom action buttons. + */ + private void createBottomActionButtons() { + + Composite actionControlComp = new Composite(shell, SWT.NONE); + GridLayout gl = new GridLayout(3, false); + GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + actionControlComp.setLayout(gl); + actionControlComp.setLayoutData(gd); + + Button exportBtn = new Button(actionControlComp, SWT.PUSH); + exportBtn.setText(" Export Case Config... "); + exportBtn.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + + } + }); + + Button generateBtn = new Button(actionControlComp, SWT.PUSH); + generateBtn.setText(" Generate "); + generateBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + + } + }); + + gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false); + Button closeBtn = new Button(actionControlComp, SWT.PUSH); + closeBtn.setText(" Close "); + closeBtn.setLayoutData(gd); + closeBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + close(); + } + }); + } + + /** + * Enable/Disable controls based on the compression check box. + */ + private void handleCompressSelection() { + if (compressChk.getSelection()) { + handleBreakFilesSelection(breakFilesChk.getSelection()); + } else { + handleBreakFilesSelection(false); + } + + breakFilesChk.setEnabled(compressChk.getSelection()); + } + + /** + * Enable/Disable file size controls. + * + * @param enabled + * Enabled flag. + */ + private void handleBreakFilesSelection(boolean enabled) { + maxFileSizeLbl.setEnabled(enabled); + fileSizeSpnr.setEnabled(enabled); + fileSizeCbo.setEnabled(enabled); + } + + /** + * Action performed when the file size has changed. + */ + private void handleFileSizeChangeSelection() { + /* + * If the same item was selected just return. + */ + if (fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()).equals( + (String) fileSizeCbo.getData())) { + return; + } + + if (fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()).equals("MB")) { + fileSizeSpnr.setIncrement(1); + fileSizeSpnr.setPageIncrement(50); + fileSizeSpnr.setMaximum(2000); + fileSizeSpnr.setMinimum(500); + fileSizeSpnr.setSelection(500); + } else { + fileSizeSpnr.setIncrement(1); + fileSizeSpnr.setPageIncrement(5); + fileSizeSpnr.setMinimum(1); + fileSizeSpnr.setMaximum(10); + fileSizeSpnr.setSelection(1); + } + + fileSizeCbo + .setData(fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex())); + } + + /** + * Display the directory browser dialog. + */ + private void handleBrowserSelection() { + DirectoryDialog dlg = new DirectoryDialog(shell, SWT.OPEN); + String dirName = dlg.open(); + if (dirName != null) { + locationLbl.setText(trimDirectoryName(dirName)); + locationLbl.setToolTipText(dirName); + locationLbl.setData(dirName); + } + } + + /** + * Add a separator line to the provided container. + * + * @param container + * Composite. + * @param orientation + * Vertical or horizontal orientation. + */ + private void addSeparator(Composite container, int orientation) { + // Separator label + GridData gd; + + if (orientation == SWT.HORIZONTAL) { + gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + } else { + gd = new GridData(SWT.DEFAULT, SWT.FILL, false, true); + } + + Label sepLbl = new Label(container, SWT.SEPARATOR | orientation); + sepLbl.setLayoutData(gd); + } + + /** + * Display the date/time controls. + * + * @param startTimeFlag + * True for start time, false for end time. + */ + private void displayDateTimeControls(boolean startTimeFlag) { + AwipsCalendar ac = new AwipsCalendar(shell, 1); + Date date = (Date) ac.open(); + + if (startTimeFlag) { + if (date.after(endDate)) { + MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION + | SWT.OK); + mb.setText("Date Error"); + mb.setMessage("The selected start date is after the end date. Resetting."); + mb.open(); + return; + } + } else { + if (date.before(startDate)) { + MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION + | SWT.OK); + mb.setText("Date Error"); + mb.setMessage("The selected end date is before the start date. Resetting."); + mb.open(); + return; + } + } + + if (startTimeFlag) { + startTimeLbl.setText(dateFmt.format(date)); + } else { + endTimeLbl.setText(dateFmt.format(date)); + } + } + + /** + * Trim the directory name if it is too long to fit in the label. The + * beginning of the path will be replaced with "...". + * + * @param str + * @return + */ + private String trimDirectoryName(String str) { + Point strExtent; + Point ellipseExt; + + GC gc = new GC(shell); + gc.setFont(locationLbl.getFont()); + + ellipseExt = gc.stringExtent("..."); + int labelWidth = locationLbl.getBounds().width - (5 + ellipseExt.x); + + strExtent = gc.stringExtent(str); + + if (strExtent.x > labelWidth) { + while (strExtent.x > labelWidth) { + str = str.substring(2); + strExtent = gc.stringExtent(str); + } + str = "..." + str; + } + + gc.dispose(); + return str; + } + + /******************************************************** + * TEST METHODS ****************************************************** + */ + private void populateComboBoxes() { + archCfgCbo.add("Raw"); + archCfgCbo.add("Processed"); + archCfgCbo.select(0); + + categoryCbo.add("Radar"); + categoryCbo.add("Point"); + categoryCbo.add("Satellite"); + categoryCbo.select(0); + + fileSizeCbo.add("MB"); + fileSizeCbo.add("GB"); + fileSizeCbo.select(0); + fileSizeCbo + .setData(fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex())); + } +}