1 /* 2 * 3 * Fosstrak LLRP Commander (www.fosstrak.org) 4 * 5 * Copyright (C) 2008 ETH Zurich 6 * 7 * This program is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation, either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program. If not, see <http://www.gnu.org/licenses/> 19 * 20 */ 21 22 package org.fosstrak.llrp.commander.util; 23 24 import org.apache.log4j.Logger; 25 import org.fosstrak.llrp.commander.views.MessageboxView; 26 27 /** 28 * helper thread that periodically refreshes the 29 * message box view if a new message has arrived. 30 * (refreshing whenever a message arrives kills 31 * eclipse ui.). 32 * @author sawielan 33 * 34 */ 35 public class MessageBoxRefresh implements Runnable { 36 37 /** the default interval to refresh the messagebox view. */ 38 public static final long DEFAULT_REFRESH_INTERVAL_MS = 1500; 39 40 /** the interval to refresh the messagebox view. */ 41 public long refreshTime = DEFAULT_REFRESH_INTERVAL_MS; 42 43 /** the log4j logger. */ 44 private static Logger log = Logger.getLogger(MessageBoxRefresh.class); 45 46 /** flag whether we need a refresh in the message box. */ 47 private boolean dirty = false; 48 49 /** flags whether to execute the refresher or not... */ 50 private boolean doRun = true; 51 52 /** flag that is true when the refresher has stopped. */ 53 private boolean stopped = false; 54 55 /** the message box to refresh. */ 56 private MessageboxView messageboxView = null; 57 58 /** whether to refresh or not by default. */ 59 public static final boolean DEFAULT_REFRESH_BEHAVIOR = true; 60 61 /** whether to refresh or not. */ 62 private boolean doRefresh = DEFAULT_REFRESH_BEHAVIOR; 63 64 /** 65 * constructor for the message box refresher thread. 66 * @param messageboxView the message box to be refreshed. 67 */ 68 public MessageBoxRefresh(MessageboxView messageboxView) { 69 this.messageboxView = messageboxView; 70 } 71 72 /** 73 * sets the messagebox to dirty, meaning a new message arrived 74 * and we need to refresh the message box. 75 */ 76 public void setDirty() { 77 dirty = true; 78 } 79 80 /** 81 * turn on/off the refresh behavior. 82 * @param refresh if set to true refresh the messagebox, otherwise not. 83 */ 84 public void setRefresh(boolean refresh) { 85 doRefresh = refresh; 86 } 87 88 /** 89 * sets the messagebox to refresh. 90 * @param messageboxView the message box to be refreshed. 91 */ 92 public void setMessageBox(MessageboxView messageboxView) { 93 this.messageboxView = messageboxView; 94 } 95 96 /** 97 * stops the refresher from executing. 98 */ 99 public void stop() { 100 this.doRun = false; 101 } 102 103 /** 104 * if the refresher has stopped true is returned. 105 * @return true if stopped, false otherwise. 106 */ 107 public boolean hasStopped() { 108 return stopped; 109 } 110 111 /** 112 * set the refresh time to use. if never set, the default refresh 113 * time is used. 114 * @param refreshTime the new refresh time. 115 */ 116 public void setRefreshTime(long refreshTime) { 117 if (refreshTime > 0) { 118 this.refreshTime = refreshTime; 119 } 120 } 121 122 /** 123 * @return the refresh time. 124 */ 125 public long getRefreshTime() { 126 return refreshTime; 127 } 128 129 /** 130 * execute the refresher thread. 131 */ 132 public void run() { 133 try { 134 while (doRun) { 135 if ((true == dirty) && (true == doRefresh)) { 136 dirty = false; 137 138 // SWT threads do not allow other threads to access 139 // the SWT widgets. to circumvent this issue one has 140 // to run the call through a asyncExec/syncExec API 141 // on the corresponding display 142 if (messageboxView != null) { 143 // execute synchronous 144 messageboxView.getDisplay().syncExec( 145 new Runnable() { 146 public void run() { 147 messageboxView.updateViewer(false); 148 log.debug("update message box."); 149 } 150 } 151 ); 152 153 } else { 154 log.debug("no message box set..."); 155 } 156 } 157 158 // wait for the next refresh... 159 Thread.sleep(refreshTime); 160 } 161 } catch (InterruptedException e) { 162 log.info("received interrupt, stop refreshing messagebox."); 163 } catch (Exception e) { 164 log.error("some unknown error occured:\n" + e.getMessage()); 165 e.printStackTrace(); 166 System.exit(-1); 167 } 168 169 stopped = true; 170 } 171 }