/* -*- 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 , 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 #include #include #include #include #include #include #include #include #include #include #include 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; }