lyx_mirror/src/ParagraphExtra.C

315 lines
14 KiB
C++
Raw Normal View History

#include <config.h>
#include <cstdlib>
#include "definitions.h"
#include FORMS_H_LOCATION
#include "layout_forms.h"
#include "LString.h"
#include "minibuffer.h"
#include "vspace.h"
#include "buffer.h"
#include "BufferView.h"
#include "lyxparagraph.h"
#include "gettext.h"
#include "lyxtext.h"
extern FD_form_paragraph_extra *fd_form_paragraph_extra;
extern MiniBuffer *minibuffer;
extern BufferView *current_view;
extern void BeforeChange();
static bool CheckInputWidth();
inline void DeactivateParagraphExtraButtons ()
{
fl_deactivate_object (fd_form_paragraph_extra->button_ok);
fl_deactivate_object (fd_form_paragraph_extra->button_apply);
fl_set_object_lcol (fd_form_paragraph_extra->button_ok, FL_INACTIVE);
fl_set_object_lcol (fd_form_paragraph_extra->button_apply, FL_INACTIVE);
}
inline void ActivateParagraphExtraButtons ()
{
fl_activate_object (fd_form_paragraph_extra->button_ok);
fl_activate_object (fd_form_paragraph_extra->button_apply);
fl_set_object_lcol (fd_form_paragraph_extra->button_ok, FL_BLACK);
fl_set_object_lcol (fd_form_paragraph_extra->button_apply, FL_BLACK);
}
inline void DisableParagraphExtra ()
{
DeactivateParagraphExtraButtons();
fl_deactivate_object (fd_form_paragraph_extra->input_pextra_width);
fl_deactivate_object (fd_form_paragraph_extra->input_pextra_widthp);
fl_deactivate_object (fd_form_paragraph_extra->group_alignment);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_bottom);
fl_deactivate_object (fd_form_paragraph_extra->text_warning);
fl_deactivate_object (fd_form_paragraph_extra->group_extraopt);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_indent);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_minipage);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_floatflt);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_hfill);
fl_deactivate_object (fd_form_paragraph_extra->radio_pextra_startmp);
}
inline void EnableParagraphExtra ()
{
ActivateParagraphExtraButtons();
fl_activate_object (fd_form_paragraph_extra->input_pextra_width);
fl_activate_object (fd_form_paragraph_extra->input_pextra_widthp);
fl_activate_object (fd_form_paragraph_extra->group_alignment);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_top);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_middle);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_bottom);
fl_activate_object (fd_form_paragraph_extra->text_warning);
fl_activate_object (fd_form_paragraph_extra->group_extraopt);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_indent);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_minipage);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_floatflt);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_hfill);
fl_activate_object (fd_form_paragraph_extra->radio_pextra_startmp);
}
bool UpdateParagraphExtra()
{
bool update = false;
if (current_view->getScreen() && current_view->available()) {
update = true;
LyXParagraph * par = current_view->buffer()->text->cursor.par;
EnableParagraphExtra();
fl_activate_object(fd_form_paragraph_extra->input_pextra_width);
fl_activate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_set_input(fd_form_paragraph_extra->input_pextra_width,
par->pextra_width.c_str());
fl_set_input(fd_form_paragraph_extra->input_pextra_widthp,
par->pextra_widthp.c_str());
switch(par->pextra_alignment) {
case MINIPAGE_ALIGN_TOP:
fl_set_button(fd_form_paragraph_extra->radio_pextra_top,1);
break;
case MINIPAGE_ALIGN_MIDDLE:
fl_set_button(fd_form_paragraph_extra->radio_pextra_middle,1);
break;
case MINIPAGE_ALIGN_BOTTOM:
fl_set_button(fd_form_paragraph_extra->radio_pextra_bottom,1);
break;
}
fl_set_button(fd_form_paragraph_extra->radio_pextra_hfill,
par->pextra_hfill);
fl_set_button(fd_form_paragraph_extra->radio_pextra_startmp,
par->pextra_start_minipage);
CheckInputWidth();
if (par->pextra_type == PEXTRA_INDENT) {
fl_set_button(fd_form_paragraph_extra->radio_pextra_indent,1);
fl_set_button(fd_form_paragraph_extra->radio_pextra_minipage,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_floatflt,0);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_bottom);
} else if (par->pextra_type == PEXTRA_MINIPAGE) {
fl_set_button(fd_form_paragraph_extra->radio_pextra_indent,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_minipage,1);
fl_set_button(fd_form_paragraph_extra->radio_pextra_floatflt,0);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_bottom);
} else if (par->pextra_type == PEXTRA_FLOATFLT) {
fl_set_button(fd_form_paragraph_extra->radio_pextra_indent,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_minipage,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_floatflt,1);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_bottom);
} else {
fl_set_button(fd_form_paragraph_extra->radio_pextra_indent,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_minipage,0);
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_width);
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_bottom);
}
if (par->pextra_type == PEXTRA_NONE)
ActivateParagraphExtraButtons();
}
fl_hide_object(fd_form_paragraph_extra->text_warning);
if (current_view->buffer()->isReadonly()) {
DisableParagraphExtra();
fl_set_object_label(fd_form_paragraph_extra->text_warning,
_("Document is read-only. No changes to layout permitted."));
fl_show_object(fd_form_paragraph_extra->text_warning);
}
if (!update && fd_form_paragraph_extra->form_paragraph_extra->visible) {
fl_hide_form(fd_form_paragraph_extra->form_paragraph_extra);
}
return update;
}
void ParagraphExtraOpen(FL_OBJECT *, long)
{
if (UpdateParagraphExtra()) {
if (fd_form_paragraph_extra->form_paragraph_extra->visible) {
fl_raise_form(fd_form_paragraph_extra->form_paragraph_extra);
} else {
fl_show_form(fd_form_paragraph_extra->form_paragraph_extra,
FL_PLACE_MOUSE, FL_FULLBORDER,
_("ParagraphExtra Layout"));
}
}
}
void ParagraphExtraApplyCB(FL_OBJECT *, long)
{
if (current_view->getScreen() && current_view->available()) {
FD_form_paragraph_extra const * fd = fd_form_paragraph_extra;
const char * width = fl_get_input(fd->input_pextra_width);
const char * widthp = fl_get_input(fd->input_pextra_widthp);
LyXText * text = current_view->buffer()->text;
int type = PEXTRA_NONE;
int alignment = 0;
bool
hfill = false,
start_minipage = false;
if (fl_get_button(fd_form_paragraph_extra->radio_pextra_indent)) {
type = PEXTRA_INDENT;
} else if (fl_get_button(fd_form_paragraph_extra->radio_pextra_minipage)) {
type = PEXTRA_MINIPAGE;
hfill = fl_get_button(fd_form_paragraph_extra->radio_pextra_hfill);
start_minipage =
fl_get_button(fd_form_paragraph_extra->radio_pextra_startmp);
if (fl_get_button(fd_form_paragraph_extra->radio_pextra_top))
alignment = MINIPAGE_ALIGN_TOP;
else if (fl_get_button(fd_form_paragraph_extra->radio_pextra_middle))
alignment = MINIPAGE_ALIGN_MIDDLE;
else if (fl_get_button(fd_form_paragraph_extra->radio_pextra_bottom))
alignment = MINIPAGE_ALIGN_BOTTOM;
} else if (fl_get_button(fd_form_paragraph_extra->radio_pextra_floatflt)) {
type = PEXTRA_FLOATFLT;
}
text->SetParagraphExtraOpt(type,width,widthp,alignment,hfill,
start_minipage);
current_view->buffer()->update(1);
minibuffer->Set(_("ParagraphExtra layout set"));
}
return;
}
void ParagraphExtraCancelCB(FL_OBJECT *, long)
{
fl_hide_form(fd_form_paragraph_extra->form_paragraph_extra);
}
void ParagraphExtraOKCB(FL_OBJECT *ob, long data)
{
ParagraphExtraCancelCB(ob,data);
ParagraphExtraApplyCB(ob,data);
}
void CheckPExtraOptCB(FL_OBJECT *ob, long)
{
int
n;
string
s1, s2;
ActivateParagraphExtraButtons();
CheckInputWidth();
if (ob == fd_form_paragraph_extra->radio_pextra_indent) {
n = fl_get_button(fd_form_paragraph_extra->radio_pextra_indent);
if (n) {
fl_set_button(fd_form_paragraph_extra->radio_pextra_minipage,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_floatflt,0);
fl_activate_object(fd_form_paragraph_extra->input_pextra_width);
fl_activate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_bottom);
} else {
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_width);
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_widthp);
ActivateParagraphExtraButtons();
}
} else if (ob == fd_form_paragraph_extra->radio_pextra_minipage) {
n = fl_get_button(fd_form_paragraph_extra->radio_pextra_minipage);
if (n) {
fl_set_button(fd_form_paragraph_extra->radio_pextra_indent,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_floatflt,0);
fl_activate_object(fd_form_paragraph_extra->input_pextra_width);
fl_activate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_bottom);
} else {
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_width);
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_bottom);
ActivateParagraphExtraButtons();
}
} else if (ob == fd_form_paragraph_extra->radio_pextra_floatflt) {
n = fl_get_button(fd_form_paragraph_extra->radio_pextra_floatflt);
if (n) {
fl_set_button(fd_form_paragraph_extra->radio_pextra_indent,0);
fl_set_button(fd_form_paragraph_extra->radio_pextra_minipage,0);
fl_activate_object(fd_form_paragraph_extra->input_pextra_width);
fl_activate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_activate_object(fd_form_paragraph_extra->radio_pextra_bottom);
} else {
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_width);
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_top);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_middle);
fl_deactivate_object(fd_form_paragraph_extra->radio_pextra_bottom);
ActivateParagraphExtraButtons();
}
}
return;
}
static bool CheckInputWidth()
{
string
s1,s2;
s1 = fl_get_input(fd_form_paragraph_extra->input_pextra_width);
s2 = fl_get_input(fd_form_paragraph_extra->input_pextra_widthp);
if (s1.empty() && s2.empty()) {
fl_activate_object(fd_form_paragraph_extra->input_pextra_width);
fl_activate_object(fd_form_paragraph_extra->input_pextra_widthp);
fl_hide_object(fd_form_paragraph_extra->text_warning);
DeactivateParagraphExtraButtons();
return false;
}
if (!s1.empty()) { // LyXLength parameter
fl_activate_object(fd_form_paragraph_extra->input_pextra_width);
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_widthp);
if (!isValidLength(s1)) {
DeactivateParagraphExtraButtons();
fl_set_object_label(fd_form_paragraph_extra->text_warning,
_("Warning: Invalid Length (valid example: 10mm)"));
fl_show_object(fd_form_paragraph_extra->text_warning);
return false;
}
} else { // !s2.empty() % parameter
fl_deactivate_object(fd_form_paragraph_extra->input_pextra_width);
fl_activate_object(fd_form_paragraph_extra->input_pextra_widthp);
if ((atoi(s2.c_str()) < 0 ) || (atoi(s2.c_str()) > 100)) {
DeactivateParagraphExtraButtons();
fl_set_object_label(fd_form_paragraph_extra->text_warning,
_("Warning: Invalid percent value (0-100)"));
fl_show_object(fd_form_paragraph_extra->text_warning);
return false;
}
}
fl_hide_object(fd_form_paragraph_extra->text_warning);
return true;
}