зеркало из https://github.com/mozilla/gecko-dev.git
309 строки
7.3 KiB
C++
309 строки
7.3 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.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
/*
|
|
ColorDialog.cpp -- class for XFE color dialog, packaged from fe_ColorPicker
|
|
Created: Linda Wei <lwei@netscape.com>, 08-Nov-96.
|
|
*/
|
|
|
|
|
|
|
|
#include "structs.h"
|
|
#include "xfe.h"
|
|
#include "ColorDialog.h"
|
|
|
|
#include <Xm/DrawnB.h>
|
|
#include <Xm/Label.h>
|
|
#include <Xm/LabelG.h>
|
|
#include <Xm/CascadeBG.h>
|
|
#include <Xm/PushB.h>
|
|
#include <Xm/PushBG.h>
|
|
#include <Xm/ToggleB.h>
|
|
#include <Xm/ArrowBG.h>
|
|
#include <Xm/Form.h>
|
|
#include <Xm/Frame.h>
|
|
#include <Xm/RowColumn.h>
|
|
#include <Xm/LabelG.h>
|
|
#include <Xm/TextF.h>
|
|
#include <Xm/ToggleBG.h>
|
|
|
|
extern "C"
|
|
{
|
|
char *XP_GetString(int i);
|
|
}
|
|
|
|
// ==================== Public Functions ====================
|
|
|
|
extern "C" Boolean
|
|
fe_colorDialog(Widget parent, MWContext *context, char *colorName, Pixel *pixel)
|
|
{
|
|
XFE_ColorDialog *theDialog = 0;
|
|
|
|
// Instantiate a color dialog
|
|
|
|
if ((theDialog = new XFE_ColorDialog(parent, "colorDialog", context)) == 0) {
|
|
extern int XFE_OUT_OF_MEMORY_URL; // from xfe_err.h
|
|
fe_perror(context, XP_GetString( XFE_OUT_OF_MEMORY_URL ) );
|
|
return FALSE;
|
|
}
|
|
|
|
// Set default color.
|
|
if (colorName != NULL && colorName[0] != '\0') {
|
|
unsigned red;
|
|
unsigned blue;
|
|
unsigned green;
|
|
|
|
if (sscanf(colorName, "#%02x%02x%02x", &red, &green, &blue) == 3) {
|
|
LO_Color color;
|
|
color.red = red;
|
|
color.green = green;
|
|
color.blue = blue;
|
|
fe_ColorPickerSetColor(theDialog->getColorPicker(), &color);
|
|
}
|
|
}
|
|
|
|
// Pop up the color dialog
|
|
|
|
theDialog->show();
|
|
|
|
while (theDialog->getDoneButton() == XFE_ColorDialog::XFE_DIALOG_NONE_BUTTON) {
|
|
fe_EventLoop();
|
|
}
|
|
|
|
char selectedColorName[32];
|
|
Pixel selectedPixel = theDialog->getSelectedPixel();
|
|
int done_button = theDialog->getDoneButton();
|
|
|
|
selectedColorName[0] = '\0';
|
|
if (theDialog->getSelectedColorName())
|
|
strcpy(selectedColorName, theDialog->getSelectedColorName());
|
|
|
|
if (done_button != XFE_ColorDialog::XFE_DIALOG_DESTROY_BUTTON)
|
|
delete theDialog;
|
|
|
|
if (done_button == XFE_ColorDialog::XFE_DIALOG_OK_BUTTON) {
|
|
if (XP_STRLEN(selectedColorName) > 0)
|
|
strcpy (colorName, selectedColorName);
|
|
else
|
|
*colorName = '\0';
|
|
*pixel = selectedPixel;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// ==================== Public Member Functions ====================
|
|
|
|
// Member: XFE_ColorDialog
|
|
// Description: Constructor
|
|
// Inputs:
|
|
// Side effects: Creates a preferences dialog
|
|
|
|
XFE_ColorDialog::XFE_ColorDialog(Widget parent, // dialog parent
|
|
char *name, // dialog name
|
|
MWContext *context, // context
|
|
Boolean modal) // modal dialog?
|
|
: XFE_Dialog(parent,
|
|
name,
|
|
TRUE, // ok
|
|
TRUE, // cancel
|
|
FALSE, // help
|
|
FALSE, // apply
|
|
FALSE, // separator
|
|
modal // modal
|
|
),
|
|
m_context(context),
|
|
m_colorPicker(0),
|
|
m_done(XFE_ColorDialog::XFE_DIALOG_NONE_BUTTON),
|
|
m_selectedColorName(0),
|
|
m_selectedPixel(0)
|
|
{
|
|
Arg args[16];
|
|
Cardinal n;
|
|
|
|
n = 0;
|
|
m_colorPicker = fe_CreateColorPicker(m_chrome, "colorPicker", args, n);
|
|
XtManageChild(m_colorPicker);
|
|
|
|
// Add callbacks
|
|
|
|
XtAddCallback(m_chrome, XmNokCallback, colorDialogCb_ok, this);
|
|
XtAddCallback(m_chrome, XmNcancelCallback, colorDialogCb_cancel, this);
|
|
XtAddCallback(m_chrome, XmNdestroyCallback, colorDialogCb_destroy, this);
|
|
}
|
|
|
|
// Member: ~XFE_ColorDialog
|
|
// Description: Destructor
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
XFE_ColorDialog::~XFE_ColorDialog()
|
|
{
|
|
// Clean up
|
|
if (m_selectedColorName) XtFree(m_selectedColorName);
|
|
}
|
|
|
|
// Member: show
|
|
// Description: Pop up dialog
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
void XFE_ColorDialog::show()
|
|
{
|
|
// Manage the top level
|
|
|
|
XFE_Dialog::show();
|
|
|
|
// Set focus to the OK button
|
|
|
|
XmProcessTraversal(m_okButton, XmTRAVERSE_CURRENT);
|
|
}
|
|
|
|
// Member: setSelectedColorName
|
|
// Description: sets selected color name
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
void XFE_ColorDialog::setSelectedColorName(char *name)
|
|
{
|
|
if (m_selectedColorName) XtFree(m_selectedColorName);
|
|
m_selectedColorName = (char*) XtNewString(name);
|
|
}
|
|
|
|
// Member: getSelectedPixel
|
|
// Description: returns the selected pixel
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
void XFE_ColorDialog::setSelectedPixel(Pixel pix)
|
|
{
|
|
m_selectedPixel = pix;
|
|
}
|
|
|
|
// Member: getDoneButton
|
|
// Description: returns the done button
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
int XFE_ColorDialog::getDoneButton()
|
|
{
|
|
return m_done;
|
|
}
|
|
|
|
// Member: getSelectedColorName
|
|
// Description: returns the selected color name
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
char *XFE_ColorDialog::getSelectedColorName()
|
|
{
|
|
return m_selectedColorName;
|
|
}
|
|
|
|
// Member: getSelectedPixel
|
|
// Description: returns the selected pixel
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
Pixel XFE_ColorDialog::getSelectedPixel()
|
|
{
|
|
return m_selectedPixel;
|
|
}
|
|
|
|
// Member: getContext
|
|
// Description: Gets MWContext (for now)
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
MWContext *XFE_ColorDialog::getContext()
|
|
{
|
|
return m_context;
|
|
}
|
|
|
|
// Member: getColorPicker
|
|
// Description: Gets the color picker folder
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
Widget XFE_ColorDialog::getColorPicker()
|
|
{
|
|
return m_colorPicker;
|
|
}
|
|
|
|
// ==================== Protected Member Functions ====================
|
|
|
|
|
|
// ==================== Private Member Functions ====================
|
|
|
|
|
|
// ==================== Friend Functions ====================
|
|
|
|
|
|
// Member: colorDialogCb_ok
|
|
// Description:
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
void colorDialogCb_ok(Widget /* w */,
|
|
XtPointer closure,
|
|
XtPointer /* callData */)
|
|
{
|
|
XFE_ColorDialog *theDialog = (XFE_ColorDialog *)closure;
|
|
LO_Color color;
|
|
char buf[32];
|
|
|
|
theDialog->m_done = XFE_ColorDialog::XFE_DIALOG_OK_BUTTON;
|
|
|
|
fe_ColorPickerGetColor(theDialog->getColorPicker(), &color);
|
|
XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color.red, color.green, color.blue);
|
|
theDialog->setSelectedColorName(buf);
|
|
|
|
Pixel pixel = fe_GetPixel(theDialog->getContext(), color.red, color.green, color.blue);
|
|
theDialog->setSelectedPixel(pixel);
|
|
}
|
|
|
|
// Member: colorDialogCb_cancel
|
|
// Description:
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
void colorDialogCb_cancel(Widget /* w */,
|
|
XtPointer closure,
|
|
XtPointer /* callData */)
|
|
{
|
|
XFE_ColorDialog *theDialog = (XFE_ColorDialog *)closure;
|
|
theDialog->m_done = XFE_ColorDialog::XFE_DIALOG_CANCEL_BUTTON;
|
|
}
|
|
|
|
// Member: colorDialogCb_destroy
|
|
// Description:
|
|
// Inputs:
|
|
// Side effects:
|
|
|
|
void colorDialogCb_destroy(Widget /* w */,
|
|
XtPointer closure,
|
|
XtPointer /* callData */)
|
|
{
|
|
XFE_ColorDialog *theDialog = (XFE_ColorDialog *)closure;
|
|
theDialog->m_done = XFE_ColorDialog::XFE_DIALOG_DESTROY_BUTTON;
|
|
}
|
|
|