Mozilla/mozilla/cmd/xfe/src/PrefsFont.cpp
ltabb 8ed5afe62c Free the lizard
git-svn-id: svn://10.0.0.236/trunk@10 18797224-902f-48f8-a5cc-f745e15eee43
1998-03-28 02:44:41 +00:00

540 lines
13 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/* */
/*
PrefsFont.cpp -- The fontuage dialog for preference, packaged from 3.0 code
Created: Linda Wei <lwei@netscape.com>, 25-Feb-97.
*/
#include "felocale.h"
#include "structs.h"
#include "fonts.h"
#include "xpassert.h"
#include "xfe.h"
#include "e_kit.h"
#include "PrefsFont.h"
#include "nf.h"
#include "Mnffbu.h"
#include <Xm/ArrowBG.h>
#include <Xm/Label.h>
#include <Xm/LabelG.h>
#include <Xm/PushB.h>
#include <Xm/PushBG.h>
#include <Xm/ScrolledW.h>
#include <Xm/ToggleB.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/TextF.h>
#include <Xm/ToggleBG.h>
#include <Xfe/Xfe.h>
extern "C"
{
char *XP_GetString(int i);
}
#define OUTLINER_GEOMETRY_PREF "preferences.font.outliner_geometry"
extern int XFE_FONT_COL_ORDER;
extern int XFE_FONT_COL_DISPLAYER;
const int XFE_PrefsFontDialog::OUTLINER_COLUMN_ORDER = 0;
const int XFE_PrefsFontDialog::OUTLINER_COLUMN_DISPLAYER = 1;
const int XFE_PrefsFontDialog::OUTLINER_COLUMN_MAX_LENGTH = 256;
const int XFE_PrefsFontDialog::OUTLINER_INIT_POS = (-1);
#define STRING_COL_ORDER "Order"
#define STRING_COL_DISPLAYER "Displayer"
// ==================== Public Member Functions ====================
// Member: XFE_PrefsFontDialog
// Description: Constructor
// Inputs:
// Side effects: Creates the Font Displayer dialog
XFE_PrefsFontDialog::XFE_PrefsFontDialog(XFE_PrefsDialog *prefsDialog,
Widget parent, // dialog parent
char *name, // dialog name
Boolean modal) // modal dialog?
: XFE_Dialog(parent,
name,
TRUE, // ok
TRUE, // cancel
FALSE, // help
FALSE, // apply
FALSE, // separator
modal // modal
),
m_prefsDialog(prefsDialog),
m_prefsDataFont(0)
{
PrefsDataFont *fep = NULL;
fep = new PrefsDataFont;
memset(fep, 0, sizeof(PrefsDataFont));
m_prefsDataFont = fep;
Widget kids[100];
Arg av[50];
int ac;
int i;
Widget form;
form = XtVaCreateWidget("form", xmFormWidgetClass, m_chrome,
XmNmarginWidth, 8,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
XtManageChild (form);
Widget font_label;
Widget font_list;
Widget up_button;
Widget down_button;
ac = 0;
i = 0;
kids[i++] = font_label = XmCreateLabelGadget(form, "fontLabel", av, ac);
kids[i++] = up_button = XmCreateArrowButtonGadget(form, "upButton", av, ac);
kids[i++] = down_button = XmCreateArrowButtonGadget(form, "downButton", av, ac);
fep->up_button = up_button;
fep->down_button = down_button;
// Outliner
int num_columns = 2;
static int default_column_widths[] = {8, 40};
XFE_Outliner *outliner;
outliner = new XFE_Outliner("fontList", // name
this, // outlinable
getPrefsDialog(), // top level
form, // parent
FALSE, // constant size
FALSE, // has headings
num_columns, // number of columns
num_columns, // number of visible columns
default_column_widths, // default column widths
OUTLINER_GEOMETRY_PREF
);
font_list = fep->font_list = outliner->getBaseWidget();
fep->font_outliner = outliner;
XtVaSetValues(outliner->getBaseWidget(),
XtVaTypedArg, XmNblankBackground, XmRString, "white", 6,
XmNvisibleRows, 10,
NULL);
XtVaSetValues(outliner->getBaseWidget(),
XmNcellDefaults, True,
XtVaTypedArg, XmNcellBackground, XmRString, "white", 6,
NULL);
outliner->setColumnResizable(OUTLINER_COLUMN_ORDER, False);
outliner->setColumnResizable(OUTLINER_COLUMN_DISPLAYER, False);
outliner->show();
XtVaSetValues(font_label,
XmNalignment, XmALIGNMENT_BEGINNING,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
XtVaSetValues(fep->font_list,
XmNtopOffset, 8,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, font_label,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
Dimension list_height;
Dimension up_button_height;
int down_button_top_offset;
int up_button_top_offset;
XtVaGetValues(down_button,
XmNtopOffset, &down_button_top_offset,
NULL);
list_height = XfeHeight(font_list);
up_button_height = XfeHeight(up_button);
up_button_top_offset = list_height/2 - up_button_height - down_button_top_offset/2;
XtVaSetValues(up_button,
XmNarrowDirection, XmARROW_UP,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, font_list,
XmNtopOffset, up_button_top_offset,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, font_list,
XmNleftOffset, 8,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
XtVaSetValues(down_button,
XmNarrowDirection, XmARROW_DOWN,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, up_button,
XmNtopOffset, 4,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, up_button,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
// Add callbacks
XtAddCallback(m_chrome, XmNokCallback, cb_ok, this);
XtAddCallback(m_chrome, XmNcancelCallback, cb_cancel, this);
XtAddCallback(up_button, XmNactivateCallback, cb_promote, this);
XtAddCallback(down_button, XmNactivateCallback, cb_demote, this);
XtManageChildren(kids, i);
XtManageChild(form);
}
// Member: ~XFE_PrefsFontDialog
// Description: Destructor
// Inputs:
// Side effects:
XFE_PrefsFontDialog::~XFE_PrefsFontDialog()
{
if (m_prefsDataFont) {
if (m_prefsDataFont->font_displayers)
nffbu_free(WF_fbu, m_prefsDataFont->font_displayers, NULL);
}
delete m_prefsDataFont;
}
// Member: show
// Description: Pop up dialog
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::show()
{
// TODO: Initialize the dialog
// Manage the top level
XFE_Dialog::show();
// Set focus to the OK button
XmProcessTraversal(m_okButton, XmTRAVERSE_CURRENT);
}
// Member: initPage
// Description: Initializes page for Font
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::initPage()
{
XP_ASSERT(m_prefsDataFont);
PrefsDataFont *fep = m_prefsDataFont;
// Retrieve the list of available font displayers
fep->font_displayers = (char **)nffbu_ListFontDisplayers(WF_fbu, NULL);
fep->font_displayers_count = 0;
if (fep->font_displayers != 0) {
for (int i=0; fep->font_displayers[i] == 0; i++) {
if (fep->font_displayers[i] != 0) fep->font_displayers_count++;
}
}
fep->font_outliner->change(0, fep->font_displayers_count, fep->font_displayers_count);
setSelectionPos(OUTLINER_INIT_POS);
}
// Member: verifyPage
// Description: verify page for Font
// Inputs:
// Side effects:
Boolean XFE_PrefsFontDialog::verifyPage()
{
return TRUE;
}
// Member: getContext
// Description: returns context
// Inputs:
// Side effects:
MWContext *XFE_PrefsFontDialog::getContext()
{
return (m_prefsDialog->getContext());
}
// Member: getPrefsDialog
// Description: returns preferences dialog
// Inputs:
// Side effects:
XFE_PrefsDialog *XFE_PrefsFontDialog::getPrefsDialog()
{
return (m_prefsDialog);
}
// Member: setSelelctionPos
// Description:
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::setSelectionPos(int pos)
{
PrefsDataFont *fep = m_prefsDataFont;
int count = fep->font_displayers_count;
if (pos >= count) return;
if (pos == OUTLINER_INIT_POS) {
XtVaSetValues(fep->up_button, XmNsensitive, False, NULL);
XtVaSetValues(fep->down_button, XmNsensitive, False, NULL);
}
else {
fep->font_outliner->selectItemExclusive(pos);
XtVaSetValues(fep->up_button, XmNsensitive, (pos != 0), NULL);
XtVaSetValues(fep->down_button, XmNsensitive, (pos != (count-1)), NULL);
}
}
// Member: deselelctionPos
// Description:
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::deselectPos(int pos)
{
PrefsDataFont *fep = m_prefsDataFont;
int count = fep->font_displayers_count;
if (pos >= count) return;
fep->font_outliner->deselectItem(pos);
}
// Member: prefsFontCb_ok
// Description:
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::cb_ok(Widget w,
XtPointer closure,
XtPointer callData)
{
XFE_PrefsFontDialog *theDialog = (XFE_PrefsFontDialog *)closure;
// PrefsDataFont *fep = theDialog->m_prefsDataFont;
// Simulate a cancel
theDialog->cb_cancel(w, closure, callData);
}
// Member: prefsFontCb_cancel
// Description:
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::cb_cancel(Widget /* w */,
XtPointer closure,
XtPointer /* callData */)
{
XFE_PrefsFontDialog *theDialog = (XFE_PrefsFontDialog *)closure;
XtRemoveCallback(theDialog->m_chrome, XmNokCallback, cb_ok, theDialog);
XtRemoveCallback(theDialog->m_chrome, XmNcancelCallback, cb_cancel, theDialog);
// Delete the dialog
delete theDialog;
}
// Member: prefsFontCb_promote
// Description:
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::cb_promote(Widget /* w */,
XtPointer /* closure */,
XtPointer /* callData */)
{
// XFE_PrefsFontDialog *theDialog = (XFE_PrefsFontDialog *)closure;
}
// Member: prefsFontCb_demote
// Description:
// Inputs:
// Side effects:
void XFE_PrefsFontDialog::cb_demote(Widget /* w */,
XtPointer /* closure */,
XtPointer /* callData */)
{
// XFE_PrefsFontDialog *theDialog = (XFE_PrefsFontDialog *)closure;
}
/* Outlinable interface methods */
void *XFE_PrefsFontDialog::ConvFromIndex(int /* index */)
{
return (void *)NULL;
}
int XFE_PrefsFontDialog::ConvToIndex(void * /* item */)
{
return 0;
}
char*XFE_PrefsFontDialog::getColumnName(int column)
{
switch (column){
case OUTLINER_COLUMN_ORDER:
return STRING_COL_ORDER;
case OUTLINER_COLUMN_DISPLAYER:
return STRING_COL_DISPLAYER;
default:
XP_ASSERT(0);
return 0;
}
}
char *XFE_PrefsFontDialog::getColumnHeaderText(int column)
{
switch (column)
{
case OUTLINER_COLUMN_ORDER:
case OUTLINER_COLUMN_DISPLAYER:
return "";
default:
XP_ASSERT(0);
return 0;
}
}
fe_icon *XFE_PrefsFontDialog::getColumnHeaderIcon(int /* column */)
{
return 0;
}
EOutlinerTextStyle XFE_PrefsFontDialog::getColumnHeaderStyle(int /* column */)
{
return OUTLINER_Default;
}
// This method acquires one line of data.
void *XFE_PrefsFontDialog::acquireLineData(int line)
{
PrefsDataFont *fep = m_prefsDataFont;
fep->m_rowIndex = line;
return (void *)1;
}
void XFE_PrefsFontDialog::getTreeInfo(Boolean * /* expandable */,
Boolean * /* is_expanded */,
int * /* depth */,
OutlinerAncestorInfo ** /* ancestor */)
{
// No-op
}
EOutlinerTextStyle XFE_PrefsFontDialog::getColumnStyle(int /*column*/)
{
return OUTLINER_Default;
}
char *XFE_PrefsFontDialog::getColumnText(int column)
{
PrefsDataFont *fep = m_prefsDataFont;
static char line[OUTLINER_COLUMN_MAX_LENGTH+1];
*line = 0;
switch (column) {
case OUTLINER_COLUMN_ORDER:
sprintf(line, "%d", fep->m_rowIndex+1);
break;
case OUTLINER_COLUMN_DISPLAYER:
sprintf(line, "%s", fep->font_displayers[fep->m_rowIndex]);
break;
default:
break;
}
return line;
}
fe_icon *XFE_PrefsFontDialog::getColumnIcon(int /* column */)
{
return 0;
}
void XFE_PrefsFontDialog::releaseLineData()
{
// No-op
}
void XFE_PrefsFontDialog::Buttonfunc(const OutlineButtonFuncData *data)
{
int row = data->row;
if (row < 0) {
// header
return;
}
setSelectionPos(data->row);
}
void XFE_PrefsFontDialog::Flippyfunc(const OutlineFlippyFuncData * /* data */)
{
// No-op
}
XFE_Outliner *XFE_PrefsFontDialog::getOutliner()
{
return m_prefsDataFont->font_outliner;
}