The 'Branches' mega-patch.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7560 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Martin Vermeer 2003-08-17 11:28:23 +00:00
parent 0bbad21ca0
commit fd6cd728a3
42 changed files with 1936 additions and 113 deletions

View File

@ -1,3 +1,19 @@
2003-08-17 Martin Vermeer <martin.vermeer@hut.fi>
* ui/stdmenus.ui: implements the 'branch inset'
idea. This allows the output of various versions of a document
from a single source version, selectively outputing or suppressing
output of parts of the text.
This implementation contains a 'branch list editor' in a separate
tab of the document settings dialog. Branches are user definable
and have a "display colour" to distinguish them on-screen.
ColorHandler was somewhat cleaned up.
(1) make possible a dynamically growing LColor list by allowing
the graphic context cache to grow along (vector);
(2) eliminate an IMHO unnecessary step in colour allocation.
2003-08-14 John Levon <levon@movementarian.org>
* ui/stdmenus.ui: move Note up to the submenus section

View File

@ -93,6 +93,7 @@ Menuset
OptItem "Minipage Settings...|M" "inset-settings minipage"
OptItem "Text Wrap Settings...|W" "inset-settings wrap"
OptItem "Note Settings...|N" "inset-settings note"
OptItem "Branch Settings...|B" "inset-settings branch"
# Hey, guess what's broken ? Surprise surprise, it's tabular stuff
# This is in the Table submenu instead for now.
# OptItem "Table Settings...|a" "inset-settings tabular"
@ -217,6 +218,8 @@ Menuset
Submenu "Float|a" "insert_float"
Submenu "Note|N" "insert_note"
# YUCK
Submenu "Note|N" "insert_note"
Submenu "Branch|B" "branches"
Submenu "File|e" "insert_file"
Separator
Item "Citation Reference...|C" "dialog-show-new-inset citation"
@ -326,6 +329,10 @@ Menuset
Item "Greyed Out|G" "note-insert Greyedout"
End
Menu "branches"
Branches
End
#
# DOCUMENT MENU
#

View File

@ -1,3 +1,4 @@
src/BranchList.h
src/BufferView.C
src/BufferView_pimpl.C
src/Chktex.C
@ -90,6 +91,7 @@ src/frontends/xforms/FormAboutlyx.C
src/frontends/xforms/FormBase.C
src/frontends/xforms/FormBibitem.C
src/frontends/xforms/FormBibtex.C
src/frontends/xforms/FormBranch.C
src/frontends/xforms/FormChanges.C
src/frontends/xforms/FormCharacter.C
src/frontends/xforms/FormCitation.C
@ -138,6 +140,7 @@ src/gettext.h
src/importer.C
src/insets/inset.C
src/insets/insetbibtex.C
src/insets/insetbranch.C
src/insets/insetcaption.C
src/insets/insetenv.C
src/insets/insetert.C
@ -180,6 +183,7 @@ src/mathed/ref_inset.C
src/paragraph.C
src/paragraph_funcs.C
src/rowpainter.C
src/support/path_defines.C
src/text.C
src/text2.C
src/text3.C

202
src/BranchList.C Normal file
View File

@ -0,0 +1,202 @@
/**
* \file BranchList.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#include "BranchList.h"
#include "support/LAssert.h"
#include <functional>
using std::bind2nd;
using std::remove_if;
using std::binary_function;
using namespace lyx::support;
string const Branch::getBranch() const
{
return branch_;
}
void Branch::setBranch(string const & s)
{
branch_ = s;
}
bool Branch::getSelected() const
{
return selected_;
}
void Branch::setSelected(bool b)
{
selected_ = b;
}
string const Branch::getColor() const
{
return color_;
}
void Branch::setColor(string const & c)
{
color_ = c;
}
void BranchList::clear()
{
list.clear();
}
string BranchList::getColor(string const & s) const
{
List::const_iterator it = list.begin();
List::const_iterator end = list.end();
for (; it != end; ++it) {
if (s == it->getBranch()) {
return it->getColor();
}
}
Assert(false); // Always
return string(); // never gets here
}
void BranchList::setColor(string const & s, string const & val)
{
List::iterator it = list.begin();
List::iterator end = list.end();
for (; it != end; ++it) {
if (s.find(it->getBranch(), 0) != string::npos) {
it->setColor(val);
return;
}
}
Assert(false);
}
void BranchList::setSelected(string const & s, bool val)
{
List::iterator it = list.begin();
List::iterator end = list.end();
for (; it != end; ++it) {
if (s.find(it->getBranch(), 0) != string::npos)
it->setSelected(val);
}
}
void BranchList::add(string const & s)
{
string::size_type i = 0;
while (true) {
string::size_type const j = s.find_first_of(separator(), i);
string name;
if (j == string::npos)
name = s.substr(i);
else
name = s.substr(i, j - i);
// Is this name already in the list?
List::const_iterator it = list.begin();
List::const_iterator end = list.end();
bool already = false;
for (; it != end; ++it) {
if (it->getBranch() == name) {
already = true;
break;
}
}
if (!already) {
Branch br;
br.setBranch(name);
br.setSelected(false);
br.setColor("none");
list.push_back(br);
}
if (j == string::npos)
break;
i = j + 1;
}
}
namespace {
struct match : public binary_function<Branch, string, bool> {
bool operator()(Branch const & br, string const & s) const {
return (br.getBranch() == s);
}
};
} // namespace anon.
void BranchList::remove(string const & s)
{
list.remove_if(bind2nd(match(), s));
}
bool BranchList::selected(string const & s) const
{
List::const_iterator it = list.begin();
List::const_iterator end = list.end();
for (; it != end; ++it) {
if (s == it->getBranch())
return it->getSelected();
}
return false;
}
string BranchList::allBranches() const
{
List::const_iterator it = list.begin();
List::const_iterator end = list.end();
string ret;
for (; it != end; ++it) {
ret += it->getBranch() + separator();
}
// remove final '|':
string::size_type i = ret.find_last_of(separator());
if (i != string::npos)
ret.erase(i);
return ret;
}
string BranchList::allSelected() const
{
List::const_iterator it = list.begin();
List::const_iterator end = list.end();
string ret;
for (; it != end; ++it) {
if (it->getSelected())
ret += it->getBranch() + separator();
}
// remove final '|':
string::size_type i = ret.find_last_of(separator());
if (i != string::npos)
ret.erase(i);
return ret;
}
string const BranchList::separator() const
{
return separator_;
}

106
src/BranchList.h Normal file
View File

@ -0,0 +1,106 @@
// -*- C++ -*-
/**
* \file BranchList.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*
*
* \class Branch
*
* A class describing a 'branch', i.e., a named alternative for
* selectively outputting some parts of a document while suppressing
* other parts.
*
* A branch has a name, can either be selected or not, and uses a
* user-specifyable background colour. All these can be set and
* queried.
*
* \class BranchList
*
* A class containing a vector of all defined branches within a
* document. Has methods for selecting or deselecting branches by
* name, for outputting a '|'-separated string of all elements or only
* the selected ones, and for adding and removing elements.
*/
#ifndef BRANCHES_H
#define BRANCHES_H
#include "LString.h"
#include <list>
class Branch {
public:
///
string const getBranch() const;
///
void setBranch(string const &);
///
bool getSelected() const;
///
void setSelected(bool);
///
string const getColor() const;
///
void setColor(string const &);
private:
///
string branch_;
///
bool selected_;
///
string color_;
};
class BranchList {
public:
///
BranchList(): separator_("|") {};
///
typedef std::list<Branch> List;
///
void clear();
///
bool empty() { return list.empty(); };
///
bool size() const { return list.size(); };
///
List::const_iterator begin() const { return list.begin(); };
///
List::const_iterator end() const { return list.end(); };
///
string getColor(string const &) const;
///
void setColor(string const &, string const &);
/// Select/deselect multiple branches given in '|'-separated string
void setSelected(string const &, bool);
/// Add multiple branches to list
void add(string const &);
/// remove a branch from list by name
void remove(string const &);
/// return whether this branch is selected
bool selected(string const &) const;
/// return, as a '|'-separated string, all branch names
string allBranches() const;
///
string allSelected() const;
///
string const separator() const;
private:
///
List list;
///
string separator_;
};
#endif

View File

@ -1,4 +1,29 @@
2003-08-17 Martin Vermeer <martin.vermeer@hut.fi>
* src/BranchList.[Ch]:
* src/InsetList.[Ch]:
* src/LColor.[Ch]:
* src/LyXAction.C:
* src/Makefile.am:
* src/MenuBackend.[Ch]:
* src/bufferparams.[Ch]:
* src/factory.C:
* src/lfuns.h:
* src/lyxfunc.C:
* src/text3.C: implements the 'branch inset'
idea. This allows the output of various versions of a document
from a single source version, selectively outputing or suppressing
output of parts of the text.
This implementation contains a 'branch list editor' in a separate
tab of the document settings dialog. Branches are user definable
and have a "display colour" to distinguish them on-screen.
ColorHandler was somewhat cleaned up.
(1) make possible a dynamically growing LColor list by allowing
the graphic context cache to grow along (vector);
(2) eliminate an IMHO unnecessary step in colour allocation.
2003-08-15 Kayvan A. Sylvan <kayvan@sylvan.com>
* BufferView_pimpl.C: compile fix

View File

@ -1,9 +1,12 @@
#include <config.h>
#include "InsetList.h"
#include "BufferView.h"
#include "buffer.h"
#include "debug.h"
#include "insets/updatableinset.h"
#include "insets/insetbranch.h"
#include <algorithm>
@ -176,3 +179,23 @@ void InsetList::deleteInsetsLyXText(BufferView * bv)
}
}
}
void InsetList::insetsOpenCloseBranch(BufferView * bv)
{
BufferParams bp = bv->buffer()->params;
List::iterator it = list.begin();
List::iterator end = list.end();
for (; it != end; ++it) {
if (it->inset && it->inset->lyxCode() == InsetOld::BRANCH_CODE) {
InsetBranch * inset = static_cast<InsetBranch *>(it->inset);
if (bp.branchlist.selected(inset->params().branch)) {
inset->open(bv);
} else {
inset->close(bv);
}
}
}
}

View File

@ -54,6 +54,9 @@ public:
void decreasePosAfterPos(lyx::pos_type pos);
///
void deleteInsetsLyXText(BufferView * bv);
///
void InsetList::insetsOpenCloseBranch(BufferView * bv);
private:
///
List list;

View File

@ -25,7 +25,7 @@ using std::endl;
namespace {
struct ColorEntry {
LColor::color lcolor;
int lcolor;
char const * guiname;
char const * latexname;
char const * x11name;
@ -34,6 +34,11 @@ struct ColorEntry {
}
struct TransformEntry {
char const * lyxname;
int ncolor;
};
struct LColor::Pimpl {
///
@ -51,17 +56,24 @@ struct LColor::Pimpl {
/// initialise a color entry
void fill(ColorEntry const & entry)
{
information & in = infotab[entry.lcolor];
in.guiname = entry.guiname;
in.latexname = entry.latexname;
in.x11name = entry.x11name;
in.lyxname = entry.lyxname;
information in;
in.lyxname = string(entry.lyxname);
in.latexname = string(entry.latexname);
in.x11name = string(entry.x11name);
in.guiname = string(entry.guiname);
infotab[entry.lcolor] = in;
transform[string(entry.lyxname)] = int(entry.lcolor);
}
///
typedef std::map<LColor::color, information> InfoTab;
typedef std::map<int, information> InfoTab;
/// the table of color information
InfoTab infotab;
typedef std::map<string, int> Transform;
/// the transform between colour name string and integer code.
Transform transform;
};
@ -143,18 +155,31 @@ LColor::LColor(LColor const & c)
LColor::~LColor()
{
delete pimpl_;
}
{}
void LColor::operator=(LColor const & c)
{
LColor tmp(c);
std::swap(pimpl_, tmp.pimpl_);
boost::swap(pimpl_, tmp.pimpl_);
}
void LColor::fill(LColor::color c,
string const & lyxname,
string const & x11name,
string const & latexname,
string const & guiname)
{
ColorEntry ce;
ce.lcolor = c;
ce.guiname = guiname.c_str();
ce.latexname = latexname.c_str();
ce.x11name = x11name.c_str();
ce.lyxname = lyxname.c_str();
pimpl_->fill(ce);
}
string const LColor::getGUIName(LColor::color c) const
{
@ -165,6 +190,19 @@ string const LColor::getGUIName(LColor::color c) const
}
string const LColor::getGUIName(string const & s) const
{
Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
if (ici != pimpl_->transform.end()) {
Pimpl::InfoTab::const_iterator
it = pimpl_->infotab.find(ici->second);
if (it != pimpl_->infotab.end())
return it->second.guiname;
}
return "none";
}
string const LColor::getX11Name(LColor::color c) const
{
Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
@ -178,6 +216,22 @@ string const LColor::getX11Name(LColor::color c) const
}
string const LColor::getX11Name(string const & s) const
{
Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
if (ici != pimpl_->transform.end()) {
Pimpl::InfoTab::const_iterator
it = pimpl_->infotab.find(ici->second);
if (it != pimpl_->infotab.end())
return it->second.x11name;
}
lyxerr << "LyX internal error: Missing color"
" entry in LColor.C for " << s << endl;
lyxerr << "Using black." << endl;
return "black";
}
string const LColor::getLaTeXName(LColor::color c) const
{
Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
@ -187,6 +241,19 @@ string const LColor::getLaTeXName(LColor::color c) const
}
string const LColor::getLaTeXName(string const & s) const
{
Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
if (ici != pimpl_->transform.end()) {
Pimpl::InfoTab::const_iterator
it = pimpl_->infotab.find(ici->second);
if (it != pimpl_->infotab.end())
return it->second.latexname;
}
return "black";
}
string const LColor::getLyXName(LColor::color c) const
{
Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
@ -196,6 +263,12 @@ string const LColor::getLyXName(LColor::color c) const
}
size_t LColor::size() const
{
return pimpl_->infotab.size();
}
void LColor::setColor(LColor::color col, string const & x11name)
{
Pimpl::InfoTab::iterator iti = pimpl_->infotab.find(col);
@ -219,7 +292,7 @@ bool LColor::setColor(string const & lyxname, string const & x11name)
" redefined" << endl;
return false;
}
setColor (col, x11name);
setColor(col, x11name);
return true;
}
@ -230,7 +303,7 @@ LColor::color LColor::getFromGUIName(string const & guiname) const
Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end();
for (; ici != end; ++ici) {
if (!compare_ascii_no_case(_(ici->second.guiname), guiname))
return ici->first;
return static_cast<LColor::color>(ici->first);
}
return LColor::inherit;
}
@ -238,13 +311,7 @@ LColor::color LColor::getFromGUIName(string const & guiname) const
LColor::color LColor::getFromLyXName(string const & lyxname) const
{
Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.begin();
Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end();
for (; ici != end; ++ici) {
if (!compare_ascii_no_case(ici->second.lyxname, lyxname))
return ici->first;
}
return LColor::inherit;
return static_cast<LColor::color>(pimpl_->transform[lyxname]);
}

View File

@ -12,6 +12,7 @@
#define LCOLOR_H
#include "LString.h"
#include <boost/scoped_ptr.hpp>
/**
This is a stateless class.
@ -174,6 +175,7 @@ public:
ignore
};
///
LColor();
///
@ -182,6 +184,14 @@ public:
~LColor();
///
void operator=(LColor const &);
///
void LColor::fill(LColor::color c,
string const & lyxname,
string const & x11name = string(),
string const & latexname = string(),
string const & guiname = string());
/// set the given LyX color to the color defined by the X11 name given
void setColor(LColor::color col, string const & x11name);
/// set the given LyX color to the color defined by the X11 name given
@ -189,15 +199,25 @@ public:
/// Get GUI name of color
string const getGUIName(LColor::color c) const;
///
string const getGUIName(string const & s) const;
/// Get X11 name of color
string const getX11Name(LColor::color c) const;
///
string const getX11Name(string const & s) const;
/// Get LaTeX name of color
string const getLaTeXName(LColor::color c) const;
///
string const getLaTeXName(string const & s) const;
/// Get LyX name of color
string const getLyXName(LColor::color c) const;
/// (string-to-string version not needed as it is identity)
///
size_t size() const;
/// get the color from the GUI name
LColor::color getFromGUIName(string const & guiname) const;
@ -207,7 +227,7 @@ private:
///
struct Pimpl;
///
Pimpl * pimpl_;
boost::scoped_ptr<Pimpl> pimpl_;
};
/// the current color definitions

View File

@ -222,6 +222,7 @@ void LyXAction::init()
{ LFUN_MENU_SEPARATOR, "menu-separator-insert", Noop },
{ LFUN_META_FAKE, "meta-prefix", NoBuffer },
{ LFUN_INSET_MINIPAGE, "minipage-insert", Noop },
{ LFUN_INSERT_BRANCH, "branch-insert", Noop },
{ LFUN_INSERT_NOTE, "note-insert", Noop },
{ LFUN_GOTONOTE, "note-next", ReadOnly },
{ LFUN_INSET_TOGGLE, "inset-toggle", ReadOnly },

View File

@ -60,6 +60,8 @@ lyx_SOURCES = \
BufferView_pimpl.h \
Bullet.C \
Bullet.h \
BranchList.C \
BranchList.h \
Chktex.C \
Chktex.h \
CutAndPaste.C \

View File

@ -69,6 +69,7 @@ MenuItem::MenuItem(Kind kind, string const & label,
case FloatListInsert:
case FloatInsert:
case PasteRecent:
case Branches:
break;
case Command:
action_ = lyxaction.LookupFunc(command);
@ -189,6 +190,7 @@ Menu & Menu::read(LyXLex & lex)
{
enum Menutags {
md_item = 1,
md_branches,
md_documents,
md_endmenu,
md_exportformats,
@ -208,6 +210,7 @@ Menu & Menu::read(LyXLex & lex)
};
struct keyword_item menutags[md_last - 1] = {
{ "branches", md_branches },
{ "documents", md_documents },
{ "end", md_endmenu },
{ "exportformats", md_exportformats },
@ -293,6 +296,10 @@ Menu & Menu::read(LyXLex & lex)
add(MenuItem(MenuItem::PasteRecent));
break;
case md_branches:
add(MenuItem(MenuItem::Branches));
break;
case md_optsubmenu:
optional = true;
// fallback to md_submenu
@ -635,6 +642,25 @@ void expandPasteRecent(Menu & tomenu, LyXView const * view)
}
void expandBranches(Menu & tomenu, LyXView const * view)
{
BufferParams const & params = view->buffer()->params;
std::list<Branch>::const_iterator cit = params.branchlist.begin();
std::list<Branch>::const_iterator end = params.branchlist.end();
for (int ii = 1; cit != end; ++cit, ++ii) {
string label = cit->getBranch();
int const action = lyxaction.
getPseudoAction(LFUN_INSERT_BRANCH,
(cit->getBranch()));
if (ii < 10)
label = tostr(ii) + ". " + label + "|" + tostr(ii);
tomenu.add(MenuItem(MenuItem::Command, label, action), view);
}
}
} // namespace anon
@ -671,6 +697,10 @@ void MenuBackend::expand(Menu const & frommenu, Menu & tomenu,
expandPasteRecent(tomenu, view);
break;
case MenuItem::Branches:
expandBranches(tomenu, view);
break;
case MenuItem::Toc:
expandToc(tomenu, view);
break;

View File

@ -65,7 +65,9 @@ public:
FloatInsert,
/** This is the list of selections that can
be pasted. */
PasteRecent
PasteRecent,
/** Available branches in document */
Branches
};
/// Create a Command type MenuItem
MenuItem(Kind kind,
@ -196,7 +198,7 @@ public:
/// Expands some special entries of the menu
/** The entries with the following kind are expanded to a
sequence of Command MenuItems: Lastfiles, Documents,
ViewFormats, ExportFormats, UpdateFormats
ViewFormats, ExportFormats, UpdateFormats, Branches
*/
void expand(Menu const & frommenu, Menu & tomenu,
LyXView const *) const;

View File

@ -24,6 +24,8 @@
#include "author.h"
#include "gettext.h"
#include "LColor.h"
#include "support/lyxalgo.h" // for lyx::count
#include "support/lyxlib.h"
#include "support/lstrings.h"
@ -192,6 +194,31 @@ string const BufferParams::readToken(LyXLex & lex, string const & token)
} else if (token == "\\tracking_changes") {
lex.nextToken();
tracking_changes = lex.getInteger();
} else if (token == "\\branch") {
lex.nextToken();
string branch = lex.getString();
branchlist.add(branch);
while (true) {
lex.nextToken();
string const tok = lex.getString();
if (tok == "\\end_branch")
break;
if (tok == "\\selected") {
lex.nextToken();
branchlist.setSelected(branch, lex.getInteger());
}
// not yet operational
if (tok == "\\color") {
lex.nextToken();
string color = lex.getString();
branchlist.setColor(branch, color);
// Update also the LColor table:
if (color == "none")
color = lcolor.getX11Name(LColor::background);
lcolor.fill(static_cast<LColor::color>(lcolor.size()),
branch, color);
}
}
} else if (token == "\\author") {
lex.nextToken();
istringstream ss(STRCONV(lex.getString()));
@ -380,6 +407,17 @@ void BufferParams::writeFile(ostream & os) const
<< "\n\\use_numerical_citations " << use_numerical_citations
<< "\n\\paperorientation " << string_orientation[orientation]
<< '\n';
std::list<Branch>::const_iterator it = branchlist.begin();
std::list<Branch>::const_iterator end = branchlist.end();
for (; it != end; ++it) {
os << "\\branch " << it->getBranch()
<< "\n\\selected " << it->getSelected()
<< "\n\\color " << it->getColor()
<< "\n\\end_branch"
<< "\n";
}
if (!paperwidth.empty())
os << "\\paperwidth "
<< VSpace(paperwidth).asLyXCommand() << '\n';

View File

@ -21,6 +21,7 @@
#include "texrow.h"
#include "author.h"
#include "paper.h"
#include "BranchList.h"
#include "insets/insetquotes.h"
@ -134,6 +135,8 @@ public:
int tocdepth;
///
Language const * language;
/// BranchList:
BranchList branchlist;
///
string inputenc;
///

View File

@ -37,6 +37,7 @@
#include "insets/insetmarginal.h"
#include "insets/insetminipage.h"
#include "insets/insetnote.h"
#include "insets/insetbranch.h"
#include "insets/insetoptarg.h"
#include "insets/insetref.h"
#include "insets/insetspace.h"
@ -77,6 +78,14 @@ InsetOld * createInset(FuncRequest const & cmd)
arg = "Note";
return new InsetNote(params, arg);
}
case LFUN_INSERT_BRANCH:
{
string arg = cmd.getArg(0);
if (arg.empty())
arg = "none";
return new InsetBranch(params, arg);
}
case LFUN_INSET_ERT:
return new InsetERT(params);
@ -357,6 +366,8 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf)
} else if (tmptok == "Note" || tmptok == "Comment"
|| tmptok == "Greyedout") {
inset = new InsetNote(buf.params, tmptok);
} else if (tmptok == "Branch") {
inset = new InsetBranch(buf.params, tmptok);
} else if (tmptok == "Include") {
InsetCommandParams p("Include");
inset = new InsetInclude(p, buf);

View File

@ -1,4 +1,21 @@
2003-08-16 Martin Vermeer <martin.vermeer@hut.fi>
* ControlBranch.[Ch]:
* ControlDocument.C:
* Makefile.am: implements the 'branch
inset' idea. This allows the output of various versions of a
document from a single source version, selectively outputing or
suppressing output of parts of the text.
This implementation contains a 'branch list editor' in a separate
tab of the document settings dialog. Branches are user definable
and have a "display colour" to distinguish them on-screen.
ColorHandler was somewhat cleaned up.
(1) make possible a dynamically growing LColor list by allowing
the graphic context cache to grow along (vector);
(2) eliminate an IMHO unnecessary step in colour allocation.
2003-08-15 André Pönitz <poenitz@gmx.net>
* ControlErrorList.C:

View File

@ -0,0 +1,44 @@
/**
* \file ControlBranch.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#include <config.h>
#include "ControlBranch.h"
#include "funcrequest.h"
#include "insets/insetbranch.h"
#include "debug.h"
ControlBranch::ControlBranch(Dialog & parent)
: Dialog::Controller(parent)
{}
bool ControlBranch::initialiseParams(string const & data)
{
InsetBranchParams params;
InsetBranchMailer::string2params(data, params);
params_.reset(new InsetBranchParams(params));
return true;
}
void ControlBranch::clearParams()
{
params_.reset();
}
void ControlBranch::dispatchParams()
{
string const lfun = InsetBranchMailer::params2string(string("branch"), params());
kernel().dispatch(FuncRequest(LFUN_INSET_APPLY, lfun));
}

View File

@ -0,0 +1,44 @@
// -*- C++ -*-
/**
* \file ControlBranch.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#ifndef CONTROLBRANCH_H
#define CONTROLBRANCH_H
#include "Dialog.h"
#include "debug.h"
class InsetBranchParams;
class ControlBranch : public Dialog::Controller {
public:
///
ControlBranch(Dialog &);
///
virtual bool initialiseParams(string const & data);
///
virtual void clearParams();
///
virtual void dispatchParams();
///
virtual bool isBufferDependent() const { return true; }
///
InsetBranchParams & params() { return *params_.get(); }
///
InsetBranchParams const & params() const { return *params_.get(); }
///
private:
///
boost::scoped_ptr<InsetBranchParams> params_;
};
#endif // CONTROLBRANCH_H

View File

@ -82,6 +82,14 @@ void ControlDocument::apply()
buffer()->markDirty();
lv_.message(_("Document settings applied"));
// Open insets of selected branches, close deselected ones
// Currently only top-level insets in buffer handled (bug).
ParIterator pit = buffer()->par_iterator_begin();
ParIterator pend = buffer()->par_iterator_end();
for (; pit != pend; ++pit) {
pit->insetlist.insetsOpenCloseBranch(bufferview());
}
}

View File

@ -31,6 +31,8 @@ libcontrollers_la_SOURCES= \
ControlBibtex.h \
ControlButtons.C \
ControlButtons.h \
ControlBranch.C \
ControlBranch.h \
ControlCharacter.C \
ControlCharacter.h \
ControlChanges.C \

View File

@ -1,3 +1,25 @@
2003-08-17 Martin Vermeer <martin.vermeer@hut.fi>
* ColorHandler.[Ch]:
* Dialogs.C:
* FormBranch.[Ch]:
* FormDocument.[Ch]:
* Makefile.am:
* forms/Makefile.am:
* forms/form_branch.fd:
* forms/form_document.fd: implements the
'branch inset' idea. This allows the output of various versions of
a document from a single source version, selectively outputing or
suppressing output of parts of the text.
This implementation contains a 'branch list editor' in a separate
tab of the document settings dialog. Branches are user definable
and have a "display colour" to distinguish them on-screen.
ColorHandler was somewhat cleaned up.
(1) make possible a dynamically growing LColor list by allowing
the graphic context cache to grow along (vector);
(2) eliminate an IMHO unnecessary step in colour allocation.
2003-08-12 Michael Schmitt <michael.schmitt@teststep.org>
* FormMathsMatrix.C: rename "Center" to "Middle"

View File

@ -44,6 +44,7 @@ namespace {
LyXColorHandler::LyXColorHandler()
: colorGCcache(LColor::ignore + 1)
{
display = fl_get_display();
drawable = XCreatePixmap(display,
@ -52,7 +53,7 @@ LyXColorHandler::LyXColorHandler()
colormap = fl_state[fl_get_vclass()].colormap;
// Clear the GC cache
for (int i = 0; i <= LColor::ignore; ++i) {
for (int i = 0; i < colorGCcache.size(); ++i) {
colorGCcache[i] = 0;
}
}
@ -61,7 +62,7 @@ LyXColorHandler::LyXColorHandler()
LyXColorHandler::~LyXColorHandler()
{
// Release all the registered GCs
for (int i = 0; i <= LColor::ignore; ++i) {
for (unsigned i = 0; i < colorGCcache.size(); ++i) {
if (colorGCcache[i] != 0) {
XFreeGC(display, colorGCcache[i]);
}
@ -82,40 +83,28 @@ unsigned long LyXColorHandler::colorPixel(LColor::color c)
}
// Gets GC according to color
// Uses caching
GC LyXColorHandler::getGCForeground(LColor::color c)
GC LyXColorHandler::getGCForeground(string const & s)
{
if (colorGCcache[c] != 0)
return colorGCcache[c];
XColor xcol;
XColor ccol;
string const s = lcolor.getX11Name(c);
XGCValues val;
// Look up the RGB values for the color, and an approximate
// color that we can hope to get on this display.
if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) {
lyxerr << bformat(
_("LyX: Unknown X11 color %1$s for %2$s\n"
_("LyX: Unknown X11 color %1$s\n"
" Using black instead, sorry!"),
s, lcolor.getGUIName(c)) << endl;
s) << endl;
unsigned long bla = BlackPixel(display,
DefaultScreen(display));
val.foreground = bla;
// Try the exact RGB values first, then the approximate.
} else if (XAllocColor(display, colormap, &xcol) != 0) {
if (lyxerr.debugging(Debug::GUI)) {
lyxerr << bformat(_("LyX: X11 color %1$s allocated for %2$s"),
s, lcolor.getGUIName(c)) << endl;
lyxerr << bformat(_("LyX: X11 color %1$s allocated"),
s) << endl;
}
val.foreground = xcol.pixel;
} else if (XAllocColor(display, colormap, &ccol)) {
lyxerr << bformat(
_("LyX: Using approximated X11 color %1$s allocated for %2$s"),
s, lcolor.getGUIName(c)) << endl;
val.foreground = xcol.pixel;
} else {
// Here we are traversing the current colormap to find
// the color closest to the one we want.
@ -155,8 +144,8 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
}
lyxerr << bformat(
_("LyX: Couldn't allocate '%1$s' for %2$s with (r,g,b)=%3$s.\n"),
s, lcolor.getGUIName(c), tostr(xcol));
_("LyX: Couldn't allocate '%1$s' with (r,g,b)=%3$s.\n"),
s, tostr(xcol));
lyxerr << bformat(
_(" Using closest allocated color with (r,g,b)=%1$s instead.\n"
@ -165,12 +154,35 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
val.foreground = cmap[closest_pixel].pixel;
}
val.function = GXcopy;
return colorGCcache[c] = XCreateGC(display, drawable,
return XCreateGC(display, drawable,
GCForeground | GCFunction, &val);
}
// Gets GC according to color
// Uses caching
GC LyXColorHandler::getGCForeground(LColor::color c)
{
if (static_cast<unsigned>(c) >= colorGCcache.size()) {
colorGCcache.resize(c + 1, 0);
}
if (colorGCcache[c] != 0) {
return colorGCcache[c];
}
XColor xcol;
XColor ccol;
string const s = lcolor.getX11Name(c);
// Look up the RGB values for the color, and an approximate
// color that we can hope to get on this display.
if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) {
lyxerr << bformat(
_("LyX: Unknown X11 color %1$s for %2$s\n"),
s, lcolor.getGUIName(c)) << endl;
}
return colorGCcache[c] = getGCForeground(s);
}
// Gets GC for line
GC LyXColorHandler::getGCLinepars(Painter::line_style ls,

View File

@ -16,6 +16,7 @@
#include "frontends/Painter.h"
#include <map>
#include <vector>
#include <boost/scoped_ptr.hpp>
// This is only included to provide stuff for the non-public sections
@ -49,7 +50,9 @@ private:
///
Colormap colormap;
///
GC colorGCcache[LColor::ignore + 1];
std::vector<GC> colorGCcache;
///
GC getGCForeground(string const & s);
///
typedef std::map<int, GC> LineGCCache;
///

View File

@ -17,6 +17,7 @@
#include "ControlAboutlyx.h"
#include "ControlBibtex.h"
#include "ControlBranch.h"
#include "ControlChanges.h"
#include "ControlCharacter.h"
#include "ControlCitation.h"
@ -44,6 +45,7 @@
#include "FormAboutlyx.h"
#include "FormBibitem.h"
#include "FormBibtex.h"
#include "FormBranch.h"
#include "FormChanges.h"
#include "FormCharacter.h"
#include "FormCitation.h"
@ -110,7 +112,7 @@ FormMathsBitmap * createFormBitmap(Dialog & parent, string const & title,
}
char const * const dialognames[] = { "aboutlyx", "bibitem", "bibtex", "changes",
char const * const dialognames[] = { "aboutlyx", "bibitem", "bibtex", "branch", "changes",
"character", "citation", "error", "errorlist" , "ert", "external", "file",
"float", "graphics", "include", "index", "label", "latexlog", "mathpanel",
"mathaccents", "matharrows", "mathoperators", "mathrelations", "mathgreek",
@ -411,6 +413,10 @@ Dialog * Dialogs::build(string const & name)
dialog->setController(new ControlNote(*dialog));
dialog->setView(new FormNote(*dialog));
dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
} else if (name == "branch") {
dialog->setController(new ControlBranch(*dialog));
dialog->setView(new FormBranch(*dialog));
dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
} else if (name == "paragraph") {
dialog->setController(new ControlParagraph(*dialog));
dialog->setView(new FormParagraph(*dialog));

View File

@ -0,0 +1,63 @@
/**
* \file FormBranch.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#include <config.h>
#include "xformsBC.h"
#include "ControlBranch.h"
#include "FormBranch.h"
#include "forms/form_branch.h"
#include "xforms_helpers.h" // formatted
#include "lyx_forms.h"
#include "insets/insetbranch.h"
#include "debug.h"
typedef FormController<ControlBranch, FormView<FD_branch> > base_class;
FormBranch::FormBranch(Dialog & parent)
: base_class(parent, _("Branch"))
{}
void FormBranch::build()
{
string all_branches(controller().params().branchlist.allBranches());
dialog_.reset(build_branch(this));
fl_addto_choice(dialog_->choice_branch, all_branches.c_str());
bcview().setOK(dialog_->button_ok);
bcview().setApply(dialog_->button_apply);
bcview().setCancel(dialog_->button_cancel);
}
void FormBranch::update()
{
// Make changes in all_branches propagate within session:
string all_branches(controller().params().branchlist.allBranches());
fl_clear_choice(dialog_->choice_branch);
fl_addto_choice(dialog_->choice_branch, all_branches.c_str());
string branch(controller().params().branch);
if (all_branches.find(branch) != string::npos && branch != "none")
fl_set_choice_text(dialog_->choice_branch, branch.c_str());
}
void FormBranch::apply()
{
string const type = fl_get_choice_text(dialog_->choice_branch);
controller().params().branch = type;
}

View File

@ -0,0 +1,37 @@
// -*- C++ -*-
/**
* \file FormBranch.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#ifndef FORMBRANCH_H
#define FORMBRANCH_H
#include "FormDialogView.h"
class ControlBranch;
struct FD_branch;
/** This class provides an XForms implementation of the Branch Dialog.
*/
class FormBranch : public FormController<ControlBranch, FormView<FD_branch> > {
public:
/// Constructor
FormBranch(Dialog &);
private:
///
virtual void apply();
/// Build the dialog
virtual void build();
/// Update dialog before showing it
virtual void update();
};
#endif // FORMBRANCH_H

View File

@ -5,6 +5,8 @@
*
* \author Jürgen Vigna
* \author Rob Lahaye
* \author Martin Vermeer
* \author Juergen Spitzmueller
*
* Full author contact details are available in file CREDITS
*/
@ -17,17 +19,23 @@
#include "xformsBC.h"
#include "ButtonController.h"
#include "FormColorpicker.h"
#include "LColor.h"
#include "Lsstream.h"
#include "bmtable.h"
#include "checkedwidgets.h"
#include "Tooltips.h"
#include "input_validators.h" // fl_unsigned_float_filter
#include "xforms_helpers.h"
#include "bufferparams.h"
#include "CutAndPaste.h"
#include "debug.h"
#include "language.h"
#include "lyxrc.h"
#include "lyxtextclasslist.h"
#include "tex-strings.h"
#include "ColorHandler.h"
#include "controllers/frnt_lang.h"
#include "controllers/helper_funcs.h"
@ -43,12 +51,15 @@
#include <boost/bind.hpp>
#include <functional>
#include <iomanip>
using namespace lyx::support;
using std::bind2nd;
using std::vector;
using std::endl;
using std::setw;
using std::setfill;
namespace {
@ -59,6 +70,7 @@ bool const scalableTabfolders = false;
bool const scalableTabfolders = true;
#endif
} // namespace anon
@ -343,6 +355,46 @@ void FormDocument::build()
fl_set_bmtable_pixmap_file(bullets_->bmtable_panel, 6, 6,
bmtablefile.c_str());
picker_.reset(new FormColorpicker);
// the document branches form
branch_.reset(build_document_branch(this));
fl_set_object_color(branch_->button_color,
GUI_COLOR_CHOICE, GUI_COLOR_CHOICE);
bcview().addReadOnly(branch_->input_all_branches);
bcview().addReadOnly(branch_->button_add_branch);
bcview().addReadOnly(branch_->button_remove_branch);
bcview().addReadOnly(branch_->button_select);
bcview().addReadOnly(branch_->button_deselect);
bcview().addReadOnly(branch_->button_modify);
bcview().addReadOnly(branch_->browser_all_branches);
// set up the tooltips for branches form
string str = _("Enter the name of a new branch.");
tooltips().init(branch_->input_all_branches, str);
str = _("Add a new branch to the document.");
tooltips().init(branch_->button_add_branch, str);
str = _("Remove the selected branch from the document.");
tooltips().init(branch_->button_remove_branch, str);
str = _("Activate the selected branch for output.");
tooltips().init(branch_->button_select, str);
str = _("Deactivate the selected activated branch.");
tooltips().init(branch_->button_deselect, str);
str = _("Available branches for this document.");
tooltips().init(branch_->browser_all_branches, str);
str = _("Activated branches. Content will occur in the document\'s output");
tooltips().init(branch_->browser_selection, str);
str = _("Modify background color of branch inset");
tooltips().init(branch_->button_modify, str);
str = _("Background color of branch inset");
tooltips().init(branch_->button_color, str);
// Handle middle mouse paint:
setPrehandler(branch_->input_all_branches);
fl_set_input_return(branch_->input_all_branches, FL_RETURN_CHANGED);
// Enable the tabfolder to be rescaled correctly.
if (scalableTabfolders)
fl_set_tabfolder_autofit(dialog_->tabfolder, FL_FIT);
@ -366,6 +418,9 @@ void FormDocument::build()
fl_deactivate_object(fbullet);
fl_set_object_lcol(fbullet, FL_INACTIVE);
}
fl_addto_tabfolder(dialog_->tabfolder,_("Branches").c_str(),
branch_->form);
}
@ -378,6 +433,7 @@ void FormDocument::apply()
language_apply(params);
options_apply(params);
bullets_apply(params);
branch_apply(params);
}
@ -395,6 +451,7 @@ void FormDocument::update()
language_update(params);
options_update(params);
bullets_update(params);
branch_update(params);
}
@ -456,6 +513,15 @@ ButtonPolicy::SMInput FormDocument::input(FL_OBJECT * ob, long)
setEnabled(options_->choice_citation_format,
fl_get_button(options_->check_use_natbib));
} else if (ob == branch_->browser_all_branches ||
ob == branch_->browser_selection ||
ob == branch_->button_add_branch ||
ob == branch_->button_remove_branch ||
ob == branch_->button_modify ||
ob == branch_->button_select ||
ob == branch_->button_deselect ||
ob == branch_->button_deselect) {
branch_input(ob);
} else if (ob == dialog_->button_save_defaults) {
apply();
controller().saveAsDefault();
@ -606,6 +672,139 @@ ButtonPolicy::SMInput FormDocument::input(FL_OBJECT * ob, long)
}
void FormDocument::branch_input(FL_OBJECT * ob)
{
BufferParams & params = controller().params();
std::vector<string> vec;
if (ob == branch_->button_add_branch) {
string new_branch = fl_get_input(branch_->input_all_branches);
if (!new_branch.empty()) {
params.branchlist.add(new_branch);
fl_set_input(branch_->input_all_branches, "");
// Update branch list
string const all_branches = params.branchlist.allBranches();
fl_clear_browser(branch_->browser_all_branches);
vec = getVectorFromString(all_branches, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_all_branches,
vec[i].c_str());
}
LColor::color c = static_cast<LColor::color>(lcolor.size());
lcolor.fill(c, new_branch, lcolor.getX11Name(LColor::background));
}
} else if (ob == branch_->button_remove_branch) {
unsigned i = fl_get_browser(branch_->browser_all_branches);
string const current_branch =
fl_get_browser_line(branch_->browser_all_branches, i);
if (!current_branch.empty()) {
params.branchlist.remove(current_branch);
// Update branch list
string const all_branches = params.branchlist.allBranches();
fl_clear_browser(branch_->browser_all_branches);
vec = getVectorFromString(all_branches, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_all_branches,
vec[i].c_str());
}
// Update selected-list...
string const all_selected = params.branchlist.allSelected();
fl_clear_browser(branch_->browser_selection);
vec = getVectorFromString(all_selected, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_selection, vec[i].c_str());
}
}
} else if (ob == branch_->button_select) {
unsigned i = fl_get_browser(branch_->browser_all_branches);
string const current_branch =
fl_get_browser_line(branch_->browser_all_branches, i);
if (!current_branch.empty()) {
fl_clear_browser(branch_->browser_selection);
params.branchlist.setSelected(current_branch, true);
string const all_selected = params.branchlist.allSelected();
vec = getVectorFromString(all_selected, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_selection,
vec[i].c_str());
}
}
} else if (ob == branch_->button_deselect) {
unsigned i = fl_get_browser(branch_->browser_selection);
string const current_sel =
fl_get_browser_line(branch_->browser_selection, i);
if (!current_sel.empty()) {
fl_clear_browser(branch_->browser_selection);
params.branchlist.setSelected(current_sel, false);
string const all_selected = params.branchlist.allSelected();
vec = getVectorFromString(all_selected, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_selection,
vec[i].c_str());
}
}
} else if (ob == branch_->button_modify) {
unsigned i = fl_get_browser(branch_->browser_all_branches);
string const current_branch =
fl_get_browser_line(branch_->browser_all_branches, i);
RGBColor before;
string x11hexname = params.branchlist.getColor(current_branch);
if (x11hexname[0] == '#') {
before = RGBColor(x11hexname);
} else{
fl_getmcolor(FL_COL1, &before.r, &before.g, &before.b);
}
RGBColor col = picker_->requestColor(before);
if (before != col) {
fl_mapcolor(GUI_COLOR_CHOICE, col.r, col.g, col.b);
fl_redraw_object(branch_->button_color);
// Figure out here how to stash the new colour into the
// LyX colour database.
x11hexname = X11hexname(col);
// current_branch already in database
LColor::color c = lcolor.getFromLyXName(current_branch);
lcolor.setColor(current_branch, x11hexname);
// Make sure that new colour is also displayed ;-)
lyxColorHandler->getGCForeground(c);
lyxColorHandler->updateColor(c);
// what about system_lcolor?
// Here set colour in BranchList:
params.branchlist.setColor(current_branch, x11hexname);
}
} else if (ob == branch_->browser_all_branches) {
unsigned i = fl_get_browser(branch_->browser_all_branches);
string const current_branch =
fl_get_browser_line(branch_->browser_all_branches, i);
// make button_color track selected branch:
RGBColor rgb;
string x11hexname = params.branchlist.getColor(current_branch);
if (x11hexname[0] == '#') {
rgb = RGBColor(x11hexname);
} else {
fl_getmcolor(FL_COL1, &rgb.r, &rgb.g, &rgb.b);
}
fl_mapcolor(GUI_COLOR_CHOICE, rgb.r, rgb.g, rgb.b);
fl_redraw_object(branch_->button_color);
}
setEnabled(branch_->button_select,
(fl_get_browser(branch_->browser_all_branches) > 0));
setEnabled(branch_->button_deselect,
(fl_get_browser(branch_->browser_selection) > 0));
setEnabled(branch_->button_remove_branch,
(fl_get_browser(branch_->browser_all_branches) > 0));
setEnabled(branch_->button_modify,
(fl_get_browser(branch_->browser_all_branches) > 0));
branchlist_ = params.branchlist;
}
bool FormDocument::class_apply(BufferParams &params)
{
bool redo = false;
@ -830,6 +1029,16 @@ void FormDocument::bullets_apply(BufferParams & params)
}
void FormDocument::branch_apply(BufferParams & params)
{
BufferParams & prms = controller().params();
if (branchlist_.empty())
branchlist_ = prms.branchlist;
params.branchlist = branchlist_;
branchlist_.clear();
}
void FormDocument::UpdateClassParams(BufferParams const & params)
{
// These are the params that have to be updated on any class change
@ -1094,6 +1303,56 @@ void FormDocument::bullets_update(BufferParams const & params)
}
void FormDocument::branch_update(BufferParams const & params)
{
if (!branch_.get())
return;
string const all_branches = params.branchlist.allBranches();
fl_clear_browser(branch_->browser_all_branches);
string current_branch("none");
if (!all_branches.empty()) {
std::vector<string> vec = getVectorFromString(all_branches, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_all_branches, vec[i].c_str());
}
fl_select_browser_line(branch_->browser_all_branches, 1);
current_branch =
fl_get_browser_line(branch_->browser_all_branches, 1);
}
// display proper selection...
string const all_selected = params.branchlist.allSelected();
fl_clear_browser(branch_->browser_selection);
if (!all_selected.empty()) {
std::vector<string> vec = getVectorFromString(all_selected, "|");
for (unsigned i = 0; i < vec.size(); ++i) {
fl_addto_browser(branch_->browser_selection, vec[i].c_str());
}
}
// display proper colour...
RGBColor rgb;
string x11hexname = params.branchlist.getColor(current_branch);
if (x11hexname[0] == '#') {
rgb = RGBColor(x11hexname);
} else {
fl_getmcolor(FL_COL1, &rgb.r, &rgb.g, &rgb.b);
}
fl_mapcolor(GUI_COLOR_CHOICE, rgb.r, rgb.g, rgb.b);
fl_redraw_object(branch_->button_color);
setEnabled(branch_->button_select,
(fl_get_browser(branch_->browser_all_branches) > 0));
setEnabled(branch_->button_deselect,
(fl_get_browser(branch_->browser_selection) > 0));
setEnabled(branch_->button_remove_branch,
(fl_get_browser(branch_->browser_all_branches) > 0));
setEnabled(branch_->button_modify,
(fl_get_browser(branch_->browser_all_branches) > 0));
}
void FormDocument::checkReadOnly()
{
if (bc().readOnly(controller().bufferIsReadonly())) {

View File

@ -17,18 +17,32 @@
#include <boost/scoped_ptr.hpp>
#include "lyx_forms.h"
#include <vector>
class ControlDocument;
class BufferParams;
class FormColorpicker;
struct FD_document;
struct FD_document_paper;
struct FD_document_class;
struct FD_document_language;
struct FD_document_options;
struct FD_document_bullet;
struct FD_document_branch;
namespace {
enum GuiColors {
GUI_COLOR_CHOICE = FL_FREE_COL15
};
}
/** This class provides an XForms implementation of the FormDocument dialog.
* The table-layout-form here changes values for latex-tabulars
@ -49,6 +63,8 @@ private:
/// Apply from dialog
virtual void apply();
///
void branch_input(FL_OBJECT *);
///
void ChoiceBulletSize(FL_OBJECT * ob, long);
///
@ -78,6 +94,8 @@ private:
void options_update(BufferParams const &);
///
void bullets_update(BufferParams const &);
///
void branch_update(BufferParams const &);
///
void paper_apply(BufferParams &);
@ -89,6 +107,8 @@ private:
bool options_apply(BufferParams &);
///
void bullets_apply(BufferParams &);
///
void branch_apply(BufferParams &);
/// Real GUI implementation.
boost::scoped_ptr<FD_document_paper> paper_;
@ -101,6 +121,10 @@ private:
///
boost::scoped_ptr<FD_document_bullet> bullets_;
///
boost::scoped_ptr<FD_document_branch> branch_;
///
boost::scoped_ptr<FormColorpicker> picker_;
///
int ActCell;
///
int Confirmed;
@ -112,6 +136,8 @@ private:
FL_OBJECT * fbullet;
///
std::vector<string> lang_;
/// Contains all legal branches for this doc
BranchList branchlist_;
};
#endif

View File

@ -74,6 +74,8 @@ libxforms_la_SOURCES = \
FormBibtex.h \
FormBrowser.C \
FormBrowser.h \
FormBranch.C \
FormBranch.h \
FormChanges.C \
FormChanges.h \
FormCharacter.C \

View File

@ -13,6 +13,7 @@ SRCS = form_aboutlyx.fd \
form_bibitem.fd \
form_bibtex.fd \
form_browser.fd \
form_branch.fd \
form_changes.fd \
form_character.fd \
form_citation.fd \

View File

@ -0,0 +1,107 @@
Magic: 13000
Internal Form Definition File
(do not change)
Number of forms: 1
Unit of measure: FL_COORD_PIXEL
SnapGrid: 7
=============== FORM ===============
Name: form_branch
Width: 407
Height: 113
Number of Objects: 5
--------------------
class: FL_BOX
type: UP_BOX
box: 0 0 407 113
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name:
callback:
argument:
--------------------
class: FL_CHOICE
type: NORMAL_CHOICE
box: 154 21 217 28
boxtype: FL_FRAME_BOX
colors: FL_COL1 FL_BLACK
alignment: FL_ALIGN_LEFT
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Branch:|#B
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: choice_branch
callback: C_FormDialogView_InputCB
argument: 0
--------------------
class: FL_BUTTON
type: RETURN_BUTTON
box: 49 70 84 28
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: OK
shortcut: ^M
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_ok
callback: C_FormDialogView_OKCB
argument: 0
--------------------
class: FL_BUTTON
type: RETURN_BUTTON
box: 154 70 98 28
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Apply|#A
shortcut: ^M
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_apply
callback: C_FormDialogView_ApplyCB
argument: 0
--------------------
class: FL_BUTTON
type: RETURN_BUTTON
box: 266 70 105 28
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Cancel|^[
shortcut: ^M
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_cancel
callback: C_FormDialogView_CancelCB
argument: 0
==============================
create_the_forms

View File

@ -3,7 +3,7 @@ Magic: 13000
Internal Form Definition File
(do not change)
Number of forms: 6
Number of forms: 7
Unit of measure: FL_COORD_PIXEL
SnapGrid: 5
@ -178,13 +178,13 @@ argument: 0
=============== FORM ===============
Name: form_document_paper
Width: 395
Height: 310
Height: 320
Number of Objects: 29
--------------------
class: FL_BOX
type: FLAT_BOX
box: 0 0 395 310
box: 0 0 395 320
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -247,7 +247,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Width:|#W
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_custom_width
callback: C_FormBaseInputCB
@ -265,7 +265,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_custom_width_units
callback: C_FormBaseInputCB
@ -283,7 +283,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Height:|#H
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_custom_height
callback: C_FormBaseInputCB
@ -301,7 +301,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_custom_height_units
callback: C_FormBaseInputCB
@ -328,7 +328,7 @@ argument:
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -400,7 +400,7 @@ argument:
--------------------
class: FL_LABELFRAME
type: ENGRAVED_FRAME
box: 5 130 385 175
box: 5 130 385 185
boxtype: FL_NO_BOX
colors: FL_BLACK FL_COL1
alignment: FL_ALIGN_TOP_LEFT
@ -463,7 +463,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Top:|#T
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_top_margin
callback: C_FormBaseInputCB
@ -481,7 +481,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_top_margin_units
callback: C_FormBaseInputCB
@ -499,7 +499,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Bottom:|#B
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_bottom_margin
callback: C_FormBaseInputCB
@ -517,7 +517,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_bottom_margin_units
callback: C_FormBaseInputCB
@ -526,7 +526,7 @@ argument: 0
--------------------
class: FL_INPUT
type: NORMAL_INPUT
box: 75 240 50 25
box: 75 250 50 25
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT
@ -535,7 +535,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Inner:|#I
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_inner_margin
callback: C_FormBaseInputCB
@ -544,7 +544,7 @@ argument: 0
--------------------
class: FL_CHOICE
type: NORMAL_CHOICE
box: 125 240 50 25
box: 125 250 50 25
boxtype: FL_FRAME_BOX
colors: FL_COL1 FL_BLACK
alignment: FL_ALIGN_LEFT
@ -553,7 +553,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_inner_margin_units
callback: C_FormBaseInputCB
@ -562,7 +562,7 @@ argument: 0
--------------------
class: FL_INPUT
type: NORMAL_INPUT
box: 75 270 50 25
box: 75 280 50 25
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT
@ -571,7 +571,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Outer:|#u
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_outer_margin
callback: C_FormBaseInputCB
@ -580,7 +580,7 @@ argument: 0
--------------------
class: FL_CHOICE
type: NORMAL_CHOICE
box: 125 270 50 25
box: 125 280 50 25
boxtype: FL_FRAME_BOX
colors: FL_COL1 FL_BLACK
alignment: FL_ALIGN_LEFT
@ -589,7 +589,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_outer_margin_units
callback: C_FormBaseInputCB
@ -607,7 +607,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Headheight:|#H
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_head_height
callback: C_FormBaseInputCB
@ -625,7 +625,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_head_height_units
callback: C_FormBaseInputCB
@ -643,7 +643,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Headsep:|#d
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_head_sep
callback: C_FormBaseInputCB
@ -661,7 +661,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_head_sep_units
callback: C_FormBaseInputCB
@ -679,7 +679,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Footskip:|#F
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_foot_skip
callback: C_FormBaseInputCB
@ -697,7 +697,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_foot_skip_units
callback: C_FormBaseInputCB
@ -865,7 +865,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Spacing:|#g
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_spacing
callback: C_FormBaseInputCB
@ -883,7 +883,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Extra Options:|#X
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_extra
callback: C_FormBaseInputCB
@ -901,7 +901,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_skip
callback: C_FormBaseInputCB
@ -919,7 +919,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Default Skip:|#u
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_skip
callback: C_FormBaseInputCB
@ -928,7 +928,7 @@ argument: 0
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -1000,7 +1000,7 @@ argument:
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -1072,7 +1072,7 @@ argument:
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -1154,7 +1154,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_spacing
callback: C_FormBaseInputCB
@ -1172,7 +1172,7 @@ size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: choice_skip_units
callback: C_FormBaseInputCB
@ -1259,7 +1259,7 @@ argument: 0
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -1349,13 +1349,13 @@ argument: 0
=============== FORM ===============
Name: form_document_options
Width: 395
Height: 310
Height: 325
Number of Objects: 8
--------------------
class: FL_BOX
type: FLAT_BOX
box: 0 0 395 310
box: 0 0 395 325
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -1373,7 +1373,7 @@ argument:
--------------------
class: FL_INPUT
type: NORMAL_INPUT
box: 185 20 120 25
box: 185 15 120 25
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT
@ -1382,7 +1382,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Float Placement:|#L
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_float_placement
callback: C_FormBaseInputCB
@ -1391,7 +1391,7 @@ argument: 0
--------------------
class: FL_COUNTER
type: SIMPLE_COUNTER
box: 185 60 80 25
box: 185 55 80 25
boxtype: FL_UP_BOX
colors: FL_COL1 FL_BLUE
alignment: FL_ALIGN_LEFT
@ -1413,7 +1413,7 @@ argument: 0
--------------------
class: FL_COUNTER
type: SIMPLE_COUNTER
box: 185 100 80 25
box: 185 90 80 25
boxtype: FL_UP_BOX
colors: FL_COL1 FL_BLUE
alignment: FL_ALIGN_LEFT
@ -1435,7 +1435,7 @@ argument: 0
--------------------
class: FL_CHOICE
type: NORMAL_CHOICE
box: 185 140 140 25
box: 185 130 140 25
boxtype: FL_FRAME_BOX
colors: FL_COL1 FL_BLACK
alignment: FL_ALIGN_LEFT
@ -1453,10 +1453,10 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 185 225 25 25
box: 185 220 140 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_LEFT
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
@ -1471,7 +1471,7 @@ argument: 0
--------------------
class: FL_CHOICE
type: NORMAL_CHOICE
box: 185 265 140 25
box: 185 260 140 25
boxtype: FL_FRAME_BOX
colors: FL_COL1 FL_BLACK
alignment: FL_ALIGN_LEFT
@ -1489,7 +1489,7 @@ argument: 0
--------------------
class: FL_CHOICE
type: NORMAL_CHOICE
box: 185 185 140 25
box: 185 170 140 25
boxtype: FL_FRAME_BOX
colors: FL_COL1 FL_BLACK
alignment: FL_ALIGN_LEFT
@ -1594,7 +1594,7 @@ size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: LaTeX:|#L
shortcut:
resize: FL_RESIZE_ALL
resize: FL_RESIZE_X
gravity: FL_NoGravity FL_NoGravity
name: input_latex
callback: C_FormBaseInputCB
@ -1603,7 +1603,7 @@ argument: 0
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -1712,7 +1712,7 @@ argument:
--------------------
class: FL_BEGIN_GROUP
type: 0
box: 0 10 10 0
box: 0 0 0 0
boxtype: FL_NO_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_CENTER
@ -1854,5 +1854,191 @@ name:
callback:
argument:
=============== FORM ===============
Name: form_document_branch
Width: 395
Height: 325
Number of Objects: 10
--------------------
class: FL_BOX
type: UP_BOX
box: 0 0 395 325
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name:
callback:
argument:
--------------------
class: FL_INPUT
type: NORMAL_INPUT
box: 15 30 150 30
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_TOP_LEFT
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: New Branch:|#N
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: input_all_branches
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 175 30 100 30
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Add|#d
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_add_branch
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 15 230 100 30
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Remove|#e
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_remove_branch
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BROWSER
type: HOLD_BROWSER
box: 15 90 150 125
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_TOP_LEFT
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Available Branches:
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: browser_all_branches
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BROWSER
type: HOLD_BROWSER
box: 220 90 155 125
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_TOP_LEFT
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Activated Branches:
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: browser_selection
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 175 95 35 35
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: @5->
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_select
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 175 135 35 35
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: @9+
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_deselect
callback: C_FormBaseInputCB
argument: 0
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 165 275 55 30
boxtype: FL_FLAT_BOX
colors: FL_WHITE FL_COL1
alignment: FL_ALIGN_LEFT
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Display Background:
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_color
callback:
argument:
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 230 275 85 30
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_NORMAL_SIZE
lcol: FL_BLACK
label: Modify
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: button_modify
callback: C_FormBaseInputCB
argument: 0
==============================
create_the_forms

View File

@ -1,3 +1,21 @@
2003-08-17 Martin Vermeer <martin.vermeer@hut.fi>
* Makefile.am:
* inset.h:
* insetbranch.[Ch]: implements the 'branch inset'
idea. This allows the output of various versions of a document
from a single source version, selectively outputing or suppressing
output of parts of the text.
This implementation contains a 'branch list editor' in a separate
tab of the document settings dialog. Branches are user definable
and have a "display colour" to distinguish them on-screen.
ColorHandler was somewhat cleaned up.
(1) make possible a dynamically growing LColor list by allowing
the graphic context cache to grow along (vector);
(2) eliminate an IMHO unnecessary step in colour allocation.
2003-08-15 André Pönitz <poenitz@gmx.net>
* insettext.[Ch]: adjust after rowlist split

View File

@ -25,6 +25,8 @@ libinsets_la_SOURCES = \
insetbibitem.h \
insetbibtex.C \
insetbibtex.h \
insetbranch.C \
insetbranch.h \
insetcaption.C \
insetcaption.h \
insetcite.C \

View File

@ -51,7 +51,7 @@ public:
in a cleaner way. */
enum Code {
///
NO_CODE,
NO_CODE, // 0
///
TOC_CODE, // do these insets really need a code? (ale)
///
@ -59,9 +59,9 @@ public:
///
MARK_CODE,
///
REF_CODE, // 5
REF_CODE,
///
URL_CODE,
URL_CODE, // 5
///
HTMLURL_CODE,
///
@ -69,9 +69,9 @@ public:
///
ENDING_CODE,
///
LABEL_CODE, // 10
LABEL_CODE,
///
NOTE_CODE,
NOTE_CODE, // 10
///
ACCENT_CODE,
///
@ -79,9 +79,9 @@ public:
///
INDEX_CODE,
///
INCLUDE_CODE, // 15
INCLUDE_CODE,
///
GRAPHICS_CODE,
GRAPHICS_CODE, // 15
///
BIBITEM_CODE,
///
@ -89,9 +89,9 @@ public:
///
TEXT_CODE,
///
ERT_CODE, // 20
ERT_CODE,
///
FOOT_CODE,
FOOT_CODE, // 20
///
MARGIN_CODE,
///
@ -101,9 +101,9 @@ public:
///
MINIPAGE_CODE,
///
SPACE_CODE,
SPACE_CODE, // 25
///
SPECIALCHAR_CODE, // 25
SPECIALCHAR_CODE,
///
TABULAR_CODE,
///
@ -125,13 +125,15 @@ public:
///
INDEX_PRINT_CODE,
///
OPTARG_CODE,
OPTARG_CODE, // 35
///
ENVIRONMENT_CODE,
///
HFILL_CODE,
///
NEWLINE_CODE
NEWLINE_CODE,
///
BRANCH_CODE
};
///

277
src/insets/insetbranch.C Normal file
View File

@ -0,0 +1,277 @@
/**
* \file insetbranch.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#include <config.h>
#include "Lsstream.h"
#include "insetbranch.h"
#include "gettext.h"
#include "lyxfont.h"
#include "language.h"
#include "buffer.h"
#include "BufferView.h"
#include "LaTeXFeatures.h"
#include "latexrunparams.h"
#include "lyxlex.h"
#include "lyxtext.h"
#include "insets/insettext.h"
#include "support/LOstream.h"
#include "support/lstrings.h"
#include "debug.h"
using std::ostream;
using std::auto_ptr;
void InsetBranch::init()
{
setInsetName("Branch");
setButtonLabel();
}
InsetBranch::InsetBranch(BufferParams const & bp, string const & label)
: InsetCollapsable(bp)
{
params_.branch = label;
// Hack: stash the list of all allowable branch labels from this
// buffer into inset's parm list as a "stowaway":
params_.branchlist = bp.branchlist;
init();
}
InsetBranch::InsetBranch(InsetBranch const & in)
: InsetCollapsable(in), params_(in.params_)
{
init();
}
InsetBranch::~InsetBranch()
{
InsetBranchMailer mailer("branch", *this);
mailer.hideDialog();
}
auto_ptr<InsetBase> InsetBranch::clone() const
{
return auto_ptr<InsetBase>(new InsetBranch(*this));
}
string const InsetBranch::editMessage() const
{
return _("Opened Branch Inset");
}
void InsetBranch::write(Buffer const * buf, ostream & os) const
{
params_.write(os);
InsetCollapsable::write(buf, os);
}
void InsetBranch::read(Buffer const * buf, LyXLex & lex)
{
if (lex.isOK()) {
lex.next();
params_.branch = lex.getString();
}
InsetCollapsable::read(buf, lex);
setButtonLabel();
}
void InsetBranch::setButtonLabel()
{
LyXFont font(LyXFont::ALL_SANE);
font.decSize();
font.decSize();
setLabel(params_.branch);
font.setColor(LColor::foreground);
string const color = params_.branchlist.getColor(params_.branch);
if (!color.empty()) {
setBackgroundColor(lcolor.getFromLyXName(params_.branch));
} else
setBackgroundColor(LColor::background);
setLabelFont(font);
}
void InsetBranch::metrics(MetricsInfo & mi, Dimension & dim) const
{
InsetCollapsable::metrics(mi, dim);
dim_ = dim;
}
void InsetBranch::draw(PainterInfo & pi, int x, int y) const
{
InsetCollapsable::draw(pi, x, y);
}
bool InsetBranch::showInsetDialog(BufferView * bv) const
{
InsetBranchMailer("branch", const_cast<InsetBranch &>(*this)).showDialog(bv);
return true;
}
dispatch_result InsetBranch::localDispatch(FuncRequest const & cmd)
{
BufferView * bv = cmd.view();
switch (cmd.action) {
case LFUN_INSET_MODIFY:
{
InsetBranchParams params;
InsetBranchMailer::string2params(cmd.argument, params);
params_.branch = params.branch;
setButtonLabel();
bv->updateInset();
return DISPATCHED;
}
case LFUN_INSET_EDIT:
if (cmd.button() != mouse_button::button3)
return InsetCollapsable::localDispatch(cmd);
return UNDISPATCHED;
case LFUN_INSET_DIALOG_UPDATE:
InsetBranchMailer("branch", *this).updateDialog(bv);
return DISPATCHED;
case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
InsetBranchMailer("branch", *this).showDialog(bv);
return DISPATCHED;
}
// fallthrough:
default:
return InsetCollapsable::localDispatch(cmd);
}
}
int InsetBranch::latex(Buffer const * buf, ostream & os,
LatexRunParams const & runparams) const
{
string const branch_sel = buf->params.branchlist.allSelected();
if (branch_sel.find(params_.branch, 0) != string::npos)
return inset.latex(buf, os, runparams);
return 0;
}
int InsetBranch::linuxdoc(Buffer const *, std::ostream &) const
{
return 0;
}
int InsetBranch::docbook(Buffer const * buf, std::ostream & os, bool mixcont) const
{
// untested - MV
string const branch_sel = buf->params.branchlist.allSelected();
if (branch_sel.find(params_.branch, 0) != string::npos)
return inset.docbook(buf, os, mixcont);
return 0;
}
int InsetBranch::ascii(Buffer const * buf, std::ostream & os, int ll) const
{
string const branch_sel = buf->params.branchlist.allSelected();
if (branch_sel.find(params_.branch, 0) != string::npos) {
return inset.ascii(buf, os, ll);
}
return 0;
}
void InsetBranch::validate(LaTeXFeatures & features) const
{
inset.validate(features);
}
InsetBranchMailer::InsetBranchMailer(string const & name,
InsetBranch & inset)
: name_(name), inset_(inset)
{
}
string const InsetBranchMailer::inset2string(Buffer const & buf) const
{
InsetBranchParams params = inset_.params();
params.branchlist = buf.params.branchlist;
inset_.setParams(params);
return params2string(name_, params);
}
string const InsetBranchMailer::params2string(string const & name,
InsetBranchParams const & params)
{
ostringstream data;
data << name << ' ';
params.write(data);
// Add all_branches parameter to data:
data << params.branchlist.allBranches() << "\n";
return STRCONV(data.str());
}
void InsetBranchMailer::string2params(string const & in,
InsetBranchParams & params)
{
params = InsetBranchParams();
if (in.empty())
return;
istringstream data(STRCONV(in));
LyXLex lex(0,0);
lex.setStream(data);
params.read(lex);
// Process all_branches here:
if (lex.isOK()) {
lex.next();
params.branchlist.add(lex.getString());
}
}
void InsetBranchParams::write(ostream & os) const
{
os << "Branch" << " " << branch << "\n";
}
void InsetBranchParams::read(LyXLex & lex)
{
if (lex.isOK()) {
lex.next();
string token = lex.getString();
}
if (lex.isOK()) {
lex.next();
string token = lex.getString();
}
if (lex.isOK()) {
lex.next();
branch = lex.getString();
}
}

115
src/insets/insetbranch.h Normal file
View File

@ -0,0 +1,115 @@
// -*- C++ -*-
/**
* \file insetbranch.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS
*/
#ifndef INSETBRANCH_H
#define INSETBRANCH_H
#include "insetcollapsable.h"
#include "BranchList.h"
struct InsetBranchParams {
///
void write(std::ostream & os) const;
///
void read(LyXLex & lex);
///
string branch;
/// Hack -- MV
BranchList branchlist;
};
/** The Branch inset for alternative, conditional output.
*/
class InsetBranch : public InsetCollapsable {
public:
///
InsetBranch(BufferParams const &, string const &);
/// Copy constructor
InsetBranch(InsetBranch const &);
///
~InsetBranch();
///
virtual std::auto_ptr<InsetBase> clone() const;
///
string const editMessage() const;
///
InsetOld::Code lyxCode() const { return InsetOld::BRANCH_CODE; }
///
void write(Buffer const *, std::ostream &) const;
///
void read(Buffer const * buf, LyXLex & lex);
///
void setButtonLabel();
///
void metrics(MetricsInfo & mi, Dimension & dim) const;
///
void draw(PainterInfo & pi, int x, int y) const;
///
bool showInsetDialog(BufferView *) const;
///
dispatch_result localDispatch(FuncRequest const &);
///
int latex(Buffer const *, std::ostream &,
LatexRunParams const &) const;
///
int linuxdoc(Buffer const *, std::ostream &) const;
///
int docbook(Buffer const *, std::ostream &, bool) const;
///
int ascii(Buffer const *, std::ostream &, int) const;
///
void validate(LaTeXFeatures &) const;
///
InsetBranchParams const & params() const { return params_; }
///
void setParams(InsetBranchParams const & params) { params_ = params; }
private:
friend class InsetBranchParams;
/// used by the constructors
void init();
///
InsetBranchParams params_;
};
#include "mailinset.h"
class InsetBranchMailer : public MailInset {
public:
///
InsetBranchMailer(string const & name, InsetBranch & inset);
///
virtual InsetBase & inset() const { return inset_; }
///
virtual string const & name() const { return name_; }
///
virtual string const inset2string(Buffer const &) const;
///
static string const params2string(string const &, InsetBranchParams const &);
///
static void string2params(string const &, InsetBranchParams &);
private:
///
string const name_;
///
InsetBranch & inset_;
};
#endif

View File

@ -321,6 +321,7 @@ enum kb_action {
LFUN_PARAGRAPH_UPDATE,
LFUN_EXTERNAL_EDIT,
// 245
LFUN_INSERT_BRANCH,
LFUN_LASTACTION // end of the table
};

View File

@ -505,6 +505,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
case InsetOld::NOTE_CODE:
disable = ev.argument != "note";
break;
case InsetOld::BRANCH_CODE:
disable = ev.argument != "branch";
break;
default:
break;
}
@ -633,6 +636,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
case LFUN_INSERT_NOTE:
code = InsetOld::NOTE_CODE;
break;
case LFUN_INSERT_BRANCH:
code = InsetOld::BRANCH_CODE;
if (buf->params.branchlist.empty())
disable = true;
break;
case LFUN_INSERT_LABEL:
code = InsetOld::LABEL_CODE;
break;

View File

@ -1494,6 +1494,7 @@ InsetOld::RESULT LyXText::dispatch(FuncRequest const & cmd)
case LFUN_INSET_CAPTION:
#endif
case LFUN_INSERT_NOTE:
case LFUN_INSERT_BRANCH:
case LFUN_INSERT_BIBITEM:
case LFUN_INSET_ERT:
case LFUN_INSET_FLOAT: