r1014: Enable horizontal scrolling with the mouse wheel by pressing Ctrl.
[cinelerra_cv/ct.git] / cinelerra / mainerror.C
blob4b2151568b4e8bb1949ff943fab7981b9971c6ec
1 #include "bcdisplayinfo.h"
2 #include "bcsignals.h"
3 #include "language.h"
4 #include "mainerror.h"
5 #include "mainsession.h"
6 #include "mutex.h"
7 #include "mwindow.h"
9 #include <string.h>
14 MainError* MainError::main_error = 0;
21 MainErrorGUI::MainErrorGUI(MWindow *mwindow, MainError *thread, int x, int y)
22  : BC_Window(PROGRAM_NAME ": Errors",
23         x,
24         y,
25         mwindow->session->ewindow_w,
26         mwindow->session->ewindow_h,
27         50,
28         50,
29         1,
30         0,
31         1,
32         -1,
33         "",
34         1)
36         this->mwindow = mwindow;
37         this->thread = thread;
40 MainErrorGUI::~MainErrorGUI()
44 void MainErrorGUI::create_objects()
46 SET_TRACE
48         BC_Button *button;
49         add_subwindow(button = new BC_OKButton(this));
50         int x = 10, y = 10;
51 SET_TRACE
52         add_subwindow(title = new BC_Title(x, y, _("The following errors occurred:")));
53         y += title->get_h() + 5;
54 SET_TRACE
55         add_subwindow(list = new BC_ListBox(x,
56                 y,
57                 get_w() - 20,
58                 button->get_y() - y - 5,
59                 LISTBOX_TEXT,                   // Display text list or icons
60                 &thread->errors, // Each column has an ArrayList of BC_ListBoxItems.
61                 0,             // Titles for columns.  Set to 0 for no titles
62                 0,                // width of each column
63                 1,                      // Total columns.  Only 1 in icon mode
64                 0,                    // Pixel of top of window.
65                 0,                     // If this listbox is a popup window with a button
66                 LISTBOX_SINGLE,  // Select one item or multiple items
67                 ICON_LEFT,        // Position of icon relative to text of each item
68                 0));
69 SET_TRACE
70         show_window();
71 SET_TRACE
74 int MainErrorGUI::resize_event(int w, int h)
76         title->reposition_window(title->get_x(), title->get_y());
77         int list_h = h - 
78                 list->get_y() - 
79                 (get_h() - list->get_y() - list->get_h());
80         int list_w = w - 
81                 list->get_x() - 
82                 (get_w() - list->get_x() - list->get_w());
83         list->reposition_window(list->get_x(),
84                 list->get_y(),
85                 list_w,
86                 list_h);
87         mwindow->session->ewindow_w = w;
88         mwindow->session->ewindow_h = h;
89         return 1;
97 MainError::MainError(MWindow *mwindow)
98  : BC_DialogThread()
100         this->mwindow = mwindow;
101         errors_lock = new Mutex("MainError::errors_lock");
102         main_error = this;
105 MainError::~MainError()
107         delete errors_lock;
110 BC_Window* MainError::new_gui()
112         BC_DisplayInfo display_info;
113         int x = display_info.get_abs_cursor_x();
114         int y = display_info.get_abs_cursor_y();
116         MainErrorGUI *gui = new MainErrorGUI(mwindow, this, x, y);
117         gui->create_objects();
118         return gui;
121 void MainError::append_error(char *string)
123         char *in_ptr = string;
124         char string2[BCTEXTLEN];
125         int first_line = 1;
126         while(*in_ptr)
127         {
128                 char *out_ptr = string2;
129 // Indent remaining lines
130                 if(!first_line)
131                 {
132                         *out_ptr++ = ' ';
133                         *out_ptr++ = ' ';
134                 }
136                 while(*in_ptr != '\n' &&
137                         *in_ptr)
138                 {
139                         *out_ptr++ = *in_ptr++;
140                 }
141                 *out_ptr++ = 0;
143                 errors.append(new BC_ListBoxItem(string2));
145                 if(*in_ptr == '\n')
146                 {
147                         in_ptr++;
148                         first_line = 0;
149                 }
150         }
153 void MainError::show_error_local(char *string)
155 SET_TRACE
156 // assume user won't get to closing the GUI here
157         lock_window("MainError::show_error_local");
158 SET_TRACE
159         if(get_gui())
160         {
161 SET_TRACE
162                 MainErrorGUI *gui = (MainErrorGUI*)get_gui();
163                 gui->lock_window("MainError::show_error_local");
164 SET_TRACE
165                 append_error(string);
166 SET_TRACE
167                 gui->list->update(&errors,
168                         0,
169                         0,
170                         1,
171                         gui->list->get_xposition(),
172                         gui->list->get_yposition(),
173                         gui->list->get_highlighted_item(),  // Flat index of item cursor is over
174                         0,     // set all autoplace flags to 1
175                         1);
176 SET_TRACE
177                 gui->unlock_window();
178                 unlock_window();
179 SET_TRACE
180                 start();
181 SET_TRACE
182         }
183         else
184         {
185                 unlock_window();
186 SET_TRACE
187                 errors.remove_all_objects();
188 SET_TRACE
189                 append_error(string);
190 SET_TRACE
191                 start();
192 SET_TRACE
193         }
197 void MainError::show_error(char *string)
199         if(main_error)
200                 main_error->show_error_local(string);
201         else
202         {
203                 printf("%s", string);
204                 if(string[strlen(string) - 1] != '\n')
205                         printf("\n");
206         }