/* -*- 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace cppu; using namespace rtl; using namespace css::uno; using namespace css::beans; using namespace css::bridge; using namespace css::frame; using namespace css::lang; using namespace css::text; using namespace css::drawing; using namespace css::awt; using namespace css::container; css::util::Color getCol(int r, int g, int b); Reference openDraw(Reference xComponentContext); Reference createShape(Reference xDocComp, int height, int width, int x, int y, OUString kind, css::util::Color col); Reference createSequence(Reference xDocComp, Reference xDP); int main() { Reference xContext = NULL; try { // get the remote office component context xContext = bootstrap(); } catch (Exception& e) { std::cout << "Error: cannot do bootstraping." << std::endl << e.Message << std::endl; exit(1); } Reference xDrawDoc = NULL; Reference xDrawPage = NULL; xDrawDoc = openDraw(xContext); try { // getting the draw page Reference xDPS(xDrawDoc, UNO_QUERY); Reference xDPn = xDPS->getDrawPages(); Reference xDPi(xDPn, UNO_QUERY); xDrawPage = Reference(xDPi->getByIndex(0), UNO_QUERY); } catch (Exception& e) { std::cout << "Error: Document creation was not possible" << std::endl; exit(1); } createSequence(xDrawDoc, xDrawPage); // Drawing some shapes Reference xShapes(xDrawPage, UNO_QUERY); xShapes->add(createShape(xDrawDoc, 1000, 1300, 2000, 2000, "Line", getCol(0, 0, 0))); xShapes->add(createShape(xDrawDoc, 2000, 4000, 15000, 2000, "Ellipse", getCol(0, 200, 200))); xShapes->add(createShape(xDrawDoc, 3000, 2500, 5500, 4000, "Rectangle", getCol(100, 100, 200))); exit(0); } Reference openDraw(Reference xContext) { Reference xComp; try { // getting the remote LibreOffice service manager Reference xMCF = xContext->getServiceManager(); Reference oDesktop = xMCF->createInstanceWithContext("com.sun.star.frame.Desktop", xContext); Reference xCLoader(oDesktop, UNO_QUERY); Sequence szEmptyArgs(0); OUString strDoc("private:factory/sdraw"); xComp = xCLoader->loadComponentFromURL(strDoc, "_blank", 0, szEmptyArgs); } catch (Exception e) { std::cout << "Error opening draw." << std::endl << e.Message << std::endl; exit(1); } return xComp; } Reference createShape(Reference xDocComp, int height, int width, int x, int y, OUString kind, css::util::Color col) { // kind can be either 'Ellipse', 'Line' or 'Rectangle' Size size; Point position; Reference xShape; // get the multiservice factory Reference xDocMSF(xDocComp, UNO_QUERY); try { Reference oInt = xDocMSF->createInstance("com.sun.star.drawing." + kind + "Shape"); xShape = Reference(oInt, UNO_QUERY); size.Height = height; size.Width = width; position.X = x; position.Y = y; xShape->setSize(size); xShape->setPosition(position); } catch (Exception e) { std::cout << "Could not create instance." << std::endl << e.Message << std::endl; exit(1); } Reference xSPS(xShape, UNO_QUERY); try { xSPS->setPropertyValue("FillColor", Any(col)); } catch (Exception e) { std::cout << "Can not change the shape colors." << std::endl << e.Message << std::endl; exit(1); } return xShape; } Reference createSequence(Reference xDocComp, Reference xDP) { Size size; Point position; Reference xShape; Reference xShapes(xDP, UNO_QUERY); int height = 2000; int width = 2500; int x = 1800; int y = 22000; Reference oInt; int r = 30; int g = 0; int b = 70; // getting the multiservice factory Reference xDocMSF(xDocComp, UNO_QUERY); for (int i = 0; i < 380; i = i + 30) { try { oInt = xDocMSF->createInstance("com.sun.star.drawing.EllipseShape"); xShape = Reference(oInt, UNO_QUERY); size.Height = height; size.Width = width; position.X = x + (i * 40); position.Y = y + (i * 40) % 4000; xShape->setSize(size); xShape->setPosition(position); } catch (Exception e) { // Some exception occurs.FAILED std::cout << "Could not get Shape." << std::endl << e.Message << std::endl; exit(1); } b = b + 8; Reference xSPS(xShape, UNO_QUERY); try { xSPS->setPropertyValue("FillColor", Any(getCol(r, g, b))); xSPS->setPropertyValue("Shadow", Any(true)); } catch (Exception e) { std::cout << "Can not change shape colors." << std::endl << e.Message << std::endl; exit(1); } xShapes->add(xShape); } Reference xSGrouper(xDP, UNO_QUERY); return xSGrouper->group(xShapes); } css::util::Color getCol(int r, int g, int b) { return r * 65536 + g * 256 + b; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */