summaryrefslogtreecommitdiffstats
path: root/vmchooser2/SWindow.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vmchooser2/SWindow.cxx')
-rw-r--r--vmchooser2/SWindow.cxx340
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