Changeset 91 in main


Ignore:
Timestamp:
07/15/10 14:16:30 (11 years ago)
Author:
pcosquer
Message:

plugin openoffice : creation ok

Location:
trunk/plugins/openoffice
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/plugins/openoffice/Addons.xcu

    r90 r91  
    8787                    <node oor:name="m7" oor:op="replace"> 
    8888                        <prop oor:name="Title" oor:type="xs:string"> 
     89                            <value>Create a document</value> 
     90                        </prop> 
     91                        <prop oor:name="URL" oor:type="xs:string"> 
     92                            <value>service:org.example.OpenPLMCreate</value> 
     93                        </prop> 
     94                        <prop oor:name="Target" oor:type="xs:string"> 
     95                            <value>_self</value> 
     96                        </prop> 
     97                    </node> 
     98 
     99                    <node oor:name="m8" oor:op="replace"> 
     100                        <prop oor:name="Title" oor:type="xs:string"> 
    89101                            <value>Configure</value> 
    90102                        </prop> 
  • trunk/plugins/openoffice/openplm.py

    r90 r91  
    7272            raise ValueError() 
    7373 
    74     def create_cb(self): 
    75         gdoc = self._window.get_active_document() 
    76         if not gdoc: 
    77             show_error(_("Need an opened file to create a document")) 
    78             return 
    79         if gdoc.get_data("openplm_doc"): 
    80             show_error(_("Current file already attached to a document")) 
    81             return 
    82         def func(): 
    83             diag = CreateDialog(self._window, self) 
    84             def response_cb(diag, resp): 
    85                 if resp == gtk.RESPONSE_ACCEPT: 
    86                     data = diag.get_creation_data() 
    87                     res = self.get_data("api/create/", data) 
    88                     if res["result"] != "ok": 
    89                         # TODO 
    90                         return 
    91                     else: 
    92                         doc = res["object"] 
    93                         unlock = diag.get_unlock() 
    94                         diag.destroy() 
    95                         # create a new doc 
    96                         rep = os.path.join(self.PLUGIN_DIR, doc["type"], doc["reference"], 
    97                                            doc["revision"]) 
    98                         try: 
    99                             os.makedirs(rep, 0700) 
    100                         except os.error: 
    101                             # directory already exists, just ignores the exception 
    102                             pass 
    103                         filename = os.path.basename(gdoc.get_uri()) 
    104                         path = os.path.join(rep, filename) 
    105                         gdoc.set_uri("file://" + path) 
    106                         def f(): 
    107                             doc_file = self.upload_file(doc, path) 
    108                             self.add_managed_file(doc, doc_file, path) 
    109                             self.load_file(doc, doc_file["id"], path) 
    110                             if not unlock: 
    111                                 self.get_data("api/object/%s/lock/%s/" % (doc["id"], doc_file["id"])) 
    112                         save_document(self._window, gdoc, f) 
    113                 else: 
    114                     diag.destroy() 
    115             diag.connect("response", response_cb) 
    116             diag.show() 
    117         save_document(self._window, gdoc, func) 
    118      
     74    def create(self, data, filename, unlock): 
     75        res = self.get_data("api/create/", data) 
     76        if not filename: 
     77            return False, "Bad file name" 
     78        if res["result"] != "ok": 
     79            # TODO 
     80            return False, res["error"] 
     81        else: 
     82            doc = res["object"] 
     83            # create a new doc 
     84            rep = os.path.join(self.PLUGIN_DIR, doc["type"], doc["reference"], 
     85                               doc["revision"]) 
     86            try: 
     87                os.makedirs(rep, 0700) 
     88            except os.error: 
     89                # directory already exists, just ignores the exception 
     90                pass 
     91            gdoc = self.desktop.getCurrentComponent() 
     92            path = os.path.join(rep, filename) 
     93            gdoc.storeAsURL("file://" + path, ()) 
     94            doc_file = self.upload_file(doc, path) 
     95            self.add_managed_file(doc, doc_file, path) 
     96            self.load_file(doc, doc_file["id"], path) 
     97            if not unlock: 
     98                self.get_data("api/object/%s/lock/%s/" % (doc["id"], doc_file["id"])) 
     99            return True, "" 
     100 
    119101    def get_data(self, url, data=None): 
    120102        data_enc = urllib.urlencode(data) if data else None 
     
    225207 
    226208    def load_file(self, doc, doc_file_id, path): 
    227         document = self.desktop.loadComponentFromURL("file://" + path, "_blank", 0, ()) 
     209        document = self.desktop.loadComponentFromURL("file://" + path, 
     210                                                     "_default", 0, ()) 
    228211        if not document: 
    229212            # document may be a simple text file 
     
    236219            options = (op1, op2) 
    237220            document = self.desktop.loadComponentFromURL("file://" + path, 
    238                 "_blank", 0, options) 
     221                "_default", 0, options) 
    239222        if not document: 
    240223            show_error("Can not load %s" % path) 
     
    825808            traceback.print_exc() 
    826809 
     810class CreateDialog(SearchDialog): 
     811 
     812    TITLE = "Create a document..." 
     813    ACTION_NAME = "Create" 
     814    TYPE = "Document" 
     815    TYPES_URL = "api/docs/" 
     816 
     817    WIDTH = 200 
     818    HEIGHT = 300 
     819    PAD = 5 
     820    ROW_HEIGHT = 15 
     821    ROW_PAD = 2 
     822 
     823    def run(self): 
     824         
     825        docs = PLUGIN.get_data(self.TYPES_URL) 
     826        self.types = docs["types"] 
     827 
     828        smgr = self.ctx.ServiceManager 
     829        self.dialog = smgr.createInstanceWithContext( 
     830            'com.sun.star.awt.UnoControlDialogModel', self.ctx) 
     831        self.dialog.Width = self.WIDTH 
     832        self.dialog.Height = self.HEIGHT 
     833        self.dialog.Title = self.TITLE 
     834         
     835        fields = [("type", 'ListBox'), 
     836                 ] 
     837        self.fields = [] 
     838        for i, (text, entry) in enumerate(fields):  
     839            x, y, w, h = self.get_position(i, 1) 
     840            label = self.addWidget('%s_label' % text, 'FixedText', x, y, w, h, 
     841                               Label = '%s:' % text.capitalize()) 
     842            x, y, w, h = self.get_position(i, 2) 
     843            widget = self.addWidget('%s_entry' % text, entry, x, y, w, h) 
     844            self.fields.append((text, widget)) 
     845 
     846        self.type_entry = self.fields[0][1] 
     847        self.type_entry.StringItemList = tuple(self.types) 
     848        self.type_entry.SelectedItems = (self.types.index(self.TYPE),) 
     849        self.type_entry.Dropdown = True 
     850        self.type_entry.MultiSelection = False 
     851         
     852        self.advanced_fields = [] 
     853        self.display_fields(self.TYPE) 
     854         
     855        x, y, w, h = self.get_position(len(self.fields)+len(self.advanced_fields), 1) 
     856        self.filename_label = self.addWidget('filenameLabel', 'FixedText', x, y, w, h, 
     857                               Label="Filename") 
     858        x, y, w, h = self.get_position(len(self.fields)+len(self.advanced_fields), 2) 
     859        self.filename_entry = self.addWidget('filename', 'Edit', x, y, w, h) 
     860 
     861        x, y, w, h = self.get_position(len(self.fields)+len(self.advanced_fields)+1, 1) 
     862        self.unlock_button = self.addWidget('unlock', 'CheckBox', x, y, w, h, 
     863                                Label="Unlock ?") 
     864        x, y, w, h = self.get_position(len(self.fields)+len(self.advanced_fields)+2, 1) 
     865        self.action_button = self.addWidget('action_button', 'Button', x, y, w, h, 
     866                                Label = self.ACTION_NAME) 
     867 
     868        self.container = smgr.createInstanceWithContext( 
     869            'com.sun.star.awt.UnoControlDialog', self.ctx) 
     870        self.container.setModel(self.dialog) 
     871        self.container.getControl('action_button').addActionListener(self) 
     872        self.container.getControl('type_entry').addItemListener(self) 
     873        toolkit = smgr.createInstanceWithContext( 
     874            'com.sun.star.awt.ExtToolkit', self.ctx) 
     875        self.container.setVisible(False) 
     876        self.container.createPeer(toolkit, None) 
     877        self.container.execute() 
     878 
     879    def display_fields(self, typename): 
     880        fields = PLUGIN.get_data("api/creation_fields/%s/" % typename)["fields"] 
     881        temp = {} 
     882        for field, entry in self.advanced_fields: 
     883            temp[field["name"]] = self.get_value(entry, field) 
     884            self.container.getControl("%s_entry" % field["name"]).setVisible(False) 
     885            entry.dispose() 
     886            self.dialog.removeByName(entry.Name) 
     887            label = self.dialog.getByName("%s_label" % field["name"]) 
     888            self.container.getControl("%s_label" % field["name"]).setVisible(False) 
     889            label.dispose() 
     890            self.dialog.removeByName("%s_label" % field["name"]) 
     891        self.advanced_fields = [] 
     892        j = len(self.fields) 
     893        for i, field in enumerate(fields): 
     894            text = field["label"] 
     895            x, y, w, h = self.get_position(i + j, 1) 
     896            label = self.addWidget('%s_label' % field["name"], 'FixedText', 
     897                                   x, y, w, h, 
     898                                   Label = '%s:' % text.capitalize()) 
     899            x, y, w, h = self.get_position(i + j, 2) 
     900            widget = self.field_to_widget(field, x, y, w, h) 
     901            if field["name"] in temp: 
     902                self.set_value(widget, temp[field["name"]], field) 
     903            self.advanced_fields.append((field, widget)) 
     904        if hasattr(self, 'container'): 
     905            self.container.getPeer().invalidate(UPDATE|1) 
     906            j = len(self.fields) + len(self.advanced_fields)  
     907            x, y, w, h = self.get_position(j, 1) 
     908            self.filename_label.PositionY= y 
     909            self.filename_entry.PositionY= y 
     910            x, y, w, h = self.get_position(j + 1, 1) 
     911            self.unlock_button.PositionY= y 
     912            x, y, w, h = self.get_position(j + 2, 1) 
     913            self.action_button.PositionY= y 
     914 
     915    def actionPerformed(self, actionEvent): 
     916        try: 
     917            if actionEvent.Source == self.container.getControl('action_button'): 
     918                b, error = PLUGIN.create(self.get_creation_data(), 
     919                              self.get_value(self.filename_entry, None), 
     920                              self.get_value(self.unlock_button, None)) 
     921                if b: 
     922                    self.container.endExecute() 
     923                else: 
     924                    self.show_error(error) 
     925        except: 
     926            traceback.print_exc() 
     927 
     928    def get_creation_data(self): 
     929        data = {} 
     930        for field_name, widget in self.fields: 
     931            data[field_name] = self.get_value(widget, None) 
     932        for field, widget in self.advanced_fields: 
     933            data[field["name"]] = self.get_value(widget, field) 
     934        return data 
     935 
     936    def itemStateChanged(self, itemEvent): 
     937        try: 
     938            typename = self.types[self.type_entry.SelectedItems[0]] 
     939            self.display_fields(typename) 
     940        except: 
     941            traceback.print_exc() 
     942 
     943    def do_action(self, doc, doc_file): 
     944        print doc, doc_file 
    827945 
    828946class OpenPLMLogin(unohelper.Base, XJobExecutor): 
     
    9701088            traceback.print_exc() 
    9711089 
     1090class OpenPLMCreate(unohelper.Base, XJobExecutor): 
     1091    def __init__(self, ctx): 
     1092        self.ctx = ctx 
     1093 
     1094    def trigger(self, args): 
     1095        try: 
     1096            desktop = self.ctx.ServiceManager.createInstanceWithContext( 
     1097                'com.sun.star.frame.Desktop', self.ctx) 
     1098            PLUGIN.set_desktop(desktop) 
     1099            gdoc = desktop.getCurrentComponent() 
     1100            if not gdoc: 
     1101                show_error("Need an opened file to create a document") 
     1102                return 
     1103            if gdoc.URL in PLUGIN.documents: 
     1104                show_error("Current file already attached to a document") 
     1105                return 
     1106            dialog = CreateDialog(self.ctx) 
     1107            dialog.run()  
     1108        except: 
     1109            traceback.print_exc() 
     1110 
    9721111 
    9731112g_ImplementationHelper = unohelper.ImplementationHelper() 
    9741113 
    9751114for cls in (OpenPLMLogin, OpenPLMCheckOut, OpenPLMDownload, OpenPLMForget, 
    976             OpenPLMCheckIn, OpenPLMRevise, OpenPLMAttach, OpenPLMConfigure): 
     1115            OpenPLMCheckIn, OpenPLMRevise, OpenPLMAttach, OpenPLMConfigure, 
     1116            OpenPLMCreate): 
    9771117    g_ImplementationHelper.addImplementation(cls, 
    9781118                                         'org.example.%s' % cls.__name__, 
Note: See TracChangeset for help on using the changeset viewer.