Files
haiku-beta6/src/add-ons/translators/pngtranslator/PNGView.cpp
T
Matthew Wilber dfb8c585c6 Updated with new Translation Kit version macro names.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11257 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-02-05 18:22:17 +00:00

190 lines
5.3 KiB
C++

/*****************************************************************************/
// PNGView
// Written by Michael Wilber, OBOS Translation Kit Team
//
// PNGView.cpp
//
// This BView based object displays information about the PNGTranslator.
//
//
// Copyright (c) 2003 OpenBeOS Project
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
/*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <png.h>
#include <Alert.h>
#include "PNGView.h"
#include "PNGTranslator.h"
BMessage *
interlace_msg(int option)
{
BMessage *pmsg = new BMessage(M_PNG_SET_INTERLACE);
pmsg->AddInt32(PNG_SETTING_INTERLACE, option);
return pmsg;
}
// ---------------------------------------------------------------
// Constructor
//
// Sets up the view settings
//
// Preconditions:
//
// Parameters:
//
// Postconditions:
//
// Returns:
// ---------------------------------------------------------------
PNGView::PNGView(const BRect &frame, const char *name,
uint32 resize, uint32 flags, TranslatorSettings *settings)
: BView(frame, name, resize, flags)
{
fSettings = settings;
SetViewColor(220,220,220,0);
// setup PNG interlace options menu
fpmnuInterlace = new BPopUpMenu("Interlace Option");
BMenuItem *pitmNone, *pitmAdam7;
pitmNone = new BMenuItem("None", interlace_msg(PNG_INTERLACE_NONE));
pitmAdam7 = new BMenuItem("Adam7", interlace_msg(PNG_INTERLACE_ADAM7));
fpmnuInterlace->AddItem(pitmNone);
fpmnuInterlace->AddItem(pitmAdam7);
fpfldInterlace = new BMenuField(BRect(20, 50, 200, 70),
"PNG Interlace Menu", "Interlacing Type", fpmnuInterlace);
fpfldInterlace->SetViewColor(ViewColor());
AddChild(fpfldInterlace);
// set Interlace option to show the current configuration
if (fSettings->SetGetInt32(PNG_SETTING_INTERLACE) == PNG_INTERLACE_NONE)
pitmNone->SetMarked(true);
else
pitmAdam7->SetMarked(true);
}
// ---------------------------------------------------------------
// Destructor
//
// Releases the PNGTranslator settings
//
// Preconditions:
//
// Parameters:
//
// Postconditions:
//
// Returns:
// ---------------------------------------------------------------
PNGView::~PNGView()
{
fSettings->Release();
}
void
PNGView::AllAttached()
{
// Tell all controls that this view is the target for
// messages from controls on this view
BView::AllAttached();
BMessenger msgr(this);
// set target for interlace options menu items
for (int32 i = 0; i < fpmnuInterlace->CountItems(); i++) {
BMenuItem *pitm = fpmnuInterlace->ItemAt(i);
if (pitm)
pitm->SetTarget(msgr);
}
}
// ---------------------------------------------------------------
// Draw
//
// Draws information about the PNGTranslator to this view.
//
// Preconditions:
//
// Parameters: area, not used
//
// Postconditions:
//
// Returns:
// ---------------------------------------------------------------
void
PNGView::Draw(BRect area)
{
SetFont(be_bold_font);
font_height fh;
GetFontHeight(&fh);
float xbold, ybold;
xbold = fh.descent + 1;
ybold = fh.ascent + fh.descent * 2 + fh.leading;
char title[] = "OpenBeOS PNG Image Translator";
DrawString(title, BPoint(xbold, ybold));
SetFont(be_plain_font);
font_height plainh;
GetFontHeight(&plainh);
float yplain;
yplain = plainh.ascent + plainh.descent * 2 + plainh.leading;
char detail[100];
sprintf(detail, "Version %d.%d.%d %s",
static_cast<int>(B_TRANSLATION_MAJOR_VERSION(PNG_TRANSLATOR_VERSION)),
static_cast<int>(B_TRANSLATION_MINOR_VERSION(PNG_TRANSLATOR_VERSION)),
static_cast<int>(B_TRANSLATION_REVISION_VERSION(PNG_TRANSLATOR_VERSION)),
__DATE__);
DrawString(detail, BPoint(xbold, yplain + ybold));
int32 lineno = 6;
DrawString("PNG Library:", BPoint(xbold, yplain * lineno + ybold));
lineno += 1;
const int32 kinfolen = 512;
char libinfo[kinfolen] = { 0 };
strncpy(libinfo, png_get_copyright(NULL), kinfolen - 1);
char *tok = strtok(libinfo, "\n");
while (tok) {
DrawString(tok, BPoint(xbold, yplain * lineno + ybold));
lineno++;
tok = strtok(NULL, "\n");
}
}
void
PNGView::MessageReceived(BMessage *pmsg)
{
if (pmsg->what == M_PNG_SET_INTERLACE) {
// change setting for interlace option
int32 option;
if (pmsg->FindInt32(PNG_SETTING_INTERLACE, &option) == B_OK) {
fSettings->SetGetInt32(PNG_SETTING_INTERLACE, &option);
fSettings->SaveSettings();
}
} else
BView::MessageReceived(pmsg);
}