Fix a bunch of leaks found by Valgrind.
[gd/wireshark/.git] / ui / qt / main_window.h
1 /* main_window.h
2  *
3  * Wireshark - Network traffic analyzer
4  * By Gerald Combs <gerald@wireshark.org>
5  * Copyright 1998 Gerald Combs
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef MAINWINDOW_H
23 #define MAINWINDOW_H
24
25 #include <stdio.h>
26
27 #include <config.h>
28
29 #include <glib.h>
30
31 #include "file.h"
32
33 #include "ui/ui_util.h"
34
35 #include <epan/prefs.h>
36 #include <epan/plugin_if.h>
37
38 #ifdef HAVE_LIBPCAP
39 #include "capture_opts.h"
40 #endif
41 #include <capchild/capture_session.h>
42
43 #include <QMainWindow>
44 #include <QSplitter>
45
46 #ifdef _WIN32
47 # include <QTimer>
48 #else
49 # include <QSocketNotifier>
50 #endif
51
52 #include "capture_file.h"
53 #include "capture_file_dialog.h"
54 #include "capture_file_properties_dialog.h"
55 #include "capture_interfaces_dialog.h"
56 #include "display_filter_combo.h"
57 #include "file_set_dialog.h"
58 #include "filter_action.h"
59 #include "follow_stream_dialog.h"
60 #include "preferences_dialog.h"
61
62 class AccordionFrame;
63 class ByteViewTab;
64 class FunnelStatistics;
65 class MainWelcome;
66 class PacketList;
67 class ProtoTree;
68 class WirelessFrame;
69
70 class QAction;
71 class QActionGroup;
72
73 namespace Ui {
74     class MainWindow;
75 }
76
77 class MainWindow : public QMainWindow
78 {
79     Q_OBJECT
80
81 public:
82     explicit MainWindow(QWidget *parent = 0);
83     ~MainWindow();
84     void setPipeInputHandler(gint source, gpointer user_data, ws_process_id *child_process, pipe_input_cb_t input_cb);
85
86     QString getFilter();
87 #ifdef HAVE_LIBPCAP
88     capture_session *captureSession() { return &cap_session_; }
89 #endif
90
91     virtual QMenu *createPopupMenu();
92
93     void gotoFrame(int packet_num);
94
95 protected:
96     bool eventFilter(QObject *obj, QEvent *event);
97     void keyPressEvent(QKeyEvent *event);
98     void closeEvent(QCloseEvent *event);
99     void dragEnterEvent(QDragEnterEvent *event);
100     void dropEvent(QDropEvent *event);
101
102 private:
103     // XXX Move to FilterUtils
104     enum MatchSelected {
105         MatchSelectedReplace,
106         MatchSelectedAnd,
107         MatchSelectedOr,
108         MatchSelectedNot,
109         MatchSelectedAndNot,
110         MatchSelectedOrNot
111     };
112
113     enum CopySelected {
114         CopyAllVisibleItems,
115         CopyAllVisibleSelectedTreeItems,
116         CopySelectedDescription,
117         CopySelectedFieldName,
118         CopySelectedValue
119     };
120
121     Ui::MainWindow *main_ui_;
122     QMenu *open_recent_menu_;
123     QSplitter master_split_;
124     QSplitter extra_split_;
125     QVector<unsigned> cur_layout_;
126     MainWelcome *main_welcome_;
127     DisplayFilterCombo *df_combo_box_;
128     CaptureFile capture_file_;
129     QFont mono_font_;
130     WirelessFrame *wireless_frame_;
131     // XXX - packet_list_, proto_tree_, and byte_view_tab_ should
132     // probably be full-on values instead of pointers.
133     PacketList *packet_list_;
134     ProtoTree *proto_tree_;
135     QWidget *previous_focus_;
136     FileSetDialog file_set_dialog_;
137     ByteViewTab *byte_view_tab_;
138     QWidget empty_pane_;
139     QActionGroup *show_hide_actions_;
140     QActionGroup *time_display_actions_;
141     QActionGroup *time_precision_actions_;
142     FunnelStatistics *funnel_statistics_;
143
144     bool capture_stopping_;
145     bool capture_filter_valid_;
146 #ifdef HAVE_LIBPCAP
147     capture_session cap_session_;
148     CaptureInterfacesDialog capture_interfaces_dialog_;
149 #endif
150
151     // Pipe input
152     gint                pipe_source_;
153     gpointer            pipe_user_data_;
154     ws_process_id      *pipe_child_process_;
155     pipe_input_cb_t     pipe_input_cb_;
156 #ifdef _WIN32
157     QTimer *pipe_timer_;
158 #else
159     QSocketNotifier *pipe_notifier_;
160 #endif
161
162     QWidget* getLayoutWidget(layout_pane_content_e type);
163
164     void mergeCaptureFile();
165     void importCaptureFile();
166     void saveCaptureFile(capture_file *cf, bool dont_reopen);
167     void saveAsCaptureFile(capture_file *cf, bool must_support_comments = false, bool dont_reopen = false);
168     void exportSelectedPackets();
169     void exportDissections(export_type_e export_type);
170
171     void fileAddExtension(QString &file_name, int file_type, bool compressed);
172     bool testCaptureFileClose(bool from_quit = false, QString before_what = QString());
173     void captureStop();
174
175     void initMainToolbarIcons();
176     void initShowHideMainWidgets();
177     void initTimeDisplayFormatMenu();
178     void initTimePrecisionFormatMenu();
179
180     void setTitlebarForSelectedTreeRow();
181     void setTitlebarForCaptureFile();
182     void setTitlebarForCaptureInProgress();
183     void setMenusForCaptureFile(bool force_disable = false);
184     void setMenusForCaptureInProgress(bool capture_in_progress = false);
185     void setMenusForCaptureStopping();
186     void setForCapturedPackets(bool have_captured_packets);
187     void setMenusForFileSet(bool enable_list_files);
188
189     void externalMenuHelper(ext_menu_t * menu, QMenu  * subMenu, gint depth);
190
191     void setForCaptureInProgress(gboolean capture_in_progress = false);
192     QMenu* findOrAddMenu(QMenu *parent_menu, QString& menu_text);
193
194     void recursiveCopyProtoTreeItems(QTreeWidgetItem *item, QString &clip, int ident_level);
195     void captureFileReadStarted(const QString &action);
196
197     void addMenuActions(QList<QAction *> &actions, int menu_group);
198     void removeMenuActions(QList<QAction *> &actions, int menu_group);
199
200 signals:
201     void setCaptureFile(capture_file *cf);
202     void setDissectedCaptureFile(capture_file *cf);
203     void displayFilterSuccess(bool success);
204     void monospaceFontChanged(const QFont &mono_font);
205     void closePacketDialogs();
206     void reloadFields();
207
208 public slots:
209     // in main_window_slots.cpp
210     /**
211      * Open a capture file.
212      * @param cf_path Path to the file.
213      * @param display_filter Display filter to apply. May be empty.
214      * @param type File type.
215      * @return True on success, false on failure.
216      */
217     // XXX We might want to return a cf_read_status_t or a CaptureFile.
218     bool openCaptureFile(QString cf_path, QString display_filter, unsigned int type);
219     bool openCaptureFile(QString cf_path = QString(), QString display_filter = QString()) { return openCaptureFile(cf_path, display_filter, WTAP_TYPE_AUTO); }
220     void filterPackets(QString new_filter = QString(), bool force = false);
221     void updateForUnsavedChanges();
222     void layoutPanes();
223     void applyRecentPaneGeometry();
224     void layoutToolbars();
225     void updatePreferenceActions();
226
227     void captureCapturePrepared(capture_session *);
228     void captureCaptureUpdateStarted(capture_session *);
229     void captureCaptureUpdateFinished(capture_session *);
230     void captureCaptureFixedStarted(capture_session *);
231     void captureCaptureFixedFinished(capture_session *cap_session);
232     void captureCaptureStopping(capture_session *);
233     void captureCaptureFailed(capture_session *);
234
235     void captureFileOpened();
236     void captureFileReadStarted() { captureFileReadStarted(tr("Loading")); }
237     void captureFileReadFinished();
238     void captureFileReloadStarted() { captureFileReadStarted(tr("Reloading")); }
239     void captureFileRescanStarted() { captureFileReadStarted(tr("Rescanning")); }
240     void captureFileRetapStarted();
241     void captureFileRetapFinished();
242     void captureFileClosing();
243     void captureFileClosed();
244     void captureFileSaveStarted(const QString &file_path);
245
246     void filterExpressionsChanged();
247
248 private slots:
249     // Manually connected slots (no "on_<object>_<signal>").
250
251     void initViewColorizeMenu();
252
253     // in main_window_slots.cpp
254     void startCapture();
255     void pipeTimeout();
256     void pipeActivated(int source);
257     void pipeNotifierDestroyed();
258     void stopCapture();
259
260     void loadWindowGeometry();
261     void saveWindowGeometry();
262     void mainStackChanged(int);
263     void updateRecentFiles();
264     void recentActionTriggered();
265     void setMenusForSelectedPacket();
266     void setMenusForSelectedTreeRow(field_info *fi = NULL);
267     void interfaceSelectionChanged();
268     void captureFilterSyntaxChanged(bool valid);
269     void redissectPackets();
270     void fieldsChanged();
271     void showAccordionFrame(AccordionFrame *show_frame, bool toggle = false);
272     void showColumnEditor(int column);
273     void showPreferenceEditor(); // module_t *, pref *
274     void addStatsPluginsToMenu();
275     void addDynamicMenus();
276     void reloadDynamicMenus();
277     void addExternalMenus();
278     QMenu * searchSubMenu(QString objectName);
279
280     void startInterfaceCapture(bool valid);
281
282     void setFeaturesEnabled(bool enabled = true);
283
284     void on_actionDisplayFilterExpression_triggered();
285     void displayFilterButtonClicked();
286
287     // Handle FilterAction signals
288     void filterAction(QString& filter, FilterAction::Action action, FilterAction::ActionType type);
289
290     /** Pass stat cmd arguments to a slot.
291      * @param menu_path slot Partial slot name, e.g. "StatisticsIOGraph".
292      * @param arg "-z" argument, e.g. "io,stat".
293      * @param userdata Optional user data.
294      */
295     void openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata);
296
297     /** Pass tap parameter arguments to a slot.
298      * @param cfg_str slot Partial slot name, e.g. "StatisticsAFPSrt".
299      * @param arg "-z" argument, e.g. "afp,srt".
300      * @param userdata Optional user data.
301      */
302     void openTapParameterDialog(const QString cfg_str, const QString arg, void *userdata);
303     void openTapParameterDialog();
304
305     // Automatically connected slots ("on_<object>_<signal>").
306     //
307     // The slots below follow the naming conventaion described in
308     // http://doc.qt.io/qt-4.8/qmetaobject.html#connectSlotsByName and are
309     // automatically connected at initialization time via main_ui_->setupUi,
310     // which in turn calls connectSlotsByName.
311     //
312     // If you're manually connecting a signal to a slot, don't prefix its name
313     // with "on_". Otherwise you'll get runtime warnings.
314
315     // We might want move these to main_window_actions.cpp similar to
316     // gtk/main_menubar.c
317
318     void on_actionFileOpen_triggered();
319     void on_actionFileMerge_triggered();
320     void on_actionFileImportFromHexDump_triggered();
321     void on_actionFileClose_triggered();
322     void on_actionFileSave_triggered();
323     void on_actionFileSaveAs_triggered();
324     void on_actionFileSetListFiles_triggered();
325     void on_actionFileSetNextFile_triggered();
326     void on_actionFileSetPreviousFile_triggered();
327     void on_actionFileExportPackets_triggered();
328     void on_actionFileExportAsPlainText_triggered();
329     // We're dropping PostScript exports
330     void on_actionFileExportAsCSV_triggered();
331     void on_actionFileExportAsCArrays_triggered();
332     void on_actionFileExportAsPSML_triggered();
333     void on_actionFileExportAsPDML_triggered();
334     void on_actionFileExportPacketBytes_triggered();
335     void on_actionFileExportObjectsDICOM_triggered();
336     void on_actionFileExportObjectsHTTP_triggered();
337     void on_actionFileExportObjectsSMB_triggered();
338     void on_actionFileExportObjectsTFTP_triggered();
339     void on_actionFilePrint_triggered();
340
341     void on_actionFileExportPDU_triggered();
342     void on_actionFileExportSSLSessionKeys_triggered();
343
344     void actionEditCopyTriggered(MainWindow::CopySelected selection_type);
345     void on_actionCopyAllVisibleItems_triggered();
346     void on_actionCopyAllVisibleSelectedTreeItems_triggered();
347     void on_actionEditCopyDescription_triggered();
348     void on_actionEditCopyFieldName_triggered();
349     void on_actionEditCopyValue_triggered();
350     void on_actionEditCopyAsFilter_triggered();
351     void on_actionEditFindPacket_triggered();
352     void on_actionEditFindNext_triggered();
353     void on_actionEditFindPrevious_triggered();
354     void on_actionEditMarkPacket_triggered();
355     void on_actionEditMarkAllDisplayed_triggered();
356     void on_actionEditUnmarkAllDisplayed_triggered();
357     void on_actionEditNextMark_triggered();
358     void on_actionEditPreviousMark_triggered();
359     void on_actionEditIgnorePacket_triggered();
360     void on_actionEditIgnoreAllDisplayed_triggered();
361     void on_actionEditUnignoreAllDisplayed_triggered();
362     void on_actionEditSetTimeReference_triggered();
363     void on_actionEditUnsetAllTimeReferences_triggered();
364     void on_actionEditNextTimeReference_triggered();
365     void on_actionEditPreviousTimeReference_triggered();
366     void on_actionEditTimeShift_triggered();
367     void on_actionEditPacketComment_triggered();
368     void on_actionEditConfigurationProfiles_triggered();
369     void showPreferencesDialog(PreferencesDialog::PreferencesPane start_pane = PreferencesDialog::ppAppearance);
370     void showPreferencesDialog(QString module_name);
371     void on_actionEditPreferences_triggered();
372
373     void showHideMainWidgets(QAction *action);
374     void setTimestampFormat(QAction *action);
375     void setTimestampPrecision(QAction *action);
376     void on_actionViewTimeDisplaySecondsWithHoursAndMinutes_triggered(bool checked);
377     void on_actionViewEditResolvedName_triggered();
378     void setNameResolution();
379     void on_actionViewNameResolutionPhysical_triggered();
380     void on_actionViewNameResolutionNetwork_triggered();
381     void on_actionViewNameResolutionTransport_triggered();
382     // XXX We're not porting the concurrency action from GTK+ on purpose.
383     void zoomText();
384     void on_actionViewZoomIn_triggered();
385     void on_actionViewZoomOut_triggered();
386     void on_actionViewNormalSize_triggered();
387     void on_actionViewColorizePacketList_triggered(bool checked);
388     void on_actionViewColoringRules_triggered();
389     void colorizeConversation(bool create_rule = false);
390     void colorizeWithFilter();
391     void on_actionViewColorizeResetColorization_triggered();
392     void on_actionViewColorizeNewConversationRule_triggered();
393     void on_actionViewResizeColumns_triggered();
394
395     void openPacketDialog(bool from_reference = false);
396     void on_actionViewShowPacketInNewWindow_triggered();
397     void on_actionContextShowLinkedPacketInNewWindow_triggered();
398     void on_actionViewReload_triggered();
399
400     void on_actionGoGoToPacket_triggered();
401     void on_actionGoGoToLinkedPacket_triggered();
402     void on_actionGoAutoScroll_toggled(bool checked);
403     void resetPreviousFocus();
404
405 #ifdef HAVE_LIBPCAP
406     void on_actionCaptureOptions_triggered();
407     void on_actionCaptureRefreshInterfaces_triggered();
408 #endif
409     void on_actionCaptureCaptureFilters_triggered();
410
411     void on_actionAnalyzeDisplayFilters_triggered();
412     void on_actionAnalyzeDisplayFilterMacros_triggered();
413     void matchFieldFilter(FilterAction::Action action, FilterAction::ActionType filter_type);
414     void on_actionAnalyzeCreateAColumn_triggered();
415     void on_actionAnalyzeAAFSelected_triggered();
416     void on_actionAnalyzeAAFNotSelected_triggered();
417     void on_actionAnalyzeAAFAndSelected_triggered();
418     void on_actionAnalyzeAAFOrSelected_triggered();
419     void on_actionAnalyzeAAFAndNotSelected_triggered();
420     void on_actionAnalyzeAAFOrNotSelected_triggered();
421     void on_actionAnalyzePAFSelected_triggered();
422     void on_actionAnalyzePAFNotSelected_triggered();
423     void on_actionAnalyzePAFAndSelected_triggered();
424     void on_actionAnalyzePAFOrSelected_triggered();
425     void on_actionAnalyzePAFAndNotSelected_triggered();
426     void on_actionAnalyzePAFOrNotSelected_triggered();
427
428     void applyConversationFilter();
429
430     void on_actionAnalyzeEnabledProtocols_triggered();
431     void on_actionAnalyzeDecodeAs_triggered();
432 #ifdef HAVE_LUA
433     void on_actionAnalyzeReloadLuaPlugins_triggered();
434 #endif
435
436     void openFollowStreamDialog(follow_type_t type);
437     void on_actionAnalyzeFollowTCPStream_triggered();
438     void on_actionAnalyzeFollowUDPStream_triggered();
439     void on_actionAnalyzeFollowSSLStream_triggered();
440     void statCommandExpertInfo(const char *, void *);
441     void on_actionAnalyzeExpertInfo_triggered();
442
443     void on_actionHelpContents_triggered();
444     void on_actionHelpMPWireshark_triggered();
445     void on_actionHelpMPWireshark_Filter_triggered();
446     void on_actionHelpMPCapinfos_triggered();
447     void on_actionHelpMPDumpcap_triggered();
448     void on_actionHelpMPEditcap_triggered();
449     void on_actionHelpMPMergecap_triggered();
450     void on_actionHelpMPRawShark_triggered();
451     void on_actionHelpMPReordercap_triggered();
452     void on_actionHelpMPText2cap_triggered();
453     void on_actionHelpMPTShark_triggered();
454     void on_actionHelpWebsite_triggered();
455     void on_actionHelpFAQ_triggered();
456     void on_actionHelpAsk_triggered();
457     void on_actionHelpDownloads_triggered();
458     void on_actionHelpWiki_triggered();
459     void on_actionHelpSampleCaptures_triggered();
460     void on_actionHelpAbout_triggered();
461
462 #ifdef HAVE_SOFTWARE_UPDATE
463     void checkForUpdates();
464 #endif
465
466     void on_goToCancel_clicked();
467     void on_goToGo_clicked();
468     void on_goToLineEdit_returnPressed();
469     void on_actionCaptureStart_triggered();
470     void on_actionCaptureStop_triggered();
471     void on_actionCaptureRestart_triggered();
472
473     void on_actionStatisticsCaptureFileProperties_triggered();
474     void on_actionStatisticsResolvedAddresses_triggered();
475     void on_actionStatisticsProtocolHierarchy_triggered();
476     void on_actionStatisticsFlowGraph_triggered();
477     void openTcpStreamDialog(int graph_type);
478     void on_actionStatisticsTcpStreamStevens_triggered();
479     void on_actionStatisticsTcpStreamTcptrace_triggered();
480     void on_actionStatisticsTcpStreamThroughput_triggered();
481     void on_actionStatisticsTcpStreamRoundTripTime_triggered();
482     void on_actionStatisticsTcpStreamWindowScaling_triggered();
483     void openSCTPAllAssocsDialog();
484     void on_actionSCTPShowAllAssociations_triggered();
485     void on_actionSCTPAnalyseThisAssociation_triggered();
486     void on_actionSCTPFilterThisAssociation_triggered();
487     void statCommandMulticastStatistics(const char *arg, void *);
488     void on_actionStatisticsUdpMulticastStreams_triggered();
489
490     void statCommandWlanStatistics(const char *arg, void *);
491     void on_actionWirelessWlanStatistics_triggered();
492
493     void openStatisticsTreeDialog(const gchar *abbr);
494     void on_actionStatistics29WestTopics_Advertisements_by_Topic_triggered();
495     void on_actionStatistics29WestTopics_Advertisements_by_Source_triggered();
496     void on_actionStatistics29WestTopics_Advertisements_by_Transport_triggered();
497     void on_actionStatistics29WestTopics_Queries_by_Topic_triggered();
498     void on_actionStatistics29WestTopics_Queries_by_Receiver_triggered();
499     void on_actionStatistics29WestTopics_Wildcard_Queries_by_Pattern_triggered();
500     void on_actionStatistics29WestTopics_Wildcard_Queries_by_Receiver_triggered();
501     void on_actionStatistics29WestQueues_Advertisements_by_Queue_triggered();
502     void on_actionStatistics29WestQueues_Advertisements_by_Source_triggered();
503     void on_actionStatistics29WestQueues_Queries_by_Queue_triggered();
504     void on_actionStatistics29WestQueues_Queries_by_Receiver_triggered();
505     void on_actionStatistics29WestUIM_Streams_triggered();
506     void on_actionStatistics29WestUIM_Stream_Flow_Graph_triggered();
507     void on_actionStatistics29WestLBTRM_triggered();
508     void on_actionStatistics29WestLBTRU_triggered();
509     void on_actionStatisticsANCP_triggered();
510     void on_actionStatisticsBACappInstanceId_triggered();
511     void on_actionStatisticsBACappIP_triggered();
512     void on_actionStatisticsBACappObjectId_triggered();
513     void on_actionStatisticsBACappService_triggered();
514     void on_actionStatisticsCollectd_triggered();
515     void statCommandConversations(const char *arg = NULL, void *userdata = NULL);
516     void on_actionStatisticsConversations_triggered();
517     void statCommandEndpoints(const char *arg = NULL, void *userdata = NULL);
518     void on_actionStatisticsEndpoints_triggered();
519     void on_actionStatisticsHART_IP_triggered();
520     void on_actionStatisticsHTTPPacketCounter_triggered();
521     void on_actionStatisticsHTTPRequests_triggered();
522     void on_actionStatisticsHTTPLoadDistribution_triggered();
523     void on_actionStatisticsPacketLengths_triggered();
524     void statCommandIOGraph(const char *, void *);
525     void on_actionStatisticsIOGraph_triggered();
526     void on_actionStatisticsSametime_triggered();
527     void on_actionStatisticsDNS_triggered();
528     void actionStatisticsPlugin_triggered();
529     void on_actionStatisticsHpfeeds_triggered();
530     void on_actionStatisticsHTTP2_triggered();
531
532     void openVoipCallsDialog(bool all_flows = false);
533     void on_actionTelephonyVoipCalls_triggered();
534     void on_actionTelephonyGsmMapSummary_triggered();
535     void on_actionTelephonyIax2StreamAnalysis_triggered();
536     void on_actionTelephonyISUPMessages_triggered();
537     void on_actionTelephonyMtp3Summary_triggered();
538     void on_actionTelephonyRTPStreams_triggered();
539     void on_actionTelephonyRTPStreamAnalysis_triggered();
540     void on_actionTelephonyRTSPPacketCounter_triggered();
541     void on_actionTelephonySMPPOperations_triggered();
542     void on_actionTelephonyUCPMessages_triggered();
543     void on_actionTelephonySipFlows_triggered();
544
545     void on_actionATT_Server_Attributes_triggered();
546     void on_actionDevices_triggered();
547     void on_actionHCI_Summary_triggered();
548
549     void externalMenuItem_triggered();
550
551     void on_actionContextCopyBytesHexTextDump_triggered();
552     void on_actionContextCopyBytesHexDump_triggered();
553     void on_actionContextCopyBytesPrintableText_triggered();
554     void on_actionContextCopyBytesHexStream_triggered();
555     void on_actionContextCopyBytesBinary_triggered();
556
557     void on_actionContextWikiProtocolPage_triggered();
558     void on_actionContextFilterFieldReference_triggered();
559
560     void changeEvent(QEvent* event);
561
562 #if HAVE_EXTCAP
563     void extcap_options_finished(int result);
564     void showExtcapOptionsDialog(QString & device_name);
565 #endif
566 };
567
568 #endif // MAINWINDOW_H
569
570 /*
571  * Editor modelines
572  *
573  * Local Variables:
574  * c-basic-offset: 4
575  * tab-width: 8
576  * indent-tabs-mode: nil
577  * End:
578  *
579  * ex: set shiftwidth=4 tabstop=8 expandtab:
580  * :indentSize=4:tabSize=8:noTabs=true:
581  */