]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/xforms_resize.C
Change glob() API to accept a dir parameter.
[lyx.git] / src / frontends / xforms / xforms_resize.C
1 /**
2  * \file xforms_resize.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13
14 #include "xforms_resize.h"
15
16 #include <boost/assert.hpp>
17
18 #include <algorithm> // std::max. Use FL_max in .c code...
19 #include "lyx_forms.h"
20
21 namespace lyx {
22 namespace frontend {
23
24 namespace {
25
26 /* This is hacked straight out of the xforms source.
27    It is fl_adjust_form_size without the last few lines that do the
28    adjusting.
29  */
30 double get_scaling_factor(FL_FORM * form)
31 {
32     FL_OBJECT *ob;
33     float xfactor, yfactor, max_factor, factor;
34     int sw, sh, osize;
35     float xm = 0.5f, ym = 0.5f;
36     int bw;
37
38 //      if (fl_no_connection)
39 //      return 1.0f;
40
41     max_factor = factor = 1.0f;
42     for (ob = form->first; ob; ob = ob->next)
43     {
44         if ((ob->align == FL_ALIGN_CENTER || (ob->align & FL_ALIGN_INSIDE) ||
45              ob->objclass == FL_INPUT) &&
46             !ob->is_child && *(ob->label) && ob->label[0] != '@' &&
47             ob->boxtype != FL_NO_BOX &&
48             (ob->boxtype != FL_FLAT_BOX || ob->objclass == FL_MENU))
49         {
50             fl_get_string_dimension(ob->lstyle, ob->lsize, ob->label,
51                        strlen(ob->label), &sw, &sh);
52
53             bw = (ob->boxtype == FL_UP_BOX || ob->boxtype == FL_DOWN_BOX) ?
54                 FL_abs(ob->bw) : 1;
55
56             if (ob->objclass == FL_BUTTON &&
57                 (ob->type == FL_RETURN_BUTTON || ob->type == FL_MENU_BUTTON))
58                 sw += (int)FL_min(0.6f * ob->h, 0.6f * ob->w) - 1;
59
60             if (ob->objclass == FL_BUTTON && ob->type == FL_LIGHTBUTTON)
61                 sw += FL_LIGHTBUTTON_MINSIZE + 1;
62
63             if (sw <= (ob->w - 2 * (bw + xm)) && sh <= (ob->h - 2 * (bw + ym)))
64                 continue;
65
66             if ((osize = ob->w - 2 * (int)(bw + xm)) <= 0)
67                 osize = 1;
68             xfactor = (float) sw / (float)osize;
69
70             if ((osize = ob->h - 2 * (int)(bw + ym)) <= 0)
71                 osize = 1;
72             yfactor = (float) sh / osize;
73
74             if (ob->objclass == FL_INPUT)
75             {
76                 xfactor = 1.0f;
77                 yfactor = (sh + 1.6f) / osize;
78             }
79
80             if ((factor = FL_max(xfactor, yfactor)) > max_factor)
81             {
82                 max_factor = factor;
83             }
84         }
85     }
86
87     if (max_factor <= 1.0f)
88         return 1.0f;
89
90     max_factor = 0.01f * (int) (max_factor * 100.0f);
91
92     if (max_factor > 1.25f)
93         max_factor = 1.25f;
94
95     return max_factor;
96 }
97
98
99 double get_tabfolder_scale_to_fit(FL_OBJECT * folder)
100 {
101         BOOST_ASSERT(folder && folder->objclass == FL_TABFOLDER);
102
103         fl_freeze_form(folder->form);
104         int const saved_folder_id = fl_get_folder_number(folder);
105
106         double factor = 1.0;
107         int const size = fl_get_tabfolder_numfolders(folder);
108         for (int i = 0; i < size; ++i) {
109                 fl_set_folder_bynumber(folder, i+1);
110                 FL_FORM * leaf = fl_get_folder(folder);
111                 factor = std::max(factor, get_scale_to_fit(leaf));
112         }
113
114         fl_set_folder_bynumber(folder, saved_folder_id);
115         fl_unfreeze_form(folder->form);
116
117         return factor;
118 }
119
120
121 void scale_tabfolder_horizontally(FL_OBJECT * folder, double factor)
122 {
123         BOOST_ASSERT(folder && folder->objclass == FL_TABFOLDER);
124
125         fl_freeze_form(folder->form);
126         int const saved_folder_id = fl_get_folder_number(folder);
127
128         int const size = fl_get_tabfolder_numfolders(folder);
129         for (int i = 0; i < size; ++i) {
130                 fl_set_folder_bynumber(folder, i+1);
131                 FL_FORM * leaf = fl_get_folder(folder);
132                 scale_form_horizontally(leaf, factor);
133         }
134
135         fl_set_folder_bynumber(folder, saved_folder_id);
136         fl_unfreeze_form(folder->form);
137 }
138
139 } // namespace anon
140
141
142 double get_scale_to_fit(FL_FORM * form)
143 {
144         BOOST_ASSERT(form);
145
146         double factor = get_scaling_factor(form);
147         for (FL_OBJECT * ob = form->first; ob; ob = ob->next) {
148                 if (ob->objclass == FL_TABFOLDER)
149                         factor = std::max(factor,
150                                           get_tabfolder_scale_to_fit(ob));
151         }
152         return factor;
153 }
154
155
156 void scale_form_horizontally(FL_FORM * form, double factor)
157 {
158         BOOST_ASSERT(form);
159
160         if (factor <= 1.0)
161                 return;
162
163         fl_scale_form(form, factor, 1);
164
165         for (FL_OBJECT * ob = form->first; ob; ob = ob->next) {
166                 if (ob->objclass == FL_TABFOLDER)
167                         scale_tabfolder_horizontally(ob, factor);
168         }
169 }
170
171 } // namespace frontend
172 } // namespace lyx