Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/LibreOffice/sc/source/ui/dbgui/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 20 kB image not shown  

Quelle  dbnamdlg.cxx   Sprache: C

 
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
 */


#include <memory>
#include <sal/config.h>

#include <cassert>

#include <comphelper/string.hxx>
#include <unotools/charclass.hxx>
#include <vcl/svapp.hxx>
#include <vcl/weld.hxx>
#include <o3tl/string_view.hxx>

#include <reffact.hxx>
#include <document.hxx>
#include <globstr.hrc>
#include <scresid.hxx>
#include <rangenam.hxx>
#include <globalnames.hxx>
#include <dbnamdlg.hxx>
#include <dbdocfun.hxx>

namespace
{
    void ERRORBOX(weld::Window* pParent, const OUString& rString)
    {
        std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(pParent,
                                                  VclMessageType::Warning, VclButtonsType::Ok,
                                                  rString));
        xBox->run();
    }


class DBSaveData
{
public:
    DBSaveData( formula::RefEdit& rEd, weld::CheckButton& rHdr, weld::CheckButton&&nbsp;rTot, weld::CheckButton& rSize, weld::CheckButton& rFmt,
                            weld::CheckButton& rStrip, ScRange& rArea )
        : rEdAssign(rEd)
        , rBtnHeader(rHdr)
        , rBtnTotals(rTot)
        , rBtnSize(rSize)
        , rBtnFormat(rFmt)
        , rBtnStrip(rStrip)
        , rCurArea(rArea)
        , bHeader(false)
        , bTotals(false)
        , bSize(false)
        , bFormat(false)
        , bStrip(false)
        , bDirty(false)
    {
    }
    void Save();
    void Restore();

private:
    formula::RefEdit& rEdAssign;
    weld::CheckButton& rBtnHeader;
    weld::CheckButton& rBtnTotals;
    weld::CheckButton& rBtnSize;
    weld::CheckButton& rBtnFormat;
    weld::CheckButton& rBtnStrip;
    ScRange&    rCurArea;
    OUString    aStr;
    ScRange     aArea;
    bool        bHeader:1;
    bool        bTotals:1;
    bool        bSize:1;
    bool        bFormat:1;
    bool        bStrip:1;
    bool        bDirty:1;
};

}

void DBSaveData::Save()
{
    aArea   = rCurArea;
    aStr    = rEdAssign.GetText();
    bHeader = rBtnHeader.get_active();
    bTotals = rBtnTotals.get_active();
    bSize   = rBtnSize.get_active();
    bFormat = rBtnFormat.get_active();
    bStrip  = rBtnStrip.get_active();
    bDirty  = true;
}

void DBSaveData::Restore()
{
    if ( bDirty )
    {
        rCurArea = aArea;
        rEdAssign.SetText( aStr );
        rBtnHeader.set_active ( bHeader );
        rBtnTotals.set_active ( bTotals );
        rBtnSize.set_active   ( bSize );
        rBtnFormat.set_active ( bFormat );
        rBtnStrip.set_active  ( bStrip );
        bDirty = false;
    }
}

static std::unique_ptr<DBSaveData> xSaveObj;

ScDbNameDlg::ScDbNameDlg(SfxBindings* pB, SfxChildWindow* pCW, weld::Window* pParent,
    ScViewData& rViewData)
    : ScAnyRefDlgController(pB, pCW, pParent,
        u"modules/scalc/ui/definedatabaserangedialog.ui"_ustr, u"DefineDatabaseRangeDialog"_ustr)
    , m_rViewData(rViewData)
    , rDoc(rViewData.GetDocument())
    , bRefInputMode(false)
    , aAddrDetails(rDoc.GetAddressConvention(), 0, 0)
    , aLocalDbCol(*(rDoc.GetDBCollection()))
    , m_xEdName(m_xBuilder->weld_entry_tree_view(u"entrygrid"_ustr, u"entry"_ustr, u"entry-list"_ustr))
    , m_xAssignFrame(m_xBuilder->weld_frame(u"RangeFrame"_ustr))
    , m_xEdAssign(new formula::RefEdit(m_xBuilder->weld_entry(u"assign"_ustr)))
    , m_xRbAssign(new formula::RefButton(m_xBuilder->weld_button(u"assignrb"_ustr)))
    , m_xOptions(m_xBuilder->weld_widget(u"Options"_ustr))
    , m_xBtnHeader(m_xBuilder->weld_check_button(u"ContainsColumnLabels"_ustr))
    , m_xBtnTotals(m_xBuilder->weld_check_button(u"ContainsTotalsRow"_ustr))
    , m_xBtnDoSize(m_xBuilder->weld_check_button(u"InsertOrDeleteCells"_ustr))
    , m_xBtnKeepFmt(m_xBuilder->weld_check_button(u"KeepFormatting"_ustr))
    , m_xBtnStripData(m_xBuilder->weld_check_button(u"DontSaveImportedData"_ustr))
    , m_xFTSource(m_xBuilder->weld_label(u"Source"_ustr))
    , m_xFTOperations(m_xBuilder->weld_label(u"Operations"_ustr))
    , m_xBtnOk(m_xBuilder->weld_button(u"ok"_ustr))
    , m_xBtnCancel(m_xBuilder->weld_button(u"cancel"_ustr))
    , m_xBtnAdd(m_xBuilder->weld_button(u"add"_ustr))
    , m_xBtnRemove(m_xBuilder->weld_button(u"delete"_ustr))
    , m_xModifyPB(m_xBuilder->weld_button(u"modify"_ustr))
    , m_xInvalidFT(m_xBuilder->weld_label(u"invalid"_ustr))
    , m_xFrameLabel(m_xAssignFrame->weld_label_widget())
    , m_xExpander(m_xBuilder->weld_expander(u"more"_ustr))
{
    m_xEdName->set_height_request_by_rows(4);
    m_xEdAssign->SetReferences(this, m_xFrameLabel.get());
    m_xRbAssign->SetReferences(this, m_xEdAssign.get());
    aStrAdd = m_xBtnAdd->get_label();
    aStrModify = m_xModifyPB->get_label();
    aStrInvalid = m_xInvalidFT->get_label();

    //  so that the strings in the resource can stay with fixed texts:
    aStrSource      = m_xFTSource->get_label();
    aStrOperations  = m_xFTOperations->get_label();

    xSaveObj.reset(new DBSaveData( *m_xEdAssign, *m_xBtnHeader, *m_xBtnTotals,
                        *m_xBtnDoSize, *m_xBtnKeepFmt, *m_xBtnStripData, theCurArea ));
    Init();
}

ScDbNameDlg::~ScDbNameDlg()
{
    xSaveObj.reset();
}

void ScDbNameDlg::Init()
{
    m_xBtnHeader->set_active(true);          // Default: with column headers
    m_xBtnTotals->set_active( false );   // Default: without totals row
    m_xBtnDoSize->set_active(true);
    m_xBtnKeepFmt->set_active(true);

    m_xBtnOk->connect_clicked      ( LINK( this, ScDbNameDlg, OkBtnHdl ) );
    m_xBtnCancel->connect_clicked  ( LINK( this, ScDbNameDlg, CancelBtnHdl ) );
    m_xBtnAdd->connect_clicked     ( LINK( this, ScDbNameDlg, AddBtnHdl ) );
    m_xBtnRemove->connect_clicked  ( LINK( this, ScDbNameDlg, RemoveBtnHdl ) );
    m_xEdName->connect_changed( LINK( this, ScDbNameDlg, NameModifyHdl ) );
    m_xEdAssign->SetModifyHdl  ( LINK( this, ScDbNameDlg, AssModifyHdl ) );
    UpdateNames();

    OUString  theAreaStr;

    SCCOL   nStartCol   = 0;
    SCROW   nStartRow   = 0;
    SCTAB   nStartTab   = 0;
    SCCOL   nEndCol     = 0;
    SCROW   nEndRow     = 0;
    SCTAB   nEndTab     = 0;

    ScDBCollection* pDBColl = rDoc.GetDBCollection();

    m_rViewData.GetSimpleArea( nStartCol, nStartRow, nStartTab,
                              nEndCol,   nEndRow,  nEndTab );

    theCurArea = ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab);

    theAreaStr = theCurArea.Format(rDoc, ScRefFlags::RANGE_ABS_3D, aAddrDetails);

    if ( pDBColl )
    {
        // determine if the defined DB area has been marked:
        ScDBData* pDBData = pDBColl->GetDBAtCursor( nStartCol, nStartRow, nStartTab, ScDBDataPortion::TOP_LEFT );
        if ( pDBData )
        {
            ScAddress&  rStart = theCurArea.aStart;
            ScAddress&  rEnd   = theCurArea.aEnd;
            SCCOL nCol1;
            SCCOL  nCol2;
            SCROW  nRow1;
            SCROW  nRow2;
            SCTAB  nTab;

            pDBData->GetArea( nTab, nCol1, nRow1, nCol2, nRow2 );

            if (   (rStart.Tab() == nTab)
                && (rStart.Col() == nCol1) && (rStart.Row() == nRow1)
                && (rEnd.Col()   == nCol2) && (rEnd.Row()   == nRow2 ) )
            {
                OUString aDBName = pDBData->GetName();
                if ( aDBName != STR_DB_LOCAL_NONAME )
                    m_xEdName->set_entry_text(aDBName);

                m_xBtnHeader->set_active( pDBData->HasHeader() );
                m_xBtnTotals->set_active( pDBData->HasTotals() );
                m_xBtnDoSize->set_active( pDBData->IsDoSize() );
                m_xBtnKeepFmt->set_active( pDBData->IsKeepFmt() );
                m_xBtnStripData->set_active( pDBData->IsStripData() );
                SetInfoStrings( pDBData );
            }
        }
    }

    m_xEdAssign->SetText( theAreaStr );
    m_xEdName->grab_focus();
    bSaved = true;
    xSaveObj->Save();
    NameModifyHdl( *m_xEdName );
    bInvalid = false;
}

void ScDbNameDlg::SetInfoStrings( const ScDBData* pDBData )
{
    OUStringBuffer aBuf(aStrSource);
    if (pDBData)
    {
        aBuf.append(" " + pDBData->GetSourceString());
    }
    m_xFTSource->set_label(aBuf.makeStringAndClear());

    aBuf.append(aStrOperations);
    if (pDBData)
    {
        aBuf.append(" " + pDBData->GetOperations());
    }
    m_xFTOperations->set_label(aBuf.makeStringAndClear());
}

// Transfer of a table area selected with the mouse, which is then displayed
// as a new selection in the reference window.

void ScDbNameDlg::SetReference( const ScRange& rRef, ScDocument& rDocP )
{
    if (!m_xEdAssign->GetWidget()->get_sensitive())
        return;

    if ( rRef.aStart != rRef.aEnd )
        RefInputStart(m_xEdAssign.get());

    theCurArea = rRef;

    OUString aRefStr(theCurArea.Format(rDocP, ScRefFlags::RANGE_ABS_3D, aAddrDetails));
    m_xEdAssign->SetRefString( aRefStr );
    m_xOptions->set_sensitive(true);
    m_xBtnAdd->set_sensitive(true);
    bSaved = true;
    xSaveObj->Save();
}

void ScDbNameDlg::Close()
{
    DoClose( ScDbNameDlgWrapper::GetChildWindowId() );
}

void ScDbNameDlg::SetActive()
{
    m_xEdAssign->GrabFocus();

    //  No NameModifyHdl, because otherwise areas can not be changed
    //  (the old content would be displayed again after the reference selection is pulled)
    //  (the selected DB name has not changed either)

    RefInputDone();
}

void ScDbNameDlg::UpdateNames()
{
    typedef ScDBCollection::NamedDBs DBsType;

    const DBsType& rDBs = aLocalDbCol.getNamedDBs();

    m_xEdName->freeze();

    m_xEdName->clear();
    m_xEdAssign->SetText( OUString() );

    if (!rDBs.empty())
    {
        for (const auto& rxDB : rDBs)
            m_xEdName->append_text(rxDB->GetName());
    }
    else
    {
        m_xBtnAdd->set_label( aStrAdd );
        m_xBtnAdd->set_sensitive(false);
        m_xBtnRemove->set_sensitive(false);
    }

    m_xEdName->thaw();
}

void ScDbNameDlg::UpdateDBData( const OUString& rStrName )
{

    const ScDBData* pData = aLocalDbCol.getNamedDBs().findByUpperName(ScGlobal::getCharClass().uppercase(rStrName));

    if ( pData )
    {
        SCCOL nColStart = 0;
        SCROW nRowStart = 0;
        SCCOL nColEnd    = 0;
        SCROW nRowEnd    = 0;
        SCTAB nTab       = 0;

        pData->GetArea( nTab, nColStart, nRowStart, nColEnd, nRowEnd );
        theCurArea = ScRange( ScAddress( nColStart, nRowStart, nTab ),
                              ScAddress( nColEnd,   nRowEnd,   nTab ) );
        OUString theArea(theCurArea.Format(rDoc, ScRefFlags::RANGE_ABS_3D, aAddrDetails));
        m_xEdAssign->SetText( theArea );
        m_xBtnAdd->set_label( aStrModify );
        m_xBtnHeader->set_active( pData->HasHeader() );
        m_xBtnTotals->set_active( pData->HasTotals() );
        m_xBtnDoSize->set_active( pData->IsDoSize() );
        m_xBtnKeepFmt->set_active( pData->IsKeepFmt() );
        m_xBtnStripData->set_active( pData->IsStripData() );
        SetInfoStrings( pData );
    }

    m_xBtnAdd->set_label( aStrModify );
    m_xBtnAdd->set_sensitive(true);
    m_xBtnRemove->set_sensitive(true);
    m_xOptions->set_sensitive(true);
}

bool ScDbNameDlg::IsRefInputMode() const
{
    return bRefInputMode;
}

// Handler:

IMPL_LINK_NOARG(ScDbNameDlg, OkBtnHdl, weld::Button&, void)
{
    bInvalid = false;
    AddBtnHdl(*m_xBtnAdd);

    // Pass the changes and the remove list to the view: both are
    // transferred as a reference only, so that no dead memory can
    // be created at this point:
    if (!bInvalid)
    {
        ScDBDocFunc aFunc(m_rViewData.GetDocShell());
        aFunc.ModifyAllDBData(aLocalDbCol, aRemoveList);
        response(RET_OK);
    }
}

IMPL_LINK_NOARG(ScDbNameDlg, CancelBtnHdl, weld::Button&, void)
{
    response(RET_CANCEL);
}

IMPL_LINK_NOARG(ScDbNameDlg, AddBtnHdl, weld::Button&, void)
{
    OUString aNewName = comphelper::string::strip(m_xEdName->get_active_text(), ' ');
    OUString aNewArea = m_xEdAssign->GetText();

    if ( aNewName.isEmpty() || aNewArea.isEmpty() )
        return;

    if (ScRangeData::IsNameValid(aNewName, rDoc) == ScRangeData::IsNameValidType::NAME_VALID
        && aNewName != STR_DB_LOCAL_NONAME)
    {
        //  because editing can be done now, parsing is needed first
        ScRange aTmpRange;
        OUString aText = m_xEdAssign->GetText();
        if ( aTmpRange.ParseAny( aText, rDoc, aAddrDetails ) & ScRefFlags::VALID )
        {
            theCurArea = aTmpRange;
            ScAddress aStart = theCurArea.aStart;
            ScAddress aEnd   = theCurArea.aEnd;

            ScDBData* pOldEntry = aLocalDbCol.getNamedDBs().findByUpperName(ScGlobal::getCharClass().uppercase(aNewName));
            if (pOldEntry)
            {
                //  modify area

                pOldEntry->MoveTo( aStart.Tab(), aStart.Col(), aStart.Row(),
                                                    aEnd.Col(), aEnd.Row() );
                pOldEntry->SetByRow( true );
                pOldEntry->SetHeader( m_xBtnHeader->get_active() );
                pOldEntry->SetTotals( m_xBtnTotals->get_active() );
                pOldEntry->SetDoSize( m_xBtnDoSize->get_active() );
                pOldEntry->SetKeepFmt( m_xBtnKeepFmt->get_active() );
                pOldEntry->SetStripData( m_xBtnStripData->get_active() );
            }
            else
            {
                //  insert new area

                std::unique_ptr<ScDBData> pNewEntry(new ScDBData( aNewName, aStart.Tab(),
                                                    aStart.Col(), aStart.Row(),
                                                    aEnd.Col(), aEnd.Row(),
                                                    true, m_xBtnHeader->get_active(),
                                                    m_xBtnTotals->get_active() ));
                pNewEntry->SetDoSize( m_xBtnDoSize->get_active() );
                pNewEntry->SetKeepFmt( m_xBtnKeepFmt->get_active() );
                pNewEntry->SetStripData( m_xBtnStripData->get_active() );

                bool ins = aLocalDbCol.getNamedDBs().insert(std::move(pNewEntry));
                assert(ins); (void)ins;
            }

            UpdateNames();

            m_xEdName->set_entry_text( OUString() );
            m_xEdName->grab_focus();
            m_xBtnAdd->set_label( aStrAdd );
            m_xBtnAdd->set_sensitive(false);
            m_xBtnRemove->set_sensitive(false);
            m_xEdAssign->SetText( OUString() );
            m_xBtnHeader->set_active(true);             // Default: with column headers
            m_xBtnTotals->set_active( false );      // Default: without totals row
            m_xBtnDoSize->set_active( false );
            m_xBtnKeepFmt->set_active( false );
            m_xBtnStripData->set_active( false );
            SetInfoStrings( nullptr );     // empty
            theCurArea = ScRange();
            bSaved = true;
            xSaveObj->Save();
            NameModifyHdl( *m_xEdName );
        }
        else
        {
            ERRORBOX(m_xDialog.get(), aStrInvalid);
            m_xEdAssign->SelectAll();
            m_xEdAssign->GrabFocus();
            bInvalid = true;
        }
    }
    else
    {
        ERRORBOX(m_xDialog.get(), ScResId(STR_INVALIDNAME));
        m_xEdName->select_entry_region(0, -1);
        m_xEdName->grab_focus();
        bInvalid = true;
    }
}

namespace {

class FindByName
{
    const OUString& mrName;
public:
    explicit FindByName(const OUString& rName) : mrName(rName) {}
    bool operator() (std::unique_ptr<ScDBData> const& p) const
    {
        return p->GetName() == mrName;
    }
};

}

IMPL_LINK_NOARG(ScDbNameDlg, RemoveBtnHdl, weld::Button&, void)
{
    OUString aStrEntry = m_xEdName->get_active_text();
    ScDBCollection::NamedDBs& rDBs = aLocalDbCol.getNamedDBs();
    ScDBCollection::NamedDBs::iterator itr =
        ::std::find_if(rDBs.begin(), rDBs.end(), FindByName(aStrEntry));

    if (itr == rDBs.end())
        return;

    OUString aStrDelMsg = ScResId( STR_QUERY_DELENTRY );
    OUString sMsg{ o3tl::getToken(aStrDelMsg, 0, '#') + aStrEntry + o3tl::getToken(aStrDelMsg, 1, '#') };
    std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(m_xDialog.get(),
                                                   VclMessageType::Question, VclButtonsType::YesNo,
                                                   sMsg));
    xQueryBox->set_default_response(RET_YES);
    if (RET_YES != xQueryBox->run())
        return;

    SCTAB nTab;
    SCCOL nColStart, nColEnd;
    SCROW nRowStart, nRowEnd;
    (*itr)->GetArea( nTab, nColStart, nRowStart, nColEnd, nRowEnd );
    aRemoveList.emplace_back( ScAddress( nColStart, nRowStart, nTab ),
                 ScAddress( nColEnd,   nRowEnd,   nTab ) );

    rDBs.erase(itr);

    UpdateNames();

    m_xEdName->set_entry_text( OUString() );
    m_xEdName->grab_focus();
    m_xBtnAdd->set_label( aStrAdd );
    m_xBtnAdd->set_sensitive(false);
    m_xBtnRemove->set_sensitive(false);
    m_xEdAssign->SetText( OUString() );
    theCurArea = ScRange();
    m_xBtnHeader->set_active(true);             // Default: with column headers
    m_xBtnTotals->set_active( false );      // Default: without totals row
    m_xBtnDoSize->set_active( false );
    m_xBtnKeepFmt->set_active( false );
    m_xBtnStripData->set_active( false );
    SetInfoStrings( nullptr );     // empty
    bSaved=false;
    xSaveObj->Restore();
    NameModifyHdl( *m_xEdName );
}

IMPL_LINK_NOARG(ScDbNameDlg, NameModifyHdl, weld::ComboBox&, void)
{
    OUString  theName     = m_xEdName->get_active_text();
    bool    bNameFound  = m_xEdName->find_text(theName) != -1;

    if ( theName.isEmpty() )
    {
        if (m_xBtnAdd->get_label() != aStrAdd)
            m_xBtnAdd->set_label( aStrAdd );
        m_xBtnAdd->set_sensitive(false);
        m_xBtnRemove->set_sensitive(false);
        m_xAssignFrame->set_sensitive(false);
        m_xOptions->set_sensitive(false);
        //bSaved=sal_False;
        //xSaveObj->Restore();
        //@BugID 54702 enable/disable in the base class only
        //SFX_APPWINDOW->Disable(sal_False);        //! general method in ScAnyRefDlg
        bRefInputMode = false;
    }
    else
    {
        if ( bNameFound )
        {
            if (m_xBtnAdd->get_label() != aStrModify)
                m_xBtnAdd->set_label( aStrModify );

            if(!bSaved)
            {
                bSaved = true;
                xSaveObj->Save();
            }
            UpdateDBData( theName );
        }
        else
        {
            if (m_xBtnAdd->get_label() != aStrAdd)
                m_xBtnAdd->set_label( aStrAdd );

            bSaved=false;
            xSaveObj->Restore();

            if ( !m_xEdAssign->GetText().isEmpty() )
            {
                m_xBtnAdd->set_sensitive(true);
                m_xOptions->set_sensitive(true);
            }
            else
            {
                m_xBtnAdd->set_sensitive(false);
                m_xOptions->set_sensitive(false);
            }
            m_xBtnRemove->set_sensitive(false);
        }

        m_xAssignFrame->set_sensitive(true);

        //@BugID 54702 enable/disable in the base class only
        //SFX_APPWINDOW->set_sensitive(true);
        bRefInputMode = true;
    }
}

IMPL_LINK_NOARG(ScDbNameDlg, AssModifyHdl, formula::RefEdit&, void)
{
    //  parse here for Save(), etc.

    ScRange aTmpRange;
    OUString aText = m_xEdAssign->GetText();
    if ( aTmpRange.ParseAny( aText, rDoc, aAddrDetails ) & ScRefFlags::VALID )
        theCurArea = aTmpRange;

    if (!aText.isEmpty() && !m_xEdName->get_active_text().isEmpty())
    {
        m_xBtnAdd->set_sensitive(true);
        m_xBtnHeader->set_sensitive(true);
        m_xBtnTotals->set_sensitive(true);
        m_xBtnDoSize->set_sensitive(true);
        m_xBtnKeepFmt->set_sensitive(true);
        m_xBtnStripData->set_sensitive(true);
        m_xFTSource->set_sensitive(true);
        m_xFTOperations->set_sensitive(true);
    }
    else
    {
        m_xBtnAdd->set_sensitive(false);
        m_xBtnHeader->set_sensitive(false);
        m_xBtnTotals->set_sensitive(false);
        m_xBtnDoSize->set_sensitive(false);
        m_xBtnKeepFmt->set_sensitive(false);
        m_xBtnStripData->set_sensitive(false);
        m_xFTSource->set_sensitive(false);
        m_xFTOperations->set_sensitive(false);
    }
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Messung V0.5
C=94 H=100 G=96

¤ Dauer der Verarbeitung: 0.6 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.