00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 package com.generalrobotix.ui.view;
00021
00022 import java.text.DecimalFormat;
00023
00024 import org.eclipse.swt.SWT;
00025 import org.eclipse.swt.events.KeyEvent;
00026 import org.eclipse.swt.events.KeyListener;
00027 import org.eclipse.swt.events.SelectionAdapter;
00028 import org.eclipse.swt.events.SelectionEvent;
00029 import org.eclipse.swt.events.MouseEvent;
00030 import org.eclipse.swt.events.MouseListener;
00031 import org.eclipse.swt.events.MouseTrackListener;
00032 import org.eclipse.swt.events.MouseMoveListener;
00033 import org.eclipse.swt.layout.GridData;
00034 import org.eclipse.swt.layout.GridLayout;
00035 import org.eclipse.swt.widgets.Button;
00036 import org.eclipse.swt.widgets.Composite;
00037 import org.eclipse.swt.widgets.Display;
00038 import org.eclipse.swt.widgets.Label;
00039 import org.eclipse.swt.widgets.Scale;
00040 import org.eclipse.swt.widgets.Text;
00041 import org.eclipse.ui.IActionBars;
00042 import org.eclipse.jface.action.Action;
00043
00044 import com.generalrobotix.ui.GrxBaseItem;
00045 import com.generalrobotix.ui.GrxBasePlugin;
00046 import com.generalrobotix.ui.GrxBaseView;
00047 import com.generalrobotix.ui.GrxBaseViewPart;
00048 import com.generalrobotix.ui.GrxPluginManager;
00049 import com.generalrobotix.ui.grxui.Activator;
00050 import com.generalrobotix.ui.item.GrxSimulationItem;
00051 import com.generalrobotix.ui.item.GrxWorldStateItem;
00052 import com.generalrobotix.ui.util.GrxDebugUtil;
00053 import com.generalrobotix.ui.util.MessageBundle;
00054
00055 @SuppressWarnings("serial")
00059 public class GrxLoggerView extends GrxBaseView {
00060 public static final String TITLE = "Logger";
00061
00062 private GrxWorldStateItem currentItem_=null;
00063 private GrxSimulationItem simItem_=null;
00064
00065 private int current_ = 0;
00066 private double playRate_ = 1.0;
00067 private int frameRate_ = defaultFrameRate_;
00068 private boolean isPlaying_ = false;
00069 private boolean isControlDisabled_ = false;
00070 private boolean inSimulation_ = false;
00071 private boolean buttonClick_ = false;
00072
00073
00074 private Scale sliderFrameRate_;
00075 private Label lblFrameRate_;
00076 private Scale sliderTime_;
00077
00078
00079 private Button btnFrameF_;
00080 private Button btnFrameR_;
00081 private Button[] btns_ = new Button[2];
00082
00083 private String[] btnToolTips = new String[] {
00084 MessageBundle.get("GrxLoggerView.text.oneRwd"), MessageBundle.get("GrxLoggerView.text.onePlay")
00085 };
00086
00087 private final static String[] icons_ = { "icon_frame-.png", "icon_frame+.png" };
00088
00089 private Text tFldTime_;
00090
00091 private Action[] toolActs_ = new Action[6];
00092 private String[] actToolTips_ = new String[] {
00093 MessageBundle.get("GrxLoggerView.text.fastRwd"),MessageBundle.get("GrxLoggerView.text.slowRwd"),
00094 MessageBundle.get("GrxLoggerView.text.pause"), MessageBundle.get("GrxLoggerView.text.play"),
00095 MessageBundle.get("GrxLoggerView.text.slowFwd"), MessageBundle.get("GrxLoggerView.text.fastFwd")
00096 };
00097 private final static String[] actIcons_ = {
00098 "icon_fastrwd.png",
00099 "icon_slowrwd.png",
00100 "icon_pause.png",
00101 "icon_playback.png",
00102 "icon_slowfwd.png",
00103 "icon_fastfwd.png" };
00104 private final static String[] actDIcons_ = {
00105 "icond_fastrwd.png",
00106 "icond_slowrwd.png",
00107 "icond_pause.png",
00108 "icond_playback.png",
00109 "icond_slowfwd.png",
00110 "icond_fastfwd.png" };
00111
00112 private final static int maxFrameRate_ = 50;
00113 private final static int defaultFrameRate_ = 10;
00114 private Label lblPlayRate_;
00115
00116 private static DecimalFormat FORMAT_FAST = new DecimalFormat("Play x ##;Play x-##");
00117 private static DecimalFormat FORMAT_SLOW = new DecimalFormat("Play x 1/##;Play x-1/##");
00118 private static String timeFormat = "%8.3f";
00119
00120
00121
00122 private int mouseBtnActionNum = 0;
00123 private int mouseBtnRepeat_ = 200;
00124 private int mouseBtnAccelNeed_ = 5;
00125 private int mouseBtnAccelRepeat_ = 30;
00126 private boolean isMouseOverBtnR_ = false;
00127 private boolean isMouseOverBtnF_ = false;
00128 private Runnable backPosRun_;
00129 private Runnable forwardPosRun_;
00130
00132
00133 double logTimeStepMs_;
00134
00135 long prevDispNs_;
00136
00137 long nextTimerNs_;
00138 final long mills2nano = 1000 * 1000;
00139
00147 public GrxLoggerView(String name, GrxPluginManager manager, GrxBaseViewPart vp, Composite parent) {
00148 super(name, manager, vp, parent);
00149
00150 GridLayout gl = new GridLayout(6,false);
00151 gl.marginHeight = 0;
00152 composite_.setLayout( gl );
00153
00154
00155 lblPlayRate_ = new Label( composite_, SWT.NONE);
00156 lblPlayRate_.setText(MessageBundle.get("GrxLoggerView.label.pause"));
00157 GridData lblGridData = new GridData();
00158 lblGridData.widthHint = 80;
00159 lblPlayRate_.setLayoutData(lblGridData);
00160
00161
00162
00163 Composite btnComp = new Composite ( composite_, SWT.NONE);
00164 GridLayout buttonLayout = new GridLayout(2,false);
00165 buttonLayout.marginHeight = 0;
00166 buttonLayout.marginWidth = 0;
00167 btnComp.setLayout( buttonLayout );
00168
00169 btnFrameR_ = new Button( btnComp, SWT.NONE );
00170
00171 btnFrameR_.addMouseTrackListener(new MouseTrackListener(){
00172 public void mouseEnter(MouseEvent e){
00173 isMouseOverBtnR_ = true;
00174 }
00175 public void mouseExit(MouseEvent e){
00176 isMouseOverBtnR_ = false;
00177 }
00178 public void mouseHover(MouseEvent e){
00179 }
00180 });
00181
00182 btnFrameR_.addMouseMoveListener(new MouseMoveListener(){
00183 public void mouseMove(MouseEvent e){
00184 isMouseOverBtnR_ = (0 <= e.x && e.x < btnFrameR_.getSize().x && 0 <= e.y && e.y < btnFrameR_.getSize().y);
00185 }
00186 });
00187 btnFrameR_.addMouseListener(new MouseListener(){
00188 public void mouseDoubleClick(MouseEvent e){
00189 }
00190 public void mouseDown(MouseEvent e) {
00191 if(e.button == 1){
00192 backPosition();
00193 startBackPosTimer();
00194 }
00195 }
00196 public void mouseUp(MouseEvent e) {
00197 if(e.button == 1){
00198 stopBackPosTimer();
00199 }
00200 }
00201 });
00202
00203 btnFrameF_ = new Button( btnComp, SWT.NONE );
00204
00205 btnFrameF_.addMouseTrackListener(new MouseTrackListener(){
00206 public void mouseEnter(MouseEvent e){
00207 isMouseOverBtnF_ = true;
00208 }
00209 public void mouseExit(MouseEvent e){
00210 isMouseOverBtnF_ = false;
00211 }
00212 public void mouseHover(MouseEvent e){
00213 }
00214 });
00215
00216 btnFrameF_.addMouseMoveListener(new MouseMoveListener(){
00217 public void mouseMove(MouseEvent e){
00218 isMouseOverBtnF_ = (0 <= e.x && e.x < btnFrameF_.getSize().x && 0 <= e.y && e.y < btnFrameF_.getSize().y);
00219 }
00220 });
00221 btnFrameF_.addMouseListener(new MouseListener(){
00222 public void mouseDoubleClick(MouseEvent e){
00223 }
00224 public void mouseDown(MouseEvent e) {
00225 if(e.button == 1){
00226 forwardPosition();
00227 startForwardPosTimer();
00228 }
00229 }
00230 public void mouseUp(MouseEvent e) {
00231 if(e.button == 1){
00232 stopForwardPosTimer();
00233 }
00234 }
00235 });
00236
00237 btns_[0] = btnFrameR_;
00238 btns_[1] = btnFrameF_;
00239
00240 for(int i=0; i<btns_.length; i++) {
00241 btns_[i].setImage( Activator.getDefault().getImage( icons_[i] ) );
00242 btns_[i].setToolTipText( btnToolTips[i] );
00243 }
00244
00245
00246 tFldTime_ = new Text(composite_, SWT.SINGLE|SWT.BORDER);
00247 tFldTime_.setText(MessageBundle.get("GrxLoggerView.text.noData"));
00248 GridData textGridData = new GridData();
00249 textGridData.widthHint = 60;
00250 tFldTime_.setLayoutData(textGridData);
00251 tFldTime_.addKeyListener(new KeyListener(){
00252 public void keyPressed(KeyEvent e) {}
00253 public void keyReleased(KeyEvent e) {
00254 if (e.character == SWT.CR) {
00255 String str = tFldTime_.getText();
00256 try{
00257 double tm = Double.parseDouble(str);
00258 int newpos = currentItem_.getPositionAt(tm);
00259 if (newpos >= 0){
00260 currentItem_.setPosition(newpos);
00261 }
00262 }catch(Exception ex){
00263
00264 }
00265 }
00266 }
00267 });
00268
00269
00270 sliderTime_ = new Scale( composite_, SWT.NONE );
00271 sliderTime_.addSelectionListener(new SelectionAdapter(){
00272 public void widgetSelected(SelectionEvent e){
00273 currentItem_.setPosition(sliderTime_.getSelection());
00274 buttonClick_ = true;
00275 }
00276 } );
00277 sliderTime_.addKeyListener(new KeyListener(){
00278 public void keyPressed(KeyEvent e) {
00279 if (e.keyCode == SWT.ARROW_LEFT || e.keyCode == SWT.ARROW_DOWN){
00280 if (isPlaying_)
00281 pause();
00282 currentItem_.setPosition(sliderTime_.getSelection());
00283 }else if (e.keyCode == SWT.ARROW_RIGHT || e.keyCode == SWT.ARROW_UP){
00284 if (isPlaying_)
00285 pause();
00286 currentItem_.setPosition(sliderTime_.getSelection());
00287 }
00288 }
00289 public void keyReleased(KeyEvent e) {
00290 }
00291 });
00292 GridData gd = new GridData(SWT.HORIZONTAL|SWT.FILL|GridData.FILL_HORIZONTAL);
00293 sliderTime_.setLayoutData(gd);
00294
00295
00296 lblFrameRate_ = new Label(composite_, SWT.NONE);
00297 lblFrameRate_.setText(MessageBundle.get("GrxLoggerView.label.FPS")+defaultFrameRate_);
00298
00299
00300 sliderFrameRate_ = new Scale( composite_, SWT.HORIZONTAL );
00301
00302 sliderFrameRate_.setSize(80, 27);
00303 sliderFrameRate_.setMaximum(maxFrameRate_);
00304 sliderFrameRate_.setMinimum(1);
00305 sliderFrameRate_.setSelection(defaultFrameRate_);
00306 sliderFrameRate_.addSelectionListener(new SelectionAdapter(){
00307 public void widgetSelected(SelectionEvent e){
00308 frameRate_ = sliderFrameRate_.getSelection();
00309 lblFrameRate_.setText( MessageBundle.get("GrxLoggerView.label.FPS")+String.valueOf(frameRate_) );
00310 }
00311 } );
00312
00313 Action actFRwd_ = new Action(){
00314 public void run(){
00315 if (!isPlaying_)
00316 playRate_ = -2.0;
00317 else if (playRate_ > 0)
00318 playRate_ *= -1;
00319 else if (playRate_ > -64)
00320 playRate_ *= 2.0;
00321 buttonClick_ = true;
00322 play();
00323 }
00324 };
00325
00326 Action actSRwd_ = new Action(){
00327 public void run(){
00328 if (!isPlaying_)
00329 playRate_ = -1.0/8.0;
00330 else if (playRate_ > 0)
00331 playRate_ *= -1;
00332 else if (1/playRate_ > -64)
00333 playRate_ *= 0.5;
00334 buttonClick_ = true;
00335 play();
00336 }
00337 };
00338 Action actPause_ = new Action(){
00339 public void run(){
00340 pause();
00341 }
00342 };
00343
00344 Action actPlay_ = new Action(){
00345 public void run(){
00346 playRate_ = 1.0;
00347 buttonClick_ = true;
00348 play();
00349 }
00350 };
00351
00352 Action actSFwd_ = new Action(){
00353 public void run(){
00354 if (!isPlaying_)
00355 playRate_ = 1.0/8.0;
00356 else if (playRate_ < 0)
00357 playRate_ *= -1;
00358 else if (1/playRate_ < 64)
00359 playRate_ *= 0.5;
00360 buttonClick_ = true;
00361 play();
00362 }
00363 };
00364
00365 Action actFFwd_ = new Action(){
00366 public void run(){
00367 if (!isPlaying_)
00368 playRate_ = 2.0;
00369 else if (playRate_ < 0)
00370 playRate_ *= -1;
00371 else if (playRate_ < 64)
00372 playRate_ *= 2.0;
00373 buttonClick_ = true;
00374 play();
00375 }
00376 };
00377
00378 toolActs_[0] = actFRwd_;
00379 toolActs_[1] = actSRwd_;
00380 toolActs_[2] = actPause_;
00381 toolActs_[3] = actPlay_;
00382 toolActs_[4] = actSFwd_;
00383 toolActs_[5] = actFFwd_;
00384 IActionBars bars = vp.getViewSite().getActionBars();
00385 for(int i = 0; i < toolActs_.length; i++) {
00386 toolActs_[i].setImageDescriptor( Activator.getDefault().getDescriptor(actIcons_[i]) );
00387 toolActs_[i].setDisabledImageDescriptor(Activator.getDefault().getDescriptor(actDIcons_[i]));
00388 toolActs_[i].setToolTipText( actToolTips_[i] );
00389 bars.getToolBarManager().add(toolActs_[i]);
00390 }
00391
00392
00393 backPosRun_ = new Runnable() {
00394 public void run() {
00395 Display display = btnFrameR_.getDisplay();
00396 if (!display.isDisposed())
00397 {
00398 if(isMouseOverBtnR_)
00399 {
00400 mouseBtnActionNum += 1;
00401 backPosition();
00402 }
00403 display.timerExec((mouseBtnActionNum < mouseBtnAccelNeed_ ? mouseBtnRepeat_ : mouseBtnAccelRepeat_), this);
00404 }
00405 }
00406 };
00407 forwardPosRun_ = new Runnable() {
00408 public void run() {
00409 Display display = btnFrameF_.getDisplay();
00410 if (!display.isDisposed())
00411 {
00412 if(isMouseOverBtnF_)
00413 {
00414 mouseBtnActionNum += 1;
00415 forwardPosition();
00416 }
00417 display.timerExec((mouseBtnActionNum < mouseBtnAccelNeed_ ? mouseBtnRepeat_ : mouseBtnAccelRepeat_), this);
00418 }
00419 }
00420 };
00421
00422 setScrollMinSize(SWT.DEFAULT,SWT.DEFAULT);
00423
00424 setUp();
00425 manager_.registerItemChangeListener(this, GrxWorldStateItem.class);
00426 manager_.registerItemChangeListener(this, GrxSimulationItem.class);
00427 }
00428
00429 public void setUp(){
00430 if(currentItem_ != null){
00431 currentItem_.deleteObserver(this);
00432 currentItem_.deletePosObserver(this);
00433 }
00434 currentItem_ = manager_.<GrxWorldStateItem>getSelectedItem(GrxWorldStateItem.class, null);
00435 if(currentItem_!=null){
00436 _setTimeSeriesItem(currentItem_);
00437 currentItem_.addObserver(this);
00438 currentItem_.addPosObserver(this);
00439 updatePosition(currentItem_, currentItem_.getPosition());
00440 }else
00441 _setTimeSeriesItem(null);
00442 if(simItem_ != null)
00443 simItem_.deleteObserver(this);
00444 simItem_ = manager_.<GrxSimulationItem>getSelectedItem(GrxSimulationItem.class, null);
00445 if(simItem_!=null){
00446 simItem_.addObserver(this);
00447 }
00448 }
00449
00450 private boolean _isAtTheEndAfterPlayback(){
00451 if (current_ == currentItem_.getLogSize()-1 && playRate_ > 0){
00452 return true;
00453 }else{
00454 return false;
00455 }
00456 }
00457
00458
00459 private void play() {
00460 if(currentItem_ == null) return;
00461 if (!isPlaying_) {
00462 if (_isAtTheEndAfterPlayback()) currentItem_.setPosition(0);
00463
00464 if(inSimulation_){
00465 logTimeStepMs_ = currentItem_.getDbl("logTimeStep", 0.001)*1000;
00466 }
00467 else{
00468
00469 if(currentItem_.getLogSize() < 2){
00470 logTimeStepMs_ = currentItem_.getDbl("logTimeStep", 0.001)*1000;
00471 }else{
00472 logTimeStepMs_ = (currentItem_.getTime(1) - currentItem_.getTime(0))*1000;
00473 }
00474 }
00475
00476 Runnable playRun_ = new Runnable() {
00477 public void run() {
00478 if(!isPlaying_) return;
00479
00480 long nowNs = System.nanoTime();
00481 boolean _continue = true;
00482
00483 int diffpos = (int)((nowNs - prevDispNs_) / (logTimeStepMs_ * mills2nano) * playRate_);
00484 int sliderMax = currentItem_.getLogSize()-1;
00485 int newpos;
00486 if(inSimulation_ && !buttonClick_)
00487 newpos = sliderMax;
00488 else
00489 newpos = current_ + diffpos;
00490 if (sliderMax < newpos) {
00491 newpos = sliderMax;
00492 if(!inSimulation_)
00493 _continue = false;
00494 } else if (newpos < 0) {
00495 newpos = 0;
00496 if(!inSimulation_)
00497 _continue = false;
00498 }
00499
00500 if(newpos != current_){
00501
00502
00503 diffpos = newpos - current_;
00504 currentItem_.setPosition(newpos);
00505 prevDispNs_ += (long)((logTimeStepMs_ * mills2nano) * diffpos / playRate_);
00506 }
00507
00508 if(_continue){
00509 nowNs = System.nanoTime();
00510 int sleepTime = (int)((1000.0d/frameRate_) - ((nowNs - nextTimerNs_) / mills2nano));
00511
00512
00513 if(sleepTime < 1) sleepTime = 1;
00514 nextTimerNs_ = nowNs + (sleepTime * mills2nano);
00515 Display display = composite_.getDisplay();
00516 if (!display.isDisposed())
00517 display.timerExec(sleepTime, this);
00518 }else{
00519 pause();
00520 }
00521 }
00522 };
00523
00524 isPlaying_ = true;
00525 long nowNs = System.nanoTime();
00526 prevDispNs_ = nowNs;
00527 int sleepTime = (int)(1000.0d/frameRate_);
00528 nextTimerNs_ = nowNs + (sleepTime * mills2nano);
00529 Display display = composite_.getDisplay();
00530 if (!display.isDisposed())
00531 display.timerExec(sleepTime, playRun_);
00532 }
00533 if (Math.abs(playRate_)<1.0)
00534 lblPlayRate_.setText(FORMAT_SLOW.format(1/playRate_));
00535 else
00536 lblPlayRate_.setText(FORMAT_FAST.format(playRate_));
00537 }
00538
00542 public void pause() {
00543 isPlaying_ = false;
00544 lblPlayRate_.setText(MessageBundle.get("GrxLoggerView.label.pause"));
00545 }
00546
00551 public boolean isPlaying() {
00552 return isPlaying_;
00553 }
00554
00558 public void restoreProperties() {
00559 super.restoreProperties();
00560
00561 timeFormat = getStr("timeFormat", "%8.3f");
00562 GrxDebugUtil.println("LoggerView: timeFormat = \""+timeFormat+"\"\n");
00563 }
00564
00565 private void _setTimeSeriesItem(GrxWorldStateItem item){
00566 current_ = 0;
00567 sliderTime_.setSelection(0);
00568 if (item != null){
00569 _updateTimeField(item);
00570 int size = item.getLogSize();
00571 if(size > 0){
00572 sliderTimeSetMaximam(item.getLogSize());
00573 setEnabled(true);
00574 }else{
00575 sliderTimeSetMaximam(1);
00576 setEnabled(false);
00577 }
00578 }else{
00579 sliderTimeSetMaximam(1);
00580 setEnabled(false);
00581 }
00582 }
00583
00584 public void registerItemChange(GrxBaseItem item, int event){
00585 if(item instanceof GrxWorldStateItem){
00586 GrxWorldStateItem worldStateItem = (GrxWorldStateItem) item;
00587 switch(event){
00588 case GrxPluginManager.SELECTED_ITEM:
00589 if(currentItem_!=worldStateItem){
00590 _setTimeSeriesItem(worldStateItem);
00591 currentItem_ = worldStateItem;
00592 currentItem_.addObserver(this);
00593 currentItem_.addPosObserver(this);
00594 updatePosition(currentItem_, currentItem_.getPosition());
00595 }
00596 break;
00597 case GrxPluginManager.REMOVE_ITEM:
00598 case GrxPluginManager.NOTSELECTED_ITEM:
00599 if(currentItem_==worldStateItem){
00600 currentItem_.deleteObserver(this);
00601 currentItem_.deletePosObserver(this);
00602 _setTimeSeriesItem(null);
00603 currentItem_ = null;
00604 }
00605 break;
00606 default:
00607 break;
00608 }
00609 }else if(item instanceof GrxSimulationItem){
00610 GrxSimulationItem simItem = (GrxSimulationItem) item;
00611 switch(event){
00612 case GrxPluginManager.SELECTED_ITEM:
00613 if(simItem_!=simItem){
00614 simItem_ = simItem;
00615 simItem_.addObserver(this);
00616 }
00617 break;
00618 case GrxPluginManager.REMOVE_ITEM:
00619 case GrxPluginManager.NOTSELECTED_ITEM:
00620 if(simItem_==simItem){
00621 simItem_.deleteObserver(this);
00622 simItem_ = null;
00623 }
00624 break;
00625 default:
00626 break;
00627 }
00628 }
00629 }
00630
00634 private void _updateTimeField(GrxWorldStateItem item) {
00635 Double t = item.getTime();
00636 if (t != null) {
00637 tFldTime_.setText(String.format(timeFormat, t));
00638 setEnabled(true);
00639 } else if (item.getLogSize() == 0){
00640 tFldTime_.setText(MessageBundle.get("GrxLoggerView.text.noData"));
00641 setEnabled(false);
00642 }
00643 }
00644
00649 public int getMaximum() {
00650 return sliderTime_.getMaximum();
00651 }
00652
00657 public int getCurrentPos() {
00658 return current_;
00659 }
00660
00661 public void update(GrxBasePlugin plugin, Object... arg) {
00662 if(simItem_==plugin){
00663 if((String)arg[0]=="StartSimulation"){
00664 inSimulation_ = true;
00665 buttonClick_ = false;
00666 lblPlayRate_.setText(MessageBundle.get("GrxLoggerView.label.live"));
00667 if((Boolean)arg[1])
00668 disableControl();
00669 else{
00670 playRate_ = 1;
00671 play();
00672 }
00673 }else if((String)arg[0]=="StopSimulation"){
00674 inSimulation_ = false;
00675 lblPlayRate_.setText(MessageBundle.get("GrxLoggerView.label.pause"));
00676 enableControl();
00677 pause();
00678 }
00679 }else if(currentItem_==plugin) {
00680 if((String)arg[0]=="ClearLog"){
00681 if(isPlaying())
00682 pause();
00683 _setTimeSeriesItem(currentItem_);
00684 }else if((String)arg[0]=="LoadLog"){
00685 _setTimeSeriesItem(currentItem_ );
00686 updatePosition(currentItem_, currentItem_.getPosition());
00687 }
00688 }
00689 }
00690
00691 public void updatePosition(GrxBasePlugin plugin, Integer arg_pos){
00692 if(currentItem_ != plugin)
00693 return;
00694
00695 int pos = arg_pos.intValue();
00696 int logSize = currentItem_.getLogSize();
00697 if ( pos < 0 || logSize < pos){
00698 return;
00699 }
00700 current_ = pos;
00701 sliderTimeSetMaximam(logSize-1);
00702 sliderTime_.setSelection(pos);
00703 _updateTimeField(currentItem_);
00704 }
00705
00710 public double getPlayRate() {
00711 return playRate_;
00712 }
00713
00714 private void setEnabled(boolean b) {
00715 if (isControlDisabled_) return;
00716 sliderTime_.setEnabled(b);
00717 tFldTime_.setEnabled(b);
00718 lblPlayRate_.setEnabled(b);
00719 for (int i=0; i<btns_.length; i++)
00720 btns_[i].setEnabled(b);
00721
00722 for (int i=0; i<toolActs_.length; i++)
00723 toolActs_[i].setEnabled(b);
00724
00725 }
00726
00727 public void disableControl() {
00728 setEnabled(false);
00729 isControlDisabled_ = true;
00730 }
00731
00732 public void enableControl() {
00733 isControlDisabled_ = false;
00734 setEnabled(true);
00735 }
00736
00737 public void shutdown() {
00738 manager_.removeItemChangeListener(this, GrxWorldStateItem.class);
00739 if(currentItem_!=null)
00740 {
00741 currentItem_.deleteObserver(this);
00742 currentItem_.deletePosObserver(this);
00743 }
00744 if(simItem_!=null)
00745 simItem_.deleteObserver(this);
00746 manager_.removeItemChangeListener(this, GrxSimulationItem.class);
00747 }
00748
00749 private void sliderTimeSetMaximam(int value)
00750 {
00751 sliderTime_.setMaximum(value);
00752
00753 if(value < 150)
00754 sliderTime_.setPageIncrement(5);
00755 if(value < 1500)
00756 sliderTime_.setPageIncrement(50);
00757 else
00758 sliderTime_.setPageIncrement(500);
00759 }
00760
00761 private void backPosition(){
00762 if (isPlaying_)
00763 pause();
00764 currentItem_.setPosition(sliderTime_.getSelection()-1);
00765 }
00766 private void forwardPosition(){
00767 if (isPlaying_)
00768 pause();
00769 currentItem_.setPosition(sliderTime_.getSelection()+1);
00770 }
00771 private void startBackPosTimer(){
00772 mouseBtnActionNum = 0;
00773
00774 Display display = btnFrameR_.getDisplay();
00775 if (!display.isDisposed())
00776 {
00777 display.timerExec(mouseBtnRepeat_, backPosRun_);
00778 }
00779 }
00780 private void stopBackPosTimer(){
00781 mouseBtnActionNum = 0;
00782
00783 Display display = btnFrameR_.getDisplay();
00784 if (!display.isDisposed())
00785 {
00786 display.timerExec(-1, backPosRun_);
00787 }
00788 }
00789 private void startForwardPosTimer(){
00790 mouseBtnActionNum = 0;
00791
00792 Display display = btnFrameF_.getDisplay();
00793 if (!display.isDisposed())
00794 {
00795 display.timerExec(mouseBtnRepeat_, forwardPosRun_);
00796 }
00797 }
00798 private void stopForwardPosTimer(){
00799 mouseBtnActionNum = 0;
00800
00801 Display display = btnFrameF_.getDisplay();
00802 if (!display.isDisposed())
00803 {
00804 display.timerExec(-1, forwardPosRun_);
00805 }
00806 }
00807 }