diff options
Diffstat (limited to 'vmchooser2/SWindow.cxx')
-rw-r--r-- | vmchooser2/SWindow.cxx | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/vmchooser2/SWindow.cxx b/vmchooser2/SWindow.cxx new file mode 100644 index 0000000..e28b4b7 --- /dev/null +++ b/vmchooser2/SWindow.cxx @@ -0,0 +1,340 @@ +#if 0 +#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++) + { + if(!ent[i]->active) continue; + 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; + } + } + } +} +#endif |