summaryrefslogblamecommitdiffstats
path: root/vmchooser/SWindow.cxx
blob: e2c903d3660d0aca208e43a9c827fad8fd8672a3 (plain) (tree)
1
2
3
4
5
6
7
8
9

                        
 
                          
                   
              
 

                   





                               






                                    

 


                     



                                                         

                                                          



                                                 




                         
 
                    



                     

             
 



                                   
 

                                                                   


 
                          
                              
 



                           
 

                          
 


                            
 
                                            
                            
 
        
                   


  


                                                         
                                                                
                                                           

                         

                              
 

                                                    
                                             


                          
   


 


                                                        
                                                
                                                         

                         

                             

                                                          
                         


                                
             
     



                                            
                                                                         




                                                      

 



                                                           
                                              

                      
                                                                   
                                   
                                    




                                                                  

                                                                                                             



                                                         
 
   


                      



                                                           
                                          

                  
                 
 
                                                                 
                                    

                                                                                              
 



                                                     
 
   
                  
 

 


                                                                

                            
                                    





                   



                                                       
  



                                                                
                                                        
                                                                                   






                                
   








                                      
   
                     
                            


                                  
                        

                                



                               
                          

           

                                  
 
                 





                                                                 




                                  
     
   





                                                        
                                                  
                              







                                                                                        









                                                                                                   
                                                   
                                    
         











                                                                     


                                                           
                          

                                                             
                          
     

                                                            
     
                        
   

                      




                                                       

                                          

                                                        
                    


                 
 


                                                            
                                                        






                                                         
 

#include "inc/SWindow.h"

#include "inc/functions.h"
#include <iostream>
#include <map>

#include <string.h>

#include "img/gnome_32.xpm"
#include "img/kde_32.xpm"
#include "img/linux_32.xpm"
#include "img/xp_32.xpm"
#include "img/xp_locked_32.xpm"
#include "img/xfce_32.xpm"
/* Added to support default icons */
#include "img/vmware_32.xpm"
#include "img/macos_32.xpm"
#include "img/bsd_32.xpm"
#include "img/gentoo_32.xpm"
#include "img/suse_32.xpm"
#include "img/ubuntu_32.xpm"


using namespace fltk;
using namespace std;


/********************************************************
 * default constructur for the main window
 * ----------------------------------------------------
 * if you want to use default sizes, call first ctor
 ********************************************************/
SWindow::SWindow(int w, int h, char* p)
: fltk::Window(w,h,p),
  go(w/3 + 10, h-40, (2*w)/3 - 20 , 30, "START"),
  exit_btn(10, h-40, w/3 -10, 30, "EXIT"),
  sel(10,10, w-20, h-50),
  ent(NULL),
  entgroup(NULL),
  lin_entgroup(NULL),
  lin_ent(NULL)
{
//  sel.indented(1);
  begin();
  add_resizable(sel);
  add(exit_btn);
  add(go);
  width = w;
  height = h;

  border(false);
  go.callback(cb_return,this);
  sel.callback(cb_select, this);
  exit_btn.callback(cb_exit, this);

  Style* btn_style = new Style(*fltk::ReturnButton::default_style);
  Style* sel_style = new Style(*fltk::Browser::default_style);



  Font* f1 = font("sans");
  //Font* f1bold = f1->bold();

  btn_style->textsize(16);
  btn_style->labelsize(16);
  btn_style->labelfont(f1);
  btn_style->textfont(f1);

  sel_style->textfont(f1);
  sel_style->textsize(16);

  exit_btn.style(btn_style);
  go.style(btn_style);
  sel.style(sel_style);

  const int widths[]   = { -1,-1,-1,-1, 0 };
  sel.column_widths(widths);

  end();
  sel.take_focus();
};


/********************************************************
 * Callback for ReturnButton at the bottom of the GUI
 * ----------------------------------------------------
 * Should start chosen session entry -> if something is selected
 *********************************************************/
void SWindow::cb_return()
{
  //if(!sel.item()) return;
  //curr = (Item*) sel.item();

  if(curr != 0 && curr->user_data()) {
    DataEntry* dat = (DataEntry*) curr->user_data();
    //cout << dat->short_description << endl;
    if(dat) {
      runImage(curr, dat);
    }
  }
}


/*******************************************************
 *  Callback for Selection-Browser in the center
 * ----------------------------------------------------
 * Starts the session if required -> Mouse Click
 *******************************************************/
void SWindow::cb_select()
{
  oldcurr = curr;
  curr = (Item*)  sel.item();
  if(!sel.item()) return;
  //cout << "cb_select called with" << sel.item() << endl;
  sel.select_only_this();
  if (sel.item_is_parent() )
    {
      sel.set_item_opened(true);
      return;
    }

  if( curr == oldcurr ) {
    // start image if it has data associated
    // -> double click
    //cout << ((DataEntry*)curr->user_data())->short_description << endl;
    if(curr->user_data()) {
      runImage(curr, (DataEntry*) curr->user_data() );
    }
    return;
  }
}


/**********************************************************
 * Put entries in a Linux-Session Group into Browser
 *********************************************************/
void SWindow::set_lin_entries(DataEntry** ent)
{
  this->lin_ent = ent;
  lin_entgroup = (ItemGroup*) sel.add_group("LINUX DESKTOP", &sel);
  map<string, DataEntry*> mapEntry;
  for (int i=0; ent[i] != '\0'; i++)
  {
    mapEntry.insert(make_pair(ent[i]->short_description, ent[i]));
  }
  map<string, DataEntry*>::iterator it= mapEntry.begin();
  for(;it!=mapEntry.end(); it++) {
//    Item* w= (Item*)sel.add_leaf(it->second->short_description.c_str() , lin_entgroup, (void*)it->second );
    Item* w= (Item*)lin_entgroup->add(it->second->short_description.c_str(), (void*)it->second );
    xpmImage* xpm = new xpmImage(get_symbol(it->second));
    ((Widget*) w)->image(xpm);
    w->tooltip(it->second->description.c_str());
    w->callback(&runImage, (void*)it->second);

  }
  lin_entgroup->end();
}


/**********************************************************
 * Put entries in a VMWARE-Session Group into Browser
 *********************************************************/
void SWindow::set_entries(DataEntry** ent)
{
  this->ent = ent;
  sort_entries();

  entgroup =  (ItemGroup*)sel.add_group("VMWARE SESSIONS", &sel);
  for (int i=0; ent[i] != '\0'; i++)
  {
    Item* w= (Item*)sel.add_leaf(ent[i]->short_description.c_str(), entgroup, (void*)ent[i] );

    xpmImage* xpm = new xpmImage(get_symbol(ent[i]));
    ((Widget*) w)->image(xpm);
    w->tooltip(ent[i]->description.c_str());
    w->callback(&runImage, (void*)ent[i]);

  }
  entgroup->end();

}

/**************************************************************
 * free arrays (which are dynamically allocated)
 **************************************************************/
void SWindow::free_entries()
{
  for (int i=0; ent[i] != '\0'; i++)
    {
      free(ent[i]);
    }
  free(ent);
}



/******************************************************
 * Small helper function to unfold the 2 parent groups
 *
 * ADDED: Now reads session from ~/.openslx/vmchooser via helper
 *
 * WARNING: this->ent and/or this->lin_ent
 *          has to assigned before         WARNING
 ******************************************************/
void SWindow::unfold_entries(bool lin_entries, bool vm_entries, char* defsession) {
  int ind = 0;
  if(lin_entries) {
    sel.goto_index(ind);
    if(sel.item_is_parent() ) {
      sel.set_item_opened(true);
    }
    ind++;
  }
  if(vm_entries) {
    sel.goto_index(ind);
    if(sel.item_is_parent() ) {
      sel.set_item_opened(true);
    }
  }

  if(! (lin_entries || vm_entries) ) {
    return;
  }
  sel.next_visible();
  sel.select_only_this(ind);
  curr = (Item*) sel.item();
  //sel.set_focus();
  //sel.set_item_selected(true,1);
  //sel.indented(false);

  char* prename = readSession();
  DataEntry* dp = NULL;
  if(defsession) {
	  prename = defsession;
  }
  if ( prename == '\0' ) {
    return;
  } else {
    sel.goto_index(0);
    Item* it = (Item*) sel.next();

    while( it ) {
	  dp = (DataEntry*) it->user_data();
	  if(!dp) {
		  it = (Item*) sel.next();
		  continue;
	  }
      if( dp->short_description.find(prename) != string::npos ) {
          sel.select_only_this(0);
          curr = it;
          return;
      }
      it = (Item*) sel.next();
    }
  }
}


/******************************************************
 * Helper function to get symbols for entries
 ******************************************************/
const char** SWindow::get_symbol(DataEntry* dat) {
  if(dat->imgtype == VMWARE) {
	if(dat->os.find("win") != string::npos || dat->os.find("Win") == string::npos) {
		if(dat->locked) {
			return xp_locked_32_xpm;
		}
		else {
			return xp_32_xpm;
		}
	}

	if(dat->icon.find("gentoo") != string::npos || dat->icon.find("Gentoo") != string::npos ) {
		return gentoo_32_xpm;
	}
	if(dat->icon.find("suse") != string::npos || dat->icon.find("Suse") != string::npos ) {
		return suse_32_xpm;
	}
	if(dat->icon.find("ubuntu") != string::npos || dat->icon.find("Ubuntu") != string::npos ) {
		return ubuntu_32_xpm;
	}
	if(dat->os.find("linux") != string::npos) {
		return linux_32_xpm;
	}
	if(dat->icon.find("bsd") != string::npos
			|| dat->icon.find("BSD") != string::npos
			|| dat->icon.find("Bsd") != string::npos) {
		return bsd_32_xpm;
	}
	if(dat->icon.find("mac") != string::npos
			|| dat->icon.find("Mac") != string::npos
			|| dat->icon.find("apple") != string::npos) {
		return macos_32_xpm;
	}

	return vmware_32_xpm;
  }
  if(dat->imgtype == LINUX) {
    if(dat->short_description.find("KDE")!= string::npos) {
    	return kde_32_xpm;
    }
    if(dat->short_description.find("GNOME")!= string::npos) {
      return gnome_32_xpm;
    }
    if(dat->short_description.find("Xfce")!= string::npos) {
      return xfce_32_xpm;
    }
    return linux_32_xpm;
  }

  return linux_32_xpm;
}


/******************************************************
 * Sort entries to consider priorities
 *
 * -> puts smallest priority number on top
 ******************************************************/
void SWindow::sort_entries() {
  if(ent == '\0' ) {
    return;
  }
  DataEntry* ptr;

  // worst case sort - but it is enough for this few entries
  for(int i=0; ent[i] != '\0'; i++) {
    for(int j=0; ent[j] != '\0'; j++) {
      if(ent[j]->priority < ent[i]->priority && j > i) {
        // swap element i with j (as i is alway larger j)
        ptr = ent[i];
        ent[i] = ent[j];
        ent[j] = ptr;
      }
    }
  }
}