4141import java .time .Duration ;
4242import java .util .HashMap ;
4343import java .util .LinkedHashMap ;
44+ import java .util .Map ;
4445import java .util .Timer ;
4546import java .util .TimerTask ;
4647import java .util .Vector ;
5152import javax .swing .JPanel ;
5253import javax .swing .JScrollPane ;
5354import javax .swing .JTable ;
55+ import javax .swing .RowFilter ;
56+ import javax .swing .RowSorter ;
5457import javax .swing .table .AbstractTableModel ;
5558import javax .swing .table .DefaultTableColumnModel ;
5659import javax .swing .table .TableCellRenderer ;
5760import javax .swing .table .TableColumn ;
61+ import javax .swing .table .TableModel ;
62+ import javax .swing .table .TableRowSorter ;
5863
5964import com .google .common .eventbus .Subscribe ;
6065
6166import pt .lsts .imc .EntityList ;
67+ import pt .lsts .imc .EntityState ;
6268import pt .lsts .imc .IMCMessage ;
6369import pt .lsts .neptus .NeptusLog ;
6470import pt .lsts .neptus .comm .IMCSendMessageUtils ;
7379import pt .lsts .neptus .console .notifications .Notification ;
7480import pt .lsts .neptus .gui .StatusLed ;
7581import pt .lsts .neptus .gui .ToolbarButton ;
82+ import pt .lsts .neptus .gui .ToolbarSwitch ;
7683import pt .lsts .neptus .i18n .I18n ;
7784import pt .lsts .neptus .messages .Enumerated ;
7885import pt .lsts .neptus .plugins .NeptusMessageListener ;
@@ -101,6 +108,7 @@ public class EntityStatePanel extends ConsolePanel implements NeptusMessageListe
101108
102109 private final Icon ICON_CLEAR = ImageUtils .getScaledIcon ("images/buttons/clear.png" , 16 , 16 );
103110 private final Icon ICON_RQST = ImageUtils .getScaledIcon ("images/buttons/log.png" , 16 , 16 );
111+ private final Icon ICON_UNKNOWN = ImageUtils .getScaledIcon ("images/buttons/filter.png" , 16 , 16 );
104112
105113 // Events Data
106114 private LinkedHashMap <String , EntityStateType > dataMap = new LinkedHashMap <String , EntityStateType >();
@@ -115,6 +123,8 @@ public class EntityStatePanel extends ConsolePanel implements NeptusMessageListe
115123 private JTable table = null ;
116124 private StatusLed status ;
117125
126+ private boolean filterUnknown = true ;
127+
118128 private long timeSinceLastUpdateVoiceWarning = -1 ;
119129
120130 /**
@@ -175,10 +185,20 @@ public void actionPerformed(ActionEvent e) {
175185 ToolbarButton rqstEntListButton = new ToolbarButton (new AbstractAction ("request" , ICON_RQST ) {
176186 @ Override
177187 public void actionPerformed (ActionEvent e ) {
178- sendEntityListRequestMsg ();;
188+ sendEntityListRequestMsg ();
179189 }
180190 });
181191 rqstEntListButton .setToolTipText (I18n .text ("Request entity list" ));
192+ ToolbarSwitch filterUnknownEntListSwitch = new ToolbarSwitch (new AbstractAction ("filter unknown" , ICON_UNKNOWN ) {
193+ @ Override
194+ public void actionPerformed (ActionEvent e ) {
195+ filterUnknown = ((ToolbarSwitch ) e .getSource ()).isSelected ();
196+ etmodel .fireTableStructureChanged ();
197+ setPreferredTableColumnWidth ();
198+ }
199+ });
200+ filterUnknownEntListSwitch .setSelected (filterUnknown );
201+ filterUnknownEntListSwitch .setToolTipText (I18n .text ("Filter unknown" ));
182202 status = new StatusLed ();
183203 status .made5LevelIndicator ();
184204 status .setLevel (StatusLed .LEVEL_OFF );
@@ -187,16 +207,20 @@ public void actionPerformed(ActionEvent e) {
187207 wPanel .add (status );
188208 wPanel .add (clearButton );
189209 wPanel .add (rqstEntListButton );
210+ wPanel .add (filterUnknownEntListSwitch );
190211 this .add (wPanel , BorderLayout .NORTH );
191212
213+ setPreferredTableColumnWidth ();
192214 }
193215
194216 @ Override
195217 public void initSubPanel () {
196218 getTimer ().scheduleAtFixedRate (getTtask (), 100 , 1000 );
219+ clearData ();
197220 }
198221
199222 private void setup () {
223+ eColor .put (-1L , COLOR_OFF );
200224 eColor .put (0L , COLOR_BLUE );
201225 eColor .put (1L , COLOR_GREEN );
202226 eColor .put (2L , COLOR_YELLOW );
@@ -206,6 +230,7 @@ private void setup() {
206230 eColor .put (6L , COLOR_OFF );
207231 eColor .put (7L , COLOR_OFF );
208232
233+ eLevel .put (-1L , StatusLed .LEVEL_NONE );
209234 eLevel .put (0L , StatusLed .LEVEL_1 );
210235 eLevel .put (1L , StatusLed .LEVEL_0 );
211236 eLevel .put (2L , StatusLed .LEVEL_2 );
@@ -238,7 +263,7 @@ public void cleanSubPanel() {
238263 timer = null ;
239264 }
240265
241- clearData (); // calling this to remove alarms
266+ clearData (true ); // calling this to remove alarms
242267 }
243268
244269 /**
@@ -289,17 +314,41 @@ private JTable getTable() {
289314
290315 // table.setRowSorter(new TableRowSorter<EntityStateTableModel>(etmodel)); //FIXME Problem with clear
291316 table .setAutoCreateRowSorter (true );
317+ RowSorter <? extends TableModel > rs = table .getRowSorter ();
318+ if (rs instanceof TableRowSorter ) {
319+ ((TableRowSorter ) rs ).setRowFilter (new RowFilter <TableModel , Integer >() {
320+ @ Override
321+ public boolean include (Entry <? extends TableModel , ? extends Integer > entry ) {
322+ Object sel = entry .getValue (1 );
323+ System .out .println (">>>>>>>>>>>>>>>>>>> " + sel .toString ());
324+ return !filterUnknown || !"Unknown" .equalsIgnoreCase (sel .toString ());
325+ }
326+ });
327+ }
292328
293- TableColumn col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .STATE_COL );
294- col .setPreferredWidth (30 );
295- col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .DONT_CARE_FLAG_COL );
296- col .setPreferredWidth (10 );
297- col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .TIME_COL );
298- col .setPreferredWidth (20 );
329+ //clearData();
299330 }
331+
332+ setPreferredTableColumnWidth ();
300333 return table ;
301334 }
302335
336+ private void setPreferredTableColumnWidth () {
337+ TableColumn col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .ENTITY_COL );
338+ col .setPreferredWidth (100 );
339+ col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .STATE_COL );
340+ col .setPreferredWidth (60 );
341+ col .setMaxWidth (150 );
342+ col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .DONT_CARE_FLAG_COL );
343+ col .setPreferredWidth (50 );
344+ col .setMaxWidth (50 );
345+ col = ((DefaultTableColumnModel ) table .getColumnModel ()).getColumn (EntityStateType .TIME_COL );
346+ col .setPreferredWidth (60 );
347+ col .setMaxWidth (150 );
348+
349+ table .repaint (20 );
350+ }
351+
303352 /*
304353 * (non-Javadoc)
305354 *
@@ -346,9 +395,10 @@ private synchronized void calcTotalState() {
346395 }
347396 }
348397 // short oldState = status.getLevel();
398+ if (status == null )
399+ return ;
349400 status .setLevel (max );
350401 status .setMessage (I18n .textf ("State '%state'" , evtLabel ));
351-
352402 }
353403
354404 @ Subscribe
@@ -357,13 +407,43 @@ public void mainVehicleChangeNotification(ConsoleEventMainSystemChange evt) {
357407 }
358408
359409 private void clearData () {
410+ clearData (false );
411+ }
412+
413+ private void clearData (boolean cleanAll ) {
360414 if (data .size () != 0 )
361415 etmodel .fireTableRowsDeleted (0 , data .size () - 1 );
362416 data .clear ();
363417 dataMap .clear ();
364418// etmodel.fireTableDataChanged();
365419 etmodel .fireTableStructureChanged ();
366420 calcTotalState ();
421+ if (!cleanAll ) {
422+ fillEmptyData ();
423+ etmodel .fireTableStructureChanged ();
424+ calcTotalState ();
425+ setPreferredTableColumnWidth ();
426+ }
427+ }
428+
429+ private void fillEmptyData () {
430+ Map <Integer , String > entList = EntitiesResolver .getEntities (getMainVehicleId ());
431+ if (entList != null ) {
432+ for (Map .Entry <Integer , String > entry : entList .entrySet ()) {
433+ String entityName = entry .getValue ();
434+ EntityStateType eType = new EntityStateType (entityName , new Enumerated (
435+ getStatePossibleValues (), -1 ), "" , -1 );
436+ data .add (eType );
437+ dataMap .put (entityName , eType );
438+ }
439+ }
440+ setPreferredTableColumnWidth ();
441+ }
442+
443+ private LinkedHashMap <Long , String > getStatePossibleValues () {
444+ LinkedHashMap <Long , String > pf = new EntityState ().getMessageType ().getFieldPossibleValues ("state" );
445+ pf .put (-1L , I18n .text ("Unknown" ));
446+ return pf ;
367447 }
368448
369449 @ Override
@@ -379,23 +459,26 @@ public void messageArrived(IMCMessage message) {
379459 Integer index = eType == null ? null : data .indexOf (eType );
380460
381461 boolean wasChange = false ;
462+ boolean triggerStructChange = false ;
382463
383464 // Updating (not the first time receiving for this entity)
384465 if (index != null ) {
385466 eType = data .get (index );
386467 if (message .getLong ("state" ) != eType .getState ().longValue ()) { // Means it has changed, time to post a
387468 // msg_type type = msg_type.info;
388469 wasChange = true ;
470+ if (eType .getState ().longValue () == -1 )
471+ triggerStructChange = true ;
389472 }
390- eType .update (entityName , new Enumerated (message . getMessageType (). getFieldPossibleValues ("state" ),
391- message .getLong ( "state" )), message . getString ("description" ), System .currentTimeMillis ());
473+ eType .update (entityName , new Enumerated (getStatePossibleValues (), message . getLong ("state" ) ),
474+ message .getString ("description" ), System .currentTimeMillis ());
392475 data .set (index , eType );
393476 etmodel .fireTableRowsUpdated (index , index );
394477 }
395478 else {
396479 wasChange = true ;
397- eType = new EntityStateType (entityName , new Enumerated (message . getMessageType (). getFieldPossibleValues (
398- "state" ), message .getLong ("state" )), getDescription (), System .currentTimeMillis ());
480+ eType = new EntityStateType (entityName , new Enumerated (getStatePossibleValues (),
481+ message .getLong ("state" )), getDescription (), System .currentTimeMillis ());
399482
400483 if (data .add (eType )) {
401484 index = data .indexOf (eType );
@@ -405,8 +488,13 @@ public void messageArrived(IMCMessage message) {
405488 }
406489 calcTotalState ();
407490
408- if (wasChange )
491+ if (triggerStructChange ) {
492+ etmodel .fireTableStructureChanged ();
493+ setPreferredTableColumnWidth ();
494+ }
495+ if (wasChange ) {
409496 speakUpdateEntityState ();
497+ }
410498 }
411499 }
412500
@@ -761,6 +849,10 @@ public HourTableCellRenderer() {
761849
762850 public Component getTableCellRendererComponent (JTable table , Object timems , boolean isSelected ,
763851 boolean hasFocus , int row , int column ) {
852+ if (timems == null || !(timems instanceof Long ) || (Long ) timems == -1L ) {
853+ setText ("" );
854+ return this ;
855+ }
764856 Long enu = System .currentTimeMillis () - (Long ) timems ;
765857 setText (DateTimeUtil .milliSecondsToFormatedString (enu / 1000 * 1000 ));
766858 return this ;
0 commit comments