Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

GUILofar.cc

Go to the documentation of this file.
00001 /*
00002 
00003     LOFAR/DEMON GUI
00004     Copyright (C) 2000-2003 Jussi Laako
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 */
00021 
00022 
00023 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <string.h>
00026 #include <math.h>
00027 #include <time.h>
00028 #include <signal.h>
00029 #include <sys/types.h>
00030 #include <gtk/gtk.h>
00031 #include <gdk/gdkrgb.h>
00032 
00033 #include "GUILofar.hh"
00034 
00035 
00036 G_LOCK_DEFINE_STATIC(gmInputMutex);
00037 
00038 static const char *cpWindowTxt = "LOFAR / DEMON";
00039 // Table 1
00040 static const char *cpLServerTxt = "Server";
00041 static const char *cpaLChannelTxt[] = { "Channel", "Direction" };
00042 static const char *cpBConnectTxt = "Connect";
00043 static const char *cpBDisconnectTxt = "Disconnect";
00044 static const char *cpCBFreezeTxt = "Freeze";
00045 // Table 2
00046 static const char *cpLTypeTxt = "Type";
00047 static const char *cpaLTypeMenu[] = { "FFT", "Cepstrum", "Autocorr." };
00048 static const char *cpLWindowTxt = "Window";
00049 static const char *cpaLWindowMenu[] = { "Rectangle", "Bartlett",
00050     "Blackman", "Blackman-Harris", "Cosine tapered", "Exponential",
00051     "Flat-top", "Hamming", "Hanning", "Kaiser", "Kaiser-Bessel", "Tukey" };
00052 static const char *cpLWinParamTxt = "Window param.";
00053 static const char *cpLWinLengthTxt = "Window length";
00054 static const char *cpaLWinLengthMenu[] = { "1024", "2048", "4096", "8192",
00055     "16384", "32768", "65536" };
00056 static const char *cpLLowerFreqTxt = "Lower freq.";
00057 static const char *cpLHigherFreqTxt = "Higher freq.";
00058 static const char *cpLOverlapTxt = "Overlap %";
00059 // Table 3
00060 static const char *cpLRemoveNoiseTxt = "Remove noise";
00061 static const char *cpaLRemoveNoiseMenu[] = { "None", "TPSW", "OTA",
00062     "Diff", "InvDiff", "StdDev" };
00063 static const char *cpLAlphaTxt = "Alpha";
00064 static const char *cpLMeanLengthTxt = "Mean length";
00065 static const char *cpLGapLengthTxt = "Gap length";
00066 static const char *cpLAverageCountTxt = "Average count";
00067 static const char *cpLClipTxt = "Clip";
00068 static const char *cpaLClipMenu[] = { "None", "Low", "Both", "Mean" ,
00069     "Median", "10 dB", "20 dB", "50%", "75%", "Offset", "Offset 2",
00070     "Offset 3", "Sliding" };
00071 static const char *cpCBLinearTxt = "Linear";
00072 static const char *cpCBDemonTxt = "DEMON";
00073 static const char *cpLPaletteTxt = "Palette";
00074 static const char *cpaLPaletteMenu[] = { "BW", "HSV", "Light", "Temp",
00075     "Dir", "Green", "Green2", "Green3", "Green4", "PureGreen", "WB" };
00076 static const char *cpCBAverageTxt = "ContAvg";
00077 static const char *cpCBSavingTxt = "Saving";
00078 static const char *cpBSaveTxt = "Save";
00079 static const char *cpFSSaveTxt = "Save to TIFF file";
00080 // Table 4
00081 static const char *cpLClipValueTxt = "Clip value";
00082 
00083 clGUILofar *GUILofar;
00084 
00085 
00086 int main(int argc, char *argv[])
00087 {
00088     int iRetVal;
00089 
00090     signal(SIGPIPE, SIG_IGN);
00091     signal(SIGFPE, SIG_IGN);
00092     GUILofar = new clGUILofar(&argc, &argv);
00093     iRetVal = GUILofar->Exec();
00094     delete GUILofar;
00095     return iRetVal;
00096 }
00097 
00098 
00099 gint WrapOnDelete (GtkWidget *gwSender, GdkEventAny *geaEvent)
00100 {
00101     return GUILofar->OnDelete(gwSender, geaEvent);
00102 }
00103 
00104 
00105 void WrapOnHideToggled (GtkToggleButton *gtbSender, gpointer gpData)
00106 {
00107     GUILofar->OnHideToggled(gtbSender, gpData);
00108 }
00109 
00110 
00111 gint WrapOnConnectClick (GtkWidget *gwSender, gpointer gpData)
00112 {
00113     return GUILofar->OnConnectClick(gwSender, gpData);
00114 }
00115 
00116 
00117 void WrapOnFreezeToggled (GtkToggleButton *gtbSender, gpointer gpData)
00118 {
00119     GUILofar->OnFreezeToggled(gtbSender, gpData);
00120 }
00121 
00122 
00123 gint WrapOnExposeLofar (GtkWidget *gwSender, GdkEventExpose *geeEvent,
00124     gpointer gpData)
00125 {
00126     return GUILofar->OnExposeLofar(gwSender, geeEvent, gpData);
00127 }
00128 
00129 
00130 gint WrapOnConfigureLofar (GtkWidget *gwSender, GdkEventConfigure *gecEvent,
00131     gpointer gpData)
00132 {
00133     return GUILofar->OnConfigureLofar(gwSender, gecEvent, gpData);
00134 }
00135 
00136 
00137 gint WrapOnExposeLine (GtkWidget *gwSender, GdkEventExpose *geeEvent,
00138     gpointer gpData)
00139 {
00140     return GUILofar->OnExposeLine(gwSender, geeEvent, gpData);
00141 }
00142 
00143 
00144 gint WrapOnExposeCursor (GtkWidget *gwSender, GdkEventExpose *geeEvent,
00145     gpointer gpData)
00146 {
00147     return GUILofar->OnExposeCursor(gwSender, geeEvent, gpData);
00148 }
00149 
00150 
00151 gint WrapOnMotionLofar (GtkWidget *gwSender, GdkEventMotion *gemEvent,
00152     gpointer gpData)
00153 {
00154     return GUILofar->OnMotionLofar(gwSender, gemEvent, gpData);
00155 }
00156 
00157 
00158 gint WrapOnPaletteActivate (GtkWidget *gwSender, gpointer gpData)
00159 {
00160     return GUILofar->OnPaletteActivate(gwSender, gpData);
00161 }
00162 
00163 
00164 void WrapOnAverageToggled (GtkToggleButton *gtbSender, gpointer gpData)
00165 {
00166     GUILofar->OnAverageToggled(gtbSender, gpData);
00167 }
00168 
00169 
00170 void WrapOnClipValueChanged (GtkAdjustment *gaSender, gpointer gpData)
00171 {
00172     GUILofar->OnClipValueChanged(gaSender, gpData);
00173 }
00174 
00175 
00176 void WrapOnSaveClicks (GtkWidget *gwSender, gpointer gpData)
00177 {
00178     GUILofar->OnSaveClicks(gwSender, gpData);
00179 }
00180 
00181 
00182 void WrapOnGdkInput (gpointer gpData, gint giSource,
00183     GdkInputCondition gicCondition)
00184 {
00185     GUILofar->OnGdkInput(gpData, giSource, gicCondition);
00186 }
00187 
00188 
00189 bool clGUILofar::Build ()
00190 {
00191     // --- Main window
00192     gwWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00193     gtk_window_set_title(GTK_WINDOW(gwWindow), cpWindowTxt);
00194     // shrink, grow, auto-shrink
00195     gtk_window_set_policy(GTK_WINDOW(gwWindow), TRUE, TRUE, FALSE);
00196     #if (GTK_MAJOR_VERSION == 1)
00197     gtk_window_set_default_size(GTK_WINDOW(gwWindow), 
00198         gdk_screen_width() - LGUI_PADDING * 2,
00199         gwWindow->requisition.height);
00200     #endif
00201     // Realization of main window is delayed for later time
00202     // gtk_widget_show(gwWindow);
00203 
00204     // --- Vertical box
00205     // homogenous, spacing
00206     gwVBox = gtk_vbox_new(FALSE, LGUI_PADDING);
00207     gtk_container_add(GTK_CONTAINER(gwWindow), gwVBox);
00208     gtk_widget_show(gwVBox);
00209 
00210     // --- Hide button
00211     gwCBHide = gtk_check_button_new();
00212     gtk_box_pack_start(GTK_BOX(gwVBox), gwCBHide, FALSE, FALSE, 0);
00213     gtk_widget_show(gwCBHide);
00214 
00215     // --- Table 1
00216     if (!BuildTable1()) return false;
00217 
00218     // --- Table 2
00219     if (!BuildTable2()) return false;
00220 
00221     // --- Table 3
00222     if (!BuildTable3()) return false;
00223 
00224     // --- Table 4
00225     if (!BuildTable4()) return false;
00226 
00227     // --- Table Lofar
00228     if (!BuildTableLofar()) return false;
00229 
00230     // --- Status bar
00231     gwStatusBar = gtk_statusbar_new();
00232     gtk_box_pack_start(GTK_BOX(gwVBox), gwStatusBar, FALSE, FALSE, 0);
00233     gtk_widget_show(gwStatusBar);
00234     guSbCtxt = gtk_statusbar_get_context_id(GTK_STATUSBAR(gwStatusBar),
00235         "status");
00236     gtk_statusbar_push(GTK_STATUSBAR(gwStatusBar), guSbCtxt, "");
00237 
00238     // Delayed realization of main window
00239     gtk_widget_show(gwWindow);
00240     #if (GTK_MAJOR_VERSION > 1)
00241     gtk_window_resize(GTK_WINDOW(gwWindow), 
00242         gdk_screen_width() - LGUI_PADDING * 2,
00243         gwWindow->requisition.height);
00244     #endif
00245 
00246     // Build drawing primitives
00247     if (!BuildDrawingPrims()) return false;
00248 
00249     // Set cursors
00250     gdk_window_set_cursor(gwDALofar->window, gcCrossHair);
00251     gdk_window_set_cursor(gwDALine->window, gcCrossHair);
00252 
00253     // Enable backing store
00254     //GtkUtils.EnableBackingStore(gwDALofar);
00255 
00256     // Set default widget
00257     //gtk_window_set_default(GTK_WINDOW(gwWindow), gwBConnect);
00258 
00259     return true;
00260 }
00261 
00262 
00263 bool clGUILofar::BuildTable1 ()
00264 {
00265     // rows, columns, homogenous
00266     gwTable1 = gtk_table_new(2, 5, FALSE);
00267     // box, child, expand, fill, padding
00268     gtk_box_pack_start(GTK_BOX(gwVBox), gwTable1, FALSE, FALSE, 0);
00269     gtk_widget_show(gwTable1);
00270 
00271     // - Label & Combo: Server
00272     gwLServer = gtk_label_new(cpLServerTxt);
00273     gtk_label_set_justify(GTK_LABEL(gwLServer), GTK_JUSTIFY_LEFT);
00274     gtk_table_attach(GTK_TABLE(gwTable1), gwLServer,
00275         0, 1, 0, 1,
00276         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00277         (GtkAttachOptions) 0,
00278         LGUI_PADDING / 2, 0);
00279     gtk_widget_show(gwLServer);
00280     gwCServer = gtk_combo_new();
00281     gtk_entry_set_max_length(GTK_ENTRY(GTK_COMBO(gwCServer)->entry),
00282         LGUI_SERVER_MAXLEN);
00283     gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(gwCServer)->entry),
00284         "127.0.0.1:30001");
00285     // table, child, left attach, right attach, top attach, bottom attach,
00286     // x-options, y-options, x-padding, y-padding
00287     gtk_table_attach(GTK_TABLE(gwTable1), gwCServer,
00288         0, 1, 1, 2,
00289         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00290         (GtkAttachOptions) 0,
00291         LGUI_PADDING / 2, 0);
00292     gtk_widget_show(gwCServer);
00293     GtkUtils.ComboListFromFile(gwCServer, &glServer, LGUI_HOSTFILE);
00294 
00295     // - Label & SpinButton: Channel
00296     if (iBeamCount)
00297         gwLChannel = gtk_label_new(cpaLChannelTxt[1]);
00298     else
00299         gwLChannel = gtk_label_new(cpaLChannelTxt[0]);
00300     gtk_label_set_justify(GTK_LABEL(gwLChannel), GTK_JUSTIFY_LEFT);
00301     gtk_table_attach(GTK_TABLE(gwTable1), gwLChannel,
00302         1, 2, 0, 1,
00303         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00304         LGUI_PADDING / 2, 0);
00305     gtk_widget_show(gwLChannel);
00306     if (iBeamCount)
00307     {
00308         // value, lower limit, upper limit, step increment, page increment,
00309         // page size
00310         goAChannel = gtk_adjustment_new(0.0, -90.0, 90.0, 1.0, 1.0, 1.0);
00311         // adjustment, climb rate, digits
00312         gwSBChannel = gtk_spin_button_new(GTK_ADJUSTMENT(goAChannel), 1.0, 1);
00313     }
00314     else
00315     {
00316         // value, lower limit, upper limit, step increment, page increment,
00317         // page size
00318         goAChannel = gtk_adjustment_new(1.0, LGUI_CH_LOWER, LGUI_CH_UPPER, 1.0,
00319             1.0, 1.0);
00320         // adjustment, climb rate, digits
00321         gwSBChannel = gtk_spin_button_new(GTK_ADJUSTMENT(goAChannel), 1.0, 0);
00322     }
00323     gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(gwSBChannel), TRUE);
00324     gtk_table_attach(GTK_TABLE(gwTable1), gwSBChannel,
00325         1, 2, 1, 2,
00326         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00327         LGUI_PADDING / 2, 0);
00328     gtk_widget_show(gwSBChannel);
00329 
00330     // - Button: Connect
00331     gwBConnect = gtk_button_new_with_label(cpBConnectTxt);
00332     gtk_table_attach(GTK_TABLE(gwTable1), gwBConnect,
00333         2, 3, 1, 2,
00334         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00335         LGUI_PADDING / 2, 0);
00336     gtk_widget_show(gwBConnect);
00337 
00338     // - Button: Disconnect
00339     gwBDisconnect = gtk_button_new_with_label(cpBDisconnectTxt);
00340     gtk_table_attach(GTK_TABLE(gwTable1), gwBDisconnect,
00341         3, 4, 1, 2,
00342         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00343         LGUI_PADDING / 2, 0);
00344     gtk_widget_show(gwBDisconnect);
00345 
00346     // - CheckButton: Freeze
00347     gwCBFreeze = gtk_check_button_new_with_label(cpCBFreezeTxt);
00348     gtk_table_attach(GTK_TABLE(gwTable1), gwCBFreeze,
00349         4, 5, 1, 2,
00350         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00351         LGUI_PADDING / 2, 0);
00352     gtk_widget_show(gwCBFreeze);
00353 
00354     return true;
00355 }
00356 
00357 
00358 bool clGUILofar::BuildTable2 ()
00359 {
00360     char cpConvBuf[LGUI_CONV_BUF_SIZE];
00361 
00362     // rows, columns, homogenous
00363     gwTable2 = gtk_table_new(2, 7, FALSE);
00364     // box, child, expand, fill, padding
00365     gtk_box_pack_start(GTK_BOX(gwVBox), gwTable2, FALSE, FALSE, 0);
00366     gtk_widget_show(gwTable2);
00367 
00368     // Label & OptionMenu: Type
00369     gwLType = gtk_label_new(cpLTypeTxt);
00370     gtk_label_set_justify(GTK_LABEL(gwLType), GTK_JUSTIFY_LEFT);
00371     gtk_table_attach(GTK_TABLE(gwTable2), gwLType,
00372         0, 1, 0, 1,
00373         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00374         LGUI_PADDING / 2, 0);
00375     gtk_widget_show(gwLType);
00376     gwOMType = gtk_option_menu_new();
00377     gtk_table_attach(GTK_TABLE(gwTable2), gwOMType,
00378         0, 1, 1, 2,
00379         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00380         LGUI_PADDING / 2, 0);
00381     gtk_widget_show(gwOMType);
00382     GtkUtils.BuildOptionMenu(gwOMType, &gwMType, gwaMIType,
00383         cpaLTypeMenu, LGUI_TYPE_ITEMS);
00384 
00385     // Label & OptionMenu: Window
00386     gwLWindow = gtk_label_new(cpLWindowTxt);
00387     gtk_label_set_justify(GTK_LABEL(gwLWindow), GTK_JUSTIFY_LEFT);
00388     gtk_table_attach(GTK_TABLE(gwTable2), gwLWindow,
00389         1, 2, 0, 1,
00390         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00391         LGUI_PADDING / 2, 0);
00392     gtk_widget_show(gwLWindow);
00393     gwOMWindow = gtk_option_menu_new();
00394     gtk_table_attach(GTK_TABLE(gwTable2), gwOMWindow,
00395         1, 2, 1, 2,
00396         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00397         LGUI_PADDING / 2, 0);
00398     gtk_widget_show(gwOMWindow);
00399     GtkUtils.BuildOptionMenu(gwOMWindow, &gwMWindow, gwaMIWindow,
00400         cpaLWindowMenu, LGUI_WINDOW_ITEMS);
00401 
00402     // Label & Entry: Window parameter
00403     gwLWinParam = gtk_label_new(cpLWinParamTxt);
00404     gtk_label_set_justify(GTK_LABEL(gwLWinParam), GTK_JUSTIFY_LEFT);
00405     gtk_table_attach(GTK_TABLE(gwTable2), gwLWinParam,
00406         2, 3, 0, 1,
00407         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00408         (GtkAttachOptions) 0,
00409         LGUI_PADDING / 2, 0);
00410     gtk_widget_show(gwLWinParam);
00411     gwEWinParam = gtk_entry_new();
00412     gtk_table_attach(GTK_TABLE(gwTable2), gwEWinParam,
00413         2, 3, 1, 2,
00414         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00415         (GtkAttachOptions) 0,
00416         LGUI_PADDING / 2, 0);
00417     gtk_widget_show(gwEWinParam);
00418     gtk_widget_set_usize(gwEWinParam, LGUI_ENTRY_WIDTH,
00419         gwEWinParam->requisition.height);
00420 
00421     // Label & OptionMenu: Window length
00422     gwLWinLength = gtk_label_new(cpLWinLengthTxt);
00423     gtk_label_set_justify(GTK_LABEL(gwLWinLength), GTK_JUSTIFY_LEFT);
00424     gtk_table_attach(GTK_TABLE(gwTable2), gwLWinLength,
00425         3, 4, 0, 1,
00426         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00427         LGUI_PADDING / 2, 0);
00428     gtk_widget_show(gwLWinLength);
00429     gwOMWinLength = gtk_option_menu_new();
00430     gtk_table_attach(GTK_TABLE(gwTable2), gwOMWinLength,
00431         3, 4, 1, 2,
00432         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00433         LGUI_PADDING / 2, 0);
00434     gtk_widget_show(gwOMWinLength);
00435     GtkUtils.BuildOptionMenu(gwOMWinLength, &gwMWinLength, gwaMIWinLength,
00436         cpaLWinLengthMenu, LGUI_WIN_LENGTH_ITEMS);
00437     gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMWinLength),
00438         ((guint) (log(sLofarRq.lWinLength) / log(2.0) + 0.5) - 10));
00439 
00440     // Label & Entry: Lower frequency
00441     gwLLowerFreq = gtk_label_new(cpLLowerFreqTxt);
00442     gtk_label_set_justify(GTK_LABEL(gwLLowerFreq), GTK_JUSTIFY_LEFT);
00443     gtk_table_attach(GTK_TABLE(gwTable2), gwLLowerFreq,
00444         4, 5, 0, 1,
00445         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00446         (GtkAttachOptions) 0,
00447         LGUI_PADDING / 2, 0);
00448     gtk_widget_show(gwLLowerFreq);
00449     gwELowerFreq = gtk_entry_new();
00450     gtk_table_attach(GTK_TABLE(gwTable2), gwELowerFreq,
00451         4, 5, 1, 2,
00452         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00453         (GtkAttachOptions) 0,
00454         LGUI_PADDING / 2, 0);
00455     gtk_widget_show(gwELowerFreq);
00456     gtk_widget_set_usize(gwELowerFreq, LGUI_ENTRY_WIDTH,
00457         gwELowerFreq->requisition.height);
00458     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarRq.fLowFreq);
00459     gtk_entry_set_text(GTK_ENTRY(gwELowerFreq), cpConvBuf);
00460 
00461     // Label & Entry: Higher frequency
00462     gwLHigherFreq = gtk_label_new(cpLHigherFreqTxt);
00463     gtk_label_set_justify(GTK_LABEL(gwLHigherFreq), GTK_JUSTIFY_LEFT);
00464     gtk_table_attach(GTK_TABLE(gwTable2), gwLHigherFreq,
00465         5, 6, 0, 1,
00466         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00467         (GtkAttachOptions) 0,
00468         LGUI_PADDING / 2, 0);
00469     gtk_widget_show(gwLHigherFreq);
00470     gwEHigherFreq = gtk_entry_new();
00471     gtk_table_attach(GTK_TABLE(gwTable2), gwEHigherFreq,
00472         5, 6, 1, 2,
00473         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00474         (GtkAttachOptions) 0,
00475         LGUI_PADDING / 2, 0);
00476     gtk_widget_show(gwEHigherFreq);
00477     gtk_widget_set_usize(gwEHigherFreq, LGUI_ENTRY_WIDTH,
00478         gwEHigherFreq->requisition.height);
00479     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarRq.fHighFreq);
00480     gtk_entry_set_text(GTK_ENTRY(gwEHigherFreq), cpConvBuf);
00481 
00482     // Label & Entry: Overlap
00483     gwLOverlap = gtk_label_new(cpLOverlapTxt);
00484     gtk_label_set_justify(GTK_LABEL(gwLOverlap), GTK_JUSTIFY_LEFT);
00485     gtk_table_attach(GTK_TABLE(gwTable2), gwLOverlap,
00486         6, 7, 0, 1,
00487         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00488         (GtkAttachOptions) 0,
00489         LGUI_PADDING / 2, 0);
00490     gtk_widget_show(gwLOverlap);
00491     gwEOverlap = gtk_entry_new();
00492     gtk_table_attach(GTK_TABLE(gwTable2), gwEOverlap,
00493         6, 7, 1, 2,
00494         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00495         (GtkAttachOptions) 0,
00496         LGUI_PADDING / 2, 0);
00497     gtk_widget_show(gwEOverlap);
00498     gtk_widget_set_usize(gwEOverlap, LGUI_ENTRY_WIDTH,
00499         gwEOverlap->requisition.height);
00500 
00501     return true;
00502 }
00503 
00504 
00505 bool clGUILofar::BuildTable3 ()
00506 {
00507     char cpConvBuf[LGUI_CONV_BUF_SIZE];
00508 
00509     // rows, columns, homogenous
00510     gwTable3 = gtk_table_new(2, 10, FALSE);
00511     // box, child, expand, fill, padding
00512     gtk_box_pack_start(GTK_BOX(gwVBox), gwTable3, FALSE, FALSE, 0);
00513     gtk_widget_show(gwTable3);
00514     
00515     // Label & OptionMenu: Remove noise
00516     gwLRemoveNoise = gtk_label_new(cpLRemoveNoiseTxt);
00517     gtk_label_set_justify(GTK_LABEL(gwLRemoveNoise), GTK_JUSTIFY_LEFT);
00518     gtk_table_attach(GTK_TABLE(gwTable3), gwLRemoveNoise,
00519         0, 1, 0, 1,
00520         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00521         LGUI_PADDING / 2, 0);
00522     gtk_widget_show(gwLRemoveNoise);
00523     gwOMRemoveNoise = gtk_option_menu_new();
00524     gtk_table_attach(GTK_TABLE(gwTable3), gwOMRemoveNoise,
00525         0, 1, 1, 2,
00526         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00527         LGUI_PADDING / 2, 0);
00528     gtk_widget_show(gwOMRemoveNoise);
00529     GtkUtils.BuildOptionMenu(gwOMRemoveNoise, &gwMRemoveNoise, 
00530         gwaMIRemoveNoise, cpaLRemoveNoiseMenu, LGUI_REMOVE_NOISE_ITEMS);
00531     gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMRemoveNoise),
00532         sLofarRq.iRemoveNoise);
00533 
00534     // Label & Entry: Alpha
00535     gwLAlpha = gtk_label_new(cpLAlphaTxt);
00536     gtk_label_set_justify(GTK_LABEL(gwLAlpha), GTK_JUSTIFY_LEFT);
00537     gtk_table_attach(GTK_TABLE(gwTable3), gwLAlpha,
00538         1, 2, 0, 1,
00539         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00540         (GtkAttachOptions) 0,
00541         LGUI_PADDING / 2, 0);
00542     gtk_widget_show(gwLAlpha);
00543     gwEAlpha = gtk_entry_new();
00544     gtk_table_attach(GTK_TABLE(gwTable3), gwEAlpha,
00545         1, 2, 1, 2,
00546         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00547         (GtkAttachOptions) 0,
00548         LGUI_PADDING / 2, 0);
00549     gtk_widget_show(gwEAlpha);
00550     gtk_widget_set_usize(gwEAlpha, LGUI_ENTRY_WIDTH,
00551         gwEAlpha->requisition.height);
00552     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarRq.fAlpha);
00553     gtk_entry_set_text(GTK_ENTRY(gwEAlpha), cpConvBuf);
00554 
00555     // Label & Entry: Mean length
00556     gwLMeanLength = gtk_label_new(cpLMeanLengthTxt);
00557     gtk_label_set_justify(GTK_LABEL(gwLMeanLength), GTK_JUSTIFY_LEFT);
00558     gtk_table_attach(GTK_TABLE(gwTable3), gwLMeanLength,
00559         2, 3, 0, 1,
00560         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00561         (GtkAttachOptions) 0,
00562         LGUI_PADDING / 2, 0);
00563     gtk_widget_show(gwLMeanLength);
00564     gwEMeanLength = gtk_entry_new();
00565     gtk_table_attach(GTK_TABLE(gwTable3), gwEMeanLength,
00566         2, 3, 1, 2,
00567         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00568         (GtkAttachOptions) 0,
00569         LGUI_PADDING / 2, 0);
00570     gtk_widget_show(gwEMeanLength);
00571     gtk_widget_set_usize(gwEMeanLength, LGUI_ENTRY_WIDTH,
00572         gwEMeanLength->requisition.height);
00573     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%li", sLofarRq.lMeanLength);
00574     gtk_entry_set_text(GTK_ENTRY(gwEMeanLength), cpConvBuf);
00575 
00576     // Label & Entry: Gap length
00577     gwLGapLength = gtk_label_new(cpLGapLengthTxt);
00578     gtk_label_set_justify(GTK_LABEL(gwLGapLength), GTK_JUSTIFY_LEFT);
00579     gtk_table_attach(GTK_TABLE(gwTable3), gwLGapLength,
00580         3, 4, 0, 1,
00581         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00582         (GtkAttachOptions) 0,
00583         LGUI_PADDING / 2, 0);
00584     gtk_widget_show(gwLGapLength);
00585     gwEGapLength = gtk_entry_new();
00586     gtk_table_attach(GTK_TABLE(gwTable3), gwEGapLength,
00587         3, 4, 1, 2,
00588         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00589         (GtkAttachOptions) 0,
00590         LGUI_PADDING / 2, 0);
00591     gtk_widget_show(gwEGapLength);
00592     gtk_widget_set_usize(gwEGapLength, LGUI_ENTRY_WIDTH,
00593         gwEGapLength->requisition.height);
00594     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%li", sLofarRq.lGapLength);
00595     gtk_entry_set_text(GTK_ENTRY(gwEGapLength), cpConvBuf);
00596 
00597     // Label & Entry: Average count
00598     gwLAverageCount = gtk_label_new(cpLAverageCountTxt);
00599     gtk_label_set_justify(GTK_LABEL(gwLAverageCount), GTK_JUSTIFY_LEFT);
00600     gtk_table_attach(GTK_TABLE(gwTable3), gwLAverageCount,
00601         4, 5, 0, 1,
00602         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00603         (GtkAttachOptions) 0,
00604         LGUI_PADDING / 2, 0);
00605     gtk_widget_show(gwLAverageCount);
00606     gwEAverageCount = gtk_entry_new();
00607     gtk_table_attach(GTK_TABLE(gwTable3), gwEAverageCount,
00608         4, 5, 1, 2,
00609         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00610         (GtkAttachOptions) 0,
00611         LGUI_PADDING / 2, 0);
00612     gtk_widget_show(gwEAverageCount);
00613     gtk_widget_set_usize(gwEAverageCount, LGUI_ENTRY_WIDTH,
00614         gwEGapLength->requisition.height);
00615     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%li", sLofarRq.lAvgCount);
00616     gtk_entry_set_text(GTK_ENTRY(gwEAverageCount), cpConvBuf);
00617 
00618     // Label & OptionMenu: Clip
00619     gwLClip = gtk_label_new(cpLClipTxt);
00620     gtk_label_set_justify(GTK_LABEL(gwLClip), GTK_JUSTIFY_LEFT);
00621     gtk_table_attach(GTK_TABLE(gwTable3), gwLClip,
00622         5, 6, 0, 1,
00623         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00624         LGUI_PADDING / 2, 0);
00625     gtk_widget_show(gwLClip);
00626     gwOMClip = gtk_option_menu_new();
00627     gtk_table_attach(GTK_TABLE(gwTable3), gwOMClip,
00628         5, 6, 1, 2,
00629         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00630         LGUI_PADDING / 2, 0);
00631     gtk_widget_show(gwOMClip);
00632     GtkUtils.BuildOptionMenu(gwOMClip, &gwMClip, gwaMIClip, cpaLClipMenu,
00633         LGUI_CLIP_ITEMS);
00634     gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMClip), sLofarRq.iClip);
00635 
00636     // CheckButton: Linear
00637     gwCBLinear = gtk_check_button_new_with_label(cpCBLinearTxt);
00638     gtk_table_attach(GTK_TABLE(gwTable3), gwCBLinear,
00639         6, 7, 0, 1,
00640         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00641         LGUI_PADDING / 2, 0);
00642     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gwCBLinear), TRUE);
00643     gtk_widget_show(gwCBLinear);
00644 
00645     // CheckButton: DEMON
00646     gwCBDemon = gtk_check_button_new_with_label(cpCBDemonTxt);
00647     gtk_table_attach(GTK_TABLE(gwTable3), gwCBDemon,
00648         6, 7, 1, 2,
00649         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00650         LGUI_PADDING / 2, 0);
00651     //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gwCBDemon), TRUE);
00652     gtk_widget_show(gwCBDemon);
00653 
00654     // Label & OptionMenu: Palette
00655     gwLPalette = gtk_label_new(cpLPaletteTxt);
00656     gtk_label_set_justify(GTK_LABEL(gwLPalette), GTK_JUSTIFY_LEFT);
00657     gtk_table_attach(GTK_TABLE(gwTable3), gwLPalette,
00658         7, 8, 0, 1,
00659         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00660         LGUI_PADDING / 2, 0);
00661     gtk_widget_show(gwLPalette);
00662     gwOMPalette = gtk_option_menu_new();
00663     gtk_table_attach(GTK_TABLE(gwTable3), gwOMPalette,
00664         7, 8, 1, 2,
00665         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00666         LGUI_PADDING / 2, 0);
00667     gtk_widget_show(gwOMPalette);
00668     GtkUtils.BuildOptionMenu(gwOMPalette, &gwMPalette, gwaMIPalette,
00669         cpaLPaletteMenu, LGUI_PALETTE_ITEMS);
00670     gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMPalette), 
00671         (guint) iPalette);
00672 
00673     // CheckButton: Average
00674     gwCBAverage = gtk_check_button_new_with_label(cpCBAverageTxt);
00675     gtk_table_attach(GTK_TABLE(gwTable3), gwCBAverage,
00676         8, 9, 1, 2,
00677         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00678         LGUI_PADDING / 2, 0);
00679     //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gwCBAverage), TRUE);
00680     gtk_widget_show(gwCBAverage);
00681 
00682     // CheckButton: Saving
00683     gwCBSaving = gtk_check_button_new_with_label(cpCBSavingTxt);
00684     gtk_table_attach(GTK_TABLE(gwTable3), gwCBSaving,
00685         9, 10, 0, 1,
00686         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00687         LGUI_PADDING / 2, 0);
00688     gtk_widget_show(gwCBSaving);
00689 
00690     // Button: Save
00691     gwBSave = gtk_button_new_with_label(cpBSaveTxt);
00692     gtk_table_attach(GTK_TABLE(gwTable3), gwBSave,
00693         9, 10, 1, 2,
00694         (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00695         LGUI_PADDING / 2, 0);
00696     gtk_widget_show(gwBSave);
00697 
00698     // FileSelection: Save
00699     gwFSSave = gtk_file_selection_new(cpFSSaveTxt);
00700 
00701     return true;
00702 }
00703 
00704 
00705 bool clGUILofar::BuildTable4 ()
00706 {
00707     // rows, columns, homogenous
00708     gwTable4 = gtk_table_new(2, 1, FALSE);
00709     // box, child, expand, fill, padding
00710     gtk_box_pack_start(GTK_BOX(gwVBox), gwTable4, FALSE, FALSE, 0);
00711     gtk_widget_show(gwTable4);
00712 
00713     // Label & Horizontal Scale: Clip
00714     gwLClipValue = gtk_label_new(cpLClipValueTxt);
00715     gtk_table_attach(GTK_TABLE(gwTable4), gwLClipValue,
00716         0, 1, 0, 1,
00717         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00718         (GtkAttachOptions) 0,
00719         LGUI_PADDING / 2, 0);
00720     gtk_widget_show(gwLClipValue);
00721     // there is a stupid bug in scale/adjustment which leaves maximum value
00722     // one step away from specified maximum
00723     goAClipValue = gtk_adjustment_new(1, 0, 1.01, 0.01, 0.1, 0.01);
00724     gwHSClipValue = gtk_hscale_new(GTK_ADJUSTMENT(goAClipValue));
00725     gtk_scale_set_digits(GTK_SCALE(gwHSClipValue), 2);
00726     gtk_table_attach(GTK_TABLE(gwTable4), gwHSClipValue,
00727         0, 1, 1, 2,
00728         (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00729         (GtkAttachOptions) 0,
00730         LGUI_PADDING / 2, 0);
00731     gtk_widget_show(gwHSClipValue);
00732 
00733     return true;
00734 }
00735 
00736 
00737 bool clGUILofar::BuildTableLofar ()
00738 {
00739     // rows, columns, homogenous
00740     gwTableLofar = gtk_table_new(4, 1, FALSE);
00741     // box, child, expand, fill, padding
00742     gtk_box_pack_start(GTK_BOX(gwVBox), gwTableLofar, TRUE, TRUE, 0);
00743     gtk_widget_show(gwTableLofar);
00744 
00745     // Label: Top time
00746     gwLTopTime = gtk_label_new("00:00:00");
00747     gtk_label_set_justify(GTK_LABEL(gwLTopTime), GTK_JUSTIFY_RIGHT);
00748     gtk_table_attach(GTK_TABLE(gwTableLofar), gwLTopTime,
00749         0, 1, 0, 1,
00750         (GtkAttachOptions) (GTK_FILL),
00751         (GtkAttachOptions) 0,
00752         0, 0);
00753     gtk_widget_show(gwLTopTime);
00754 
00755     // Label: Bottom time
00756     gwLBottomTime = gtk_label_new("00:00:00");
00757     gtk_label_set_justify(GTK_LABEL(gwLBottomTime), GTK_JUSTIFY_RIGHT);
00758     gtk_table_attach(GTK_TABLE(gwTableLofar), gwLBottomTime,
00759         0, 1, 2, 3,
00760         (GtkAttachOptions) (GTK_FILL),
00761         (GtkAttachOptions) 0,
00762         0, 0);
00763     gtk_widget_show(gwLBottomTime);
00764 
00765     // ScrolledWindow: Lofar
00766     gwSWLofar = gtk_scrolled_window_new(NULL, NULL);
00767     if (iFit)
00768         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gwSWLofar),
00769             GTK_POLICY_NEVER, GTK_POLICY_NEVER);
00770     else
00771         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gwSWLofar),
00772             GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
00773     gtk_table_attach(GTK_TABLE(gwTableLofar), gwSWLofar,
00774         0, 1, 1, 2,
00775         (GtkAttachOptions) (GTK_FILL|GTK_SHRINK|GTK_EXPAND),
00776         (GtkAttachOptions) (GTK_FILL|GTK_SHRINK|GTK_EXPAND),
00777         0, 0);
00778     gtk_widget_show(gwSWLofar);
00779 
00780     // rows, columns, homogenous
00781     gwTableLofar2 = gtk_table_new(3, 2, FALSE);
00782     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(gwSWLofar),
00783         gwTableLofar2);
00784     gtk_widget_show(gwTableLofar2);
00785 
00786     // HorizontalRuler: Frequency
00787     gwHRFrequency = gtk_hruler_new();
00788     gtk_ruler_set_metric(GTK_RULER(gwHRFrequency), GTK_PIXELS);
00789     // ruler, lower, upper, position, max size
00790     gtk_ruler_set_range(GTK_RULER(gwHRFrequency), 
00791         0.0, (gfloat) sLofarRq.lWinLength, 0.0, (gfloat) sLofarRq.lWinLength);
00792     gtk_table_attach(GTK_TABLE(gwTableLofar2), gwHRFrequency,
00793         1, 2, 0, 1,
00794         (GtkAttachOptions) (GTK_FILL),
00795         (GtkAttachOptions) 0,
00796         0, 0);
00797     gtk_widget_show(gwHRFrequency);
00798 
00799     // DrawingArea: Line spectrum
00800     gwDALine = gtk_drawing_area_new();
00801     // drawing area, width, height
00802     gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALine), 1000, 
00803         LGUI_LINESPECT_HEIGHT);
00804     gtk_table_attach(GTK_TABLE(gwTableLofar2), gwDALine,
00805         1, 2, 1, 2,
00806         (GtkAttachOptions) (GTK_FILL),
00807         (GtkAttachOptions) (GTK_FILL),
00808         0, 0);
00809     gtk_widget_show(gwDALine);
00810 
00811     // DrawingArea: Cursor
00812     gwDACursor = gtk_drawing_area_new();
00813     // drawing area, width, height
00814     gtk_drawing_area_size(GTK_DRAWING_AREA(gwDACursor), 1000,
00815         LGUI_CURSOR_HEIGHT);
00816     gtk_table_attach(GTK_TABLE(gwTableLofar2), gwDACursor,
00817         1, 2, 2, 3,
00818         (GtkAttachOptions) (GTK_FILL),
00819         (GtkAttachOptions) (GTK_FILL),
00820         0, 0);
00821     gtk_widget_show(gwDACursor);
00822 
00823     // VerticalRuler: Time
00824     gwVRTime = gtk_vruler_new();
00825     gtk_ruler_set_metric(GTK_RULER(gwVRTime), GTK_PIXELS);
00826     // ruler, lower, upper, position, max size
00827     gtk_ruler_set_range(GTK_RULER(gwVRTime), 0.0, -1.0, 0.0, 0.0);
00828     gtk_table_attach(GTK_TABLE(gwTableLofar2), gwVRTime,
00829         0, 1, 3, 4,
00830         (GtkAttachOptions) 0,
00831         (GtkAttachOptions) (GTK_FILL|GTK_SHRINK|GTK_EXPAND),
00832         0, 0);
00833     gtk_widget_show(gwVRTime);
00834 
00835     // DrawingArea: Lofar
00836     gwDALofar = gtk_drawing_area_new();
00837     // drawing area, width, height
00838     gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALofar), 1000, 100);
00839     gtk_table_attach(GTK_TABLE(gwTableLofar2), gwDALofar,
00840         1, 2, 3, 4,
00841         (GtkAttachOptions) (GTK_FILL),
00842         (GtkAttachOptions) (GTK_FILL),
00843         0, 0);
00844     gtk_widget_show(gwDALofar);
00845 
00846     return true;
00847 }
00848 
00849 
00850 bool clGUILofar::BuildDrawingPrims ()
00851 {
00852     int iPalType;
00853 
00854     // Create graphics contexts
00855     ggcLofarBG = gdk_gc_new(gwDALofar->window);
00856     gdk_rgb_gc_set_foreground(ggcLofarBG, LGUI_LOFAR_BG);
00857     gdk_rgb_gc_set_background(ggcLofarBG, LGUI_LOFAR_BG);
00858     gdk_gc_set_function(ggcLofarBG, GDK_COPY);
00859     gdk_gc_set_fill(ggcLofarBG, GDK_SOLID);
00860 
00861     ggcLofarFG = gdk_gc_new(gwDALofar->window);
00862     gdk_rgb_gc_set_foreground(ggcLofarFG, LGUI_LOFAR_FG);
00863     gdk_rgb_gc_set_background(ggcLofarFG, LGUI_LOFAR_BG);
00864     gdk_gc_set_function(ggcLofarFG, GDK_COPY);
00865     gdk_gc_set_fill(ggcLofarFG, GDK_SOLID);
00866 
00867     ggcLineBG = gdk_gc_new(gwDALine->window);
00868     gdk_rgb_gc_set_foreground(ggcLineBG, LGUI_LINE_BG);
00869     gdk_rgb_gc_set_background(ggcLineBG, LGUI_LINE_BG);
00870     gdk_gc_set_function(ggcLineBG, GDK_COPY);
00871     gdk_gc_set_fill(ggcLineBG, GDK_SOLID);
00872 
00873     ggcLineFG = gdk_gc_new(gwDALine->window);
00874     gdk_rgb_gc_set_foreground(ggcLineFG, LGUI_LINE_FG);
00875     gdk_rgb_gc_set_background(ggcLineFG, LGUI_LINE_BG);
00876     gdk_gc_set_function(ggcLineFG, GDK_COPY);
00877     gdk_gc_set_fill(ggcLineFG, GDK_SOLID);
00878 
00879     ggcCursorBG = gdk_gc_new(gwDACursor->window);
00880     gdk_rgb_gc_set_foreground(ggcCursorBG, LGUI_CURSOR_BG);
00881     gdk_rgb_gc_set_background(ggcCursorBG, LGUI_CURSOR_BG);
00882     gdk_gc_set_function(ggcCursorBG, GDK_COPY);
00883     gdk_gc_set_fill(ggcCursorBG, GDK_SOLID);
00884 
00885     ggcCursorFG = gdk_gc_new(gwDACursor->window);
00886     gdk_rgb_gc_set_foreground(ggcCursorFG, LGUI_CURSOR_FG);
00887     gdk_rgb_gc_set_background(ggcCursorFG, LGUI_CURSOR_BG);
00888     gdk_gc_set_function(ggcCursorFG, GDK_COPY);
00889     gdk_gc_set_fill(ggcCursorFG, GDK_SOLID);
00890 
00891     // Create cursors
00892     gcCrossHair = gdk_cursor_new(GDK_CROSSHAIR);
00893 
00894     // Create specified palette for direction display
00895     Cfg.GetInt("Palette", &iPalType);
00896     SetPalette(iPalType);
00897 
00898     return true;
00899 }
00900 
00901 
00902 void clGUILofar::FreeDrawingPrims ()
00903 {
00904     gdk_cursor_destroy(gcCrossHair);
00905     gdk_gc_destroy(ggcLofarBG);
00906     gdk_gc_destroy(ggcLofarFG);
00907     gdk_gc_destroy(ggcLineBG);
00908     gdk_gc_destroy(ggcLineFG);
00909     gdk_gc_destroy(ggcCursorBG);
00910     gdk_gc_destroy(ggcCursorFG);
00911 }
00912 
00913 
00914 bool clGUILofar::ConnectSignals ()
00915 {
00916     int iWidgetCntr;
00917 
00918     gtk_signal_connect(GTK_OBJECT(gwWindow), "delete_event",
00919         GTK_SIGNAL_FUNC(WrapOnDelete), NULL);
00920 
00921     gtk_signal_connect(GTK_OBJECT(gwCBHide), "toggled",
00922         GTK_SIGNAL_FUNC(WrapOnHideToggled), NULL);
00923 
00924     //gtk_widget_add_events(gwDALofar, GDK_ALL_EVENTS_MASK);
00925     gtk_widget_add_events(gwDALofar, 
00926         (GDK_POINTER_MOTION_MASK|GDK_BUTTON_MOTION_MASK|
00927         GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK|
00928         GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|
00929         GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK));
00930     GtkUtils.ConnectMotionEvent(gwHRFrequency, gwDALofar);
00931     GtkUtils.ConnectMotionEvent(gwVRTime, gwDALofar);
00932     gtk_signal_connect(GTK_OBJECT(gwDALofar), "expose_event",
00933         GTK_SIGNAL_FUNC(WrapOnExposeLofar), NULL);
00934     gtk_signal_connect(GTK_OBJECT(gwDALofar), "configure_event",
00935         GTK_SIGNAL_FUNC(WrapOnConfigureLofar), NULL);
00936     gtk_signal_connect(GTK_OBJECT(gwDALofar), "motion_notify_event",
00937         GTK_SIGNAL_FUNC(WrapOnMotionLofar), NULL);
00938 
00939     gtk_widget_add_events(gwDALine, GDK_POINTER_MOTION_MASK);
00940     GtkUtils.ConnectMotionEvent(gwHRFrequency, gwDALine);
00941     gtk_signal_connect(GTK_OBJECT(gwDALine), "expose_event",
00942         GTK_SIGNAL_FUNC(WrapOnExposeLine), NULL);
00943 
00944     gtk_signal_connect(GTK_OBJECT(gwDACursor), "expose_event",
00945         GTK_SIGNAL_FUNC(WrapOnExposeCursor), NULL);
00946 
00947     gtk_signal_connect(GTK_OBJECT(gwBConnect), "clicked",
00948         GTK_SIGNAL_FUNC(WrapOnConnectClick), NULL);
00949     gtk_signal_connect(GTK_OBJECT(gwBDisconnect), "clicked",
00950         GTK_SIGNAL_FUNC(WrapOnConnectClick), NULL);
00951     gtk_signal_connect(GTK_OBJECT(gwCBFreeze), "toggled",
00952         GTK_SIGNAL_FUNC(WrapOnFreezeToggled), NULL);
00953 
00954     for (iWidgetCntr = 0; iWidgetCntr < LGUI_PALETTE_ITEMS; iWidgetCntr++)
00955     {
00956         gtk_signal_connect(GTK_OBJECT(gwaMIPalette[iWidgetCntr]), "activate",
00957             GTK_SIGNAL_FUNC(WrapOnPaletteActivate), (gpointer) iWidgetCntr);
00958     }
00959 
00960     gtk_signal_connect(GTK_OBJECT(gwCBAverage), "toggled",
00961         GTK_SIGNAL_FUNC(WrapOnAverageToggled), NULL);
00962 
00963     gtk_signal_connect(GTK_OBJECT(gwCBSaving), "toggled",
00964         GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(3));
00965     gtk_signal_connect(GTK_OBJECT(gwBSave), "clicked",
00966         GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(2));
00967     gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(gwFSSave)->ok_button),
00968         "clicked", GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(1));
00969     gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(gwFSSave)->cancel_button),
00970         "clicked", GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(0));
00971 
00972     gtk_signal_connect(GTK_OBJECT(goAClipValue), "value-changed",
00973         GTK_SIGNAL_FUNC(WrapOnClipValueChanged), NULL);
00974 
00975     return true;
00976 }
00977 
00978 
00979 bool clGUILofar::ParseServerStr (char *cpHostRes, int *ipPortRes,
00980     const char *cpSourceStr)
00981 {
00982     char cpTempStr[LGUI_SERVER_MAXLEN + 1];
00983     char *cpTempHost;
00984     char *cpTempPort;
00985 
00986     strncpy(cpTempStr, cpSourceStr, LGUI_SERVER_MAXLEN);
00987     cpTempHost = strtok(cpTempStr, ": \t\n");
00988     if (cpTempHost != NULL)
00989     {
00990         strcpy(cpHostRes, cpTempHost);
00991         cpTempPort = strtok(NULL, " \t\n");
00992         if (cpTempPort != NULL)
00993         {
00994             *ipPortRes = atoi(cpTempPort);
00995             if (*ipPortRes > 0) return true;
00996         }
00997     }
00998     return false;
00999 }
01000 
01001 
01002 bool clGUILofar::InitConnection (const char *cpServerHost, int iServerPort)
01003 {
01004     int iSockH;
01005     char cpReqProcName[GLOBAL_HEADER_LEN];
01006 
01007     iSockH = SClient.Connect(cpServerHost, NULL, iServerPort);
01008     if (iSockH < 0) 
01009     {
01010         g_print("Failed to connect host!\n");
01011         return false;
01012     }
01013     g_print("Connection established - sending process request...\n");
01014     bConnected = true;
01015     SOp.SetHandle(iSockH);
01016     strcpy(cpReqProcName, LGUI_REQ_PROC);
01017     if (SOp.WriteN(cpReqProcName, GLOBAL_HEADER_LEN) < GLOBAL_HEADER_LEN)
01018     {
01019         g_print("Failed to send process request!\n");
01020         return false;
01021     }
01022     g_print("Sending settings...\n");
01023     if (!SendSettings())
01024     {
01025         g_print("Failed to send settings!\n");
01026         return false;
01027     }
01028     lSpectSize = sLofarRq.lWinLength / 2L + 1L;
01029     SpectData.Size(sizeof(GDT) * lSpectSize);
01030     AvgSpectData.Size(sizeof(GDT) * lSpectSize);
01031     bConfigured = false;
01032     iClips = 0;
01033     giGdkTag = gdk_input_add(iSockH, GDK_INPUT_READ, WrapOnGdkInput, NULL);
01034     return true;
01035 }
01036 
01037 
01038 bool clGUILofar::SendSettings ()
01039 {
01040     float fDirection;
01041     char cpMsgBuf[GLOBAL_HEADER_LEN];
01042 
01043     if (iBeamCount)
01044     {
01045         fDirection = gtk_spin_button_get_value_as_float(
01046             GTK_SPIN_BUTTON(gwSBChannel)) + 90.0f;
01047         sLofarRq.iChannel = (int) 
01048             (fDirection / (180.0f / (float) (iBeamCount - 1)));
01049         g_print("Channel: %i\n", sLofarRq.iChannel);
01050     }
01051     else
01052     {
01053         sLofarRq.iChannel = gtk_spin_button_get_value_as_int(
01054             GTK_SPIN_BUTTON(gwSBChannel)) - 1;
01055     }
01056     sLofarRq.iType = GtkUtils.OptionMenuGetActive(gwOMType, gwaMIType, 
01057         LGUI_TYPE_ITEMS);
01058     sLofarRq.iWindow = GtkUtils.OptionMenuGetActive(gwOMWindow, gwaMIWindow,
01059         LGUI_WINDOW_ITEMS);
01060     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEWinParam)), "%g", 
01061         &sLofarRq.fWinParameter);
01062     sLofarRq.lWinLength = (long) (pow(2.0, 
01063         10 + GtkUtils.OptionMenuGetActive(gwOMWinLength, gwaMIWinLength,
01064         LGUI_WIN_LENGTH_ITEMS)) + 0.5);
01065     sscanf(gtk_entry_get_text(GTK_ENTRY(gwELowerFreq)), "%g",
01066         &sLofarRq.fLowFreq);
01067     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEHigherFreq)), "%g",
01068         &sLofarRq.fHighFreq);
01069     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEOverlap)), "%i",
01070         &sLofarRq.iOverlap);
01071     sLofarRq.bLinear = (gtk_toggle_button_get_active(
01072         GTK_TOGGLE_BUTTON(gwCBLinear))) ? true : false;
01073     sLofarRq.iRemoveNoise = GtkUtils.OptionMenuGetActive(gwOMRemoveNoise,
01074         gwaMIRemoveNoise, LGUI_REMOVE_NOISE_ITEMS);
01075     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEAlpha)), "%g",
01076         &sLofarRq.fAlpha);
01077     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEMeanLength)), "%li",
01078         &sLofarRq.lMeanLength);
01079     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEGapLength)), "%li",
01080         &sLofarRq.lGapLength);
01081     sscanf(gtk_entry_get_text(GTK_ENTRY(gwEAverageCount)), "%li",
01082         &sLofarRq.lAvgCount);
01083     if (sLofarRq.lAvgCount <= 0) sLofarRq.lAvgCount = 1;
01084     sLofarRq.bDemon = (gtk_toggle_button_get_active(
01085         GTK_TOGGLE_BUTTON(gwCBDemon))) ? true : false;
01086     sLofarRq.iClip = GtkUtils.OptionMenuGetActive(gwOMClip, gwaMIClip,
01087         LGUI_CLIP_ITEMS);
01088 
01089     LofarMsg.SetRequest(cpMsgBuf, &sLofarRq);
01090     if (SOp.WriteN(cpMsgBuf, GLOBAL_HEADER_LEN) != GLOBAL_HEADER_LEN)
01091         return false;
01092     
01093     return true;
01094 }
01095 
01096 
01097 void clGUILofar::PrintStatus ()
01098 {
01099     time_t ttCursorTime;
01100     float fFreqRes;
01101     float fFreq;
01102     float fTime;
01103     float fCursorC;
01104     float fCursorD;
01105     char cpTimeBuf[LGUI_CONV_BUF_SIZE];
01106     char cpConvBuf[LGUI_CONV_BUF_SIZE];
01107 
01108     if (iFit)
01109     {
01110         if (iLofarWidth != 0)
01111         {
01112             if (!sLofarRq.bDemon)
01113             {
01114                 fFreqRes = (sLofarResHdr.fHighFreq - sLofarResHdr.fLowFreq) /
01115                     ((float) iLofarWidth);
01116             }
01117             else
01118             {
01119                 fFreqRes = sLofarResHdr.fDemonBand / 
01120                     (float) iLofarWidth;
01121             }
01122         }
01123         else fFreqRes = 0.0f;
01124     }
01125     else
01126     {
01127         if (sLofarResHdr.lSpectLength != 0)
01128         {
01129             if (!sLofarRq.bDemon)
01130             {
01131                 fFreqRes = (sLofarResHdr.fHighFreq - sLofarResHdr.fLowFreq) /
01132                     ((float) sLofarResHdr.lSpectLength);
01133             }
01134             else
01135             {
01136                 fFreqRes = sLofarResHdr.fDemonBand / 
01137                     (float) sLofarResHdr.lSpectLength;
01138             }
01139         }
01140         else fFreqRes = 0.0f;
01141     }
01142     fFreq = ((float) iCursorX) * fFreqRes;
01143     if (!sLofarRq.bDemon)
01144         fFreq += sLofarResHdr.fLowFreq;
01145     fTime = sLofarResHdr.fLineTime * (float) iCursorY;
01146     fCursorC = ((float) sLCursor.iPosition) * fFreqRes;
01147     fCursorD = ((float) sLCursor.iDistance) * fFreqRes;
01148     ttCursorTime = (time_t) 
01149         ((float) sLofarResHdr.sTimeStamp.tv_sec - fTime + 0.5f);
01150     strftime(cpTimeBuf, LGUI_CONV_BUF_SIZE, "%H:%M:%S", 
01151         localtime(&ttCursorTime));
01152     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, 
01153         "%.2f Hz  %.2f s  (%s)  /  %.2f dB  %i clips, c = %.2f Hz  d = %.2f Hz",
01154         fFreq, fTime, cpTimeBuf, sLofarResHdr.fPeakLevel, iClips,
01155         fCursorC, fCursorD);
01156     gtk_statusbar_pop(GTK_STATUSBAR(gwStatusBar), guSbCtxt);
01157     gtk_statusbar_push(GTK_STATUSBAR(gwStatusBar), guSbCtxt, cpConvBuf);
01158 }
01159 
01160 
01161 void clGUILofar::SetPalette (int iPalType)
01162 {
01163     switch (iPalType)
01164     {
01165         case LGUI_PAL_BW:
01166             FBLofar.PalGenBW();
01167             break;
01168         case LGUI_PAL_HSV:
01169             FBLofar.PalGenHSV();
01170             break;
01171         case LGUI_PAL_LIGHT:
01172             FBLofar.PalGenLight();
01173             break;
01174         case LGUI_PAL_TEMP:
01175             FBLofar.PalGenTemp();
01176             break;
01177         case LGUI_PAL_DIR:
01178             FBLofar.PalGenDir();
01179             break;
01180         case LGUI_PAL_GREEN:
01181             FBLofar.PalGenGreen();
01182             break;
01183         case LGUI_PAL_GREEN2:
01184             FBLofar.PalGenGreen2();
01185             break;
01186         case LGUI_PAL_GREEN3:
01187             FBLofar.PalGenGreen3();
01188             break;
01189         case LGUI_PAL_GREEN4:
01190             FBLofar.PalGenGreen4();
01191             break;
01192         case LGUI_PAL_PUREGREEN:
01193             FBLofar.PalGenPureGreen();
01194             break;
01195         case LGUI_PAL_WB:
01196             FBLofar.PalGenWB();
01197             break;
01198         default:
01199             FBLofar.PalGenBW();
01200     }
01201 }
01202 
01203 
01204 void clGUILofar::Configure ()
01205 {
01206     char cpConvBuf[LGUI_CONV_BUF_SIZE];
01207     
01208     lSpectSize = sLofarResHdr.lSpectLength;
01209     if (iFit)
01210         iLofarWidth = 
01211             gwSWLofar->allocation.width - gwVRTime->allocation.width - 2;
01212     else
01213         iLofarWidth = (int) lSpectSize;
01214     FBLofar.SetSize(iLofarWidth, iLofarHeight);
01215     //FBLofar.Clear();
01216     // Without following, window size is reset at gtk_drawing_area_size!
01217     gtk_widget_set_usize(gwWindow, gwWindow->allocation.width,
01218         gwWindow->allocation.height);
01219     gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALofar), iLofarWidth, 
01220         iLofarHeight);
01221     gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALine), iLofarWidth,
01222         gwDALine->requisition.height);
01223     gtk_drawing_area_size(GTK_DRAWING_AREA(gwDACursor), iLofarWidth,
01224         gwDACursor->requisition.height);
01225     if (!sLofarRq.bDemon)
01226     {
01227         gtk_ruler_set_range(GTK_RULER(gwHRFrequency), 
01228             sLofarResHdr.fLowFreq, sLofarResHdr.fHighFreq, 
01229             sLofarResHdr.fLowFreq, sLofarResHdr.fHighFreq);
01230     }
01231     else
01232     {
01233         gtk_ruler_set_range(GTK_RULER(gwHRFrequency),
01234             0.0, sLofarResHdr.fDemonBand,
01235             0.0, sLofarResHdr.fDemonBand);
01236     }
01237     gtk_ruler_set_range(GTK_RULER(gwVRTime), 
01238         0.0, iLofarHeight * sLofarResHdr.fLineTime / 60.0f, 
01239         0.0, 0.0);
01240     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarResHdr.fLowFreq);
01241     gtk_entry_set_text(GTK_ENTRY(gwELowerFreq), cpConvBuf);
01242     g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", 
01243         sLofarResHdr.fHighFreq);
01244     gtk_entry_set_text(GTK_ENTRY(gwEHigherFreq), cpConvBuf);
01245     bConfigured = true;
01246 }
01247 
01248 
01249 void clGUILofar::ConfigureHeight ()
01250 {
01251     iLofarHeight = gwDALofar->allocation.height;
01252     FBLofar.SetSize(iLofarWidth, iLofarHeight);
01253     gtk_ruler_set_range(GTK_RULER(gwVRTime),
01254         0.0, iLofarHeight * sLofarResHdr.fLineTime / 60.0f,
01255         0.0, 0.0);
01256 }
01257 
01258 
01259 void clGUILofar::DrawCursor ()
01260 {
01261     int iLineCntr;
01262     int iLineX;
01263 
01264     gdk_draw_rectangle(gwDACursor->window, ggcCursorBG, TRUE,
01265         0, 0, gwDACursor->allocation.width, gwDACursor->allocation.height);
01266     switch (sLCursor.iType)
01267     {
01268         case LGUI_CURSOR_11:
01269             for (iLineCntr = -5; iLineCntr <= 5; iLineCntr++)
01270             {
01271                 iLineX = sLCursor.iPosition + iLineCntr * sLCursor.iDistance;
01272                 gdk_draw_line(gwDACursor->window, ggcCursorFG,
01273                     iLineX, 0, iLineX, gwDACursor->allocation.height - 1);
01274             }
01275             break;
01276         case LGUI_CURSOR_INF:
01277             if (sLCursor.iDistance <= 0) break;
01278             iLineX = 0;
01279             do {
01280                 gdk_draw_line(gwDACursor->window, ggcCursorFG,
01281                     iLineX, 0, iLineX, gwDACursor->allocation.height - 1);
01282                 iLineX += sLCursor.iDistance;
01283             } while (iLineX < gwDACursor->allocation.width);
01284             break;
01285         default:
01286             g_warning("Uknown cursor type %i", sLCursor.iType);
01287     }
01288 }
01289 
01290 
01291 void clGUILofar::SaveInfo (const char *cpFileName, time_t ttStartTime)
01292 {
01293     char *cpFullFileName;
01294     char cpTime[20];
01295     FILE *fileInfo;
01296 
01297     cpFullFileName = g_strdup_printf("%s.inf", cpFileName);
01298     fileInfo = fopen(cpFullFileName, FB_TIFF_MODE);
01299     g_free(cpFullFileName);
01300     if (fileInfo == NULL) return;
01301     strftime(cpTime, 20, "%Y/%m/%d %H:%M:%S", localtime(&ttStartTime));
01302     fprintf(fileInfo, "Time: %s\n", cpTime);
01303     fprintf(fileInfo, "LowFreq: %f\n", sLofarResHdr.fLowFreq);
01304     fprintf(fileInfo, "HighFreq: %f\n", sLofarResHdr.fHighFreq);
01305     if (sLofarRq.bDemon)
01306         fprintf(fileInfo, "DemonBand: %f\n", sLofarResHdr.fDemonBand);
01307     fprintf(fileInfo, "LineTime: %f\n", sLofarResHdr.fLineTime);
01308     fclose(fileInfo);
01309 }
01310 
01311 
01312 void clGUILofar::StartNewImgFile ()
01313 {
01314     char *cpCompleteFileName;
01315 
01316     FBLofar.StopSaveToFile();
01317     cpCompleteFileName = g_strdup_printf("%s%02i.tif", 
01318         strImgFileName.c_str(), iImgCount);
01319     if (!FBLofar.StartSaveToFile(cpCompleteFileName, iCompressMode, 
01320         iJPEGQuality, "LOFAR/DEMON", FB_TIFF_CONT_VERTICAL))
01321     {
01322         g_warning("Saving to file failed!");
01323         gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(gwCBSaving));
01324         bSaving = false;
01325     }
01326     SaveInfo(cpCompleteFileName, time(NULL));
01327     g_free(cpCompleteFileName);
01328 }
01329 
01330 
01331 clGUILofar::clGUILofar (int *ipArgC, char ***cpapArgV)
01332 {
01333     bRun = true;
01334     bConnected = false;
01335     bFreezed = false;
01336     bConfigured = false;
01337     bAveraged = false;
01338     bCursorDrag = false;
01339     fClip = 1;
01340     glServer = NULL;
01341     memset(&sLCursor, 0x00, sizeof(stLofarCursor));
01342     g_print("%s GUI v%i.%i.%i\n", cpWindowTxt,
01343         LGUI_VER_MAJ, LGUI_VER_MIN, LGUI_VER_PL);
01344     g_print("Copyright (C) 2000-2002 Jussi Laako\n\n");
01345     g_print("Gtk+ version %i.%i.%i\n", gtk_major_version, gtk_minor_version,
01346         gtk_micro_version);
01347     g_print("Locale set to %s\n", gtk_set_locale());
01348     gtk_init(ipArgC, cpapArgV);
01349     gdk_rgb_init();
01350     gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
01351     gtk_widget_set_default_visual(gdk_rgb_get_visual());
01352     Cfg.SetFileName(LGUI_CFGFILE);
01353     if (!Cfg.GetInt("WindowLength", &sLofarRq.lWinLength))
01354         sLofarRq.lWinLength = LGUI_DEF_WIN_LENGTH;
01355     if (!Cfg.GetFlt("LowFrequency", &sLofarRq.fLowFreq))
01356         sLofarRq.fLowFreq = LGUI_DEF_LOW_FREQ;
01357     if (!Cfg.GetFlt("HighFrequency", &sLofarRq.fHighFreq))
01358         sLofarRq.fHighFreq = LGUI_DEF_HIGH_FREQ;
01359     if (!Cfg.GetInt("RemoveNoise", &sLofarRq.iRemoveNoise))
01360         sLofarRq.iRemoveNoise = LGUI_DEF_REMOVE_NOISE;
01361     if (!Cfg.GetFlt("Alpha", &sLofarRq.fAlpha))
01362         sLofarRq.fAlpha = LGUI_DEF_ALPHA;
01363     if (!Cfg.GetInt("MeanLength", &sLofarRq.lMeanLength))
01364         sLofarRq.lMeanLength = LGUI_DEF_MEAN_LENGTH;
01365     if (!Cfg.GetInt("GapLength", &sLofarRq.lGapLength))
01366         sLofarRq.lGapLength = LGUI_DEF_GAP_LENGTH;
01367     if (!Cfg.GetInt("AverageCount", &sLofarRq.lAvgCount))
01368         sLofarRq.lAvgCount = 1;
01369     if (!Cfg.GetInt("Clip", &sLofarRq.iClip))
01370         sLofarRq.iClip = MSG_LOFAR_CLIP_NONE;
01371     if (!Cfg.GetInt("Fit", &iFit))
01372         iFit = 0;
01373     if (!Cfg.GetInt("Palette", &iPalette))
01374         iPalette = 0;
01375     if (!iFit)
01376         iLofarWidth = sLofarRq.lWinLength;
01377     if (!Cfg.GetInt("Height", &iLofarHeight))
01378         iLofarHeight = LGUI_DEF_HEIGHT;
01379     if (!Cfg.GetInt("TIFFCompression", &iTIFFCompression))
01380         iTIFFCompression = 0;
01381     if (!Cfg.GetInt("JPEGQuality", &iJPEGQuality))
01382         iJPEGQuality = 100;
01383     if (!Cfg.GetInt("ContSaveScans", &iContSaveScans))
01384         iContSaveScans = 1024;
01385     if (!Cfg.GetInt("BeamCount", &iBeamCount))
01386         iBeamCount = 0;
01387     switch (iTIFFCompression)
01388     {
01389         case 0:
01390             iCompressMode = FB_TIFF_COMPRESS_NONE;
01391             break;
01392         case 1:
01393             iCompressMode = FB_TIFF_COMPRESS_RLE;
01394             break;
01395         case 2:
01396             iCompressMode = FB_TIFF_COMPRESS_LZW;
01397             break;
01398         case 3:
01399             iCompressMode = FB_TIFF_COMPRESS_JPEG;
01400             break;
01401         case 4:
01402             iCompressMode = FB_TIFF_COMPRESS_DEFLATE;
01403             break;
01404         default:
01405             iCompressMode = FB_TIFF_COMPRESS_NONE;
01406     }
01407 }
01408 
01409 
01410 clGUILofar::~clGUILofar ()
01411 {
01412 }
01413 
01414 
01415 int clGUILofar::Exec ()
01416 {
01417     FBLofar.SetSize(iLofarWidth, iLofarHeight);
01418     FBLofar.Clear();
01419     if (!Build())
01420     {
01421         g_print("User interface creation failed\n");
01422         return 1;
01423     }
01424     if (!ConnectSignals())
01425     {
01426         g_print("User interface signal connection failed\n");
01427         return 1;
01428     }
01429     gtk_main();
01430     FreeDrawingPrims();
01431     return 0;
01432 }
01433 
01434 
01435 gint clGUILofar::OnDelete (GtkWidget *gwSender, GdkEventAny *geaEvent)
01436 {
01437     bRun = false;
01438     if (bSaving)
01439     {
01440         FBLofar.StopSaveToFile();
01441     }
01442     gtk_main_quit();
01443     return 0;
01444 }
01445 
01446 
01447 void clGUILofar::OnHideToggled (GtkToggleButton *gtbSender, gpointer gpData)
01448 {
01449     if (gtk_toggle_button_get_active(gtbSender))
01450     {
01451         gtk_widget_hide(gwTable1);
01452         gtk_widget_hide(gwTable2);
01453         gtk_widget_hide(gwTable3);
01454         gtk_widget_hide(gwTable4);
01455     }
01456     else
01457     {
01458         gtk_widget_show(gwTable1);
01459         gtk_widget_show(gwTable2);
01460         gtk_widget_show(gwTable3);
01461         gtk_widget_show(gwTable4);
01462     }
01463 }
01464 
01465 
01466 gint clGUILofar::OnConnectClick (GtkWidget *gwSender, gpointer gpData)
01467 {
01468     char cpHost[LGUI_SERVER_MAXLEN + 1];
01469     int iPort;
01470 
01471     if (bConnected)
01472     {
01473         gdk_input_remove(giGdkTag);
01474         SOp.Shutdown(2);
01475         SOp.Close();
01476         bConnected = false;
01477     }
01478     if (gwSender == gwBConnect)
01479     {
01480         if (ParseServerStr(cpHost, &iPort,
01481             gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gwCServer)->entry))))
01482         {
01483             g_print("Connecting to host %s port %i...\n",
01484                 cpHost, iPort);
01485             if (InitConnection(cpHost, iPort))
01486             {
01487                 g_print("OK\n\n");
01488             }
01489             else
01490             {
01491                 g_print("Failed\n\n");
01492             }
01493         }
01494         else
01495         {
01496             g_print("Incorrect server entry! Format: <host>:<port>\n");
01497         }
01498     }
01499 
01500     return 0;
01501 }
01502 
01503 
01504 void clGUILofar::OnFreezeToggled (GtkToggleButton *gtbSender, gpointer gpData)
01505 {
01506     bFreezed = (gtk_toggle_button_get_active(gtbSender)) ? true : false;
01507 }
01508 
01509 
01510 gint clGUILofar::OnExposeLofar (GtkWidget *gwSender, GdkEventExpose *geeEvent,
01511     gpointer gpData)
01512 {
01513     int iExposeX;
01514     int iExposeY;
01515     int iExposeWidth;
01516     int iExposeHeight;
01517 
01518     iExposeX = (geeEvent->area.x >= iLofarWidth) ? 0 : geeEvent->area.x;
01519     iExposeY = (geeEvent->area.y >= iLofarHeight) ? 0 : geeEvent->area.y;
01520     iExposeWidth = (geeEvent->area.width > (iLofarWidth - iExposeX)) ?
01521         (iLofarWidth - iExposeX) : geeEvent->area.width;
01522     iExposeHeight = (geeEvent->area.height > (iLofarHeight - iExposeY)) ?
01523         (iLofarHeight - iExposeY) : geeEvent->area.height;
01524     gdk_draw_rgb_32_image(gwDALofar->window, ggcLofarFG,
01525         iExposeX, iExposeY, iExposeWidth, iExposeHeight,
01526         GDK_RGB_DITHER_NONE, FBLofar.GetCurPtr(iExposeX, iExposeY),
01527         FBLofar.GetRowStride());
01528     return 0;
01529 }
01530 
01531 
01532 gint clGUILofar::OnConfigureLofar (GtkWidget *gwSender, 
01533     GdkEventConfigure *gecEvent, gpointer gpData)
01534 {
01535     //g_print("configure: %ix%i\n", gecEvent->width, gecEvent->height);
01536     return 0;
01537 }
01538 
01539 
01540 gint clGUILofar::OnExposeLine (GtkWidget *gwSender, GdkEventExpose *geeEvent,
01541     gpointer gpData)
01542 {
01543     int iExposeX;
01544     int iExposeY;
01545     int iExposeWidth;
01546     int iExposeHeight;
01547     int iWinHeight;
01548     int iLineCntr;
01549     int iLineY1;
01550     GDT *fpSpectData = SpectData;
01551 
01552     if (fpSpectData == NULL) return 0;
01553     iWinHeight = gwDALine->allocation.height;
01554     iExposeX = (geeEvent->area.x >= lSpectSize) ? 0 : geeEvent->area.x;
01555     iExposeY = (geeEvent->area.y >= iWinHeight - 1) ? 0 : geeEvent->area.y;
01556     iExposeWidth = (geeEvent->area.width > (lSpectSize - iExposeX)) ?
01557         (lSpectSize - iExposeX) : geeEvent->area.width;
01558     iExposeHeight = (geeEvent->area.height > (iWinHeight - iExposeY)) ?
01559         (iWinHeight - iExposeY) : geeEvent->area.height;
01560     for (iLineCntr = iExposeX; iLineCntr < iExposeWidth; iLineCntr++)
01561     {
01562         iLineY1 = (int) 
01563             ((iWinHeight - iWinHeight * fpSpectData[iLineCntr]) + 0.5);
01564         gdk_draw_line(gwDALine->window, ggcLineFG, 
01565             iLineCntr, iLineY1, 
01566             iLineCntr, iWinHeight - 1);
01567     }
01568     return 0;
01569 }
01570 
01571 
01572 gint clGUILofar::OnExposeCursor (GtkWidget *gwSender, GdkEventExpose *geeEvent,
01573     gpointer gpData)
01574 {
01575     DrawCursor();
01576     return 0;
01577 }
01578 
01579 
01580 gint clGUILofar::OnMotionLofar (GtkWidget *gwSender, GdkEventMotion *gemEvent,
01581     gpointer gpData)
01582 {
01583     iCursorX = (int) gemEvent->x;
01584     iCursorY = (int) gemEvent->y;
01585     /*g_print("->x = %g, ->y = %g, ->state = %u\n", 
01586         gemEvent->x,
01587         gemEvent->y,
01588         gemEvent->state);*/
01589     /*if (gemEvent->state & GDK_SHIFT_MASK)
01590         g_print("Shift\n");
01591     if (gemEvent->state & GDK_CONTROL_MASK)
01592         g_print("Ctrl\n");*/
01593     if (gemEvent->state & GDK_BUTTON1_MASK)
01594     {
01595         if (!bCursorDrag)
01596         {
01597             sLCursor.iType = LGUI_CURSOR_11;
01598             sLCursor.iPosition = (int) gemEvent->x;
01599             bCursorDrag = true;
01600         }
01601         sLCursor.iDistance = abs(((int) gemEvent->x) - sLCursor.iPosition);
01602         DrawCursor();
01603     }
01604     else if (gemEvent->state & GDK_BUTTON2_MASK)
01605     {
01606         if (!bCursorDrag)
01607         {
01608             sLCursor.iType = LGUI_CURSOR_INF;
01609             sLCursor.iPosition = (int) gemEvent->x;
01610             bCursorDrag = true;
01611         }
01612         sLCursor.iDistance = abs(((int) gemEvent->x) - sLCursor.iPosition);
01613         DrawCursor();
01614     }
01615     else if (gemEvent->state & GDK_BUTTON3_MASK)
01616     {
01617         sLCursor.iPosition = (int) gemEvent->x;
01618         DrawCursor();
01619     }
01620     else bCursorDrag = false;
01621     PrintStatus();
01622     return 0;
01623 }
01624 
01625 
01626 gint clGUILofar::OnPaletteActivate (GtkWidget *gwSender, gpointer gpData)
01627 {
01628     iPalette = GtkUtils.OptionMenuGetActive(gwOMPalette, gwaMIPalette, 
01629         LGUI_PALETTE_ITEMS);
01630     SetPalette(iPalette);
01631     return 0;
01632 }
01633 
01634 
01635 void clGUILofar::OnAverageToggled (GtkToggleButton *gtbSender, gpointer gpData)
01636 {
01637     bAveraged = (gtk_toggle_button_get_active(gtbSender)) ? true : false;
01638 }
01639 
01640 
01641 void clGUILofar::OnClipValueChanged (GtkAdjustment *gaSender, gpointer gpData)
01642 {
01643     fClip = gaSender->value;
01644 }
01645 
01646 
01647 void clGUILofar::OnSaveClicks (GtkWidget *gwSender, gpointer gpData)
01648 {
01649     int iAction = GPOINTER_TO_INT(gpData);
01650     const char *cpFileName;
01651     char *cpParseFileName;
01652     char *cpParsePtr;
01653     char *cpCompleteFileName;
01654     double dMinX;
01655     double dMaxX;
01656     /*GtkButton *gbSender = (GtkButton *) gwSender;
01657     GtkToggleButton *gtbSender = (GtkToggleButton *) gwSender;*/
01658 
01659     bSaving = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gwCBSaving)) ? 
01660         true : false;
01661     switch (iAction)
01662     {
01663         case 0:
01664             gtk_widget_hide(gwFSSave);
01665             if (bSaving)
01666             {
01667                 gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(gwCBSaving));
01668             }
01669             break;
01670         case 1:
01671             gtk_widget_hide(gwFSSave);
01672             cpFileName = 
01673                 gtk_file_selection_get_filename(GTK_FILE_SELECTION(gwFSSave));
01674             if (cpFileName == NULL) break;
01675             cpParseFileName = g_strdup(cpFileName);
01676             cpParsePtr = strtok(cpParseFileName, ".");
01677             if (cpParsePtr != NULL)
01678             {
01679                 strImgFileName = cpParsePtr;
01680             }
01681             g_free(cpParseFileName);
01682             if (cpParsePtr == NULL) break;
01683             if (!bSaving)
01684             {
01685                 if (!sLofarRq.bDemon)
01686                 {
01687                     dMinX = sLofarResHdr.fLowFreq;
01688                     dMaxX = sLofarResHdr.fHighFreq;
01689                 }
01690                 else
01691                 {
01692                     dMinX = 0;
01693                     dMaxX = sLofarResHdr.fDemonBand;
01694                 }
01695                 cpCompleteFileName = g_strdup_printf("%s.tif", 
01696                     strImgFileName.c_str());
01697                 /*if (!FBLofar.SaveToFile(cpCompleteFileName, iCompressMode, 
01698                     iJPEGQuality, "LOFAR/DEMON",
01699                     dMinX, dMaxX,
01700                     -(sLofarResHdr.fLineTime * iLofarHeight), 0))*/
01701                 if (!FBLofar.SaveToFile(cpCompleteFileName, iCompressMode, 
01702                     iJPEGQuality, "LOFAR/DEMON"))
01703                 {
01704                     g_warning("Saving to file failed!");
01705                 }
01706                 SaveInfo(cpCompleteFileName, time(NULL) - (time_t) 
01707                     (FBLofar.GetHeight() * sLofarResHdr.fLineTime + 0.5f));
01708             }
01709             else
01710             {
01711                 iScanCount = 0;
01712                 iImgCount = 0;
01713                 cpCompleteFileName = g_strdup_printf("%s%02i.tif",
01714                     strImgFileName.c_str(), iImgCount);
01715                 if (!FBLofar.StartSaveToFile(cpCompleteFileName, 
01716                     iCompressMode, iJPEGQuality, "LOFAR/DEMON", 
01717                     FB_TIFF_CONT_VERTICAL))
01718                 {
01719                     g_warning("Saving to file failed!");
01720                     gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(gwCBSaving));
01721                 }
01722                 SaveInfo(cpCompleteFileName, time(NULL));
01723             }
01724             g_free(cpCompleteFileName);
01725             break;
01726         case 2:
01727             if (!bSaving)
01728             {
01729                 gtk_widget_show(gwFSSave);
01730             }
01731             break;
01732         case 3:
01733             if (bSaving)
01734             {
01735                 gtk_widget_show(gwFSSave);
01736             }
01737             else
01738             {
01739                 FBLofar.StopSaveToFile();
01740             }
01741             break;
01742     }
01743 }
01744 
01745 
01746 void clGUILofar::OnGdkInput (gpointer gpData, gint giSource,
01747     GdkInputCondition gicCondition)
01748 {
01749     int iResMsgBufSize = GLOBAL_HEADER_LEN + sizeof(GDT) * lSpectSize;
01750     int iLineHeight;
01751     int iLineCntr;
01752     int iLineY1;
01753     long lAvgCntr;
01754     time_t ttBottomTime;
01755     char cpConvBuf[LGUI_CONV_BUF_SIZE];
01756     #ifdef __GNUG__
01757     char cpResMsgBuf[iResMsgBufSize];
01758     #else
01759     clAlloc ResMsgBuf;
01760     char *cpResMsgBuf = (char *) ResMsgBuf.Size(iResMsgBufSize * sizeof(char));
01761     #endif
01762     clAlloc LineData;
01763     GDT *fpSpectData = SpectData;
01764     GDT *fpAvgSpectData = AvgSpectData;
01765     GDT *fpLineData;
01766 
01767     if (!bRun) return;
01768     G_LOCK(gmInputMutex);
01769     while (SOp.ReadSelect(0))
01770     {
01771         if (SOp.ReadN(cpResMsgBuf, iResMsgBufSize) == iResMsgBufSize)
01772         {
01773             if (bFreezed) continue;
01774             LofarMsg.GetResult(cpResMsgBuf, &sLofarResHdr, fpSpectData);
01775             if (fClip < 1)
01776             {
01777                 DSP.Clip(fpSpectData, fClip, lSpectSize);
01778                 DSP.Mul(fpSpectData, 1 / fClip, lSpectSize);
01779             }
01780             if (!bConfigured) Configure();
01781             if (sLofarResHdr.fPeakLevel >= 0.0f) iClips++;
01782             if (gwDALofar->allocation.height != iLofarHeight)
01783                 ConfigureHeight();
01784             fpLineData = (GDT *) LineData.Size(iLofarWidth * sizeof(GDT));
01785             if (!bAveraged)
01786             {
01787                 switch (iFit)
01788                 {
01789                     case LGUI_FIT_NEIGHBOR:
01790                         DSP.Resample(fpLineData, iLofarWidth,
01791                             fpSpectData, lSpectSize);
01792                         FBLofar.DrawLine(fpLineData);
01793                         break;
01794                     case LGUI_FIT_AVERAGE:
01795                         DSP.ResampleAvg(fpLineData, iLofarWidth,
01796                             fpSpectData, lSpectSize);
01797                         FBLofar.DrawLine(fpLineData);
01798                         break;
01799                     default:
01800                         FBLofar.DrawLine(fpSpectData);
01801                 }
01802             }
01803             else
01804             {
01805                 for (lAvgCntr = 0L; lAvgCntr < lSpectSize; lAvgCntr++)
01806                 {
01807                     fpAvgSpectData[lAvgCntr] += fpSpectData[lAvgCntr];
01808                     fpAvgSpectData[lAvgCntr] *= (GDT) 0.5;
01809                 }
01810                 switch (iFit)
01811                 {
01812                     case LGUI_FIT_NEIGHBOR:
01813                         DSP.Resample(fpLineData, iLofarWidth,
01814                             fpAvgSpectData, lSpectSize);
01815                         FBLofar.DrawLine(fpLineData);
01816                         break;
01817                     case LGUI_FIT_AVERAGE:
01818                         DSP.ResampleAvg(fpLineData, iLofarWidth,
01819                             fpAvgSpectData, lSpectSize);
01820                         FBLofar.DrawLine(fpLineData);
01821                         break;
01822                     default:
01823                         FBLofar.DrawLine(fpAvgSpectData);
01824                 }
01825             }
01826             gdk_window_copy_area(gwDALofar->window, ggcLofarFG,
01827                 0, 1,
01828                 gwDALofar->window,
01829                 0, 0, iLofarWidth, iLofarHeight - 1);
01830             gdk_draw_rgb_32_image(gwDALofar->window, ggcLofarFG,
01831                 0, 0, iLofarWidth, 1,
01832                 GDK_RGB_DITHER_NONE,
01833                 FBLofar.GetCurPtr(0,0), FBLofar.GetRowStride());
01834             gdk_window_clear(gwDALine->window);
01835             iLineHeight = gwDALine->allocation.height;
01836             if (iFit)
01837             {
01838                 for (iLineCntr = 0; iLineCntr < iLofarWidth; iLineCntr++)
01839                 {
01840                     iLineY1 = (int) 
01841                         ((iLineHeight - iLineHeight * fpLineData[iLineCntr]) +
01842                         0.5);
01843                     gdk_draw_line(gwDALine->window, ggcLineFG,
01844                         iLineCntr, iLineY1, iLineCntr, iLineHeight - 1);
01845                 }
01846             }
01847             else
01848             {
01849                 for (iLineCntr = 0; iLineCntr < lSpectSize; iLineCntr++)
01850                 {
01851                     iLineY1 = (int) 
01852                         ((iLineHeight - iLineHeight * fpSpectData[iLineCntr]) +
01853                         0.5);
01854                     gdk_draw_line(gwDALine->window, ggcLineFG,
01855                         iLineCntr, iLineY1, iLineCntr, iLineHeight - 1);
01856                 }
01857             }
01858             PrintStatus();
01859             strftime(cpConvBuf, LGUI_CONV_BUF_SIZE, "%H:%M:%S", 
01860                 localtime((time_t *) &sLofarResHdr.sTimeStamp.tv_sec));
01861             gtk_label_set_text(GTK_LABEL(gwLTopTime), cpConvBuf);
01862             ttBottomTime = (time_t) (sLofarResHdr.sTimeStamp.tv_sec -
01863                 iLofarHeight * sLofarResHdr.fLineTime + 0.5f);
01864             strftime(cpConvBuf, LGUI_CONV_BUF_SIZE, "%H:%M:%S",
01865                 localtime(&ttBottomTime));
01866             gtk_label_set_text(GTK_LABEL(gwLBottomTime), cpConvBuf);
01867             if (bSaving)
01868             {
01869                 iScanCount++;
01870                 if (iScanCount >= iContSaveScans)
01871                 {
01872                     iImgCount++;
01873                     StartNewImgFile();
01874                     iScanCount = 0;
01875                 }
01876             }
01877         }
01878         else
01879         {
01880             g_print("clSockOp::ReadN() error: %s\n", strerror(SOp.GetErrno()));
01881             gdk_input_remove(giGdkTag);
01882             SOp.Shutdown(2);
01883             SOp.Close();
01884             bConnected = false;
01885             break;
01886         }
01887     }
01888     G_UNLOCK(gmInputMutex);
01889 }
01890 

Generated on Sun Oct 26 19:11:20 2003 for HASAS by doxygen 1.3.3