@@ -236,6 +236,7 @@ public void actionPerformed(ActionEvent e) {
236236
237237 advancedSearchPopup = createMessageBrowserAdvancedFilter ();
238238 advancedSearchPopup .setVisible (false );
239+ recentFiltersButton .setEnabled (false );
239240
240241 LineBorder lineBorder = new LineBorder (new Color (0 , 0 , 0 ));
241242 TitledBorder titledBorder = new TitledBorder ("Current Search" );
@@ -331,6 +332,7 @@ public void loadChannel(MessageBrowserChannelModel channelModel) {
331332
332333 this .channelId = channelId ;
333334 this .channelName = channelName ;
335+ updateRecentFiltersButton ();
334336 this .connectors = connectors ;
335337 this .connectors .put (null , "Deleted Connectors" );
336338 initMetaDataColumns (channelModel );
@@ -452,6 +454,101 @@ public void updateAdvancedSearchButtonFont() {
452454 }
453455 }
454456
457+ private void updateRecentFiltersButton () {
458+ recentFiltersButton .setEnabled (getRecentFilterStore ().hasRecentFilters ());
459+ }
460+
461+ private MessageBrowserRecentFilterStore getRecentFilterStore () {
462+ return new MessageBrowserRecentFilterStore (channelId );
463+ }
464+
465+ private void saveCurrentFilterToMru () {
466+ if (StringUtils .isBlank (channelId ) || messageFilter == null || messageFilter .isEmpty ()) {
467+ return ;
468+ }
469+
470+ getRecentFilterStore ().addRecentFilter (messageFilter );
471+ updateRecentFiltersButton ();
472+ }
473+
474+ private void restoreRecentFilter () {
475+ List <MessageFilter > filters = getRecentFilterStore ().loadRecentFilters ();
476+
477+ if (filters .isEmpty ()) {
478+ parent .alertInformation (this , "No recent message browser filters were found for this channel." );
479+ return ;
480+ }
481+
482+ String [] options = new String [filters .size ()];
483+ for (int i = 0 ; i < filters .size (); i ++) {
484+ options [i ] = (i + 1 ) + ". " + filters .get (i ).toString (connectors , "\n " , false );
485+ }
486+
487+ Object selection = JOptionPane .showInputDialog (this , "Select a recent filter to restore:" , "Recent Filters" , JOptionPane .PLAIN_MESSAGE , null , options , options [0 ]);
488+ if (selection instanceof String ) {
489+ int selectedIndex = Arrays .asList (options ).indexOf (selection );
490+ if (selectedIndex >= 0 ) {
491+ applyMessageFilter (filters .get (selectedIndex ));
492+ }
493+ }
494+ }
495+
496+ private void applyMessageFilter (MessageFilter filter ) {
497+ resetSearchCriteria ();
498+
499+ boolean allDay = inferAllDay (filter );
500+
501+ mirthDatePicker1 .setDate ((filter .getStartDate () == null ) ? null : filter .getStartDate ().getTime ());
502+ mirthDatePicker2 .setDate ((filter .getEndDate () == null ) ? null : filter .getEndDate ().getTime ());
503+ allDayCheckBox .setSelected (allDay );
504+ mirthTimePicker1 .setEnabled (mirthDatePicker1 .getDate () != null && !allDay );
505+ mirthTimePicker2 .setEnabled (mirthDatePicker2 .getDate () != null && !allDay );
506+
507+ if (filter .getStartDate () != null ) {
508+ mirthTimePicker1 .setDate (new SimpleDateFormat ("HH:mm" ).format (filter .getStartDate ().getTime ()));
509+ }
510+ if (filter .getEndDate () != null && !allDay ) {
511+ mirthTimePicker2 .setDate (new SimpleDateFormat ("HH:mm" ).format (filter .getEndDate ().getTime ()));
512+ }
513+
514+ textSearchField .setText (StringUtils .defaultString (filter .getTextSearch ()));
515+ regexTextSearchCheckBox .setSelected (Boolean .TRUE .equals (filter .getTextSearchRegex ()));
516+
517+ Set <Status > statuses = filter .getStatuses ();
518+ statusBoxReceived .setSelected (statuses != null && statuses .contains (Status .RECEIVED ));
519+ statusBoxTransformed .setSelected (statuses != null && statuses .contains (Status .TRANSFORMED ));
520+ statusBoxFiltered .setSelected (statuses != null && statuses .contains (Status .FILTERED ));
521+ statusBoxQueued .setSelected (statuses != null && statuses .contains (Status .QUEUED ));
522+ statusBoxPending .setSelected (statuses != null && statuses .contains (Status .PENDING ));
523+ statusBoxSent .setSelected (statuses != null && statuses .contains (Status .SENT ));
524+ statusBoxError .setSelected (statuses != null && statuses .contains (Status .ERROR ));
525+
526+ advancedSearchPopup .applyFilter (filter );
527+ updateAdvancedSearchButtonFont ();
528+ updateFilterButtonFont (Font .BOLD );
529+ }
530+
531+ private boolean inferAllDay (MessageFilter filter ) {
532+ if (filter == null ) {
533+ return false ;
534+ }
535+
536+ Calendar endDate = filter .getEndDate ();
537+ if (endDate != null ) {
538+ return endDate .get (Calendar .HOUR_OF_DAY ) == 23
539+ && endDate .get (Calendar .MINUTE ) == 59
540+ && endDate .get (Calendar .SECOND ) == 59
541+ && endDate .get (Calendar .MILLISECOND ) == 999 ;
542+ }
543+
544+ Calendar startDate = filter .getStartDate ();
545+ return startDate != null
546+ && startDate .get (Calendar .HOUR_OF_DAY ) == 0
547+ && startDate .get (Calendar .MINUTE ) == 0
548+ && startDate .get (Calendar .SECOND ) == 0
549+ && startDate .get (Calendar .MILLISECOND ) == 0 ;
550+ }
551+
455552 public String getChannelId () {
456553 return channelId ;
457554 }
@@ -654,6 +751,8 @@ protected boolean generateMessageFilter() {
654751 advancedSearchPopup .applySelectionsToFilter (messageFilter );
655752 selectedMetaDataIds = messageFilter .getIncludedMetaDataIds ();
656753
754+ saveCurrentFilterToMru ();
755+
657756 if (messageFilter .getMaxMessageId () == null ) {
658757 try {
659758 Long maxMessageId = parent .mirthClient .getMaxMessageId (channelId );
@@ -2648,6 +2747,14 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
26482747 }
26492748 });
26502749
2750+ recentFiltersButton = new javax .swing .JButton ();
2751+ recentFiltersButton .setText ("Recent..." );
2752+ recentFiltersButton .addActionListener (new java .awt .event .ActionListener () {
2753+ public void actionPerformed (java .awt .event .ActionEvent evt ) {
2754+ recentFiltersButtonActionPerformed (evt );
2755+ }
2756+ });
2757+
26512758 statusBoxFiltered .setBackground (new java .awt .Color (255 , 255 , 255 ));
26522759 statusBoxFiltered .setText ("FILTERED" );
26532760 statusBoxFiltered .setFont (new java .awt .Font ("Lucida Grande" , 0 , 11 )); // NOI18N
@@ -2761,7 +2868,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
27612868 .addPreferredGap (javax .swing .LayoutStyle .ComponentPlacement .UNRELATED )
27622869 .addComponent (advSearchButton , javax .swing .GroupLayout .PREFERRED_SIZE , 89 , javax .swing .GroupLayout .PREFERRED_SIZE )
27632870 .addPreferredGap (javax .swing .LayoutStyle .ComponentPlacement .RELATED )
2764- .addComponent (resetButton , javax .swing .GroupLayout .PREFERRED_SIZE , 56 , javax .swing .GroupLayout .PREFERRED_SIZE ))
2871+ .addComponent (resetButton , javax .swing .GroupLayout .PREFERRED_SIZE , 56 , javax .swing .GroupLayout .PREFERRED_SIZE ))
27652872 .addGroup (jPanel1Layout .createParallelGroup (javax .swing .GroupLayout .Alignment .LEADING , false )
27662873 .addGroup (javax .swing .GroupLayout .Alignment .TRAILING , jPanel1Layout .createSequentialGroup ()
27672874 .addComponent (mirthDatePicker1 , javax .swing .GroupLayout .PREFERRED_SIZE , 1 , Short .MAX_VALUE )
@@ -2775,8 +2882,9 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
27752882 .addPreferredGap (javax .swing .LayoutStyle .ComponentPlacement .RELATED )
27762883 .addGroup (jPanel1Layout .createParallelGroup (javax .swing .GroupLayout .Alignment .LEADING )
27772884 .addComponent (allDayCheckBox , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )
2778- .addComponent (filterButton , javax .swing .GroupLayout .PREFERRED_SIZE , 63 , javax .swing .GroupLayout .PREFERRED_SIZE )
2779- .addComponent (regexTextSearchCheckBox , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE ))
2885+ .addComponent (recentFiltersButton , javax .swing .GroupLayout .PREFERRED_SIZE , 63 , javax .swing .GroupLayout .PREFERRED_SIZE )
2886+ .addComponent (regexTextSearchCheckBox , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )
2887+ .addComponent (filterButton , javax .swing .GroupLayout .PREFERRED_SIZE , 63 , javax .swing .GroupLayout .PREFERRED_SIZE ))
27802888 .addPreferredGap (javax .swing .LayoutStyle .ComponentPlacement .UNRELATED )
27812889 .addGroup (jPanel1Layout .createParallelGroup (javax .swing .GroupLayout .Alignment .LEADING )
27822890 .addComponent (statusBoxQueued , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )
@@ -2830,7 +2938,8 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
28302938 .addComponent (mirthTimePicker2 , javax .swing .GroupLayout .Alignment .TRAILING , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )
28312939 .addGroup (jPanel1Layout .createParallelGroup (javax .swing .GroupLayout .Alignment .BASELINE )
28322940 .addComponent (mirthDatePicker2 , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )
2833- .addComponent (jLabel2 , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )))
2941+ .addComponent (jLabel2 , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE ))
2942+ .addComponent (recentFiltersButton ))
28342943 .addGap (7 , 7 , 7 )
28352944 .addGroup (jPanel1Layout .createParallelGroup (javax .swing .GroupLayout .Alignment .BASELINE )
28362945 .addComponent (textSearchField , javax .swing .GroupLayout .PREFERRED_SIZE , javax .swing .GroupLayout .DEFAULT_SIZE , javax .swing .GroupLayout .PREFERRED_SIZE )
@@ -2922,6 +3031,10 @@ private void filterButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
29223031 runSearch ();
29233032 }//GEN-LAST:event_filterButtonActionPerformed
29243033
3034+ private void recentFiltersButtonActionPerformed (java .awt .event .ActionEvent evt ) {//GEN-FIRST:event_recentFiltersButtonActionPerformed
3035+ restoreRecentFilter ();
3036+ }//GEN-LAST:event_recentFiltersButtonActionPerformed
3037+
29253038 private void countButtonActionPerformed (java .awt .event .ActionEvent evt ) {//GEN-FIRST:event_countButtonActionPerformed
29263039 final String workingId = parent .startWorking ("Counting search result size..." );
29273040 filterButton .setEnabled (false );
@@ -3110,6 +3223,7 @@ private void textSearchFieldActionPerformed(java.awt.event.ActionEvent evt) {//G
31103223 private javax .swing .JLabel processedResponseLabel ;
31113224 private javax .swing .JLabel processedResponseStatusLabel ;
31123225 private com .mirth .connect .client .ui .components .MirthSyntaxTextArea processedResponseStatusTextArea ;
3226+ private javax .swing .JButton recentFiltersButton ;
31133227 private com .mirth .connect .client .ui .components .MirthCheckBox regexTextSearchCheckBox ;
31143228 private javax .swing .JButton resetButton ;
31153229 private javax .swing .JLabel responseLabel ;
0 commit comments